diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index cab4d4f3..00000000
--- a/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-*.cbor filter=lfs diff=lfs merge=lfs -text
diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml
new file mode 100644
index 00000000..6c230ba2
--- /dev/null
+++ b/.github/workflows/build-docs.yml
@@ -0,0 +1,34 @@
+name: Build and deploy docs
+
+on:
+ push:
+ branches: [ main ]
+ workflow_dispatch: {}
+
+jobs:
+ build-and-deploy:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Install Rust toolchain
+ uses: actions-rs/toolchain@v1
+ with:
+ toolchain: stable
+ profile: minimal
+
+ - name: Install mdBook
+ run: |
+ cargo install mdbook --locked
+
+ - name: Build mdBook
+ run: |
+ mdbook build docs
+
+ - name: Deploy to GitHub Pages
+ uses: peaceiris/actions-gh-pages@v3
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: ./docs/book
diff --git a/.github/workflows/build_wheels.yml b/.github/workflows/build_wheels.yml
deleted file mode 100644
index 428dd220..00000000
--- a/.github/workflows/build_wheels.yml
+++ /dev/null
@@ -1,188 +0,0 @@
-# This file is autogenerated by maturin v1.7.7
-# To update, run
-#
-# maturin generate-ci github
-#
-name: Build Python Wheels and push to PyPI
-
-on:
- release:
- types: [published]
-
-permissions:
- contents: read
-
-jobs:
- linux:
- runs-on: ${{ matrix.platform.runner }}
- strategy:
- matrix:
- platform:
- - runner: ubuntu-22.04
- target: x86_64
- - runner: ubuntu-22.04
- target: x86
- - runner: ubuntu-22.04
- target: aarch64
- - runner: ubuntu-22.04
- target: armv7
- - runner: ubuntu-22.04
- target: s390x
- - runner: ubuntu-22.04
- target: ppc64le
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v5
- with:
- python-version: 3.x
- - name: Set cargo version from tag
- run: python .github/workflows/update_version.py
-
- - name: Build wheels
- uses: PyO3/maturin-action@v1
- with:
- target: ${{ matrix.platform.target }}
- args: --release --out dist --find-interpreter
- sccache: 'true'
- manylinux: auto
- - name: Upload wheels
- uses: actions/upload-artifact@v4
- with:
- name: wheels-linux-${{ matrix.platform.target }}
- path: dist
-
- musllinux:
- runs-on: ${{ matrix.platform.runner }}
- strategy:
- matrix:
- platform:
- - runner: ubuntu-22.04
- target: x86_64
- - runner: ubuntu-22.04
- target: x86
- - runner: ubuntu-22.04
- target: aarch64
- - runner: ubuntu-22.04
- target: armv7
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v5
- with:
- python-version: 3.x
- - name: Set cargo version from tag
- run: python .github/workflows/update_version.py
-
- - name: Build wheels
- uses: PyO3/maturin-action@v1
- with:
- target: ${{ matrix.platform.target }}
- args: --release --out dist --find-interpreter
- sccache: 'true'
- manylinux: musllinux_1_2
- - name: Upload wheels
- uses: actions/upload-artifact@v4
- with:
- name: wheels-musllinux-${{ matrix.platform.target }}
- path: dist
-
- windows:
- runs-on: ${{ matrix.platform.runner }}
- strategy:
- matrix:
- platform:
- - runner: windows-latest
- target: x64
- - runner: windows-latest
- target: x86
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v5
- with:
- python-version: 3.x
- architecture: ${{ matrix.platform.target }}
- - name: Set cargo version from tag
- run: python .github/workflows/update_version.py
-
- - name: Build wheels
- uses: PyO3/maturin-action@v1
- with:
- target: ${{ matrix.platform.target }}
- args: --release --out dist --find-interpreter
- sccache: 'true'
- - name: Upload wheels
- uses: actions/upload-artifact@v4
- with:
- name: wheels-windows-${{ matrix.platform.target }}
- path: dist
-
- macos:
- runs-on: ${{ matrix.platform.runner }}
- strategy:
- matrix:
- platform:
- - runner: macos-13
- target: x86_64
- - runner: macos-14
- target: aarch64
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v5
- with:
- python-version: 3.x
- - name: Set cargo version from tag
- run: python .github/workflows/update_version.py
- - name: Build wheels
- uses: PyO3/maturin-action@v1
- with:
- target: ${{ matrix.platform.target }}
- args: --release --out dist --find-interpreter
- sccache: 'true'
- - name: Upload wheels
- uses: actions/upload-artifact@v4
- with:
- name: wheels-macos-${{ matrix.platform.target }}
- path: dist
-
- sdist:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - name: Set cargo version from tag
- run: python .github/workflows/update_version.py
- - name: Build sdist
- uses: PyO3/maturin-action@v1
- with:
- command: sdist
- args: --out dist
- - name: Upload sdist
- uses: actions/upload-artifact@v4
- with:
- name: wheels-sdist
- path: dist
-
- release:
- name: Release
- runs-on: ubuntu-latest
- if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }}
- needs: [linux, musllinux, windows, macos, sdist]
- permissions:
- # Use to sign the release artifacts
- id-token: write
- # Used to upload release artifacts
- contents: write
- # Used to generate artifact attestation
- attestations: write
- steps:
- - uses: actions/download-artifact@v4
- - name: Generate artifact attestation
- uses: actions/attest-build-provenance@v1
- with:
- subject-path: 'wheels-*/*'
- - name: Publish to PyPI
- if: ${{ startsWith(github.ref, 'refs/tags/') }}
- uses: PyO3/maturin-action@v1
- env:
- MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
- with:
- command: upload
- args: --non-interactive --skip-existing wheels-*/*
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..cd89dac5
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,72 @@
+name: CI
+
+on:
+ # Trigger the workflow on push to master or develop, except tag creation
+ push:
+ branches:
+ - "main"
+ tags-ignore:
+ - "**"
+
+ # Trigger the workflow on pull request
+ pull_request: ~
+
+ # Trigger the workflow manually
+ workflow_dispatch: ~
+
+ # Trigger after public PR approved for CI
+ pull_request_target:
+ types: [labeled]
+
+jobs:
+ checks-and-wheels:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Rust toolchain
+ uses: dtolnay/rust-toolchain@stable
+
+ # Cache Cargo registry + target to speed up Rust and extension builds.
+ - name: Cache cargo + target
+ uses: Swatinem/rust-cache@v2
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.12"
+
+ # uv is used as the package/install frontend (including maturin install).
+ - name: Set up uv
+ uses: astral-sh/setup-uv@v5
+
+ - name: Install maturin
+ run: uv tool install maturin
+
+ - name: Check Rust formatting
+ run: cargo fmt -- --check
+
+ - name: Run Rust tests
+ run: cargo test --workspace
+
+ # Build the two Python extension packages that wrap the Rust crates.
+ - name: Build qubed wheel
+ run: uv tool run maturin build -m py_qubed/Cargo.toml
+
+ - name: Build qubed_meteo wheel
+ run: uv tool run maturin build -m py_qubed_meteo/Cargo.toml
+
+ # Install built wheels into an isolated uv-managed venv and run pytest.
+ - name: Run Python binding tests
+ run: |
+ uv venv .ci-venv
+ uv pip install --python .ci-venv pytest target/wheels/qubed-*.whl target/wheels/qubed_meteo-*.whl
+ uv run --python .ci-venv pytest -q py_qubed/tests py_qubed_meteo/tests
+
+ - name: Upload wheel artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: wheels-linux
+ path: target/wheels/*.whl
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
deleted file mode 100644
index dc973c43..00000000
--- a/.github/workflows/docs.yml
+++ /dev/null
@@ -1,73 +0,0 @@
-name: Publish Documentation to sites.ecmwf.int
-on:
- pull_request:
- types: [opened, synchronize, reopened, closed]
- push:
- branches:
- - "develop"
- - "main"
- tags:
- - "**"
-jobs:
- build:
- if: ${{ github.event_name == 'pull_request' && github.event.action != 'closed' || github.event_name == 'push'}}
- runs-on: ubuntu-latest
- outputs:
- artifact-id: ${{ steps.upload-doc.outputs.artifact-id }}
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v5
- with:
- python-version: 3.13
- - name: Build and Install
- run: |
- python -m pip install ".[dev,docs,cbor]"
- - name: Test
- run: |
- sphinx-build docs docs/_build
- - name: Archive documentation
- id: upload-doc
- uses: actions/upload-artifact@v4
- with:
- name: documentation
- path: docs/_build
- preview-publish:
- if: ${{ github.event_name == 'pull_request' && github.event.action != 'closed' }}
- needs: build
- uses: ecmwf/reusable-workflows/.github/workflows/pr-preview-publish.yml@main
- with:
- artifact-id: ${{ needs.build.outputs.artifact-id }}
- space: docs
- name: dev-section
- path: qubed/pull-requests
- link-text: ππ¦οΈππ§ Documentation π§ππ¦οΈπ
- secrets:
- sites-token: ${{ secrets.ECMWF_SITES_DOCS_DEV_SECTION_TOKEN }}
- preview-unpublish:
- if: ${{ github.event_name == 'pull_request' && github.event.action == 'closed' }}
- uses: ecmwf/reusable-workflows/.github/workflows/pr-preview-unpublish.yml@main
- with:
- space: docs
- name: dev-section
- path: qubed/pull-requests
- secrets:
- sites-token: ${{ secrets.ECMWF_SITES_DOCS_DEV_SECTION_TOKEN }}
- publish:
- if: >-
- ${{ github.event_name == 'push' && (
- github.ref_name == 'develop' ||
- github.ref_name == 'main' ||
- github.ref_type == 'tag'
- ) }}
- needs: build
- uses: ecmwf/reusable-workflows/.github/workflows/docs-publish.yml@main
- with:
- artifact-id: ${{ needs.build.outputs.artifact-id }}
- space: docs
- name: dev-section
- path: qubed
- id: ${{ github.ref_name }}
- softlink: ${{ github.ref_name == 'main' && 'stable'
- || github.ref_name == 'develop' && 'latest' }}
- secrets:
- sites-token: ${{ secrets.ECMWF_SITES_DOCS_DEV_SECTION_TOKEN }}
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
deleted file mode 100644
index c5adf1e6..00000000
--- a/.github/workflows/test.yml
+++ /dev/null
@@ -1,52 +0,0 @@
-# This file is autogenerated by maturin v1.7.7
-# To update, run
-#
-# maturin generate-ci github
-#
-name: Test
-
-on:
- push:
- branches:
- - main
- - develop
- pull_request:
- workflow_dispatch:
-
-
-permissions:
- contents: read
-
-jobs:
- test:
- name: test with ${{ matrix.env }} on ${{ matrix.os }}
- runs-on: ${{ matrix.os }}
- strategy:
- fail-fast: false
- matrix:
- env:
- - "3.13"
- - "3.12"
- - "3.11"
- os:
- - ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - name: Install the latest version of uv
- uses: astral-sh/setup-uv@v3
-
- - name: Install tox
- run: uv tool install --python-preference only-managed --python 3.13 tox --with tox-uv --with tox-gh
- - name: Install Python
- if: matrix.env != '3.13'
- run: uv python install --python-preference only-managed ${{ matrix.env }}
-
- - name: Setup test suite
- run: tox run -vv --notest --skip-missing-interpreters false
- env:
- TOX_GH_MAJOR_MINOR: ${{ matrix.env }}
-
- - name: Run test suite
- run: tox run --skip-pkg-install
- env:
- TOX_GH_MAJOR_MINOR: ${{ matrix.env }}
diff --git a/.github/workflows/test_docs.yml b/.github/workflows/test_docs.yml
deleted file mode 100644
index 0a31f8f8..00000000
--- a/.github/workflows/test_docs.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-name: Test Docs
-
-on:
- push:
- branches:
- - main
- - develop
- pull_request:
- workflow_dispatch:
-
-permissions:
- contents: read
-
-jobs:
- linux:
- runs-on:
- - ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v5
- with:
- python-version: 3.x
- - name: Build and Install
- run: |
- python -m pip install ".[dev,docs,cbor]"
- - name: Test
- run: |
- sphinx-build --define nb_execution_raise_on_error=1 docs docs/_build
diff --git a/.github/workflows/update_version.py b/.github/workflows/update_version.py
deleted file mode 100755
index b1fe53ad..00000000
--- a/.github/workflows/update_version.py
+++ /dev/null
@@ -1,42 +0,0 @@
-import re
-import subprocess
-from pathlib import Path
-
-CARGO_TOML_PATH = Path("Cargo.toml")
-
-
-# Get the latest Git tag and strip the leading 'v' if present
-def get_git_version():
- try:
- version = subprocess.check_output(
- ["git", "describe", "--tags", "--always"], text=True
- ).strip()
- version = re.sub(r"^v", "", version) # Remove leading 'v'
- return version
- except subprocess.CalledProcessError:
- raise RuntimeError(
- "Failed to get Git tag. Make sure you have at least one tag in the repository."
- )
-
-
-# Update version in Cargo.toml
-def update_cargo_version(new_version):
- cargo_toml = CARGO_TOML_PATH.read_text()
-
- # Replace version in [package] section
- updated_toml = re.sub(
- r'^version = "[^"]+"',
- f'version = "{new_version}"',
- cargo_toml,
- flags=re.MULTILINE,
- )
-
- CARGO_TOML_PATH.write_text(updated_toml)
-
-
-if __name__ == "__main__":
- version = get_git_version()
- print(f"Parsed version: {version}")
-
- update_cargo_version(version)
- print(f"Updated Cargo.toml with version: {version}")
diff --git a/.gitignore b/.gitignore
index 6934a850..bb43466c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,12 +1,16 @@
__pycache__
+**/__pycache__/
+**/.pytest_cache/
.DS_Store
.venv
*.json
+*.bak
raw_list
*.egg-info/
deps/
docs/_build/
docs/jupyter_execute
+docs/book/
target/
*.so
_build/
@@ -14,7 +18,6 @@ build/
.ipynb_checkpoints/
dist/
Cargo.lock
-src/python/qubed/_version.py
*.ipynb
cmake_build/
tests/data/
@@ -23,6 +26,15 @@ node_modules/
uv.lock
*.log
*.tmp
-test_scripts/data
+*.list
+test_scripts
tests/example_qubes
**/*venv*
+.idea/
+*.grib
+fdb
+
+
+# Added by cargo
+
+/target
diff --git a/.lfsconfig b/.lfsconfig
deleted file mode 100644
index 2cf1bce1..00000000
--- a/.lfsconfig
+++ /dev/null
@@ -1,2 +0,0 @@
-[lfs]
- fetchexclude = *
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 5fedb50d..6f019133 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,18 +1,8 @@
-# See https://pre-commit.com for more information
-# See https://pre-commit.com/hooks.html for more hooks
repos:
-- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v5.0.0
+ - repo: local
hooks:
- - id: trailing-whitespace
- - id: end-of-file-fixer
- exclude: "[^/.]+.cbor"
- # - id: check-yaml
-# - id: check-added-large-files
-
-- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.9.7
- hooks:
- - id: ruff
- args: [ --fix ]
- - id: ruff-format
+ - id: cargo-fmt
+ name: cargo fmt
+ entry: bash -c "cargo fmt"
+ language: system
+ types: [rust]
\ No newline at end of file
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
deleted file mode 100644
index 52e42b74..00000000
--- a/.readthedocs.yaml
+++ /dev/null
@@ -1,29 +0,0 @@
-# .readthedocs.yaml
-# Read the Docs configuration file
-# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
-
-# Required
-version: 2
-
-# Set the version of Python and other tools you might need
-build:
- os: ubuntu-20.04
- tools:
- python: "3.12"
- rust: latest
-
-# Build documentation in the docs/ directory with Sphinx
-sphinx:
- configuration: docs/conf.py
-
-# If using Sphinx, optionally build your docs in additional formats such as PDF
-# formats:
-# - pdf
-
-python:
- install:
- - method: pip
- path: .
- extra_requirements:
- - docs
- - cbor
diff --git a/Cargo.toml b/Cargo.toml
index 1af4769c..87a8ec3f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,27 +1,15 @@
-[package]
-name = "qubed"
-version = "0.0.0"
-edition = "2021"
-repository = "https://github.com/ecmwf/qubed"
+[workspace]
+resolver = "3"
-[dependencies]
-# rsfdb = {git = "https://github.com/ecmwf/rsfdb", branch = "develop"}
-serde = { version = "1.0", features = ["derive"] }
-serde_json = "1.0"
-pyo3 = "0.25"
-lasso = "0.7.3"
-itertools = "0.14.0"
+members = [
+ "qubed",
+ "qubed_meteo",
+ "py_qubed",
+ "py_qubed_meteo",
+]
-[package.metadata.maturin]
-version-from-git = true
+[patch.'https://github.com/ecmwf/rsfdb']
+rsfdb = { path = "../rsfdb" }
-[lib]
-name = "tree_traverser"
-crate-type = ["cdylib"]
-path = "./src/rust/lib.rs"
-
-# [patch.'https://github.com/ecmwf/rsfdb']
-# rsfdb = { path = "../rsfdb" }
-
-# [patch.'https://github.com/ecmwf-projects/rsfindlibs']
-# rsfindlibs = { path = "../rsfindlibs" }
+[patch.'https://github.com/ecmwf-projects/rsfindlibs']
+rsfindlibs = { path = "../rsfindlibs" }
diff --git a/LICENSE.txt b/LICENSE.txt
deleted file mode 100644
index 010df008..00000000
--- a/LICENSE.txt
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright 2020 European Centre for Medium-Range Weather Forecasts
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/README.md b/README.md
deleted file mode 100644
index 93d734ce..00000000
--- a/README.md
+++ /dev/null
@@ -1,86 +0,0 @@
-#
-
-
-
-
-
-
-
-
-
-Qubed provides a data structure primitive for working with trees of Datacubes. If a normal tree looks like this:
-```
-root
-βββ class=od
-β βββ expver=0001
-β β βββ param=1
-β β βββ param=2
-β βββ expver=0002
-β βββ param=1
-β βββ param=2
-βββ class=rd
- βββ expver=0001
- β βββ param=1
- β βββ param=2
- β βββ param=3
- βββ expver=0002
- βββ param=1
- βββ param=2
-```
-
-A compressed view of the same set would be:
-```
-root
-βββ class=od, expver=0001/0002, param=1/2
-βββ class=rd
- βββ expver=0001, param=1/2/3
- βββ expver=0002, param=1/2
-```
-
-Qubed provides all the algorithms on this data structure you would expect, such as intersection/union/difference, compression, search, filtering etc.
-
-In addition to this core datastructure, this repository contains a collection of components designed to deliver user friendly cataloging for datacube data. The STAC Server, Frontend and a periodic job to do tree compression can be deployed together to kubernetes using the [helm chart](./helm_chart). This deployment can then be accessed either via the Query Builder Web interface or the Python client.
-
-## π¦ Components Overview
-
-
-### π [Qubed STAC Server](./stac_server)
-> **FastAPI STAC Server Backend**
-
-- π Implements our proposed [Datacube STAC Extension](./structured_stac.md).
-- π οΈ Allows efficient traversal of ECMWF's datacubes.
-- Part of the implementation of this is [π² Qubed](./src/python/qubed), a **compressed tree representation** optimised for storing trees with many duplicated subtrees.
-- π **[Live Example](https://qubed.lumi.apps.dte.destination-earth.eu/?class=d1&dataset=climate-dt)**.
-
----
-
-### π [Qubed Web Query Builder](./web_query_builder)
-> **Web Frontend**
-
-- π Displays data from the **STAC Server** in an intuitive user interface.
-- π **[Try the Live Demo](https://qubed.lumi.apps.dte.destination-earth.eu/)**.
-
----
-
-### TODO: π [Qubed Python Query Builder](./python_query_builder)
-> **Python Client**
-
-- π€ A Python client for the **STAC Server**.
-- π Reference implementation of the [Datacube STAC Extension](./structured_stac.md).
-
----
-
-## π Deployment Instructions
-
-Deploy all components to **Kubernetes** using the provided [Helm Chart](./chart) and skaffold:
-```shell
-skaffold run -p prod
-```
-Not specifying a profile deploys the default dev environment.
----
-
-### π οΈ Future Enhancements
-- Integration **Query Builder Web** with Polytope to contruct a full polytope query.
-- A JS polytope client implementation to allow performing the polytope query and getting the result all in the browser.
-
----
diff --git a/ROADMAP.md b/ROADMAP.md
deleted file mode 100644
index 124dddf3..00000000
--- a/ROADMAP.md
+++ /dev/null
@@ -1,50 +0,0 @@
-
-Initial Python Implementation
-[x] Basic Qube datastructure
-[x] Compression
-[x] Set Operations (Union, Difference, Intersection...)
-[x] Query with request
-[x] Iteration over leaves
-[x] Iteration over datacubes
-[x] Command line creation from fdb list --compact
-[ ] Set up periodic updates to climate-dt/extremes-dt again
-[ ] Maybe also do production db?
-[ ] Do mars list to contraints conversion
-[ ] protobuf serialization
-
-
-Rust port
-[ ] Initial object
-[ ] Sort out ownership issues, (one arena owned by python object)
-[ ] Compression
-[ ] Set Operations
-[ ] Query with request
-[ ] Iteration over leaves
-[ ] Iteration over datacubes
-[ ] Set up periodic updates to climate-dt/extremes-dt again
-
-## API
-
-Qubed will provide a core compressed tree data structure called a Qube with:
-
-Methods to convert to and from:
-- [x] A human readable representation like those seen above.
-- [x] An HTML version where subtrees can be collapsed.
-- [ ] An compact protobuf-based binary format
-- [x] Nested python dictionaries or JSON
-- [/] The output of [fdb list](https://confluence.ecmwf.int/display/FDB/fdb-list)
-- [ ] [mars list][mars list]
-- [ ] [constraints.json][constraints]
-
-[constraints]: https://object-store.os-api.cci2.ecmwf.int/cci2-prod-catalogue/resources/reanalysis-era5-land/constraints_a0ae5b42d67869674e13fba9fd055640bcffc37c24578be1f465d7d5ab2c7ee5.json
-[mars list]: https://git.ecmwf.int/projects/CDS/repos/cads-forms-reanalysis/browse/reanalysis-era5-single-levels/gecko-config/mars.list?at=refs%2Fheads%2Fprod
-
-Useful algorithms:
-- [x] Compression
-- [/] Union/Intersection/Difference
-
-Performant Membership Queries
-- Identifier membership
-- Datacube query (selection)
-
-Metadata Storage
diff --git a/chart/.helmignore b/chart/.helmignore
deleted file mode 100644
index 0e8a0eb3..00000000
--- a/chart/.helmignore
+++ /dev/null
@@ -1,23 +0,0 @@
-# Patterns to ignore when building packages.
-# This supports shell glob matching, relative path matching, and
-# negation (prefixed with !). Only one pattern per line.
-.DS_Store
-# Common VCS dirs
-.git/
-.gitignore
-.bzr/
-.bzrignore
-.hg/
-.hgignore
-.svn/
-# Common backup files
-*.swp
-*.bak
-*.tmp
-*.orig
-*~
-# Various IDEs
-.project
-.idea/
-*.tmproj
-.vscode/
diff --git a/chart/Chart.yaml b/chart/Chart.yaml
deleted file mode 100644
index 94f75cea..00000000
--- a/chart/Chart.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-apiVersion: v2
-name: qubed
-description: A Helm chart for the STAC Server with frontend, STAC API and caching service.
-type: application
-version: 0.1.0
-appVersion: "0.1.0"
diff --git a/chart/README.md b/chart/README.md
deleted file mode 100644
index b7a14794..00000000
--- a/chart/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Qubed Catalogue Chart
-
-This is helm chart for the frontend in `../stac_server`.
-
-The default values are for our dev deployment.
-
-It is meant to be deployed by skaffold from the parent directory.
-
-Known issues:
-- The cronjobs need to be run on the same node as the stac server to avoid pvc attachment issues.
-They currently are not, so we don't suggest using them.
\ No newline at end of file
diff --git a/chart/templates/scanner/scan-jobs.yaml b/chart/templates/scanner/scan-jobs.yaml
deleted file mode 100644
index abfd1b8e..00000000
--- a/chart/templates/scanner/scan-jobs.yaml
+++ /dev/null
@@ -1,93 +0,0 @@
-{{- define "scanjob.jobSpec" }}
-backoffLimit: {{ default 0 .root.Values.scanJobs.backoffLimit }}
-template:
- spec:
- restartPolicy: Never
- containers:
- - name: {{ .name }}
- image: {{ default .root.Values.scanJobs.image .image }}
- imagePullPolicy: {{ default (default "IfNotPresent" .root.Values.scanJobs.imagePullPolicy) .imagePullPolicy }}
- {{- if or .workingDir .root.Values.scanJobs.workingDir }}
- workingDir: {{ default .root.Values.scanJobs.workingDir .workingDir }}
- {{- end }}
- {{- if .command }}
- command:
- {{- toYaml .command | nindent 10 }}
- {{- end }}
- {{- if .args }}
- args:
- {{- toYaml .args | nindent 10 }}
- {{- end }}
- env:
- - name: API_KEY
- valueFrom:
- secretKeyRef:
- name: api-key
- key: API_KEY
- - name: MOUNT_PATH
- value: {{ .root.Values.sharedStorage.mountPath | quote }}
- {{- if .env }}
- {{- toYaml .env | nindent 10 }}
- {{- end }}
- {{- if .resources }}
- resources:
- {{- toYaml .resources | nindent 10 }}
- {{- end }}
- volumeMounts:
- - name: shared-storage
- mountPath: {{ .root.Values.sharedStorage.mountPath }}
- volumes:
- - name: shared-storage
- persistentVolumeClaim:
- claimName: {{ .root.Values.sharedStorage.name }}
-{{- end }}
-{{- if and .Values.scanJobs.enabled .Values.sharedStorage.enabled }}
-{{- range $jobName, $job := .Values.scanJobs.jobs }}
- {{- if $job.schedule }}
----
-apiVersion: batch/v1
-kind: CronJob
-metadata:
- name: {{ $jobName }}
-spec:
- schedule: {{ $job.schedule | quote }}
- jobTemplate:
- spec:
- {{- include "scanjob.jobSpec" (dict
- "name" (printf "%s-cronjob" $jobName)
- "image" $job.image
- "imagePullPolicy" $job.imagePullPolicy
- "workingDir" $job.workingDir
- "command" $job.command
- "args" $job.args
- "env" $job.env
- "resources" $job.resources
- "root" $
- ) | nindent 6 }}
- {{- end }}
-
- {{- if $job.init_run }}
----
-apiVersion: batch/v1
-kind: Job
-metadata:
- name: {{ printf "%s-%s" $jobName $.Release.Name }}
- annotations:
- "helm.sh/hook": post-install, post-upgrade
- "helm.sh/hook-delete-policy": before-hook-creation
-spec:
- {{- include "scanjob.jobSpec" (dict
- "name" (printf "%s-initjob" $jobName)
- "image" $job.image
- "imagePullPolicy" $job.imagePullPolicy
- "workingDir" $job.workingDir
- "command" $job.command
- "args" $job.args
- "env" $job.env
- "resources" $job.resources
- "root" $
- ) | nindent 2 }}
- {{- end }}
-{{- end }}
-{{- end }}
-
diff --git a/chart/templates/scanner/shared-pvc.yaml b/chart/templates/scanner/shared-pvc.yaml
deleted file mode 100644
index e88ce793..00000000
--- a/chart/templates/scanner/shared-pvc.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-{{- if .Values.sharedStorage.enabled }}
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
- name: {{ .Values.sharedStorage.name }}
-spec:
- accessModes:
- {{- toYaml .Values.sharedStorage.accessModes | nindent 4 }}
- resources:
- requests:
- storage: {{ .Values.sharedStorage.size }}
- {{- if .Values.sharedStorage.storageClassName }}
- storageClassName: {{ .Values.sharedStorage.storageClassName }}
- {{- end }}
-{{- end }}
diff --git a/chart/templates/stac-server/ingress.yaml b/chart/templates/stac-server/ingress.yaml
deleted file mode 100644
index cba94f45..00000000
--- a/chart/templates/stac-server/ingress.yaml
+++ /dev/null
@@ -1,29 +0,0 @@
-{{- if .Values.ingress.enabled }}
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
- name: stac-server-ingress
-spec:
- ingressClassName: nginx
- rules:
- {{- range .Values.ingress.hostnames }}
- - host: {{ . }}
- http:
- paths:
- {{- if $.Values.stacServer.enabled }}
- - path: /
- pathType: Prefix
- backend:
- service:
- name: stac-server
- port:
- number: {{ $.Values.stacServer.servicePort }}
- {{- end }}
- {{- end }}
- tls:
- - hosts:
- {{- range .Values.ingress.hostnames }}
- - {{ . }}
- {{- end }}
- secretName: {{ .Values.ingress.tlsSecretName }}
-{{- end }}
diff --git a/chart/templates/stac-server/stac-server-deployment.yaml b/chart/templates/stac-server/stac-server-deployment.yaml
deleted file mode 100644
index 98c6242e..00000000
--- a/chart/templates/stac-server/stac-server-deployment.yaml
+++ /dev/null
@@ -1,82 +0,0 @@
-# templates/stac-server-deployment.yaml
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: stac-server
-spec:
- replicas: {{ .Values.stacServer.replicas }}
- selector:
- matchLabels:
- app: stac-server
- template:
- metadata:
- labels:
- app: stac-server
- spec:
- containers:
- - name: stac-server
- image: "{{ .Values.stacServer.image.repository }}:{{ .Values.stacServer.image.tag }}"
- imagePullPolicy: {{ .Values.stacServer.image.pullPolicy }}
- command: ["uvicorn"]
- args:
- - "stac_server.main:app"
- - "--proxy-headers"
- - "--port"
- - "80"
- - "--host"
- - "0.0.0.0"
- - "--log-level"
- - "info"
- - "--app-dir"
- - "/code/qubed"
- volumeMounts:
- {{- if .Values.sharedStorage.enabled }}
- - name: shared-storage
- mountPath: {{ .Values.sharedStorage.mountPath }}
- {{- end }}
- - name: stac-server-config
- mountPath: /etc/stac-server-config
- readOnly: true
- env:
- - name: API_KEY
- valueFrom:
- secretKeyRef:
- name: api-key
- key: API_KEY
- - name: API_URL
- value: "https://{{ index .Values.ingress.hostnames 0 }}/api/v2/"
- - name: CONFIG_PATH
- value: "/etc/stac-server-config/config.yaml"
- - name: LOG_LEVEL
- value: {{ default "DEBUG" .Values.logLevel }}
- {{- if .Values.sharedStorage.enabled }}
- - name: QUBED_DATA_PREFIX
- value: {{ .Values.sharedStorage.mountPath }}
- {{- end }}
- - name: TITLE
- value: {{ .Values.title }}
- ports:
- - containerPort: {{ .Values.stacServer.servicePort }}
- volumes:
- {{- if .Values.sharedStorage.enabled }}
- - name: shared-storage
- persistentVolumeClaim:
- claimName: {{ .Values.sharedStorage.name }}
- {{- end }}
- - name: stac-server-config
- configMap:
- name: stac-server-config
----
-apiVersion: v1
-kind: Service
-metadata:
- name: stac-server
-spec:
- selector:
- app: stac-server
- ports:
- - protocol: TCP
- port: {{ .Values.stacServer.servicePort }}
- targetPort: {{ .Values.stacServer.servicePort }}
- type: ClusterIP
\ No newline at end of file
diff --git a/chart/templates/stac-server/stac_config.yaml b/chart/templates/stac-server/stac_config.yaml
deleted file mode 100644
index 92b25e6f..00000000
--- a/chart/templates/stac-server/stac_config.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: stac-server-config
- labels:
- app: stac-server
-data:
- config.yaml: |
- {{- with .Values.stacServer.config }}
- {{- toYaml . | nindent 4 }}
- {{- end }}
diff --git a/chart/values.yaml b/chart/values.yaml
deleted file mode 100644
index 9028c552..00000000
--- a/chart/values.yaml
+++ /dev/null
@@ -1,136 +0,0 @@
-title: Qubed Catalogue Browser
-
-stacServer:
- enabled: true
- replicas: 1
- image:
- repository: eccr.ecmwf.int/qubed/stac_server
- tag: 0.3.0
- pullPolicy: Always
- servicePort: 80
- config: # config mounted as configmap
- data_files: # list of data files to load on startup, relative to mountPath
- - on-demand-extremes-dt.json
- - extremes-dt.json
- - climate-dt-gen-1.json
- - climate-dt-gen-2.json
-
-ingress:
- enabled: True
- tlsSecretName: "lumi-wildcard-tls"
- hostnames:
- - "qubed-dev.lumi.apps.dte.destination-earth.eu"
- - "catalogue-dev.lumi.apps.dte.destination-earth.eu"
-
-# Shared storage PVC mounted by CronJobs and stac-server
-sharedStorage:
- enabled: true
- name: qubed-shared
- accessModes:
- - ReadWriteMany
- size: 20Gi
- storageClassName: "" # set to your storage class or leave empty to use default
- mountPath: /data/shared # available as $MOUNT_PATH in scan jobs and QUBED_DATA_PREFIX in stac-server
-
-# Configurable scan Init and Cron Jobs
-scanJobs:
- enabled: false # won't work without sharedStorage enabled
- # optional defaults applied to all jobs unless overridden
- image: eccr.ecmwf.int/qubed/fdb_scanner
- imagePullPolicy: IfNotPresent
- jobs:
- # dev-job:
- # init_run: true
- # command: ["/bin/bash"]
- # args:
- # - -c
- # - |
- # trap : TERM INT; while true; do sleep 3600; done
- # env: []
- # On Demand Extremes DT Full scan every day at 4am
- on-demand-extremes-dt-full-daily:
- schedule: "0 4 * * *" # cronjob schedule. Leave empty to disable regular runs
- # init_run: true # run once at startup
- command: ["uv"]
- args:
- - "run"
- - "./scan.py"
- - "--quiet"
- - "--full"
- - "--selector"
- - "class=d1,dataset=on-demand-extremes-dt"
- - "--filepath"
- - "on-demand-extremes-dt.json"
- - "--api"
- - "http://stac-server:80/api/v2"
- env: []
-
- # On Demand Extremes DT Partial scan every three hours <1s
- on-demand-extremes-dt-partial-3h:
- schedule: "37 */3 * * *"
- # init_run: true
- command: ["uv"]
- args:
- - "run"
- - "./scan.py"
- - "--quiet"
- - "--last_n_days=14"
- - "--selector"
- - "class=d1,dataset=on-demand-extremes-dt"
- - "--filepath"
- - "on-demand-extremes-dt.json"
- - "--api"
- - "http://stac-server:80/api/v2"
- env: []
-
- # Extremes-dt Daily Partial scan every three hours # takes 10s
- extremes-dt-partial-3h:
- schedule: "12 */3 * * *"
- # init_run: true
- command: ["uv"]
- args:
- - "run"
- - "./scan.py"
- - "--quiet"
- - "--last_n_days=14"
- - "--selector"
- - "class=d1,dataset=extremes-dt"
- - "--filepath"
- - "extremes-dt.json"
- - "--api"
- - "http://stac-server:80/api/v2"
- env: []
-
- # # Climate dt gen 2 Weekly on Sunday at 2am, takes 45min
- climate-dt-gen2-weekly:
- schedule: "0 2 * * 0"
- # init_run: true
- command: ["uv"]
- args:
- - "run"
- - "./scan.py"
- - "--quiet"
- - "--full"
- - "--selector"
- - "class=d1,dataset=climate-dt,generation=2"
- - "--filepath"
- - "climate-dt-gen-2.json"
- - "--api"
- - "http://stac-server:80/api/v2"
- env: []
-
- # # Climate dt gen 1, takes 6h
- # climate-dt-gen1-single:
- # # schedule: "0 3 * * 0"
- # init_run: true
- # command: ["uv"]
- # args:
- # - "run"
- # - "./scan.py"
- # - "--quiet"
- # - "--full"
- # - "--selector"
- # - "class=d1,dataset=climate-dt,generation=1"
- # - "--filepath"
- # - "climate-dt-gen-1.json"
- # env: []
diff --git a/compose.yaml b/compose.yaml
deleted file mode 100644
index 36790446..00000000
--- a/compose.yaml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-services:
- #Β STAC Server
- stac_server:
- # image: stac-server:latest
- container_name: stac_server
- build:
- context: .
- dockerfile: Dockerfile
- target: stac_server
- ports:
- - "8124:80"
- environment:
- - CONFIG_DIR=/config
- volumes:
- - ./stac_server:/code/stac_server
- # restart: always
-
- web_query_builder:
- # image: web_query_builder:latest
- container_name: web_query_builder
- build:
- context: .
- dockerfile: Dockerfile
- target: web_query_builder
- ports:
- - "8125:80"
- environment:
- - API_URL=http://127.0.0.1:8124/api/v1/stac/climate-dt
- volumes:
- - ./web_query_builder:/code/web_query_builder
- restart: always
diff --git a/config/config.yaml b/config/config.yaml
deleted file mode 100644
index 501c0699..00000000
--- a/config/config.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-data_files:
- # list of data files to load on startup, relative to mountPath
- # - cads.json
- - climate-dt.json
- - extremes-dt.json
- # - extremes-dt_with_metadata.json
- # - extremes-dt_with_metadata_large.zstd
- # - on-demand-extremes-dt.cbor
- # - test.json
\ No newline at end of file
diff --git a/config/fdb_config.yaml b/config/fdb_config.yaml
deleted file mode 100644
index 7ea95f17..00000000
--- a/config/fdb_config.yaml
+++ /dev/null
@@ -1,27 +0,0 @@
----
-type: select
-fdbs:
- - select: class=d1,dataset=^climate-dt$
- type: remote
- host: databridge-prod-catalogue3-ope.ewctest.link
- port: 10000
- engine: remote
- store: remote
- - select: class=d1,dataset=^on-demand-extremes-dt$|^extremes-dt$
- type: remote
- host: databridge-prod-catalogue1-ope.ewctest.link
- port: 10000
- engine: remote
- store: remote
- - select: class=rd
- type: remote
- host: databridge-prod-catalogue1-ope.ewctest.link
- port: 10000
- engine: remote
- store: remote
- - select: class=ng
- type: remote
- host: databridge-prod-catalogue3-ope.ewctest.link
- port: 10000
- engine: remote
- store: remote
\ No newline at end of file
diff --git a/config/language/language.yaml b/config/language/language.yaml
deleted file mode 100644
index 6aab93ff..00000000
--- a/config/language/language.yaml
+++ /dev/null
@@ -1,26329 +0,0 @@
-levtype:
- description: The Level Type, can be pressure levels, the surface, model levels
- etc.
- category: data
- default: pl
- flatten: false
- type: enum
- values:
- cat:
- name: "Category"
- dp:
- name: "Depth"
- layer:
- ml:
- name: "Model levels"
- pl:
- name: "Pressure levels"
- hl:
- name: "Height levels"
- pt:
- name: "Potential temperature"
- pv:
- name: "Potential vorticity"
- sfc:
- name: "Surface"
- sol:
- name: "3d multi-level model"
- alternative_names:
- - "surface other (multi)levels"
- wv:
- name: "Ocean wave"
- o2d:
- name: "Ocean surface"
- o3d:
- name: "Ocean model levels"
- never:
- - type: ssd
-
-class:
- description: Class selects the main category of data to be retrieved such as
- operational, research or AIFS
- category: data
- default: od
- flatten: false
- type: enum
- values:
- ai:
- name: "Operational aifs"
- d1:
- name: "Destine data"
- od:
- name: "Operational forecast data"
- rd:
- name: "Research data"
-type:
- category: data
- default: an
- flatten: false
- type: enum
- multiple: true
- values:
- # - [3g, 3d variational gradients]
- # - [3v, 3d variational analysis]
- # - [4g, 4d variational gradients]
- # - [4i, 4d variational increments]
- # - [4v, 4d variational analysis]
- # - [ab, analysis bias]
- # - [af, analysis feedback]
- # - [ai, analysis input]
- # - [an, analysis]
- # - [as, adjoint singular vector]
- # - [bf, bias-corrected forecast]
- # - [cd, climate distribution]
- # - [cf, control forecast]
- # - [ci, clustering information]
- # - [cl, climatology]
- # - [cm, cluster means]
- # - [cr, cluster representative]
- # - [cs, cluster std deviations]
- # - [cv, calibration validation forecast]
- # - [ea, errors in analysis]
- # - [ed, empirical distribution]
- # - [ef, errors in first guess]
- # - [efi, extreme forecast index]
- # - [efic, extreme forecast index control]
- # - [em, ensemble mean]
- # - [eme, ensemble data assimilation model errors]
- # - [emtm, ensemble mean of temporal mean]
- # - [ep, event probability]
- # - [es, ensemble standard deviation]
- # - [est, ensemble statistics]
- # - [estdtm, ensemble standard deviation of temporal mean]
- # - [fa, forecast accumulation]
- # - [fb, feedback]
- fc:
- name: "Forecast"
- pf:
- name: "Perturbed forecast"
-stream:
- description: Stream selects the kind of data to be retrieved, for example the
- forecast model or the ensemble model.
- category: data
- default: oper
- flatten: false
- type: enum
- values:
- clte:
- name: "Climate run output"
- alternative_names:
- - "climate"
- oper:
- name: "Atmospheric model"
- alternative_names:
- - "da"
- - "daily archive"
- wave:
- name: "Wave model"
- alternative_names:
- - "wv"
- lwda:
- name: "Long window daily archive"
- lwwv:
- name: "Long window wave"
- clmn:
- name: "Climate run monthly means output"
- alternative_names:
- - "climate-monthly"
-expver:
- description: Experiment number, 0001 is operational data.
- category: data
- default: '0001'
- flatten: false
- type: enum
- values:
- '0001':
- name: "Operational data"
- xxxx:
- name: "Experimental data"
- xxxy:
- name: "Experimental data"
-dataset:
- description: The dataset, for DestinE this is one of climate-dt, extremes-dt,
- on-demand-extremes-dt
- multiple: true
- type: enum
- values:
- climate-dt:
- name: "Climate Digital Twin"
- description: "The Climate DT represents the first ever attempt to operationalise the production of global multi-decadal climate projections, leveraging the world-leading supercomputing facilities of the EuroHPC Joint Undertaking along with some of the leading European climate models. A concise overview of what the Climate DT aims to achieve, and of the different concepts essential for an understanding of the Digital Twin's characteristics, is included in the Climate DT factsheet."
- url: "https://confluence.ecmwf.int/display/DDCZ/Climate+DT+Phase+1+data+catalogue"
- extremes-dt:
- name: "Extremes data"
- on-demand-extremes-dt:
- name: "On-demand extremes data"
-repres:
- flatten: false
- multiple: true
- type: enum
- values:
- g:
- name: "G"
- s:
- name: "H"
- l:
- name: "L"
- n:
- name: "P"
- r:
- name: "L"
-obsgroup:
- category: data
- multiple: true
- type: enum
- values:
- # - [conventional]
- sat:
- name: "Satellite"
- ers1:
- trmm:
- qscat:
- reo3:
- hirs:
- name: "Hirs"
- alternative_names:
- - 1
- amsua:
- name: "Amsua"
- alternative_names:
- - 2
- amsub:
- name: "Amsub"
- alternative_names:
- - 3
- mhs:
- name: "Mhs"
- alternative_names:
- - 4
- geos:
- name: "Geos"
- alternative_names:
- - 5
- resat:
- name: "Resat"
- alternative_names:
- - 6
- meris:
- name: "Meris"
- alternative_names:
- - 7
- gpsro:
- name: "Gpsro"
- alternative_names:
- - 8
- satob:
- name: "Satob"
- alternative_names:
- - 9
- scatt:
- name: "Scatt"
- alternative_names:
- - 10
- ssmi_as:
- name: "Ssmi all-sky"
- alternative_names:
- - 11
- iasi:
- name: "Iasi"
- alternative_names:
- - 12
- airs:
- name: "Airs"
- alternative_names:
- - 13
- ssmis_as:
- name: "Ssmis all-sky"
- alternative_names:
- - 14
- tmi_as:
- name: "Tmi all-sky"
- alternative_names:
- - 15
- amsre_as:
- name: "Amsre all-sky"
- alternative_names:
- - 16
- conv:
- name: "Conv"
- alternative_names:
- - 17
- smos:
- name: "Smos"
- alternative_names:
- - 19
- windsat_as:
- name: "Windsat all-sky"
- alternative_names:
- - 20
- ssmi:
- name: "Ssmi"
- alternative_names:
- - 21
- amsua_as:
- name: "Amsua all-sky"
- alternative_names:
- - 22
- amsre:
- name: "Amsre"
- alternative_names:
- - 23
- tmi:
- name: "Tmi"
- alternative_names:
- - 24
- ssmis:
- name: "Ssmis"
- alternative_names:
- - 25
- gbrad:
- name: "Gbrad"
- alternative_names:
- - 26
- mwhs:
- name: "Mwhs"
- alternative_names:
- - 27
- mwts:
- name: "Mwts"
- alternative_names:
- - 28
- mwri_as:
- name: "Mwri all-sky"
- alternative_names:
- - 29
- iras:
- name: "Iras"
- alternative_names:
- - 30
- msu:
- name: "Msu"
- alternative_names:
- - 31
- ssu:
- name: "Ssu"
- alternative_names:
- - 32
- vtpr1:
- name: "Vtpr1"
- alternative_names:
- - 33
- vtpr2:
- name: "Vtpr2"
- alternative_names:
- - 34
- atms:
- name: "Atms"
- alternative_names:
- - 35
- resat_ak:
- name: "Resat averaging kernels"
- alternative_names:
- - 36
- cris:
- name: "Cris"
- alternative_names:
- - 37
- wave_ip:
- name: "Wave integrated parameters"
- alternative_names:
- - 38
- wave_sp:
- name: "Wave spectra"
- alternative_names:
- - 39
- raingg:
- name: "Raingg"
- alternative_names:
- - 40
- sfc_ms:
- name: "Surface multisensor"
- alternative_names:
- - 41
- amsr2_as:
- name: "Amsr-2 all-sky"
- alternative_names:
- - 42
- saphir_as:
- name: "Saphir all-sky"
- alternative_names:
- - 43
- amsub_as:
- name: "Amsub all-sky"
- alternative_names:
- - 44
- mhs_as:
- name: "Mhs all-sky"
- alternative_names:
- - 45
- dwl:
- name: "Doppler wind lidar"
- alternative_names:
- - 46
- iris:
- name: "Iris"
- alternative_names:
- - 47
- aatsr:
- name: "Aatsr"
- alternative_names:
- - 49
- atms_as:
- name: "Atms all-sky"
- alternative_names:
- - 50
- gmi_as:
- name: "Gmi all-sky"
- alternative_names:
- - 51
- godae_sst:
- name: "Godae sea surface temperatures"
- alternative_names:
- - 52
- atovs_ms:
- name: "Atovs multisensor"
- alternative_names:
- - 53
- atmospheric_composition:
- name: "Atmospheric composition"
- alternative_names:
- - 54
- non_sfc_ms:
- name: "Non-surface multisensor"
- alternative_names:
- - 55
- mwts2:
- name: "Mwts2"
- alternative_names:
- - 56
- ssmi_1d:
- name: "Ssmi 1dvar tcwv cloudy-sky"
- alternative_names:
- - 57
- mwhs2_as:
- name: "Mwhs2 all-sky"
- alternative_names:
- - 58
- ssmt2:
- name: "Ssmt2"
- alternative_names:
- - 59
- smap:
- name: "Smap"
- alternative_names:
- - 60
- tovs_ms:
- name: "Tovs multisensor"
- alternative_names:
- - 61
- cloud_r:
- name: "Cloud reflectivity"
- alternative_names:
- - 62
- cloud_l:
- name: "Cloud lidar"
- alternative_names:
- - 63
- satellite_lightning:
- name: "Satellite lightning"
- alternative_names:
- - 64
- geos_vis:
- name: "Geos vis"
- alternative_names:
- - 65
- oconv:
- name: "Oconv"
- alternative_names:
- - 66
- mwts3_as:
- name: "Mwts3 all-sky"
- alternative_names:
- - 67
- giirs:
- name: "Giirs"
- alternative_names:
- - 68
- test:
- name: "Test"
- alternative_names:
- - 99
-reportype:
- category: data
- type: any
- multiple: true
-
-# rdbprefix
-
-
-
- values: {}
-levelist:
- category: data
- multiple: true
- by: 1
- default:
- - 1000
- - 850
- - 700
- - 500
- - 400
- - 300
- never:
- - levtype: [sfc, o2d]
- - type: ssd
- type: enum
- values:
- 1:
- 5:
- 10:
- 20:
- 30:
- 50:
- 70:
- 100:
- 150:
- 200:
- 250:
- 300:
- 400:
- 500:
- 600:
- 700:
- 850:
- 925:
- 1000:
-param:
- category: data
- default: 129
- multiple: true
- type: param
- never:
- - type: [tf, ob]
- values:
- 60:
- name: "Potential vorticity"
- 129:
- name: "Geopotential"
- 130:
- name: "Temperature"
- 131:
- name: "U component of wind"
- 132:
- name: "V component of wind"
- 133:
- name: "Specific humidity"
- 135:
- name: "Vertical velocity"
- 157:
- name: "Relative humidity"
- 246:
- name: "Specific cloud liquid water content"
-date:
- category: data
- default: 0
- type: enum
- multiple: true
- values:
- 20211021:
-year:
- category: data
- type: to-by-list
- multiple: true
- by: 1
-
- values: {}
-month:
- category: data
- flatten: true
- type: enum
- multiple: true
- values:
- 1:
- name: "January"
- alternative_names:
- - "jan"
- 2:
- name: "February"
- alternative_names:
- - "feb"
- 3:
- name: "March"
- alternative_names:
- - "mar"
- 4:
- name: "April"
- alternative_names:
- - "apr"
- 5:
- name: "May"
- alternative_names:
- - "may"
- 6:
- name: "June"
- alternative_names:
- - "jun"
- 7:
- name: "July"
- alternative_names:
- - "jul"
- 8:
- name: "August"
- alternative_names:
- - "aug"
- 9:
- name: "September"
- alternative_names:
- - "sep"
- 10:
- name: "October"
- alternative_names:
- - "oct"
- 11:
- name: "November"
- alternative_names:
- - "nov"
- 12:
- name: "December"
- alternative_names:
- - "dec"
-hdate:
- category: data
- multiple: true
- only:
- - stream:
- - enfh
- - enwh
- - efho
- - ehmm
- - ewho
- - eefh
- - weeh
- type: integer
-
- values: {}
-offsetdate:
- category: data
- multiple: true
- type: date
-
- values: {}
-fcmonth:
- category: data
- multiple: true
- by: 1
- type: to-by-list
-
- values: {}
-fcperiod:
- category: data
- multiple: true
- type: integer
-
- values: {}
-time:
- category: data
- default: '1200'
- multiple: true
- type: enum
- values:
- '0000':
- '0100':
- '0200':
- '0300':
- '0400':
- '0500':
- '0600':
- '0700':
- '0800':
- '0900':
- '1000':
- '1100':
- '1200':
- '1300':
- '1400':
- '1500':
- '1600':
- '1700':
- '1800':
- '1900':
- '2000':
- '2100':
- '2200':
- '2300':
-offsettime:
- category: data
- multiple: true
- type: time
-
-# leadtime
-# opttime
-# range
-
- values: {}
-step:
- description: Specify which forecast we want in hours past the date/time.
- category: data
- multiple: true
- by: 12
- default: 0
- type: range
- never:
- - dataset:
- - climate-dt
- - stream:
- - msmm
- - mmsa
- - swmm
-
- values: {}
-anoffset:
- category: data
- multiple: true
- type: integer
-
- values: {}
-reference:
- category: data
- multiple: true
- type: integer
-
-#################################################################
-
-# cluster
-# probability
-
- values: {}
-number:
- description: Selects a subset of ensemble members
- category: data
- multiple: true
- aliases:
- - ensemble
- by: 1
- only:
- - type: [pf, cr, cm, fcmean, fcmin, fcmax, fcstdev, sot, fc, wp, 4i, 4v]
- never:
- # This is to prevent number with type=fc and stream=oper
- - stream: [oper, wave]
- type: to-by-list
-
- values: {}
-quantile:
- category: data
- multiple: true
- only:
- - type:
- - pd
- - pb
- - taem
- - cd
- # - sot
- type: to-by-list-quantile
- denominators: [2, 3, 4, 5, 10, 100, 1000]
- by: 1
- values: {}
-domain:
- description: The large scale geographic region.
- category: data
- default: g
- flatten: false
- type: enum
- never:
- - dataset:
- - climate-dt
- values:
- # - [a, north west europe]
- # - [b, north east europe, baltic and black sea]
- c:
- name: "South west europe"
- d:
- name: "South east europe"
- e:
- name: "Europe"
- g:
- name: "General european area"
- alternative_names:
- - "globe"
-frequency:
- category: data
- multiple: true
- by: 1
- only:
- - param:
- - '140251'
- type: to-by-list
-
- values: {}
-direction:
- category: data
- multiple: true
- by: 1
- only:
- - param:
- - '140251'
- type: to-by-list
-
- values: {}
-diagnostic:
- category: data
- type: integer
- multiple: true
-
- values: {}
-iteration:
- category: data
- type: integer
- multiple: true
-
- values: {}
-channel:
- category: data
- only:
- - type: ssd
- type: integer
- multiple: true
-
- values: {}
-ident:
- category: data
- only:
- - type: ssd
- type: integer
- multiple: true
-
- values: {}
-instrument:
- category: data
- only:
- - type: ssd
- type: integer
- multiple: true
-
- values: {}
-method:
- category: data
- type: integer
-
- values: {}
-origin:
- category: data
- multiple: true
- type: enum
- values:
- ammc:
- name: "Melbourne"
- alternative_names:
- - 1
- babj:
- name: "Beijing"
- alternative_names:
- - 38
- cmcc:
- cnmc:
- name: "80"
- consensus:
- name: "255"
- crfc:
- name: "Cerfacs"
- alternative_names:
- - 239
- cwao:
- name: "Montreal"
- alternative_names:
- - 54
- ecmf:
- name: "Ecmwf"
- alternative_names:
- - 98
- edzw:
- name: "Offenbach"
- alternative_names:
- - "dwd"
- - 78
- egrr:
- name: "Bracknell"
- alternative_names:
- - 74
- - "exeter"
- enmi:
- name: "Oslo"
- alternative_names:
- - 88
- fnmo:
- name: "Fleet numerical"
- alternative_names:
- - "fnmoc"
- - 58
- hadc:
- name: "Hadley centre"
- alternative_names:
- - 247
- ifmk:
- name: "246"
- ingv:
- name: "235"
- knmi:
- name: "245"
- kwbc:
- name: "Washington"
- alternative_names:
- - 7
- lemm:
- name: "Madrid"
- alternative_names:
- - 214
- lfpw:
- name: "Toulouse"
- alternative_names:
- - 84
- - 85
- - "paris"
- rjtd:
- name: "Tokyo"
- alternative_names:
- - 34
- rksl:
- name: "Seoul"
- alternative_names:
- - 40
- sbsj:
- name: "Cptec"
- alternative_names:
- - 46
- vuwien:
- name: "University of vienna"
- alternative_names:
- - 244
-system:
- category: data
- type: integer
-
-#######################################################################
-# DestinE ClimateDT related keywords
-
-
- values: {}
-model:
- type: enum
- description: Which climate model to use.
- values:
- ifs-fesom:
- name: "Integrated forecast system + fesom ocean model"
- ifs-nemo:
- name: "Integrated forecast system + nemo ocean model"
- icon:
- name: "Icon weather model"
-activity:
- category: data
- type: enum
- values:
- cmip6:
- name: "Coupled model intercomparison project phase 6"
- scenariomip:
- name: "Scenario model intercomparison project"
- highresmip:
- name: "High resolution model intercomparison project"
- story-nudging:
- name: "Climate storylines by nudging to reanalysis"
- baseline:
- name: "Baseline simulations for climate model evaluation"
- projections:
- name: "Future climate projections"
-experiment:
- category: data
- type: enum
- values:
- hist:
- name: "Historical"
- cont:
- name: "Control"
- amip:
- name: "Atmospheric model intercomparison project"
- ssp1-1.9:
- name: "Shared socio-economic pathways 1-1.9"
- ssp1-2.6:
- name: "Shared socio-economic pathways 1-2.6"
- ssp2-4.5:
- name: "Shared socio-economic pathways 2-4.5"
- ssp3-7.0:
- name: "Shared socio-economic pathways 3-7.0"
- ssp5-8.5:
- name: "Shared socio-economic pathways 5-8.5"
- tplus1.5k:
- name: "Warmer world at 1.5 degrees k above pre-industrial temperatures"
- tplus2.0k:
- name: "Warmer world at 2.0 degrees k above pre-industrial temperatures"
- tplus3.0k:
- name: "Warmer world at 3.0 degrees k above pre-industrial temperatures"
- tplus4.0k:
- name: "Warmer world at 4.0 degrees k above pre-industrial temperatures"
- abrupt4xco2:
- name: "Co2 abruptly quadrupled and then held constant"
-generation:
- category: data
- type: enum
- values:
- 1:
-realization:
- category: data
- type: integer
- values:
- 1:
-resolution:
- category: data
- type: enum
- values:
- standard:
- name: "Standard resolution model output with longer availability"
- high:
- name: "High resolution model output with limited availability"
-param:
- values:
- 1:
- name: "Stream function"
- alternative_names:
- - "strf"
- 2:
- name: "Vpot"
- alternative_names:
- - "vp"
- - "velocity potential"
- 3:
- name: "Potential temperature"
- alternative_names:
- - "pt"
- 4:
- name: "Equivalent potential temperature"
- alternative_names:
- - "eqpt"
- 5:
- name: "Saturated equivalent potential temperature"
- alternative_names:
- - "sept"
- 6:
- name: "Soil sand fraction"
- alternative_names:
- - "ssfr"
- 7:
- name: "Soil clay fraction"
- alternative_names:
- - "scfr"
- 8:
- name: "Surface runoff"
- alternative_names:
- - "sro"
- 9:
- name: "Sub-surface runoff"
- alternative_names:
- - "ssro"
- 10:
- name: "Wind speed"
- alternative_names:
- - "ws"
- 11:
- name: "U component of divergent wind"
- alternative_names:
- - "udvw"
- 12:
- name: "V component of divergent wind"
- alternative_names:
- - "vdvw"
- 13:
- name: "U component of rotational wind"
- alternative_names:
- - "urtw"
- 14:
- name: "V component of rotational wind"
- alternative_names:
- - "vrtw"
- 15:
- name: "Auvp"
- alternative_names:
- - "aluvp"
- - "uv visible albedo for direct radiation (climatological)"
- 16:
- name: "Auvd"
- alternative_names:
- - "aluvd"
- - "uv visible albedo for diffuse radiation (climatological)"
- 17:
- name: "Anip"
- alternative_names:
- - "alnip"
- - "near ir albedo for direct radiation (climatological)"
- 18:
- name: "Anid"
- alternative_names:
- - "alnid"
- - "near ir albedo for diffuse radiation (climatological)"
- 19:
- name: "Clear sky surface uv"
- alternative_names:
- - "uvcs"
- 20:
- name: "Surface photosynthetically active radiation, clear sky"
- alternative_names:
- - "parcs"
- 21:
- name: "Unbalanced component of temperature"
- alternative_names:
- - "uctp"
- 22:
- name: "Unbalanced component of logarithm of surface pressure"
- alternative_names:
- - "ucln"
- 23:
- name: "Unbalanced component of divergence"
- alternative_names:
- - "ucdv"
- 24:
- name: "Reserved for future unbalanced components"
- alternative_names:
- - "_param_000024"
- 25:
- name: "Reserved for future unbalanced components"
- alternative_names:
- - "_param_000025"
- 26:
- name: "Lake cover"
- alternative_names:
- - "cl"
- 27:
- name: "Low vegetation cover"
- alternative_names:
- - "cvl"
- 28:
- name: "High vegetation cover"
- alternative_names:
- - "cvh"
- 29:
- name: "Type of low vegetation"
- alternative_names:
- - "tvl"
- 30:
- name: "Type of high vegetation"
- alternative_names:
- - "tvh"
- 31:
- name: "Sea ice area fraction"
- alternative_names:
- - "ci"
- 32:
- name: "Snow albedo"
- alternative_names:
- - "asn"
- 33:
- name: "Snow density"
- alternative_names:
- - "rsn"
- 34:
- name: "Sstk"
- alternative_names:
- - "sst"
- - "sea surface temperature"
- 35:
- name: "Ice temperature layer 1"
- alternative_names:
- - "istl1"
- 36:
- name: "Ice temperature layer 2"
- alternative_names:
- - "istl2"
- 37:
- name: "Ice temperature layer 3"
- alternative_names:
- - "istl3"
- 38:
- name: "Ice temperature layer 4"
- alternative_names:
- - "istl4"
- 39:
- name: "Swv1"
- alternative_names:
- - "swvl1"
- - "volumetric soil water layer 1"
- 40:
- name: "Swv2"
- alternative_names:
- - "swvl2"
- - "volumetric soil water layer 2"
- 41:
- name: "Swv3"
- alternative_names:
- - "swvl3"
- - "volumetric soil water layer 3"
- 42:
- name: "Swv4"
- alternative_names:
- - "swvl4"
- - "volumetric soil water layer 4"
- 43:
- name: "Soil type"
- alternative_names:
- - "slt"
- 44:
- name: "Snow evaporation"
- alternative_names:
- - "es"
- 45:
- name: "Snowmelt"
- alternative_names:
- - "smlt"
- 46:
- name: "Solar duration"
- alternative_names:
- - "sdur"
- 47:
- name: "Direct solar radiation"
- alternative_names:
- - "dsrp"
- 48:
- name: "Magnitude of turbulent surface stress"
- alternative_names:
- - "magss"
- 49:
- name: "Maximum 10 metre wind gust since previous post-processing"
- alternative_names:
- - "10fg"
- 50:
- name: "Large-scale precipitation fraction"
- alternative_names:
- - "lspf"
- 51:
- name: "Maximum temperature at 2 metres in the last 24 hours"
- alternative_names:
- - "mx2t24"
- 52:
- name: "Minimum temperature at 2 metres in the last 24 hours"
- alternative_names:
- - "mn2t24"
- 53:
- name: "Montgomery potential"
- alternative_names:
- - "mont"
- 54:
- name: "Pressure"
- alternative_names:
- - "pres"
- 55:
- name: "Mean temperature at 2 metres in the last 24 hours"
- alternative_names:
- - "mean2t24"
- 56:
- name: "Mean 2 metre dewpoint temperature in the last 24 hours"
- alternative_names:
- - "mn2d24"
- 57:
- name: "Downward uv radiation at the surface"
- alternative_names:
- - "uvb"
- 58:
- name: "Photosynthetically active radiation at the surface"
- alternative_names:
- - "par"
- 59:
- name: "Convective available potential energy"
- alternative_names:
- - "cape"
- 60:
- name: "Potential vorticity"
- alternative_names:
- - "pv"
- 62:
- name: "Observation count"
- alternative_names:
- - "obct"
- 63:
- name: "Start time for skin temperature difference"
- alternative_names:
- - "stsktd"
- 64:
- name: "Finish time for skin temperature difference"
- alternative_names:
- - "ftsktd"
- 65:
- name: "Skin temperature difference"
- alternative_names:
- - "sktd"
- 66:
- name: "Lailv"
- alternative_names:
- - "lai_lv"
- - "leaf area index, low vegetation"
- 67:
- name: "Laihv"
- alternative_names:
- - "lai_hv"
- - "leaf area index, high vegetation"
- 68:
- name: "Minimum stomatal resistance, low vegetation"
- alternative_names:
- - "msr_lv"
- 69:
- name: "Minimum stomatal resistance, high vegetation"
- alternative_names:
- - "msr_hv"
- 70:
- name: "Biome cover, low vegetation"
- alternative_names:
- - "bc_lv"
- 71:
- name: "Biome cover, high vegetation"
- alternative_names:
- - "bc_hv"
- 72:
- name: "Instantaneous surface solar radiation downwards"
- alternative_names:
- - "issrd"
- 73:
- name: "Instantaneous surface thermal radiation downwards"
- alternative_names:
- - "istrd"
- 74:
- name: "Standard deviation of filtered subgrid orography (climatological)"
- alternative_names:
- - "sdfor"
- 75:
- name: "Specific rain water content"
- alternative_names:
- - "crwc"
- 76:
- name: "Specific snow water content"
- alternative_names:
- - "cswc"
- 77:
- name: "Etad"
- alternative_names:
- - "etadot"
- - "eta-coordinate vertical velocity"
- 78:
- name: "Total column cloud liquid water"
- alternative_names:
- - "tclw"
- 79:
- name: "Total column cloud ice water"
- alternative_names:
- - "tciw"
- 80:
- name: "Experimental product"
- alternative_names:
- - "_param_000080"
- 81:
- name: "Experimental product"
- alternative_names:
- - "_param_000081"
- 82:
- name: "Experimental product"
- alternative_names:
- - "_param_000082"
- 83:
- name: "Experimental product"
- alternative_names:
- - "_param_000083"
- 84:
- name: "Experimental product"
- alternative_names:
- - "_param_000084"
- 85:
- name: "Experimental product"
- alternative_names:
- - "_param_000085"
- 86:
- name: "Experimental product"
- alternative_names:
- - "_param_000086"
- 87:
- name: "Experimental product"
- alternative_names:
- - "_param_000087"
- 88:
- name: "Experimental product"
- alternative_names:
- - "_param_000088"
- 89:
- name: "Experimental product"
- alternative_names:
- - "_param_000089"
- 90:
- name: "Experimental product"
- alternative_names:
- - "_param_000090"
- 91:
- name: "Experimental product"
- alternative_names:
- - "_param_000091"
- 92:
- name: "Experimental product"
- alternative_names:
- - "_param_000092"
- 93:
- name: "Experimental product"
- alternative_names:
- - "_param_000093"
- 94:
- name: "Experimental product"
- alternative_names:
- - "_param_000094"
- 95:
- name: "Experimental product"
- alternative_names:
- - "_param_000095"
- 96:
- name: "Experimental product"
- alternative_names:
- - "_param_000096"
- 97:
- name: "Experimental product"
- alternative_names:
- - "_param_000097"
- 98:
- name: "Experimental product"
- alternative_names:
- - "_param_000098"
- 99:
- name: "Experimental product"
- alternative_names:
- - "_param_000099"
- 100:
- name: "Experimental product"
- alternative_names:
- - "_param_000100"
- 101:
- name: "Experimental product"
- alternative_names:
- - "_param_000101"
- 102:
- name: "Experimental product"
- alternative_names:
- - "_param_000102"
- 103:
- name: "Experimental product"
- alternative_names:
- - "_param_000103"
- 104:
- name: "Experimental product"
- alternative_names:
- - "_param_000104"
- 105:
- name: "Experimental product"
- alternative_names:
- - "_param_000105"
- 106:
- name: "Experimental product"
- alternative_names:
- - "_param_000106"
- 107:
- name: "Experimental product"
- alternative_names:
- - "_param_000107"
- 108:
- name: "Experimental product"
- alternative_names:
- - "_param_000108"
- 109:
- name: "Experimental product"
- alternative_names:
- - "_param_000109"
- 110:
- name: "Experimental product"
- alternative_names:
- - "_param_000110"
- 111:
- name: "Experimental product"
- alternative_names:
- - "_param_000111"
- 112:
- name: "Experimental product"
- alternative_names:
- - "_param_000112"
- 113:
- name: "Experimental product"
- alternative_names:
- - "_param_000113"
- 114:
- name: "Experimental product"
- alternative_names:
- - "_param_000114"
- 115:
- name: "Experimental product"
- alternative_names:
- - "_param_000115"
- 116:
- name: "Experimental product"
- alternative_names:
- - "_param_000116"
- 117:
- name: "Experimental product"
- alternative_names:
- - "_param_000117"
- 118:
- name: "Experimental product"
- alternative_names:
- - "_param_000118"
- 119:
- name: "Experimental product"
- alternative_names:
- - "_param_000119"
- 120:
- name: "Experimental product"
- alternative_names:
- - "_param_000120"
- 121:
- name: "Maximum temperature at 2 metres in the last 6 hours"
- alternative_names:
- - "mx2t6"
- 122:
- name: "Minimum temperature at 2 metres in the last 6 hours"
- alternative_names:
- - "mn2t6"
- 123:
- name: "Maximum 10 metre wind gust in the last 6 hours"
- alternative_names:
- - "10fg6"
- 124:
- name: "Surface emissivity"
- alternative_names:
- - "emis"
- 125:
- name: "Vertically integrated total energy"
- alternative_names:
- - "vite"
- 126:
- name: "Generic parameter for sensitive area prediction"
- alternative_names:
- - "_param_000126"
- 127:
- name: "Atmospheric tide"
- alternative_names:
- - "at"
- 128:
- name: "Budget values"
- alternative_names:
- - "bv"
- 129:
- name: "Geopotential"
- alternative_names:
- - "z"
- 130:
- name: "Temperature"
- alternative_names:
- - "t"
- 131:
- name: "U component of wind"
- alternative_names:
- - "u"
- 132:
- name: "V component of wind"
- alternative_names:
- - "v"
- 133:
- name: "Specific humidity"
- alternative_names:
- - "q"
- 134:
- name: "Surface pressure"
- alternative_names:
- - "sp"
- 135:
- name: "Vertical velocity"
- alternative_names:
- - "w"
- 136:
- name: "Total column water"
- alternative_names:
- - "tcw"
- 137:
- name: "Total column vertically-integrated water vapour"
- alternative_names:
- - "tcwv"
- 138:
- name: "Vorticity (relative)"
- alternative_names:
- - "vo"
- 139:
- name: "St"
- alternative_names:
- - "stl1"
- - "soil temperature level 1"
- 140:
- name: "Soil wetness level 1"
- alternative_names:
- - "swl1"
- 141:
- name: "Snow depth"
- alternative_names:
- - "sd"
- 142:
- name: "Large-scale precipitation"
- alternative_names:
- - "lsp"
- 143:
- name: "Convective precipitation"
- alternative_names:
- - "cp"
- 144:
- name: "Snowfall"
- alternative_names:
- - "sf"
- 145:
- name: "Boundary layer dissipation"
- alternative_names:
- - "bld"
- 146:
- name: "Surface sensible heat flux"
- alternative_names:
- - "sshf"
- 147:
- name: "Surface latent heat flux"
- alternative_names:
- - "slhf"
- 148:
- name: "Ss"
- alternative_names:
- - "chnk"
- - "charnock"
- 149:
- name: "Surface net radiation (sw and lw)"
- alternative_names:
- - "snr"
- 150:
- name: "Top net radiation (sw and lw)"
- alternative_names:
- - "tnr"
- 151:
- name: "Mean sea level pressure"
- alternative_names:
- - "msl"
- 152:
- name: "Logarithm of surface pressure"
- alternative_names:
- - "lnsp"
- 153:
- name: "Short-wave heating rate"
- alternative_names:
- - "swhr"
- 154:
- name: "Long-wave heating rate"
- alternative_names:
- - "lwhr"
- 155:
- name: "Divergence"
- alternative_names:
- - "d"
- 156:
- name: "Geopotential height"
- alternative_names:
- - "gh"
- 157:
- name: "Relative humidity"
- alternative_names:
- - "r"
- 158:
- name: "Tendency of surface pressure"
- alternative_names:
- - "tsp"
- 159:
- name: "Boundary layer height"
- alternative_names:
- - "blh"
- 160:
- name: "Standard deviation of sub-gridscale orography"
- alternative_names:
- - "sdor"
- 161:
- name: "Anisotropy of sub-gridscale orography"
- alternative_names:
- - "isor"
- 162:
- name: "Angle of sub-gridscale orography"
- alternative_names:
- - "anor"
- 163:
- name: "Slope of sub-gridscale orography"
- alternative_names:
- - "slor"
- 164:
- name: "Total cloud cover"
- alternative_names:
- - "tcc"
- 165:
- name: "10 metre u wind component"
- alternative_names:
- - "10u"
- 166:
- name: "10 metre v wind component"
- alternative_names:
- - "10v"
- 167:
- name: "2 metre temperature"
- alternative_names:
- - "2t"
- 168:
- name: "2 metre dewpoint temperature"
- alternative_names:
- - "2d"
- 169:
- name: "Surface short-wave (solar) radiation downwards"
- alternative_names:
- - "ssrd"
- 170:
- name: "Soil temperature level 2"
- alternative_names:
- - "stl2"
- 171:
- name: "Soil wetness level 2"
- alternative_names:
- - "swl2"
- 172:
- name: "Land-sea mask"
- alternative_names:
- - "lsm"
- 173:
- name: "Surface roughness (climatological)"
- alternative_names:
- - "sr"
- 174:
- name: "Albedo (climatological)"
- alternative_names:
- - "al"
- 175:
- name: "Surface long-wave (thermal) radiation downwards"
- alternative_names:
- - "strd"
- 176:
- name: "Surface net short-wave (solar) radiation"
- alternative_names:
- - "ssr"
- 177:
- name: "Surface net long-wave (thermal) radiation"
- alternative_names:
- - "str"
- 178:
- name: "Top net short-wave (solar) radiation"
- alternative_names:
- - "tsr"
- 179:
- name: "Top net long-wave (thermal) radiation"
- alternative_names:
- - "ttr"
- 180:
- name: "Time-integrated eastward turbulent surface stress"
- alternative_names:
- - "ewss"
- 181:
- name: "Time-integrated northward turbulent surface stress"
- alternative_names:
- - "nsss"
- 182:
- name: "Evaporation"
- alternative_names:
- - "e"
- 183:
- name: "Soil temperature level 3"
- alternative_names:
- - "stl3"
- 184:
- name: "Soil wetness level 3"
- alternative_names:
- - "swl3"
- 185:
- name: "Convective cloud cover"
- alternative_names:
- - "ccc"
- 186:
- name: "Low cloud cover"
- alternative_names:
- - "lcc"
- 187:
- name: "Medium cloud cover"
- alternative_names:
- - "mcc"
- 188:
- name: "High cloud cover"
- alternative_names:
- - "hcc"
- 189:
- name: "Sunshine duration"
- alternative_names:
- - "sund"
- 190:
- name: "East-west component of sub-gridscale orographic variance"
- alternative_names:
- - "ewov"
- 191:
- name: "North-south component of sub-gridscale orographic variance"
- alternative_names:
- - "nsov"
- 192:
- name: "North-west/south-east component of sub-gridscale orographic variance"
- alternative_names:
- - "nwov"
- 193:
- name: "North-east/south-west component of sub-gridscale orographic variance"
- alternative_names:
- - "neov"
- 194:
- name: "Brightness temperature"
- alternative_names:
- - "btmp"
- 195:
- name: "Eastward gravity wave surface stress"
- alternative_names:
- - "lgws"
- 196:
- name: "Northward gravity wave surface stress"
- alternative_names:
- - "mgws"
- 197:
- name: "Gravity wave dissipation"
- alternative_names:
- - "gwd"
- 198:
- name: "Skin reservoir content"
- alternative_names:
- - "src"
- 199:
- name: "Vegetation fraction"
- alternative_names:
- - "veg"
- 200:
- name: "Variance of sub-gridscale orography"
- alternative_names:
- - "vso"
- 201:
- name: "Maximum temperature at 2 metres since previous post-processing"
- alternative_names:
- - "mx2t"
- 202:
- name: "Minimum temperature at 2 metres since previous post-processing"
- alternative_names:
- - "mn2t"
- 203:
- name: "Ozone mass mixing ratio"
- alternative_names:
- - "o3"
- 204:
- name: "Precipitation analysis weights"
- alternative_names:
- - "paw"
- 205:
- name: "Runoff"
- alternative_names:
- - "ro"
- 206:
- name: "Total column ozone"
- alternative_names:
- - "tco3"
- 207:
- name: "10 metre wind speed"
- alternative_names:
- - "10si"
- 208:
- name: "Top net short-wave (solar) radiation, clear sky"
- alternative_names:
- - "tsrc"
- 209:
- name: "Ttru"
- alternative_names:
- - "ttrc"
- - "top net long-wave (thermal) radiation, clear sky"
- 210:
- name: "Surface net short-wave (solar) radiation, clear sky"
- alternative_names:
- - "ssrc"
- 211:
- name: "Surface net long-wave (thermal) radiation, clear sky"
- alternative_names:
- - "strc"
- 212:
- name: "Toa incident short-wave (solar) radiation"
- alternative_names:
- - "tisr"
- 213:
- name: "Vertically integrated moisture divergence"
- alternative_names:
- - "vimd"
- 214:
- name: "Diabatic heating by radiation"
- alternative_names:
- - "dhr"
- 215:
- name: "Diabatic heating by vertical diffusion"
- alternative_names:
- - "dhvd"
- 216:
- name: "Diabatic heating by cumulus convection"
- alternative_names:
- - "dhcc"
- 217:
- name: "Diabatic heating large-scale condensation"
- alternative_names:
- - "dhlc"
- 218:
- name: "Vertical diffusion of zonal wind"
- alternative_names:
- - "vdzw"
- 219:
- name: "Vertical diffusion of meridional wind"
- alternative_names:
- - "vdmw"
- 220:
- name: "East-west gravity wave drag tendency"
- alternative_names:
- - "ewgd"
- 221:
- name: "North-south gravity wave drag tendency"
- alternative_names:
- - "nsgd"
- 222:
- name: "Convective tendency of zonal wind"
- alternative_names:
- - "ctzw"
- 223:
- name: "Convective tendency of meridional wind"
- alternative_names:
- - "ctmw"
- 224:
- name: "Vertical diffusion of humidity"
- alternative_names:
- - "vdh"
- 225:
- name: "Humidity tendency by cumulus convection"
- alternative_names:
- - "htcc"
- 226:
- name: "Humidity tendency by large-scale condensation"
- alternative_names:
- - "htlc"
- 227:
- name: "Tendency due to removal of negative humidity"
- alternative_names:
- - "crnh"
- 228:
- name: "Total precipitation"
- alternative_names:
- - "tp"
- 229:
- name: "Instantaneous eastward turbulent surface stress"
- alternative_names:
- - "iews"
- 230:
- name: "Instantaneous northward turbulent surface stress"
- alternative_names:
- - "inss"
- 231:
- name: "Instantaneous surface sensible heat flux"
- alternative_names:
- - "ishf"
- 232:
- name: "Instantaneous moisture flux"
- alternative_names:
- - "ie"
- 233:
- name: "Apparent surface humidity"
- alternative_names:
- - "asq"
- 234:
- name: "Logarithm of surface roughness length for heat (climatological)"
- alternative_names:
- - "lsrh"
- 235:
- name: "Skin temperature"
- alternative_names:
- - "skt"
- 236:
- name: "Soil temperature level 4"
- alternative_names:
- - "stl4"
- 237:
- name: "Soil wetness level 4"
- alternative_names:
- - "swl4"
- 238:
- name: "Temperature of snow layer"
- alternative_names:
- - "tsn"
- 239:
- name: "Convective snowfall"
- alternative_names:
- - "csf"
- 240:
- name: "Large-scale snowfall"
- alternative_names:
- - "lsf"
- 241:
- name: "Accumulated cloud fraction tendency"
- alternative_names:
- - "acf"
- 242:
- name: "Accumulated liquid water tendency"
- alternative_names:
- - "alw"
- 243:
- name: "Forecast albedo"
- alternative_names:
- - "fal"
- 244:
- name: "Forecast surface roughness"
- alternative_names:
- - "fsr"
- 245:
- name: "Forecast logarithm of surface roughness for heat"
- alternative_names:
- - "flsr"
- 246:
- name: "Specific cloud liquid water content"
- alternative_names:
- - "clwc"
- 247:
- name: "Specific cloud ice water content"
- alternative_names:
- - "ciwc"
- 248:
- name: "Fraction of cloud cover"
- alternative_names:
- - "cc"
- 249:
- name: "Accumulated ice water tendency"
- alternative_names:
- - "aiw"
- 250:
- name: "Ice age"
- alternative_names:
- - "ice"
- 251:
- name: "Adiabatic tendency of temperature"
- alternative_names:
- - "atte"
- 252:
- name: "Adiabatic tendency of humidity"
- alternative_names:
- - "athe"
- 253:
- name: "Adiabatic tendency of zonal wind"
- alternative_names:
- - "atze"
- 254:
- name: "Adiabatic tendency of meridional wind"
- alternative_names:
- - "atmw"
- 255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_000255"
- 928:
- name: "Thicknes"
- alternative_names:
- - "thk"
- 956:
- name: "Thicknes anomaly"
- alternative_names:
- - "thka"
- 999:
- name: "Tropical cyclone"
- alternative_names:
- - "tc"
- 3003:
- name: "Pressure tendency"
- alternative_names:
- - "ptend"
- 3005:
- name: "Icao standard atmosphere reference height"
- alternative_names:
- - "icaht"
- 3008:
- name: "Geometrical height"
- alternative_names:
- - "h"
- 3009:
- name: "Standard deviation of height"
- alternative_names:
- - "hstdv"
- 3012:
- name: "Virtual potential temperature"
- alternative_names:
- - "vptmp"
- 3014:
- name: "Pseudo-adiabatic potential temperature"
- alternative_names:
- - "papt"
- 3015:
- name: "Maximum temperature"
- alternative_names:
- - "tmax"
- 3016:
- name: "Minimum temperature"
- alternative_names:
- - "tmin"
- 3017:
- name: "Dew point temperature"
- alternative_names:
- - "dpt"
- 3018:
- name: "Dew point depression (or deficit)"
- alternative_names:
- - "depr"
- 3019:
- name: "Lapse rate"
- alternative_names:
- - "lapr"
- 3020:
- name: "Visibility"
- alternative_names:
- - "vis"
- 3021:
- name: "Radar spectra (1)"
- alternative_names:
- - "rdsp1"
- 3022:
- name: "Radar spectra (2)"
- alternative_names:
- - "rdsp2"
- 3023:
- name: "Radar spectra (3)"
- alternative_names:
- - "rdsp3"
- 3024:
- name: "Parcel lifted index (to 500 hpa)"
- alternative_names:
- - "pli"
- 3025:
- name: "Temperature anomaly"
- alternative_names:
- - "ta"
- 3026:
- name: "Pressure anomaly"
- alternative_names:
- - "presa"
- 3027:
- name: "Geopotential height anomaly"
- alternative_names:
- - "gpa"
- 3028:
- name: "Wave spectra (1)"
- alternative_names:
- - "wvsp1"
- 3029:
- name: "Wave spectra (2)"
- alternative_names:
- - "wvsp2"
- 3030:
- name: "Wave spectra (3)"
- alternative_names:
- - "wvsp3"
- 3031:
- name: "Wind direction"
- alternative_names:
- - "wdir"
- 3037:
- name: "Montgomery stream function"
- alternative_names:
- - "mntsf"
- 3038:
- name: "Sigma coordinate vertical velocity"
- alternative_names:
- - "sgcvv"
- 3041:
- name: "Absolute vorticity"
- alternative_names:
- - "absv"
- 3042:
- name: "Absolute divergence"
- alternative_names:
- - "absd"
- 3045:
- name: "Vertical u-component shear"
- alternative_names:
- - "vucsh"
- 3046:
- name: "Vertical v-component shear"
- alternative_names:
- - "vvcsh"
- 3047:
- name: "Direction of current"
- alternative_names:
- - "dirc"
- 3048:
- name: "Speed of current"
- alternative_names:
- - "spc"
- 3049:
- name: "U-component of current"
- alternative_names:
- - "ucurr"
- 3050:
- name: "V-component of current"
- alternative_names:
- - "vcurr"
- 3053:
- name: "Humidity mixing ratio"
- alternative_names:
- - "mixr"
- 3054:
- name: "Precipitable water"
- alternative_names:
- - "pwat"
- 3055:
- name: "Vapour pressure"
- alternative_names:
- - "vp"
- 3056:
- name: "Saturation deficit"
- alternative_names:
- - "satd"
- 3059:
- name: "Precipitation rate"
- alternative_names:
- - "prate"
- 3060:
- name: "Thunderstorm probability"
- alternative_names:
- - "tstm"
- 3062:
- name: "Large-scale precipitation"
- alternative_names:
- - "lsp"
- 3063:
- name: "Convective precipitation (water)"
- alternative_names:
- - "acpcp"
- 3064:
- name: "Snow fall rate water equivalent"
- alternative_names:
- - "srweq"
- 3066:
- name: "Snow depth"
- alternative_names:
- - "sde"
- 3067:
- name: "Mixed layer depth"
- alternative_names:
- - "mld"
- 3068:
- name: "Transient thermocline depth"
- alternative_names:
- - "tthdp"
- 3069:
- name: "Main thermocline depth"
- alternative_names:
- - "mthd"
- 3070:
- name: "Main thermocline anomaly"
- alternative_names:
- - "mtha"
- 3072:
- name: "Convective cloud cover"
- alternative_names:
- - "ccc"
- 3073:
- name: "Low cloud cover"
- alternative_names:
- - "lcc"
- 3074:
- name: "Medium cloud cover"
- alternative_names:
- - "mcc"
- 3075:
- name: "High cloud cover"
- alternative_names:
- - "hcc"
- 3077:
- name: "Best lifted index (to 500 hpa)"
- alternative_names:
- - "bli"
- 3079:
- name: "Large scale snow"
- alternative_names:
- - "lssf"
- 3080:
- name: "Water temperature"
- alternative_names:
- - "wtmp"
- 3082:
- name: "Deviation of sea-level from mean"
- alternative_names:
- - "dslm"
- 3086:
- name: "Soil moisture content"
- alternative_names:
- - "ssw"
- 3088:
- name: "Salinity"
- alternative_names:
- - "s"
- 3089:
- name: "Density"
- alternative_names:
- - "den"
- 3091:
- name: "Ice cover (1=ice, 0=no ice)"
- alternative_names:
- - "icec"
- 3092:
- name: "Ice thickness"
- alternative_names:
- - "icetk"
- 3093:
- name: "Direction of ice drift"
- alternative_names:
- - "diced"
- 3094:
- name: "Speed of ice drift"
- alternative_names:
- - "siced"
- 3095:
- name: "U-component of ice drift"
- alternative_names:
- - "uice"
- 3096:
- name: "V-component of ice drift"
- alternative_names:
- - "vice"
- 3097:
- name: "Ice growth rate"
- alternative_names:
- - "iceg"
- 3098:
- name: "Ice divergence"
- alternative_names:
- - "iced"
- 3099:
- name: "Snowmelt"
- alternative_names:
- - "snom"
- 3100:
- name: "Signific.height,combined wind waves+swell"
- alternative_names:
- - "swh"
- 3101:
- name: "Mean direction of wind waves"
- alternative_names:
- - "mdww"
- 3102:
- name: "Significant height of wind waves"
- alternative_names:
- - "shww"
- 3103:
- name: "Mean period of wind waves"
- alternative_names:
- - "mpww"
- 3104:
- name: "Direction of swell waves"
- alternative_names:
- - "swdir"
- 3105:
- name: "Significant height of swell waves"
- alternative_names:
- - "swell"
- 3106:
- name: "Mean period of swell waves"
- alternative_names:
- - "swper"
- 3107:
- name: "Primary wave direction"
- alternative_names:
- - "mdps"
- 3108:
- name: "Primary wave mean period"
- alternative_names:
- - "mpps"
- 3109:
- name: "Secondary wave direction"
- alternative_names:
- - "dirsw"
- 3110:
- name: "Secondary wave mean period"
- alternative_names:
- - "swp"
- 3111:
- name: "Net short-wave radiation flux (surface)"
- alternative_names:
- - "nswrs"
- 3112:
- name: "Net long-wave radiation flux (surface)"
- alternative_names:
- - "nlwrs"
- 3113:
- name: "Net short-wave radiation flux(atmosph.top)"
- alternative_names:
- - "nswrt"
- 3114:
- name: "Net long-wave radiation flux(atmosph.top)"
- alternative_names:
- - "nlwrt"
- 3115:
- name: "Long wave radiation flux"
- alternative_names:
- - "lwavr"
- 3116:
- name: "Short wave radiation flux"
- alternative_names:
- - "swavr"
- 3117:
- name: "Global radiation flux"
- alternative_names:
- - "grad"
- 3119:
- name: "Radiance (with respect to wave number)"
- alternative_names:
- - "lwrad"
- 3120:
- name: "Radiance (with respect to wave length)"
- alternative_names:
- - "swrad"
- 3121:
- name: "Latent heat flux"
- alternative_names:
- - "lhf"
- 3122:
- name: "Sensible heat flux"
- alternative_names:
- - "shf"
- 3123:
- name: "Boundary layer dissipation"
- alternative_names:
- - "bld"
- 3124:
- name: "Momentum flux, u-component"
- alternative_names:
- - "uflx"
- 3125:
- name: "Momentum flux, v-component"
- alternative_names:
- - "vflx"
- 3126:
- name: "Wind mixing energy"
- alternative_names:
- - "wmixe"
- 3127:
- name: "Image data"
- alternative_names:
- - "imgd"
- 129001:
- name: "Stream function gradient"
- alternative_names:
- - "strfgrd"
- 129002:
- name: "Velocity potential gradient"
- alternative_names:
- - "vpotgrd"
- 129003:
- name: "Potential temperature gradient"
- alternative_names:
- - "ptgrd"
- 129004:
- name: "Equivalent potential temperature gradient"
- alternative_names:
- - "eqptgrd"
- 129005:
- name: "Saturated equivalent potential temperature gradient"
- alternative_names:
- - "septgrd"
- 129011:
- name: "U component of divergent wind gradient"
- alternative_names:
- - "udvwgrd"
- 129012:
- name: "V component of divergent wind gradient"
- alternative_names:
- - "vdvwgrd"
- 129013:
- name: "U component of rotational wind gradient"
- alternative_names:
- - "urtwgrd"
- 129014:
- name: "V component of rotational wind gradient"
- alternative_names:
- - "vrtwgrd"
- 129021:
- name: "Unbalanced component of temperature gradient"
- alternative_names:
- - "uctpgrd"
- 129022:
- name: "Unbalanced component of logarithm of surface pressure gradient"
- alternative_names:
- - "uclngrd"
- 129023:
- name: "Unbalanced component of divergence gradient"
- alternative_names:
- - "ucdvgrd"
- 129024:
- name: "Reserved for future unbalanced components"
- alternative_names:
- - "_param_129024"
- 129025:
- name: "Reserved for future unbalanced components"
- alternative_names:
- - "_param_129025"
- 129026:
- name: "Lake cover gradient"
- alternative_names:
- - "clgrd"
- 129027:
- name: "Low vegetation cover gradient"
- alternative_names:
- - "cvlgrd"
- 129028:
- name: "High vegetation cover gradient"
- alternative_names:
- - "cvhgrd"
- 129029:
- name: "Type of low vegetation gradient"
- alternative_names:
- - "tvlgrd"
- 129030:
- name: "Type of high vegetation gradient"
- alternative_names:
- - "tvhgrd"
- 129031:
- name: "Sea-ice cover gradient"
- alternative_names:
- - "sicgrd"
- 129032:
- name: "Snow albedo gradient"
- alternative_names:
- - "asngrd"
- 129033:
- name: "Snow density gradient"
- alternative_names:
- - "rsngrd"
- 129034:
- name: "Sea surface temperature gradient"
- alternative_names:
- - "sstkgrd"
- 129035:
- name: "Ice surface temperature layer 1 gradient"
- alternative_names:
- - "istl1grd"
- 129036:
- name: "Ice surface temperature layer 2 gradient"
- alternative_names:
- - "istl2grd"
- 129037:
- name: "Ice surface temperature layer 3 gradient"
- alternative_names:
- - "istl3grd"
- 129038:
- name: "Ice surface temperature layer 4 gradient"
- alternative_names:
- - "istl4grd"
- 129039:
- name: "Volumetric soil water layer 1 gradient"
- alternative_names:
- - "swvl1grd"
- 129040:
- name: "Volumetric soil water layer 2 gradient"
- alternative_names:
- - "swvl2grd"
- 129041:
- name: "Volumetric soil water layer 3 gradient"
- alternative_names:
- - "swvl3grd"
- 129042:
- name: "Volumetric soil water layer 4 gradient"
- alternative_names:
- - "swvl4grd"
- 129043:
- name: "Soil type gradient"
- alternative_names:
- - "sltgrd"
- 129044:
- name: "Snow evaporation gradient"
- alternative_names:
- - "esgrd"
- 129045:
- name: "Snowmelt gradient"
- alternative_names:
- - "smltgrd"
- 129046:
- name: "Solar duration gradient"
- alternative_names:
- - "sdurgrd"
- 129047:
- name: "Direct solar radiation gradient"
- alternative_names:
- - "dsrpgrd"
- 129048:
- name: "Magnitude of turbulent surface stress gradient"
- alternative_names:
- - "magssgrd"
- 129049:
- name: "10 metre wind gust gradient"
- alternative_names:
- - "10fggrd"
- 129050:
- name: "Large-scale precipitation fraction gradient"
- alternative_names:
- - "lspfgrd"
- 129051:
- name: "Maximum 2 metre temperature gradient"
- alternative_names:
- - "mx2t24grd"
- 129052:
- name: "Minimum 2 metre temperature gradient"
- alternative_names:
- - "mn2t24grd"
- 129053:
- name: "Montgomery potential gradient"
- alternative_names:
- - "montgrd"
- 129054:
- name: "Pressure gradient"
- alternative_names:
- - "presgrd"
- 129055:
- name: "Mean 2 metre temperature in the last 24 hours gradient"
- alternative_names:
- - "mean2t24grd"
- 129056:
- name: "Mean 2 metre dewpoint temperature in the last 24 hours gradient"
- alternative_names:
- - "mn2d24grd"
- 129057:
- name: "Downward uv radiation at the surface gradient"
- alternative_names:
- - "uvbgrd"
- 129058:
- name: "Photosynthetically active radiation at the surface gradient"
- alternative_names:
- - "pargrd"
- 129059:
- name: "Convective available potential energy gradient"
- alternative_names:
- - "capegrd"
- 129060:
- name: "Potential vorticity gradient"
- alternative_names:
- - "pvgrd"
- 129061:
- name: "Total precipitation from observations gradient"
- alternative_names:
- - "tpogrd"
- 129062:
- name: "Observation count gradient"
- alternative_names:
- - "obctgrd"
- 129063:
- name: "Start time for skin temperature difference"
- alternative_names:
- - "_param_129063"
- 129064:
- name: "Finish time for skin temperature difference"
- alternative_names:
- - "_param_129064"
- 129065:
- name: "Skin temperature difference"
- alternative_names:
- - "_param_129065"
- 129066:
- name: "Leaf area index, low vegetation"
- alternative_names:
- - "_param_129066"
- 129067:
- name: "Leaf area index, high vegetation"
- alternative_names:
- - "_param_129067"
- 129068:
- name: "Minimum stomatal resistance, low vegetation"
- alternative_names:
- - "_param_129068"
- 129069:
- name: "Minimum stomatal resistance, high vegetation"
- alternative_names:
- - "_param_129069"
- 129070:
- name: "Biome cover, low vegetation"
- alternative_names:
- - "_param_129070"
- 129071:
- name: "Biome cover, high vegetation"
- alternative_names:
- - "_param_129071"
- 129078:
- name: "Total column liquid water"
- alternative_names:
- - "_param_129078"
- 129079:
- name: "Total column ice water"
- alternative_names:
- - "_param_129079"
- 129080:
- name: "Experimental product"
- alternative_names:
- - "_param_129080"
- 129081:
- name: "Experimental product"
- alternative_names:
- - "_param_129081"
- 129082:
- name: "Experimental product"
- alternative_names:
- - "_param_129082"
- 129083:
- name: "Experimental product"
- alternative_names:
- - "_param_129083"
- 129084:
- name: "Experimental product"
- alternative_names:
- - "_param_129084"
- 129085:
- name: "Experimental product"
- alternative_names:
- - "_param_129085"
- 129086:
- name: "Experimental product"
- alternative_names:
- - "_param_129086"
- 129087:
- name: "Experimental product"
- alternative_names:
- - "_param_129087"
- 129088:
- name: "Experimental product"
- alternative_names:
- - "_param_129088"
- 129089:
- name: "Experimental product"
- alternative_names:
- - "_param_129089"
- 129090:
- name: "Experimental product"
- alternative_names:
- - "_param_129090"
- 129091:
- name: "Experimental product"
- alternative_names:
- - "_param_129091"
- 129092:
- name: "Experimental product"
- alternative_names:
- - "_param_129092"
- 129093:
- name: "Experimental product"
- alternative_names:
- - "_param_129093"
- 129094:
- name: "Experimental product"
- alternative_names:
- - "_param_129094"
- 129095:
- name: "Experimental product"
- alternative_names:
- - "_param_129095"
- 129096:
- name: "Experimental product"
- alternative_names:
- - "_param_129096"
- 129097:
- name: "Experimental product"
- alternative_names:
- - "_param_129097"
- 129098:
- name: "Experimental product"
- alternative_names:
- - "_param_129098"
- 129099:
- name: "Experimental product"
- alternative_names:
- - "_param_129099"
- 129100:
- name: "Experimental product"
- alternative_names:
- - "_param_129100"
- 129101:
- name: "Experimental product"
- alternative_names:
- - "_param_129101"
- 129102:
- name: "Experimental product"
- alternative_names:
- - "_param_129102"
- 129103:
- name: "Experimental product"
- alternative_names:
- - "_param_129103"
- 129104:
- name: "Experimental product"
- alternative_names:
- - "_param_129104"
- 129105:
- name: "Experimental product"
- alternative_names:
- - "_param_129105"
- 129106:
- name: "Experimental product"
- alternative_names:
- - "_param_129106"
- 129107:
- name: "Experimental product"
- alternative_names:
- - "_param_129107"
- 129108:
- name: "Experimental product"
- alternative_names:
- - "_param_129108"
- 129109:
- name: "Experimental product"
- alternative_names:
- - "_param_129109"
- 129110:
- name: "Experimental product"
- alternative_names:
- - "_param_129110"
- 129111:
- name: "Experimental product"
- alternative_names:
- - "_param_129111"
- 129112:
- name: "Experimental product"
- alternative_names:
- - "_param_129112"
- 129113:
- name: "Experimental product"
- alternative_names:
- - "_param_129113"
- 129114:
- name: "Experimental product"
- alternative_names:
- - "_param_129114"
- 129115:
- name: "Experimental product"
- alternative_names:
- - "_param_129115"
- 129116:
- name: "Experimental product"
- alternative_names:
- - "_param_129116"
- 129117:
- name: "Experimental product"
- alternative_names:
- - "_param_129117"
- 129118:
- name: "Experimental product"
- alternative_names:
- - "_param_129118"
- 129119:
- name: "Experimental product"
- alternative_names:
- - "_param_129119"
- 129120:
- name: "Experimental product"
- alternative_names:
- - "_param_129120"
- 129121:
- name: "Maximum temperature at 2 metres gradient"
- alternative_names:
- - "mx2t6grd"
- 129122:
- name: "Minimum temperature at 2 metres gradient"
- alternative_names:
- - "mn2t6grd"
- 129123:
- name: "10 metre wind gust in the last 6 hours gradient"
- alternative_names:
- - "10fg6grd"
- 129125:
- name: "Vertically integrated total energy"
- alternative_names:
- - "_param_129125"
- 129126:
- name: "Generic parameter for sensitive area prediction"
- alternative_names:
- - "_param_129126"
- 129127:
- name: "Atmospheric tide gradient"
- alternative_names:
- - "atgrd"
- 129128:
- name: "Budget values gradient"
- alternative_names:
- - "bvgrd"
- 129129:
- name: "Geopotential gradient"
- alternative_names:
- - "zgrd"
- 129130:
- name: "Temperature gradient"
- alternative_names:
- - "tgrd"
- 129131:
- name: "U component of wind gradient"
- alternative_names:
- - "ugrd"
- 129132:
- name: "V component of wind gradient"
- alternative_names:
- - "vgrd"
- 129133:
- name: "Specific humidity gradient"
- alternative_names:
- - "qgrd"
- 129134:
- name: "Surface pressure gradient"
- alternative_names:
- - "spgrd"
- 129135:
- name: "Vertical velocity (pressure) gradient"
- alternative_names:
- - "wgrd"
- 129136:
- name: "Total column water gradient"
- alternative_names:
- - "tcwgrd"
- 129137:
- name: "Total column water vapour gradient"
- alternative_names:
- - "tcwvgrd"
- 129138:
- name: "Vorticity (relative) gradient"
- alternative_names:
- - "vogrd"
- 129139:
- name: "Soil temperature level 1 gradient"
- alternative_names:
- - "stl1grd"
- 129140:
- name: "Soil wetness level 1 gradient"
- alternative_names:
- - "swl1grd"
- 129141:
- name: "Snow depth gradient"
- alternative_names:
- - "sdgrd"
- 129142:
- name: "Stratiform precipitation (large-scale precipitation) gradient"
- alternative_names:
- - "lspgrd"
- 129143:
- name: "Convective precipitation gradient"
- alternative_names:
- - "cpgrd"
- 129144:
- name: "Snowfall (convective + stratiform) gradient"
- alternative_names:
- - "sfgrd"
- 129145:
- name: "Boundary layer dissipation gradient"
- alternative_names:
- - "bldgrd"
- 129146:
- name: "Surface sensible heat flux gradient"
- alternative_names:
- - "sshfgrd"
- 129147:
- name: "Surface latent heat flux gradient"
- alternative_names:
- - "slhfgrd"
- 129148:
- name: "Charnock gradient"
- alternative_names:
- - "chnkgrd"
- 129149:
- name: "Surface net radiation gradient"
- alternative_names:
- - "snrgrd"
- 129150:
- name: "Top net radiation gradient"
- alternative_names:
- - "tnrgrd"
- 129151:
- name: "Mean sea level pressure gradient"
- alternative_names:
- - "mslgrd"
- 129152:
- name: "Logarithm of surface pressure gradient"
- alternative_names:
- - "lnspgrd"
- 129153:
- name: "Short-wave heating rate gradient"
- alternative_names:
- - "swhrgrd"
- 129154:
- name: "Long-wave heating rate gradient"
- alternative_names:
- - "lwhrgrd"
- 129155:
- name: "Divergence gradient"
- alternative_names:
- - "dgrd"
- 129156:
- name: "Height gradient"
- alternative_names:
- - "ghgrd"
- 129157:
- name: "Relative humidity gradient"
- alternative_names:
- - "rgrd"
- 129158:
- name: "Tendency of surface pressure gradient"
- alternative_names:
- - "tspgrd"
- 129159:
- name: "Boundary layer height gradient"
- alternative_names:
- - "blhgrd"
- 129160:
- name: "Standard deviation of orography gradient"
- alternative_names:
- - "sdorgrd"
- 129161:
- name: "Anisotropy of sub-gridscale orography gradient"
- alternative_names:
- - "isorgrd"
- 129162:
- name: "Angle of sub-gridscale orography gradient"
- alternative_names:
- - "anorgrd"
- 129163:
- name: "Slope of sub-gridscale orography gradient"
- alternative_names:
- - "slorgrd"
- 129164:
- name: "Total cloud cover gradient"
- alternative_names:
- - "tccgrd"
- 129165:
- name: "10 metre u wind component gradient"
- alternative_names:
- - "10ugrd"
- 129166:
- name: "10 metre v wind component gradient"
- alternative_names:
- - "10vgrd"
- 129167:
- name: "2 metre temperature gradient"
- alternative_names:
- - "2tgrd"
- 129168:
- name: "2 metre dewpoint temperature gradient"
- alternative_names:
- - "2dgrd"
- 129169:
- name: "Surface solar radiation downwards gradient"
- alternative_names:
- - "ssrdgrd"
- 129170:
- name: "Soil temperature level 2 gradient"
- alternative_names:
- - "stl2grd"
- 129171:
- name: "Soil wetness level 2 gradient"
- alternative_names:
- - "swl2grd"
- 129172:
- name: "Land-sea mask gradient"
- alternative_names:
- - "lsmgrd"
- 129173:
- name: "Surface roughness gradient"
- alternative_names:
- - "srgrd"
- 129174:
- name: "Albedo gradient"
- alternative_names:
- - "algrd"
- 129175:
- name: "Surface thermal radiation downwards gradient"
- alternative_names:
- - "strdgrd"
- 129176:
- name: "Surface net solar radiation gradient"
- alternative_names:
- - "ssrgrd"
- 129177:
- name: "Surface net thermal radiation gradient"
- alternative_names:
- - "strgrd"
- 129178:
- name: "Top net solar radiation gradient"
- alternative_names:
- - "tsrgrd"
- 129179:
- name: "Top net thermal radiation gradient"
- alternative_names:
- - "ttrgrd"
- 129180:
- name: "East-west surface stress gradient"
- alternative_names:
- - "ewssgrd"
- 129181:
- name: "North-south surface stress gradient"
- alternative_names:
- - "nsssgrd"
- 129182:
- name: "Evaporation gradient"
- alternative_names:
- - "egrd"
- 129183:
- name: "Soil temperature level 3 gradient"
- alternative_names:
- - "stl3grd"
- 129184:
- name: "Soil wetness level 3 gradient"
- alternative_names:
- - "swl3grd"
- 129185:
- name: "Convective cloud cover gradient"
- alternative_names:
- - "cccgrd"
- 129186:
- name: "Low cloud cover gradient"
- alternative_names:
- - "lccgrd"
- 129187:
- name: "Medium cloud cover gradient"
- alternative_names:
- - "mccgrd"
- 129188:
- name: "High cloud cover gradient"
- alternative_names:
- - "hccgrd"
- 129189:
- name: "Sunshine duration gradient"
- alternative_names:
- - "sundgrd"
- 129190:
- name: "East-west component of sub-gridscale orographic variance gradient"
- alternative_names:
- - "ewovgrd"
- 129191:
- name: "North-south component of sub-gridscale orographic variance gradient"
- alternative_names:
- - "nsovgrd"
- 129192:
- name: "North-west/south-east component of sub-gridscale orographic variance gradient"
- alternative_names:
- - "nwovgrd"
- 129193:
- name: "North-east/south-west component of sub-gridscale orographic variance gradient"
- alternative_names:
- - "neovgrd"
- 129194:
- name: "Brightness temperature gradient"
- alternative_names:
- - "btmpgrd"
- 129195:
- name: "Longitudinal component of gravity wave stress gradient"
- alternative_names:
- - "lgwsgrd"
- 129196:
- name: "Meridional component of gravity wave stress gradient"
- alternative_names:
- - "mgwsgrd"
- 129197:
- name: "Gravity wave dissipation gradient"
- alternative_names:
- - "gwdgrd"
- 129198:
- name: "Skin reservoir content gradient"
- alternative_names:
- - "srcgrd"
- 129199:
- name: "Vegetation fraction gradient"
- alternative_names:
- - "veggrd"
- 129200:
- name: "Variance of sub-gridscale orography gradient"
- alternative_names:
- - "vsogrd"
- 129201:
- name: "Maximum temperature at 2 metres since previous post-processing gradient"
- alternative_names:
- - "mx2tgrd"
- 129202:
- name: "Minimum temperature at 2 metres since previous post-processing gradient"
- alternative_names:
- - "mn2tgrd"
- 129203:
- name: "Ozone mass mixing ratio gradient"
- alternative_names:
- - "o3grd"
- 129204:
- name: "Precipitation analysis weights gradient"
- alternative_names:
- - "pawgrd"
- 129205:
- name: "Runoff gradient"
- alternative_names:
- - "rogrd"
- 129206:
- name: "Total column ozone gradient"
- alternative_names:
- - "tco3grd"
- 129207:
- name: "10 metre wind speed gradient"
- alternative_names:
- - "10sigrd"
- 129208:
- name: "Top net solar radiation, clear sky gradient"
- alternative_names:
- - "tsrcgrd"
- 129209:
- name: "Top net thermal radiation, clear sky gradient"
- alternative_names:
- - "ttrcgrd"
- 129210:
- name: "Surface net solar radiation, clear sky gradient"
- alternative_names:
- - "ssrcgrd"
- 129211:
- name: "Surface net thermal radiation, clear sky gradient"
- alternative_names:
- - "strcgrd"
- 129212:
- name: "Toa incident solar radiation gradient"
- alternative_names:
- - "tisrgrd"
- 129214:
- name: "Diabatic heating by radiation gradient"
- alternative_names:
- - "dhrgrd"
- 129215:
- name: "Diabatic heating by vertical diffusion gradient"
- alternative_names:
- - "dhvdgrd"
- 129216:
- name: "Diabatic heating by cumulus convection gradient"
- alternative_names:
- - "dhccgrd"
- 129217:
- name: "Diabatic heating large-scale condensation gradient"
- alternative_names:
- - "dhlcgrd"
- 129218:
- name: "Vertical diffusion of zonal wind gradient"
- alternative_names:
- - "vdzwgrd"
- 129219:
- name: "Vertical diffusion of meridional wind gradient"
- alternative_names:
- - "vdmwgrd"
- 129220:
- name: "East-west gravity wave drag tendency gradient"
- alternative_names:
- - "ewgdgrd"
- 129221:
- name: "North-south gravity wave drag tendency gradient"
- alternative_names:
- - "nsgdgrd"
- 129222:
- name: "Convective tendency of zonal wind gradient"
- alternative_names:
- - "ctzwgrd"
- 129223:
- name: "Convective tendency of meridional wind gradient"
- alternative_names:
- - "ctmwgrd"
- 129224:
- name: "Vertical diffusion of humidity gradient"
- alternative_names:
- - "vdhgrd"
- 129225:
- name: "Humidity tendency by cumulus convection gradient"
- alternative_names:
- - "htccgrd"
- 129226:
- name: "Humidity tendency by large-scale condensation gradient"
- alternative_names:
- - "htlcgrd"
- 129227:
- name: "Change from removal of negative humidity gradient"
- alternative_names:
- - "crnhgrd"
- 129228:
- name: "Total precipitation gradient"
- alternative_names:
- - "tpgrd"
- 129229:
- name: "Instantaneous x surface stress gradient"
- alternative_names:
- - "iewsgrd"
- 129230:
- name: "Instantaneous y surface stress gradient"
- alternative_names:
- - "inssgrd"
- 129231:
- name: "Instantaneous surface heat flux gradient"
- alternative_names:
- - "ishfgrd"
- 129232:
- name: "Instantaneous moisture flux gradient"
- alternative_names:
- - "iegrd"
- 129233:
- name: "Apparent surface humidity gradient"
- alternative_names:
- - "asqgrd"
- 129234:
- name: "Logarithm of surface roughness length for heat gradient"
- alternative_names:
- - "lsrhgrd"
- 129235:
- name: "Skin temperature gradient"
- alternative_names:
- - "sktgrd"
- 129236:
- name: "Soil temperature level 4 gradient"
- alternative_names:
- - "stl4grd"
- 129237:
- name: "Soil wetness level 4 gradient"
- alternative_names:
- - "swl4grd"
- 129238:
- name: "Temperature of snow layer gradient"
- alternative_names:
- - "tsngrd"
- 129239:
- name: "Convective snowfall gradient"
- alternative_names:
- - "csfgrd"
- 129240:
- name: "Large scale snowfall gradient"
- alternative_names:
- - "lsfgrd"
- 129241:
- name: "Accumulated cloud fraction tendency gradient"
- alternative_names:
- - "acfgrd"
- 129242:
- name: "Accumulated liquid water tendency gradient"
- alternative_names:
- - "alwgrd"
- 129243:
- name: "Forecast albedo gradient"
- alternative_names:
- - "falgrd"
- 129244:
- name: "Forecast surface roughness gradient"
- alternative_names:
- - "fsrgrd"
- 129245:
- name: "Forecast logarithm of surface roughness for heat gradient"
- alternative_names:
- - "flsrgrd"
- 129246:
- name: "Specific cloud liquid water content gradient"
- alternative_names:
- - "clwcgrd"
- 129247:
- name: "Specific cloud ice water content gradient"
- alternative_names:
- - "ciwcgrd"
- 129248:
- name: "Cloud cover gradient"
- alternative_names:
- - "ccgrd"
- 129249:
- name: "Accumulated ice water tendency gradient"
- alternative_names:
- - "aiwgrd"
- 129250:
- name: "Ice age gradient"
- alternative_names:
- - "icegrd"
- 129251:
- name: "Adiabatic tendency of temperature gradient"
- alternative_names:
- - "attegrd"
- 129252:
- name: "Adiabatic tendency of humidity gradient"
- alternative_names:
- - "athegrd"
- 129253:
- name: "Adiabatic tendency of zonal wind gradient"
- alternative_names:
- - "atzegrd"
- 129254:
- name: "Adiabatic tendency of meridional wind gradient"
- alternative_names:
- - "atmwgrd"
- 129255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_129255"
- 130208:
- name: "Top solar radiation upward"
- alternative_names:
- - "tsru"
- 130209:
- name: "Top thermal radiation upward"
- alternative_names:
- - "ttru"
- 130210:
- name: "Top solar radiation upward, clear sky"
- alternative_names:
- - "tsuc"
- 130211:
- name: "Top thermal radiation upward, clear sky"
- alternative_names:
- - "ttuc"
- 130212:
- name: "Cloud liquid water"
- alternative_names:
- - "clw"
- 130213:
- name: "Cloud fraction"
- alternative_names:
- - "cf"
- 130214:
- name: "Diabatic heating by radiation"
- alternative_names:
- - "dhr"
- 130215:
- name: "Diabatic heating by vertical diffusion"
- alternative_names:
- - "dhvd"
- 130216:
- name: "Diabatic heating by cumulus convection"
- alternative_names:
- - "dhcc"
- 130217:
- name: "Diabatic heating by large-scale condensation"
- alternative_names:
- - "dhlc"
- 130218:
- name: "Vertical diffusion of zonal wind"
- alternative_names:
- - "vdzw"
- 130219:
- name: "Vertical diffusion of meridional wind"
- alternative_names:
- - "vdmw"
- 130220:
- name: "East-west gravity wave drag"
- alternative_names:
- - "ewgd"
- 130221:
- name: "North-south gravity wave drag"
- alternative_names:
- - "nsgd"
- 130224:
- name: "Vertical diffusion of humidity"
- alternative_names:
- - "vdh"
- 130225:
- name: "Humidity tendency by cumulus convection"
- alternative_names:
- - "htcc"
- 130226:
- name: "Humidity tendency by large-scale condensation"
- alternative_names:
- - "htlc"
- 130228:
- name: "Adiabatic tendency of temperature"
- alternative_names:
- - "att"
- 130229:
- name: "Adiabatic tendency of humidity"
- alternative_names:
- - "ath"
- 130230:
- name: "Adiabatic tendency of zonal wind"
- alternative_names:
- - "atzw"
- 130231:
- name: "Adiabatic tendency of meridional wind"
- alternative_names:
- - "atmwax"
- 130232:
- name: "Mean vertical velocity"
- alternative_names:
- - "mvv"
- 131001:
- name: "2m temperature anomaly of at least +2k"
- alternative_names:
- - "2tag2"
- 131002:
- name: "2m temperature anomaly of at least +1k"
- alternative_names:
- - "2tag1"
- 131003:
- name: "2m temperature anomaly of at least 0k"
- alternative_names:
- - "2tag0"
- 131004:
- name: "2m temperature anomaly of at most -1k"
- alternative_names:
- - "2talm1"
- 131005:
- name: "2m temperature anomaly of at most -2k"
- alternative_names:
- - "2talm2"
- 131006:
- name: "Total precipitation anomaly of at least 20 mm"
- alternative_names:
- - "tpag20"
- 131007:
- name: "Total precipitation anomaly of at least 10 mm"
- alternative_names:
- - "tpag10"
- 131008:
- name: "Total precipitation anomaly of at least 0 mm"
- alternative_names:
- - "tpag0"
- 131009:
- name: "Surface temperature anomaly of at least 0k"
- alternative_names:
- - "stag0"
- 131010:
- name: "Mean sea level pressure anomaly of at least 0 pa"
- alternative_names:
- - "mslag0"
- 131015:
- name: "Height of 0 degree isotherm probability"
- alternative_names:
- - "h0dip"
- 131016:
- name: "Height of snowfall limit probability"
- alternative_names:
- - "hslp"
- 131017:
- name: "Showalter index probability"
- alternative_names:
- - "saip"
- 131018:
- name: "Whiting index probability"
- alternative_names:
- - "whip"
- 131020:
- name: "Temperature anomaly of at most -2 k"
- alternative_names:
- - "talm2"
- - "temperature anomaly less than -2 k"
- 131021:
- name: "Temperature anomaly of at least 2 k"
- alternative_names:
- - "tag2"
- - "temperature anomaly of at least +2 k"
- 131022:
- name: "Temperature anomaly of at most -8 k"
- alternative_names:
- - "talm8"
- - "temperature anomaly less than -8 k"
- 131023:
- name: "Temperature anomaly of at most -4 k"
- alternative_names:
- - "talm4"
- - "temperature anomaly less than -4 k"
- 131024:
- name: "Temperature anomaly of at least 4 k"
- alternative_names:
- - "tag4"
- - "temperature anomaly greater than +4 k"
- - "temperature anomaly greater than 4 k"
- 131025:
- name: "Temperature anomaly of at least 8 k"
- alternative_names:
- - "tag8"
- - "temperature anomaly greater than +8 k"
- - "temperature anomaly greater than 8 k"
- 131049:
- name: "10 metre wind gust probability"
- alternative_names:
- - "10gp"
- 131059:
- name: "Convective available potential energy probability"
- alternative_names:
- - "capep"
- 131060:
- name: "Total precipitation of at least 1 mm"
- alternative_names:
- - "tpg1"
- 131061:
- name: "Total precipitation of at least 5 mm"
- alternative_names:
- - "tpg5"
- 131062:
- name: "Total precipitation of at least 10 mm"
- alternative_names:
- - "tpg10"
- 131063:
- name: "Total precipitation of at least 20 mm"
- alternative_names:
- - "tpg20"
- 131064:
- name: "Total precipitation less than 0.1 mm"
- alternative_names:
- - "tpl01"
- 131065:
- name: "Total precipitation rate less than 1 mm/day"
- alternative_names:
- - "tprl1"
- 131066:
- name: "Total precipitation rate of at least 3 mm/day"
- alternative_names:
- - "tprg3"
- 131067:
- name: "Total precipitation rate of at least 5 mm/day"
- alternative_names:
- - "tprg5"
- 131068:
- name: "10 metre wind speed of at least 10 m/s"
- alternative_names:
- - "10spg10"
- 131069:
- name: "10 metre wind speed of at least 15 m/s"
- alternative_names:
- - "10spg15"
- 131070:
- name: "10 metre wind gust of at least 15 m/s"
- alternative_names:
- - "10fgg15"
- 131071:
- name: "10 metre wind gust of at least 20 m/s"
- alternative_names:
- - "10fgg20"
- 131072:
- name: "10 metre wind gust of at least 25 m/s"
- alternative_names:
- - "10fgg25"
- 131073:
- name: "2 metre temperature less than 273.15 k"
- alternative_names:
- - "2tl273"
- 131074:
- name: "Significant wave height of at least 2 m"
- alternative_names:
- - "swhg2"
- 131075:
- name: "Significant wave height of at least 4 m"
- alternative_names:
- - "swhg4"
- 131076:
- name: "Significant wave height of at least 6 m"
- alternative_names:
- - "swhg6"
- 131077:
- name: "Significant wave height of at least 8 m"
- alternative_names:
- - "swhg8"
- 131078:
- name: "Mean wave period of at least 8 s"
- alternative_names:
- - "mwpg8"
- 131079:
- name: "Mean wave period of at least 10 s"
- alternative_names:
- - "mwpg10"
- 131080:
- name: "Mean wave period of at least 12 s"
- alternative_names:
- - "mwpg12"
- 131081:
- name: "Mean wave period of at least 15 s"
- alternative_names:
- - "mwpg15"
- 131082:
- name: "Total precipitation of at least 40 mm"
- alternative_names:
- - "tpg40"
- 131083:
- name: "Total precipitation of at least 60 mm"
- alternative_names:
- - "tpg60"
- 131084:
- name: "Total precipitation of at least 80 mm"
- alternative_names:
- - "tpg80"
- 131085:
- name: "Total precipitation of at least 100 mm"
- alternative_names:
- - "tpg100"
- 131086:
- name: "Total precipitation of at least 150 mm"
- alternative_names:
- - "tpg150"
- 131087:
- name: "Total precipitation of at least 200 mm"
- alternative_names:
- - "tpg200"
- 131088:
- name: "Total precipitation of at least 300 mm"
- alternative_names:
- - "tpg300"
- 131089:
- name: "Probability of a tropical storm"
- alternative_names:
- - "pts"
- 131090:
- name: "Probability of a hurricane"
- alternative_names:
- - "ph"
- 131091:
- name: "Probability of a tropical depression"
- alternative_names:
- - "ptd"
- 131092:
- name: "Climatological probability of a tropical storm"
- alternative_names:
- - "cpts"
- 131093:
- name: "Climatological probability of a hurricane"
- alternative_names:
- - "cph"
- 131094:
- name: "Climatological probability of a tropical depression"
- alternative_names:
- - "cptd"
- 131095:
- name: "Probability anomaly of a tropical storm"
- alternative_names:
- - "pats"
- 131096:
- name: "Probability anomaly of a hurricane"
- alternative_names:
- - "pah"
- 131097:
- name: "Probability anomaly of a tropical depression"
- alternative_names:
- - "patd"
- 131098:
- name: "Total precipitation of at least 25 mm"
- alternative_names:
- - "tpg25"
- 131099:
- name: "Total precipitation of at least 50 mm"
- alternative_names:
- - "tpg50"
- 131100:
- name: "10 metre wind gust of at least 10 m/s"
- alternative_names:
- - "10fgg10"
- 131129:
- name: "Geopotential probability"
- alternative_names:
- - "zp"
- 131130:
- name: "Temperature anomaly probability"
- alternative_names:
- - "tap"
- 131139:
- name: "Soil temperature level 1 probability"
- alternative_names:
- - "stl1p"
- 131144:
- name: "Snowfall (convective + stratiform) probability"
- alternative_names:
- - "sfp"
- 131151:
- name: "Mean sea level pressure probability"
- alternative_names:
- - "mslpp"
- 131164:
- name: "Total cloud cover probability"
- alternative_names:
- - "tccp"
- 131165:
- name: "10 metre speed probability"
- alternative_names:
- - "10sp"
- 131167:
- name: "2 metre temperature probability"
- alternative_names:
- - "2tp"
- 131201:
- name: "Maximum 2 metre temperature probability"
- alternative_names:
- - "mx2tp"
- 131202:
- name: "Minimum 2 metre temperature probability"
- alternative_names:
- - "mn2tp"
- 131228:
- name: "Total precipitation probability"
- alternative_names:
- - "tpp"
- 131229:
- name: "Significant wave height probability"
- alternative_names:
- - "swhp"
- 131232:
- name: "Mean wave period probability"
- alternative_names:
- - "mwpp"
- 131255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_131255"
- 132044:
- name: "Convective available potential energy shear index"
- alternative_names:
- - "capesi"
- 132045:
- name: "Water vapour flux index"
- alternative_names:
- - "wvfi"
- 132049:
- name: "10gi"
- alternative_names:
- - "10fgi"
- - "10 metre wind gust index"
- 132059:
- name: "Convective available potential energy index"
- alternative_names:
- - "capei"
- 132144:
- name: "Snowfall index"
- alternative_names:
- - "sfi"
- 132165:
- name: "10 metre speed index"
- alternative_names:
- - "10wsi"
- 132167:
- name: "2 metre temperature index"
- alternative_names:
- - "2ti"
- 132201:
- name: "Maximum temperature at 2 metres index"
- alternative_names:
- - "mx2ti"
- 132202:
- name: "Minimum temperature at 2 metres index"
- alternative_names:
- - "mn2ti"
- 132216:
- name: "Maximum of significant wave height index"
- alternative_names:
- - "maxswhi"
- 132228:
- name: "Total precipitation index"
- alternative_names:
- - "tpi"
- 133001:
- name: "2m temperature probability less than -10 c"
- alternative_names:
- - "2tplm10"
- 133002:
- name: "2m temperature probability less than -5 c"
- alternative_names:
- - "2tplm5"
- 133003:
- name: "2m temperature probability less than 0 c"
- alternative_names:
- - "2tpl0"
- 133004:
- name: "2m temperature probability less than 5 c"
- alternative_names:
- - "2tpl5"
- 133005:
- name: "2m temperature probability less than 10 c"
- alternative_names:
- - "2tpl10"
- 133006:
- name: "2m temperature probability greater than 25 c"
- alternative_names:
- - "2tpg25"
- 133007:
- name: "2m temperature probability greater than 30 c"
- alternative_names:
- - "2tpg30"
- 133008:
- name: "2m temperature probability greater than 35 c"
- alternative_names:
- - "2tpg35"
- 133009:
- name: "2m temperature probability greater than 40 c"
- alternative_names:
- - "2tpg40"
- 133010:
- name: "2m temperature probability greater than 45 c"
- alternative_names:
- - "2tpg45"
- 133011:
- name: "Minimum 2 metre temperature probability less than -10 c"
- alternative_names:
- - "mn2tplm10"
- 133012:
- name: "Minimum 2 metre temperature probability less than -5 c"
- alternative_names:
- - "mn2tplm5"
- 133013:
- name: "Minimum 2 metre temperature probability less than 0 c"
- alternative_names:
- - "mn2tpl0"
- 133014:
- name: "Minimum 2 metre temperature probability less than 5 c"
- alternative_names:
- - "mn2tpl5"
- 133015:
- name: "Minimum 2 metre temperature probability less than 10 c"
- alternative_names:
- - "mn2tpl10"
- 133016:
- name: "Maximum 2 metre temperature probability greater than 25 c"
- alternative_names:
- - "mx2tpg25"
- 133017:
- name: "Maximum 2 metre temperature probability greater than 30 c"
- alternative_names:
- - "mx2tpg30"
- 133018:
- name: "Maximum 2 metre temperature probability greater than 35 c"
- alternative_names:
- - "mx2tpg35"
- 133019:
- name: "Maximum 2 metre temperature probability greater than 40 c"
- alternative_names:
- - "mx2tpg40"
- 133020:
- name: "Maximum 2 metre temperature probability greater than 45 c"
- alternative_names:
- - "mx2tpg45"
- 133021:
- name: "10 metre wind speed probability of at least 10 m/s"
- alternative_names:
- - "10spg10"
- 133022:
- name: "10 metre wind speed probability of at least 15 m/s"
- alternative_names:
- - "10spg15"
- 133023:
- name: "10 metre wind speed probability of at least 20 m/s"
- alternative_names:
- - "10spg20"
- 133024:
- name: "10 metre wind speed probability of at least 35 m/s"
- alternative_names:
- - "10spg35"
- 133025:
- name: "10 metre wind speed probability of at least 50 m/s"
- alternative_names:
- - "10spg50"
- 133026:
- name: "10 metre wind gust probability of at least 20 m/s"
- alternative_names:
- - "10gpg20"
- 133027:
- name: "10 metre wind gust probability of at least 35 m/s"
- alternative_names:
- - "10gpg35"
- 133028:
- name: "10 metre wind gust probability of at least 50 m/s"
- alternative_names:
- - "10gpg50"
- 133029:
- name: "10 metre wind gust probability of at least 75 m/s"
- alternative_names:
- - "10gpg75"
- 133030:
- name: "10 metre wind gust probability of at least 100 m/s"
- alternative_names:
- - "10gpg100"
- 133031:
- name: "Total precipitation probability of at least 1 mm"
- alternative_names:
- - "tppg1"
- 133032:
- name: "Total precipitation probability of at least 5 mm"
- alternative_names:
- - "tppg5"
- 133033:
- name: "Total precipitation probability of at least 10 mm"
- alternative_names:
- - "tppg10"
- 133034:
- name: "Total precipitation probability of at least 20 mm"
- alternative_names:
- - "tppg20"
- 133035:
- name: "Total precipitation probability of at least 40 mm"
- alternative_names:
- - "tppg40"
- 133036:
- name: "Total precipitation probability of at least 60 mm"
- alternative_names:
- - "tppg60"
- 133037:
- name: "Total precipitation probability of at least 80 mm"
- alternative_names:
- - "tppg80"
- 133038:
- name: "Total precipitation probability of at least 100 mm"
- alternative_names:
- - "tppg100"
- 133039:
- name: "Total precipitation probability of at least 150 mm"
- alternative_names:
- - "tppg150"
- 133040:
- name: "Total precipitation probability of at least 200 mm"
- alternative_names:
- - "tppg200"
- 133041:
- name: "Total precipitation probability of at least 300 mm"
- alternative_names:
- - "tppg300"
- 133042:
- name: "Snowfall probability of at least 1 mm"
- alternative_names:
- - "sfpg1"
- 133043:
- name: "Snowfall probability of at least 5 mm"
- alternative_names:
- - "sfpg5"
- 133044:
- name: "Snowfall probability of at least 10 mm"
- alternative_names:
- - "sfpg10"
- 133045:
- name: "Snowfall probability of at least 20 mm"
- alternative_names:
- - "sfpg20"
- 133046:
- name: "Snowfall probability of at least 40 mm"
- alternative_names:
- - "sfpg40"
- 133047:
- name: "Snowfall probability of at least 60 mm"
- alternative_names:
- - "sfpg60"
- 133048:
- name: "Snowfall probability of at least 80 mm"
- alternative_names:
- - "sfpg80"
- 133049:
- name: "Snowfall probability of at least 100 mm"
- alternative_names:
- - "sfpg100"
- 133050:
- name: "Snowfall probability of at least 150 mm"
- alternative_names:
- - "sfpg150"
- 133051:
- name: "Snowfall probability of at least 200 mm"
- alternative_names:
- - "sfpg200"
- 133052:
- name: "Snowfall probability of at least 300 mm"
- alternative_names:
- - "sfpg300"
- 133053:
- name: "Total cloud cover probability greater than 10%"
- alternative_names:
- - "tccpg10"
- 133054:
- name: "Total cloud cover probability greater than 20%"
- alternative_names:
- - "tccpg20"
- 133055:
- name: "Total cloud cover probability greater than 30%"
- alternative_names:
- - "tccpg30"
- 133056:
- name: "Total cloud cover probability greater than 40%"
- alternative_names:
- - "tccpg40"
- 133057:
- name: "Total cloud cover probability greater than 50%"
- alternative_names:
- - "tccpg50"
- 133058:
- name: "Total cloud cover probability greater than 60%"
- alternative_names:
- - "tccpg60"
- 133059:
- name: "Total cloud cover probability greater than 70%"
- alternative_names:
- - "tccpg70"
- 133060:
- name: "Total cloud cover probability greater than 80%"
- alternative_names:
- - "tccpg80"
- 133061:
- name: "Total cloud cover probability greater than 90%"
- alternative_names:
- - "tccpg90"
- 133062:
- name: "Total cloud cover probability greater than 99%"
- alternative_names:
- - "tccpg99"
- 133063:
- name: "High cloud cover probability greater than 10%"
- alternative_names:
- - "hccpg10"
- 133064:
- name: "High cloud cover probability greater than 20%"
- alternative_names:
- - "hccpg20"
- 133065:
- name: "High cloud cover probability greater than 30%"
- alternative_names:
- - "hccpg30"
- 133066:
- name: "High cloud cover probability greater than 40%"
- alternative_names:
- - "hccpg40"
- 133067:
- name: "High cloud cover probability greater than 50%"
- alternative_names:
- - "hccpg50"
- 133068:
- name: "High cloud cover probability greater than 60%"
- alternative_names:
- - "hccpg60"
- 133069:
- name: "High cloud cover probability greater than 70%"
- alternative_names:
- - "hccpg70"
- 133070:
- name: "High cloud cover probability greater than 80%"
- alternative_names:
- - "hccpg80"
- 133071:
- name: "High cloud cover probability greater than 90%"
- alternative_names:
- - "hccpg90"
- 133072:
- name: "High cloud cover probability greater than 99%"
- alternative_names:
- - "hccpg99"
- 133073:
- name: "Medium cloud cover probability greater than 10%"
- alternative_names:
- - "mccpg10"
- 133074:
- name: "Medium cloud cover probability greater than 20%"
- alternative_names:
- - "mccpg20"
- 133075:
- name: "Medium cloud cover probability greater than 30%"
- alternative_names:
- - "mccpg30"
- 133076:
- name: "Medium cloud cover probability greater than 40%"
- alternative_names:
- - "mccpg40"
- 133077:
- name: "Medium cloud cover probability greater than 50%"
- alternative_names:
- - "mccpg50"
- 133078:
- name: "Medium cloud cover probability greater than 60%"
- alternative_names:
- - "mccpg60"
- 133079:
- name: "Medium cloud cover probability greater than 70%"
- alternative_names:
- - "mccpg70"
- 133080:
- name: "Medium cloud cover probability greater than 80%"
- alternative_names:
- - "mccpg80"
- 133081:
- name: "Medium cloud cover probability greater than 90%"
- alternative_names:
- - "mccpg90"
- 133082:
- name: "Medium cloud cover probability greater than 99%"
- alternative_names:
- - "mccpg99"
- 133083:
- name: "Low cloud cover probability greater than 10%"
- alternative_names:
- - "lccpg10"
- 133084:
- name: "Low cloud cover probability greater than 20%"
- alternative_names:
- - "lccpg20"
- 133085:
- name: "Low cloud cover probability greater than 30%"
- alternative_names:
- - "lccpg30"
- 133086:
- name: "Low cloud cover probability greater than 40%"
- alternative_names:
- - "lccpg40"
- 133087:
- name: "Low cloud cover probability greater than 50%"
- alternative_names:
- - "lccpg50"
- 133088:
- name: "Low cloud cover probability greater than 60%"
- alternative_names:
- - "lccpg60"
- 133089:
- name: "Low cloud cover probability greater than 70%"
- alternative_names:
- - "lccpg70"
- 133090:
- name: "Low cloud cover probability greater than 80%"
- alternative_names:
- - "lccpg80"
- 133091:
- name: "Low cloud cover probability greater than 90%"
- alternative_names:
- - "lccpg90"
- 133092:
- name: "Low cloud cover probability greater than 99%"
- alternative_names:
- - "lccpg99"
- 133093:
- name: "Probability of temperature standardized anomaly greater than 1 standard
- deviation"
- alternative_names:
- - "ptsa_gt_1stdev"
- 133094:
- name: "Probability of temperature standardized anomaly greater than 1.5 standard
- deviation"
- alternative_names:
- - "ptsa_gt_1p5stdev"
- 133095:
- name: "Probability of temperature standardized anomaly greater than 2 standard
- deviation"
- alternative_names:
- - "ptsa_gt_2stdev"
- 133096:
- name: "Probability of temperature standardized anomaly less than -1 standard deviation"
- alternative_names:
- - "ptsa_lt_1stdev"
- 133097:
- name: "Probability of temperature standardized anomaly less than -1.5 standard
- deviation"
- alternative_names:
- - "ptsa_lt_1p5stdev"
- 133098:
- name: "Probability of temperature standardized anomaly less than -2 standard deviation"
- alternative_names:
- - "ptsa_lt_2stdev"
- 140080:
- name: "Wave experimental parameter 1"
- alternative_names:
- - "wx1"
- 140081:
- name: "Wave experimental parameter 2"
- alternative_names:
- - "wx2"
- 140082:
- name: "Wave experimental parameter 3"
- alternative_names:
- - "wx3"
- 140083:
- name: "Wave experimental parameter 4"
- alternative_names:
- - "wx4"
- 140084:
- name: "Wave experimental parameter 5"
- alternative_names:
- - "wx5"
- 140098:
- name: "Wave induced mean sea level correction"
- alternative_names:
- - "weta"
- 140099:
- name: "Ratio of wave angular and frequency width"
- alternative_names:
- - "wraf"
- 140100:
- name: "Number of events in freak waves statistics"
- alternative_names:
- - "wnslc"
- 140101:
- name: "U-component of atmospheric surface momentum flux"
- alternative_names:
- - "utaua"
- 140102:
- name: "V-component of atmospheric surface momentum flux"
- alternative_names:
- - "vtaua"
- 140103:
- name: "U-component of surface momentum flux into ocean"
- alternative_names:
- - "utauo"
- 140104:
- name: "V-component of surface momentum flux into ocean"
- alternative_names:
- - "vtauo"
- 140105:
- name: "Wave turbulent energy flux into ocean"
- alternative_names:
- - "wphio"
- 140106:
- name: "Wave directional width of first swell partition"
- alternative_names:
- - "wdw1"
- 140107:
- name: "Wave frequency width of first swell partition"
- alternative_names:
- - "wfw1"
- 140108:
- name: "Wave directional width of second swell partition"
- alternative_names:
- - "wdw2"
- 140109:
- name: "Wave frequency width of second swell partition"
- alternative_names:
- - "wfw2"
- 140110:
- name: "Wave directional width of third swell partition"
- alternative_names:
- - "wdw3"
- 140111:
- name: "Wave frequency width of third swell partition"
- alternative_names:
- - "wfw3"
- 140112:
- name: "Wave energy flux magnitude"
- alternative_names:
- - "wefxm"
- 140113:
- name: "Wave energy flux mean direction"
- alternative_names:
- - "wefxd"
- 140114:
- name: "Significant wave height of all waves with periods within the inclusive
- range from 10 to 12 seconds"
- alternative_names:
- - "h1012"
- 140115:
- name: "Significant wave height of all waves with periods within the inclusive
- range from 12 to 14 seconds"
- alternative_names:
- - "h1214"
- 140116:
- name: "Significant wave height of all waves with periods within the inclusive
- range from 14 to 17 seconds"
- alternative_names:
- - "h1417"
- 140117:
- name: "Significant wave height of all waves with periods within the inclusive
- range from 17 to 21 seconds"
- alternative_names:
- - "h1721"
- 140118:
- name: "Significant wave height of all waves with periods within the inclusive
- range from 21 to 25 seconds"
- alternative_names:
- - "h2125"
- 140119:
- name: "Significant wave height of all waves with periods within the inclusive
- range from 25 to 30 seconds"
- alternative_names:
- - "h2530"
- 140120:
- name: "Significant wave height of all waves with period larger than 10s"
- alternative_names:
- - "sh10"
- 140121:
- name: "Significant wave height of first swell partition"
- alternative_names:
- - "swh1"
- 140122:
- name: "Mean wave direction of first swell partition"
- alternative_names:
- - "mwd1"
- 140123:
- name: "Mean wave period of first swell partition"
- alternative_names:
- - "mwp1"
- 140124:
- name: "Significant wave height of second swell partition"
- alternative_names:
- - "swh2"
- 140125:
- name: "Mean wave direction of second swell partition"
- alternative_names:
- - "mwd2"
- 140126:
- name: "Mean wave period of second swell partition"
- alternative_names:
- - "mwp2"
- 140127:
- name: "Significant wave height of third swell partition"
- alternative_names:
- - "swh3"
- 140128:
- name: "Mean wave direction of third swell partition"
- alternative_names:
- - "mwd3"
- 140129:
- name: "Mean wave period of third swell partition"
- alternative_names:
- - "mwp3"
- 140130:
- name: "Envelope-maximum individual wave height"
- alternative_names:
- - "envhmax"
- 140131:
- name: "Time domain maximum individual crest height"
- alternative_names:
- - "tdcmax"
- 140132:
- name: "Time domain maximum individual wave height"
- alternative_names:
- - "tdhmax"
- 140133:
- name: "Space time maximum individual crest height"
- alternative_names:
- - "stcmax"
- 140134:
- name: "Space time maximum individual wave height"
- alternative_names:
- - "sthmax"
- 140200:
- name: "Maximum of significant wave height"
- alternative_names:
- - "maxswh"
- 140207:
- name: "Wave spectral skewness"
- alternative_names:
- - "wss"
- 140208:
- name: "Free convective velocity over the oceans"
- alternative_names:
- - "wstar"
- 140209:
- name: "Air density over the oceans"
- alternative_names:
- - "rhoao"
- 140210:
- name: "Mean square wave strain in sea ice"
- alternative_names:
- - "mswsi"
- 140211:
- name: "Normalized energy flux into waves"
- alternative_names:
- - "phiaw"
- 140212:
- name: "Normalized energy flux into ocean"
- alternative_names:
- - "phioc"
- 140213:
- name: "Turbulent langmuir number"
- alternative_names:
- - "tla"
- 140214:
- name: "Normalized stress into ocean"
- alternative_names:
- - "tauoc"
- 140215:
- name: "U-component surface stokes drift"
- alternative_names:
- - "ust"
- 140216:
- name: "V-component surface stokes drift"
- alternative_names:
- - "vst"
- 140217:
- name: "Period corresponding to maximum individual wave height"
- alternative_names:
- - "tmax"
- 140218:
- name: "Envelop-maximum individual wave height"
- alternative_names:
- - "hmax"
- 140219:
- name: "Model bathymetry"
- alternative_names:
- - "wmb"
- 140220:
- name: "Mean wave period based on first moment"
- alternative_names:
- - "mp1"
- 140221:
- name: "Mean zero-crossing wave period"
- alternative_names:
- - "mp2"
- 140222:
- name: "Wave spectral directional width"
- alternative_names:
- - "wdw"
- 140223:
- name: "Mean wave period based on first moment for wind waves"
- alternative_names:
- - "p1ww"
- 140224:
- name: "Mean wave period based on second moment for wind waves"
- alternative_names:
- - "p2ww"
- 140225:
- name: "Wave spectral directional width for wind waves"
- alternative_names:
- - "dwww"
- 140226:
- name: "Mean wave period based on first moment for swell"
- alternative_names:
- - "p1ps"
- 140227:
- name: "Mean wave period based on second moment for swell"
- alternative_names:
- - "p2ps"
- 140228:
- name: "Wave spectral directional width for swell"
- alternative_names:
- - "dwps"
- 140229:
- name: "Significant height of combined wind waves and swell"
- alternative_names:
- - "swh"
- 140230:
- name: "Mean wave direction"
- alternative_names:
- - "mwd"
- 140231:
- name: "Peak wave period"
- alternative_names:
- - "pp1d"
- 140232:
- name: "Mean wave period"
- alternative_names:
- - "mwp"
- 140233:
- name: "Coefficient of drag with waves"
- alternative_names:
- - "cdww"
- 140234:
- name: "Significant height of wind waves"
- alternative_names:
- - "shww"
- 140235:
- name: "Mean direction of wind waves"
- alternative_names:
- - "mdww"
- 140236:
- name: "Mean period of wind waves"
- alternative_names:
- - "mpww"
- 140237:
- name: "Significant height of total swell"
- alternative_names:
- - "shts"
- 140238:
- name: "Mean direction of total swell"
- alternative_names:
- - "mdts"
- 140239:
- name: "Mean period of total swell"
- alternative_names:
- - "mpts"
- 140240:
- name: "Standard deviation wave height"
- alternative_names:
- - "sdhs"
- 140241:
- name: "Mean of 10 metre wind speed"
- alternative_names:
- - "mu10"
- 140242:
- name: "Mean wind direction"
- alternative_names:
- - "mdwi"
- 140243:
- name: "Standard deviation of 10 metre wind speed"
- alternative_names:
- - "sdu"
- 140244:
- name: "Mean square slope of waves"
- alternative_names:
- - "msqs"
- 140245:
- name: "10 metre wind speed"
- alternative_names:
- - "wind"
- 140246:
- name: "Altimeter wave height"
- alternative_names:
- - "awh"
- 140247:
- name: "Altimeter corrected wave height"
- alternative_names:
- - "acwh"
- 140248:
- name: "Altimeter range relative correction"
- alternative_names:
- - "arrc"
- 140249:
- name: "10 metre wind direction"
- alternative_names:
- - "dwi"
- 140250:
- name: "2d wave spectra (multiple)"
- alternative_names:
- - "2dsp"
- 140251:
- name: "2d wave spectra (single)"
- alternative_names:
- - "2dfd"
- 140252:
- name: "Wave spectral kurtosis"
- alternative_names:
- - "wsk"
- 140253:
- name: "Benjamin-feir index"
- alternative_names:
- - "bfi"
- 140254:
- name: "Wave spectral peakedness"
- alternative_names:
- - "wsp"
- 140255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_140255"
- 141221:
- name: "Time-mean mean zero-crossing wave period"
- alternative_names:
- - "avg_mp2"
- 141229:
- name: "Time-mean significant height of combined wind waves and swell"
- alternative_names:
- - "avg_swh"
- 141231:
- name: "Time-mean peak wave period"
- alternative_names:
- - "avg_pp1d"
- 141232:
- name: "Time-mean mean wave period"
- alternative_names:
- - "avg_mwp"
- 150129:
- name: "Ocean potential temperature"
- alternative_names:
- - "ocpt"
- 150130:
- name: "Ocean salinity"
- alternative_names:
- - "ocs"
- 150131:
- name: "Ocean potential density"
- alternative_names:
- - "ocpd"
- 150133:
- name: "Ocean u wind component"
- alternative_names:
- - "_param_150133"
- 150134:
- name: "Ocean v wind component"
- alternative_names:
- - "_param_150134"
- 150135:
- name: "Ocean w wind component"
- alternative_names:
- - "ocw"
- 150137:
- name: "Richardson number"
- alternative_names:
- - "rn"
- 150139:
- name: "U*v product"
- alternative_names:
- - "uv"
- 150140:
- name: "U*t product"
- alternative_names:
- - "ut"
- 150141:
- name: "V*t product"
- alternative_names:
- - "vt"
- 150142:
- name: "U*u product"
- alternative_names:
- - "uu"
- 150143:
- name: "V*v product"
- alternative_names:
- - "vv"
- 150144:
- name: "Uv - u~v~"
- alternative_names:
- - "_param_150144"
- 150145:
- name: "Ut - u~t~"
- alternative_names:
- - "_param_150145"
- 150146:
- name: "Vt - v~t~"
- alternative_names:
- - "_param_150146"
- 150147:
- name: "Uu - u~u~"
- alternative_names:
- - "_param_150147"
- 150148:
- name: "Vv - v~v~"
- alternative_names:
- - "_param_150148"
- 150152:
- name: "Sea level"
- alternative_names:
- - "sl"
- 150153:
- name: "Barotropic stream function"
- alternative_names:
- - "_param_150153"
- 150154:
- name: "Mixed layer depth"
- alternative_names:
- - "mld"
- 150155:
- name: "Depth"
- alternative_names:
- - "_param_150155"
- 150168:
- name: "U stress"
- alternative_names:
- - "_param_150168"
- 150169:
- name: "V stress"
- alternative_names:
- - "_param_150169"
- 150170:
- name: "Turbulent kinetic energy input"
- alternative_names:
- - "_param_150170"
- 150171:
- name: "Net surface heat flux"
- alternative_names:
- - "nsf"
- 150172:
- name: "Surface solar radiation"
- alternative_names:
- - "_param_150172"
- 150173:
- name: "P-e"
- alternative_names:
- - "_param_150173"
- 150180:
- name: "Diagnosed sea surface temperature error"
- alternative_names:
- - "_param_150180"
- 150181:
- name: "Heat flux correction"
- alternative_names:
- - "_param_150181"
- 150182:
- name: "Observed sea surface temperature"
- alternative_names:
- - "_param_150182"
- 150183:
- name: "Observed heat flux"
- alternative_names:
- - "_param_150183"
- 150255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_150255"
- 151126:
- name: "Mean sea water potential temperature in the upper 300 m"
- alternative_names:
- - "mswpt300m"
- 151127:
- name: "Mean sea water temperature in the upper 300 m"
- alternative_names:
- - "mswt300m"
- 151128:
- name: "In situ temperature"
- alternative_names:
- - "_param_151128"
- 151129:
- name: "Sea water potential temperature"
- alternative_names:
- - "thetao"
- 151130:
- name: "Sea water practical salinity"
- alternative_names:
- - "so"
- 151131:
- name: "Eastward surface sea water velocity"
- alternative_names:
- - "ocu"
- 151132:
- name: "Northward surface sea water velocity"
- alternative_names:
- - "ocv"
- 151133:
- name: "Upward sea water velocity"
- alternative_names:
- - "wo"
- 151134:
- name: "Modulus of strain rate tensor"
- alternative_names:
- - "mst"
- 151135:
- name: "Vertical viscosity"
- alternative_names:
- - "vvs"
- 151136:
- name: "Vertical diffusivity"
- alternative_names:
- - "vdf"
- 151137:
- name: "Bottom level depth"
- alternative_names:
- - "dep"
- 151138:
- name: "Sea water sigma theta"
- alternative_names:
- - "sigmat"
- 151139:
- name: "Richardson number"
- alternative_names:
- - "rn"
- 151140:
- name: "Uv product"
- alternative_names:
- - "uv"
- 151141:
- name: "Ut product"
- alternative_names:
- - "ut"
- 151142:
- name: "Vt product"
- alternative_names:
- - "vt"
- 151143:
- name: "Uu product"
- alternative_names:
- - "uu"
- 151144:
- name: "Vv product"
- alternative_names:
- - "vv"
- 151145:
- name: "Sea surface height"
- alternative_names:
- - "zos"
- 151146:
- name: "Sea level previous timestep"
- alternative_names:
- - "sl_1"
- 151147:
- name: "Ocean barotropic stream function"
- alternative_names:
- - "stfbarot"
- 151148:
- name: "Mixed layer depth"
- alternative_names:
- - "mld"
- 151149:
- name: "Bottom pressure (equivalent height)"
- alternative_names:
- - "btp"
- 151150:
- name: "Steric height"
- alternative_names:
- - "sh"
- 151151:
- name: "Curl of wind stress"
- alternative_names:
- - "crl"
- 151152:
- name: "Divergence of wind stress"
- alternative_names:
- - "_param_151152"
- 151153:
- name: "Surface downward eastward stress"
- alternative_names:
- - "taueo"
- 151154:
- name: "Surface downward northward stress"
- alternative_names:
- - "tauno"
- 151155:
- name: "Turbulent kinetic energy input"
- alternative_names:
- - "tki"
- 151156:
- name: "Net surface heat flux"
- alternative_names:
- - "nsf"
- 151157:
- name: "Absorbed solar radiation"
- alternative_names:
- - "asr"
- 151158:
- name: "Precipitation - evaporation"
- alternative_names:
- - "pme"
- 151159:
- name: "Specified sea surface temperature"
- alternative_names:
- - "sst"
- 151160:
- name: "Specified surface heat flux"
- alternative_names:
- - "shf"
- 151161:
- name: "Diagnosed sea surface temperature error"
- alternative_names:
- - "dte"
- 151162:
- name: "Heat flux correction"
- alternative_names:
- - "hfc"
- 151163:
- name: "Depth of 20c isotherm"
- alternative_names:
- - "t20d"
- 151164:
- name: "Average potential temperature in the upper 300m"
- alternative_names:
- - "tav300"
- 151165:
- name: "Vertically integrated zonal velocity (previous time step)"
- alternative_names:
- - "uba1"
- 151166:
- name: "Vertically integrated meridional velocity (previous time step)"
- alternative_names:
- - "vba1"
- 151167:
- name: "Vertically integrated zonal volume transport"
- alternative_names:
- - "ztr"
- 151168:
- name: "Vertically integrated meridional volume transport"
- alternative_names:
- - "mtr"
- 151169:
- name: "Vertically integrated zonal heat transport"
- alternative_names:
- - "zht"
- 151170:
- name: "Vertically integrated meridional heat transport"
- alternative_names:
- - "mht"
- 151171:
- name: "U velocity maximum"
- alternative_names:
- - "umax"
- 151172:
- name: "Depth of the velocity maximum"
- alternative_names:
- - "dumax"
- 151173:
- name: "Salinity maximum"
- alternative_names:
- - "smax"
- 151174:
- name: "Depth of salinity maximum"
- alternative_names:
- - "dsmax"
- 151175:
- name: "Average sea water practical salinity in the upper 300m"
- alternative_names:
- - "sav300"
- 151176:
- name: "Layer thickness at scalar points"
- alternative_names:
- - "ldp"
- 151177:
- name: "Layer thickness at vector points"
- alternative_names:
- - "ldu"
- 151178:
- name: "Potential temperature increment"
- alternative_names:
- - "pti"
- 151179:
- name: "Potential temperature analysis error"
- alternative_names:
- - "ptae"
- 151180:
- name: "Background potential temperature"
- alternative_names:
- - "bpt"
- 151181:
- name: "Analysed potential temperature"
- alternative_names:
- - "apt"
- 151182:
- name: "Potential temperature background error"
- alternative_names:
- - "ptbe"
- 151183:
- name: "Analysed salinity"
- alternative_names:
- - "as"
- 151184:
- name: "Salinity increment"
- alternative_names:
- - "sali"
- 151185:
- name: "Estimated bias in temperature"
- alternative_names:
- - "ebt"
- 151186:
- name: "Estimated bias in salinity"
- alternative_names:
- - "ebs"
- 151187:
- name: "Zonal velocity increment (from balance operator)"
- alternative_names:
- - "uvi"
- 151188:
- name: "Meridional velocity increment (from balance operator)"
- alternative_names:
- - "vvi"
- 151189:
- name: "Sea surface temperature in degc"
- alternative_names:
- - "tos"
- 151190:
- name: "Salinity increment (from salinity data)"
- alternative_names:
- - "subi"
- 151191:
- name: "Salinity analysis error"
- alternative_names:
- - "sale"
- 151192:
- name: "Background salinity"
- alternative_names:
- - "bsal"
- 151193:
- name: "Reserved"
- alternative_names:
- - "_param_151193"
- 151194:
- name: "Salinity background error"
- alternative_names:
- - "salbe"
- 151195:
- name: "Depth of 14c isotherm"
- alternative_names:
- - "t14d"
- 151196:
- name: "Depth of 17c isotherm"
- alternative_names:
- - "t17d"
- 151197:
- name: "Depth of 26c isotherm"
- alternative_names:
- - "t26d"
- 151198:
- name: "Depth of 28c isotherm"
- alternative_names:
- - "t28d"
- 151199:
- name: "Estimated temperature bias from assimilation"
- alternative_names:
- - "ebta"
- 151200:
- name: "Estimated salinity bias from assimilation"
- alternative_names:
- - "ebsa"
- 151201:
- name: "Temperature increment from relaxation term"
- alternative_names:
- - "lti"
- 151202:
- name: "Salinity increment from relaxation term"
- alternative_names:
- - "lsi"
- 151203:
- name: "Bias in the zonal pressure gradient (applied)"
- alternative_names:
- - "bzpga"
- 151204:
- name: "Bias in the meridional pressure gradient (applied)"
- alternative_names:
- - "bmpga"
- 151205:
- name: "Estimated temperature bias from relaxation"
- alternative_names:
- - "ebtl"
- 151206:
- name: "Estimated salinity bias from relaxation"
- alternative_names:
- - "ebsl"
- 151207:
- name: "First guess bias in temperature"
- alternative_names:
- - "fgbt"
- 151208:
- name: "First guess bias in salinity"
- alternative_names:
- - "fgbs"
- 151209:
- name: "Applied bias in pressure"
- alternative_names:
- - "bpa"
- 151210:
- name: "Fg bias in pressure"
- alternative_names:
- - "fgbp"
- 151211:
- name: "Bias in temperature(applied)"
- alternative_names:
- - "pta"
- 151212:
- name: "Bias in salinity (applied)"
- alternative_names:
- - "psa"
- 151213:
- name: "Surface downward heat flux in sea water"
- alternative_names:
- - "hfds"
- 151214:
- name: "Ocean heat content 0-300m"
- alternative_names:
- - "hc300m"
- 151215:
- name: "Ocean heat content 0-700m"
- alternative_names:
- - "hc700m"
- 151216:
- name: "Ocean heat content 0-bottom"
- alternative_names:
- - "hcbtm"
- 151217:
- name: "Water flux correction"
- alternative_names:
- - "wfcorr"
- 151218:
- name: "Surface upward water flux"
- alternative_names:
- - "swfup"
- 151219:
- name: "Sea surface practical salinity"
- alternative_names:
- - "sos"
- 151220:
- name: "Surface downward northward stress"
- alternative_names:
- - "sdns"
- 151221:
- name: "Surface downward eastward stress"
- alternative_names:
- - "sdes"
- 151222:
- name: "Surface downward y stress"
- alternative_names:
- - "tauvo"
- 151223:
- name: "Surface downward x stress"
- alternative_names:
- - "tauuo"
- 151224:
- name: "Ocean mixed layer thickness defined by vertical tracer diffusivity threshold"
- alternative_names:
- - "mlotdev"
- 151225:
- name: "Ocean mixed layer thickness defined by sigma theta 0.01 kg/m3"
- alternative_names:
- - "mlotst010"
- 151226:
- name: "Ocean mixed layer thickness defined by sigma theta 0.03 kg/m3"
- alternative_names:
- - "mlotst030"
- 151227:
- name: "Ocean mixed layer thickness defined by sigma theta 0.125 kg/m3"
- alternative_names:
- - "mlotst125"
- 151228:
- name: "Ocean mixed layer thickness defined by temperature 0.2c"
- alternative_names:
- - "mlott02"
- 151229:
- name: "Ocean mixed layer thickness defined by temperature 0.5c"
- alternative_names:
- - "mlott05"
- 151230:
- name: "Virtual salt flux into sea water"
- alternative_names:
- - "vsf"
- 151231:
- name: "Virtual salt flux correction"
- alternative_names:
- - "vsfcorr"
- 151232:
- name: "Integrated salinity 0-700m"
- alternative_names:
- - "sc700m"
- 151233:
- name: "Integrated salinity 0-bottom"
- alternative_names:
- - "sabtm"
- 151234:
- name: "Sea water mass per unit area expressed as thickness"
- alternative_names:
- - "swmth"
- 151235:
- name: "Integrated salinity 0-300m"
- alternative_names:
- - "sc300m"
- 151236:
- name: "Surface net downward shortwave flux into ocean"
- alternative_names:
- - "rss"
- 151240:
- name: "Heat flux correction"
- alternative_names:
- - "hfcorr"
- 151250:
- name: "Sea water y velocity"
- alternative_names:
- - "voy"
- 151251:
- name: "Sea water x velocity"
- alternative_names:
- - "uox"
- 151252:
- name: "Northward sea water velocity"
- alternative_names:
- - "swnv"
- 151253:
- name: "Eastward sea water velocity"
- alternative_names:
- - "swev"
- 151254:
- name: "Upward sea water velocity"
- alternative_names:
- - "swzv"
- 151255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_151255"
- 160049:
- name: "10 metre wind gust during averaging time"
- alternative_names:
- - "10fgrea"
- 160135:
- name: "Vertical velocity (pressure)"
- alternative_names:
- - "wrea"
- 160137:
- name: "Precipitable water content"
- alternative_names:
- - "pwcrea"
- 160140:
- name: "Soil wetness level 1"
- alternative_names:
- - "swl1rea"
- 160141:
- name: "Snow depth"
- alternative_names:
- - "sdrea"
- 160142:
- name: "Large-scale precipitation"
- alternative_names:
- - "lsprea"
- 160143:
- name: "Convective precipitation"
- alternative_names:
- - "cprea"
- 160144:
- name: "Snowfall"
- alternative_names:
- - "sfrea"
- 160156:
- name: "Height"
- alternative_names:
- - "ghrea"
- 160157:
- name: "Relative humidity"
- alternative_names:
- - "rrea"
- 160171:
- name: "Soil wetness level 2"
- alternative_names:
- - "swl2rea"
- 160180:
- name: "East-west surface stress"
- alternative_names:
- - "ewssrea"
- 160181:
- name: "North-south surface stress"
- alternative_names:
- - "nsssrea"
- 160182:
- name: "Evaporation"
- alternative_names:
- - "erea"
- 160184:
- name: "Soil wetness level 3"
- alternative_names:
- - "swl3rea"
- 160198:
- name: "Skin reservoir content"
- alternative_names:
- - "srcrea"
- 160199:
- name: "Percentage of vegetation"
- alternative_names:
- - "vegrea"
- 160201:
- name: "Maximum temperature at 2 metres during averaging time"
- alternative_names:
- - "mx2trea"
- 160202:
- name: "Minimum temperature at 2 metres during averaging time"
- alternative_names:
- - "mn2trea"
- 160205:
- name: "Runoff"
- alternative_names:
- - "rorea"
- 160206:
- name: "Standard deviation of geopotential"
- alternative_names:
- - "zzrea"
- 160207:
- name: "Covariance of temperature and geopotential"
- alternative_names:
- - "tzrea"
- 160208:
- name: "Standard deviation of temperature"
- alternative_names:
- - "ttrea"
- 160209:
- name: "Covariance of specific humidity and geopotential"
- alternative_names:
- - "qzrea"
- 160210:
- name: "Covariance of specific humidity and temperature"
- alternative_names:
- - "qtrea"
- 160211:
- name: "Standard deviation of specific humidity"
- alternative_names:
- - "qqrea"
- 160212:
- name: "Covariance of u component and geopotential"
- alternative_names:
- - "uzrea"
- 160213:
- name: "Covariance of u component and temperature"
- alternative_names:
- - "utrea"
- 160214:
- name: "Covariance of u component and specific humidity"
- alternative_names:
- - "uqrea"
- 160215:
- name: "Standard deviation of u velocity"
- alternative_names:
- - "uurea"
- 160216:
- name: "Covariance of v component and geopotential"
- alternative_names:
- - "vzrea"
- 160217:
- name: "Covariance of v component and temperature"
- alternative_names:
- - "vtrea"
- 160218:
- name: "Covariance of v component and specific humidity"
- alternative_names:
- - "vqrea"
- 160219:
- name: "Covariance of v component and u component"
- alternative_names:
- - "vurea"
- 160220:
- name: "Standard deviation of v component"
- alternative_names:
- - "vvrea"
- 160221:
- name: "Covariance of w component and geopotential"
- alternative_names:
- - "wzrea"
- 160222:
- name: "Covariance of w component and temperature"
- alternative_names:
- - "wtrea"
- 160223:
- name: "Covariance of w component and specific humidity"
- alternative_names:
- - "wqrea"
- 160224:
- name: "Covariance of w component and u component"
- alternative_names:
- - "wurea"
- 160225:
- name: "Covariance of w component and v component"
- alternative_names:
- - "wvrea"
- 160226:
- name: "Standard deviation of vertical velocity"
- alternative_names:
- - "wwrea"
- 160231:
- name: "Instantaneous surface heat flux"
- alternative_names:
- - "ishfrea"
- 160239:
- name: "Convective snowfall"
- alternative_names:
- - "csfrea"
- 160240:
- name: "Large scale snowfall"
- alternative_names:
- - "lsfrea"
- 160241:
- name: "Cloud liquid water content"
- alternative_names:
- - "clwcerrea"
- 160242:
- name: "Cloud cover"
- alternative_names:
- - "ccrea"
- 160243:
- name: "Forecast albedo"
- alternative_names:
- - "falrea"
- 160246:
- name: "10 metre wind speed"
- alternative_names:
- - "10wsrea"
- 160247:
- name: "Momentum flux"
- alternative_names:
- - "moflrea"
- 160249:
- name: "Gravity wave dissipation flux"
- alternative_names:
- - "_param_160249"
- 160254:
- name: "Heaviside beta function"
- alternative_names:
- - "hsdrea"
- 162045:
- name: "Water vapour flux"
- alternative_names:
- - "wvf"
- 162051:
- name: "Surface geopotential"
- alternative_names:
- - "_param_162051"
- 162053:
- name: "Vertical integral of mass of atmosphere"
- alternative_names:
- - "vima"
- 162054:
- name: "Vertical integral of temperature"
- alternative_names:
- - "vit"
- 162055:
- name: "Vertical integral of water vapour"
- alternative_names:
- - "viwv"
- 162056:
- name: "Vertical integral of cloud liquid water"
- alternative_names:
- - "vilw"
- 162057:
- name: "Vertical integral of cloud frozen water"
- alternative_names:
- - "viiw"
- 162058:
- name: "Vertical integral of ozone"
- alternative_names:
- - "vioz"
- 162059:
- name: "Total column vertically-integrated kinetic energy"
- alternative_names:
- - "vike"
- 162060:
- name: "Total column vertically-integrated enthalpy"
- alternative_names:
- - "vithe"
- 162061:
- name: "Total column vertically-integrated potential + internal energy"
- alternative_names:
- - "vipie"
- 162062:
- name: "Vertical integral of potential+internal+latent energy"
- alternative_names:
- - "vipile"
- 162063:
- name: "Total column vertically-integrated total energy"
- alternative_names:
- - "vitoe"
- 162064:
- name: "Vertical integral of energy conversion"
- alternative_names:
- - "viec"
- 162065:
- name: "Vertical integral of eastward mass flux"
- alternative_names:
- - "vimae"
- 162066:
- name: "Vertical integral of northward mass flux"
- alternative_names:
- - "viman"
- 162067:
- name: "Vertical integral of eastward kinetic energy flux"
- alternative_names:
- - "vikee"
- 162068:
- name: "Vertical integral of northward kinetic energy flux"
- alternative_names:
- - "viken"
- 162069:
- name: "Vertical integral of eastward heat flux"
- alternative_names:
- - "vithee"
- 162070:
- name: "Vertical integral of northward heat flux"
- alternative_names:
- - "vithen"
- 162071:
- name: "Vertical integral of eastward water vapour flux"
- alternative_names:
- - "viwve"
- 162072:
- name: "Vertical integral of northward water vapour flux"
- alternative_names:
- - "viwvn"
- 162073:
- name: "Vertical integral of eastward geopotential flux"
- alternative_names:
- - "vige"
- 162074:
- name: "Vertical integral of northward geopotential flux"
- alternative_names:
- - "vign"
- 162075:
- name: "Vertical integral of eastward total energy flux"
- alternative_names:
- - "vitoee"
- 162076:
- name: "Vertical integral of northward total energy flux"
- alternative_names:
- - "vitoen"
- 162077:
- name: "Vertical integral of eastward ozone flux"
- alternative_names:
- - "vioze"
- 162078:
- name: "Vertical integral of northward ozone flux"
- alternative_names:
- - "viozn"
- 162079:
- name: "Vertical integral of divergence of cloud liquid water flux"
- alternative_names:
- - "vilwd"
- 162080:
- name: "Vertical integral of divergence of cloud frozen water flux"
- alternative_names:
- - "viiwd"
- 162081:
- name: "Vertical integral of divergence of mass flux"
- alternative_names:
- - "vimad"
- 162082:
- name: "Vertical integral of divergence of kinetic energy flux"
- alternative_names:
- - "viked"
- 162083:
- name: "Vertical integral of divergence of thermal energy flux"
- alternative_names:
- - "vithed"
- 162084:
- name: "Vertically integrated moisture divergence flux"
- alternative_names:
- - "viwvd"
- 162085:
- name: "Vertical integral of divergence of geopotential flux"
- alternative_names:
- - "vigd"
- 162086:
- name: "Vertical integral of divergence of total energy flux"
- alternative_names:
- - "vitoed"
- 162087:
- name: "Vertical integral of divergence of ozone flux"
- alternative_names:
- - "viozd"
- 162088:
- name: "Vertical integral of eastward cloud liquid water flux"
- alternative_names:
- - "vilwe"
- 162089:
- name: "Vertical integral of northward cloud liquid water flux"
- alternative_names:
- - "vilwn"
- 162090:
- name: "Vertical integral of eastward cloud frozen water flux"
- alternative_names:
- - "viiwe"
- 162091:
- name: "Vertical integral of northward cloud frozen water flux"
- alternative_names:
- - "viiwn"
- 162092:
- name: "Vertical integral of mass tendency"
- alternative_names:
- - "vimat"
- 162093:
- name: "Total column vertically-integrated water enthalpy"
- alternative_names:
- - "viwe"
- 162100:
- name: "Time-integrated temperature tendency due to short-wave radiation"
- alternative_names:
- - "srta"
- 162101:
- name: "Time-integrated temperature tendency due to long-wave radiation"
- alternative_names:
- - "trta"
- 162102:
- name: "Time-integrated temperature tendency due to short wave radiation, clear
- sky"
- alternative_names:
- - "srtca"
- 162103:
- name: "Time-integrated temperature tendency due to long-wave radiation, clear
- sky"
- alternative_names:
- - "trtca"
- 162104:
- name: "Time-integrated updraught mass flux"
- alternative_names:
- - "umfa"
- 162105:
- name: "Time-integrated downdraught mass flux"
- alternative_names:
- - "dmfa"
- 162106:
- name: "Time-integrated updraught detrainment rate"
- alternative_names:
- - "udra"
- 162107:
- name: "Time-integrated downdraught detrainment rate"
- alternative_names:
- - "ddra"
- 162108:
- name: "Time-integrated total precipitation flux"
- alternative_names:
- - "tpfa"
- 162109:
- name: "Time-integrated turbulent diffusion coefficient for heat"
- alternative_names:
- - "tdcha"
- 162110:
- name: "Time-integrated temperature tendency due to parametrisations"
- alternative_names:
- - "ttpha"
- 162111:
- name: "Time-integrated specific humidity tendency due to parametrisations"
- alternative_names:
- - "qtpha"
- 162112:
- name: "Time-integrated eastward wind tendency due to parametrisations"
- alternative_names:
- - "utpha"
- 162113:
- name: "Time-integrated northward wind tendency due to parametrisations"
- alternative_names:
- - "vtpha"
- 162114:
- name: "U-tendency from dynamics"
- alternative_names:
- - "utendd"
- 162115:
- name: "V-tendency from dynamics"
- alternative_names:
- - "vtendd"
- 162116:
- name: "T-tendency from dynamics"
- alternative_names:
- - "ttendd"
- 162117:
- name: "Q-tendency from dynamics"
- alternative_names:
- - "qtendd"
- 162118:
- name: "T-tendency from radiation"
- alternative_names:
- - "ttendr"
- 162119:
- name: "U-tendency from turbulent diffusion + subgrid orography"
- alternative_names:
- - "utendts"
- 162120:
- name: "V-tendency from turbulent diffusion + subgrid orography"
- alternative_names:
- - "vtendts"
- 162121:
- name: "T-tendency from turbulent diffusion + subgrid orography"
- alternative_names:
- - "ttendts"
- 162122:
- name: "Q-tendency from turbulent diffusion"
- alternative_names:
- - "qtendt"
- 162123:
- name: "U-tendency from subgrid orography"
- alternative_names:
- - "utends"
- 162124:
- name: "V-tendency from subgrid orography"
- alternative_names:
- - "vtends"
- 162125:
- name: "T-tendency from subgrid orography"
- alternative_names:
- - "ttends"
- 162126:
- name: "U-tendency from convection (deep+shallow)"
- alternative_names:
- - "utendcds"
- 162127:
- name: "V-tendency from convection (deep+shallow)"
- alternative_names:
- - "vtendcds"
- 162128:
- name: "T-tendency from convection (deep+shallow)"
- alternative_names:
- - "ttendcds"
- 162129:
- name: "Q-tendency from convection (deep+shallow)"
- alternative_names:
- - "qtendcds"
- 162130:
- name: "Liquid precipitation flux from convection"
- alternative_names:
- - "lpc"
- 162131:
- name: "Ice precipitation flux from convection"
- alternative_names:
- - "ipc"
- 162132:
- name: "T-tendency from cloud scheme"
- alternative_names:
- - "ttendcs"
- 162133:
- name: "Q-tendency from cloud scheme"
- alternative_names:
- - "qtendcs"
- 162134:
- name: "Ql-tendency from cloud scheme"
- alternative_names:
- - "qltendcs"
- 162135:
- name: "Qi-tendency from cloud scheme"
- alternative_names:
- - "qitendcs"
- 162136:
- name: "Liquid precip flux from cloud scheme (stratiform)"
- alternative_names:
- - "lpcs"
- 162137:
- name: "Ice precip flux from cloud scheme (stratiform)"
- alternative_names:
- - "ipcs"
- 162138:
- name: "U-tendency from shallow convection"
- alternative_names:
- - "utendcs"
- 162139:
- name: "V-tendency from shallow convection"
- alternative_names:
- - "vtendcs"
- 162140:
- name: "T-tendency from shallow convection"
- alternative_names:
- - "ttendsc"
- 162141:
- name: "Q-tendency from shallow convection"
- alternative_names:
- - "qtendsc"
- 162206:
- name: "Variance of geopotential"
- alternative_names:
- - "_param_162206"
- 162207:
- name: "Covariance of geopotential/temperature"
- alternative_names:
- - "_param_162207"
- 162208:
- name: "Variance of temperature"
- alternative_names:
- - "_param_162208"
- 162209:
- name: "Covariance of geopotential/specific humidity"
- alternative_names:
- - "_param_162209"
- 162210:
- name: "Covariance of temperature/specific humidity"
- alternative_names:
- - "_param_162210"
- 162211:
- name: "Variance of specific humidity"
- alternative_names:
- - "_param_162211"
- 162212:
- name: "Covariance of u component/geopotential"
- alternative_names:
- - "_param_162212"
- 162213:
- name: "Covariance of u component/temperature"
- alternative_names:
- - "_param_162213"
- 162214:
- name: "Covariance of u component/specific humidity"
- alternative_names:
- - "_param_162214"
- 162215:
- name: "Variance of u component"
- alternative_names:
- - "_param_162215"
- 162216:
- name: "Covariance of v component/geopotential"
- alternative_names:
- - "_param_162216"
- 162217:
- name: "Covariance of v component/temperature"
- alternative_names:
- - "_param_162217"
- 162218:
- name: "Covariance of v component/specific humidity"
- alternative_names:
- - "_param_162218"
- 162219:
- name: "Covariance of v component/u component"
- alternative_names:
- - "_param_162219"
- 162220:
- name: "Variance of v component"
- alternative_names:
- - "_param_162220"
- 162221:
- name: "Covariance of omega/geopotential"
- alternative_names:
- - "_param_162221"
- 162222:
- name: "Covariance of omega/temperature"
- alternative_names:
- - "_param_162222"
- 162223:
- name: "Covariance of omega/specific humidity"
- alternative_names:
- - "_param_162223"
- 162224:
- name: "Covariance of omega/u component"
- alternative_names:
- - "_param_162224"
- 162225:
- name: "Covariance of omega/v component"
- alternative_names:
- - "_param_162225"
- 162226:
- name: "Variance of omega"
- alternative_names:
- - "_param_162226"
- 162227:
- name: "Variance of surface pressure"
- alternative_names:
- - "_param_162227"
- 162229:
- name: "Variance of relative humidity"
- alternative_names:
- - "_param_162229"
- 162230:
- name: "Covariance of u component/ozone"
- alternative_names:
- - "_param_162230"
- 162231:
- name: "Covariance of v component/ozone"
- alternative_names:
- - "_param_162231"
- 162232:
- name: "Covariance of omega/ozone"
- alternative_names:
- - "_param_162232"
- 162233:
- name: "Variance of ozone"
- alternative_names:
- - "_param_162233"
- 162255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_162255"
- 170001:
- name: "Standardised precipitation index valid in the last 3 months"
- alternative_names:
- - "spi03"
- 170002:
- name: "Standardised precipitation index valid in the last 6 months"
- alternative_names:
- - "spi06"
- 170003:
- name: "Standardised precipitation index valid in the last 12 months"
- alternative_names:
- - "spi12"
- 170149:
- name: "Total soil moisture"
- alternative_names:
- - "tsw"
- 170171:
- name: "Soil wetness level 2"
- alternative_names:
- - "swl2"
- 170179:
- name: "Top net thermal radiation"
- alternative_names:
- - "ttr"
- 171001:
- name: "Stream function anomaly"
- alternative_names:
- - "strfa"
- 171002:
- name: "Velocity potential anomaly"
- alternative_names:
- - "vpota"
- 171003:
- name: "Potential temperature anomaly"
- alternative_names:
- - "pta"
- 171004:
- name: "Equivalent potential temperature anomaly"
- alternative_names:
- - "epta"
- 171005:
- name: "Saturated equivalent potential temperature anomaly"
- alternative_names:
- - "septa"
- 171006:
- name: "100 metre u wind component anomaly"
- alternative_names:
- - "100ua"
- 171007:
- name: "100 metre v wind component anomaly"
- alternative_names:
- - "100va"
- 171011:
- name: "U component of divergent wind anomaly"
- alternative_names:
- - "udwa"
- 171012:
- name: "V component of divergent wind anomaly"
- alternative_names:
- - "vdwa"
- 171013:
- name: "U component of rotational wind anomaly"
- alternative_names:
- - "urwa"
- 171014:
- name: "V component of rotational wind anomaly"
- alternative_names:
- - "vrwa"
- 171021:
- name: "Unbalanced component of temperature anomaly"
- alternative_names:
- - "uctpa"
- 171022:
- name: "Unbalanced component of logarithm of surface pressure anomaly"
- alternative_names:
- - "uclna"
- 171023:
- name: "Unbalanced component of divergence anomaly"
- alternative_names:
- - "ucdva"
- 171024:
- name: "Lake mix-layer temperature anomaly"
- alternative_names:
- - "lmlta"
- 171025:
- name: "Lake ice depth anomaly"
- alternative_names:
- - "licda"
- 171026:
- name: "Lake cover anomaly"
- alternative_names:
- - "cla"
- 171027:
- name: "Low vegetation cover anomaly"
- alternative_names:
- - "cvla"
- 171028:
- name: "High vegetation cover anomaly"
- alternative_names:
- - "cvha"
- 171029:
- name: "Type of low vegetation anomaly"
- alternative_names:
- - "tvla"
- 171030:
- name: "Type of high vegetation anomaly"
- alternative_names:
- - "tvha"
- 171031:
- name: "Ci"
- alternative_names:
- - "sica"
- - "sea-ice cover anomaly"
- 171032:
- name: "Snow albedo anomaly"
- alternative_names:
- - "asna"
- 171033:
- name: "Snow density anomaly"
- alternative_names:
- - "rsna"
- 171034:
- name: "Sea surface temperature anomaly"
- alternative_names:
- - "ssta"
- 171035:
- name: "Ice surface temperature anomaly layer 1"
- alternative_names:
- - "istal1"
- 171036:
- name: "Ice surface temperature anomaly layer 2"
- alternative_names:
- - "istal2"
- 171037:
- name: "Ice surface temperature anomaly layer 3"
- alternative_names:
- - "istal3"
- 171038:
- name: "Ice surface temperature anomaly layer 4"
- alternative_names:
- - "istal4"
- 171039:
- name: "Swvl1a"
- alternative_names:
- - "swval1"
- - "volumetric soil water anomaly layer 1"
- - "swv1"
- 171040:
- name: "Swvl2a"
- alternative_names:
- - "swval2"
- - "volumetric soil water anomaly layer 2"
- - "swv2"
- 171041:
- name: "Swvl3a"
- alternative_names:
- - "swval3"
- - "volumetric soil water anomaly layer 3"
- - "swv3"
- 171042:
- name: "Swvl4a"
- alternative_names:
- - "swval4"
- - "volumetric soil water anomaly layer 4"
- - "swv4"
- 171043:
- name: "Soil type anomaly"
- alternative_names:
- - "slta"
- 171044:
- name: "Snow evaporation anomaly"
- alternative_names:
- - "esa"
- 171045:
- name: "Snowmelt anomaly"
- alternative_names:
- - "smlta"
- 171046:
- name: "Solar duration anomaly"
- alternative_names:
- - "sdura"
- 171047:
- name: "Direct solar radiation anomaly"
- alternative_names:
- - "dsrpa"
- 171048:
- name: "Magnitude of turbulent surface stress anomaly"
- alternative_names:
- - "magssa"
- 171049:
- name: "10 metre wind gust anomaly"
- alternative_names:
- - "10fga"
- 171050:
- name: "Large-scale precipitation fraction anomaly"
- alternative_names:
- - "lspfa"
- 171051:
- name: "Maximum 2 metre temperature in the last 24 hours anomaly"
- alternative_names:
- - "mx2t24a"
- 171052:
- name: "Minimum 2 metre temperature in the last 24 hours anomaly"
- alternative_names:
- - "mn2t24a"
- 171053:
- name: "Montgomery potential anomaly"
- alternative_names:
- - "monta"
- 171054:
- name: "Pressure anomaly"
- alternative_names:
- - "pa"
- 171055:
- name: "Mean 2 metre temperature in the last 24 hours anomaly"
- alternative_names:
- - "mean2t24a"
- 171056:
- name: "Mean 2 metre dewpoint temperature in the last 24 hours anomaly"
- alternative_names:
- - "mn2d24a"
- 171057:
- name: "Downward uv radiation at the surface anomaly"
- alternative_names:
- - "uvba"
- 171058:
- name: "Photosynthetically active radiation at the surface anomaly"
- alternative_names:
- - "para"
- 171059:
- name: "Convective available potential energy anomaly"
- alternative_names:
- - "capea"
- 171060:
- name: "Potential vorticity anomaly"
- alternative_names:
- - "pva"
- 171061:
- name: "Total precipitation from observations anomaly"
- alternative_names:
- - "tpoa"
- 171062:
- name: "Observation count anomaly"
- alternative_names:
- - "obcta"
- 171063:
- name: "Start time for skin temperature difference anomaly"
- alternative_names:
- - "stsktda"
- 171064:
- name: "Finish time for skin temperature difference anomaly"
- alternative_names:
- - "ftsktda"
- 171065:
- name: "Skin temperature difference anomaly"
- alternative_names:
- - "sktda"
- 171078:
- name: "Total column liquid water anomaly"
- alternative_names:
- - "tclwa"
- 171079:
- name: "Total column ice water anomaly"
- alternative_names:
- - "tciwa"
- 171121:
- name: "Maximum temperature at 2 metres in the last 6 hours anomaly"
- alternative_names:
- - "mx2t6a"
- 171122:
- name: "Minimum temperature at 2 metres in the last 6 hours anomaly"
- alternative_names:
- - "mn2t6a"
- 171125:
- name: "Vertically integrated total energy anomaly"
- alternative_names:
- - "vitea"
- 171126:
- name: "Generic parameter for sensitive area prediction"
- alternative_names:
- - "_param_171126"
- 171127:
- name: "Atmospheric tide anomaly"
- alternative_names:
- - "ata"
- 171128:
- name: "Budget values anomaly"
- alternative_names:
- - "bva"
- 171129:
- name: "Z"
- alternative_names:
- - "za"
- - "geopotential anomaly"
- 171130:
- name: "T"
- alternative_names:
- - "ta"
- - "temperature anomaly"
- 171131:
- name: "U"
- alternative_names:
- - "ua"
- - "u component of wind anomaly"
- 171132:
- name: "V"
- alternative_names:
- - "va"
- - "v component of wind anomaly"
- 171133:
- name: "Specific humidity anomaly"
- alternative_names:
- - "qa"
- 171134:
- name: "Surface pressure anomaly"
- alternative_names:
- - "spa"
- 171135:
- name: "Vertical velocity (pressure) anomaly"
- alternative_names:
- - "wa"
- 171136:
- name: "Total column water anomaly"
- alternative_names:
- - "tcwa"
- 171137:
- name: "Total column water vapour anomaly"
- alternative_names:
- - "tcwva"
- 171138:
- name: "Vo"
- alternative_names:
- - "voa"
- - "relative vorticity anomaly"
- 171139:
- name: "St"
- alternative_names:
- - "stal1"
- - "soil temperature anomaly level 1"
- - "stl1"
- 171140:
- name: "Swl1"
- alternative_names:
- - "swal1"
- - "soil wetness anomaly level 1"
- 171141:
- name: "Snow depth anomaly"
- alternative_names:
- - "sda"
- 171142:
- name: "Stratiform precipitation (large-scale precipitation) anomaly"
- alternative_names:
- - "lspa"
- 171143:
- name: "Convective precipitation anomaly"
- alternative_names:
- - "cpa"
- 171144:
- name: "Snowfall (convective + stratiform) anomaly"
- alternative_names:
- - "sfa"
- 171145:
- name: "Boundary layer dissipation anomaly"
- alternative_names:
- - "blda"
- 171146:
- name: "Surface sensible heat flux anomaly"
- alternative_names:
- - "sshfa"
- 171147:
- name: "Surface latent heat flux anomaly"
- alternative_names:
- - "slhfa"
- 171148:
- name: "Charnock anomaly"
- alternative_names:
- - "chnka"
- 171149:
- name: "Surface net radiation anomaly"
- alternative_names:
- - "snra"
- 171150:
- name: "Top net radiation anomaly"
- alternative_names:
- - "tnra"
- 171151:
- name: "Msl"
- alternative_names:
- - "msla"
- - "mean sea level pressure anomaly"
- 171152:
- name: "Logarithm of surface pressure anomaly"
- alternative_names:
- - "lspa"
- 171153:
- name: "Short-wave heating rate anomaly"
- alternative_names:
- - "swhra"
- 171154:
- name: "Long-wave heating rate anomaly"
- alternative_names:
- - "lwhra"
- 171155:
- name: "D"
- alternative_names:
- - "da"
- - "relative divergence anomaly"
- 171156:
- name: "Gh"
- alternative_names:
- - "gha"
- - "height anomaly"
- 171157:
- name: "R"
- alternative_names:
- - "ra"
- - "relative humidity anomaly"
- 171158:
- name: "Tendency of surface pressure anomaly"
- alternative_names:
- - "tspa"
- 171159:
- name: "Boundary layer height anomaly"
- alternative_names:
- - "blha"
- 171160:
- name: "Standard deviation of orography anomaly"
- alternative_names:
- - "sdora"
- 171161:
- name: "Anisotropy of sub-gridscale orography anomaly"
- alternative_names:
- - "isora"
- 171162:
- name: "Angle of sub-gridscale orography anomaly"
- alternative_names:
- - "anora"
- 171163:
- name: "Slope of sub-gridscale orography anomaly"
- alternative_names:
- - "slora"
- 171164:
- name: "Total cloud cover anomaly"
- alternative_names:
- - "tcca"
- 171165:
- name: "10 metre u wind component anomaly"
- alternative_names:
- - "10ua"
- 171166:
- name: "10 metre v wind component anomaly"
- alternative_names:
- - "10va"
- 171167:
- name: "2 metre temperature anomaly"
- alternative_names:
- - "2ta"
- 171168:
- name: "2 metre dewpoint temperature anomaly"
- alternative_names:
- - "2da"
- 171169:
- name: "Surface solar radiation downwards anomaly"
- alternative_names:
- - "ssrda"
- 171170:
- name: "Stl2"
- alternative_names:
- - "stal2"
- - "soil temperature anomaly level 2"
- - "slal2"
- 171171:
- name: "Swl2"
- alternative_names:
- - "swal2"
- - "soil wetness anomaly level 2"
- 171173:
- name: "Surface roughness anomaly"
- alternative_names:
- - "sra"
- 171174:
- name: "Albedo anomaly"
- alternative_names:
- - "ala"
- 171175:
- name: "Surface thermal radiation downwards anomaly"
- alternative_names:
- - "strda"
- 171176:
- name: "Surface net solar radiation anomaly"
- alternative_names:
- - "ssra"
- 171177:
- name: "Surface net thermal radiation anomaly"
- alternative_names:
- - "stra"
- 171178:
- name: "Top net solar radiation anomaly"
- alternative_names:
- - "tsra"
- 171179:
- name: "Top net thermal radiation anomaly"
- alternative_names:
- - "ttra"
- 171180:
- name: "East-west surface stress anomaly"
- alternative_names:
- - "eqssa"
- 171181:
- name: "North-south surface stress anomaly"
- alternative_names:
- - "nsssa"
- 171182:
- name: "Evaporation anomaly"
- alternative_names:
- - "ea"
- 171183:
- name: "Stl3"
- alternative_names:
- - "stal3"
- - "soil temperature anomaly level 3"
- 171184:
- name: "Swl3"
- alternative_names:
- - "swal3"
- - "soil wetness anomaly level 3"
- 171185:
- name: "Convective cloud cover anomaly"
- alternative_names:
- - "ccca"
- 171186:
- name: "Low cloud cover anomaly"
- alternative_names:
- - "lcca"
- 171187:
- name: "Medium cloud cover anomaly"
- alternative_names:
- - "mcca"
- 171188:
- name: "High cloud cover anomaly"
- alternative_names:
- - "hcca"
- 171189:
- name: "Sunshine duration anomaly"
- alternative_names:
- - "sunda"
- 171190:
- name: "East-west component of sub-gridscale orographic variance anomaly"
- alternative_names:
- - "ewova"
- 171191:
- name: "North-south component of sub-gridscale orographic variance anomaly"
- alternative_names:
- - "nsova"
- 171192:
- name: "North-west/south-east component of sub-gridscale orographic variance anomaly"
- alternative_names:
- - "nwova"
- 171193:
- name: "North-east/south-west component of sub-gridscale orographic variance anomaly"
- alternative_names:
- - "neova"
- 171194:
- name: "Brightness temperature anomaly"
- alternative_names:
- - "btmpa"
- 171195:
- name: "Longitudinal component of gravity wave stress anomaly"
- alternative_names:
- - "lgwsa"
- 171196:
- name: "Meridional component of gravity wave stress anomaly"
- alternative_names:
- - "mgwsa"
- 171197:
- name: "Gravity wave dissipation anomaly"
- alternative_names:
- - "gwda"
- 171198:
- name: "Skin reservoir content anomaly"
- alternative_names:
- - "srca"
- 171199:
- name: "Vegetation fraction anomaly"
- alternative_names:
- - "vfa"
- 171200:
- name: "Variance of sub-gridscale orography anomaly"
- alternative_names:
- - "vsoa"
- 171201:
- name: "Maximum temperature at 2 metres anomaly"
- alternative_names:
- - "mx2ta"
- 171202:
- name: "Minimum temperature at 2 metres anomaly"
- alternative_names:
- - "mn2ta"
- 171203:
- name: "Ozone mass mixing ratio anomaly"
- alternative_names:
- - "o3a"
- 171204:
- name: "Precipitation analysis weights anomaly"
- alternative_names:
- - "pawa"
- 171205:
- name: "Runoff anomaly"
- alternative_names:
- - "roa"
- 171206:
- name: "Total column ozone anomaly"
- alternative_names:
- - "tco3a"
- 171207:
- name: "10si"
- alternative_names:
- - "10sia"
- - "10 metre wind speed anomaly"
- 171208:
- name: "Top net solar radiation clear sky anomaly"
- alternative_names:
- - "tsrca"
- 171209:
- name: "Top net thermal radiation clear sky anomaly"
- alternative_names:
- - "ttrca"
- 171210:
- name: "Surface net solar radiation clear sky anomaly"
- alternative_names:
- - "ssrca"
- 171211:
- name: "Surface net thermal radiation, clear sky anomaly"
- alternative_names:
- - "strca"
- 171212:
- name: "Solar insolation anomaly"
- alternative_names:
- - "sia"
- 171214:
- name: "Diabatic heating by radiation anomaly"
- alternative_names:
- - "dhra"
- 171215:
- name: "Diabatic heating by vertical diffusion anomaly"
- alternative_names:
- - "dhvda"
- 171216:
- name: "Diabatic heating by cumulus convection anomaly"
- alternative_names:
- - "dhcca"
- 171217:
- name: "Diabatic heating by large-scale condensation anomaly"
- alternative_names:
- - "dhlca"
- 171218:
- name: "Vertical diffusion of zonal wind anomaly"
- alternative_names:
- - "vdzwa"
- 171219:
- name: "Vertical diffusion of meridional wind anomaly"
- alternative_names:
- - "vdmwa"
- 171220:
- name: "East-west gravity wave drag tendency anomaly"
- alternative_names:
- - "ewgda"
- 171221:
- name: "North-south gravity wave drag tendency anomaly"
- alternative_names:
- - "nsgda"
- 171222:
- name: "Convective tendency of zonal wind anomaly"
- alternative_names:
- - "ctzwa"
- 171223:
- name: "Convective tendency of meridional wind anomaly"
- alternative_names:
- - "ctmwa"
- 171224:
- name: "Vertical diffusion of humidity anomaly"
- alternative_names:
- - "vdha"
- 171225:
- name: "Humidity tendency by cumulus convection anomaly"
- alternative_names:
- - "htcca"
- 171226:
- name: "Humidity tendency by large-scale condensation anomaly"
- alternative_names:
- - "htlca"
- 171227:
- name: "Change from removal of negative humidity anomaly"
- alternative_names:
- - "crnha"
- 171228:
- name: "Total precipitation anomaly"
- alternative_names:
- - "tpa"
- 171229:
- name: "Instantaneous x surface stress anomaly"
- alternative_names:
- - "iewsa"
- 171230:
- name: "Instantaneous y surface stress anomaly"
- alternative_names:
- - "inssa"
- 171231:
- name: "Instantaneous surface heat flux anomaly"
- alternative_names:
- - "ishfa"
- 171232:
- name: "Instantaneous moisture flux anomaly"
- alternative_names:
- - "iea"
- 171233:
- name: "Apparent surface humidity anomaly"
- alternative_names:
- - "asqa"
- 171234:
- name: "Logarithm of surface roughness length for heat anomaly"
- alternative_names:
- - "lsrha"
- 171235:
- name: "Skin temperature anomaly"
- alternative_names:
- - "skta"
- 171236:
- name: "Soil temperature level 4 anomaly"
- alternative_names:
- - "stal4"
- 171237:
- name: "Swl4"
- alternative_names:
- - "swal4"
- - "soil wetness level 4 anomaly"
- 171238:
- name: "Temperature of snow layer anomaly"
- alternative_names:
- - "tsna"
- 171239:
- name: "Convective snowfall anomaly"
- alternative_names:
- - "csfa"
- 171240:
- name: "Large scale snowfall anomaly"
- alternative_names:
- - "lsfa"
- 171241:
- name: "Accumulated cloud fraction tendency anomaly"
- alternative_names:
- - "acfa"
- 171242:
- name: "Accumulated liquid water tendency anomaly"
- alternative_names:
- - "alwa"
- 171243:
- name: "Forecast albedo anomaly"
- alternative_names:
- - "fala"
- 171244:
- name: "Forecast surface roughness anomaly"
- alternative_names:
- - "fsra"
- 171245:
- name: "Forecast logarithm of surface roughness for heat anomaly"
- alternative_names:
- - "flsra"
- 171246:
- name: "Cloud liquid water content anomaly"
- alternative_names:
- - "clwca"
- 171247:
- name: "Cloud ice water content anomaly"
- alternative_names:
- - "ciwca"
- 171248:
- name: "Cloud cover anomaly"
- alternative_names:
- - "cca"
- 171249:
- name: "Accumulated ice water tendency anomaly"
- alternative_names:
- - "aiwa"
- 171250:
- name: "Ice age anomaly"
- alternative_names:
- - "iaa"
- 171251:
- name: "Adiabatic tendency of temperature anomaly"
- alternative_names:
- - "attea"
- 171252:
- name: "Adiabatic tendency of humidity anomaly"
- alternative_names:
- - "athea"
- 171253:
- name: "Adiabatic tendency of zonal wind anomaly"
- alternative_names:
- - "atzea"
- 171254:
- name: "Adiabatic tendency of meridional wind anomaly"
- alternative_names:
- - "atmwa"
- 171255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_171255"
- 172008:
- name: "Mean surface runoff rate"
- alternative_names:
- - "msror"
- 172009:
- name: "Mean sub-surface runoff rate"
- alternative_names:
- - "mssror"
- 172044:
- name: "Es"
- alternative_names:
- - "esrate"
- - "snow evaporation"
- 172045:
- name: "Snowmelt"
- alternative_names:
- - "_param_172045"
- 172048:
- name: "Magnitude of turbulent surface stress"
- alternative_names:
- - "_param_172048"
- 172050:
- name: "Lspf"
- alternative_names:
- - "mlspfr"
- - "mean large-scale precipitation fraction"
- 172142:
- name: "Lsp"
- alternative_names:
- - "mlsprt"
- - "mean large-scale precipitation rate"
- 172143:
- name: "Cp"
- alternative_names:
- - "cprate"
- - "mean convective precipitation rate"
- 172144:
- name: "Sf"
- alternative_names:
- - "mtsfr"
- - "mean total snowfall rate"
- 172145:
- name: "Boundary layer dissipation"
- alternative_names:
- - "bldrate"
- 172146:
- name: "146"
- alternative_names:
- - "msshfl"
- - "mean surface sensible heat flux"
- - "sshf"
- 172147:
- name: "147"
- alternative_names:
- - "mslhfl"
- - "mean surface latent heat flux"
- - "slhf"
- 172149:
- name: "Snr"
- alternative_names:
- - "msnrf"
- - "time-mean surface net radiation flux (sw and lw)"
- 172153:
- name: "Swhr"
- alternative_names:
- - "mswhr"
- - "mean short-wave heating rate"
- 172154:
- name: "Lwhr"
- alternative_names:
- - "mlwhr"
- - "mean long-wave heating rate"
- 172169:
- name: "Ssrd"
- alternative_names:
- - "msdsrf"
- - "mean surface downward solar radiation flux"
- 172175:
- name: "Strd"
- alternative_names:
- - "msdtrf"
- - "mean surface downward thermal radiation flux"
- 172176:
- name: "Ssr"
- alternative_names:
- - "msnsrf"
- - "mean surface net solar radiation flux"
- 172177:
- name: "Str"
- alternative_names:
- - "msntrf"
- - "mean surface net thermal radiation flux"
- 172178:
- name: "Tsr"
- alternative_names:
- - "mtnsrf"
- - "mean top net solar radiation flux"
- 172179:
- name: "Ttr"
- alternative_names:
- - "mtntrf"
- - "mean top net thermal radiation flux"
- 172180:
- name: "Ewss"
- alternative_names:
- - "ewssra"
- - "east-west surface stress rate of accumulation"
- 172181:
- name: "Nsss"
- alternative_names:
- - "nsssra"
- - "north-south surface stress rate of accumulation"
- 172182:
- name: "E"
- alternative_names:
- - "erate"
- - "evaporation"
- 172189:
- name: "Sund"
- alternative_names:
- - "msdr"
- - "mean sunshine duration rate"
- 172195:
- name: "Longitudinal component of gravity wave stress"
- alternative_names:
- - "_param_172195"
- 172196:
- name: "Meridional component of gravity wave stress"
- alternative_names:
- - "_param_172196"
- 172197:
- name: "Gravity wave dissipation"
- alternative_names:
- - "gwdrate"
- 172205:
- name: "Ro"
- alternative_names:
- - "mrort"
- - "mean runoff rate"
- 172208:
- name: "Top net solar radiation, clear sky"
- alternative_names:
- - "_param_172208"
- 172209:
- name: "Top net thermal radiation, clear sky"
- alternative_names:
- - "_param_172209"
- 172210:
- name: "Surface net solar radiation, clear sky"
- alternative_names:
- - "_param_172210"
- 172211:
- name: "Surface net thermal radiation, clear sky"
- alternative_names:
- - "_param_172211"
- 172212:
- name: "Solar insolation rate of accumulation"
- alternative_names:
- - "soira"
- 172228:
- name: "Tp"
- alternative_names:
- - "tprate"
- - "mean total precipitation rate"
- 172239:
- name: "Convective snowfall"
- alternative_names:
- - "_param_172239"
- 172240:
- name: "Large scale snowfall"
- alternative_names:
- - "_param_172240"
- 172255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_172255"
- 173008:
- name: "Mean surface runoff rate anomaly"
- alternative_names:
- - "msrora"
- 173009:
- name: "Mean sub-surface runoff rate anomaly"
- alternative_names:
- - "mssrora"
- 173044:
- name: "Snow evaporation anomaly"
- alternative_names:
- - "_param_173044"
- 173045:
- name: "Snowmelt anomaly"
- alternative_names:
- - "_param_173045"
- 173048:
- name: "Magnitude of turbulent surface stress anomaly"
- alternative_names:
- - "_param_173048"
- 173050:
- name: "Large-scale precipitation fraction anomaly"
- alternative_names:
- - "_param_173050"
- 173142:
- name: "Lspa"
- alternative_names:
- - "lspara"
- - "stratiform precipitation (large-scale precipitation) anomalous rate of accumulation"
- 173143:
- name: "Cpa"
- alternative_names:
- - "mcpra"
- - "mean convective precipitation rate anomaly"
- 173144:
- name: "Snowfall (convective + stratiform) anomalous rate of accumulation"
- alternative_names:
- - "sfara"
- 173145:
- name: "Boundary layer dissipation anomaly"
- alternative_names:
- - "_param_173145"
- 173146:
- name: "Surface sensible heat flux anomalous rate of accumulation"
- alternative_names:
- - "sshfara"
- 173147:
- name: "Surface latent heat flux anomalous rate of accumulation"
- alternative_names:
- - "slhfara"
- 173149:
- name: "Surface net radiation anomaly"
- alternative_names:
- - "_param_173149"
- 173153:
- name: "Short-wave heating rate anomaly"
- alternative_names:
- - "_param_173153"
- 173154:
- name: "Long-wave heating rate anomaly"
- alternative_names:
- - "_param_173154"
- 173169:
- name: "Ssrd"
- alternative_names:
- - "ssrdara"
- - "surface solar radiation downwards anomalous rate of accumulation"
- - "ssrda"
- 173175:
- name: "Strda"
- alternative_names:
- - "strdara"
- - "surface thermal radiation downwards anomalous rate of accumulation"
- 173176:
- name: "Ssr"
- alternative_names:
- - "ssrara"
- - "surface solar radiation anomalous rate of accumulation"
- - "ssra"
- 173177:
- name: "Str"
- alternative_names:
- - "strara"
- - "surface thermal radiation anomalous rate of accumulation"
- - "stra"
- 173178:
- name: "Tsr"
- alternative_names:
- - "tsrara"
- - "top solar radiation anomalous rate of accumulation"
- - "tsra"
- 173179:
- name: "Ttr"
- alternative_names:
- - "ttrara"
- - "top thermal radiation anomalous rate of accumulation"
- - "ttra"
- 173180:
- name: "East-west surface stress anomalous rate of accumulation"
- alternative_names:
- - "ewssara"
- 173181:
- name: "North-south surface stress anomalous rate of accumulation"
- alternative_names:
- - "nsssara"
- 173182:
- name: "E"
- alternative_names:
- - "evara"
- - "evaporation anomalous rate of accumulation"
- - "ea"
- 173189:
- name: "Sunshine duration anomalous rate of accumulation"
- alternative_names:
- - "sundara"
- 173195:
- name: "Longitudinal component of gravity wave stress anomaly"
- alternative_names:
- - "_param_173195"
- 173196:
- name: "Meridional component of gravity wave stress anomaly"
- alternative_names:
- - "_param_173196"
- 173197:
- name: "Gravity wave dissipation anomaly"
- alternative_names:
- - "_param_173197"
- 173205:
- name: "Runoff anomalous rate of accumulation"
- alternative_names:
- - "roara"
- 173208:
- name: "Top net solar radiation, clear sky anomaly"
- alternative_names:
- - "_param_173208"
- 173209:
- name: "Top net thermal radiation, clear sky anomaly"
- alternative_names:
- - "_param_173209"
- 173210:
- name: "Surface net solar radiation, clear sky anomaly"
- alternative_names:
- - "_param_173210"
- 173211:
- name: "Surface net thermal radiation, clear sky anomaly"
- alternative_names:
- - "_param_173211"
- 173212:
- name: "Solar insolation anomalous rate of accumulation"
- alternative_names:
- - "soiara"
- 173228:
- name: "Total precipitation anomalous rate of accumulation"
- alternative_names:
- - "tpara"
- 173239:
- name: "Convective snowfall anomaly"
- alternative_names:
- - "_param_173239"
- 173240:
- name: "Large scale snowfall anomaly"
- alternative_names:
- - "_param_173240"
- 173255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_173255"
- 174006:
- name: "Total soil moisture"
- alternative_names:
- - "_param_174006"
- 174008:
- name: "Surface runoff"
- alternative_names:
- - "sro"
- 174009:
- name: "Sub-surface runoff"
- alternative_names:
- - "ssro"
- 174010:
- name: "Clear-sky (ii) down surface sw flux"
- alternative_names:
- - "sswcsdown"
- 174013:
- name: "Clear-sky (ii) up surface sw flux"
- alternative_names:
- - "sswcsup"
- 174025:
- name: "Visibility at 1.5m"
- alternative_names:
- - "vis15"
- 174031:
- name: "Fraction of sea-ice in sea"
- alternative_names:
- - "_param_174031"
- 174034:
- name: "Open-sea surface temperature"
- alternative_names:
- - "_param_174034"
- 174039:
- name: "Volumetric soil water layer 1"
- alternative_names:
- - "_param_174039"
- 174040:
- name: "Volumetric soil water layer 2"
- alternative_names:
- - "_param_174040"
- 174041:
- name: "Volumetric soil water layer 3"
- alternative_names:
- - "_param_174041"
- 174042:
- name: "Volumetric soil water layer 4"
- alternative_names:
- - "_param_174042"
- 174049:
- name: "10 metre wind gust in the last 24 hours"
- alternative_names:
- - "_param_174049"
- 174050:
- name: "Minimum temperature at 1.5m since previous post-processing"
- alternative_names:
- - "mn15t"
- 174051:
- name: "Maximum temperature at 1.5m since previous post-processing"
- alternative_names:
- - "mx15t"
- 174052:
- name: "Relative humidity at 1.5m"
- alternative_names:
- - "rhum"
- 174055:
- name: "1.5m temperature - mean in the last 24 hours"
- alternative_names:
- - "_param_174055"
- 174083:
- name: "Net primary productivity"
- alternative_names:
- - "_param_174083"
- 174085:
- name: "10m u wind over land"
- alternative_names:
- - "_param_174085"
- 174086:
- name: "10m v wind over land"
- alternative_names:
- - "_param_174086"
- 174087:
- name: "1.5m temperature over land"
- alternative_names:
- - "_param_174087"
- 174088:
- name: "1.5m dewpoint temperature over land"
- alternative_names:
- - "_param_174088"
- 174089:
- name: "Top incoming solar radiation"
- alternative_names:
- - "_param_174089"
- 174090:
- name: "Top outgoing solar radiation"
- alternative_names:
- - "_param_174090"
- 174092:
- name: "Sea ice albedo"
- alternative_names:
- - "sialb"
- 174093:
- name: "Sea ice surface temperature"
- alternative_names:
- - "sitemptop"
- 174094:
- name: "Mean sea surface temperature"
- alternative_names:
- - "_param_174094"
- 174095:
- name: "1.5m specific humidity"
- alternative_names:
- - "_param_174095"
- 174096:
- name: "2 metre specific humidity"
- alternative_names:
- - "2sh"
- 174097:
- name: "Sea ice snow thickness"
- alternative_names:
- - "sisnthick"
- 174098:
- name: "Sea-ice thickness"
- alternative_names:
- - "sithick"
- 174099:
- name: "Liquid water potential temperature"
- alternative_names:
- - "_param_174099"
- 174110:
- name: "Ocean ice concentration"
- alternative_names:
- - "_param_174110"
- 174111:
- name: "Ocean mean ice depth"
- alternative_names:
- - "_param_174111"
- 174112:
- name: "Sea ice velocity along x"
- alternative_names:
- - "siue"
- 174113:
- name: "Sea ice velocity along y"
- alternative_names:
- - "sivn"
- 174116:
- name: "Short wave radiation flux at surface"
- alternative_names:
- - "swrsurf"
- 174117:
- name: "Short wave radiation flux at top of atmosphere"
- alternative_names:
- - "swrtop"
- 174137:
- name: "Total column water vapour"
- alternative_names:
- - "tcwvap"
- 174139:
- name: "Soil temperature layer 1"
- alternative_names:
- - "_param_174139"
- 174142:
- name: "Large scale rainfall rate"
- alternative_names:
- - "lsrrate"
- 174143:
- name: "Convective rainfall rate"
- alternative_names:
- - "crfrate"
- 174164:
- name: "Average potential temperature in upper 293.4m"
- alternative_names:
- - "_param_174164"
- 174167:
- name: "1.5m temperature"
- alternative_names:
- - "_param_174167"
- 174168:
- name: "1.5m dewpoint temperature"
- alternative_names:
- - "_param_174168"
- 174170:
- name: "Soil temperature layer 2"
- alternative_names:
- - "_param_174170"
- 174175:
- name: "Average salinity in upper 293.4m"
- alternative_names:
- - "_param_174175"
- 174183:
- name: "Soil temperature layer 3"
- alternative_names:
- - "_param_174183"
- 174186:
- name: "Very low cloud amount"
- alternative_names:
- - "vlca"
- 174201:
- name: "1.5m temperature - maximum in the last 24 hours"
- alternative_names:
- - "_param_174201"
- 174202:
- name: "1.5m temperature - minimum in the last 24 hours"
- alternative_names:
- - "_param_174202"
- 174236:
- name: "Soil temperature layer 4"
- alternative_names:
- - "_param_174236"
- 174239:
- name: "Convective snowfall rate"
- alternative_names:
- - "csfrate"
- 174240:
- name: "Large scale snowfall rate"
- alternative_names:
- - "lsfrate"
- 174248:
- name: "Total cloud amount - random overlap"
- alternative_names:
- - "tccro"
- 174249:
- name: "Total cloud amount in lw radiation"
- alternative_names:
- - "tcclwr"
- 174255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_174255"
- 175006:
- name: "Total soil moisture"
- alternative_names:
- - "_param_175006"
- 175031:
- name: "Fraction of sea-ice in sea"
- alternative_names:
- - "_param_175031"
- 175034:
- name: "Open-sea surface temperature"
- alternative_names:
- - "_param_175034"
- 175039:
- name: "Volumetric soil water layer 1"
- alternative_names:
- - "_param_175039"
- 175040:
- name: "Volumetric soil water layer 2"
- alternative_names:
- - "_param_175040"
- 175041:
- name: "Volumetric soil water layer 3"
- alternative_names:
- - "_param_175041"
- 175042:
- name: "Volumetric soil water layer 4"
- alternative_names:
- - "_param_175042"
- 175049:
- name: "10m wind gust in the last 24 hours"
- alternative_names:
- - "_param_175049"
- 175055:
- name: "1.5m temperature - mean in the last 24 hours"
- alternative_names:
- - "_param_175055"
- 175083:
- name: "Net primary productivity"
- alternative_names:
- - "_param_175083"
- 175085:
- name: "10m u wind over land"
- alternative_names:
- - "_param_175085"
- 175086:
- name: "10m v wind over land"
- alternative_names:
- - "_param_175086"
- 175087:
- name: "1.5m temperature over land"
- alternative_names:
- - "_param_175087"
- 175088:
- name: "1.5m dewpoint temperature over land"
- alternative_names:
- - "_param_175088"
- 175089:
- name: "Top incoming solar radiation"
- alternative_names:
- - "_param_175089"
- 175090:
- name: "Top outgoing solar radiation"
- alternative_names:
- - "_param_175090"
- 175110:
- name: "Ocean ice concentration"
- alternative_names:
- - "_param_175110"
- 175111:
- name: "Ocean mean ice depth"
- alternative_names:
- - "_param_175111"
- 175139:
- name: "Soil temperature layer 1"
- alternative_names:
- - "_param_175139"
- 175164:
- name: "Average potential temperature in upper 293.4m"
- alternative_names:
- - "_param_175164"
- 175167:
- name: "1.5m temperature"
- alternative_names:
- - "_param_175167"
- 175168:
- name: "1.5m dewpoint temperature"
- alternative_names:
- - "_param_175168"
- 175170:
- name: "Soil temperature layer 2"
- alternative_names:
- - "_param_175170"
- 175175:
- name: "Average salinity in upper 293.4m"
- alternative_names:
- - "_param_175175"
- 175183:
- name: "Soil temperature layer 3"
- alternative_names:
- - "_param_175183"
- 175201:
- name: "1.5m temperature - maximum in the last 24 hours"
- alternative_names:
- - "_param_175201"
- 175202:
- name: "1.5m temperature - minimum in the last 24 hours"
- alternative_names:
- - "_param_175202"
- 175236:
- name: "Soil temperature layer 4"
- alternative_names:
- - "_param_175236"
- 175255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_175255"
- 180149:
- name: "Total soil wetness"
- alternative_names:
- - "tsw"
- 180176:
- name: "Surface net solar radiation"
- alternative_names:
- - "ssr"
- 180177:
- name: "Surface net thermal radiation"
- alternative_names:
- - "str"
- 180178:
- name: "Top net solar radiation"
- alternative_names:
- - "tsr"
- 180179:
- name: "Top net thermal radiation"
- alternative_names:
- - "ttr"
- 190141:
- name: "Snow depth"
- alternative_names:
- - "sdsien"
- 190170:
- name: "Field capacity"
- alternative_names:
- - "cap"
- 190171:
- name: "Wilting point"
- alternative_names:
- - "wiltsien"
- 190173:
- name: "Roughness length"
- alternative_names:
- - "sr"
- 190229:
- name: "Total soil moisture"
- alternative_names:
- - "tsm"
- 200001:
- name: "Stream function difference"
- alternative_names:
- - "strfdiff"
- 200002:
- name: "Velocity potential difference"
- alternative_names:
- - "vpotdiff"
- 200003:
- name: "Potential temperature difference"
- alternative_names:
- - "ptdiff"
- 200004:
- name: "Equivalent potential temperature difference"
- alternative_names:
- - "eqptdiff"
- 200005:
- name: "Saturated equivalent potential temperature difference"
- alternative_names:
- - "septdiff"
- 200011:
- name: "U component of divergent wind difference"
- alternative_names:
- - "udvwdiff"
- 200012:
- name: "V component of divergent wind difference"
- alternative_names:
- - "vdvwdiff"
- 200013:
- name: "U component of rotational wind difference"
- alternative_names:
- - "urtwdiff"
- 200014:
- name: "V component of rotational wind difference"
- alternative_names:
- - "vrtwdiff"
- 200021:
- name: "Unbalanced component of temperature difference"
- alternative_names:
- - "uctpdiff"
- 200022:
- name: "Unbalanced component of logarithm of surface pressure difference"
- alternative_names:
- - "uclndiff"
- 200023:
- name: "Unbalanced component of divergence difference"
- alternative_names:
- - "ucdvdiff"
- 200024:
- name: "Reserved for future unbalanced components"
- alternative_names:
- - "_param_200024"
- 200025:
- name: "Reserved for future unbalanced components"
- alternative_names:
- - "_param_200025"
- 200026:
- name: "Lake cover difference"
- alternative_names:
- - "cldiff"
- 200027:
- name: "Low vegetation cover difference"
- alternative_names:
- - "cvldiff"
- 200028:
- name: "High vegetation cover difference"
- alternative_names:
- - "cvhdiff"
- 200029:
- name: "Type of low vegetation difference"
- alternative_names:
- - "tvldiff"
- 200030:
- name: "Type of high vegetation difference"
- alternative_names:
- - "tvhdiff"
- 200031:
- name: "Sea-ice cover difference"
- alternative_names:
- - "sicdiff"
- 200032:
- name: "Snow albedo difference"
- alternative_names:
- - "asndiff"
- 200033:
- name: "Snow density difference"
- alternative_names:
- - "rsndiff"
- 200034:
- name: "Sea surface temperature difference"
- alternative_names:
- - "sstdiff"
- 200035:
- name: "Ice surface temperature layer 1 difference"
- alternative_names:
- - "istl1diff"
- 200036:
- name: "Ice surface temperature layer 2 difference"
- alternative_names:
- - "istl2diff"
- 200037:
- name: "Ice surface temperature layer 3 difference"
- alternative_names:
- - "istl3diff"
- 200038:
- name: "Ice surface temperature layer 4 difference"
- alternative_names:
- - "istl4diff"
- 200039:
- name: "Volumetric soil water layer 1 difference"
- alternative_names:
- - "swvl1diff"
- 200040:
- name: "Volumetric soil water layer 2 difference"
- alternative_names:
- - "swvl2diff"
- 200041:
- name: "Volumetric soil water layer 3 difference"
- alternative_names:
- - "swvl3diff"
- 200042:
- name: "Volumetric soil water layer 4 difference"
- alternative_names:
- - "swvl4diff"
- 200043:
- name: "Soil type difference"
- alternative_names:
- - "sltdiff"
- 200044:
- name: "Snow evaporation difference"
- alternative_names:
- - "esdiff"
- 200045:
- name: "Snowmelt difference"
- alternative_names:
- - "smltdiff"
- 200046:
- name: "Solar duration difference"
- alternative_names:
- - "sdurdiff"
- 200047:
- name: "Direct solar radiation difference"
- alternative_names:
- - "dsrpdiff"
- 200048:
- name: "Magnitude of turbulent surface stress difference"
- alternative_names:
- - "magssdiff"
- 200049:
- name: "10 metre wind gust difference"
- alternative_names:
- - "10fgdiff"
- 200050:
- name: "Large-scale precipitation fraction difference"
- alternative_names:
- - "lspfdiff"
- 200051:
- name: "Maximum 2 metre temperature difference"
- alternative_names:
- - "mx2t24diff"
- 200052:
- name: "Minimum 2 metre temperature difference"
- alternative_names:
- - "mn2t24diff"
- 200053:
- name: "Montgomery potential difference"
- alternative_names:
- - "montdiff"
- 200054:
- name: "Pressure difference"
- alternative_names:
- - "presdiff"
- 200055:
- name: "Mean 2 metre temperature in the last 24 hours difference"
- alternative_names:
- - "mean2t24diff"
- 200056:
- name: "Mean 2 metre dewpoint temperature in the last 24 hours difference"
- alternative_names:
- - "mn2d24diff"
- 200057:
- name: "Downward uv radiation at the surface difference"
- alternative_names:
- - "uvbdiff"
- 200058:
- name: "Photosynthetically active radiation at the surface difference"
- alternative_names:
- - "pardiff"
- 200059:
- name: "Convective available potential energy difference"
- alternative_names:
- - "capediff"
- 200060:
- name: "Potential vorticity difference"
- alternative_names:
- - "pvdiff"
- 200061:
- name: "Total precipitation from observations difference"
- alternative_names:
- - "tpodiff"
- 200062:
- name: "Observation count difference"
- alternative_names:
- - "obctdiff"
- 200063:
- name: "Start time for skin temperature difference"
- alternative_names:
- - "_param_200063"
- 200064:
- name: "Finish time for skin temperature difference"
- alternative_names:
- - "_param_200064"
- 200065:
- name: "Skin temperature difference"
- alternative_names:
- - "_param_200065"
- 200066:
- name: "Leaf area index, low vegetation"
- alternative_names:
- - "_param_200066"
- 200067:
- name: "Leaf area index, high vegetation"
- alternative_names:
- - "_param_200067"
- 200068:
- name: "Minimum stomatal resistance, low vegetation"
- alternative_names:
- - "_param_200068"
- 200069:
- name: "Minimum stomatal resistance, high vegetation"
- alternative_names:
- - "_param_200069"
- 200070:
- name: "Biome cover, low vegetation"
- alternative_names:
- - "_param_200070"
- 200071:
- name: "Biome cover, high vegetation"
- alternative_names:
- - "_param_200071"
- 200078:
- name: "Total column liquid water"
- alternative_names:
- - "_param_200078"
- 200079:
- name: "Total column ice water"
- alternative_names:
- - "_param_200079"
- 200080:
- name: "Experimental product"
- alternative_names:
- - "_param_200080"
- 200081:
- name: "Experimental product"
- alternative_names:
- - "_param_200081"
- 200082:
- name: "Experimental product"
- alternative_names:
- - "_param_200082"
- 200083:
- name: "Experimental product"
- alternative_names:
- - "_param_200083"
- 200084:
- name: "Experimental product"
- alternative_names:
- - "_param_200084"
- 200085:
- name: "Experimental product"
- alternative_names:
- - "_param_200085"
- 200086:
- name: "Experimental product"
- alternative_names:
- - "_param_200086"
- 200087:
- name: "Experimental product"
- alternative_names:
- - "_param_200087"
- 200088:
- name: "Experimental product"
- alternative_names:
- - "_param_200088"
- 200089:
- name: "Experimental product"
- alternative_names:
- - "_param_200089"
- 200090:
- name: "Experimental product"
- alternative_names:
- - "_param_200090"
- 200091:
- name: "Experimental product"
- alternative_names:
- - "_param_200091"
- 200092:
- name: "Experimental product"
- alternative_names:
- - "_param_200092"
- 200093:
- name: "Experimental product"
- alternative_names:
- - "_param_200093"
- 200094:
- name: "Experimental product"
- alternative_names:
- - "_param_200094"
- 200095:
- name: "Experimental product"
- alternative_names:
- - "_param_200095"
- 200096:
- name: "Experimental product"
- alternative_names:
- - "_param_200096"
- 200097:
- name: "Experimental product"
- alternative_names:
- - "_param_200097"
- 200098:
- name: "Experimental product"
- alternative_names:
- - "_param_200098"
- 200099:
- name: "Experimental product"
- alternative_names:
- - "_param_200099"
- 200100:
- name: "Experimental product"
- alternative_names:
- - "_param_200100"
- 200101:
- name: "Experimental product"
- alternative_names:
- - "_param_200101"
- 200102:
- name: "Experimental product"
- alternative_names:
- - "_param_200102"
- 200103:
- name: "Experimental product"
- alternative_names:
- - "_param_200103"
- 200104:
- name: "Experimental product"
- alternative_names:
- - "_param_200104"
- 200105:
- name: "Experimental product"
- alternative_names:
- - "_param_200105"
- 200106:
- name: "Experimental product"
- alternative_names:
- - "_param_200106"
- 200107:
- name: "Experimental product"
- alternative_names:
- - "_param_200107"
- 200108:
- name: "Experimental product"
- alternative_names:
- - "_param_200108"
- 200109:
- name: "Experimental product"
- alternative_names:
- - "_param_200109"
- 200110:
- name: "Experimental product"
- alternative_names:
- - "_param_200110"
- 200111:
- name: "Experimental product"
- alternative_names:
- - "_param_200111"
- 200112:
- name: "Experimental product"
- alternative_names:
- - "_param_200112"
- 200113:
- name: "Experimental product"
- alternative_names:
- - "_param_200113"
- 200114:
- name: "Experimental product"
- alternative_names:
- - "_param_200114"
- 200115:
- name: "Experimental product"
- alternative_names:
- - "_param_200115"
- 200116:
- name: "Experimental product"
- alternative_names:
- - "_param_200116"
- 200117:
- name: "Experimental product"
- alternative_names:
- - "_param_200117"
- 200118:
- name: "Experimental product"
- alternative_names:
- - "_param_200118"
- 200119:
- name: "Experimental product"
- alternative_names:
- - "_param_200119"
- 200120:
- name: "Experimental product"
- alternative_names:
- - "_param_200120"
- 200121:
- name: "Maximum temperature at 2 metres difference"
- alternative_names:
- - "mx2t6diff"
- 200122:
- name: "Minimum temperature at 2 metres difference"
- alternative_names:
- - "mn2t6diff"
- 200123:
- name: "10 metre wind gust in the last 6 hours difference"
- alternative_names:
- - "10fg6diff"
- 200125:
- name: "Vertically integrated total energy"
- alternative_names:
- - "_param_200125"
- 200126:
- name: "Generic parameter for sensitive area prediction"
- alternative_names:
- - "_param_200126"
- 200127:
- name: "Atmospheric tide difference"
- alternative_names:
- - "atdiff"
- 200128:
- name: "Budget values difference"
- alternative_names:
- - "bvdiff"
- 200129:
- name: "Geopotential difference"
- alternative_names:
- - "zdiff"
- 200130:
- name: "Temperature difference"
- alternative_names:
- - "tdiff"
- 200131:
- name: "U component of wind difference"
- alternative_names:
- - "udiff"
- 200132:
- name: "V component of wind difference"
- alternative_names:
- - "vdiff"
- 200133:
- name: "Specific humidity difference"
- alternative_names:
- - "qdiff"
- 200134:
- name: "Surface pressure difference"
- alternative_names:
- - "spdiff"
- 200135:
- name: "Vertical velocity (pressure) difference"
- alternative_names:
- - "wdiff"
- 200136:
- name: "Total column water difference"
- alternative_names:
- - "tcwdiff"
- 200137:
- name: "Total column water vapour difference"
- alternative_names:
- - "tcwvdiff"
- 200138:
- name: "Vorticity (relative) difference"
- alternative_names:
- - "vodiff"
- 200139:
- name: "Soil temperature level 1 difference"
- alternative_names:
- - "stl1diff"
- 200140:
- name: "Soil wetness level 1 difference"
- alternative_names:
- - "swl1diff"
- 200141:
- name: "Snow depth difference"
- alternative_names:
- - "sddiff"
- 200142:
- name: "Stratiform precipitation (large-scale precipitation) difference"
- alternative_names:
- - "lspdiff"
- 200143:
- name: "Convective precipitation difference"
- alternative_names:
- - "cpdiff"
- 200144:
- name: "Snowfall (convective + stratiform) difference"
- alternative_names:
- - "sfdiff"
- 200145:
- name: "Boundary layer dissipation difference"
- alternative_names:
- - "blddiff"
- 200146:
- name: "Surface sensible heat flux difference"
- alternative_names:
- - "sshfdiff"
- 200147:
- name: "Surface latent heat flux difference"
- alternative_names:
- - "slhfdiff"
- 200148:
- name: "Charnock difference"
- alternative_names:
- - "chnkdiff"
- 200149:
- name: "Surface net radiation difference"
- alternative_names:
- - "snrdiff"
- 200150:
- name: "Top net radiation difference"
- alternative_names:
- - "tnrdiff"
- 200151:
- name: "Mean sea level pressure difference"
- alternative_names:
- - "msldiff"
- 200152:
- name: "Logarithm of surface pressure difference"
- alternative_names:
- - "lnspdiff"
- 200153:
- name: "Short-wave heating rate difference"
- alternative_names:
- - "swhrdiff"
- 200154:
- name: "Long-wave heating rate difference"
- alternative_names:
- - "lwhrdiff"
- 200155:
- name: "Divergence difference"
- alternative_names:
- - "ddiff"
- 200156:
- name: "Height difference"
- alternative_names:
- - "ghdiff"
- 200157:
- name: "Relative humidity difference"
- alternative_names:
- - "rdiff"
- 200158:
- name: "Tendency of surface pressure difference"
- alternative_names:
- - "tspdiff"
- 200159:
- name: "Boundary layer height difference"
- alternative_names:
- - "blhdiff"
- 200160:
- name: "Standard deviation of orography difference"
- alternative_names:
- - "sdordiff"
- 200161:
- name: "Anisotropy of sub-gridscale orography difference"
- alternative_names:
- - "isordiff"
- 200162:
- name: "Angle of sub-gridscale orography difference"
- alternative_names:
- - "anordiff"
- 200163:
- name: "Slope of sub-gridscale orography difference"
- alternative_names:
- - "slordiff"
- 200164:
- name: "Total cloud cover difference"
- alternative_names:
- - "tccdiff"
- 200165:
- name: "10 metre u wind component difference"
- alternative_names:
- - "10udiff"
- 200166:
- name: "10 metre v wind component difference"
- alternative_names:
- - "10vdiff"
- 200167:
- name: "2 metre temperature difference"
- alternative_names:
- - "2tdiff"
- 200168:
- name: "2 metre dewpoint temperature difference"
- alternative_names:
- - "2ddiff"
- 200169:
- name: "Surface solar radiation downwards difference"
- alternative_names:
- - "ssrddiff"
- 200170:
- name: "Soil temperature level 2 difference"
- alternative_names:
- - "stl2diff"
- 200171:
- name: "Soil wetness level 2 difference"
- alternative_names:
- - "swl2diff"
- 200172:
- name: "Land-sea mask difference"
- alternative_names:
- - "lsmdiff"
- 200173:
- name: "Surface roughness difference"
- alternative_names:
- - "srdiff"
- 200174:
- name: "Albedo difference"
- alternative_names:
- - "aldiff"
- 200175:
- name: "Surface thermal radiation downwards difference"
- alternative_names:
- - "strddiff"
- 200176:
- name: "Surface net solar radiation difference"
- alternative_names:
- - "ssrdiff"
- 200177:
- name: "Surface net thermal radiation difference"
- alternative_names:
- - "strdiff"
- 200178:
- name: "Top net solar radiation difference"
- alternative_names:
- - "tsrdiff"
- 200179:
- name: "Top net thermal radiation difference"
- alternative_names:
- - "ttrdiff"
- 200180:
- name: "East-west surface stress difference"
- alternative_names:
- - "ewssdiff"
- 200181:
- name: "North-south surface stress difference"
- alternative_names:
- - "nsssdiff"
- 200182:
- name: "Evaporation difference"
- alternative_names:
- - "ediff"
- 200183:
- name: "Soil temperature level 3 difference"
- alternative_names:
- - "stl3diff"
- 200184:
- name: "Soil wetness level 3 difference"
- alternative_names:
- - "swl3diff"
- 200185:
- name: "Convective cloud cover difference"
- alternative_names:
- - "cccdiff"
- 200186:
- name: "Low cloud cover difference"
- alternative_names:
- - "lccdiff"
- 200187:
- name: "Medium cloud cover difference"
- alternative_names:
- - "mccdiff"
- 200188:
- name: "High cloud cover difference"
- alternative_names:
- - "hccdiff"
- 200189:
- name: "Sunshine duration difference"
- alternative_names:
- - "sunddiff"
- 200190:
- name: "East-west component of sub-gridscale orographic variance difference"
- alternative_names:
- - "ewovdiff"
- 200191:
- name: "North-south component of sub-gridscale orographic variance difference"
- alternative_names:
- - "nsovdiff"
- 200192:
- name: "North-west/south-east component of sub-gridscale orographic variance difference"
- alternative_names:
- - "nwovdiff"
- 200193:
- name: "North-east/south-west component of sub-gridscale orographic variance difference"
- alternative_names:
- - "neovdiff"
- 200194:
- name: "Brightness temperature difference"
- alternative_names:
- - "btmpdiff"
- 200195:
- name: "Longitudinal component of gravity wave stress difference"
- alternative_names:
- - "lgwsdiff"
- 200196:
- name: "Meridional component of gravity wave stress difference"
- alternative_names:
- - "mgwsdiff"
- 200197:
- name: "Gravity wave dissipation difference"
- alternative_names:
- - "gwddiff"
- 200198:
- name: "Skin reservoir content difference"
- alternative_names:
- - "srcdiff"
- 200199:
- name: "Vegetation fraction difference"
- alternative_names:
- - "vegdiff"
- 200200:
- name: "Variance of sub-gridscale orography difference"
- alternative_names:
- - "vsodiff"
- 200201:
- name: "Maximum temperature at 2 metres since previous post-processing difference"
- alternative_names:
- - "mx2tdiff"
- 200202:
- name: "Minimum temperature at 2 metres since previous post-processing difference"
- alternative_names:
- - "mn2tdiff"
- 200203:
- name: "Ozone mass mixing ratio difference"
- alternative_names:
- - "o3diff"
- 200204:
- name: "Precipitation analysis weights difference"
- alternative_names:
- - "pawdiff"
- 200205:
- name: "Runoff difference"
- alternative_names:
- - "rodiff"
- 200206:
- name: "Total column ozone difference"
- alternative_names:
- - "tco3diff"
- 200207:
- name: "10 metre wind speed difference"
- alternative_names:
- - "10sidiff"
- 200208:
- name: "Top net solar radiation, clear sky difference"
- alternative_names:
- - "tsrcdiff"
- 200209:
- name: "Top net thermal radiation, clear sky difference"
- alternative_names:
- - "ttrcdiff"
- 200210:
- name: "Surface net solar radiation, clear sky difference"
- alternative_names:
- - "ssrcdiff"
- 200211:
- name: "Surface net thermal radiation, clear sky difference"
- alternative_names:
- - "strcdiff"
- 200212:
- name: "Toa incident solar radiation difference"
- alternative_names:
- - "tisrdiff"
- 200214:
- name: "Diabatic heating by radiation difference"
- alternative_names:
- - "dhrdiff"
- 200215:
- name: "Diabatic heating by vertical diffusion difference"
- alternative_names:
- - "dhvddiff"
- 200216:
- name: "Diabatic heating by cumulus convection difference"
- alternative_names:
- - "dhccdiff"
- 200217:
- name: "Diabatic heating large-scale condensation difference"
- alternative_names:
- - "dhlcdiff"
- 200218:
- name: "Vertical diffusion of zonal wind difference"
- alternative_names:
- - "vdzwdiff"
- 200219:
- name: "Vertical diffusion of meridional wind difference"
- alternative_names:
- - "vdmwdiff"
- 200220:
- name: "East-west gravity wave drag tendency difference"
- alternative_names:
- - "ewgddiff"
- 200221:
- name: "North-south gravity wave drag tendency difference"
- alternative_names:
- - "nsgddiff"
- 200222:
- name: "Convective tendency of zonal wind difference"
- alternative_names:
- - "ctzwdiff"
- 200223:
- name: "Convective tendency of meridional wind difference"
- alternative_names:
- - "ctmwdiff"
- 200224:
- name: "Vertical diffusion of humidity difference"
- alternative_names:
- - "vdhdiff"
- 200225:
- name: "Humidity tendency by cumulus convection difference"
- alternative_names:
- - "htccdiff"
- 200226:
- name: "Humidity tendency by large-scale condensation difference"
- alternative_names:
- - "htlcdiff"
- 200227:
- name: "Change from removal of negative humidity difference"
- alternative_names:
- - "crnhdiff"
- 200228:
- name: "Total precipitation difference"
- alternative_names:
- - "tpdiff"
- 200229:
- name: "Instantaneous x surface stress difference"
- alternative_names:
- - "iewsdiff"
- 200230:
- name: "Instantaneous y surface stress difference"
- alternative_names:
- - "inssdiff"
- 200231:
- name: "Instantaneous surface heat flux difference"
- alternative_names:
- - "ishfdiff"
- 200232:
- name: "Instantaneous moisture flux difference"
- alternative_names:
- - "iediff"
- 200233:
- name: "Apparent surface humidity difference"
- alternative_names:
- - "asqdiff"
- 200234:
- name: "Logarithm of surface roughness length for heat difference"
- alternative_names:
- - "lsrhdiff"
- 200235:
- name: "Skin temperature difference"
- alternative_names:
- - "sktdiff"
- 200236:
- name: "Soil temperature level 4 difference"
- alternative_names:
- - "stl4diff"
- 200237:
- name: "Soil wetness level 4 difference"
- alternative_names:
- - "swl4diff"
- 200238:
- name: "Temperature of snow layer difference"
- alternative_names:
- - "tsndiff"
- 200239:
- name: "Convective snowfall difference"
- alternative_names:
- - "csfdiff"
- 200240:
- name: "Large scale snowfall difference"
- alternative_names:
- - "lsfdiff"
- 200241:
- name: "Accumulated cloud fraction tendency difference"
- alternative_names:
- - "acfdiff"
- 200242:
- name: "Accumulated liquid water tendency difference"
- alternative_names:
- - "alwdiff"
- 200243:
- name: "Forecast albedo difference"
- alternative_names:
- - "faldiff"
- 200244:
- name: "Forecast surface roughness difference"
- alternative_names:
- - "fsrdiff"
- 200245:
- name: "Forecast logarithm of surface roughness for heat difference"
- alternative_names:
- - "flsrdiff"
- 200246:
- name: "Specific cloud liquid water content difference"
- alternative_names:
- - "clwcdiff"
- 200247:
- name: "Specific cloud ice water content difference"
- alternative_names:
- - "ciwcdiff"
- 200248:
- name: "Cloud cover difference"
- alternative_names:
- - "ccdiff"
- 200249:
- name: "Accumulated ice water tendency difference"
- alternative_names:
- - "aiwdiff"
- 200250:
- name: "Ice age difference"
- alternative_names:
- - "icediff"
- 200251:
- name: "Adiabatic tendency of temperature difference"
- alternative_names:
- - "attediff"
- 200252:
- name: "Adiabatic tendency of humidity difference"
- alternative_names:
- - "athediff"
- 200253:
- name: "Adiabatic tendency of zonal wind difference"
- alternative_names:
- - "atzediff"
- 200254:
- name: "Adiabatic tendency of meridional wind difference"
- alternative_names:
- - "atmwdiff"
- 200255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_200255"
- 201001:
- name: "Downward shortwave radiant flux density"
- alternative_names:
- - "_param_201001"
- 201002:
- name: "Upward shortwave radiant flux density"
- alternative_names:
- - "_param_201002"
- 201003:
- name: "Downward longwave radiant flux density"
- alternative_names:
- - "_param_201003"
- 201004:
- name: "Upward longwave radiant flux density"
- alternative_names:
- - "_param_201004"
- 201005:
- name: "Downwd photosynthetic active radiant flux density"
- alternative_names:
- - "apab_s"
- 201006:
- name: "Net shortwave flux"
- alternative_names:
- - "_param_201006"
- 201007:
- name: "Net longwave flux"
- alternative_names:
- - "_param_201007"
- 201008:
- name: "Total net radiative flux density"
- alternative_names:
- - "_param_201008"
- 201009:
- name: "Downw shortw radiant flux density, cloudfree part"
- alternative_names:
- - "_param_201009"
- 201010:
- name: "Upw shortw radiant flux density, cloudy part"
- alternative_names:
- - "_param_201010"
- 201011:
- name: "Downw longw radiant flux density, cloudfree part"
- alternative_names:
- - "_param_201011"
- 201012:
- name: "Upw longw radiant flux density, cloudy part"
- alternative_names:
- - "_param_201012"
- 201013:
- name: "Shortwave radiative heating rate"
- alternative_names:
- - "sohr_rad"
- 201014:
- name: "Longwave radiative heating rate"
- alternative_names:
- - "thhr_rad"
- 201015:
- name: "Total radiative heating rate"
- alternative_names:
- - "_param_201015"
- 201016:
- name: "Soil heat flux, surface"
- alternative_names:
- - "_param_201016"
- 201017:
- name: "Soil heat flux, bottom of layer"
- alternative_names:
- - "_param_201017"
- 201029:
- name: "Fractional cloud cover"
- alternative_names:
- - "clc"
- 201030:
- name: "Cloud cover, grid scale"
- alternative_names:
- - "_param_201030"
- 201031:
- name: "Specific cloud water content"
- alternative_names:
- - "qc"
- 201032:
- name: "Cloud water content, grid scale, vert integrated"
- alternative_names:
- - "_param_201032"
- 201033:
- name: "Specific cloud ice content, grid scale"
- alternative_names:
- - "qi"
- 201034:
- name: "Cloud ice content, grid scale, vert integrated"
- alternative_names:
- - "_param_201034"
- 201035:
- name: "Specific rainwater content, grid scale"
- alternative_names:
- - "_param_201035"
- 201036:
- name: "Specific snow content, grid scale"
- alternative_names:
- - "_param_201036"
- 201037:
- name: "Specific rainwater content, gs, vert. integrated"
- alternative_names:
- - "_param_201037"
- 201038:
- name: "Specific snow content, gs, vert. integrated"
- alternative_names:
- - "_param_201038"
- 201041:
- name: "Total column water"
- alternative_names:
- - "twater"
- 201042:
- name: "Vert. integral of divergence of tot. water content"
- alternative_names:
- - "_param_201042"
- 201050:
- name: "Cloud covers ch_cm_cl (000...888)"
- alternative_names:
- - "ch_cm_cl"
- 201051:
- name: "Cloud cover ch (0..8)"
- alternative_names:
- - "_param_201051"
- 201052:
- name: "Cloud cover cm (0..8)"
- alternative_names:
- - "_param_201052"
- 201053:
- name: "Cloud cover cl (0..8)"
- alternative_names:
- - "_param_201053"
- 201054:
- name: "Total cloud cover (0..8)"
- alternative_names:
- - "_param_201054"
- 201055:
- name: "Fog (0..8)"
- alternative_names:
- - "_param_201055"
- 201056:
- name: "Fog"
- alternative_names:
- - "_param_201056"
- 201060:
- name: "Cloud cover, convective cirrus"
- alternative_names:
- - "_param_201060"
- 201061:
- name: "Specific cloud water content, convective clouds"
- alternative_names:
- - "_param_201061"
- 201062:
- name: "Cloud water content, conv clouds, vert integrated"
- alternative_names:
- - "_param_201062"
- 201063:
- name: "Specific cloud ice content, convective clouds"
- alternative_names:
- - "_param_201063"
- 201064:
- name: "Cloud ice content, conv clouds, vert integrated"
- alternative_names:
- - "_param_201064"
- 201065:
- name: "Convective mass flux"
- alternative_names:
- - "_param_201065"
- 201066:
- name: "Updraft velocity, convection"
- alternative_names:
- - "_param_201066"
- 201067:
- name: "Entrainment parameter, convection"
- alternative_names:
- - "_param_201067"
- 201068:
- name: "Cloud base, convective clouds (above msl)"
- alternative_names:
- - "hbas_con"
- 201069:
- name: "Cloud top, convective clouds (above msl)"
- alternative_names:
- - "htop_con"
- 201070:
- name: "Convective layers (00...77) (bke)"
- alternative_names:
- - "_param_201070"
- 201071:
- name: "Ko-index"
- alternative_names:
- - "_param_201071"
- 201072:
- name: "Convection base index"
- alternative_names:
- - "bas_con"
- 201073:
- name: "Convection top index"
- alternative_names:
- - "top_con"
- 201074:
- name: "Convective temperature tendency"
- alternative_names:
- - "dt_con"
- 201075:
- name: "Convective tendency of specific humidity"
- alternative_names:
- - "dqv_con"
- 201076:
- name: "Convective tendency of total heat"
- alternative_names:
- - "_param_201076"
- 201077:
- name: "Convective tendency of total water"
- alternative_names:
- - "_param_201077"
- 201078:
- name: "Convective momentum tendency (x-component)"
- alternative_names:
- - "du_con"
- 201079:
- name: "Convective momentum tendency (y-component)"
- alternative_names:
- - "dv_con"
- 201080:
- name: "Convective vorticity tendency"
- alternative_names:
- - "_param_201080"
- 201081:
- name: "Convective divergence tendency"
- alternative_names:
- - "_param_201081"
- 201082:
- name: "Top of dry convection (above msl)"
- alternative_names:
- - "htop_dc"
- 201083:
- name: "Dry convection top index"
- alternative_names:
- - "_param_201083"
- 201084:
- name: "Height of 0 degree celsius isotherm above msl"
- alternative_names:
- - "hzerocl"
- 201085:
- name: "Height of snow-fall limit"
- alternative_names:
- - "snowlmt"
- 201099:
- name: "Spec. content of precip. particles"
- alternative_names:
- - "qrs_gsp"
- 201100:
- name: "Surface precipitation rate, rain, grid scale"
- alternative_names:
- - "prr_gsp"
- 201101:
- name: "Surface precipitation rate, snow, grid scale"
- alternative_names:
- - "prs_gsp"
- 201102:
- name: "Surface precipitation amount, rain, grid scale"
- alternative_names:
- - "rain_gsp"
- 201111:
- name: "Surface precipitation rate, rain, convective"
- alternative_names:
- - "prr_con"
- 201112:
- name: "Surface precipitation rate, snow, convective"
- alternative_names:
- - "prs_con"
- 201113:
- name: "Surface precipitation amount, rain, convective"
- alternative_names:
- - "rain_con"
- 201139:
- name: "Deviation of pressure from reference value"
- alternative_names:
- - "pp"
- 201150:
- name: "Coefficient of horizontal diffusion"
- alternative_names:
- - "_param_201150"
- 201187:
- name: "Maximum wind velocity"
- alternative_names:
- - "vmax_10m"
- 201200:
- name: "Water content of interception store"
- alternative_names:
- - "w_i"
- 201203:
- name: "Snow temperature"
- alternative_names:
- - "t_snow"
- 201215:
- name: "Ice surface temperature"
- alternative_names:
- - "t_ice"
- 201241:
- name: "Convective available potential energy"
- alternative_names:
- - "cape_con"
- 201255:
- name: "Indicates a missing value"
- alternative_names:
- - "_param_201255"
- 210001:
- name: "Sea salt aerosol (0.03 - 0.5 um) mixing ratio"
- alternative_names:
- - "aermr01"
- 210002:
- name: "Sea salt aerosol (0.5 - 5 um) mixing ratio"
- alternative_names:
- - "aermr02"
- 210003:
- name: "Sea salt aerosol (5 - 20 um) mixing ratio"
- alternative_names:
- - "aermr03"
- 210004:
- name: "Dust aerosol (0.03 - 0.55 um) mixing ratio"
- alternative_names:
- - "aermr04"
- 210005:
- name: "Dust aerosol (0.55 - 0.9 um) mixing ratio"
- alternative_names:
- - "aermr05"
- 210006:
- name: "Dust aerosol (0.9 - 20 um) mixing ratio"
- alternative_names:
- - "aermr06"
- 210007:
- name: "Hydrophilic organic matter aerosol mixing ratio"
- alternative_names:
- - "aermr07"
- 210008:
- name: "Hydrophobic organic matter aerosol mixing ratio"
- alternative_names:
- - "aermr08"
- 210009:
- name: "Hydrophilic black carbon aerosol mixing ratio"
- alternative_names:
- - "aermr09"
- 210010:
- name: "Hydrophobic black carbon aerosol mixing ratio"
- alternative_names:
- - "aermr10"
- 210011:
- name: "Sulphate aerosol mixing ratio"
- alternative_names:
- - "aermr11"
- 210012:
- name: "So2 precursor mixing ratio"
- alternative_names:
- - "aermr12"
- 210013:
- name: "Volcanic ash aerosol mixing ratio"
- alternative_names:
- - "aermr13"
- 210014:
- name: "Volcanic sulphate aerosol mixing ratio"
- alternative_names:
- - "aermr14"
- 210015:
- name: "Volcanic so2 precursor mixing ratio"
- alternative_names:
- - "aermr15"
- 210016:
- name: "Aerosol type 1 source/gain accumulated"
- alternative_names:
- - "aergn01"
- 210017:
- name: "Aerosol type 2 source/gain accumulated"
- alternative_names:
- - "aergn02"
- 210018:
- name: "Aerosol type 3 source/gain accumulated"
- alternative_names:
- - "aergn03"
- 210019:
- name: "Aerosol type 4 source/gain accumulated"
- alternative_names:
- - "aergn04"
- 210020:
- name: "Aerosol type 5 source/gain accumulated"
- alternative_names:
- - "aergn05"
- 210021:
- name: "Aerosol type 6 source/gain accumulated"
- alternative_names:
- - "aergn06"
- 210022:
- name: "Aerosol type 7 source/gain accumulated"
- alternative_names:
- - "aergn07"
- 210023:
- name: "Aerosol type 8 source/gain accumulated"
- alternative_names:
- - "aergn08"
- 210024:
- name: "Aerosol type 9 source/gain accumulated"
- alternative_names:
- - "aergn09"
- 210025:
- name: "Aerosol type 10 source/gain accumulated"
- alternative_names:
- - "aergn10"
- 210026:
- name: "Aerosol type 11 source/gain accumulated"
- alternative_names:
- - "aergn11"
- 210027:
- name: "Aerosol type 12 source/gain accumulated"
- alternative_names:
- - "aergn12"
- 210028:
- name: "So4 aerosol precursor mass mixing ratio"
- alternative_names:
- - "aerpr03"
- 210029:
- name: "Water vapour mixing ratio for hydrophilic aerosols in mode 1"
- alternative_names:
- - "aerwv01"
- 210030:
- name: "Water vapour mixing ratio for hydrophilic aerosols in mode 2"
- alternative_names:
- - "aerwv02"
- 210031:
- name: "Aerosol type 1 sink/loss accumulated"
- alternative_names:
- - "aerls01"
- 210032:
- name: "Aerosol type 2 sink/loss accumulated"
- alternative_names:
- - "aerls02"
- 210033:
- name: "Aerosol type 3 sink/loss accumulated"
- alternative_names:
- - "aerls03"
- 210034:
- name: "Aerosol type 4 sink/loss accumulated"
- alternative_names:
- - "aerls04"
- 210035:
- name: "Aerosol type 5 sink/loss accumulated"
- alternative_names:
- - "aerls05"
- 210036:
- name: "Aerosol type 6 sink/loss accumulated"
- alternative_names:
- - "aerls06"
- 210037:
- name: "Aerosol type 7 sink/loss accumulated"
- alternative_names:
- - "aerls07"
- 210038:
- name: "Aerosol type 8 sink/loss accumulated"
- alternative_names:
- - "aerls08"
- 210039:
- name: "Aerosol type 9 sink/loss accumulated"
- alternative_names:
- - "aerls09"
- 210040:
- name: "Aerosol type 10 sink/loss accumulated"
- alternative_names:
- - "aerls10"
- 210041:
- name: "Aerosol type 11 sink/loss accumulated"
- alternative_names:
- - "aerls11"
- 210042:
- name: "Aerosol type 12 sink/loss accumulated"
- alternative_names:
- - "aerls12"
- 210043:
- name: "Dms surface emission"
- alternative_names:
- - "emdms"
- 210044:
- name: "Water vapour mixing ratio for hydrophilic aerosols in mode 3"
- alternative_names:
- - "aerwv03"
- 210045:
- name: "Water vapour mixing ratio for hydrophilic aerosols in mode 4"
- alternative_names:
- - "aerwv04"
- 210046:
- name: "Aerosol precursor mixing ratio"
- alternative_names:
- - "aerpr"
- 210047:
- name: "Aerosol small mode mixing ratio"
- alternative_names:
- - "aersm"
- 210048:
- name: "Aerosol large mode mixing ratio"
- alternative_names:
- - "aerlg"
- 210049:
- name: "Aerosol precursor optical depth"
- alternative_names:
- - "aodpr"
- 210050:
- name: "Aerosol small mode optical depth"
- alternative_names:
- - "aodsm"
- 210051:
- name: "Aerosol large mode optical depth"
- alternative_names:
- - "aodlg"
- 210052:
- name: "Dust emission potential"
- alternative_names:
- - "aerdep"
- 210053:
- name: "Lifting threshold speed"
- alternative_names:
- - "aerlts"
- 210054:
- name: "Soil clay content"
- alternative_names:
- - "aerscc"
- 210055:
- name: "Experimental product"
- alternative_names:
- - "_param_210055"
- 210056:
- name: "Experimental product"
- alternative_names:
- - "_param_210056"
- 210057:
- name: "Mixing ration of organic carbon aerosol, nucleation mode"
- alternative_names:
- - "ocnuc"
- 210058:
- name: "Monoterpene precursor mixing ratio"
- alternative_names:
- - "monot"
- 210059:
- name: "Secondary organic precursor mixing ratio"
- alternative_names:
- - "soapr"
- 210060:
- name: "Injection height (from is4fires)"
- alternative_names:
- - "injh"
- 210061:
- name: "Carbon dioxide mass mixing ratio"
- alternative_names:
- - "co2"
- 210062:
- name: "Methane"
- alternative_names:
- - "ch4"
- 210063:
- name: "Nitrous oxide"
- alternative_names:
- - "n2o"
- 210064:
- name: "Co2 column-mean molar fraction"
- alternative_names:
- - "tcco2"
- 210065:
- name: "Ch4 column-mean molar fraction"
- alternative_names:
- - "tcch4"
- 210066:
- name: "Total column nitrous oxide"
- alternative_names:
- - "tcn2o"
- 210067:
- name: "Ocean flux of carbon dioxide"
- alternative_names:
- - "co2of"
- 210068:
- name: "Natural biosphere flux of carbon dioxide"
- alternative_names:
- - "co2nbf"
- 210069:
- name: "Anthropogenic emissions of carbon dioxide"
- alternative_names:
- - "co2apf"
- 210070:
- name: "Methane surface fluxes"
- alternative_names:
- - "ch4f"
- 210071:
- name: "Methane loss rate due to radical hydroxyl (oh)"
- alternative_names:
- - "kch4"
- 210072:
- name: "Particulate matter d <= 1 um"
- alternative_names:
- - "pm1"
- 210073:
- name: "Particulate matter d <= 2.5 um"
- alternative_names:
- - "pm2p5"
- 210074:
- name: "Particulate matter d <= 10 um"
- alternative_names:
- - "pm10"
- 210079:
- name: "Wildfire viewing angle of observation"
- alternative_names:
- - "vafire"
- 210080:
- name: "Wildfire flux of carbon dioxide"
- alternative_names:
- - "co2fire"
- 210081:
- name: "Wildfire flux of carbon monoxide"
- alternative_names:
- - "cofire"
- 210082:
- name: "Wildfire flux of methane"
- alternative_names:
- - "ch4fire"
- 210083:
- name: "Wildfire flux of non-methane hydro-carbons"
- alternative_names:
- - "nmhcfire"
- 210084:
- name: "Wildfire flux of hydrogen"
- alternative_names:
- - "h2fire"
- 210085:
- name: "Wildfire flux of nitrogen oxides nox"
- alternative_names:
- - "noxfire"
- 210086:
- name: "Wildfire flux of nitrous oxide"
- alternative_names:
- - "n2ofire"
- 210087:
- name: "Wildfire flux of particulate matter pm2.5"
- alternative_names:
- - "pm2p5fire"
- 210088:
- name: "Wildfire flux of total particulate matter"
- alternative_names:
- - "tpmfire"
- 210089:
- name: "Wildfire flux of total carbon in aerosols"
- alternative_names:
- - "tcfire"
- 210090:
- name: "Wildfire flux of organic carbon"
- alternative_names:
- - "ocfire"
- 210091:
- name: "Wildfire flux of black carbon"
- alternative_names:
- - "bcfire"
- 210092:
- name: "Wildfire overall flux of burnt carbon"
- alternative_names:
- - "cfire"
- 210093:
- name: "Wildfire fraction of c4 plants"
- alternative_names:
- - "c4ffire"
- 210094:
- name: "Wildfire vegetation map index"
- alternative_names:
- - "vegfire"
- 210095:
- name: "Wildfire combustion completeness"
- alternative_names:
- - "ccfire"
- 210096:
- name: "Wildfire fuel load: carbon per unit area"
- alternative_names:
- - "flfire"
- 210097:
- name: "Wildfire fraction of area observed"
- alternative_names:
- - "offire"
- 210098:
- name: "Number of positive frp pixels per grid cell"
- alternative_names:
- - "nofrp"
- 210099:
- name: "Wildfire radiative power"
- alternative_names:
- - "frpfire"
- 210100:
- name: "Wildfire combustion rate"
- alternative_names:
- - "crfire"
- 210101:
- name: "Wildfire radiative power maximum"
- alternative_names:
- - "maxfrpfire"
- 210102:
- name: "Wildfire flux of sulfur dioxide"
- alternative_names:
- - "so2fire"
- 210103:
- name: "Wildfire flux of methanol (ch3oh)"
- alternative_names:
- - "ch3ohfire"
- 210104:
- name: "Wildfire flux of ethanol (c2h5oh)"
- alternative_names:
- - "c2h5ohfire"
- 210105:
- name: "Wildfire flux of propane (c3h8)"
- alternative_names:
- - "c3h8fire"
- 210106:
- name: "Wildfire flux of ethene (c2h4)"
- alternative_names:
- - "c2h4fire"
- 210107:
- name: "Wildfire flux of propene (c3h6)"
- alternative_names:
- - "c3h6fire"
- 210108:
- name: "Wildfire flux of isoprene (c5h8)"
- alternative_names:
- - "c5h8fire"
- 210109:
- name: "Wildfire flux of terpenes (c5h8)n"
- alternative_names:
- - "terpenesfire"
- 210110:
- name: "Wildfire flux of toluene_lump (c7h8+ c6h6 + c8h10)"
- alternative_names:
- - "toluenefire"
- 210111:
- name: "Wildfire flux of higher alkenes (cnh2n, c>=4)"
- alternative_names:
- - "hialkenesfire"
- 210112:
- name: "Wildfire flux of higher alkanes (cnh2n+2, c>=4)"
- alternative_names:
- - "hialkanesfire"
- 210113:
- name: "Wildfire flux of formaldehyde (ch2o)"
- alternative_names:
- - "ch2ofire"
- 210114:
- name: "Wildfire flux of acetaldehyde (c2h4o)"
- alternative_names:
- - "c2h4ofire"
- 210115:
- name: "Wildfire flux of acetone (c3h6o)"
- alternative_names:
- - "c3h6ofire"
- 210116:
- name: "Wildfire flux of ammonia (nh3)"
- alternative_names:
- - "nh3fire"
- 210117:
- name: "Wildfire flux of dimethyl sulfide (dms) (c2h6s)"
- alternative_names:
- - "c2h6sfire"
- 210118:
- name: "Wildfire flux of ethane (c2h6)"
- alternative_names:
- - "c2h6fire"
- 210119:
- name: "Mean height of maximum injection"
- alternative_names:
- - "mami"
- 210120:
- name: "Plume top height above surface"
- alternative_names:
- - "apt"
- 210121:
- name: "Nitrogen dioxide mass mixing ratio"
- alternative_names:
- - "no2"
- 210122:
- name: "Sulphur dioxide mass mixing ratio"
- alternative_names:
- - "so2"
- 210123:
- name: "Carbon monoxide mass mixing ratio"
- alternative_names:
- - "co"
- 210124:
- name: "Formaldehyde"
- alternative_names:
- - "hcho"
- 210125:
- name: "Total column nitrogen dioxide"
- alternative_names:
- - "tcno2"
- 210126:
- name: "Total column sulphur dioxide"
- alternative_names:
- - "tcso2"
- 210127:
- name: "Total column carbon monoxide"
- alternative_names:
- - "tcco"
- 210128:
- name: "Total column formaldehyde"
- alternative_names:
- - "tchcho"
- 210129:
- name: "Nitrogen oxides"
- alternative_names:
- - "nox"
- 210130:
- name: "Total column nitrogen oxides"
- alternative_names:
- - "tcnox"
- 210131:
- name: "Reactive tracer 1 mass mixing ratio"
- alternative_names:
- - "grg1"
- 210132:
- name: "Total column grg tracer 1"
- alternative_names:
- - "tcgrg1"
- 210133:
- name: "Reactive tracer 2 mass mixing ratio"
- alternative_names:
- - "grg2"
- 210134:
- name: "Total column grg tracer 2"
- alternative_names:
- - "tcgrg2"
- 210135:
- name: "Reactive tracer 3 mass mixing ratio"
- alternative_names:
- - "grg3"
- 210136:
- name: "Total column grg tracer 3"
- alternative_names:
- - "tcgrg3"
- 210137:
- name: "Reactive tracer 4 mass mixing ratio"
- alternative_names:
- - "grg4"
- 210138:
- name: "Total column grg tracer 4"
- alternative_names:
- - "tcgrg4"
- 210139:
- name: "Reactive tracer 5 mass mixing ratio"
- alternative_names:
- - "grg5"
- 210140:
- name: "Total column grg tracer 5"
- alternative_names:
- - "tcgrg5"
- 210141:
- name: "Reactive tracer 6 mass mixing ratio"
- alternative_names:
- - "grg6"
- 210142:
- name: "Total column grg tracer 6"
- alternative_names:
- - "tcgrg6"
- 210143:
- name: "Reactive tracer 7 mass mixing ratio"
- alternative_names:
- - "grg7"
- 210144:
- name: "Total column grg tracer 7"
- alternative_names:
- - "tcgrg7"
- 210145:
- name: "Reactive tracer 8 mass mixing ratio"
- alternative_names:
- - "grg8"
- 210146:
- name: "Total column grg tracer 8"
- alternative_names:
- - "tcgrg8"
- 210147:
- name: "Reactive tracer 9 mass mixing ratio"
- alternative_names:
- - "grg9"
- 210148:
- name: "Total column grg tracer 9"
- alternative_names:
- - "tcgrg9"
- 210149:
- name: "Reactive tracer 10 mass mixing ratio"
- alternative_names:
- - "grg10"
- 210150:
- name: "Total column grg tracer 10"
- alternative_names:
- - "tcgrg10"
- 210151:
- name: "Surface flux nitrogen oxides"
- alternative_names:
- - "sfnox"
- 210152:
- name: "Surface flux nitrogen dioxide"
- alternative_names:
- - "sfno2"
- 210153:
- name: "Surface flux sulphur dioxide"
- alternative_names:
- - "sfso2"
- 210154:
- name: "Surface flux carbon monoxide"
- alternative_names:
- - "sfco2"
- 210155:
- name: "Surface flux formaldehyde"
- alternative_names:
- - "sfhcho"
- 210156:
- name: "Surface flux gems ozone"
- alternative_names:
- - "sfgo3"
- 210157:
- name: "Surface flux reactive tracer 1"
- alternative_names:
- - "sfgr1"
- 210158:
- name: "Surface flux reactive tracer 2"
- alternative_names:
- - "sfgr2"
- 210159:
- name: "Surface flux reactive tracer 3"
- alternative_names:
- - "sfgr3"
- 210160:
- name: "Surface flux reactive tracer 4"
- alternative_names:
- - "sfgr4"
- 210161:
- name: "Surface flux reactive tracer 5"
- alternative_names:
- - "sfgr5"
- 210162:
- name: "Surface flux reactive tracer 6"
- alternative_names:
- - "sfgr6"
- 210163:
- name: "Surface flux reactive tracer 7"
- alternative_names:
- - "sfgr7"
- 210164:
- name: "Surface flux reactive tracer 8"
- alternative_names:
- - "sfgr8"
- 210165:
- name: "Surface flux reactive tracer 9"
- alternative_names:
- - "sfgr9"
- 210166:
- name: "Surface flux reactive tracer 10"
- alternative_names:
- - "sfgr10"
- 210167:
- name: "Wildfire day-time radiative power"
- alternative_names:
- - "frpdayfire"
- 210169:
- name: "Wildfire night-time radiative power"
- alternative_names:
- - "frpngtfire"
- 210170:
- name: "Volcanic sulfur dioxide mass mixing ratio"
- alternative_names:
- - "vso2"
- 210177:
- name: "Wildfire day-time inverse variance of radiative power"
- alternative_names:
- - "frpdayivar"
- 210179:
- name: "Wildfire night-time inverse variance of radiative power"
- alternative_names:
- - "frpngtivar"
- 210181:
- name: "Radon"
- alternative_names:
- - "ra"
- 210182:
- name: "Sulphur hexafluoride"
- alternative_names:
- - "sf6"
- 210183:
- name: "Total column radon"
- alternative_names:
- - "tcra"
- 210184:
- name: "Total column sulphur hexafluoride"
- alternative_names:
- - "tcsf6"
- 210185:
- name: "Anthropogenic emissions of sulphur hexafluoride"
- alternative_names:
- - "sf6apf"
- 210186:
- name: "Uv visible albedo for direct radiation, isotropic component (climatological)"
- alternative_names:
- - "aluvpi"
- 210187:
- name: "Uv visible albedo for direct radiation, volumetric component (climatological)"
- alternative_names:
- - "aluvpv"
- 210188:
- name: "Uv visible albedo for direct radiation, geometric component (climatological)"
- alternative_names:
- - "aluvpg"
- 210189:
- name: "Near ir albedo for direct radiation, isotropic component (climatological)"
- alternative_names:
- - "alnipi"
- 210190:
- name: "Near ir albedo for direct radiation, volumetric component (climatological)"
- alternative_names:
- - "alnipv"
- 210191:
- name: "Near ir albedo for direct radiation, geometric component (climatological)"
- alternative_names:
- - "alnipg"
- 210192:
- name: "Uv visible albedo for diffuse radiation, isotropic component (climatological)"
- alternative_names:
- - "aluvdi"
- 210193:
- name: "Uv visible albedo for diffuse radiation, volumetric component (climatological)"
- alternative_names:
- - "aluvdv"
- 210194:
- name: "Uv visible albedo for diffuse radiation, geometric component (climatological)"
- alternative_names:
- - "aluvdg"
- 210195:
- name: "Near ir albedo for diffuse radiation, isotropic component (climatological)"
- alternative_names:
- - "alnidi"
- 210196:
- name: "Near ir albedo for diffuse radiation, volumetric component (climatological)"
- alternative_names:
- - "alnidv"
- 210197:
- name: "Near ir albedo for diffuse radiation, geometric component (climatological)"
- alternative_names:
- - "alnidg"
- 210198:
- name: "Uv visible albedo for diffuse radiation (climatological)"
- alternative_names:
- - "aluvd_p"
- 210199:
- name: "Uv visible albedo for direct radiation (climatological)"
- alternative_names:
- - "aluvp_p"
- 210200:
- name: "Uv visible albedo for direct radiation, geometric component (climatological)"
- alternative_names:
- - "aluvpg_p"
- 210201:
- name: "Uv visible albedo for direct radiation, isotropic component (climatological)"
- alternative_names:
- - "aluvpi_p"
- 210202:
- name: "Uv visible albedo for direct radiation, volumetric component (climatological)"
- alternative_names:
- - "aluvpv_p"
- 210203:
- name: "Ozone mass mixing ratio (full chemistry scheme)"
- alternative_names:
- - "go3"
- 210206:
- name: "Gems total column ozone"
- alternative_names:
- - "gtco3"
- 210207:
- name: "Total aerosol optical depth at 550nm"
- alternative_names:
- - "aod550"
- 210208:
- name: "Sea salt aerosol optical depth at 550nm"
- alternative_names:
- - "ssaod550"
- 210209:
- name: "Dust aerosol optical depth at 550nm"
- alternative_names:
- - "duaod550"
- 210210:
- name: "Organic matter aerosol optical depth at 550nm"
- alternative_names:
- - "omaod550"
- 210211:
- name: "Black carbon aerosol optical depth at 550nm"
- alternative_names:
- - "bcaod550"
- 210212:
- name: "Sulphate aerosol optical depth at 550nm"
- alternative_names:
- - "suaod550"
- 210213:
- name: "Total aerosol optical depth at 469nm"
- alternative_names:
- - "aod469"
- 210214:
- name: "Total aerosol optical depth at 670nm"
- alternative_names:
- - "aod670"
- 210215:
- name: "Total aerosol optical depth at 865nm"
- alternative_names:
- - "aod865"
- 210216:
- name: "Total aerosol optical depth at 1240nm"
- alternative_names:
- - "aod1240"
- 210217:
- name: "Total aerosol optical depth at 340 nm"
- alternative_names:
- - "aod340"
- 210218:
- name: "Total aerosol optical depth at 355 nm"
- alternative_names:
- - "aod355"
- 210219:
- name: "Total aerosol optical depth at 380 nm"
- alternative_names:
- - "aod380"
- 210220:
- name: "Total aerosol optical depth at 400 nm"
- alternative_names:
- - "aod400"
- 210221:
- name: "Total aerosol optical depth at 440 nm"
- alternative_names:
- - "aod440"
- 210222:
- name: "Total aerosol optical depth at 500 nm"
- alternative_names:
- - "aod500"
- 210223:
- name: "Total aerosol optical depth at 532 nm"
- alternative_names:
- - "aod532"
- 210224:
- name: "Total aerosol optical depth at 645 nm"
- alternative_names:
- - "aod645"
- 210225:
- name: "Total aerosol optical depth at 800 nm"
- alternative_names:
- - "aod800"
- 210226:
- name: "Total aerosol optical depth at 858 nm"
- alternative_names:
- - "aod858"
- 210227:
- name: "Total aerosol optical depth at 1020 nm"
- alternative_names:
- - "aod1020"
- 210228:
- name: "Total aerosol optical depth at 1064 nm"
- alternative_names:
- - "aod1064"
- 210229:
- name: "Total aerosol optical depth at 1640 nm"
- alternative_names:
- - "aod1640"
- 210230:
- name: "Total aerosol optical depth at 2130 nm"
- alternative_names:
- - "aod2130"
- 210231:
- name: "Wildfire flux of toluene (c7h8)"
- alternative_names:
- - "c7h8fire"
- 210232:
- name: "Wildfire flux of benzene (c6h6)"
- alternative_names:
- - "c6h6fire"
- 210233:
- name: "Wildfire flux of xylene (c8h10)"
- alternative_names:
- - "c8h10fire"
- 210234:
- name: "Wildfire flux of butenes (c4h8)"
- alternative_names:
- - "c4h8fire"
- 210235:
- name: "Wildfire flux of pentenes (c5h10)"
- alternative_names:
- - "c5h10fire"
- 210236:
- name: "Wildfire flux of hexene (c6h12)"
- alternative_names:
- - "c6h12fire"
- 210237:
- name: "Wildfire flux of octene (c8h16)"
- alternative_names:
- - "c8h16fire"
- 210238:
- name: "Wildfire flux of butanes (c4h10)"
- alternative_names:
- - "c4h10fire"
- 210239:
- name: "Wildfire flux of pentanes (c5h12)"
- alternative_names:
- - "c5h12fire"
- 210240:
- name: "Wildfire flux of hexanes (c6h14)"
- alternative_names:
- - "c6h14fire"
- 210241:
- name: "Wildfire flux of heptane (c7h16)"
- alternative_names:
- - "c7h16fire"
- 210242:
- name: "Plume bottom height above surface"
- alternative_names:
- - "apb"
- 210243:
- name: "Volcanic sulphate aerosol optical depth at 550 nm"
- alternative_names:
- - "vsuaod550"
- 210244:
- name: "Volcanic ash optical depth at 550 nm"
- alternative_names:
- - "vashaod550"
- 210245:
- name: "Profile of total aerosol dry extinction coefficient"
- alternative_names:
- - "taedec550"
- 210246:
- name: "Profile of total aerosol dry absorption coefficient"
- alternative_names:
- - "taedab550"
- 210247:
- name: "Nitrate fine mode aerosol mass mixing ratio"
- alternative_names:
- - "aermr16"
- 210248:
- name: "Nitrate coarse mode aerosol mass mixing ratio"
- alternative_names:
- - "aermr17"
- 210249:
- name: "Ammonium aerosol mass mixing ratio"
- alternative_names:
- - "aermr18"
- 210250:
- name: "Nitrate aerosol optical depth at 550 nm"
- alternative_names:
- - "niaod550"
- 210251:
- name: "Ammonium aerosol optical depth at 550 nm"
- alternative_names:
- - "amaod550"
- 210252:
- name: "Biogenic secondary organic aerosol mass mixing ratio"
- alternative_names:
- - "aermr19"
- 210253:
- name: "Anthropogenic secondary organic aerosol mass mixing ratio"
- alternative_names:
- - "aermr20"
- 210260:
- name: "Near ir albedo for diffuse radiation (climatological)"
- alternative_names:
- - "alnid_p"
- 210261:
- name: "Near ir albedo for direct radiation (climatological)"
- alternative_names:
- - "alnip_p"
- 210262:
- name: "Near ir albedo for direct radiation, geometric component (climatological)"
- alternative_names:
- - "alnipg_p"
- 210263:
- name: "Near ir albedo for direct radiation, isotropic component (climatological)"
- alternative_names:
- - "alnipi_p"
- 210264:
- name: "Near ir albedo for direct radiation, volumetric component (climatological)"
- alternative_names:
- - "alnipv_p"
- 211001:
- name: "Sea salt aerosol (0.03 - 0.5 um) mixing ratio"
- alternative_names:
- - "aermr01diff"
- 211002:
- name: "Sea salt aerosol (0.5 - 5 um) mixing ratio"
- alternative_names:
- - "aermr02diff"
- 211003:
- name: "Sea salt aerosol (5 - 20 um) mixing ratio"
- alternative_names:
- - "aermr03diff"
- 211004:
- name: "Dust aerosol (0.03 - 0.55 um) mixing ratio"
- alternative_names:
- - "aermr04diff"
- 211005:
- name: "Dust aerosol (0.55 - 0.9 um) mixing ratio"
- alternative_names:
- - "aermr05diff"
- 211006:
- name: "Dust aerosol (0.9 - 20 um) mixing ratio"
- alternative_names:
- - "aermr06diff"
- 211007:
- name: "Hydrophilic organic matter aerosol mixing ratio"
- alternative_names:
- - "aermr07diff"
- 211008:
- name: "Hydrophobic organic matter aerosol mixing ratio"
- alternative_names:
- - "aermr08diff"
- 211009:
- name: "Hydrophilic black carbon aerosol mixing ratio"
- alternative_names:
- - "aermr09diff"
- 211010:
- name: "Hydrophobic black carbon aerosol mixing ratio"
- alternative_names:
- - "aermr10diff"
- 211011:
- name: "Sulphate aerosol mixing ratio"
- alternative_names:
- - "aermr11diff"
- 211012:
- name: "Aerosol type 12 mixing ratio"
- alternative_names:
- - "aermr12diff"
- 211013:
- name: "Aerosol type 13 mass mixing ratio"
- alternative_names:
- - "aermr13diff"
- 211014:
- name: "Aerosol type 14 mass mixing ratio"
- alternative_names:
- - "aermr14diff"
- 211015:
- name: "Aerosol type 15 mass mixing ratio"
- alternative_names:
- - "aermr15diff"
- 211016:
- name: "Aerosol type 1 source/gain accumulated"
- alternative_names:
- - "aergn01diff"
- 211017:
- name: "Aerosol type 2 source/gain accumulated"
- alternative_names:
- - "aergn02diff"
- 211018:
- name: "Aerosol type 3 source/gain accumulated"
- alternative_names:
- - "aergn03diff"
- 211019:
- name: "Aerosol type 4 source/gain accumulated"
- alternative_names:
- - "aergn04diff"
- 211020:
- name: "Aerosol type 5 source/gain accumulated"
- alternative_names:
- - "aergn05diff"
- 211021:
- name: "Aerosol type 6 source/gain accumulated"
- alternative_names:
- - "aergn06diff"
- 211022:
- name: "Aerosol type 7 source/gain accumulated"
- alternative_names:
- - "aergn07diff"
- 211023:
- name: "Aerosol type 8 source/gain accumulated"
- alternative_names:
- - "aergn08diff"
- 211024:
- name: "Aerosol type 9 source/gain accumulated"
- alternative_names:
- - "aergn09diff"
- 211025:
- name: "Aerosol type 10 source/gain accumulated"
- alternative_names:
- - "aergn10diff"
- 211026:
- name: "Aerosol type 11 source/gain accumulated"
- alternative_names:
- - "aergn11diff"
- 211027:
- name: "Aerosol type 12 source/gain accumulated"
- alternative_names:
- - "aergn12diff"
- 211028:
- name: "So4 aerosol precursor mass mixing ratio"
- alternative_names:
- - "aerpr03diff"
- 211029:
- name: "Water vapour mixing ratio for hydrophilic aerosols in mode 1"
- alternative_names:
- - "aerwv01diff"
- 211030:
- name: "Water vapour mixing ratio for hydrophilic aerosols in mode 2"
- alternative_names:
- - "aerwv02diff"
- 211031:
- name: "Aerosol type 1 sink/loss accumulated"
- alternative_names:
- - "aerls01diff"
- 211032:
- name: "Aerosol type 2 sink/loss accumulated"
- alternative_names:
- - "aerls02diff"
- 211033:
- name: "Aerosol type 3 sink/loss accumulated"
- alternative_names:
- - "aerls03diff"
- 211034:
- name: "Aerosol type 4 sink/loss accumulated"
- alternative_names:
- - "aerls04diff"
- 211035:
- name: "Aerosol type 5 sink/loss accumulated"
- alternative_names:
- - "aerls05diff"
- 211036:
- name: "Aerosol type 6 sink/loss accumulated"
- alternative_names:
- - "aerls06diff"
- 211037:
- name: "Aerosol type 7 sink/loss accumulated"
- alternative_names:
- - "aerls07diff"
- 211038:
- name: "Aerosol type 8 sink/loss accumulated"
- alternative_names:
- - "aerls08diff"
- 211039:
- name: "Aerosol type 9 sink/loss accumulated"
- alternative_names:
- - "aerls09diff"
- 211040:
- name: "Aerosol type 10 sink/loss accumulated"
- alternative_names:
- - "aerls10diff"
- 211041:
- name: "Aerosol type 11 sink/loss accumulated"
- alternative_names:
- - "aerls11diff"
- 211042:
- name: "Aerosol type 12 sink/loss accumulated"
- alternative_names:
- - "aerls12diff"
- 211043:
- name: "Dms surface emission"
- alternative_names:
- - "emdmsdiff"
- 211044:
- name: "Water vapour mixing ratio for hydrophilic aerosols in mode 3"
- alternative_names:
- - "aerwv03diff"
- 211045:
- name: "Water vapour mixing ratio for hydrophilic aerosols in mode 4"
- alternative_names:
- - "aerwv04diff"
- 211046:
- name: "Aerosol precursor mixing ratio"
- alternative_names:
- - "aerprdiff"
- 211047:
- name: "Aerosol small mode mixing ratio"
- alternative_names:
- - "aersmdiff"
- 211048:
- name: "Aerosol large mode mixing ratio"
- alternative_names:
- - "aerlgdiff"
- 211049:
- name: "Aerosol precursor optical depth"
- alternative_names:
- - "aodprdiff"
- 211050:
- name: "Aerosol small mode optical depth"
- alternative_names:
- - "aodsmdiff"
- 211051:
- name: "Aerosol large mode optical depth"
- alternative_names:
- - "aodlgdiff"
- 211052:
- name: "Dust emission potential"
- alternative_names:
- - "aerdepdiff"
- 211053:
- name: "Lifting threshold speed"
- alternative_names:
- - "aerltsdiff"
- 211054:
- name: "Soil clay content"
- alternative_names:
- - "aersccdiff"
- 211055:
- name: "Experimental product"
- alternative_names:
- - "_param_211055"
- 211056:
- name: "Experimental product"
- alternative_names:
- - "_param_211056"
- 211061:
- name: "Carbon dioxide"
- alternative_names:
- - "co2diff"
- 211062:
- name: "Methane"
- alternative_names:
- - "ch4diff"
- 211063:
- name: "Nitrous oxide"
- alternative_names:
- - "n2odiff"
- 211064:
- name: "Total column carbon dioxide"
- alternative_names:
- - "tcco2diff"
- 211065:
- name: "Total column methane"
- alternative_names:
- - "tcch4diff"
- 211066:
- name: "Total column nitrous oxide"
- alternative_names:
- - "tcn2odiff"
- 211067:
- name: "Ocean flux of carbon dioxide"
- alternative_names:
- - "co2ofdiff"
- 211068:
- name: "Natural biosphere flux of carbon dioxide"
- alternative_names:
- - "co2nbfdiff"
- 211069:
- name: "Anthropogenic emissions of carbon dioxide"
- alternative_names:
- - "co2apfdiff"
- 211070:
- name: "Methane surface fluxes"
- alternative_names:
- - "ch4fdiff"
- 211071:
- name: "Methane loss rate due to radical hydroxyl (oh)"
- alternative_names:
- - "kch4diff"
- 211080:
- name: "Wildfire flux of carbon dioxide"
- alternative_names:
- - "co2firediff"
- 211081:
- name: "Wildfire flux of carbon monoxide"
- alternative_names:
- - "cofirediff"
- 211082:
- name: "Wildfire flux of methane"
- alternative_names:
- - "ch4firediff"
- 211083:
- name: "Wildfire flux of non-methane hydro-carbons"
- alternative_names:
- - "nmhcfirediff"
- 211084:
- name: "Wildfire flux of hydrogen"
- alternative_names:
- - "h2firediff"
- 211085:
- name: "Wildfire flux of nitrogen oxides nox"
- alternative_names:
- - "noxfirediff"
- 211086:
- name: "Wildfire flux of nitrous oxide"
- alternative_names:
- - "n2ofirediff"
- 211087:
- name: "Wildfire flux of particulate matter pm2.5"
- alternative_names:
- - "pm2p5firediff"
- 211088:
- name: "Wildfire flux of total particulate matter"
- alternative_names:
- - "tpmfirediff"
- 211089:
- name: "Wildfire flux of total carbon in aerosols"
- alternative_names:
- - "tcfirediff"
- 211090:
- name: "Wildfire flux of organic carbon"
- alternative_names:
- - "ocfirediff"
- 211091:
- name: "Wildfire flux of black carbon"
- alternative_names:
- - "bcfirediff"
- 211092:
- name: "Wildfire overall flux of burnt carbon"
- alternative_names:
- - "cfirediff"
- 211093:
- name: "Wildfire fraction of c4 plants"
- alternative_names:
- - "c4ffirediff"
- 211094:
- name: "Wildfire vegetation map index"
- alternative_names:
- - "vegfirediff"
- 211095:
- name: "Wildfire combustion completeness"
- alternative_names:
- - "ccfirediff"
- 211096:
- name: "Wildfire fuel load: carbon per unit area"
- alternative_names:
- - "flfirediff"
- 211097:
- name: "Wildfire fraction of area observed"
- alternative_names:
- - "offirediff"
- 211098:
- name: "Wildfire observed area"
- alternative_names:
- - "oafirediff"
- 211099:
- name: "Wildfire radiative power"
- alternative_names:
- - "frpfirediff"
- 211100:
- name: "Wildfire combustion rate"
- alternative_names:
- - "crfirediff"
- 211101:
- name: "Wildfire radiative power maximum"
- alternative_names:
- - "maxfrpfirediff"
- 211102:
- name: "Wildfire flux of sulfur dioxide"
- alternative_names:
- - "so2firediff"
- 211103:
- name: "Wildfire flux of methanol (ch3oh)"
- alternative_names:
- - "ch3ohfirediff"
- 211104:
- name: "Wildfire flux of ethanol (c2h5oh)"
- alternative_names:
- - "c2h5ohfirediff"
- 211105:
- name: "Wildfire flux of propane (c3h8)"
- alternative_names:
- - "c3h8firediff"
- 211106:
- name: "Wildfire flux of ethene (c2h4)"
- alternative_names:
- - "c2h4firediff"
- 211107:
- name: "Wildfire flux of propene (c3h6)"
- alternative_names:
- - "c3h6firediff"
- 211108:
- name: "Wildfire flux of isoprene (c5h8)"
- alternative_names:
- - "c5h8firediff"
- 211109:
- name: "Wildfire flux of terpenes (c5h8)n"
- alternative_names:
- - "terpenesfirediff"
- 211110:
- name: "Wildfire flux of toluene_lump (c7h8+ c6h6 + c8h10)"
- alternative_names:
- - "toluenefirediff"
- 211111:
- name: "Wildfire flux of higher alkenes (cnh2n, c>=4)"
- alternative_names:
- - "hialkenesfirediff"
- 211112:
- name: "Wildfire flux of higher alkanes (cnh2n+2, c>=4)"
- alternative_names:
- - "hialkanesfirediff"
- 211113:
- name: "Wildfire flux of formaldehyde (ch2o)"
- alternative_names:
- - "ch2ofirediff"
- 211114:
- name: "Wildfire flux of acetaldehyde (c2h4o)"
- alternative_names:
- - "c2h4ofirediff"
- 211115:
- name: "Wildfire flux of acetone (c3h6o)"
- alternative_names:
- - "c3h6ofirediff"
- 211116:
- name: "Wildfire flux of ammonia (nh3)"
- alternative_names:
- - "nh3firediff"
- 211117:
- name: "Wildfire flux of dimethyl sulfide (dms) (c2h6s)"
- alternative_names:
- - "c2h6sfirediff"
- 211118:
- name: "Wildfire flux of ethane (c2h6)"
- alternative_names:
- - "c2h6firediff"
- 211119:
- name: "Altitude of emitter"
- alternative_names:
- - "alediff"
- 211120:
- name: "Altitude of plume top"
- alternative_names:
- - "aptdiff"
- 211121:
- name: "Nitrogen dioxide mass mixing ratio difference"
- alternative_names:
- - "no2diff"
- 211122:
- name: "Sulphur dioxide mass mixing ratio difference"
- alternative_names:
- - "so2diff"
- 211123:
- name: "Carbon monoxide mass mixing ratio difference"
- alternative_names:
- - "codiff"
- 211124:
- name: "Formaldehyde"
- alternative_names:
- - "hchodiff"
- 211125:
- name: "Total column nitrogen dioxide"
- alternative_names:
- - "tcno2diff"
- 211126:
- name: "Total column sulphur dioxide"
- alternative_names:
- - "tcso2diff"
- 211127:
- name: "Total column carbon monoxide"
- alternative_names:
- - "tccodiff"
- 211128:
- name: "Total column formaldehyde"
- alternative_names:
- - "tchchodiff"
- 211129:
- name: "Nitrogen oxides"
- alternative_names:
- - "noxdiff"
- 211130:
- name: "Total column nitrogen oxides"
- alternative_names:
- - "tcnoxdiff"
- 211131:
- name: "Reactive tracer 1 mass mixing ratio"
- alternative_names:
- - "grg1diff"
- 211132:
- name: "Total column grg tracer 1"
- alternative_names:
- - "tcgrg1diff"
- 211133:
- name: "Reactive tracer 2 mass mixing ratio"
- alternative_names:
- - "grg2diff"
- 211134:
- name: "Total column grg tracer 2"
- alternative_names:
- - "tcgrg2diff"
- 211135:
- name: "Reactive tracer 3 mass mixing ratio"
- alternative_names:
- - "grg3diff"
- 211136:
- name: "Total column grg tracer 3"
- alternative_names:
- - "tcgrg3diff"
- 211137:
- name: "Reactive tracer 4 mass mixing ratio"
- alternative_names:
- - "grg4diff"
- 211138:
- name: "Total column grg tracer 4"
- alternative_names:
- - "tcgrg4diff"
- 211139:
- name: "Reactive tracer 5 mass mixing ratio"
- alternative_names:
- - "grg5diff"
- 211140:
- name: "Total column grg tracer 5"
- alternative_names:
- - "tcgrg5diff"
- 211141:
- name: "Reactive tracer 6 mass mixing ratio"
- alternative_names:
- - "grg6diff"
- 211142:
- name: "Total column grg tracer 6"
- alternative_names:
- - "tcgrg6diff"
- 211143:
- name: "Reactive tracer 7 mass mixing ratio"
- alternative_names:
- - "grg7diff"
- 211144:
- name: "Total column grg tracer 7"
- alternative_names:
- - "tcgrg7diff"
- 211145:
- name: "Reactive tracer 8 mass mixing ratio"
- alternative_names:
- - "grg8diff"
- 211146:
- name: "Total column grg tracer 8"
- alternative_names:
- - "tcgrg8diff"
- 211147:
- name: "Reactive tracer 9 mass mixing ratio"
- alternative_names:
- - "grg9diff"
- 211148:
- name: "Total column grg tracer 9"
- alternative_names:
- - "tcgrg9diff"
- 211149:
- name: "Reactive tracer 10 mass mixing ratio"
- alternative_names:
- - "grg10diff"
- 211150:
- name: "Total column grg tracer 10"
- alternative_names:
- - "tcgrg10diff"
- 211151:
- name: "Surface flux nitrogen oxides"
- alternative_names:
- - "sfnoxdiff"
- 211152:
- name: "Surface flux nitrogen dioxide"
- alternative_names:
- - "sfno2diff"
- 211153:
- name: "Surface flux sulphur dioxide"
- alternative_names:
- - "sfso2diff"
- 211154:
- name: "Surface flux carbon monoxide"
- alternative_names:
- - "sfco2diff"
- 211155:
- name: "Surface flux formaldehyde"
- alternative_names:
- - "sfhchodiff"
- 211156:
- name: "Surface flux gems ozone"
- alternative_names:
- - "sfgo3diff"
- 211157:
- name: "Surface flux reactive tracer 1"
- alternative_names:
- - "sfgr1diff"
- 211158:
- name: "Surface flux reactive tracer 2"
- alternative_names:
- - "sfgr2diff"
- 211159:
- name: "Surface flux reactive tracer 3"
- alternative_names:
- - "sfgr3diff"
- 211160:
- name: "Surface flux reactive tracer 4"
- alternative_names:
- - "sfgr4diff"
- 211161:
- name: "Surface flux reactive tracer 5"
- alternative_names:
- - "sfgr5diff"
- 211162:
- name: "Surface flux reactive tracer 6"
- alternative_names:
- - "sfgr6diff"
- 211163:
- name: "Surface flux reactive tracer 7"
- alternative_names:
- - "sfgr7diff"
- 211164:
- name: "Surface flux reactive tracer 8"
- alternative_names:
- - "sfgr8diff"
- 211165:
- name: "Surface flux reactive tracer 9"
- alternative_names:
- - "sfgr9diff"
- 211166:
- name: "Surface flux reactive tracer 10"
- alternative_names:
- - "sfgr10diff"
- 211170:
- name: "Volcanic sulfur dioxide mass mixing ratio increment"
- alternative_names:
- - "vso2diff"
- 211181:
- name: "Radon"
- alternative_names:
- - "radiff"
- 211182:
- name: "Sulphur hexafluoride"
- alternative_names:
- - "sf6diff"
- 211183:
- name: "Total column radon"
- alternative_names:
- - "tcradiff"
- 211184:
- name: "Total column sulphur hexafluoride"
- alternative_names:
- - "tcsf6diff"
- 211185:
- name: "Anthropogenic emissions of sulphur hexafluoride"
- alternative_names:
- - "sf6apfdiff"
- 211203:
- name: "Ozone mass mixing ratio difference (full chemistry scheme)"
- alternative_names:
- - "go3diff"
- 211206:
- name: "Gems total column ozone"
- alternative_names:
- - "gtco3diff"
- 211207:
- name: "Total aerosol optical depth at 550nm"
- alternative_names:
- - "aod550diff"
- 211208:
- name: "Sea salt aerosol optical depth at 550nm"
- alternative_names:
- - "ssaod550diff"
- 211209:
- name: "Dust aerosol optical depth at 550nm"
- alternative_names:
- - "duaod550diff"
- 211210:
- name: "Organic matter aerosol optical depth at 550nm"
- alternative_names:
- - "omaod550diff"
- 211211:
- name: "Black carbon aerosol optical depth at 550nm"
- alternative_names:
- - "bcaod550diff"
- 211212:
- name: "Sulphate aerosol optical depth at 550nm"
- alternative_names:
- - "suaod550diff"
- 211213:
- name: "Total aerosol optical depth at 469nm"
- alternative_names:
- - "aod469diff"
- 211214:
- name: "Total aerosol optical depth at 670nm"
- alternative_names:
- - "aod670diff"
- 211215:
- name: "Total aerosol optical depth at 865nm"
- alternative_names:
- - "aod865diff"
- 211216:
- name: "Total aerosol optical depth at 1240nm"
- alternative_names:
- - "aod1240diff"
- 211247:
- name: "Nitrate fine mode aerosol mass mixing ratio"
- alternative_names:
- - "aermr16diff"
- 211248:
- name: "Nitrate coarse mode aerosol mass mixing ratio"
- alternative_names:
- - "aermr17diff"
- 211249:
- name: "Ammonium aerosol mass mixing ratio"
- alternative_names:
- - "aermr18diff"
- 211252:
- name: "Biogenic secondary organic aerosol mass mixing ratio increment"
- alternative_names:
- - "aermr19diff"
- 211253:
- name: "Anthropogenic secondary organic aerosol mass mixing ratio increment"
- alternative_names:
- - "aermr20diff"
- 212001:
- name: "Experimental product"
- alternative_names:
- - "_param_212001"
- 212002:
- name: "Experimental product"
- alternative_names:
- - "_param_212002"
- 212003:
- name: "Experimental product"
- alternative_names:
- - "_param_212003"
- 212004:
- name: "Experimental product"
- alternative_names:
- - "_param_212004"
- 212005:
- name: "Experimental product"
- alternative_names:
- - "_param_212005"
- 212006:
- name: "Experimental product"
- alternative_names:
- - "_param_212006"
- 212007:
- name: "Experimental product"
- alternative_names:
- - "_param_212007"
- 212008:
- name: "Experimental product"
- alternative_names:
- - "_param_212008"
- 212009:
- name: "Experimental product"
- alternative_names:
- - "_param_212009"
- 212010:
- name: "Experimental product"
- alternative_names:
- - "_param_212010"
- 212011:
- name: "Experimental product"
- alternative_names:
- - "_param_212011"
- 212012:
- name: "Experimental product"
- alternative_names:
- - "_param_212012"
- 212013:
- name: "Experimental product"
- alternative_names:
- - "_param_212013"
- 212014:
- name: "Experimental product"
- alternative_names:
- - "_param_212014"
- 212015:
- name: "Experimental product"
- alternative_names:
- - "_param_212015"
- 212016:
- name: "Experimental product"
- alternative_names:
- - "_param_212016"
- 212017:
- name: "Experimental product"
- alternative_names:
- - "_param_212017"
- 212018:
- name: "Experimental product"
- alternative_names:
- - "_param_212018"
- 212019:
- name: "Experimental product"
- alternative_names:
- - "_param_212019"
- 212020:
- name: "Experimental product"
- alternative_names:
- - "_param_212020"
- 212021:
- name: "Experimental product"
- alternative_names:
- - "_param_212021"
- 212022:
- name: "Experimental product"
- alternative_names:
- - "_param_212022"
- 212023:
- name: "Experimental product"
- alternative_names:
- - "_param_212023"
- 212024:
- name: "Experimental product"
- alternative_names:
- - "_param_212024"
- 212025:
- name: "Experimental product"
- alternative_names:
- - "_param_212025"
- 212026:
- name: "Experimental product"
- alternative_names:
- - "_param_212026"
- 212027:
- name: "Experimental product"
- alternative_names:
- - "_param_212027"
- 212028:
- name: "Experimental product"
- alternative_names:
- - "_param_212028"
- 212029:
- name: "Experimental product"
- alternative_names:
- - "_param_212029"
- 212030:
- name: "Experimental product"
- alternative_names:
- - "_param_212030"
- 212031:
- name: "Experimental product"
- alternative_names:
- - "_param_212031"
- 212032:
- name: "Experimental product"
- alternative_names:
- - "_param_212032"
- 212033:
- name: "Experimental product"
- alternative_names:
- - "_param_212033"
- 212034:
- name: "Experimental product"
- alternative_names:
- - "_param_212034"
- 212035:
- name: "Experimental product"
- alternative_names:
- - "_param_212035"
- 212036:
- name: "Experimental product"
- alternative_names:
- - "_param_212036"
- 212037:
- name: "Experimental product"
- alternative_names:
- - "_param_212037"
- 212038:
- name: "Experimental product"
- alternative_names:
- - "_param_212038"
- 212039:
- name: "Experimental product"
- alternative_names:
- - "_param_212039"
- 212040:
- name: "Experimental product"
- alternative_names:
- - "_param_212040"
- 212041:
- name: "Experimental product"
- alternative_names:
- - "_param_212041"
- 212042:
- name: "Experimental product"
- alternative_names:
- - "_param_212042"
- 212043:
- name: "Experimental product"
- alternative_names:
- - "_param_212043"
- 212044:
- name: "Experimental product"
- alternative_names:
- - "_param_212044"
- 212045:
- name: "Experimental product"
- alternative_names:
- - "_param_212045"
- 212046:
- name: "Experimental product"
- alternative_names:
- - "_param_212046"
- 212047:
- name: "Experimental product"
- alternative_names:
- - "_param_212047"
- 212048:
- name: "Experimental product"
- alternative_names:
- - "_param_212048"
- 212049:
- name: "Experimental product"
- alternative_names:
- - "_param_212049"
- 212050:
- name: "Experimental product"
- alternative_names:
- - "_param_212050"
- 212051:
- name: "Experimental product"
- alternative_names:
- - "_param_212051"
- 212052:
- name: "Experimental product"
- alternative_names:
- - "_param_212052"
- 212053:
- name: "Experimental product"
- alternative_names:
- - "_param_212053"
- 212054:
- name: "Experimental product"
- alternative_names:
- - "_param_212054"
- 212055:
- name: "Experimental product"
- alternative_names:
- - "_param_212055"
- 212056:
- name: "Experimental product"
- alternative_names:
- - "_param_212056"
- 212057:
- name: "Experimental product"
- alternative_names:
- - "_param_212057"
- 212058:
- name: "Experimental product"
- alternative_names:
- - "_param_212058"
- 212059:
- name: "Experimental product"
- alternative_names:
- - "_param_212059"
- 212060:
- name: "Experimental product"
- alternative_names:
- - "_param_212060"
- 212061:
- name: "Experimental product"
- alternative_names:
- - "_param_212061"
- 212062:
- name: "Experimental product"
- alternative_names:
- - "_param_212062"
- 212063:
- name: "Experimental product"
- alternative_names:
- - "_param_212063"
- 212064:
- name: "Experimental product"
- alternative_names:
- - "_param_212064"
- 212065:
- name: "Experimental product"
- alternative_names:
- - "_param_212065"
- 212066:
- name: "Experimental product"
- alternative_names:
- - "_param_212066"
- 212067:
- name: "Experimental product"
- alternative_names:
- - "_param_212067"
- 212068:
- name: "Experimental product"
- alternative_names:
- - "_param_212068"
- 212069:
- name: "Experimental product"
- alternative_names:
- - "_param_212069"
- 212070:
- name: "Experimental product"
- alternative_names:
- - "_param_212070"
- 212071:
- name: "Experimental product"
- alternative_names:
- - "_param_212071"
- 212072:
- name: "Experimental product"
- alternative_names:
- - "_param_212072"
- 212073:
- name: "Experimental product"
- alternative_names:
- - "_param_212073"
- 212074:
- name: "Experimental product"
- alternative_names:
- - "_param_212074"
- 212075:
- name: "Experimental product"
- alternative_names:
- - "_param_212075"
- 212076:
- name: "Experimental product"
- alternative_names:
- - "_param_212076"
- 212077:
- name: "Experimental product"
- alternative_names:
- - "_param_212077"
- 212078:
- name: "Experimental product"
- alternative_names:
- - "_param_212078"
- 212079:
- name: "Experimental product"
- alternative_names:
- - "_param_212079"
- 212080:
- name: "Experimental product"
- alternative_names:
- - "_param_212080"
- 212081:
- name: "Experimental product"
- alternative_names:
- - "_param_212081"
- 212082:
- name: "Experimental product"
- alternative_names:
- - "_param_212082"
- 212083:
- name: "Experimental product"
- alternative_names:
- - "_param_212083"
- 212084:
- name: "Experimental product"
- alternative_names:
- - "_param_212084"
- 212085:
- name: "Experimental product"
- alternative_names:
- - "_param_212085"
- 212086:
- name: "Experimental product"
- alternative_names:
- - "_param_212086"
- 212087:
- name: "Experimental product"
- alternative_names:
- - "_param_212087"
- 212088:
- name: "Experimental product"
- alternative_names:
- - "_param_212088"
- 212089:
- name: "Experimental product"
- alternative_names:
- - "_param_212089"
- 212090:
- name: "Experimental product"
- alternative_names:
- - "_param_212090"
- 212091:
- name: "Experimental product"
- alternative_names:
- - "_param_212091"
- 212092:
- name: "Experimental product"
- alternative_names:
- - "_param_212092"
- 212093:
- name: "Experimental product"
- alternative_names:
- - "_param_212093"
- 212094:
- name: "Experimental product"
- alternative_names:
- - "_param_212094"
- 212095:
- name: "Experimental product"
- alternative_names:
- - "_param_212095"
- 212096:
- name: "Experimental product"
- alternative_names:
- - "_param_212096"
- 212097:
- name: "Experimental product"
- alternative_names:
- - "_param_212097"
- 212098:
- name: "Experimental product"
- alternative_names:
- - "_param_212098"
- 212099:
- name: "Experimental product"
- alternative_names:
- - "_param_212099"
- 212100:
- name: "Experimental product"
- alternative_names:
- - "_param_212100"
- 212101:
- name: "Experimental product"
- alternative_names:
- - "_param_212101"
- 212102:
- name: "Experimental product"
- alternative_names:
- - "_param_212102"
- 212103:
- name: "Experimental product"
- alternative_names:
- - "_param_212103"
- 212104:
- name: "Experimental product"
- alternative_names:
- - "_param_212104"
- 212105:
- name: "Experimental product"
- alternative_names:
- - "_param_212105"
- 212106:
- name: "Experimental product"
- alternative_names:
- - "_param_212106"
- 212107:
- name: "Experimental product"
- alternative_names:
- - "_param_212107"
- 212108:
- name: "Experimental product"
- alternative_names:
- - "_param_212108"
- 212109:
- name: "Experimental product"
- alternative_names:
- - "_param_212109"
- 212110:
- name: "Experimental product"
- alternative_names:
- - "_param_212110"
- 212111:
- name: "Experimental product"
- alternative_names:
- - "_param_212111"
- 212112:
- name: "Experimental product"
- alternative_names:
- - "_param_212112"
- 212113:
- name: "Experimental product"
- alternative_names:
- - "_param_212113"
- 212114:
- name: "Experimental product"
- alternative_names:
- - "_param_212114"
- 212115:
- name: "Experimental product"
- alternative_names:
- - "_param_212115"
- 212116:
- name: "Experimental product"
- alternative_names:
- - "_param_212116"
- 212117:
- name: "Experimental product"
- alternative_names:
- - "_param_212117"
- 212118:
- name: "Experimental product"
- alternative_names:
- - "_param_212118"
- 212119:
- name: "Experimental product"
- alternative_names:
- - "_param_212119"
- 212120:
- name: "Experimental product"
- alternative_names:
- - "_param_212120"
- 212121:
- name: "Experimental product"
- alternative_names:
- - "_param_212121"
- 212122:
- name: "Experimental product"
- alternative_names:
- - "_param_212122"
- 212123:
- name: "Experimental product"
- alternative_names:
- - "_param_212123"
- 212124:
- name: "Experimental product"
- alternative_names:
- - "_param_212124"
- 212125:
- name: "Experimental product"
- alternative_names:
- - "_param_212125"
- 212126:
- name: "Experimental product"
- alternative_names:
- - "_param_212126"
- 212127:
- name: "Experimental product"
- alternative_names:
- - "_param_212127"
- 212128:
- name: "Experimental product"
- alternative_names:
- - "_param_212128"
- 212129:
- name: "Experimental product"
- alternative_names:
- - "_param_212129"
- 212130:
- name: "Experimental product"
- alternative_names:
- - "_param_212130"
- 212131:
- name: "Experimental product"
- alternative_names:
- - "_param_212131"
- 212132:
- name: "Experimental product"
- alternative_names:
- - "_param_212132"
- 212133:
- name: "Experimental product"
- alternative_names:
- - "_param_212133"
- 212134:
- name: "Experimental product"
- alternative_names:
- - "_param_212134"
- 212135:
- name: "Experimental product"
- alternative_names:
- - "_param_212135"
- 212136:
- name: "Experimental product"
- alternative_names:
- - "_param_212136"
- 212137:
- name: "Experimental product"
- alternative_names:
- - "_param_212137"
- 212138:
- name: "Experimental product"
- alternative_names:
- - "_param_212138"
- 212139:
- name: "Experimental product"
- alternative_names:
- - "_param_212139"
- 212140:
- name: "Experimental product"
- alternative_names:
- - "_param_212140"
- 212141:
- name: "Experimental product"
- alternative_names:
- - "_param_212141"
- 212142:
- name: "Experimental product"
- alternative_names:
- - "_param_212142"
- 212143:
- name: "Experimental product"
- alternative_names:
- - "_param_212143"
- 212144:
- name: "Experimental product"
- alternative_names:
- - "_param_212144"
- 212145:
- name: "Experimental product"
- alternative_names:
- - "_param_212145"
- 212146:
- name: "Experimental product"
- alternative_names:
- - "_param_212146"
- 212147:
- name: "Experimental product"
- alternative_names:
- - "_param_212147"
- 212148:
- name: "Experimental product"
- alternative_names:
- - "_param_212148"
- 212149:
- name: "Experimental product"
- alternative_names:
- - "_param_212149"
- 212150:
- name: "Experimental product"
- alternative_names:
- - "_param_212150"
- 212151:
- name: "Experimental product"
- alternative_names:
- - "_param_212151"
- 212152:
- name: "Experimental product"
- alternative_names:
- - "_param_212152"
- 212153:
- name: "Experimental product"
- alternative_names:
- - "_param_212153"
- 212154:
- name: "Experimental product"
- alternative_names:
- - "_param_212154"
- 212155:
- name: "Experimental product"
- alternative_names:
- - "_param_212155"
- 212156:
- name: "Experimental product"
- alternative_names:
- - "_param_212156"
- 212157:
- name: "Experimental product"
- alternative_names:
- - "_param_212157"
- 212158:
- name: "Experimental product"
- alternative_names:
- - "_param_212158"
- 212159:
- name: "Experimental product"
- alternative_names:
- - "_param_212159"
- 212160:
- name: "Experimental product"
- alternative_names:
- - "_param_212160"
- 212161:
- name: "Experimental product"
- alternative_names:
- - "_param_212161"
- 212162:
- name: "Experimental product"
- alternative_names:
- - "_param_212162"
- 212163:
- name: "Experimental product"
- alternative_names:
- - "_param_212163"
- 212164:
- name: "Experimental product"
- alternative_names:
- - "_param_212164"
- 212165:
- name: "Experimental product"
- alternative_names:
- - "_param_212165"
- 212166:
- name: "Experimental product"
- alternative_names:
- - "_param_212166"
- 212167:
- name: "Experimental product"
- alternative_names:
- - "_param_212167"
- 212168:
- name: "Experimental product"
- alternative_names:
- - "_param_212168"
- 212169:
- name: "Experimental product"
- alternative_names:
- - "_param_212169"
- 212170:
- name: "Experimental product"
- alternative_names:
- - "_param_212170"
- 212171:
- name: "Experimental product"
- alternative_names:
- - "_param_212171"
- 212172:
- name: "Experimental product"
- alternative_names:
- - "_param_212172"
- 212173:
- name: "Experimental product"
- alternative_names:
- - "_param_212173"
- 212174:
- name: "Experimental product"
- alternative_names:
- - "_param_212174"
- 212175:
- name: "Experimental product"
- alternative_names:
- - "_param_212175"
- 212176:
- name: "Experimental product"
- alternative_names:
- - "_param_212176"
- 212177:
- name: "Experimental product"
- alternative_names:
- - "_param_212177"
- 212178:
- name: "Experimental product"
- alternative_names:
- - "_param_212178"
- 212179:
- name: "Experimental product"
- alternative_names:
- - "_param_212179"
- 212180:
- name: "Experimental product"
- alternative_names:
- - "_param_212180"
- 212181:
- name: "Experimental product"
- alternative_names:
- - "_param_212181"
- 212182:
- name: "Experimental product"
- alternative_names:
- - "_param_212182"
- 212183:
- name: "Experimental product"
- alternative_names:
- - "_param_212183"
- 212184:
- name: "Experimental product"
- alternative_names:
- - "_param_212184"
- 212185:
- name: "Experimental product"
- alternative_names:
- - "_param_212185"
- 212186:
- name: "Experimental product"
- alternative_names:
- - "_param_212186"
- 212187:
- name: "Experimental product"
- alternative_names:
- - "_param_212187"
- 212188:
- name: "Experimental product"
- alternative_names:
- - "_param_212188"
- 212189:
- name: "Experimental product"
- alternative_names:
- - "_param_212189"
- 212190:
- name: "Experimental product"
- alternative_names:
- - "_param_212190"
- 212191:
- name: "Experimental product"
- alternative_names:
- - "_param_212191"
- 212192:
- name: "Experimental product"
- alternative_names:
- - "_param_212192"
- 212193:
- name: "Experimental product"
- alternative_names:
- - "_param_212193"
- 212194:
- name: "Experimental product"
- alternative_names:
- - "_param_212194"
- 212195:
- name: "Experimental product"
- alternative_names:
- - "_param_212195"
- 212196:
- name: "Experimental product"
- alternative_names:
- - "_param_212196"
- 212197:
- name: "Experimental product"
- alternative_names:
- - "_param_212197"
- 212198:
- name: "Experimental product"
- alternative_names:
- - "_param_212198"
- 212199:
- name: "Experimental product"
- alternative_names:
- - "_param_212199"
- 212200:
- name: "Experimental product"
- alternative_names:
- - "_param_212200"
- 212201:
- name: "Experimental product"
- alternative_names:
- - "_param_212201"
- 212202:
- name: "Experimental product"
- alternative_names:
- - "_param_212202"
- 212203:
- name: "Experimental product"
- alternative_names:
- - "_param_212203"
- 212204:
- name: "Experimental product"
- alternative_names:
- - "_param_212204"
- 212205:
- name: "Experimental product"
- alternative_names:
- - "_param_212205"
- 212206:
- name: "Experimental product"
- alternative_names:
- - "_param_212206"
- 212207:
- name: "Experimental product"
- alternative_names:
- - "_param_212207"
- 212208:
- name: "Experimental product"
- alternative_names:
- - "_param_212208"
- 212209:
- name: "Experimental product"
- alternative_names:
- - "_param_212209"
- 212210:
- name: "Experimental product"
- alternative_names:
- - "_param_212210"
- 212211:
- name: "Experimental product"
- alternative_names:
- - "_param_212211"
- 212212:
- name: "Experimental product"
- alternative_names:
- - "_param_212212"
- 212213:
- name: "Experimental product"
- alternative_names:
- - "_param_212213"
- 212214:
- name: "Experimental product"
- alternative_names:
- - "_param_212214"
- 212215:
- name: "Experimental product"
- alternative_names:
- - "_param_212215"
- 212216:
- name: "Experimental product"
- alternative_names:
- - "_param_212216"
- 212217:
- name: "Experimental product"
- alternative_names:
- - "_param_212217"
- 212218:
- name: "Experimental product"
- alternative_names:
- - "_param_212218"
- 212219:
- name: "Experimental product"
- alternative_names:
- - "_param_212219"
- 212220:
- name: "Experimental product"
- alternative_names:
- - "_param_212220"
- 212221:
- name: "Experimental product"
- alternative_names:
- - "_param_212221"
- 212222:
- name: "Experimental product"
- alternative_names:
- - "_param_212222"
- 212223:
- name: "Experimental product"
- alternative_names:
- - "_param_212223"
- 212224:
- name: "Experimental product"
- alternative_names:
- - "_param_212224"
- 212225:
- name: "Experimental product"
- alternative_names:
- - "_param_212225"
- 212226:
- name: "Experimental product"
- alternative_names:
- - "_param_212226"
- 212227:
- name: "Experimental product"
- alternative_names:
- - "_param_212227"
- 212228:
- name: "Experimental product"
- alternative_names:
- - "_param_212228"
- 212229:
- name: "Experimental product"
- alternative_names:
- - "_param_212229"
- 212230:
- name: "Experimental product"
- alternative_names:
- - "_param_212230"
- 212231:
- name: "Experimental product"
- alternative_names:
- - "_param_212231"
- 212232:
- name: "Experimental product"
- alternative_names:
- - "_param_212232"
- 212233:
- name: "Experimental product"
- alternative_names:
- - "_param_212233"
- 212234:
- name: "Experimental product"
- alternative_names:
- - "_param_212234"
- 212235:
- name: "Experimental product"
- alternative_names:
- - "_param_212235"
- 212236:
- name: "Experimental product"
- alternative_names:
- - "_param_212236"
- 212237:
- name: "Experimental product"
- alternative_names:
- - "_param_212237"
- 212238:
- name: "Experimental product"
- alternative_names:
- - "_param_212238"
- 212239:
- name: "Experimental product"
- alternative_names:
- - "_param_212239"
- 212240:
- name: "Experimental product"
- alternative_names:
- - "_param_212240"
- 212241:
- name: "Experimental product"
- alternative_names:
- - "_param_212241"
- 212242:
- name: "Experimental product"
- alternative_names:
- - "_param_212242"
- 212243:
- name: "Experimental product"
- alternative_names:
- - "_param_212243"
- 212244:
- name: "Experimental product"
- alternative_names:
- - "_param_212244"
- 212245:
- name: "Experimental product"
- alternative_names:
- - "_param_212245"
- 212246:
- name: "Experimental product"
- alternative_names:
- - "_param_212246"
- 212247:
- name: "Experimental product"
- alternative_names:
- - "_param_212247"
- 212248:
- name: "Experimental product"
- alternative_names:
- - "_param_212248"
- 212249:
- name: "Experimental product"
- alternative_names:
- - "_param_212249"
- 212250:
- name: "Experimental product"
- alternative_names:
- - "_param_212250"
- 212251:
- name: "Experimental product"
- alternative_names:
- - "_param_212251"
- 212252:
- name: "Experimental product"
- alternative_names:
- - "_param_212252"
- 212253:
- name: "Experimental product"
- alternative_names:
- - "_param_212253"
- 212254:
- name: "Experimental product"
- alternative_names:
- - "_param_212254"
- 212255:
- name: "Experimental product"
- alternative_names:
- - "_param_212255"
- 213001:
- name: "Random pattern 1 for sppt"
- alternative_names:
- - "sppt1"
- 213002:
- name: "Random pattern 2 for sppt"
- alternative_names:
- - "sppt2"
- 213003:
- name: "Random pattern 3 for sppt"
- alternative_names:
- - "sppt3"
- 213004:
- name: "Random pattern 4 for sppt"
- alternative_names:
- - "sppt4"
- 213005:
- name: "Random pattern 5 for sppt"
- alternative_names:
- - "sppt5"
- 213101:
- name: "Random pattern 1 for spp scheme"
- alternative_names:
- - "spp1"
- 213102:
- name: "Random pattern 2 for spp scheme"
- alternative_names:
- - "spp2"
- 213103:
- name: "Random pattern 3 for spp scheme"
- alternative_names:
- - "spp3"
- 213104:
- name: "Random pattern 4 for spp scheme"
- alternative_names:
- - "spp4"
- 213105:
- name: "Random pattern 5 for spp scheme"
- alternative_names:
- - "spp5"
- 213106:
- name: "Random pattern 6 for spp scheme"
- alternative_names:
- - "spp6"
- 213107:
- name: "Random pattern 7 for spp scheme"
- alternative_names:
- - "spp7"
- 213108:
- name: "Random pattern 8 for spp scheme"
- alternative_names:
- - "spp8"
- 213109:
- name: "Random pattern 9 for spp scheme"
- alternative_names:
- - "spp9"
- 213110:
- name: "Random pattern 10 for spp scheme"
- alternative_names:
- - "spp10"
- 213111:
- name: "Random pattern 11 for spp scheme"
- alternative_names:
- - "spp11"
- 213112:
- name: "Random pattern 12 for spp scheme"
- alternative_names:
- - "spp12"
- 213113:
- name: "Random pattern 13 for spp scheme"
- alternative_names:
- - "spp13"
- 213114:
- name: "Random pattern 14 for spp scheme"
- alternative_names:
- - "spp14"
- 213115:
- name: "Random pattern 15 for spp scheme"
- alternative_names:
- - "spp15"
- 213116:
- name: "Random pattern 16 for spp scheme"
- alternative_names:
- - "spp16"
- 213117:
- name: "Random pattern 17 for spp scheme"
- alternative_names:
- - "spp17"
- 213118:
- name: "Random pattern 18 for spp scheme"
- alternative_names:
- - "spp18"
- 213119:
- name: "Random pattern 19 for spp scheme"
- alternative_names:
- - "spp19"
- 213120:
- name: "Random pattern 20 for spp scheme"
- alternative_names:
- - "spp20"
- 213121:
- name: "Random pattern 21 for spp scheme"
- alternative_names:
- - "spp21"
- 213122:
- name: "Random pattern 22 for spp scheme"
- alternative_names:
- - "spp22"
- 213123:
- name: "Random pattern 23 for spp scheme"
- alternative_names:
- - "spp23"
- 213124:
- name: "Random pattern 24 for spp scheme"
- alternative_names:
- - "spp24"
- 213125:
- name: "Random pattern 25 for spp scheme"
- alternative_names:
- - "spp25"
- 213126:
- name: "Random pattern 26 for spp scheme"
- alternative_names:
- - "spp26"
- 213127:
- name: "Random pattern 27 for spp scheme"
- alternative_names:
- - "spp27"
- 213128:
- name: "Random pattern 28 for spp scheme"
- alternative_names:
- - "spp28"
- 213129:
- name: "Random pattern 29 for spp scheme"
- alternative_names:
- - "spp29"
- 213130:
- name: "Random pattern 30 for spp scheme"
- alternative_names:
- - "spp30"
- 213131:
- name: "Random pattern 31 for spp scheme"
- alternative_names:
- - "spp31"
- 213132:
- name: "Random pattern 32 for spp scheme"
- alternative_names:
- - "spp32"
- 213133:
- name: "Random pattern 33 for spp scheme"
- alternative_names:
- - "spp33"
- 213134:
- name: "Random pattern 34 for spp scheme"
- alternative_names:
- - "spp34"
- 213135:
- name: "Random pattern 35 for spp scheme"
- alternative_names:
- - "spp35"
- 213136:
- name: "Random pattern 36 for spp scheme"
- alternative_names:
- - "spp36"
- 213137:
- name: "Random pattern 37 for spp scheme"
- alternative_names:
- - "spp37"
- 213138:
- name: "Random pattern 38 for spp scheme"
- alternative_names:
- - "spp38"
- 213139:
- name: "Random pattern 39 for spp scheme"
- alternative_names:
- - "spp39"
- 213140:
- name: "Random pattern 40 for spp scheme"
- alternative_names:
- - "spp40"
- 213141:
- name: "Random pattern 41 for spp scheme"
- alternative_names:
- - "spp41"
- 213142:
- name: "Random pattern 42 for spp scheme"
- alternative_names:
- - "spp42"
- 213143:
- name: "Random pattern 43 for spp scheme"
- alternative_names:
- - "spp43"
- 213144:
- name: "Random pattern 44 for spp scheme"
- alternative_names:
- - "spp44"
- 213145:
- name: "Random pattern 45 for spp scheme"
- alternative_names:
- - "spp45"
- 213146:
- name: "Random pattern 46 for spp scheme"
- alternative_names:
- - "spp46"
- 213147:
- name: "Random pattern 47 for spp scheme"
- alternative_names:
- - "spp47"
- 213148:
- name: "Random pattern 48 for spp scheme"
- alternative_names:
- - "spp48"
- 213149:
- name: "Random pattern 49 for spp scheme"
- alternative_names:
- - "spp49"
- 213150:
- name: "Random pattern 50 for spp scheme"
- alternative_names:
- - "spp50"
- 213151:
- name: "Random pattern 51 for spp scheme"
- alternative_names:
- - "spp51"
- 213152:
- name: "Random pattern 52 for spp scheme"
- alternative_names:
- - "spp52"
- 213153:
- name: "Random pattern 53 for spp scheme"
- alternative_names:
- - "spp53"
- 213154:
- name: "Random pattern 54 for spp scheme"
- alternative_names:
- - "spp54"
- 213155:
- name: "Random pattern 55 for spp scheme"
- alternative_names:
- - "spp55"
- 213156:
- name: "Random pattern 56 for spp scheme"
- alternative_names:
- - "spp56"
- 213157:
- name: "Random pattern 57 for spp scheme"
- alternative_names:
- - "spp57"
- 213158:
- name: "Random pattern 58 for spp scheme"
- alternative_names:
- - "spp58"
- 213159:
- name: "Random pattern 59 for spp scheme"
- alternative_names:
- - "spp59"
- 213160:
- name: "Random pattern 60 for spp scheme"
- alternative_names:
- - "spp60"
- 213161:
- name: "Random pattern 61 for spp scheme"
- alternative_names:
- - "spp61"
- 213162:
- name: "Random pattern 62 for spp scheme"
- alternative_names:
- - "spp62"
- 213163:
- name: "Random pattern 63 for spp scheme"
- alternative_names:
- - "spp63"
- 213164:
- name: "Random pattern 64 for spp scheme"
- alternative_names:
- - "spp64"
- 213165:
- name: "Random pattern 65 for spp scheme"
- alternative_names:
- - "spp65"
- 213166:
- name: "Random pattern 66 for spp scheme"
- alternative_names:
- - "spp66"
- 213167:
- name: "Random pattern 67 for spp scheme"
- alternative_names:
- - "spp67"
- 213168:
- name: "Random pattern 68 for spp scheme"
- alternative_names:
- - "spp68"
- 213169:
- name: "Random pattern 69 for spp scheme"
- alternative_names:
- - "spp69"
- 213170:
- name: "Random pattern 70 for spp scheme"
- alternative_names:
- - "spp70"
- 213171:
- name: "Random pattern 71 for spp scheme"
- alternative_names:
- - "spp71"
- 213172:
- name: "Random pattern 72 for spp scheme"
- alternative_names:
- - "spp72"
- 213173:
- name: "Random pattern 73 for spp scheme"
- alternative_names:
- - "spp73"
- 213174:
- name: "Random pattern 74 for spp scheme"
- alternative_names:
- - "spp74"
- 213175:
- name: "Random pattern 75 for spp scheme"
- alternative_names:
- - "spp75"
- 213176:
- name: "Random pattern 76 for spp scheme"
- alternative_names:
- - "spp76"
- 213177:
- name: "Random pattern 77 for spp scheme"
- alternative_names:
- - "spp77"
- 213178:
- name: "Random pattern 78 for spp scheme"
- alternative_names:
- - "spp78"
- 213179:
- name: "Random pattern 79 for spp scheme"
- alternative_names:
- - "spp79"
- 213180:
- name: "Random pattern 80 for spp scheme"
- alternative_names:
- - "spp80"
- 213181:
- name: "Random pattern 81 for spp scheme"
- alternative_names:
- - "spp81"
- 213182:
- name: "Random pattern 82 for spp scheme"
- alternative_names:
- - "spp82"
- 213183:
- name: "Random pattern 83 for spp scheme"
- alternative_names:
- - "spp83"
- 213184:
- name: "Random pattern 84 for spp scheme"
- alternative_names:
- - "spp84"
- 213185:
- name: "Random pattern 85 for spp scheme"
- alternative_names:
- - "spp85"
- 213186:
- name: "Random pattern 86 for spp scheme"
- alternative_names:
- - "spp86"
- 213187:
- name: "Random pattern 87 for spp scheme"
- alternative_names:
- - "spp87"
- 213188:
- name: "Random pattern 88 for spp scheme"
- alternative_names:
- - "spp88"
- 213189:
- name: "Random pattern 89 for spp scheme"
- alternative_names:
- - "spp89"
- 213190:
- name: "Random pattern 90 for spp scheme"
- alternative_names:
- - "spp90"
- 213191:
- name: "Random pattern 91 for spp scheme"
- alternative_names:
- - "spp91"
- 213192:
- name: "Random pattern 92 for spp scheme"
- alternative_names:
- - "spp92"
- 213193:
- name: "Random pattern 93 for spp scheme"
- alternative_names:
- - "spp93"
- 213194:
- name: "Random pattern 94 for spp scheme"
- alternative_names:
- - "spp94"
- 213195:
- name: "Random pattern 95 for spp scheme"
- alternative_names:
- - "spp95"
- 213196:
- name: "Random pattern 96 for spp scheme"
- alternative_names:
- - "spp96"
- 213197:
- name: "Random pattern 97 for spp scheme"
- alternative_names:
- - "spp97"
- 213198:
- name: "Random pattern 98 for spp scheme"
- alternative_names:
- - "spp98"
- 213199:
- name: "Random pattern 99 for spp scheme"
- alternative_names:
- - "spp99"
- 213200:
- name: "Random pattern 100 for spp scheme"
- alternative_names:
- - "spp100"
- 213201:
- name: "Random pattern 101 for spp scheme"
- alternative_names:
- - "spp101"
- 213202:
- name: "Random pattern 102 for spp scheme"
- alternative_names:
- - "spp102"
- 213203:
- name: "Random pattern 103 for spp scheme"
- alternative_names:
- - "spp103"
- 213204:
- name: "Random pattern 104 for spp scheme"
- alternative_names:
- - "spp104"
- 213205:
- name: "Random pattern 105 for spp scheme"
- alternative_names:
- - "spp105"
- 213206:
- name: "Random pattern 106 for spp scheme"
- alternative_names:
- - "spp106"
- 213207:
- name: "Random pattern 107 for spp scheme"
- alternative_names:
- - "spp107"
- 213208:
- name: "Random pattern 108 for spp scheme"
- alternative_names:
- - "spp108"
- 213209:
- name: "Random pattern 109 for spp scheme"
- alternative_names:
- - "spp109"
- 213210:
- name: "Random pattern 110 for spp scheme"
- alternative_names:
- - "spp110"
- 213211:
- name: "Random pattern 111 for spp scheme"
- alternative_names:
- - "spp111"
- 213212:
- name: "Random pattern 112 for spp scheme"
- alternative_names:
- - "spp112"
- 213213:
- name: "Random pattern 113 for spp scheme"
- alternative_names:
- - "spp113"
- 213214:
- name: "Random pattern 114 for spp scheme"
- alternative_names:
- - "spp114"
- 213215:
- name: "Random pattern 115 for spp scheme"
- alternative_names:
- - "spp115"
- 213216:
- name: "Random pattern 116 for spp scheme"
- alternative_names:
- - "spp116"
- 213217:
- name: "Random pattern 117 for spp scheme"
- alternative_names:
- - "spp117"
- 213218:
- name: "Random pattern 118 for spp scheme"
- alternative_names:
- - "spp118"
- 213219:
- name: "Random pattern 119 for spp scheme"
- alternative_names:
- - "spp119"
- 213220:
- name: "Random pattern 120 for spp scheme"
- alternative_names:
- - "spp120"
- 213221:
- name: "Random pattern 121 for spp scheme"
- alternative_names:
- - "spp121"
- 214001:
- name: "Cosine of solar zenith angle"
- alternative_names:
- - "uvcossza"
- 214002:
- name: "Uv biologically effective dose"
- alternative_names:
- - "uvbed"
- 214003:
- name: "Uv biologically effective dose clear-sky"
- alternative_names:
- - "uvbedcs"
- 214004:
- name: "Total surface uv spectral flux (280-285 nm)"
- alternative_names:
- - "uvsflxt280285"
- 214005:
- name: "Total surface uv spectral flux (285-290 nm)"
- alternative_names:
- - "uvsflxt285290"
- 214006:
- name: "Total surface uv spectral flux (290-295 nm)"
- alternative_names:
- - "uvsflxt290295"
- 214007:
- name: "Total surface uv spectral flux (295-300 nm)"
- alternative_names:
- - "uvsflxt295300"
- 214008:
- name: "Total surface uv spectral flux (300-305 nm)"
- alternative_names:
- - "uvsflxt300305"
- 214009:
- name: "Total surface uv spectral flux (305-310 nm)"
- alternative_names:
- - "uvsflxt305310"
- 214010:
- name: "Total surface uv spectral flux (310-315 nm)"
- alternative_names:
- - "uvsflxt310315"
- 214011:
- name: "Total surface uv spectral flux (315-320 nm)"
- alternative_names:
- - "uvsflxt315320"
- 214012:
- name: "Total surface uv spectral flux (320-325 nm)"
- alternative_names:
- - "uvsflxt320325"
- 214013:
- name: "Total surface uv spectral flux (325-330 nm)"
- alternative_names:
- - "uvsflxt325330"
- 214014:
- name: "Total surface uv spectral flux (330-335 nm)"
- alternative_names:
- - "uvsflxt330335"
- 214015:
- name: "Total surface uv spectral flux (335-340 nm)"
- alternative_names:
- - "uvsflxt335340"
- 214016:
- name: "Total surface uv spectral flux (340-345 nm)"
- alternative_names:
- - "uvsflxt340345"
- 214017:
- name: "Total surface uv spectral flux (345-350 nm)"
- alternative_names:
- - "uvsflxt345350"
- 214018:
- name: "Total surface uv spectral flux (350-355 nm)"
- alternative_names:
- - "uvsflxt350355"
- 214019:
- name: "Total surface uv spectral flux (355-360 nm)"
- alternative_names:
- - "uvsflxt355360"
- 214020:
- name: "Total surface uv spectral flux (360-365 nm)"
- alternative_names:
- - "uvsflxt360365"
- 214021:
- name: "Total surface uv spectral flux (365-370 nm)"
- alternative_names:
- - "uvsflxt365370"
- 214022:
- name: "Total surface uv spectral flux (370-375 nm)"
- alternative_names:
- - "uvsflxt370375"
- 214023:
- name: "Total surface uv spectral flux (375-380 nm)"
- alternative_names:
- - "uvsflxt375380"
- 214024:
- name: "Total surface uv spectral flux (380-385 nm)"
- alternative_names:
- - "uvsflxt380385"
- 214025:
- name: "Total surface uv spectral flux (385-390 nm)"
- alternative_names:
- - "uvsflxt385390"
- 214026:
- name: "Total surface uv spectral flux (390-395 nm)"
- alternative_names:
- - "uvsflxt390395"
- 214027:
- name: "Total surface uv spectral flux (395-400 nm)"
- alternative_names:
- - "uvsflxt395400"
- 214028:
- name: "Clear-sky surface uv spectral flux (280-285 nm)"
- alternative_names:
- - "uvsflxcs280285"
- 214029:
- name: "Clear-sky surface uv spectral flux (285-290 nm)"
- alternative_names:
- - "uvsflxcs285290"
- 214030:
- name: "Clear-sky surface uv spectral flux (290-295 nm)"
- alternative_names:
- - "uvsflxcs290295"
- 214031:
- name: "Clear-sky surface uv spectral flux (295-300 nm)"
- alternative_names:
- - "uvsflxcs295300"
- 214032:
- name: "Clear-sky surface uv spectral flux (300-305 nm)"
- alternative_names:
- - "uvsflxcs300305"
- 214033:
- name: "Clear-sky surface uv spectral flux (305-310 nm)"
- alternative_names:
- - "uvsflxcs305310"
- 214034:
- name: "Clear-sky surface uv spectral flux (310-315 nm)"
- alternative_names:
- - "uvsflxcs310315"
- 214035:
- name: "Clear-sky surface uv spectral flux (315-320 nm)"
- alternative_names:
- - "uvsflxcs315320"
- 214036:
- name: "Clear-sky surface uv spectral flux (320-325 nm)"
- alternative_names:
- - "uvsflxcs320325"
- 214037:
- name: "Clear-sky surface uv spectral flux (325-330 nm)"
- alternative_names:
- - "uvsflxcs325330"
- 214038:
- name: "Clear-sky surface uv spectral flux (330-335 nm)"
- alternative_names:
- - "uvsflxcs330335"
- 214039:
- name: "Clear-sky surface uv spectral flux (335-340 nm)"
- alternative_names:
- - "uvsflxcs335340"
- 214040:
- name: "Clear-sky surface uv spectral flux (340-345 nm)"
- alternative_names:
- - "uvsflxcs340345"
- 214041:
- name: "Clear-sky surface uv spectral flux (345-350 nm)"
- alternative_names:
- - "uvsflxcs345350"
- 214042:
- name: "Clear-sky surface uv spectral flux (350-355 nm)"
- alternative_names:
- - "uvsflxcs350355"
- 214043:
- name: "Clear-sky surface uv spectral flux (355-360 nm)"
- alternative_names:
- - "uvsflxcs355360"
- 214044:
- name: "Clear-sky surface uv spectral flux (360-365 nm)"
- alternative_names:
- - "uvsflxcs360365"
- 214045:
- name: "Clear-sky surface uv spectral flux (365-370 nm)"
- alternative_names:
- - "uvsflxcs365370"
- 214046:
- name: "Clear-sky surface uv spectral flux (370-375 nm)"
- alternative_names:
- - "uvsflxcs370375"
- 214047:
- name: "Clear-sky surface uv spectral flux (375-380 nm)"
- alternative_names:
- - "uvsflxcs375380"
- 214048:
- name: "Clear-sky surface uv spectral flux (380-385 nm)"
- alternative_names:
- - "uvsflxcs380385"
- 214049:
- name: "Clear-sky surface uv spectral flux (385-390 nm)"
- alternative_names:
- - "uvsflxcs385390"
- 214050:
- name: "Clear-sky surface uv spectral flux (390-395 nm)"
- alternative_names:
- - "uvsflxcs390395"
- 214051:
- name: "Clear-sky surface uv spectral flux (395-400 nm)"
- alternative_names:
- - "uvsflxcs395400"
- 214052:
- name: "Profile of optical thickness at 340 nm"
- alternative_names:
- - "aot340"
- 215001:
- name: "Source/gain of sea salt aerosol (0.03 - 0.5 um)"
- alternative_names:
- - "aersrcsss"
- 215002:
- name: "Source/gain of sea salt aerosol (0.5 - 5 um)"
- alternative_names:
- - "aersrcssm"
- 215003:
- name: "Source/gain of sea salt aerosol (5 - 20 um)"
- alternative_names:
- - "aersrcssl"
- 215004:
- name: "Dry deposition of sea salt aerosol (0.03 - 0.5 um)"
- alternative_names:
- - "aerddpsss"
- 215005:
- name: "Dry deposition of sea salt aerosol (0.5 - 5 um)"
- alternative_names:
- - "aerddpssm"
- 215006:
- name: "Dry deposition of sea salt aerosol (5 - 20 um)"
- alternative_names:
- - "aerddpssl"
- 215007:
- name: "Sedimentation of sea salt aerosol (0.03 - 0.5 um)"
- alternative_names:
- - "aersdmsss"
- 215008:
- name: "Sedimentation of sea salt aerosol (0.5 - 5 um)"
- alternative_names:
- - "aersdmssm"
- 215009:
- name: "Sedimentation of sea salt aerosol (5 - 20 um)"
- alternative_names:
- - "aersdmssl"
- 215010:
- name: "Wet deposition of sea salt aerosol (0.03 - 0.5 um) by large-scale precipitation"
- alternative_names:
- - "aerwdlssss"
- 215011:
- name: "Wet deposition of sea salt aerosol (0.5 - 5 um) by large-scale precipitation"
- alternative_names:
- - "aerwdlsssm"
- 215012:
- name: "Wet deposition of sea salt aerosol (5 - 20 um) by large-scale precipitation"
- alternative_names:
- - "aerwdlsssl"
- 215013:
- name: "Wet deposition of sea salt aerosol (0.03 - 0.5 um) by convective precipitation"
- alternative_names:
- - "aerwdccsss"
- 215014:
- name: "Wet deposition of sea salt aerosol (0.5 - 5 um) by convective precipitation"
- alternative_names:
- - "aerwdccssm"
- 215015:
- name: "Wet deposition of sea salt aerosol (5 - 20 um) by convective precipitation"
- alternative_names:
- - "aerwdccssl"
- 215016:
- name: "Negative fixer of sea salt aerosol (0.03 - 0.5 um)"
- alternative_names:
- - "aerngtsss"
- 215017:
- name: "Negative fixer of sea salt aerosol (0.5 - 5 um)"
- alternative_names:
- - "aerngtssm"
- 215018:
- name: "Negative fixer of sea salt aerosol (5 - 20 um)"
- alternative_names:
- - "aerngtssl"
- 215019:
- name: "Vertically integrated mass of sea salt aerosol (0.03 - 0.5 um)"
- alternative_names:
- - "aermsssss"
- 215020:
- name: "Vertically integrated mass of sea salt aerosol (0.5 - 5 um)"
- alternative_names:
- - "aermssssm"
- 215021:
- name: "Vertically integrated mass of sea salt aerosol (5 - 20 um)"
- alternative_names:
- - "aermssssl"
- 215022:
- name: "Sea salt aerosol (0.03 - 0.5 um) optical depth"
- alternative_names:
- - "aerodsss"
- 215023:
- name: "Sea salt aerosol (0.5 - 5 um) optical depth"
- alternative_names:
- - "aerodssm"
- 215024:
- name: "Sea salt aerosol (5 - 20 um) optical depth"
- alternative_names:
- - "aerodssl"
- 215025:
- name: "Source/gain of dust aerosol (0.03 - 0.55 um)"
- alternative_names:
- - "aersrcdus"
- 215026:
- name: "Source/gain of dust aerosol (0.55 - 9 um)"
- alternative_names:
- - "aersrcdum"
- 215027:
- name: "Source/gain of dust aerosol (9 - 20 um)"
- alternative_names:
- - "aersrcdul"
- 215028:
- name: "Dry deposition of dust aerosol (0.03 - 0.55 um)"
- alternative_names:
- - "aerddpdus"
- 215029:
- name: "Dry deposition of dust aerosol (0.55 - 9 um)"
- alternative_names:
- - "aerddpdum"
- 215030:
- name: "Dry deposition of dust aerosol (9 - 20 um)"
- alternative_names:
- - "aerddpdul"
- 215031:
- name: "Sedimentation of dust aerosol (0.03 - 0.55 um)"
- alternative_names:
- - "aersdmdus"
- 215032:
- name: "Sedimentation of dust aerosol (0.55 - 9 um)"
- alternative_names:
- - "aersdmdum"
- 215033:
- name: "Sedimentation of dust aerosol (9 - 20 um)"
- alternative_names:
- - "aersdmdul"
- 215034:
- name: "Wet deposition of dust aerosol (0.03 - 0.55 um) by large-scale precipitation"
- alternative_names:
- - "aerwdlsdus"
- 215035:
- name: "Wet deposition of dust aerosol (0.55 - 9 um) by large-scale precipitation"
- alternative_names:
- - "aerwdlsdum"
- 215036:
- name: "Wet deposition of dust aerosol (9 - 20 um) by large-scale precipitation"
- alternative_names:
- - "aerwdlsdul"
- 215037:
- name: "Wet deposition of dust aerosol (0.03 - 0.55 um) by convective precipitation"
- alternative_names:
- - "aerwdccdus"
- 215038:
- name: "Wet deposition of dust aerosol (0.55 - 9 um) by convective precipitation"
- alternative_names:
- - "aerwdccdum"
- 215039:
- name: "Wet deposition of dust aerosol (9 - 20 um) by convective precipitation"
- alternative_names:
- - "aerwdccdul"
- 215040:
- name: "Negative fixer of dust aerosol (0.03 - 0.55 um)"
- alternative_names:
- - "aerngtdus"
- 215041:
- name: "Negative fixer of dust aerosol (0.55 - 9 um)"
- alternative_names:
- - "aerngtdum"
- 215042:
- name: "Negative fixer of dust aerosol (9 - 20 um)"
- alternative_names:
- - "aerngtdul"
- 215043:
- name: "Vertically integrated mass of dust aerosol (0.03 - 0.55 um)"
- alternative_names:
- - "aermssdus"
- 215044:
- name: "Vertically integrated mass of dust aerosol (0.55 - 9 um)"
- alternative_names:
- - "aermssdum"
- 215045:
- name: "Vertically integrated mass of dust aerosol (9 - 20 um)"
- alternative_names:
- - "aermssdul"
- 215046:
- name: "Dust aerosol (0.03 - 0.55 um) optical depth"
- alternative_names:
- - "aeroddus"
- 215047:
- name: "Dust aerosol (0.55 - 9 um) optical depth"
- alternative_names:
- - "aeroddum"
- 215048:
- name: "Dust aerosol (9 - 20 um) optical depth"
- alternative_names:
- - "aeroddul"
- 215049:
- name: "Source/gain of hydrophobic organic matter aerosol"
- alternative_names:
- - "aersrcomhphob"
- 215050:
- name: "Source/gain of hydrophilic organic matter aerosol"
- alternative_names:
- - "aersrcomhphil"
- 215051:
- name: "Dry deposition of hydrophobic organic matter aerosol"
- alternative_names:
- - "aerddpomhphob"
- 215052:
- name: "Dry deposition of hydrophilic organic matter aerosol"
- alternative_names:
- - "aerddpomhphil"
- 215053:
- name: "Sedimentation of hydrophobic organic matter aerosol"
- alternative_names:
- - "aersdmomhphob"
- 215054:
- name: "Sedimentation of hydrophilic organic matter aerosol"
- alternative_names:
- - "aersdmomhphil"
- 215055:
- name: "Wet deposition of hydrophobic organic matter aerosol by large-scale precipitation"
- alternative_names:
- - "aerwdlsomhphob"
- 215056:
- name: "Wet deposition of hydrophilic organic matter aerosol by large-scale precipitation"
- alternative_names:
- - "aerwdlsomhphil"
- 215057:
- name: "Wet deposition of hydrophobic organic matter aerosol by convective precipitation"
- alternative_names:
- - "aerwdccomhphob"
- 215058:
- name: "Wet deposition of hydrophilic organic matter aerosol by convective precipitation"
- alternative_names:
- - "aerwdccomhphil"
- 215059:
- name: "Negative fixer of hydrophobic organic matter aerosol"
- alternative_names:
- - "aerngtomhphob"
- 215060:
- name: "Negative fixer of hydrophilic organic matter aerosol"
- alternative_names:
- - "aerngtomhphil"
- 215061:
- name: "Vertically integrated mass of hydrophobic organic matter aerosol"
- alternative_names:
- - "aermssomhphob"
- 215062:
- name: "Vertically integrated mass of hydrophilic organic matter aerosol"
- alternative_names:
- - "aermssomhphil"
- 215063:
- name: "Hydrophobic organic matter aerosol optical depth"
- alternative_names:
- - "aerodomhphob"
- 215064:
- name: "Hydrophilic organic matter aerosol optical depth"
- alternative_names:
- - "aerodomhphil"
- 215065:
- name: "Source/gain of hydrophobic black carbon aerosol"
- alternative_names:
- - "aersrcbchphob"
- 215066:
- name: "Source/gain of hydrophilic black carbon aerosol"
- alternative_names:
- - "aersrcbchphil"
- 215067:
- name: "Dry deposition of hydrophobic black carbon aerosol"
- alternative_names:
- - "aerddpbchphob"
- 215068:
- name: "Dry deposition of hydrophilic black carbon aerosol"
- alternative_names:
- - "aerddpbchphil"
- 215069:
- name: "Sedimentation of hydrophobic black carbon aerosol"
- alternative_names:
- - "aersdmbchphob"
- 215070:
- name: "Sedimentation of hydrophilic black carbon aerosol"
- alternative_names:
- - "aersdmbchphil"
- 215071:
- name: "Wet deposition of hydrophobic black carbon aerosol by large-scale precipitation"
- alternative_names:
- - "aerwdlsbchphob"
- 215072:
- name: "Wet deposition of hydrophilic black carbon aerosol by large-scale precipitation"
- alternative_names:
- - "aerwdlsbchphil"
- 215073:
- name: "Wet deposition of hydrophobic black carbon aerosol by convective precipitation"
- alternative_names:
- - "aerwdccbchphob"
- 215074:
- name: "Wet deposition of hydrophilic black carbon aerosol by convective precipitation"
- alternative_names:
- - "aerwdccbchphil"
- 215075:
- name: "Negative fixer of hydrophobic black carbon aerosol"
- alternative_names:
- - "aerngtbchphob"
- 215076:
- name: "Negative fixer of hydrophilic black carbon aerosol"
- alternative_names:
- - "aerngtbchphil"
- 215077:
- name: "Vertically integrated mass of hydrophobic black carbon aerosol"
- alternative_names:
- - "aermssbchphob"
- 215078:
- name: "Vertically integrated mass of hydrophilic black carbon aerosol"
- alternative_names:
- - "aermssbchphil"
- 215079:
- name: "Hydrophobic black carbon aerosol optical depth"
- alternative_names:
- - "aerodbchphob"
- 215080:
- name: "Hydrophilic black carbon aerosol optical depth"
- alternative_names:
- - "aerodbchphil"
- 215081:
- name: "Source/gain of sulphate aerosol"
- alternative_names:
- - "aersrcsu"
- 215082:
- name: "Dry deposition of sulphate aerosol"
- alternative_names:
- - "aerddpsu"
- 215083:
- name: "Sedimentation of sulphate aerosol"
- alternative_names:
- - "aersdmsu"
- 215084:
- name: "Wet deposition of sulphate aerosol by large-scale precipitation"
- alternative_names:
- - "aerwdlssu"
- 215085:
- name: "Wet deposition of sulphate aerosol by convective precipitation"
- alternative_names:
- - "aerwdccsu"
- 215086:
- name: "Negative fixer of sulphate aerosol"
- alternative_names:
- - "aerngtsu"
- 215087:
- name: "Vertically integrated mass of sulphate aerosol"
- alternative_names:
- - "aermsssu"
- 215088:
- name: "Sulphate aerosol optical depth"
- alternative_names:
- - "aerodsu"
- 215089:
- name: "Accumulated total aerosol optical depth at 550 nm"
- alternative_names:
- - "accaod550"
- 215090:
- name: "Effective (snow effect included) uv visible albedo for direct radiation"
- alternative_names:
- - "aluvpsn"
- 215091:
- name: "10 metre wind speed dust emission potential"
- alternative_names:
- - "aerdep10si"
- 215092:
- name: "10 metre wind gustiness dust emission potential"
- alternative_names:
- - "aerdep10fg"
- 215093:
- name: "Total aerosol optical thickness at 532 nm"
- alternative_names:
- - "aot532"
- 215094:
- name: "Natural (sea-salt and dust) aerosol optical thickness at 532 nm"
- alternative_names:
- - "naot532"
- 215095:
- name: "Anthropogenic (black carbon, organic matter, sulphate) aerosol optical
- thickness at 532 nm"
- alternative_names:
- - "aaot532"
- 215096:
- name: "Total absorption aerosol optical depth at 340 nm"
- alternative_names:
- - "aodabs340"
- 215097:
- name: "Total absorption aerosol optical depth at 355 nm"
- alternative_names:
- - "aodabs355"
- 215098:
- name: "Total absorption aerosol optical depth at 380 nm"
- alternative_names:
- - "aodabs380"
- 215099:
- name: "Total absorption aerosol optical depth at 400 nm"
- alternative_names:
- - "aodabs400"
- 215100:
- name: "Total absorption aerosol optical depth at 440 nm"
- alternative_names:
- - "aodabs440"
- 215101:
- name: "Total absorption aerosol optical depth at 469 nm"
- alternative_names:
- - "aodabs469"
- 215102:
- name: "Total absorption aerosol optical depth at 500 nm"
- alternative_names:
- - "aodabs500"
- 215103:
- name: "Total absorption aerosol optical depth at 532 nm"
- alternative_names:
- - "aodabs532"
- 215104:
- name: "Total absorption aerosol optical depth at 550 nm"
- alternative_names:
- - "aodabs550"
- 215105:
- name: "Total absorption aerosol optical depth at 645 nm"
- alternative_names:
- - "aodabs645"
- 215106:
- name: "Total absorption aerosol optical depth at 670 nm"
- alternative_names:
- - "aodabs670"
- 215107:
- name: "Total absorption aerosol optical depth at 800 nm"
- alternative_names:
- - "aodabs800"
- 215108:
- name: "Total absorption aerosol optical depth at 858 nm"
- alternative_names:
- - "aodabs858"
- 215109:
- name: "Total absorption aerosol optical depth at 865 nm"
- alternative_names:
- - "aodabs865"
- 215110:
- name: "Total absorption aerosol optical depth at 1020 nm"
- alternative_names:
- - "aodabs1020"
- 215111:
- name: "Total absorption aerosol optical depth at 1064 nm"
- alternative_names:
- - "aodabs1064"
- 215112:
- name: "Total absorption aerosol optical depth at 1240 nm"
- alternative_names:
- - "aodabs1240"
- 215113:
- name: "Total absorption aerosol optical depth at 1640 nm"
- alternative_names:
- - "aodabs1640"
- 215114:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 340 nm"
- alternative_names:
- - "aodfm340"
- 215115:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 355 nm"
- alternative_names:
- - "aodfm355"
- 215116:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 380 nm"
- alternative_names:
- - "aodfm380"
- 215117:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 400 nm"
- alternative_names:
- - "aodfm400"
- 215118:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 440 nm"
- alternative_names:
- - "aodfm440"
- 215119:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 469 nm"
- alternative_names:
- - "aodfm469"
- 215120:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 500 nm"
- alternative_names:
- - "aodfm500"
- 215121:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 532 nm"
- alternative_names:
- - "aodfm532"
- 215122:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 550 nm"
- alternative_names:
- - "aodfm550"
- 215123:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 645 nm"
- alternative_names:
- - "aodfm645"
- 215124:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 670 nm"
- alternative_names:
- - "aodfm670"
- 215125:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 800 nm"
- alternative_names:
- - "aodfm800"
- 215126:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 858 nm"
- alternative_names:
- - "aodfm858"
- 215127:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 865 nm"
- alternative_names:
- - "aodfm865"
- 215128:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 1020 nm"
- alternative_names:
- - "aodfm1020"
- 215129:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 1064 nm"
- alternative_names:
- - "aodfm1064"
- 215130:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 1240 nm"
- alternative_names:
- - "aodfm1240"
- 215131:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 1640 nm"
- alternative_names:
- - "aodfm1640"
- 215132:
- name: "Single scattering albedo at 340 nm"
- alternative_names:
- - "ssa340"
- 215133:
- name: "Single scattering albedo at 355 nm"
- alternative_names:
- - "ssa355"
- 215134:
- name: "Single scattering albedo at 380 nm"
- alternative_names:
- - "ssa380"
- 215135:
- name: "Single scattering albedo at 400 nm"
- alternative_names:
- - "ssa400"
- 215136:
- name: "Single scattering albedo at 440 nm"
- alternative_names:
- - "ssa440"
- 215137:
- name: "Single scattering albedo at 469 nm"
- alternative_names:
- - "ssa469"
- 215138:
- name: "Single scattering albedo at 500 nm"
- alternative_names:
- - "ssa500"
- 215139:
- name: "Single scattering albedo at 532 nm"
- alternative_names:
- - "ssa532"
- 215140:
- name: "Single scattering albedo at 550 nm"
- alternative_names:
- - "ssa550"
- 215141:
- name: "Single scattering albedo at 645 nm"
- alternative_names:
- - "ssa645"
- 215142:
- name: "Single scattering albedo at 670 nm"
- alternative_names:
- - "ssa670"
- 215143:
- name: "Single scattering albedo at 800 nm"
- alternative_names:
- - "ssa800"
- 215144:
- name: "Single scattering albedo at 858 nm"
- alternative_names:
- - "ssa858"
- 215145:
- name: "Single scattering albedo at 865 nm"
- alternative_names:
- - "ssa865"
- 215146:
- name: "Single scattering albedo at 1020 nm"
- alternative_names:
- - "ssa1020"
- 215147:
- name: "Single scattering albedo at 1064 nm"
- alternative_names:
- - "ssa1064"
- 215148:
- name: "Single scattering albedo at 1240 nm"
- alternative_names:
- - "ssa1240"
- 215149:
- name: "Single scattering albedo at 1640 nm"
- alternative_names:
- - "ssa1640"
- 215150:
- name: "Asymmetry factor at 340 nm"
- alternative_names:
- - "asymmetry340"
- 215151:
- name: "Asymmetry factor at 355 nm"
- alternative_names:
- - "asymmetry355"
- 215152:
- name: "Asymmetry factor at 380 nm"
- alternative_names:
- - "asymmetry380"
- 215153:
- name: "Asymmetry factor at 400 nm"
- alternative_names:
- - "asymmetry400"
- 215154:
- name: "Asymmetry factor at 440 nm"
- alternative_names:
- - "asymmetry440"
- 215155:
- name: "Asymmetry factor at 469 nm"
- alternative_names:
- - "asymmetry469"
- 215156:
- name: "Asymmetry factor at 500 nm"
- alternative_names:
- - "asymmetry500"
- 215157:
- name: "Asymmetry factor at 532 nm"
- alternative_names:
- - "asymmetry532"
- 215158:
- name: "Asymmetry factor at 550 nm"
- alternative_names:
- - "asymmetry550"
- 215159:
- name: "Asymmetry factor at 645 nm"
- alternative_names:
- - "asymmetry645"
- 215160:
- name: "Asymmetry factor at 670 nm"
- alternative_names:
- - "asymmetry670"
- 215161:
- name: "Asymmetry factor at 800 nm"
- alternative_names:
- - "asymmetry800"
- 215162:
- name: "Asymmetry factor at 858 nm"
- alternative_names:
- - "asymmetry858"
- 215163:
- name: "Asymmetry factor at 865 nm"
- alternative_names:
- - "asymmetry865"
- 215164:
- name: "Asymmetry factor at 1020 nm"
- alternative_names:
- - "asymmetry1020"
- 215165:
- name: "Asymmetry factor at 1064 nm"
- alternative_names:
- - "asymmetry1064"
- 215166:
- name: "Asymmetry factor at 1240 nm"
- alternative_names:
- - "asymmetry1240"
- 215167:
- name: "Asymmetry factor at 1640 nm"
- alternative_names:
- - "asymmetry1640"
- 215168:
- name: "Source/gain of sulphur dioxide"
- alternative_names:
- - "aersrcso2"
- 215169:
- name: "Dry deposition of sulphur dioxide"
- alternative_names:
- - "aerddpso2"
- 215170:
- name: "Sedimentation of sulphur dioxide"
- alternative_names:
- - "aersdmso2"
- 215171:
- name: "Wet deposition of sulphur dioxide by large-scale precipitation"
- alternative_names:
- - "aerwdlsso2"
- 215172:
- name: "Wet deposition of sulphur dioxide by convective precipitation"
- alternative_names:
- - "aerwdccso2"
- 215173:
- name: "Negative fixer of sulphur dioxide"
- alternative_names:
- - "aerngtso2"
- 215174:
- name: "Vertically integrated mass of sulphur dioxide"
- alternative_names:
- - "aermssso2"
- 215175:
- name: "Sulphur dioxide optical depth"
- alternative_names:
- - "aerodso2"
- 215176:
- name: "Total absorption aerosol optical depth at 2130 nm"
- alternative_names:
- - "aodabs2130"
- 215177:
- name: "Total fine mode (r < 0.5 um) aerosol optical depth at 2130 nm"
- alternative_names:
- - "aodfm2130"
- 215178:
- name: "Single scattering albedo at 2130 nm"
- alternative_names:
- - "ssa2130"
- 215179:
- name: "Asymmetry factor at 2130 nm"
- alternative_names:
- - "asymmetry2130"
- 215180:
- name: "Aerosol extinction coefficient at 355 nm"
- alternative_names:
- - "aerext355"
- 215181:
- name: "Aerosol extinction coefficient at 532 nm"
- alternative_names:
- - "aerext532"
- 215182:
- name: "Aerosol extinction coefficient at 1064 nm"
- alternative_names:
- - "aerext1064"
- 215183:
- name: "Aerosol backscatter coefficient at 355 nm (from top of atmosphere)"
- alternative_names:
- - "aerbackscattoa355"
- 215184:
- name: "Aerosol backscatter coefficient at 532 nm (from top of atmosphere)"
- alternative_names:
- - "aerbackscattoa532"
- 215185:
- name: "Aerosol backscatter coefficient at 1064 nm (from top of atmosphere)"
- alternative_names:
- - "aerbackscattoa1064"
- 215186:
- name: "Aerosol backscatter coefficient at 355 nm (from ground)"
- alternative_names:
- - "aerbackscatgnd355"
- 215187:
- name: "Aerosol backscatter coefficient at 532 nm (from ground)"
- alternative_names:
- - "aerbackscatgnd532"
- 215188:
- name: "Aerosol backscatter coefficient at 1064 nm (from ground)"
- alternative_names:
- - "aerbackscatgnd1064"
- 215189:
- name: "Source/gain of fine-mode nitrate aerosol"
- alternative_names:
- - "aersrcnif"
- 215190:
- name: "Source/gain of coarse-mode nitrate aerosol"
- alternative_names:
- - "aersrcnic"
- 215191:
- name: "Dry deposition of fine-mode nitrate aerosol"
- alternative_names:
- - "aerddpnif"
- 215192:
- name: "Dry deposition of coarse-mode nitrate aerosol"
- alternative_names:
- - "aerddpnic"
- 215193:
- name: "Sedimentation of fine-mode nitrate aerosol"
- alternative_names:
- - "aersdmnif"
- 215194:
- name: "Sedimentation of coarse-mode nitrate aerosol"
- alternative_names:
- - "aersdmnic"
- 215195:
- name: "Wet deposition of fine-mode nitrate aerosol by large-scale precipitation"
- alternative_names:
- - "aerwdlnif"
- 215196:
- name: "Wet deposition of coarse-mode nitrate aerosol by large-scale precipitation"
- alternative_names:
- - "aerwdlnic"
- 215197:
- name: "Wet deposition of fine-mode nitrate aerosol by convective precipitation"
- alternative_names:
- - "aerwdcnif"
- 215198:
- name: "Wet deposition of coarse-mode nitrate aerosol by convective precipitation"
- alternative_names:
- - "aerwdcnic"
- 215199:
- name: "Negative fixer of fine-mode nitrate aerosol"
- alternative_names:
- - "aerngtnif"
- 215200:
- name: "Negative fixer of coarse-mode nitrate aerosol"
- alternative_names:
- - "aerngtnic"
- 215201:
- name: "Vertically integrated mass of fine-mode nitrate aerosol"
- alternative_names:
- - "aermssnif"
- 215202:
- name: "Vertically integrated mass of coarse-mode nitrate aerosol"
- alternative_names:
- - "aermssnic"
- 215203:
- name: "Fine-mode nitrate aerosol optical depth at 550 nm"
- alternative_names:
- - "aerodnif"
- 215204:
- name: "Coarse-mode nitrate aerosol optical depth at 550 nm"
- alternative_names:
- - "aerodnic"
- 215205:
- name: "Source/gain of ammonium aerosol"
- alternative_names:
- - "aersrcam"
- 215206:
- name: "Dry deposition of ammonium aerosol"
- alternative_names:
- - "aerddpam"
- 215207:
- name: "Sedimentation of ammonium aerosol"
- alternative_names:
- - "aersdmam"
- 215208:
- name: "Wet deposition of ammonium aerosol by large-scale precipitation"
- alternative_names:
- - "aerwdlam"
- 215209:
- name: "Wet deposition of ammonium aerosol by convective precipitation"
- alternative_names:
- - "aerwdcam"
- 215210:
- name: "Negative fixer of ammonium aerosol"
- alternative_names:
- - "aerngtam"
- 215211:
- name: "Vertically integrated mass of ammonium aerosol"
- alternative_names:
- - "aermssam"
- 215212:
- name: "Source/gain of biogenic secondary organic aerosol"
- alternative_names:
- - "aersrcsoab"
- 215213:
- name: "Dry deposition of biogenic secondary organic aerosol"
- alternative_names:
- - "aerddpsoab"
- 215214:
- name: "Sedimentation of biogenic secondary organic aerosol"
- alternative_names:
- - "aersdmsoab"
- 215215:
- name: "Wet deposition of biogenic secondary organic aerosol by large-scale precipitation"
- alternative_names:
- - "aerwdlsoab"
- 215216:
- name: "Wet deposition of biogenic secondary organic aerosol by convective precipitation"
- alternative_names:
- - "aerwdcsoab"
- 215217:
- name: "Negative fixer of biogenic secondary organic aerosol"
- alternative_names:
- - "aerngtsoab"
- 215218:
- name: "Vertically integrated mass of biogenic secondary organic aerosol"
- alternative_names:
- - "aermsssoab"
- 215219:
- name: "Source/gain of anthropogenic secondary organic aerosol"
- alternative_names:
- - "aersrcsoaa"
- 215220:
- name: "Dry deposition of anthropogenic secondary organic aerosol"
- alternative_names:
- - "aerddpsoaa"
- 215221:
- name: "Sedimentation of anthropogenic secondary organic aerosol"
- alternative_names:
- - "aersdmsoaa"
- 215222:
- name: "Wet deposition of anthropogenic secondary organic aerosol by large-scale
- precipitation"
- alternative_names:
- - "aerwdlsoaa"
- 215223:
- name: "Wet deposition of anthropogenic secondary organic aerosol by convective
- precipitation"
- alternative_names:
- - "aerwdcsoaa"
- 215224:
- name: "Negative fixer of anthropogenic secondary organic aerosol"
- alternative_names:
- - "aerngtsoaa"
- 215225:
- name: "Vertically integrated mass of anthropogenic secondary organic aerosol"
- alternative_names:
- - "aermsssoaa"
- 215226:
- name: "Secondary organic aerosol optical depth at 550 nm"
- alternative_names:
- - "soaod550"
- 216001:
- name: "Experimental product"
- alternative_names:
- - "_param_216001"
- 216002:
- name: "Experimental product"
- alternative_names:
- - "_param_216002"
- 216003:
- name: "Experimental product"
- alternative_names:
- - "_param_216003"
- 216004:
- name: "Experimental product"
- alternative_names:
- - "_param_216004"
- 216005:
- name: "Experimental product"
- alternative_names:
- - "_param_216005"
- 216006:
- name: "Experimental product"
- alternative_names:
- - "_param_216006"
- 216007:
- name: "Experimental product"
- alternative_names:
- - "_param_216007"
- 216008:
- name: "Experimental product"
- alternative_names:
- - "_param_216008"
- 216009:
- name: "Experimental product"
- alternative_names:
- - "_param_216009"
- 216010:
- name: "Experimental product"
- alternative_names:
- - "_param_216010"
- 216011:
- name: "Experimental product"
- alternative_names:
- - "_param_216011"
- 216012:
- name: "Experimental product"
- alternative_names:
- - "_param_216012"
- 216013:
- name: "Experimental product"
- alternative_names:
- - "_param_216013"
- 216014:
- name: "Experimental product"
- alternative_names:
- - "_param_216014"
- 216015:
- name: "Experimental product"
- alternative_names:
- - "_param_216015"
- 216016:
- name: "Experimental product"
- alternative_names:
- - "_param_216016"
- 216017:
- name: "Experimental product"
- alternative_names:
- - "_param_216017"
- 216018:
- name: "Experimental product"
- alternative_names:
- - "_param_216018"
- 216019:
- name: "Experimental product"
- alternative_names:
- - "_param_216019"
- 216020:
- name: "Experimental product"
- alternative_names:
- - "_param_216020"
- 216021:
- name: "Experimental product"
- alternative_names:
- - "_param_216021"
- 216022:
- name: "Experimental product"
- alternative_names:
- - "_param_216022"
- 216023:
- name: "Experimental product"
- alternative_names:
- - "_param_216023"
- 216024:
- name: "Experimental product"
- alternative_names:
- - "_param_216024"
- 216025:
- name: "Experimental product"
- alternative_names:
- - "_param_216025"
- 216026:
- name: "Experimental product"
- alternative_names:
- - "_param_216026"
- 216027:
- name: "Experimental product"
- alternative_names:
- - "_param_216027"
- 216028:
- name: "Experimental product"
- alternative_names:
- - "_param_216028"
- 216029:
- name: "Experimental product"
- alternative_names:
- - "_param_216029"
- 216030:
- name: "Experimental product"
- alternative_names:
- - "_param_216030"
- 216031:
- name: "Experimental product"
- alternative_names:
- - "_param_216031"
- 216032:
- name: "Experimental product"
- alternative_names:
- - "_param_216032"
- 216033:
- name: "Experimental product"
- alternative_names:
- - "_param_216033"
- 216034:
- name: "Experimental product"
- alternative_names:
- - "_param_216034"
- 216035:
- name: "Experimental product"
- alternative_names:
- - "_param_216035"
- 216036:
- name: "Experimental product"
- alternative_names:
- - "_param_216036"
- 216037:
- name: "Experimental product"
- alternative_names:
- - "_param_216037"
- 216038:
- name: "Experimental product"
- alternative_names:
- - "_param_216038"
- 216039:
- name: "Experimental product"
- alternative_names:
- - "_param_216039"
- 216040:
- name: "Experimental product"
- alternative_names:
- - "_param_216040"
- 216041:
- name: "Experimental product"
- alternative_names:
- - "_param_216041"
- 216042:
- name: "Experimental product"
- alternative_names:
- - "_param_216042"
- 216043:
- name: "Experimental product"
- alternative_names:
- - "_param_216043"
- 216044:
- name: "Experimental product"
- alternative_names:
- - "_param_216044"
- 216045:
- name: "Experimental product"
- alternative_names:
- - "_param_216045"
- 216046:
- name: "Experimental product"
- alternative_names:
- - "_param_216046"
- 216047:
- name: "Experimental product"
- alternative_names:
- - "_param_216047"
- 216048:
- name: "Experimental product"
- alternative_names:
- - "_param_216048"
- 216049:
- name: "Experimental product"
- alternative_names:
- - "_param_216049"
- 216050:
- name: "Experimental product"
- alternative_names:
- - "_param_216050"
- 216051:
- name: "Experimental product"
- alternative_names:
- - "_param_216051"
- 216052:
- name: "Experimental product"
- alternative_names:
- - "_param_216052"
- 216053:
- name: "Experimental product"
- alternative_names:
- - "_param_216053"
- 216054:
- name: "Experimental product"
- alternative_names:
- - "_param_216054"
- 216055:
- name: "Experimental product"
- alternative_names:
- - "_param_216055"
- 216056:
- name: "Experimental product"
- alternative_names:
- - "_param_216056"
- 216057:
- name: "Experimental product"
- alternative_names:
- - "_param_216057"
- 216058:
- name: "Experimental product"
- alternative_names:
- - "_param_216058"
- 216059:
- name: "Experimental product"
- alternative_names:
- - "_param_216059"
- 216060:
- name: "Experimental product"
- alternative_names:
- - "_param_216060"
- 216061:
- name: "Experimental product"
- alternative_names:
- - "_param_216061"
- 216062:
- name: "Experimental product"
- alternative_names:
- - "_param_216062"
- 216063:
- name: "Experimental product"
- alternative_names:
- - "_param_216063"
- 216064:
- name: "Experimental product"
- alternative_names:
- - "_param_216064"
- 216065:
- name: "Experimental product"
- alternative_names:
- - "_param_216065"
- 216066:
- name: "Experimental product"
- alternative_names:
- - "_param_216066"
- 216067:
- name: "Experimental product"
- alternative_names:
- - "_param_216067"
- 216068:
- name: "Experimental product"
- alternative_names:
- - "_param_216068"
- 216069:
- name: "Experimental product"
- alternative_names:
- - "_param_216069"
- 216070:
- name: "Experimental product"
- alternative_names:
- - "_param_216070"
- 216071:
- name: "Experimental product"
- alternative_names:
- - "_param_216071"
- 216072:
- name: "Experimental product"
- alternative_names:
- - "_param_216072"
- 216073:
- name: "Experimental product"
- alternative_names:
- - "_param_216073"
- 216074:
- name: "Experimental product"
- alternative_names:
- - "_param_216074"
- 216075:
- name: "Experimental product"
- alternative_names:
- - "_param_216075"
- 216076:
- name: "Experimental product"
- alternative_names:
- - "_param_216076"
- 216077:
- name: "Experimental product"
- alternative_names:
- - "_param_216077"
- 216078:
- name: "Experimental product"
- alternative_names:
- - "_param_216078"
- 216079:
- name: "Experimental product"
- alternative_names:
- - "_param_216079"
- 216080:
- name: "Experimental product"
- alternative_names:
- - "_param_216080"
- 216081:
- name: "Experimental product"
- alternative_names:
- - "_param_216081"
- 216082:
- name: "Experimental product"
- alternative_names:
- - "_param_216082"
- 216083:
- name: "Experimental product"
- alternative_names:
- - "_param_216083"
- 216084:
- name: "Experimental product"
- alternative_names:
- - "_param_216084"
- 216085:
- name: "Experimental product"
- alternative_names:
- - "_param_216085"
- 216086:
- name: "Experimental product"
- alternative_names:
- - "_param_216086"
- 216087:
- name: "Experimental product"
- alternative_names:
- - "_param_216087"
- 216088:
- name: "Experimental product"
- alternative_names:
- - "_param_216088"
- 216089:
- name: "Experimental product"
- alternative_names:
- - "_param_216089"
- 216090:
- name: "Experimental product"
- alternative_names:
- - "_param_216090"
- 216091:
- name: "Experimental product"
- alternative_names:
- - "_param_216091"
- 216092:
- name: "Experimental product"
- alternative_names:
- - "_param_216092"
- 216093:
- name: "Experimental product"
- alternative_names:
- - "_param_216093"
- 216094:
- name: "Experimental product"
- alternative_names:
- - "_param_216094"
- 216095:
- name: "Experimental product"
- alternative_names:
- - "_param_216095"
- 216096:
- name: "Experimental product"
- alternative_names:
- - "_param_216096"
- 216097:
- name: "Experimental product"
- alternative_names:
- - "_param_216097"
- 216098:
- name: "Experimental product"
- alternative_names:
- - "_param_216098"
- 216099:
- name: "Experimental product"
- alternative_names:
- - "_param_216099"
- 216100:
- name: "Experimental product"
- alternative_names:
- - "_param_216100"
- 216101:
- name: "Experimental product"
- alternative_names:
- - "_param_216101"
- 216102:
- name: "Experimental product"
- alternative_names:
- - "_param_216102"
- 216103:
- name: "Experimental product"
- alternative_names:
- - "_param_216103"
- 216104:
- name: "Experimental product"
- alternative_names:
- - "_param_216104"
- 216105:
- name: "Experimental product"
- alternative_names:
- - "_param_216105"
- 216106:
- name: "Experimental product"
- alternative_names:
- - "_param_216106"
- 216107:
- name: "Experimental product"
- alternative_names:
- - "_param_216107"
- 216108:
- name: "Experimental product"
- alternative_names:
- - "_param_216108"
- 216109:
- name: "Experimental product"
- alternative_names:
- - "_param_216109"
- 216110:
- name: "Experimental product"
- alternative_names:
- - "_param_216110"
- 216111:
- name: "Experimental product"
- alternative_names:
- - "_param_216111"
- 216112:
- name: "Experimental product"
- alternative_names:
- - "_param_216112"
- 216113:
- name: "Experimental product"
- alternative_names:
- - "_param_216113"
- 216114:
- name: "Experimental product"
- alternative_names:
- - "_param_216114"
- 216115:
- name: "Experimental product"
- alternative_names:
- - "_param_216115"
- 216116:
- name: "Experimental product"
- alternative_names:
- - "_param_216116"
- 216117:
- name: "Experimental product"
- alternative_names:
- - "_param_216117"
- 216118:
- name: "Experimental product"
- alternative_names:
- - "_param_216118"
- 216119:
- name: "Experimental product"
- alternative_names:
- - "_param_216119"
- 216120:
- name: "Experimental product"
- alternative_names:
- - "_param_216120"
- 216121:
- name: "Experimental product"
- alternative_names:
- - "_param_216121"
- 216122:
- name: "Experimental product"
- alternative_names:
- - "_param_216122"
- 216123:
- name: "Experimental product"
- alternative_names:
- - "_param_216123"
- 216124:
- name: "Experimental product"
- alternative_names:
- - "_param_216124"
- 216125:
- name: "Experimental product"
- alternative_names:
- - "_param_216125"
- 216126:
- name: "Experimental product"
- alternative_names:
- - "_param_216126"
- 216127:
- name: "Experimental product"
- alternative_names:
- - "_param_216127"
- 216128:
- name: "Experimental product"
- alternative_names:
- - "_param_216128"
- 216129:
- name: "Experimental product"
- alternative_names:
- - "_param_216129"
- 216130:
- name: "Experimental product"
- alternative_names:
- - "_param_216130"
- 216131:
- name: "Experimental product"
- alternative_names:
- - "_param_216131"
- 216132:
- name: "Experimental product"
- alternative_names:
- - "_param_216132"
- 216133:
- name: "Experimental product"
- alternative_names:
- - "_param_216133"
- 216134:
- name: "Experimental product"
- alternative_names:
- - "_param_216134"
- 216135:
- name: "Experimental product"
- alternative_names:
- - "_param_216135"
- 216136:
- name: "Experimental product"
- alternative_names:
- - "_param_216136"
- 216137:
- name: "Experimental product"
- alternative_names:
- - "_param_216137"
- 216138:
- name: "Experimental product"
- alternative_names:
- - "_param_216138"
- 216139:
- name: "Experimental product"
- alternative_names:
- - "_param_216139"
- 216140:
- name: "Experimental product"
- alternative_names:
- - "_param_216140"
- 216141:
- name: "Experimental product"
- alternative_names:
- - "_param_216141"
- 216142:
- name: "Experimental product"
- alternative_names:
- - "_param_216142"
- 216143:
- name: "Experimental product"
- alternative_names:
- - "_param_216143"
- 216144:
- name: "Experimental product"
- alternative_names:
- - "_param_216144"
- 216145:
- name: "Experimental product"
- alternative_names:
- - "_param_216145"
- 216146:
- name: "Experimental product"
- alternative_names:
- - "_param_216146"
- 216147:
- name: "Experimental product"
- alternative_names:
- - "_param_216147"
- 216148:
- name: "Experimental product"
- alternative_names:
- - "_param_216148"
- 216149:
- name: "Experimental product"
- alternative_names:
- - "_param_216149"
- 216150:
- name: "Experimental product"
- alternative_names:
- - "_param_216150"
- 216151:
- name: "Experimental product"
- alternative_names:
- - "_param_216151"
- 216152:
- name: "Experimental product"
- alternative_names:
- - "_param_216152"
- 216153:
- name: "Experimental product"
- alternative_names:
- - "_param_216153"
- 216154:
- name: "Experimental product"
- alternative_names:
- - "_param_216154"
- 216155:
- name: "Experimental product"
- alternative_names:
- - "_param_216155"
- 216156:
- name: "Experimental product"
- alternative_names:
- - "_param_216156"
- 216157:
- name: "Experimental product"
- alternative_names:
- - "_param_216157"
- 216158:
- name: "Experimental product"
- alternative_names:
- - "_param_216158"
- 216159:
- name: "Experimental product"
- alternative_names:
- - "_param_216159"
- 216160:
- name: "Experimental product"
- alternative_names:
- - "_param_216160"
- 216161:
- name: "Experimental product"
- alternative_names:
- - "_param_216161"
- 216162:
- name: "Experimental product"
- alternative_names:
- - "_param_216162"
- 216163:
- name: "Experimental product"
- alternative_names:
- - "_param_216163"
- 216164:
- name: "Experimental product"
- alternative_names:
- - "_param_216164"
- 216165:
- name: "Experimental product"
- alternative_names:
- - "_param_216165"
- 216166:
- name: "Experimental product"
- alternative_names:
- - "_param_216166"
- 216167:
- name: "Experimental product"
- alternative_names:
- - "_param_216167"
- 216168:
- name: "Experimental product"
- alternative_names:
- - "_param_216168"
- 216169:
- name: "Experimental product"
- alternative_names:
- - "_param_216169"
- 216170:
- name: "Experimental product"
- alternative_names:
- - "_param_216170"
- 216171:
- name: "Experimental product"
- alternative_names:
- - "_param_216171"
- 216172:
- name: "Experimental product"
- alternative_names:
- - "_param_216172"
- 216173:
- name: "Experimental product"
- alternative_names:
- - "_param_216173"
- 216174:
- name: "Experimental product"
- alternative_names:
- - "_param_216174"
- 216175:
- name: "Experimental product"
- alternative_names:
- - "_param_216175"
- 216176:
- name: "Experimental product"
- alternative_names:
- - "_param_216176"
- 216177:
- name: "Experimental product"
- alternative_names:
- - "_param_216177"
- 216178:
- name: "Experimental product"
- alternative_names:
- - "_param_216178"
- 216179:
- name: "Experimental product"
- alternative_names:
- - "_param_216179"
- 216180:
- name: "Experimental product"
- alternative_names:
- - "_param_216180"
- 216181:
- name: "Experimental product"
- alternative_names:
- - "_param_216181"
- 216182:
- name: "Experimental product"
- alternative_names:
- - "_param_216182"
- 216183:
- name: "Experimental product"
- alternative_names:
- - "_param_216183"
- 216184:
- name: "Experimental product"
- alternative_names:
- - "_param_216184"
- 216185:
- name: "Experimental product"
- alternative_names:
- - "_param_216185"
- 216186:
- name: "Experimental product"
- alternative_names:
- - "_param_216186"
- 216187:
- name: "Experimental product"
- alternative_names:
- - "_param_216187"
- 216188:
- name: "Experimental product"
- alternative_names:
- - "_param_216188"
- 216189:
- name: "Experimental product"
- alternative_names:
- - "_param_216189"
- 216190:
- name: "Experimental product"
- alternative_names:
- - "_param_216190"
- 216191:
- name: "Experimental product"
- alternative_names:
- - "_param_216191"
- 216192:
- name: "Experimental product"
- alternative_names:
- - "_param_216192"
- 216193:
- name: "Experimental product"
- alternative_names:
- - "_param_216193"
- 216194:
- name: "Experimental product"
- alternative_names:
- - "_param_216194"
- 216195:
- name: "Experimental product"
- alternative_names:
- - "_param_216195"
- 216196:
- name: "Experimental product"
- alternative_names:
- - "_param_216196"
- 216197:
- name: "Experimental product"
- alternative_names:
- - "_param_216197"
- 216198:
- name: "Experimental product"
- alternative_names:
- - "_param_216198"
- 216199:
- name: "Experimental product"
- alternative_names:
- - "_param_216199"
- 216200:
- name: "Experimental product"
- alternative_names:
- - "_param_216200"
- 216201:
- name: "Experimental product"
- alternative_names:
- - "_param_216201"
- 216202:
- name: "Experimental product"
- alternative_names:
- - "_param_216202"
- 216203:
- name: "Experimental product"
- alternative_names:
- - "_param_216203"
- 216204:
- name: "Experimental product"
- alternative_names:
- - "_param_216204"
- 216205:
- name: "Experimental product"
- alternative_names:
- - "_param_216205"
- 216206:
- name: "Experimental product"
- alternative_names:
- - "_param_216206"
- 216207:
- name: "Experimental product"
- alternative_names:
- - "_param_216207"
- 216208:
- name: "Experimental product"
- alternative_names:
- - "_param_216208"
- 216209:
- name: "Experimental product"
- alternative_names:
- - "_param_216209"
- 216210:
- name: "Experimental product"
- alternative_names:
- - "_param_216210"
- 216211:
- name: "Experimental product"
- alternative_names:
- - "_param_216211"
- 216212:
- name: "Experimental product"
- alternative_names:
- - "_param_216212"
- 216213:
- name: "Experimental product"
- alternative_names:
- - "_param_216213"
- 216214:
- name: "Experimental product"
- alternative_names:
- - "_param_216214"
- 216215:
- name: "Experimental product"
- alternative_names:
- - "_param_216215"
- 216216:
- name: "Experimental product"
- alternative_names:
- - "_param_216216"
- 216217:
- name: "Experimental product"
- alternative_names:
- - "_param_216217"
- 216218:
- name: "Experimental product"
- alternative_names:
- - "_param_216218"
- 216219:
- name: "Experimental product"
- alternative_names:
- - "_param_216219"
- 216220:
- name: "Experimental product"
- alternative_names:
- - "_param_216220"
- 216221:
- name: "Experimental product"
- alternative_names:
- - "_param_216221"
- 216222:
- name: "Experimental product"
- alternative_names:
- - "_param_216222"
- 216223:
- name: "Experimental product"
- alternative_names:
- - "_param_216223"
- 216224:
- name: "Experimental product"
- alternative_names:
- - "_param_216224"
- 216225:
- name: "Experimental product"
- alternative_names:
- - "_param_216225"
- 216226:
- name: "Experimental product"
- alternative_names:
- - "_param_216226"
- 216227:
- name: "Experimental product"
- alternative_names:
- - "_param_216227"
- 216228:
- name: "Experimental product"
- alternative_names:
- - "_param_216228"
- 216229:
- name: "Experimental product"
- alternative_names:
- - "_param_216229"
- 216230:
- name: "Experimental product"
- alternative_names:
- - "_param_216230"
- 216231:
- name: "Experimental product"
- alternative_names:
- - "_param_216231"
- 216232:
- name: "Experimental product"
- alternative_names:
- - "_param_216232"
- 216233:
- name: "Experimental product"
- alternative_names:
- - "_param_216233"
- 216234:
- name: "Experimental product"
- alternative_names:
- - "_param_216234"
- 216235:
- name: "Experimental product"
- alternative_names:
- - "_param_216235"
- 216236:
- name: "Experimental product"
- alternative_names:
- - "_param_216236"
- 216237:
- name: "Experimental product"
- alternative_names:
- - "_param_216237"
- 216238:
- name: "Experimental product"
- alternative_names:
- - "_param_216238"
- 216239:
- name: "Experimental product"
- alternative_names:
- - "_param_216239"
- 216240:
- name: "Experimental product"
- alternative_names:
- - "_param_216240"
- 216241:
- name: "Experimental product"
- alternative_names:
- - "_param_216241"
- 216242:
- name: "Experimental product"
- alternative_names:
- - "_param_216242"
- 216243:
- name: "Experimental product"
- alternative_names:
- - "_param_216243"
- 216244:
- name: "Experimental product"
- alternative_names:
- - "_param_216244"
- 216245:
- name: "Experimental product"
- alternative_names:
- - "_param_216245"
- 216246:
- name: "Experimental product"
- alternative_names:
- - "_param_216246"
- 216247:
- name: "Experimental product"
- alternative_names:
- - "_param_216247"
- 216248:
- name: "Experimental product"
- alternative_names:
- - "_param_216248"
- 216249:
- name: "Experimental product"
- alternative_names:
- - "_param_216249"
- 216250:
- name: "Experimental product"
- alternative_names:
- - "_param_216250"
- 216251:
- name: "Experimental product"
- alternative_names:
- - "_param_216251"
- 216252:
- name: "Experimental product"
- alternative_names:
- - "_param_216252"
- 216253:
- name: "Experimental product"
- alternative_names:
- - "_param_216253"
- 216254:
- name: "Experimental product"
- alternative_names:
- - "_param_216254"
- 216255:
- name: "Experimental product"
- alternative_names:
- - "_param_216255"
- 217003:
- name: "Hydrogen peroxide"
- alternative_names:
- - "h2o2"
- 217004:
- name: "Methane (chemistry)"
- alternative_names:
- - "ch4_c"
- 217006:
- name: "Nitric acid"
- alternative_names:
- - "hno3"
- 217007:
- name: "Methyl peroxide"
- alternative_names:
- - "ch3ooh"
- 217009:
- name: "Paraffins"
- alternative_names:
- - "par"
- 217010:
- name: "Ethene"
- alternative_names:
- - "c2h4"
- 217011:
- name: "Olefins"
- alternative_names:
- - "ole"
- 217012:
- name: "Aldehydes"
- alternative_names:
- - "ald2"
- 217013:
- name: "Peroxyacetyl nitrate"
- alternative_names:
- - "pan"
- 217014:
- name: "Peroxides"
- alternative_names:
- - "rooh"
- 217015:
- name: "Organic nitrates"
- alternative_names:
- - "onit"
- 217016:
- name: "Isoprene"
- alternative_names:
- - "c5h8"
- 217018:
- name: "Dimethyl sulfide"
- alternative_names:
- - "dms"
- 217019:
- name: "Ammonia mass mixing ratio"
- alternative_names:
- - "nh3"
- 217020:
- name: "Sulfate"
- alternative_names:
- - "so4"
- 217021:
- name: "Ammonium"
- alternative_names:
- - "nh4"
- 217022:
- name: "Methane sulfonic acid"
- alternative_names:
- - "msa"
- 217023:
- name: "Methyl glyoxal"
- alternative_names:
- - "ch3cocho"
- 217024:
- name: "Stratospheric ozone"
- alternative_names:
- - "o3s"
- 217026:
- name: "Lead"
- alternative_names:
- - "pb"
- 217027:
- name: "Nitrogen monoxide mass mixing ratio"
- alternative_names:
- - "no"
- 217028:
- name: "Hydroperoxy radical"
- alternative_names:
- - "ho2"
- 217029:
- name: "Methylperoxy radical"
- alternative_names:
- - "ch3o2"
- 217030:
- name: "Hydroxyl radical"
- alternative_names:
- - "oh"
- 217032:
- name: "Nitrate radical"
- alternative_names:
- - "no3"
- 217033:
- name: "Dinitrogen pentoxide"
- alternative_names:
- - "n2o5"
- 217034:
- name: "Pernitric acid"
- alternative_names:
- - "ho2no2"
- 217035:
- name: "Peroxy acetyl radical"
- alternative_names:
- - "c2o3"
- 217036:
- name: "Organic ethers"
- alternative_names:
- - "ror"
- 217037:
- name: "Par budget corrector"
- alternative_names:
- - "rxpar"
- 217038:
- name: "No to no2 operator"
- alternative_names:
- - "xo2"
- 217039:
- name: "No to alkyl nitrate operator"
- alternative_names:
- - "xo2n"
- 217040:
- name: "Amine"
- alternative_names:
- - "nh2"
- 217041:
- name: "Polar stratospheric cloud"
- alternative_names:
- - "psc"
- 217042:
- name: "Methanol"
- alternative_names:
- - "ch3oh"
- 217043:
- name: "Formic acid"
- alternative_names:
- - "hcooh"
- 217044:
- name: "Methacrylic acid"
- alternative_names:
- - "mcooh"
- 217045:
- name: "Ethane"
- alternative_names:
- - "c2h6"
- 217046:
- name: "Ethanol"
- alternative_names:
- - "c2h5oh"
- 217047:
- name: "Propane"
- alternative_names:
- - "c3h8"
- 217048:
- name: "Propene"
- alternative_names:
- - "c3h6"
- 217049:
- name: "Terpenes"
- alternative_names:
- - "c10h16"
- 217050:
- name: "Methacrolein mvk"
- alternative_names:
- - "ispd"
- 217051:
- name: "Nitrate"
- alternative_names:
- - "no3_a"
- 217052:
- name: "Acetone"
- alternative_names:
- - "ch3coch3"
- 217053:
- name: "Acetone product"
- alternative_names:
- - "aco2"
- 217054:
- name: "Ic3h7o2"
- alternative_names:
- - "ic3h7o2"
- 217055:
- name: "Hypropo2"
- alternative_names:
- - "hypropo2"
- 217056:
- name: "Nitrogen oxides transp"
- alternative_names:
- - "noxa"
- 217057:
- name: "Carbon dioxide (chemistry)"
- alternative_names:
- - "co2_c"
- 217058:
- name: "Nitrous oxide (chemistry)"
- alternative_names:
- - "n2o_c"
- 217059:
- name: "Water vapour (chemistry)"
- alternative_names:
- - "h2o"
- 217060:
- name: "Oxygen"
- alternative_names:
- - "o2"
- 217061:
- name: "Singlet oxygen"
- alternative_names:
- - "o2_1s"
- 217062:
- name: "Singlet delta oxygen"
- alternative_names:
- - "o2_1d"
- 217063:
- name: "Chlorine dioxide"
- alternative_names:
- - "oclo"
- 217064:
- name: "Chlorine nitrate"
- alternative_names:
- - "clono2"
- 217065:
- name: "Hypochlorous acid"
- alternative_names:
- - "hocl"
- 217066:
- name: "Chlorine"
- alternative_names:
- - "cl2"
- 217067:
- name: "Nitryl chloride"
- alternative_names:
- - "clno2"
- 217068:
- name: "Hydrogen bromide"
- alternative_names:
- - "hbr"
- 217069:
- name: "Dichlorine dioxide"
- alternative_names:
- - "cl2o2"
- 217070:
- name: "Hypobromous acid"
- alternative_names:
- - "hobr"
- 217071:
- name: "Trichlorofluoromethane"
- alternative_names:
- - "cfc11"
- 217072:
- name: "Dichlorodifluoromethane"
- alternative_names:
- - "cfc12"
- 217073:
- name: "Trichlorotrifluoroethane"
- alternative_names:
- - "cfc113"
- 217074:
- name: "Dichlorotetrafluoroethane"
- alternative_names:
- - "cfc114"
- 217075:
- name: "Chloropentafluoroethane"
- alternative_names:
- - "cfc115"
- 217076:
- name: "Tetrachloromethane"
- alternative_names:
- - "ccl4"
- 217077:
- name: "Methyl chloroform"
- alternative_names:
- - "ch3ccl3"
- 217078:
- name: "Methyl chloride"
- alternative_names:
- - "ch3cl"
- 217079:
- name: "Chlorodifluoromethane"
- alternative_names:
- - "hcfc22"
- 217080:
- name: "Methyl bromide"
- alternative_names:
- - "ch3br"
- 217081:
- name: "Dibromodifluoromethane"
- alternative_names:
- - "ha1202"
- 217082:
- name: "Bromochlorodifluoromethane"
- alternative_names:
- - "ha1211"
- 217083:
- name: "Trifluorobromomethane"
- alternative_names:
- - "ha1301"
- 217084:
- name: "Cbrf2cbrf2"
- alternative_names:
- - "ha2402"
- 217085:
- name: "Sulfuric acid"
- alternative_names:
- - "h2so4"
- 217086:
- name: "Nitrous acid"
- alternative_names:
- - "hono"
- 217087:
- name: "Alkanes low oh rate"
- alternative_names:
- - "hc3"
- 217088:
- name: "Alkanes med oh rate"
- alternative_names:
- - "hc5"
- 217089:
- name: "Alkanes high oh rate"
- alternative_names:
- - "hc8"
- 217090:
- name: "Terminal alkenes"
- alternative_names:
- - "olt"
- 217091:
- name: "Internal alkenes"
- alternative_names:
- - "oli"
- 217092:
- name: "Ethylperoxy radical"
- alternative_names:
- - "c2h5o2"
- 217093:
- name: "Butadiene"
- alternative_names:
- - "dien"
- 217094:
- name: "Ethyl hydroperoxide"
- alternative_names:
- - "c2h5ooh"
- 217095:
- name: "A-pinene cyclic terpenes"
- alternative_names:
- - "api"
- 217096:
- name: "Acetic acid"
- alternative_names:
- - "ch3cooh"
- 217097:
- name: "D-limonene cyclic diene"
- alternative_names:
- - "lim"
- 217098:
- name: "Acetaldehyde"
- alternative_names:
- - "ch3cho"
- 217099:
- name: "Toluene and less reactive aromatics"
- alternative_names:
- - "tol"
- 217100:
- name: "Xylene and more reactive aromatics"
- alternative_names:
- - "xyl"
- 217101:
- name: "Glycolaldehyde"
- alternative_names:
- - "glyald"
- 217102:
- name: "Cresol"
- alternative_names:
- - "cresol"
- 217103:
- name: "Acetaldehyde and higher"
- alternative_names:
- - "ald"
- 217104:
- name: "Peracetic acid"
- alternative_names:
- - "ch3coooh"
- 217105:
- name: "Ketones"
- alternative_names:
- - "ket"
- 217106:
- name: "Hoch2ch2o2"
- alternative_names:
- - "eo2"
- 217107:
- name: "Glyoxal"
- alternative_names:
- - "glyoxal"
- 217108:
- name: "Hoch2ch2o"
- alternative_names:
- - "eo"
- 217109:
- name: "Unsaturated dicarbonyls"
- alternative_names:
- - "dcb"
- 217110:
- name: "Methacrolein"
- alternative_names:
- - "macr"
- 217111:
- name: "Unsaturated hydroxy dicarbonyl"
- alternative_names:
- - "udd"
- 217112:
- name: "Isopropyldioxidanyl"
- alternative_names:
- - "c3h7o2"
- 217113:
- name: "Hydroxy ketone"
- alternative_names:
- - "hket"
- 217114:
- name: "Isopropyl hydroperoxide"
- alternative_names:
- - "c3h7ooh"
- 217115:
- name: "C3h6oho2"
- alternative_names:
- - "po2"
- 217116:
- name: "C3h6ohooh"
- alternative_names:
- - "pooh"
- 217117:
- name: "Higher organic peroxides"
- alternative_names:
- - "op2"
- 217118:
- name: "Hydroxyacetone"
- alternative_names:
- - "hyac"
- 217119:
- name: "Peroxyacetic acid"
- alternative_names:
- - "paa"
- 217120:
- name: "Ch3coch2o2"
- alternative_names:
- - "ro2"
- 217121:
- name: "Peroxy radical from c2h6"
- alternative_names:
- - "ethp"
- 217122:
- name: "Peroxy radical from hc3"
- alternative_names:
- - "hc3p"
- 217123:
- name: "Peroxy radical from hc5"
- alternative_names:
- - "hc5p"
- 217124:
- name: "Lumped alkenes"
- alternative_names:
- - "bigene"
- 217125:
- name: "Peroxy radical from hc8"
- alternative_names:
- - "hc8p"
- 217126:
- name: "Lumped alkanes"
- alternative_names:
- - "bigalk"
- 217127:
- name: "Peroxy radical from c2h4"
- alternative_names:
- - "etep"
- 217128:
- name: "C4h8o"
- alternative_names:
- - "mek"
- 217129:
- name: "Peroxy radical from terminal alkenes"
- alternative_names:
- - "oltp"
- 217130:
- name: "C4h9o3"
- alternative_names:
- - "eneo2"
- 217131:
- name: "Peroxy radical from internal alkenes"
- alternative_names:
- - "olip"
- 217132:
- name: "Ch3coch(oo)ch3"
- alternative_names:
- - "meko2"
- 217133:
- name: "Peroxy radical from c5h8"
- alternative_names:
- - "isopo2"
- 217134:
- name: "Ch3coch(ooh)ch3"
- alternative_names:
- - "mekooh"
- 217135:
- name: "Peroxy radical from a-pinene cyclic terpenes"
- alternative_names:
- - "apip"
- 217136:
- name: "Ch2=c(ch3)co3"
- alternative_names:
- - "mco3"
- 217137:
- name: "Peroxy radical from d-limonene cyclic diene"
- alternative_names:
- - "limp"
- 217138:
- name: "Methylvinylketone"
- alternative_names:
- - "mvk"
- 217139:
- name: "Phenoxy radical"
- alternative_names:
- - "pho"
- 217140:
- name: "Peroxy radical from toluene and less reactive aromatics"
- alternative_names:
- - "tolp"
- 217141:
- name: "Ch3c(o)ch(oo)ch2oh"
- alternative_names:
- - "macro2"
- 217142:
- name: "Peroxy radical from xylene and more reactive aromatics"
- alternative_names:
- - "xylp"
- 217143:
- name: "H3c(o)ch(ooh)ch2oh"
- alternative_names:
- - "macrooh"
- 217144:
- name: "Peroxy radical from cresol"
- alternative_names:
- - "cslp"
- 217145:
- name: "Unsaturated pans"
- alternative_names:
- - "mpan"
- 217146:
- name: "Unsaturated acyl peroxy radical"
- alternative_names:
- - "tco3_c"
- 217147:
- name: "Peroxy radical from ketones"
- alternative_names:
- - "ketp"
- 217148:
- name: "C5h11o2"
- alternative_names:
- - "alko2"
- 217149:
- name: "No3-alkenes adduct reacting to form carbonitrates"
- alternative_names:
- - "olnn"
- 217150:
- name: "C5h11ooh"
- alternative_names:
- - "alkooh"
- 217151:
- name: "No3-alkenes adduct reacting via decomposition"
- alternative_names:
- - "olnd"
- 217152:
- name: "Hoch2c(ch3)=chcho"
- alternative_names:
- - "bigald"
- 217153:
- name: "C5h6o2"
- alternative_names:
- - "hydrald"
- 217154:
- name: "Trop sulfuric acid"
- alternative_names:
- - "sulf"
- 217155:
- name: "Oxides"
- alternative_names:
- - "ox"
- 217156:
- name: "Ch2chc(ch3)(oo)ch2ono2"
- alternative_names:
- - "isopno3"
- 217157:
- name: "C3 organic nitrate"
- alternative_names:
- - "onitr"
- 217158:
- name: "Chlorine oxides"
- alternative_names:
- - "clox"
- 217159:
- name: "Bromine oxides"
- alternative_names:
- - "brox"
- 217160:
- name: "Hoch2c(ooh)(ch3)chchoh"
- alternative_names:
- - "xooh"
- 217161:
- name: "Hoch2c(ooh)(ch3)ch=ch2"
- alternative_names:
- - "isopooh"
- 217162:
- name: "Lumped aromatics"
- alternative_names:
- - "toluene"
- 217163:
- name: "Dimethyl sulfoxyde"
- alternative_names:
- - "dmso"
- 217164:
- name: "C7h9o5"
- alternative_names:
- - "tolo2"
- 217165:
- name: "C7h10o5"
- alternative_names:
- - "tolooh"
- 217166:
- name: "Hydrogensulfide"
- alternative_names:
- - "h2s"
- 217167:
- name: "C7h10o6"
- alternative_names:
- - "xoh"
- 217168:
- name: "All nitrogen oxides"
- alternative_names:
- - "noy"
- 217169:
- name: "Chlorine family"
- alternative_names:
- - "cly"
- 217170:
- name: "C10h16(oh)(oo)"
- alternative_names:
- - "terpo2"
- 217171:
- name: "Bromine family"
- alternative_names:
- - "bry"
- 217172:
- name: "C10h18o3"
- alternative_names:
- - "terpooh"
- 217173:
- name: "Nitrogen atom"
- alternative_names:
- - "n"
- 217174:
- name: "Chlorine monoxide"
- alternative_names:
- - "clo"
- 217175:
- name: "Chlorine atom"
- alternative_names:
- - "cl_c"
- 217176:
- name: "Bromine monoxide"
- alternative_names:
- - "bro"
- 217177:
- name: "Hydrogen atom"
- alternative_names:
- - "h_c"
- 217178:
- name: "Methyl group"
- alternative_names:
- - "ch3"
- 217179:
- name: "Aromatic-ho from toluene and less reactive aromatics"
- alternative_names:
- - "addt"
- 217180:
- name: "Aromatic-ho from xylene and more reactive aromatics"
- alternative_names:
- - "addx"
- 217181:
- name: "Ammonium nitrate"
- alternative_names:
- - "nh4no3"
- 217182:
- name: "Aromatic-ho from csl"
- alternative_names:
- - "addc"
- 217183:
- name: "Secondary organic aerosol type 1"
- alternative_names:
- - "soa1"
- 217184:
- name: "Secondary organic aerosol type 2a"
- alternative_names:
- - "soa2a"
- 217185:
- name: "Secondary organic aerosol type 2b"
- alternative_names:
- - "soa2b"
- 217186:
- name: "Condensable gas type 1"
- alternative_names:
- - "sog1"
- 217187:
- name: "Condensable gas type 2a"
- alternative_names:
- - "sog2a"
- 217188:
- name: "Condensable gas type 2b"
- alternative_names:
- - "sog2b"
- 217189:
- name: "Sulfur trioxide"
- alternative_names:
- - "so3"
- 217190:
- name: "Carbonyl sulfide"
- alternative_names:
- - "ocs_c"
- 217191:
- name: "Bromine atom"
- alternative_names:
- - "br"
- 217192:
- name: "Bromine"
- alternative_names:
- - "br2"
- 217193:
- name: "Bromine monochloride"
- alternative_names:
- - "brcl"
- 217194:
- name: "Bromine nitrate"
- alternative_names:
- - "brono2"
- 217195:
- name: "Dibromomethane"
- alternative_names:
- - "ch2br2"
- 217196:
- name: "Methoxy radical"
- alternative_names:
- - "ch3o"
- 217197:
- name: "Tribromomethane"
- alternative_names:
- - "chbr3"
- 217198:
- name: "Asymmetric chlorine dioxide radical"
- alternative_names:
- - "cloo"
- 217199:
- name: "Hydrogen"
- alternative_names:
- - "h2"
- 217200:
- name: "Hydrogen chloride"
- alternative_names:
- - "hcl"
- 217201:
- name: "Formyl radical"
- alternative_names:
- - "hco"
- 217202:
- name: "Hydrogen fluoride"
- alternative_names:
- - "hf"
- 217203:
- name: "Oxygen atom"
- alternative_names:
- - "o"
- 217204:
- name: "Excited oxygen atom"
- alternative_names:
- - "o1d"
- 217205:
- name: "Ground state oxygen atom"
- alternative_names:
- - "o3p"
- 217206:
- name: "Stratospheric aerosol"
- alternative_names:
- - "strataer"
- 217222:
- name: "Aromatic peroxy radical mass mixing ratio"
- alternative_names:
- - "aroo2"
- 217223:
- name: "Ethyne mass mixing ratio"
- alternative_names:
- - "c2h2"
- 217224:
- name: "Acetonitrile mass mixing ratio"
- alternative_names:
- - "ch3cn"
- 217225:
- name: "Methyl peroxy nitrate mass mixing ratio"
- alternative_names:
- - "ch3o2no2"
- 217226:
- name: "Hydrogen cyanide mass mixing ratio"
- alternative_names:
- - "hcn"
- 217227:
- name: "Hydroperoxy aldehydes type 1 mass mixing ratio"
- alternative_names:
- - "hpald1"
- 217228:
- name: "Hydroperoxy aldehydes type 2 mass mixing ratio"
- alternative_names:
- - "hpald"
- 217229:
- name: "Isoprene peroxy type b mass mixing ratio"
- alternative_names:
- - "isopbo2"
- 217230:
- name: "Isoprene peroxy type d mass mixing ratio"
- alternative_names:
- - "isopdo2"
- 217231:
- name: "Anthropogenic volatile organic compounds mass mixing ratio"
- alternative_names:
- - "voca"
- 217232:
- name: "Biomass burning volatile organic compounds mass mixing ratio"
- alternative_names:
- - "vocbb"
- 218003:
- name: "Total column hydrogen peroxide"
- alternative_names:
- - "tc_h2o2"
- 218004:
- name: "Total column methane"
- alternative_names:
- - "tc_ch4"
- 218006:
- name: "Total column nitric acid"
- alternative_names:
- - "tc_hno3"
- 218007:
- name: "Total column methyl peroxide"
- alternative_names:
- - "tc_ch3ooh"
- 218009:
- name: "Total column paraffins"
- alternative_names:
- - "tc_par"
- 218010:
- name: "Total column ethene"
- alternative_names:
- - "tc_c2h4"
- 218011:
- name: "Total column olefins"
- alternative_names:
- - "tc_ole"
- 218012:
- name: "Total column aldehydes"
- alternative_names:
- - "tc_ald2"
- 218013:
- name: "Total column peroxyacetyl nitrate"
- alternative_names:
- - "tc_pan"
- 218014:
- name: "Total column peroxides"
- alternative_names:
- - "tc_rooh"
- 218015:
- name: "Total column organic nitrates"
- alternative_names:
- - "tc_onit"
- 218016:
- name: "Total column isoprene"
- alternative_names:
- - "tc_c5h8"
- 218018:
- name: "Total column dimethyl sulfide"
- alternative_names:
- - "tc_dms"
- 218019:
- name: "Total column ammonia"
- alternative_names:
- - "tc_nh3"
- 218020:
- name: "Total column sulfate"
- alternative_names:
- - "tc_so4"
- 218021:
- name: "Total column ammonium"
- alternative_names:
- - "tc_nh4"
- 218022:
- name: "Total column methane sulfonic acid"
- alternative_names:
- - "tc_msa"
- 218023:
- name: "Total column methyl glyoxal"
- alternative_names:
- - "tc_ch3cocho"
- 218024:
- name: "Total column stratospheric ozone"
- alternative_names:
- - "tc_o3s"
- 218026:
- name: "Total column lead"
- alternative_names:
- - "tc_pb"
- 218027:
- name: "Total column nitrogen monoxide"
- alternative_names:
- - "tc_no"
- 218028:
- name: "Total column hydroperoxy radical"
- alternative_names:
- - "tc_ho2"
- 218029:
- name: "Total column methylperoxy radical"
- alternative_names:
- - "tc_ch3o2"
- 218030:
- name: "Total column hydroxyl radical"
- alternative_names:
- - "tc_oh"
- 218032:
- name: "Total column nitrate radical"
- alternative_names:
- - "tc_no3"
- 218033:
- name: "Total column dinitrogen pentoxide"
- alternative_names:
- - "tc_n2o5"
- 218034:
- name: "Total column pernitric acid"
- alternative_names:
- - "tc_ho2no2"
- 218035:
- name: "Total column peroxy acetyl radical"
- alternative_names:
- - "tc_c2o3"
- 218036:
- name: "Total column organic ethers"
- alternative_names:
- - "tc_ror"
- 218037:
- name: "Total column par budget corrector"
- alternative_names:
- - "tc_rxpar"
- 218038:
- name: "Total column no to no2 operator"
- alternative_names:
- - "tc_xo2"
- 218039:
- name: "Total column no to alkyl nitrate operator"
- alternative_names:
- - "tc_xo2n"
- 218040:
- name: "Total column amine"
- alternative_names:
- - "tc_nh2"
- 218041:
- name: "Total column polar stratospheric cloud"
- alternative_names:
- - "tc_psc"
- 218042:
- name: "Total column methanol"
- alternative_names:
- - "tc_ch3oh"
- 218043:
- name: "Total column formic acid"
- alternative_names:
- - "tc_hcooh"
- 218044:
- name: "Total column methacrylic acid"
- alternative_names:
- - "tc_mcooh"
- 218045:
- name: "Total column ethane"
- alternative_names:
- - "tc_c2h6"
- 218046:
- name: "Total column ethanol"
- alternative_names:
- - "tc_c2h5oh"
- 218047:
- name: "Total column propane"
- alternative_names:
- - "tc_c3h8"
- 218048:
- name: "Total column propene"
- alternative_names:
- - "tc_c3h6"
- 218049:
- name: "Total column terpenes"
- alternative_names:
- - "tc_c10h16"
- 218050:
- name: "Total column methacrolein mvk"
- alternative_names:
- - "tc_ispd"
- 218051:
- name: "Total column nitrate"
- alternative_names:
- - "tc_no3_a"
- 218052:
- name: "Total column acetone"
- alternative_names:
- - "tc_ch3coch3"
- 218053:
- name: "Total column acetone product"
- alternative_names:
- - "tc_aco2"
- 218054:
- name: "Total column ic3h7o2"
- alternative_names:
- - "tc_ic3h7o2"
- 218055:
- name: "Total column hypropo2"
- alternative_names:
- - "tc_hypropo2"
- 218056:
- name: "Total column nitrogen oxides transp"
- alternative_names:
- - "tc_noxa"
- 218057:
- name: "Total column of carbon dioxide (chemistry)"
- alternative_names:
- - "tc_co2_c"
- 218058:
- name: "Total column of nitrous oxide (chemistry)"
- alternative_names:
- - "tc_n2o_c"
- 218059:
- name: "Total column of water vapour (chemistry)"
- alternative_names:
- - "tc_h2o"
- 218060:
- name: "Total column of oxygen"
- alternative_names:
- - "tc_o2"
- 218061:
- name: "Total column of singlet oxygen"
- alternative_names:
- - "tc_o2_1s"
- 218062:
- name: "Total column of singlet delta oxygen"
- alternative_names:
- - "tc_o2_1d"
- 218063:
- name: "Total column of chlorine dioxide"
- alternative_names:
- - "tc_oclo"
- 218064:
- name: "Total column of chlorine nitrate"
- alternative_names:
- - "tc_clono2"
- 218065:
- name: "Total column of hypochlorous acid"
- alternative_names:
- - "tc_hocl"
- 218066:
- name: "Total column of chlorine"
- alternative_names:
- - "tc_cl2"
- 218067:
- name: "Total column of nitryl chloride"
- alternative_names:
- - "tc_clno2"
- 218068:
- name: "Total column of hydrogen bromide"
- alternative_names:
- - "tc_hbr"
- 218069:
- name: "Total column of dichlorine dioxide"
- alternative_names:
- - "tc_cl2o2"
- 218070:
- name: "Total column of hypobromous acid"
- alternative_names:
- - "tc_hobr"
- 218071:
- name: "Total column of trichlorofluoromethane"
- alternative_names:
- - "tc_cfc11"
- 218072:
- name: "Total column of dichlorodifluoromethane"
- alternative_names:
- - "tc_cfc12"
- 218073:
- name: "Total column of trichlorotrifluoroethane"
- alternative_names:
- - "tc_cfc113"
- 218074:
- name: "Total column of dichlorotetrafluoroethane"
- alternative_names:
- - "tc_cfc114"
- 218075:
- name: "Total column of chloropentafluoroethane"
- alternative_names:
- - "tc_cfc115"
- 218076:
- name: "Total column of tetrachloromethane"
- alternative_names:
- - "tc_ccl4"
- 218077:
- name: "Total column of methyl chloroform"
- alternative_names:
- - "tc_ch3ccl3"
- 218078:
- name: "Total column of methyl chloride"
- alternative_names:
- - "tc_ch3cl"
- 218079:
- name: "Total column of chlorodifluoromethane"
- alternative_names:
- - "tc_hcfc22"
- 218080:
- name: "Total column of methyl bromide"
- alternative_names:
- - "tc_ch3br"
- 218081:
- name: "Total column of dibromodifluoromethane"
- alternative_names:
- - "tc_ha1202"
- 218082:
- name: "Total column of bromochlorodifluoromethane"
- alternative_names:
- - "tc_ha1211"
- 218083:
- name: "Total column of trifluorobromomethane"
- alternative_names:
- - "tc_ha1301"
- 218084:
- name: "Total column of cbrf2cbrf2"
- alternative_names:
- - "tc_ha2402"
- 218085:
- name: "Total column of sulfuric acid"
- alternative_names:
- - "tc_h2so4"
- 218086:
- name: "Total column of nitrous acid"
- alternative_names:
- - "tc_hono"
- 218087:
- name: "Total column of alkanes low oh rate"
- alternative_names:
- - "tc_hc3"
- 218088:
- name: "Total column of alkanes med oh rate"
- alternative_names:
- - "tc_hc5"
- 218089:
- name: "Total column of alkanes high oh rate"
- alternative_names:
- - "tc_hc8"
- 218090:
- name: "Total column of terminal alkenes"
- alternative_names:
- - "tc_olt"
- 218091:
- name: "Total column of internal alkenes"
- alternative_names:
- - "tc_oli"
- 218092:
- name: "Total column of ethylperoxy radical"
- alternative_names:
- - "tc_c2h5o2"
- 218093:
- name: "Total column of butadiene"
- alternative_names:
- - "tc_dien"
- 218094:
- name: "Total column of ethyl hydroperoxide"
- alternative_names:
- - "tc_c2h5ooh"
- 218095:
- name: "Total column of a-pinene cyclic terpenes"
- alternative_names:
- - "tc_api"
- 218096:
- name: "Total column of acetic acid"
- alternative_names:
- - "tc_ch3cooh"
- 218097:
- name: "Total column of d-limonene cyclic diene"
- alternative_names:
- - "tc_lim"
- 218098:
- name: "Total column of acetaldehyde"
- alternative_names:
- - "tc_ch3cho"
- 218099:
- name: "Total column of toluene and less reactive aromatics"
- alternative_names:
- - "tc_tol"
- 218100:
- name: "Total column of xylene and more reactive aromatics"
- alternative_names:
- - "tc_xyl"
- 218101:
- name: "Total column of glycolaldehyde"
- alternative_names:
- - "tc_glyald"
- 218102:
- name: "Total column of cresol"
- alternative_names:
- - "tc_cresol"
- 218103:
- name: "Total column of acetaldehyde and higher"
- alternative_names:
- - "tc_ald"
- 218104:
- name: "Total column of peracetic acid"
- alternative_names:
- - "tc_ch3coooh"
- 218105:
- name: "Total column of ketones"
- alternative_names:
- - "tc_ket"
- 218106:
- name: "Total column of hoch2ch2o2"
- alternative_names:
- - "tc_eo2"
- 218107:
- name: "Total column of glyoxal"
- alternative_names:
- - "tc_glyoxal"
- 218108:
- name: "Total column of hoch2ch2o"
- alternative_names:
- - "tc_eo"
- 218109:
- name: "Total column of unsaturated dicarbonyls"
- alternative_names:
- - "tc_dcb"
- 218110:
- name: "Total column of methacrolein"
- alternative_names:
- - "tc_macr"
- 218111:
- name: "Total column of unsaturated hydroxy dicarbonyl"
- alternative_names:
- - "tc_udd"
- 218112:
- name: "Total column of isopropyldioxidanyl"
- alternative_names:
- - "tc_c3h7o2"
- 218113:
- name: "Total column of hydroxy ketone"
- alternative_names:
- - "tc_hket"
- 218114:
- name: "Total column of isopropyl hydroperoxide"
- alternative_names:
- - "tc_c3h7ooh"
- 218115:
- name: "Total column of c3h6oho2"
- alternative_names:
- - "tc_po2"
- 218116:
- name: "Total column of c3h6ohooh"
- alternative_names:
- - "tc_pooh"
- 218117:
- name: "Total column of higher organic peroxides"
- alternative_names:
- - "tc_op2"
- 218118:
- name: "Total column of hydroxyacetone"
- alternative_names:
- - "tc_hyac"
- 218119:
- name: "Total column of peroxyacetic acid"
- alternative_names:
- - "tc_paa"
- 218120:
- name: "Total column of ch3coch2o2"
- alternative_names:
- - "tc_ro2"
- 218121:
- name: "Total column of peroxy radical from c2h6"
- alternative_names:
- - "tc_ethp"
- 218122:
- name: "Total column of peroxy radical from hc3"
- alternative_names:
- - "tc_hc3p"
- 218123:
- name: "Total column of peroxy radical from hc5"
- alternative_names:
- - "tc_hc5p"
- 218124:
- name: "Total column of lumped alkenes"
- alternative_names:
- - "tc_bigene"
- 218125:
- name: "Total column of peroxy radical from hc8"
- alternative_names:
- - "tc_hc8p"
- 218126:
- name: "Total column of lumped alkanes"
- alternative_names:
- - "tc_bigalk"
- 218127:
- name: "Total column of peroxy radical from c2h4"
- alternative_names:
- - "tc_etep"
- 218128:
- name: "Total column of c4h8o"
- alternative_names:
- - "tc_mek"
- 218129:
- name: "Total column of peroxy radical from terminal alkenes"
- alternative_names:
- - "tc_oltp"
- 218130:
- name: "Total column of c4h9o3"
- alternative_names:
- - "tc_eneo2"
- 218131:
- name: "Total column of peroxy radical from internal alkenes"
- alternative_names:
- - "tc_olip"
- 218132:
- name: "Total column of ch3coch(oo)ch3"
- alternative_names:
- - "tc_meko2"
- 218133:
- name: "Total column of peroxy radical from c5h8"
- alternative_names:
- - "tc_isopo2"
- 218134:
- name: "Total column of ch3coch(ooh)ch3"
- alternative_names:
- - "tc_mekooh"
- 218135:
- name: "Total column of peroxy radical from a-pinene cyclic terpenes"
- alternative_names:
- - "tc_apip"
- 218136:
- name: "Total column of ch2=c(ch3)co3"
- alternative_names:
- - "tc_mco3"
- 218137:
- name: "Total column of peroxy radical from d-limonene cyclic diene"
- alternative_names:
- - "tc_limp"
- 218138:
- name: "Total column of methylvinylketone"
- alternative_names:
- - "tc_mvk"
- 218139:
- name: "Total column of phenoxy radical"
- alternative_names:
- - "tc_pho"
- 218140:
- name: "Total column of peroxy radical from toluene and less reactive aromatics"
- alternative_names:
- - "tc_tolp"
- 218141:
- name: "Total column of ch3c(o)ch(oo)ch2oh"
- alternative_names:
- - "tc_macro2"
- 218142:
- name: "Total column of peroxy radical from xylene and more reactive aromatics"
- alternative_names:
- - "tc_xylp"
- 218143:
- name: "Total column of h3c(o)ch(ooh)ch2oh"
- alternative_names:
- - "tc_macrooh"
- 218144:
- name: "Total column of peroxy radical from cresol"
- alternative_names:
- - "tc_cslp"
- 218145:
- name: "Total column of unsaturated pans"
- alternative_names:
- - "tc_mpan"
- 218146:
- name: "Total column of unsaturated acyl peroxy radical"
- alternative_names:
- - "tc_tco3_c"
- 218147:
- name: "Total column of peroxy radical from ketones"
- alternative_names:
- - "tc_ketp"
- 218148:
- name: "Total column of c5h11o2"
- alternative_names:
- - "tc_alko2"
- 218149:
- name: "Total column of no3-alkenes adduct reacting to form carbonitrates"
- alternative_names:
- - "tc_olnn"
- 218150:
- name: "Total column of c5h11ooh"
- alternative_names:
- - "tc_alkooh"
- 218151:
- name: "Total column of no3-alkenes adduct reacting via decomposition"
- alternative_names:
- - "tc_olnd"
- 218152:
- name: "Total column of hoch2c(ch3)=chcho"
- alternative_names:
- - "tc_bigald"
- 218153:
- name: "Total column of c5h6o2"
- alternative_names:
- - "tc_hydrald"
- 218154:
- name: "Total column of trop sulfuric acid"
- alternative_names:
- - "tc_sulf"
- 218155:
- name: "Total column of oxides"
- alternative_names:
- - "tc_ox"
- 218156:
- name: "Total column of ch2chc(ch3)(oo)ch2ono2"
- alternative_names:
- - "tc_isopno3"
- 218157:
- name: "Total column of c3 organic nitrate"
- alternative_names:
- - "tc_onitr"
- 218158:
- name: "Total column of chlorine oxides"
- alternative_names:
- - "tc_clox"
- 218159:
- name: "Total column of bromine oxides"
- alternative_names:
- - "tc_brox"
- 218160:
- name: "Total column of hoch2c(ooh)(ch3)chchoh"
- alternative_names:
- - "tc_xooh"
- 218161:
- name: "Total column of hoch2c(ooh)(ch3)ch=ch2"
- alternative_names:
- - "tc_isopooh"
- 218162:
- name: "Total column of lumped aromatics"
- alternative_names:
- - "tc_toluene"
- 218163:
- name: "Total column of dimethyl sulfoxyde"
- alternative_names:
- - "tc_dmso"
- 218164:
- name: "Total column of c7h9o5"
- alternative_names:
- - "tc_tolo2"
- 218165:
- name: "Total column of c7h10o5"
- alternative_names:
- - "tc_tolooh"
- 218166:
- name: "Total column of hydrogensulfide"
- alternative_names:
- - "tc_h2s"
- 218167:
- name: "Total column of c7h10o6"
- alternative_names:
- - "tc_xoh"
- 218168:
- name: "Total column of all nitrogen oxides"
- alternative_names:
- - "tc_noy"
- 218169:
- name: "Total column of chlorine family"
- alternative_names:
- - "tc_cly"
- 218170:
- name: "Total column of c10h16(oh)(oo)"
- alternative_names:
- - "tc_terpo2"
- 218171:
- name: "Total column of bromine family"
- alternative_names:
- - "tc_bry"
- 218172:
- name: "Total column of c10h18o3"
- alternative_names:
- - "tc_terpooh"
- 218173:
- name: "Total column of nitrogen atom"
- alternative_names:
- - "tc_n"
- 218174:
- name: "Total column of chlorine monoxide"
- alternative_names:
- - "tc_clo"
- 218175:
- name: "Total column of chlorine atom"
- alternative_names:
- - "tc_cl_c"
- 218176:
- name: "Total column of bromine monoxide"
- alternative_names:
- - "tc_bro"
- 218177:
- name: "Total column of hydrogen atom"
- alternative_names:
- - "tc_h_c"
- 218178:
- name: "Total column of methyl group"
- alternative_names:
- - "tc_ch3"
- 218179:
- name: "Total column of aromatic-ho from toluene and less reactive aromatics"
- alternative_names:
- - "tc_addt"
- 218180:
- name: "Total column of aromatic-ho from xylene and more reactive aromatics"
- alternative_names:
- - "tc_addx"
- 218181:
- name: "Total column of ammonium nitrate"
- alternative_names:
- - "tc_nh4no3"
- 218182:
- name: "Total column of aromatic-ho from csl"
- alternative_names:
- - "tc_addc"
- 218183:
- name: "Total column of secondary organic aerosol type 1"
- alternative_names:
- - "tc_soa1"
- 218184:
- name: "Total column of secondary organic aerosol type 2a"
- alternative_names:
- - "tc_soa2a"
- 218185:
- name: "Total column of secondary organic aerosol type 2b"
- alternative_names:
- - "tc_soa2b"
- 218186:
- name: "Total column of condensable gas type 1"
- alternative_names:
- - "tc_sog1"
- 218187:
- name: "Total column of condensable gas type 2a"
- alternative_names:
- - "tc_sog2a"
- 218188:
- name: "Total column of condensable gas type 2b"
- alternative_names:
- - "tc_sog2b"
- 218189:
- name: "Total column of sulfur trioxide"
- alternative_names:
- - "tc_so3"
- 218190:
- name: "Total column of carbonyl sulfide"
- alternative_names:
- - "tc_ocs_c"
- 218191:
- name: "Total column of bromine atom"
- alternative_names:
- - "tc_br"
- 218192:
- name: "Total column of bromine"
- alternative_names:
- - "tc_br2"
- 218193:
- name: "Total column of bromine monochloride"
- alternative_names:
- - "tc_brcl"
- 218194:
- name: "Total column of bromine nitrate"
- alternative_names:
- - "tc_brono2"
- 218195:
- name: "Total column of dibromomethane"
- alternative_names:
- - "tc_ch2br2"
- 218196:
- name: "Total column of methoxy radical"
- alternative_names:
- - "tc_ch3o"
- 218197:
- name: "Total column of tribromomethane"
- alternative_names:
- - "tc_chbr3"
- 218198:
- name: "Total column of asymmetric chlorine dioxide radical"
- alternative_names:
- - "tc_cloo"
- 218199:
- name: "Total column of hydrogen"
- alternative_names:
- - "tc_h2"
- 218200:
- name: "Total column of hydrogen chloride"
- alternative_names:
- - "tc_hcl"
- 218201:
- name: "Total column of formyl radical"
- alternative_names:
- - "tc_hco"
- 218202:
- name: "Total column of hydrogen fluoride"
- alternative_names:
- - "tc_hf"
- 218203:
- name: "Total column of oxygen atom"
- alternative_names:
- - "tc_o"
- 218204:
- name: "Total column of excited oxygen atom"
- alternative_names:
- - "tc_o1d"
- 218205:
- name: "Total column of ground state oxygen atom"
- alternative_names:
- - "tc_o3p"
- 218206:
- name: "Total column of stratospheric aerosol"
- alternative_names:
- - "tc_strataer"
- 218221:
- name: "Column integrated mass density of volcanic sulfur dioxide"
- alternative_names:
- - "tc_vso2"
- 218222:
- name: "Column integrated mass density of aromatic peroxy radical"
- alternative_names:
- - "tc_aroo2"
- 218223:
- name: "Column integrated mass density of ethyne"
- alternative_names:
- - "tc_c2h2"
- 218224:
- name: "Column integrated mass density of acetonitrile"
- alternative_names:
- - "tc_ch3cn"
- 218225:
- name: "Column integrated mass density of methyl peroxy nitrate"
- alternative_names:
- - "tc_ch3o2no2"
- 218226:
- name: "Column integrated mass density of hydrogen cyanide"
- alternative_names:
- - "tc_hcn"
- 218227:
- name: "Column integrated mass density of hydroperoxy aldehydes type 1"
- alternative_names:
- - "tc_hpald1"
- 218228:
- name: "Column integrated mass density of hydroperoxy aldehydes type 2"
- alternative_names:
- - "tc_hpald2"
- 218229:
- name: "Column integrated mass density of isoprene peroxy type b"
- alternative_names:
- - "tc_isopbo2"
- 218230:
- name: "Column integrated mass density of isoprene peroxy type d"
- alternative_names:
- - "tc_isopdo2"
- 218231:
- name: "Column integrated mass density of anthropogenic volatile organic compounds"
- alternative_names:
- - "tc_voca"
- 218232:
- name: "Column integrated mass density of biomass burning volatile organic compounds"
- alternative_names:
- - "tc_vocbb"
- 219001:
- name: "Ozone emissions"
- alternative_names:
- - "e_go3"
- 219002:
- name: "Nitrogen oxides emissions"
- alternative_names:
- - "e_nox"
- 219003:
- name: "Hydrogen peroxide emissions"
- alternative_names:
- - "e_h2o2"
- 219004:
- name: "Methane emissions"
- alternative_names:
- - "e_ch4"
- 219005:
- name: "Carbon monoxide emissions"
- alternative_names:
- - "e_co"
- 219006:
- name: "Nitric acid emissions"
- alternative_names:
- - "e_hno3"
- 219007:
- name: "Methyl peroxide emissions"
- alternative_names:
- - "e_ch3ooh"
- 219008:
- name: "Formaldehyde emissions"
- alternative_names:
- - "e_hcho"
- 219009:
- name: "Paraffins emissions"
- alternative_names:
- - "e_par"
- 219010:
- name: "Ethene emissions"
- alternative_names:
- - "e_c2h4"
- 219011:
- name: "Olefins emissions"
- alternative_names:
- - "e_ole"
- 219012:
- name: "Aldehydes emissions"
- alternative_names:
- - "e_ald2"
- 219013:
- name: "Peroxyacetyl nitrate emissions"
- alternative_names:
- - "e_pan"
- 219014:
- name: "Peroxides emissions"
- alternative_names:
- - "e_rooh"
- 219015:
- name: "Organic nitrates emissions"
- alternative_names:
- - "e_onit"
- 219016:
- name: "Isoprene emissions"
- alternative_names:
- - "e_c5h8"
- 219017:
- name: "Sulfur dioxide emissions"
- alternative_names:
- - "e_so2"
- 219018:
- name: "Dimethyl sulfide emissions"
- alternative_names:
- - "e_dms"
- 219019:
- name: "Ammonia emissions"
- alternative_names:
- - "e_nh3"
- 219020:
- name: "Sulfate emissions"
- alternative_names:
- - "e_so4"
- 219021:
- name: "Ammonium emissions"
- alternative_names:
- - "e_nh4"
- 219022:
- name: "Methane sulfonic acid emissions"
- alternative_names:
- - "e_msa"
- 219023:
- name: "Methyl glyoxal emissions"
- alternative_names:
- - "e_ch3cocho"
- 219024:
- name: "Stratospheric ozone emissions"
- alternative_names:
- - "e_o3s"
- 219025:
- name: "Radon emissions"
- alternative_names:
- - "e_ra"
- 219026:
- name: "Lead emissions"
- alternative_names:
- - "e_pb"
- 219027:
- name: "Nitrogen monoxide emissions"
- alternative_names:
- - "e_no"
- 219028:
- name: "Hydroperoxy radical emissions"
- alternative_names:
- - "e_ho2"
- 219029:
- name: "Methylperoxy radical emissions"
- alternative_names:
- - "e_ch3o2"
- 219030:
- name: "Hydroxyl radical emissions"
- alternative_names:
- - "e_oh"
- 219031:
- name: "Nitrogen dioxide emissions"
- alternative_names:
- - "e_no2"
- 219032:
- name: "Nitrate radical emissions"
- alternative_names:
- - "e_no3"
- 219033:
- name: "Dinitrogen pentoxide emissions"
- alternative_names:
- - "e_n2o5"
- 219034:
- name: "Pernitric acid emissions"
- alternative_names:
- - "e_ho2no2"
- 219035:
- name: "Peroxy acetyl radical emissions"
- alternative_names:
- - "e_c2o3"
- 219036:
- name: "Organic ethers emissions"
- alternative_names:
- - "e_ror"
- 219037:
- name: "Par budget corrector emissions"
- alternative_names:
- - "e_rxpar"
- 219038:
- name: "No to no2 operator emissions"
- alternative_names:
- - "e_xo2"
- 219039:
- name: "No to alkyl nitrate operator emissions"
- alternative_names:
- - "e_xo2n"
- 219040:
- name: "Amine emissions"
- alternative_names:
- - "e_nh2"
- 219041:
- name: "Polar stratospheric cloud emissions"
- alternative_names:
- - "e_psc"
- 219042:
- name: "Methanol emissions"
- alternative_names:
- - "e_ch3oh"
- 219043:
- name: "Formic acid emissions"
- alternative_names:
- - "e_hcooh"
- 219044:
- name: "Methacrylic acid emissions"
- alternative_names:
- - "e_mcooh"
- 219045:
- name: "Ethane emissions"
- alternative_names:
- - "e_c2h6"
- 219046:
- name: "Ethanol emissions"
- alternative_names:
- - "e_c2h5oh"
- 219047:
- name: "Propane emissions"
- alternative_names:
- - "e_c3h8"
- 219048:
- name: "Propene emissions"
- alternative_names:
- - "e_c3h6"
- 219049:
- name: "Terpenes emissions"
- alternative_names:
- - "e_c10h16"
- 219050:
- name: "Methacrolein mvk emissions"
- alternative_names:
- - "e_ispd"
- 219051:
- name: "Nitrate emissions"
- alternative_names:
- - "e_no3_a"
- 219052:
- name: "Acetone emissions"
- alternative_names:
- - "e_ch3coch3"
- 219053:
- name: "Acetone product emissions"
- alternative_names:
- - "e_aco2"
- 219054:
- name: "Ic3h7o2 emissions"
- alternative_names:
- - "e_ic3h7o2"
- 219055:
- name: "Hypropo2 emissions"
- alternative_names:
- - "e_hypropo2"
- 219056:
- name: "Nitrogen oxides transp emissions"
- alternative_names:
- - "e_noxa"
- 219057:
- name: "Emissions of carbon dioxide (chemistry)"
- alternative_names:
- - "e_co2_c"
- 219058:
- name: "Emissions of nitrous oxide (chemistry)"
- alternative_names:
- - "e_n2o_c"
- 219059:
- name: "Emissions of water vapour (chemistry)"
- alternative_names:
- - "e_h2o"
- 219060:
- name: "Emissions of oxygen"
- alternative_names:
- - "e_o2"
- 219061:
- name: "Emissions of singlet oxygen"
- alternative_names:
- - "e_o2_1s"
- 219062:
- name: "Emissions of singlet delta oxygen"
- alternative_names:
- - "e_o2_1d"
- 219063:
- name: "Emissions of chlorine dioxide"
- alternative_names:
- - "e_oclo"
- 219064:
- name: "Emissions of chlorine nitrate"
- alternative_names:
- - "e_clono2"
- 219065:
- name: "Emissions of hypochlorous acid"
- alternative_names:
- - "e_hocl"
- 219066:
- name: "Emissions of chlorine"
- alternative_names:
- - "e_cl2"
- 219067:
- name: "Emissions of nitryl chloride"
- alternative_names:
- - "e_clno2"
- 219068:
- name: "Emissions of hydrogen bromide"
- alternative_names:
- - "e_hbr"
- 219069:
- name: "Emissions of dichlorine dioxide"
- alternative_names:
- - "e_cl2o2"
- 219070:
- name: "Emissions of hypobromous acid"
- alternative_names:
- - "e_hobr"
- 219071:
- name: "Emissions of trichlorofluoromethane"
- alternative_names:
- - "e_cfc11"
- 219072:
- name: "Emissions of dichlorodifluoromethane"
- alternative_names:
- - "e_cfc12"
- 219073:
- name: "Emissions of trichlorotrifluoroethane"
- alternative_names:
- - "e_cfc113"
- 219074:
- name: "Emissions of dichlorotetrafluoroethane"
- alternative_names:
- - "e_cfc114"
- 219075:
- name: "Emissions of chloropentafluoroethane"
- alternative_names:
- - "e_cfc115"
- 219076:
- name: "Emissions of tetrachloromethane"
- alternative_names:
- - "e_ccl4"
- 219077:
- name: "Emissions of methyl chloroform"
- alternative_names:
- - "e_ch3ccl3"
- 219078:
- name: "Emissions of methyl chloride"
- alternative_names:
- - "e_ch3cl"
- 219079:
- name: "Emissions of chlorodifluoromethane"
- alternative_names:
- - "e_hcfc22"
- 219080:
- name: "Emissions of methyl bromide"
- alternative_names:
- - "e_ch3br"
- 219081:
- name: "Emissions of dibromodifluoromethane"
- alternative_names:
- - "e_ha1202"
- 219082:
- name: "Emissions of bromochlorodifluoromethane"
- alternative_names:
- - "e_ha1211"
- 219083:
- name: "Emissions of trifluorobromomethane"
- alternative_names:
- - "e_ha1301"
- 219084:
- name: "Emissions of cbrf2cbrf2"
- alternative_names:
- - "e_ha2402"
- 219085:
- name: "Emissions of sulfuric acid"
- alternative_names:
- - "e_h2so4"
- 219086:
- name: "Emissions of nitrous acid"
- alternative_names:
- - "e_hono"
- 219087:
- name: "Emissions of alkanes low oh rate"
- alternative_names:
- - "e_hc3"
- 219088:
- name: "Emissions of alkanes med oh rate"
- alternative_names:
- - "e_hc5"
- 219089:
- name: "Emissions of alkanes high oh rate"
- alternative_names:
- - "e_hc8"
- 219090:
- name: "Emissions of terminal alkenes"
- alternative_names:
- - "e_olt"
- 219091:
- name: "Emissions of internal alkenes"
- alternative_names:
- - "e_oli"
- 219092:
- name: "Emissions of ethylperoxy radical"
- alternative_names:
- - "e_c2h5o2"
- 219093:
- name: "Emissions of butadiene"
- alternative_names:
- - "e_dien"
- 219094:
- name: "Emissions of ethyl hydroperoxide"
- alternative_names:
- - "e_c2h5ooh"
- 219095:
- name: "Emissions of a-pinene cyclic terpenes"
- alternative_names:
- - "e_api"
- 219096:
- name: "Emissions of acetic acid"
- alternative_names:
- - "e_ch3cooh"
- 219097:
- name: "Emissions of d-limonene cyclic diene"
- alternative_names:
- - "e_lim"
- 219098:
- name: "Emissions of acetaldehyde"
- alternative_names:
- - "e_ch3cho"
- 219099:
- name: "Emissions of toluene and less reactive aromatics"
- alternative_names:
- - "e_tol"
- 219100:
- name: "Emissions of xylene and more reactive aromatics"
- alternative_names:
- - "e_xyl"
- 219101:
- name: "Emissions of glycolaldehyde"
- alternative_names:
- - "e_glyald"
- 219102:
- name: "Emissions of cresol"
- alternative_names:
- - "e_cresol"
- 219103:
- name: "Emissions of acetaldehyde and higher"
- alternative_names:
- - "e_ald"
- 219104:
- name: "Emissions of peracetic acid"
- alternative_names:
- - "e_ch3coooh"
- 219105:
- name: "Emissions of ketones"
- alternative_names:
- - "e_ket"
- 219106:
- name: "Emissions of hoch2ch2o2"
- alternative_names:
- - "e_eo2"
- 219107:
- name: "Emissions of glyoxal"
- alternative_names:
- - "e_glyoxal"
- 219108:
- name: "Emissions of hoch2ch2o"
- alternative_names:
- - "e_eo"
- 219109:
- name: "Emissions of unsaturated dicarbonyls"
- alternative_names:
- - "e_dcb"
- 219110:
- name: "Emissions of methacrolein"
- alternative_names:
- - "e_macr"
- 219111:
- name: "Emissions of unsaturated hydroxy dicarbonyl"
- alternative_names:
- - "e_udd"
- 219112:
- name: "Emissions of isopropyldioxidanyl"
- alternative_names:
- - "e_c3h7o2"
- 219113:
- name: "Emissions of hydroxy ketone"
- alternative_names:
- - "e_hket"
- 219114:
- name: "Emissions of isopropyl hydroperoxide"
- alternative_names:
- - "e_c3h7ooh"
- 219115:
- name: "Emissions of c3h6oho2"
- alternative_names:
- - "e_po2"
- 219116:
- name: "Emissions of c3h6ohooh"
- alternative_names:
- - "e_pooh"
- 219117:
- name: "Emissions of higher organic peroxides"
- alternative_names:
- - "e_op2"
- 219118:
- name: "Emissions of hydroxyacetone"
- alternative_names:
- - "e_hyac"
- 219119:
- name: "Emissions of peroxyacetic acid"
- alternative_names:
- - "e_paa"
- 219120:
- name: "Emissions of ch3coch2o2"
- alternative_names:
- - "e_ro2"
- 219121:
- name: "Emissions of peroxy radical from c2h6"
- alternative_names:
- - "e_ethp"
- 219122:
- name: "Emissions of peroxy radical from hc3"
- alternative_names:
- - "e_hc3p"
- 219123:
- name: "Emissions of peroxy radical from hc5"
- alternative_names:
- - "e_hc5p"
- 219124:
- name: "Emissions of lumped alkenes"
- alternative_names:
- - "e_bigene"
- 219125:
- name: "Emissions of peroxy radical from hc8"
- alternative_names:
- - "e_hc8p"
- 219126:
- name: "Emissions of lumped alkanes"
- alternative_names:
- - "e_bigalk"
- 219127:
- name: "Emissions of peroxy radical from c2h4"
- alternative_names:
- - "e_etep"
- 219128:
- name: "Emissions of c4h8o"
- alternative_names:
- - "e_mek"
- 219129:
- name: "Emissions of peroxy radical from terminal alkenes"
- alternative_names:
- - "e_oltp"
- 219130:
- name: "Emissions of c4h9o3"
- alternative_names:
- - "e_eneo2"
- 219131:
- name: "Emissions of peroxy radical from internal alkenes"
- alternative_names:
- - "e_olip"
- 219132:
- name: "Emissions of ch3coch(oo)ch3"
- alternative_names:
- - "e_meko2"
- 219133:
- name: "Emissions of peroxy radical from c5h8"
- alternative_names:
- - "e_isopo2"
- 219134:
- name: "Emissions of ch3coch(ooh)ch3"
- alternative_names:
- - "e_mekooh"
- 219135:
- name: "Emissions of peroxy radical from a-pinene cyclic terpenes"
- alternative_names:
- - "e_apip"
- 219136:
- name: "Emissions of ch2=c(ch3)co3"
- alternative_names:
- - "e_mco3"
- 219137:
- name: "Emissions of peroxy radical from d-limonene cyclic diene"
- alternative_names:
- - "e_limp"
- 219138:
- name: "Emissions of methylvinylketone"
- alternative_names:
- - "e_mvk"
- 219139:
- name: "Emissions of phenoxy radical"
- alternative_names:
- - "e_pho"
- 219140:
- name: "Emissions of peroxy radical from toluene and less reactive aromatics"
- alternative_names:
- - "e_tolp"
- 219141:
- name: "Emissions of ch3c(o)ch(oo)ch2oh"
- alternative_names:
- - "e_macro2"
- 219142:
- name: "Emissions of peroxy radical from xylene and more reactive aromatics"
- alternative_names:
- - "e_xylp"
- 219143:
- name: "Emissions of h3c(o)ch(ooh)ch2oh"
- alternative_names:
- - "e_macrooh"
- 219144:
- name: "Emissions of peroxy radical from cresol"
- alternative_names:
- - "e_cslp"
- 219145:
- name: "Emissions of unsaturated pans"
- alternative_names:
- - "e_mpan"
- 219146:
- name: "Emissions of unsaturated acyl peroxy radical"
- alternative_names:
- - "e_tco3_c"
- 219147:
- name: "Emissions of peroxy radical from ketones"
- alternative_names:
- - "e_ketp"
- 219148:
- name: "Emissions of c5h11o2"
- alternative_names:
- - "e_alko2"
- 219149:
- name: "Emissions of no3-alkenes adduct reacting to form carbonitrates"
- alternative_names:
- - "e_olnn"
- 219150:
- name: "Emissions of c5h11ooh"
- alternative_names:
- - "e_alkooh"
- 219151:
- name: "Emissions of no3-alkenes adduct reacting via decomposition"
- alternative_names:
- - "e_olnd"
- 219152:
- name: "Emissions of hoch2c(ch3)=chcho"
- alternative_names:
- - "e_bigald"
- 219153:
- name: "Emissions of c5h6o2"
- alternative_names:
- - "e_hydrald"
- 219154:
- name: "Emissions of trop sulfuric acid"
- alternative_names:
- - "e_sulf"
- 219155:
- name: "Emissions of oxides"
- alternative_names:
- - "e_ox"
- 219156:
- name: "Emissions of ch2chc(ch3)(oo)ch2ono2"
- alternative_names:
- - "e_isopno3"
- 219157:
- name: "Emissions of c3 organic nitrate"
- alternative_names:
- - "e_onitr"
- 219158:
- name: "Emissions of chlorine oxides"
- alternative_names:
- - "e_clox"
- 219159:
- name: "Emissions of bromine oxides"
- alternative_names:
- - "e_brox"
- 219160:
- name: "Emissions of hoch2c(ooh)(ch3)chchoh"
- alternative_names:
- - "e_xooh"
- 219161:
- name: "Emissions of hoch2c(ooh)(ch3)ch=ch2"
- alternative_names:
- - "e_isopooh"
- 219162:
- name: "Emissions of lumped aromatics"
- alternative_names:
- - "e_toluene"
- 219163:
- name: "Emissions of dimethyl sulfoxyde"
- alternative_names:
- - "e_dmso"
- 219164:
- name: "Emissions of c7h9o5"
- alternative_names:
- - "e_tolo2"
- 219165:
- name: "Emissions of c7h10o5"
- alternative_names:
- - "e_tolooh"
- 219166:
- name: "Emissions of hydrogensulfide"
- alternative_names:
- - "e_h2s"
- 219167:
- name: "Emissions of c7h10o6"
- alternative_names:
- - "e_xoh"
- 219168:
- name: "Emissions of all nitrogen oxides"
- alternative_names:
- - "e_noy"
- 219169:
- name: "Emissions of chlorine family"
- alternative_names:
- - "e_cly"
- 219170:
- name: "Emissions of c10h16(oh)(oo)"
- alternative_names:
- - "e_terpo2"
- 219171:
- name: "Emissions of bromine family"
- alternative_names:
- - "e_bry"
- 219172:
- name: "Emissions of c10h18o3"
- alternative_names:
- - "e_terpooh"
- 219173:
- name: "Emissions of nitrogen atom"
- alternative_names:
- - "e_n"
- 219174:
- name: "Emissions of chlorine monoxide"
- alternative_names:
- - "e_clo"
- 219175:
- name: "Emissions of chlorine atom"
- alternative_names:
- - "e_cl_c"
- 219176:
- name: "Emissions of bromine monoxide"
- alternative_names:
- - "e_bro"
- 219177:
- name: "Emissions of hydrogen atom"
- alternative_names:
- - "e_h_c"
- 219178:
- name: "Emissions of methyl group"
- alternative_names:
- - "e_ch3"
- 219179:
- name: "Emissions of aromatic-ho from toluene and less reactive aromatics"
- alternative_names:
- - "e_addt"
- 219180:
- name: "Emissions of aromatic-ho from xylene and more reactive aromatics"
- alternative_names:
- - "e_addx"
- 219181:
- name: "Emissions of ammonium nitrate"
- alternative_names:
- - "e_nh4no3"
- 219182:
- name: "Emissions of aromatic-ho from csl"
- alternative_names:
- - "e_addc"
- 219183:
- name: "Emissions of secondary organic aerosol type 1"
- alternative_names:
- - "e_soa1"
- 219184:
- name: "Emissions of secondary organic aerosol type 2a"
- alternative_names:
- - "e_soa2a"
- 219185:
- name: "Emissions of secondary organic aerosol type 2b"
- alternative_names:
- - "e_soa2b"
- 219186:
- name: "Emissions of condensable gas type 1"
- alternative_names:
- - "e_sog1"
- 219187:
- name: "Emissions of condensable gas type 2a"
- alternative_names:
- - "e_sog2a"
- 219188:
- name: "Emissions of condensable gas type 2b"
- alternative_names:
- - "e_sog2b"
- 219189:
- name: "Emissions of sulfur trioxide"
- alternative_names:
- - "e_so3"
- 219190:
- name: "Emissions of carbonyl sulfide"
- alternative_names:
- - "e_ocs_c"
- 219191:
- name: "Emissions of bromine atom"
- alternative_names:
- - "e_br"
- 219192:
- name: "Emissions of bromine"
- alternative_names:
- - "e_br2"
- 219193:
- name: "Emissions of bromine monochloride"
- alternative_names:
- - "e_brcl"
- 219194:
- name: "Emissions of bromine nitrate"
- alternative_names:
- - "e_brono2"
- 219195:
- name: "Emissions of dibromomethane"
- alternative_names:
- - "e_ch2br2"
- 219196:
- name: "Emissions of methoxy radical"
- alternative_names:
- - "e_ch3o"
- 219197:
- name: "Emissions of tribromomethane"
- alternative_names:
- - "e_chbr3"
- 219198:
- name: "Emissions of asymmetric chlorine dioxide radical"
- alternative_names:
- - "e_cloo"
- 219199:
- name: "Emissions of hydrogen"
- alternative_names:
- - "e_h2"
- 219200:
- name: "Emissions of hydrogen chloride"
- alternative_names:
- - "e_hcl"
- 219201:
- name: "Emissions of formyl radical"
- alternative_names:
- - "e_hco"
- 219202:
- name: "Emissions of hydrogen fluoride"
- alternative_names:
- - "e_hf"
- 219203:
- name: "Emissions of oxygen atom"
- alternative_names:
- - "e_o"
- 219204:
- name: "Emissions of excited oxygen atom"
- alternative_names:
- - "e_o1d"
- 219205:
- name: "Emissions of ground state oxygen atom"
- alternative_names:
- - "e_o3p"
- 219206:
- name: "Emissions of stratospheric aerosol"
- alternative_names:
- - "e_strataer"
- 219207:
- name: "Wildfire flux of paraffins"
- alternative_names:
- - "parfire"
- 219208:
- name: "Wildfire flux of olefines"
- alternative_names:
- - "olefire"
- 219209:
- name: "Wildfire flux of aldehydes"
- alternative_names:
- - "ald2fire"
- 219210:
- name: "Wildfire flux of ketones"
- alternative_names:
- - "ketfire"
- 219211:
- name: "Wildfire flux of f a-pinene cyclic terpenes"
- alternative_names:
- - "apifire"
- 219212:
- name: "Wildfire flux of toluene less reactive aromatics"
- alternative_names:
- - "tolfire"
- 219213:
- name: "Wildfire flux of xylene more reactive aromatics"
- alternative_names:
- - "xylfire"
- 219214:
- name: "Wildfire flux of d-limonene cyclic diene"
- alternative_names:
- - "limfire"
- 219215:
- name: "Wildfire flux of terminal alkenes"
- alternative_names:
- - "oltfire"
- 219216:
- name: "Wildfire flux of alkanes low oh rate"
- alternative_names:
- - "hc3fire"
- 219217:
- name: "Wildfire flux of alkanes med oh rate"
- alternative_names:
- - "hc5fire"
- 219218:
- name: "Wildfire flux of alkanes high oh rate"
- alternative_names:
- - "hc8fire"
- 219219:
- name: "Wildfire flux of hydrogen cyanide"
- alternative_names:
- - "hcnfire"
- 219220:
- name: "Wildfire flux of acetonitrile"
- alternative_names:
- - "ch3cnfire"
- 219221:
- name: "Atmosphere emission mass flux of volcanic sulfur dioxide"
- alternative_names:
- - "e_vso2"
- 219222:
- name: "Atmosphere emission mass flux of aromatic peroxy radical"
- alternative_names:
- - "e_aroo2"
- 219223:
- name: "Atmosphere emission mass flux of ethyne"
- alternative_names:
- - "e_c2h2"
- 219224:
- name: "Atmosphere emission mass flux of acetonitrile"
- alternative_names:
- - "e_ch3cn"
- 219225:
- name: "Atmosphere emission mass flux of methyl peroxy nitrate"
- alternative_names:
- - "e_ch3o2no2"
- 219226:
- name: "Atmosphere emission mass flux of hydrogen cyanide"
- alternative_names:
- - "e_hcn"
- 219227:
- name: "Atmosphere emission mass flux of hydroperoxy aldehydes type 1"
- alternative_names:
- - "e_hpald1"
- 219228:
- name: "Atmosphere emission mass flux of hydroperoxy aldehydes type 2"
- alternative_names:
- - "e_hpald2"
- 219229:
- name: "Atmosphere emission mass flux of isoprene peroxy type b"
- alternative_names:
- - "e_isopbo2"
- 219230:
- name: "Atmosphere emission mass flux of isoprene peroxy type d"
- alternative_names:
- - "e_isopdo2"
- 219231:
- name: "Atmosphere emission mass flux of anthropogenic volatile organic compounds"
- alternative_names:
- - "e_voca"
- 219232:
- name: "Atmosphere emission mass flux of biomass burning volatile organic compounds"
- alternative_names:
- - "e_vocbb"
- 220228:
- name: "Total precipitation observation count"
- alternative_names:
- - "tpoc"
- 221001:
- name: "Ozone deposition velocity"
- alternative_names:
- - "dv_go3"
- 221002:
- name: "Nitrogen oxides deposition velocity"
- alternative_names:
- - "dv_nox"
- 221003:
- name: "Hydrogen peroxide deposition velocity"
- alternative_names:
- - "dv_h2o2"
- 221004:
- name: "Methane deposition velocity"
- alternative_names:
- - "dv_ch4"
- 221005:
- name: "Carbon monoxide deposition velocity"
- alternative_names:
- - "dv_co"
- 221006:
- name: "Nitric acid deposition velocity"
- alternative_names:
- - "dv_hno3"
- 221007:
- name: "Methyl peroxide deposition velocity"
- alternative_names:
- - "dv_ch3ooh"
- 221008:
- name: "Formaldehyde deposition velocity"
- alternative_names:
- - "dv_hcho"
- 221009:
- name: "Paraffins deposition velocity"
- alternative_names:
- - "dv_par"
- 221010:
- name: "Ethene deposition velocity"
- alternative_names:
- - "dv_c2h4"
- 221011:
- name: "Olefins deposition velocity"
- alternative_names:
- - "dv_ole"
- 221012:
- name: "Aldehydes deposition velocity"
- alternative_names:
- - "dv_ald2"
- 221013:
- name: "Peroxyacetyl nitrate deposition velocity"
- alternative_names:
- - "dv_pan"
- 221014:
- name: "Peroxides deposition velocity"
- alternative_names:
- - "dv_rooh"
- 221015:
- name: "Organic nitrates deposition velocity"
- alternative_names:
- - "dv_onit"
- 221016:
- name: "Isoprene deposition velocity"
- alternative_names:
- - "dv_c5h8"
- 221017:
- name: "Sulfur dioxide deposition velocity"
- alternative_names:
- - "dv_so2"
- 221018:
- name: "Dimethyl sulfide deposition velocity"
- alternative_names:
- - "dv_dms"
- 221019:
- name: "Ammonia deposition velocity"
- alternative_names:
- - "dv_nh3"
- 221020:
- name: "Sulfate deposition velocity"
- alternative_names:
- - "dv_so4"
- 221021:
- name: "Ammonium deposition velocity"
- alternative_names:
- - "dv_nh4"
- 221022:
- name: "Methane sulfonic acid deposition velocity"
- alternative_names:
- - "dv_msa"
- 221023:
- name: "Methyl glyoxal deposition velocity"
- alternative_names:
- - "dv_ch3cocho"
- 221024:
- name: "Stratospheric ozone deposition velocity"
- alternative_names:
- - "dv_o3s"
- 221025:
- name: "Radon deposition velocity"
- alternative_names:
- - "dv_ra"
- 221026:
- name: "Lead deposition velocity"
- alternative_names:
- - "dv_pb"
- 221027:
- name: "Nitrogen monoxide deposition velocity"
- alternative_names:
- - "dv_no"
- 221028:
- name: "Hydroperoxy radical deposition velocity"
- alternative_names:
- - "dv_ho2"
- 221029:
- name: "Methylperoxy radical deposition velocity"
- alternative_names:
- - "dv_ch3o2"
- 221030:
- name: "Hydroxyl radical deposition velocity"
- alternative_names:
- - "dv_oh"
- 221031:
- name: "Nitrogen dioxide deposition velocity"
- alternative_names:
- - "dv_no2"
- 221032:
- name: "Nitrate radical deposition velocity"
- alternative_names:
- - "dv_no3"
- 221033:
- name: "Dinitrogen pentoxide deposition velocity"
- alternative_names:
- - "dv_n2o5"
- 221034:
- name: "Pernitric acid deposition velocity"
- alternative_names:
- - "dv_ho2no2"
- 221035:
- name: "Peroxy acetyl radical deposition velocity"
- alternative_names:
- - "dv_c2o3"
- 221036:
- name: "Organic ethers deposition velocity"
- alternative_names:
- - "dv_ror"
- 221037:
- name: "Par budget corrector deposition velocity"
- alternative_names:
- - "dv_rxpar"
- 221038:
- name: "No to no2 operator deposition velocity"
- alternative_names:
- - "dv_xo2"
- 221039:
- name: "No to alkyl nitrate operator deposition velocity"
- alternative_names:
- - "dv_xo2n"
- 221040:
- name: "Amine deposition velocity"
- alternative_names:
- - "dv_nh2"
- 221041:
- name: "Polar stratospheric cloud deposition velocity"
- alternative_names:
- - "dv_psc"
- 221042:
- name: "Methanol deposition velocity"
- alternative_names:
- - "dv_ch3oh"
- 221043:
- name: "Formic acid deposition velocity"
- alternative_names:
- - "dv_hcooh"
- 221044:
- name: "Methacrylic acid deposition velocity"
- alternative_names:
- - "dv_mcooh"
- 221045:
- name: "Ethane deposition velocity"
- alternative_names:
- - "dv_c2h6"
- 221046:
- name: "Ethanol deposition velocity"
- alternative_names:
- - "dv_c2h5oh"
- 221047:
- name: "Propane deposition velocity"
- alternative_names:
- - "dv_c3h8"
- 221048:
- name: "Propene deposition velocity"
- alternative_names:
- - "dv_c3h6"
- 221049:
- name: "Terpenes deposition velocity"
- alternative_names:
- - "dv_c10h16"
- 221050:
- name: "Methacrolein mvk deposition velocity"
- alternative_names:
- - "dv_ispd"
- 221051:
- name: "Nitrate deposition velocity"
- alternative_names:
- - "dv_no3_a"
- 221052:
- name: "Acetone deposition velocity"
- alternative_names:
- - "dv_ch3coch3"
- 221053:
- name: "Acetone product deposition velocity"
- alternative_names:
- - "dv_aco2"
- 221054:
- name: "Ic3h7o2 deposition velocity"
- alternative_names:
- - "dv_ic3h7o2"
- 221055:
- name: "Hypropo2 deposition velocity"
- alternative_names:
- - "dv_hypropo2"
- 221056:
- name: "Nitrogen oxides transp deposition velocity"
- alternative_names:
- - "dv_noxa"
- 221057:
- name: "Dry deposition velocity of carbon dioxide (chemistry)"
- alternative_names:
- - "dv_co2_c"
- 221058:
- name: "Dry deposition velocity of nitrous oxide (chemistry)"
- alternative_names:
- - "dv_n2o_c"
- 221059:
- name: "Dry deposition velocity of water vapour (chemistry)"
- alternative_names:
- - "dv_h2o"
- 221060:
- name: "Dry deposition velocity of oxygen"
- alternative_names:
- - "dv_o2"
- 221061:
- name: "Dry deposition velocity of singlet oxygen"
- alternative_names:
- - "dv_o2_1s"
- 221062:
- name: "Dry deposition velocity of singlet delta oxygen"
- alternative_names:
- - "dv_o2_1d"
- 221063:
- name: "Dry deposition velocity of chlorine dioxide"
- alternative_names:
- - "dv_oclo"
- 221064:
- name: "Dry deposition velocity of chlorine nitrate"
- alternative_names:
- - "dv_clono2"
- 221065:
- name: "Dry deposition velocity of hypochlorous acid"
- alternative_names:
- - "dv_hocl"
- 221066:
- name: "Dry deposition velocity of chlorine"
- alternative_names:
- - "dv_cl2"
- 221067:
- name: "Dry deposition velocity of nitryl chloride"
- alternative_names:
- - "dv_clno2"
- 221068:
- name: "Dry deposition velocity of hydrogen bromide"
- alternative_names:
- - "dv_hbr"
- 221069:
- name: "Dry deposition velocity of dichlorine dioxide"
- alternative_names:
- - "dv_cl2o2"
- 221070:
- name: "Dry deposition velocity of hypobromous acid"
- alternative_names:
- - "dv_hobr"
- 221071:
- name: "Dry deposition velocity of trichlorofluoromethane"
- alternative_names:
- - "dv_cfc11"
- 221072:
- name: "Dry deposition velocity of dichlorodifluoromethane"
- alternative_names:
- - "dv_cfc12"
- 221073:
- name: "Dry deposition velocity of trichlorotrifluoroethane"
- alternative_names:
- - "dv_cfc113"
- 221074:
- name: "Dry deposition velocity of dichlorotetrafluoroethane"
- alternative_names:
- - "dv_cfc114"
- 221075:
- name: "Dry deposition velocity of chloropentafluoroethane"
- alternative_names:
- - "dv_cfc115"
- 221076:
- name: "Dry deposition velocity of tetrachloromethane"
- alternative_names:
- - "dv_ccl4"
- 221077:
- name: "Dry deposition velocity of methyl chloroform"
- alternative_names:
- - "dv_ch3ccl3"
- 221078:
- name: "Dry deposition velocity of methyl chloride"
- alternative_names:
- - "dv_ch3cl"
- 221079:
- name: "Dry deposition velocity of chlorodifluoromethane"
- alternative_names:
- - "dv_hcfc22"
- 221080:
- name: "Dry deposition velocity of methyl bromide"
- alternative_names:
- - "dv_ch3br"
- 221081:
- name: "Dry deposition velocity of dibromodifluoromethane"
- alternative_names:
- - "dv_ha1202"
- 221082:
- name: "Dry deposition velocity of bromochlorodifluoromethane"
- alternative_names:
- - "dv_ha1211"
- 221083:
- name: "Dry deposition velocity of trifluorobromomethane"
- alternative_names:
- - "dv_ha1301"
- 221084:
- name: "Dry deposition velocity of cbrf2cbrf2"
- alternative_names:
- - "dv_ha2402"
- 221085:
- name: "Dry deposition velocity of sulfuric acid"
- alternative_names:
- - "dv_h2so4"
- 221086:
- name: "Dry deposition velocity of nitrous acid"
- alternative_names:
- - "dv_hono"
- 221087:
- name: "Dry deposition velocity of alkanes low oh rate"
- alternative_names:
- - "dv_hc3"
- 221088:
- name: "Dry deposition velocity of alkanes med oh rate"
- alternative_names:
- - "dv_hc5"
- 221089:
- name: "Dry deposition velocity of alkanes high oh rate"
- alternative_names:
- - "dv_hc8"
- 221090:
- name: "Dry deposition velocity of terminal alkenes"
- alternative_names:
- - "dv_olt"
- 221091:
- name: "Dry deposition velocity of internal alkenes"
- alternative_names:
- - "dv_oli"
- 221092:
- name: "Dry deposition velocity of ethylperoxy radical"
- alternative_names:
- - "dv_c2h5o2"
- 221093:
- name: "Dry deposition velocity of butadiene"
- alternative_names:
- - "dv_dien"
- 221094:
- name: "Dry deposition velocity of ethyl hydroperoxide"
- alternative_names:
- - "dv_c2h5ooh"
- 221095:
- name: "Dry deposition velocity of a-pinene cyclic terpenes"
- alternative_names:
- - "dv_api"
- 221096:
- name: "Dry deposition velocity of acetic acid"
- alternative_names:
- - "dv_ch3cooh"
- 221097:
- name: "Dry deposition velocity of d-limonene cyclic diene"
- alternative_names:
- - "dv_lim"
- 221098:
- name: "Dry deposition velocity of acetaldehyde"
- alternative_names:
- - "dv_ch3cho"
- 221099:
- name: "Dry deposition velocity of toluene and less reactive aromatics"
- alternative_names:
- - "dv_tol"
- 221100:
- name: "Dry deposition velocity of xylene and more reactive aromatics"
- alternative_names:
- - "dv_xyl"
- 221101:
- name: "Dry deposition velocity of glycolaldehyde"
- alternative_names:
- - "dv_glyald"
- 221102:
- name: "Dry deposition velocity of cresol"
- alternative_names:
- - "dv_cresol"
- 221103:
- name: "Dry deposition velocity of acetaldehyde and higher"
- alternative_names:
- - "dv_ald"
- 221104:
- name: "Dry deposition velocity of peracetic acid"
- alternative_names:
- - "dv_ch3coooh"
- 221105:
- name: "Dry deposition velocity of ketones"
- alternative_names:
- - "dv_ket"
- 221106:
- name: "Dry deposition velocity of hoch2ch2o2"
- alternative_names:
- - "dv_eo2"
- 221107:
- name: "Dry deposition velocity of glyoxal"
- alternative_names:
- - "dv_glyoxal"
- 221108:
- name: "Dry deposition velocity of hoch2ch2o"
- alternative_names:
- - "dv_eo"
- 221109:
- name: "Dry deposition velocity of unsaturated dicarbonyls"
- alternative_names:
- - "dv_dcb"
- 221110:
- name: "Dry deposition velocity of methacrolein"
- alternative_names:
- - "dv_macr"
- 221111:
- name: "Dry deposition velocity of unsaturated hydroxy dicarbonyl"
- alternative_names:
- - "dv_udd"
- 221112:
- name: "Dry deposition velocity of isopropyldioxidanyl"
- alternative_names:
- - "dv_c3h7o2"
- 221113:
- name: "Dry deposition velocity of hydroxy ketone"
- alternative_names:
- - "dv_hket"
- 221114:
- name: "Dry deposition velocity of isopropyl hydroperoxide"
- alternative_names:
- - "dv_c3h7ooh"
- 221115:
- name: "Dry deposition velocity of c3h6oho2"
- alternative_names:
- - "dv_po2"
- 221116:
- name: "Dry deposition velocity of c3h6ohooh"
- alternative_names:
- - "dv_pooh"
- 221117:
- name: "Dry deposition velocity of higher organic peroxides"
- alternative_names:
- - "dv_op2"
- 221118:
- name: "Dry deposition velocity of hydroxyacetone"
- alternative_names:
- - "dv_hyac"
- 221119:
- name: "Dry deposition velocity of peroxyacetic acid"
- alternative_names:
- - "dv_paa"
- 221120:
- name: "Dry deposition velocity of ch3coch2o2"
- alternative_names:
- - "dv_ro2"
- 221121:
- name: "Dry deposition velocity of peroxy radical from c2h6"
- alternative_names:
- - "dv_ethp"
- 221122:
- name: "Dry deposition velocity of peroxy radical from hc3"
- alternative_names:
- - "dv_hc3p"
- 221123:
- name: "Dry deposition velocity of peroxy radical from hc5"
- alternative_names:
- - "dv_hc5p"
- 221124:
- name: "Dry deposition velocity of lumped alkenes"
- alternative_names:
- - "dv_bigene"
- 221125:
- name: "Dry deposition velocity of peroxy radical from hc8"
- alternative_names:
- - "dv_hc8p"
- 221126:
- name: "Dry deposition velocity of lumped alkanes"
- alternative_names:
- - "dv_bigalk"
- 221127:
- name: "Dry deposition velocity of peroxy radical from c2h4"
- alternative_names:
- - "dv_etep"
- 221128:
- name: "Dry deposition velocity of c4h8o"
- alternative_names:
- - "dv_mek"
- 221129:
- name: "Dry deposition velocity of peroxy radical from terminal alkenes"
- alternative_names:
- - "dv_oltp"
- 221130:
- name: "Dry deposition velocity of c4h9o3"
- alternative_names:
- - "dv_eneo2"
- 221131:
- name: "Dry deposition velocity of peroxy radical from internal alkenes"
- alternative_names:
- - "dv_olip"
- 221132:
- name: "Dry deposition velocity of ch3coch(oo)ch3"
- alternative_names:
- - "dv_meko2"
- 221133:
- name: "Dry deposition velocity of peroxy radical from c5h8"
- alternative_names:
- - "dv_isopo2"
- 221134:
- name: "Dry deposition velocity of ch3coch(ooh)ch3"
- alternative_names:
- - "dv_mekooh"
- 221135:
- name: "Dry deposition velocity of peroxy radical from a-pinene cyclic terpenes"
- alternative_names:
- - "dv_apip"
- 221136:
- name: "Dry deposition velocity of ch2=c(ch3)co3"
- alternative_names:
- - "dv_mco3"
- 221137:
- name: "Dry deposition velocity of peroxy radical from d-limonene cyclic diene"
- alternative_names:
- - "dv_limp"
- 221138:
- name: "Dry deposition velocity of methylvinylketone"
- alternative_names:
- - "dv_mvk"
- 221139:
- name: "Dry deposition velocity of phenoxy radical"
- alternative_names:
- - "dv_pho"
- 221140:
- name: "Dry deposition velocity of peroxy radical from toluene and less reactive
- aromatics"
- alternative_names:
- - "dv_tolp"
- 221141:
- name: "Dry deposition velocity of ch3c(o)ch(oo)ch2oh"
- alternative_names:
- - "dv_macro2"
- 221142:
- name: "Dry deposition velocity of peroxy radical from xylene and more reactive
- aromatics"
- alternative_names:
- - "dv_xylp"
- 221143:
- name: "Dry deposition velocity of h3c(o)ch(ooh)ch2oh"
- alternative_names:
- - "dv_macrooh"
- 221144:
- name: "Dry deposition velocity of peroxy radical from cresol"
- alternative_names:
- - "dv_cslp"
- 221145:
- name: "Dry deposition velocity of unsaturated pans"
- alternative_names:
- - "dv_mpan"
- 221146:
- name: "Dry deposition velocity of unsaturated acyl peroxy radical"
- alternative_names:
- - "dv_tco3_c"
- 221147:
- name: "Dry deposition velocity of peroxy radical from ketones"
- alternative_names:
- - "dv_ketp"
- 221148:
- name: "Dry deposition velocity of c5h11o2"
- alternative_names:
- - "dv_alko2"
- 221149:
- name: "Dry deposition velocity of no3-alkenes adduct reacting to form carbonitrates"
- alternative_names:
- - "dv_olnn"
- 221150:
- name: "Dry deposition velocity of c5h11ooh"
- alternative_names:
- - "dv_alkooh"
- 221151:
- name: "Dry deposition velocity of no3-alkenes adduct reacting via decomposition"
- alternative_names:
- - "dv_olnd"
- 221152:
- name: "Dry deposition velocity of hoch2c(ch3)=chcho"
- alternative_names:
- - "dv_bigald"
- 221153:
- name: "Dry deposition velocity of c5h6o2"
- alternative_names:
- - "dv_hydrald"
- 221154:
- name: "Dry deposition velocity of trop sulfuric acid"
- alternative_names:
- - "dv_sulf"
- 221155:
- name: "Dry deposition velocity of oxides"
- alternative_names:
- - "dv_ox"
- 221156:
- name: "Dry deposition velocity of ch2chc(ch3)(oo)ch2ono2"
- alternative_names:
- - "dv_isopno3"
- 221157:
- name: "Dry deposition velocity of c3 organic nitrate"
- alternative_names:
- - "dv_onitr"
- 221158:
- name: "Dry deposition velocity of chlorine oxides"
- alternative_names:
- - "dv_clox"
- 221159:
- name: "Dry deposition velocity of bromine oxides"
- alternative_names:
- - "dv_brox"
- 221160:
- name: "Dry deposition velocity of hoch2c(ooh)(ch3)chchoh"
- alternative_names:
- - "dv_xooh"
- 221161:
- name: "Dry deposition velocity of hoch2c(ooh)(ch3)ch=ch2"
- alternative_names:
- - "dv_isopooh"
- 221162:
- name: "Dry deposition velocity of lumped aromatics"
- alternative_names:
- - "dv_toluene"
- 221163:
- name: "Dry deposition velocity of dimethyl sulfoxyde"
- alternative_names:
- - "dv_dmso"
- 221164:
- name: "Dry deposition velocity of c7h9o5"
- alternative_names:
- - "dv_tolo2"
- 221165:
- name: "Dry deposition velocity of c7h10o5"
- alternative_names:
- - "dv_tolooh"
- 221166:
- name: "Dry deposition velocity of hydrogensulfide"
- alternative_names:
- - "dv_h2s"
- 221167:
- name: "Dry deposition velocity of c7h10o6"
- alternative_names:
- - "dv_xoh"
- 221168:
- name: "Dry deposition velocity of all nitrogen oxides"
- alternative_names:
- - "dv_noy"
- 221169:
- name: "Dry deposition velocity of chlorine family"
- alternative_names:
- - "dv_cly"
- 221170:
- name: "Dry deposition velocity of c10h16(oh)(oo)"
- alternative_names:
- - "dv_terpo2"
- 221171:
- name: "Dry deposition velocity of bromine family"
- alternative_names:
- - "dv_bry"
- 221172:
- name: "Dry deposition velocity of c10h18o3"
- alternative_names:
- - "dv_terpooh"
- 221173:
- name: "Dry deposition velocity of nitrogen atom"
- alternative_names:
- - "dv_n"
- 221174:
- name: "Dry deposition velocity of chlorine monoxide"
- alternative_names:
- - "dv_clo"
- 221175:
- name: "Dry deposition velocity of chlorine atom"
- alternative_names:
- - "dv_cl_c"
- 221176:
- name: "Dry deposition velocity of bromine monoxide"
- alternative_names:
- - "dv_bro"
- 221177:
- name: "Dry deposition velocity of hydrogen atom"
- alternative_names:
- - "dv_h_c"
- 221178:
- name: "Dry deposition velocity of methyl group"
- alternative_names:
- - "dv_ch3"
- 221179:
- name: "Dry deposition velocity of aromatic-ho from toluene and less reactive aromatics"
- alternative_names:
- - "dv_addt"
- 221180:
- name: "Dry deposition velocity of aromatic-ho from xylene and more reactive aromatics"
- alternative_names:
- - "dv_addx"
- 221181:
- name: "Dry deposition velocity of ammonium nitrate"
- alternative_names:
- - "dv_nh4no3"
- 221182:
- name: "Dry deposition velocity of aromatic-ho from csl"
- alternative_names:
- - "dv_addc"
- 221183:
- name: "Dry deposition velocity of secondary organic aerosol type 1"
- alternative_names:
- - "dv_soa1"
- 221184:
- name: "Dry deposition velocity of secondary organic aerosol type 2a"
- alternative_names:
- - "dv_soa2a"
- 221185:
- name: "Dry deposition velocity of secondary organic aerosol type 2b"
- alternative_names:
- - "dv_soa2b"
- 221186:
- name: "Dry deposition velocity of condensable gas type 1"
- alternative_names:
- - "dv_sog1"
- 221187:
- name: "Dry deposition velocity of condensable gas type 2a"
- alternative_names:
- - "dv_sog2a"
- 221188:
- name: "Dry deposition velocity of condensable gas type 2b"
- alternative_names:
- - "dv_sog2b"
- 221189:
- name: "Dry deposition velocity of sulfur trioxide"
- alternative_names:
- - "dv_so3"
- 221190:
- name: "Dry deposition velocity of carbonyl sulfide"
- alternative_names:
- - "dv_ocs_c"
- 221191:
- name: "Dry deposition velocity of bromine atom"
- alternative_names:
- - "dv_br"
- 221192:
- name: "Dry deposition velocity of bromine"
- alternative_names:
- - "dv_br2"
- 221193:
- name: "Dry deposition velocity of bromine monochloride"
- alternative_names:
- - "dv_brcl"
- 221194:
- name: "Dry deposition velocity of bromine nitrate"
- alternative_names:
- - "dv_brono2"
- 221195:
- name: "Dry deposition velocity of dibromomethane"
- alternative_names:
- - "dv_ch2br2"
- 221196:
- name: "Dry deposition velocity of methoxy radical"
- alternative_names:
- - "dv_ch3o"
- 221197:
- name: "Dry deposition velocity of tribromomethane"
- alternative_names:
- - "dv_chbr3"
- 221198:
- name: "Dry deposition velocity of asymmetric chlorine dioxide radical"
- alternative_names:
- - "dv_cloo"
- 221199:
- name: "Dry deposition velocity of hydrogen"
- alternative_names:
- - "dv_h2"
- 221200:
- name: "Dry deposition velocity of hydrogen chloride"
- alternative_names:
- - "dv_hcl"
- 221201:
- name: "Dry deposition velocity of formyl radical"
- alternative_names:
- - "dv_hco"
- 221202:
- name: "Dry deposition velocity of hydrogen fluoride"
- alternative_names:
- - "dv_hf"
- 221203:
- name: "Dry deposition velocity of oxygen atom"
- alternative_names:
- - "dv_o"
- 221204:
- name: "Dry deposition velocity of excited oxygen atom"
- alternative_names:
- - "dv_o1d"
- 221205:
- name: "Dry deposition velocity of ground state oxygen atom"
- alternative_names:
- - "dv_o3p"
- 221206:
- name: "Dry deposition velocity of stratospheric aerosol"
- alternative_names:
- - "dv_strataer"
- 221221:
- name: "Dry deposition velocity of volcanic sulfur dioxide"
- alternative_names:
- - "dv_vso2"
- 221222:
- name: "Dry deposition velocity of aromatic peroxy radical"
- alternative_names:
- - "dv_aroo2"
- 221223:
- name: "Dry deposition velocity of ethyne"
- alternative_names:
- - "dv_c2h2"
- 221224:
- name: "Dry deposition velocity of acetonitrile"
- alternative_names:
- - "dv_ch3cn"
- 221225:
- name: "Dry deposition velocity of methyl peroxy nitrate"
- alternative_names:
- - "dv_ch3o2no2"
- 221226:
- name: "Dry deposition velocity of hydrogen cyanide"
- alternative_names:
- - "dv_hcn"
- 221227:
- name: "Dry deposition velocity of hydroperoxy aldehydes type 1"
- alternative_names:
- - "dv_hpald1"
- 221228:
- name: "Dry deposition velocity of hydroperoxy aldehydes type 2"
- alternative_names:
- - "dv_hpald2"
- 221229:
- name: "Dry deposition velocity of isoprene peroxy type b"
- alternative_names:
- - "dv_isopbo2"
- 221230:
- name: "Dry deposition velocity of isoprene peroxy type d"
- alternative_names:
- - "dv_isopdo2"
- 221231:
- name: "Dry deposition velocity of anthropogenic volatile organic compounds"
- alternative_names:
- - "dv_voca"
- 221232:
- name: "Dry deposition velocity of biomass burning volatile organic compounds"
- alternative_names:
- - "dv_vocbb"
- 222001:
- name: "Time-integrated dry deposition mass flux of ozone"
- alternative_names:
- - "acc_dry_depm_o3"
- 222003:
- name: "Time-integrated dry deposition mass flux of hydrogen peroxide"
- alternative_names:
- - "acc_dry_depm_h2o2"
- 222005:
- name: "Time-integrated dry deposition mass flux of carbon monoxide"
- alternative_names:
- - "acc_dry_depm_co"
- 222006:
- name: "Time-integrated dry deposition mass flux of nitric acid"
- alternative_names:
- - "acc_dry_depm_hno3"
- 222007:
- name: "Time-integrated dry deposition mass flux of methyl peroxide"
- alternative_names:
- - "acc_dry_depm_ch3ooh"
- 222008:
- name: "Time-integrated dry deposition mass flux of formaldehyde"
- alternative_names:
- - "acc_dry_depm_hcho"
- 222012:
- name: "Time-integrated dry deposition mass flux of aldehydes"
- alternative_names:
- - "acc_dry_depm_ald2"
- 222013:
- name: "Time-integrated dry deposition mass flux of peroxyacetyl nitrate"
- alternative_names:
- - "acc_dry_depm_pan"
- 222014:
- name: "Time-integrated dry deposition mass flux of peroxides"
- alternative_names:
- - "acc_dry_depm_rooh"
- 222015:
- name: "Time-integrated dry deposition mass flux of organic nitrates"
- alternative_names:
- - "acc_dry_depm_onit"
- 222016:
- name: "Time-integrated dry deposition mass flux of isoprene"
- alternative_names:
- - "acc_dry_depm_c5h8"
- 222017:
- name: "Time-integrated dry deposition mass flux of sulphur dioxide"
- alternative_names:
- - "acc_dry_depm_so2"
- 222019:
- name: "Time-integrated dry deposition mass flux of ammonia"
- alternative_names:
- - "acc_dry_depm_nh3"
- 222020:
- name: "Time-integrated dry deposition mass flux of sulfate"
- alternative_names:
- - "acc_dry_depm_so4"
- 222021:
- name: "Time-integrated dry deposition mass flux of ammonium"
- alternative_names:
- - "acc_dry_depm_nh4"
- 222023:
- name: "Time-integrated dry deposition mass flux of methyl glyoxal"
- alternative_names:
- - "acc_dry_depm_ch3cocho"
- 222024:
- name: "Time-integrated dry deposition mass flux of ozone (stratospheric)"
- alternative_names:
- - "acc_dry_depm_o3s"
- 222027:
- name: "Time-integrated dry deposition mass flux of nitrogen monoxide"
- alternative_names:
- - "acc_dry_depm_no"
- 222028:
- name: "Time-integrated dry deposition mass flux of hydroperoxy radical"
- alternative_names:
- - "acc_dry_depm_ho2"
- 222029:
- name: "Time-integrated dry deposition mass flux of methylperoxy radical"
- alternative_names:
- - "acc_dry_depm_ch3o2"
- 222031:
- name: "Time-integrated dry deposition mass flux of nitrogen dioxide"
- alternative_names:
- - "acc_dry_depm_no2"
- 222032:
- name: "Time-integrated dry deposition mass flux of nitrate radical"
- alternative_names:
- - "acc_dry_depm_no3"
- 222033:
- name: "Time-integrated dry deposition mass flux of dinitrogen pentoxide"
- alternative_names:
- - "acc_dry_depm_n2o5"
- 222034:
- name: "Time-integrated dry deposition mass flux of pernitric acid"
- alternative_names:
- - "acc_dry_depm_ho2no2"
- 222042:
- name: "Time-integrated dry deposition mass flux of methanol"
- alternative_names:
- - "acc_dry_depm_ch3oh"
- 222043:
- name: "Time-integrated dry deposition mass flux of formic acid"
- alternative_names:
- - "acc_dry_depm_hcooh"
- 222044:
- name: "Time-integrated dry deposition mass flux of methacrylic acid"
- alternative_names:
- - "acc_dry_depm_mcooh"
- 222045:
- name: "Time-integrated dry deposition mass flux of ethane"
- alternative_names:
- - "acc_dry_depm_c2h6"
- 222046:
- name: "Time-integrated dry deposition mass flux of ethanol"
- alternative_names:
- - "acc_dry_depm_c2h5oh"
- 222050:
- name: "Time-integrated dry deposition mass flux of methacrolein"
- alternative_names:
- - "acc_dry_depm_ispd"
- 222051:
- name: "Time-integrated dry deposition mass flux of nitrate"
- alternative_names:
- - "acc_dry_depm_no3_a"
- 222052:
- name: "Time-integrated dry deposition mass flux of acetone"
- alternative_names:
- - "acc_dry_depm_ch3coch3"
- 222086:
- name: "Time-integrated dry deposition mass flux of nitrous acid"
- alternative_names:
- - "acc_dry_depm_hono"
- 222099:
- name: "Time-integrated dry deposition mass flux of toluene and less reactive aromatics"
- alternative_names:
- - "acc_dry_depm_tol"
- 222100:
- name: "Time-integrated dry deposition mass flux of xylene and more reactive aromatics"
- alternative_names:
- - "acc_dry_depm_xyl"
- 222101:
- name: "Time-integrated dry deposition mass flux of glycolaldehyde"
- alternative_names:
- - "acc_dry_depm_glyald"
- 222107:
- name: "Time-integrated dry deposition mass flux of glyoxal"
- alternative_names:
- - "acc_dry_depm_gly"
- 222118:
- name: "Time-integrated dry deposition mass flux of hydroxyacetone"
- alternative_names:
- - "acc_dry_depm_hyac"
- 222161:
- name: "Time-integrated dry deposition mass flux of all hydroxy-peroxides products
- of the reaction of hydroxy-isoprene adducts with o2"
- alternative_names:
- - "acc_dry_depm_isopooh"
- 222224:
- name: "Time-integrated dry deposition mass flux of acetonitrile"
- alternative_names:
- - "acc_dry_depm_ch3cn"
- 222226:
- name: "Time-integrated dry deposition mass flux of hydrogen cyanide"
- alternative_names:
- - "acc_dry_depm_hcn"
- 223001:
- name: "Time-integrated wet deposition mass flux of ozone"
- alternative_names:
- - "acc_wet_depm_o3"
- 223003:
- name: "Time-integrated wet deposition mass flux of hydrogen peroxide"
- alternative_names:
- - "acc_wet_depm_h2o2"
- 223006:
- name: "Time-integrated wet deposition mass flux of nitric acid"
- alternative_names:
- - "acc_wet_depm_hno3"
- 223007:
- name: "Time-integrated wet deposition mass flux of methyl peroxide"
- alternative_names:
- - "acc_wet_depm_ch3ooh"
- 223008:
- name: "Time-integrated wet deposition mass flux of formaldehyde"
- alternative_names:
- - "acc_wet_depm_hcho"
- 223012:
- name: "Time-integrated wet deposition mass flux of aldehydes"
- alternative_names:
- - "acc_wet_depm_ald2"
- 223013:
- name: "Time-integrated wet deposition mass flux of peroxyacetyl nitrate"
- alternative_names:
- - "acc_wet_depm_pan"
- 223014:
- name: "Time-integrated wet deposition mass flux of peroxides"
- alternative_names:
- - "acc_wet_depm_rooh"
- 223015:
- name: "Time-integrated wet deposition mass flux of organic nitrates"
- alternative_names:
- - "acc_wet_depm_onit"
- 223016:
- name: "Time-integrated wet deposition mass flux of isoprene"
- alternative_names:
- - "acc_wet_depm_c5h8"
- 223017:
- name: "Time-integrated wet deposition mass flux of sulphur dioxide"
- alternative_names:
- - "acc_wet_depm_so2"
- 223019:
- name: "Time-integrated wet deposition mass flux of ammonia"
- alternative_names:
- - "acc_wet_depm_nh3"
- 223020:
- name: "Time-integrated wet deposition mass flux of sulfate"
- alternative_names:
- - "acc_wet_depm_so4"
- 223021:
- name: "Time-integrated wet deposition mass flux of ammonium"
- alternative_names:
- - "acc_wet_depm_nh4"
- 223022:
- name: "Time-integrated wet deposition mass flux of methane sulfonic acid"
- alternative_names:
- - "acc_wet_depm_msa"
- 223023:
- name: "Time-integrated wet deposition mass flux of methyl glyoxal"
- alternative_names:
- - "acc_wet_depm_ch3cocho"
- 223025:
- name: "Time-integrated wet deposition mass flux of carbon monoxide"
- alternative_names:
- - "acc_wet_depm_co"
- 223026:
- name: "Time-integrated wet deposition mass flux of lead"
- alternative_names:
- - "acc_wet_depm_pb"
- 223027:
- name: "Time-integrated wet deposition mass flux of nitrogen monoxide"
- alternative_names:
- - "acc_wet_depm_no"
- 223028:
- name: "Time-integrated wet deposition mass flux of hydroperoxy radical"
- alternative_names:
- - "acc_wet_depm_ho2"
- 223029:
- name: "Time-integrated wet deposition mass flux of methylperoxy radical"
- alternative_names:
- - "acc_wet_depm_ch3o2"
- 223031:
- name: "Time-integrated wet deposition mass flux of nitrogen dioxide"
- alternative_names:
- - "acc_wet_depm_no2"
- 223032:
- name: "Time-integrated wet deposition mass flux of nitrate radical"
- alternative_names:
- - "acc_wet_depm_no3"
- 223033:
- name: "Time-integrated wet deposition mass flux of dinitrogen pentoxide"
- alternative_names:
- - "acc_wet_depm_n2o5"
- 223034:
- name: "Time-integrated wet deposition mass flux of pernitric acid"
- alternative_names:
- - "acc_wet_depm_ho2no2"
- 223042:
- name: "Time-integrated wet deposition mass flux of methanol"
- alternative_names:
- - "acc_wet_depm_ch3oh"
- 223043:
- name: "Time-integrated wet deposition mass flux of formic acid"
- alternative_names:
- - "acc_wet_depm_hcooh"
- 223044:
- name: "Time-integrated wet deposition mass flux of methacrylic acid"
- alternative_names:
- - "acc_wet_depm_mcooh"
- 223045:
- name: "Time-integrated wet deposition mass flux of ethane"
- alternative_names:
- - "acc_wet_depm_c2h6"
- 223046:
- name: "Time-integrated wet deposition mass flux of ethanol"
- alternative_names:
- - "acc_wet_depm_c2h5oh"
- 223050:
- name: "Time-integrated wet deposition mass flux of methacrolein"
- alternative_names:
- - "acc_wet_depm_ispd"
- 223051:
- name: "Time-integrated wet deposition mass flux of nitrate"
- alternative_names:
- - "acc_wet_depm_no3_a"
- 223052:
- name: "Time-integrated wet deposition mass flux of acetone"
- alternative_names:
- - "acc_wet_depm_ch3coch3"
- 223064:
- name: "Time-integrated wet deposition mass flux of chlorine nitrate"
- alternative_names:
- - "acc_wet_depm_clono2"
- 223065:
- name: "Time-integrated wet deposition mass flux of hypochlorous acid"
- alternative_names:
- - "acc_wet_depm_hocl"
- 223068:
- name: "Time-integrated wet deposition mass flux of hydrogen bromide"
- alternative_names:
- - "acc_wet_depm_hbr"
- 223070:
- name: "Time-integrated wet deposition mass flux of hypobromous acid"
- alternative_names:
- - "acc_wet_depm_hobr"
- 223086:
- name: "Time-integrated wet deposition mass flux of nitrous acid"
- alternative_names:
- - "acc_wet_depm_hono"
- 223099:
- name: "Time-integrated wet deposition mass flux of toluene and less reactive aromatics"
- alternative_names:
- - "acc_wet_depm_tol"
- 223100:
- name: "Time-integrated wet deposition mass flux of xylene and more reactive aromatics"
- alternative_names:
- - "acc_wet_depm_xyl"
- 223101:
- name: "Time-integrated wet deposition mass flux of glycolaldehyde"
- alternative_names:
- - "acc_wet_depm_glyald"
- 223107:
- name: "Time-integrated wet deposition mass flux of glyoxal"
- alternative_names:
- - "acc_wet_depm_gly"
- 223118:
- name: "Time-integrated wet deposition mass flux of hydroxyacetone"
- alternative_names:
- - "acc_wet_depm_hyac"
- 223161:
- name: "Time-integrated wet deposition mass flux of all hydroxy-peroxides products
- of the reaction of hydroxy-isoprene adducts with o2"
- alternative_names:
- - "acc_wet_depm_isopooh"
- 223186:
- name: "Time-integrated wet deposition mass flux of condensable gas type 1"
- alternative_names:
- - "acc_wet_depm_sog1"
- 223187:
- name: "Time-integrated wet deposition mass flux of condensable gas type 2a"
- alternative_names:
- - "acc_wet_depm_sog2a"
- 223188:
- name: "Time-integrated wet deposition mass flux of condensable gas type 2b"
- alternative_names:
- - "acc_wet_depm_sog2b"
- 223194:
- name: "Time-integrated wet deposition mass flux of bromine nitrate"
- alternative_names:
- - "acc_wet_depm_brono2"
- 223200:
- name: "Time-integrated wet deposition mass flux of hydrogen chloride"
- alternative_names:
- - "acc_wet_depm_hcl"
- 223224:
- name: "Time-integrated wet deposition mass flux of acetonitrile"
- alternative_names:
- - "acc_wet_depm_ch3cn"
- 223226:
- name: "Time-integrated wet deposition mass flux of hydrogen cyanide"
- alternative_names:
- - "acc_wet_depm_hcn"
- 223227:
- name: "Time-integrated wet deposition mass flux of hydroperoxy aldehydes type
- 1"
- alternative_names:
- - "acc_wet_depm_hpald1"
- 223228:
- name: "Time-integrated wet deposition mass flux of hydroperoxy aldehydes type
- 2"
- alternative_names:
- - "acc_wet_depm_hpald2"
- 228001:
- name: "Convective inhibition"
- alternative_names:
- - "cin"
- 228002:
- name: "Orography"
- alternative_names:
- - "orog"
- 228003:
- name: "Friction velocity"
- alternative_names:
- - "zust"
- 228004:
- name: "Mean 2 metre temperature"
- alternative_names:
- - "mean2t"
- 228005:
- name: "Mean of 10 metre wind speed"
- alternative_names:
- - "mean10ws"
- 228006:
- name: "Mean total cloud cover"
- alternative_names:
- - "meantcc"
- 228007:
- name: "Lake total depth"
- alternative_names:
- - "dl"
- 228008:
- name: "Lake mix-layer temperature"
- alternative_names:
- - "lmlt"
- 228009:
- name: "Lake mix-layer depth"
- alternative_names:
- - "lmld"
- 228010:
- name: "Lake bottom temperature"
- alternative_names:
- - "lblt"
- 228011:
- name: "Lake total layer temperature"
- alternative_names:
- - "ltlt"
- 228012:
- name: "Lake shape factor"
- alternative_names:
- - "lshf"
- 228013:
- name: "Lake ice surface temperature"
- alternative_names:
- - "lict"
- 228014:
- name: "Lake ice total depth"
- alternative_names:
- - "licd"
- 228015:
- name: "Minimum vertical gradient of refractivity inside trapping layer"
- alternative_names:
- - "dndzn"
- 228016:
- name: "Mean vertical gradient of refractivity inside trapping layer"
- alternative_names:
- - "dndza"
- 228017:
- name: "Duct base height"
- alternative_names:
- - "dctb"
- 228018:
- name: "Trapping layer base height"
- alternative_names:
- - "tplb"
- 228019:
- name: "Trapping layer top height"
- alternative_names:
- - "tplt"
- 228020:
- name: "-10 degrees c isothermal level (atm)"
- alternative_names:
- - "degm10l"
- 228021:
- name: "Total sky direct short-wave (solar) radiation at surface"
- alternative_names:
- - "fdir"
- 228022:
- name: "Surface direct short-wave radiation, clear sky"
- alternative_names:
- - "cdir"
- 228023:
- name: "Cloud base height"
- alternative_names:
- - "cbh"
- 228024:
- name: "Deg0"
- alternative_names:
- - "deg0l"
- - "0 degrees c isothermal level (atm)"
- 228025:
- name: "Horizontal visibility"
- alternative_names:
- - "hvis"
- 228026:
- name: "Maximum temperature at 2 metres in the last 3 hours"
- alternative_names:
- - "mx2t3"
- 228027:
- name: "Minimum temperature at 2 metres in the last 3 hours"
- alternative_names:
- - "mn2t3"
- 228028:
- name: "Maximum 10 metre wind gust in the last 3 hours"
- alternative_names:
- - "10fg3"
- 228029:
- name: "Instantaneous 10 metre wind gust"
- alternative_names:
- - "i10fg"
- 228030:
- name: "Relative humidity with respect to water"
- alternative_names:
- - "rhw"
- 228031:
- name: "Relative humidity with respect to ice"
- alternative_names:
- - "rhi"
- 228032:
- name: "Snow albedo"
- alternative_names:
- - "asn"
- 228033:
- name: "Fraction of stratiform precipitation cover"
- alternative_names:
- - "fspc"
- 228034:
- name: "Fraction of convective precipitation cover"
- alternative_names:
- - "fcpc"
- 228035:
- name: "Maximum cape in the last 6 hours"
- alternative_names:
- - "mxcape6"
- 228036:
- name: "Maximum capes in the last 6 hours"
- alternative_names:
- - "mxcapes6"
- 228037:
- name: "2 metre relative humidity with respect to water"
- alternative_names:
- - "2rhw"
- 228038:
- name: "Liquid water content in snow pack"
- alternative_names:
- - "lwcs"
- 228039:
- name: "Soil moisture"
- alternative_names:
- - "sm"
- 228040:
- name: "Soil wetness index in layer 1"
- alternative_names:
- - "swi1"
- 228041:
- name: "Soil wetness index in layer 2"
- alternative_names:
- - "swi2"
- 228042:
- name: "Soil wetness index in layer 3"
- alternative_names:
- - "swi3"
- 228043:
- name: "Soil wetness index in layer 4"
- alternative_names:
- - "swi4"
- 228044:
- name: "Convective available potential energy shear"
- alternative_names:
- - "capes"
- 228045:
- name: "Tropopause pressure"
- alternative_names:
- - "trpp"
- 228046:
- name: "Height of convective cloud top"
- alternative_names:
- - "hcct"
- 228047:
- name: "Height of zero-degree wet-bulb temperature"
- alternative_names:
- - "hwbt0"
- 228048:
- name: "Height of one-degree wet-bulb temperature"
- alternative_names:
- - "hwbt1"
- 228050:
- name: "Instantaneous total lightning flash density"
- alternative_names:
- - "litoti"
- 228051:
- name: "Averaged total lightning flash density in the last hour"
- alternative_names:
- - "litota1"
- 228052:
- name: "Instantaneous cloud-to-ground lightning flash density"
- alternative_names:
- - "licgi"
- 228053:
- name: "Averaged cloud-to-ground lightning flash density in the last hour"
- alternative_names:
- - "licga1"
- 228054:
- name: "Unbalanced component of specific humidity"
- alternative_names:
- - "ucq"
- 228055:
- name: "Unbalanced component of specific cloud liquid water content"
- alternative_names:
- - "ucclwc"
- 228056:
- name: "Unbalanced component of specific cloud ice water content"
- alternative_names:
- - "ucciwc"
- 228057:
- name: "Averaged total lightning flash density in the last 3 hours"
- alternative_names:
- - "litota3"
- 228058:
- name: "Averaged total lightning flash density in the last 6 hours"
- alternative_names:
- - "litota6"
- 228059:
- name: "Averaged cloud-to-ground lightning flash density in the last 3 hours"
- alternative_names:
- - "licga3"
- 228060:
- name: "Averaged cloud-to-ground lightning flash density in the last 6 hours"
- alternative_names:
- - "licga6"
- 228070:
- name: "Smos observed soil moisture retrieved using neural network"
- alternative_names:
- - "smnnob"
- 228071:
- name: "Smos observed soil moisture uncertainty retrieved using neural network"
- alternative_names:
- - "smnner"
- 228072:
- name: "Smos radio frequency interference probability"
- alternative_names:
- - "smnnrfi"
- 228073:
- name: "Smos number of observations per grid point"
- alternative_names:
- - "smnnnb"
- 228074:
- name: "Smos observation time for the satellite soil moisture data"
- alternative_names:
- - "smnntim"
- 228078:
- name: "Gpp coefficient from biogenic flux adjustment system"
- alternative_names:
- - "gppbfas"
- 228079:
- name: "Rec coefficient from biogenic flux adjustment system"
- alternative_names:
- - "recbfas"
- 228080:
- name: "Accumulated carbon dioxide net ecosystem exchange"
- alternative_names:
- - "aco2nee"
- 228081:
- name: "Accumulated carbon dioxide gross primary production"
- alternative_names:
- - "aco2gpp"
- 228082:
- name: "Accumulated carbon dioxide ecosystem respiration"
- alternative_names:
- - "aco2rec"
- 228083:
- name: "Flux of carbon dioxide net ecosystem exchange"
- alternative_names:
- - "fco2nee"
- 228084:
- name: "Flux of carbon dioxide gross primary production"
- alternative_names:
- - "fco2gpp"
- 228085:
- name: "Flux of carbon dioxide ecosystem respiration"
- alternative_names:
- - "fco2rec"
- 228086:
- name: "Soil moisture top 20 cm"
- alternative_names:
- - "sm20"
- 228087:
- name: "Soil moisture top 100 cm"
- alternative_names:
- - "sm100"
- 228088:
- name: "Total column supercooled liquid water"
- alternative_names:
- - "tcslw"
- 228089:
- name: "Total column rain water"
- alternative_names:
- - "tcrw"
- 228090:
- name: "Total column snow water"
- alternative_names:
- - "tcsw"
- 228091:
- name: "Canopy cover fraction"
- alternative_names:
- - "ccf"
- 228092:
- name: "Soil texture fraction"
- alternative_names:
- - "stf"
- 228093:
- name: "Volumetric soil moisture"
- alternative_names:
- - "swv"
- 228094:
- name: "Ice temperature"
- alternative_names:
- - "ist"
- 228095:
- name: "Soil temperature top 20 cm"
- alternative_names:
- - "st20"
- 228096:
- name: "Soil temperature top 100 cm"
- alternative_names:
- - "st100"
- 228100:
- name: "Evaporation from the top of canopy"
- alternative_names:
- - "evatc"
- 228101:
- name: "Evaporation from bare soil"
- alternative_names:
- - "evabs"
- 228102:
- name: "Evaporation from open water surfaces excluding oceans"
- alternative_names:
- - "evaow"
- 228103:
- name: "Evaporation from vegetation transpiration"
- alternative_names:
- - "evavt"
- 228104:
- name: "Atmosphere emission mass flux of methane from wetlands"
- alternative_names:
- - "e_wlch4"
- 228105:
- name: "Solar induced chlorophyll fluorescence at 740nm"
- alternative_names:
- - "sif740"
- 228106:
- name: "Solar induced chlorophyll fluorescence at 755nm"
- alternative_names:
- - "sif755"
- 228107:
- name: "Solar induced chlorophyll fluorescence at 771nm"
- alternative_names:
- - "sif771"
- 228108:
- name: "Solar induced chlorophyll fluorescence at 757nm"
- alternative_names:
- - "sif757"
- 228109:
- name: "Accumulated mass emission of methane from wetlands"
- alternative_names:
- - "acc_e_wlch4"
- 228129:
- name: "Surface short-wave (solar) radiation downward clear-sky"
- alternative_names:
- - "ssrdc"
- 228130:
- name: "Surface long-wave (thermal) radiation downward clear-sky"
- alternative_names:
- - "strdc"
- 228131:
- name: "10 metre u-component of neutral wind"
- alternative_names:
- - "u10n"
- 228132:
- name: "10 metre v-component of neutral wind"
- alternative_names:
- - "v10n"
- 228134:
- name: "V-tendency from non-orographic wave drag"
- alternative_names:
- - "vtnowd"
- 228136:
- name: "U-tendency from non-orographic wave drag"
- alternative_names:
- - "utnowd"
- 228139:
- name: "Soil temperature"
- alternative_names:
- - "st"
- 228141:
- name: "Snow depth water equivalent"
- alternative_names:
- - "sd"
- 228143:
- name: "Convective precipitation"
- alternative_names:
- - "cp"
- 228144:
- name: "Snowfall water equivalent"
- alternative_names:
- - "sf"
- 228164:
- name: "Total cloud cover"
- alternative_names:
- - "tcc"
- 228170:
- name: "Field capacity"
- alternative_names:
- - "cap"
- 228171:
- name: "Wilting point"
- alternative_names:
- - "wilt"
- 228205:
- name: "Water runoff and drainage"
- alternative_names:
- - "ro"
- 228216:
- name: "Accumulated freezing rain"
- alternative_names:
- - "fzra"
- 228217:
- name: "Instantaneous large-scale surface precipitation fraction"
- alternative_names:
- - "ilspf"
- 228218:
- name: "Convective rain rate"
- alternative_names:
- - "crr"
- 228219:
- name: "Large scale rain rate"
- alternative_names:
- - "lsrr"
- 228220:
- name: "Convective snowfall rate water equivalent"
- alternative_names:
- - "csfr"
- 228221:
- name: "Large scale snowfall rate water equivalent"
- alternative_names:
- - "lssfr"
- 228222:
- name: "Maximum total precipitation rate in the last 3 hours"
- alternative_names:
- - "mxtpr3"
- 228223:
- name: "Minimum total precipitation rate in the last 3 hours"
- alternative_names:
- - "mntpr3"
- 228224:
- name: "Maximum total precipitation rate in the last 6 hours"
- alternative_names:
- - "mxtpr6"
- 228225:
- name: "Minimum total precipitation rate in the last 6 hours"
- alternative_names:
- - "mntpr6"
- 228226:
- name: "Maximum total precipitation rate since previous post-processing"
- alternative_names:
- - "mxtpr"
- 228227:
- name: "Minimum total precipitation rate since previous post-processing"
- alternative_names:
- - "mntpr"
- 228228:
- name: "Total precipitation"
- alternative_names:
- - "tp"
- 228229:
- name: "Smos first brightness temperature bias correction parameter"
- alternative_names:
- - "smos_tb_cdfa"
- 228230:
- name: "Smos second brightness temperature bias correction parameter"
- alternative_names:
- - "smos_tb_cdfb"
- 228231:
- name: "Mixed-layer cape in the lowest 50 hpa"
- alternative_names:
- - "mlcape50"
- 228232:
- name: "Mixed-layer cin in the lowest 50 hpa"
- alternative_names:
- - "mlcin50"
- 228233:
- name: "Mixed-layer cape in the lowest 100 hpa"
- alternative_names:
- - "mlcape100"
- 228234:
- name: "Mixed-layer cin in the lowest 100 hpa"
- alternative_names:
- - "mlcin100"
- 228235:
- name: "Most-unstable cape"
- alternative_names:
- - "mucape"
- 228236:
- name: "Most-unstable cin"
- alternative_names:
- - "mucin"
- 228237:
- name: "Departure level of the most unstable parcel expressed as pressure"
- alternative_names:
- - "mudlp"
- 228239:
- name: "200 metre u wind component"
- alternative_names:
- - "200u"
- 228240:
- name: "200 metre v wind component"
- alternative_names:
- - "200v"
- 228241:
- name: "200 metre wind speed"
- alternative_names:
- - "200si"
- 228242:
- name: "Surface solar radiation diffuse total sky"
- alternative_names:
- - "fdif"
- 228243:
- name: "Surface solar radiation diffuse clear-sky"
- alternative_names:
- - "cdif"
- 228244:
- name: "Surface albedo of direct radiation"
- alternative_names:
- - "aldr"
- 228245:
- name: "Surface albedo of diffuse radiation"
- alternative_names:
- - "aldf"
- 228246:
- name: "100 metre u wind component"
- alternative_names:
- - "100u"
- 228247:
- name: "100 metre v wind component"
- alternative_names:
- - "100v"
- 228248:
- name: "Surface short wave-effective total cloudiness"
- alternative_names:
- - "tccsw"
- 228249:
- name: "100 metre wind speed"
- alternative_names:
- - "100si"
- 228250:
- name: "Irrigation fraction"
- alternative_names:
- - "irrfr"
- 228251:
- name: "Potential evaporation"
- alternative_names:
- - "pev"
- 228252:
- name: "Irrigation"
- alternative_names:
- - "irr"
- 228253:
- name: "Ascat first soil moisture cdf matching parameter"
- alternative_names:
- - "ascat_sm_cdfa"
- 228254:
- name: "Ascat second soil moisture cdf matching parameter"
- alternative_names:
- - "ascat_sm_cdfb"
- 228255:
- name: "Surface long wave-effective total cloudiness"
- alternative_names:
- - "tcclw"
- 229001:
- name: "Urban cover"
- alternative_names:
- - "cur"
- 229002:
- name: "Road cover"
- alternative_names:
- - "cro"
- 229003:
- name: "Building cover"
- alternative_names:
- - "cbu"
- 229004:
- name: "Building height"
- alternative_names:
- - "bldh"
- 229005:
- name: "Vertical-to-horizontal area ratio"
- alternative_names:
- - "hwr"
- 229006:
- name: "Standard deviation of building height"
- alternative_names:
- - "bhstd"
- 229007:
- name: "Wetland cover"
- alternative_names:
- - "cwe"
- 229008:
- name: "Wetland type"
- alternative_names:
- - "twe"
- 229009:
- name: "Irrigation cover"
- alternative_names:
- - "cirr"
- 229010:
- name: "C4 crop cover"
- alternative_names:
- - "c4cr"
- 229011:
- name: "C4 grass cover"
- alternative_names:
- - "c4gr"
- 230008:
- name: "Surface runoff (variable resolution)"
- alternative_names:
- - "srovar"
- 230009:
- name: "Sub-surface runoff (variable resolution)"
- alternative_names:
- - "ssrovar"
- 230020:
- name: "Clear sky surface photosynthetically active radiation (variable resolution)"
- alternative_names:
- - "parcsvar"
- 230021:
- name: "Total sky direct solar radiation at surface (variable resolution)"
- alternative_names:
- - "fdirvar"
- 230022:
- name: "Clear-sky direct solar radiation at surface (variable resolution)"
- alternative_names:
- - "cdirvar"
- 230044:
- name: "Snow evaporation (variable resolution)"
- alternative_names:
- - "esvar"
- 230045:
- name: "Snowmelt (variable resolution)"
- alternative_names:
- - "smltvar"
- 230046:
- name: "Solar duration (variable resolution)"
- alternative_names:
- - "sdurvar"
- 230047:
- name: "Direct solar radiation (variable resolution)"
- alternative_names:
- - "dsrpvar"
- 230050:
- name: "Large-scale precipitation fraction (variable resolution)"
- alternative_names:
- - "lspfvar"
- 230057:
- name: "Downward uv radiation at the surface (variable resolution)"
- alternative_names:
- - "uvbvar"
- 230058:
- name: "Photosynthetically active radiation at the surface (variable resolution)"
- alternative_names:
- - "parvar"
- 230080:
- name: "Accumulated carbon dioxide net ecosystem exchange (variable resolution)"
- alternative_names:
- - "aco2neevar"
- 230081:
- name: "Accumulated carbon dioxide gross primary production (variable resolution)"
- alternative_names:
- - "aco2gppvar"
- 230082:
- name: "Accumulated carbon dioxide ecosystem respiration (variable resolution)"
- alternative_names:
- - "aco2recvar"
- 230129:
- name: "Surface solar radiation downward clear-sky (variable resolution)"
- alternative_names:
- - "ssrdcvar"
- 230130:
- name: "Surface thermal radiation downward clear-sky (variable resolution)"
- alternative_names:
- - "strdcvar"
- 230142:
- name: "Stratiform precipitation (large-scale precipitation) (variable resolution)"
- alternative_names:
- - "lspvar"
- 230143:
- name: "Convective precipitation (variable resolution)"
- alternative_names:
- - "cpvar"
- 230144:
- name: "Snowfall (convective + stratiform) (variable resolution)"
- alternative_names:
- - "sfvar"
- 230145:
- name: "Boundary layer dissipation (variable resolution)"
- alternative_names:
- - "bldvar"
- 230146:
- name: "Surface sensible heat flux (variable resolution)"
- alternative_names:
- - "sshfvar"
- 230147:
- name: "Surface latent heat flux (variable resolution)"
- alternative_names:
- - "slhfvar"
- 230169:
- name: "Surface solar radiation downwards (variable resolution)"
- alternative_names:
- - "ssrdvar"
- 230174:
- name: "Albedo (variable resolution)"
- alternative_names:
- - "alvar"
- 230175:
- name: "Surface thermal radiation downwards (variable resolution)"
- alternative_names:
- - "strdvar"
- 230176:
- name: "Surface net solar radiation (variable resolution)"
- alternative_names:
- - "ssrvar"
- 230177:
- name: "Surface net thermal radiation (variable resolution)"
- alternative_names:
- - "strvar"
- 230178:
- name: "Top net solar radiation (variable resolution)"
- alternative_names:
- - "tsrvar"
- 230179:
- name: "Top net thermal radiation (variable resolution)"
- alternative_names:
- - "ttrvar"
- 230180:
- name: "East-west surface stress (variable resolution)"
- alternative_names:
- - "ewssvar"
- 230181:
- name: "North-south surface stress (variable resolution)"
- alternative_names:
- - "nsssvar"
- 230182:
- name: "Evaporation (variable resolution)"
- alternative_names:
- - "evar"
- 230189:
- name: "Sunshine duration (variable resolution)"
- alternative_names:
- - "sundvar"
- 230195:
- name: "Longitudinal component of gravity wave stress (variable resolution)"
- alternative_names:
- - "lgwsvar"
- 230196:
- name: "Meridional component of gravity wave stress (variable resolution)"
- alternative_names:
- - "mgwsvar"
- 230197:
- name: "Gravity wave dissipation (variable resolution)"
- alternative_names:
- - "gwdvar"
- 230198:
- name: "Skin reservoir content (variable resolution)"
- alternative_names:
- - "srcvar"
- 230205:
- name: "Runoff (variable resolution)"
- alternative_names:
- - "rovar"
- 230208:
- name: "Top net solar radiation, clear sky (variable resolution)"
- alternative_names:
- - "tsrcvar"
- 230209:
- name: "Top net thermal radiation, clear sky (variable resolution)"
- alternative_names:
- - "ttrcvar"
- 230210:
- name: "Surface net solar radiation, clear sky (variable resolution)"
- alternative_names:
- - "ssrcvar"
- 230211:
- name: "Surface net thermal radiation, clear sky (variable resolution)"
- alternative_names:
- - "strcvar"
- 230212:
- name: "Toa incident solar radiation (variable resolution)"
- alternative_names:
- - "tisrvar"
- 230213:
- name: "Vertically integrated moisture divergence (variable resolution)"
- alternative_names:
- - "vimdvar"
- 230216:
- name: "Accumulated freezing rain (variable resolution)"
- alternative_names:
- - "fzravar"
- 230228:
- name: "Total precipitation (variable resolution)"
- alternative_names:
- - "tpvar"
- 230239:
- name: "Convective snowfall (variable resolution)"
- alternative_names:
- - "csfvar"
- 230240:
- name: "Large-scale snowfall (variable resolution)"
- alternative_names:
- - "lsfvar"
- 230251:
- name: "Potential evaporation (variable resolution)"
- alternative_names:
- - "pevvar"
- 231001:
- name: "Accumulated freezing rain water equivalent"
- alternative_names:
- - "fzrawe"
- 231002:
- name: "Runoff water equivalent (surface plus subsurface)"
- alternative_names:
- - "rowe"
- 231003:
- name: "Snow evaporation water equivalent"
- alternative_names:
- - "eswe"
- 231004:
- name: "Potential evaporation rate"
- alternative_names:
- - "pevr"
- 231005:
- name: "Potential evaporation"
- alternative_names:
- - "peva"
- 231006:
- name: "Tile fraction"
- alternative_names:
- - "tifr"
- 231007:
- name: "Tile percentage"
- alternative_names:
- - "tipe"
- 231008:
- name: "Forecast logarithm of surface roughness length for moisture"
- alternative_names:
- - "flsrm"
- 231009:
- name: "Surface runoff rate"
- alternative_names:
- - "surfror"
- 231010:
- name: "Surface runoff"
- alternative_names:
- - "surfro"
- 231011:
- name: "Sub-surface runoff rate"
- alternative_names:
- - "ssurfror"
- 231012:
- name: "Sub-surface runoff"
- alternative_names:
- - "ssurfro"
- 231013:
- name: "Reflectance in 0.4 micron channel"
- alternative_names:
- - "rfl04"
- 231014:
- name: "Vertical divergence"
- alternative_names:
- - "vdiv"
- 231015:
- name: "Drag thermal coefficient"
- alternative_names:
- - "dtc"
- 231016:
- name: "Drag evaporation coefficient"
- alternative_names:
- - "dec"
- 231017:
- name: "Pressure departure from hydrostatic state"
- alternative_names:
- - "pdhs"
- 231018:
- name: "Surface net radiation flux (sw and lw)"
- alternative_names:
- - "snrf"
- 231019:
- name: "Top net radiation flux (sw and lw)"
- alternative_names:
- - "tnrf"
- 231020:
- name: "Time-mean top net radiation flux (sw and lw)"
- alternative_names:
- - "mtnrf"
- 231021:
- name: "Global irradiance on tilted surfaces"
- alternative_names:
- - "gits"
- 231022:
- name: "Eady growth rate"
- alternative_names:
- - "eagr"
- 231023:
- name: "Tropical cyclones track density"
- alternative_names:
- - "tdtc"
- 231024:
- name: "Canopy air temperature"
- alternative_names:
- - "cant"
- 231025:
- name: "Soil wetness index (total layer)"
- alternative_names:
- - "swit"
- 231026:
- name: "Soil wetness index (root zone)"
- alternative_names:
- - "swir"
- 231027:
- name: "Soil wetness index (layer)"
- alternative_names:
- - "swil"
- 231028:
- name: "Distance downward from roof surface"
- alternative_names:
- - "ddrf"
- 231029:
- name: "Distance inward from outer wall surface"
- alternative_names:
- - "diws"
- 231030:
- name: "Distance downward from road surface"
- alternative_names:
- - "ddrd"
- 231031:
- name: "Renewable power capacity"
- alternative_names:
- - "rpc"
- 231032:
- name: "Renewable power production rate"
- alternative_names:
- - "rppr"
- 231033:
- name: "Renewable power production"
- alternative_names:
- - "rpp"
- 231034:
- name: "Wind power capacity"
- alternative_names:
- - "wpc"
- 231035:
- name: "Wind power production rate"
- alternative_names:
- - "wppr"
- 231036:
- name: "Wind power production"
- alternative_names:
- - "wpp"
- 231037:
- name: "Solar photovoltaic (pv) power capacity"
- alternative_names:
- - "pvpc"
- 231038:
- name: "Solar photovoltaic (pv) power production rate"
- alternative_names:
- - "pvppr"
- 231039:
- name: "Solar photovoltaic (pv) power production"
- alternative_names:
- - "pvpp"
- 231040:
- name: "Graupel (snow pellets) precipitation"
- alternative_names:
- - "tgrp"
- 231041:
- name: "Time-integrated total lightning flash density"
- alternative_names:
- - "litotint"
- 231042:
- name: "Maximum total column integrated graupel (snow pellets)"
- alternative_names:
- - "maxtcg"
- 231043:
- name: "Minimum visibility"
- alternative_names:
- - "minvis"
- 231044:
- name: "Geometric height of theta level above ground"
- alternative_names:
- - "hthg"
- 231045:
- name: "Pressure at cloud base"
- alternative_names:
- - "pcdb"
- 231046:
- name: "Geometric height of adiabatic condensation level above ground"
- alternative_names:
- - "hacg"
- 231047:
- name: "Geometric height of free convection level above ground"
- alternative_names:
- - "hfcg"
- 231048:
- name: "Geometric height of neutral buoyancy level above ground"
- alternative_names:
- - "hnbg"
- 231049:
- name: "Geometric height of atmospheric isothermal level above ground"
- alternative_names:
- - "haig"
- 231050:
- name: "Roof temperature"
- alternative_names:
- - "rft"
- 231051:
- name: "Wall temperature"
- alternative_names:
- - "wlt"
- 231052:
- name: "Road temperature"
- alternative_names:
- - "rdt"
- 231053:
- name: "Snow depth water equivalent on roof"
- alternative_names:
- - "sdrf"
- 231054:
- name: "Snow depth water equivalent on road"
- alternative_names:
- - "sdrd"
- 231055:
- name: "Urban canyon temperature"
- alternative_names:
- - "uct"
- 231056:
- name: "Urban canyon specific humidity"
- alternative_names:
- - "ucq"
- 231057:
- name: "Convective snowfall water equivalent"
- alternative_names:
- - "csfwe"
- 231058:
- name: "Large-scale snowfall water equivalent"
- alternative_names:
- - "lsfwe"
- 231059:
- name: "Lake surface temperature"
- alternative_names:
- - "lslt"
- 231060:
- name: "Surface bulk richardson number"
- alternative_names:
- - "sbrn"
- 231061:
- name: "Time-maximum 2 metre relative humidity"
- alternative_names:
- - "mx2r"
- 231062:
- name: "Time-minimum 2 metre relative humidity"
- alternative_names:
- - "mn2r"
- 231063:
- name: "Surface roughness for heat"
- alternative_names:
- - "srhe"
- 231064:
- name: "Surface roughness for moisture"
- alternative_names:
- - "srmo"
- 232000:
- name: "Burned area"
- alternative_names:
- - "fba"
- 232001:
- name: "Burning area"
- alternative_names:
- - "bia"
- 232002:
- name: "Burnable area"
- alternative_names:
- - "baa"
- 232003:
- name: "Un-burnable area"
- alternative_names:
- - "ubaa"
- 232004:
- name: "Fuel load"
- alternative_names:
- - "fuell"
- 232005:
- name: "Combustion completeness"
- alternative_names:
- - "combc"
- 232006:
- name: "Fuel moisture content"
- alternative_names:
- - "fuelmc"
- 232007:
- name: "Live leaf fuel load"
- alternative_names:
- - "llfl"
- 232008:
- name: "Live wood fuel load"
- alternative_names:
- - "lwfl"
- 232009:
- name: "Dead leaf fuel load"
- alternative_names:
- - "dlfl"
- 232010:
- name: "Dead wood fuel load"
- alternative_names:
- - "dwfl"
- 232011:
- name: "Live fuel moisture content"
- alternative_names:
- - "lfmc"
- 232012:
- name: "Fine dead leaf moisture content"
- alternative_names:
- - "fdlmc"
- 232013:
- name: "Dense dead leaf moisture content"
- alternative_names:
- - "ddlmc"
- 232014:
- name: "Fine dead wood moisture content"
- alternative_names:
- - "fdwmc"
- 232015:
- name: "Dense dead wood moisture content"
- alternative_names:
- - "ddwmc"
- 233000:
- name: "Time-integrated total column vertically-integrated eastward geopotential
- flux"
- alternative_names:
- - "tvige"
- 233001:
- name: "Time-integrated total column vertically-integrated northward geopotential
- flux"
- alternative_names:
- - "tvign"
- 233002:
- name: "Time-integrated total column vertically-integrated divergence of water
- geopotential flux"
- alternative_names:
- - "tviwgd"
- 233003:
- name: "Time-integrated total column vertically-integrated divergence of geopotential
- flux"
- alternative_names:
- - "tvigd"
- 233004:
- name: "Time-integrated total column vertically-integrated eastward enthalpy flux"
- alternative_names:
- - "tviee"
- 233005:
- name: "Time-integrated total column vertically-integrated northward enthalpy flux"
- alternative_names:
- - "tvien"
- 233006:
- name: "Time-integrated total column vertically-integrated eastward kinetic energy
- flux"
- alternative_names:
- - "tvikee"
- 233007:
- name: "Time-integrated total column vertically-integrated northward kinetic energy
- flux"
- alternative_names:
- - "tviken"
- 233008:
- name: "Time-integrated total column vertically-integrated eastward total energy
- flux"
- alternative_names:
- - "tvitee"
- 233009:
- name: "Time-integrated total column vertically-integrated northward total energy
- flux"
- alternative_names:
- - "tviten"
- 233010:
- name: "Time-integrated total column vertically-integrated divergence of enthalpy
- flux"
- alternative_names:
- - "tvied"
- 233011:
- name: "Time-integrated total column vertically-integrated divergence of kinetic
- energy flux"
- alternative_names:
- - "tviked"
- 233012:
- name: "Time-integrated total column vertically-integrated divergence of total
- energy flux"
- alternative_names:
- - "tvited"
- 233013:
- name: "Time-integrated total column vertically-integrated divergence of water
- enthalpy flux"
- alternative_names:
- - "tviwed"
- 233014:
- name: "Time integrated, vertically integrated divergence of mass flux"
- alternative_names:
- - "tvimd"
- 233015:
- name: "Time integrated, vertically integrated eastward mass flux"
- alternative_names:
- - "tvime"
- 233016:
- name: "Time integrated, vertically integrated northward mass flux"
- alternative_names:
- - "tvimn"
- 233017:
- name: "Time integrated, vertically integrated divergence of water vapour flux"
- alternative_names:
- - "tviwvd"
- 233018:
- name: "Time integrated, vertically integrated divergence of cloud liquid water
- flux"
- alternative_names:
- - "tviclwd"
- 233019:
- name: "Time integrated, vertically integrated divergence of cloud ice water flux"
- alternative_names:
- - "tviciwd"
- 233020:
- name: "Time integrated, vertically integrated divergence of rain flux"
- alternative_names:
- - "tvird"
- 233021:
- name: "Time integrated, vertically integrated divergence of snow flux"
- alternative_names:
- - "tvisd"
- 233022:
- name: "Time integrated, vertically integrated eastward water vapour flux"
- alternative_names:
- - "tviwve"
- 233023:
- name: "Time integrated, vertically integrated northward water vapour flux"
- alternative_names:
- - "tviwvn"
- 233024:
- name: "Time integrated, vertically integrated eastward cloud liquid water flux"
- alternative_names:
- - "tviclwe"
- 233025:
- name: "Time integrated, vertically integrated northward cloud liquid water flux"
- alternative_names:
- - "tviclwn"
- 233026:
- name: "Time integrated, vertically integrated eastward cloud ice water flux"
- alternative_names:
- - "tviciwe"
- 233027:
- name: "Time integrated, vertically integrated northward cloud ice water flux"
- alternative_names:
- - "tviciwn"
- 233028:
- name: "Time integrated, vertically integrated eastward rain flux"
- alternative_names:
- - "tvire"
- 233029:
- name: "Time integrated, vertically integrated northward rain flux"
- alternative_names:
- - "tvirn"
- 233030:
- name: "Time integrated, vertically integrated eastward snow flux"
- alternative_names:
- - "tvise"
- 233031:
- name: "Time integrated, vertically integrated northward snow flux"
- alternative_names:
- - "tvisn"
- 233032:
- name: "Time integrated, vertically integrated eastward ozone flux"
- alternative_names:
- - "tvioze"
- 233033:
- name: "Time integrated, vertically integrated northward ozone flux"
- alternative_names:
- - "tviozn"
- 233034:
- name: "Time integrated, vertically integrated divergence of ozone flux"
- alternative_names:
- - "tviozd"
- 233035:
- name: "Time integrated, vertically integrated net source of ozone"
- alternative_names:
- - "tvions"
- 234139:
- name: "Surface temperature significance"
- alternative_names:
- - "sts"
- 234151:
- name: "Mean sea level pressure significance"
- alternative_names:
- - "msls"
- 234167:
- name: "2 metre temperature significance"
- alternative_names:
- - "2ts"
- 234228:
- name: "Total precipitation significance"
- alternative_names:
- - "tps"
- 235001:
- name: "Mean temperature tendency due to short-wave radiation"
- alternative_names:
- - "mttswr"
- 235002:
- name: "Mean temperature tendency due to long-wave radiation"
- alternative_names:
- - "mttlwr"
- 235003:
- name: "Mean temperature tendency due to short-wave radiation, clear sky"
- alternative_names:
- - "mttswrcs"
- 235004:
- name: "Mean temperature tendency due to long-wave radiation, clear sky"
- alternative_names:
- - "mttlwrcs"
- 235005:
- name: "Mean temperature tendency due to parametrisations"
- alternative_names:
- - "mttpm"
- 235006:
- name: "Mean specific humidity tendency due to parametrisations"
- alternative_names:
- - "mqtpm"
- 235007:
- name: "Mean eastward wind tendency due to parametrisations"
- alternative_names:
- - "mutpm"
- 235008:
- name: "Mean northward wind tendency due to parametrisations"
- alternative_names:
- - "mvtpm"
- 235009:
- name: "Mean updraught mass flux"
- alternative_names:
- - "mumf"
- 235010:
- name: "Mean downdraught mass flux"
- alternative_names:
- - "mdmf"
- 235011:
- name: "Mean updraught detrainment rate"
- alternative_names:
- - "mudr"
- 235012:
- name: "Mean downdraught detrainment rate"
- alternative_names:
- - "mddr"
- 235013:
- name: "Mean total precipitation flux"
- alternative_names:
- - "mtpf"
- 235014:
- name: "Mean turbulent diffusion coefficient for heat"
- alternative_names:
- - "mtdch"
- 235015:
- name: "Time integral of rain flux"
- alternative_names:
- - "tirf"
- 235017:
- name: "Time integral of surface eastward momentum flux"
- alternative_names:
- - "tisemf"
- 235018:
- name: "Time integral of surface northward momentum flux"
- alternative_names:
- - "tisnmf"
- 235019:
- name: "Time integral of surface latent heat evaporation flux"
- alternative_names:
- - "tislhef"
- 235020:
- name: "Mean surface runoff rate"
- alternative_names:
- - "msror"
- 235021:
- name: "Mean sub-surface runoff rate"
- alternative_names:
- - "mssror"
- 235022:
- name: "Mean surface photosynthetically active radiation flux, clear sky"
- alternative_names:
- - "msparfcs"
- 235023:
- name: "Mean snow evaporation rate"
- alternative_names:
- - "mser"
- 235024:
- name: "Mean snowmelt rate"
- alternative_names:
- - "msmr"
- 235025:
- name: "Mean magnitude of turbulent surface stress"
- alternative_names:
- - "mmtss"
- 235026:
- name: "Mean large-scale precipitation fraction"
- alternative_names:
- - "mlspf"
- 235027:
- name: "Mean surface downward uv radiation flux"
- alternative_names:
- - "msdwuvrf"
- 235028:
- name: "Mean surface photosynthetically active radiation flux"
- alternative_names:
- - "msparf"
- 235029:
- name: "Mean large-scale precipitation rate"
- alternative_names:
- - "mlspr"
- 235030:
- name: "Mean convective precipitation rate"
- alternative_names:
- - "mcpr"
- 235031:
- name: "Mean snowfall rate"
- alternative_names:
- - "msr"
- 235032:
- name: "Mean boundary layer dissipation"
- alternative_names:
- - "mbld"
- 235033:
- name: "Mean surface sensible heat flux"
- alternative_names:
- - "msshf"
- 235034:
- name: "Mean surface latent heat flux"
- alternative_names:
- - "mslhf"
- 235035:
- name: "Mean surface downward short-wave radiation flux"
- alternative_names:
- - "msdwswrf"
- 235036:
- name: "Mean surface downward long-wave radiation flux"
- alternative_names:
- - "msdwlwrf"
- 235037:
- name: "Mean surface net short-wave radiation flux"
- alternative_names:
- - "msnswrf"
- 235038:
- name: "Mean surface net long-wave radiation flux"
- alternative_names:
- - "msnlwrf"
- 235039:
- name: "Mean top net short-wave radiation flux"
- alternative_names:
- - "mtnswrf"
- 235040:
- name: "Mean top net long-wave radiation flux"
- alternative_names:
- - "mtnlwrf"
- 235041:
- name: "Mean eastward turbulent surface stress"
- alternative_names:
- - "metss"
- 235042:
- name: "Mean northward turbulent surface stress"
- alternative_names:
- - "mntss"
- 235043:
- name: "Mean evaporation rate"
- alternative_names:
- - "mer"
- 235044:
- name: "Sunshine duration fraction"
- alternative_names:
- - "sdf"
- 235045:
- name: "Mean eastward gravity wave surface stress"
- alternative_names:
- - "megwss"
- 235046:
- name: "Mean northward gravity wave surface stress"
- alternative_names:
- - "mngwss"
- 235047:
- name: "Mean gravity wave dissipation"
- alternative_names:
- - "mgwd"
- 235048:
- name: "Mean runoff rate"
- alternative_names:
- - "mror"
- 235049:
- name: "Mean top net short-wave radiation flux, clear sky"
- alternative_names:
- - "mtnswrfcs"
- 235050:
- name: "Mean top net long-wave radiation flux, clear sky"
- alternative_names:
- - "mtnlwrfcs"
- 235051:
- name: "Mean surface net short-wave radiation flux, clear sky"
- alternative_names:
- - "msnswrfcs"
- 235052:
- name: "Mean surface net long-wave radiation flux, clear sky"
- alternative_names:
- - "msnlwrfcs"
- 235053:
- name: "Mean top downward short-wave radiation flux"
- alternative_names:
- - "mtdwswrf"
- 235054:
- name: "Mean vertically integrated moisture divergence"
- alternative_names:
- - "mvimd"
- 235055:
- name: "Mean total precipitation rate"
- alternative_names:
- - "mtpr"
- 235056:
- name: "Mean convective snowfall rate"
- alternative_names:
- - "mcsr"
- 235057:
- name: "Mean large-scale snowfall rate"
- alternative_names:
- - "mlssr"
- 235058:
- name: "Mean surface direct short-wave radiation flux"
- alternative_names:
- - "msdrswrf"
- 235059:
- name: "Mean surface direct short-wave radiation flux, clear sky"
- alternative_names:
- - "msdrswrfcs"
- 235060:
- name: "Mean surface diffuse short-wave radiation flux"
- alternative_names:
- - "msdfswrf"
- 235061:
- name: "Mean surface diffuse short-wave radiation flux, clear sky"
- alternative_names:
- - "msdfswrfcs"
- 235062:
- name: "Mean carbon dioxide net ecosystem exchange flux"
- alternative_names:
- - "mcdneef"
- 235063:
- name: "Mean carbon dioxide gross primary production flux"
- alternative_names:
- - "mcdgppf"
- 235064:
- name: "Mean carbon dioxide ecosystem respiration flux"
- alternative_names:
- - "mcderf"
- 235065:
- name: "Mean rain rate"
- alternative_names:
- - "mrr"
- 235066:
- name: "Mean convective rain rate"
- alternative_names:
- - "mcrr"
- 235067:
- name: "Mean large-scale rain rate"
- alternative_names:
- - "mlsrr"
- 235068:
- name: "Mean surface downward short-wave radiation flux, clear sky"
- alternative_names:
- - "msdwswrfcs"
- 235069:
- name: "Mean surface downward long-wave radiation flux, clear sky"
- alternative_names:
- - "msdwlwrfcs"
- 235070:
- name: "Mean potential evaporation rate"
- alternative_names:
- - "mper"
- 235071:
- name: "Time integral of surface latent heat sublimation flux"
- alternative_names:
- - "tislhsf"
- 235072:
- name: "Time integral of snow evaporation flux"
- alternative_names:
- - "tisef"
- 235073:
- name: "Time integral of evapotranspiration flux"
- alternative_names:
- - "tietrf"
- 235074:
- name: "Time-mean evapotranspiration flux"
- alternative_names:
- - "metrf"
- 235075:
- name: "Time integral of potential evapotranspiration rate"
- alternative_names:
- - "tipet"
- 235076:
- name: "Time-mean potential evapotranspiration rate"
- alternative_names:
- - "mpet"
- 235077:
- name: "Time-mean volumetric soil moisture"
- alternative_names:
- - "mvsw"
- 235078:
- name: "Time-mean snow depth water equivalent"
- alternative_names:
- - "msd"
- 235079:
- name: "Time-mean skin temperature"
- alternative_names:
- - "mskt"
- 235080:
- name: "Time-mean snow density"
- alternative_names:
- - "avg_rsn"
- 235081:
- name: "Time-mean low vegetation cover"
- alternative_names:
- - "avg_cvl"
- 235082:
- name: "Time-mean high vegetation cover"
- alternative_names:
- - "avg_cvh"
- 235083:
- name: "Time-mean sea ice area fraction"
- alternative_names:
- - "avg_ci"
- 235084:
- name: "Time-mean sea surface temperature"
- alternative_names:
- - "avg_sst"
- 235085:
- name: "Time-mean leaf area index, low vegetation"
- alternative_names:
- - "avg_lai_lv"
- 235086:
- name: "Time-mean leaf area index, high vegetation"
- alternative_names:
- - "avg_lai_hv"
- 235087:
- name: "Time-mean total column liquid water"
- alternative_names:
- - "avg_tclw"
- 235088:
- name: "Time-mean total column cloud ice water"
- alternative_names:
- - "avg_tciw"
- 235089:
- name: "Time-mean 2 metre specific humidity"
- alternative_names:
- - "avg_2sh"
- 235090:
- name: "Time-mean lake mix-layer temperature"
- alternative_names:
- - "avg_lmlt"
- 235091:
- name: "Time-mean lake mix-layer depth"
- alternative_names:
- - "avg_lmld"
- 235092:
- name: "Time-mean 2 metre relative humidity"
- alternative_names:
- - "avg_2r"
- 235093:
- name: "Time-mean fraction of snow cover"
- alternative_names:
- - "avg_fscov"
- 235094:
- name: "Time-mean soil temperature"
- alternative_names:
- - "avg_sot"
- 235095:
- name: "Time-mean snow depth"
- alternative_names:
- - "avg_sde"
- 235096:
- name: "Time-mean snow cover"
- alternative_names:
- - "avg_snowc"
- 235097:
- name: "Time-mean wind speed"
- alternative_names:
- - "avg_ws"
- 235098:
- name: "Time-mean pressure"
- alternative_names:
- - "avg_pres"
- 235100:
- name: "Time-mean potential vorticity"
- alternative_names:
- - "avg_pv"
- 235101:
- name: "Time-mean specific rain water content"
- alternative_names:
- - "avg_crwc"
- 235102:
- name: "Time-mean specific snow water content"
- alternative_names:
- - "avg_cswc"
- 235103:
- name: "Time-mean eta-coordinate vertical velocity"
- alternative_names:
- - "avg_etadot"
- 235117:
- name: "Time-mean most-unstable cape"
- alternative_names:
- - "avg_mucape"
- 235129:
- name: "Time-mean geopotential"
- alternative_names:
- - "avg_z"
- 235130:
- name: "Time-mean temperature"
- alternative_names:
- - "avg_t"
- 235131:
- name: "Time-mean u component of wind"
- alternative_names:
- - "avg_u"
- 235132:
- name: "Time-mean v component of wind"
- alternative_names:
- - "avg_v"
- 235133:
- name: "Time-mean specific humidity"
- alternative_names:
- - "avg_q"
- 235134:
- name: "Time-mean surface pressure"
- alternative_names:
- - "avg_sp"
- 235135:
- name: "Time-mean vertical velocity"
- alternative_names:
- - "avg_w"
- 235136:
- name: "Time-mean total column water"
- alternative_names:
- - "avg_tcw"
- 235137:
- name: "Time-mean total column vertically-integrated water vapour"
- alternative_names:
- - "avg_tcwv"
- 235138:
- name: "Time-mean vorticity (relative)"
- alternative_names:
- - "avg_vo"
- 235141:
- name: "Time-mean snow depth"
- alternative_names:
- - "avg_sd_m"
- 235151:
- name: "Time-mean mean sea level pressure"
- alternative_names:
- - "avg_msl"
- 235152:
- name: "Time-mean logarithm of surface pressure"
- alternative_names:
- - "avg_lnsp"
- 235155:
- name: "Time-mean divergence"
- alternative_names:
- - "avg_d"
- 235157:
- name: "Time-mean relative humidity"
- alternative_names:
- - "avg_r"
- 235159:
- name: "Time-mean boundary layer height"
- alternative_names:
- - "avg_blh"
- 235165:
- name: "Time-mean 10 metre u wind component"
- alternative_names:
- - "avg_10u"
- 235166:
- name: "Time-mean 10 metre v wind component"
- alternative_names:
- - "avg_10v"
- 235168:
- name: "Time-mean 2 metre dewpoint temperature"
- alternative_names:
- - "avg_2d"
- 235186:
- name: "Time-mean low cloud cover"
- alternative_names:
- - "avg_lcc_frac"
- 235187:
- name: "Time-mean medium cloud cover"
- alternative_names:
- - "avg_mcc_frac"
- 235188:
- name: "Time-mean high cloud cover"
- alternative_names:
- - "avg_hcc_frac"
- 235203:
- name: "Time-mean ozone mass mixing ratio"
- alternative_names:
- - "avg_o3"
- 235238:
- name: "Time-mean temperature of snow layer"
- alternative_names:
- - "avg_tsn"
- 235243:
- name: "Time-mean forecast albedo"
- alternative_names:
- - "avg_fal_frac"
- 235244:
- name: "Time-mean forecast surface roughness"
- alternative_names:
- - "avg_fsr"
- 235245:
- name: "Time-mean forecast logarithm of surface roughness for heat"
- alternative_names:
- - "avg_flsr"
- 235246:
- name: "Time-mean specific cloud liquid water content"
- alternative_names:
- - "avg_clwc"
- 235247:
- name: "Time-mean specific cloud ice water content"
- alternative_names:
- - "avg_ciwc"
- 235248:
- name: "Time-mean fraction of cloud cover"
- alternative_names:
- - "avg_cc"
- 235257:
- name: "Time-mean k index"
- alternative_names:
- - "avg_kx"
- 235258:
- name: "Time-mean total totals index"
- alternative_names:
- - "avg_totalx"
- 235262:
- name: "Time-mean clear air turbulence (cat)"
- alternative_names:
- - "avg_cat"
- 235270:
- name: "Time-mean discharge from rivers or streams"
- alternative_names:
- - "avg_dis"
- 235271:
- name: "Time-mean soil wetness index (total layer)"
- alternative_names:
- - "avg_swit"
- 235272:
- name: "Time-mean soil wetness index (root zone)"
- alternative_names:
- - "avg_swir"
- 235273:
- name: "Time-mean soil wetness index(layer)"
- alternative_names:
- - "avg_swil"
- 235274:
- name: "Time-mean floodplain depth"
- alternative_names:
- - "avg_flddep"
- 235275:
- name: "Time-mean floodplain flooded fraction"
- alternative_names:
- - "avg_fldffr"
- 235276:
- name: "Time-mean floodplain flooded area"
- alternative_names:
- - "avg_fldfar"
- 235277:
- name: "Time-mean river fraction"
- alternative_names:
- - "avg_rivfr"
- 235278:
- name: "Time-mean river area"
- alternative_names:
- - "avg_rivar"
- 235279:
- name: "Time-mean fraction of river coverage plus river related flooding"
- alternative_names:
- - "avg_rivcffr"
- 235280:
- name: "Time-mean area of river coverage plus river related flooding"
- alternative_names:
- - "avg_rivcfar"
- 237077:
- name: "Time-maximum volumetric soil moisture"
- alternative_names:
- - "max_vsw"
- 237117:
- name: "Time-maximum most-unstable cape"
- alternative_names:
- - "max_mucape"
- 238077:
- name: "Time-minimum volumetric soil moisture"
- alternative_names:
- - "min_vsw"
- 238117:
- name: "Time-minimum most-unstable cape"
- alternative_names:
- - "min_mucape"
- 239077:
- name: "Time-standard-deviation volumetric soil moisture"
- alternative_names:
- - "std_vsw"
- 239117:
- name: "Time-standard-deviation most-unstable cape"
- alternative_names:
- - "std_mucape"
- 240011:
- name: "Cross sectional area of flow in channel"
- alternative_names:
- - "chcross"
- 240012:
- name: "Side flow into river channel"
- alternative_names:
- - "chside"
- 240013:
- name: "Discharge from rivers or streams"
- alternative_names:
- - "dis"
- 240014:
- name: "River storage of water"
- alternative_names:
- - "rivsto"
- 240015:
- name: "Floodplain storage of water"
- alternative_names:
- - "fldsto"
- 240016:
- name: "Water fraction"
- alternative_names:
- - "fldfrc"
- 240017:
- name: "Days since last observation"
- alternative_names:
- - "dslr"
- 240018:
- name: "Frost index"
- alternative_names:
- - "frost"
- 240020:
- name: "Depth of water on soil surface"
- alternative_names:
- - "woss"
- 240021:
- name: "Upstream accumulated precipitation"
- alternative_names:
- - "tpups"
- 240022:
- name: "Upstream accumulated snow melt"
- alternative_names:
- - "smups"
- 240023:
- name: "Mean discharge in the last 6 hours"
- alternative_names:
- - "dis06"
- 240024:
- name: "Mean discharge in the last 24 hours"
- alternative_names:
- - "dis24"
- 240026:
- name: "Snow depth at elevation bands"
- alternative_names:
- - "sd_elev"
- 240028:
- name: "Groundwater upper storage"
- alternative_names:
- - "gwus"
- 240029:
- name: "Groundwater lower storage"
- alternative_names:
- - "gwls"
- 240030:
- name: "Lake depth"
- alternative_names:
- - "lakdph"
- 240031:
- name: "River depth"
- alternative_names:
- - "rivdph"
- 240032:
- name: "River outflow of water"
- alternative_names:
- - "rivout"
- 240033:
- name: "Floodplain outflow of water"
- alternative_names:
- - "fldout"
- 240034:
- name: "Floodpath outflow of water"
- alternative_names:
- - "pthflw"
- 240035:
- name: "Floodplain depth"
- alternative_names:
- - "flddep"
- 240036:
- name: "Floodplain flooded fraction"
- alternative_names:
- - "fldffr"
- 240037:
- name: "Floodplain flooded area"
- alternative_names:
- - "fldfar"
- 240038:
- name: "River fraction"
- alternative_names:
- - "rivfr"
- 240039:
- name: "River area"
- alternative_names:
- - "rivar"
- 240040:
- name: "Fraction of river coverage plus river related flooding"
- alternative_names:
- - "rivcffr"
- 240041:
- name: "Area of river coverage plus river related flooding"
- alternative_names:
- - "rivcfar"
- 250001:
- name: "Latitude"
- alternative_names:
- - "lat"
- 250002:
- name: "Longitude"
- alternative_names:
- - "lon"
- 250003:
- name: "Latitude on t grid"
- alternative_names:
- - "tlat"
- 250004:
- name: "Longitude on t grid"
- alternative_names:
- - "tlon"
- 250005:
- name: "Latitude on u grid"
- alternative_names:
- - "ulat"
- 250006:
- name: "Longitude on u grid"
- alternative_names:
- - "ulon"
- 250007:
- name: "Latitude on v grid"
- alternative_names:
- - "vlat"
- 250008:
- name: "Longitude on v grid"
- alternative_names:
- - "vlon"
- 250009:
- name: "Latitude on w grid"
- alternative_names:
- - "wlat"
- 250010:
- name: "Longitude on w grid"
- alternative_names:
- - "wlon"
- 250011:
- name: "Latitude on f grid"
- alternative_names:
- - "flat"
- 250012:
- name: "Longitude on f grid"
- alternative_names:
- - "flon"
- 254001:
- name: "Covariance between 2-metre temperature and volumetric soil water layer
- 1"
- alternative_names:
- - "covar_t2m_swvl1"
- 254002:
- name: "Covariance between 2-metre relative humidity and volumetric soil water
- layer 1"
- alternative_names:
- - "covar_rh2m_swvl1"
- 254003:
- name: "Covariance between surface soil moisture and volumetric soil water layer
- 1"
- alternative_names:
- - "covar_ssm_swvl1"
- 254004:
- name: "Covariance between 2-metre temperature and volumetric soil water layer
- 2"
- alternative_names:
- - "covar_t2m_swvl2"
- 254005:
- name: "Covariance between 2-metre relative humidity and volumetric soil water
- layer 2"
- alternative_names:
- - "covar_rh2m_swvl2"
- 254006:
- name: "Covariance between surface soil moisture and volumetric soil water layer
- 2"
- alternative_names:
- - "covar_ssm_swvl2"
- 254007:
- name: "Covariance between 2-metre temperature and volumetric soil water layer
- 3"
- alternative_names:
- - "covar_t2m_swvl3"
- 254008:
- name: "Covariance between 2-metre relative humidity and volumetric soil water
- layer 3"
- alternative_names:
- - "covar_rh2m_swvl3"
- 254009:
- name: "Covariance between surface soil moisture and volumetric soil water layer
- 3"
- alternative_names:
- - "covar_ssm_swvl3"
- 254010:
- name: "Covariance between 2-metre temperature and soil temperature layer 1"
- alternative_names:
- - "covar_t2m_stl1"
- 254011:
- name: "Covariance between 2-metre relative humidity and soil temperature layer
- 1"
- alternative_names:
- - "covar_rh2m_stl1"
- 254012:
- name: "Covariance between 2-metre temperature and soil temperature layer 2"
- alternative_names:
- - "covar_t2m_stl2"
- 254013:
- name: "Covariance between 2-metre relative humidity and soil temperature layer
- 2"
- alternative_names:
- - "covar_rh2m_stl2"
- 254014:
- name: "Covariance between 2-metre temperature and soil temperature layer 3"
- alternative_names:
- - "covar_t2m_stl3"
- 254015:
- name: "Covariance between 2-metre relative humidity and soil temperature layer
- 3"
- alternative_names:
- - "covar_rh2m_stl3"
- 254016:
- name: "Covariance between 2-metre temperature and temperature of snow layer 1"
- alternative_names:
- - "covar_t2m_tsn1"
- 254017:
- name: "Covariance between 2-metre relative humidity and temperature of snow layer
- 1"
- alternative_names:
- - "covar_rh2m_tsn1"
- 254018:
- name: "Covariance between 2-metre temperature and temperature of snow layer 2"
- alternative_names:
- - "covar_t2m_tsn2"
- 254019:
- name: "Covariance between 2-metre relative humidity and temperature of snow layer
- 2"
- alternative_names:
- - "covar_rh2m_tsn2"
- 254020:
- name: "Covariance between 2-metre temperature and temperature of snow layer 3"
- alternative_names:
- - "covar_t2m_tsn3"
- 254021:
- name: "Covariance between 2-metre relative humidity and temperature of snow layer
- 3"
- alternative_names:
- - "covar_rh2m_tsn3"
- 260001:
- name: "Total column graupel"
- alternative_names:
- - "tcolg"
- 260002:
- name: "Latent heat net flux"
- alternative_names:
- - "lhtfl"
- 260003:
- name: "Sensible heat net flux"
- alternative_names:
- - "shtfl"
- 260004:
- name: "Heat index"
- alternative_names:
- - "heatx"
- 260005:
- name: "Wind chill factor"
- alternative_names:
- - "wcf"
- 260006:
- name: "Minimum dew point depression"
- alternative_names:
- - "mindpd"
- 260007:
- name: "Snow phase change heat flux"
- alternative_names:
- - "snohf"
- 260008:
- name: "Vapor pressure"
- alternative_names:
- - "vapp"
- 260009:
- name: "Large scale precipitation (non-convective)"
- alternative_names:
- - "ncpcp"
- 260010:
- name: "Snowfall rate water equivalent"
- alternative_names:
- - "srweq"
- 260011:
- name: "Convective snow"
- alternative_names:
- - "snoc"
- 260012:
- name: "Large scale snow"
- alternative_names:
- - "snol"
- 260013:
- name: "Snow age"
- alternative_names:
- - "snoag"
- 260014:
- name: "Absolute humidity"
- alternative_names:
- - "absh"
- 260015:
- name: "Precipitation type"
- alternative_names:
- - "ptype"
- 260016:
- name: "Integrated liquid water"
- alternative_names:
- - "iliqw"
- 260017:
- name: "Condensate"
- alternative_names:
- - "tcond"
- 260018:
- name: "Cloud mixing ratio"
- alternative_names:
- - "clwmr"
- 260019:
- name: "Ice water mixing ratio"
- alternative_names:
- - "icmr"
- 260020:
- name: "Rain mixing ratio"
- alternative_names:
- - "rwmr"
- 260021:
- name: "Snow mixing ratio"
- alternative_names:
- - "snmr"
- 260022:
- name: "Horizontal moisture convergence"
- alternative_names:
- - "mconv"
- 260023:
- name: "Maximum relative humidity"
- alternative_names:
- - "maxrh"
- 260024:
- name: "Maximum absolute humidity"
- alternative_names:
- - "maxah"
- 260025:
- name: "Total snowfall"
- alternative_names:
- - "asnow"
- 260026:
- name: "Precipitable water category"
- alternative_names:
- - "pwcat"
- 260027:
- name: "Hail"
- alternative_names:
- - "hail"
- 260028:
- name: "Graupel (snow pellets)"
- alternative_names:
- - "grle"
- 260029:
- name: "Categorical rain"
- alternative_names:
- - "crain"
- 260030:
- name: "Categorical freezing rain"
- alternative_names:
- - "cfrzr"
- 260031:
- name: "Categorical ice pellets"
- alternative_names:
- - "cicep"
- 260032:
- name: "Categorical snow"
- alternative_names:
- - "csnow"
- 260033:
- name: "Convective precipitation rate"
- alternative_names:
- - "cprat"
- 260034:
- name: "Horizontal moisture divergence"
- alternative_names:
- - "mdiv"
- 260035:
- name: "Percent frozen precipitation"
- alternative_names:
- - "cpofp"
- 260036:
- name: "Potential evaporation"
- alternative_names:
- - "pevap"
- 260037:
- name: "Potential evaporation rate"
- alternative_names:
- - "pevpr"
- 260038:
- name: "Snow cover"
- alternative_names:
- - "snowc"
- 260039:
- name: "Rain fraction of total cloud water"
- alternative_names:
- - "frain"
- 260040:
- name: "Rime factor"
- alternative_names:
- - "rime"
- 260041:
- name: "Total column integrated rain"
- alternative_names:
- - "tcolr"
- 260042:
- name: "Total column integrated snow"
- alternative_names:
- - "tcols"
- 260043:
- name: "Large scale water precipitation (non-convective)"
- alternative_names:
- - "lswp"
- 260044:
- name: "Convective water precipitation"
- alternative_names:
- - "cwp"
- 260045:
- name: "Total water precipitation"
- alternative_names:
- - "twatp"
- 260046:
- name: "Total snow precipitation"
- alternative_names:
- - "tsnowp"
- 260047:
- name: "Total column water (vertically integrated total water (vapour + cloud water/ice))"
- alternative_names:
- - "tcwat"
- 260048:
- name: "Total precipitation rate"
- alternative_names:
- - "tprate"
- 260049:
- name: "Total snowfall rate water equivalent"
- alternative_names:
- - "tsrwe"
- 260050:
- name: "Large scale precipitation rate"
- alternative_names:
- - "lsprate"
- 260051:
- name: "Convective snowfall rate water equivalent"
- alternative_names:
- - "csrwe"
- 260052:
- name: "Large scale snowfall rate water equivalent"
- alternative_names:
- - "lssrwe"
- 260053:
- name: "Total snowfall rate"
- alternative_names:
- - "tsrate"
- 260054:
- name: "Convective snowfall rate"
- alternative_names:
- - "csrate"
- 260055:
- name: "Large scale snowfall rate"
- alternative_names:
- - "lssrate"
- 260056:
- name: "Water equivalent of accumulated snow depth (deprecated)"
- alternative_names:
- - "sdwe"
- 260057:
- name: "Total column integrated water vapour"
- alternative_names:
- - "tciwv"
- 260058:
- name: "Rain precipitation rate"
- alternative_names:
- - "rprate"
- 260059:
- name: "Snow precipitation rate"
- alternative_names:
- - "sprate"
- 260060:
- name: "Freezing rain precipitation rate"
- alternative_names:
- - "fprate"
- 260061:
- name: "Ice pellets precipitation rate"
- alternative_names:
- - "iprate"
- 260062:
- name: "Momentum flux, u component"
- alternative_names:
- - "uflx"
- 260063:
- name: "Momentum flux, v component"
- alternative_names:
- - "vflx"
- 260064:
- name: "Maximum wind speed"
- alternative_names:
- - "maxgust"
- 260065:
- name: "Wind speed (gust)"
- alternative_names:
- - "gust"
- 260066:
- name: "U-component of wind (gust)"
- alternative_names:
- - "ugust"
- 260067:
- name: "V-component of wind (gust)"
- alternative_names:
- - "vgust"
- 260068:
- name: "Vertical speed shear"
- alternative_names:
- - "vwsh"
- 260069:
- name: "Horizontal momentum flux"
- alternative_names:
- - "mflx"
- 260070:
- name: "U-component storm motion"
- alternative_names:
- - "ustm"
- 260071:
- name: "V-component storm motion"
- alternative_names:
- - "vstm"
- 260072:
- name: "Drag coefficient"
- alternative_names:
- - "cd"
- 260073:
- name: "Frictional velocity"
- alternative_names:
- - "fricv"
- 260074:
- name: "Pressure reduced to msl"
- alternative_names:
- - "prmsl"
- 260075:
- name: "Geometric height"
- alternative_names:
- - "dist"
- 260076:
- name: "Altimeter setting"
- alternative_names:
- - "alts"
- 260077:
- name: "Thickness"
- alternative_names:
- - "thick"
- 260078:
- name: "Pressure altitude"
- alternative_names:
- - "presalt"
- 260079:
- name: "Density altitude"
- alternative_names:
- - "denalt"
- 260080:
- name: "5-wave geopotential height"
- alternative_names:
- - "5wavh"
- 260081:
- name: "Zonal flux of gravity wave stress"
- alternative_names:
- - "u_gwd"
- 260082:
- name: "Meridional flux of gravity wave stress"
- alternative_names:
- - "v_gwd"
- 260083:
- name: "Planetary boundary layer height"
- alternative_names:
- - "hpbl"
- 260084:
- name: "5-wave geopotential height anomaly"
- alternative_names:
- - "5wava"
- 260085:
- name: "Standard deviation of sub-grid scale orography"
- alternative_names:
- - "sdsgso"
- 260086:
- name: "Net short-wave radiation flux (top of atmosphere)"
- alternative_names:
- - "nswrt"
- 260087:
- name: "Downward short-wave radiation flux"
- alternative_names:
- - "dswrf"
- 260088:
- name: "Upward short-wave radiation flux"
- alternative_names:
- - "uswrf"
- 260089:
- name: "Net short wave radiation flux"
- alternative_names:
- - "nswrf"
- 260090:
- name: "Photosynthetically active radiation"
- alternative_names:
- - "photar"
- 260091:
- name: "Net short-wave radiation flux, clear sky"
- alternative_names:
- - "nswrfcs"
- 260092:
- name: "Downward uv radiation"
- alternative_names:
- - "dwuvr"
- 260093:
- name: "Uv index (under clear sky)"
- alternative_names:
- - "uviucs"
- 260094:
- name: "Uv index"
- alternative_names:
- - "uvi"
- 260095:
- name: "Net long wave radiation flux (surface)"
- alternative_names:
- - "nlwrs"
- 260096:
- name: "Net long wave radiation flux (top of atmosphere)"
- alternative_names:
- - "nlwrt"
- 260097:
- name: "Downward long-wave radiation flux"
- alternative_names:
- - "dlwrf"
- 260098:
- name: "Upward long-wave radiation flux"
- alternative_names:
- - "ulwrf"
- 260099:
- name: "Net long wave radiation flux"
- alternative_names:
- - "nlwrf"
- 260100:
- name: "Net long-wave radiation flux, clear sky"
- alternative_names:
- - "nlwrcs"
- 260101:
- name: "Cloud ice"
- alternative_names:
- - "cice"
- 260102:
- name: "Cloud water"
- alternative_names:
- - "cwat"
- 260103:
- name: "Cloud amount"
- alternative_names:
- - "cdca"
- 260104:
- name: "Cloud type"
- alternative_names:
- - "cdct"
- 260105:
- name: "Thunderstorm maximum tops"
- alternative_names:
- - "tmaxt"
- 260106:
- name: "Thunderstorm coverage"
- alternative_names:
- - "thunc"
- 260107:
- name: "Cloud base"
- alternative_names:
- - "cdcb"
- 260108:
- name: "Cloud top"
- alternative_names:
- - "cdct"
- 260109:
- name: "Ceiling"
- alternative_names:
- - "ceil"
- 260110:
- name: "Non-convective cloud cover"
- alternative_names:
- - "cdlyr"
- 260111:
- name: "Cloud work function"
- alternative_names:
- - "cwork"
- 260112:
- name: "Convective cloud efficiency"
- alternative_names:
- - "cuefi"
- 260113:
- name: "Total condensate"
- alternative_names:
- - "tcond"
- 260114:
- name: "Total column-integrated cloud water"
- alternative_names:
- - "tcolw"
- 260115:
- name: "Total column-integrated cloud ice"
- alternative_names:
- - "tcoli"
- 260116:
- name: "Total column-integrated condensate"
- alternative_names:
- - "tcolc"
- 260117:
- name: "Ice fraction of total condensate"
- alternative_names:
- - "fice"
- 260118:
- name: "Cloud ice mixing ratio"
- alternative_names:
- - "cdcimr"
- 260119:
- name: "Sunshine"
- alternative_names:
- - "suns"
- 260120:
- name: "Horizontal extent of cumulonimbus (cb)"
- alternative_names:
- - "_param_260120"
- 260121:
- name: "K index"
- alternative_names:
- - "kx"
- 260122:
- name: "Ko index"
- alternative_names:
- - "kox"
- 260123:
- name: "Total totals index"
- alternative_names:
- - "totalx"
- 260124:
- name: "Sweat index"
- alternative_names:
- - "sx"
- 260125:
- name: "Storm relative helicity"
- alternative_names:
- - "hlcy"
- 260126:
- name: "Energy helicity index"
- alternative_names:
- - "ehlx"
- 260127:
- name: "Surface lifted index"
- alternative_names:
- - "lftx"
- 260128:
- name: "Best (4-layer) lifted index"
- alternative_names:
- - "4lftx"
- 260129:
- name: "Aerosol type"
- alternative_names:
- - "aerot"
- 260130:
- name: "Total ozone"
- alternative_names:
- - "tozne"
- 260131:
- name: "Ozone mixing ratio"
- alternative_names:
- - "o3mr"
- 260132:
- name: "Total column integrated ozone"
- alternative_names:
- - "tcioz"
- 260133:
- name: "Base spectrum width"
- alternative_names:
- - "bswid"
- 260134:
- name: "Base reflectivity"
- alternative_names:
- - "bref"
- 260135:
- name: "Base radial velocity"
- alternative_names:
- - "brvel"
- 260136:
- name: "Vertically-integrated liquid"
- alternative_names:
- - "veril"
- 260137:
- name: "Layer-maximum base reflectivity"
- alternative_names:
- - "lmaxbr"
- 260138:
- name: "Precipitation"
- alternative_names:
- - "prec"
- 260139:
- name: "Air concentration of caesium 137"
- alternative_names:
- - "acces"
- 260140:
- name: "Air concentration of iodine 131"
- alternative_names:
- - "aciod"
- 260141:
- name: "Air concentration of radioactive pollutant"
- alternative_names:
- - "acradp"
- 260142:
- name: "Ground deposition of caesium 137"
- alternative_names:
- - "gdces"
- 260143:
- name: "Ground deposition of iodine 131"
- alternative_names:
- - "gdiod"
- 260144:
- name: "Ground deposition of radioactive pollutant"
- alternative_names:
- - "gdradp"
- 260145:
- name: "Time-integrated air concentration of caesium pollutant"
- alternative_names:
- - "tiaccp"
- 260146:
- name: "Time-integrated air concentration of iodine pollutant"
- alternative_names:
- - "tiacip"
- 260147:
- name: "Time-integrated air concentration of radioactive pollutant"
- alternative_names:
- - "tiacrp"
- 260148:
- name: "Volcanic ash"
- alternative_names:
- - "volash"
- 260149:
- name: "Icing top"
- alternative_names:
- - "icit"
- 260150:
- name: "Icing base"
- alternative_names:
- - "icib"
- 260151:
- name: "Icing"
- alternative_names:
- - "ici"
- 260152:
- name: "Turbulence top"
- alternative_names:
- - "turbt"
- 260153:
- name: "Turbulence base"
- alternative_names:
- - "turbb"
- 260154:
- name: "Turbulence"
- alternative_names:
- - "turb"
- 260155:
- name: "Turbulent kinetic energy"
- alternative_names:
- - "tke"
- 260156:
- name: "Planetary boundary layer regime"
- alternative_names:
- - "pblreg"
- 260157:
- name: "Contrail intensity"
- alternative_names:
- - "conti"
- 260158:
- name: "Contrail engine type"
- alternative_names:
- - "contet"
- 260159:
- name: "Contrail top"
- alternative_names:
- - "contt"
- 260160:
- name: "Contrail base"
- alternative_names:
- - "contb"
- 260161:
- name: "Maximum snow albedo"
- alternative_names:
- - "mxsalb"
- 260162:
- name: "Snow free albedo"
- alternative_names:
- - "snfalb"
- 260163:
- name: "Icing"
- alternative_names:
- - "_param_260163"
- 260164:
- name: "In-cloud turbulence"
- alternative_names:
- - "_param_260164"
- 260165:
- name: "Relative clear air turbulence (rcat)"
- alternative_names:
- - "rcat"
- 260166:
- name: "Supercooled large droplet probability (see note 4)"
- alternative_names:
- - "_param_260166"
- 260167:
- name: "Arbitrary text string"
- alternative_names:
- - "var190m0"
- 260168:
- name: "Seconds prior to initial reference time (defined in section 1)"
- alternative_names:
- - "tsec"
- 260169:
- name: "Flash flood guidance (encoded as an accumulation over a floating subinterval
- of time between the ref"
- alternative_names:
- - "ffldg"
- 260170:
- name: "Flash flood runoff (encoded as an accumulation over a floating subinterval
- of time)"
- alternative_names:
- - "ffldro"
- 260171:
- name: "Remotely sensed snow cover"
- alternative_names:
- - "rssc"
- 260172:
- name: "Elevation of snow covered terrain"
- alternative_names:
- - "esct"
- 260173:
- name: "Snow water equivalent percent of normal"
- alternative_names:
- - "swepon"
- 260174:
- name: "Baseflow-groundwater runoff"
- alternative_names:
- - "bgrun"
- 260175:
- name: "Storm surface runoff"
- alternative_names:
- - "ssrun"
- 260176:
- name: "Conditional percent precipitation amount fractile for an overall period
- (encoded as an accumulation)"
- alternative_names:
- - "cppop"
- 260177:
- name: "Percent precipitation in a sub-period of an overall period (encoded as
- per cent accumulation over th"
- alternative_names:
- - "pposp"
- 260178:
- name: "Probability of 0.01 inch of precipitation (pop)"
- alternative_names:
- - "pop"
- 260179:
- name: "Land cover (1=land, 0=sea)"
- alternative_names:
- - "land"
- 260180:
- name: "Vegetation"
- alternative_names:
- - "veg"
- 260181:
- name: "Water runoff"
- alternative_names:
- - "watr"
- 260182:
- name: "Evapotranspiration"
- alternative_names:
- - "evapt"
- 260183:
- name: "Model terrain height"
- alternative_names:
- - "mterh"
- 260184:
- name: "Land use"
- alternative_names:
- - "landu"
- 260185:
- name: "Volumetric soil moisture content"
- alternative_names:
- - "soilw"
- 260186:
- name: "Ground heat flux"
- alternative_names:
- - "gflux"
- 260187:
- name: "Moisture availability"
- alternative_names:
- - "mstav"
- 260188:
- name: "Exchange coefficient"
- alternative_names:
- - "sfexc"
- 260189:
- name: "Plant canopy surface water"
- alternative_names:
- - "cnwat"
- 260190:
- name: "Blackadar mixing length scale"
- alternative_names:
- - "bmixl"
- 260191:
- name: "Canopy conductance"
- alternative_names:
- - "ccond"
- 260192:
- name: "Minimal stomatal resistance"
- alternative_names:
- - "rsmin"
- 260193:
- name: "Solar parameter in canopy conductance"
- alternative_names:
- - "rcs"
- 260194:
- name: "Temperature parameter in canopy conductance"
- alternative_names:
- - "rct"
- 260195:
- name: "Soil moisture parameter in canopy conductance"
- alternative_names:
- - "rcsol"
- 260196:
- name: "Humidity parameter in canopy conductance"
- alternative_names:
- - "rcq"
- 260197:
- name: "Column-integrated soil water"
- alternative_names:
- - "cisoilw"
- 260198:
- name: "Heat flux"
- alternative_names:
- - "hflux"
- 260199:
- name: "Volumetric soil moisture"
- alternative_names:
- - "vsw"
- 260200:
- name: "Volumetric wilting point"
- alternative_names:
- - "vwiltm"
- 260201:
- name: "Upper layer soil temperature"
- alternative_names:
- - "uplst"
- 260202:
- name: "Upper layer soil moisture"
- alternative_names:
- - "uplsm"
- 260203:
- name: "Lower layer soil moisture"
- alternative_names:
- - "lowlsm"
- 260204:
- name: "Bottom layer soil temperature"
- alternative_names:
- - "botlst"
- 260205:
- name: "Liquid volumetric soil moisture (non-frozen)"
- alternative_names:
- - "soill"
- 260206:
- name: "Number of soil layers in root zone"
- alternative_names:
- - "rlyrs"
- 260207:
- name: "Transpiration stress-onset (soil moisture)"
- alternative_names:
- - "smref"
- 260208:
- name: "Direct evaporation cease (soil moisture)"
- alternative_names:
- - "smdry"
- 260209:
- name: "Soil porosity"
- alternative_names:
- - "poros"
- 260210:
- name: "Liquid volumetric soil moisture (non-frozen)"
- alternative_names:
- - "liqvsm"
- 260211:
- name: "Volumetric transpiration stress-onset (soil moisture)"
- alternative_names:
- - "voltso"
- 260212:
- name: "Transpiration stress-onset (soil moisture)"
- alternative_names:
- - "transo"
- 260213:
- name: "Volumetric direct evaporation cease (soil moisture)"
- alternative_names:
- - "voldec"
- 260214:
- name: "Direct evaporation cease (soil moisture)"
- alternative_names:
- - "direc"
- 260215:
- name: "Soil porosity"
- alternative_names:
- - "soilp"
- 260216:
- name: "Volumetric saturation of soil moisture"
- alternative_names:
- - "vsosm"
- 260217:
- name: "Saturation of soil moisture"
- alternative_names:
- - "satosm"
- 260218:
- name: "Estimated precipitation"
- alternative_names:
- - "estp"
- 260219:
- name: "Instantaneous rain rate"
- alternative_names:
- - "irrate"
- 260220:
- name: "Cloud top height"
- alternative_names:
- - "ctoph"
- 260221:
- name: "Cloud top height quality indicator"
- alternative_names:
- - "ctophqi"
- 260222:
- name: "Estimated u component of wind"
- alternative_names:
- - "estu"
- 260223:
- name: "Estimated v component of wind"
- alternative_names:
- - "estv"
- 260224:
- name: "Number of pixels used"
- alternative_names:
- - "npixu"
- 260225:
- name: "Solar zenith angle"
- alternative_names:
- - "solza"
- 260226:
- name: "Relative azimuth angle"
- alternative_names:
- - "raza"
- 260227:
- name: "Reflectance in 0.6 micron channel"
- alternative_names:
- - "rfl06"
- 260228:
- name: "Reflectance in 0.8 micron channel"
- alternative_names:
- - "rfl08"
- 260229:
- name: "Reflectance in 1.6 micron channel"
- alternative_names:
- - "rfl16"
- 260230:
- name: "Reflectance in 3.9 micron channel"
- alternative_names:
- - "rfl39"
- 260231:
- name: "Atmospheric divergence"
- alternative_names:
- - "atmdiv"
- 260232:
- name: "Direction of wind waves"
- alternative_names:
- - "wvdir"
- 260233:
- name: "Primary wave direction"
- alternative_names:
- - "dirpw"
- 260234:
- name: "Primary wave mean period"
- alternative_names:
- - "perpw"
- 260235:
- name: "Secondary wave mean period"
- alternative_names:
- - "persw"
- 260236:
- name: "Current direction"
- alternative_names:
- - "dirc"
- 260237:
- name: "Current speed"
- alternative_names:
- - "spc"
- 260238:
- name: "Geometric vertical velocity"
- alternative_names:
- - "wz"
- 260239:
- name: "Ice temperature"
- alternative_names:
- - "ist"
- 260240:
- name: "Deviation of sea level from mean"
- alternative_names:
- - "dslm"
- 260241:
- name: "Seconds prior to initial reference time (defined in section 1)"
- alternative_names:
- - "tsec"
- 260242:
- name: "2 metre relative humidity"
- alternative_names:
- - "2r"
- 260243:
- name: "Temperature tendency by all radiation"
- alternative_names:
- - "ttrad"
- 260244:
- name: "Relative error variance"
- alternative_names:
- - "rev"
- 260245:
- name: "Large scale condensate heating rate"
- alternative_names:
- - "lrghr"
- 260246:
- name: "Deep convective heating rate"
- alternative_names:
- - "cnvhr"
- 260247:
- name: "Total downward heat flux at surface"
- alternative_names:
- - "thflx"
- 260248:
- name: "Temperature tendency by all physics"
- alternative_names:
- - "ttdia"
- 260249:
- name: "Temperature tendency by non-radiation physics"
- alternative_names:
- - "ttphy"
- 260250:
- name: "Standard dev. of ir temp. over 1x1 deg. area"
- alternative_names:
- - "tsd1d"
- 260251:
- name: "Shallow convective heating rate"
- alternative_names:
- - "shahr"
- 260252:
- name: "Vertical diffusion heating rate"
- alternative_names:
- - "vdfhr"
- 260253:
- name: "Potential temperature at top of viscous sublayer"
- alternative_names:
- - "thz0"
- 260254:
- name: "Tropical cyclone heat potential"
- alternative_names:
- - "tchp"
- 260255:
- name: "Apparent temperature"
- alternative_names:
- - "aptmp"
- 260256:
- name: "Haines index"
- alternative_names:
- - "hindex"
- 260257:
- name: "Cloud cover"
- alternative_names:
- - "ccl"
- 260258:
- name: "Evaporation rate"
- alternative_names:
- - "evarate"
- 260259:
- name: "Evaporation"
- alternative_names:
- - "eva"
- 260260:
- name: "10 metre wind direction"
- alternative_names:
- - "10wdir"
- 260261:
- name: "Minimum relative humidity"
- alternative_names:
- - "minrh"
- 260262:
- name: "Direct short wave radiation flux"
- alternative_names:
- - "dirswrf"
- 260263:
- name: "Diffuse short wave radiation flux"
- alternative_names:
- - "difswrf"
- 260264:
- name: "Time-integrated surface direct short wave radiation flux"
- alternative_names:
- - "tidirswrf"
- 260265:
- name: "Evaporation in the last 6 hours"
- alternative_names:
- - "eva06"
- 260266:
- name: "Evaporation in the last 24 hours"
- alternative_names:
- - "eva24"
- 260267:
- name: "Total precipitation in the last 6 hours"
- alternative_names:
- - "tp06"
- 260268:
- name: "Total precipitation in the last 24 hours"
- alternative_names:
- - "tp24"
- 260269:
- name: "Total icing potential diagnostic"
- alternative_names:
- - "tipd"
- 260270:
- name: "Number concentration for ice particles"
- alternative_names:
- - "ncip"
- 260271:
- name: "Snow temperature"
- alternative_names:
- - "snot"
- 260272:
- name: "Total column-integrated supercooled liquid water"
- alternative_names:
- - "tclsw"
- 260273:
- name: "Total column-integrated melting ice"
- alternative_names:
- - "tcolm"
- 260274:
- name: "Evaporation - precipitation"
- alternative_names:
- - "emnp"
- 260275:
- name: "Sublimation (evaporation from snow)"
- alternative_names:
- - "sbsno"
- 260276:
- name: "Deep convective moistening rate"
- alternative_names:
- - "cnvmr"
- 260277:
- name: "Shallow convective moistening rate"
- alternative_names:
- - "shamr"
- 260278:
- name: "Vertical diffusion moistening rate"
- alternative_names:
- - "vdfmr"
- 260279:
- name: "Condensation pressure of parcali lifted from indicate surface"
- alternative_names:
- - "condp"
- 260280:
- name: "Large scale moistening rate"
- alternative_names:
- - "lrgmr"
- 260281:
- name: "Specific humidity at top of viscous sublayer"
- alternative_names:
- - "qz0"
- 260282:
- name: "Maximum specific humidity at 2m"
- alternative_names:
- - "qmax"
- 260283:
- name: "Minimum specific humidity at 2m"
- alternative_names:
- - "qmin"
- 260284:
- name: "Liquid precipitation (rainfall)"
- alternative_names:
- - "arain"
- 260285:
- name: "Snow temperature, depth-avg"
- alternative_names:
- - "snowt"
- 260286:
- name: "Total precipitation (nearest grid point)"
- alternative_names:
- - "apcpn"
- 260287:
- name: "Convective precipitation (nearest grid point)"
- alternative_names:
- - "acpcpn"
- 260288:
- name: "Freezing rain"
- alternative_names:
- - "frzr"
- 260289:
- name: "Fraction of snow cover"
- alternative_names:
- - "fscov"
- 260290:
- name: "Clear air turbulence (cat)"
- alternative_names:
- - "cat"
- 260291:
- name: "Mountain wave turbulence (eddy dissipation rate)"
- alternative_names:
- - "mwt"
- 260292:
- name: "Specific rain water content (convective)"
- alternative_names:
- - "crwc_conv"
- 260293:
- name: "Specific snow water content (convective)"
- alternative_names:
- - "cswc_conv"
- 260294:
- name: "Glacier mask"
- alternative_names:
- - "glm"
- 260295:
- name: "Latitude of u wind component of velocity"
- alternative_names:
- - "lauv"
- 260296:
- name: "Longitude of u wind component of velocity"
- alternative_names:
- - "louv"
- 260297:
- name: "Latitude of v wind component of velocity"
- alternative_names:
- - "lavv"
- 260298:
- name: "Longitude of v wind component of velocity"
- alternative_names:
- - "lovv"
- 260299:
- name: "Latitude of pressure point"
- alternative_names:
- - "lapp"
- 260300:
- name: "Longitude of pressure point"
- alternative_names:
- - "lopp"
- 260301:
- name: "Vertical eddy diffusivity heat exchange"
- alternative_names:
- - "vedh"
- 260302:
- name: "Covariance between meridional and zonal components of the wind."
- alternative_names:
- - "covmz"
- 260303:
- name: "Covariance between temperature and zonal components of the wind."
- alternative_names:
- - "covtz"
- 260304:
- name: "Covariance between temperature and meridional components of the wind."
- alternative_names:
- - "covtm"
- 260305:
- name: "Vertical diffusion zonal acceleration"
- alternative_names:
- - "vdfua"
- 260306:
- name: "Vertical diffusion meridional acceleration"
- alternative_names:
- - "vdfva"
- 260307:
- name: "Gravity wave drag zonal acceleration"
- alternative_names:
- - "gwdu"
- 260308:
- name: "Gravity wave drag meridional acceleration"
- alternative_names:
- - "gwdv"
- 260309:
- name: "Convective zonal momentum mixing acceleration"
- alternative_names:
- - "cnvu"
- 260310:
- name: "Convective meridional momentum mixing acceleration"
- alternative_names:
- - "cnvv"
- 260311:
- name: "Tendency of vertical velocity"
- alternative_names:
- - "wtend"
- 260312:
- name: "Omega (dp/dt) divide by density"
- alternative_names:
- - "omgalf"
- 260313:
- name: "Convective gravity wave drag zonal acceleration"
- alternative_names:
- - "cngwdu"
- 260314:
- name: "Convective gravity wave drag meridional acceleration"
- alternative_names:
- - "cngwdv"
- 260315:
- name: "Velocity point model surface"
- alternative_names:
- - "lmv"
- 260316:
- name: "Potential vorticity (mass-weighted)"
- alternative_names:
- - "pvmww"
- 260317:
- name: "Mslp (eta model reduction)"
- alternative_names:
- - "mslet"
- 260318:
- name: "Precipitation type (most severe) in the last 1 hour"
- alternative_names:
- - "ptype_sev1h"
- 260319:
- name: "Precipitation type (most severe) in the last 3 hours"
- alternative_names:
- - "ptype_sev3h"
- 260320:
- name: "Precipitation type (most frequent) in the last 1 hour"
- alternative_names:
- - "ptype_freq1h"
- 260321:
- name: "Precipitation type (most frequent) in the last 3 hours"
- alternative_names:
- - "ptype_freq3h"
- 260323:
- name: "Mslp (maps system reduction)"
- alternative_names:
- - "mslma"
- 260324:
- name: "3-hr pressure tendency (std. atmos. reduction)"
- alternative_names:
- - "tslsa"
- 260325:
- name: "Pressure of level from which parcel was lifted"
- alternative_names:
- - "plpl"
- 260326:
- name: "X-gradient of log pressure"
- alternative_names:
- - "lpsx"
- 260327:
- name: "Y-gradient of log pressure"
- alternative_names:
- - "lpsy"
- 260328:
- name: "X-gradient of height"
- alternative_names:
- - "hgtx"
- 260329:
- name: "Y-gradient of height"
- alternative_names:
- - "hgty"
- 260330:
- name: "Layer thickness"
- alternative_names:
- - "layth"
- 260331:
- name: "Natural log of surface pressure"
- alternative_names:
- - "nlgsp"
- 260332:
- name: "Convective updraft mass flux"
- alternative_names:
- - "cnvumf"
- 260333:
- name: "Convective downdraft mass flux"
- alternative_names:
- - "cnvdmf"
- 260334:
- name: "Convective detrainment mass flux"
- alternative_names:
- - "cnvdemf"
- 260335:
- name: "Mass point model surface"
- alternative_names:
- - "lmh"
- 260336:
- name: "Geopotential height (nearest grid point)"
- alternative_names:
- - "hgtn"
- 260337:
- name: "Pressure (nearest grid point)"
- alternative_names:
- - "presn"
- 260338:
- name: "Precipitation type (most severe) in the last 6 hours"
- alternative_names:
- - "ptype_sev6h"
- 260339:
- name: "Precipitation type (most frequent) in the last 6 hours"
- alternative_names:
- - "ptype_freq6h"
- 260340:
- name: "Uv-b downward solar flux"
- alternative_names:
- - "duvb"
- 260341:
- name: "Clear sky uv-b downward solar flux"
- alternative_names:
- - "cduvb"
- 260342:
- name: "Clear sky downward solar flux"
- alternative_names:
- - "csdsf"
- 260343:
- name: "Solar radiative heating rate"
- alternative_names:
- - "swhr"
- 260344:
- name: "Clear sky upward solar flux"
- alternative_names:
- - "csusf"
- 260345:
- name: "Cloud forcing net solar flux"
- alternative_names:
- - "cfnsf"
- 260346:
- name: "Visible beam downward solar flux"
- alternative_names:
- - "vbdsf"
- 260347:
- name: "Visible diffuse downward solar flux"
- alternative_names:
- - "vddsf"
- 260348:
- name: "Near ir beam downward solar flux"
- alternative_names:
- - "nbdsf"
- 260349:
- name: "Near ir diffuse downward solar flux"
- alternative_names:
- - "nddsf"
- 260350:
- name: "Downward total radiation flux"
- alternative_names:
- - "dtrf"
- 260351:
- name: "Upward total radiation flux"
- alternative_names:
- - "utrf"
- 260354:
- name: "Long-wave radiative heating rate"
- alternative_names:
- - "lwhr"
- 260355:
- name: "Clear sky upward long wave flux"
- alternative_names:
- - "csulf"
- 260356:
- name: "Clear sky downward long wave flux"
- alternative_names:
- - "csdlf"
- 260357:
- name: "Cloud forcing net long wave flux"
- alternative_names:
- - "cfnlf"
- 260360:
- name: "Soil temperature"
- alternative_names:
- - "sot"
- 260361:
- name: "Downward short-wave radiation flux, clear sky"
- alternative_names:
- - "dswrf_cs"
- 260362:
- name: "Upward short-wave radiation flux, clear sky"
- alternative_names:
- - "uswrf_cs"
- 260363:
- name: "Downward long-wave radiation flux, clear sky"
- alternative_names:
- - "dlwrf_cs"
- 260364:
- name: "Soil heat flux"
- alternative_names:
- - "sohf"
- 260365:
- name: "Percolation rate"
- alternative_names:
- - "percr"
- 260366:
- name: "Convective cloud mass flux"
- alternative_names:
- - "mflux"
- 260367:
- name: "Soil depth"
- alternative_names:
- - "sod"
- 260368:
- name: "Soil moisture"
- alternative_names:
- - "som"
- 260369:
- name: "Richardson number"
- alternative_names:
- - "ri"
- 260370:
- name: "Convective weather detection index"
- alternative_names:
- - "cwdi"
- 260372:
- name: "Updraft helicity"
- alternative_names:
- - "uphl"
- 260373:
- name: "Leaf area index"
- alternative_names:
- - "lai"
- 260374:
- name: "Particulate matter (coarse)"
- alternative_names:
- - "pmtc"
- 260375:
- name: "Particulate matter (fine)"
- alternative_names:
- - "pmtf"
- 260376:
- name: "Particulate matter (fine)"
- alternative_names:
- - "lpmtf"
- 260377:
- name: "Integrated column particulate matter (fine)"
- alternative_names:
- - "lipmf"
- 260379:
- name: "Ozone concentration (ppb)"
- alternative_names:
- - "ozcon"
- 260380:
- name: "Categorical ozone concentration"
- alternative_names:
- - "ozcat"
- 260381:
- name: "Ozone vertical diffusion"
- alternative_names:
- - "vdfoz"
- 260382:
- name: "Ozone production"
- alternative_names:
- - "poz"
- 260383:
- name: "Ozone tendency"
- alternative_names:
- - "toz"
- 260384:
- name: "Ozone production from temperature term"
- alternative_names:
- - "pozt"
- 260385:
- name: "Ozone production from col ozone term"
- alternative_names:
- - "pozo"
- 260386:
- name: "Derived radar reflectivity backscatter from rain"
- alternative_names:
- - "refzr"
- 260387:
- name: "Derived radar reflectivity backscatter from ice"
- alternative_names:
- - "refzi"
- 260388:
- name: "Derived radar reflectivity backscatter from parameterized convection"
- alternative_names:
- - "refzc"
- 260389:
- name: "Derived radar reflectivity"
- alternative_names:
- - "refd"
- 260390:
- name: "Maximum/composite radar reflectivity"
- alternative_names:
- - "refc"
- 260391:
- name: "Lightning"
- alternative_names:
- - "ltng"
- 260394:
- name: "Slight risk convective outlook"
- alternative_names:
- - "srcono"
- 260395:
- name: "Moderate risk convective outlook"
- alternative_names:
- - "mrcono"
- 260396:
- name: "High risk convective outlook"
- alternative_names:
- - "hrcono"
- 260397:
- name: "Tornado probability"
- alternative_names:
- - "torprob"
- 260398:
- name: "Hail probability"
- alternative_names:
- - "hailprob"
- 260399:
- name: "Wind probability"
- alternative_names:
- - "windprob"
- 260400:
- name: "Significant tornado probability"
- alternative_names:
- - "storprob"
- 260401:
- name: "Significant hail probability"
- alternative_names:
- - "shailpro"
- 260402:
- name: "Significant wind probability"
- alternative_names:
- - "swindpro"
- 260403:
- name: "Categorical thunderstorm (1-yes, 0-no)"
- alternative_names:
- - "tstmc"
- 260404:
- name: "Number of mixed layers next to surface"
- alternative_names:
- - "mixly"
- 260405:
- name: "Flight category"
- alternative_names:
- - "flght"
- 260406:
- name: "Confidence - ceiling"
- alternative_names:
- - "cicel"
- 260407:
- name: "Confidence - visibility"
- alternative_names:
- - "civis"
- 260408:
- name: "Confidence - flight category"
- alternative_names:
- - "ciflt"
- 260409:
- name: "Low-level aviation interest"
- alternative_names:
- - "lavni"
- 260410:
- name: "High-level aviation interest"
- alternative_names:
- - "havni"
- 260411:
- name: "Visible, black sky albedo"
- alternative_names:
- - "sbsalb"
- 260412:
- name: "Visible, white sky albedo"
- alternative_names:
- - "swsalb"
- 260413:
- name: "Near ir, black sky albedo"
- alternative_names:
- - "nbsalb"
- 260414:
- name: "Near ir, white sky albedo"
- alternative_names:
- - "nwsalb"
- 260415:
- name: "Total probability of severe thunderstorms (days 2,3)"
- alternative_names:
- - "prsvr"
- 260416:
- name: "Total probability of extreme severe thunderstorms (days 2,3)"
- alternative_names:
- - "prsigsvr"
- 260417:
- name: "Supercooled large droplet (sld) potential"
- alternative_names:
- - "sipd"
- 260418:
- name: "Radiative emissivity"
- alternative_names:
- - "epsr"
- 260419:
- name: "Turbulence potential forecast index"
- alternative_names:
- - "tpfi"
- 260420:
- name: "Volcanic ash forecast transport and dispersion"
- alternative_names:
- - "vaftd"
- 260421:
- name: "Latitude (-90 to +90)"
- alternative_names:
- - "nlat"
- 260422:
- name: "East longitude (0 - 360)"
- alternative_names:
- - "elon"
- 260423:
- name: "Accumulated surface downward short-wave radiation flux, clear sky"
- alternative_names:
- - "adswrf_cs"
- 260424:
- name: "Model layer number (from bottom up)"
- alternative_names:
- - "mlyno"
- 260425:
- name: "Latitude (nearest neighbor) (-90 to +90)"
- alternative_names:
- - "nlatn"
- 260426:
- name: "East longitude (nearest neighbor) (0 - 360)"
- alternative_names:
- - "elonn"
- 260427:
- name: "Accumulated surface upward short-wave radiation flux, clear sky"
- alternative_names:
- - "auswrf_cs"
- 260428:
- name: "Accumulated surface downward long-wave radiation flux, clear sky"
- alternative_names:
- - "adlwrf_cs"
- 260429:
- name: "Probability of freezing precipitation"
- alternative_names:
- - "cpozp"
- 260430:
- name: "Percolation"
- alternative_names:
- - "perc"
- 260431:
- name: "Probability of precipitation exceeding flash flood guidance values"
- alternative_names:
- - "ppffg"
- 260432:
- name: "Probability of wetting rain, exceeding in 0.10 in a given time period"
- alternative_names:
- - "cwr"
- 260433:
- name: "Evapotranspiration rate"
- alternative_names:
- - "et"
- 260434:
- name: "Time-integrated evapotranspiration rate in the last 24h"
- alternative_names:
- - "acc_et24"
- 260435:
- name: "Time-mean evapotranspiration rate in the last 24h"
- alternative_names:
- - "avg_et24"
- 260436:
- name: "Potential evapotranspiration rate"
- alternative_names:
- - "pet"
- 260437:
- name: "Time-integrated potential evapotranspiration rate in the last 24h"
- alternative_names:
- - "acc_pet24"
- 260438:
- name: "Time-mean potential evapotranspiration rate in the last 24h"
- alternative_names:
- - "avg_pet24"
- 260439:
- name: "Vegetation type"
- alternative_names:
- - "vgtyp"
- 260440:
- name: "Time-mean volumetric soil moisture"
- alternative_names:
- - "avg_swv24"
- 260441:
- name: "Time-mean total precipitation rate"
- alternative_names:
- - "avg_tp24"
- 260442:
- name: "Wilting point"
- alternative_names:
- - "wilt"
- 260443:
- name: "Water runoff and drainage rate"
- alternative_names:
- - "rod"
- 260444:
- name: "Time-integrated water runoff and drainage rate in the last 24h"
- alternative_names:
- - "acc_rod24"
- 260445:
- name: "Time-mean water runoff and drainage rate in the last 24h"
- alternative_names:
- - "avg_rod24"
- 260447:
- name: "Rate of water dropping from canopy to ground"
- alternative_names:
- - "rdrip"
- 260448:
- name: "Ice-free water surface"
- alternative_names:
- - "icwat"
- 260449:
- name: "Surface exchange coefficients for t and q divided by delta z"
- alternative_names:
- - "akhs"
- 260450:
- name: "Surface exchange coefficients for u and v divided by delta z"
- alternative_names:
- - "akms"
- 260451:
- name: "Vegetation canopy temperature"
- alternative_names:
- - "vegt"
- 260452:
- name: "Surface water storage"
- alternative_names:
- - "sstor"
- 260453:
- name: "Liquid soil moisture content (non-frozen)"
- alternative_names:
- - "lsoil"
- 260454:
- name: "Open water evaporation (standing water)"
- alternative_names:
- - "ewatr"
- 260455:
- name: "Groundwater recharge"
- alternative_names:
- - "gwrec"
- 260456:
- name: "Flood plain recharge"
- alternative_names:
- - "qrec"
- 260457:
- name: "Roughness length for heat"
- alternative_names:
- - "sfcrh"
- 260458:
- name: "Normalized difference vegetation index"
- alternative_names:
- - "ndvi"
- 260459:
- name: "Land-sea coverage (nearest neighbor) [land=1,sea=0]"
- alternative_names:
- - "landn"
- 260460:
- name: "Asymptotic mixing length scale"
- alternative_names:
- - "amixl"
- 260461:
- name: "Water vapor added by precip assimilation"
- alternative_names:
- - "wvinc"
- 260462:
- name: "Water condensate added by precip assimilation"
- alternative_names:
- - "wcinc"
- 260463:
- name: "Water vapor flux convergence (vertical int)"
- alternative_names:
- - "wvconv"
- 260464:
- name: "Water condensate flux convergence (vertical int)"
- alternative_names:
- - "wcconv"
- 260465:
- name: "Water vapor zonal flux (vertical int)"
- alternative_names:
- - "wvuflx"
- 260466:
- name: "Water vapor meridional flux (vertical int)"
- alternative_names:
- - "wvvflx"
- 260467:
- name: "Water condensate zonal flux (vertical int)"
- alternative_names:
- - "wcuflx"
- 260468:
- name: "Water condensate meridional flux (vertical int)"
- alternative_names:
- - "wcvflx"
- 260469:
- name: "Aerodynamic conductance"
- alternative_names:
- - "acond"
- 260470:
- name: "Canopy water evaporation"
- alternative_names:
- - "evcw"
- 260471:
- name: "Transpiration"
- alternative_names:
- - "trans"
- 260472:
- name: "Time-mean snow depth water equivalent"
- alternative_names:
- - "avg_sd24"
- 260473:
- name: "Time-mean skin temperature"
- alternative_names:
- - "avg_skt24"
- 260474:
- name: "Surface slope type"
- alternative_names:
- - "sltyp"
- 260475:
- name: "Snow melt rate"
- alternative_names:
- - "smr"
- 260476:
- name: "Time-integrated snow melt rate in the last 24h"
- alternative_names:
- - "acc_smr24"
- 260477:
- name: "Time-mean snow melt rate in the last 24h"
- alternative_names:
- - "avg_smr24"
- 260478:
- name: "Direct evaporation from bare soil"
- alternative_names:
- - "evbs"
- 260479:
- name: "Land surface precipitation accumulation"
- alternative_names:
- - "lspa"
- 260480:
- name: "Bare soil surface skin temperature"
- alternative_names:
- - "baret"
- 260481:
- name: "Average surface skin temperature"
- alternative_names:
- - "avsft"
- 260482:
- name: "Effective radiative skin temperature"
- alternative_names:
- - "radt"
- 260483:
- name: "Field capacity"
- alternative_names:
- - "fldcp"
- 260484:
- name: "Scatterometer estimated u wind component"
- alternative_names:
- - "usct"
- 260485:
- name: "Scatterometer estimated v wind component"
- alternative_names:
- - "vsct"
- 260486:
- name: "Wave steepness"
- alternative_names:
- - "wstp"
- 260487:
- name: "Ocean mixed layer u velocity"
- alternative_names:
- - "omlu"
- 260488:
- name: "Ocean mixed layer v velocity"
- alternative_names:
- - "omlv"
- 260489:
- name: "Barotropic u velocity"
- alternative_names:
- - "ubaro"
- 260490:
- name: "Barotropic v velocity"
- alternative_names:
- - "vbaro"
- 260491:
- name: "Storm surge"
- alternative_names:
- - "surge"
- 260492:
- name: "Extra tropical storm surge"
- alternative_names:
- - "etsrg"
- 260493:
- name: "Ocean surface elevation relative to geoid"
- alternative_names:
- - "elevhtml"
- 260494:
- name: "Sea surface height relative to geoid"
- alternative_names:
- - "sshg"
- 260495:
- name: "Ocean mixed layer potential density (reference 2000m) list of coordinates along that dim
+
+ transpose (change internal ordering of axes)
+ align (align two Qubes to have the same axes?)
+ squeeze() removes length-1 dims.
+ drop_dim()
+ group_by() to group along a dimension by some function
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 00000000..a3a03742
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,63 @@
+services:
+ fdb_scanner:
+ container_name: fdb_scanner
+ build:
+ # # Build context = qubed_fdb_gen/ (the workspace root)
+ # # because all COPY paths in the Dockerfile are relative to it.
+ # context: .
+ # dockerfile: qubed/qubed_meteo/Dockerfile
+ # # restart: unless-stopped # disabled during testing so container exits cleanly
+ # # --- Runtime volumes ---
+ # # /config β fdb_config.yaml (required) + api.secret or API_KEY env var
+ # # /data β where the scanner writes the output JSON (visible on host at ./data/)
+ # # /logs β cron log output (tail these to watch progress)
+ # volumes:
+ # - ./config:/config:ro
+ # - ./data:/data
+ # - ./logs:/logs
+ # environment:
+ # FDB5_CONFIG_FILE: /config/fdb_config.yaml
+ # # Dummy token β POST to the qubed API will warn but not abort.
+ # # Replace with a real token when you want data to appear in the API.
+ # API_KEY: "dummy-token-for-testing"
+
+ # # --- Small test scan ---
+ # # Setting SELECTOR + FILEPATH makes the entrypoint replace the baked-in
+ # # crontab (which scans two datasets every 3 hours) with a single job.
+ # SELECTOR: "class=d1,dataset=climate-dt,generation=1"
+ # FILEPATH: /data/climate-dt.json
+ # # Scan only the last 2 days β fast enough to verify the binary works.
+ # LAST_N_DAYS: "2"
+ # # Run once per minute so you don't have to wait for the first trigger.
+ # SCHEDULE: "* * * * *"
+ # # Push the full-scan well into the future so it doesn't run during testing.
+ # FULL_SCHEDULE: "0 3 1 1 *"
+ # Build context = qubed_fdb_gen/ (the workspace root)
+ # because all COPY paths in the Dockerfile are relative to it.
+ context: .
+ dockerfile: qubed/qubed_meteo/Dockerfile
+ # restart: unless-stopped # disabled during testing so container exits cleanly
+ # --- Runtime volumes ---
+ # /config β fdb_config.yaml (required) + api.secret or API_KEY env var
+ # /data β where the scanner writes the output JSON (visible on host at ./data/)
+ # /logs β cron log output (tail these to watch progress)
+ volumes:
+ - ./config:/config:ro
+ - ./data:/data
+ - ./logs:/logs
+ environment:
+ FDB5_CONFIG_FILE: /config/fdb_config.yaml
+ # Dummy token β POST to the qubed API will warn but not abort.
+ # Replace with a real token when you want data to appear in the API.
+ API_KEY: "dummy-token-for-testing"
+ # --- Small test scan ---
+ # Setting SELECTOR + FILEPATH makes the entrypoint replace the baked-in
+ # crontab (which scans two datasets every 3 hours) with a single job.
+ SELECTOR: "class=d1,dataset=extremes-dt,stream=oper,levtype=sfc"
+ FILEPATH: /data/extremes-dt.json
+ # Scan only the last 2 days β fast enough to verify the binary works.
+ LAST_N_DAYS: "2"
+ # Run once per minute so you don't have to wait for the first trigger.
+ SCHEDULE: "* * * * *"
+ # Push the full-scan well into the future so it doesn't run during testing.
+ FULL_SCHEDULE: "0 3 1 1 *"
\ No newline at end of file
diff --git a/dockerfile b/dockerfile
deleted file mode 100644
index 378c74ec..00000000
--- a/dockerfile
+++ /dev/null
@@ -1,128 +0,0 @@
-FROM python:3.12-slim AS base
-
-RUN apt-get update && apt-get install -y \
- build-essential \
- curl \
- openssh-client \
- git \
- && apt-get clean
-
-COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
-RUN uv venv /opt/venv
-# Use the virtual environment automatically
-ENV VIRTUAL_ENV=/opt/venv
-ENV UV_PROJECT_ENVIRONMENT=/opt/venv
-# Place entry points in the environment at the front of the path
-ENV PATH="/opt/venv/bin:$PATH"
-
-# Get Rust
-RUN curl https://sh.rustup.rs -sSf | bash -s -- -y
-ENV PATH="/root/.cargo/bin:${PATH}"
-
-WORKDIR /code
-
-# Used to provide language.yaml metadata and fdb config, could probably be pulled from a database eventually
-COPY ./config /code/qubed/config
-
-COPY ./pyproject.toml /code/qubed/
-COPY ./Cargo.toml /code/qubed/
-COPY ./README.md /code/qubed/
-COPY ./src /code/qubed/src
-WORKDIR /code/qubed
-
-FROM base AS stac_server
-RUN uv pip install '.[stac_server]'
-COPY stac_server /code/qubed/stac_server
-
-WORKDIR /code/qubed/stac_server
-CMD ["uv", "run", "fastapi", "dev", "main.py", "--proxy-headers", "--port", "80", "--host", "0.0.0.0"]
-
-
-FROM python:3.12-bookworm AS fdb-base
-ARG ecbuild_version=3.11.0
-ARG eccodes_version=2.41.1
-ARG eckit_version=1.31.4
-ARG fdb_version=5.17.4
-ARG metkit_version=1.14.4
-ARG pyfdb_version=0.1.2
-RUN apt update
-# COPY polytope-deployment/common/default_fdb_schema /polytope/config/fdb/default
-
-# Install FDB from open source repositories
-RUN set -eux && \
- apt install -y cmake gnupg build-essential libtinfo5 net-tools libnetcdf19 libnetcdf-dev bison flex && \
- rm -rf source && \
- rm -rf build && \
- mkdir -p source && \
- mkdir -p build && \
- mkdir -p /opt/fdb/
-
-# Download ecbuild
-RUN set -eux && \
- git clone --depth 1 --branch ${ecbuild_version} https://github.com/ecmwf/ecbuild.git /ecbuild
-
-ENV PATH=/ecbuild/bin:$PATH
-
-# Install eckit
-RUN set -eux && \
- git clone --depth 1 --branch ${eckit_version} https://github.com/ecmwf/eckit.git /source/eckit && \
- cd /source/eckit && \
- mkdir -p /build/eckit && \
- cd /build/eckit && \
- ecbuild --prefix=/opt/fdb -- -DCMAKE_PREFIX_PATH=/opt/fdb /source/eckit && \
- make -j4 && \
- make install
-
-# Install eccodes
-RUN set -eux && \
- git clone --depth 1 --branch ${eccodes_version} https://github.com/ecmwf/eccodes.git /source/eccodes && \
- mkdir -p /build/eccodes && \
- cd /build/eccodes && \
- ecbuild --prefix=/opt/fdb -- -DENABLE_FORTRAN=OFF -DCMAKE_PREFIX_PATH=/opt/fdb /source/eccodes && \
- make -j4 && \
- make install
-
-# Install metkit
-RUN set -eux && \
- git clone --depth 1 --branch ${metkit_version} https://github.com/ecmwf/metkit.git /source/metkit && \
- cd /source/metkit && \
- mkdir -p /build/metkit && \
- cd /build/metkit && \
- ecbuild --prefix=/opt/fdb -- -DCMAKE_PREFIX_PATH=/opt/fdb /source/metkit && \
- make -j4 && \
- make install
-
-# Install fdb \
-RUN set -eux && \
- git clone --depth 1 --branch ${fdb_version} https://github.com/ecmwf/fdb.git /source/fdb && \
- cd /source/fdb && \
- mkdir -p /build/fdb && \
- cd /build/fdb && \
- ecbuild --prefix=/opt/fdb -- -DCMAKE_PREFIX_PATH="/opt/fdb;/opt/fdb/eckit;/opt/fdb/metkit" /source/fdb && \
- make -j4 && \
- make install
-
-RUN set -eux && \
- rm -rf /source && \
- rm -rf /build
-
-# Install pyfdb \
-RUN set -eux \
- && git clone --single-branch --branch ${pyfdb_version} https://github.com/ecmwf/pyfdb.git \
- && python -m pip install "numpy<2.0" --user\
- && python -m pip install ./pyfdb --user
-
-
-FROM base AS fdb_scanner
-RUN apt-get install -y libaec0 libopenjp2-7
-RUN uv pip install '.[cli]'
-
-COPY fdb_scanner /code/qubed/fdb_scanner
-WORKDIR /code/qubed/fdb_scanner
-# Copy FDB-related artifacts
-COPY --from=fdb-base /opt/fdb/ /opt/fdb/
-ENV PATH="/opt/fdb/bin:${PATH}"
-# copy fdb config
-COPY config/fdb_config.yaml /code/qubed/fdb_scanner/config/fdb_config.yaml
-ENV LD_LIBRARY_PATH=/opt/fdb/lib
-COPY --from=fdb-base /root/.local /root/.local
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index d4bb2cbb..00000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# Minimal makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line, and also
-# from the environment for the first two.
-SPHINXOPTS ?=
-SPHINXBUILD ?= sphinx-build
-SOURCEDIR = .
-BUILDDIR = _build
-
-# Put it first so that "make" without argument is like "make help".
-help:
- @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
-
-.PHONY: help Makefile
-
-# Catch-all target: route all unknown targets to Sphinx using the new
-# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
-%: Makefile
- @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/_static/banner.svg b/docs/_static/banner.svg
deleted file mode 100644
index 8f17681b..00000000
--- a/docs/_static/banner.svg
+++ /dev/null
@@ -1,159 +0,0 @@
-
-
-
-root βββ class=cd, stream=lwda/oai, param=1/2/3 βββ class=od, expver=1/2, param=1/2 βββ class=rd, param=1/2/3 βββ ... Qube 1. A data structure for efficiently representing and querying complex tree-like datacubes. [kjuΛb] noun
diff --git a/docs/algorithms.md b/docs/algorithms.md
deleted file mode 100644
index 4fefc8b0..00000000
--- a/docs/algorithms.md
+++ /dev/null
@@ -1,86 +0,0 @@
----
-jupytext:
- text_representation:
- extension: .md
- format_name: myst
- format_version: 0.13
- jupytext_version: 1.16.4
----
-# Under the Hood
-
-## Set Operations
-
-Qubes represent sets of objects, so the familiar set operations:
- * Union `A | B` or `Qube.union(A, B)`
- * Intersection `A & B` or `Qube.intersection(A, B)`
- * Difference (both `A - B` or `B - A`) or `Qube.difference(A, B)`
- * Symmetric difference `A ^ B` or `Qube.symmetric_difference(A, B)`
-
-are all defined.
-
-We can implement these operations by breaking the problem down into a recursive function:
-
-```python
-def operation(A : Qube, B : Qube) -> Qube:
- ...
-```
-
-Consider the intersection of A and B:
-```
-A
-ββββ a=1, b=1/2/3, c=1
-ββββ a=2, b=1/2/3, c=1
-
-B
-ββββ a=1, b=3/4/5, c=2
-ββββ a=2, b=3/4/5, c=2
-```
-
-We pair the two trees and traverse them in tandem, at each level we group the nodes by node key and for every pair of nodes in a group, compute the values only in A, the values only in B and the
-```
-for node_a in level_A:
- for node_b in level_B:
- just_A, intersection, just_B = Qube.fused_set_operations(
- node_a.values,
- node_b.values
- )
-```
-
-Based on the particular operation we're computing we keep or discard these three objects:
- * Union: keep just_A, intersection, just_B
- * Intersection: keep intersection
- * A - B: keep just_A, B - A keep just_B
- * Symmetric difference: keep just_A and just_B but not intersection
-
-The reason we have to keep just_A, intersection and just just_B separate is that each will produce a node with different children:
- * just_B: the children of node_B
- * just_A: the children of node_A
- * intersection: the result of calling `operation(A, B)` recursively on two new nodes formed from A and B but with just the intersecting values.
-
-This structure means that node.values can take different types, the two most useful being:
- * an enum, just a set of values
- * a range with start, stop and step
-
-Qube.fused_set_operations can dispatch on the two types given in order to efficiently compute set/set, set/range and range/range intersection operations.
-
-### Performance considerations
-
-This algorithm is quadratic in the number of matching keys, this means that if we have a level with a huge number of nodes with key 'date' and range types (since range types are currently restricted to being contiguous) we could end up with a quadtratic slow down.
-
-There are some ways this can be sped up:
-
-* Once we know any of just_A, intersection or just_B are empty we can discard them. Only for quite pathological inputs (many enums sparse enums with a lot of overlap) would you actually get quadratically many non-empty terms.
-
-* For ranges intersected with ranges, we could speed the algorithm up significantly by sorting the ranges and walking the two lists in tandem which reduces it to linear in the number of ranges.
-
-* If we have N_A and N_B nodes to compare between the two trees we have N_A*N_B comparisons to do. However if at the end of the day we're just trying to determine for each value whether it's in A, B or both. If N_A*N_B >> M the number of value s we might be able to switch to an alternative algorithm.
-
-
-## Compression
-
-In order to keep the tree compressed as operations are performed on it we define the "structural hash" of a node to be the hash of:
- * The node's key
- * Not the node's values.
- * The keys, values and children of the nodes children, recursively.
-
-This structural hash lets us identify when two sibling nodes may be able to be merged into one node thus keeping the tree compressed.
diff --git a/docs/autobuild.sh b/docs/autobuild.sh
deleted file mode 100755
index 83e39c6b..00000000
--- a/docs/autobuild.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-# cd to current directory of script
-parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
-cd "$parent_path"
-
-sphinx-autobuild . _build
diff --git a/docs/background.md b/docs/background.md
deleted file mode 100644
index 37427b56..00000000
--- a/docs/background.md
+++ /dev/null
@@ -1,87 +0,0 @@
----
-jupytext:
- text_representation:
- extension: .md
- format_name: myst
- format_version: 0.13
- jupytext_version: 1.16.4
----
-# Datacubes, Trees and Compressed trees
-
-This section contains a bit more of an introduction to the datastructure, feel free to skip to the [Quickstart](quickstart.md). See the [datacube spec](https://github.com/ecmwf/datacube-spec), for even more detail and the canonical source of truth on the matter.
-
-Qubed is primarily geared towards dealing with datafiles uniquely labeled by sets of key value pairs. We'll call a set of key value pairs that uniquely labels some data an `identifier`. Here's an example:
-
-```python
-{
- 'class': 'd1',
- 'dataset': 'climate-dt',
- 'generation': '1',
- 'date': '20241102',
- 'resolution': 'high',
- 'time': '0000',
-}
-```
-
-Unfortunately, we have more than one data file. If we are lucky, the set of identifiers that current exists might form a dense datacube that we could represent like this:
-
-```python
-{
- 'class': ['d1', 'd2'],
- 'dataset': 'climate-dt',
- 'generation': ['1','2','3'],
- 'model': 'icon',
- 'date': ['20241102','20241103'],
- 'resolution': ['high','low'],
- 'time': ['0000', '0600', '1200', '1800'],
-}
-```
-
-with the property that any particular choice for a value for any key will correspond to datafile that exists. So this object represents `2x1x3x1x2x2x4 = 96` different datafiles.
-
-To save space I will also represent this same thing like this:
-```
-- class=d1/d2, dataset=climate-dt, generation=1/2/3, ..., time=0000/0600/1200/1800
-```
-
-Unfortunately, we are not lucky and our datacubes are not always dense. In this case we might instead represent which data exists using a tree:
-
-```{code-cell} python3
-from qubed import Qube
-
-q = Qube.from_dict({
- "class=od" : {
- "expver=0001": {"param=1":{}, "param=2":{}},
- "expver=0002": {"param=1":{}, "param=2":{}},
- },
- "class=rd" : {
- "expver=0001": {"param=1":{}, "param=2":{}, "param=3":{}},
- "expver=0002": {"param=1":{}, "param=2":{}},
- },
-})
-
-#Β depth controls how much of the tree is open when rendered as html.
-q.html(depth=100)
-```
-
-But it's clear that the above tree contains a lot of redundant information. Many of the subtrees are identical for example. Indeed in practice a lot of our data turns out to be 'nearly dense' in that it contains many dense datacubes within it.
-
-There are many valid ways one could compress this tree. If we add the restriction that no identical key=value pairs can be adjacent then here is the compressed tree we might get:
-
-```{code-cell} python3
-q.compress()
-````
-
-```{warning}
-Without the above restriction we could, for example, have:
-
- root
- βββ class=od, expver=0001/0002, param=1/2
- βββ class=rd
- βββ expver=0001, param=3
- βββ expver=0001/0002, param=1/2
-
-but we do not allow this because it would mean we would have to take multiple branches in order to find data with `expver=0001`.
-```
-
-What we have now is a tree of dense datacubes which represents a single larger sparse datacube in a more compact manner. For want of a better word we'll call it a Qube.
diff --git a/docs/book.toml b/docs/book.toml
new file mode 100644
index 00000000..e77eb528
--- /dev/null
+++ b/docs/book.toml
@@ -0,0 +1,8 @@
+[book]
+title = "Qubed API Documentation"
+authors = ["ECMWF"]
+
+[build]
+create-missing = true
+
+[preprocessor.links]
diff --git a/docs/building_qubes_from_the_fdb.md b/docs/building_qubes_from_the_fdb.md
deleted file mode 100644
index fafcf286..00000000
--- a/docs/building_qubes_from_the_fdb.md
+++ /dev/null
@@ -1,137 +0,0 @@
----
-jupytext:
- text_representation:
- extension: .md
- format_name: myst
- format_version: 0.13
- jupytext_version: 1.16.4
----
-
-# Building a qube from the fdb
-
-Currently the process of building a large qube with metadata from is quite alpha. It goes like this:
-
-## 1 Dump the fdb keys with metadata
-
-I've split to step off to make it easier to go back and fix logic errors or bugs that might occur in later steps.
-
-This steps uses a script `fdb_scanner/fdb_dumper.py` which needs to custom versions of [FDB](https://github.com/ecmwf/fdb/tree/extra_uri_info) and [pyFDB](https://github.com/ecmwf/pyfdb/tree/extra_uri_info). It dumps out files that look like this:
-
-```
-0 activity=baseline/class=d1/dataset=climate-dt/experiment=cont/expver=o000/generation=2/model=icon/realization=1/stream=clte/year=1990
-1 levtype=sfc/month=1/resolution=standard/type=fc scheme=fdb/host=databridge-prod-store7-ope.ewctest.link/port=10000/path=/data/prod_7/fdb/d1:climate-dt:baseline:cont:2:icon:1:o000:clte:1990/1:standard:fc:sfc.20250702.105843.databridge-prod-store7.novalocal.3896080798318592.data
-3 date=19900101/param=134/time=0000 offset=338781/length=243149
-3 date=19900101/param=136/time=0000 offset=581930/length=284757
-```
-
-The first element is the key level, the next is key=value/key=value. Due to a bug the levels go 0, 1, 3, sorry about that! Level 1 has some metadata scheme/host/port/path and level 3 has offset and length.
-
-## 2 Parse the dumped data into qubes
-
-This uses `fdb_scanner/fdb_dump_parser.py` with a command like `ls test_scripts/data/*.zst | xargs -n 1 -P 10 python test_scripts/fdb_dump_parser.py`.
-
-## Clean and combine the resulting qubes into one large one
-
-Currently this uses code like this:
-
-```
-from qubed import Qube
-from qubed.value_types import DateRange, ValueGroup
-import objsize
-from pathlib import Path
-import humanize
-from collections import defaultdict
-import numpy as np
-import itertools as it
-import time
-from tqdm import tqdm
-from datetime import datetime
-
-def count_metadata_bytes(q: Qube):
- totals = defaultdict(lambda : 0)
- def measure(q: Qube):
- for key, values in q.metadata.items():
- totals[key] += values.nbytes
- q.walk(measure)
- return dict(totals)
-
-
-def print_metadata_sizes(q):
- totals = count_metadata_bytes(q)
- for k, size in totals.items():
- print(f"{k} : {humanize.naturalsize(size)}")
-
-def choose_smallest_int_container(qube):
- """
- Go through all the int metadata blobs and compactify them to use the smallest container that will fit them without losing information.
- """
- replace = {}
- for k, v in qube.metadata.items():
- if np.issubdtype(v.dtype, np.integer):
- new_dtype = np.min_scalar_type(np.max(v))
- if new_dtype != v.dtype:
- # print(f"{k} going from {v.dtype} to {new_dtype}")
- replace[k] = v.astype(new_dtype)
-
- if replace:
- new_metadata = qube.metadata | replace
- qube = qube.replace(metadata = new_metadata)
- return qube
-
-
-
-def convert_metadata_strings(q):
- """
- Convert any metadata string arrays from the old style numpy fixed width U Qube:
- """
- Convert length and offset from string to int and also choose the smallest possible integer encoding for each block
- """
- replace = {}
- if "length" in qube.metadata:
- a = qube.metadata["length"]
-
- if not np.issubdtype(a.dtype, np.integer):
- a = a.astype("uint64")
- replace["length"] = a
-
- if "offset" in qube.metadata:
- a = qube.metadata["offset"]
-
- if not np.issubdtype(a.dtype, np.integer):
- a = a.astype("uint64")
- replace["offset"] = a
-
- if replace:
- new_metadata = qube.metadata | replace
- qube = qube.replace(metadata = new_metadata)
- return qube
-
-q = Qube.empty()
-for y, m in tqdm(list(it.product(range(1990, 2000), range(1, 13)))):
- p = Path(f"test_scripts/qubes/climate-dt-flat-{y}-{m}.json")
- if not p.exists():
- print(f"{p} does not exist")
- continue
-
- q |= (Qube.load(p)
- .transform(convert_to_ints) # Can be removed when fdb_dump_parser.py is fixed to save offset and length as ints
- # .transform(convert_metadata_strings) #Β Shouldn't be necessary anymore
- .transform(choose_smallest_int_container) #Β This finds the smallest int container it can for each blob
- .convert_dtypes({
- "date": lambda d: datetime.strptime(d, "%Y%m%d")
- }))
-
-
-
-print_metadata_sizes(q)
-q
-```
-
-convert_to_ints is there because of an omission on fdb_dump_parser that should just be fixed.
diff --git a/docs/cmd.md b/docs/cmd.md
deleted file mode 100644
index 240da66b..00000000
--- a/docs/cmd.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# Command Line Usage
-
-```bash
-fdb list class=rd,expver=0001,... | qubed --from=fdblist --to=text
-
-fdb list --minimum-keys=class class=d1,dataset=climate-dt --config prod_remoteFDB.yaml | qubed convert --from=fdb --to=text
-
-```
-
-`--from` options include:
-* `fdb`
-
-`--to` options include:
-* `text`
-* `html`
-* `json`
-
-use `--input` and `--output` to specify input and output files respectively.
-
-
-There's some handy test data in the `tests/data` directory. For example:
-```bash
-gzip -dc tests/data/fdb_list_compact.gz| qubed convert --from=fdb --to=text --output=qube.txt
-gzip -dc tests/data/fdb_list_porcelain.gz| qubed convert --from=fdb --to=json --output=qube.json
-gzip -dc tests/data/fdb_list_compact.gz | qubed convert --from=fdb --to=html --output=qube.html
-
-// Operational data stream=oper/wave/enfo/waef
-fdb list class=od,expver=0001,date=0,stream=oper --compact >> operational_compact.txt
-operational_compact.txt | qubed convert --from=fdb --to=text --output=operational.txt
-```
-
-
-
-##Β Todo
-
---from for
-* `protobuf`
-* `marslist`
-* `constraints`
-
---to for
-* `json`
-* `datacubes`
-* `constraints`
diff --git a/docs/conf.py b/docs/conf.py
deleted file mode 100644
index 5548ab60..00000000
--- a/docs/conf.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Configuration file for the Sphinx documentation builder.
-#
-# For the full list of built-in configuration values, see the documentation:
-# https://www.sphinx-doc.org/en/master/usage/configuration.html
-
-# -- Project information -----------------------------------------------------
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
-
-project = "qubed"
-copyright = "2025, Tom Hodson (ECMWF)"
-author = "Tom Hodson (ECMWF)"
-release = "0.1.0"
-
-# -- General configuration ---------------------------------------------------
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
-
-extensions = [
- "sphinx.ext.autodoc", # for generating documentation from the docstrings in our code
- "sphinx.ext.napoleon", # for parsing Numpy and Google stye docstrings
- "myst_nb", # For parsing markdown
-]
-
-templates_path = ["_templates"]
-exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "jupyter_execute"]
-
-
-source_suffix = {
- ".rst": "restructuredtext",
-}
-
-# -- Options for HTML output -------------------------------------------------
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
-
-html_theme = "sphinx_rtd_theme"
-html_static_path = ["_static"]
-
-myst_enable_extensions = [
- "attrs_inline",
-]
-
-# myst_nb options
-# use sphinx-build --define nb_execution_raise_on_error=1 . _build
-# nb_execution_raise_on_error = True
diff --git a/docs/development.md b/docs/development.md
deleted file mode 100644
index b2f133e6..00000000
--- a/docs/development.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# Development
-
-
-## Installation
-
-To install the latest stable release from PyPI (recommended):
-
-```bash
-pip install "qubed[cli,stac_server,docs,dev]"
-```
-Delete optional feature dependencies as appropriate.
-
-
-To install the latest version from github (requires a rust tool chain):
-
-```bash
-pip install qubed@git+https://github.com/ecmwf/qubed.git@main
-```
-
-To build the develop branch from source
-1. Install a rust toolchain
-2. `pip install maturin` then run:
-
-```
-git clone -b develop git@github.com:ecmwf/qubed.git
-cd qubed
-maturin develop
-```
-
-## Pre-commit hooks
-
-The repo comes with a `.pre-commit-config.yaml` that should be used to format the code before commiting. See [the pre-commit docs](https://pre-commit.com/) but the gist is:
-
-```bash
-pip install pre-commit
-pre-commit install #Β In the root of this repo
-```
-
-## CI
-
-The tests are in `./tests`. The CI is setup using tox to run the tests in a few different environments, they are currently:
-
-* python 3.13
-* python 3.12
-* python 3.11
-* python 3.12 with numpy version 1.x as opposed to version 2.x which is used by default.
-
-
-## Git Large File Storage
-
-This repo uses git Large file storage to store some qubes larger than 100MB. These files are not downloaded by `git clone` by default. In order to download them do, for example:
-```bash
-git lfs pull --include="tests/example_qubes/climate-dt/ten_yearly/climate-dt-1990-2000.cbor" --exclude=""
-```
-
-That these files are not downloaded by default is controlled the contents of `.lfsconfig`
-
-You can use `git lfs ls-files` to see which files are currently tracked by lfs.
-
-##Β Docs
-
-The docs are built with sphinx with a plugin that allows code the run and the output to be saved into the docs. This code can break when you update qubed so use `docs/test_docs.sh` to check it hasn't broken. The CI also has a job to check for this.
diff --git a/docs/fiab.md b/docs/fiab.md
deleted file mode 100644
index 604751ae..00000000
--- a/docs/fiab.md
+++ /dev/null
@@ -1,137 +0,0 @@
----
-jupytext:
- text_representation:
- extension: .md
- format_name: myst
- format_version: 0.13
- jupytext_version: 1.16.4
----
-
-# Forecast in a Box
-
-## Model Selection
-
-This is a demo of using qubed to select from a set of forecast models that each produce a set of output variables.
-
-First let's construct some models represented as qubes:
-
-```{code-cell} python3
-from qubed import Qube
-model_1 = Qube.from_datacube({
- "levtype": "pl",
- "param" : ["q", "t", "u", "v", "w", "z"],
- "level" : [100, 200, 300, 400, 50, 850, 500, 150, 600, 250, 700, 925, 1000],
- }) | Qube.from_datacube({
- "levtype": "sfc",
- "param" : ["10u", "10v", "2d", "2t", "cp", "msl", "skt", "sp", "tcw", "tp"],
-})
-
-model_1 = "model=1" / ("frequency=6h" / model_1)
-model_1
-```
-
-This is the most complete model. Now let's do one with fewer variables and levels:
-
-```{code-cell} python3
-model_2 = Qube.from_datacube({
- "levtype": "pl",
- "param" : ["q", "t"],
- "level" : [100, 200, 300, 400, 50, 850, 500, 150, 600, 250, 700, 925, 1000],
- }) | Qube.from_datacube({
- "levtype": "sfc",
- "param" : ["2t", "cp", "msl"],
-})
-model_2 = "model=2" / ("frequency=continuous" / model_2)
-```
-
-```{code-cell} python3
-model_3 = Qube.from_datacube({
- "levtype": "pl",
- "param" : ["q", "t"],
- "level" : [100, 200, 300, 400, 50, 850, 500, 150, 600, 250, 700, 925, 1000],
- }) | Qube.from_datacube({
- "levtype": "sfc",
- "param" : ["2t", "cp", "msl"],
-})
-model_3 = "model=3" / ("frequency=6h" / model_3)
-model_3
-```
-
-
-Now we can combine the three models into a single qube:
-
-```{code-cell} python3
-all_models = model_1 | model_2 | model_3
-all_models
-```
-
-Now we can perform queries over the models. We can get all models that produce 2m temperature:
-```{code-cell} python3
-all_models.select({
- "param" : "2t",
-})
-```
-
-Filter on both parameter and frequency:
-
-```{code-cell} python3
-all_models.select({
- "param" : "2t",
- "frequency": "continuous",
-})
-```
-
-Find all models that have some overlap with this set of parameters:
-
-```{code-cell} python3
-all_models.select({
- "param" : ["q", "t", "u", "v"],
-})
-```
-
-## Choosing a set of models based on the requested parameter set
-
-```{code-cell} python3
-all_models.select({
- "param" : ["q", "t", "u", "v"],
- "frequency": "6h",
-})
-```
-
-## Using WildCards
-
-```{code-cell} python3
-daily_surface_means = Qube.from_datacube({
- "model": "*",
- "frequency": "*",
- "levtype": "sfc",
- "param": "*",
-})
-all_models & daily_surface_means
-```
-
-```{code-cell} python3
-
-daily_level_means = Qube.from_datacube({
- "model": "*",
- "frequency": "*",
- "levtype": "pl",
- "param": "*",
- "level": "*"
-})
-all_models & daily_level_means
-```
-
-```{code-cell} python3
-daily_level_mean_products = all_models & daily_surface_means
-for i, identifier in enumerate(daily_level_mean_products.leaves()):
- print(identifier)
- if i > 10:
- print("...")
- break
-
-```
-
-
-
-
diff --git a/docs/index.md b/docs/index.md
deleted file mode 100644
index d925ef99..00000000
--- a/docs/index.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-jupytext:
- text_representation:
- extension: .md
- format_name: myst
- format_version: 0.13
- jupytext_version: 1.16.4
----
-
-# Qubed
-
-```{toctree}
-:maxdepth: 1
-quickstart.md
-development.md
-background.md
-algorithms.md
-fiab.md
-cmd.md
-metadata.md
-building_qubes_from_the_fdb.md
-```
-
-```{code-cell} python3
-import qubed
-from qubed import Qube
-```
-
-Qubed provides a data-structure primitive for working with trees of data-cubes by representing them in a compressed form:
-```{code-cell} python3
-q = qubed.examples.basic()
-q
-```
-
-This qube represents three data-cubes with shapes `(1,2,2)`, `(1,1,3)` and `(1,1,2)` for a total of 9 leaves. So fully expanded it would look like this:
-```{code-cell} python3
-q.expand().display(depth=3)
-```
-The goal of qubed is to _never_ need to work with the expanded form, so qubed defines various useful operations that work directly on the compressed form, and keep it compressed. These include set operations, compression, search, transformation and filtering. The set operations include unions, intersections, subtractions and any other combination of the Venn diagram you want!
-
-```{code-cell} python3
-r = (Qube.from_tree("root, class=xd, expver=0001/0002, param=1/2")
- .convert_dtypes({"expver" : int}))
-q | r # Does a union between q and r
-```
-
-
-To get a little more background on the motivation and structure of a Qube go to [Background](background.md), for a more hands on intro, go to [Quickstart](quickstart.md).
diff --git a/docs/make.bat b/docs/make.bat
deleted file mode 100644
index 32bb2452..00000000
--- a/docs/make.bat
+++ /dev/null
@@ -1,35 +0,0 @@
-@ECHO OFF
-
-pushd %~dp0
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=sphinx-build
-)
-set SOURCEDIR=.
-set BUILDDIR=_build
-
-%SPHINXBUILD% >NUL 2>NUL
-if errorlevel 9009 (
- echo.
- echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
- echo.installed, then set the SPHINXBUILD environment variable to point
- echo.to the full path of the 'sphinx-build' executable. Alternatively you
- echo.may add the Sphinx directory to PATH.
- echo.
- echo.If you don't have Sphinx installed, grab it from
- echo.https://www.sphinx-doc.org/
- exit /b 1
-)
-
-if "%1" == "" goto help
-
-%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-goto end
-
-:help
-%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-
-:end
-popd
diff --git a/docs/metadata.md b/docs/metadata.md
deleted file mode 100644
index 6acdcf59..00000000
--- a/docs/metadata.md
+++ /dev/null
@@ -1,136 +0,0 @@
----
-jupytext:
- text_representation:
- extension: .md
- format_name: myst
- format_version: 0.13
- jupytext_version: 1.16.4
----
-# Metadata
-
-Qubed includes the ability to store metadata which may vary for each individual leaf node. This is achieves by 'hanging' arrays at various points in the tree all the way down to the leaf nodes.
-
-```{code-cell} python3
-from qubed import Qube
-example = Qube.load("../tests/example_qubes/extremes-dt_with_metadata.json")
-example.html(depth=1)
-```
-
-
-When metadata is present, info prints information about the metadata also:
-```{code-cell} python3
-example.info()
-```
-
-Hovering over nodes will give some debug information about them and what metadata is attached. We can iterate over leaf nodes including their metadata using `Qube.leaves_with_metadata()`
-
-
-```{code-cell} python3
-next(example.leaves(metadata=True))
-```
-
-In this case we see that each individual field of this Qube stores a path to a file and an offset and length into that file. The path string is actually stored one level up the tree because it is common to many individual leaves.
-
-We can print some helpful information about how the metadata appears in the qube:
-
-```{code-cell} python3
-example.metadata_info()
-```
-
-## Building qubes with metadata
-
-Currently the main to build qubes with metadata is leaf by leaf using union like this:
-
-```{code-cell} python3
-new_qube = Qube.empty()
-for i, (id, metadata) in enumerate(example.leaves(metadata=True)):
- new_qube |= Qube.from_datacube(id).add_metadata(metadata)
- if i > 100: break
-
-new_qube
-```
-
-Here I've use an existing qube as a convenient source of metadata but you can equally do this from the output of an fdb list.
-
-## Modifying Qubes with metadata
-For subselection, `Qube.select` works on qubes with metadata and will correctly slice the metadata along with the qube. To update existing metadata you can something like:
-
-```python
-existing_qube = Qube.from_datacube(target).add_metadata(metadata) | existing qube
-```
-This will update the metadata for `target` to `metadata` because in the union the leftmost qube takes precendence. (Perhaps this should be changed to rightmost precedence!)
-
-## Recipes
-
-### Extracting the set of metadata values
-In the case of metadata which sits at levels above the leaf nodes it would be ineficient to use `Qube.leaves`, instead one can use `Qube.walk` like this:
-
-```{code-cell} python3
-def get_metadata_key(qube, key):
- m = []
- def getter(qube):
- for k, v in qube.metadata.items():
- if k == key:
- m.extend(v.flatten())
- qube.walk(getter)
- return m
-
-m = get_metadata_key(example, "path")
-m[:5]
-```
-
-### Getting the total size in bytes used by metadata
-
-```{code-cell} python3
-from collections import defaultdict
-def count_metadata_bytes(q: Qube):
- totals = defaultdict(lambda: 0)
- def measure(q: Qube):
- for key, values in q.metadata.items():
- totals[key] += values.nbytes
- q.walk(measure)
- return dict(totals)
-
-#Β Requires the humanize library for nice formatting of bytes
-def print_metadata_sizes(q):
- totals = count_metadata_bytes(q)
- for k, size in totals.items():
- print(f"{k} : {humanize.naturalsize(size)}")
-
-count_metadata_bytes(example)
-```
-
-
-### Conversions
-
-```
-def convert_metadata_strings(q):
- """
- Convert any metadata string arrays from the old style numpy fixed width U 10:
- print("...")
- break
-```
-
-Or if you can it's more efficient to iterate over the datacubes:
-
-```{code-cell} python3
-list(cq.datacubes())
-```
-
-## Selection
-Select a subset of the tree:
-
-```{code-cell} python3
-climate_dt.select({
- "activity": "scenariomip"
-}).html(depth=1)
-```
-
-Use `.span("key")` to get the set of possibles values for a key, note this includes anywhere this key appears in the tree.
-
-```{code-cell} python3
-climate_dt.span("activity")
-```
-
-Use `.axes()` to get the span of every key in one go.
-
-```{code-cell} python3
-axes = climate_dt.axes()
-for key, values in axes.items():
- print(f"{key} : {list(values)[:10]}")
-```
-
-
-## Set Operations
-
-The union/intersection/difference of two dense datacubes is not itself dense.
-
-```{code-cell} python3
-A = Qube.from_dict({"a=1/2/3" : {"b=i/j/k" : {}},})
-B = Qube.from_dict({"a=2/3/4" : {"b=j/k/l" : {}},})
-
-A.print(), B.print();
-```
-
-Union:
-
-```{code-cell} python3
-(A | B).print();
-```
-
-Intersection:
-
-```{code-cell} python3
-(A & B).print();
-```
-
-Difference:
-
-```{code-cell} python3
-(A - B).print();
-```
-
-Symmetric Difference:
-
-```{code-cell} python3
-(A ^ B).print();
-```
-
-## Transformations
-
-`q.transform` takes a python function from one node to one or more nodes and uses this to build a new tree. This can be used for simple operations on the key or values but also to split or remove nodes. Note that you can't use it to merge nodes beause it's only allowed to see one node at a time.
-
-```{code-cell} python3
-def capitalize(node): return node.replace(key = node.key.capitalize())
-climate_dt.transform(capitalize).html(depth=1)
-```
-
-## Save to disk
-
-There is currently a very simple JSON serialisation format. More compact binary serialisations are planned.
-```{code-cell} python3
-json = climate_dt.to_json()
-Qube.from_json(json) == climate_dt
-```
-
-## Advanced Selection
-
-There is currently partial support for different datatypes in addition to strings. Here we can convert datatypes by key to ints and dates and then use functions as filters in select.
-
-```{code-cell} python3
-from datetime import datetime
-
-q = Qube.from_tree("""
-root, date=20240101
-βββ levtype=pl, levelist=850, threshold=-2/-4/-8/2/4/8
-βββ levtype=sfc
- βββ param=10u/10v, threshold=10/15
- βββ param=2t, threshold=273.15
- βββ param=tp, threshold=0.1/1/10/100/20/25/5/50
-""").convert_dtypes({
- "threshold": float,
- "levelist": int,
- "date": lambda d: datetime.strptime(d, "%Y%m%d"),
-})
-
-r = q.select({
- "threshold": lambda t: t > 5,
- "date": lambda d: d > datetime.strptime("20230101", "%Y%m%d"),
-})
-
-r
-```
diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md
new file mode 100644
index 00000000..2bf0473f
--- /dev/null
+++ b/docs/src/SUMMARY.md
@@ -0,0 +1,22 @@
+# Summary
+
+[Introduction](./index.md)
+
+# Concepts
+
+- [Background: Datacubes, Trees and Compressed Trees](./background.md)
+- [Under the Hood: Algorithms](./algorithms.md)
+
+# Getting Started
+
+- [Quickstart](./quickstart.md)
+
+# Rust API Reference
+
+- [qubed β Core Library](./rust/qubed.md)
+- [qubed-meteo β Adapters](./rust/qubed-meteo.md)
+
+# Python API Reference
+
+- [py_qubed β Python Bindings](./python/py_qubed.md)
+- [py_qubed_meteo β Python Adapters](./python/py_qubed_meteo.md)
diff --git a/docs/src/algorithms.md b/docs/src/algorithms.md
new file mode 100644
index 00000000..8a3ebc10
--- /dev/null
+++ b/docs/src/algorithms.md
@@ -0,0 +1,108 @@
+# Under the Hood: Algorithms
+
+This chapter explains the key algorithms that power Qubed: **set operations** on compressed trees and **compression** itself.
+
+## Set Operations
+
+Qubes represent sets of identifiers, so the familiar set operations are all defined:
+
+| Operation | Rust method | Description |
+|---|---|---|
+| **Union** | `a.append(&mut b)` | All identifiers in A or B (or both) |
+| **Intersection** | `select` with intersection logic | Identifiers in both A and B |
+| **Difference** | internal set operation | Identifiers in A but not B |
+| **Symmetric difference** | internal set operation | Identifiers in exactly one of A or B |
+
+### How It Works
+
+The algorithm traverses both trees in tandem, recursively:
+
+```
+for node_a in level_A:
+ for node_b in level_B:
+ just_A, intersection, just_B = fused_set_operation(
+ node_a.coordinates,
+ node_b.coordinates
+ )
+```
+
+At each level, nodes are grouped by dimension. For every pair of nodes sharing the same dimension, the algorithm computes three disjoint sets of coordinate values:
+
+- **just_A** β values only in node A
+- **intersection** β values in both nodes
+- **just_B** β values only in node B
+
+Depending on the operation:
+
+| Operation | Keeps |
+|---|---|
+| Union | just_A + intersection + just_B |
+| Intersection | intersection only |
+| A β B | just_A only |
+| B β A | just_B only |
+| Symmetric difference | just_A + just_B |
+
+The crucial insight is that each partition gets **different children**:
+
+- **just_A** inherits the children of node A
+- **just_B** inherits the children of node B
+- **intersection** gets children computed by recursively calling the set operation on the sub-trees of A and B
+
+This recursive decomposition ensures the result is still a valid compressed Qube.
+
+### Performance Considerations
+
+The pairwise comparison is quadratic in the number of matching nodes at each level: $O(N_A \times N_B)$ comparisons per dimension group. In practice this is manageable because:
+
+1. Once any of just_A, intersection, or just_B is determined to be empty, it can be discarded immediately.
+2. For sorted coordinate types (integers, ranges), the intersection can be computed in linear time by walking both sorted lists in tandem.
+3. After the operation, compression merges any resulting sibling nodes with identical structure, keeping the tree compact.
+
+## Compression
+
+Compression is the process of reducing tree size while preserving the set of identifiers. It works in three phases:
+
+### Phase 1: Recursive Coordinate Merging
+
+Starting from the leaves and working upward, the algorithm identifies sibling nodes (children of the same parent, sharing the same dimension) that have identical **structural hashes**.
+
+The **structural hash** of a node is computed from:
+- The node's dimension name
+- The structural hashes of all its children (recursively)
+- But **not** the node's own coordinate values
+
+Two sibling nodes with the same structural hash have identical subtree shapes. Their coordinates can be merged into a single node without losing information:
+
+```
+Before: After:
+βββ expver=0001 βββ expver=0001/0002
+β βββ param=1 βββ param=1
+β βββ param=2 βββ param=2
+βββ expver=0002
+ βββ param=1
+ βββ param=2
+```
+
+### Phase 2: Pruning Empty Nodes
+
+After merging, some nodes may have empty coordinate sets (their values were absorbed by a sibling). These empty nodes are pruned from the tree.
+
+### Phase 3: Deduplication
+
+A final pass deduplicates any nodes that became structurally identical after merging. This is done by recomputing structural hashes and collapsing identical siblings.
+
+### Hash Caching
+
+Structural hashes are cached in each node using an `AtomicU64`. The cache is invalidated (set to 0) whenever a node or any of its ancestors are modified. This ensures hashes are recomputed lazily only when needed, making repeated compression operations efficient.
+
+## The `append` / Union Workflow
+
+When two Qubes are merged via `append`:
+
+1. The two root nodes are paired and `node_merge` is called recursively.
+2. At each level, children are grouped by dimension and the internal set operation produces the three partitions (just_A, intersection, just_B).
+3. For the intersection partition, new nodes are created and children are recursively merged.
+4. For just_B partitions, subtrees are copied from the other Qube into self.
+5. After all merging is complete, `compress()` is called to re-compress the result.
+
+The `append_many` method optimizes merging many Qubes by batching: it performs intermediate compression every 500 Qubes to prevent unbounded tree growth.
diff --git a/docs/src/background.md b/docs/src/background.md
new file mode 100644
index 00000000..afbcfa45
--- /dev/null
+++ b/docs/src/background.md
@@ -0,0 +1,96 @@
+# Datacubes, Trees and Compressed Trees
+
+This chapter introduces the core concepts behind Qubed. Feel free to skip ahead to the [Quickstart](./quickstart.md) if you'd rather learn by doing.
+
+## Identifiers
+
+Qubed is primarily geared towards dealing with data files uniquely labelled by sets of key-value pairs. We call such a set an **identifier**:
+
+```json
+{
+ "class": "d1",
+ "dataset": "climate-dt",
+ "generation": "1",
+ "date": "20241102",
+ "resolution": "high",
+ "time": "0000"
+}
+```
+
+Each identifier maps to exactly one dataset (a GRIB field, a file on disk, an API result, etc.). We're interested in describing which identifiers currently exist and performing efficient operations over them.
+
+## Dense Datacubes
+
+If we're lucky, the set of identifiers forms a **dense datacube** β every combination of key values is present:
+
+```
+class=d1/d2, dataset=climate-dt, generation=1/2/3,
+model=icon, date=20241102/20241103, resolution=high/low,
+time=0000/0600/1200/1800
+```
+
+This single object represents `2 Γ 1 Γ 3 Γ 1 Γ 2 Γ 2 Γ 4 = 96` distinct datasets. Dense datacubes are compact and efficient.
+
+## Sparse Datacubes as Trees
+
+In practice, datasets are rarely fully dense. For example, certain models may only produce data at certain resolutions or certain experiments may only cover a subset of parameters.
+
+We can represent which data exists as a **tree**, where each node carries a dimension name and a set of coordinate values:
+
+```
+root
+βββ class=od
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=rd
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1
+ βββ param=2
+```
+
+Each root-to-leaf path defines one identifier. This tree represents 9 identifiers. It can express sparsity that a flat datacube cannot β above, `class=rd, expver=0001` has an extra `param=3` that `class=od` doesn't have.
+
+## Compression: Trees of Dense Datacubes
+
+The expanded tree above contains a lot of redundant information. Many subtrees are structurally identical. In practice, real-world data tends to be "nearly dense" β it's composed of a modest number of dense datacubes.
+
+Qubed **compresses** the tree by merging sibling nodes that have identical subtree structure. The algorithm computes a **structural hash** of each node (covering its dimension, children's keys, children's values, and recursively their children) and merges siblings whose hashes match:
+
+```
+root
+βββ class=od, expver=0001/0002, param=1/2
+βββ class=rd
+ βββ expver=0001, param=1/2/3
+ βββ expver=0002, param=1/2
+```
+
+The 16-node expanded tree is now just 5 nodes β and still represents exactly the same 9 identifiers. Each leaf-path in the compressed tree is a **dense datacube**.
+
+> **Restriction:** No identical `key=value` pairs may be adjacent siblings. For example, the following would **not** be allowed:
+>
+> ```
+> root
+> βββ class=od, expver=0001/0002, param=1/2
+> βββ class=rd
+> βββ expver=0001, param=3
+> βββ expver=0001/0002, param=1/2
+> ```
+>
+> This restriction ensures that looking up a particular `expver` value in a branch never requires following multiple children β each value appears under at most one child per dimension.
+
+## Scale
+
+At real-world scale these properties are dramatic. For example, the ECMWF Climate DT dataset contains over **1 billion** distinct identifiers but can be represented by a Qube with approximately **3,000 nodes** in about **11 MB** of memory.
+
+## What's Next
+
+- [Under the Hood: Algorithms](./algorithms.md) β how set operations and compression work internally.
+- [Quickstart](./quickstart.md) β build and manipulate Qubes hands-on.
diff --git a/docs/src/index.md b/docs/src/index.md
new file mode 100644
index 00000000..71deae10
--- /dev/null
+++ b/docs/src/index.md
@@ -0,0 +1,65 @@
+# Qubed
+
+**Qubed** is a Rust library (with Python bindings) for working with **trees of datacubes** β a compressed data structure that efficiently represents large, sparse collections of key-value identifiers.
+
+## What is a Qube?
+
+In many domains β particularly meteorological data β datasets are labelled by sets of key-value pairs called *identifiers*:
+
+```
+{ class: "od", expver: "0001", param: "1", levtype: "sfc" }
+```
+
+When datasets are dense (every combination of key values exists), they can be represented as a single datacube. In practice, however, datasets are **sparse** β not every combination is valid. A Qube represents these sparse datasets as a **compressed tree of dense datacubes**, achieving massive compression while still supporting efficient operations.
+
+For example, a dataset with over **1 billion** distinct identifiers can be stored in a Qube with just a **few thousand nodes**, fitting in a few megabytes of memory.
+
+## At a Glance
+
+```
+root
+βββ class=od, expver=0001/0002, param=1/2
+βββ class=rd
+ βββ expver=0001, param=1/2/3
+ βββ expver=0002, param=1/2
+```
+
+This tree represents **9 unique identifiers** using only **5 nodes** instead of 9 leaf entries. Each path from root to leaf defines a dense datacube; the tree as a whole represents their union.
+
+## Key Features
+
+- **Compression** β automatically merges sibling nodes with identical subtree structure, reducing tree size dramatically.
+- **Set operations** β union, intersection, difference, and symmetric difference, all operating directly on the compressed form.
+- **Selection & filtering** β query the tree by dimension and coordinate values.
+- **Multiple serialization formats** β ASCII tree, nested JSON, arena JSON (BFS flat array), and DSS constraints (array-of-maps).
+- **Adapters** β ingest from MARS list format, FDB path lists, and DSS constraint JSON.
+- **Python bindings** β full access to Qube construction, serialization, and adapter functionality from Python via PyO3.
+
+## Crate Organization
+
+| Crate | Purpose |
+|---|---|
+| `qubed` | Core data structure: Qube, Coordinates, compression, selection, serialization |
+| `qubed-meteo` | Domain-specific adapters: MARS list parser, FDB list parser, DSS constraints |
+| `py_qubed` | Python bindings for the core `qubed` crate |
+| `py_qubed_meteo` | Python bindings for the `qubed-meteo` adapters |
+
+## Getting Started
+
+- For **conceptual background**, see [Background: Datacubes, Trees and Compressed Trees](./background.md).
+- For a **hands-on tutorial**, jump to the [Quickstart](./quickstart.md).
+- For **Rust API details**, see [qubed](./rust/qubed.md) and [qubed-meteo](./rust/qubed-meteo.md).
+- For **Python API details**, see [py_qubed](./python/py_qubed.md) and [py_qubed_meteo](./python/py_qubed_meteo.md).
+
+## Building the Book
+
+```bash
+# Install mdbook if needed
+cargo install mdbook
+
+# Build
+mdbook build docs
+
+# Serve locally with live-reload
+mdbook serve docs -o
+```
diff --git a/docs/src/python/py_qubed.md b/docs/src/python/py_qubed.md
new file mode 100644
index 00000000..c8aed0d6
--- /dev/null
+++ b/docs/src/python/py_qubed.md
@@ -0,0 +1,249 @@
+# py_qubed β Python Bindings
+
+The `py_qubed` package exposes the core `qubed` Rust library to Python via PyO3. It provides the `PyQube` class (importable as `qubed.PyQube`) for building, manipulating, and serializing Qubes from Python.
+
+## Installation
+
+```bash
+cd py_qubed
+maturin develop --release
+```
+
+Then in Python:
+
+```python
+from qubed import PyQube
+```
+
+---
+
+## PyQube Class
+
+### Construction
+
+#### `PyQube()`
+
+Create an empty Qube.
+
+```python
+q = PyQube()
+```
+
+#### `PyQube.from_ascii(text: str) -> PyQube`
+
+Parse an ASCII tree representation:
+
+```python
+q = PyQube.from_ascii("""root
+βββ class=od
+β βββ expver=0001/0002, param=1/2
+βββ class=rd
+ βββ expver=0001, param=1/2/3
+ βββ expver=0002, param=1/2""")
+```
+
+#### `PyQube.from_arena_json(json_str: str) -> PyQube`
+
+Reconstruct a Qube from arena JSON (a flat BFS array produced by `to_arena_json`):
+
+```python
+import json
+
+arena_str = q.to_arena_json()
+restored = PyQube.from_arena_json(arena_str)
+```
+
+---
+
+### Serialization
+
+#### `to_ascii() -> str`
+
+Return the human-readable ASCII tree representation:
+
+```python
+print(q.to_ascii())
+# root
+# βββ class=od, expver=0001/0002, param=1/2
+# βββ class=rd
+# βββ expver=0001, param=1/2/3
+# βββ expver=0002, param=1/2
+```
+
+Also available as `str(q)` (via `__str__`).
+
+#### `to_arena_json() -> str`
+
+Return a JSON string containing a flat BFS array of node records:
+
+```python
+import json
+
+arena = json.loads(q.to_arena_json())
+for node in arena:
+ print(node["dim"], node["coords"])
+```
+
+Each record: `{ "dim": "class", "coords": "od/rd", "parent": 0, "children": [1, 2] }`
+
+#### `to_datacubes() -> list[dict]`
+
+Decompose into a list of datacube dictionaries. Each dict maps dimension names to coordinate strings:
+
+```python
+for dc in q.to_datacubes():
+ print(dc)
+# {'class': 'od', 'expver': '0001/0002', 'param': '1/2'}
+# {'class': 'rd', 'expver': '0001', 'param': '1/2/3'}
+# ...
+```
+
+---
+
+### Merging
+
+#### `append(other: PyQube) -> None`
+
+Merge another Qube into this one. The result is automatically compressed. `other` becomes empty.
+
+```python
+a = PyQube.from_ascii("root\nβββ class=od, param=1")
+b = PyQube.from_ascii("root\nβββ class=rd, param=2")
+a.append(b)
+print(a)
+```
+
+#### `append_many(others: list[PyQube]) -> None`
+
+Merge multiple Qubes at once:
+
+```python
+base = PyQube()
+qubes = [PyQube.from_ascii(f"root\nβββ class=c{i}, param=1") for i in range(100)]
+base.append_many(qubes)
+```
+
+---
+
+### Manipulation
+
+#### `compress() -> None`
+
+Compress the Qube in-place. Merges structurally identical sibling nodes, removes empty nodes, and deduplicates. Called automatically by `append` and `append_many`.
+
+```python
+q.compress()
+```
+
+#### `drop(dims: list[str]) -> None`
+
+Remove one or more dimensions from the tree. Children of removed nodes are re-parented to the grandparent, preserving the rest of the structure. The result is automatically compressed.
+
+```python
+q = PyQube.from_ascii("""root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1/2
+ βββ expver=0002
+ βββ param=1/2""")
+
+q.drop(["expver"])
+print(q)
+# root
+# βββ class=1
+# βββ param=1/2
+```
+
+#### `squeeze() -> None`
+
+Drop all dimensions that have only a single coordinate value. Equivalent to calling `drop` on every dimension whose union of values has length 1.
+
+```python
+q = PyQube.from_ascii("""root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1/2
+ βββ expver=0002
+ βββ param=1/2""")
+
+q.squeeze()
+print(q)
+# root
+# βββ expver=0001/0002
+# βββ param=1/2
+```
+
+---
+
+### Query
+
+#### `all_unique_dim_coords() -> dict[str, list[str]]`
+
+Return a dictionary mapping each dimension name to a list of all coordinate values that appear anywhere in the Qube.
+
+```python
+coords = q.all_unique_dim_coords()
+# {'class': ['1'], 'expver': ['0001', '0002'], 'param': ['1', '2']}
+```
+
+#### `select(request: dict, mode: str | None, consume: bool | None) -> PyQube`
+
+Return a new Qube containing only the identifiers that satisfy the request. Each key in `request` is a dimension name; values may be a single string/int or a list.
+
+`mode` controls behaviour for dimensions absent in a branch:
+- `None` / any other string β default: keep branches that have at least one matching value.
+- `"prune"` β additionally remove branches that are missing any requested dimension entirely.
+
+```python
+selected = q.select({"class": [1], "param": [1, 2]}, None, None)
+```
+
+---
+
+### Special Methods
+
+| Method | Description |
+|---|---|
+| `__str__()` | Same as `to_ascii()` |
+| `__repr__()` | Returns `PyQube(root_id=...)` |
+| `__len__()` | Returns `datacube_count()` β the number of leaf identifiers |
+
+```python
+q = PyQube.from_ascii("root\nβββ class=od, param=1/2\nβββ class=rd, param=3")
+print(len(q)) # 3
+```
+
+---
+
+## Complete Example
+
+```python
+from qubed import PyQube
+import json
+
+# Build from ASCII
+q = PyQube.from_ascii("""root
+βββ class=od
+β βββ expver=0001/0002, param=1/2
+βββ class=rd
+ βββ expver=0001, param=1/2/3
+ βββ expver=0002, param=1/2""")
+
+# Inspect
+print(f"Identifiers: {len(q)}")
+print(q)
+
+# Decompose to datacubes
+for dc in q.to_datacubes():
+ print(dc)
+
+# Roundtrip through arena JSON
+arena = q.to_arena_json()
+restored = PyQube.from_arena_json(arena)
+assert str(q) == str(restored)
+
+# Merge two qubes
+other = PyQube.from_ascii("root\nβββ class=xd, expver=0001, param=99")
+q.append(other)
+print(q)
+```
diff --git a/docs/src/python/py_qubed_meteo.md b/docs/src/python/py_qubed_meteo.md
new file mode 100644
index 00000000..fb44c5b5
--- /dev/null
+++ b/docs/src/python/py_qubed_meteo.md
@@ -0,0 +1,134 @@
+# py_qubed_meteo β Python Adapters
+
+The `py_qubed_meteo` package exposes the `qubed-meteo` adapter crate to Python via PyO3. It provides standalone functions for parsing MARS lists, FDB path lists, and converting Qubes to DSS constraint format.
+
+## Installation
+
+```bash
+cd py_qubed_meteo
+maturin develop --release
+```
+
+Then in Python:
+
+```python
+from qubed_meteo import from_mars_list_py, from_fdb_list_py, to_dss_constraints_py
+```
+
+---
+
+## Functions
+
+### `from_mars_list_py(text: str) -> str`
+
+Parse MARS list text and return the resulting Qube as an ASCII string. The returned string can be passed to `PyQube.from_ascii()` to get a `PyQube` object.
+
+**Input format:** Indentation-based MARS listing where indented lines are children of preceding less-indented lines. Tokens are comma-separated `key=value` pairs; values can be slash-separated.
+
+```python
+from qubed_meteo import from_mars_list_py
+from qubed import PyQube
+
+mars_text = """class=od, expver=0001
+ param=1/2
+ param=3
+class=rd, expver=0002
+ param=4"""
+
+ascii = from_mars_list_py(mars_text)
+q = PyQube.from_ascii(ascii)
+print(q)
+```
+
+---
+
+### `from_fdb_list_py(items: list[str]) -> str`
+
+Build a Qube from a list of FDB-style comma-separated path strings. Returns an ASCII Qube string.
+
+Each string is a comma-separated sequence of `key=value` segments (e.g. `"class=od,expver=0001,param=1/2"`).
+
+```python
+from qubed_meteo import from_fdb_list_py
+from qubed import PyQube
+
+items = [
+ "class=od,expver=0001,param=1/2",
+ "class=rd,expver=0003,param=3/4",
+ "class=rd,expver=0002,param=3/4",
+]
+
+ascii = from_fdb_list_py(items)
+q = PyQube.from_ascii(ascii)
+print(q)
+# root
+# βββ class=od
+# β βββ expver=0001
+# β βββ param=1/2
+# βββ class=rd
+# βββ expver=0002/0003
+# βββ param=3/4
+```
+
+---
+
+### `to_dss_constraints_py(ascii: str) -> str`
+
+Convert an ASCII Qube string to DSS-style constraints JSON. Returns a JSON string (array of maps).
+
+```python
+from qubed_meteo import to_dss_constraints_py
+import json
+
+ascii = """root
+βββ class=od, expver=0001/0002, param=1/2
+βββ class=rd, expver=0003, param=3/4"""
+
+constraints_json = to_dss_constraints_py(ascii)
+constraints = json.loads(constraints_json)
+
+for c in constraints:
+ print(c)
+# {"class": ["od"], "expver": ["0001", "0002"], "param": ["1", "2"]}
+# {"class": ["rd"], "expver": ["0003"], "param": ["3", "4"]}
+```
+
+Each object in the array has the same set of dimension keys. Dimensions not present in a particular datacube get an empty array `[]`.
+
+---
+
+## Complete Workflow Example
+
+```python
+from qubed import PyQube
+from qubed_meteo import from_fdb_list_py, to_dss_constraints_py
+import json
+
+# 1. Ingest from FDB listing
+fdb_items = [
+ "class=od,expver=0001,param=1/2",
+ "class=od,expver=0002,param=1/2",
+ "class=rd,expver=0001,param=1/2/3",
+]
+
+qube = PyQube.from_ascii(from_fdb_list_py(fdb_items))
+print(f"Built qube with {len(qube)} identifiers")
+print(qube)
+
+# 2. Export to DSS constraints
+constraints = json.loads(to_dss_constraints_py(str(qube)))
+print(json.dumps(constraints, indent=2))
+
+# 3. Merge with another qube
+extra = PyQube.from_ascii("root\nβββ class=xd, expver=0001, param=99")
+qube.append(extra)
+print(qube)
+```
+
+---
+
+## Notes
+
+- All adapter functions return ASCII strings as a lightweight bridge format. Use `PyQube.from_ascii()` to convert to a full `PyQube` object.
+- Leading zeros in coordinate values (e.g. `"0001"`) are preserved through all adapter functions.
+- The functions raise `ValueError` on parse failures.
diff --git a/docs/src/quickstart.md b/docs/src/quickstart.md
new file mode 100644
index 00000000..5355a430
--- /dev/null
+++ b/docs/src/quickstart.md
@@ -0,0 +1,333 @@
+# Quickstart
+
+This chapter walks through building, manipulating, and querying Qubes using the Rust API. For the equivalent Python API, see the [Python bindings](./python/py_qubed.md) chapter.
+
+## Creating a Qube
+
+### From ASCII Representation
+
+The most readable way to build a Qube is from its ASCII tree representation:
+
+```rust
+use qubed::Qube;
+
+let q = Qube::from_ascii(r#"root
+βββ class=od
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=rd
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"#).unwrap();
+
+println!("{}", q.to_ascii());
+```
+
+Each line takes the form `key=value` where multiple values are separated by `/`:
+
+```
+root
+βββ class=od, expver=0001/0002, param=1/2
+```
+
+### From Nested JSON
+
+You can also build a Qube from a JSON object where keys are `"dimension=values"` strings:
+
+```rust
+use qubed::Qube;
+use serde_json::json;
+
+let q = Qube::from_json(json!({
+ "class=od": {
+ "expver=0001/0002": {
+ "param=1/2": {}
+ }
+ },
+ "class=rd": {
+ "expver=0001": { "param=1/2/3": {} },
+ "expver=0002": { "param=1/2": {} }
+ }
+})).unwrap();
+```
+
+### Programmatically
+
+Build a Qube node by node:
+
+```rust
+use qubed::{Qube, Coordinates};
+
+let mut q = Qube::new();
+let root = q.root();
+
+// Create coordinate values
+let class_coords = Coordinates::from_string("od");
+let child = q.create_child("class", root, Some(class_coords)).unwrap();
+
+let exp_coords = Coordinates::from_string("0001/0002");
+let exp = q.create_child("expver", child, Some(exp_coords)).unwrap();
+
+let param_coords = Coordinates::from_string("1/2");
+q.create_child("param", exp, Some(param_coords)).unwrap();
+```
+
+### From a Datacube
+
+Build a Qube from a `Datacube` (a flat map of dimensions to coordinates):
+
+```rust
+use qubed::{Datacube, Qube, Coordinates};
+
+let mut dc = Datacube::new();
+dc.add_coordinate("class", Coordinates::from_string("od/rd"));
+dc.add_coordinate("expver", Coordinates::from_string("0001/0002"));
+dc.add_coordinate("param", Coordinates::from_string("1/2"));
+
+let order = vec!["class".to_string(), "expver".to_string(), "param".to_string()];
+let q = Qube::from_datacube(&dc, Some(&order));
+```
+
+## Compression
+
+Compression merges sibling nodes with identical subtree structure. This is the defining operation of Qubed β it keeps trees compact without losing information.
+
+```rust
+let mut q = Qube::from_ascii(r#"root
+βββ class=od
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=rd
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"#).unwrap();
+
+q.compress();
+println!("{}", q.to_ascii());
+// root
+// βββ class=od/rd, expver=0001/0002, param=1/2
+```
+
+After compression, the number of leaf identifiers is preserved but the tree has far fewer nodes.
+
+## Selection
+
+Select a subset of the tree by providing dimension constraints:
+
+```rust
+use qubed::Qube;
+use qubed::select::SelectMode;
+
+let q = Qube::from_ascii(r#"root
+βββ class=od
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=rd
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"#).unwrap();
+
+// Select only class=od, param=1
+let selection = [("class", &[1]), ("param", &[1])];
+let result = q.select(&selection, SelectMode::Default).unwrap();
+println!("{}", result.to_ascii());
+```
+
+**SelectMode::Prune** additionally removes branches that don't contain all selected dimensions.
+
+## Union (Append)
+
+Merge two Qubes together. The result contains all identifiers from both:
+
+```rust
+let mut a = Qube::from_ascii(r#"root
+βββ class=od, expver=0001, param=1/2"#).unwrap();
+
+let mut b = Qube::from_ascii(r#"root
+βββ class=rd, expver=0002, param=3/4"#).unwrap();
+
+a.append(&mut b);
+// b is now empty; a contains the union, automatically compressed
+println!("{}", a.to_ascii());
+```
+
+For merging many Qubes at once, `append_many` is more efficient β it performs intermediate compression every 500 merges:
+
+```rust
+let mut base = Qube::new();
+let mut others: Vec = vec![/* ... */];
+base.append_many(&mut others);
+```
+
+## Iteration
+
+### Datacubes
+
+Decompose the Qube back into individual dense datacubes. Each datacube is a `HashMap`:
+
+```rust
+let datacubes = q.to_datacubes();
+for dc in &datacubes {
+ for (dim, coords) in dc.coordinates() {
+ println!(" {} = {}", dim, coords.to_string());
+ }
+}
+```
+
+### Leaf Count
+
+Get the number of individual identifiers without expanding:
+
+```rust
+let count = q.datacube_count();
+println!("This qube contains {} identifiers", count);
+```
+
+## Serialization
+
+### ASCII
+
+Human-readable tree format, useful for debugging and display:
+
+```rust
+let ascii = q.to_ascii();
+let roundtrip = Qube::from_ascii(&ascii).unwrap();
+```
+
+### Nested JSON
+
+Keys are `"dimension=values"` strings, values are child objects:
+
+```rust
+let json_val = q.to_json();
+let json_str = serde_json::to_string_pretty(&json_val).unwrap();
+let roundtrip = Qube::from_json(json_val).unwrap();
+```
+
+### Arena JSON
+
+A flat BFS array of node records β more suitable for programmatic consumption and web transport:
+
+```rust
+let arena = q.to_arena_json();
+// Each entry: { "dim": "class", "coords": "od/rd", "parent": 0, "children": [1, 2] }
+let restored = Qube::from_arena_json(arena).unwrap();
+```
+
+Each node in the array contains:
+- `dim` β dimension name (e.g. `"class"`)
+- `coords` β coordinate values as a `/`-separated string
+- `parent` β index of the parent node (or `null` for root)
+- `children` β array of child node indices
+
+## Coordinate Types
+
+The `Coordinates` enum supports multiple value types and automatically categorizes them:
+
+| Variant | Stores | Example |
+|---|---|---|
+| `Empty` | No values | (default for root) |
+| `Integers` | Sorted `i32` values | `1/2/3` |
+| `Floats` | Sorted `f64` values | `0.1/0.5` |
+| `Strings` | Sorted string values | `od/rd` |
+| `Mixed` | Combination of above | `1/od/0.5` |
+
+### Leading Zero Preservation
+
+Values with leading zeros (like `"0001"`) are preserved as strings rather than parsed as integers. The detection logic: if a token has length > 1, starts with `'0'`, and the second character is a digit, it's stored as a `String`.
+
+```rust
+let coords = Coordinates::from_string("0001/0002");
+assert_eq!(coords.to_string(), "0001/0002"); // NOT "1/2"
+```
+
+### Operations on Coordinates
+
+```rust
+use qubed::Coordinates;
+
+// Append values
+let mut c = Coordinates::new();
+c.append(1_i32);
+c.append(2_i32);
+
+// Extend from another
+let other = Coordinates::from_string("3/4");
+c.extend(&other);
+
+// Intersect
+let a = Coordinates::from_string("1/2/3");
+let b = Coordinates::from_string("2/3/4");
+let result = a.intersect(&b);
+// result.intersection = [2, 3]
+// result.only_a = [1]
+// result.only_b = [4]
+```
+
+## Tree Inspection
+
+```rust
+// Check if a qube has any content
+let is_empty = q.is_empty();
+
+// Get the number of leaf datacubes
+let n = q.datacube_count();
+
+// Get all unique dimensionβcoordinates pairs across the entire tree
+let all = q.all_unique_dim_coords();
+for (dim, coords) in &all {
+ println!("{}: {}", dim, coords.to_string());
+}
+```
+
+## Node Navigation
+
+Access individual nodes via `NodeRef`:
+
+```rust
+let root = q.root();
+let root_node = q.node(root).unwrap();
+
+// Dimension name
+let dim = root_node.dimension(); // Some("root")
+
+// Coordinates
+let coords = root_node.coordinates();
+
+// Iterate children
+for child_id in root_node.all_children() {
+ let child = q.node(child_id).unwrap();
+ println!("{} = {}", child.dimension().unwrap(), child.coordinates().to_string());
+}
+
+// Get all dimensions in subtree
+let dims = root_node.span();
+
+// Walk ancestors
+for ancestor_id in root_node.ancestors() {
+ // ...
+}
+```
diff --git a/docs/src/rust/qubed-meteo.md b/docs/src/rust/qubed-meteo.md
new file mode 100644
index 00000000..dd46c142
--- /dev/null
+++ b/docs/src/rust/qubed-meteo.md
@@ -0,0 +1,193 @@
+# qubed-meteo β Adapters
+
+The `qubed-meteo` crate provides domain-specific adapters for ingesting meteorological metadata into Qubes and exporting them to external formats.
+
+**Cargo.toml:**
+```toml
+[dependencies]
+qubed-meteo = { path = "qubed-meteo" }
+```
+
+---
+
+## FromMARSList β MARS List Parser
+
+**Trait:** `qubed_meteo::adapters::mars_list::FromMARSList`
+
+```rust
+fn from_mars_list(mars_list: &str) -> Result
+```
+
+Parses indentation-based MARS list text into a Qube. This is the format produced by ECMWF's MARS listing tools, where indentation indicates parent-child relationships.
+
+### Input Format
+
+```
+class=od, expver=0001
+ param=1/2
+ param=3
+class=rd, expver=0002
+ param=4
+```
+
+- **Lines** are split by commas into tokens of the form `key=value`.
+- **Indentation** determines hierarchy: indented lines are children of the preceding less-indented line.
+- **Slash-separated values** (e.g. `param=1/2`) become multiple coordinate values.
+- The resulting tree is automatically compressed.
+
+### Parsing Rules
+
+1. If a line has deeper indentation than the previous line, its tokens become a chain under the last node of the previous line.
+2. If a line has equal or shallower indentation, it chains under the nearest ancestor in the indentation stack.
+3. Values with leading zeros (e.g. `0001`) are preserved as strings.
+
+### Example
+
+```rust
+use qubed::Qube;
+use qubed_meteo::adapters::mars_list::FromMARSList;
+
+let mars_text = "class=od, expver=0001\n param=1/2\nclass=rd, expver=0002\n param=3/4";
+let qube = Qube::from_mars_list(mars_text).unwrap();
+println!("{}", qube.to_ascii());
+```
+
+---
+
+## FromFDBList β FDB Path Parser
+
+**Trait:** `qubed_meteo::adapters::fdb::FromFDBList`
+
+```rust
+fn from_fdb_list(request_map: &serde_json::Value) -> Result
+```
+
+Builds a Qube from FDB-style comma-separated path strings, as produced by the `rsfdb` listing tools.
+
+### Input Format
+
+Each item is a comma-separated sequence of `key=value` segments:
+
+```
+class=od,expver=0001,param=1/2
+class=rd,expver=0003,param=3/4
+```
+
+- Each segment's values can be slash-separated for multiple coordinates.
+- Segments without `=` become dimension-only nodes (no coordinates).
+- Values with leading zeros are preserved as strings.
+- The resulting tree is automatically compressed.
+
+### Example
+
+```rust
+use qubed::Qube;
+use qubed_meteo::adapters::fdb::FromFDBList;
+use serde_json::json;
+
+let request_map = json!({
+ "class" : "od",
+ "expver" : "0001",
+ "stream" : "oper",
+ "time" : "0000",
+ "domain" : "g",
+ "levtype" : "sfc",
+});
+
+let qube = Qube::from_fdb_list(&request_map).unwrap();
+println!("{}", qube.to_ascii());
+```
+
+---
+
+## ToDssConstraints β DSS Constraints Exporter
+
+**Trait:** `qubed_meteo::adapters::to_constraints::ToDssConstraints`
+
+```rust
+fn to_dss_constraints(&self) -> serde_json::Value
+```
+
+Converts a Qube into a JSON array of constraint objects, one per leaf-path datacube. Every object contains the same set of dimension keys (the union across all datacubes); dimensions not present in a particular datacube get an empty array.
+
+### Output Format
+
+```json
+[
+ {
+ "class": ["od"],
+ "expver": ["0001", "0002"],
+ "param": ["1", "2"]
+ },
+ {
+ "class": ["rd"],
+ "expver": ["0003"],
+ "param": ["3", "4"]
+ }
+]
+```
+
+- The `"root"` dimension is excluded from the output.
+- Coordinate values are serialized as string arrays (split on `/`).
+
+### Example
+
+```rust
+use qubed::Qube;
+use qubed_meteo::adapters::to_constraints::ToDssConstraints;
+
+let q = Qube::from_ascii(r#"root
+βββ class=od, expver=0001/0002, param=1/2
+βββ class=rd, expver=0003, param=3/4"#).unwrap();
+
+let constraints = q.to_dss_constraints();
+println!("{}", serde_json::to_string_pretty(&constraints).unwrap());
+```
+
+---
+
+## FromDssConstraints β DSS Constraints Importer
+
+**Trait:** `qubed_meteo::adapters::dss_constraints::FromDssConstraints`
+
+```rust
+fn from_dss_constraints(dss_constraints: &serde_json::Value) -> Result
+```
+
+Rebuilds a Qube from DSS-style constraint JSON (array of maps). Each map in the array is parsed as a `Datacube`, then all datacubes are merged with `append_many`.
+
+A built-in dimension ordering is applied (origin, forecast_type, hday, day, hmonth, hyear, year, month, time, leadtime_hour, level_type, variable) to produce a consistent tree structure.
+
+### Example
+
+```rust
+use qubed::Qube;
+use qubed_meteo::adapters::dss_constraints::FromDssConstraints;
+use serde_json::json;
+
+let constraints = json!([
+ { "class": ["od"], "expver": ["0001"], "param": ["1", "2"] },
+ { "class": ["rd"], "expver": ["0002"], "param": ["3"] }
+]);
+
+let qube = Qube::from_dss_constraints(&constraints).unwrap();
+println!("{}", qube.to_ascii());
+```
+
+---
+
+## Leading Zero Preservation
+
+All adapters use the same detection logic for preserving leading zeros:
+
+```
+if token.len() > 1
+ && token.starts_with('0')
+ && token[1].is_ascii_digit()
+then
+ β store as String (e.g. "0001")
+else
+ β try parse as i32, then f64, then String
+```
+
+This ensures values like `"0001"` or `"0042"` round-trip correctly through serialization, while plain numbers like `"1"` or `"42"` are stored as integers.
diff --git a/docs/src/rust/qubed.md b/docs/src/rust/qubed.md
new file mode 100644
index 00000000..20eaa5cf
--- /dev/null
+++ b/docs/src/rust/qubed.md
@@ -0,0 +1,274 @@
+# qubed β Core Library
+
+The `qubed` crate provides the core `Qube` data structure, `Coordinates` types, compression, selection, serialization, and datacube conversion.
+
+**Cargo.toml:**
+```toml
+[dependencies]
+qubed = { path = "qubed" }
+```
+
+---
+
+## Qube
+
+The central type. A Qube is a slot-map-backed tree where each node has a dimension name, a set of coordinate values, and children grouped by dimension.
+
+### Construction
+
+| Method | Signature | Description |
+|---|---|---|
+| `new` | `fn new() -> Qube` | Create an empty Qube with just a root node |
+| `from_ascii` | `fn from_ascii(input: &str) -> Result` | Parse an ASCII tree representation |
+| `from_json` | `fn from_json(value: Value) -> Result` | Parse a nested JSON object |
+| `from_arena_json` | `fn from_arena_json(value: Value) -> Result` | Parse a BFS flat-array JSON layout |
+| `from_datacube` | `fn from_datacube(dc: &Datacube, order: Option<&[String]>) -> Qube` | Build from a flat datacube with optional dimension ordering |
+
+**Example β from ASCII:**
+```rust
+use qubed::Qube;
+
+let q = Qube::from_ascii(r#"root
+βββ class=od
+β βββ expver=0001, param=1/2
+β βββ expver=0002, param=1/2
+βββ class=rd
+ βββ expver=0001, param=1/2/3
+ βββ expver=0002, param=1/2"#).unwrap();
+```
+
+**Example β from nested JSON:**
+```rust
+use qubed::Qube;
+use serde_json::json;
+
+let q = Qube::from_json(json!({
+ "class=od": {
+ "expver=0001/0002": { "param=1/2": {} }
+ },
+ "class=rd": {
+ "expver=0001": { "param=1/2/3": {} },
+ "expver=0002": { "param=1/2": {} }
+ }
+})).unwrap();
+```
+
+### Tree Modification
+
+| Method | Signature | Description |
+|---|---|---|
+| `create_child` | `fn create_child(&mut self, key: &str, parent: NodeIdx, coords: Option) -> Result` | Create a child node. Returns existing node if an identical child already exists. |
+| `get_or_create_child` | `fn get_or_create_child(&mut self, key: &str, parent_id: NodeIdx, coordinates: Option) -> Result` | Return the existing child with the given dimension+coordinates, or create a new one. |
+| `check_if_new_child` | `fn check_if_new_child(&mut self, key: &str, parent_id: NodeIdx, coordinates: Option) -> Result` | Return `true` if no child with the given dimension+coordinates exists yet. |
+| `remove_node` | `fn remove_node(&mut self, id: NodeIdx) -> Result<(), String>` | Remove a node and all its descendants |
+| `append` | `fn append(&mut self, other: &mut Qube)` | Union: merge `other` into `self`, compress, then clear `other` |
+| `append_many` | `fn append_many(&mut self, others: &mut Vec)` | Merge many Qubes with periodic compression (every 500) |
+| `append_datacube` | `fn append_datacube(&mut self, dc: Datacube, order: Option<&[String]>, accept_existing_order: bool)` | Append a single Datacube |
+| `drop` | `fn drop(&mut self, to_drop: I) -> Result<(), String>` | Remove one or more dimensions, re-parenting their children, then compress |
+| `squeeze` | `fn squeeze(&mut self) -> Result<(), String>` | Drop every dimension whose union of values has length 1 |
+
+**Example β building programmatically:**
+```rust
+use qubed::{Qube, Coordinates};
+
+let mut q = Qube::new();
+let root = q.root();
+
+let class = q.create_child("class", root,
+ Some(Coordinates::from_string("od"))).unwrap();
+let expver = q.create_child("expver", class,
+ Some(Coordinates::from_string("0001/0002"))).unwrap();
+q.create_child("param", expver,
+ Some(Coordinates::from_string("1/2"))).unwrap();
+```
+
+**Example β union:**
+```rust
+let mut a = Qube::from_ascii("root\nβββ class=od, param=1").unwrap();
+let mut b = Qube::from_ascii("root\nβββ class=rd, param=2").unwrap();
+a.append(&mut b);
+// a now contains both branches, compressed; b is empty
+```
+
+**Example β drop:**
+```rust
+let mut q = Qube::from_ascii(r#"root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1/2
+ βββ expver=0002
+ βββ param=1/2"#).unwrap();
+
+q.drop(vec!["expver"]).unwrap();
+// expver is removed; param nodes are re-parented under class
+```
+
+**Example β squeeze:**
+```rust
+let mut q = Qube::from_ascii(r#"root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1/2
+ βββ expver=0002
+ βββ param=1/2"#).unwrap();
+
+q.squeeze().unwrap();
+// class=1 is the only value for that dimension, so it is dropped
+```
+
+### Compression
+
+```rust
+fn compress(&mut self)
+```
+
+Compress the tree in-place. Three phases:
+
+1. **Recursive merge** β bottom-up, siblings with the same structural hash have their coordinates merged.
+2. **Prune** β nodes with `Coordinates::Empty` are removed.
+3. **Dedup** β structurally identical siblings are collapsed.
+
+Called automatically by `append` and `append_many`.
+
+### Selection
+
+```rust
+fn select(&self, selection: &[(&str, C)], mode: SelectMode) -> Result
+where C: Into + Clone
+```
+
+Returns a new Qube containing only identifiers matching the constraints. `C` can be `&[i32]`, `Coordinates`, or other `Into` types.
+
+```rust
+fn prune(&mut self, node_id: NodeIdx, has_none_of: HashSet<&str>)
+```
+
+Remove branches that don't contain **all** of the specified dimensions.
+
+**SelectMode:**
+- `Default` β keep branches with at least one matching value per constrained dimension.
+- `Prune` β additionally remove branches missing any selected dimension entirely.
+
+### Serialization
+
+| Method | Returns | Format |
+|---|---|---|
+| `to_ascii()` | `String` | Human-readable tree with `βββ`/`βββ` connectors |
+| `to_json()` | `Value` | Nested JSON: `{ "key=values": { children } }` |
+| `to_arena_json()` | `Value` | BFS flat array: `[{ dim, coords, parent, children }]` |
+
+**Arena JSON node record:**
+```json
+{ "dim": "class", "coords": "od/rd", "parent": null, "children": [1, 2] }
+```
+
+### Iteration & Inspection
+
+| Method | Signature | Description |
+|---|---|---|
+| `to_datacubes` | `fn to_datacubes(&self) -> Vec` | Decompose into leaf-path datacubes |
+| `datacube_count` | `fn datacube_count(&self) -> usize` | Count leaf identifiers without expansion |
+| `is_empty` | `fn is_empty(&self) -> bool` | True if root has no children and no coordinates |
+| `all_unique_dim_coords` | `fn all_unique_dim_coords(&mut self) -> BTreeMap` | Union of all coordinates per dimension |
+| `root` | `fn root(&self) -> NodeIdx` | Root node index |
+| `node` | `fn node(&self, id: NodeIdx) -> Option` | Read-only reference to a node |
+| `dimension` | `fn dimension(&self, s: &str) -> Option` | Look up dimension by name |
+| `dimension_str` | `fn dimension_str(&self, d: &Dimension) -> Option<&str>` | Get dimension name string |
+
+---
+
+## NodeRef
+
+Read-only reference to a node in the Qube tree.
+
+| Method | Returns | Description |
+|---|---|---|
+| `id()` | `NodeIdx` | Slot-map key |
+| `dimension()` | `Option<&str>` | Dimension name (e.g. `"class"`) |
+| `coordinates()` | `&Coordinates` | Coordinate values |
+| `child_dimensions()` | `impl Iterator- ` | Distinct child dimension keys |
+| `children(key)` | `Option
>` | Children under a specific dimension |
+| `all_children()` | `impl Iterator- ` | All children across all dimensions |
+| `children_count()` | `usize` | Total direct children |
+| `coordinates_count()` | `usize` | Number of coordinate values |
+| `parent()` | `Option
` | Parent index |
+| `parent_node()` | `Option` | Parent as NodeRef |
+| `ancestors()` | `impl Iterator- ` | Walk up to root |
+| `span()` | `HashSet
` | All unique dimensions in subtree |
+| `structural_hash()` | `Option` | Cached structural hash |
+
+---
+
+## Coordinates
+
+A typed, ordered set of coordinate values.
+
+### Variants
+
+| Variant | Storage | Example |
+|---|---|---|
+| `Empty` | β | Default for root |
+| `Integers` | Sorted `i32` | `1/2/3` |
+| `Floats` | Sorted `f64` | `0.1/0.5` |
+| `Strings` | Sorted `String` | `od/rd` |
+| `Mixed` | All three | `1/od/0.5` |
+
+### Construction
+
+| Method | Description |
+|---|---|
+| `Coordinates::new()` | Empty coordinates |
+| `Coordinates::from_string(s)` | Parse `\|`-separated string (also handles `/` in ASCII context) |
+| `From`, `From`, `From` | Single-value construction |
+| `FromIterator`, `FromIterator`, `FromIterator` | Build from iterators |
+
+**Leading zero preservation:** tokens with length > 1 that start with `'0'` followed by a digit are stored as `String` to preserve formatting (e.g. `"0001"` stays `"0001"`, not `1`).
+
+### Modification
+
+| Method | Description |
+|---|---|
+| `append(value)` | Add a single value; auto-promotes to `Mixed` if types differ |
+| `extend(&other)` | Merge values from another `Coordinates` |
+| `extend_from_iter(iter)` | Extend from an iterator |
+
+### Query
+
+| Method | Description |
+|---|---|
+| `to_string()` | `/`-separated string |
+| `len()` | Value count |
+| `is_empty()` | True if no values |
+| `contains(value)` | Membership check (integers only currently) |
+
+### Set Operations
+
+| Method | Description |
+|---|---|
+| `intersect(&other)` | Returns `IntersectionResult { intersection, only_a, only_b }` |
+| `merge_coords(&other)` | Union (intersection + only_a + only_b combined) |
+
+---
+
+## Datacube
+
+A flat `HashMap` representing one dense datacube.
+
+| Method | Description |
+|---|---|
+| `new()` | Create empty |
+| `add_coordinate(dim, coords)` | Add a dimension |
+| `coordinates()` | Access the map |
+| `is_empty()` / `len()` | Check dimensions |
+
+---
+
+## Key Types Summary
+
+| Type | Description |
+|---|---|
+| `NodeIdx` | SlotMap key for node identity |
+| `Dimension` | Interned string key (`MiniSpur` from `lasso`) |
+| `IntersectionResult` | `{ intersection, only_a, only_b }` |
+| `SelectMode` | `Default` or `Prune` |
+| `CoordinateTypes` | `Integer(i32)`, `Float(f64)`, `String(String)` |
diff --git a/docs/test_docs.sh b/docs/test_docs.sh
deleted file mode 100755
index d866def1..00000000
--- a/docs/test_docs.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-cd "$(dirname "$0")"
-sphinx-build --define nb_execution_raise_on_error=1 . _build
diff --git a/fdb_scanner/README.md b/fdb_scanner/README.md
deleted file mode 100644
index 3a83e83d..00000000
--- a/fdb_scanner/README.md
+++ /dev/null
@@ -1,21 +0,0 @@
-The main script here is the scan.py script which uses `fdb axes` and `fdb list` to get a Qube tree that the Stac server uses.
-
-That script is run as a cronjob with the current crontab shown below.
-
-Additionally, we suggest running initial scans and using the utility script `kube_init.sh` to upload the files to the pvc where the Stac-server can read it upon restart.
-
-The fdb dumper and dump parser scripts are still in development.
-They will be used similarly to scan.py but will also save additional structural metadata to the qube which will later be used by [polytope](https://github.com/ecmwf/polytope).
-```sh
-# On Demand Extremes DT Full scan every day at 4am
-0 4 * * * cd /home/eouser/qubed && ./.venv/bin/python3.12 ./fdb_scanner/scan.py --quiet --full --selector class=d1,dataset=on-demand-extremes-dt --filepath ./fdb_scanner/data/cronjobs/on-demand-extremes-dt.json >> ./fdb_scanner/logs/on-demand-extremes-dt-full-daily.log 2>&1
-
-# On Demand Extremes DT Partial scan every three hours
-37 */3 * * * cd /home/eouser/qubed && ./.venv/bin/python3.12 ./fdb_scanner/scan.py --quiet --last_n_days=14 --selector class=d1,dataset=on-demand-extremes-dt --filepath ./fdb_scanner/data/cronjobs/on-demand-extremes-dt.json >> ./fdb_scanner/logs/on-demand-extremes-dt-partial-hourly.log 2>&1
-
-# Extremes-dt Daily Partial scan every three hours
-12 */3 * * * cd /home/eouser/qubed && ./.venv/bin/python3.12 ./fdb_scanner/scan.py --quiet --last_n_days=14 --selector class=d1,dataset=extremes-dt --filepath ./fdb_scanner/data/cronjobs/extremes-dt.json >> ./fdb_scanner/logs/extremes-dt.log 2>&1
-
-# Climate dt gen 2 Weekly on sunday at 2am
-0 2 * * SUN cd /home/eouser/qubed && ./.venv/bin/python3.12 ./fdb_scanner/scan.py --quiet --full --selector class=d1,dataset=climate-dt,generation=2 --filepath ./fdb_scanner/data/cronjobs/climate-dt-gen-2.json >> ./fdb_scanner/logs/climate-dt.log 2>&1
-```
diff --git a/fdb_scanner/fdb_dump_parser_operational.py b/fdb_scanner/fdb_dump_parser_operational.py
deleted file mode 100644
index 4bd0e951..00000000
--- a/fdb_scanner/fdb_dump_parser_operational.py
+++ /dev/null
@@ -1,119 +0,0 @@
-"""
-Convert fdb data with metadata from disk into a qube as fast as possible
-
-Example running this in parallel ls test_scripts/data/*.zst | xargs -n 1 -P 10 python test_scripts/fdb_dump_parser.py
-"""
-
-import subprocess
-import sys
-from pathlib import Path
-import time
-
-from qubed import Qube
-
-if len(sys.argv) != 2:
- print("Usage: python fdb_deblaster.py INPUT_PATH")
- sys.exit()
-
-assert sys.argv[1].endswith(".zst")
-
-p = Path(sys.argv[1]) # Compressed file
-decompressed = p.parent / f"{p.stem}" # decompressed file
-output = p.parent / Path(f"monthly/{p.stem[:-5]}.json")
-
-if output.exists():
- sys.exit()
-
-if not decompressed.exists():
- result = subprocess.run(["zstd", "--decompress", p], stdout=subprocess.PIPE)
-
-print(f"{output} does not exist")
-print(decompressed)
-
-qube = Qube.empty()
-
-one_count = 0
-two_count = 0
-
-level_one = {}
-level_two = {}
-path_meta = {}
-
-level_one_qube = Qube.empty()
-level_two_qube = Qube.empty()
-level_three_qube = Qube.empty()
-
-t0 = time.time()
-with decompressed.open() as f:
- for i, line in enumerate(f.readlines()):
- level, key, *metadata = line.strip().split(" ")
-
- if level == "0":
- level_one_qube |= level_two_qube
- level_two_qube = Qube.empty()
-
- level_one = dict(item.split("=", 1) for item in key.split(","))
- one_count += 1
- print(f"{one_count}th level one key, {i / (time.time() - t0):.0f} leaves/s")
-
- elif level == "1":
- level_two_qube |= level_three_qube.add_metadata(path_meta)
- level_three_qube = Qube.empty()
-
- level_two = dict(item.split("=", 1) for item in key.split(","))
- path_meta = dict(item.split("=", 1) for item in metadata[0].split(","))
- two_count += 1
- print(f"{two_count}th level two key, {i / (time.time() - t0):.0f} leaves/s")
-
- elif level == "2":
- level_three = dict(item.split("=", 1) for item in key.split(","))
- offset_length_meta = dict(
- item.split("=", 1) for item in metadata[0].split(",")
- )
-
- keys = level_one | level_two | level_three
-
- keys.pop("year", None)
- keys.pop("month", None)
-
- key_order = key_order = [
- "class",
- "dataset",
- "stream",
- "activity",
- "resolution",
- "expver",
- "experiment",
- "generation",
- "model",
- "realization",
- "type",
- "date",
- "time",
- "number",
- "datetime",
- "levtype",
- "levelist",
- "step",
- "param",
- ]
- keys = {k: keys[k] for k in key_order if k in keys}
-
- offset_length_meta["length"] = int(offset_length_meta["length"])
- offset_length_meta["offset"] = int(offset_length_meta["offset"])
-
- level_three_qube |= Qube.from_datacube(keys).add_metadata(
- offset_length_meta
- )
-
- level_two_qube |= level_three_qube.add_metadata(path_meta)
- level_one_qube |= level_two_qube
-
-print(level_one_qube)
-level_one_qube.save(str(output))
-
-if decompressed.exists():
- print(f"Removing {decompressed}")
- decompressed.unlink()
-
-print("ENDED SCRIPT")
diff --git a/fdb_scanner/fdb_dumper_operational.py b/fdb_scanner/fdb_dumper_operational.py
deleted file mode 100644
index 555f7290..00000000
--- a/fdb_scanner/fdb_dumper_operational.py
+++ /dev/null
@@ -1,84 +0,0 @@
-"""
-Blast fdb data with metadata to disk as fast as possible
-"""
-
-import time
-import pyfdb
-from pathlib import Path
-import subprocess
-import os
-
-os.environ["ECCODES_PYTHON_USE_FINDLIBS"] = "1"
-
-
-fdb = pyfdb.FDB()
-
-time0 = time.time()
-for year in [1]:
- for month in [1]:
- # SELECTOR = {
- # "class" : "od",
- # "stream": "oper",
- # "expver" : "0001",
- # "type": "fc",
- # "date": "20251013",
- # "time": "0000",
- # "levtype": "sfc",
- # }
- SELECTOR = {
- "class": "od",
- "stream": "enfo",
- "expver": "0001",
- "type": "pf",
- "date": "20251013",
- "time": "0000",
- }
-
- cf = Path(f"oper_fc_enfo-flat-{year}-{month}.list.zst")
- if cf.exists():
- continue
-
- t0 = time.time()
- with open(f"oper_fc_enfo-flat-{year}-{month}.list", "w") as f:
- # Keep track of the level one and level two keys
- current_level_zero_key = None
- current_level_one_key = None
- fdb_list = fdb.list(SELECTOR, keys=True, levels=True)
- for i, metadata in enumerate(fdb_list):
- level_zero_key = ",".join(
- f"{k}={v}" for k, v in metadata["keys"][0].items()
- )
- level_one_key = ",".join(
- f"{k}={v}" for k, v in metadata["keys"][1].items()
- )
- level_two_key = ",".join(
- f"{k}={v}" for k, v in metadata["keys"][2].items()
- )
-
- if level_zero_key != current_level_zero_key:
- f.write(f"0 {level_zero_key}\n")
- current_level_zero_key = level_zero_key
-
- if level_one_key != current_level_one_key:
- m = ",".join(
- f"{k}={metadata[k]}" for k in ["scheme", "host", "port", "path"]
- )
- f.write(f"1 {level_one_key} {m}\n")
- current_level_one_key = level_one_key
-
- m = ",".join(f"{k}={metadata[k]}" for k in ["offset", "length"])
- f.write(f"2 {level_two_key} {m}\n")
- if i % 2e5 == 0:
- print(i, (i + 1) / (time.time() - t0))
- p = subprocess.run(
- f"zstd --rm //home/male/git/qubed/fdb_scanner/oper_fc_enfo-flat-{year}-{month}.list",
- text=True,
- shell=True,
- stderr=subprocess.PIPE,
- stdout=subprocess.PIPE,
- )
- print(p)
-time1 = time.time()
-
-print("TIME TAKEN")
-print(time1 - time0)
diff --git a/fdb_scanner/kube_init.sh b/fdb_scanner/kube_init.sh
deleted file mode 100755
index bc09bb73..00000000
--- a/fdb_scanner/kube_init.sh
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/env bash
-
-set -euo pipefail
-
-script_name=$(basename "$0")
-
-usage() {
- cat < [destination_path] [namespace]
-
-Copy the contents of into the shared storage mounted by the
-stac-server pod. The optional destination path defaults to /data/shared, and
-the namespace defaults to the namespace of the current Kubernetes context (or
-"default" if unset).
-EOF
-}
-
-if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
- usage
- exit 0
-fi
-
-if [[ $# -lt 1 ]]; then
- echo "Error: source directory is required." >&2
- echo >&2
- usage >&2
- exit 1
-fi
-
-if ! command -v kubectl >/dev/null 2>&1; then
- echo "Error: kubectl is not installed or not in PATH." >&2
- exit 1
-fi
-
-source_dir=$1
-destination_path=${2:-/data/shared}
-
-current_namespace() {
- kubectl config view --minify --output 'jsonpath={..namespace}' 2>/dev/null | awk 'NF'
-}
-
-namespace=${3:-$(current_namespace)}
-
-if [[ -z "$namespace" ]]; then
- namespace=default
-fi
-
-if [[ ! -d "$source_dir" ]]; then
- echo "Error: source directory '$source_dir' does not exist." >&2
- exit 1
-fi
-
-if ! source_dir_abs=$(cd "$source_dir" 2>/dev/null && pwd); then
- echo "Error: unable to resolve absolute path for '$source_dir'." >&2
- exit 1
-fi
-
-readarray -t stac_pods < <(kubectl get pods -n "$namespace" -l app=stac-server \
- -o jsonpath='{range .items[?(@.status.phase=="Running")]}{.metadata.name}{"\n"}{end}')
-
-if [[ ${#stac_pods[@]} -eq 0 || -z "${stac_pods[0]:-}" ]]; then
- echo "Error: no running stac-server pods found in namespace '$namespace'." >&2
- exit 1
-fi
-
-target_pod=${stac_pods[0]}
-
-echo "Uploading contents of '$source_dir_abs' to pod '$target_pod' in namespace '$namespace'."
-echo "Destination path: $destination_path"
-
-shopt -s dotglob nullglob
-entries=("$source_dir_abs"/*)
-
-if [[ ${#entries[@]} -eq 0 ]]; then
- echo "Warning: source directory is empty. Nothing to upload."
-fi
-
-for entry in "${entries[@]}"; do
- name=$(basename "$entry")
- target="$destination_path/$name"
- if [[ -d "$entry" ]]; then
- echo "Copying directory '$name'"
- kubectl exec "$target_pod" -n "$namespace" -- mkdir -p "$target"
- kubectl cp "$entry/." "$target_pod:$target" -n "$namespace"
- else
- echo "Copying file '$name'"
- kubectl cp "$entry" "$target_pod:$target" -n "$namespace"
- fi
-done
-
-echo "Upload complete."
diff --git a/fdb_scanner/scan.py b/fdb_scanner/scan.py
deleted file mode 100755
index 583a48cd..00000000
--- a/fdb_scanner/scan.py
+++ /dev/null
@@ -1,346 +0,0 @@
-#!/usr/bin/env python3
-"""
-WARNING this scipt is hardcoded to:
- - remove `year` and `month` keys
- - order keys in a way that makes sense for the climate/extremes/ondemand dt data
-
-To use it for operational data or other data, you need to change that.
-
-Example usage (Climate DT):
- fdb_scanner/scan.py --selector class=d1,dataset=climate-dt --filepath tests/example_qubes/test.json --last_n_days=3
-
-Other args:
- --api:
- defaults to https://qubed.lumi.apps.dte.destination-earth.eu/api/v2
- Could also be https://qubed-dev.lumi.apps.dte.destination-earth.eu/api/v2
-
- --fdb-config:
- Defaults to config/fdb_config.yaml
-
-Example scanning regimes:
-
-Climate DT Gen 1 (Done): --full --selector class=d1,dataset=climate-dt,generation=1 --filepath tests/example_qubes/climate-dt-gen-1.json
-Climate DT Gen 2 (Ongoing) Full Weekly Scan: --full --selector class=d1,dataset=climate-dt,generation=2 --filepath tests/example_qubes/climate-dt-gen-2.json
-Extremes DT Daily of last week: --last_n_days=7 --selector class=d1,dataset=extremes-dt --filepath tests/example_qubes/climate-dt.json
-On Demand Extremes DT Full Daily scan: --full --selector class=d1,dataset=on-demand-extremes-dt --filepath tests/example_qubes/on-demand-extremes-dt.json
-
-Example crontab:
-# On Demand Extremes DT Full scan every day at 4am
-0 4 * * * cd /home/eouser/qubed && ./.venv/bin/python3.12 ./fdb_scanner/scan.py --quiet --full --selector class=d1,dataset=on-demand-extremes-dt --filepath ./fdb_scanner/data/cronjobs/on-demand-extremes-dt.json >> ./fdb_scanner/logs/on-demand-extremes-dt-full-daily.log 2>&1
-
-# On Demand Extremes DT Partial scan every three hours
-37 */3 * * * cd /home/eouser/qubed && ./.venv/bin/python3.12 ./fdb_scanner/scan.py --quiet --last_n_days=14 --selector class=d1,dataset=on-demand-extremes-dt --filepath ./fdb_scanner/data/cronjobs/on-demand-extremes-dt.json >> ./fdb_scanner/logs/on-demand-extremes-dt-partial-hourly.log 2>&1
-
-# Extremes-dt Daily Partial scan every three hours
-12 */3 * * * cd /home/eouser/qubed && ./.venv/bin/python3.12 ./fdb_scanner/scan.py --quiet --last_n_days=14 --selector class=d1,dataset=extremes-dt --filepath ./fdb_scanner/data/cronjobs/extremes-dt.json >> ./fdb_scanner/logs/extremes-dt.log 2>&1
-
-# Climate dt gen 2 Weekly on sunday at 2am
-0 2 * * SUN cd /home/eouser/qubed && ./.venv/bin/python3.12 ./fdb_scanner/scan.py --quiet --full --selector class=d1,dataset=climate-dt,generation=2 --filepath ./fdb_scanner/data/cronjobs/climate-dt-gen-2.json >> ./fdb_scanner/logs/climate-dt.log 2>&1
-"""
-
-import json
-import subprocess
-from datetime import datetime, timedelta, date
-from time import time
-import psutil
-from qubed import Qube
-import requests
-import argparse
-import os
-from enum import Enum
-from pathlib import Path
-
-
-class ScanMode(Enum):
- Full = "full"
- Partial = "partial"
-
-
-def parse_args():
- parser = argparse.ArgumentParser(
- description="Convert data in an fdb into a qube (no metadata)"
- )
-
- parser.add_argument(
- "--selector",
- type=str,
- help="Selector string eg class=d1,dataset=climate-dt,generation=1",
- )
-
- parser.add_argument(
- "--filepath",
- type=str,
- help="Path to file (may not exist) eg tests/example_qubes/climate-dt-gen-1.json",
- )
-
- parser.add_argument(
- "--api",
- type=str,
- default="https://qubed.lumi.apps.dte.destination-earth.eu/api/v2",
- help="API URL (default: %(default)s)",
- )
-
- parser.add_argument(
- "--api-secret",
- type=str,
- default="config/api.secret",
- help="API Secret (default: %(default)s)",
- )
-
- parser.add_argument(
- "--fdb-config",
- type=str,
- default="config/fdb_config.yaml",
- help="Configuration file path (must exist) (default: %(default)s)",
- )
-
- parser.add_argument("--quiet", action="store_const", const=True, default=False)
-
- # Mutually exclusive group for --full/--last_n_days
- mode_group = parser.add_mutually_exclusive_group()
- mode_group.add_argument(
- "--full",
- action="store_const",
- const=ScanMode.Full,
- dest="full_or_partial",
- help="Do a full scan (default)",
- )
- mode_group.add_argument("--last_n_days", type=int, help="Scan the last n days")
-
- # Set default for full_or_partial
- parser.set_defaults(full_or_partial=ScanMode.Partial)
-
- args = parser.parse_args()
-
- if not os.path.exists(args.fdb_config):
- parser.error(f"Configuration file does not exist: {args.fdb_config}")
- if os.environ.get("API_KEY") is None and not os.path.exists(args.api_secret):
- parser.error(f"API secrets file does not exist: {args.api_secret}")
-
- return args
-
-
-args = parse_args()
-print(f"Using args {args}")
-process = psutil.Process()
-if os.environ.get("API_KEY") is not None:
- print("Got api key from env var API_KEY")
- secret = os.environ["API_KEY"].strip()
-else:
- print(f"Getting api key from file {args.api_secret}")
- with open(args.api_secret, "r") as f:
- secret = f.read().strip()
-
-if not secret:
- raise ValueError("API key is empty after trimming whitespace; check configuration.")
-
-# If a MOUNT_PATH env var is set, write output files into that directory.
-MOUNT_PATH = os.getenv("MOUNT_PATH")
-if MOUNT_PATH and not os.path.exists(MOUNT_PATH):
- raise FileNotFoundError(f"MOUNT_PATH {MOUNT_PATH} does not exist!")
-
-# Compute the final output path for the qube JSON file
-target_filepath = (
- args.filepath if not MOUNT_PATH else os.path.join(MOUNT_PATH, args.filepath)
-)
-if MOUNT_PATH:
- # Ensure directory exists when writing to the mount path
- os.makedirs(os.path.dirname(target_filepath), exist_ok=True)
-
-
-def from_ecmwf_date(s: str) -> date:
- return datetime.strptime(s, "%Y%m%d").date()
-
-
-def to_ecmwf_date(d: date) -> str:
- return d.strftime("%Y%m%d")
-
-
-def run_command(command: list[str]) -> str:
- return subprocess.run(
- command,
- text=True,
- shell=True,
- stderr=subprocess.PIPE,
- stdout=subprocess.PIPE,
- check=True,
- ).stdout
-
-
-start_time = datetime.now()
-print(f"Running scan at {start_time}")
-
-# Use fdb axes to determine date range
-output = run_command(
- [f"fdb axes --json --config {args.fdb_config} --minimum-keys=class {args.selector}"]
-)
-axes = json.loads(output)
-dates = [from_ecmwf_date(s) for s in axes["date"]]
-dataset_start_date, dataset_end_date = min(dates), max(dates)
-start_date, end_date = dataset_start_date, dataset_end_date
-chunk_size = min(dataset_end_date - dataset_start_date, timedelta(days=120))
-dates_in_range = [d for d in dates if start_date <= d < end_date]
-
-if args.full_or_partial is ScanMode.Partial:
- assert args.last_n_days, "Must provide --last_n_days or --full"
- chunk_size = timedelta(days=min(args.last_n_days, 120))
- requested_start_date = (datetime.now() - timedelta(days=args.last_n_days)).date()
- requested_end_date = datetime.now().date()
-
- start_date = max(dataset_start_date, requested_start_date)
- end_date = min(dataset_end_date, requested_end_date)
- dates_in_range = [d for d in dates if start_date <= d < end_date]
-
-print(f"""
-Doing a {args.full_or_partial.value} scan of the dataset
- Selector: {args.selector}
- Requested date range: {start_date} - {end_date}
- Size of requested date range: {end_date - start_date}
- Unique dates in that range: {len(dates_in_range)}
- Request chunk size: {chunk_size}
-
- Full dataset date range: {dataset_start_date} - {dataset_end_date}
- Unique dates in that range: {len(dates)}
-
- Estimated scan time (Assuming 120 day chunk size) (hh:mm::ss): {len(dates_in_range) * timedelta(seconds=1.12) + timedelta(seconds=24)}
-""")
-
-current_span: tuple[date, date] = (end_date - chunk_size, end_date)
-qube = Qube.empty()
-
-
-while current_span[1] >= start_date:
- t0 = time()
- start, end = map(to_ecmwf_date, current_span)
-
- subqube = Qube.empty()
- command = [
- f"fdb list --compact --config {args.fdb_config} --minimum-keys=date {args.selector},date={start}/to/{end}"
- ]
-
- if not args.quiet:
- print(f"Running command {command[0]}")
- print(f"Doing {current_span[0]} - {current_span[1]}")
- print(f"Current memory usage: {process.memory_info().rss / 1e9:.2g}GB")
-
- try:
- stdout = run_command(command)
- except Exception as e:
- print(f"Failed for {current_span} {e}")
- continue
-
- for i, line in enumerate(list(stdout.split("\n"))):
- if not line.startswith("class="):
- continue
-
- def split(t):
- return t[0], t[1].split("/")
-
- request = dict(split(v.split("=")) for v in line.strip().split(","))
-
- # Remove year and month from request
- request.pop("year", None)
- request.pop("month", None)
-
- # Order the keys
- key_order = [
- "class",
- "dataset",
- "stream",
- "activity",
- "resolution",
- "expver",
- "experiment",
- "generation",
- "model",
- "realization",
- "type",
- "date",
- "time",
- "datetime",
- "levtype",
- "georef",
- "levelist",
- "step",
- "param",
- ]
- request = {k: request[k] for k in key_order if k in request}
-
- q = Qube.from_datacube(request).convert_dtypes(
- {
- "generation": int,
- "realization": int,
- "param": int,
- "levelist": int,
- "date": lambda s: datetime.strptime(s, "%Y%m%d").date(),
- }
- )
- subqube = subqube | q
-
- if not args.quiet:
- subqube.print(depth=2)
- qube = qube | subqube
-
- if not args.quiet:
- print(f"{subqube.n_nodes=}, {subqube.n_leaves=},")
- print("Added to qube")
- print(f"{qube.n_nodes=}, {qube.n_leaves=},")
-
- # Send to the API
- r = requests.post(
- args.api + "/union/",
- headers={"Authorization": f"Bearer {secret}"},
- json=subqube.to_json(),
- )
-
- if not args.quiet:
- print(f"Sent to server and got {r}")
- print(
- f"Did that taking {(time() - t0) / chunk_size.days:2g} seconds per day ingested, total {(time() - t0):2g}s\n"
- )
-
- current_span = (current_span[0] - chunk_size, current_span[0])
-
- with open(target_filepath + ".tmp", "w") as f:
- json.dump(qube.to_json(), f)
-
-# Load in the existing qube from disk
-try:
- existing_qube = Qube.load(target_filepath)
-except Exception:
- print(f"Could not load {target_filepath}!")
- existing_qube = Qube.empty()
-
-# Compute what's new
-print(f"Scanned {qube.n_leaves} leaves on this run.")
-new_qube = qube - existing_qube
-
-if new_qube.n_leaves > 0:
- print("Of those, this is new to us:")
- print(f"{new_qube.n_leaves} leaves.")
- print("axes:")
- for k, vs in new_qube.axes().items():
- print(k, vs)
- print()
- new_qube.print(depth=2)
-else:
- print("No new data found.")
-
-# Save the data
-existing_qube = existing_qube | qube
-with open(target_filepath, "w") as f:
- json.dump(existing_qube.to_json(), f)
-
-# Delete the temporary file
-tmp_file = Path(target_filepath + ".tmp")
-if tmp_file.exists():
- tmp_file.unlink()
-
-# Upload the whole thing to the API
-r = requests.post(
- args.api + "/union/",
- headers={"Authorization": f"Bearer {secret}"},
- json=qube.to_json(),
-)
-
-print(f"Done in {datetime.now() - start_time}!")
diff --git a/fdb_scanner/upload_all.py b/fdb_scanner/upload_all.py
deleted file mode 100644
index 6188b8db..00000000
--- a/fdb_scanner/upload_all.py
+++ /dev/null
@@ -1,47 +0,0 @@
-import json
-import subprocess
-from datetime import datetime, timedelta, date
-from time import time
-import psutil
-from qubed import Qube
-import requests
-import argparse
-
-def parse_args():
- parser = argparse.ArgumentParser(description='Upload all qubes to the api')
- parser.add_argument(
- '--api',
- type=str,
- default="https://qubed.lumi.apps.dte.destination-earth.eu/api/v2",
- help='API URL (default: %(default)s)'
- )
-
- parser.add_argument(
- '--api-secret',
- type=str,
- default="config/api.secret",
- help='API Secret (default: %(default)s)'
- )
-
-
-
-
- args = parser.parse_args()
-
- return args
-
-args = parse_args()
-
-filepaths = []
-
-for f in filepaths:
-try:
- qube = Qube.load(args.filepath)
-except:
- print(f"Could not load {args.filepath}, using empty qube.")
- qube = Qube.empty()
-
-r = requests.post(
- args.api + "/union/",
- headers = {"Authorization" : f"Bearer {secret}"},
- json = qube.to_json())
\ No newline at end of file
diff --git a/py_qubed/Cargo.toml b/py_qubed/Cargo.toml
new file mode 100644
index 00000000..35835256
--- /dev/null
+++ b/py_qubed/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "py_qubed"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+qubed = { path = "../qubed" }
+serde_json = "1.0.145"
+pyo3 = { version = "0.28", features = ["extension-module", "abi3-py38"] }
+
+[lib]
+name = "qubed"
+path = "src/lib.rs"
+crate-type = ["cdylib"]
diff --git a/py_qubed/pyproject.toml b/py_qubed/pyproject.toml
new file mode 100644
index 00000000..45bd07cc
--- /dev/null
+++ b/py_qubed/pyproject.toml
@@ -0,0 +1,18 @@
+[build-system]
+requires = ["maturin>=1.7,<2.0"]
+build-backend = "maturin"
+
+[project]
+name = "qubed"
+version = "0.1.0"
+description = "Python bindings for the qubed Rust crate"
+requires-python = ">=3.8"
+classifiers = [
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Rust",
+ "Programming Language :: Python :: Implementation :: CPython",
+]
+
+[tool.maturin]
+manifest-path = "Cargo.toml"
+features = []
diff --git a/py_qubed/src/lib.rs b/py_qubed/src/lib.rs
new file mode 100644
index 00000000..854e31c2
--- /dev/null
+++ b/py_qubed/src/lib.rs
@@ -0,0 +1,209 @@
+use ::qubed::Coordinates;
+use ::qubed::Qube;
+use ::qubed::select::SelectMode;
+use pyo3::exceptions::PyTypeError;
+use pyo3::prelude::*;
+use pyo3::types::{PyDict, PyList, PyModule};
+use serde_json::Value as JsonValue;
+
+#[pyclass(unsendable)]
+pub struct PyQube {
+ inner: Qube,
+}
+
+#[pymethods]
+impl PyQube {
+ #[new]
+ pub fn new() -> Self {
+ Self { inner: Qube::new() }
+ }
+
+ #[staticmethod]
+ pub fn from_ascii(input: &str) -> PyResult {
+ match Qube::from_ascii(input) {
+ Ok(qube) => Ok(Self { inner: qube }),
+ Err(e) => Err(PyTypeError::new_err(e)),
+ }
+ }
+
+ pub fn to_ascii(&self) -> PyResult {
+ Ok(self.inner.to_ascii())
+ }
+
+ pub fn to_datacubes(&self, py: Python<'_>) -> PyResult> {
+ let datacubes = self.inner.to_datacubes();
+ let py_list = PyList::empty(py);
+
+ for datacube in &datacubes {
+ let dict = PyDict::new(py);
+ for (dimension, coordinates) in datacube.coordinates() {
+ dict.set_item(dimension, coordinates.to_string())?;
+ }
+ py_list.append(dict)?;
+ }
+
+ // Return an owned Python object so the list outlives this Rust call frame.
+ Ok(py_list.into_any().unbind())
+ }
+
+ pub fn to_arena_json(&self) -> PyResult {
+ let v = self.inner.to_arena_json();
+ serde_json::to_string(&v).map_err(|e| PyTypeError::new_err(e.to_string()))
+ }
+
+ #[pyo3(name = "__str__")]
+ pub fn py_str(&self) -> PyResult {
+ self.to_ascii()
+ }
+
+ #[pyo3(name = "__len__")]
+ pub fn py_len(&self) -> PyResult {
+ Ok(self.inner.datacube_count())
+ }
+
+ #[staticmethod]
+ pub fn from_arena_json(input: &str) -> PyResult {
+ let v: JsonValue =
+ serde_json::from_str(input).map_err(|e| PyTypeError::new_err(e.to_string()))?;
+ match Qube::from_arena_json(v) {
+ Ok(qube) => Ok(PyQube { inner: qube }),
+ Err(e) => Err(PyTypeError::new_err(e)),
+ }
+ }
+
+ pub fn select(
+ &self,
+ request: Bound<'_, PyDict>,
+ mode: Option,
+ _consume: Option,
+ ) -> PyResult {
+ // Collect selection data with owned Strings and Coordinates
+ let mut selection_data: Vec<(String, Coordinates)> = Vec::new();
+
+ for (k, v) in request.iter() {
+ let key: String =
+ k.extract().map_err(|_| PyTypeError::new_err("select keys must be strings"))?;
+
+ let coords = if v.is_instance_of::() {
+ let lst =
+ v.downcast::().map_err(|e| PyTypeError::new_err(e.to_string()))?;
+ let joined = join_pylist_as_path(lst)?;
+ Coordinates::from_string(&joined)
+ } else {
+ // Convert any value to string representation (handles int, float, str)
+ let py_str = v.str()?;
+ let s: String = py_str.extract()?;
+ Coordinates::from_string(&s)
+ };
+
+ selection_data.push((key, coords));
+ }
+
+ let select_mode = match mode.as_deref() {
+ Some(m) if m.eq_ignore_ascii_case("prune") => SelectMode::Prune,
+ _ => SelectMode::Default,
+ };
+
+ // Convert to references for the select call
+ let pairs: Vec<(&str, Coordinates)> =
+ selection_data.iter().map(|(k, c)| (k.as_str(), c.clone())).collect();
+
+ match self.inner.select(&pairs, select_mode) {
+ Ok(q) => Ok(PyQube { inner: q }),
+ Err(e) => Err(PyTypeError::new_err(e)),
+ }
+ }
+
+ pub fn all_unique_dim_coords(&mut self, py: Python<'_>) -> PyResult> {
+ let dim_coords = self.inner.all_unique_dim_coords();
+ let py_dict = PyDict::new(py);
+
+ for (dimension, coordinates) in dim_coords {
+ let coord_str = coordinates.to_string();
+ // Split on slash if present, otherwise treat as single value
+ let values: Vec<&str> = if coord_str.is_empty() {
+ vec![]
+ } else if coord_str.contains('/') {
+ coord_str.split('/').collect()
+ } else {
+ vec![&coord_str]
+ };
+
+ let py_list = PyList::empty(py);
+ for value in values {
+ py_list.append(value)?;
+ }
+
+ py_dict.set_item(dimension, py_list)?;
+ }
+
+ Ok(py_dict.into_any().unbind())
+ }
+
+ pub fn compress(&mut self) -> PyResult<()> {
+ self.inner.compress();
+ Ok(())
+ }
+
+ pub fn drop(&mut self, dims: &Bound<'_, PyList>) -> PyResult<()> {
+ let to_drop: Vec = dims
+ .iter()
+ .map(|item| {
+ item.str()
+ .and_then(|s| s.extract::())
+ .map_err(|_| PyTypeError::new_err("drop: dimension names must be strings"))
+ })
+ .collect::>()?;
+ self.inner.drop(to_drop).map_err(PyTypeError::new_err)
+ }
+
+ pub fn squeeze(&mut self) -> PyResult<()> {
+ self.inner.squeeze().map_err(PyTypeError::new_err)
+ }
+
+ pub fn append(&mut self, other: &Bound<'_, PyQube>) -> PyResult<()> {
+ let mut other_mut = other.borrow_mut();
+ self.inner.append(&mut other_mut.inner);
+ Ok(())
+ }
+
+ pub fn append_many(&mut self, others: &Bound<'_, PyList>) -> PyResult<()> {
+ // First validate all types so type errors happen before any mutation.
+ let mut validated_qubes = Vec::with_capacity(others.len());
+ for item in others.iter() {
+ let other_cell =
+ item.cast::().map_err(|_| PyTypeError::new_err("expected PyQube"))?;
+ validated_qubes.push(other_cell.clone().unbind());
+ }
+
+ let py = others.py();
+ for py_qube in validated_qubes {
+ let bound_qube = py_qube.bind(py);
+ let mut other_mut = bound_qube.borrow_mut();
+ self.inner.append(&mut other_mut.inner);
+ }
+ Ok(())
+ }
+
+ pub fn __repr__(&self) -> PyResult {
+ Ok(format!("PyQube(root_id={:?})", self.inner.root()))
+ }
+}
+
+pub(crate) fn join_pylist_as_path(lst: &Bound<'_, PyList>) -> PyResult {
+ let mut parts: Vec = Vec::with_capacity(lst.len());
+ for item in lst.iter() {
+ // Convert any value to string representation (handles int, float, str)
+ let py_str = item.str()?;
+ let s: String = py_str.extract()?;
+ parts.push(s);
+ }
+ Ok(parts.join("/"))
+}
+
+#[pymodule]
+#[pyo3(name = "qubed")]
+fn py_qubed_module(_py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
+ m.add_class::()?;
+ Ok(())
+}
diff --git a/py_qubed/tests/test_qubed_api.py b/py_qubed/tests/test_qubed_api.py
new file mode 100644
index 00000000..c12d4e34
--- /dev/null
+++ b/py_qubed/tests/test_qubed_api.py
@@ -0,0 +1,112 @@
+from qubed import PyQube
+import pytest
+
+ASCII_INPUT = """root
+βββ class=3
+ βββ expver=1
+ β βββ param=1
+ β βββ param=2
+ βββ expver=2
+ βββ param=1
+ βββ param=2
+"""
+
+
+def test_ascii_roundtrip_contains_expected_nodes() -> None:
+ qube = PyQube.from_ascii(ASCII_INPUT)
+ output = qube.to_ascii()
+
+ assert output == ASCII_INPUT
+ for token in ("class=3", "expver=1", "expver=2", "param=1", "param=2"):
+ assert token in output
+
+
+def test_append_and_append_many_smoke() -> None:
+ # Each source has a distinct class value, so all three should survive the merge.
+ left = PyQube.from_ascii("""root
+βββ class=1
+ βββ param=10
+""")
+ right = PyQube.from_ascii("""root
+βββ class=2
+ βββ param=20
+""")
+ third = PyQube.from_ascii("""root
+βββ class=3
+ βββ param=30
+""")
+
+ left.append(right)
+ left.append_many([third])
+
+ output = left.to_ascii()
+ assert "class=1" in output
+ assert "class=2" in output
+ assert "class=3" in output
+
+
+def test_append_many_rejects_non_qube_items() -> None:
+ target = PyQube()
+
+ with pytest.raises(TypeError, match="expected PyQube"):
+ target.append_many(["not-a-qube"])
+
+
+def test_to_datacubes_shape() -> None:
+ qube = PyQube.from_ascii("""root
+βββ class=5
+ βββ param=42
+""")
+
+ datacubes = qube.to_datacubes()
+ assert isinstance(datacubes, list)
+ assert len(datacubes) == 1
+ assert datacubes[0]["class"] == "5"
+ assert datacubes[0]["param"] == "42"
+
+
+def test_str_and_len_dunder_methods() -> None:
+ qube = PyQube.from_ascii("""root
+βββ class=5
+ βββ param=42
+""")
+ assert str(qube) == qube.to_ascii()
+ assert len(qube) == 1
+
+
+def test_to_from_arena_json_roundtrip() -> None:
+ qube = PyQube.from_ascii("""root
+βββ class=5
+ βββ param=42
+""")
+
+ arena_json = qube.to_arena_json()
+ # should be valid JSON representing an array
+ import json
+
+ parsed = json.loads(arena_json)
+ assert isinstance(parsed, dict)
+ assert "qube" in parsed
+ assert "version" in parsed
+ # expect qube to be a list with node entries containing dim and coords
+ qube_list = parsed["qube"]
+ assert isinstance(qube_list, list)
+ assert any(isinstance(item, dict) and "dim" in item and "coords" in item for item in qube_list)
+
+ # Reconstruct and verify ascii equality
+ reconstructed = PyQube.from_arena_json(arena_json)
+ assert reconstructed.to_ascii() == qube.to_ascii()
+
+
+def test_arena_preserves_leading_zeros() -> None:
+ qube = PyQube.from_ascii("""root
+βββ class=od
+ βββ expver=0001
+ βββ param=1
+""")
+
+ arena_json = qube.to_arena_json()
+ assert "0001" in arena_json
+
+ reconstructed = PyQube.from_arena_json(arena_json)
+ assert "expver=0001" in reconstructed.to_ascii()
diff --git a/py_qubed/tests/test_select_api.py b/py_qubed/tests/test_select_api.py
new file mode 100644
index 00000000..a172ea3f
--- /dev/null
+++ b/py_qubed/tests/test_select_api.py
@@ -0,0 +1,379 @@
+import qubed
+
+
+def test_select_1():
+ input_qube = r"""root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=2
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"""
+
+ q = qubed.PyQube.from_ascii(input_qube)
+
+ selected = q.select({"class": [1]}, None, None)
+
+ expected = r"""root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"""
+
+ assert selected.to_ascii() == qubed.PyQube.from_ascii(expected).to_ascii()
+
+
+def test_select_2():
+ input_qube = r"""root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=2
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"""
+
+ q = qubed.PyQube.from_ascii(input_qube)
+
+ selected = q.select({"class": [1], "param": [1]}, None, None)
+
+ expected = r"""root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1
+ βββ expver=0002
+ βββ param=1"""
+
+ assert selected.to_ascii() == qubed.PyQube.from_ascii(expected).to_ascii()
+
+
+def test_select_3():
+ input_qube = r"""root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=2
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"""
+
+ q = qubed.PyQube.from_ascii(input_qube)
+
+ selected = q.select({"expver": ["0001"]}, None, None)
+
+ expected = r"""root
+βββ class=1
+β βββ expver=0001
+β βββ param=1
+β βββ param=2
+βββ class=2
+ βββ expver=0001
+ βββ param=1
+ βββ param=2
+ βββ param=3"""
+
+ assert selected.to_ascii() == qubed.PyQube.from_ascii(expected).to_ascii()
+
+
+def test_all_unique_dim_coords():
+ input_qube = r"""root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=2
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"""
+
+ q = qubed.PyQube.from_ascii(input_qube)
+
+ dim_coords = q.all_unique_dim_coords()
+
+ # Should have 3 dimensions (class, expver, param)
+ assert len(dim_coords) == 3
+
+ # Check that expected dimensions are present
+ assert "class" in dim_coords
+ assert "expver" in dim_coords
+ assert "param" in dim_coords
+
+ # Check coordinate values are lists
+ assert isinstance(dim_coords["class"], list)
+ assert isinstance(dim_coords["expver"], list)
+ assert isinstance(dim_coords["param"], list)
+
+ # Check that coordinates contain expected values
+ assert "1" in dim_coords["class"]
+ assert "2" in dim_coords["class"]
+ assert "0001" in dim_coords["expver"]
+ assert "0002" in dim_coords["expver"]
+ assert "1" in dim_coords["param"]
+ assert "2" in dim_coords["param"]
+ assert "3" in dim_coords["param"]
+
+
+def test_compress():
+ input_qube = r"""root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=2
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"""
+
+ q = qubed.PyQube.from_ascii(input_qube)
+
+ # Get the ASCII representation before compression
+ ascii_before = q.to_ascii()
+
+ # Compress the qube
+ q.compress()
+
+ # The qube should still be valid and have the same structure
+ ascii_after = q.to_ascii()
+
+ # Verify the structure is preserved or optimized (may change due to deduplication)
+ assert len(ascii_before) > 0
+ assert len(ascii_after) > 0
+
+ # Verify datacube count is preserved
+ assert len(q) > 0
+
+
+def test_compress_2():
+ input_qube = r"""root
+βββ class=2
+ βββ expver=0002
+ βββ param=2"""
+
+ q = qubed.PyQube.from_ascii(input_qube)
+
+ # Get the ASCII representation before compression
+ ascii_before = q.to_ascii()
+
+ # Compress the qube
+ q.compress()
+
+ # The qube should still be valid and have the same structure
+ ascii_after = q.to_ascii()
+
+ # Verify the structure is preserved or optimized (may change due to deduplication)
+ assert len(ascii_before) > 0
+ assert len(ascii_after) > 0
+
+ # Verify datacube count is preserved
+ assert len(q) > 0
+
+
+def test_select_multiple_values():
+ input_qube = r"""root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=2
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"""
+
+ q = qubed.PyQube.from_ascii(input_qube)
+
+ # Select multiple values for the same key
+ selected = q.select({"param": [1, 3]}, None, None)
+
+ expected = r"""root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β βββ expver=0002
+β βββ param=1
+βββ class=2
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1"""
+
+ assert selected.to_ascii() == qubed.PyQube.from_ascii(expected).to_ascii()
+
+
+def test_default():
+ """Verify default selection mode shows the full subtree for the selected class"""
+ input_qube = r"""root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=2
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"""
+
+ q = qubed.PyQube.from_ascii(input_qube)
+
+ # Default mode: shows full subtree
+ default_result = q.select({"class": [1]}, None, None)
+
+ default_expected = r"""root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"""
+
+ assert (
+ default_result.to_ascii()
+ == qubed.PyQube.from_ascii(default_expected).to_ascii()
+ )
+
+
+def test_drop():
+ input_qube = r"""root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"""
+
+ q = qubed.PyQube.from_ascii(input_qube)
+ q.drop(["expver"])
+
+ expected = r"""root
+βββ class=1
+ βββ param=1/2"""
+
+ assert q.to_ascii() == qubed.PyQube.from_ascii(expected).to_ascii()
+
+
+def test_squeeze():
+ input_qube = r"""root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"""
+
+ q = qubed.PyQube.from_ascii(input_qube)
+ q.squeeze()
+
+ # class has only one value (1), so it gets squeezed out
+ expected = r"""root
+βββ expver=0001/0002
+ βββ param=1/2"""
+
+ assert q.to_ascii() == qubed.PyQube.from_ascii(expected).to_ascii()
+
+
+def test_select_drops_branches_without_matching_deep_key():
+ """Branches whose descendants contain none of the selected values must be removed."""
+ input_qube = r"""root
+βββ expver=0001
+β βββ param=1
+β βββ param=2
+βββ expver=0002
+ βββ param=3
+ βββ param=4"""
+
+ q = qubed.PyQube.from_ascii(input_qube)
+ selected = q.select({"param": [1]}, None, None)
+
+ expected = r"""root
+βββ expver=0001
+ βββ param=1"""
+
+ assert selected.to_ascii() == qubed.PyQube.from_ascii(expected).to_ascii(), (
+ "expver=0002 (no param=1 descendants) should be absent from the result"
+ )
+
+
+def test_select_deep_key_multi_level_unselected_prefix():
+ """Only branches leading to a matching value survive, even with multiple unselected levels above."""
+ input_qube = r"""root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=3
+β βββ param=4
+βββ class=2
+ βββ expver=0001
+ βββ param=5
+ βββ param=6"""
+
+ q = qubed.PyQube.from_ascii(input_qube)
+ selected = q.select({"param": [1]}, None, None)
+
+ expected = r"""root
+βββ class=1
+ βββ expver=0001
+ βββ param=1"""
+
+ assert selected.to_ascii() == qubed.PyQube.from_ascii(expected).to_ascii(), (
+ "only class=1/expver=0001 contains param=1; all other branches must be pruned"
+ )
diff --git a/py_qubed_meteo/Cargo.toml b/py_qubed_meteo/Cargo.toml
new file mode 100644
index 00000000..b62a329d
--- /dev/null
+++ b/py_qubed_meteo/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "py_qubed_meteo"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+qubed = { path = "../qubed" }
+qubed_meteo = { path = "../qubed_meteo" }
+serde_json = "1.0.145"
+pyo3 = { version = "0.28", features = ["extension-module", "abi3-py38"] }
+
+[lib]
+name = "qubed_meteo"
+path = "src/lib.rs"
+crate-type = ["cdylib"]
diff --git a/py_qubed_meteo/pyproject.toml b/py_qubed_meteo/pyproject.toml
new file mode 100644
index 00000000..6a816681
--- /dev/null
+++ b/py_qubed_meteo/pyproject.toml
@@ -0,0 +1,18 @@
+[build-system]
+requires = ["maturin>=1.7,<2.0"]
+build-backend = "maturin"
+
+[project]
+name = "qubed-meteo"
+version = "0.1.0"
+description = "Python bindings for meteorological adapters built on qubed"
+requires-python = ">=3.8"
+classifiers = [
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Rust",
+ "Programming Language :: Python :: Implementation :: CPython",
+]
+
+[tool.maturin]
+manifest-path = "Cargo.toml"
+features = []
diff --git a/py_qubed_meteo/src/lib.rs b/py_qubed_meteo/src/lib.rs
new file mode 100644
index 00000000..0ce5a5a6
--- /dev/null
+++ b/py_qubed_meteo/src/lib.rs
@@ -0,0 +1,43 @@
+use ::qubed::Qube;
+use ::qubed_meteo::adapters::fdb::FromFDBList;
+use ::qubed_meteo::adapters::mars_list::FromMARSList;
+use ::qubed_meteo::adapters::to_constraints::ToDssConstraints;
+use pyo3::exceptions::PyValueError;
+use pyo3::prelude::*;
+use pyo3::types::PyModule;
+use pyo3::wrap_pyfunction;
+
+#[pyfunction]
+pub fn from_mars_list_py(text: &str) -> PyResult {
+ match Qube::from_mars_list(text) {
+ // ASCII is our stable bridge format so callers can pipe into PyQube.from_ascii().
+ Ok(qube) => Ok(qube.to_ascii()),
+ Err(e) => Err(PyValueError::new_err(e)),
+ }
+}
+
+#[pymodule]
+#[pyo3(name = "qubed_meteo")]
+fn py_qubed_meteo_module(_py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
+ m.add_function(wrap_pyfunction!(from_mars_list_py, m)?)?;
+ m.add_function(wrap_pyfunction!(from_fdb_list_py, m)?)?;
+ m.add_function(wrap_pyfunction!(to_dss_constraints_py, m)?)?;
+ Ok(())
+}
+
+#[pyfunction]
+pub fn from_fdb_list_py(request_json: &str) -> PyResult {
+ let v: serde_json::Value =
+ serde_json::from_str(request_json).map_err(|e| PyValueError::new_err(e.to_string()))?;
+ match Qube::from_fdb_list(&v) {
+ Ok(qube) => Ok(qube.to_ascii()),
+ Err(e) => Err(PyValueError::new_err(e)),
+ }
+}
+
+#[pyfunction]
+pub fn to_dss_constraints_py(ascii: &str) -> PyResult {
+ let qube = Qube::from_ascii(ascii).map_err(|e| PyValueError::new_err(e))?;
+ let v = qube.to_dss_constraints();
+ serde_json::to_string(&v).map_err(|e| PyValueError::new_err(e.to_string()))
+}
diff --git a/py_qubed_meteo/tests/test_api.py b/py_qubed_meteo/tests/test_api.py
new file mode 100644
index 00000000..c9cc394e
--- /dev/null
+++ b/py_qubed_meteo/tests/test_api.py
@@ -0,0 +1,55 @@
+import json
+
+import qubed_meteo
+
+
+def test_from_fdb_list_py_basic() -> None:
+ items = [
+ "class=od,expver=0001,param=1/2",
+ "class=rd,expver=0003,param=3/4",
+ ]
+
+ ascii_out = qubed_meteo.from_fdb_list_py(items)
+ assert isinstance(ascii_out, str)
+ # basic tokens
+ assert "class=od" in ascii_out
+ assert "expver=0001" in ascii_out
+ assert "param=1/2" in ascii_out
+
+
+def test_to_dss_constraints_py_basic() -> None:
+ items = [
+ "class=od,expver=0001,param=1/2",
+ "class=rd,expver=0003,param=3/4",
+ "class=rd,expver=0002,param=5/6",
+ ]
+
+ ascii_out = qubed_meteo.from_fdb_list_py(items)
+ json_out = qubed_meteo.to_dss_constraints_py(ascii_out)
+ parsed = json.loads(json_out)
+
+ assert isinstance(parsed, list)
+ # Expect three objects (one per leaf path)
+ assert len(parsed) == 3
+
+ found_od = False
+ found_rd_34 = False
+ found_rd_56 = False
+
+ for obj in parsed:
+ assert "class" in obj and "expver" in obj and "param" in obj
+ class_vals = obj["class"]
+ exp_vals = obj["expver"]
+ param_vals = obj["param"]
+
+ if "od" in class_vals:
+ found_od = True
+ assert "0001" in exp_vals
+ assert "1" in param_vals and "2" in param_vals
+ if "rd" in class_vals:
+ if set(param_vals) >= {"3", "4"}:
+ found_rd_34 = True
+ if set(param_vals) >= {"5", "6"}:
+ found_rd_56 = True
+
+ assert found_od and found_rd_34 and found_rd_56
diff --git a/py_qubed_meteo/tests/test_qubed_meteo_api.py b/py_qubed_meteo/tests/test_qubed_meteo_api.py
new file mode 100644
index 00000000..05bccd4e
--- /dev/null
+++ b/py_qubed_meteo/tests/test_qubed_meteo_api.py
@@ -0,0 +1,23 @@
+from qubed import PyQube
+import qubed_meteo
+
+
+MARS_LIST_SAMPLE = """class=od,expver=1,param=2
+class=rd,expver=2,param=3
+"""
+
+
+def test_from_mars_list_py_produces_parseable_ascii() -> None:
+ ascii_tree = qubed_meteo.from_mars_list_py(MARS_LIST_SAMPLE)
+
+ # Parsing the adapter output through PyQube verifies end-to-end contract compatibility.
+ parsed = PyQube.from_ascii(ascii_tree)
+ datacubes = parsed.to_datacubes()
+
+ assert ascii_tree.startswith("root")
+ assert len(datacubes) >= 1
+
+
+def test_from_mars_list_py_handles_empty_input() -> None:
+ ascii_tree = qubed_meteo.from_mars_list_py("\n\n")
+ assert ascii_tree == "root\n"
diff --git a/pyproject.toml b/pyproject.toml
index e9415151..b6e7dd76 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,104 +1,18 @@
-[build-system]
-requires = ["maturin>=1.0,<2.0"]
-build-backend = "maturin"
-
[project]
name = "qubed"
-description = "A library that provides a tree of datacubes called Qube."
-readme = "README.md"
-authors = [
- {name = "Tom Hodson", email = "thomas.hodson@ecmwf.int"},
-]
-classifiers = [
- "Programming Language :: Rust",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
-]
-requires-python = ">= 3.11"
-dynamic = ["version"]
-dependencies = [
- "frozendict",
- "numpy>=1.26",
- "protobuf",
- "requests"
-]
-
-# Because this is a mixed rust/python project the structure is src/python/qubed rather than the more typical src/qubed
-# Since this is slightly non-standard so we have to explicitly tell setuptools the python source is there.
-[tool.setuptools.packages.find]
-where = ["src/python"]
-
-[project.scripts]
-qubed = "qubed.__main__:main"
-
-[tool.maturin]
-python-source = "src/python"
-module-name = "qubed.rust"
-features = ["pyo3/extension-module"]
-
-[tool.tox]
-requires = ["tox>=4.28"]
-env_list = [
- "3.13",
- "3.12",
- "3.11",
- "numpy1.x"
-]
-
-[tool.tox.gh.python]
-"3.13" = ["3.13"]
-"3.12" = ["3.12", "numpy1.x"]
-"3.11" = ["3.11"]
+version = "0.1.0"
+requires-python = ">=3.8"
+dependencies = []
-[tool.tox.env_run_base]
-description = "Run test under {base_python}"
-deps = [".[dev,cbor,stac_server]"]
-commands = [["pytest"]]
-
-[tool.tox.env.numpy1.x]
-description = "run tests with different numpy major versions"
-base_python = ["py312"]
-deps = [".[dev,cbor,stac_server]", "numpy<2"]
-
-[project.optional-dependencies]
-
-cli = [
- "rich",
- "click",
- "psutil",
- "pyfdb",
- "pyyaml",
-]
-
-stac_server = [
- "fastapi[standard]",
- "Jinja2",
-]
-
-docs = [
- "sphinx",
- "sphinx-rtd-theme",
- "myst_nb",
- "sphinx-autobuild",
- "jupyterlab",
- "ipykernel",
- "scipy",
- "objsize",
- "humanize",
- "pandas"
+[tool.uv.workspace]
+members = [
+ "py_qubed",
+ "py_qubed_meteo",
]
+# optional shared dev deps
+[dependency-groups]
dev = [
"pytest",
- "black",
- "ruff",
- "flake8",
- "pre-commit",
- "isort",
- "httpx",
-]
-
-# Support for the concise Binary Object Representation (CBOR) (RFC 8949)
-cbor = [
- "cbor2"
-]
+ "maturin",
+]
\ No newline at end of file
diff --git a/qubed/Cargo.toml b/qubed/Cargo.toml
new file mode 100644
index 00000000..41f2d80f
--- /dev/null
+++ b/qubed/Cargo.toml
@@ -0,0 +1,21 @@
+[package]
+name = "qubed"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+arrayvec = "0.7.6"
+itertools = "0.14.0"
+lasso = "0.7.3"
+serde_json = "1.0.145"
+serde_yaml = "0.9.34"
+slotmap = "1.0.7"
+smallbitvec = "2.6.0"
+tiny-str = "0.10.0"
+tiny-vec = "0.10.0"
+chrono = "0.4"
+rayon = "1.7"
+
+[lib]
+path = "src/lib.rs"
+crate-type = ["rlib"]
diff --git a/qubed/benches/bench_roaring.rs b/qubed/benches/bench_roaring.rs
new file mode 100644
index 00000000..67836c16
--- /dev/null
+++ b/qubed/benches/bench_roaring.rs
@@ -0,0 +1,316 @@
+// use roaring::bitmap::RoaringBitmap;
+
+// #[test]
+// pub fn benchmark_roaring_vs_sorted_array() {
+// // let mut data1 = vec![
+// // 0, 8, 9, 10, 31, 33, 34, 39, 40, 41, 42, 49, 60, 75, 76, 78, 79, 129, 130, 131, 132,
+// // 133, 134, 135, 136, 137, 139, 141, 142, 144, 146, 147, 148, 151, 157, 159, 164, 165,
+// // 166, 167, 168, 169, 170, 172, 175, 176, 177, 178, 179, 180, 181, 182, 183, 186, 187,
+// // 188, 195, 196, 201, 202, 205, 207, 208, 209, 210, 211, 212, 228, 235, 236, 246, 247,
+// // 248, 3008, 3020, 3062, 3073, 3074, 3075, 140221, 140229, 140230, 140231, 140232,
+// // 174096, 228002, 228021, 228023, 228024, 228029, 228038, 228050, 228051, 228058, 228089,
+// // 228090, 228129, 228141, 228143, 228144, 228164, 228216, 228218, 228219, 228221, 228228,
+// // 228235, 228236, 228246, 228247, 228251, 231001, 231002, 231040, 231041, 231044, 231045,
+// // 231046, 231047, 231048, 231049, 231057, 231058, 231067, 231070, 235015, 235017, 235018,
+// // 235019, 235020, 235021, 235031, 235033, 235034, 235035, 235036, 235037, 235038, 235039,
+// // 235040, 235041, 235042, 235043, 235049, 235050, 235051, 235052, 235053, 235055, 235071,
+// // 237120, 238105, 238382, 260015, 260028, 260046, 260048, 260058, 260109, 260155, 260199,
+// // 260238, 260242, 260259, 260318, 260320, 260360, 260646, 260647, 260654, 260655, 261002,
+// // 263000, 263001, 263002, 263003, 263004, 263008, 263009, 263021, 263022, 263100, 263101,
+// // 263114, 263115, 263121, 263122, 263123, 263124, 263500, 263501, 263505, 263506, 263507,
+// // ];
+
+// let mut data1 = vec![
+// 0, 8, 9, 10, 31, 33, 34, 39, 40, 41, 42, 49, 60, 75, 76, 78, 79, 129, 130, 131, 132, 133,
+// 134, 135, 136, 137, 139, 141, 142, 144, 146, 147, 148, 151, 157, 159, 164, 165, 166, 167,
+// 168, 169, 170, 172, 175, 176, 177, 178, 179, 180, 181, 182, 183, 186, 187, 188, 195, 196,
+// 201, 202, 205, 207, 208, 209, 210, 211, 212, 228, 235, 236, 246, 247, 248,
+// ];
+
+// // Replicate 5x with offsets
+// let original_len = data1.len() as u32;
+
+// for i in 1..100 {
+// let offset = i * 300;
+// for i in 0..original_len {
+// data1.push(data1[i as usize] + offset);
+// }
+// }
+
+// data1.sort();
+// data1.dedup();
+
+// let mut data2: Vec = data1
+// .iter()
+// .step_by(2)
+// .copied()
+// .chain(vec![1, 2, 3, 4, 5, 6, 7].into_iter())
+// .collect();
+// data2.sort();
+// data2.dedup();
+
+// // println!("Data 1: {:?}", data1);
+// // println!("Data 2: {:?}", data2);
+
+// // === Setup Roaring Bitmaps ===
+// let mut bitmap1 = RoaringBitmap::new();
+// for &val in &data1 {
+// bitmap1.insert(val);
+// }
+
+// let mut bitmap2 = RoaringBitmap::new();
+// for &val in &data2 {
+// bitmap2.insert(val);
+// }
+
+// println!("=== Data Setup ===");
+// println!("Data1 size: {} elements", data1.len());
+// println!("Data2 size: {} elements", data2.len());
+// println!("Bitmap1 cardinality: {}", bitmap1.len());
+// println!("Bitmap2 cardinality: {}", bitmap2.len());
+// println!();
+
+// // Helper function for sorted array intersection using two pointers
+// fn array_intersection(a: &[u32], b: &[u32]) -> Vec {
+// let mut result = Vec::new();
+// let mut i = 0;
+// let mut j = 0;
+
+// while i < a.len() && j < b.len() {
+// if a[i] == b[j] {
+// result.push(a[i]);
+// i += 1;
+// j += 1;
+// } else if a[i] < b[j] {
+// i += 1;
+// } else {
+// j += 1;
+// }
+// }
+// result
+// }
+
+// // Helper function for sorted array union
+// fn array_union(a: &[u32], b: &[u32]) -> Vec {
+// let mut result = Vec::new();
+// let mut i = 0;
+// let mut j = 0;
+
+// while i < a.len() && j < b.len() {
+// if a[i] == b[j] {
+// result.push(a[i]);
+// i += 1;
+// j += 1;
+// } else if a[i] < b[j] {
+// result.push(a[i]);
+// i += 1;
+// } else {
+// result.push(b[j]);
+// j += 1;
+// }
+// }
+// result.extend_from_slice(&a[i..]);
+// result.extend_from_slice(&b[j..]);
+// result
+// }
+
+// // Helper function for sorted array difference
+// fn array_difference(a: &[u32], b: &[u32]) -> Vec {
+// let mut result = Vec::new();
+// let mut i = 0;
+// let mut j = 0;
+
+// while i < a.len() {
+// if j >= b.len() {
+// result.extend_from_slice(&a[i..]);
+// break;
+// }
+
+// if a[i] == b[j] {
+// i += 1;
+// j += 1;
+// } else if a[i] < b[j] {
+// result.push(a[i]);
+// i += 1;
+// } else {
+// j += 1;
+// }
+// }
+// result
+// }
+
+// // Helper function for sorted array symmetric difference
+// fn array_sym_diff(a: &[u32], b: &[u32]) -> Vec {
+// let mut result = Vec::new();
+// let mut i = 0;
+// let mut j = 0;
+
+// while i < a.len() && j < b.len() {
+// if a[i] == b[j] {
+// i += 1;
+// j += 1;
+// } else if a[i] < b[j] {
+// result.push(a[i]);
+// i += 1;
+// } else {
+// result.push(b[j]);
+// j += 1;
+// }
+// }
+// result.extend_from_slice(&a[i..]);
+// result.extend_from_slice(&b[j..]);
+// result
+// }
+
+// println!("=== MEMORY ===");
+// println!(
+// "Roaring bitmap1 serialized size: ~{} bytes",
+// bitmap1.serialized_size()
+// );
+// println!(
+// "Sorted array1 size: {} bytes",
+// data1.len() * std::mem::size_of::()
+// );
+
+// println!("=== INTERSECTION ===");
+// // Roaring intersection
+// let start = std::time::Instant::now();
+// let mut roaring_result = None;
+// for _ in 0..10000 {
+// roaring_result = Some(&bitmap1 & &bitmap2);
+// }
+// let roaring_time = start.elapsed();
+// let roaring_intersection = roaring_result.unwrap();
+// println!(
+// "Roaring (10k iterations): {:?}, result cardinality: {}",
+// roaring_time,
+// roaring_intersection.len()
+// );
+
+// // Array intersection
+// let start = std::time::Instant::now();
+// let mut array_result = Vec::new();
+// for _ in 0..10000 {
+// array_result = array_intersection(&data1, &data2);
+// }
+// let array_time = start.elapsed();
+// println!(
+// "Sorted Array (10k iterations): {:?}, result cardinality: {}",
+// array_time,
+// array_result.len()
+// );
+// println!(
+// "Roaring is {:.2}x faster",
+// array_time.as_secs_f64() / roaring_time.as_secs_f64()
+// );
+// println!();
+
+// println!("=== UNION ===");
+// // Roaring union
+// let start = std::time::Instant::now();
+// let mut roaring_result = None;
+// for _ in 0..10000 {
+// roaring_result = Some(&bitmap1 | &bitmap2);
+// }
+// let roaring_time = start.elapsed();
+// let roaring_union = roaring_result.unwrap();
+// println!(
+// "Roaring (10k iterations): {:?}, result cardinality: {}",
+// roaring_time,
+// roaring_union.len()
+// );
+
+// // Array union
+// let start = std::time::Instant::now();
+// let mut array_result = Vec::new();
+// for _ in 0..10000 {
+// array_result = array_union(&data1, &data2);
+// }
+// let array_time = start.elapsed();
+// println!(
+// "Sorted Array (10k iterations): {:?}, result cardinality: {}",
+// array_time,
+// array_result.len()
+// );
+// println!(
+// "Roaring is {:.2}x faster",
+// array_time.as_secs_f64() / roaring_time.as_secs_f64()
+// );
+// println!();
+
+// println!("=== DIFFERENCE ===");
+// // Roaring difference
+// let start = std::time::Instant::now();
+// let mut roaring_result = None;
+// for _ in 0..10000 {
+// roaring_result = Some(&bitmap1 - &bitmap2);
+// }
+// let roaring_time = start.elapsed();
+// let roaring_difference = roaring_result.unwrap();
+// println!(
+// "Roaring (10k iterations): {:?}, result cardinality: {}",
+// roaring_time,
+// roaring_difference.len()
+// );
+
+// // Array difference
+// let start = std::time::Instant::now();
+// let mut array_result = Vec::new();
+// for _ in 0..10000 {
+// array_result = array_difference(&data1, &data2);
+// }
+// let array_time = start.elapsed();
+// println!(
+// "Sorted Array (10k iterations): {:?}, result cardinality: {}",
+// array_time,
+// array_result.len()
+// );
+// println!(
+// "Roaring is {:.2}x faster",
+// array_time.as_secs_f64() / roaring_time.as_secs_f64()
+// );
+// println!();
+
+// println!("=== SYMMETRIC DIFFERENCE ===");
+// // Roaring symmetric difference
+// let start = std::time::Instant::now();
+// let mut roaring_result = None;
+// for _ in 0..10000 {
+// roaring_result = Some(&bitmap1 ^ &bitmap2);
+// }
+// let roaring_time = start.elapsed();
+// let roaring_sym_diff = roaring_result.unwrap();
+// println!(
+// "Roaring (10k iterations): {:?}, result cardinality: {}",
+// roaring_time,
+// roaring_sym_diff.len()
+// );
+
+// // Array symmetric difference
+// let start = std::time::Instant::now();
+// let mut array_result = Vec::new();
+// for _ in 0..10000 {
+// array_result = array_sym_diff(&data1, &data2);
+// }
+// let array_time = start.elapsed();
+// println!(
+// "Sorted Array (10k iterations): {:?}, result cardinality: {}",
+// array_time,
+// array_result.len()
+// );
+// println!(
+// "Roaring is {:.2}x faster",
+// array_time.as_secs_f64() / roaring_time.as_secs_f64()
+// );
+// println!();
+
+// println!("=== MEMORY ===");
+// println!(
+// "Roaring bitmap1 serialized size: ~{} bytes",
+// bitmap1.serialized_size()
+// );
+// println!(
+// "Sorted array1 size: {} bytes",
+// data1.len() * std::mem::size_of::()
+// );
+// }
diff --git a/qubed/notes.md b/qubed/notes.md
new file mode 100644
index 00000000..a99c19e9
--- /dev/null
+++ b/qubed/notes.md
@@ -0,0 +1,44 @@
+# Arenas
+
+Implementing the tree with arena storage makes sense because:
+ * it allows us to do multiple linked nodes (link to parent and child) without Arc/RefCell
+ * it keeps nodes relatively contiguous in memory, which improves cache performance
+ * the general creation/iteration direction of the tree is depth-first. If it was breadth-first then regular vec storage of children might be better.
+
+
+The choice of arena is complicated.
+
+https://donsz.nl/blog/arenas/
+
+Those that provide a deref to the stored object reduce indirection, but can never move data around. Their data storage tends to be less efficient.
+
+Its not clear if we need an arena which supports deletion.
+
+Let's start with SlotMap and see how that goes.
+
+
+Arguably we don't need a space-reclaiming arena, because the tree could be append-only. Removing nodes can leave them dangling, with a reallocation of the whole arena later, or we
+forbid child deletion.
+
+We probably do need a Drop supporting arena, because nodes may own resources, though they could just own indices to other linked arenas.
+
+Cannot use any arena which uses deref or pointers, because we want the shared lifetime of the tree nodes.
+
+Speed probably doesn't matter much. We are not inserting 1000's of nodes. Main bottleneck will be query comparisons.
+ * We should optimise to make the Values as cache-friendly as possible, but they should be anyway.
+
+
+# Key Interning
+
+Keys of the nodes are interned to reduce memory usage.
+
+# Value storage
+
+Nodes of the Qube store multiple values. The values are an enum of different types which can be compressed differently. Care should be taken to ensure set operations can be done efficiently on different value storage types.
+
+# Selects and Unions
+
+A union of two Qubes involves recursively iterating the incoming nodes and merging them into the existing tree. For each merge, we need to check all children of the existing node and the children of the incoming node. If the keys are the same, and the structural hash of each pair of children are the same, we do set operations on the values to create three kinds of children:
+ * children only in the existing node
+ * children only in the incoming node
+ * children in both nodes, which need to be merged recursively
diff --git a/qubed/src/compress.rs b/qubed/src/compress.rs
new file mode 100644
index 00000000..4b35d527
--- /dev/null
+++ b/qubed/src/compress.rs
@@ -0,0 +1,226 @@
+use crate::coordinates::Coordinates;
+use crate::qube::{Dimension, NodeIdx, Qube};
+use std::collections::BTreeMap;
+use std::collections::HashMap;
+use std::sync::atomic::Ordering;
+use tiny_vec::TinyVec;
+
+impl Qube {
+ /// Creates a hash map where the keys are structural hashes of child nodes
+ /// and the values are vectors of node indices that share the same hash.
+ fn children_hash_map(
+ &mut self,
+ children: &BTreeMap>,
+ ) -> HashMap> {
+ let mut map: HashMap> = HashMap::new();
+
+ for (_dim, kids) in children.iter() {
+ for &c in kids.iter() {
+ let h = self.compute_structural_hash(c);
+ map.entry(h).or_default().push(c);
+ }
+ }
+ map
+ }
+
+ /// Checks if a node is a leaf node (i.e., it has no children).
+ fn is_leaf(&self, id: NodeIdx) -> bool {
+ self.node_ref(id).expect("valid node").children().is_empty()
+ }
+
+ /// Recursively prunes empty nodes from the tree.
+ fn prune_empty_nodes_recursively(&mut self, node_id: NodeIdx) {
+ let children: Vec = {
+ let node = self.node_ref(node_id).unwrap();
+ node.children().values().flat_map(|v| v.iter().copied()).collect()
+ };
+
+ for child in &children {
+ self.prune_empty_nodes_recursively(*child);
+ }
+
+ let keep: std::collections::HashSet = children
+ .into_iter()
+ .filter(|&child| !matches!(self.node_ref(child).unwrap().coords(), Coordinates::Empty))
+ .collect();
+
+ let parent = self.node_mut(node_id).unwrap();
+ for kids in parent.children_mut().values_mut() {
+ kids.retain(|id| keep.contains(id));
+ }
+ }
+
+ /// Invalidates the cached structural hash of a node.
+ fn invalidate_structural_hash(&mut self, id: NodeIdx) {
+ let node = self.node_mut(id).unwrap();
+ node.structural_hash().store(0, Ordering::Release);
+ }
+
+ /// Deduplicates the children of a node by merging nodes with identical structural hashes.
+ fn dedup_children_locally(&mut self, parent: NodeIdx) {
+ let snapshot = {
+ let node = self.node_ref(parent).unwrap();
+ node.children().clone()
+ };
+
+ for (dim, kids) in snapshot {
+ let mut seen: HashMap = HashMap::new();
+ let mut unique: Vec = Vec::new();
+
+ for &child in &kids {
+ let h = self.compute_structural_hash(child);
+
+ if seen.insert(h, child).is_none() {
+ unique.push(child);
+ }
+ }
+
+ let parent_node = self.node_mut(parent).unwrap();
+ parent_node.children_mut().insert(dim, unique.into());
+ }
+
+ self.invalidate_structural_hash(parent);
+ }
+
+ /// Recursively deduplicates nodes in the tree, starting from the given node.
+ fn dedup_recursively(&mut self, node_id: NodeIdx) {
+ let children: Vec = {
+ let node = self.node_ref(node_id).unwrap();
+ node.children().values().flat_map(|v| v.iter().copied()).collect()
+ };
+
+ for child in children {
+ self.dedup_recursively(child);
+ }
+
+ self.dedup_children_locally(node_id);
+ }
+
+ /// Merges two subtrees by merging their coordinates and children.
+ #[allow(dead_code)]
+ fn merge_subtrees(&mut self, target_id: NodeIdx, source_id: NodeIdx) {
+ // Merge the coordinates of the source node into the target node
+ {
+ let mut target_coords = self.node_ref(target_id).unwrap().coords().clone();
+ let source_coords = self.node_ref(source_id).unwrap().coords().clone();
+
+ let merged_coords = target_coords.merge_coords(&source_coords);
+ let target_node = self.node_mut(target_id).unwrap();
+ *target_node.coords_mut() = merged_coords;
+ }
+
+ // Recursively merge the children of the source node into the target node
+ let source_children = {
+ let source_node = self.node_ref(source_id).unwrap();
+ source_node.children().clone()
+ };
+
+ for (dim, source_child_ids) in source_children {
+ for source_child_id in source_child_ids {
+ let target_children = {
+ let target_node = self.node_ref(target_id).unwrap();
+ target_node.children().get(&dim).cloned().unwrap_or_default()
+ };
+
+ let mut merged_children = target_children.clone();
+ merged_children.push(source_child_id);
+
+ let target_node = self.node_mut(target_id).unwrap();
+ target_node.children_mut().insert(dim, merged_children.into());
+ }
+ }
+
+ // Invalidate the structural hash of the target node
+ self.invalidate_structural_hash(target_id);
+ }
+
+ /// Compresses the tree by merging nodes, pruning empty nodes, and deduplicating nodes.
+ pub fn compress(&mut self) {
+ // This method performs the following steps:
+ // 1. Compresses nodes recursively.
+ // 2. Prunes empty nodes from the tree.
+ // 3. Deduplicates nodes that may have become identical after compression.
+
+ let root = self.root();
+ self.compress_recursively(root);
+ self.prune_empty_nodes_recursively(root);
+ self.dedup_recursively(root);
+ }
+
+ /// Recursively compresses the tree, merging coordinates of child nodes where possible.
+ fn compress_recursively(&mut self, node_id: NodeIdx) {
+ let children: Vec = {
+ let node = self.node_ref(node_id).expect("Valid nodeIdx in tree");
+ node.children().values().flat_map(|v| v.iter().copied()).collect()
+ };
+
+ if children.is_empty() {
+ return;
+ }
+
+ let all_children_are_leaves = children.iter().all(|&id| self.is_leaf(id));
+
+ if all_children_are_leaves {
+ // group by dimension
+ let mut by_dim: HashMap> = HashMap::new();
+
+ for &child in &children {
+ let dim = *self.node_ref(child).unwrap().dim();
+ by_dim.entry(dim).or_default().push(child);
+ }
+
+ for group in by_dim.values() {
+ if group.len() > 1 {
+ self.merge_coords(group.to_vec());
+ }
+ }
+
+ return;
+ }
+
+ for child in children {
+ self.compress_recursively(child);
+ }
+
+ // children are fully compressed so we can hash & merge them
+ let children_map = {
+ let children = {
+ let node = self.node_ref(node_id).expect("Valid nodeIdx in tree");
+ node.children().clone()
+ };
+ self.children_hash_map(&children)
+ };
+
+ for group in children_map.values() {
+ if group.len() <= 1 {
+ continue; // nothing to merge
+ }
+
+ self.merge_coords(group.clone());
+ }
+ }
+
+ /// Merges the coordinates of a group of nodes into the first node in the group.
+ fn merge_coords(&mut self, group: Vec) {
+ // The coordinates of all other nodes in the group are set to `Coordinates::Empty`.
+
+ assert!(!group.is_empty());
+
+ let mut merged: Coordinates = { self.node_ref(group[0]).unwrap().coords().clone() };
+
+ for &id in group.iter().skip(1) {
+ let coords = self.node_ref(id).unwrap().coords();
+ merged.extend(coords);
+ }
+
+ {
+ let node = self.node_mut(group[0]).unwrap();
+ *node.coords_mut() = merged;
+ }
+
+ for &id in group.iter().skip(1) {
+ let node = self.node_mut(id).unwrap();
+ *node.coords_mut() = Coordinates::Empty;
+ }
+ }
+}
diff --git a/qubed/src/coordinates/datetime.rs b/qubed/src/coordinates/datetime.rs
new file mode 100644
index 00000000..7ed02a76
--- /dev/null
+++ b/qubed/src/coordinates/datetime.rs
@@ -0,0 +1,282 @@
+use std::hash::Hash;
+
+use chrono::{DateTime, NaiveDate, NaiveDateTime, NaiveTime, Utc};
+use tiny_vec::TinyVec;
+
+use crate::coordinates::{Coordinates, IntersectionResult};
+
+#[derive(Debug, Clone, PartialEq)]
+pub enum DateTimeCoordinates {
+ List(TinyVec),
+}
+
+impl DateTimeCoordinates {
+ pub(crate) fn extend(&mut self, new_coords: &DateTimeCoordinates) {
+ match (self, new_coords) {
+ (DateTimeCoordinates::List(list), DateTimeCoordinates::List(new_list)) => {
+ for v in new_list.iter() {
+ list.push(*v);
+ }
+ }
+ }
+ }
+
+ pub(crate) fn append(&mut self, new_coord: NaiveDateTime) {
+ match self {
+ DateTimeCoordinates::List(list) => list.push(new_coord),
+ }
+ }
+
+ pub(crate) fn len(&self) -> usize {
+ match self {
+ DateTimeCoordinates::List(list) => list.len(),
+ }
+ }
+
+ pub(crate) fn contains(&self, value: NaiveDateTime) -> bool {
+ match self {
+ DateTimeCoordinates::List(list) => list.iter().any(|&v| v == value),
+ }
+ }
+
+ pub(crate) fn to_string(&self) -> String {
+ match self {
+ DateTimeCoordinates::List(list) => list
+ .iter()
+ .map(|dt| dt.format("%Y-%m-%dT%H:%M:%S").to_string())
+ .collect::>()
+ .join("/"),
+ }
+ }
+
+ pub(crate) fn hash(&self, hasher: &mut std::collections::hash_map::DefaultHasher) {
+ "datetime".hash(hasher);
+ match self {
+ DateTimeCoordinates::List(list) => {
+ for dt in list.iter() {
+ // use seconds and nanoseconds for stable hashing
+ dt.and_utc().timestamp().hash(hasher);
+ dt.and_utc().timestamp_subsec_nanos().hash(hasher);
+ }
+ }
+ }
+ }
+
+ pub(crate) fn intersect(
+ &self,
+ other: &DateTimeCoordinates,
+ ) -> IntersectionResult {
+ match (self, other) {
+ (DateTimeCoordinates::List(list_a), DateTimeCoordinates::List(list_b)) => {
+ use std::collections::HashSet;
+
+ let mut set_b: HashSet = HashSet::new();
+ for v in list_b.iter() {
+ set_b.insert(*v);
+ }
+
+ let mut set_a: HashSet = HashSet::new();
+ for v in list_a.iter() {
+ set_a.insert(*v);
+ }
+
+ let mut intersection = TinyVec::new();
+ let mut only_a = TinyVec::new();
+
+ let mut added: HashSet = HashSet::new();
+ for v in list_a.iter() {
+ if set_b.contains(v) {
+ if !added.contains(v) {
+ intersection.push(*v);
+ added.insert(*v);
+ }
+ } else {
+ only_a.push(*v);
+ }
+ }
+
+ let mut only_b = TinyVec::new();
+ for v in list_b.iter() {
+ if !set_a.contains(v) {
+ only_b.push(*v);
+ }
+ }
+
+ IntersectionResult {
+ intersection: DateTimeCoordinates::List(intersection),
+ only_a: DateTimeCoordinates::List(only_a),
+ only_b: DateTimeCoordinates::List(only_b),
+ }
+ }
+ }
+ }
+
+ /// Try to parse a string into `NaiveDateTime` using common formats.
+ pub(crate) fn parse_from_str(s: &str) -> Option {
+ // Try RFC3339 / ISO 8601
+ if let Ok(dt) = DateTime::parse_from_rfc3339(s) {
+ return Some(dt.with_timezone(&Utc).naive_utc());
+ }
+
+ // Try YYYY-MM-DD HH:MM:SS
+ if let Ok(ndt) = NaiveDateTime::parse_from_str(s, "%Y-%m-%d %H:%M:%S") {
+ return Some(ndt);
+ }
+
+ // Try YYYY-MM-DD
+ if let Ok(d) = NaiveDate::parse_from_str(s, "%Y-%m-%d") {
+ return Some(NaiveDateTime::new(d, NaiveTime::from_hms_opt(0, 0, 0).unwrap()));
+ }
+
+ // Try YYYYMMDD
+ if s.len() == 8 {
+ if let Ok(d) = NaiveDate::parse_from_str(s, "%Y%m%d") {
+ return Some(NaiveDateTime::new(d, NaiveTime::from_hms_opt(0, 0, 0).unwrap()));
+ }
+ }
+
+ // Try compact datetime YYYYMMDDTHHMM
+ if s.len() == 13 {
+ if let Ok(ndt) = NaiveDateTime::parse_from_str(s, "%Y%m%dT%H%M") {
+ return Some(ndt);
+ }
+ }
+
+ None
+ }
+}
+
+impl Default for DateTimeCoordinates {
+ fn default() -> Self {
+ DateTimeCoordinates::List(TinyVec::new())
+ }
+}
+
+impl From for Coordinates {
+ fn from(value: NaiveDateTime) -> Self {
+ let mut vec = TinyVec::new();
+ vec.push(value);
+ Coordinates::DateTimes(DateTimeCoordinates::List(vec))
+ }
+}
+
+impl From for Coordinates {
+ fn from(value: DateTimeCoordinates) -> Self {
+ Coordinates::DateTimes(value)
+ }
+}
+
+impl From<&str> for DateTimeCoordinates {
+ fn from(value: &str) -> Self {
+ if let Some(ndt) = DateTimeCoordinates::parse_from_str(value) {
+ let mut vec = TinyVec::new();
+ vec.push(ndt);
+ DateTimeCoordinates::List(vec)
+ } else {
+ DateTimeCoordinates::default()
+ }
+ }
+}
+
+impl From<&[NaiveDateTime]> for Coordinates {
+ fn from(value: &[NaiveDateTime]) -> Self {
+ let mut vec = TinyVec::new();
+ for &v in value {
+ vec.push(v);
+ }
+ Coordinates::DateTimes(DateTimeCoordinates::List(vec))
+ }
+}
+
+impl From<&[NaiveDateTime; N]> for Coordinates {
+ fn from(value: &[NaiveDateTime; N]) -> Self {
+ let mut vec = TinyVec::new();
+ for &v in value.iter() {
+ vec.push(v);
+ }
+ Coordinates::DateTimes(DateTimeCoordinates::List(vec))
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_datetime_append_and_len() {
+ let mut coords = DateTimeCoordinates::default();
+ let d1 = NaiveDate::from_ymd(2020, 1, 1).and_hms(0, 0, 0);
+ let d2 = NaiveDate::from_ymd(2020, 1, 2).and_hms(12, 30, 0);
+ coords.append(d1);
+ coords.append(d2);
+
+ match coords {
+ DateTimeCoordinates::List(list) => {
+ assert_eq!(list.len(), 2);
+ assert_eq!(list[0], d1);
+ assert_eq!(list[1], d2);
+ }
+ }
+ }
+
+ #[test]
+ fn test_datetime_extend() {
+ let mut a = DateTimeCoordinates::default();
+ let d1 = NaiveDate::from_ymd(2020, 1, 1).and_hms(0, 0, 0);
+ let d2 = NaiveDate::from_ymd(2020, 1, 2).and_hms(0, 0, 0);
+ a.append(d1);
+
+ let mut b = DateTimeCoordinates::default();
+ b.append(d2);
+
+ a.extend(&b);
+
+ match a {
+ DateTimeCoordinates::List(list) => {
+ assert_eq!(list.len(), 2);
+ assert_eq!(list[0], d1);
+ assert_eq!(list[1], d2);
+ }
+ }
+ }
+
+ #[test]
+ fn test_datetime_to_string_and_parse() {
+ let d = NaiveDate::from_ymd(2021, 5, 4).and_hms(6, 7, 8);
+ let mut c = DateTimeCoordinates::default();
+ c.append(d);
+ let s = c.to_string();
+ assert!(s.contains("2021-05-04T06:07:08"));
+
+ // parse from iso string
+ let parsed = DateTimeCoordinates::parse_from_str("2021-05-04T06:07:08Z");
+ assert!(parsed.is_some());
+ assert_eq!(parsed.unwrap(), d);
+ }
+
+ #[test]
+ fn test_datetime_intersect() {
+ let mut a = DateTimeCoordinates::default();
+ let d1 = NaiveDate::from_ymd(2020, 1, 1).and_hms(0, 0, 0);
+ let d2 = NaiveDate::from_ymd(2020, 1, 2).and_hms(0, 0, 0);
+ let d3 = NaiveDate::from_ymd(2020, 1, 3).and_hms(0, 0, 0);
+ a.append(d1);
+ a.append(d2);
+ a.append(d3);
+
+ let mut b = DateTimeCoordinates::default();
+ b.append(d2);
+ b.append(d3);
+ b.append(NaiveDate::from_ymd(2020, 1, 4).and_hms(0, 0, 0));
+
+ let res = a.intersect(&b);
+
+ match res.intersection {
+ DateTimeCoordinates::List(list) => {
+ assert_eq!(list.len(), 2);
+ assert_eq!(list[0], d2);
+ assert_eq!(list[1], d3);
+ }
+ }
+ }
+}
diff --git a/qubed/src/coordinates/floats.rs b/qubed/src/coordinates/floats.rs
new file mode 100644
index 00000000..d0ce070e
--- /dev/null
+++ b/qubed/src/coordinates/floats.rs
@@ -0,0 +1,324 @@
+use std::hash::Hash;
+
+use crate::coordinates::{Coordinates, IntersectionResult};
+use tiny_vec::TinyVec;
+
+#[derive(Debug, Clone, PartialEq)]
+pub enum FloatCoordinates {
+ List(TinyVec),
+}
+
+impl FloatCoordinates {
+ pub(crate) fn extend(&mut self, new_coords: &FloatCoordinates) {
+ match (self, new_coords) {
+ (FloatCoordinates::List(list), FloatCoordinates::List(new_list)) => {
+ for &v in new_list.iter() {
+ list.push(v);
+ }
+ }
+ }
+ }
+
+ pub(crate) fn append(&mut self, new_coord: f64) {
+ match self {
+ FloatCoordinates::List(list) => list.push(new_coord),
+ }
+ }
+
+ pub(crate) fn len(&self) -> usize {
+ match self {
+ FloatCoordinates::List(list) => list.len(),
+ }
+ }
+
+ pub(crate) fn contains(&self, value: f64) -> bool {
+ match self {
+ FloatCoordinates::List(list) => list.iter().any(|&v| v.to_bits() == value.to_bits()),
+ }
+ }
+
+ pub(crate) fn to_string(&self) -> String {
+ match self {
+ FloatCoordinates::List(list) => {
+ list.iter().map(|v| v.to_string()).collect::>().join("/")
+ }
+ }
+ }
+
+ pub(crate) fn hash(&self, hasher: &mut std::collections::hash_map::DefaultHasher) {
+ "floats".hash(hasher);
+ match self {
+ FloatCoordinates::List(list) => {
+ for val in list.iter() {
+ val.to_bits().hash(hasher);
+ }
+ }
+ }
+ }
+
+ pub(crate) fn intersect(
+ &self,
+ other: &FloatCoordinates,
+ ) -> IntersectionResult {
+ match (self, other) {
+ (FloatCoordinates::List(list_a), FloatCoordinates::List(list_b)) => {
+ use std::collections::HashSet;
+
+ let mut set_a: HashSet = HashSet::new();
+ for v in list_a.iter() {
+ set_a.insert(v.to_bits());
+ }
+
+ let mut set_b: HashSet = HashSet::new();
+ for v in list_b.iter() {
+ set_b.insert(v.to_bits());
+ }
+
+ let mut intersection = TinyVec::new();
+ let mut only_a = TinyVec::new();
+ let mut only_b = TinyVec::new();
+
+ // preserve order from list_a for intersection and only_a
+ let mut added: HashSet = HashSet::new();
+ for v in list_a.iter() {
+ let bits = v.to_bits();
+ if set_b.contains(&bits) {
+ if !added.contains(&bits) {
+ intersection.push(*v);
+ added.insert(bits);
+ }
+ } else {
+ only_a.push(*v);
+ }
+ }
+
+ // for only_b, preserve order from list_b skipping those present in set_a
+ for v in list_b.iter() {
+ let bits = v.to_bits();
+ if !set_a.contains(&bits) {
+ only_b.push(*v);
+ }
+ }
+
+ IntersectionResult {
+ intersection: FloatCoordinates::List(intersection),
+ only_a: FloatCoordinates::List(only_a),
+ only_b: FloatCoordinates::List(only_b),
+ }
+ }
+ }
+ }
+}
+
+impl Default for FloatCoordinates {
+ fn default() -> Self {
+ FloatCoordinates::List(TinyVec::new())
+ }
+}
+
+impl From for Coordinates {
+ fn from(value: f64) -> Self {
+ let mut vec = TinyVec::new();
+ vec.push(value);
+ Coordinates::Floats(FloatCoordinates::List(vec))
+ }
+}
+
+impl From for Coordinates {
+ fn from(value: FloatCoordinates) -> Self {
+ Coordinates::Floats(value)
+ }
+}
+
+impl From<&[f64]> for Coordinates {
+ fn from(value: &[f64]) -> Self {
+ let mut vec = TinyVec::new();
+ for &v in value {
+ vec.push(v);
+ }
+ Coordinates::Floats(FloatCoordinates::List(vec))
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use tiny_vec::TinyVec;
+
+ #[test]
+ fn test_float_coordinates_append_and_len() {
+ let mut coords = FloatCoordinates::default();
+ coords.append(1.0);
+ coords.append(2.5);
+
+ match coords {
+ FloatCoordinates::List(list) => {
+ assert_eq!(list.len(), 2);
+ assert_eq!(list[0], 1.0);
+ assert_eq!(list[1], 2.5);
+ }
+ }
+ }
+
+ #[test]
+ fn test_float_coordinates_extend() {
+ let mut a = FloatCoordinates::default();
+ a.append(1.0);
+ a.append(2.0);
+
+ let mut b = FloatCoordinates::default();
+ b.append(3.0);
+ b.append(4.0);
+
+ a.extend(&b);
+
+ match a {
+ FloatCoordinates::List(list) => {
+ assert_eq!(list.len(), 4);
+ assert_eq!(list[0], 1.0);
+ assert_eq!(list[1], 2.0);
+ assert_eq!(list[2], 3.0);
+ assert_eq!(list[3], 4.0);
+ }
+ }
+ }
+
+ #[test]
+ fn test_float_coordinates_to_string() {
+ let mut c = FloatCoordinates::default();
+ c.append(1.25);
+ c.append(2.5);
+ let s = c.to_string();
+ assert!(s.contains("1.25"));
+ assert!(s.contains("2.5"));
+ }
+
+ #[test]
+ fn test_float_coordinates_intersect() {
+ let mut a = FloatCoordinates::default();
+ a.append(1.0);
+ a.append(2.0);
+ a.append(3.0);
+
+ let mut b = FloatCoordinates::default();
+ b.append(2.0);
+ b.append(3.0);
+ b.append(4.0);
+
+ let result = a.intersect(&b);
+
+ match result.intersection {
+ FloatCoordinates::List(list) => {
+ assert_eq!(list.len(), 2);
+ assert_eq!(list[0], 2.0);
+ assert_eq!(list[1], 3.0);
+ }
+ }
+
+ match result.only_a {
+ FloatCoordinates::List(list) => {
+ assert_eq!(list.len(), 1);
+ assert_eq!(list[0], 1.0);
+ }
+ }
+
+ match result.only_b {
+ FloatCoordinates::List(list) => {
+ assert_eq!(list.len(), 1);
+ assert_eq!(list[0], 4.0);
+ }
+ }
+ }
+
+ #[test]
+ fn test_from_conversions() {
+ // From
+ let c = Coordinates::from(3.14f64);
+ match c {
+ Coordinates::Floats(fc) => match fc {
+ FloatCoordinates::List(list) => {
+ assert_eq!(list.len(), 1);
+ assert!((list[0] - 3.14).abs() < 1e-12);
+ }
+ },
+ _ => panic!("Expected Coordinates::Floats variant"),
+ }
+
+ // From<&[f64]>
+ let slice = &[1.0f64, 2.0f64, 3.0f64][..];
+ let c2 = Coordinates::from(slice);
+ match c2 {
+ Coordinates::Floats(fc) => match fc {
+ FloatCoordinates::List(list) => {
+ assert_eq!(list.len(), 3);
+ assert_eq!(list[0], 1.0);
+ assert_eq!(list[2], 3.0);
+ }
+ },
+ _ => panic!("Expected Coordinates::Floats variant"),
+ }
+
+ // From<&[f64; N]>
+ let arr: [f64; 2] = [9.0, 10.0];
+ let c3 = Coordinates::from(&arr);
+ match c3 {
+ Coordinates::Floats(fc) => match fc {
+ FloatCoordinates::List(list) => {
+ assert_eq!(list.len(), 2);
+ assert_eq!(list[0], 9.0);
+ assert_eq!(list[1], 10.0);
+ }
+ },
+ _ => panic!("Expected Coordinates::Floats variant"),
+ }
+
+ // From
+ let mut fc = FloatCoordinates::default();
+ fc.append(7.5);
+ let c4 = Coordinates::from(fc.clone());
+ match c4 {
+ Coordinates::Floats(inner) => {
+ assert_eq!(inner, fc);
+ }
+ _ => panic!("Expected Coordinates::Floats variant"),
+ }
+ }
+}
+
+impl From<&[f64; N]> for Coordinates {
+ fn from(value: &[f64; N]) -> Self {
+ let mut vec = TinyVec::new();
+ for &v in value.iter() {
+ vec.push(v);
+ }
+ Coordinates::Floats(FloatCoordinates::List(vec))
+ }
+}
+
+impl From for Coordinates {
+ fn from(value: f32) -> Self {
+ let mut vec = TinyVec::new();
+ vec.push(value as f64);
+ Coordinates::Floats(FloatCoordinates::List(vec))
+ }
+}
+
+impl From<&[f32]> for Coordinates {
+ fn from(value: &[f32]) -> Self {
+ let mut vec = TinyVec::new();
+ for &v in value {
+ vec.push(v as f64);
+ }
+ Coordinates::Floats(FloatCoordinates::List(vec))
+ }
+}
+
+impl From<&[f32; N]> for Coordinates {
+ fn from(value: &[f32; N]) -> Self {
+ let mut vec = TinyVec::new();
+ for &v in value.iter() {
+ vec.push(v as f64);
+ }
+ Coordinates::Floats(FloatCoordinates::List(vec))
+ }
+}
diff --git a/qubed/src/coordinates/integers.rs b/qubed/src/coordinates/integers.rs
new file mode 100644
index 00000000..5ad704ea
--- /dev/null
+++ b/qubed/src/coordinates/integers.rs
@@ -0,0 +1,190 @@
+use std::hash::Hash;
+
+use crate::coordinates::{Coordinates, IntersectionResult};
+use crate::utils::tiny_ordered_set::TinyOrderedSet;
+use tiny_vec::TinyVec;
+
+#[derive(Debug, Clone, PartialEq)]
+pub enum IntegerCoordinates {
+ Set(TinyOrderedSet),
+ RangeSet(TinyVec),
+}
+
+#[derive(Debug, Clone, PartialEq)]
+pub struct IntegerRange {
+ start: i32,
+ end: i32,
+ step: std::num::NonZeroU16,
+}
+
+impl IntegerCoordinates {
+ pub(crate) fn extend(&mut self, new_coords: &IntegerCoordinates) {
+ match new_coords {
+ IntegerCoordinates::Set(set) => {
+ for val in set.iter() {
+ self.append(*val);
+ }
+ }
+ IntegerCoordinates::RangeSet(_) => {
+ unimplemented!("Integer Range compression not currently supported");
+ }
+ }
+ }
+
+ pub(crate) fn append(&mut self, new_coord: i32) {
+ match self {
+ IntegerCoordinates::Set(set) => {
+ set.insert(new_coord);
+ }
+ IntegerCoordinates::RangeSet(_) => {
+ unimplemented!("Integer Range compression not currently supported");
+ }
+ }
+ }
+
+ pub(crate) fn len(&self) -> usize {
+ match self {
+ IntegerCoordinates::Set(list) => list.len(),
+ IntegerCoordinates::RangeSet(_) => {
+ unimplemented!("Integer Range compression not currently supported")
+ }
+ }
+ }
+
+ pub(crate) fn to_string(&self) -> String {
+ match self {
+ IntegerCoordinates::Set(set) => {
+ set.iter().map(|v| v.to_string()).collect::>().join("/")
+ }
+ IntegerCoordinates::RangeSet(ranges) => ranges
+ .iter()
+ .map(|v| format!("{}:{}:{}", v.start, v.step, v.end))
+ .collect::>()
+ .join("/"),
+ }
+ }
+
+ pub(crate) fn intersect(
+ &self,
+ other: &IntegerCoordinates,
+ ) -> IntersectionResult {
+ match (self, other) {
+ (IntegerCoordinates::Set(set_a), IntegerCoordinates::Set(set_b)) => {
+ let result = set_a.intersect(set_b);
+ IntersectionResult {
+ intersection: IntegerCoordinates::Set(result.intersection),
+ only_a: IntegerCoordinates::Set(result.only_a),
+ only_b: IntegerCoordinates::Set(result.only_b),
+ }
+ }
+ _ => {
+ unimplemented!("Integer Range compression not currently supported");
+ }
+ }
+ }
+
+ pub(crate) fn hash(&self, hasher: &mut impl std::hash::Hasher) {
+ "integer_coordinates".hash(hasher);
+ match self {
+ IntegerCoordinates::Set(set) => {
+ "set".hash(hasher);
+ set.hash(hasher);
+ }
+ IntegerCoordinates::RangeSet(ranges) => {
+ "range_set".hash(hasher);
+ for range in ranges.iter() {
+ range.start.hash(hasher);
+ range.end.hash(hasher);
+ range.step.hash(hasher);
+ }
+ }
+ }
+ }
+}
+
+impl From for Coordinates {
+ fn from(value: IntegerCoordinates) -> Self {
+ Coordinates::Integers(value)
+ }
+}
+
+impl From for Coordinates {
+ fn from(value: i32) -> Self {
+ let mut set = TinyOrderedSet::new();
+ set.insert(value);
+ Coordinates::Integers(IntegerCoordinates::Set(set))
+ }
+}
+
+impl From<&[i32]> for Coordinates {
+ fn from(value: &[i32]) -> Self {
+ let mut set = TinyOrderedSet::new();
+ for &v in value {
+ set.insert(v);
+ }
+ Coordinates::Integers(IntegerCoordinates::Set(set))
+ }
+}
+
+impl From<&[i32; N]> for Coordinates {
+ fn from(value: &[i32; N]) -> Self {
+ let mut set = TinyOrderedSet::new();
+ for &v in value {
+ set.insert(v);
+ }
+ Coordinates::Integers(IntegerCoordinates::Set(set))
+ }
+}
+
+impl Default for IntegerCoordinates {
+ fn default() -> Self {
+ IntegerCoordinates::Set(TinyOrderedSet::new())
+ }
+}
+
+impl IntegerCoordinates {
+ pub fn contains(&self, value: i32) -> bool {
+ match self {
+ IntegerCoordinates::Set(set) => set.contains(&value),
+ IntegerCoordinates::RangeSet(_) => unimplemented!("RangeSet contains not implemented"),
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_integer_coordinates_intersect_tiny_ordered_tiny_ordered() {
+ let mut coords_a = Coordinates::Empty;
+ coords_a.append(1);
+ coords_a.append(2);
+ coords_a.append(3);
+ coords_a.extend_from_iter([5, 8, 12, 20, 25, 199, -1].into_iter());
+
+ let mut coords_b = Coordinates::Empty;
+ coords_b.append(2);
+ coords_b.append(3);
+ coords_b.append(4);
+
+ let result = coords_a.intersect(&coords_b);
+
+ let mut expected_intersection = Coordinates::Empty;
+ expected_intersection.append(2);
+ expected_intersection.append(3);
+
+ let mut expected_only_a = Coordinates::Empty;
+ expected_only_a.append(1);
+ expected_only_a.extend_from_iter([5, 8, 12, 20, 25, 199, -1].into_iter());
+
+ let mut expected_only_b = Coordinates::Empty;
+ expected_only_b.append(4);
+
+ println!("Result: {:?}", result);
+
+ assert_eq!(result.intersection, expected_intersection);
+ assert_eq!(result.only_a, expected_only_a);
+ assert_eq!(result.only_b, expected_only_b);
+ }
+}
diff --git a/qubed/src/coordinates/mod.rs b/qubed/src/coordinates/mod.rs
new file mode 100644
index 00000000..caebe758
--- /dev/null
+++ b/qubed/src/coordinates/mod.rs
@@ -0,0 +1,574 @@
+pub mod datetime;
+pub mod floats;
+pub mod integers;
+pub mod ops;
+pub mod strings;
+use std::hash::Hash;
+
+use chrono::NaiveDateTime;
+use datetime::DateTimeCoordinates;
+use floats::FloatCoordinates;
+use integers::IntegerCoordinates;
+use strings::StringCoordinates;
+
+use crate::utils::tiny_ordered_set::TinyOrderedSet;
+
+// TODO: check for duplicates. Sets may be better than vecs.
+// TODO: Change MixedCoordinates to a HashMap (especially if we allow more types later)
+// TODO: Consider adding a catchall generic type
+
+#[derive(Debug, Clone, PartialEq)]
+pub enum Coordinates {
+ Empty,
+ Integers(IntegerCoordinates),
+ Floats(FloatCoordinates),
+ Strings(StringCoordinates),
+ DateTimes(DateTimeCoordinates),
+ Mixed(Box),
+}
+
+pub enum CoordinateTypes {
+ Integer(i32),
+ Float(f64),
+ String(String),
+ DateTime(NaiveDateTime),
+}
+
+#[derive(Debug, Clone, PartialEq, Default)]
+pub struct MixedCoordinates {
+ integers: integers::IntegerCoordinates,
+ floats: FloatCoordinates,
+ strings: StringCoordinates,
+ datetimes: DateTimeCoordinates,
+}
+
+impl Coordinates {
+ pub fn new() -> Self {
+ Coordinates::Empty
+ }
+
+ pub fn from_string(s: &str) -> Self {
+ if s.is_empty() {
+ return Coordinates::Empty;
+ }
+ let mut coords = Coordinates::Empty;
+ let split: Vec<&str> = s.split('/').collect();
+
+ for part in split {
+ // Check for leading zeros to preserve formatting (e.g., "0001")
+ let has_leading_zero = part.len() > 1
+ && part.starts_with('0')
+ && part.chars().nth(1).map_or(false, |c| c.is_ascii_digit());
+
+ if has_leading_zero {
+ // Preserve as string to keep formatting
+ coords.append(part.to_string());
+ } else if let Ok(int_val) = part.parse::() {
+ coords.append(int_val);
+ } else if let Ok(float_val) = part.parse::() {
+ coords.append(float_val);
+ } else {
+ coords.append(part.to_string());
+ }
+ }
+ coords
+ }
+
+ pub fn to_string(&self) -> String {
+ match self {
+ Coordinates::Empty => "".to_string(),
+ Coordinates::Integers(ints) => ints.to_string(),
+ Coordinates::Floats(floats) => floats.to_string(),
+ Coordinates::DateTimes(datetimes) => datetimes.to_string(),
+ Coordinates::Strings(strings) => strings.to_string(),
+ Coordinates::Mixed(mixed) => {
+ let mut parts: Vec = Vec::new();
+ let ints_str = mixed.integers.to_string();
+ if !ints_str.is_empty() {
+ parts.push(ints_str);
+ }
+ match &mixed.floats {
+ floats::FloatCoordinates::List(list) => {
+ for v in list.iter() {
+ parts.push(v.to_string());
+ }
+ }
+ }
+ let strings_str = mixed.strings.to_string();
+ if !strings_str.is_empty() {
+ parts.push(strings_str);
+ }
+ match &mixed.datetimes {
+ datetime::DateTimeCoordinates::List(list) => {
+ for v in list.iter() {
+ parts.push(v.format("%Y%m%dT%H%M").to_string());
+ }
+ }
+ }
+ parts.join("/")
+ }
+ }
+ }
+
+ pub fn len(&self) -> usize {
+ match self {
+ Coordinates::Empty => 0,
+ Coordinates::Integers(ints) => ints.len(),
+ Coordinates::Floats(floats) => floats.len(),
+ Coordinates::Strings(strings) => strings.len(),
+ Coordinates::DateTimes(datetimes) => datetimes.len(),
+ Coordinates::Mixed(mixed) => {
+ mixed.integers.len()
+ + mixed.floats.len()
+ + mixed.strings.len()
+ + mixed.datetimes.len()
+ }
+ }
+ }
+
+ pub fn is_empty(&self) -> bool {
+ self.len() == 0
+ }
+
+ pub fn contains(&self, value: T) -> bool
+ where
+ T: Into,
+ {
+ let coord_type = value.into();
+ match (self, coord_type) {
+ (Coordinates::Empty, _) => false,
+ (Coordinates::Integers(ints), CoordinateTypes::Integer(val)) => ints.contains(val),
+ (Coordinates::DateTimes(datetimes), CoordinateTypes::DateTime(val)) => {
+ datetimes.contains(val)
+ }
+ (Coordinates::Floats(floats), CoordinateTypes::Float(val)) => floats.contains(val),
+ (Coordinates::Strings(strings), CoordinateTypes::String(val)) => strings.contains(val),
+ (Coordinates::Mixed(mixed), CoordinateTypes::Integer(val)) => {
+ mixed.integers.contains(val)
+ }
+ (Coordinates::Mixed(mixed), CoordinateTypes::Float(val)) => mixed.floats.contains(val),
+ (Coordinates::Mixed(mixed), CoordinateTypes::DateTime(val)) => {
+ mixed.datetimes.contains(val)
+ }
+ (Coordinates::Mixed(mixed), CoordinateTypes::String(val)) => {
+ mixed.strings.contains(val)
+ }
+ _ => false,
+ }
+ }
+
+ fn convert_to_mixed(&mut self) -> &mut Self {
+ let mixed = match self {
+ Coordinates::Integers(ints) => {
+ Box::new(MixedCoordinates { integers: ints.to_owned(), ..Default::default() })
+ }
+ Coordinates::Floats(floats) => {
+ Box::new(MixedCoordinates { floats: floats.to_owned(), ..Default::default() })
+ }
+ Coordinates::Strings(strings) => {
+ Box::new(MixedCoordinates { strings: strings.to_owned(), ..Default::default() })
+ }
+ Coordinates::DateTimes(datetimes) => {
+ Box::new(MixedCoordinates { datetimes: datetimes.to_owned(), ..Default::default() })
+ }
+ Coordinates::Empty => Box::new(MixedCoordinates::default()),
+ Coordinates::Mixed(_) => {
+ return self;
+ }
+ };
+ *self = Coordinates::Mixed(mixed);
+ self
+ }
+
+ pub fn intersect(&self, _other: &Coordinates) -> IntersectionResult {
+ match (self, _other) {
+ (Coordinates::Integers(ints_a), Coordinates::Integers(ints_b)) => {
+ let result = ints_a.intersect(ints_b);
+ IntersectionResult {
+ intersection: Coordinates::Integers(result.intersection),
+ only_a: Coordinates::Integers(result.only_a),
+ only_b: Coordinates::Integers(result.only_b),
+ }
+ }
+ (Coordinates::Strings(strs_a), Coordinates::Strings(strs_b)) => {
+ let result = strs_a.intersect(strs_b);
+ IntersectionResult {
+ intersection: Coordinates::Strings(result.intersection),
+ only_a: Coordinates::Strings(result.only_a),
+ only_b: Coordinates::Strings(result.only_b),
+ }
+ }
+ // Cross-type: normalise both sides to strings, intersect on string
+ // representation, then return matching values in `self`'s original type.
+ (left, right) => {
+ // Build string-repr sets for both sides
+ let left_strs: std::collections::BTreeSet =
+ left.to_string().split('/').map(|s| s.to_string()).collect();
+ let right_strs: std::collections::BTreeSet =
+ right.to_string().split('/').map(|s| s.to_string()).collect();
+
+ let matching_strs: std::collections::BTreeSet<&String> =
+ left_strs.intersection(&right_strs).collect();
+
+ // Reconstruct result in left's type by re-parsing matched strings
+ let intersection = if matching_strs.is_empty() {
+ Coordinates::Empty
+ } else {
+ let joined =
+ matching_strs.iter().map(|s| s.as_str()).collect::>().join("/");
+ Coordinates::from_string(&joined)
+ };
+
+ let only_a_strs: std::collections::BTreeSet<&String> =
+ left_strs.difference(&right_strs).collect();
+ let only_a = if only_a_strs.is_empty() {
+ Coordinates::Empty
+ } else {
+ let joined =
+ only_a_strs.iter().map(|s| s.as_str()).collect::>().join("/");
+ Coordinates::from_string(&joined)
+ };
+
+ let only_b_strs: std::collections::BTreeSet<&String> =
+ right_strs.difference(&left_strs).collect();
+ let only_b = if only_b_strs.is_empty() {
+ Coordinates::Empty
+ } else {
+ let joined =
+ only_b_strs.iter().map(|s| s.as_str()).collect::>().join("/");
+ Coordinates::from_string(&joined)
+ };
+
+ IntersectionResult { intersection, only_a, only_b }
+ }
+ }
+ }
+
+ pub fn hash(&self, hasher: &mut std::collections::hash_map::DefaultHasher) {
+ match self {
+ Coordinates::Empty => {
+ "empty".hash(hasher);
+ 0.hash(hasher);
+ }
+ Coordinates::Integers(ints) => {
+ ints.hash(hasher);
+ }
+ Coordinates::Floats(floats) => {
+ floats.hash(hasher);
+ }
+ Coordinates::Strings(strings) => {
+ strings.hash(hasher);
+ }
+ Coordinates::Mixed(mixed) => {
+ "mixed".hash(hasher);
+ mixed.integers.hash(hasher);
+ mixed.floats.hash(hasher);
+ mixed.strings.hash(hasher);
+ mixed.datetimes.hash(hasher);
+ }
+ Coordinates::DateTimes(datetimes) => {
+ datetimes.hash(hasher);
+ }
+ }
+ }
+}
+
+impl Default for Coordinates {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+// ------------- Intersection ------------------
+
+#[derive(Debug, Clone, PartialEq)]
+pub struct IntersectionResult {
+ pub intersection: T,
+ pub only_a: T,
+ pub only_b: T,
+}
+
+impl TinyOrderedSet
+where
+ T: Ord + Clone,
+{
+ pub fn intersect(&self, other: &Self) -> IntersectionResult {
+ let mut intersection = Self::new();
+ let mut only_a = Self::new();
+ let mut only_b = Self::new();
+
+ let mut iter_a = self.iter().peekable();
+ let mut iter_b = other.iter().peekable();
+
+ loop {
+ match (iter_a.peek(), iter_b.peek()) {
+ (Some(&a), Some(&b)) => match a.cmp(b) {
+ std::cmp::Ordering::Equal => {
+ intersection.insert(a.clone());
+ iter_a.next();
+ iter_b.next();
+ }
+ std::cmp::Ordering::Less => {
+ only_a.insert(a.clone());
+ iter_a.next();
+ }
+ std::cmp::Ordering::Greater => {
+ only_b.insert(b.clone());
+ iter_b.next();
+ }
+ },
+ (Some(&a), None) => {
+ only_a.insert(a.clone());
+ iter_a.next();
+ }
+ (None, Some(&b)) => {
+ only_b.insert(b.clone());
+ iter_b.next();
+ }
+ (None, None) => break,
+ }
+ }
+
+ IntersectionResult { intersection, only_a, only_b }
+ }
+}
+
+impl Coordinates {
+ pub fn from_intersection(result: IntersectionResult) -> Coordinates {
+ let mut coords = result.intersection;
+ coords.extend(&result.only_a);
+ coords.extend(&result.only_b);
+ coords
+ }
+
+ pub fn merge_coords(&mut self, other_coords: &Coordinates) -> Coordinates {
+ let intersection_result = self.intersect(other_coords);
+ Coordinates::from_intersection(intersection_result)
+ }
+
+ /// Serialize coordinates into a serde_json::Value using native JSON types
+ pub fn to_json_value(&self) -> serde_json::Value {
+ use serde_json::{Number, Value};
+
+ match self {
+ Coordinates::Empty => Value::Array(vec![]),
+ Coordinates::Integers(ints) => match ints {
+ integers::IntegerCoordinates::Set(set) => {
+ let vals: Vec =
+ set.iter().map(|v| Value::Number(Number::from(*v as i64))).collect();
+ Value::Array(vals)
+ }
+ integers::IntegerCoordinates::RangeSet(_) => Value::String(ints.to_string()),
+ },
+ Coordinates::Floats(floats) => match floats {
+ floats::FloatCoordinates::List(list) => {
+ let vals: Vec = list
+ .iter()
+ .map(|f| {
+ serde_json::Number::from_f64(*f)
+ .map(Value::Number)
+ .unwrap_or(Value::Null)
+ })
+ .collect();
+ Value::Array(vals)
+ }
+ },
+ Coordinates::Strings(strings) => match strings {
+ strings::StringCoordinates::Set(list) => {
+ let vals: Vec =
+ list.iter().map(|s| Value::String(s.to_string())).collect();
+ Value::Array(vals)
+ }
+ },
+ Coordinates::Mixed(boxed) => {
+ let mut map = serde_json::Map::new();
+
+ match &boxed.integers {
+ integers::IntegerCoordinates::Set(set) => {
+ if set.len() > 0 {
+ let vals: Vec = set
+ .iter()
+ .map(|v| Value::Number(Number::from(*v as i64)))
+ .collect();
+ map.insert("ints".to_string(), Value::Array(vals));
+ }
+ }
+ integers::IntegerCoordinates::RangeSet(_) => {
+ // fallback to textual form
+ }
+ }
+
+ match &boxed.floats {
+ floats::FloatCoordinates::List(list) => {
+ if list.len() > 0 {
+ let vals: Vec = list
+ .iter()
+ .map(|f| {
+ serde_json::Number::from_f64(*f)
+ .map(Value::Number)
+ .unwrap_or(Value::Null)
+ })
+ .collect();
+ map.insert("floats".to_string(), Value::Array(vals));
+ }
+ }
+ }
+
+ match &boxed.strings {
+ strings::StringCoordinates::Set(list) => {
+ if list.len() > 0 {
+ let vals: Vec =
+ list.iter().map(|s| Value::String(s.to_string())).collect();
+ map.insert("strings".to_string(), Value::Array(vals));
+ }
+ }
+ }
+
+ match &boxed.datetimes {
+ datetime::DateTimeCoordinates::List(list) => {
+ if list.len() > 0 {
+ let vals: Vec = list
+ .iter()
+ .map(|dt: &NaiveDateTime| {
+ // Serialize NaiveDateTime as an ISO-like string without timezone.
+ Value::String(dt.format("%Y%m%dT%H%M").to_string())
+ })
+ .collect();
+ map.insert("datetimes".to_string(), Value::Array(vals));
+ }
+ }
+ }
+
+ Value::Object(map)
+ }
+ Coordinates::DateTimes(coords) => match coords {
+ datetime::DateTimeCoordinates::List(list) => {
+ let vals: Vec = list
+ .iter()
+ .map(|dt: &NaiveDateTime| {
+ Value::String(dt.format("%Y%m%dT%H%M").to_string())
+ })
+ .collect();
+ Value::Array(vals)
+ }
+ },
+ }
+ }
+
+ /// Deserialize coordinates from a serde_json::Value produced by `to_json_value`.
+ pub fn from_json_value(value: &serde_json::Value) -> Result {
+ use serde_json::Value;
+
+ match value {
+ Value::Array(arr) => {
+ if arr.is_empty() {
+ return Ok(Coordinates::Empty);
+ }
+
+ // Check element types: integers, floats, or strings
+ let mut all_int = true;
+ let mut any_float = false;
+ let mut all_string = true;
+
+ for v in arr.iter() {
+ match v {
+ Value::Number(n) => {
+ all_string = false;
+ if n.as_i64().is_none() {
+ all_int = false;
+ any_float = true;
+ }
+ }
+ Value::String(_) => {
+ all_int = false;
+ all_string = all_string && true;
+ }
+ _ => return Err("Unsupported coord element type".to_string()),
+ }
+ }
+
+ if all_int && !any_float {
+ let mut coords = integers::IntegerCoordinates::default();
+ for v in arr.iter() {
+ if let Value::Number(n) = v {
+ if let Some(i) = n.as_i64() {
+ coords.append(i as i32);
+ }
+ }
+ }
+ return Ok(Coordinates::Integers(coords));
+ }
+
+ if any_float {
+ let mut vec = floats::FloatCoordinates::default();
+ if let floats::FloatCoordinates::List(list) = &mut vec {
+ for v in arr.iter() {
+ if let Value::Number(n) = v {
+ if let Some(f) = n.as_f64() {
+ list.push(f);
+ }
+ }
+ }
+ }
+ return Ok(Coordinates::Floats(vec));
+ }
+
+ if all_string {
+ let mut sc = strings::StringCoordinates::default();
+ for v in arr.iter() {
+ if let Value::String(s) = v {
+ sc.append(s.to_string());
+ }
+ }
+ return Ok(Coordinates::Strings(sc));
+ }
+
+ Err("Could not determine coord array element types".to_string())
+ }
+ Value::Object(map) => {
+ let mut mixed = MixedCoordinates::default();
+
+ if let Some(v) = map.get("ints") {
+ if let Value::Array(arr) = v {
+ for val in arr.iter() {
+ if let Value::Number(n) = val {
+ if let Some(i) = n.as_i64() {
+ mixed.integers.append(i as i32);
+ }
+ }
+ }
+ }
+ }
+
+ if let Some(v) = map.get("floats") {
+ if let Value::Array(arr) = v {
+ if let floats::FloatCoordinates::List(list) = &mut mixed.floats {
+ for val in arr.iter() {
+ if let Value::Number(n) = val {
+ if let Some(f) = n.as_f64() {
+ list.push(f);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if let Some(v) = map.get("strings") {
+ if let Value::Array(arr) = v {
+ for val in arr.iter() {
+ if let Value::String(s) = val {
+ mixed.strings.append(s.to_string());
+ }
+ }
+ }
+ }
+
+ Ok(Coordinates::Mixed(Box::new(mixed)))
+ }
+ Value::Null => Ok(Coordinates::Empty),
+ Value::String(s) => Ok(Coordinates::from_string(s)),
+ _ => Err("Unsupported coords JSON value".to_string()),
+ }
+ }
+}
diff --git a/qubed/src/coordinates/ops.rs b/qubed/src/coordinates/ops.rs
new file mode 100644
index 00000000..bab19c34
--- /dev/null
+++ b/qubed/src/coordinates/ops.rs
@@ -0,0 +1,243 @@
+use crate::Coordinates;
+use crate::coordinates::CoordinateTypes;
+use chrono::NaiveDateTime;
+
+impl From for CoordinateTypes {
+ fn from(value: NaiveDateTime) -> Self {
+ CoordinateTypes::DateTime(value)
+ }
+}
+
+impl FromIterator for Coordinates {
+ fn from_iter>(iter: T) -> Self {
+ let mut coords = Coordinates::Empty;
+ for dt in iter {
+ coords.append_datetime(dt);
+ }
+ coords
+ }
+}
+
+impl Coordinates {
+ pub fn extend(&mut self, new_coords: &Coordinates) {
+ match new_coords {
+ Coordinates::Integers(new_ints) => match self {
+ Coordinates::Integers(ints) => {
+ ints.extend(new_ints);
+ }
+ Coordinates::Mixed(mixed) => {
+ mixed.integers.extend(new_ints);
+ }
+ Coordinates::Empty => {
+ let _ = std::mem::replace(self, new_coords.clone());
+ }
+ _ => {
+ self.convert_to_mixed().extend(new_coords);
+ }
+ },
+ Coordinates::Floats(new_floats) => match self {
+ Coordinates::Floats(floats) => {
+ floats.extend(new_floats);
+ }
+ Coordinates::Mixed(mixed) => {
+ mixed.floats.extend(new_floats);
+ }
+ Coordinates::Empty => {
+ let _ = std::mem::replace(self, new_coords.clone());
+ }
+ _ => {
+ self.convert_to_mixed().extend(new_coords);
+ }
+ },
+ Coordinates::Strings(new_strings) => match self {
+ Coordinates::Strings(strings) => {
+ strings.extend(new_strings);
+ }
+ Coordinates::Mixed(mixed) => {
+ mixed.strings.extend(new_strings);
+ }
+ Coordinates::Empty => {
+ let _ = std::mem::replace(self, new_coords.clone());
+ }
+ _ => {
+ self.convert_to_mixed().extend(new_coords);
+ }
+ },
+ Coordinates::Empty => {}
+ Coordinates::DateTimes(new_datetimes) => match self {
+ Coordinates::DateTimes(datetimes) => {
+ datetimes.extend(new_datetimes);
+ }
+ Coordinates::Mixed(mixed) => {
+ mixed.datetimes.extend(new_datetimes);
+ }
+ Coordinates::Empty => {
+ let _ = std::mem::replace(self, new_coords.clone());
+ }
+ _ => {
+ self.convert_to_mixed().extend(new_coords);
+ }
+ },
+ Coordinates::Mixed(mixed) => match self {
+ Coordinates::Mixed(self_mixed) => {
+ self_mixed.integers.extend(&mixed.integers);
+ self_mixed.floats.extend(&mixed.floats);
+ self_mixed.strings.extend(&mixed.strings);
+ }
+ _ => {
+ self.convert_to_mixed().extend(new_coords);
+ }
+ },
+ }
+ }
+
+ pub fn extend_from_iter(&mut self, new_coords: impl Iterator- )
+ where
+ Coordinates: FromIterator
,
+ {
+ let coords = Coordinates::from_iter(new_coords);
+ self.extend(&coords);
+ }
+
+ pub fn append(&mut self, value: T)
+ where
+ CoordinateTypes: From,
+ {
+ let coord_type = CoordinateTypes::from(value);
+
+ match coord_type {
+ CoordinateTypes::Integer(val) => {
+ self.append_integer(val);
+ }
+ CoordinateTypes::Float(val) => {
+ self.append_float(val);
+ }
+ CoordinateTypes::String(val) => {
+ self.append_string(val);
+ }
+ CoordinateTypes::DateTime(val) => {
+ self.append_datetime(val);
+ }
+ }
+ }
+
+ fn append_string(&mut self, value: String) {
+ match self {
+ Coordinates::Strings(strings) => {
+ strings.append(value);
+ }
+ Coordinates::Mixed(mixed) => {
+ mixed.strings.append(value);
+ }
+ Coordinates::Empty => {
+ *self = Coordinates::from(value);
+ }
+ _ => {
+ self.convert_to_mixed();
+ self.append_string(value);
+ }
+ }
+ }
+
+ fn append_float(&mut self, value: f64) {
+ match self {
+ Coordinates::Floats(floats) => {
+ floats.append(value);
+ }
+ Coordinates::Mixed(mixed) => {
+ mixed.floats.append(value);
+ }
+ Coordinates::Empty => {
+ *self = Coordinates::from(value);
+ }
+ _ => {
+ self.convert_to_mixed();
+ self.append_float(value);
+ }
+ }
+ }
+
+ fn append_integer(&mut self, value: i32) {
+ match self {
+ Coordinates::Integers(ints) => {
+ ints.append(value);
+ }
+ Coordinates::Mixed(mixed) => {
+ mixed.integers.append(value);
+ }
+ Coordinates::Empty => {
+ *self = Coordinates::from(value);
+ }
+ _ => {
+ self.convert_to_mixed();
+ self.append_integer(value);
+ }
+ }
+ }
+
+ fn append_datetime(&mut self, value: NaiveDateTime) {
+ match self {
+ Coordinates::DateTimes(datetimes) => {
+ datetimes.append(value);
+ }
+ Coordinates::Mixed(mixed) => {
+ mixed.datetimes.append(value);
+ }
+ Coordinates::Empty => {
+ *self = Coordinates::from(value);
+ }
+ _ => {
+ self.convert_to_mixed();
+ self.append_datetime(value);
+ }
+ }
+ }
+}
+
+impl FromIterator for Coordinates {
+ fn from_iter>(iter: T) -> Self {
+ let mut coords = Coordinates::Empty;
+ for val in iter {
+ coords.append_integer(val);
+ }
+ coords
+ }
+}
+
+impl FromIterator for Coordinates {
+ fn from_iter>(iter: T) -> Self {
+ let mut coords = Coordinates::Empty;
+ for val in iter {
+ coords.append_float(val);
+ }
+ coords
+ }
+}
+
+impl FromIterator for Coordinates {
+ fn from_iter>(iter: T) -> Self {
+ let mut coords = Coordinates::Empty;
+ for val in iter {
+ coords.append_string(val);
+ }
+ coords
+ }
+}
+
+impl From for CoordinateTypes {
+ fn from(val: i32) -> Self {
+ CoordinateTypes::Integer(val)
+ }
+}
+
+impl From for CoordinateTypes {
+ fn from(val: f64) -> Self {
+ CoordinateTypes::Float(val)
+ }
+}
+
+impl From for CoordinateTypes {
+ fn from(val: String) -> Self {
+ CoordinateTypes::String(val)
+ }
+}
diff --git a/fdb_scanner/__init__.py b/qubed/src/coordinates/setops.rs
similarity index 100%
rename from fdb_scanner/__init__.py
rename to qubed/src/coordinates/setops.rs
diff --git a/qubed/src/coordinates/strings.rs b/qubed/src/coordinates/strings.rs
new file mode 100644
index 00000000..887dbacf
--- /dev/null
+++ b/qubed/src/coordinates/strings.rs
@@ -0,0 +1,175 @@
+use std::hash::Hash;
+
+use tiny_str::TinyString;
+
+use crate::coordinates::{Coordinates, IntersectionResult};
+use crate::utils::tiny_ordered_set::TinyOrderedSet;
+
+#[derive(Debug, Clone, PartialEq)]
+pub enum StringCoordinates {
+ Set(TinyOrderedSet, 2>),
+}
+
+impl StringCoordinates {
+ pub(crate) fn extend(&mut self, new_coords: &StringCoordinates) {
+ match new_coords {
+ StringCoordinates::Set(list) => {
+ for val in list.iter() {
+ self.append(val.to_string());
+ }
+ }
+ }
+ }
+ pub(crate) fn append(&mut self, new_coord: String) {
+ match self {
+ StringCoordinates::Set(list) => {
+ list.insert(TinyString::from(new_coord));
+ }
+ }
+ }
+
+ pub(crate) fn len(&self) -> usize {
+ match self {
+ StringCoordinates::Set(list) => list.len(),
+ }
+ }
+ pub(crate) fn to_string(&self) -> String {
+ match self {
+ StringCoordinates::Set(list) => {
+ list.iter().map(|v| v.to_string()).collect::>().join("/")
+ }
+ }
+ }
+
+ pub(crate) fn intersect(
+ &self,
+ other: &StringCoordinates,
+ ) -> IntersectionResult {
+ match (self, other) {
+ (StringCoordinates::Set(list_a), StringCoordinates::Set(list_b)) => {
+ let result = list_a.intersect(list_b);
+ IntersectionResult {
+ intersection: StringCoordinates::Set(result.intersection),
+ only_a: StringCoordinates::Set(result.only_a),
+ only_b: StringCoordinates::Set(result.only_b),
+ }
+ }
+ }
+ }
+ pub(crate) fn contains(&self, value: impl AsRef) -> bool {
+ match self {
+ StringCoordinates::Set(set) => {
+ let tiny_value = TinyString::from(value.as_ref());
+ set.contains(&tiny_value)
+ }
+ }
+ }
+
+ pub(crate) fn hash(&self, hasher: &mut impl std::hash::Hasher) {
+ "strings".hash(hasher);
+ match self {
+ StringCoordinates::Set(list) => {
+ for val in list.iter() {
+ val.hash(hasher);
+ }
+ }
+ }
+ }
+}
+
+impl Default for StringCoordinates {
+ fn default() -> Self {
+ StringCoordinates::Set(TinyOrderedSet::new())
+ }
+}
+
+impl From for Coordinates {
+ fn from(value: String) -> Self {
+ let mut set = TinyOrderedSet::new();
+ set.insert(TinyString::from(value));
+ Coordinates::Strings(StringCoordinates::Set(set))
+ }
+}
+
+impl From<&str> for Coordinates {
+ fn from(value: &str) -> Self {
+ let mut set = TinyOrderedSet::new();
+ set.insert(TinyString::from(value));
+ Coordinates::Strings(StringCoordinates::Set(set))
+ }
+}
+
+impl From<&[&str]> for Coordinates {
+ fn from(value: &[&str]) -> Self {
+ let mut set = TinyOrderedSet::new();
+ for &v in value {
+ set.insert(TinyString::from(v));
+ }
+ Coordinates::Strings(StringCoordinates::Set(set))
+ }
+}
+
+impl From<&[&str; N]> for Coordinates {
+ fn from(value: &[&str; N]) -> Self {
+ let mut set = TinyOrderedSet::new();
+ for &v in value {
+ set.insert(TinyString::from(v));
+ }
+ Coordinates::Strings(StringCoordinates::Set(set))
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_string_coordinates_append() {
+ let mut coords = StringCoordinates::default();
+ coords.append("A".to_string());
+ coords.append("B".to_string());
+ coords.append("A".to_string()); // Duplicate
+
+ match coords {
+ StringCoordinates::Set(list) => {
+ assert_eq!(list.len(), 2);
+ assert!(list.contains(&TinyString::from("A")));
+ assert!(list.contains(&TinyString::from("B")));
+ }
+ }
+ }
+
+ #[test]
+ fn test_string_coordinates_intersect() {
+ let mut coords_a = StringCoordinates::default();
+ coords_a.append("A".to_string());
+ coords_a.append("B".to_string());
+
+ let mut coords_b = StringCoordinates::default();
+ coords_b.append("B".to_string());
+ coords_b.append("C".to_string());
+
+ let result = coords_a.intersect(&coords_b);
+
+ match result.intersection {
+ StringCoordinates::Set(list) => {
+ assert_eq!(list.len(), 1);
+ assert!(list.contains(&TinyString::from("B")));
+ }
+ }
+
+ match result.only_a {
+ StringCoordinates::Set(list) => {
+ assert_eq!(list.len(), 1);
+ assert!(list.contains(&TinyString::from("A")));
+ }
+ }
+
+ match result.only_b {
+ StringCoordinates::Set(list) => {
+ assert_eq!(list.len(), 1);
+ assert!(list.contains(&TinyString::from("C")));
+ }
+ }
+ }
+}
diff --git a/qubed/src/datacube.rs b/qubed/src/datacube.rs
new file mode 100644
index 00000000..615b04f1
--- /dev/null
+++ b/qubed/src/datacube.rs
@@ -0,0 +1,134 @@
+use crate::{Coordinates, Qube};
+use std::collections::HashMap;
+
+#[derive(Debug)]
+pub struct Datacube {
+ coordinates: HashMap,
+}
+
+impl Datacube {
+ pub fn new() -> Self {
+ Datacube { coordinates: HashMap::new() }
+ }
+
+ pub fn add_coordinate(&mut self, dimension: &str, coords: Coordinates) {
+ self.coordinates.insert(dimension.to_string(), coords);
+ }
+
+ pub fn is_empty(&self) -> bool {
+ self.coordinates.is_empty()
+ }
+
+ pub fn len(&self) -> usize {
+ self.coordinates.len()
+ }
+
+ pub fn coordinates(&self) -> &HashMap {
+ &self.coordinates
+ }
+}
+
+impl Qube {
+ pub fn to_datacubes(&self) -> Vec {
+ let mut datacubes = Vec::new();
+
+ let datacube_paths = self.leaf_node_ids_paths();
+ for datacube_path in datacube_paths {
+ let mut datacube = Datacube::new();
+ for node_id in datacube_path {
+ if let Some(dim) = self.dimension_str(self.node_dim(node_id).unwrap()) {
+ if let Some(coords) = self.node(node_id).map(|node| node.coordinates().clone())
+ {
+ datacube.add_coordinate(&dim, coords.clone());
+ }
+ }
+ }
+ datacubes.push(datacube);
+ }
+
+ datacubes
+ }
+
+ pub fn from_datacube(datacube: &Datacube, order: Option<&[String]>) -> Self {
+ let mut qube = Qube::new();
+ let mut parent = qube.root();
+
+ // Create dimensions in the specified order
+ if let Some(order_iter) = order {
+ for dim in order_iter {
+ if let Some(coords) = datacube.coordinates.get(dim) {
+ parent = qube
+ .get_or_create_child(&dim, parent, Some(coords.clone()))
+ .expect("Failed to create dimension");
+ }
+ }
+ }
+
+ // Create remaining dimensions
+ for (dim, coords) in datacube.coordinates.iter() {
+ if qube.dimension(&dim).is_some() {
+ continue;
+ }
+ parent = qube
+ .get_or_create_child(&dim, parent, Some(coords.clone()))
+ .expect("Failed to create dimension");
+ }
+
+ qube
+ }
+
+ pub fn append_datacube(
+ &mut self,
+ _datacube: Datacube,
+ _order: Option<&[String]>,
+ _accept_existing_order: bool,
+ ) {
+ let mut other_qube = Self::from_datacube(&_datacube, _order);
+ self.append(&mut other_qube);
+
+ // // we consume the datacube
+
+ // let mut parent = self.root();
+
+ // // If accept_existing_order is true, we try to follow the existing order in the Qube, so check which children exist and use them first
+ // // If there are multiple options, choose using the provided order if given, else match first child
+
+ // let mut used_dimensions = vec![];
+
+ // while !datacube.is_empty() {
+
+ // let mut found = false;
+
+ // // First try to find existing dimensions in the Qube
+ // for child_dimensions in self.get_span_of(parent).unwrap() {
+ // let dim_name = self.get_dimension_str(child_dimensions).expect("Unknown dimension found");
+ // if let Some(coords) = datacube.coordinates.remove(&dim_name) {
+ // parent = *child_dimensions;
+ // used_dimensions.push(dim_name.clone());
+ // found = true;
+ // break;
+ // }
+ // }
+
+ // if found {
+ // continue;
+ // }
+
+ // // If not found, create new dimensions
+ // let next_dim = if let Some(order_iter) = order {
+ // order_iter.iter().find(|d| datacube.coordinates.contains_key(*d)).cloned()
+ // } else {
+ // datacube.coordinates.keys().next().cloned()
+ // };
+
+ // if let Some(dim) = next_dim {
+ // if let Some(coords) = datacube.coordinates.remove(&dim) {
+ // parent = self.get_or_create_child(&dim, parent, Some(coords)).expect("Failed to create dimension");
+ // used_dimensions.push(dim);
+ // }
+ // } else {
+ // break; // No more dimensions to process
+ // }
+ // }
+ }
+}
diff --git a/qubed/src/lib.rs b/qubed/src/lib.rs
new file mode 100644
index 00000000..79915cc5
--- /dev/null
+++ b/qubed/src/lib.rs
@@ -0,0 +1,14 @@
+mod compress;
+mod coordinates;
+pub mod datacube;
+mod merge;
+mod qube;
+pub mod select;
+pub mod serde;
+mod utils;
+mod view;
+
+pub use coordinates::Coordinates;
+pub use coordinates::integers::IntegerCoordinates;
+pub use datacube::Datacube;
+pub use qube::{Dimension, NodeIdx, Qube};
diff --git a/qubed/src/merge.rs b/qubed/src/merge.rs
new file mode 100644
index 00000000..acbc8222
--- /dev/null
+++ b/qubed/src/merge.rs
@@ -0,0 +1,185 @@
+use crate::qube::Dimension;
+use crate::{NodeIdx, Qube};
+use std::collections::HashMap;
+use std::time::Instant;
+
+impl Qube {
+ /// Performs a union operation between two nodes in two different Qubes.
+ fn node_merge(&mut self, other: &mut Qube, self_id: NodeIdx, other_id: NodeIdx) -> NodeIdx {
+ // Group the children of both nodes into groups according to their associated dimensions.
+ let self_children = {
+ let node = self.node_ref(self_id).unwrap();
+ node.children().clone()
+ };
+
+ let other_children = {
+ let node = other.node_ref(other_id).unwrap();
+ node.children().clone()
+ };
+
+ // Create a map of dimensions to (self_children, other_children).
+ let mut dim_child_map: HashMap, Vec)> = HashMap::new();
+
+ for (dim, self_kids) in self_children {
+ dim_child_map.entry(dim).or_default().0.extend(self_kids);
+ }
+ for (dim, other_kids) in other_children {
+ dim_child_map.entry(dim).or_default().1.extend(other_kids);
+ }
+
+ // For each dimension, perform an internal set operation on the groups.
+ let dims: Vec<_> = dim_child_map.keys().copied().collect();
+
+ for dim in dims {
+ let (these_kids, those_kids) = {
+ let entry = dim_child_map.entry(dim).or_default();
+ (&entry.0, &entry.1)
+ };
+
+ let _new_children = self.internal_set_operation(other, these_kids, those_kids);
+ }
+
+ return self.root();
+ }
+
+ /// Performs a set operation between two groups of nodes from two Qubes.
+ fn internal_set_operation(
+ &mut self,
+ other: &mut Qube,
+ self_ids: &Vec,
+ other_ids: &Vec,
+ ) -> Option> {
+ let mut return_vec = Vec::new();
+
+ for node in self_ids {
+ for other_node in other_ids {
+ let self_coords = self.node_ref(*node).unwrap().coords();
+ let other_coords = other.node_ref(*other_node).unwrap().coords();
+
+ let (parent_a, dim_a, parent_b, dim_b) = {
+ let actual_node = self.node_ref(*node).unwrap();
+ let actual_other_node = other.node_ref(*other_node).unwrap();
+
+ (
+ actual_node.parent().unwrap(),
+ actual_node.dim(),
+ actual_other_node.parent().unwrap(),
+ actual_other_node.dim(),
+ )
+ };
+
+ // Perform the shallow operation to get the set of values only in self,
+ // those only in other, and those in the intersection.
+ let intersection_res = self_coords.intersect(other_coords);
+ let actual_intersection = intersection_res.intersection;
+ let only_self = intersection_res.only_a;
+ let only_other = intersection_res.only_b;
+
+ // If the intersection set is non-empty, create new nodes for the intersection
+ // and perform a union on them.
+ let dim_str = self.dimension_str(dim_a).unwrap().to_owned();
+ let other_dim_str = other.dimension_str(dim_b).unwrap().to_owned();
+
+ if actual_intersection.len() != 0 {
+ let check_new_child_a = self.check_if_new_child(
+ &dim_str,
+ parent_a,
+ Some(actual_intersection.clone()),
+ );
+ let check_new_child_b = other.check_if_new_child(
+ &other_dim_str,
+ parent_b,
+ Some(actual_intersection.clone()),
+ );
+ let new_node_a = self
+ .get_or_create_child(&dim_str, parent_a, Some(actual_intersection.clone()))
+ .unwrap();
+
+ let new_node_b = other
+ .get_or_create_child(&other_dim_str, parent_b, Some(actual_intersection))
+ .unwrap();
+
+ if check_new_child_a.unwrap() {
+ self.copy_branch(*node, new_node_a);
+ }
+ if check_new_child_b.unwrap() {
+ other.copy_branch(*other_node, new_node_b);
+ }
+
+ let _nested_result = self.node_merge(other, new_node_a, new_node_b);
+ }
+
+ // If there are values only in self, update the coordinates of the current node.
+ if only_self.len() != 0 {
+ let actual_node = self.node_mut(*node).unwrap();
+ *actual_node.coords_mut() = only_self;
+ }
+
+ // If there are values only in other, create a new node for those values.
+ if only_other.len() != 0 {
+ let new_node_only_b = self
+ .get_or_create_child(&other_dim_str, parent_a, Some(only_other.clone()))
+ .unwrap();
+
+ self.copy_subtree(other, *other_node, new_node_only_b);
+
+ let actual_other_node = other.node_mut(*other_node).unwrap();
+ *actual_other_node.coords_mut() = only_other;
+ }
+
+ {
+ return_vec.push(*node);
+ }
+ }
+ }
+
+ return Some(return_vec);
+ }
+
+ /// Performs a union operation between two Qubes.
+ pub fn append(&mut self, other: &mut Qube) {
+ // This method starts at the root of both Qubes and recursively merges their nodes.
+ // After the union, the tree is compressed to remove duplicates and empty nodes.
+
+ // Fast-path: if self is empty, just take the content of other directly.
+ if self.is_empty() {
+ let other_root = other.root();
+ let self_root = self.root();
+ self.copy_subtree(other, other_root, self_root);
+ *other = Qube::new();
+ // Ensure append behavior is consistent: always compress after merging.
+ self.compress();
+ return;
+ }
+
+ let self_root_id = self.root();
+ let other_root_id = other.root();
+ self.node_merge(other, self_root_id, other_root_id);
+ self.compress();
+ // Clear the other Qube
+ *other = Qube::new();
+ }
+
+ /// Performs a union operation between many Qubes
+ pub fn append_many(&mut self, others: &mut Vec) {
+ let others_len = others.len();
+ for (i, other) in others.iter_mut().enumerate() {
+ let self_root_id = self.root();
+ let other_root_id = other.root();
+
+ // Perform the union with the current Qube
+ self.node_merge(other, self_root_id, other_root_id);
+
+ // Print progress update
+ println!("Union completed for Qube {}/{}", i + 1, others_len);
+
+ // Compress every nth Qube
+ if (i + 1) % 500 == 0 {
+ println!("Compressing after processing {} Qubes...", i + 1);
+ self.compress();
+ }
+ }
+ // Final compression after all unions are complete
+ self.compress();
+ }
+}
diff --git a/qubed/src/qube.rs b/qubed/src/qube.rs
new file mode 100644
index 00000000..c909495f
--- /dev/null
+++ b/qubed/src/qube.rs
@@ -0,0 +1,827 @@
+use lasso::{MiniSpur, Rodeo};
+use slotmap::{SlotMap, new_key_type};
+use std::collections::{BTreeMap, HashSet};
+use std::hash::DefaultHasher;
+use std::hash::{Hash, Hasher};
+use std::sync::atomic::{AtomicU64, Ordering};
+use tiny_vec::TinyVec;
+
+use crate::coordinates::Coordinates;
+
+new_key_type! {
+ pub struct NodeIdx;
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+pub struct Dimension(MiniSpur);
+
+// -------------------------
+// Internal Node Structure
+// -------------------------
+
+// The node needs careful state management to ensure the structural hash is properly invalidated
+// It is fully private and only modified via Qube and NodeRef methods in this module
+
+#[derive(Debug)]
+pub(crate) struct Node {
+ dim: Dimension,
+ structural_hash: AtomicU64, // 0 = not computed
+ coords: Coordinates,
+ parent: Option,
+ children: BTreeMap>,
+}
+
+#[derive(Debug)]
+pub struct Qube {
+ nodes: SlotMap,
+ root_id: NodeIdx,
+ key_store: Rodeo,
+}
+
+/// Read-only reference to a node
+pub struct NodeRef<'a> {
+ qube: &'a Qube,
+ node: &'a Node,
+ id: NodeIdx,
+}
+
+impl Node {
+ pub(crate) fn children(&self) -> &BTreeMap> {
+ &self.children
+ }
+
+ pub(crate) fn structural_hash(&self) -> &AtomicU64 {
+ &self.structural_hash
+ }
+
+ pub(crate) fn dim(&self) -> &Dimension {
+ &self.dim
+ }
+
+ pub(crate) fn coords(&self) -> &Coordinates {
+ &self.coords
+ }
+
+ pub(crate) fn coords_mut(&mut self) -> &mut Coordinates {
+ &mut self.coords
+ }
+
+ pub(crate) fn children_mut(&mut self) -> &mut BTreeMap> {
+ &mut self.children
+ }
+
+ pub(crate) fn parent(&self) -> &Option {
+ &self.parent
+ }
+}
+
+impl Qube {
+ pub fn is_empty(&self) -> bool {
+ let root = self.node_ref(self.root()).unwrap();
+ root.coords().is_empty() && root.children().is_empty()
+ }
+
+ pub(crate) fn node_mut(&mut self, id: NodeIdx) -> Option<&mut Node> {
+ self.nodes.get_mut(id)
+ }
+
+ pub(crate) fn node_ref(&self, id: NodeIdx) -> Option<&Node> {
+ self.nodes.get(id)
+ }
+
+ pub(crate) fn node_dim(&self, id: NodeIdx) -> Option<&Dimension> {
+ Some(self.nodes.get(id).unwrap().dim())
+ }
+
+ pub fn new() -> Self {
+ let mut key_store = Rodeo::::new();
+ let mut nodes = SlotMap::with_key();
+ let root_id = nodes.insert(Node {
+ dim: Dimension(key_store.get_or_intern("root")),
+ structural_hash: AtomicU64::new(0),
+ coords: Coordinates::Empty,
+ parent: None,
+ children: BTreeMap::new(),
+ });
+
+ Qube { nodes, root_id, key_store }
+ }
+
+ pub fn root(&self) -> NodeIdx {
+ self.root_id
+ }
+
+ /// Get a read-only reference to a node
+ pub fn node(&self, id: NodeIdx) -> Option> {
+ let node = self.nodes.get(id)?;
+ Some(NodeRef { qube: self, node, id })
+ }
+
+ pub fn check_if_new_child(
+ &mut self,
+ key: &str,
+ parent_id: NodeIdx,
+ coordinates: Option,
+ ) -> Result {
+ if self.nodes.get(parent_id).is_none() {
+ return Err(format!("Parent node {:?} not found", parent_id));
+ }
+
+ let dim = Dimension(self.key_store.get_or_intern(key));
+ let coords = coordinates.unwrap_or(Coordinates::Empty);
+
+ // Check if a child with the same key:coordinates pair already exists
+ if let Some(parent) = self.nodes.get(parent_id) {
+ if let Some(children) = parent.children.get(&dim) {
+ for &child_id in children {
+ if let Some(child) = self.nodes.get(child_id) {
+ if child.coords == coords {
+ // Return the existing child node
+ return Ok(false);
+ }
+ }
+ }
+ }
+ }
+ Ok(true)
+ }
+
+ pub fn get_or_create_child(
+ &mut self,
+ key: &str,
+ parent_id: NodeIdx,
+ coordinates: Option,
+ ) -> Result {
+ if self.nodes.get(parent_id).is_none() {
+ return Err(format!("Parent node {:?} not found", parent_id));
+ }
+
+ let dim = Dimension(self.key_store.get_or_intern(key));
+ let coords = coordinates.unwrap_or(Coordinates::Empty);
+
+ // Check if a child with the same key:coordinates pair already exists
+ if let Some(parent) = self.nodes.get(parent_id) {
+ if let Some(children) = parent.children.get(&dim) {
+ for &child_id in children {
+ if let Some(child) = self.nodes.get(child_id) {
+ if child.coords == coords {
+ // Return the existing child node
+ return Ok(child_id);
+ }
+ }
+ }
+ }
+ }
+
+ // Create a new child node if no match is found
+ let node_id = self.nodes.insert(Node {
+ dim,
+ structural_hash: AtomicU64::new(0),
+ coords,
+ parent: Some(parent_id),
+ children: BTreeMap::new(),
+ });
+
+ // Add to parent's children
+ if let Some(parent) = self.nodes.get_mut(parent_id) {
+ parent.children.entry(dim).or_insert_with(TinyVec::new).push(node_id);
+ parent.structural_hash.store(0, Ordering::Release);
+ }
+
+ // Invalidate ancestor hashes
+ self.invalidate_ancestors(parent_id);
+
+ Ok(node_id)
+ }
+
+ pub fn all_unique_dim_coords(&mut self) -> BTreeMap {
+ // TODO
+ let mut map: BTreeMap = BTreeMap::new();
+
+ for (_id, node) in self.nodes.iter() {
+ if let Some(dim_str) = self.dimension_str(&node.dim) {
+ let coords = node.coords.clone();
+ if coords.is_empty() {
+ continue; // Skip empty coordinates
+ }
+ // if there is no entry in map for this dimension, just fill it in with coords, otherwise extend the current entry with coords
+ map.entry(dim_str.to_string())
+ .and_modify(|existing| existing.extend(&coords))
+ .or_insert(coords);
+ }
+ }
+ map
+ }
+
+ pub fn remove_node(&mut self, id: NodeIdx) -> Result<(), String> {
+ let node = self.nodes.remove(id).ok_or_else(|| format!("Node {:?} not found", id))?;
+
+ // Recursively remove all children
+ for child_ids in node.children.values() {
+ for &child_id in child_ids.iter() {
+ self.remove_node(child_id)?;
+ }
+ }
+
+ // Remove from parent's children
+ if let Some(parent_id) = node.parent {
+ if let Some(parent) = self.nodes.get_mut(parent_id) {
+ if let Some(children) = parent.children.get_mut(&node.dim) {
+ children.retain(|&child_id| child_id != id);
+ if children.is_empty() {
+ parent.children.remove(&node.dim);
+ }
+ }
+ parent.structural_hash.store(0, Ordering::Release);
+ }
+ self.invalidate_ancestors(parent_id);
+ }
+
+ // TODO: Remove dimension from key_store if no longer used
+
+ Ok(())
+ }
+
+ pub fn drop(&mut self, to_drop: I) -> Result<(), String>
+ where
+ I: IntoIterator,
+ I::Item: AsRef,
+ {
+ let drop_set: HashSet =
+ to_drop.into_iter().map(|s| s.as_ref().to_string()).collect();
+
+ let root = self.root();
+ self.drop_recurse(root, &drop_set)?;
+ self.compress();
+ Ok(())
+ }
+
+ /// Removes `node_id` from the tree, re-parenting its children to `parent_id`.
+ /// Returns the list of grandchild node IDs that were re-parented.
+ fn splice_out_node(
+ &mut self,
+ node_id: NodeIdx,
+ parent_id: NodeIdx,
+ ) -> Result, String> {
+ let node =
+ self.nodes.get(node_id).ok_or_else(|| format!("Node {:?} not found", node_id))?;
+
+ let node_dim = node.dim;
+ // Collect grandchildren before mutating
+ let grandchildren: Vec<(Dimension, Vec)> =
+ node.children.iter().map(|(d, ids)| (*d, ids.iter().copied().collect())).collect();
+
+ let all_grandchild_ids: Vec =
+ grandchildren.iter().flat_map(|(_, ids)| ids.iter().copied()).collect();
+
+ // Remove the node itself from the slotmap (does not touch its children)
+ self.nodes.remove(node_id);
+
+ // Remove node from parent's children list
+ if let Some(parent) = self.nodes.get_mut(parent_id) {
+ if let Some(children) = parent.children.get_mut(&node_dim) {
+ children.retain(|&id| id != node_id);
+ if children.is_empty() {
+ parent.children.remove(&node_dim);
+ }
+ }
+ parent.structural_hash.store(0, Ordering::Release);
+ }
+
+ // Re-parent grandchildren to parent_id
+ for (gc_dim, gc_ids) in grandchildren {
+ for gc_id in gc_ids {
+ if let Some(gc_node) = self.nodes.get_mut(gc_id) {
+ gc_node.parent = Some(parent_id);
+ }
+ if let Some(parent) = self.nodes.get_mut(parent_id) {
+ parent.children.entry(gc_dim).or_insert_with(TinyVec::new).push(gc_id);
+ }
+ }
+ }
+
+ self.invalidate_ancestors(parent_id);
+ Ok(all_grandchild_ids)
+ }
+
+ fn drop_recurse(&mut self, node_id: NodeIdx, to_drop: &HashSet) -> Result<(), String> {
+ // Collect child info upfront before any mutation
+ let child_info: Vec<(Dimension, Vec)> = self
+ .node_ref(node_id)
+ .ok_or_else(|| format!("Node {:?} not found", node_id))?
+ .children()
+ .iter()
+ .map(|(dim, ids)| (*dim, ids.iter().copied().collect()))
+ .collect();
+
+ let child_info: Vec<(bool, Vec)> = child_info
+ .into_iter()
+ .map(|(dim, ids)| {
+ let dim_str = self
+ .dimension_str(&dim)
+ .ok_or_else(|| format!("Missing dimension string for {:?}", dim))?;
+ let should_drop = to_drop.contains(dim_str);
+ Ok((should_drop, ids))
+ })
+ .collect::>()?;
+
+ for (should_drop, children) in child_info {
+ if should_drop {
+ for child_id in children {
+ // Splice out: move grandchildren up to node_id, then recurse on them
+ let grandchildren = self.splice_out_node(child_id, node_id)?;
+ for gc_id in grandchildren {
+ self.drop_recurse(gc_id, to_drop)?;
+ }
+ }
+ } else {
+ for child_id in children {
+ self.drop_recurse(child_id, to_drop)?;
+ }
+ }
+ }
+
+ Ok(())
+ }
+
+ pub fn squeeze(&mut self) -> Result<(), String> {
+ let to_drop: Vec = self
+ .all_unique_dim_coords()
+ .into_iter()
+ .filter(|(_, coords)| coords.len() == 1)
+ .map(|(dim, _)| dim)
+ .collect();
+
+ self.drop(to_drop)
+ }
+
+ pub fn dimension(&self, dim_str: &str) -> Option {
+ self.key_store.get(dim_str).map(Dimension)
+ }
+
+ pub fn dimension_str(&self, dim: &Dimension) -> Option<&str> {
+ self.key_store.try_resolve(&dim.0)
+ }
+
+ pub(crate) fn invalidate_ancestors(&self, id: NodeIdx) {
+ if let Some(node) = self.nodes.get(id) {
+ node.structural_hash.store(0, Ordering::Release);
+ if let Some(parent_id) = node.parent {
+ self.invalidate_ancestors(parent_id);
+ }
+ }
+ }
+
+ #[allow(dead_code)]
+ pub(crate) fn add_child(&mut self, parent: NodeIdx, dim: Dimension, child: NodeIdx) {
+ let parent_node = self.node_mut(parent).unwrap();
+
+ parent_node.children.entry(dim).or_insert_with(TinyVec::new).push(child);
+ }
+
+ #[allow(dead_code)]
+ pub(crate) fn add_same_children(&mut self, node: NodeIdx, other: NodeIdx) {
+ // Adds all children of the `other` node to the `node` under the same dimensions.
+ //
+ // This method iterates over all children of the `other` node, grouped by their dimensions,
+ // and adds them to the `node` under the same dimensions.
+
+ let other_children_dims = self.node_ref(other).unwrap().children.clone();
+ for (dim, other_children) in other_children_dims {
+ for other_child in other_children {
+ self.add_child(node, dim, other_child);
+ }
+ }
+ }
+
+ pub(crate) fn compute_structural_hash(&self, id: NodeIdx) -> u64 {
+ let node = self.nodes.get(id).expect("valid node");
+
+ let cached = node.structural_hash.load(Ordering::Acquire);
+ if cached != 0 {
+ return cached;
+ }
+
+ use std::collections::hash_map::DefaultHasher;
+ use std::hash::{Hash, Hasher};
+
+ let mut hasher = DefaultHasher::new();
+
+ node.dim.hash(&mut hasher);
+
+ if node.children.is_empty() {
+ node.coords.hash(&mut hasher);
+ } else {
+ let mut child_hashes: Vec = Vec::new();
+
+ for children in node.children.values() {
+ for &child in children {
+ let mut child_hasher = DefaultHasher::new();
+ self.node_ref(child)
+ .expect("this child should still exist in the children")
+ .coords
+ .hash(&mut child_hasher);
+ let child_hash = self.compute_structural_hash(child);
+ child_hash.hash(&mut child_hasher);
+ child_hashes.push(child_hasher.finish());
+ }
+ }
+
+ child_hashes.sort_unstable();
+ child_hashes.hash(&mut hasher);
+ }
+
+ let hash = hasher.finish().max(1); // 0 reserved for "invalid"
+
+ node.structural_hash.store(hash, Ordering::Release);
+ hash
+ }
+
+ pub(crate) fn leaf_node_ids_paths(&self) -> Vec> {
+ let mut paths = Vec::new();
+
+ fn traverse(
+ qube: &Qube,
+ current_node: NodeIdx,
+ current_path: &mut Vec,
+ paths: &mut Vec>,
+ ) {
+ current_path.push(current_node);
+
+ // let node_ref = qube.node_ref(current_node).unwrap();
+ let current_actual_node = qube.nodes.get(current_node).unwrap();
+ if current_actual_node.children().is_empty() {
+ paths.push(current_path.clone());
+ } else {
+ let all_children_node_idxs = current_actual_node.children().values().flatten();
+ for &child_id in all_children_node_idxs {
+ traverse(qube, child_id, current_path, paths);
+ }
+ }
+
+ current_path.pop();
+ }
+
+ let mut current_path = Vec::new();
+ traverse(self, self.root(), &mut current_path, &mut paths);
+
+ paths
+ }
+
+ pub fn datacube_count(&self) -> usize {
+ fn count_leaves(qube: &Qube, node_id: NodeIdx) -> usize {
+ let node = qube.nodes.get(node_id).expect("valid node");
+ if node.children().is_empty() {
+ return 1;
+ }
+
+ node.children()
+ .values()
+ .flat_map(|children| children.iter().copied())
+ .map(|child_id| count_leaves(qube, child_id))
+ .sum()
+ }
+
+ count_leaves(self, self.root())
+ }
+}
+
+impl Qube {
+ /// Recursively copies the subtree from `other_node` in `other` to `new_node` in `self`.
+ pub(crate) fn copy_subtree(&mut self, other: &Qube, other_node: NodeIdx, new_node: NodeIdx) {
+ // Get the children of the `other_node`
+ let other_children = other.node_ref(other_node).unwrap().children().clone();
+
+ for (dim, child_ids) in other_children {
+ for child_id in child_ids {
+ // Get the coordinates of the child node
+ let child_coords = other.node_ref(child_id).unwrap().coords().clone();
+
+ // Create a new child node in `self` with the same dimension and coordinates
+ // let new_child = self.get_or_create_child(&self.dimension_str(&dim).unwrap(), new_node, Some(child_coords)).unwrap();
+ let dim_str = other.dimension_str(&dim).unwrap().to_owned(); // Immutable borrow ends here
+ let new_child =
+ self.get_or_create_child(&dim_str, new_node, Some(child_coords)).unwrap(); // Mutable borrow starts here
+
+ // Recursively copy the subtree of the child
+ self.copy_subtree(other, child_id, new_child);
+ }
+ }
+ }
+
+ pub(crate) fn copy_branch(&mut self, source_node: NodeIdx, target_node: NodeIdx) {
+ // Get the children of the `source_node`
+ let source_children = self.node_ref(source_node).unwrap().children().clone();
+
+ for (dim, child_ids) in source_children {
+ for child_id in child_ids {
+ // Clone the coordinates of the child
+ let child_coords = self.node_ref(child_id).unwrap().coords().clone();
+
+ // Create a new child node in `target_node` with the same dimension and coordinates
+ let dim_str = self.dimension_str(&dim).unwrap().to_owned();
+ let new_child = self
+ .get_or_create_child(&dim_str, target_node, Some(child_coords))
+ .expect("Failed to create child node");
+
+ // Recursively copy the subtree of the child
+ self.copy_branch(child_id, new_child);
+ }
+ }
+ }
+}
+
+impl<'a> NodeRef<'a> {
+ pub fn id(&self) -> NodeIdx {
+ self.id
+ }
+
+ pub fn dimension(&self) -> Option<&str> {
+ self.qube.key_store.try_resolve(&self.node.dim.0)
+ }
+
+ pub fn coordinates(&self) -> &Coordinates {
+ &self.node.coords
+ }
+
+ pub fn child_dimensions(&self) -> impl Iterator- {
+ self.node.children.keys()
+ }
+
+ pub fn span(&self) -> HashSet
{
+ // Recursively get all dimensions in subtree, only once.
+ let mut dims = HashSet::new();
+ fn collect_dims(node_ref: &NodeRef, dims: &mut HashSet) {
+ for dim in node_ref.child_dimensions() {
+ dims.insert(dim.clone());
+ }
+ for child_id in node_ref.all_children() {
+ if let Some(child_ref) = node_ref.qube.node(child_id) {
+ collect_dims(&child_ref, dims);
+ }
+ }
+ }
+ collect_dims(self, &mut dims);
+ dims
+ }
+
+ pub fn children(&self, key: Dimension) -> Option + 'a> {
+ self.node.children.get(&key).map(|vec| vec.iter().copied())
+ }
+
+ pub fn all_children(&self) -> impl Iterator- + 'a {
+ self.node.children.values().flatten().copied()
+ }
+
+ pub fn ancestors(&self) -> impl Iterator
- + 'a {
+ let first_parent = self.node.parent;
+ let qube = self.qube;
+
+ std::iter::successors(first_parent, move |¤t_id| {
+ qube.nodes.get(current_id).and_then(|node| node.parent)
+ })
+ }
+
+ pub fn parent(&self) -> Option
{
+ self.node.parent
+ }
+
+ pub fn parent_node(&self) -> Option> {
+ let parent_id = self.parent()?;
+ self.qube.node(parent_id)
+ }
+
+ pub fn structural_hash(&self) -> Option {
+ // Check cache
+ let cached = self.node.structural_hash.load(Ordering::Acquire);
+ if cached != 0 {
+ return Some(cached);
+ }
+
+ // Compute hash
+ let mut hasher = std::collections::hash_map::DefaultHasher::new();
+
+ let dimension_string = self.dimension()?;
+
+ dimension_string.hash(&mut hasher);
+
+ if self.node.children.is_empty() {
+ // no children
+ self.node.coords.hash(&mut hasher);
+ } else {
+ let mut child_hashes: Vec = Vec::new();
+
+ for (_, child_ids) in self.node.children.iter() {
+ for &child_id in child_ids.iter() {
+ let mut child_hasher = DefaultHasher::new();
+
+ let child_ref = self.qube.node(child_id)?;
+ child_ref.node.coords.hash(&mut hasher);
+ let child_hash = child_ref.structural_hash()?;
+ child_hash.hash(&mut child_hasher);
+ child_hashes.push(child_hasher.finish());
+ }
+ }
+ child_hashes.sort_unstable();
+ child_hashes.hash(&mut hasher);
+ }
+
+ let hash = hasher.finish().max(1);
+
+ // Cache it (thread-safe via AtomicU64)
+ self.node.structural_hash.store(hash, Ordering::Release);
+
+ Some(hash)
+ }
+
+ pub fn children_count(&self) -> usize {
+ self.node.children.values().map(|v| v.len()).sum()
+ }
+
+ pub fn coordinates_count(&self) -> usize {
+ self.node.coords.len()
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_hash() {
+ let mut qube = Qube::new();
+ let root = qube.root();
+
+ let child1 = qube.get_or_create_child("dim1", root, Some(1.into())).unwrap();
+ let child2 = qube.get_or_create_child("dim2", root, Some(2.into())).unwrap();
+
+ let hash_root = qube.node(root).unwrap().structural_hash().unwrap();
+ let hash_child1 = qube.node(child1).unwrap().structural_hash().unwrap();
+ let hash_child2 = qube.node(child2).unwrap().structural_hash().unwrap();
+
+ assert_ne!(hash_root, hash_child1);
+ assert_ne!(hash_root, hash_child2);
+ assert_ne!(hash_child1, hash_child2);
+ }
+
+ #[test]
+ fn test_node_ref() {
+ let mut qube = Qube::new();
+ let root = qube.root();
+ let child = qube.get_or_create_child("test", root, Some(42.into())).unwrap();
+
+ let node = qube.node(child).unwrap();
+ assert_eq!(node.dimension(), Some("test"));
+ assert_eq!(node.coordinates().len(), 1);
+ assert_eq!(node.parent(), Some(root));
+ }
+
+ #[test]
+ fn test_all_unique_dim_coords() {
+ let mut qube = Qube::new();
+ let root = qube.root();
+
+ // create two distinct coordinate nodes under same dimension, and a duplicate
+ let child1 = qube.get_or_create_child("dim1", root, Some(1.into())).unwrap();
+ let _child2 = qube.get_or_create_child("dim1", root, Some(2.into())).unwrap();
+ // creating the same coords again should return the existing node
+ let child1_dup = qube.get_or_create_child("dim1", root, Some(1.into())).unwrap();
+ assert_eq!(child1, child1_dup);
+
+ let _grandchild1_dup =
+ qube.get_or_create_child("dim3", child1_dup, Some(4.into())).unwrap();
+
+ // collect unique coordinates per dimension
+ let map = qube.all_unique_dim_coords();
+ // only one dimension key present
+ assert_eq!(map.len(), 2);
+ let coords = map.get("dim1").expect("dim1 should be present");
+ // merged coordinates should contain both unique values
+ assert_eq!(coords.len(), 2);
+
+ // add another dimension to ensure multiple keys are handled
+ qube.get_or_create_child("dim2", root, Some(3.into())).unwrap();
+ let map2 = qube.all_unique_dim_coords();
+ assert_eq!(map2.len(), 3);
+ }
+
+ #[test]
+ fn test_drop_single_dimension() {
+ let mut qube = Qube::new();
+ let root = qube.root();
+
+ let class1 = qube.get_or_create_child("class", root, Some(1.into())).unwrap();
+ let expver1 = qube.get_or_create_child("expver", class1, Some(1.into())).unwrap();
+ let _param1 = qube.get_or_create_child("param", expver1, Some(1.into())).unwrap();
+
+ let class2 = qube.get_or_create_child("class", root, Some(2.into())).unwrap();
+ let expver2 = qube.get_or_create_child("expver", class2, Some(2.into())).unwrap();
+ let _param2 = qube.get_or_create_child("param", expver2, Some(2.into())).unwrap();
+
+ // Drop the "expver" dimension β its children (param) should be reparented to class
+ qube.drop(vec!["expver"]).unwrap();
+
+ // Root should still have "class" children
+ let root_node = qube.node(root).unwrap();
+ assert!(root_node.children(qube.dimension("class").unwrap()).is_some());
+
+ // Both class nodes should now directly have "param" children (expver was spliced out)
+ let class1_node = qube.node(class1).unwrap();
+ assert!(class1_node.children(qube.dimension("param").unwrap()).is_some());
+
+ let class2_node = qube.node(class2).unwrap();
+ assert!(class2_node.children(qube.dimension("param").unwrap()).is_some());
+ }
+
+ #[test]
+ fn test_drop_middle_dimension_preserves_leaves() {
+ let input = r#"root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"#;
+
+ let mut qube = Qube::from_ascii(input).unwrap();
+ qube.drop(vec!["expver"]).unwrap();
+
+ let ascii = qube.to_ascii();
+ println!("resulting ascii after drop:\n{}", ascii);
+ // expver should be gone; param should be directly under class
+ assert!(!ascii.contains("expver"), "expver should be dropped, got:\n{}", ascii);
+ assert!(ascii.contains("param"), "param should still be present, got:\n{}", ascii);
+ assert!(ascii.contains("class"), "class should still be present, got:\n{}", ascii);
+ }
+
+ #[test]
+ fn test_drop_multiple_dimensions() {
+ let mut qube = Qube::new();
+ let root = qube.root();
+
+ let class1 = qube.get_or_create_child("class", root, Some(1.into())).unwrap();
+ let expver1 = qube.get_or_create_child("expver", class1, Some(1.into())).unwrap();
+ let param1 = qube.get_or_create_child("param", expver1, Some(1.into())).unwrap();
+ let type1 = qube.get_or_create_child("type", param1, Some(1.into())).unwrap();
+ qube.get_or_create_child("level", type1, Some(1.into())).unwrap();
+
+ // Drop "expver" and "type" β their children should be spliced up
+ qube.drop(vec!["expver", "type"]).unwrap();
+
+ let root_node = qube.node(root).unwrap();
+ assert!(root_node.children(qube.dimension("class").unwrap()).is_some());
+
+ // class1 should now have "param" directly (expver spliced out)
+ let class1_node = qube.node(class1).unwrap();
+ assert!(class1_node.children(qube.dimension("param").unwrap()).is_some());
+
+ // param1 should now have "level" directly (type spliced out)
+ let param1_node = qube.node(param1).unwrap();
+ assert!(param1_node.children(qube.dimension("level").unwrap()).is_some());
+ }
+
+ #[test]
+ fn test_drop_nonexistent_dimension() {
+ let mut qube = Qube::new();
+ let root = qube.root();
+
+ let class1 = qube.get_or_create_child("class", root, Some(1.into())).unwrap();
+ let _expver1 = qube.get_or_create_child("expver", class1, Some(1.into())).unwrap();
+
+ // Drop a dimension that doesn't exist - should have no effect
+ qube.drop(vec!["nonexistent"]).unwrap();
+
+ let root_node = qube.node(root).unwrap();
+ assert!(root_node.children(qube.dimension("class").unwrap()).is_some());
+
+ let class1_node = qube.node(class1).unwrap();
+ assert!(class1_node.children(qube.dimension("expver").unwrap()).is_some());
+ }
+
+ #[test]
+ fn test_squeeze() -> Result<(), String> {
+ let input = r#"root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"#;
+
+ let mut qube = Qube::from_ascii(input).unwrap();
+ qube.squeeze()?;
+
+ let ascii = qube.to_ascii();
+ println!("resulting ascii after squeeze:\n{}", ascii);
+ // class has only 1 value (1), so it should be squeezed out
+ assert!(!ascii.contains("class"), "class should be squeezed, got:\n{}", ascii);
+ // expver has 2 values, so it should remain
+ assert!(ascii.contains("expver"), "expver should remain, got:\n{}", ascii);
+ // param has 2 values, so it should remain
+ assert!(ascii.contains("param"), "param should remain, got:\n{}", ascii);
+
+ Ok(())
+ }
+}
diff --git a/qubed/src/select.rs b/qubed/src/select.rs
new file mode 100644
index 00000000..1083377c
--- /dev/null
+++ b/qubed/src/select.rs
@@ -0,0 +1,541 @@
+use crate::{Coordinates, Dimension, NodeIdx, Qube};
+use std::collections::{HashMap, HashSet};
+
+// TODO: select should return a QubeView, but this is an optimization
+
+#[derive(Debug, PartialEq, Eq)]
+pub enum SelectMode {
+ Default,
+ Prune,
+}
+
+pub(crate) struct WalkPair {
+ pub(crate) left: NodeIdx,
+ pub(crate) right: NodeIdx,
+}
+
+impl Qube {
+ // Select takes a dictionary of key-vecvalues pairs and returns a QubeView
+ // It does not matter which order the keys are specified
+
+ pub fn select(&self, selection: &[(&str, C)], mode: SelectMode) -> Result
+ where
+ C: Into + Clone,
+ {
+ let root = self.root();
+ let mut result = Qube::new();
+
+ let selection: HashMap<&str, Coordinates> =
+ selection.iter().map(|(k, v)| (*k, v.clone().into())).collect();
+
+ let parents = WalkPair { left: root, right: result.root() };
+
+ self.select_recurse(&selection, &mut result, parents)?;
+
+ // Prune any nodes which do not have all selected dimensions
+ if mode == SelectMode::Prune {
+ let mut has_none_of: HashSet<&str> = HashSet::new();
+ for key in selection.keys() {
+ has_none_of.insert(*key);
+ }
+
+ let result_root = result.root();
+ result.prune(result_root, has_none_of);
+ }
+
+ Ok(result)
+ }
+
+ fn select_recurse(
+ &self,
+ selection: &HashMap<&str, Coordinates>,
+ result: &mut Qube,
+ parents: WalkPair,
+ ) -> Result<(), String> {
+ let source_node =
+ self.node(parents.left).ok_or_else(|| format!("Node {:?} not found", parents.left))?;
+
+ // For each child in the source Qube, find the values which overlap and create a child in the result Qube
+ // We ignore values only_in_a and only_in_b, we only want the intersection
+
+ // Get the dimension of each chil
+ let span = source_node.child_dimensions();
+
+ for dimension in span {
+ let dimension_str = self.dimension_str(dimension).ok_or_else(|| {
+ format!("Dimension {:?} not found in key store. Should not happen.", dimension)
+ })?;
+
+ if selection.contains_key(dimension_str) {
+ let selection_coordinates = selection.get(dimension_str).unwrap();
+
+ // Get children for this dimension
+ let source_children: Vec<_> = match source_node.children(*dimension) {
+ Some(iter) => iter.collect(),
+ None => continue, // Skip this dimension if no children
+ };
+
+ for child_id in source_children {
+ let child_node = self
+ .node(child_id)
+ .ok_or_else(|| format!("Child node {:?} not found", child_id))?;
+
+ let coordinates = child_node.coordinates();
+
+ let intersection_result = coordinates.intersect(selection_coordinates);
+ let intersection = intersection_result.intersection;
+
+ if intersection.is_empty() {
+ continue;
+ }
+
+ let new_child = result.get_or_create_child(
+ dimension_str,
+ parents.right,
+ Some(intersection),
+ )?;
+
+ let new_parents = WalkPair { left: child_id, right: new_child };
+
+ self.select_recurse(selection, result, new_parents)?;
+
+ // If the newly created result node ended up with no children,
+ // and the source node was NOT a leaf (i.e., had children of its
+ // own), then no further selected dimensions matched anywhere
+ // beneath it. Remove the placeholder so it doesn't pollute the
+ // result. Leaf nodes (source_child_count == 0) are always kept.
+ let source_child_count = self
+ .node(child_id)
+ .ok_or_else(|| format!("Source node {:?} not found", child_id))?
+ .children_count();
+ let result_child_count = result
+ .node(new_child)
+ .ok_or_else(|| format!("Result node {:?} not found", new_child))?
+ .children_count();
+ if source_child_count > 0 && result_child_count == 0 {
+ result.remove_node(new_child).map_err(|e| {
+ format!("Failed to remove result node {:?}: {:?}", new_child, e)
+ })?;
+ }
+ }
+ } else {
+ // Dimension not in selection, so we take all children.
+ // However, we must only keep a child in the result if the
+ // recursive call into it actually produced something β otherwise
+ // we end up with empty branches for nodes whose descendants
+ // contain none of the selected values.
+ let source_children: Vec<_> = match source_node.children(*dimension) {
+ Some(iter) => iter.collect(),
+ None => continue, // Skip this dimension if no children
+ };
+
+ for child_id in source_children {
+ let child_node = self
+ .node(child_id)
+ .ok_or_else(|| format!("Child node {:?} not found", child_id))?;
+
+ let coordinates = child_node.coordinates();
+
+ let new_child = result.get_or_create_child(
+ dimension_str,
+ parents.right,
+ Some(coordinates.clone()),
+ )?;
+
+ let new_parents = WalkPair { left: child_id, right: new_child };
+
+ self.select_recurse(selection, result, new_parents)?;
+
+ // If the newly created result node ended up with no children,
+ // and the source node was NOT a leaf (i.e., had children of
+ // its own), then the subtree contained nothing matching the
+ // selection. Remove the placeholder so it doesn't pollute
+ // the result. Leaf nodes (source_child_count == 0) are
+ // always kept β their coordinates are the payload.
+ let source_child_count = self
+ .node(child_id)
+ .ok_or_else(|| format!("Source node {:?} not found", child_id))?
+ .children_count();
+ let result_child_count = result
+ .node(new_child)
+ .ok_or_else(|| format!("Result node {:?} not found", new_child))?
+ .children_count();
+ if source_child_count > 0 && result_child_count == 0 {
+ result.remove_node(new_child).map_err(|e| {
+ format!("Failed to remove result node {:?}: {:?}", new_child, e)
+ })?;
+ }
+ }
+ }
+ }
+
+ Ok(())
+ }
+
+ // TODO: "has_none_of" needs a better name. Or the whole method needs a better name
+ pub fn prune(&mut self, node_id: NodeIdx, has_none_of: HashSet<&str>) {
+ // Scope the immutable borrow
+ let child_data = {
+ let node = match self.node(node_id) {
+ Some(n) => n,
+ None => return,
+ };
+
+ let span = node.span();
+
+ // Count dimensions in has_none_of
+ let mut count = 0;
+ for dim in span {
+ if has_none_of.contains(self.dimension_str(&dim).unwrap_or("")) {
+ count += 1;
+ }
+ }
+
+ // If missing dimensions, we'll remove this node
+ if count < has_none_of.len() {
+ drop(node); // Explicitly drop to release borrow
+ self.remove_node(node_id)
+ .map_err(|e| format!("Failed to remove result node {:?}: {:?}", node_id, e));
+ return;
+ }
+
+ // Collect child data before releasing the borrow
+ let child_dimensions: Vec = node.child_dimensions().copied().collect();
+ let mut child_data = Vec::new();
+
+ for dim in &child_dimensions {
+ let dim_str = self.dimension_str(&dim).unwrap_or("");
+ let mut new_has_none_of = has_none_of.clone();
+ if new_has_none_of.contains(dim_str) {
+ new_has_none_of.remove(dim_str);
+ }
+
+ if let Some(children_iter) = node.children(*dim) {
+ let children: Vec = children_iter.collect();
+ child_data.push((children, new_has_none_of));
+ }
+ }
+
+ child_data
+ }; // node dropped here, borrow released
+
+ // Now we can mutably borrow self for recursion
+ for (children, new_has_none_of) in child_data {
+ for child_id in children {
+ self.prune(child_id, new_has_none_of.clone());
+ }
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ // TODO: improve test with a more complicated example. Build from a string first.
+ #[test]
+ fn test_select_1() -> Result<(), String> {
+ let input = r#"root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=2
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"#;
+
+ let qube = Qube::from_ascii(input).unwrap();
+
+ let selection = [("class", &[1])];
+ let selected_qube = qube.select(&selection, SelectMode::Default)?;
+
+ println!("Selected Qube:\n{}", selected_qube.to_ascii());
+
+ let result = r#"root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"#;
+ let result = Qube::from_ascii(result).unwrap();
+ assert_eq!(selected_qube.to_ascii(), result.to_ascii());
+
+ Ok(())
+ }
+
+ #[test]
+ fn test_select_2() -> Result<(), String> {
+ let input = r#"root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=2
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"#;
+
+ let qube = Qube::from_ascii(input).unwrap();
+
+ let mut selection = std::collections::HashMap::new();
+ selection.insert("class".to_string(), Coordinates::from(1));
+ selection.insert("param".to_string(), Coordinates::from(1));
+
+ let selection = [("class", &[1]), ("param", &[1])];
+
+ let selected_qube = qube.select(&selection, SelectMode::Default)?;
+
+ println!("Selected Qube:\n{}", selected_qube.to_ascii());
+
+ let result = r#"root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1
+ βββ expver=0002
+ βββ param=1"#;
+
+ let result = Qube::from_ascii(result).unwrap();
+ assert_eq!(selected_qube.to_ascii(), result.to_ascii());
+
+ Ok(())
+ }
+
+ #[test]
+ fn test_select_drops_branches_without_matching_deep_key() -> Result<(), String> {
+ // The selected key (param) is not at the top level β expver sits above it.
+ // Branches whose descendants contain none of the selected param values must
+ // be removed, not left as empty placeholders in the result.
+ let input = r#"root
+βββ expver=0001
+β βββ param=1
+β βββ param=2
+βββ expver=0002
+ βββ param=3
+ βββ param=4"#;
+
+ let qube = Qube::from_ascii(input).unwrap();
+ let selected = qube.select(&[("param", &[1][..])], SelectMode::Default)?;
+
+ let expected = r#"root
+βββ expver=0001
+ βββ param=1"#;
+ let expected_qube = Qube::from_ascii(expected).unwrap();
+
+ assert_eq!(
+ selected.to_ascii(),
+ expected_qube.to_ascii(),
+ "expver=0002 (no param=1 descendants) should be absent from the result"
+ );
+ Ok(())
+ }
+
+ #[test]
+ fn test_select_deep_key_multi_level_unselected_prefix() -> Result<(), String> {
+ // class and expver are both above the selected dimension (param).
+ // Only the branches that lead to a matching param value should survive.
+ let input = r#"root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=3
+β βββ param=4
+βββ class=2
+ βββ expver=0001
+ βββ param=5
+ βββ param=6"#;
+
+ let qube = Qube::from_ascii(input).unwrap();
+ let selected = qube.select(&[("param", &[1][..])], SelectMode::Default)?;
+
+ let expected = r#"root
+βββ class=1
+ βββ expver=0001
+ βββ param=1"#;
+ let expected_qube = Qube::from_ascii(expected).unwrap();
+
+ assert_eq!(
+ selected.to_ascii(),
+ expected_qube.to_ascii(),
+ "only class=1/expver=0001 contains param=1; all other branches must be pruned"
+ );
+ Ok(())
+ }
+
+ #[test]
+ fn test_prune() -> Result<(), String> {
+ let input = r#"root
+βββ class=1
+β βββ expver=1
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ type=x
+ βββ expver=1
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=2
+ βββ param=1
+ βββ param=2"#;
+
+ let mut qube = Qube::from_ascii(input).unwrap();
+ let root = qube.root();
+ let mut has_none_of = HashSet::new();
+ has_none_of.insert("class");
+
+ qube.prune(root, has_none_of);
+
+ let result = r#"root
+βββ class=1
+ βββ expver=1
+ β βββ param=1
+ β βββ param=2
+ βββ expver=0002
+ βββ param=1
+ βββ param=2
+"#;
+
+ assert_eq!(qube.to_ascii(), result);
+
+ Ok(())
+ }
+
+ #[test]
+ fn test_select_irregular_tree_dimension_order() -> Result<(), String> {
+ // The tree is "irregular": class appears at depth 1 in one branch but
+ // at depth 2 (below expver) in another. Selecting class=1 should keep
+ // only the branch where class=1 appears and prune the expver=0003 branch
+ // entirely because its only class value (class=2) does not match.
+ let input = r#"root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=3
+β βββ param=4
+βββ expver=0003
+ βββ class=2
+ βββ param=5
+ βββ param=6"#;
+
+ let qube = Qube::from_ascii(input).unwrap();
+ let selected = qube.select(&[("class", &[1][..])], SelectMode::Default)?;
+
+ let expected = r#"root
+βββ class=1
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ βββ expver=0002
+ βββ param=3
+ βββ param=4"#;
+ let expected_qube = Qube::from_ascii(expected).unwrap();
+
+ assert_eq!(
+ selected.to_ascii(),
+ expected_qube.to_ascii(),
+ "expver=0003 branch (containing only class=2) must be pruned entirely"
+ );
+ Ok(())
+ }
+
+ #[test]
+ fn test_select_irregular_tree_dimension_order2() -> Result<(), String> {
+ // The tree is "irregular": class appears at depth 1 in one branch but
+ // at depth 2 (below expver) in another. Selecting expver=0002 should keep
+ // only the parts of the tree where expver=0002 appears and prune the
+ // expver=0003-only branch entirely because it does not match the selection.
+ let input = r#"root
+βββ class=1
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=3
+β βββ param=4
+βββ expver=0002/0003
+ βββ class=2
+ βββ param=5
+ βββ param=6"#;
+
+ let qube = Qube::from_ascii(input).unwrap();
+ let selected = qube.select(&[("expver", &["0002"][..])], SelectMode::Default)?;
+
+ let expected = r#"root
+βββ class=1
+β βββ expver=0002
+β βββ param=3
+β βββ param=4
+βββ expver=0002
+ βββ class=2
+ βββ param=5
+ βββ param=6"#;
+ let expected_qube = Qube::from_ascii(expected).unwrap();
+
+ assert_eq!(
+ selected.to_ascii(),
+ expected_qube.to_ascii(),
+ "expver=0002 branches must be both kept"
+ );
+ Ok(())
+ }
+
+ #[test]
+ fn test_select_irregular_tree_dimension_order3() -> Result<(), String> {
+ // The tree is "irregular": class appears at depth 1 in one branch but
+ // at depth 2 (below expver) in another. Selecting class=1 should keep
+ // only the branch where class=1 appears and prune the expver=3 branch
+ // entirely because its only class value (class=2) does not match.
+ let input = r#"root
+βββ class=1
+β βββ expver=1
+β β βββ param=1
+β β βββ param=2
+β βββ expver=2
+β βββ param=3
+β βββ param=4
+βββ expver=2/3
+ βββ class=2
+ βββ param=5
+ βββ param=6"#;
+
+ let qube = Qube::from_ascii(input).unwrap();
+ let selected =
+ qube.select(&[("expver", &[2][..]), ("param", &[5][..])], SelectMode::Default)?;
+
+ let expected = r#"root
+βββ expver=2
+ βββ class=2
+ βββ param=5"#;
+ let expected_qube = Qube::from_ascii(expected).unwrap();
+
+ assert_eq!(
+ selected.to_ascii(),
+ expected_qube.to_ascii(),
+ "only one expver=2 branch must be kept"
+ );
+ Ok(())
+ }
+}
diff --git a/qubed/src/serde/ascii.rs b/qubed/src/serde/ascii.rs
new file mode 100644
index 00000000..2e18d677
--- /dev/null
+++ b/qubed/src/serde/ascii.rs
@@ -0,0 +1,228 @@
+use std::iter::Peekable;
+use std::str::Lines;
+
+use crate::{
+ Coordinates,
+ qube::{NodeIdx, Qube},
+};
+
+// ---------------- ASCII Deserialization ----------------
+
+impl Qube {
+ pub fn from_ascii(input: &str) -> Result {
+ let mut qube = Qube::new();
+
+ let mut lines = input.lines().peekable();
+ let root = qube.root();
+
+ skip_blank_lines(&mut lines);
+ parse_root(&mut lines)?;
+ parse_children(&mut qube, &mut lines, root, 0)?;
+
+ Ok(qube)
+ }
+}
+
+fn skip_blank_lines(lines: &mut Peekable) {
+ while let Some(line) = lines.peek() {
+ if line.trim().is_empty() {
+ lines.next();
+ } else {
+ break;
+ }
+ }
+}
+
+fn parse_root(lines: &mut Peekable) -> Result<(), String> {
+ let line = lines.next().ok_or("Input is empty")?;
+ let (indent, content) = parse_line(line)?;
+ if indent != 0 {
+ return Err(format!("Root node must have zero indentation, found {}", indent));
+ }
+ if content != "root" {
+ return Err(format!("Root node must be 'root', found '{}'", content));
+ }
+ Ok(())
+}
+
+fn parse_children(
+ qube: &mut Qube,
+ lines: &mut Peekable,
+ parent: NodeIdx,
+ parent_indent: usize,
+) -> Result<(), String> {
+ while let Some(line) = lines.peek() {
+ let (indent, content) = parse_line(line)?;
+
+ // Check if we need to break the recursion because we reached a non-sibling
+ if indent <= parent_indent {
+ break;
+ }
+ if indent > parent_indent + 1 {
+ return Err(format!(
+ "Unexpected indentation level: expected {} or less, got {}",
+ parent_indent + 1,
+ indent
+ ));
+ }
+
+ // Add this node
+ let (key, values) = content
+ .split_once("=")
+ .ok_or(format!("Invalid node format: '{}', expected 'key=value'", content))?;
+
+ let coordinates = Coordinates::from_string(values);
+
+ let child = qube.get_or_create_child(key, parent, Some(coordinates))?;
+
+ // Consume the input line, we've used it now
+ lines.next();
+
+ // Recurse into children
+ parse_children(qube, lines, child, indent)?;
+ }
+ Ok(())
+}
+
+fn parse_line(line: &str) -> Result<(usize, String), String> {
+ let chars: Vec = line.chars().collect();
+ let mut i = 0;
+
+ while i < chars.len() {
+ match chars[i] {
+ 'β' | 'β' | 'β' | ' ' | 'β' => i += 1,
+ _ => break,
+ }
+ }
+
+ if i % 4 != 0 {
+ return Err(format!("Invalid indentation: {} characters is not divisible by 4", i));
+ }
+
+ let indentation = i / 4;
+ let content = chars[i..].iter().collect::().trim().to_string();
+ Ok((indentation, content))
+}
+
+// ---------------- ASCII Serialization ----------------
+
+impl Qube {
+ pub fn to_ascii(&self) -> String {
+ let mut output = String::new();
+ output.push_str("root\n");
+ serialize_children(self, self.root(), "", &mut output);
+ output
+ }
+}
+
+fn serialize_children(qube: &Qube, parent_id: NodeIdx, prefix: &str, output: &mut String) {
+ let parent_node = match qube.node(parent_id) {
+ Some(node) => node,
+ None => return,
+ };
+
+ let children_ids: Vec<_> = parent_node.all_children().collect();
+
+ for (i, child_id) in children_ids.iter().enumerate() {
+ let is_last = i == children_ids.len() - 1;
+ let branch = if is_last { "βββ" } else { "βββ" };
+
+ let child_node = match qube.node(*child_id) {
+ Some(node) => node,
+ None => continue,
+ };
+
+ let key = child_node.dimension().unwrap_or("unknown");
+ let values = child_node.coordinates();
+ let values_str = values.to_string();
+
+ output.push_str(prefix);
+ output.push_str(branch);
+ output.push(' ');
+ output.push_str(&format!("{}={}", key, values_str));
+ output.push('\n');
+
+ let next_prefix =
+ if is_last { format!("{} ", prefix) } else { format!("{}β ", prefix) };
+ serialize_children(qube, *child_id, &next_prefix, output);
+ }
+}
+
+// ---------------- Tests ----------------
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_from_ascii() {
+ let input = r#"root
+βββ class=od
+β βββ expver=0001
+β β βββ param=1
+β β βββ param=2
+β βββ expver=0002
+β βββ param=1
+β βββ param=2
+βββ class=rd
+ βββ expver=0001
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=0002
+ βββ param=1
+ βββ param=2"#;
+ let _qube = Qube::from_ascii(input).unwrap();
+ }
+
+ #[test]
+ fn test_from_ascii_indent_not_divisible_by_4() {
+ let input = r#"root
+βββ class=od
+β βββ expver=0001"#;
+ let result = Qube::from_ascii(input);
+ assert!(result.is_err());
+ assert!(result.unwrap_err().contains("not divisible by 4"));
+ }
+
+ #[test]
+ fn test_from_ascii_unexpected_indentation_gap() {
+ let input = r#"root
+βββ class=od
+β βββ expver=0001"#;
+ let result = Qube::from_ascii(input);
+ assert!(result.is_err());
+ assert!(result.unwrap_err().contains("Unexpected indentation"));
+ }
+
+ #[test]
+ fn test_to_from_ascii_roundtrip() {
+ let input = r#"root
+βββ class=od
+β βββ expver=1/2
+β β βββ param=1
+β β βββ param=2
+β βββ expver=2
+β βββ param=1
+β βββ param=2
+βββ class=rd
+ βββ expver=1
+ β βββ param=1
+ β βββ param=2
+ β βββ param=3
+ βββ expver=2
+ βββ param=1
+ βββ param=2
+"#;
+
+ let qube = Qube::from_ascii(input).unwrap();
+ let serialized = qube.to_ascii();
+ let re_parsed = Qube::from_ascii(&serialized).unwrap();
+ let re_serialized = re_parsed.to_ascii();
+
+ println!("Serialized:\n{}", serialized);
+
+ assert_eq!(input, serialized);
+ assert_eq!(serialized, re_serialized);
+ }
+}
diff --git a/qubed/src/serde/json.rs b/qubed/src/serde/json.rs
new file mode 100644
index 00000000..fa3741ec
--- /dev/null
+++ b/qubed/src/serde/json.rs
@@ -0,0 +1,476 @@
+use crate::{Coordinates, NodeIdx, Qube};
+use serde_json::{Map, Value};
+
+// ---------------- JSON Deserialization ----------------
+
+impl Qube {
+ pub fn from_json(value: Value) -> Result {
+ let mut qube = Qube::new();
+
+ if let Value::Object(map) = value {
+ let root = qube.root();
+ parse_json_object(&mut qube, root, &map)?;
+ } else {
+ return Err("Expected JSON object at root".to_string());
+ }
+
+ Ok(qube)
+ }
+}
+
+fn parse_json_object(
+ qube: &mut Qube,
+ parent: NodeIdx,
+ map: &Map,
+) -> Result<(), String> {
+ for (key_value, child_value) in map {
+ let (key, values_str) = key_value
+ .split_once('=')
+ .ok_or_else(|| format!("Invalid node format: '{}', expected 'key=value'", key_value))?;
+
+ let values = Coordinates::from_string(values_str);
+ let child = qube.get_or_create_child(key, parent, Some(values))?;
+
+ if let Value::Object(child_map) = child_value {
+ parse_json_object(qube, child, child_map)?;
+ }
+ }
+ Ok(())
+}
+
+// ---------------- JSON Serialization ----------------
+
+impl Qube {
+ pub fn to_json(&self) -> Value {
+ let mut root_map = Map::new();
+ serialize_children_json(self, self.root(), &mut root_map);
+ Value::Object(root_map)
+ }
+}
+
+impl Qube {
+ /// Serialize the Qube into an "arena" JSON layout: a flat array of node
+ /// records. Each record contains the dimension name, the coordinates as a
+ /// string, and the index of the parent node (or null for the root). The
+ /// nodes are emitted in BFS order so parents always precede children.
+ pub fn to_arena_json(&self) -> Value {
+ use std::collections::{HashMap, VecDeque};
+
+ let mut order: Vec = Vec::new();
+ let mut q: VecDeque = VecDeque::new();
+ q.push_back(self.root());
+
+ while let Some(id) = q.pop_front() {
+ order.push(id);
+ if let Some(nref) = self.node(id) {
+ for child in nref.all_children() {
+ q.push_back(child);
+ }
+ }
+ }
+
+ let mut idx_map: HashMap = HashMap::new();
+ for (i, id) in order.iter().enumerate() {
+ idx_map.insert(*id, i);
+ }
+
+ let mut nodes_json: Vec = Vec::with_capacity(order.len());
+ for id in order.iter() {
+ let nref = self.node(*id).expect("valid node");
+ let dim = nref.dimension().unwrap_or("root").to_string();
+ // Build coords object with explicit type tags so consumers know the
+ // coordinate type without guessing. Examples:
+ // { "ints": [1,2,3] }, { "strings": ["od"] }, { "floats": [...] }, or mixed object.
+ let coords_value = {
+ use serde_json::{Map, Value};
+ let mut map = Map::new();
+
+ // Use the public Coordinates -> JSON helper which returns a
+ // native serde_json::Value (array/string/object/null).
+ let native = nref.coordinates().to_json_value();
+
+ match nref.coordinates() {
+ // Represent empty coordinates as JSON null so they round-trip as `Empty`,
+ // not as `Mixed(empty)` (which is how an empty object `{}` would be read).
+ crate::Coordinates::Empty => Value::Null,
+ crate::Coordinates::Integers(_) => match native {
+ Value::Array(arr) => {
+ map.insert("ints".to_string(), Value::Array(arr));
+ Value::Object(map)
+ }
+ Value::String(s) => {
+ // RangeSet or other textual form β preserve as string under "ints_text"
+ map.insert("ints_text".to_string(), Value::String(s));
+ Value::Object(map)
+ }
+ other => {
+ map.insert("ints".to_string(), other);
+ Value::Object(map)
+ }
+ },
+ crate::Coordinates::Floats(_) => match native {
+ Value::Array(arr) => {
+ map.insert("floats".to_string(), Value::Array(arr));
+ Value::Object(map)
+ }
+ other => {
+ map.insert("floats".to_string(), other);
+ Value::Object(map)
+ }
+ },
+ crate::Coordinates::Strings(_) => match native {
+ Value::Array(arr) => {
+ map.insert("strings".to_string(), Value::Array(arr));
+ Value::Object(map)
+ }
+ other => {
+ map.insert("strings".to_string(), other);
+ Value::Object(map)
+ }
+ },
+ crate::Coordinates::DateTimes(_) => {
+ // Fallback to whatever the generic serializer produces (not implemented elsewhere yet)
+ let v = nref.coordinates().to_json_value();
+ match v {
+ Value::Array(arr) => {
+ map.insert("datetimes".to_string(), Value::Array(arr));
+ Value::Object(map)
+ }
+ other => Value::Object(map),
+ }
+ }
+ crate::Coordinates::Mixed(_) => {
+ // Mixed already produces an object with keys like ints/floats/strings
+ nref.coordinates().to_json_value()
+ }
+ }
+ };
+
+ let parent_idx = nref.parent().map(|p| idx_map.get(&p).copied().unwrap());
+
+ let children_indices: Vec = nref
+ .all_children()
+ .map(|c| Value::Number(serde_json::Number::from(*idx_map.get(&c).unwrap() as u64)))
+ .collect();
+
+ let mut map = Map::new();
+ map.insert("dim".to_string(), Value::String(dim));
+ map.insert("coords".to_string(), coords_value);
+ match parent_idx {
+ Some(pi) => map.insert(
+ "parent".to_string(),
+ Value::Number(serde_json::Number::from(pi as u64)),
+ ),
+ None => map.insert("parent".to_string(), Value::Null),
+ };
+ map.insert("children".to_string(), Value::Array(children_indices));
+
+ nodes_json.push(Value::Object(map));
+ }
+
+ // Wrap the arena array with a versioned envelope so format changes
+ // can be detected by consumers.
+ let mut root_map = Map::new();
+ root_map.insert("version".to_string(), Value::String("1".to_string()));
+ root_map.insert("qube".to_string(), Value::Array(nodes_json));
+ Value::Object(root_map)
+ }
+
+ /// Reconstruct a Qube from an arena JSON layout created by `to_arena_json`.
+ pub fn from_arena_json(value: Value) -> Result {
+ use std::collections::HashMap;
+
+ // Expect a versioned envelope with structure { "version": "1", "qube": [ ... ] }
+ let arr = match value {
+ Value::Object(map) => {
+ // check version
+ let version_val = map
+ .get("version")
+ .ok_or_else(|| "Arena JSON missing 'version' field".to_string())?;
+ let ok = match version_val {
+ Value::String(s) => s == "1",
+ Value::Number(n) => n.as_u64().map(|v| v == 1).unwrap_or(false),
+ _ => false,
+ };
+ if !ok {
+ return Err(format!("Unsupported arena JSON version: {:?}", version_val));
+ }
+
+ // extract qube array
+ match map.get("qube") {
+ Some(Value::Array(a)) => a.clone(),
+ _ => return Err("Arena JSON missing 'qube' array".to_string()),
+ }
+ }
+ _ => return Err("Expected JSON object envelope for arena layout".to_string()),
+ };
+
+ // We will create nodes in the same order. Start with a fresh Qube which
+ // already contains a root node.
+ let mut qube = Qube::new();
+ let mut index_to_node: HashMap = HashMap::new();
+
+ for (i, item) in arr.into_iter().enumerate() {
+ let obj =
+ item.as_object().ok_or_else(|| format!("Arena entry {} is not an object", i))?;
+ let dim = obj
+ .get("dim")
+ .and_then(|v| v.as_str())
+ .ok_or_else(|| format!("Arena entry {} missing dim", i))?;
+ let coords_value =
+ obj.get("coords").ok_or_else(|| format!("Arena entry {} missing coords", i))?;
+
+ // Determine parent: if null or 0 -> root
+ let parent_idx_opt = match obj.get("parent") {
+ Some(Value::Null) | None => None,
+ Some(v) => v.as_u64().map(|n| n as usize),
+ };
+
+ let parent_node = if let Some(pi) = parent_idx_opt {
+ // parent should have been created earlier
+ *index_to_node.get(&pi).ok_or_else(|| format!("Parent index {} not found", pi))?
+ } else {
+ qube.root()
+ };
+
+ // create child under parent
+ // Interpret typed coords object if present so we deserialize into
+ // the most specific `Coordinates` variant (Integers, Strings,
+ // Floats) rather than always producing a Mixed variant. If the
+ // coords object contains a single typed key (e.g. `ints`,
+ // `strings`, `floats`) we'll pass the underlying array/string to
+ // `from_json_value`. If it contains multiple keys we pass the
+ // whole object to obtain a `Mixed` coordinates value.
+ let coords_parsed = {
+ use serde_json::Value;
+
+ // Build a Value suitable for Coordinates::from_json_value
+ let coords_for_parse: Value = match coords_value {
+ Value::Object(map) => {
+ // Detect typed keys
+ let has_ints = map.get("ints").is_some();
+ let has_ints_text = map.get("ints_text").is_some();
+ let has_strings = map.get("strings").is_some();
+ let has_floats = map.get("floats").is_some();
+ let has_datetimes = map.get("datetimes").is_some();
+
+ let typed_key_count =
+ [has_ints, has_ints_text, has_strings, has_floats, has_datetimes]
+ .iter()
+ .filter(|&&b| b)
+ .count();
+
+ if has_ints_text && typed_key_count == 1 {
+ // textual integer representation -> parse as string
+ map.get("ints_text").cloned().unwrap_or(Value::Null)
+ } else if has_ints && typed_key_count == 1 {
+ // ints as native array -> pass array so `from_json_value`
+ // returns `Coordinates::Integers` where possible
+ map.get("ints").cloned().unwrap_or(Value::Null)
+ } else if has_strings && typed_key_count == 1 {
+ map.get("strings").cloned().unwrap_or(Value::Null)
+ } else if has_floats && typed_key_count == 1 {
+ map.get("floats").cloned().unwrap_or(Value::Null)
+ } else if has_datetimes && typed_key_count == 1 {
+ map.get("datetimes").cloned().unwrap_or(Value::Null)
+ } else {
+ // Mixed or unknown: pass the whole object so
+ // `from_json_value` can create a MixedCoordinates
+ Value::Object(map.clone())
+ }
+ }
+ other => other.clone(),
+ };
+
+ let value_for_parse = match coords_value {
+ Value::Object(map) if map.len() == 1 && map.contains_key("datetimes") => {
+ coords_value.clone()
+ }
+ _ => coords_for_parse,
+ };
+
+ Coordinates::from_json_value(&value_for_parse)?
+ };
+ let created = if i == 0 {
+ // first entry corresponds to root; update root coords if provided
+ // skip creating a new node; optionally set coords on root
+ index_to_node.insert(0, qube.root());
+ if !coords_parsed.is_empty() {
+ // mutate root node coords
+ if let Some(root_node) = qube.node_mut(qube.root()) {
+ *root_node.coords_mut() = coords_parsed.clone();
+ }
+ }
+ qube.root()
+ } else {
+ qube.get_or_create_child(dim, parent_node, Some(coords_parsed))?
+ };
+
+ index_to_node.insert(i, created);
+ }
+
+ Ok(qube)
+ }
+}
+
+fn serialize_children_json(qube: &Qube, parent_id: NodeIdx, output: &mut Map) {
+ let parent_node = match qube.node(parent_id) {
+ Some(node) => node,
+ None => return,
+ };
+
+ let children_ids: Vec = parent_node.all_children().collect();
+
+ for child_id in children_ids.iter() {
+ let child_node = match qube.node(*child_id) {
+ Some(node) => node,
+ None => continue,
+ };
+
+ let key = child_node.dimension().unwrap_or("unknown");
+ let values = child_node.coordinates();
+ let values_str = values.to_string();
+
+ let key_value = format!("{}={}", key, values_str);
+
+ // Recursively build child object
+ let mut child_map = Map::new();
+ serialize_children_json(qube, *child_id, &mut child_map);
+
+ output.insert(key_value, Value::Object(child_map));
+ }
+}
+
+// ---------------- Tests ----------------
+
+// TODO: The JSON structure should probably be more detailed, possibly splitting values and children into separate fields, possibly containing type information for the values too.
+// Denser/faster layout could also serialize the arena directly.
+// Maybe we put a flag at the start saying what kind of JSON it is?
+
+#[cfg(test)]
+mod json_tests {
+ use super::*;
+ use serde_json::json;
+
+ #[test]
+ fn test_from_json() {
+ let qube = Qube::from_json(json!({
+ "class=od": {
+ "expver=0001/0002": {
+ "param=1/2": {}
+ }
+ },
+ "class=rd": {
+ "expver=0001": {"param=1/2/3": {}},
+ "expver=0002": {"param=1/2": {}}
+ }
+ }))
+ .unwrap();
+
+ // Verify structure
+ let root_node = qube.node(qube.root()).unwrap();
+ let root_children: Vec<_> = root_node.all_children().collect();
+ assert_eq!(root_children.len(), 2);
+ }
+
+ #[test]
+ fn test_to_json() {
+ let qube = Qube::from_json(json!({
+ "class=od": {
+ "expver=0001": {
+ "param=1": {}
+ }
+ }
+ }))
+ .unwrap();
+
+ let json_output = qube.to_json();
+ println!("{}", serde_json::to_string_pretty(&json_output).unwrap());
+
+ // Verify it's a valid object
+ assert!(json_output.is_object());
+ }
+
+ #[test]
+ fn test_to_from_json_roundtrip() {
+ let original = json!({
+ "class=od": {
+ "expver=1/2": {
+ "param=1/2": {}
+ }
+ },
+ "class=rd": {
+ "expver=1": {"param=1/2/3": {}},
+ "expver=2": {"param=1/2": {}}
+ }
+ });
+
+ let qube = Qube::from_json(original.clone()).unwrap();
+ let serialized = qube.to_json();
+ let _re_parsed = Qube::from_json(serialized.clone()).unwrap();
+
+ assert_eq!(original, serialized);
+
+ // Verify structure is preserved
+ println!("Original:\n{}", serde_json::to_string_pretty(&original).unwrap());
+ println!("Serialized:\n{}", serde_json::to_string_pretty(&serialized).unwrap());
+ }
+
+ #[test]
+ fn test_from_json_large() {}
+
+ #[test]
+ fn test_arena_roundtrip() {
+ let mut qube = Qube::new();
+ let root = qube.root();
+
+ // branch 1: class=od / expver=0001 / param=1
+ let class1 = {
+ let mut c = Coordinates::Empty;
+ c.append("od".to_string());
+ qube.get_or_create_child("class", root, Some(c)).unwrap()
+ };
+ let exp1 = {
+ let mut c = Coordinates::Empty;
+ c.append("0001".to_string());
+ qube.get_or_create_child("expver", class1, Some(c)).unwrap()
+ };
+ let _p1 = {
+ let mut c = Coordinates::Empty;
+ c.append("1".to_string());
+ qube.get_or_create_child("param", exp1, Some(c)).unwrap()
+ };
+
+ // branch 2: class=rd / expver=0003 / param=3
+ let class2 = {
+ let mut c = Coordinates::Empty;
+ c.append("rd".to_string());
+ qube.get_or_create_child("class", root, Some(c)).unwrap()
+ };
+ let exp2 = {
+ let mut c = Coordinates::Empty;
+ c.append("0003".to_string());
+ qube.get_or_create_child("expver", class2, Some(c)).unwrap()
+ };
+ let _p2 = {
+ let mut c = Coordinates::Empty;
+ c.append("3".to_string());
+ qube.get_or_create_child("param", exp2, Some(c)).unwrap()
+ };
+
+ // Serialize arena JSON and print
+ let arena = qube.to_arena_json();
+ println!("{}", serde_json::to_string_pretty(&arena).unwrap());
+
+ // Assert version number is present and correct
+ assert_eq!(
+ arena.get("version").and_then(|v| v.as_str()),
+ Some("1"),
+ "Arena JSON should have version field set to '1'"
+ );
+
+ // Reconstruct and verify structure equality via to_json()
+ let reconstructed = Qube::from_arena_json(arena).expect("from_arena_json");
+ assert_eq!(qube.to_json(), reconstructed.to_json());
+ }
+}
diff --git a/qubed/src/serde/mod.rs b/qubed/src/serde/mod.rs
new file mode 100644
index 00000000..308b911b
--- /dev/null
+++ b/qubed/src/serde/mod.rs
@@ -0,0 +1,2 @@
+pub mod ascii;
+pub mod json;
diff --git a/qubed/src/utils/mod.rs b/qubed/src/utils/mod.rs
new file mode 100644
index 00000000..f63dac8d
--- /dev/null
+++ b/qubed/src/utils/mod.rs
@@ -0,0 +1 @@
+pub mod tiny_ordered_set;
diff --git a/qubed/src/utils/tiny_ordered_set.rs b/qubed/src/utils/tiny_ordered_set.rs
new file mode 100644
index 00000000..87ecb4e1
--- /dev/null
+++ b/qubed/src/utils/tiny_ordered_set.rs
@@ -0,0 +1,365 @@
+use std::hash::Hash;
+
+#[derive(Debug, Clone, PartialEq)]
+pub enum TinyOrderedSet {
+ Vec(arrayvec::ArrayVec),
+ BTreeSet(std::collections::BTreeSet),
+}
+
+#[allow(dead_code)] // TODO
+impl TinyOrderedSet {
+ pub fn new() -> Self {
+ TinyOrderedSet::Vec(arrayvec::ArrayVec::::new())
+ }
+ pub fn insert(&mut self, value: T)
+ where
+ T: Ord + Clone,
+ {
+ match self {
+ TinyOrderedSet::Vec(vec) => {
+ match vec.binary_search(&value) {
+ Ok(_) => (), // already exists
+ Err(pos) => {
+ if vec.len() < CAP {
+ vec.insert(pos, value);
+ } else {
+ // upgrade to BTreeSet
+ let mut btree_set = std::collections::BTreeSet::new();
+ for v in vec.drain(..) {
+ btree_set.insert(v);
+ }
+ btree_set.insert(value);
+ *self = TinyOrderedSet::BTreeSet(btree_set);
+ }
+ }
+ }
+ }
+ TinyOrderedSet::BTreeSet(btree_set) => {
+ btree_set.insert(value);
+ }
+ }
+ }
+
+ pub fn contains(&self, value: &T) -> bool
+ where
+ T: Ord,
+ {
+ match self {
+ TinyOrderedSet::Vec(vec) => vec.binary_search(value).is_ok(),
+ TinyOrderedSet::BTreeSet(btree_set) => btree_set.contains(value),
+ }
+ }
+
+ pub fn iter(&self) -> impl Iterator- + '_ {
+ match self {
+ TinyOrderedSet::Vec(vec) => itertools::Either::Left(vec.iter()),
+ TinyOrderedSet::BTreeSet(set) => itertools::Either::Right(set.iter()),
+ }
+ }
+
+ pub fn len(&self) -> usize {
+ match self {
+ TinyOrderedSet::Vec(vec) => vec.len(),
+ TinyOrderedSet::BTreeSet(set) => set.len(),
+ }
+ }
+
+ pub(crate) fn hash(&self, hasher: &mut impl std::hash::Hasher)
+ where
+ T: std::hash::Hash,
+ {
+ match self {
+ TinyOrderedSet::Vec(vec) => {
+ "vec".hash(hasher);
+ for item in vec.iter() {
+ item.hash(hasher);
+ }
+ }
+ TinyOrderedSet::BTreeSet(set) => {
+ "btreeset".hash(hasher);
+ for item in set.iter() {
+ item.hash(hasher);
+ }
+ }
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_new_creates_empty_vec_variant() {
+ let set: TinyOrderedSet
= TinyOrderedSet::new();
+ assert_eq!(set.len(), 0);
+ assert!(matches!(set, TinyOrderedSet::Vec(_)));
+ }
+
+ #[test]
+ fn test_insert_single_element() {
+ let mut set: TinyOrderedSet = TinyOrderedSet::new();
+ set.insert(42);
+ assert_eq!(set.len(), 1);
+ assert!(set.contains(&42));
+ }
+
+ #[test]
+ fn test_insert_maintains_sorted_order() {
+ let mut set: TinyOrderedSet = TinyOrderedSet::new();
+ set.insert(3);
+ set.insert(1);
+ set.insert(2);
+
+ let values: Vec<_> = set.iter().copied().collect();
+ assert_eq!(values, vec![1, 2, 3]);
+ }
+
+ #[test]
+ fn test_insert_rejects_duplicates() {
+ let mut set: TinyOrderedSet = TinyOrderedSet::new();
+ set.insert(42);
+ set.insert(42);
+ set.insert(42);
+
+ assert_eq!(set.len(), 1);
+ assert!(set.contains(&42));
+ }
+
+ #[test]
+ fn test_stays_as_vec_within_capacity() {
+ let mut set: TinyOrderedSet = TinyOrderedSet::new();
+ set.insert(1);
+ set.insert(2);
+ set.insert(3);
+ set.insert(4);
+
+ assert_eq!(set.len(), 4);
+ assert!(matches!(set, TinyOrderedSet::Vec(_)));
+ }
+
+ #[test]
+ fn test_transitions_to_btreeset_when_exceeding_capacity() {
+ let mut set: TinyOrderedSet = TinyOrderedSet::new();
+ set.insert(1);
+ set.insert(2);
+ set.insert(3);
+ set.insert(4);
+ set.insert(5); // Should trigger transition
+
+ assert_eq!(set.len(), 5);
+ assert!(matches!(set, TinyOrderedSet::BTreeSet(_)));
+ assert!(set.contains(&5));
+ }
+
+ #[test]
+ fn test_btreeset_preserves_all_elements_after_transition() {
+ let mut set: TinyOrderedSet = TinyOrderedSet::new();
+ set.insert(10);
+ set.insert(20);
+ set.insert(30);
+ set.insert(40); // Transition happens here
+
+ assert!(set.contains(&10));
+ assert!(set.contains(&20));
+ assert!(set.contains(&30));
+ assert!(set.contains(&40));
+
+ let values: Vec<_> = set.iter().copied().collect();
+ assert_eq!(values, vec![10, 20, 30, 40]);
+ }
+
+ #[test]
+ fn test_btreeset_continues_to_work_after_transition() {
+ let mut set: TinyOrderedSet = TinyOrderedSet::new();
+ set.insert(1);
+ set.insert(2);
+ set.insert(3); // Transition
+ set.insert(4);
+ set.insert(5);
+
+ assert_eq!(set.len(), 5);
+ assert!(set.contains(&1));
+ assert!(set.contains(&5));
+ }
+
+ #[test]
+ fn test_contains_returns_false_for_missing_elements() {
+ let mut set: TinyOrderedSet