From f6bf66253437889403b2dca6d308a3ca497130e3 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 16 Oct 2024 14:22:13 +1100 Subject: [PATCH 001/138] Update perturbIC.py Update perturbIC.py Can the random generator be simplified? Refactored changes to the perturbIC. Most of the code is not in smaller functions. The descriptions are still in progress. Update perturbIC.py Added more documentation and created variables for the integers --- src/perturbIC.py | 249 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 212 insertions(+), 37 deletions(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index 22ff4a38..e5e25933 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -6,47 +6,222 @@ # Martin Dix martin.dix@csiro.au +#!/usr/bin/env python + +# Apply a perturbation to initial condition. +# Note that this works in place. +# For ENDGAME perturb thetavd as well if it's present + +# Martin Dix martin.dix@csiro.au + import argparse import umfile from um_fileheaders import * -from numpy.random import MT19937, RandomState, SeedSequence - -parser = argparse.ArgumentParser(description="Perturb UM initial dump") -parser.add_argument('-a', dest='amplitude', type=float, default=0.01, - help = 'Amplitude of perturbation') -parser.add_argument('-s', dest='seed', type=int, required=True, - help = 'Random number seed (must be non-negative integer)') -parser.add_argument('ifile', help='Input file (modified in place)') - -args = parser.parse_args() - -if args.seed >= 0: - rs = RandomState(MT19937(SeedSequence(args.seed))) -else: - raise Exception('Seed must be positive') - -f = umfile.UMFile(args.ifile, 'r+') - -# Set up theta perturbation. -nlon = f.inthead[IC_XLen] -nlat = f.inthead[IC_YLen] -# Same at each level so as not to upset vertical stability -perturb = args.amplitude * (2.*rs.random(nlon*nlat).reshape((nlat,nlon)) - 1.) -# Set poles to zero (only necessary for ND grids, but doesn't hurt EG) -perturb[0] = 0. -perturb[-1] = 0. - -for k in range(f.fixhd[FH_LookupSize2]): +from numpy.random import PCG64, Generator + + +def parse_args(): + """ + This function parses the arguments from the command line + + Parameters + ---------- + None + + Returns + ---------- + args_parsed : ArguementParser object + Contains the arguments from the command line that can be access with their dest + """ + parser = argparse.ArgumentParser(description="Perturb UM initial dump") + parser.add_argument('-a', dest='amplitude', type=float, default=0.01, + help = 'Amplitude of perturbation') + parser.add_argument('-s', dest='seed', type=int, default=None, + help = 'Random number seed (must be non-negative integer)') + parser.add_argument('-o', dest='output', type=str, default=None, + help = 'Output file (if none given modified in place)') + parser.add_argument('ifile', help='Input file (modified in place)') + args_parsed = parser.parse_args() + return args_parsed + +def set_seed(args): + """ + This function sets the seed, if any, for the random generator + + Parameters + ---------- + args : ArgumentParser object + The argument parser object with amplitude, seed from commandline + + Returns + ---------- + Random Object + or + Exception + """ + if args.seed == None: + return Generator(PCG64()) + + elif args.seed >=0: + return Generator(PCG64(args.seed)) + else: + raise Exception('Seed must be positive') + +def is_inplace(args): + """ + This provides an outline for editing if a new file should be + created + + Parameters + ---------- + args: ArgumentParser object + The argument parser object with output file name + + Returns + ---------- + Boolean - returns False for editing in place and True if a new + outfile has been created + + subprocess.run(['cp', original_file, new_file]) + """ + + if args.output == None: + return False + + else: + subprocess.run(['cp', args.ifile, args.output]) + return True + +def create_perturbation(args, rs, nlon, nlat): + """ + This function create a random pertrbation of amplitude args.amplitude + + Parameters + ---------- + args : Dictionary - The argumenst from the commandline (amplitude, seed) + rs : Random Object - The random object that has a seed (if defined) + Argument 2 description + nlon: Int - This is the lon + Argument 3 description + + Returns + ---------- + pertubation - Array - Returns a perturbation where the poles are set to 0 + + """ + perturbation = args.amplitude * (2.*rs.random(nlon*nlat).reshape((nlat,nlon)) - 1.) + + # Set poles to zero (only necessary for ND grids, but doesn't hurt EG) + perturbation[0] = 0 + perturbation[-1] = 0 + return perturbation + +def is_end_of_file(f, k, data_limit): + """ + This function checks to see if there is data associated with the metadata + + Parameters + ---------- + f : umFile Object + This is the fields file that holds the restart data + + k : int + This integer is indexing the metadata in the fields file + + data_limit : int + This int is a placeholder indicating the end of the data + Returns + ---------- + boolean - True if the end of the data is reached and False everwhere else + + """ ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - # 4 is theta, 388 is thetavd (ENDGAME only) - if ilookup[ITEM_CODE] in (4, 388): + if ilookup[LBEGIN] == data_limit: + return True + else: + return False + +def if_perturb(ilookup,k,f,perturb,surface_temp_item_code,endgame): + """ + This function checks to make sure that the correct field is used (surface temperature) + + Parameters + ---------- + ilookup : + k : int + This integer is indexing the metadata in the fields file + + f : umFile Object + Holds the entire umfile including metadata and data + + perturb : Array + Holds the random perturbation and has shape nlon x nlat + + surface_temp_item_code : int + This integer represents the item code for surface temperature or theata + + endgame : int + This integer represents the FIXME + + Returns + ---------- + boolean - True if this is the correct data to be perturbed. False for all other item codes + Array - If True the perturbation is added to the data array + + """ + if ilookup[ITEM_CODE] in (surface_temp_item_code,endgame): + a = f.readfld(k) - # Note that using += ensures the datatype of a doesn't change - # (in case it's float32) a += perturb - f.writefld(a,k) + + return True, a + + else: + + return False, None + +def main(): + """ + This function executes all the steps to add the perturbation.The results if saving the perturbation + in the restart file. + """ + + #Define all the variables + data_limit = -99 + surface_temp_item_code = 4 + endgame = 388 + + #Obtain the arguements from the commandline + #Then set the seed if there is one + args = parse_args() + random_obj = set_seed(args) + + f = umfile.UMFile(args.ifile, 'r+') + + # The definitions of the grid + nlon = f.inthead[IC_XLen] + nlat = f.inthead[IC_YLen] + + # Same at each level so as not to upset vertical stability + perturb = create_perturbation(args, random_obj, nlon, nlat) + + for k in range(f.fixhd[FH_LookupSize2]): + + #Check to make sure not at the edge of the data + if is_end_of_file(f, k, data_limit): + break + + ilookup = f.ilookup[k] + + #Find the correct field and add perturbation + is_perturb, a = if_perturb(ilookup,k,f,perturb,surface_temp_item_code,endgame) + if is_perturb: + + f.writefld(a,k) + + f.close() + + +if __name__== "__main__": -f.close() + main 210,1 Bot From 5c8fbe40d1896bbfe373a63f10c6f3832e146c31 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:48:19 +1100 Subject: [PATCH 002/138] Create github-actions-demo.yml --- .github/workflows/github-actions-demo.yml | 55 +++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 .github/workflows/github-actions-demo.yml diff --git a/.github/workflows/github-actions-demo.yml b/.github/workflows/github-actions-demo.yml new file mode 100644 index 00000000..6576076a --- /dev/null +++ b/.github/workflows/github-actions-demo.yml @@ -0,0 +1,55 @@ +name: CI + +on: [pull_request, push, workflow_dispatch] + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4.2.1 + - uses: actions/setup-python@v5 + - uses: pre-commit/action@v3.0.1 + + test: + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + python-version: ["3.9", "3.10", "3.11"] + + steps: + - name: Checkout source + uses: actions/checkout@v4.2.1 + + - name: Setup conda environment + uses: conda-incubator/setup-miniconda@v3 + with: + miniconda-version: "latest" + python-version: ${{ matrix.python-version }} + environment-file: ci/environment-${{ matrix.python-version }}.yml + activate-environment: umfile_utils + auto-activate-base: false + + - name: Install source + shell: bash -l {0} + run: python -m pip install . + + - name: List installed packages + shell: bash -l {0} + run: conda list + + - name: Run tests + shell: bash -l {0} + run: coverage run -m --source=umfile_utils + + umfile_utils + + - name: Generate coverage report + shell: bash -l {0} + run: coverage xml + + - name: Upload code coverage + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.codecov_token }} + files: ./coverage.xml From 14ac0304cbb67ed6fe0d2589decc982a39223578 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:54:48 +1100 Subject: [PATCH 003/138] Create perturbIC_test.py Adding the pytests --- tests/perturbIC_test.py | 158 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 tests/perturbIC_test.py diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py new file mode 100644 index 00000000..ed23e4d7 --- /dev/null +++ b/tests/perturbIC_test.py @@ -0,0 +1,158 @@ +import pytest +import sys +from perturbIC import parse_args, set_seed, create_perturbation, is_end_of_file, if_perturb +from unittest.mock import Mock +import numpy as np +import numpy.random as rs + + + +@pytest.fixture +def mock_command_line(): + """ + This function create a callable command line input + + Outputs + list - Command line arguements + """ + return ["perturbIC.py", "-a", "0.4", "-s", "23452", + "-o", "restart_dump_copy_perturb.astart", + "~/access-esm1.5/preindustrial+concentrations/archive/restart000/atmosphere/restart_dump_copy.astart"] + +@pytest.fixture +def mock_perturbation(): + """ + This function create a callable perturbation dimensions + + Outputs + nlon - int + nlat - int + """ + + nlon = 192 + nlat = 145 + + return nlon, nlat + +@pytest.fixture +def mock_metadata(): + """ + This function create a callable metadata + + Outputs + list - Command line arguements + """ + list_len = 31 + mock_data = Mock() + mock_data.ilookup = [np.ones(list_len)*10, + np.ones(list_len)*11, + np.ones(list_len)*-99] + metadata_index = 1 + end_of_data = -99 + + return mock_data, metadata_index, end_of_data + +#Test the Imports may not be necessary +def test_parse_args(monkeypatch, mock_command_line): + """ + This function tests the parse_args function with the fake commandline arguments + Inputs + fixture - A class of helpful methods for mock data + fixture - A list of command line arguements + Outputs + The results of assertion tests. + """ + + monkeypatch.setattr(sys, "argv", mock_command_line) + args = parse_args() + assert args.amplitude == 0.4 + assert args.seed == 23452 + assert args.output == "restart_dump_copy_perturb.astart" + +#Test checking the seed +#def test_set_seed(args): +#Not sure if we need test but the conditionals in a function is nice. + + +#Test creating output file +#def test_creating_output_file(): + + +#Test the random generator +def test_create_perturbation(monkeypatch, mock_command_line, mock_perturbation): + """ + This function tests the create_perturbation function with the fake commandline arguments + Inputs + fixture - A class of helpful methods for mock data + fixture - A list of command line arguements + Outputs + The results of assertion tests. + """ + + monkeypatch.setattr(sys, "argv", mock_command_line) + args = parse_args() + rs = set_seed(args) + nlon, nlat = mock_perturbation + + perturb = create_perturbation(args, rs, nlon, nlat) + assert perturb.shape == (nlat,nlon) + +def test_is_end_of_file_keep_going(mock_metadata): + """ + This function tests the detection of the edge of the data + Inputs + fixture - A fake list of arrays and a fake index + Outputs + The results of assertion tests. + """ + + mock_data, metadata_index,end_of_data = mock_metadata + assert is_end_of_file(mock_data, metadata_index, end_of_data) == False + assert is_end_of_file(mock_data, metadata_index+1, end_of_data) == True + + +#Test that the perturbation has been applied +def test_applying_perturbation(mock_perturbation): + + """ + This function tests the addition of the perturbation to the correct field + This function in the perturbIC.py is written to both check the itemcode when + it finds the correct item code to read the field and add the perturbation. + + + Inputs + fixture - A fake list of arrays and a fake index + Outputs + The results of assertion tests. + """ + + #Create random perturbation + nlon, nlat = mock_perturbation + perturb = 0.5 * (2.*rs.random(nlon*nlat).reshape((nlat,nlon))-1.) + perturb[0] = 0 + perturb[-1] = 0 + + #Create a fake data array to simulate the numpy array that is + #To mock the method readfld that reads the field corresponding + #To the itemcode + shape = (nlat, nlon) # Example shape of 3 rows and 4 columns + mock_data = Mock() + mock_data.readfld.return_value = np.ones(shape) + metadata_index = 0 + surface_temp_item_code = 4 + endgame = 388 + + #Create the ilookup method and place a 4 somewhere in it + mock_data.ilookup = np.arange(0,52) + mock_data.ilookup[41] = 4 + + #Run the fucntion to get the outputs + is_perturb,a = if_perturb(mock_data.ilookup,metadata_index,mock_data,perturb,surface_temp_item_code,endgame) + + #Testing if the perturb conditional works and if the resulting array is correct + testing_a = np.round((a - perturb) / np.ones(shape),0) + assert is_perturb == True + assert a.shape == (nlat, nlon) + assert testing_a.all() == 1. + + 157,0-1 Bot From 18f5870f9f9044c0c07fa25f9e4c12d55a5caa25 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 09:41:18 +1100 Subject: [PATCH 004/138] Rename github-actions-demo.yml to unit_testing_umfile_utils.yml --- .../{github-actions-demo.yml => unit_testing_umfile_utils.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{github-actions-demo.yml => unit_testing_umfile_utils.yml} (100%) diff --git a/.github/workflows/github-actions-demo.yml b/.github/workflows/ unit_testing_umfile_utils.yml similarity index 100% rename from .github/workflows/github-actions-demo.yml rename to .github/workflows/ unit_testing_umfile_utils.yml From c232a23eb01d4a11dadf37516ebaba152f88fe3d Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 10:34:55 +1100 Subject: [PATCH 005/138] Update unit_testing_umfile_utils.yml --- .github/workflows/ unit_testing_umfile_utils.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ unit_testing_umfile_utils.yml b/.github/workflows/ unit_testing_umfile_utils.yml index 6576076a..40a73c3c 100644 --- a/.github/workflows/ unit_testing_umfile_utils.yml +++ b/.github/workflows/ unit_testing_umfile_utils.yml @@ -13,7 +13,7 @@ jobs: test: runs-on: ubuntu-latest strategy: - fail-fast: true + fail-fast: false matrix: python-version: ["3.9", "3.10", "3.11"] @@ -40,9 +40,7 @@ jobs: - name: Run tests shell: bash -l {0} - run: coverage run -m --source=umfile_utils - - umfile_utils + run: coverage run -m --source=umfile_utils pytest - name: Generate coverage report shell: bash -l {0} From 096c16e2a69d685ae6290cb58d9a90762ea146c5 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 10:45:58 +1100 Subject: [PATCH 006/138] Create environment-3.10.yml Create the necessary environments for testing for 3.10 Update environment-3.10.yml --- ci/environment-3.10.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 ci/environment-3.10.yml diff --git a/ci/environment-3.10.yml b/ci/environment-3.10.yml new file mode 100644 index 00000000..90d21c99 --- /dev/null +++ b/ci/environment-3.10.yml @@ -0,0 +1,22 @@ +name: umfile_utils-test +channels: + - conda-forge + - accessnri + - defaults +dependencies: + - python==3.10 + - cftime + - ecgtools>=2023.7.13 + - intake==0.7.0 + - intake-dataframe-catalog>=0.2.4 + - intake-esm>=2023.11.10 + - jsonschema + - pooch + - pre-commit + - pytest + - xarray + - pip + - pip: + - codecov + - pytest-cov + - six From c489f22ad12292b2481191277eb1084f74a49a3a Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 10:47:41 +1100 Subject: [PATCH 007/138] Create environment-3.11.yml Create the environment for Python 3.11 Update environment-3.11.yml --- ci/environment-3.11.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 ci/environment-3.11.yml diff --git a/ci/environment-3.11.yml b/ci/environment-3.11.yml new file mode 100644 index 00000000..311d34f8 --- /dev/null +++ b/ci/environment-3.11.yml @@ -0,0 +1,23 @@ +name: umfiles-utils-test +channels: + - conda-forge + - accessnri + - defaults +dependencies: + - python==3.11 + - cftime + - ecgtools>=2023.7.13 + - intake==0.7.0 + - intake-dataframe-catalog>=0.2.4 + - intake-esm>=2023.11.10 + - jsonschema + - pooch + - pre-commit + - pytest + - xarray + - pip + - pip: + - codecov + - pytest-cov + - six + From 0824c2ab02157bc899c78598386ad51a41e0a0be Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 10:47:54 +1100 Subject: [PATCH 008/138] Update unit_testing_umfile_utils.yml --- .github/workflows/ unit_testing_umfile_utils.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ unit_testing_umfile_utils.yml b/.github/workflows/ unit_testing_umfile_utils.yml index 40a73c3c..a787056c 100644 --- a/.github/workflows/ unit_testing_umfile_utils.yml +++ b/.github/workflows/ unit_testing_umfile_utils.yml @@ -15,7 +15,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11"] steps: - name: Checkout source From 0c963a403609153851e4c4778aa8880da7116db8 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 11:08:32 +1100 Subject: [PATCH 009/138] Create setup.py --- setup.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 setup.py diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..fcbb31fa --- /dev/null +++ b/setup.py @@ -0,0 +1,8 @@ +from setuptools import setup + +import versioneer + +setup( + version=versioneer.get_version(), + cmdclass=versioneer.get_cmdclass(), +) From db922fe967ecacdd23b6b8f48dcd69b0f0ed23ac Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 11:14:04 +1100 Subject: [PATCH 010/138] Create versioneer.py --- versioneer.py | 2264 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2264 insertions(+) create mode 100644 versioneer.py diff --git a/versioneer.py b/versioneer.py new file mode 100644 index 00000000..8f14259c --- /dev/null +++ b/versioneer.py @@ -0,0 +1,2264 @@ +# Version: 0.28 + +"""The Versioneer - like a rocketeer, but for versions. + +The Versioneer +============== + +* like a rocketeer, but for versions! +* https://github.com/python-versioneer/python-versioneer +* Brian Warner +* License: Public Domain (Unlicense) +* Compatible with: Python 3.7, 3.8, 3.9, 3.10 and pypy3 +* [![Latest Version][pypi-image]][pypi-url] +* [![Build Status][travis-image]][travis-url] + +This is a tool for managing a recorded version number in setuptools-based +python projects. The goal is to remove the tedious and error-prone "update +the embedded version string" step from your release process. Making a new +release should be as easy as recording a new tag in your version-control +system, and maybe making new tarballs. + + +## Quick Install + +Versioneer provides two installation modes. The "classic" vendored mode installs +a copy of versioneer into your repository. The experimental build-time dependency mode +is intended to allow you to skip this step and simplify the process of upgrading. + +### Vendored mode + +* `pip install versioneer` to somewhere in your $PATH + * A [conda-forge recipe](https://github.com/conda-forge/versioneer-feedstock) is + available, so you can also use `conda install -c conda-forge versioneer` +* add a `[tool.versioneer]` section to your `pyproject.toml` or a + `[versioneer]` section to your `setup.cfg` (see [Install](INSTALL.md)) + * Note that you will need to add `tomli; python_version < "3.11"` to your + build-time dependencies if you use `pyproject.toml` +* run `versioneer install --vendor` in your source tree, commit the results +* verify version information with `python setup.py version` + +### Build-time dependency mode + +* `pip install versioneer` to somewhere in your $PATH + * A [conda-forge recipe](https://github.com/conda-forge/versioneer-feedstock) is + available, so you can also use `conda install -c conda-forge versioneer` +* add a `[tool.versioneer]` section to your `pyproject.toml` or a + `[versioneer]` section to your `setup.cfg` (see [Install](INSTALL.md)) +* add `versioneer` (with `[toml]` extra, if configuring in `pyproject.toml`) + to the `requires` key of the `build-system` table in `pyproject.toml`: + ```toml + [build-system] + requires = ["setuptools", "versioneer[toml]"] + build-backend = "setuptools.build_meta" + ``` +* run `versioneer install --no-vendor` in your source tree, commit the results +* verify version information with `python setup.py version` + +## Version Identifiers + +Source trees come from a variety of places: + +* a version-control system checkout (mostly used by developers) +* a nightly tarball, produced by build automation +* a snapshot tarball, produced by a web-based VCS browser, like github's + "tarball from tag" feature +* a release tarball, produced by "setup.py sdist", distributed through PyPI + +Within each source tree, the version identifier (either a string or a number, +this tool is format-agnostic) can come from a variety of places: + +* ask the VCS tool itself, e.g. "git describe" (for checkouts), which knows + about recent "tags" and an absolute revision-id +* the name of the directory into which the tarball was unpacked +* an expanded VCS keyword ($Id$, etc) +* a `_version.py` created by some earlier build step + +For released software, the version identifier is closely related to a VCS +tag. Some projects use tag names that include more than just the version +string (e.g. "myproject-1.2" instead of just "1.2"), in which case the tool +needs to strip the tag prefix to extract the version identifier. For +unreleased software (between tags), the version identifier should provide +enough information to help developers recreate the same tree, while also +giving them an idea of roughly how old the tree is (after version 1.2, before +version 1.3). Many VCS systems can report a description that captures this, +for example `git describe --tags --dirty --always` reports things like +"0.7-1-g574ab98-dirty" to indicate that the checkout is one revision past the +0.7 tag, has a unique revision id of "574ab98", and is "dirty" (it has +uncommitted changes). + +The version identifier is used for multiple purposes: + +* to allow the module to self-identify its version: `myproject.__version__` +* to choose a name and prefix for a 'setup.py sdist' tarball + +## Theory of Operation + +Versioneer works by adding a special `_version.py` file into your source +tree, where your `__init__.py` can import it. This `_version.py` knows how to +dynamically ask the VCS tool for version information at import time. + +`_version.py` also contains `$Revision$` markers, and the installation +process marks `_version.py` to have this marker rewritten with a tag name +during the `git archive` command. As a result, generated tarballs will +contain enough information to get the proper version. + +To allow `setup.py` to compute a version too, a `versioneer.py` is added to +the top level of your source tree, next to `setup.py` and the `setup.cfg` +that configures it. This overrides several distutils/setuptools commands to +compute the version when invoked, and changes `setup.py build` and `setup.py +sdist` to replace `_version.py` with a small static file that contains just +the generated version data. + +## Installation + +See [INSTALL.md](./INSTALL.md) for detailed installation instructions. + +## Version-String Flavors + +Code which uses Versioneer can learn about its version string at runtime by +importing `_version` from your main `__init__.py` file and running the +`get_versions()` function. From the "outside" (e.g. in `setup.py`), you can +import the top-level `versioneer.py` and run `get_versions()`. + +Both functions return a dictionary with different flavors of version +information: + +* `['version']`: A condensed version string, rendered using the selected + style. This is the most commonly used value for the project's version + string. The default "pep440" style yields strings like `0.11`, + `0.11+2.g1076c97`, or `0.11+2.g1076c97.dirty`. See the "Styles" section + below for alternative styles. + +* `['full-revisionid']`: detailed revision identifier. For Git, this is the + full SHA1 commit id, e.g. "1076c978a8d3cfc70f408fe5974aa6c092c949ac". + +* `['date']`: Date and time of the latest `HEAD` commit. For Git, it is the + commit date in ISO 8601 format. This will be None if the date is not + available. + +* `['dirty']`: a boolean, True if the tree has uncommitted changes. Note that + this is only accurate if run in a VCS checkout, otherwise it is likely to + be False or None + +* `['error']`: if the version string could not be computed, this will be set + to a string describing the problem, otherwise it will be None. It may be + useful to throw an exception in setup.py if this is set, to avoid e.g. + creating tarballs with a version string of "unknown". + +Some variants are more useful than others. Including `full-revisionid` in a +bug report should allow developers to reconstruct the exact code being tested +(or indicate the presence of local changes that should be shared with the +developers). `version` is suitable for display in an "about" box or a CLI +`--version` output: it can be easily compared against release notes and lists +of bugs fixed in various releases. + +The installer adds the following text to your `__init__.py` to place a basic +version in `YOURPROJECT.__version__`: + + from ._version import get_versions + __version__ = get_versions()['version'] + del get_versions + +## Styles + +The setup.cfg `style=` configuration controls how the VCS information is +rendered into a version string. + +The default style, "pep440", produces a PEP440-compliant string, equal to the +un-prefixed tag name for actual releases, and containing an additional "local +version" section with more detail for in-between builds. For Git, this is +TAG[+DISTANCE.gHEX[.dirty]] , using information from `git describe --tags +--dirty --always`. For example "0.11+2.g1076c97.dirty" indicates that the +tree is like the "1076c97" commit but has uncommitted changes (".dirty"), and +that this commit is two revisions ("+2") beyond the "0.11" tag. For released +software (exactly equal to a known tag), the identifier will only contain the +stripped tag, e.g. "0.11". + +Other styles are available. See [details.md](details.md) in the Versioneer +source tree for descriptions. + +## Debugging + +Versioneer tries to avoid fatal errors: if something goes wrong, it will tend +to return a version of "0+unknown". To investigate the problem, run `setup.py +version`, which will run the version-lookup code in a verbose mode, and will +display the full contents of `get_versions()` (including the `error` string, +which may help identify what went wrong). + +## Known Limitations + +Some situations are known to cause problems for Versioneer. This details the +most significant ones. More can be found on Github +[issues page](https://github.com/python-versioneer/python-versioneer/issues). + +### Subprojects + +Versioneer has limited support for source trees in which `setup.py` is not in +the root directory (e.g. `setup.py` and `.git/` are *not* siblings). The are +two common reasons why `setup.py` might not be in the root: + +* Source trees which contain multiple subprojects, such as + [Buildbot](https://github.com/buildbot/buildbot), which contains both + "master" and "slave" subprojects, each with their own `setup.py`, + `setup.cfg`, and `tox.ini`. Projects like these produce multiple PyPI + distributions (and upload multiple independently-installable tarballs). +* Source trees whose main purpose is to contain a C library, but which also + provide bindings to Python (and perhaps other languages) in subdirectories. + +Versioneer will look for `.git` in parent directories, and most operations +should get the right version string. However `pip` and `setuptools` have bugs +and implementation details which frequently cause `pip install .` from a +subproject directory to fail to find a correct version string (so it usually +defaults to `0+unknown`). + +`pip install --editable .` should work correctly. `setup.py install` might +work too. + +Pip-8.1.1 is known to have this problem, but hopefully it will get fixed in +some later version. + +[Bug #38](https://github.com/python-versioneer/python-versioneer/issues/38) is tracking +this issue. The discussion in +[PR #61](https://github.com/python-versioneer/python-versioneer/pull/61) describes the +issue from the Versioneer side in more detail. +[pip PR#3176](https://github.com/pypa/pip/pull/3176) and +[pip PR#3615](https://github.com/pypa/pip/pull/3615) contain work to improve +pip to let Versioneer work correctly. + +Versioneer-0.16 and earlier only looked for a `.git` directory next to the +`setup.cfg`, so subprojects were completely unsupported with those releases. + +### Editable installs with setuptools <= 18.5 + +`setup.py develop` and `pip install --editable .` allow you to install a +project into a virtualenv once, then continue editing the source code (and +test) without re-installing after every change. + +"Entry-point scripts" (`setup(entry_points={"console_scripts": ..})`) are a +convenient way to specify executable scripts that should be installed along +with the python package. + +These both work as expected when using modern setuptools. When using +setuptools-18.5 or earlier, however, certain operations will cause +`pkg_resources.DistributionNotFound` errors when running the entrypoint +script, which must be resolved by re-installing the package. This happens +when the install happens with one version, then the egg_info data is +regenerated while a different version is checked out. Many setup.py commands +cause egg_info to be rebuilt (including `sdist`, `wheel`, and installing into +a different virtualenv), so this can be surprising. + +[Bug #83](https://github.com/python-versioneer/python-versioneer/issues/83) describes +this one, but upgrading to a newer version of setuptools should probably +resolve it. + + +## Updating Versioneer + +To upgrade your project to a new release of Versioneer, do the following: + +* install the new Versioneer (`pip install -U versioneer` or equivalent) +* edit `setup.cfg` and `pyproject.toml`, if necessary, + to include any new configuration settings indicated by the release notes. + See [UPGRADING](./UPGRADING.md) for details. +* re-run `versioneer install --[no-]vendor` in your source tree, to replace + `SRC/_version.py` +* commit any changed files + +## Future Directions + +This tool is designed to make it easily extended to other version-control +systems: all VCS-specific components are in separate directories like +src/git/ . The top-level `versioneer.py` script is assembled from these +components by running make-versioneer.py . In the future, make-versioneer.py +will take a VCS name as an argument, and will construct a version of +`versioneer.py` that is specific to the given VCS. It might also take the +configuration arguments that are currently provided manually during +installation by editing setup.py . Alternatively, it might go the other +direction and include code from all supported VCS systems, reducing the +number of intermediate scripts. + +## Similar projects + +* [setuptools_scm](https://github.com/pypa/setuptools_scm/) - a non-vendored build-time + dependency +* [minver](https://github.com/jbweston/miniver) - a lightweight reimplementation of + versioneer +* [versioningit](https://github.com/jwodder/versioningit) - a PEP 518-based setuptools + plugin + +## License + +To make Versioneer easier to embed, all its code is dedicated to the public +domain. The `_version.py` that it creates is also in the public domain. +Specifically, both are released under the "Unlicense", as described in +https://unlicense.org/. + +[pypi-image]: https://img.shields.io/pypi/v/versioneer.svg +[pypi-url]: https://pypi.python.org/pypi/versioneer/ +[travis-image]: +https://img.shields.io/travis/com/python-versioneer/python-versioneer.svg +[travis-url]: https://travis-ci.com/github/python-versioneer/python-versioneer + +""" +# pylint:disable=invalid-name,import-outside-toplevel,missing-function-docstring +# pylint:disable=missing-class-docstring,too-many-branches,too-many-statements +# pylint:disable=raise-missing-from,too-many-lines,too-many-locals,import-error +# pylint:disable=too-few-public-methods,redefined-outer-name,consider-using-with +# pylint:disable=attribute-defined-outside-init,too-many-arguments + +import configparser +import errno +import functools +import json +import os +import re +import subprocess +import sys +from pathlib import Path +from typing import Callable + +have_tomllib = True +if sys.version_info >= (3, 11): + import tomllib +else: + try: + import tomli as tomllib + except ImportError: + have_tomllib = False + + +class VersioneerConfig: + """Container for Versioneer configuration parameters.""" + + +def get_root(): + """Get the project root directory. + + We require that all commands are run from the project root, i.e. the + directory that contains setup.py, setup.cfg, and versioneer.py . + """ + root = os.path.realpath(os.path.abspath(os.getcwd())) + setup_py = os.path.join(root, "setup.py") + versioneer_py = os.path.join(root, "versioneer.py") + if not (os.path.exists(setup_py) or os.path.exists(versioneer_py)): + # allow 'python path/to/setup.py COMMAND' + root = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0]))) + setup_py = os.path.join(root, "setup.py") + versioneer_py = os.path.join(root, "versioneer.py") + if not (os.path.exists(setup_py) or os.path.exists(versioneer_py)): + err = ( + "Versioneer was unable to run the project root directory. " + "Versioneer requires setup.py to be executed from " + "its immediate directory (like 'python setup.py COMMAND'), " + "or in a way that lets it use sys.argv[0] to find the root " + "(like 'python path/to/setup.py COMMAND')." + ) + raise VersioneerBadRootError(err) + try: + # Certain runtime workflows (setup.py install/develop in a setuptools + # tree) execute all dependencies in a single python process, so + # "versioneer" may be imported multiple times, and python's shared + # module-import table will cache the first one. So we can't use + # os.path.dirname(__file__), as that will find whichever + # versioneer.py was first imported, even in later projects. + my_path = os.path.realpath(os.path.abspath(__file__)) + me_dir = os.path.normcase(os.path.splitext(my_path)[0]) + vsr_dir = os.path.normcase(os.path.splitext(versioneer_py)[0]) + if me_dir != vsr_dir and "VERSIONEER_PEP518" not in globals(): + print( + "Warning: build in %s is using versioneer.py from %s" + % (os.path.dirname(my_path), versioneer_py) + ) + except NameError: + pass + return root + + +def get_config_from_root(root): + """Read the project setup.cfg file to determine Versioneer config.""" + # This might raise OSError (if setup.cfg is missing), or + # configparser.NoSectionError (if it lacks a [versioneer] section), or + # configparser.NoOptionError (if it lacks "VCS="). See the docstring at + # the top of versioneer.py for instructions on writing your setup.cfg . + root = Path(root) + pyproject_toml = root / "pyproject.toml" + setup_cfg = root / "setup.cfg" + section = None + if pyproject_toml.exists() and have_tomllib: + try: + with open(pyproject_toml, "rb") as fobj: + pp = tomllib.load(fobj) + section = pp["tool"]["versioneer"] + except (tomllib.TOMLDecodeError, KeyError): + pass + if not section: + parser = configparser.ConfigParser() + with open(setup_cfg) as cfg_file: + parser.read_file(cfg_file) + parser.get("versioneer", "VCS") # raise error if missing + + section = parser["versioneer"] + + cfg = VersioneerConfig() + cfg.VCS = section["VCS"] + cfg.style = section.get("style", "") + cfg.versionfile_source = section.get("versionfile_source") + cfg.versionfile_build = section.get("versionfile_build") + cfg.tag_prefix = section.get("tag_prefix") + if cfg.tag_prefix in ("''", '""', None): + cfg.tag_prefix = "" + cfg.parentdir_prefix = section.get("parentdir_prefix") + cfg.verbose = section.get("verbose") + return cfg + + +class NotThisMethod(Exception): + """Exception raised if a method is not valid for the current scenario.""" + + +# these dictionaries contain VCS-specific tools +LONG_VERSION_PY: dict[str, str] = {} +HANDLERS: dict[str, dict[str, Callable]] = {} + + +def register_vcs_handler(vcs, method): # decorator + """Create decorator to mark a method as the handler of a VCS.""" + + def decorate(f): + """Store f in HANDLERS[vcs][method].""" + HANDLERS.setdefault(vcs, {})[method] = f + return f + + return decorate + + +def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env=None): + """Call the given command(s).""" + assert isinstance(commands, list) + process = None + + popen_kwargs = {} + if sys.platform == "win32": + # This hides the console window if pythonw.exe is used + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + popen_kwargs["startupinfo"] = startupinfo + + for command in commands: + try: + dispcmd = str([command] + args) + # remember shell=False, so use git.cmd on windows, not just git + process = subprocess.Popen( + [command] + args, + cwd=cwd, + env=env, + stdout=subprocess.PIPE, + stderr=(subprocess.PIPE if hide_stderr else None), + **popen_kwargs, + ) + break + except OSError: + e = sys.exc_info()[1] + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %s" % dispcmd) + print(e) + return None, None + else: + if verbose: + print(f"unable to find command, tried {commands}") + return None, None + stdout = process.communicate()[0].strip().decode() + if process.returncode != 0: + if verbose: + print("unable to run %s (error)" % dispcmd) + print("stdout was %s" % stdout) + return None, process.returncode + return stdout, process.returncode + + +LONG_VERSION_PY[ + "git" +] = r''' +# This file helps to compute a version number in source trees obtained from +# git-archive tarball (such as those provided by githubs download-from-tag +# feature). Distribution tarballs (built by setup.py sdist) and build +# directories (produced by setup.py build) will contain a much shorter file +# that just contains the computed version number. + +# This file is released into the public domain. +# Generated by versioneer-0.28 +# https://github.com/python-versioneer/python-versioneer + +"""Git implementation of _version.py.""" + +import errno +import os +import re +import subprocess +import sys +from typing import Callable, Dict +import functools + + +def get_keywords(): + """Get the keywords needed to look up the version information.""" + # these strings will be replaced by git during git-archive. + # setup.py/versioneer.py will grep for the variable names, so they must + # each be defined on a line of their own. _version.py will just call + # get_keywords(). + git_refnames = "%(DOLLAR)sFormat:%%d%(DOLLAR)s" + git_full = "%(DOLLAR)sFormat:%%H%(DOLLAR)s" + git_date = "%(DOLLAR)sFormat:%%ci%(DOLLAR)s" + keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} + return keywords + + +class VersioneerConfig: + """Container for Versioneer configuration parameters.""" + + +def get_config(): + """Create, populate and return the VersioneerConfig() object.""" + # these strings are filled in when 'setup.py versioneer' creates + # _version.py + cfg = VersioneerConfig() + cfg.VCS = "git" + cfg.style = "%(STYLE)s" + cfg.tag_prefix = "%(TAG_PREFIX)s" + cfg.parentdir_prefix = "%(PARENTDIR_PREFIX)s" + cfg.versionfile_source = "%(VERSIONFILE_SOURCE)s" + cfg.verbose = False + return cfg + + +class NotThisMethod(Exception): + """Exception raised if a method is not valid for the current scenario.""" + + +LONG_VERSION_PY: Dict[str, str] = {} +HANDLERS: Dict[str, Dict[str, Callable]] = {} + + +def register_vcs_handler(vcs, method): # decorator + """Create decorator to mark a method as the handler of a VCS.""" + def decorate(f): + """Store f in HANDLERS[vcs][method].""" + if vcs not in HANDLERS: + HANDLERS[vcs] = {} + HANDLERS[vcs][method] = f + return f + return decorate + + +def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, + env=None): + """Call the given command(s).""" + assert isinstance(commands, list) + process = None + + popen_kwargs = {} + if sys.platform == "win32": + # This hides the console window if pythonw.exe is used + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + popen_kwargs["startupinfo"] = startupinfo + + for command in commands: + try: + dispcmd = str([command] + args) + # remember shell=False, so use git.cmd on windows, not just git + process = subprocess.Popen([command] + args, cwd=cwd, env=env, + stdout=subprocess.PIPE, + stderr=(subprocess.PIPE if hide_stderr + else None), **popen_kwargs) + break + except OSError: + e = sys.exc_info()[1] + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %%s" %% dispcmd) + print(e) + return None, None + else: + if verbose: + print("unable to find command, tried %%s" %% (commands,)) + return None, None + stdout = process.communicate()[0].strip().decode() + if process.returncode != 0: + if verbose: + print("unable to run %%s (error)" %% dispcmd) + print("stdout was %%s" %% stdout) + return None, process.returncode + return stdout, process.returncode + + +def versions_from_parentdir(parentdir_prefix, root, verbose): + """Try to determine the version from the parent directory name. + + Source tarballs conventionally unpack into a directory that includes both + the project name and a version string. We will also support searching up + two directory levels for an appropriately named parent directory + """ + rootdirs = [] + + for _ in range(3): + dirname = os.path.basename(root) + if dirname.startswith(parentdir_prefix): + return {"version": dirname[len(parentdir_prefix):], + "full-revisionid": None, + "dirty": False, "error": None, "date": None} + rootdirs.append(root) + root = os.path.dirname(root) # up a level + + if verbose: + print("Tried directories %%s but none started with prefix %%s" %% + (str(rootdirs), parentdir_prefix)) + raise NotThisMethod("rootdir doesn't start with parentdir_prefix") + + +@register_vcs_handler("git", "get_keywords") +def git_get_keywords(versionfile_abs): + """Extract version information from the given file.""" + # the code embedded in _version.py can just fetch the value of these + # keywords. When used from setup.py, we don't want to import _version.py, + # so we do it with a regexp instead. This function is not used from + # _version.py. + keywords = {} + try: + with open(versionfile_abs, "r") as fobj: + for line in fobj: + if line.strip().startswith("git_refnames ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["refnames"] = mo.group(1) + if line.strip().startswith("git_full ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["full"] = mo.group(1) + if line.strip().startswith("git_date ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["date"] = mo.group(1) + except OSError: + pass + return keywords + + +@register_vcs_handler("git", "keywords") +def git_versions_from_keywords(keywords, tag_prefix, verbose): + """Get version information from git keywords.""" + if "refnames" not in keywords: + raise NotThisMethod("Short version file found") + date = keywords.get("date") + if date is not None: + # Use only the last line. Previous lines may contain GPG signature + # information. + date = date.splitlines()[-1] + + # git-2.2.0 added "%%cI", which expands to an ISO-8601 -compliant + # datestamp. However we prefer "%%ci" (which expands to an "ISO-8601 + # -like" string, which we must then edit to make compliant), because + # it's been around since git-1.5.3, and it's too difficult to + # discover which version we're using, or to work around using an + # older one. + date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") + refs = {r.strip() for r in refnames.strip("()").split(",")} + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " + tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %%d + # expansion behaves like git log --decorate=short and strips out the + # refs/heads/ and refs/tags/ prefixes that would let us distinguish + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". + tags = {r for r in refs if re.search(r'\d', r)} + if verbose: + print("discarding '%%s', no digits" %% ",".join(refs - tags)) + if verbose: + print("likely tags: %%s" %% ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix):] + # Filter out refs that exactly match prefix or that don't start + # with a number once the prefix is stripped (mostly a concern + # when prefix is '') + if not re.match(r'\d', r): + continue + if verbose: + print("picking %%s" %% r) + return {"version": r, + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": None, + "date": date} + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return {"version": "0+unknown", + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": "no suitable tags", "date": None} + + +@register_vcs_handler("git", "pieces_from_vcs") +def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command): + """Get version from 'git describe' in the root of the source tree. + + This only gets called if the git-archive 'subst' keywords were *not* + expanded, and _version.py hasn't already been rewritten with a short + version string, meaning we're inside a checked out source tree. + """ + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] + + # GIT_DIR can interfere with correct operation of Versioneer. + # It may be intended to be passed to the Versioneer-versioned project, + # but that should not change where we get our version from. + env = os.environ.copy() + env.pop("GIT_DIR", None) + runner = functools.partial(runner, env=env) + + _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, + hide_stderr=not verbose) + if rc != 0: + if verbose: + print("Directory %%s not under git control" %% root) + raise NotThisMethod("'git rev-parse --git-dir' returned error") + + # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] + # if there isn't one, this yields HEX[-dirty] (no NUM) + describe_out, rc = runner(GITS, [ + "describe", "--tags", "--dirty", "--always", "--long", + "--match", f"{tag_prefix}[[:digit:]]*" + ], cwd=root) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() + full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() + + pieces = {} + pieces["long"] = full_out + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + + branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], + cwd=root) + # --abbrev-ref was added in git-1.6.3 + if rc != 0 or branch_name is None: + raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") + branch_name = branch_name.strip() + + if branch_name == "HEAD": + # If we aren't exactly on a branch, pick a branch which represents + # the current commit. If all else fails, we are on a branchless + # commit. + branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) + # --contains was added in git-1.5.4 + if rc != 0 or branches is None: + raise NotThisMethod("'git branch --contains' returned error") + branches = branches.split("\n") + + # Remove the first line if we're running detached + if "(" in branches[0]: + branches.pop(0) + + # Strip off the leading "* " from the list of branches. + branches = [branch[2:] for branch in branches] + if "master" in branches: + branch_name = "master" + elif not branches: + branch_name = None + else: + # Pick the first branch that is returned. Good or bad. + branch_name = branches[0] + + pieces["branch"] = branch_name + + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out + + # look for -dirty suffix + dirty = git_describe.endswith("-dirty") + pieces["dirty"] = dirty + if dirty: + git_describe = git_describe[:git_describe.rindex("-dirty")] + + # now we have TAG-NUM-gHEX or HEX + + if "-" in git_describe: + # TAG-NUM-gHEX + mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + if not mo: + # unparsable. Maybe git-describe is misbehaving? + pieces["error"] = ("unable to parse git-describe output: '%%s'" + %% describe_out) + return pieces + + # tag + full_tag = mo.group(1) + if not full_tag.startswith(tag_prefix): + if verbose: + fmt = "tag '%%s' doesn't start with prefix '%%s'" + print(fmt %% (full_tag, tag_prefix)) + pieces["error"] = ("tag '%%s' doesn't start with prefix '%%s'" + %% (full_tag, tag_prefix)) + return pieces + pieces["closest-tag"] = full_tag[len(tag_prefix):] + + # distance: number of commits since tag + pieces["distance"] = int(mo.group(2)) + + # commit: short hex revision ID + pieces["short"] = mo.group(3) + + else: + # HEX: no tags + pieces["closest-tag"] = None + out, rc = runner(GITS, ["rev-list", "HEAD", "--left-right"], cwd=root) + pieces["distance"] = len(out.split()) # total number of commits + + # commit date: see ISO-8601 comment in git_versions_from_keywords() + date = runner(GITS, ["show", "-s", "--format=%%ci", "HEAD"], cwd=root)[0].strip() + # Use only the last line. Previous lines may contain GPG signature + # information. + date = date.splitlines()[-1] + pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + + return pieces + + +def plus_or_dot(pieces): + """Return a + if we don't already have one, else return a .""" + if "+" in pieces.get("closest-tag", ""): + return "." + return "+" + + +def render_pep440(pieces): + """Build up version string, with post-release "local version identifier". + + Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you + get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty + + Exceptions: + 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += plus_or_dot(pieces) + rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0+untagged.%%d.g%%s" %% (pieces["distance"], + pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def render_pep440_branch(pieces): + """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . + + The ".dev0" means not master branch. Note that .dev0 sorts backwards + (a feature branch will appear "older" than the master branch). + + Exceptions: + 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0" + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += "+untagged.%%d.g%%s" %% (pieces["distance"], + pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def pep440_split_post(ver): + """Split pep440 version string at the post-release segment. + + Returns the release segments before the post-release and the + post-release version number (or -1 if no post-release segment is present). + """ + vc = str.split(ver, ".post") + return vc[0], int(vc[1] or 0) if len(vc) == 2 else None + + +def render_pep440_pre(pieces): + """TAG[.postN.devDISTANCE] -- No -dirty. + + Exceptions: + 1: no tags. 0.post0.devDISTANCE + """ + if pieces["closest-tag"]: + if pieces["distance"]: + # update the post release segment + tag_version, post_version = pep440_split_post(pieces["closest-tag"]) + rendered = tag_version + if post_version is not None: + rendered += ".post%%d.dev%%d" %% (post_version + 1, pieces["distance"]) + else: + rendered += ".post0.dev%%d" %% (pieces["distance"]) + else: + # no commits, use the tag as the version + rendered = pieces["closest-tag"] + else: + # exception #1 + rendered = "0.post0.dev%%d" %% pieces["distance"] + return rendered + + +def render_pep440_post(pieces): + """TAG[.postDISTANCE[.dev0]+gHEX] . + + The ".dev0" means dirty. Note that .dev0 sorts backwards + (a dirty tree will appear "older" than the corresponding clean one), + but you shouldn't be releasing software with -dirty anyways. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%%d" %% pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%%s" %% pieces["short"] + else: + # exception #1 + rendered = "0.post%%d" %% pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += "+g%%s" %% pieces["short"] + return rendered + + +def render_pep440_post_branch(pieces): + """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . + + The ".dev0" means not master branch. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%%d" %% pieces["distance"] + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%%s" %% pieces["short"] + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0.post%%d" %% pieces["distance"] + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += "+g%%s" %% pieces["short"] + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def render_pep440_old(pieces): + """TAG[.postDISTANCE[.dev0]] . + + The ".dev0" means dirty. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%%d" %% pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + else: + # exception #1 + rendered = "0.post%%d" %% pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + return rendered + + +def render_git_describe(pieces): + """TAG[-DISTANCE-gHEX][-dirty]. + + Like 'git describe --tags --dirty --always'. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render_git_describe_long(pieces): + """TAG-DISTANCE-gHEX[-dirty]. + + Like 'git describe --tags --dirty --always -long'. + The distance/hash is unconditional. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render(pieces, style): + """Render the given version pieces into the requested style.""" + if pieces["error"]: + return {"version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, + "error": pieces["error"], + "date": None} + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) + elif style == "pep440-branch": + rendered = render_pep440_branch(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) + elif style == "pep440-post-branch": + rendered = render_pep440_post_branch(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": + rendered = render_git_describe(pieces) + elif style == "git-describe-long": + rendered = render_git_describe_long(pieces) + else: + raise ValueError("unknown style '%%s'" %% style) + + return {"version": rendered, "full-revisionid": pieces["long"], + "dirty": pieces["dirty"], "error": None, + "date": pieces.get("date")} + + +def get_versions(): + """Get version information or return default if unable to do so.""" + # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have + # __file__, we can work backwards from there to the root. Some + # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which + # case we can only use expanded keywords. + + cfg = get_config() + verbose = cfg.verbose + + try: + return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, + verbose) + except NotThisMethod: + pass + + try: + root = os.path.realpath(__file__) + # versionfile_source is the relative path from the top of the source + # tree (where the .git directory might live) to this file. Invert + # this to find the root from __file__. + for _ in cfg.versionfile_source.split('/'): + root = os.path.dirname(root) + except NameError: + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to find root of source tree", + "date": None} + + try: + pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) + return render(pieces, cfg.style) + except NotThisMethod: + pass + + try: + if cfg.parentdir_prefix: + return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) + except NotThisMethod: + pass + + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to compute version", "date": None} +''' + + +@register_vcs_handler("git", "get_keywords") +def git_get_keywords(versionfile_abs): + """Extract version information from the given file.""" + # the code embedded in _version.py can just fetch the value of these + # keywords. When used from setup.py, we don't want to import _version.py, + # so we do it with a regexp instead. This function is not used from + # _version.py. + keywords = {} + try: + with open(versionfile_abs) as fobj: + for line in fobj: + if line.strip().startswith("git_refnames ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["refnames"] = mo.group(1) + if line.strip().startswith("git_full ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["full"] = mo.group(1) + if line.strip().startswith("git_date ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["date"] = mo.group(1) + except OSError: + pass + return keywords + + +@register_vcs_handler("git", "keywords") +def git_versions_from_keywords(keywords, tag_prefix, verbose): + """Get version information from git keywords.""" + if "refnames" not in keywords: + raise NotThisMethod("Short version file found") + date = keywords.get("date") + if date is not None: + # Use only the last line. Previous lines may contain GPG signature + # information. + date = date.splitlines()[-1] + + # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant + # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 + # -like" string, which we must then edit to make compliant), because + # it's been around since git-1.5.3, and it's too difficult to + # discover which version we're using, or to work around using an + # older one. + date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") + refs = {r.strip() for r in refnames.strip("()").split(",")} + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " + tags = {r[len(TAG) :] for r in refs if r.startswith(TAG)} + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %d + # expansion behaves like git log --decorate=short and strips out the + # refs/heads/ and refs/tags/ prefixes that would let us distinguish + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". + tags = {r for r in refs if re.search(r"\d", r)} + if verbose: + print("discarding '%s', no digits" % ",".join(refs - tags)) + if verbose: + print("likely tags: %s" % ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix) :] + # Filter out refs that exactly match prefix or that don't start + # with a number once the prefix is stripped (mostly a concern + # when prefix is '') + if not re.match(r"\d", r): + continue + if verbose: + print("picking %s" % r) + return { + "version": r, + "full-revisionid": keywords["full"].strip(), + "dirty": False, + "error": None, + "date": date, + } + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return { + "version": "0+unknown", + "full-revisionid": keywords["full"].strip(), + "dirty": False, + "error": "no suitable tags", + "date": None, + } + + +@register_vcs_handler("git", "pieces_from_vcs") +def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command): + """Get version from 'git describe' in the root of the source tree. + + This only gets called if the git-archive 'subst' keywords were *not* + expanded, and _version.py hasn't already been rewritten with a short + version string, meaning we're inside a checked out source tree. + """ + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] + + # GIT_DIR can interfere with correct operation of Versioneer. + # It may be intended to be passed to the Versioneer-versioned project, + # but that should not change where we get our version from. + env = os.environ.copy() + env.pop("GIT_DIR", None) + runner = functools.partial(runner, env=env) + + _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, hide_stderr=not verbose) + if rc != 0: + if verbose: + print("Directory %s not under git control" % root) + raise NotThisMethod("'git rev-parse --git-dir' returned error") + + # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] + # if there isn't one, this yields HEX[-dirty] (no NUM) + describe_out, rc = runner( + GITS, + [ + "describe", + "--tags", + "--dirty", + "--always", + "--long", + "--match", + f"{tag_prefix}[[:digit:]]*", + ], + cwd=root, + ) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() + full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() + + pieces = {} + pieces["long"] = full_out + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + + branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], cwd=root) + # --abbrev-ref was added in git-1.6.3 + if rc != 0 or branch_name is None: + raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") + branch_name = branch_name.strip() + + if branch_name == "HEAD": + # If we aren't exactly on a branch, pick a branch which represents + # the current commit. If all else fails, we are on a branchless + # commit. + branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) + # --contains was added in git-1.5.4 + if rc != 0 or branches is None: + raise NotThisMethod("'git branch --contains' returned error") + branches = branches.split("\n") + + # Remove the first line if we're running detached + if "(" in branches[0]: + branches.pop(0) + + # Strip off the leading "* " from the list of branches. + branches = [branch[2:] for branch in branches] + if "master" in branches: + branch_name = "master" + elif not branches: + branch_name = None + else: + # Pick the first branch that is returned. Good or bad. + branch_name = branches[0] + + pieces["branch"] = branch_name + + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out + + # look for -dirty suffix + dirty = git_describe.endswith("-dirty") + pieces["dirty"] = dirty + if dirty: + git_describe = git_describe[: git_describe.rindex("-dirty")] + + # now we have TAG-NUM-gHEX or HEX + + if "-" in git_describe: + # TAG-NUM-gHEX + mo = re.search(r"^(.+)-(\d+)-g([0-9a-f]+)$", git_describe) + if not mo: + # unparsable. Maybe git-describe is misbehaving? + pieces["error"] = "unable to parse git-describe output: '%s'" % describe_out + return pieces + + # tag + full_tag = mo.group(1) + if not full_tag.startswith(tag_prefix): + if verbose: + fmt = "tag '%s' doesn't start with prefix '%s'" + print(fmt % (full_tag, tag_prefix)) + pieces["error"] = "tag '{}' doesn't start with prefix '{}'".format( + full_tag, + tag_prefix, + ) + return pieces + pieces["closest-tag"] = full_tag[len(tag_prefix) :] + + # distance: number of commits since tag + pieces["distance"] = int(mo.group(2)) + + # commit: short hex revision ID + pieces["short"] = mo.group(3) + + else: + # HEX: no tags + pieces["closest-tag"] = None + out, rc = runner(GITS, ["rev-list", "HEAD", "--left-right"], cwd=root) + pieces["distance"] = len(out.split()) # total number of commits + + # commit date: see ISO-8601 comment in git_versions_from_keywords() + date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip() + # Use only the last line. Previous lines may contain GPG signature + # information. + date = date.splitlines()[-1] + pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + + return pieces + + +def do_vcs_install(versionfile_source, ipy): + """Git-specific installation logic for Versioneer. + + For Git, this means creating/changing .gitattributes to mark _version.py + for export-subst keyword substitution. + """ + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] + files = [versionfile_source] + if ipy: + files.append(ipy) + if "VERSIONEER_PEP518" not in globals(): + try: + my_path = __file__ + if my_path.endswith((".pyc", ".pyo")): + my_path = os.path.splitext(my_path)[0] + ".py" + versioneer_file = os.path.relpath(my_path) + except NameError: + versioneer_file = "versioneer.py" + files.append(versioneer_file) + present = False + try: + with open(".gitattributes") as fobj: + for line in fobj: + if line.strip().startswith(versionfile_source): + if "export-subst" in line.strip().split()[1:]: + present = True + break + except OSError: + pass + if not present: + with open(".gitattributes", "a+") as fobj: + fobj.write(f"{versionfile_source} export-subst\n") + files.append(".gitattributes") + run_command(GITS, ["add", "--"] + files) + + +def versions_from_parentdir(parentdir_prefix, root, verbose): + """Try to determine the version from the parent directory name. + + Source tarballs conventionally unpack into a directory that includes both + the project name and a version string. We will also support searching up + two directory levels for an appropriately named parent directory + """ + rootdirs = [] + + for _ in range(3): + dirname = os.path.basename(root) + if dirname.startswith(parentdir_prefix): + return { + "version": dirname[len(parentdir_prefix) :], + "full-revisionid": None, + "dirty": False, + "error": None, + "date": None, + } + rootdirs.append(root) + root = os.path.dirname(root) # up a level + + if verbose: + print( + "Tried directories %s but none started with prefix %s" + % (str(rootdirs), parentdir_prefix) + ) + raise NotThisMethod("rootdir doesn't start with parentdir_prefix") + + +SHORT_VERSION_PY = """ +# This file was generated by 'versioneer.py' (0.28) from +# revision-control system data, or from the parent directory name of an +# unpacked source archive. Distribution tarballs contain a pre-generated copy +# of this file. + +import json + +version_json = ''' +%s +''' # END VERSION_JSON + + +def get_versions(): + return json.loads(version_json) +""" + + +def versions_from_file(filename): + """Try to determine the version from _version.py if present.""" + try: + with open(filename) as f: + contents = f.read() + except OSError: + raise NotThisMethod("unable to read _version.py") + mo = re.search( + r"version_json = '''\n(.*)''' # END VERSION_JSON", contents, re.M | re.S + ) + if not mo: + mo = re.search( + r"version_json = '''\r\n(.*)''' # END VERSION_JSON", contents, re.M | re.S + ) + if not mo: + raise NotThisMethod("no version_json in _version.py") + return json.loads(mo.group(1)) + + +def write_to_version_file(filename, versions): + """Write the given version number to the given _version.py file.""" + os.unlink(filename) + contents = json.dumps(versions, sort_keys=True, indent=1, separators=(",", ": ")) + with open(filename, "w") as f: + f.write(SHORT_VERSION_PY % contents) + + print("set {} to '{}'".format(filename, versions["version"])) + + +def plus_or_dot(pieces): + """Return a + if we don't already have one, else return a .""" + if "+" in pieces.get("closest-tag", ""): + return "." + return "+" + + +def render_pep440(pieces): + """Build up version string, with post-release "local version identifier". + + Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you + get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty + + Exceptions: + 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += plus_or_dot(pieces) + rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def render_pep440_branch(pieces): + """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . + + The ".dev0" means not master branch. Note that .dev0 sorts backwards + (a feature branch will appear "older" than the master branch). + + Exceptions: + 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0" + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += "+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def pep440_split_post(ver): + """Split pep440 version string at the post-release segment. + + Returns the release segments before the post-release and the + post-release version number (or -1 if no post-release segment is present). + """ + vc = str.split(ver, ".post") + return vc[0], int(vc[1] or 0) if len(vc) == 2 else None + + +def render_pep440_pre(pieces): + """TAG[.postN.devDISTANCE] -- No -dirty. + + Exceptions: + 1: no tags. 0.post0.devDISTANCE + """ + if pieces["closest-tag"]: + if pieces["distance"]: + # update the post release segment + tag_version, post_version = pep440_split_post(pieces["closest-tag"]) + rendered = tag_version + if post_version is not None: + rendered += ".post%d.dev%d" % (post_version + 1, pieces["distance"]) + else: + rendered += ".post0.dev%d" % (pieces["distance"]) + else: + # no commits, use the tag as the version + rendered = pieces["closest-tag"] + else: + # exception #1 + rendered = "0.post0.dev%d" % pieces["distance"] + return rendered + + +def render_pep440_post(pieces): + """TAG[.postDISTANCE[.dev0]+gHEX] . + + The ".dev0" means dirty. Note that .dev0 sorts backwards + (a dirty tree will appear "older" than the corresponding clean one), + but you shouldn't be releasing software with -dirty anyways. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%s" % pieces["short"] + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += "+g%s" % pieces["short"] + return rendered + + +def render_pep440_post_branch(pieces): + """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . + + The ".dev0" means not master branch. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%s" % pieces["short"] + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += "+g%s" % pieces["short"] + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def render_pep440_old(pieces): + """TAG[.postDISTANCE[.dev0]] . + + The ".dev0" means dirty. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + return rendered + + +def render_git_describe(pieces): + """TAG[-DISTANCE-gHEX][-dirty]. + + Like 'git describe --tags --dirty --always'. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render_git_describe_long(pieces): + """TAG-DISTANCE-gHEX[-dirty]. + + Like 'git describe --tags --dirty --always -long'. + The distance/hash is unconditional. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render(pieces, style): + """Render the given version pieces into the requested style.""" + if pieces["error"]: + return { + "version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, + "error": pieces["error"], + "date": None, + } + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) + elif style == "pep440-branch": + rendered = render_pep440_branch(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) + elif style == "pep440-post-branch": + rendered = render_pep440_post_branch(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": + rendered = render_git_describe(pieces) + elif style == "git-describe-long": + rendered = render_git_describe_long(pieces) + else: + raise ValueError("unknown style '%s'" % style) + + return { + "version": rendered, + "full-revisionid": pieces["long"], + "dirty": pieces["dirty"], + "error": None, + "date": pieces.get("date"), + } + + +class VersioneerBadRootError(Exception): + """The project root directory is unknown or missing key files.""" + + +def get_versions(verbose=False): + """Get the project version from whatever source is available. + + Returns dict with two keys: 'version' and 'full'. + """ + if "versioneer" in sys.modules: + # see the discussion in cmdclass.py:get_cmdclass() + del sys.modules["versioneer"] + + root = get_root() + cfg = get_config_from_root(root) + + assert cfg.VCS is not None, "please set [versioneer]VCS= in setup.cfg" + handlers = HANDLERS.get(cfg.VCS) + assert handlers, "unrecognized VCS '%s'" % cfg.VCS + verbose = verbose or cfg.verbose + assert ( + cfg.versionfile_source is not None + ), "please set versioneer.versionfile_source" + assert cfg.tag_prefix is not None, "please set versioneer.tag_prefix" + + versionfile_abs = os.path.join(root, cfg.versionfile_source) + + # extract version from first of: _version.py, VCS command (e.g. 'git + # describe'), parentdir. This is meant to work for developers using a + # source checkout, for users of a tarball created by 'setup.py sdist', + # and for users of a tarball/zipball created by 'git archive' or github's + # download-from-tag feature or the equivalent in other VCSes. + + get_keywords_f = handlers.get("get_keywords") + from_keywords_f = handlers.get("keywords") + if get_keywords_f and from_keywords_f: + try: + keywords = get_keywords_f(versionfile_abs) + ver = from_keywords_f(keywords, cfg.tag_prefix, verbose) + if verbose: + print("got version from expanded keyword %s" % ver) + return ver + except NotThisMethod: + pass + + try: + ver = versions_from_file(versionfile_abs) + if verbose: + print(f"got version from file {versionfile_abs} {ver}") + return ver + except NotThisMethod: + pass + + from_vcs_f = handlers.get("pieces_from_vcs") + if from_vcs_f: + try: + pieces = from_vcs_f(cfg.tag_prefix, root, verbose) + ver = render(pieces, cfg.style) + if verbose: + print("got version from VCS %s" % ver) + return ver + except NotThisMethod: + pass + + try: + if cfg.parentdir_prefix: + ver = versions_from_parentdir(cfg.parentdir_prefix, root, verbose) + if verbose: + print("got version from parentdir %s" % ver) + return ver + except NotThisMethod: + pass + + if verbose: + print("unable to compute version") + + return { + "version": "0+unknown", + "full-revisionid": None, + "dirty": None, + "error": "unable to compute version", + "date": None, + } + + +def get_version(): + """Get the short version string for this project.""" + return get_versions()["version"] + + +def get_cmdclass(cmdclass=None): + """Get the custom setuptools subclasses used by Versioneer. + + If the package uses a different cmdclass (e.g. one from numpy), it + should be provide as an argument. + """ + if "versioneer" in sys.modules: + del sys.modules["versioneer"] + # this fixes the "python setup.py develop" case (also 'install' and + # 'easy_install .'), in which subdependencies of the main project are + # built (using setup.py bdist_egg) in the same python process. Assume + # a main project A and a dependency B, which use different versions + # of Versioneer. A's setup.py imports A's Versioneer, leaving it in + # sys.modules by the time B's setup.py is executed, causing B to run + # with the wrong versioneer. Setuptools wraps the sub-dep builds in a + # sandbox that restores sys.modules to it's pre-build state, so the + # parent is protected against the child's "import versioneer". By + # removing ourselves from sys.modules here, before the child build + # happens, we protect the child from the parent's versioneer too. + # Also see https://github.com/python-versioneer/python-versioneer/issues/52 + + cmds = {} if cmdclass is None else cmdclass.copy() + + # we add "version" to setuptools + from setuptools import Command + + class cmd_version(Command): + description = "report generated version string" + user_options = [] + boolean_options = [] + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + vers = get_versions(verbose=True) + print("Version: %s" % vers["version"]) + print(" full-revisionid: %s" % vers.get("full-revisionid")) + print(" dirty: %s" % vers.get("dirty")) + print(" date: %s" % vers.get("date")) + if vers["error"]: + print(" error: %s" % vers["error"]) + + cmds["version"] = cmd_version + + # we override "build_py" in setuptools + # + # most invocation pathways end up running build_py: + # distutils/build -> build_py + # distutils/install -> distutils/build ->.. + # setuptools/bdist_wheel -> distutils/install ->.. + # setuptools/bdist_egg -> distutils/install_lib -> build_py + # setuptools/install -> bdist_egg ->.. + # setuptools/develop -> ? + # pip install: + # copies source tree to a tempdir before running egg_info/etc + # if .git isn't copied too, 'git describe' will fail + # then does setup.py bdist_wheel, or sometimes setup.py install + # setup.py egg_info -> ? + + # pip install -e . and setuptool/editable_wheel will invoke build_py + # but the build_py command is not expected to copy any files. + + # we override different "build_py" commands for both environments + if "build_py" in cmds: + _build_py = cmds["build_py"] + else: + from setuptools.command.build_py import build_py as _build_py + + class cmd_build_py(_build_py): + def run(self): + root = get_root() + cfg = get_config_from_root(root) + versions = get_versions() + _build_py.run(self) + if getattr(self, "editable_mode", False): + # During editable installs `.py` and data files are + # not copied to build_lib + return + # now locate _version.py in the new build/ directory and replace + # it with an updated value + if cfg.versionfile_build: + target_versionfile = os.path.join(self.build_lib, cfg.versionfile_build) + print("UPDATING %s" % target_versionfile) + write_to_version_file(target_versionfile, versions) + + cmds["build_py"] = cmd_build_py + + if "build_ext" in cmds: + _build_ext = cmds["build_ext"] + else: + from setuptools.command.build_ext import build_ext as _build_ext + + class cmd_build_ext(_build_ext): + def run(self): + root = get_root() + cfg = get_config_from_root(root) + versions = get_versions() + _build_ext.run(self) + if self.inplace: + # build_ext --inplace will only build extensions in + # build/lib<..> dir with no _version.py to write to. + # As in place builds will already have a _version.py + # in the module dir, we do not need to write one. + return + # now locate _version.py in the new build/ directory and replace + # it with an updated value + if not cfg.versionfile_build: + return + target_versionfile = os.path.join(self.build_lib, cfg.versionfile_build) + if not os.path.exists(target_versionfile): + print( + f"Warning: {target_versionfile} does not exist, skipping " + "version update. This can happen if you are running build_ext " + "without first running build_py." + ) + return + print("UPDATING %s" % target_versionfile) + write_to_version_file(target_versionfile, versions) + + cmds["build_ext"] = cmd_build_ext + + if "cx_Freeze" in sys.modules: # cx_freeze enabled? + from cx_Freeze.dist import build_exe as _build_exe + + # nczeczulin reports that py2exe won't like the pep440-style string + # as FILEVERSION, but it can be used for PRODUCTVERSION, e.g. + # setup(console=[{ + # "version": versioneer.get_version().split("+", 1)[0], # FILEVERSION + # "product_version": versioneer.get_version(), + # ... + + class cmd_build_exe(_build_exe): + def run(self): + root = get_root() + cfg = get_config_from_root(root) + versions = get_versions() + target_versionfile = cfg.versionfile_source + print("UPDATING %s" % target_versionfile) + write_to_version_file(target_versionfile, versions) + + _build_exe.run(self) + os.unlink(target_versionfile) + with open(cfg.versionfile_source, "w") as f: + LONG = LONG_VERSION_PY[cfg.VCS] + f.write( + LONG + % { + "DOLLAR": "$", + "STYLE": cfg.style, + "TAG_PREFIX": cfg.tag_prefix, + "PARENTDIR_PREFIX": cfg.parentdir_prefix, + "VERSIONFILE_SOURCE": cfg.versionfile_source, + } + ) + + cmds["build_exe"] = cmd_build_exe + del cmds["build_py"] + + if "py2exe" in sys.modules: # py2exe enabled? + try: + from py2exe.setuptools_buildexe import py2exe as _py2exe + except ImportError: + from py2exe.distutils_buildexe import py2exe as _py2exe + + class cmd_py2exe(_py2exe): + def run(self): + root = get_root() + cfg = get_config_from_root(root) + versions = get_versions() + target_versionfile = cfg.versionfile_source + print("UPDATING %s" % target_versionfile) + write_to_version_file(target_versionfile, versions) + + _py2exe.run(self) + os.unlink(target_versionfile) + with open(cfg.versionfile_source, "w") as f: + LONG = LONG_VERSION_PY[cfg.VCS] + f.write( + LONG + % { + "DOLLAR": "$", + "STYLE": cfg.style, + "TAG_PREFIX": cfg.tag_prefix, + "PARENTDIR_PREFIX": cfg.parentdir_prefix, + "VERSIONFILE_SOURCE": cfg.versionfile_source, + } + ) + + cmds["py2exe"] = cmd_py2exe + + # sdist farms its file list building out to egg_info + if "egg_info" in cmds: + _egg_info = cmds["egg_info"] + else: + from setuptools.command.egg_info import egg_info as _egg_info + + class cmd_egg_info(_egg_info): + def find_sources(self): + # egg_info.find_sources builds the manifest list and writes it + # in one shot + super().find_sources() + + # Modify the filelist and normalize it + root = get_root() + cfg = get_config_from_root(root) + self.filelist.append("versioneer.py") + if cfg.versionfile_source: + # There are rare cases where versionfile_source might not be + # included by default, so we must be explicit + self.filelist.append(cfg.versionfile_source) + self.filelist.sort() + self.filelist.remove_duplicates() + + # The write method is hidden in the manifest_maker instance that + # generated the filelist and was thrown away + # We will instead replicate their final normalization (to unicode, + # and POSIX-style paths) + from setuptools import unicode_utils + + normalized = [ + unicode_utils.filesys_decode(f).replace(os.sep, "/") + for f in self.filelist.files + ] + + manifest_filename = os.path.join(self.egg_info, "SOURCES.txt") + with open(manifest_filename, "w") as fobj: + fobj.write("\n".join(normalized)) + + cmds["egg_info"] = cmd_egg_info + + # we override different "sdist" commands for both environments + if "sdist" in cmds: + _sdist = cmds["sdist"] + else: + from setuptools.command.sdist import sdist as _sdist + + class cmd_sdist(_sdist): + def run(self): + versions = get_versions() + self._versioneer_generated_versions = versions + # unless we update this, the command will keep using the old + # version + self.distribution.metadata.version = versions["version"] + return _sdist.run(self) + + def make_release_tree(self, base_dir, files): + root = get_root() + cfg = get_config_from_root(root) + _sdist.make_release_tree(self, base_dir, files) + # now locate _version.py in the new base_dir directory + # (remembering that it may be a hardlink) and replace it with an + # updated value + target_versionfile = os.path.join(base_dir, cfg.versionfile_source) + print("UPDATING %s" % target_versionfile) + write_to_version_file( + target_versionfile, self._versioneer_generated_versions + ) + + cmds["sdist"] = cmd_sdist + + return cmds + + +CONFIG_ERROR = """ +setup.cfg is missing the necessary Versioneer configuration. You need +a section like: + + [versioneer] + VCS = git + style = pep440 + versionfile_source = src/myproject/_version.py + versionfile_build = myproject/_version.py + tag_prefix = + parentdir_prefix = myproject- + +You will also need to edit your setup.py to use the results: + + import versioneer + setup(version=versioneer.get_version(), + cmdclass=versioneer.get_cmdclass(), ...) + +Please read the docstring in ./versioneer.py for configuration instructions, +edit setup.cfg, and re-run the installer or 'python versioneer.py setup'. +""" + +SAMPLE_CONFIG = """ +# See the docstring in versioneer.py for instructions. Note that you must +# re-run 'versioneer.py setup' after changing this section, and commit the +# resulting files. + +[versioneer] +#VCS = git +#style = pep440 +#versionfile_source = +#versionfile_build = +#tag_prefix = +#parentdir_prefix = + +""" + +OLD_SNIPPET = """ +from ._version import get_versions +__version__ = get_versions()['version'] +del get_versions +""" + +INIT_PY_SNIPPET = """ +from . import {0} +__version__ = {0}.get_versions()['version'] +""" + + +def do_setup(): + """Do main VCS-independent setup function for installing Versioneer.""" + root = get_root() + try: + cfg = get_config_from_root(root) + except (OSError, configparser.NoSectionError, configparser.NoOptionError) as e: + if isinstance(e, (OSError, configparser.NoSectionError)): + print("Adding sample versioneer config to setup.cfg", file=sys.stderr) + with open(os.path.join(root, "setup.cfg"), "a") as f: + f.write(SAMPLE_CONFIG) + print(CONFIG_ERROR, file=sys.stderr) + return 1 + + print(" creating %s" % cfg.versionfile_source) + with open(cfg.versionfile_source, "w") as f: + LONG = LONG_VERSION_PY[cfg.VCS] + f.write( + LONG + % { + "DOLLAR": "$", + "STYLE": cfg.style, + "TAG_PREFIX": cfg.tag_prefix, + "PARENTDIR_PREFIX": cfg.parentdir_prefix, + "VERSIONFILE_SOURCE": cfg.versionfile_source, + } + ) + + ipy = os.path.join(os.path.dirname(cfg.versionfile_source), "__init__.py") + if os.path.exists(ipy): + try: + with open(ipy) as f: + old = f.read() + except OSError: + old = "" + module = os.path.splitext(os.path.basename(cfg.versionfile_source))[0] + snippet = INIT_PY_SNIPPET.format(module) + if OLD_SNIPPET in old: + print(" replacing boilerplate in %s" % ipy) + with open(ipy, "w") as f: + f.write(old.replace(OLD_SNIPPET, snippet)) + elif snippet not in old: + print(" appending to %s" % ipy) + with open(ipy, "a") as f: + f.write(snippet) + else: + print(" %s unmodified" % ipy) + else: + print(" %s doesn't exist, ok" % ipy) + ipy = None + + # Make VCS-specific changes. For git, this means creating/changing + # .gitattributes to mark _version.py for export-subst keyword + # substitution. + do_vcs_install(cfg.versionfile_source, ipy) + return 0 + + +def scan_setup_py(): + """Validate the contents of setup.py against Versioneer's expectations.""" + found = set() + setters = False + errors = 0 + with open("setup.py") as f: + for line in f.readlines(): + if "import versioneer" in line: + found.add("import") + if "versioneer.get_cmdclass()" in line: + found.add("cmdclass") + if "versioneer.get_version()" in line: + found.add("get_version") + if "versioneer.VCS" in line: + setters = True + if "versioneer.versionfile_source" in line: + setters = True + if len(found) != 3: + print("") + print("Your setup.py appears to be missing some important items") + print("(but I might be wrong). Please make sure it has something") + print("roughly like the following:") + print("") + print(" import versioneer") + print(" setup( version=versioneer.get_version(),") + print(" cmdclass=versioneer.get_cmdclass(), ...)") + print("") + errors += 1 + if setters: + print("You should remove lines like 'versioneer.VCS = ' and") + print("'versioneer.versionfile_source = ' . This configuration") + print("now lives in setup.cfg, and should be removed from setup.py") + print("") + errors += 1 + return errors + + +def setup_command(): + """Set up Versioneer and exit with appropriate error code.""" + errors = do_setup() + errors += scan_setup_py() + sys.exit(1 if errors else 0) + + +if __name__ == "__main__": + cmd = sys.argv[1] + if cmd == "setup": + setup_command() From 7945240c6f0f62ab5e644b58da1bb068626b474d Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 12:15:34 +1100 Subject: [PATCH 011/138] Create pyproject.toml --- pyproject.toml | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 pyproject.toml diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..29831aa2 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,97 @@ +[project] +name = "umfile_utils" +authors = [ + { name = "ACCESS-NRI" }, +] +description = "Intake catalog managed by ACCESS-NRI and associated tools" +requires-python = ">=3.10" +license = { text = "Apache-2.0" } +classifiers = [ + "Development Status :: 4 - Beta", + "Programming Language :: Python :: 3", + "License :: OSI Approved :: Apache Software License", + "Operating System :: OS Independent", +] +dependencies = [ + "cftime", + "ecgtools>=2023.7.13", + "intake==0.7.0", + "intake-dataframe-catalog>=0.2.4", + "intake-esm>=2023.11.10", + "jsonschema", + "pooch", + "xarray", + "pytest" +] +dynamic = ["version"] + +[build-system] +build-backend = "setuptools.build_meta" +requires = [ + "setuptools >= 61.0.0", + "versioneer[toml]", +] + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.versioneer] +VCS = "git" +style = "pep440" +versionfile_source = "src/access_nri_intake/_version.py" +versionfile_build = "access_nri_intake/_version.py" +tag_prefix = "v" +parentdir_prefix = "access-nri-intake-" + +[tool.coverage.run] +omit = [ + "*/_version.py", + "*/data/__init__.py", +] + +[tool.ruff] +target-version = "py39" +exclude = [ + ".bzr", + ".direnv", + ".eggs", + ".git", + ".hg", + ".mypy_cache", + ".nox", + ".pants.d", + ".ruff_cache", + ".svn", + ".tox", + ".venv", + "__pypackages__", + "_build", + "buck-out", + "build", + "dist", + "node_modules", + "venv", +] +# E402: module level import not at top of file +# E501: line too long - let black worry about that +ignore = [ + "E402", + "E501", +] +select = [ + # Pyflakes + "F", + # Pycodestyle + "E", + "W", + # isort + "I", + # Pyupgrade + "UP", +] + +[tool.ruff.mccabe] +max-complexity = 18 + +[tool.ruff.isort] +known-first-party = ["umfile_utils"] From 5d8f2458b66a7e9b73b829209a7c11240cb47751 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:19:09 +1100 Subject: [PATCH 012/138] Update perturbIC_test.py Update perturbIC_test.py --- tests/perturbIC_test.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index ed23e4d7..7ec6fbde 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -153,6 +153,4 @@ def test_applying_perturbation(mock_perturbation): testing_a = np.round((a - perturb) / np.ones(shape),0) assert is_perturb == True assert a.shape == (nlat, nlon) - assert testing_a.all() == 1. - - 157,0-1 Bot + assert testing_a.all() == 1.0 From aa1434142def3b6f46ad7420c176a6fb867a793a Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:36:09 +1100 Subject: [PATCH 013/138] Create __init__.py --- src/__init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/__init__.py diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/__init__.py @@ -0,0 +1 @@ + From 6f4297ab292f9449589c6b8664d181e7a99ac55d Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 14:23:49 +1100 Subject: [PATCH 014/138] Update unit_testing_umfile_utils.yml Update unit_testing_umfile_utils.yml --- .github/workflows/ unit_testing_umfile_utils.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ unit_testing_umfile_utils.yml b/.github/workflows/ unit_testing_umfile_utils.yml index a787056c..9d52ea27 100644 --- a/.github/workflows/ unit_testing_umfile_utils.yml +++ b/.github/workflows/ unit_testing_umfile_utils.yml @@ -32,7 +32,7 @@ jobs: - name: Install source shell: bash -l {0} - run: python -m pip install . + run: python -m pip install ./src - name: List installed packages shell: bash -l {0} @@ -40,7 +40,7 @@ jobs: - name: Run tests shell: bash -l {0} - run: coverage run -m --source=umfile_utils pytest + run: coverage run -m --source=src pytest - name: Generate coverage report shell: bash -l {0} From 337922dab6fe5a22c4f23b3777f9635f3682af5d Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 14:33:18 +1100 Subject: [PATCH 015/138] Update pyproject.toml --- pyproject.toml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 29831aa2..288ecd3c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ name = "umfile_utils" authors = [ { name = "ACCESS-NRI" }, ] -description = "Intake catalog managed by ACCESS-NRI and associated tools" +description = "Umfiles tools managed by ACCESS-NRI and associated tools" requires-python = ">=3.10" license = { text = "Apache-2.0" } classifiers = [ @@ -38,15 +38,13 @@ where = ["src"] [tool.versioneer] VCS = "git" style = "pep440" -versionfile_source = "src/access_nri_intake/_version.py" -versionfile_build = "access_nri_intake/_version.py" -tag_prefix = "v" -parentdir_prefix = "access-nri-intake-" +versionfile_source = "src/_version.py" +versionfile_build = "src/_version.py" [tool.coverage.run] omit = [ "*/_version.py", - "*/data/__init__.py", + "*/src/__init__.py", ] [tool.ruff] From b4bd5e49361650dfb00bec843c9acf9af494d00d Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 14:33:39 +1100 Subject: [PATCH 016/138] Update unit_testing_umfile_utils.yml Update unit_testing_umfile_utils.yml Update unit_testing_umfile_utils.yml --- .github/workflows/ unit_testing_umfile_utils.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ unit_testing_umfile_utils.yml b/.github/workflows/ unit_testing_umfile_utils.yml index 9d52ea27..3b30fa02 100644 --- a/.github/workflows/ unit_testing_umfile_utils.yml +++ b/.github/workflows/ unit_testing_umfile_utils.yml @@ -8,7 +8,6 @@ jobs: steps: - uses: actions/checkout@v4.2.1 - uses: actions/setup-python@v5 - - uses: pre-commit/action@v3.0.1 test: runs-on: ubuntu-latest @@ -27,12 +26,12 @@ jobs: miniconda-version: "latest" python-version: ${{ matrix.python-version }} environment-file: ci/environment-${{ matrix.python-version }}.yml - activate-environment: umfile_utils + activate-environment: src auto-activate-base: false - name: Install source shell: bash -l {0} - run: python -m pip install ./src + run: python -m pip install . - name: List installed packages shell: bash -l {0} From 1156c0eb98625b7865e93ba1c3787b82a7329c32 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 14:55:09 +1100 Subject: [PATCH 017/138] Update perturbIC_test.py --- tests/perturbIC_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index 7ec6fbde..13b580b9 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -1,6 +1,6 @@ import pytest import sys -from perturbIC import parse_args, set_seed, create_perturbation, is_end_of_file, if_perturb +from src.perturbIC import parse_args, set_seed, create_perturbation, is_end_of_file, if_perturb from unittest.mock import Mock import numpy as np import numpy.random as rs From 45088b2e8b598111a6045c2b80a2757f936e02a7 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 14:59:00 +1100 Subject: [PATCH 018/138] Update perturbIC.py Update perturbIC.py Update perturbIC.py Update perturbIC.py Update perturbIC.py Update perturbIC.py Update perturbIC.py --- src/perturbIC.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index e5e25933..173efdc1 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -15,11 +15,10 @@ # Martin Dix martin.dix@csiro.au import argparse -import umfile -from um_fileheaders import * +import src.umfile +import src.um_fileheaders from numpy.random import PCG64, Generator - def parse_args(): """ This function parses the arguments from the command line @@ -224,4 +223,4 @@ def main(): if __name__== "__main__": - main 210,1 Bot + main() From 68992a56d7d0c836c10e5d4409db7bba943eb5e9 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:04:46 +1100 Subject: [PATCH 019/138] Update unit_testing_umfile_utils.yml --- .github/workflows/ unit_testing_umfile_utils.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ unit_testing_umfile_utils.yml b/.github/workflows/ unit_testing_umfile_utils.yml index 3b30fa02..20f5aad2 100644 --- a/.github/workflows/ unit_testing_umfile_utils.yml +++ b/.github/workflows/ unit_testing_umfile_utils.yml @@ -17,7 +17,7 @@ jobs: python-version: ["3.10", "3.11"] steps: - - name: Checkout source + - name: Checkout Repository uses: actions/checkout@v4.2.1 - name: Setup conda environment @@ -26,7 +26,6 @@ jobs: miniconda-version: "latest" python-version: ${{ matrix.python-version }} environment-file: ci/environment-${{ matrix.python-version }}.yml - activate-environment: src auto-activate-base: false - name: Install source @@ -39,7 +38,7 @@ jobs: - name: Run tests shell: bash -l {0} - run: coverage run -m --source=src pytest + run: pytest tests/ - name: Generate coverage report shell: bash -l {0} From 6dba3d0c4de1477d33cf380f0e45a7e933848674 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:11:56 +1100 Subject: [PATCH 020/138] Update perturbIC_test.py --- tests/perturbIC_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index 13b580b9..7ec6fbde 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -1,6 +1,6 @@ import pytest import sys -from src.perturbIC import parse_args, set_seed, create_perturbation, is_end_of_file, if_perturb +from perturbIC import parse_args, set_seed, create_perturbation, is_end_of_file, if_perturb from unittest.mock import Mock import numpy as np import numpy.random as rs From 84a55679be570b98ec1e33f05de0c1877330a617 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:18:51 +1100 Subject: [PATCH 021/138] Update unit_testing_umfile_utils.yml --- .github/workflows/ unit_testing_umfile_utils.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ unit_testing_umfile_utils.yml b/.github/workflows/ unit_testing_umfile_utils.yml index 20f5aad2..2bcf7d80 100644 --- a/.github/workflows/ unit_testing_umfile_utils.yml +++ b/.github/workflows/ unit_testing_umfile_utils.yml @@ -27,10 +27,10 @@ jobs: python-version: ${{ matrix.python-version }} environment-file: ci/environment-${{ matrix.python-version }}.yml auto-activate-base: false - + - name: Install source shell: bash -l {0} - run: python -m pip install . + run: pip install -e ./src - name: List installed packages shell: bash -l {0} From dd17e41e8aa002f78eaa1e89a3e63c9922eef358 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:24:21 +1100 Subject: [PATCH 022/138] Update setup.py --- setup.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/setup.py b/setup.py index fcbb31fa..fbefb8e5 100644 --- a/setup.py +++ b/setup.py @@ -1,8 +1,14 @@ -from setuptools import setup - -import versioneer +from setuptools import setup, find_packages setup( - version=versioneer.get_version(), - cmdclass=versioneer.get_cmdclass(), + name="umfile_utils", + version="0.1.0", + packages=find_packages(where="src"), + package_dir={"": "src"}, + install_requires=[ + # Add your dependencies here, e.g., "numpy", "requests", etc. + ], + entry_points={ + # Optional: Add command line scripts or other entry points here. + }, ) From 0c7e62c0edc83feaea3749641762f958bda4ab2b Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:25:12 +1100 Subject: [PATCH 023/138] Update pyproject.toml Update pyproject.toml --- pyproject.toml | 99 ++++---------------------------------------------- 1 file changed, 7 insertions(+), 92 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 288ecd3c..5c00d380 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,95 +1,10 @@ -[project] -name = "umfile_utils" -authors = [ - { name = "ACCESS-NRI" }, -] -description = "Umfiles tools managed by ACCESS-NRI and associated tools" -requires-python = ">=3.10" -license = { text = "Apache-2.0" } -classifiers = [ - "Development Status :: 4 - Beta", - "Programming Language :: Python :: 3", - "License :: OSI Approved :: Apache Software License", - "Operating System :: OS Independent", -] -dependencies = [ - "cftime", - "ecgtools>=2023.7.13", - "intake==0.7.0", - "intake-dataframe-catalog>=0.2.4", - "intake-esm>=2023.11.10", - "jsonschema", - "pooch", - "xarray", - "pytest" -] -dynamic = ["version"] - [build-system] +requires = ["setuptools >= 61.0.0"] build-backend = "setuptools.build_meta" -requires = [ - "setuptools >= 61.0.0", - "versioneer[toml]", -] - -[tool.setuptools.packages.find] -where = ["src"] - -[tool.versioneer] -VCS = "git" -style = "pep440" -versionfile_source = "src/_version.py" -versionfile_build = "src/_version.py" -[tool.coverage.run] -omit = [ - "*/_version.py", - "*/src/__init__.py", -] - -[tool.ruff] -target-version = "py39" -exclude = [ - ".bzr", - ".direnv", - ".eggs", - ".git", - ".hg", - ".mypy_cache", - ".nox", - ".pants.d", - ".ruff_cache", - ".svn", - ".tox", - ".venv", - "__pypackages__", - "_build", - "buck-out", - "build", - "dist", - "node_modules", - "venv", -] -# E402: module level import not at top of file -# E501: line too long - let black worry about that -ignore = [ - "E402", - "E501", -] -select = [ - # Pyflakes - "F", - # Pycodestyle - "E", - "W", - # isort - "I", - # Pyupgrade - "UP", -] - -[tool.ruff.mccabe] -max-complexity = 18 - -[tool.ruff.isort] -known-first-party = ["umfile_utils"] +[project] +name = "umfile_utils" +version = "0.1.0" +description = "Your project description here" +authors = [{name = "Your Name", email = "your.email@example.com"}] +dependencies = [pytest, numpy, unittest, sys] From eee92ec1cc64da63ded5c33748c339f3d9a35b5e Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:28:18 +1100 Subject: [PATCH 024/138] Update unit_testing_umfile_utils.yml --- .github/workflows/ unit_testing_umfile_utils.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ unit_testing_umfile_utils.yml b/.github/workflows/ unit_testing_umfile_utils.yml index 2bcf7d80..f293293d 100644 --- a/.github/workflows/ unit_testing_umfile_utils.yml +++ b/.github/workflows/ unit_testing_umfile_utils.yml @@ -30,7 +30,7 @@ jobs: - name: Install source shell: bash -l {0} - run: pip install -e ./src + run: pip install -e . - name: List installed packages shell: bash -l {0} From 122038392adec9f6b8c006651372621ec8158788 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:33:15 +1100 Subject: [PATCH 025/138] Update pyproject.toml Update pyproject.toml Update pyproject.toml Update pyproject.toml Update pyproject.toml --- pyproject.toml | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5c00d380..b2f60a34 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,26 @@ -[build-system] -requires = ["setuptools >= 61.0.0"] -build-backend = "setuptools.build_meta" - [project] -name = "umfile_utils" +name = "umfile_test" version = "0.1.0" -description = "Your project description here" -authors = [{name = "Your Name", email = "your.email@example.com"}] -dependencies = [pytest, numpy, unittest, sys] +authors = [ + { name = "ACCESS-NRI" }, +] +description = "Intake catalog managed by ACCESS-NRI and associated tools" +readme = "README.rst" +requires-python = ">=3.9" +license = { text = "Apache-2.0" } +classifiers = [ + "Development Status :: 4 - Beta", + "Programming Language :: Python :: 3", + "License :: OSI Approved :: Apache Software License", + "Operating System :: OS Independent", +] +dependencies = [ + "cftime", + "ecgtools>=2023.7.13", + "intake==0.7.0", + "intake-dataframe-catalog>=0.2.4", + "intake-esm>=2023.11.10", + "jsonschema", + "pooch", + "xarray", +] From fb01d13a00aa2efe0fc260cdc192a3d6d50be4b1 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:52:54 +1100 Subject: [PATCH 026/138] Update perturbIC.py --- src/perturbIC.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index 173efdc1..dd89bb48 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -15,8 +15,8 @@ # Martin Dix martin.dix@csiro.au import argparse -import src.umfile -import src.um_fileheaders +import umfile +import um_fileheaders from numpy.random import PCG64, Generator def parse_args(): From 6abc88169b88326b85062de4c41486e705bdf5b1 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Tue, 29 Oct 2024 08:58:15 +1100 Subject: [PATCH 027/138] Update perturbIC_test.py Update the comments on perturb IC test Update perturbIC_test.py Update perturbIC_test.py Made some edits to the variables --- tests/perturbIC_test.py | 45 +++++++++++------------------------------ 1 file changed, 12 insertions(+), 33 deletions(-) diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index 7ec6fbde..cd1b9f1e 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -6,7 +6,6 @@ import numpy.random as rs - @pytest.fixture def mock_command_line(): """ @@ -42,17 +41,13 @@ def mock_metadata(): Outputs list - Command line arguements """ - list_len = 31 - mock_data = Mock() - mock_data.ilookup = [np.ones(list_len)*10, - np.ones(list_len)*11, - np.ones(list_len)*-99] - metadata_index = 1 + + metadata_index_false = 43 + metadata_index_true = -99 end_of_data = -99 - return mock_data, metadata_index, end_of_data + return metadata_index_false, metadata_index_true, end_of_data -#Test the Imports may not be necessary def test_parse_args(monkeypatch, mock_command_line): """ This function tests the parse_args function with the fake commandline arguments @@ -69,16 +64,6 @@ def test_parse_args(monkeypatch, mock_command_line): assert args.seed == 23452 assert args.output == "restart_dump_copy_perturb.astart" -#Test checking the seed -#def test_set_seed(args): -#Not sure if we need test but the conditionals in a function is nice. - - -#Test creating output file -#def test_creating_output_file(): - - -#Test the random generator def test_create_perturbation(monkeypatch, mock_command_line, mock_perturbation): """ This function tests the create_perturbation function with the fake commandline arguments @@ -103,17 +88,14 @@ def test_is_end_of_file_keep_going(mock_metadata): Inputs fixture - A fake list of arrays and a fake index Outputs - The results of assertion tests. + The results of assertion tests. """ - mock_data, metadata_index,end_of_data = mock_metadata - assert is_end_of_file(mock_data, metadata_index, end_of_data) == False - assert is_end_of_file(mock_data, metadata_index+1, end_of_data) == True - + metadata_index_false, metadata_index_true,end_of_data = mock_metadata + assert is_end_of_file(metadata_index_false, end_of_data) == False + assert is_end_of_file(metadata_index_true, end_of_data) == True -#Test that the perturbation has been applied def test_applying_perturbation(mock_perturbation): - """ This function tests the addition of the perturbation to the correct field This function in the perturbIC.py is written to both check the itemcode when @@ -138,19 +120,16 @@ def test_applying_perturbation(mock_perturbation): shape = (nlat, nlon) # Example shape of 3 rows and 4 columns mock_data = Mock() mock_data.readfld.return_value = np.ones(shape) - metadata_index = 0 + metadata_index = 4 surface_temp_item_code = 4 endgame = 388 - - #Create the ilookup method and place a 4 somewhere in it - mock_data.ilookup = np.arange(0,52) - mock_data.ilookup[41] = 4 + k = 0 #Run the fucntion to get the outputs - is_perturb,a = if_perturb(mock_data.ilookup,metadata_index,mock_data,perturb,surface_temp_item_code,endgame) + is_perturb,a = if_perturb(metadata_index,k,mock_data,perturb,surface_temp_item_code,endgame) #Testing if the perturb conditional works and if the resulting array is correct testing_a = np.round((a - perturb) / np.ones(shape),0) assert is_perturb == True assert a.shape == (nlat, nlon) - assert testing_a.all() == 1.0 + assert testing_a.all() == 1. From 929c6748b51bab4ae3620a5fd306e66383f25281 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Tue, 29 Oct 2024 09:25:09 +1100 Subject: [PATCH 028/138] Update perturbIC.py Made changes to the variables --- src/perturbIC.py | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index dd89bb48..76911060 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -115,7 +115,7 @@ def create_perturbation(args, rs, nlon, nlat): perturbation[-1] = 0 return perturbation -def is_end_of_file(f, k, data_limit): +def is_end_of_file(ilookup_table,data_limit): """ This function checks to see if there is data associated with the metadata @@ -134,19 +134,19 @@ def is_end_of_file(f, k, data_limit): boolean - True if the end of the data is reached and False everwhere else """ - ilookup = f.ilookup[k] - if ilookup[LBEGIN] == data_limit: + + if ilookup_table == data_limit: return True else: return False -def if_perturb(ilookup,k,f,perturb,surface_temp_item_code,endgame): +def if_perturb(ilookup_code,k,f,perturb,surface_temp_item_code,endgame): """ This function checks to make sure that the correct field is used (surface temperature) Parameters ---------- - ilookup : + ilookup : FIXME k : int This integer is indexing the metadata in the fields file @@ -168,17 +168,17 @@ def if_perturb(ilookup,k,f,perturb,surface_temp_item_code,endgame): Array - If True the perturbation is added to the data array """ - if ilookup[ITEM_CODE] in (surface_temp_item_code,endgame): + if ilookup_code in (surface_temp_item_code,endgame): a = f.readfld(k) a += perturb - + return True, a else: return False, None - + def main(): """ This function executes all the steps to add the perturbation.The results if saving the perturbation @@ -206,14 +206,12 @@ def main(): for k in range(f.fixhd[FH_LookupSize2]): - #Check to make sure not at the edge of the data - if is_end_of_file(f, k, data_limit): - break - ilookup = f.ilookup[k] - #Find the correct field and add perturbation - is_perturb, a = if_perturb(ilookup,k,f,perturb,surface_temp_item_code,endgame) + if is_end_of_file(ilookup[LBEGIN], data_limit): + break + + is_perturb, a = if_perturb(ilookup[ITEM_CODE],k,f,perturb,surface_temp_item_code,endgame) if is_perturb: f.writefld(a,k) From 94ce5c0827de5b0f1ef135b972247089cb22bc53 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Tue, 29 Oct 2024 11:19:26 +1100 Subject: [PATCH 029/138] Update unit_testing_umfile_utils.yml Adding the coverage --- .github/workflows/ unit_testing_umfile_utils.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ unit_testing_umfile_utils.yml b/.github/workflows/ unit_testing_umfile_utils.yml index f293293d..f4cdbe0b 100644 --- a/.github/workflows/ unit_testing_umfile_utils.yml +++ b/.github/workflows/ unit_testing_umfile_utils.yml @@ -38,7 +38,7 @@ jobs: - name: Run tests shell: bash -l {0} - run: pytest tests/ + run: coverage run -m pytest tests/ - name: Generate coverage report shell: bash -l {0} From c9742abe6f05b8cf2c44772204489159ac1b5f4e Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Thu, 31 Oct 2024 11:39:41 +1100 Subject: [PATCH 030/138] Update perturbIC.py Currently is producing a validation error attached to Issue #7 #8 I have implemented mule here with the intention of adding a pre-step to strip out the time series Update perturbIC.py I have made some adjustments to convert to using mule. Note that this implementation still will not work till Issue #8 is solved --- src/perturbIC.py | 82 +++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 47 deletions(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index 76911060..263b69a2 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -1,13 +1,3 @@ -#!/usr/bin/env python - -# Apply a perturbation to initial condition. -# Note that this works in place. -# For ENDGAME perturb thetavd as well if it's present - -# Martin Dix martin.dix@csiro.au - -#!/usr/bin/env python - # Apply a perturbation to initial condition. # Note that this works in place. # For ENDGAME perturb thetavd as well if it's present @@ -16,8 +6,10 @@ import argparse import umfile -import um_fileheaders +from um_fileheaders import * from numpy.random import PCG64, Generator +import mule + def parse_args(): """ @@ -63,6 +55,7 @@ def set_seed(args): elif args.seed >=0: return Generator(PCG64(args.seed)) + else: raise Exception('Seed must be positive') @@ -103,6 +96,7 @@ def create_perturbation(args, rs, nlon, nlat): nlon: Int - This is the lon Argument 3 description + Returns ---------- pertubation - Array - Returns a perturbation where the poles are set to 0 @@ -140,45 +134,34 @@ def is_end_of_file(ilookup_table,data_limit): else: return False -def if_perturb(ilookup_code,k,f,perturb,surface_temp_item_code,endgame): +def do_perturb(field, surface_stash_code): """ This function checks to make sure that the correct field is used (surface temperature) Parameters ---------- - ilookup : FIXME - k : int - This integer is indexing the metadata in the fields file - - f : umFile Object - Holds the entire umfile including metadata and data - - perturb : Array - Holds the random perturbation and has shape nlon x nlat - surface_temp_item_code : int + field : mule fields Object + Holds the entire umfile including metadata and datai + + surface_stash_code : int This integer represents the item code for surface temperature or theata - endgame : int - This integer represents the FIXME Returns ---------- - boolean - True if this is the correct data to be perturbed. False for all other item codes - Array - If True the perturbation is added to the data array + boolean - True if this is the correct data to be perturbed. False for all other item code """ - if ilookup_code in (surface_temp_item_code,endgame): - - a = f.readfld(k) - a += perturb + + if field.lbuser4 == surface_stash_code: - return True, a + return True else: - return False, None - + return False + def main(): """ This function executes all the steps to add the perturbation.The results if saving the perturbation @@ -187,36 +170,41 @@ def main(): #Define all the variables data_limit = -99 - surface_temp_item_code = 4 - endgame = 388 + surface_temp_stash = 24 #Obtain the arguements from the commandline #Then set the seed if there is one args = parse_args() random_obj = set_seed(args) - f = umfile.UMFile(args.ifile, 'r+') + ff = mule.FieldsFile.from_file(args.ifile) # The definitions of the grid - nlon = f.inthead[IC_XLen] - nlat = f.inthead[IC_YLen] + # Set up theta perturbation. + nlon = ff.integer_constants.num_cols + nlat = ff.integer_constants.num_rows # Same at each level so as not to upset vertical stability - perturb = create_perturbation(args, random_obj, nlon, nlat) + perturbation = create_perturbation(args, random_obj, nlon, nlat) + + for ifield, field in enumerate(ff.fields): + - for k in range(f.fixhd[FH_LookupSize2]): + # Set the surface temperature to 50 is this theta? Or is this something else? + if do_perturb(field, surface_temp_stash): - ilookup = f.ilookup[k] + data = field.get_data() + ff.fields[ifield] = data+perturbation - if is_end_of_file(ilookup[LBEGIN], data_limit): - break + #if is_end_of_file(ilookup[LBEGIN], data_limit): + # break - is_perturb, a = if_perturb(ilookup[ITEM_CODE],k,f,perturb,surface_temp_item_code,endgame) - if is_perturb: + #is_perturb, a = if_perturb(ilookup[ITEM_CODE],k,f,perturb,surface_temp_item_code,endgame) + #if is_perturb: - f.writefld(a,k) + # f.writefld(a,k) - f.close() + ff.to_file(args.ifile) if __name__== "__main__": From 5a8dd69625ee8f8e3922c1df5de43c78cb8b2dde Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:17:12 +1100 Subject: [PATCH 031/138] Update perturbIC_test.py Update unit tests for mule implementation. They are not fully up-to-date --- tests/perturbIC_test.py | 49 +++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index cd1b9f1e..ecb44eac 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -1,6 +1,6 @@ import pytest import sys -from perturbIC import parse_args, set_seed, create_perturbation, is_end_of_file, if_perturb +from perturbIC import parse_args, set_seed, create_perturbation, is_end_of_file,do_perturb from unittest.mock import Mock import numpy as np import numpy.random as rs @@ -42,12 +42,13 @@ def mock_metadata(): list - Command line arguements """ - metadata_index_false = 43 + metadata_index_false = 24 metadata_index_true = -99 end_of_data = -99 return metadata_index_false, metadata_index_true, end_of_data +#Test the Imports may not be necessary def test_parse_args(monkeypatch, mock_command_line): """ This function tests the parse_args function with the fake commandline arguments @@ -63,7 +64,16 @@ def test_parse_args(monkeypatch, mock_command_line): assert args.amplitude == 0.4 assert args.seed == 23452 assert args.output == "restart_dump_copy_perturb.astart" +#Test checking the seed +#def test_set_seed(args): +#Not sure if we need test but the conditionals in a function is nice. + +#Test creating output file +#def test_creating_output_file(): + + +#Test the random generator def test_create_perturbation(monkeypatch, mock_command_line, mock_perturbation): """ This function tests the create_perturbation function with the fake commandline arguments @@ -95,7 +105,10 @@ def test_is_end_of_file_keep_going(mock_metadata): assert is_end_of_file(metadata_index_false, end_of_data) == False assert is_end_of_file(metadata_index_true, end_of_data) == True + +#Test that the perturbation has been applied def test_applying_perturbation(mock_perturbation): + """ This function tests the addition of the perturbation to the correct field This function in the perturbIC.py is written to both check the itemcode when @@ -110,26 +123,24 @@ def test_applying_perturbation(mock_perturbation): #Create random perturbation nlon, nlat = mock_perturbation - perturb = 0.5 * (2.*rs.random(nlon*nlat).reshape((nlat,nlon))-1.) - perturb[0] = 0 - perturb[-1] = 0 + perturbation = 0.5 * (2.*rs.random(nlon*nlat).reshape((nlat,nlon))-1.) + perturbation[0] = 0 + perturbation[-1] = 0 + stash_code = 24 #Create a fake data array to simulate the numpy array that is #To mock the method readfld that reads the field corresponding #To the itemcode - shape = (nlat, nlon) # Example shape of 3 rows and 4 columns - mock_data = Mock() - mock_data.readfld.return_value = np.ones(shape) - metadata_index = 4 - surface_temp_item_code = 4 - endgame = 388 - k = 0 - - #Run the fucntion to get the outputs - is_perturb,a = if_perturb(metadata_index,k,mock_data,perturb,surface_temp_item_code,endgame) + + shape = (nlat, nlon) + field_theta = Mock() + field_not_theta = Mock() + field_theta.lbuser4 = 24 + field_not_theta.lbuser4 = 3 #Testing if the perturb conditional works and if the resulting array is correct - testing_a = np.round((a - perturb) / np.ones(shape),0) - assert is_perturb == True - assert a.shape == (nlat, nlon) - assert testing_a.all() == 1. + #testing_a = np.round((perturbed_array - perturb) / np.ones(shape),0) + assert do_perturb(field_theta, stash_code) == True + assert do_perturb(field_not_theta, stash_code) == False + #assert perturbed_array.shape == (nlat, nlon) + #assert testing_a.all() == 1. From fab59d603b63c6eb5edefc6c203a4a6aff399422 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:33:09 +1100 Subject: [PATCH 032/138] Update environment-3.10.yml Update environment-3.10.yml Update environment-3.10.yml --- ci/environment-3.10.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ci/environment-3.10.yml b/ci/environment-3.10.yml index 90d21c99..b8ee77d2 100644 --- a/ci/environment-3.10.yml +++ b/ci/environment-3.10.yml @@ -3,6 +3,7 @@ channels: - conda-forge - accessnri - defaults + - coecms dependencies: - python==3.10 - cftime @@ -15,6 +16,7 @@ dependencies: - pre-commit - pytest - xarray + - mule - pip - pip: - codecov From 90b2c36965028f14edde1efd4c31fbe37e7f183e Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 4 Nov 2024 20:39:54 +1100 Subject: [PATCH 033/138] Update environment-3.11.yml Found mule in the - coecms channel. Hopefully that fixes the unit test bugs --- ci/environment-3.11.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ci/environment-3.11.yml b/ci/environment-3.11.yml index 311d34f8..648bed5e 100644 --- a/ci/environment-3.11.yml +++ b/ci/environment-3.11.yml @@ -3,6 +3,7 @@ channels: - conda-forge - accessnri - defaults + - coecms dependencies: - python==3.11 - cftime @@ -14,6 +15,7 @@ dependencies: - pooch - pre-commit - pytest + - mule - xarray - pip - pip: From 5b40454e0f29ed4e97afcc2337d6031b32138258 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 6 Nov 2024 09:55:19 +1100 Subject: [PATCH 034/138] Update perturbIC.py Adding the time series removal to perturb IC. No unit testing for this currently Update perturbIC.py Needed to change the unit tests --- src/perturbIC.py | 135 ++++++++++++++++++++++++++++++----------------- 1 file changed, 88 insertions(+), 47 deletions(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index 263b69a2..afcc717b 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -13,7 +13,7 @@ def parse_args(): """ - This function parses the arguments from the command line + This function parses the arguments from the command line. Parameters ---------- @@ -22,7 +22,7 @@ def parse_args(): Returns ---------- args_parsed : ArguementParser object - Contains the arguments from the command line that can be access with their dest + Contains the arguments from the command line that can be access with the dest """ parser = argparse.ArgumentParser(description="Perturb UM initial dump") parser.add_argument('-a', dest='amplitude', type=float, default=0.01, @@ -35,6 +35,45 @@ def parse_args(): args_parsed = parser.parse_args() return args_parsed +def get_rid_of_timeseries(ff): + """ + This function checks to see if there are times series, then gets rid of them so that + mule can run. + + Parameters + ---------- + args : ArgumentParser object + The argument parser object with amplitude, seed from commandline + + Returns + ---------- + ff/ff_out : Returns a mule fields object with no timeseries + """ + ff_out = ff.copy() + num_ts = 0 + + #Perform timeseries removal without rewriting file + for fld in ff.fields: + + # Check for the grid code that denotes a timeseries + if fld.lbcode in (31320, 31323): + num_ts += 1 + + else: + ff_out.fields.append(fld) + + #Either return the fields with the timeseries removed + if num_ts > 0: + print(f'{num_ts} timeseries fields skipped') + return ff_out + + #Or return all the feilds + else: + print('No timeseries fields found') + return ff + + + def set_seed(args): """ This function sets the seed, if any, for the random generator @@ -61,20 +100,18 @@ def set_seed(args): def is_inplace(args): """ - This provides an outline for editing if a new file should be - created + This function allows for editing out-of-place. Parameters ---------- args: ArgumentParser object - The argument parser object with output file name + The argument parser object with output file name. Returns ---------- Boolean - returns False for editing in place and True if a new outfile has been created - subprocess.run(['cp', original_file, new_file]) """ if args.output == None: @@ -86,17 +123,22 @@ def is_inplace(args): def create_perturbation(args, rs, nlon, nlat): """ - This function create a random pertrbation of amplitude args.amplitude + This function create a random pertrbation of amplitude args.amplitude. Parameters ---------- - args : Dictionary - The argumenst from the commandline (amplitude, seed) - rs : Random Object - The random object that has a seed (if defined) - Argument 2 description - nlon: Int - This is the lon - Argument 3 description - - + args : Dictionary + The argumenst from the commandline (amplitude, seed). + + rs : Random Object + The random object that has a seed (if defined). + + nlon: Int + This is the longitude limit for the grid. + + nlat: Int + This is the latitude limit for the grid. + Returns ---------- pertubation - Array - Returns a perturbation where the poles are set to 0 @@ -109,43 +151,43 @@ def create_perturbation(args, rs, nlon, nlat): perturbation[-1] = 0 return perturbation -def is_end_of_file(ilookup_table,data_limit): +def is_end_of_file(field,data_limit): """ - This function checks to see if there is data associated with the metadata + This function checks to see if there is data associated with the metadata. Parameters ---------- f : umFile Object - This is the fields file that holds the restart data + This is the fields file that holds the restart data. k : int - This integer is indexing the metadata in the fields file + This integer is indexing the metadata in the fields file. data_limit : int - This int is a placeholder indicating the end of the data + This int is a placeholder indicating the end of the data. Returns ---------- - boolean - True if the end of the data is reached and False everwhere else + boolean - True if the end of the data is reached and False everwhere else. """ - if ilookup_table == data_limit: + if field.lbuser4 == data_limit: return True else: return False -def do_perturb(field, surface_stash_code): +def do_perturb(field, surface_temp_code): """ - This function checks to make sure that the correct field is used (surface temperature) + This function checks to make sure that the correct field is used (surface temperature). Parameters ---------- field : mule fields Object - Holds the entire umfile including metadata and datai + Holds the entire umfile including metadata and data. surface_stash_code : int - This integer represents the item code for surface temperature or theata + This integer represents the item code for surface temperature or theta. Returns @@ -154,56 +196,55 @@ def do_perturb(field, surface_stash_code): """ - if field.lbuser4 == surface_stash_code: - + if field.lbuser4 == surface_temp_code: return True else: - return False def main(): """ - This function executes all the steps to add the perturbation.The results if saving the perturbation - in the restart file. + This function checks to make sure that the correct field is used (surface temperature). + + Returns + ---------- + UM fields file - The modifed fields file that has the perturbed field. + """ - #Define all the variables + # Define all the variables data_limit = -99 - surface_temp_stash = 24 + surface_temp_code = 24 - #Obtain the arguements from the commandline - #Then set the seed if there is one + # Obtain the arguements from the commandline + # Then set the seed if there is one args = parse_args() random_obj = set_seed(args) - ff = mule.FieldsFile.from_file(args.ifile) + #Check if there is timeseries then remove them to avoid mule errors. + ff_raw = mule.FieldsFile.from_file(args.ifile) # The definitions of the grid # Set up theta perturbation. nlon = ff.integer_constants.num_cols nlat = ff.integer_constants.num_rows - # Same at each level so as not to upset vertical stability + # Remove the time series from the data to ensure mule will work + ff = get_rid_of_timeseries(ff_raw) + + # Same at each level so as not to upset vertical stability. perturbation = create_perturbation(args, random_obj, nlon, nlat) for ifield, field in enumerate(ff.fields): - - # Set the surface temperature to 50 is this theta? Or is this something else? - if do_perturb(field, surface_temp_stash): + if is_end_of_file(field, data_limit): + break + # Find the surface temperature field and add the perturbation. + if do_perturb(field, surface_temp_code): data = field.get_data() ff.fields[ifield] = data+perturbation - #if is_end_of_file(ilookup[LBEGIN], data_limit): - # break - - #is_perturb, a = if_perturb(ilookup[ITEM_CODE],k,f,perturb,surface_temp_item_code,endgame) - #if is_perturb: - - # f.writefld(a,k) - ff.to_file(args.ifile) From a3fbf018701879068d0a729c2ce7efd43d17fbd6 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 6 Nov 2024 10:18:17 +1100 Subject: [PATCH 035/138] Update perturbIC_test.py Correct the unit tests for the update --- tests/perturbIC_test.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index ecb44eac..d960a117 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -41,9 +41,12 @@ def mock_metadata(): Outputs list - Command line arguements """ - - metadata_index_false = 24 - metadata_index_true = -99 + metadata_index_false = Mock() + metadata_index_true = Mock() + + metadata_index_false.lbuser4 = 24 + metadata_index_true.lbuser4 = -99 + end_of_data = -99 return metadata_index_false, metadata_index_true, end_of_data From 52b26c8178b7df45868a2b8410e38360a22c116a Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Tue, 12 Nov 2024 09:05:15 +1100 Subject: [PATCH 036/138] Update perturbIC.py This implements a potential workaround for validation. It passes the validate attribute. --- src/perturbIC.py | 213 +++++++++++++++++++++++++++++------------------ 1 file changed, 131 insertions(+), 82 deletions(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index afcc717b..aab8f044 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python + # Apply a perturbation to initial condition. # Note that this works in place. # For ENDGAME perturb thetavd as well if it's present @@ -5,15 +7,13 @@ # Martin Dix martin.dix@csiro.au import argparse -import umfile -from um_fileheaders import * from numpy.random import PCG64, Generator import mule def parse_args(): """ - This function parses the arguments from the command line. + This function parses the arguments from the command line Parameters ---------- @@ -22,7 +22,7 @@ def parse_args(): Returns ---------- args_parsed : ArguementParser object - Contains the arguments from the command line that can be access with the dest + Contains the arguments from the command line that can be access with their dest """ parser = argparse.ArgumentParser(description="Perturb UM initial dump") parser.add_argument('-a', dest='amplitude', type=float, default=0.01, @@ -32,13 +32,39 @@ def parse_args(): parser.add_argument('-o', dest='output', type=str, default=None, help = 'Output file (if none given modified in place)') parser.add_argument('ifile', help='Input file (modified in place)') + parser.add_argument('-v', dest='validate', + help='For testing with ESM15 set True', default=True) args_parsed = parser.parse_args() return args_parsed +def set_seed(args): + """ + This function sets the seed, if any, for the random generator + + Parameters + ---------- + args : ArgumentParser object + The argument parser object with amplitude, seed from commandline + + Returns + ---------- + Random Object + or + Exception + """ + if args.seed == None: + return Generator(PCG64()) + + elif args.seed >=0: + return Generator(PCG64(args.seed)) + + else: + raise Exception('Seed must be positive') + def get_rid_of_timeseries(ff): """ - This function checks to see if there are times series, then gets rid of them so that - mule can run. + This function checks to see if there are times series, then gets rid of them + so that mule can run. Parameters ---------- @@ -52,7 +78,7 @@ def get_rid_of_timeseries(ff): ff_out = ff.copy() num_ts = 0 - #Perform timeseries removal without rewriting file + # Perform timeseries removal without rewriting file for fld in ff.fields: # Check for the grid code that denotes a timeseries @@ -62,56 +88,33 @@ def get_rid_of_timeseries(ff): else: ff_out.fields.append(fld) - #Either return the fields with the timeseries removed + # Either return the fields with the timeseries removed if num_ts > 0: print(f'{num_ts} timeseries fields skipped') return ff_out - - #Or return all the feilds + + # Or return all the feilds else: print('No timeseries fields found') return ff - - -def set_seed(args): - """ - This function sets the seed, if any, for the random generator - - Parameters - ---------- - args : ArgumentParser object - The argument parser object with amplitude, seed from commandline - - Returns - ---------- - Random Object - or - Exception - """ - if args.seed == None: - return Generator(PCG64()) - - elif args.seed >=0: - return Generator(PCG64(args.seed)) - - else: - raise Exception('Seed must be positive') def is_inplace(args): """ - This function allows for editing out-of-place. + This provides an outline for editing if a new file should be + created Parameters ---------- args: ArgumentParser object - The argument parser object with output file name. + The argument parser object with output file name Returns ---------- Boolean - returns False for editing in place and True if a new outfile has been created + subprocess.run(['cp', original_file, new_file]) """ if args.output == None: @@ -123,22 +126,16 @@ def is_inplace(args): def create_perturbation(args, rs, nlon, nlat): """ - This function create a random pertrbation of amplitude args.amplitude. + This function create a random pertrbation of amplitude args.amplitude Parameters ---------- - args : Dictionary - The argumenst from the commandline (amplitude, seed). - - rs : Random Object - The random object that has a seed (if defined). - - nlon: Int - This is the longitude limit for the grid. - - nlat: Int - This is the latitude limit for the grid. - + args : Dictionary - The argumenst from the commandline (amplitude, seed) + rs : Random Object - The random object that has a seed (if defined) + Argument 2 description + nlon: Int - This is the lon + Argument 3 description + Returns ---------- pertubation - Array - Returns a perturbation where the poles are set to 0 @@ -151,103 +148,155 @@ def create_perturbation(args, rs, nlon, nlat): perturbation[-1] = 0 return perturbation -def is_end_of_file(field,data_limit): +def is_end_of_file(field_data, data_limit): """ - This function checks to see if there is data associated with the metadata. + This function checks to see if there is data associated with the metadata Parameters ---------- f : umFile Object - This is the fields file that holds the restart data. + This is the fields file that holds the restart data k : int - This integer is indexing the metadata in the fields file. + This integer is indexing the metadata in the fields file data_limit : int - This int is a placeholder indicating the end of the data. + This int is a placeholder indicating the end of the data Returns ---------- - boolean - True if the end of the data is reached and False everwhere else. + boolean - True if the end of the data is reached and False everwhere else """ - if field.lbuser4 == data_limit: + if field_data == data_limit: return True else: return False -def do_perturb(field, surface_temp_code): +def do_perturb(field, surface_stash_code): """ - This function checks to make sure that the correct field is used (surface temperature). + This function checks to make sure that the correct field is used (surface temperature) Parameters ---------- field : mule fields Object - Holds the entire umfile including metadata and data. + Holds the entire umfile including metadata and datai surface_stash_code : int - This integer represents the item code for surface temperature or theta. - Returns ---------- boolean - True if this is the correct data to be perturbed. False for all other item code """ - - if field.lbuser4 == surface_temp_code: + if field.lbuser4 == surface_stash_code: return True else: return False -def main(): +class SetPerturbOperator(mule.DataOperator): """ - This function checks to make sure that the correct field is used (surface temperature). + This class creates a mule operator that adds a random perturbation to a field + Parameters + __________ + + perturb : np.array + An array of the random values to be added to the field + Returns - ---------- - UM fields file - The modifed fields file that has the perturbed field. + __________ + field - The field with the perturbation added to it + """ + def __init__(self, perturb): + self.perturbation = perturb + + def new_field(self, source_field): + """Creates the new field object""" + return source_field.copy() + + def transform(self, source_field, new_field): + """Performs the data manipulation""" + data = source_field.get_data() + + # Multiply by 0 to keep the array shape + return data + self.perturbation + + +def void(*args, **kwargs): + print('skipping validation') + pass + + +def set_validation(validate): + """ + This function sets the validation. It is for testing purposes to cirucmvent the river fields flipped grid in ESM15 + + Parameters + __________ + + validate : boolean + This variable is mandatory from the user and is True for testing purposes + + """ + if validate: + mule.DumpFile.validate = void + + else: + print("May encounter an error if using ESM15 with the river field grids set validate to True to circumvent") + +def main(): + """ + This function executes all the steps to add the perturbation.The results if saving the perturbation + in the restart file. """ # Define all the variables data_limit = -99 - surface_temp_code = 24 + surface_temp_stash = 4 # Obtain the arguements from the commandline - # Then set the seed if there is one + # Set the seed if one is given else proced without one. args = parse_args() random_obj = set_seed(args) - #Check if there is timeseries then remove them to avoid mule errors. - ff_raw = mule.FieldsFile.from_file(args.ifile) + # Skips the validation entirely for use on ESM15 due to river fields error + set_validation(args.validate) - # The definitions of the grid + ff_raw = mule.DumpFile.from_file(args.ifile) + + # Get the definitions of the grid from the ff object # Set up theta perturbation. - nlon = ff.integer_constants.num_cols - nlat = ff.integer_constants.num_rows + nlon = ff_raw.integer_constants.num_cols + nlat = ff_raw.integer_constants.num_rows # Remove the time series from the data to ensure mule will work ff = get_rid_of_timeseries(ff_raw) - # Same at each level so as not to upset vertical stability. + # Create a random perturbation array and set it up as a mule operator + # Same at each level so as not to upset vertical stability perturbation = create_perturbation(args, random_obj, nlon, nlat) + setperturbation = SetPerturbOperator(perturbation) + #Loop through the fields to find the surface termperature for ifield, field in enumerate(ff.fields): - if is_end_of_file(field, data_limit): + if is_end_of_file(field.lbuser4, data_limit): break - # Find the surface temperature field and add the perturbation. - if do_perturb(field, surface_temp_code): - data = field.get_data() - ff.fields[ifield] = data+perturbation + # Find the surface temperature field and add the perturbation + if field.lbuser4 == surface_temp_stash: + ff.fields[ifield] = setperturbation(field) - ff.to_file(args.ifile) + #Not currently set up to do out-of-place yet + ff.to_file(args.ifile) if __name__== "__main__": main() + + From 8de5a14e2ea1767be37dcb7713d2a064be6c1652 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Tue, 12 Nov 2024 09:10:51 +1100 Subject: [PATCH 037/138] Update perturbIC_test.py Edit the pytests to improve the commenting Update perturbIC_test.py --- tests/perturbIC_test.py | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index d960a117..46675907 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -41,17 +41,14 @@ def mock_metadata(): Outputs list - Command line arguements """ - metadata_index_false = Mock() - metadata_index_true = Mock() - - metadata_index_false.lbuser4 = 24 - metadata_index_true.lbuser4 = -99 - + + metadata_index_false = 24 + metadata_index_true = -99 + end_of_data = -99 return metadata_index_false, metadata_index_true, end_of_data -#Test the Imports may not be necessary def test_parse_args(monkeypatch, mock_command_line): """ This function tests the parse_args function with the fake commandline arguments @@ -67,16 +64,7 @@ def test_parse_args(monkeypatch, mock_command_line): assert args.amplitude == 0.4 assert args.seed == 23452 assert args.output == "restart_dump_copy_perturb.astart" -#Test checking the seed -#def test_set_seed(args): -#Not sure if we need test but the conditionals in a function is nice. - - -#Test creating output file -#def test_creating_output_file(): - -#Test the random generator def test_create_perturbation(monkeypatch, mock_command_line, mock_perturbation): """ This function tests the create_perturbation function with the fake commandline arguments @@ -109,7 +97,7 @@ def test_is_end_of_file_keep_going(mock_metadata): assert is_end_of_file(metadata_index_true, end_of_data) == True -#Test that the perturbation has been applied + def test_applying_perturbation(mock_perturbation): """ @@ -124,24 +112,25 @@ def test_applying_perturbation(mock_perturbation): The results of assertion tests. """ - #Create random perturbation + # Create random perturbation nlon, nlat = mock_perturbation perturbation = 0.5 * (2.*rs.random(nlon*nlat).reshape((nlat,nlon))-1.) perturbation[0] = 0 perturbation[-1] = 0 - stash_code = 24 + stash_code = 4 - #Create a fake data array to simulate the numpy array that is - #To mock the method readfld that reads the field corresponding - #To the itemcode - + # Create a fake data array to simulate the numpy array that is + # To mock the method readfld that reads the field corresponding to the itemcode + shape = (nlat, nlon) field_theta = Mock() field_not_theta = Mock() - field_theta.lbuser4 = 24 + field_theta.lbuser4 = 4 field_not_theta.lbuser4 = 3 - #Testing if the perturb conditional works and if the resulting array is correct + + # Testing if the perturb conditional works and if the resulting array is correct + #testing_a = np.round((perturbed_array - perturb) / np.ones(shape),0) assert do_perturb(field_theta, stash_code) == True assert do_perturb(field_not_theta, stash_code) == False From d96e80e0430ca5479e19c3a721c9ed64c0a725a2 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Tue, 12 Nov 2024 15:57:31 +1100 Subject: [PATCH 038/138] Update perturbIC.py Makes the out-of-place perturbation of the restart file mandatory adds _perturbed to the file name before the extension Update perturbIC.py Fixed some of the commenting. Update perturbIC.py Fix the output file name to have a better modfied name --- src/perturbIC.py | 52 ++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index aab8f044..16779353 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -1,9 +1,6 @@ #!/usr/bin/env python # Apply a perturbation to initial condition. -# Note that this works in place. -# For ENDGAME perturb thetavd as well if it's present - # Martin Dix martin.dix@csiro.au import argparse @@ -29,8 +26,6 @@ def parse_args(): help = 'Amplitude of perturbation') parser.add_argument('-s', dest='seed', type=int, default=None, help = 'Random number seed (must be non-negative integer)') - parser.add_argument('-o', dest='output', type=str, default=None, - help = 'Output file (if none given modified in place)') parser.add_argument('ifile', help='Input file (modified in place)') parser.add_argument('-v', dest='validate', help='For testing with ESM15 set True', default=True) @@ -99,7 +94,7 @@ def get_rid_of_timeseries(ff): return ff -def is_inplace(args): +def create_outfile(args): """ This provides an outline for editing if a new file should be created @@ -111,18 +106,19 @@ def is_inplace(args): Returns ---------- - Boolean - returns False for editing in place and True if a new - outfile has been created - - subprocess.run(['cp', original_file, new_file]) + output_file - str - This is a string of an output name """ - if args.output == None: - return False + #Seperate the string into the extension and the base + basename, ext = os.path.splitext(args.ifile) + output_filename = basename + '_perturbed' + ext + #Check if that name alreay exists + if os.path.exists(output_filename): + raise FileExistsError(f"The file '{output_filename}' already exists. Cannot save over the file") else: - subprocess.run(['cp', args.ifile, args.output]) - return True + return output_filename + def create_perturbation(args, rs, nlon, nlat): """ @@ -196,7 +192,7 @@ def do_perturb(field, surface_stash_code): else: return False -class SetPerturbOperator(mule.DataOperator): +class SetAdditionOperator(mule.DataOperator): """ This class creates a mule operator that adds a random perturbation to a field @@ -258,42 +254,46 @@ def main(): data_limit = -99 surface_temp_stash = 4 - # Obtain the arguements from the commandline - # Set the seed if one is given else proced without one. + # Obtains the arguements from the commandline args = parse_args() + + # Create the outputfile name and checks the output file does not exists + output_file = create_output_file(args) + + # Set the seed if one is given else proced without one. random_obj = set_seed(args) # Skips the validation entirely for use on ESM15 due to river fields error set_validation(args.validate) - ff_raw = mule.DumpFile.from_file(args.ifile) - + # Get the definitions of the grid from the ff object - # Set up theta perturbation. nlon = ff_raw.integer_constants.num_cols nlat = ff_raw.integer_constants.num_rows # Remove the time series from the data to ensure mule will work ff = get_rid_of_timeseries(ff_raw) - # Create a random perturbation array and set it up as a mule operator - # Same at each level so as not to upset vertical stability + # Creates a random perturbation array perturbation = create_perturbation(args, random_obj, nlon, nlat) - setperturbation = SetPerturbOperator(perturbation) - #Loop through the fields to find the surface termperature + # Sets up the mule opertator to add the perturbation to the data + addperturbation = SetAdditionOperator(perturbation) + + # Loop through the fields to find the surface termperature for ifield, field in enumerate(ff.fields): + # Checks the loop has reached the end of the data if is_end_of_file(field.lbuser4, data_limit): break # Find the surface temperature field and add the perturbation if field.lbuser4 == surface_temp_stash: - ff.fields[ifield] = setperturbation(field) + ff.fields[ifield] = addperturbation(field) #Not currently set up to do out-of-place yet - ff.to_file(args.ifile) + ff.to_file(output_file) if __name__== "__main__": From 7b32f80db0af2a22aaecf6f29ef6075d305f34ea Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 13 Nov 2024 10:59:12 +1100 Subject: [PATCH 039/138] Update perturbIC_test.py Add the unit test for the output file naming Update perturbIC_test.py Fixes the test commenting Update perturbIC_test.py Fixing the commenting spacing --- tests/perturbIC_test.py | 77 +++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 23 deletions(-) diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index 46675907..e3df6361 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -1,6 +1,6 @@ import pytest import sys -from perturbIC import parse_args, set_seed, create_perturbation, is_end_of_file,do_perturb +from perturbIC import parse_args, set_seed, create_outfile, create_perturbation, is_end_of_file,do_perturb from unittest.mock import Mock import numpy as np import numpy.random as rs @@ -9,21 +9,22 @@ @pytest.fixture def mock_command_line(): """ - This function create a callable command line input + This function create a callable command line input. - Outputs + Returns + __________ list - Command line arguements """ return ["perturbIC.py", "-a", "0.4", "-s", "23452", - "-o", "restart_dump_copy_perturb.astart", - "~/access-esm1.5/preindustrial+concentrations/archive/restart000/atmosphere/restart_dump_copy.astart"] + "~/example/path/to/the/file/restart_dump.astart"] @pytest.fixture def mock_perturbation(): """ - This function create a callable perturbation dimensions + This function create a callable perturbation dimensions. - Outputs + Returns + __________ nlon - int nlat - int """ @@ -36,9 +37,10 @@ def mock_perturbation(): @pytest.fixture def mock_metadata(): """ - This function create a callable metadata + This function create a callable metadata. - Outputs + Returns + __________ list - Command line arguements """ @@ -49,13 +51,18 @@ def mock_metadata(): return metadata_index_false, metadata_index_true, end_of_data + def test_parse_args(monkeypatch, mock_command_line): """ - This function tests the parse_args function with the fake commandline arguments - Inputs + This function tests the parse_args function with the fake commandline arguments. + + Parameters + __________ fixture - A class of helpful methods for mock data fixture - A list of command line arguements - Outputs + + Returns + __________ The results of assertion tests. """ @@ -63,7 +70,26 @@ def test_parse_args(monkeypatch, mock_command_line): args = parse_args() assert args.amplitude == 0.4 assert args.seed == 23452 - assert args.output == "restart_dump_copy_perturb.astart" + assert args.ifile == '~/example/path/to/the/file/restart_dump.astart' + +def test_creating_output_file(monkeypatch, mock_command_line): + """ + This function tests the creating the output filename. + + Parameters + __________ + fixture - A list of command line arguements + + Returns + __________ + The results of assertion tests. + """ + + monkeypatch.setattr(sys, "argv", mock_command_line) + args = parse_args() + output_filename = create_outfile(args) + print(output_filename) + assert output_filename == "~/example/path/to/the/file/restart_dump_perturbed.astart" def test_create_perturbation(monkeypatch, mock_command_line, mock_perturbation): """ @@ -85,10 +111,14 @@ def test_create_perturbation(monkeypatch, mock_command_line, mock_perturbation): def test_is_end_of_file_keep_going(mock_metadata): """ - This function tests the detection of the edge of the data - Inputs + This function tests the detection of the edge of the data. + + Parameters + __________ fixture - A fake list of arrays and a fake index - Outputs + + Returns + __________ The results of assertion tests. """ @@ -105,10 +135,12 @@ def test_applying_perturbation(mock_perturbation): This function in the perturbIC.py is written to both check the itemcode when it finds the correct item code to read the field and add the perturbation. - - Inputs + Parameters + __________ fixture - A fake list of arrays and a fake index - Outputs + + Returns + __________ The results of assertion tests. """ @@ -121,18 +153,17 @@ def test_applying_perturbation(mock_perturbation): # Create a fake data array to simulate the numpy array that is # To mock the method readfld that reads the field corresponding to the itemcode - + shape = (nlat, nlon) field_theta = Mock() field_not_theta = Mock() field_theta.lbuser4 = 4 field_not_theta.lbuser4 = 3 - + # Testing if the perturb conditional works and if the resulting array is correct - #testing_a = np.round((perturbed_array - perturb) / np.ones(shape),0) assert do_perturb(field_theta, stash_code) == True assert do_perturb(field_not_theta, stash_code) == False #assert perturbed_array.shape == (nlat, nlon) - #assert testing_a.all() == 1. + #assert testing_a.all() == 1 From 86102689d0e708d0d30ab969df0e4f46b2474752 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 13 Nov 2024 11:17:25 +1100 Subject: [PATCH 040/138] Update perturbIC.py --- src/perturbIC.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/perturbIC.py b/src/perturbIC.py index 16779353..3c8687a5 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -3,6 +3,7 @@ # Apply a perturbation to initial condition. # Martin Dix martin.dix@csiro.au +import os import argparse from numpy.random import PCG64, Generator import mule From c1f422a8beee2daa2643b4b39c72f6752108a105 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 13 Nov 2024 11:24:51 +1100 Subject: [PATCH 041/138] Update perturbIC_test.py Restructure the tests to suit the mule operator structure of perturbIC Update perturbIC_test.py Set up the final unit test to test the addition transformation of the SetAdditionOperator class Update perturbIC_test.py --- tests/perturbIC_test.py | 69 ++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 21 deletions(-) diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index e3df6361..5bfbc720 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -1,7 +1,7 @@ import pytest import sys -from perturbIC import parse_args, set_seed, create_outfile, create_perturbation, is_end_of_file,do_perturb -from unittest.mock import Mock +from perturbIC import parse_args, set_seed, create_outfile, create_perturbation, is_end_of_file,do_perturb, SetAdditionOperator +from unittest.mock import Mock, MagicMock import numpy as np import numpy.random as rs @@ -128,10 +128,8 @@ def test_is_end_of_file_keep_going(mock_metadata): -def test_applying_perturbation(mock_perturbation): - +def test_finding_field(mock_perturbation): """ - This function tests the addition of the perturbation to the correct field This function in the perturbIC.py is written to both check the itemcode when it finds the correct item code to read the field and add the perturbation. @@ -143,27 +141,56 @@ def test_applying_perturbation(mock_perturbation): __________ The results of assertion tests. """ - - # Create random perturbation - nlon, nlat = mock_perturbation - perturbation = 0.5 * (2.*rs.random(nlon*nlat).reshape((nlat,nlon))-1.) - perturbation[0] = 0 - perturbation[-1] = 0 - stash_code = 4 - - # Create a fake data array to simulate the numpy array that is - # To mock the method readfld that reads the field corresponding to the itemcode - - shape = (nlat, nlon) field_theta = Mock() field_not_theta = Mock() + # Set up the real item code and itemcode inputs to test the conditional + stash_code = 4 field_theta.lbuser4 = 4 field_not_theta.lbuser4 = 3 - # Testing if the perturb conditional works and if the resulting array is correct - #testing_a = np.round((perturbed_array - perturb) / np.ones(shape),0) + # Testing if the perturb conditional works correctly and triggers for the right field assert do_perturb(field_theta, stash_code) == True assert do_perturb(field_not_theta, stash_code) == False - #assert perturbed_array.shape == (nlat, nlon) - #assert testing_a.all() == 1 + +def test_operator_initialization(): + """ + This function test that the operator initializes with the correct perturbation. + + Returns + ________ + The results of testing if the peturbation intialize worked + + """ + perturb = np.array([1, 2, 3]) + operator = SetAdditionOperator(perturb) + assert np.array_equal(operator.perturbation, perturb) + +def test_transform(): + """ + This function test the transform method of the SetAdditionOperator class + It creates a fake perturbationm and fake source data array then it sets + up the operator and performs the transformation + + Returns + ________ + + Assertion is True if the resulting array is what is expected + + """ + perturb = np.array([34, 213, 654]) + source_data = np.array([200,234,453]) + + # Mock source_field + source_field = MagicMock() + source_field.get_data.return_value = source_data # Mock get_data + + operator = SetAdditionOperator(perturb) + result = operator.transform(source_field, None) + + source_field.get_data.assert_called_once() # Ensure get_data is called + expected_result = source_data + perturb + + assert np.array_equal(result, expected_result) + + From e87e9b5d10f84bb7239ed327627e099c421bddb5 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 13 Nov 2024 11:49:24 +1100 Subject: [PATCH 042/138] Update perturbIC.py --- src/perturbIC.py | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index 3c8687a5..f18e292e 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -29,7 +29,7 @@ def parse_args(): help = 'Random number seed (must be non-negative integer)') parser.add_argument('ifile', help='Input file (modified in place)') parser.add_argument('-v', dest='validate', - help='For testing with ESM15 set True', default=True) + help='To include validation set -v False', default=True) args_parsed = parser.parse_args() return args_parsed @@ -50,10 +50,8 @@ def set_seed(args): """ if args.seed == None: return Generator(PCG64()) - elif args.seed >=0: return Generator(PCG64(args.seed)) - else: raise Exception('Seed must be positive') @@ -80,7 +78,6 @@ def get_rid_of_timeseries(ff): # Check for the grid code that denotes a timeseries if fld.lbcode in (31320, 31323): num_ts += 1 - else: ff_out.fields.append(fld) @@ -88,7 +85,6 @@ def get_rid_of_timeseries(ff): if num_ts > 0: print(f'{num_ts} timeseries fields skipped') return ff_out - # Or return all the feilds else: print('No timeseries fields found') @@ -136,13 +132,13 @@ def create_perturbation(args, rs, nlon, nlat): Returns ---------- pertubation - Array - Returns a perturbation where the poles are set to 0 - """ perturbation = args.amplitude * (2.*rs.random(nlon*nlat).reshape((nlat,nlon)) - 1.) # Set poles to zero (only necessary for ND grids, but doesn't hurt EG) perturbation[0] = 0 perturbation[-1] = 0 + return perturbation def is_end_of_file(field_data, data_limit): @@ -162,7 +158,6 @@ def is_end_of_file(field_data, data_limit): Returns ---------- boolean - True if the end of the data is reached and False everwhere else - """ if field_data == data_limit: @@ -185,11 +180,9 @@ def do_perturb(field, surface_stash_code): Returns ---------- boolean - True if this is the correct data to be perturbed. False for all other item code - """ if field.lbuser4 == surface_stash_code: return True - else: return False @@ -241,7 +234,6 @@ def set_validation(validate): """ if validate: mule.DumpFile.validate = void - else: print("May encounter an error if using ESM15 with the river field grids set validate to True to circumvent") @@ -265,12 +257,13 @@ def main(): random_obj = set_seed(args) # Skips the validation entirely for use on ESM15 due to river fields error + # Creates the mule field object set_validation(args.validate) ff_raw = mule.DumpFile.from_file(args.ifile) - # Get the definitions of the grid from the ff object - nlon = ff_raw.integer_constants.num_cols - nlat = ff_raw.integer_constants.num_rows + # Set up the definitions of the grid the Dumpfile object doesn't have a way to do this? + nlon = 192 + nlat = 145 # Remove the time series from the data to ensure mule will work ff = get_rid_of_timeseries(ff_raw) @@ -287,13 +280,10 @@ def main(): # Checks the loop has reached the end of the data if is_end_of_file(field.lbuser4, data_limit): break - # Find the surface temperature field and add the perturbation if field.lbuser4 == surface_temp_stash: ff.fields[ifield] = addperturbation(field) - - #Not currently set up to do out-of-place yet ff.to_file(output_file) if __name__== "__main__": From 3c120eda1328155a132a9af82887df0e2a25d68d Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 11:47:22 +1100 Subject: [PATCH 043/138] Apply suggestions from code review Commit the comment suggestions Co-authored-by: Davide Marchegiani Apply suggestions from code review Corrections for the workflow Co-authored-by: Davide Marchegiani Apply suggestions from code review Reviewed changes to the project file Co-authored-by: Davide Marchegiani --- .../workflows/ unit_testing_umfile_utils.yml | 25 ++++++----- ci/environment-3.10.yml | 12 ++---- pyproject.toml | 20 ++++----- src/perturbIC.py | 41 ++++++++----------- 4 files changed, 44 insertions(+), 54 deletions(-) diff --git a/.github/workflows/ unit_testing_umfile_utils.yml b/.github/workflows/ unit_testing_umfile_utils.yml index f4cdbe0b..68ee0cde 100644 --- a/.github/workflows/ unit_testing_umfile_utils.yml +++ b/.github/workflows/ unit_testing_umfile_utils.yml @@ -1,36 +1,39 @@ name: CI -on: [pull_request, push, workflow_dispatch] +on: + push: + branches: main + pull_request: + branches: main + workflow_dispatch: jobs: - pre-commit: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4.2.1 - - uses: actions/setup-python@v5 test: runs-on: ubuntu-latest strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] steps: - name: Checkout Repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 - name: Setup conda environment uses: conda-incubator/setup-miniconda@v3 with: miniconda-version: "latest" python-version: ${{ matrix.python-version }} - environment-file: ci/environment-${{ matrix.python-version }}.yml + environment-file: environment-dev.yml auto-activate-base: false + activate-environment: umfile-utils-dev + auto-update-conda: false + show-channel-urls: true - name: Install source shell: bash -l {0} - run: pip install -e . + run: python -m pip install --no-deps --no-build-isolation -e . - name: List installed packages shell: bash -l {0} @@ -38,7 +41,7 @@ jobs: - name: Run tests shell: bash -l {0} - run: coverage run -m pytest tests/ + run: python -m pytest --cov=src --cov-report=html -s tests - name: Generate coverage report shell: bash -l {0} diff --git a/ci/environment-3.10.yml b/ci/environment-3.10.yml index b8ee77d2..a8b4eeac 100644 --- a/ci/environment-3.10.yml +++ b/ci/environment-3.10.yml @@ -1,11 +1,11 @@ -name: umfile_utils-test +name: umfile-utils-dev channels: - - conda-forge - accessnri - - defaults + - conda-forge - coecms + - nodefaults dependencies: - - python==3.10 + - python >=3.10, <=3.12 - cftime - ecgtools>=2023.7.13 - intake==0.7.0 @@ -18,7 +18,3 @@ dependencies: - xarray - mule - pip - - pip: - - codecov - - pytest-cov - - six diff --git a/pyproject.toml b/pyproject.toml index b2f60a34..e5a6da41 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,19 +1,15 @@ [project] -name = "umfile_test" +name = "umfile-utils" version = "0.1.0" authors = [ - { name = "ACCESS-NRI" }, -] -description = "Intake catalog managed by ACCESS-NRI and associated tools" -readme = "README.rst" -requires-python = ">=3.9" -license = { text = "Apache-2.0" } -classifiers = [ - "Development Status :: 4 - Beta", - "Programming Language :: Python :: 3", - "License :: OSI Approved :: Apache Software License", - "Operating System :: OS Independent", + {name = "Martin Dix", email="martin.dix@anu.edu.au"}, + {name = "Lindsey Oberhelman", email="lindsey.oberhelman@anu.edu.au"}, + {name = "Davide Marchegiani", email="davide.marchegiani@anu.edu.au"}, ] +description = "Collection of tools for UM fieldsfiles." +license = { file = "LICENSE" } + keywords = ["UM", "UM utilities", "UM fields files", "umfile_utils"] + dynamic = ["version"] dependencies = [ "cftime", "ecgtools>=2023.7.13", diff --git a/src/perturbIC.py b/src/perturbIC.py index f18e292e..fa8811bc 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -11,7 +11,7 @@ def parse_args(): """ - This function parses the arguments from the command line + Parse the command line arguments. Parameters ---------- @@ -19,8 +19,8 @@ def parse_args(): Returns ---------- - args_parsed : ArguementParser object - Contains the arguments from the command line that can be access with their dest + args_parsed : argparse.Namespace + Argparse namespace containing the parsed command line arguments. """ parser = argparse.ArgumentParser(description="Perturb UM initial dump") parser.add_argument('-a', dest='amplitude', type=float, default=0.01, @@ -33,37 +33,32 @@ def parse_args(): args_parsed = parser.parse_args() return args_parsed -def set_seed(args): +def create_random_generator(value=None): """ - This function sets the seed, if any, for the random generator + Create the random generator object using the provided value as a seed. Parameters ---------- - args : ArgumentParser object - The argument parser object with amplitude, seed from commandline + value : int + The seed value used to create the random generator. Returns ---------- - Random Object - or - Exception + numpy.random.Generator + The numpy random generator object. """ - if args.seed == None: - return Generator(PCG64()) - elif args.seed >=0: - return Generator(PCG64(args.seed)) - else: - raise Exception('Seed must be positive') + if value < 0: + raise ValueError('Seed value must be non-negative.') + return Generator(PCG64(value)) def get_rid_of_timeseries(ff): """ - This function checks to see if there are times series, then gets rid of them - so that mule can run. + Remove any timeseries from a fields file. Parameters ---------- - args : ArgumentParser object - The argument parser object with amplitude, seed from commandline + ff : mule.dump.DumpFile + The mule DumpFile to remove the timeseries from. Returns ---------- @@ -247,11 +242,11 @@ def main(): data_limit = -99 surface_temp_stash = 4 - # Obtains the arguements from the commandline + # Parse the command line arguments args = parse_args() - # Create the outputfile name and checks the output file does not exists - output_file = create_output_file(args) + # Create the output filename + output_file = create_default_outname(args.ifile) # Set the seed if one is given else proced without one. random_obj = set_seed(args) From 3c926dd95678df57fce5702cd6ff2f5b3307e53e Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:33:18 +1100 Subject: [PATCH 044/138] Create LICENSE Created a license file --- .coverage | Bin 0 -> 53248 bytes src/LICENSE | 201 ++++++++++++++++++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 340 bytes .../__pycache__/_version.cpython-311.pyc | Bin 0 -> 27168 bytes .../__pycache__/perturbIC.cpython-311.pyc | Bin 0 -> 9660 bytes 5 files changed, 201 insertions(+) create mode 100644 .coverage create mode 100644 src/LICENSE create mode 100644 src/umfile_utils/__pycache__/__init__.cpython-311.pyc create mode 100644 src/umfile_utils/__pycache__/_version.cpython-311.pyc create mode 100644 src/umfile_utils/__pycache__/perturbIC.cpython-311.pyc diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..76a6dc1be65aee48abb594b9f2f4b71cef4eab1e GIT binary patch literal 53248 zcmeI4dvH|M8Nko(hTXIGbwI>5#w0g{kVNt@f+TrAEE8QX5Zv*(5h#{K3*{j|{+{*L}Y$O*?`2X1Hp4WI!u@c(U~ ze}xf>l$QGT-kx(}y>2e!#NCW|H0Q3IH)r)cd-a?f7SFRqnO&#Zur)T?bL>odo4wi1 z*j>q9*G{Gq$+(kCrn>E1kE?3uvu=Xl=%5U4b-ZFzu|20~G6Ah}ZZ{lab0*p6WOmq_ z+#LR_{dlwuip3WqA?_(J!74LDg4YuQrFrJ2fZqJF)X3~AlxwPGzOcjTj z$|iHkbjo(OyYYO^ONz_B{{fI3A>`CLQn3^u+%OIcku?t;#x(n{-K zL;lpzxY*}ZzApyKH|F~`^OFND#1rSzBefiBTTv&UOBdrPocw4DJQ&{^ zLqn0uO5gr1#fif8L}STZ)`Re{N#hldFm?F;k>?FxCBr8PUq!vWcDk#$WO!>^oE(_V zL)T2RlHp|dLbKDdBJ}htoo&3c&<8u#n~n{iYsDFpbzyFkvv=SPiWW_QfKl4 zmr=E=&vml-jJl9~)WkH3c`r|Avq`wE^4nH+x+=A6dz>u43T12USUTP7Iw^5)fEMjpc+OQ*t?xzkX?nXB{IX9Q=b8TLw z*qP$Q+U8{Kc*cdDa4)T|4Sd!#;Abn^!XJ5-O!-T>{z_jcGHH^pKQ9-fxXwhga8vJd zRJUd5A2vxov2$>~EQ1R!yxJK$Pq@1wI(R6afnVIj8H@=Fs+N4Mqt){S-^V^C@Piu~ zKm%w14WI!ufCkV28bAYR01co4G;r}52>ATI5YPYp><@&!4-dGZ0W^RH&;S}h184vZ zpaC?12G9T+Km%V-1BO3P&eXqnv@l`6ht){C@*sN7)8d7yqIGG=K)s z02)98XaEhM0W^RH&;S}h17EU#+LCwrg0 z%g(Zw+4JlK`#C$p9%A>fJJ~+AgQc0v*0U9CKAXuVvwBv^#xb4wtdFd}T7R@&w_dWI zv7WMiW*xSEU>&f&ZSA)5)+Wob)>=!fxz;qR*{ZS1tT9%|{I~gc^PKsX`Lg-E`AhSd zdDy(qyvy8YZZkKTQFE0!-<)AKo7HB-)Qy7if$^^KhVhc|E91Cv#CXs+VC*-(X{3#~ zvDR2*%rYh$wMLo2jDY@;{+|AO{bl`G{VDyZ{;+SMnR=O)Vk$74o(g zmwX1=#v~7rH#A4`Yh*y{l>91rO^bT0sH1K+_{Iqtf0HX^TBRsx6XyggmM(6kJ$Gj%e+&{BU8D zwm|YDg{U@P)`^lww3}r4L*%eFPx6C>n0BM&2gpO(Tv zc8A-<{#|4bZ54$(chRYW4($wID|UC2eRPT_jK}C?L9sZ!Mo{7yZINXOdbJ=YMw8DQIddt&r44%LNTgrB@1?c%GICs+mZy5L8`5O9jAU zO+jVl)DTo!Ms-2wOQ|NvsH0&)nn9_cutr0IXqW~Cgp#|6>$lbi@NU2_toy7VTHmw2VXd5kt-U}FSMJ%6Xm>-&F%=gR}%(vlPfFGIPH}5xhn0J`H=1Q~8tS~2;CB{d_UyM_b z`Ty9s%eddzYvhd{W2rF*GX5(J(;)f>`k(dJ^%MGU^vCstzD0jTzZY`;UHV#mp*~Z; zTCavd;f4m#02)98XaEhM0W^RHKA!(0+t`|UZp6~+5&f{JH>3PfxAU}7!021_0FE~S9jd}s3=p9}FIr;`KfF%7kFE~X` zulE8-({J?x$kW$(0VL|TcmZVUYrOzc^)+4qx%$m2;K}-G6%feQS9t-X>nl}IfP8(0 z3J4_Z%e??H_GMlGDf?0{fSi5Fkl^TIFMzClkqUU)zEA}O^7eKwfW&=)3JQ?9&sPC~ z)cqzefZTna7eMlUqY4U;z0Xwvf%N?bFM#}gju#vxch6Qq0W$bmDj<-;U$24!)g>@btul2Bf zqQc|tH3}EBPf&PrLAAo^OU5f~9jH>+Hef59+FI#hTZO`bspSeMp1)FI&BQW=)iqZr zteak{a6oWkJ( x|NP(2J|yg8c)$$}paC?12G9T+Km%w14WI!ufCkV28n}oI1pM&T|HbeB|1V(DN234$ literal 0 HcmV?d00001 diff --git a/src/LICENSE b/src/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/src/LICENSE @@ -0,0 +1,201 @@ + 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 [yyyy] [name of copyright owner] + + 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/src/umfile_utils/__pycache__/__init__.cpython-311.pyc b/src/umfile_utils/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f7559d39627fd93f51a72f4cb379e931ce8fa6c GIT binary patch literal 340 zcmZ3^%ge<81bhEaPY(vtk3k$5V1hC}+W;BU8B!Qh7;_kM8KW2(8JHMS8M9#W49kG> zt6{nrQkW#+>?r0G=3oX*mX{zAO~zXs@nxw+#hLkex7eW!KTVcfJf*p5nK`NPr6rj; z#YN0OrMGy}Q%hiKi*Iqq!`SihD;Yk64EyD+A6g7FOFt#CEHfolKQTEuwYXR}uP9T$ zpeR2pHMyi%AK6&_;-X|!f%y2$yv&mLc)fzkUmP~M`6;D2sdh!&K(iTvxYz(ld|+l| nWW2$kcmWmN;8X6%xWcD=kx%sspX!3lD|`kG+#p!Q3Dg7tohV%0 literal 0 HcmV?d00001 diff --git a/src/umfile_utils/__pycache__/_version.cpython-311.pyc b/src/umfile_utils/__pycache__/_version.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1412c108908b431d21089f1feff023893970689f GIT binary patch literal 27168 zcmch9dvF}bncvL5pIBfQ?*}n>1H_9YNCJF_6bTX_DGHQDT9PTz@Dj5imI8O-*#$wa z7c!*K@sfo*t#$Nq?=0u`9NC7>a*VoM)xlMF75R~ruj-Q8K_=nWR#;(GqCcFfRKby* z(lLKreqYZ%W*5tc?k*WDdU~dNy1(xJzOTRU>#zHVPN$8-_1AxY@5-M~bKHNUhur1P zMn0W0aNIrai=4<^4eV~bXvAGVZ@Ol_Xuf8-Xt`#+ zXuW2;XuD>=XusyT=-}0IoEM#~4Y_)`S)FLSWw_|lag&^Ay2Xj+ALuyl zNBCE-iSK+spUWi1x$Cg49};N)T9zAt*qD z+z!euI(-!)AVuAlS(E5O-E~$@{S)_!RX&@qqVSdIE_wF&>_zF-zIw3+|Fw9(tp_ya z7<`W6FY(k+NH2oALae)Gyx1t#1Ih;cQypsmnv3#T#702hq~m;bVw2ch+`D26YvVSU zW)0$wTZSK?Cw`=MFT#t>*)m#7%4pr*CQ*1IL~Yy3ZpoJ2UR<`Xah7LgJNNff!1}SPgT@`j~^$4xD$EXpHNmm z(mS4zK7jPjC!`M|z3U0-LrCv_Li#Y$d!CTK3+cUO(|6~wr>KuXF?;Y$U)hn;i6cnc zDeBI1efuKqlm4*azqT;%yXFgoyFYizg!s_H&7oft22S;vGWuhIn;FZv zcYfY`dES>XobbJsDKL}AUPQpzIN}$d?m%!4 zTxppTb<5yg%ep8R<)b>$@Vg=LCB=*d=yq9!_;e9Ql+Pe`lXQW08Eb0q-?mC}Wsi zoS)AaL~q#lA=hWfIIj4^)A>{jJ+T}tM!7PU9B3hGnt) zmvV31+3{z68VW8-Gro)&?=A;JzNtQQ#xgxk!#h2lu}x233yO>A`ss{gditx2-uY~b zd3st5&fv8^6qYis>1l5u5LAgFgtvyv!Qi}9fi_At6nH48%LN^XgkDClqWMc34yO!< zA6gwNr&dnAjj^a$IkR%+?KA0049d#6x6h?(8&U@P$%ck>eN)OnKiSZfc2=#txbouL z_+NQZt&VCc8bX?zX&67fj^G{_=5fnj#T*#)#Yeg6e7Xoao6gVdq8?8inkZRa6$v+ zrqWHFE8~ixKHajL?u}_Ty?%j>BO8^X0m*gnrzFJ{Xo@I`u~~h_ITZ|FnDd8T^o8ew zVr2Z}jTs-~n1bZ>hrrbQvw~Lu_9IpBgVhDY!gcSwUt}ahTySPlBFq;;GroXV@&|{e z`V0~=QmK^!fr2&)O7L`m-cdj_8Y2Etz|*wh#Z>O6;u>YlxXzxNnw);+uUF08tUUELb^V^vk}g#;R|h+Tw8gem%QA zC2(+#>Xma0l8KCECV1@{1`)HaSGp1c@h*vskTdo<%$w7pu;`PdjNTWxK9grWsG7!@ zdhgR+2#Z-ChE0Qz#bRtocZPchYSgmH&n=t7)D79|DwW1AQTHbMUfL6;TC&&GJQFNo zt(K_e27fgVTiBBOg5$25bMZ(uP*SI1otCIsWV31%-FYdwY_)RXs$6cMmh}oBOXZ#Y0b@sRHtHG#VY6}x@&R&>OY!UQVam#p4 znHK*W1PI{B!oHPvRJBy&VKD~!TThvjm7ctRm z>X-#XjTY5PZ~E+!Mv~qc3%%mM?h8NyV`SJH>KmHM7?=Ekkv$oEDD0KOiwh)BV~!a^ zTcm>sGA2-Ea1j%?N}Z9)#Q-S+#HFRhfY24{(@jl9b`;*u`XLcys~8Z%k{=VDL_`*; zFJw|b6?#GML8&j|R4Wmd!0J(=Cu8%6`~iRzfM92sCuKt)x*5t?79eww#GkQ+7B54% zCP6!6KY!ua%NM@*(&?#*a~ZR^G%@c5cd2G?C#Ju6{^a>n=U#pF^wf!SuS)IICgV%N z1z#Xzcqm1AS_ecYUts#pCE|h7bI6b}XS)l)`$G#e z*Tf9(la3%IM5IP4M*dQ#4?Fq~Vh$Td=~d)8N16W)tOIh6n{(90=e}={?Olq!D`j9m zdsn)`y)yZ*qif~t1GDW`G`_TH-jOoz_@q`)Y6s-nA*FUGW=~r@DNB=LY5HzNX+0ua zj;K%R?%gp*{E}?xc<5=`;ylJi7R1b3x(e%#2el1}(L`TTlpA--wf#zMe{7N!+r4H^ z-dx`+_l$0F`nnhRjq@MRJQy1LD40I};ugp6I`HGjM_*t2dV25JmYLGkTw5mY$QfSy zCN{Zc;hgT+$PZxFH(AYIa$d>pgn}Tsh$3tg{>XVp$ zwqKPNUglTtM0HZTc3KyWVUk0$S5#lzuJ7<7^eaqThT`{t zgVfFJ1-opKNbnBdXYsb<)dlG$abS@&=WEcii;N<(Qt%pkq3X>76lW-4L3~20?~u(# z+~hpdngwwE%a|QPq?TiDQ0+PMH-*K(f_LUkh`Ff6t0^Ho=Y{DgFf+d>`a;6xV0ey| zM#@Uo*1;-aYN1!is_6o;&A^o*;Z>iooSOL1$P5Ey){3~uk~1jzu48fu z2K-{ih+4uo8RHL167kxI`vRM=a@G6M$jA=i@?sd;8M>LxlBjaYAD%;l$vh!M`iY?M zg&+ofp+FB>M0062Pl@TG&z><#-oO=KMi+z}yxRq2nRf%7tw>06vvZcZj%J9?DEZ&3&{nhD1ojdBXgA$r1 zJekhhRwO?%ex1Jf-v}V=*K(Eal~bQM-SOSGUt4``i!&R$SP+;_Kcy4#a` zWp}UQ?v0tj%DKP=hf@8AZ*@{`Da5Xix)x@XRUhIb;p%3K(kRSEh$UO16S4R(z{>3^Yuhnc6BPQ z&X^%)cxbLb8OGfYEY6tmfy*5qyS==+9K#;~!f#8@yLSBs+O+3c`NKa`eGQC4Nwj0qlRQ& z$tfzggdatDks1H~QLvhdx!C_hSea4s9|f!B{~N4UQmf*S5FqtauKCc~u>H(9raLL-M)xPPt)JX&8+kPuDeo zanu}25AXiTjX%4w!GHL*kG__$Bpc=Wfo)~29hN;~if4?98hu<*qv`&^pN#$4*!r;# z4}Ek9Mb*mnz5j$o{oPgrTDql2>sc4D;5XD6zonq?u3U_S;4-;B`|Nkks%UIb2%l)HPvcA{VZ%T@>Czw9@h7&iZMSWodiJjF*?eAIT* zp#Qge9w9>pX7nwRRLS7NcZP8Vn>qM!k#VA(ZvBs=e zwXV8li5j=1o1&)Be$fp$%BAU~-lFz-L|0N{*vqvWx`{Drion2D3{5%14Ek(OQJK|` zE3-&PD48dpUeA-hhL#ptHb>3n$GKF4k!GT1t>#ghE*i9Y*0Lo`3sl*wU?vo6qL$)W zEX1##KySE~kkj{8zqSou8;ko9M#ZLoP(96}f$G7` z+7j70iFNA7&Z?NB@(b8Q>U>#$evWjV+$S{KLZw*@i0Wkd>%YhKh!-;a1?d{PRq90$ zF=v;pBkj5MU;*j`bTi+L1=!Jj;s9GST7<3aN@S?;I$yb(?iB#gAXBogLsL{Wz9LbU z#6`AfLN=^>+#J;KOSQ|eN+Is7R8W^0 z9$62Ed|{Za7LG&)X&%q^MphHawXv}Hkz<7M!m&wpX-H6)hNNYrea`Or&-f%nMn|mCr0j>)U*ZdE zZ9f_Kvw`)Hyz`K<^AO&~j{V+DyyN!V>Rikp^RJ%G=VjeizN1J;&3046GOuOzSM$n? z2uF@$vZroB;~S~*k92Q{Xnzm|NedKw4S^Of{vl2NuT(}K0<_pQs{Z2M@9+8Gz}gqr zkI5bTm5%**8|U+>Drz*s!aC!XL^3z@bcK3|LSSqFHijaudH2 zwgvypo0J_dNYb5Z4@Lg!pA6AXw_+mg{bO`EvGZ0(~2>k+?8?ZL6ni~Ya_{h4e zKbsnf0$(85F@CJS@Oa3J>yfch>QTRMN^)P;cCziJ3$EC z#V0cSVm+NP!YgKGuFqBwq?mz#u^YycU=3OYF`=7+=T*tO z@$nQZ{XX*lC4Kk@Aa@`kgm8;HQJ*rm;rF1TDb>7Rt{7D+MpKqixTw5)_|D;kNw&8t z_STgXX|p|Lu7lOLvYJ$S*(E40A?apXJuI+z8@Us?9bJvycXe#KI+EjSo;9!R+NHR5 z-FJ;`y2ds<8<#(BlU*ki*NK=R?W#-I6j#T6SKp?qPj>Yyu6{Vim|geHjhp7i!~xmd zrI=yK&>N?CW`O0bW6S`nvAq(=XXT0)m5LWrmKW2E=Ok|Y$y5201zektI73$o9jE{V_s5EMitj6peKtkZ#_i@=ahSB-Se0Ae_p@Q`Em76`{mse%5K<$CuGN@;+RZ1CSgn_ z>H8oo9;u4fWXBJCzt{WY{p+0{9{%XC+&-qXkI5BdvgLqcIgqj(c;Kpui`0)>T!pcn z1u;F=lHWaY=SX6wx>^9$$l4Bnm2ZzHY~MO}_gt#F6F;T0D|QV26VKgsH8ulc|B-xYH&^XC6+RwNa{5~ugsdg{s(|~0Zcqq*nfV#Ph zv|FZOyaRg*=@(ac*t&D6xNF#6Zt>UvtFz&X4*4`C6&9Jx%kssOD6@!{x5yYpQ!#Ue zjaVa(7Z#qQ`l#`v5>MV`y$&|;s6n)d)+;*lw{vhG*?s^xf0T#y4G`_JiDX65o?WKw zU^1I#nNxINi5jzKsVt?HKt*S9>N|Y4?h4T*R*F@kTlB!@&570D)m<@1`HyOfbsh$X z1#nnaTt(&9mX;f}B#A|ByGr`hl5cw*wY_Y8R@7%Lsjq%peb#5H&k7r$Es6zQv4N(| zs1=%BqgEb3N)x5P_HPrLDW*brg%ex82XU(`gm&%7gmh7R3A8)5L2G{|XtBUA)@7IQ z-^%t>t0+9SryM14I7;AX+Xjatsad%x43^kloO9VBc0?Vby&(BthtpluQC@S|u7AP{ z84KUrv_6N}6?LE_z1X#E4>+TakX|$)W+|?V933zkt!%_B%g(4XNz?qcOYAOzx*}SE z?|RsG6;eyoiBWYXHI!K>qV!uWPAogc-l!9B{*Bfx;HoS4wb&PR7SsQ-E9wf_#GR@Z zmBXZ{4Xa(Q^6m>_e+lfB(aQ2p45jODp>A-3T5({xO1ridt%_Dg;mK8wBZ!01N~~@T z(dw2s{9QPJsF=>+s|VHPc&)!1>fzWz76+izIa^wb{Ds=_z5NLVWaf8uSd4! zXH*(E%;=Osk*CwWkEK&LoQ$-sbC<{dVji`vW(H}#wteMl(^ASaQMxDUNx~^<`&A5! zxW7Pw%k<4N@YtkgwX#sYI4X_-=P-{J_KG|<=Yi6k7_WnDynxYthrCVDGqmb9GhFvT z8pZNwXh!m1_VtiE9xXxA;urY`Qe1Tlh69Q(x8zB_m_jfB2_G^xRy?upsXAd&c9fS_ zk$d1=5(@X^)o5YK2eo@A{4;m5wZ($^P2R6LH5P93!km{a0D9-)CM(_)F8knaBl(sj ze>jX7TQ&3wAusoPK!Ol|%}Ar2RyG{k2PVOogcezL(VNSSb!m!TCrp8-sj#LcX}3tV1v$X8t`Hcsr^C z6)_DClD-i!4^qA1n-R<4pm%=Bdox5y^Fi1#ki=A%h~xFw4>HZ{;H67D0Y8BlsVN!w zSuZRpV#aXlD{b z6yqTKga}zw%OAg`TXljybibwnn_?co7{@3cq(4HSRj?n~4wDa+YIz~Zrb{GYjmagS z@dU^&XLIrFPqANee|#dbJFzFR=k6Kx4MJ78HeK_Q7waRFI%Mlu@Ap$Z}U!eaO!)6$tuEYbtiVUJ}O+SSE) z(&?GuN9c*P^gJo!BfjU6eP$jz2H=E_lBMqgVxTHIirmhmi+JqQN3d1o`XF_RiWxwb zdEab!Q1V}y3uC{C0r<2O(G7+OjmR_28-A{9#?LZKODICRLBUN5$fn2i@4i~;IK{^) z_zHrI89uLmDF~mmnc%|Bj2=E>8SCs~0B#$>`B27;{t5fRRY>z^b^>)(?VI$i1r7qL z%YX@97NYNl#?7a z+RbDfxnY?mUqB04HdxH0B2vb#qB`4k0e=QY5ZGPAcGKiOWhfz$DwQn&ou1LpUW0ER z3S}J=qFIWVTIr>lAUtJISNbVF`9Js%Z9t)c>7kK4#YR_76nVL&D;p9AQm(F;;deI9 z?p)pZ?(m&q+18}knxLv1%-@`RXEJs=9+nNwilI4WXnx?VRh&B#*Vjf;&SBX(tT=~P zCLTK6v5ENJM1S&YsfLk_>U77>#MiLkec-x0r_5YrZS{8Ylf*0}y!+ENw2 zn(_>(zb&J_%LMy^qY|2PebsL`1iz&~HdL>ijkj;vI7@ZP+{6kVkt_Bp6?;>by=hPD zeNWe>r%U$qD4rf{AM!NB_a{1&O>46$Vc*8yl;?Tb^St7D{_V3Xr(&03D}h0V6|z^Z z*r!zNOIh~8tn%(#cixg+t%|F4<Z znUv*B+TC*B-LdKJklkI1yKCizhh}$tcGKLPGB@Y@E&1A7G}U?ddt6vG(MNA?S9~HO$n!D_i4p_I^{T>_B7o)^4^hTr`kC&3-zxn-kaEc zw?7467JEzDQT^`OJ7*JBx6iGfi=9Jy^(ffh+G_}8&wjsjTj^yt5`(rOWtZPT#jA6_Gd9|=|7HQ6g`;N9vM_aO2b@p31 znXYZhcBR>&8bQ)^9jVUa$v5tIjcs;~ZPd$M$Ca+*c%{^h#~dijVvo(I%#HYc;&iQk zDOESJ{)X&4t~ig!bZJ)=fz$Y~^-Q{L@Hcv17y>Gf-ahxx(-3=++EjaQ?7gwXv2Pu^ zdkF1u)!lcsZ@Su(2W8ig;u<1{%f_rn<=%Ad(YT(>Ju`{dl95#N9<6KTXAj$VCVP{; zYiH;WgDs3{YDx>eKlZF${IK<-)>PjC{1o9}%oJOOYtQdY+>W-S`-k=4t6yvT)20ua z>nB-htJxS+O@KURLY^OnWsA_b$G7@mp`)edB&j-)2qUTE|)l z*65o3O3nWJHAgmUj%vVNe~Aj&?DdGJ{Vlifh#Ntx-FszUm|qM{2PJH)3rl~E#BY!UK^hUZte9=F z*>|trxteHM)5#V6N=1LlOuw|t9SdQHRcwTHLHXAIFO+c)f{=EZTbe3I=`(J}lhiS1h(GpAjhTOw7WTIBhw2(k%3=DsMJ#ars7wXeKo!AkdzKrbI>nX&?< z3Fw1K`w9g6%M2<~f1o^}y(G*F{_p_h?!mGLWkwzSyI9$3(W>KVeivNmAS-tFL0W=A zv7sRn0H<@}0^1C5buknc0Njv3ODAgGLuJ8cWvQ6@0Wd(7KTTcY&=suPB=F{uNrfU( zr722H|Bz?+`k{{DH0=&1WydFKW$27keLJmgV3dA|B3B8)|1}~IJKUV5B6dx|bi_G~ zZJ1#bgNmn@W`?TxPQ~6r+_x)PyJr5Nl|?bDeAf>5?)rYEz8_3Kb_#Fc{WGz4Q0d&i zVcJ;wD;K6rx&D;wIE6$Q@2{+Woow!1u(>Br$(5aP%V)&6d)B(w8r&q*L^e$ zj=S>^rq^n)aqyOS&+1WpWo=`{%MJl$k!#Kq$nAMFYa6*u1EDouCQl`|3FJ2v$WJt8 zEz3nn{!9e9os=}&b)G_y)+|Bp7i|pUr$Qv!w-N5=u8k3|Bl7n|W1uSE^<9@9OKK`j zTz~S!~cBvt=db9YUs-{i6;^0u3URQKQS_`RQeO5L?df}^luPnq$z!jSccyf zsVoqAmU4ead47(dh!(M5F@Tn2X>nR@s`M*l`#zE6ZxJab$*S@sX)2H;qC{hJkZzM$ zRP0Z=`iaga<;o815&0)0);g6V^eXnI#EngRPs-jyglU!?tsqQGWvaTnJUQ18O!T!m70{0lVI3o38X@bp+n%Ol>WoEB!u0s0kqC%b4B^k4$ zhWHk6$W5{76T1?PY`>Z*@*mFA%C?{~+Wc&$+QifjI9VPrHB{6ks`e~L z;kzy|;@qWugnUgs4kRHlJ7b6Fle05tu!As^cb<}df%N=QB&waHs+c_j9i6q zgFr))OGomRwKGcBsO%YKDs(xi!~l31^RfZ@Z3uXwWXPYU1RNqZ^cV!9Z%f5-V^-9E zHr0Vp(_BEnJZkcRZjsax4FhF}_{17T>*Gpe@`cUYi4MtQa1MEM^D{~GkmMgHUNCw6 znMDd!x~G*CEMd_0t;dKHIKcs&Zy^|9?o~5TN^q`Fz}Gjx$bmLdK|7%3kHvYBl+Vkg zXp-teYaXHCY#4$JRe`-#D)C{**G*a+cxECj>4p+ARFwjAmK3Fb2h@6`&+7*kl>ocM zM}~fS`7*?;vzu>#8q7&E~jy@oGxIr?#k%`h>`?g%}V}qJ=~D? z7YY2GPZLCpNmFv^1D9MsEIWo{rz*@a$8FP@`{)CXL!){#?XJ1ZOQrjCfy4=C-VwFj^}9=gIV` zFu_6QbJxcR*%|rH6RB9Emp_i0>EM_mQT`uFFa26WKsn-(Hi;Bn4X|`ZzHkC zO7+{x>~rYl`5EwEp>wv)fO|hD@ije#_)1A5I|Byl%L!g(O<4Ik6GE0bviLaUe(LP> zbaRo)u%ChFt7uF7Ud7G|iV?Fema&Tw6UwrbK^~lv$c6480?w{MNSje8$JzDP&Kze) z^l=E8HRWhH`!h4`rxaZ6neMD0tH7YZ@t>hXYkn8bbmNf0T+$ zJPZl$5fTjM25OKAC$Fnh{G}|fIt$-xfvuY74S=ez0HkqM{>XU>^gIK1BYS4Hd_m|1 zfAldcW6zbI?5^#;67KfMJlG`;=41hNsWOSKR8Q90hAN&cs%Qml&41OJ>O3vipOzh`vr~CvqUY{W%*|$J?8+@N0UBFiDTtqv zEzOUevGY3rTYzO7KD2Jb2k7H?ry>60G5$x6|1U89#lxQ)ozFe`0`n394v=b1cC*}q z{V;rQ=1BX-syRuZ>QM&&)VT6r2q!+EfK7OpD3+w4JWHuBgD2DEjUv$ohDkz}uOI?s z(b$iTMaY7YJ`IjyQ`$z>U)h-ai|LebQm#HJTTaF-Y_+ob8S#UiqgQl(8+pVq-Rd9! z*@h%-gc3<)*?yJon`AnbMg+u8DI@Kait>^Pti_Zy2okg1okT-u%H@+ZTmU?p5Tq=ksd(S<94r0eKzy zyjW1mU1jnfL0)G*Z{FLpEDXKKTanMJ@yae!uDi%{+EvbL8~b6m6MJPrRHo5P=0GpH zi&e#D9CeiY+>rw>GlMKM&8hpzb9OV;K?J^RI7oyHcara`i}1L?5)wP;bBMWOWz5-q zG14ERzA3iD24`OQX1$B^VW|i2B2Lu+HmKTqu`7q2BRL4$M#P?rLl=v`OPaq#Ih3=J#7^Tf5aziGz{U07oR@>^-dc^Tvkw$;6j7tGi)Z zh9Vg=J~TVxmQ6Eu=hQ#&2-t4!>18Wbm`kh`@!?HtTguw@z=Qo2vS(QF3=^B7lz~m_ zjucLN@^mI&kv#*72l}F#GPr4NO<7wXc)F6avIpy4gV~gnyL;2xow9a6@C>ZsqrHk} zZ|~w7I2_zo`FUN-pj}?8a%; zw?d3VxI#HYEn(voS3FGqiOo(q2en=knzoq&3db>UPG4LPl~EUBvo- zmV@_s*h#vogCJ=a>}VX-b8vtjze0f*0WF++=hY*Prl;ANIn(NCz2BrPvy{a;g;R_e zKV*)3jNPd$v5E4~8ALb^gf@1n6~0EXISPn*mYxQ}&dSch8It}7a(taw=MNd{{9OfS zuem+2IzY$$R;|9dGPz|i;7|}(-;W1A9QtTzqvNlJ(mQv<7piguo@kXLv`jwo*(Y|K zY??dLg2jr?wb(M*jXT)+L-$>+o37UHTVz+C;_Ac67Z%Q4qg3_WuNvH}8eE%^tM({W zd#KPp7Q~J{@YLKLy?6Azqc}84Wx6L~C$L^`?L)2AVBJRI-`ODD)V;BnG5F_*xtsOG z+|_{2ztiUeJwBjgIvmuts?Oy355By9VPjOT8ds{uVek(T}S?UXnfM6wkSo;~atg694qx;_5rr!*GmB*X-Kp zB%b>`+nL8gzRfcvTKm`VRLBTu32m~gzG`+2{6oYVjOD39{yYVJPsG>GfYiPO!f7vCnCQ*v8`%6g!R}V+!BI zDVJ9yntj>XxDqjI$wUFMe91z=hZM9^P)z}ycEHFWW6dv*tA4nHl+r=L5CwGLiPTBK zk12SS0zztOkpf0OKc(1TQ}9a)enr9GQb21oj};|UN+A?4Iqdn7<*<6f`4Q=VA{D65 zh5i&x!T|9+4)NmqQd}>74>`vQ`%81y751lzRHeA=FU{Fj*k77^F7vcHV_Os9PNFr9m^#PXV3Ehw;-` zF-JORyO7Jm;RH-qyc({HBk{SrJ5pRHelpjIQ+QS^vCdd1ej?#X%q3csYC308v7zq< z@sqj1Et7?>PRtO{)ob7uxUJ)CAKXfVX0CBZx*BJ^x1>9Jx157~_ZEi$M{veRR{dLg z#2?x!VxiT(Eh8nGIGa1(vD&g_rY8$m;oh=R%*MHEx9k+d;;uX184o4K<2UXODb_Z% z)C$gIkB!C0SD#DtCP&^Mggb#^?A>zFCsd;*_zK^^Px3f|eoIf0hc@Syks_!Z)tOn; z!kKKbj#wzxd+WI#IzE|OUw{*|*1RnKJLLVPn4Q%Pzn}?O2E%1o~plZArQuQ6D zy-|IAg@U&xbh#>1EkiOttnkC=-ujL$>x7OFkwR>I-qKTqbq;&4b`Fc;2-2EtZkx8B z>@1ZPpcX?_@1pW`Eahc`fyd!>iSx;h#B1+YfWz}HLLb~pgNj-pSZ5-X98cVMe`t%t zBQ7pcU6f*7a*+ zAD~P;ZlFxuN`r%*;@a^@wc}PA3{;^^L-PDuNAk4~(5rY{M>BCN4SFf(1@gsR>;2%% zEOkR)nu&eb+s608zh9p?pRn9Lvc=(X4K2cLy>mUZF}{A|FEA>2EDcWa{rvO1mgCX$ L7Wbr(X&nC-6b0jQ literal 0 HcmV?d00001 diff --git a/src/umfile_utils/__pycache__/perturbIC.cpython-311.pyc b/src/umfile_utils/__pycache__/perturbIC.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8a679316a974f3b0396f49acc332cdafce7cf42 GIT binary patch literal 9660 zcmb_BTWlNGm3PSDo0Mcq*2}MnBtK|Na+)}9>?kf2%aR?(kF_KxR%{R>&QPLEanw6Q zD`KgFO}&WH6;Nf-u7xITRUk;cu(4}&vmg6WAlTiH{TzB(SQtQn7mNMK9}72&AV1x6 z?mWnmCC3Z&a^`Yo?&F+$?s?ze#$sUt<@bNSGxeL@g#0(Y*u`f(Joz0w+#wQ?xGb44 z|G5bc-aT2*tarjY%TMr}`Q10+le`mtiN8%I0@4o2cbl6CN`80?NpUF%Z(*rf3d4Uy zion;Xhl~&@dYecw**6ojL4W2Y7LmU zYQTdVWp|?GOZ<8<;W2!dPmdfwW`suMoJ>Vcp$SjsodO}5ccDr-W8onHH^O}~&Ec9g zsO>W2JWJet&u8#<&-t=Qie!!9WcRlJC9lLwzWaXnin#6j2c)3pw?`8qg{1KP$Y-z@ z_w4?&-81t^zAs>*^kEek1Sc2>+uLN=3=1(8nWXXTux_J{3m;;gL6RAsMyPGPSX zm7Hw$yCQ3On%lAyOsOX45S%2OL;&o$|02w*&WS0R&4efoT1`UEZUWqLnwZIDa#IXd zYnJUW#z_iomt_jLObX){1Q@Ah#H=9YXXg@}5s_pyMKg0+M#&kzOgfX5jqtgPm&eDF zmj}nr!cbA07Bq#y%H-zqnt*-!fvp2T1o4(g4SrhA&J{d;q7f2j=du|sFUeCsX!(bc z|0>-6USaQ`{Y_BPCdwu@BEsxX@CFY!Xa=t>%*jSTlG9>7t5H-8FsEAZ_w}i=EEzo3 zg==H5J@_Qt60><($Rh~>y(v?+%(Lug@HBM9hES3T@hmTpAy9wm_@j0tXuGfp9J@D6<(& zlcipUibXr2u9J{ag%p)x36e0mAc%8wa!x|*x{?-oWU0%&zlecDjgU=^gx?6-jA}Fh zUox3sB14U+C`n0ZW#0^6I;)79;RVtfVaA`>rUJ|O*&8(?_-+Y+ii%4RzIp5DxC%0L zR1$AxB>AYAO3A9)m!p}Zb5xm;Q<{1-Ka0GV%xjsfdQ_z;_Xle|=T7&}Ezl0c8!OyX z^?#u%k*_*QLu)10qkrd3J$AkvJ70;NFAYED!;kp3hkV;=;O=gHU|i?h%KX&|e^uwN z*4p^B*Zz6@i=p*>->Z6wulycKSZ+!wQCn?8Lzzga{)5gHV9nj@J+F1l!dK2D&WR3MUNAkMu%=?^%Bdwy< zY1krh_jJF3j^#xGkYIZ4G-F4`u$G`&!mCh0nZ%v81PC=T>^-uBE$*TU@{8jCT)Nm) z5hqc`9gPb5a2pk3ipiFESa~rAcD>`Za>GESVL%TKY(!dqKEC?ON7sLLy&UPPM7ngo zi|&DuF78778Fx*<19I0I{6Aeb+hK{j4Sj1q&d?@HUF4Du4>OzX5qH}BbVZ(3K#_~N z1wqSz0hMV+21QK40*IiG9ku*iER#-yK}OBpj|Q@T2&!SwInG8}?89`s-H7Uwnn)na zZbIVQc_*Dtg2vtwuHXPh4st`C&wyplfn|0UZ8DK-Kae$=;eOH&)g3YgRK5{Mzh}nT z6s^v4yv6-vQ<3|~v)nvN{+^)5&Q7KjNjBnR=PsNXJ#*#UnbG81Z=Aj~bY>JIvLG?J1Mddl zZs+OSc%2kfa92Swm<0v3<|wo2SfjZ#*11hl{Lz++&z6)@xe+v~DpDxnbrMDhgI}R0GrAzCJ<_wPLWLLK!=!vHg=?{k<2YS`FCg07n%(01FOmp|ebIBDa|g1Ee9=oI zlBdW^9?3i9fxw*qYfsuU0HcdMh>cJD56~oxBOI{-{!A-$HoMR#0bkS1WF8%P%ZG5q zHxOG*K|GTaoDdAeL=x0#aZc{7bEwQtn|%Ru|3S2J`D`|mUP#Uzcwo_)!<~T*q z9Z;Gu8F^0%T7C{BJFLoEeNoC^<*<=aS{EbFsUfnEmQ>T&R=9Rp5etZ z)FxTDYEv&KiIj>9ZY@$<%(lA$O2nI0<{>$dnVN>+JyVdGbNl6=p+L>1GrQjo4`}ym{#B7P^MxSdocNAo8K>pcO(A1uM3@I7jE)VCo)t2hJc}+DBzh=? zbdUm43<8KE1*s)`v=(Rb4&%0OGgROM+wSEsdTS1g0^!&PoHm6RS!}I|>U2_5Y$wMZ zLT$pc9wRpKGZ+k6+W~I%W4h%zDFKRSdr}}%WhWscM2{sr6eAm>N!_#(mtWYNQNdOM zJ?fT9(G~qM+-e*u;1+>IcPziI@9upV>DBpObL*kWDQGgWJn4bz4v`5arzgPOn*b*Z zQpUXGh1$oG(tgPYY~VMV1|MK?wY`&-okYj=97Zf~` zN1%fh-SpOiWY!NkMVnWIX%V6#d{NQSVzN}nGJ~3BPPR!n`q+go&Zu!>?_c+;VUwPQ%d>wek?mZ+h ztRitm-^Y-3D)LZ!f9Z3_C+~AbZ~c65OalCo;0qr)WWOv^bc`5(GmaA=%PIg@HjPjyS7{M@q?q zw#_Ll**r-VQA&xBdA5f_KmuVqlSWl2_!y9HI81{FVeTZZg1!OkWt>mxtpJyBh&nJh=%{_Y5^sX-^0tQGkMgz$t1k}k{h{_3=ycgneW8cqg1z{B3c6yxC`C3jFmOYU%S?WCYr z05>0$I;1THU};E$i&M<-XL43=um-j6py*YIaDh+Nn;D35AvcPfU${DouUnl&2xE!> zA@wBqtSA??sd@#P&(#GBU9}UCE-Pm3XG)qOhe{d~`G)`IJpQ}1RpTusBPDB7QzYE) z;8rm!56So-@rCv9WSLJ@_>^v6Pn%aqKm8r(7dQvz7G39}Zsp7}Ted+ar50C?nw!D> zV#U2TIX~pXoKcG&4NpC+0xjrcvf>^Exf48Gu*!_1-PY>PKkZfs@wSD&$ZMFPvr3WQ z1jPp#&xn>l=1sxEOpsyswev59Y~x-fLu@TV5{u)^^tBtUYbc$vIN} z0h2i}%OJ6n8Hm>5#8?IY4o+IP2$5_rc23dYU>T2N!RcqtUY=SGf^cwb8qQY_3Wqki z+pi195*Sp9c$&*hfO+a@O8u8SAbT;PVK zY3^8U=AHOiI3%YOn*Ig*q=D(du0=_6OX>VqeiCi{aA0|$G*tDI6R%fZJ*&TZ`490! zcU$gvmgC1N@nbq%S0^f0)2w&<(YxCHg>u`8O4|vYZ~33tj^!JVVm%LIJ!@m1PLyLW zR$?!fhGE+9uGQn^P*)|?ReA%ajy5g7j>hKDM(h4^>%mIv!6naf1p0M$uf6o?iE>9@ zrK7J(!oC4keHdHvulP11dsp*oH_MTiDv_6}BorE`dV;Zm^`2vT&#?#N<(}6nJ+G~J zeim9iP;PobZ+hYDjpp4|;*Y^3PUR;Zdw<>Vi-vOhp$cC8Fz>#X9vu7plzw_tAD<}i zd$+Rh-IeG@_sb97Dt8Z7x(D?pVS5+=rW%9UzyA8`Y5-AcCBDE1Z@&NL(hth~t_r_P zw=We%^%TpL(!DWykpBo8W-y zcATQO;2Ww&bvM*iFUN7fE?l@2!rwY+EV17@N$6W$>m*WQzxAEnI*C{LPOhy=oa)sk z4*U#v)zieq@taj0Xyd^5a977Vxb`Y>S1=Xuj8pY=;;^Ty6|K^C=#SX&r&{Yto|E8s txvp+F$N}>>)fJBL(WRM(-ge#F{+JJzhJG}Bd$`1YRUhFy;4`D%{{eH8$n*dJ literal 0 HcmV?d00001 From 73197e84511d7e919c1fd3850458748f172b9160 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:39:19 +1100 Subject: [PATCH 045/138] Create umfile_utils adding a directory --- src/umfile_utils~e4371c9 (Create umfile_utils) | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/umfile_utils~e4371c9 (Create umfile_utils) diff --git a/src/umfile_utils~e4371c9 (Create umfile_utils) b/src/umfile_utils~e4371c9 (Create umfile_utils) new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/umfile_utils~e4371c9 (Create umfile_utils) @@ -0,0 +1 @@ + From a7df0198aced574cb9e3069fff7cca01be4683ac Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:42:57 +1100 Subject: [PATCH 046/138] Create README.md --- src/umfile_utils/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/umfile_utils/README.md diff --git a/src/umfile_utils/README.md b/src/umfile_utils/README.md new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/umfile_utils/README.md @@ -0,0 +1 @@ + From f225d224d739d593ca45760f1aa2fcc88655dbec Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:53:06 +1100 Subject: [PATCH 047/138] Rename src/GLOBE30_patch_aus.py to src/umfile_utils/GLOBE30_patch_aus.py --- src/{ => umfile_utils}/GLOBE30_patch_aus.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/GLOBE30_patch_aus.py (100%) diff --git a/src/GLOBE30_patch_aus.py b/src/umfile_utils/GLOBE30_patch_aus.py similarity index 100% rename from src/GLOBE30_patch_aus.py rename to src/umfile_utils/GLOBE30_patch_aus.py From 485420965939d7e88bdd0195c9c609e48094c7bd Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:53:42 +1100 Subject: [PATCH 048/138] Rename src/LICENSE to LICENSE move --- src/LICENSE => LICENSE | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/LICENSE => LICENSE (100%) diff --git a/src/LICENSE b/LICENSE similarity index 100% rename from src/LICENSE rename to LICENSE From aa6adeb7f4370b88ddb9da18f2cc7255b13aceb1 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:54:03 +1100 Subject: [PATCH 049/138] Rename src/access_landmask.py to src/umfile_utils/access_landmask.py --- src/{ => umfile_utils}/access_landmask.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/access_landmask.py (100%) diff --git a/src/access_landmask.py b/src/umfile_utils/access_landmask.py similarity index 100% rename from src/access_landmask.py rename to src/umfile_utils/access_landmask.py From 4af3234770ed5abdcffd9d44106067a166ec6490 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:54:21 +1100 Subject: [PATCH 050/138] Rename src/add_fields_to_dump.py to src/umfile_utils/add_fields_to_dump.py --- src/{ => umfile_utils}/add_fields_to_dump.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/add_fields_to_dump.py (100%) diff --git a/src/add_fields_to_dump.py b/src/umfile_utils/add_fields_to_dump.py similarity index 100% rename from src/add_fields_to_dump.py rename to src/umfile_utils/add_fields_to_dump.py From 6afa8db23e9047749c67fb3cd753f33f89ad1a0b Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:54:34 +1100 Subject: [PATCH 051/138] Rename src/ancil2netcdf.py to src/umfile_utils/ancil2netcdf.py --- src/{ => umfile_utils}/ancil2netcdf.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/ancil2netcdf.py (100%) diff --git a/src/ancil2netcdf.py b/src/umfile_utils/ancil2netcdf.py similarity index 100% rename from src/ancil2netcdf.py rename to src/umfile_utils/ancil2netcdf.py From 7ec07e858c52c42e26c2ee481682b5ac84bf244a Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:54:50 +1100 Subject: [PATCH 052/138] Rename src/__init__.py to src/umfile_utils/__init__.py --- src/{ => umfile_utils}/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/__init__.py (100%) diff --git a/src/__init__.py b/src/umfile_utils/__init__.py similarity index 100% rename from src/__init__.py rename to src/umfile_utils/__init__.py From 7337ad08bc7a55affb5d3816a36613760a3c0bde Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:55:07 +1100 Subject: [PATCH 053/138] Rename src/change_calendar.py to src/umfile_utils/change_calendar.py --- src/{ => umfile_utils}/change_calendar.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/change_calendar.py (100%) diff --git a/src/change_calendar.py b/src/umfile_utils/change_calendar.py similarity index 100% rename from src/change_calendar.py rename to src/umfile_utils/change_calendar.py From a59747aec9ddc25dc83677574c2baa4e338eeb75 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:55:25 +1100 Subject: [PATCH 054/138] Rename src/change_calendar365.py to src/umfile_utils/change_calendar365.py --- src/{ => umfile_utils}/change_calendar365.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/change_calendar365.py (100%) diff --git a/src/change_calendar365.py b/src/umfile_utils/change_calendar365.py similarity index 100% rename from src/change_calendar365.py rename to src/umfile_utils/change_calendar365.py From e7ffbf1e7c3533146f9dd9838a07e342d0593c36 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:55:39 +1100 Subject: [PATCH 055/138] Rename src/change_calendar_header.py to src/umfile_utils/change_calendar_header.py --- src/{ => umfile_utils}/change_calendar_header.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/change_calendar_header.py (100%) diff --git a/src/change_calendar_header.py b/src/umfile_utils/change_calendar_header.py similarity index 100% rename from src/change_calendar_header.py rename to src/umfile_utils/change_calendar_header.py From f7d015449181f70fc3a87f03ac4ba3b62407e249 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:56:00 +1100 Subject: [PATCH 056/138] Rename src/change_dump_date.py to src/umfile_utils/change_dump_date.py --- src/{ => umfile_utils}/change_dump_date.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/change_dump_date.py (100%) diff --git a/src/change_dump_date.py b/src/umfile_utils/change_dump_date.py similarity index 100% rename from src/change_dump_date.py rename to src/umfile_utils/change_dump_date.py From 91d41e4be99654135cb0908312d3e3c066db2308 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:56:24 +1100 Subject: [PATCH 057/138] Rename src/change_dump_date2.py to src/umfile_utils/change_dump_date2.py --- src/{ => umfile_utils}/change_dump_date2.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/change_dump_date2.py (100%) diff --git a/src/change_dump_date2.py b/src/umfile_utils/change_dump_date2.py similarity index 100% rename from src/change_dump_date2.py rename to src/umfile_utils/change_dump_date2.py From 9cd0f5932fc7df86cd289154b64d11415c283bb6 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:56:45 +1100 Subject: [PATCH 058/138] Rename src/change_endianness.py to src/umfile_utils/change_endianness.py --- src/{ => umfile_utils}/change_endianness.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/change_endianness.py (100%) diff --git a/src/change_endianness.py b/src/umfile_utils/change_endianness.py similarity index 100% rename from src/change_endianness.py rename to src/umfile_utils/change_endianness.py From efc711a22911f68acd2944772380ec2b7433e9d9 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:57:01 +1100 Subject: [PATCH 059/138] Rename src/um_timeseries.py to src/umfile_utils/um_timeseries.py --- src/{ => umfile_utils}/um_timeseries.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um_timeseries.py (100%) diff --git a/src/um_timeseries.py b/src/umfile_utils/um_timeseries.py similarity index 100% rename from src/um_timeseries.py rename to src/umfile_utils/um_timeseries.py From f4c1c1d0424d766fc8e907347c85cbce685b31b4 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:57:23 +1100 Subject: [PATCH 060/138] Rename src/um_fields_subset.py to src/umfile_utils/um_fields_subset.py --- src/{ => umfile_utils}/um_fields_subset.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um_fields_subset.py (100%) diff --git a/src/um_fields_subset.py b/src/umfile_utils/um_fields_subset.py similarity index 100% rename from src/um_fields_subset.py rename to src/umfile_utils/um_fields_subset.py From b87e15c82e4ea04914350a957e521a0d48990cff Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:57:40 +1100 Subject: [PATCH 061/138] Rename src/um_complexity.py to src/umfile_utils/um_complexity.py --- src/{ => umfile_utils}/um_complexity.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um_complexity.py (100%) diff --git a/src/um_complexity.py b/src/umfile_utils/um_complexity.py similarity index 100% rename from src/um_complexity.py rename to src/umfile_utils/um_complexity.py From c256e3dbac6beb3f75b9ef99acd1b26b313c1e12 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:58:07 +1100 Subject: [PATCH 062/138] Rename src/change_stashcode.py to src/umfile_utils/change_stashcode.py --- src/{ => umfile_utils}/change_stashcode.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/change_stashcode.py (100%) diff --git a/src/change_stashcode.py b/src/umfile_utils/change_stashcode.py similarity index 100% rename from src/change_stashcode.py rename to src/umfile_utils/change_stashcode.py From fb3cdf75348d35b53d096556d296585933f30275 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:58:22 +1100 Subject: [PATCH 063/138] Rename src/check_land_overlap.py to src/umfile_utils/check_land_overlap.py --- src/{ => umfile_utils}/check_land_overlap.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/check_land_overlap.py (100%) diff --git a/src/check_land_overlap.py b/src/umfile_utils/check_land_overlap.py similarity index 100% rename from src/check_land_overlap.py rename to src/umfile_utils/check_land_overlap.py From d179964325ba85ed8a16111699dc747d3045ae48 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:58:37 +1100 Subject: [PATCH 064/138] Rename src/check_land_overlap_idx.py to src/umfile_utils/check_land_overlap_idx.py --- src/{ => umfile_utils}/check_land_overlap_idx.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/check_land_overlap_idx.py (100%) diff --git a/src/check_land_overlap_idx.py b/src/umfile_utils/check_land_overlap_idx.py similarity index 100% rename from src/check_land_overlap_idx.py rename to src/umfile_utils/check_land_overlap_idx.py From bc758c71fc80a4378692d2ebf001273ba8e1bfb1 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:58:50 +1100 Subject: [PATCH 065/138] Rename src/count_land.py to src/umfile_utils/count_land.py --- src/{ => umfile_utils}/count_land.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/count_land.py (100%) diff --git a/src/count_land.py b/src/umfile_utils/count_land.py similarity index 100% rename from src/count_land.py rename to src/umfile_utils/count_land.py From 5b571eb3585f2be8c2522d8f7a0043fd7f21beaa Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:59:35 +1100 Subject: [PATCH 066/138] Rename src/count_tiles.py to src/umfile_utils/count_tiles.py --- src/{ => umfile_utils}/count_tiles.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/count_tiles.py (100%) diff --git a/src/count_tiles.py b/src/umfile_utils/count_tiles.py similarity index 100% rename from src/count_tiles.py rename to src/umfile_utils/count_tiles.py From 10f49ccbce930c8f8d0fae6467fe753bf5df21e4 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:00:17 +1100 Subject: [PATCH 067/138] Rename src/eqtoll.py to src/umfile_utils/eqtoll.py --- src/{ => umfile_utils}/eqtoll.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/eqtoll.py (100%) diff --git a/src/eqtoll.py b/src/umfile_utils/eqtoll.py similarity index 100% rename from src/eqtoll.py rename to src/umfile_utils/eqtoll.py From dddba2b8e5fe449ab48e08fafbf38e752626cb8e Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:01:06 +1100 Subject: [PATCH 068/138] Rename src/fix_polar_anom.py to src/umfile_utils/fix_polar_anom.py --- src/{ => umfile_utils}/fix_polar_anom.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/fix_polar_anom.py (100%) diff --git a/src/fix_polar_anom.py b/src/umfile_utils/fix_polar_anom.py similarity index 100% rename from src/fix_polar_anom.py rename to src/umfile_utils/fix_polar_anom.py From 8e8678cedc4d99c16a4b506bca5434bb7a31a3e5 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:01:19 +1100 Subject: [PATCH 069/138] Rename src/get_calendar.py to src/umfile_utils/get_calendar.py --- src/{ => umfile_utils}/get_calendar.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/get_calendar.py (100%) diff --git a/src/get_calendar.py b/src/umfile_utils/get_calendar.py similarity index 100% rename from src/get_calendar.py rename to src/umfile_utils/get_calendar.py From 3f8fef596ad5ad9489c93c2b881a447d1b5a7cd2 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:01:31 +1100 Subject: [PATCH 070/138] Rename src/interpolate_ancillary.py to src/umfile_utils/interpolate_ancillary.py --- src/{ => umfile_utils}/interpolate_ancillary.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/interpolate_ancillary.py (100%) diff --git a/src/interpolate_ancillary.py b/src/umfile_utils/interpolate_ancillary.py similarity index 100% rename from src/interpolate_ancillary.py rename to src/umfile_utils/interpolate_ancillary.py From aabc450522938b6a60b041eeef2b4d673053a162 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:01:46 +1100 Subject: [PATCH 071/138] Rename src/iris_stashname.py to src/umfile_utils/iris_stashname.py --- src/{ => umfile_utils}/iris_stashname.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/iris_stashname.py (100%) diff --git a/src/iris_stashname.py b/src/umfile_utils/iris_stashname.py similarity index 100% rename from src/iris_stashname.py rename to src/umfile_utils/iris_stashname.py From 7db185f9457853e5570136885e092c6e8b0f98d3 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:02:04 +1100 Subject: [PATCH 072/138] Rename src/lbcdump.py to src/umfile_utils/lbcdump.py --- src/{ => umfile_utils}/lbcdump.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/lbcdump.py (100%) diff --git a/src/lbcdump.py b/src/umfile_utils/lbcdump.py similarity index 100% rename from src/lbcdump.py rename to src/umfile_utils/lbcdump.py From f0197707b7b95091e1462220cacf936e52a32d43 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:02:19 +1100 Subject: [PATCH 073/138] Rename src/levelheights.py to src/umfile_utils/levelheights.py --- src/{ => umfile_utils}/levelheights.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/levelheights.py (100%) diff --git a/src/levelheights.py b/src/umfile_utils/levelheights.py similarity index 100% rename from src/levelheights.py rename to src/umfile_utils/levelheights.py From e5519cdc4b6408626bf95630b149ca70fb17c718 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:16:47 +1100 Subject: [PATCH 074/138] Rename src/limit_soilmoisture.py to src/lumfile_utils/imit_soilmoisture.py --- src/{limit_soilmoisture.py => lumfile_utils/imit_soilmoisture.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{limit_soilmoisture.py => lumfile_utils/imit_soilmoisture.py} (100%) diff --git a/src/limit_soilmoisture.py b/src/lumfile_utils/imit_soilmoisture.py similarity index 100% rename from src/limit_soilmoisture.py rename to src/lumfile_utils/imit_soilmoisture.py From 83723ac424b62dd85e6ab96beec5a1729e0bc82f Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:16:59 +1100 Subject: [PATCH 075/138] Rename src/mask_edit.py to src/umfile_utils/mask_edit.py --- src/{ => umfile_utils}/mask_edit.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/mask_edit.py (100%) diff --git a/src/mask_edit.py b/src/umfile_utils/mask_edit.py similarity index 100% rename from src/mask_edit.py rename to src/umfile_utils/mask_edit.py From eca678be1560acd492efb8e569ffcdb3d6ac7280 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:18:03 +1100 Subject: [PATCH 076/138] Rename src/mergefiles.py to src/umfile_utils/mergefiles.py --- src/{ => umfile_utils}/mergefiles.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/mergefiles.py (100%) diff --git a/src/mergefiles.py b/src/umfile_utils/mergefiles.py similarity index 100% rename from src/mergefiles.py rename to src/umfile_utils/mergefiles.py From 2f81bbee329c82eb6e779c3b185a020a2b13b76c Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:18:33 +1100 Subject: [PATCH 077/138] Rename imit_soilmoisture.py to imit_soilmoisture.py --- src/{lumfile_utils => umfile_utils}/imit_soilmoisture.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{lumfile_utils => umfile_utils}/imit_soilmoisture.py (100%) diff --git a/src/lumfile_utils/imit_soilmoisture.py b/src/umfile_utils/imit_soilmoisture.py similarity index 100% rename from src/lumfile_utils/imit_soilmoisture.py rename to src/umfile_utils/imit_soilmoisture.py From 709bdc7a4fbb79701062eeff36dc0fffcf62bafb Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:18:46 +1100 Subject: [PATCH 078/138] Rename src/mergefiles_region.py to src/umfile_utils/mergefiles_region.py --- src/{ => umfile_utils}/mergefiles_region.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/mergefiles_region.py (100%) diff --git a/src/mergefiles_region.py b/src/umfile_utils/mergefiles_region.py similarity index 100% rename from src/mergefiles_region.py rename to src/umfile_utils/mergefiles_region.py From 297c2f4bdc4692987d34dd219e52839826c8f13b Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:19:00 +1100 Subject: [PATCH 079/138] Rename src/nccmp_um2netcdf.py to src/umfile_utils/nccmp_um2netcdf.py --- src/{ => umfile_utils}/nccmp_um2netcdf.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/nccmp_um2netcdf.py (100%) diff --git a/src/nccmp_um2netcdf.py b/src/umfile_utils/nccmp_um2netcdf.py similarity index 100% rename from src/nccmp_um2netcdf.py rename to src/umfile_utils/nccmp_um2netcdf.py From 75a5261ebabb667c2a2042e036e6c7459314a55e Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:19:13 +1100 Subject: [PATCH 080/138] Rename src/perturbIC.py to src/umfile_utils/perturbIC.py --- src/{ => umfile_utils}/perturbIC.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/perturbIC.py (100%) diff --git a/src/perturbIC.py b/src/umfile_utils/perturbIC.py similarity index 100% rename from src/perturbIC.py rename to src/umfile_utils/perturbIC.py From 534f66f0ea79590e27f37d1ce551949c33f8decb Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:19:46 +1100 Subject: [PATCH 081/138] Rename src/polar_anom.py to src/umfile_utils/polar_anom.py --- src/{ => umfile_utils}/polar_anom.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/polar_anom.py (100%) diff --git a/src/polar_anom.py b/src/umfile_utils/polar_anom.py similarity index 100% rename from src/polar_anom.py rename to src/umfile_utils/polar_anom.py From 9deb368d779b6d1e60859148209d09f7187452a3 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:20:04 +1100 Subject: [PATCH 082/138] Rename src/um_copy_field.py to src/umfile_utils/um_copy_field.py --- src/{ => umfile_utils}/um_copy_field.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um_copy_field.py (100%) diff --git a/src/um_copy_field.py b/src/umfile_utils/um_copy_field.py similarity index 100% rename from src/um_copy_field.py rename to src/umfile_utils/um_copy_field.py From 71a4e644575faf93932e9eadcd61dbf3d2e47f0c Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:20:31 +1100 Subject: [PATCH 083/138] Rename src/sortum.py to src/umfile_utils/sortum.py --- src/{ => umfile_utils}/sortum.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/sortum.py (100%) diff --git a/src/sortum.py b/src/umfile_utils/sortum.py similarity index 100% rename from src/sortum.py rename to src/umfile_utils/sortum.py From 72d9fbac18a62dbd2f24fb331c38cfa2e59034c8 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:21:07 +1100 Subject: [PATCH 084/138] Rename src/read_stashmaster.py to src/umfile_utils/read_stashmaster.py --- src/{ => umfile_utils}/read_stashmaster.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/read_stashmaster.py (100%) diff --git a/src/read_stashmaster.py b/src/umfile_utils/read_stashmaster.py similarity index 100% rename from src/read_stashmaster.py rename to src/umfile_utils/read_stashmaster.py From 4bc26b91c64371df0b409232b8f960aa19264b11 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:21:19 +1100 Subject: [PATCH 085/138] Rename src/remove_stash_duplicates.py to src/umfile_utils/remove_stash_duplicates.py --- src/{ => umfile_utils}/remove_stash_duplicates.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/remove_stash_duplicates.py (100%) diff --git a/src/remove_stash_duplicates.py b/src/umfile_utils/remove_stash_duplicates.py similarity index 100% rename from src/remove_stash_duplicates.py rename to src/umfile_utils/remove_stash_duplicates.py From bf58b490f584ce9f41fe1cb11b424f3133d7a12f Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:21:42 +1100 Subject: [PATCH 086/138] Rename src/stashvar.py to src/umfile_utils/stashvar.py --- src/{ => umfile_utils}/stashvar.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/stashvar.py (100%) diff --git a/src/stashvar.py b/src/umfile_utils/stashvar.py similarity index 100% rename from src/stashvar.py rename to src/umfile_utils/stashvar.py From 117e43ce98db4889b6df066fe5f926f816071a3e Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:21:57 +1100 Subject: [PATCH 087/138] Rename src/prog_fields_mismatch.py to src/umfile_utils/prog_fields_mismatch.py --- src/{ => umfile_utils}/prog_fields_mismatch.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/prog_fields_mismatch.py (100%) diff --git a/src/prog_fields_mismatch.py b/src/umfile_utils/prog_fields_mismatch.py similarity index 100% rename from src/prog_fields_mismatch.py rename to src/umfile_utils/prog_fields_mismatch.py From b2499455ead1b1486a32611e073360cd73752996 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:22:10 +1100 Subject: [PATCH 088/138] Rename src/reset_neg_snow.py to src/umfile_utils/reset_neg_snow.py --- src/{ => umfile_utils}/reset_neg_snow.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/reset_neg_snow.py (100%) diff --git a/src/reset_neg_snow.py b/src/umfile_utils/reset_neg_snow.py similarity index 100% rename from src/reset_neg_snow.py rename to src/umfile_utils/reset_neg_snow.py From 6824d51b731c5306f44c5c2ee8936d3a4233745f Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:22:22 +1100 Subject: [PATCH 089/138] Rename src/show_land_overlap.py to src/umfile_utils/show_land_overlap.py --- src/{ => umfile_utils}/show_land_overlap.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/show_land_overlap.py (100%) diff --git a/src/show_land_overlap.py b/src/umfile_utils/show_land_overlap.py similarity index 100% rename from src/show_land_overlap.py rename to src/umfile_utils/show_land_overlap.py From 865c1d44e5686dc9d9dba706cdf77b38cecab464 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:22:35 +1100 Subject: [PATCH 090/138] Rename src/um_fieldsfile_dump.py to src/umfile_utils/um_fieldsfile_dump.py --- src/{ => umfile_utils}/um_fieldsfile_dump.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um_fieldsfile_dump.py (100%) diff --git a/src/um_fieldsfile_dump.py b/src/umfile_utils/um_fieldsfile_dump.py similarity index 100% rename from src/um_fieldsfile_dump.py rename to src/umfile_utils/um_fieldsfile_dump.py From ba6a866acba7700d8add5937780f46ebc1494c28 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:22:45 +1100 Subject: [PATCH 091/138] Rename src/sstice_ancil.py to src/umfile_utils/sstice_ancil.py --- src/{ => umfile_utils}/sstice_ancil.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/sstice_ancil.py (100%) diff --git a/src/sstice_ancil.py b/src/umfile_utils/sstice_ancil.py similarity index 100% rename from src/sstice_ancil.py rename to src/umfile_utils/sstice_ancil.py From 418c438823f9ac496652ac02e2198d2b7af19d47 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:22:57 +1100 Subject: [PATCH 092/138] Rename src/um2netcdf4_cmip6.py to src/umfile_utils/um2netcdf4_cmip6.py --- src/{ => umfile_utils}/um2netcdf4_cmip6.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um2netcdf4_cmip6.py (100%) diff --git a/src/um2netcdf4_cmip6.py b/src/umfile_utils/um2netcdf4_cmip6.py similarity index 100% rename from src/um2netcdf4_cmip6.py rename to src/umfile_utils/um2netcdf4_cmip6.py From d03890dd390543a818eaf6b9ededf390eb7d1dea Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:23:10 +1100 Subject: [PATCH 093/138] Rename src/stashvar_validate_stdnames.py to src/umfile_utils/stashvar_validate_stdnames.py --- src/{ => umfile_utils}/stashvar_validate_stdnames.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/{ => umfile_utils}/stashvar_validate_stdnames.py (99%) diff --git a/src/stashvar_validate_stdnames.py b/src/umfile_utils/stashvar_validate_stdnames.py similarity index 99% rename from src/stashvar_validate_stdnames.py rename to src/umfile_utils/stashvar_validate_stdnames.py index c1315144..7b544478 100644 --- a/src/stashvar_validate_stdnames.py +++ b/src/umfile_utils/stashvar_validate_stdnames.py @@ -18,4 +18,4 @@ if STASH_TO_CF[key].standard_name and std_name and STASH_TO_CF[key].standard_name != std_name: print("Name mismatch", v, std_name, STASH_TO_CF[key].standard_name) if STASH_TO_CF[key].units and units and STASH_TO_CF[key].units != units: - print("Units mismatch", v, units, STASH_TO_CF[key].units) \ No newline at end of file + print("Units mismatch", v, units, STASH_TO_CF[key].units) From 02b7a8714b7b48dc6488ff0604755fe1ed49ce6f Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:23:25 +1100 Subject: [PATCH 094/138] Rename src/stashvar_cmip6.py to src/umfile_utils/stashvar_cmip6.py --- src/{ => umfile_utils}/stashvar_cmip6.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/stashvar_cmip6.py (100%) diff --git a/src/stashvar_cmip6.py b/src/umfile_utils/stashvar_cmip6.py similarity index 100% rename from src/stashvar_cmip6.py rename to src/umfile_utils/stashvar_cmip6.py From dd35891a8136650b2e23bef473868d4e31b9cce4 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:23:39 +1100 Subject: [PATCH 095/138] Rename src/subset_ancillary.py to src/umfile_utils/subset_ancillary.py --- src/{ => umfile_utils}/subset_ancillary.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/subset_ancillary.py (100%) diff --git a/src/subset_ancillary.py b/src/umfile_utils/subset_ancillary.py similarity index 100% rename from src/subset_ancillary.py rename to src/umfile_utils/subset_ancillary.py From 6edac3021b444334bf9ae1fcf2f61de292be79cf Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:23:50 +1100 Subject: [PATCH 096/138] Rename src/split_times.py to src/umfile_utils/split_times.py --- src/{ => umfile_utils}/split_times.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/split_times.py (100%) diff --git a/src/split_times.py b/src/umfile_utils/split_times.py similarity index 100% rename from src/split_times.py rename to src/umfile_utils/split_times.py From 496bb808eaf3ed22883b5512e97fb7a30d0e5959 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:24:01 +1100 Subject: [PATCH 097/138] Rename src/um2netcdf4.py to src/umfile_utils/um2netcdf4.py --- src/{ => umfile_utils}/um2netcdf4.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um2netcdf4.py (100%) diff --git a/src/um2netcdf4.py b/src/umfile_utils/um2netcdf4.py similarity index 100% rename from src/um2netcdf4.py rename to src/umfile_utils/um2netcdf4.py From 128475d43b3ac7550e8c25f361de1e54a68f2149 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:24:12 +1100 Subject: [PATCH 098/138] Rename src/subset_dump.py to src/umfile_utils/subset_dump.py --- src/{ => umfile_utils}/subset_dump.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/subset_dump.py (100%) diff --git a/src/subset_dump.py b/src/umfile_utils/subset_dump.py similarity index 100% rename from src/subset_dump.py rename to src/umfile_utils/subset_dump.py From 276c67fa8cc60f417f91e03348fc791cdc8a4d58 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:24:26 +1100 Subject: [PATCH 099/138] Rename src/um2netcdf4_dev.py to src/umfile_utils/um2netcdf4_dev.py --- src/{ => umfile_utils}/um2netcdf4_dev.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um2netcdf4_dev.py (100%) diff --git a/src/um2netcdf4_dev.py b/src/umfile_utils/um2netcdf4_dev.py similarity index 100% rename from src/um2netcdf4_dev.py rename to src/umfile_utils/um2netcdf4_dev.py From 1164195cc63305d195235f44ab4ce64ab60763fd Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:24:42 +1100 Subject: [PATCH 100/138] Rename src/um2netcdf.py to src/umfile_utils/um2netcdf.py --- src/{ => umfile_utils}/um2netcdf.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um2netcdf.py (100%) diff --git a/src/um2netcdf.py b/src/umfile_utils/um2netcdf.py similarity index 100% rename from src/um2netcdf.py rename to src/umfile_utils/um2netcdf.py From 52064b0765a8a334c610d7d0e54142c8ae1d0d5b Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:24:54 +1100 Subject: [PATCH 101/138] Rename src/um_fileheaders.py to src/umfile_utils/um_fileheaders.py --- src/{ => umfile_utils}/um_fileheaders.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um_fileheaders.py (100%) diff --git a/src/um_fileheaders.py b/src/umfile_utils/um_fileheaders.py similarity index 100% rename from src/um_fileheaders.py rename to src/umfile_utils/um_fileheaders.py From d0e6a48102ff484b68d71f2330cdce8ab4a464ad Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:25:04 +1100 Subject: [PATCH 102/138] Rename src/um_modify_field.py to src/umfile_utils/um_modify_field.py --- src/{ => umfile_utils}/um_modify_field.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um_modify_field.py (100%) diff --git a/src/um_modify_field.py b/src/umfile_utils/um_modify_field.py similarity index 100% rename from src/um_modify_field.py rename to src/umfile_utils/um_modify_field.py From 388176823c860142d5dd61237e29081a5579c6ba Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:25:19 +1100 Subject: [PATCH 103/138] Rename src/um2netcdf_all.py to src/umfile_utils/um2netcdf_all.py --- src/{ => umfile_utils}/um2netcdf_all.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um2netcdf_all.py (100%) diff --git a/src/um2netcdf_all.py b/src/umfile_utils/um2netcdf_all.py similarity index 100% rename from src/um2netcdf_all.py rename to src/umfile_utils/um2netcdf_all.py From 3dea64427492c4ee53fdd380be1a139e63db399f Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:25:31 +1100 Subject: [PATCH 104/138] Rename src/um_grid_flip.py to src/umfile_utils/um_grid_flip.py --- src/{ => umfile_utils}/um_grid_flip.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um_grid_flip.py (100%) diff --git a/src/um_grid_flip.py b/src/umfile_utils/um_grid_flip.py similarity index 100% rename from src/um_grid_flip.py rename to src/umfile_utils/um_grid_flip.py From e54753e66830364ac9492d533244806e3680da96 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:25:42 +1100 Subject: [PATCH 105/138] Rename src/umv2reg.py to src/umfile_utils/umv2reg.py --- src/{ => umfile_utils}/umv2reg.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/umv2reg.py (100%) diff --git a/src/umv2reg.py b/src/umfile_utils/umv2reg.py similarity index 100% rename from src/umv2reg.py rename to src/umfile_utils/umv2reg.py From df82a8d1024e54c8c404617f3481562f53ea074a Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:25:56 +1100 Subject: [PATCH 106/138] Rename src/valid_times.py to src/umfile_utils/valid_times.py --- src/{ => umfile_utils}/valid_times.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/valid_times.py (100%) diff --git a/src/valid_times.py b/src/umfile_utils/valid_times.py similarity index 100% rename from src/valid_times.py rename to src/umfile_utils/valid_times.py From ee85066c844797c1c974bbfe58cc0cc3e68a85b3 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:26:09 +1100 Subject: [PATCH 107/138] Rename src/um_zero_field.py to src/umfile_utils/um_zero_field.py --- src/{ => umfile_utils}/um_zero_field.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um_zero_field.py (100%) diff --git a/src/um_zero_field.py b/src/umfile_utils/um_zero_field.py similarity index 100% rename from src/um_zero_field.py rename to src/umfile_utils/um_zero_field.py From afa4b69c20e48188f5a8fa40ae702554f8fb729b Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:26:22 +1100 Subject: [PATCH 108/138] Rename src/umv2netcdf.py to src/umfile_utils/umv2netcdf.py --- src/{ => umfile_utils}/umv2netcdf.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/umv2netcdf.py (100%) diff --git a/src/umv2netcdf.py b/src/umfile_utils/umv2netcdf.py similarity index 100% rename from src/umv2netcdf.py rename to src/umfile_utils/umv2netcdf.py From 30780cc9c499b767fddd3c8696fcd71a8052f39d Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:26:34 +1100 Subject: [PATCH 109/138] Rename src/um_replace_field.py to src/umfile_utils/um_replace_field.py --- src/{ => umfile_utils}/um_replace_field.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um_replace_field.py (100%) diff --git a/src/um_replace_field.py b/src/umfile_utils/um_replace_field.py similarity index 100% rename from src/um_replace_field.py rename to src/umfile_utils/um_replace_field.py From c72115dd70ffd35f2e55724a4601b3db3292e989 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:26:46 +1100 Subject: [PATCH 110/138] Rename src/um2netcdf_iris.py to src/umfile_utils/um2netcdf_iris.py --- src/{ => umfile_utils}/um2netcdf_iris.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um2netcdf_iris.py (100%) diff --git a/src/um2netcdf_iris.py b/src/umfile_utils/um2netcdf_iris.py similarity index 100% rename from src/um2netcdf_iris.py rename to src/umfile_utils/um2netcdf_iris.py From fc497e2bea042d6089f7020db4c449e9fd07a7e1 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:26:57 +1100 Subject: [PATCH 111/138] Rename src/um2netcdf_iris_mon.py to src/umfile_utils/um2netcdf_iris_mon.py --- src/{ => umfile_utils}/um2netcdf_iris_mon.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/um2netcdf_iris_mon.py (100%) diff --git a/src/um2netcdf_iris_mon.py b/src/umfile_utils/um2netcdf_iris_mon.py similarity index 100% rename from src/um2netcdf_iris_mon.py rename to src/umfile_utils/um2netcdf_iris_mon.py From f8d5ca74c42d90efc556d4c31300c41efc120d52 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:27:11 +1100 Subject: [PATCH 112/138] Rename src/umfile.py to src/umfile_utils/umfile.py --- src/{ => umfile_utils}/umfile.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => umfile_utils}/umfile.py (100%) diff --git a/src/umfile.py b/src/umfile_utils/umfile.py similarity index 100% rename from src/umfile.py rename to src/umfile_utils/umfile.py From fe7e5504c733e458e33e8f9a80a34309b3a49abc Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:05:32 +1100 Subject: [PATCH 113/138] Create _version.py --- src/umfile_utils/_version.py | 682 +++++++++++++++++++++++++++++++++++ 1 file changed, 682 insertions(+) create mode 100644 src/umfile_utils/_version.py diff --git a/src/umfile_utils/_version.py b/src/umfile_utils/_version.py new file mode 100644 index 00000000..6ae7bead --- /dev/null +++ b/src/umfile_utils/_version.py @@ -0,0 +1,682 @@ +# This file helps to compute a version number in source trees obtained from +# git-archive tarball (such as those provided by githubs download-from-tag +# feature). Distribution tarballs (built by setup.py sdist) and build +# directories (produced by setup.py build) will contain a much shorter file +# that just contains the computed version number. + +# This file is released into the public domain. +# Generated by versioneer-0.29 +# https://github.com/python-versioneer/python-versioneer + +"""Git implementation of _version.py.""" + +import errno +import os +import re +import subprocess +import sys +from typing import Any, Callable, Dict, List, Optional, Tuple +import functools + + +def get_keywords() -> Dict[str, str]: + """Get the keywords needed to look up the version information.""" + # these strings will be replaced by git during git-archive. + # setup.py/versioneer.py will grep for the variable names, so they must + # each be defined on a line of their own. _version.py will just call + # get_keywords(). + git_refnames = "$Format:%d$" + git_full = "$Format:%H$" + git_date = "$Format:%ci$" + keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} + return keywords + + +class VersioneerConfig: + """Container for Versioneer configuration parameters.""" + + VCS: str + style: str + tag_prefix: str + parentdir_prefix: str + versionfile_source: str + verbose: bool + + +def get_config() -> VersioneerConfig: + """Create, populate and return the VersioneerConfig() object.""" + # these strings are filled in when 'setup.py versioneer' creates + # _version.py + cfg = VersioneerConfig() + cfg.VCS = "git" + cfg.style = "pep440" + cfg.tag_prefix = "" + cfg.parentdir_prefix = "umpost-" + cfg.versionfile_source = "umpost/_version.py" + cfg.verbose = False + return cfg + + +class NotThisMethod(Exception): + """Exception raised if a method is not valid for the current scenario.""" + + +LONG_VERSION_PY: Dict[str, str] = {} +HANDLERS: Dict[str, Dict[str, Callable]] = {} + + +def register_vcs_handler(vcs: str, method: str) -> Callable: # decorator + """Create decorator to mark a method as the handler of a VCS.""" + def decorate(f: Callable) -> Callable: + """Store f in HANDLERS[vcs][method].""" + if vcs not in HANDLERS: + HANDLERS[vcs] = {} + HANDLERS[vcs][method] = f + return f + return decorate + + +def run_command( + commands: List[str], + args: List[str], + cwd: Optional[str] = None, + verbose: bool = False, + hide_stderr: bool = False, + env: Optional[Dict[str, str]] = None, +) -> Tuple[Optional[str], Optional[int]]: + """Call the given command(s).""" + assert isinstance(commands, list) + process = None + + popen_kwargs: Dict[str, Any] = {} + if sys.platform == "win32": + # This hides the console window if pythonw.exe is used + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + popen_kwargs["startupinfo"] = startupinfo + + for command in commands: + try: + dispcmd = str([command] + args) + # remember shell=False, so use git.cmd on windows, not just git + process = subprocess.Popen([command] + args, cwd=cwd, env=env, + stdout=subprocess.PIPE, + stderr=(subprocess.PIPE if hide_stderr + else None), **popen_kwargs) + break + except OSError as e: + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %s" % dispcmd) + print(e) + return None, None + else: + if verbose: + print("unable to find command, tried %s" % (commands,)) + return None, None + stdout = process.communicate()[0].strip().decode() + if process.returncode != 0: + if verbose: + print("unable to run %s (error)" % dispcmd) + print("stdout was %s" % stdout) + return None, process.returncode + return stdout, process.returncode + + +def versions_from_parentdir( + parentdir_prefix: str, + root: str, + verbose: bool, +) -> Dict[str, Any]: + """Try to determine the version from the parent directory name. + + Source tarballs conventionally unpack into a directory that includes both + the project name and a version string. We will also support searching up + two directory levels for an appropriately named parent directory + """ + rootdirs = [] + + for _ in range(3): + dirname = os.path.basename(root) + if dirname.startswith(parentdir_prefix): + return {"version": dirname[len(parentdir_prefix):], + "full-revisionid": None, + "dirty": False, "error": None, "date": None} + rootdirs.append(root) + root = os.path.dirname(root) # up a level + + if verbose: + print("Tried directories %s but none started with prefix %s" % + (str(rootdirs), parentdir_prefix)) + raise NotThisMethod("rootdir doesn't start with parentdir_prefix") + + +@register_vcs_handler("git", "get_keywords") +def git_get_keywords(versionfile_abs: str) -> Dict[str, str]: + """Extract version information from the given file.""" + # the code embedded in _version.py can just fetch the value of these + # keywords. When used from setup.py, we don't want to import _version.py, + # so we do it with a regexp instead. This function is not used from + # _version.py. + keywords: Dict[str, str] = {} + try: + with open(versionfile_abs, "r") as fobj: + for line in fobj: + if line.strip().startswith("git_refnames ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["refnames"] = mo.group(1) + if line.strip().startswith("git_full ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["full"] = mo.group(1) + if line.strip().startswith("git_date ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["date"] = mo.group(1) + except OSError: + pass + return keywords + + +@register_vcs_handler("git", "keywords") +def git_versions_from_keywords( + keywords: Dict[str, str], + tag_prefix: str, + verbose: bool, +) -> Dict[str, Any]: + """Get version information from git keywords.""" + if "refnames" not in keywords: + raise NotThisMethod("Short version file found") + date = keywords.get("date") + if date is not None: + # Use only the last line. Previous lines may contain GPG signature + # information. + date = date.splitlines()[-1] + + # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant + # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 + # -like" string, which we must then edit to make compliant), because + # it's been around since git-1.5.3, and it's too difficult to + # discover which version we're using, or to work around using an + # older one. + date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") + refs = {r.strip() for r in refnames.strip("()").split(",")} + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " + tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %d + # expansion behaves like git log --decorate=short and strips out the + # refs/heads/ and refs/tags/ prefixes that would let us distinguish + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". + tags = {r for r in refs if re.search(r'\d', r)} + if verbose: + print("discarding '%s', no digits" % ",".join(refs - tags)) + if verbose: + print("likely tags: %s" % ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix):] + # Filter out refs that exactly match prefix or that don't start + # with a number once the prefix is stripped (mostly a concern + # when prefix is '') + if not re.match(r'\d', r): + continue + if verbose: + print("picking %s" % r) + return {"version": r, + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": None, + "date": date} + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return {"version": "0+unknown", + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": "no suitable tags", "date": None} + + +@register_vcs_handler("git", "pieces_from_vcs") +def git_pieces_from_vcs( + tag_prefix: str, + root: str, + verbose: bool, + runner: Callable = run_command +) -> Dict[str, Any]: + """Get version from 'git describe' in the root of the source tree. + + This only gets called if the git-archive 'subst' keywords were *not* + expanded, and _version.py hasn't already been rewritten with a short + version string, meaning we're inside a checked out source tree. + """ + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] + + # GIT_DIR can interfere with correct operation of Versioneer. + # It may be intended to be passed to the Versioneer-versioned project, + # but that should not change where we get our version from. + env = os.environ.copy() + env.pop("GIT_DIR", None) + runner = functools.partial(runner, env=env) + + _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, + hide_stderr=not verbose) + if rc != 0: + if verbose: + print("Directory %s not under git control" % root) + raise NotThisMethod("'git rev-parse --git-dir' returned error") + + # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] + # if there isn't one, this yields HEX[-dirty] (no NUM) + describe_out, rc = runner(GITS, [ + "describe", "--tags", "--dirty", "--always", "--long", + "--match", f"{tag_prefix}[[:digit:]]*" + ], cwd=root) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() + full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() + + pieces: Dict[str, Any] = {} + pieces["long"] = full_out + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + + branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], + cwd=root) + # --abbrev-ref was added in git-1.6.3 + if rc != 0 or branch_name is None: + raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") + branch_name = branch_name.strip() + + if branch_name == "HEAD": + # If we aren't exactly on a branch, pick a branch which represents + # the current commit. If all else fails, we are on a branchless + # commit. + branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) + # --contains was added in git-1.5.4 + if rc != 0 or branches is None: + raise NotThisMethod("'git branch --contains' returned error") + branches = branches.split("\n") + + # Remove the first line if we're running detached + if "(" in branches[0]: + branches.pop(0) + + # Strip off the leading "* " from the list of branches. + branches = [branch[2:] for branch in branches] + if "master" in branches: + branch_name = "master" + elif not branches: + branch_name = None + else: + # Pick the first branch that is returned. Good or bad. + branch_name = branches[0] + + pieces["branch"] = branch_name + + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out + + # look for -dirty suffix + dirty = git_describe.endswith("-dirty") + pieces["dirty"] = dirty + if dirty: + git_describe = git_describe[:git_describe.rindex("-dirty")] + + # now we have TAG-NUM-gHEX or HEX + + if "-" in git_describe: + # TAG-NUM-gHEX + mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + if not mo: + # unparsable. Maybe git-describe is misbehaving? + pieces["error"] = ("unable to parse git-describe output: '%s'" + % describe_out) + return pieces + + # tag + full_tag = mo.group(1) + if not full_tag.startswith(tag_prefix): + if verbose: + fmt = "tag '%s' doesn't start with prefix '%s'" + print(fmt % (full_tag, tag_prefix)) + pieces["error"] = ("tag '%s' doesn't start with prefix '%s'" + % (full_tag, tag_prefix)) + return pieces + pieces["closest-tag"] = full_tag[len(tag_prefix):] + + # distance: number of commits since tag + pieces["distance"] = int(mo.group(2)) + + # commit: short hex revision ID + pieces["short"] = mo.group(3) + + else: + # HEX: no tags + pieces["closest-tag"] = None + out, rc = runner(GITS, ["rev-list", "HEAD", "--left-right"], cwd=root) + pieces["distance"] = len(out.split()) # total number of commits + + # commit date: see ISO-8601 comment in git_versions_from_keywords() + date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip() + # Use only the last line. Previous lines may contain GPG signature + # information. + date = date.splitlines()[-1] + pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + + return pieces + + +def plus_or_dot(pieces: Dict[str, Any]) -> str: + """Return a + if we don't already have one, else return a .""" + if "+" in pieces.get("closest-tag", ""): + return "." + return "+" + + +def render_pep440(pieces: Dict[str, Any]) -> str: + """Build up version string, with post-release "local version identifier". + + Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you + get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty + + Exceptions: + 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += plus_or_dot(pieces) + rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0+untagged.%d.g%s" % (pieces["distance"], + pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def render_pep440_branch(pieces: Dict[str, Any]) -> str: + """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . + + The ".dev0" means not master branch. Note that .dev0 sorts backwards + (a feature branch will appear "older" than the master branch). + + Exceptions: + 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0" + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += "+untagged.%d.g%s" % (pieces["distance"], + pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def pep440_split_post(ver: str) -> Tuple[str, Optional[int]]: + """Split pep440 version string at the post-release segment. + + Returns the release segments before the post-release and the + post-release version number (or -1 if no post-release segment is present). + """ + vc = str.split(ver, ".post") + return vc[0], int(vc[1] or 0) if len(vc) == 2 else None + + +def render_pep440_pre(pieces: Dict[str, Any]) -> str: + """TAG[.postN.devDISTANCE] -- No -dirty. + + Exceptions: + 1: no tags. 0.post0.devDISTANCE + """ + if pieces["closest-tag"]: + if pieces["distance"]: + # update the post release segment + tag_version, post_version = pep440_split_post(pieces["closest-tag"]) + rendered = tag_version + if post_version is not None: + rendered += ".post%d.dev%d" % (post_version + 1, pieces["distance"]) + else: + rendered += ".post0.dev%d" % (pieces["distance"]) + else: + # no commits, use the tag as the version + rendered = pieces["closest-tag"] + else: + # exception #1 + rendered = "0.post0.dev%d" % pieces["distance"] + return rendered + + +def render_pep440_post(pieces: Dict[str, Any]) -> str: + """TAG[.postDISTANCE[.dev0]+gHEX] . + + The ".dev0" means dirty. Note that .dev0 sorts backwards + (a dirty tree will appear "older" than the corresponding clean one), + but you shouldn't be releasing software with -dirty anyways. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%s" % pieces["short"] + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += "+g%s" % pieces["short"] + return rendered + + +def render_pep440_post_branch(pieces: Dict[str, Any]) -> str: + """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . + + The ".dev0" means not master branch. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%s" % pieces["short"] + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += "+g%s" % pieces["short"] + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def render_pep440_old(pieces: Dict[str, Any]) -> str: + """TAG[.postDISTANCE[.dev0]] . + + The ".dev0" means dirty. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + return rendered + + +def render_git_describe(pieces: Dict[str, Any]) -> str: + """TAG[-DISTANCE-gHEX][-dirty]. + + Like 'git describe --tags --dirty --always'. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render_git_describe_long(pieces: Dict[str, Any]) -> str: + """TAG-DISTANCE-gHEX[-dirty]. + + Like 'git describe --tags --dirty --always -long'. + The distance/hash is unconditional. + + Exceptions: + 1: no tags. HEX[-dirty] (note: no 'g' prefix) + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render(pieces: Dict[str, Any], style: str) -> Dict[str, Any]: + """Render the given version pieces into the requested style.""" + if pieces["error"]: + return {"version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, + "error": pieces["error"], + "date": None} + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) + elif style == "pep440-branch": + rendered = render_pep440_branch(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) + elif style == "pep440-post-branch": + rendered = render_pep440_post_branch(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": + rendered = render_git_describe(pieces) + elif style == "git-describe-long": + rendered = render_git_describe_long(pieces) + else: + raise ValueError("unknown style '%s'" % style) + + return {"version": rendered, "full-revisionid": pieces["long"], + "dirty": pieces["dirty"], "error": None, + "date": pieces.get("date")} + + +def get_versions() -> Dict[str, Any]: + """Get version information or return default if unable to do so.""" + # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have + # __file__, we can work backwards from there to the root. Some + # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which + # case we can only use expanded keywords. + + cfg = get_config() + verbose = cfg.verbose + + try: + return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, + verbose) + except NotThisMethod: + pass + + try: + root = os.path.realpath(__file__) + # versionfile_source is the relative path from the top of the source + # tree (where the .git directory might live) to this file. Invert + # this to find the root from __file__. + for _ in cfg.versionfile_source.split('/'): + root = os.path.dirname(root) + except NameError: + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to find root of source tree", + "date": None} + + try: + pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) + return render(pieces, cfg.style) + except NotThisMethod: + pass + + try: + if cfg.parentdir_prefix: + return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) + except NotThisMethod: + pass + + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to compute version", "date": None} From a6ba0940d379fa67f54553c121db7cba1e59b994 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:17:43 +1100 Subject: [PATCH 114/138] Apply suggestions from code review Co-authored-by: Davide Marchegiani --- pyproject.toml | 33 +++++++++++++++++++++++++-------- setup.py | 15 ++++----------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e5a6da41..c05e7142 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,12 +11,29 @@ license = { file = "LICENSE" } keywords = ["UM", "UM utilities", "UM fields files", "umfile_utils"] dynamic = ["version"] dependencies = [ - "cftime", - "ecgtools>=2023.7.13", - "intake==0.7.0", - "intake-dataframe-catalog>=0.2.4", - "intake-esm>=2023.11.10", - "jsonschema", - "pooch", - "xarray", + "mule", + "numpy <2", + "versioneer", ] + +[project.urls] +Repository = "https://github.com/ACCESS-NRI/umfile_utils" + +[build-system] +build-backend = "setuptools.build_meta" +requires = [ + "setuptools>64", + "versioneer[toml]" +] + +[tool.setuptools.packages.find] +where = ["src"] +namespaces = false + +[tool.versioneer] +VCS = "git" +style = "pep440" +versionfile_source = "src/umfile_utils/_version.py" +versionfile_build = "umfile_utils/_version.py" +tag_prefix = "" +parentdir_prefix = "umfile-utils-" diff --git a/setup.py b/setup.py index fbefb8e5..d14fa5b4 100644 --- a/setup.py +++ b/setup.py @@ -1,14 +1,7 @@ -from setuptools import setup, find_packages +import versioneer +from setuptools import setup setup( - name="umfile_utils", - version="0.1.0", - packages=find_packages(where="src"), - package_dir={"": "src"}, - install_requires=[ - # Add your dependencies here, e.g., "numpy", "requests", etc. - ], - entry_points={ - # Optional: Add command line scripts or other entry points here. - }, + version=versioneer.get_version(), + cmdclass=versioneer.get_cmdclass(), ) From 42630431f099b32e5af6506fbe6fc31ee37f7f92 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:18:17 +1100 Subject: [PATCH 115/138] Update __init__.py --- src/umfile_utils/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/umfile_utils/__init__.py b/src/umfile_utils/__init__.py index 8b137891..96e13be6 100644 --- a/src/umfile_utils/__init__.py +++ b/src/umfile_utils/__init__.py @@ -1 +1,2 @@ - +from umfile_utils import _version +__version__ = _version.get_versions()["version"] From 2451f911852a8ed9f20c49f967d01e91ed4a9f3b Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:21:50 +1100 Subject: [PATCH 116/138] Rename src/umfile_utils/perturbIC.py to src/perturbIC.py --- src/{umfile_utils => }/perturbIC.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{umfile_utils => }/perturbIC.py (100%) diff --git a/src/umfile_utils/perturbIC.py b/src/perturbIC.py similarity index 100% rename from src/umfile_utils/perturbIC.py rename to src/perturbIC.py From 54fd36c584915bc2d9fd3d4be1c1c1d160da7e41 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:41:16 +1100 Subject: [PATCH 117/138] Apply suggestions from code review Minor comments Co-authored-by: Davide Marchegiani --- src/perturbIC.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index fa8811bc..a0bce948 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -51,7 +51,7 @@ def create_random_generator(value=None): raise ValueError('Seed value must be non-negative.') return Generator(PCG64(value)) -def get_rid_of_timeseries(ff): +def remove_timeseries(ff): """ Remove any timeseries from a fields file. @@ -62,7 +62,8 @@ def get_rid_of_timeseries(ff): Returns ---------- - ff/ff_out : Returns a mule fields object with no timeseries + ff_out : mule.dump.DumpFile + The mule DumpFile with no timeseries. """ ff_out = ff.copy() num_ts = 0 @@ -211,9 +212,11 @@ def transform(self, source_field, new_field): return data + self.perturbation -def void(*args, **kwargs): - print('skipping validation') - pass +def void_validation(*args, **kwargs): + """ + Don't perform the validation, but print a message to inform that validation has been skipped. + """ + print('Skipping mule validation. To enable the validation, run using the "--validate" option.') def set_validation(validate): @@ -239,8 +242,7 @@ def main(): """ # Define all the variables - data_limit = -99 - surface_temp_stash = 4 + STASH_THETA = 4 # Parse the command line arguments args = parse_args() @@ -248,8 +250,8 @@ def main(): # Create the output filename output_file = create_default_outname(args.ifile) - # Set the seed if one is given else proced without one. - random_obj = set_seed(args) + # Create the random generator. + random_generator = create_random_generator(args.seed) # Skips the validation entirely for use on ESM15 due to river fields error # Creates the mule field object @@ -261,7 +263,7 @@ def main(): nlat = 145 # Remove the time series from the data to ensure mule will work - ff = get_rid_of_timeseries(ff_raw) + ff = remove_timeseries(ff_raw) # Creates a random perturbation array perturbation = create_perturbation(args, random_obj, nlon, nlat) From c9af913bfc305d99aeecc3f01f239e9f14aef3eb Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:46:32 +1100 Subject: [PATCH 118/138] Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Random seed but need to discuss more about how to restrict parameters Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update perturbIC.py --- src/perturbIC.py | 236 +++++++++++++++++------------------------------ 1 file changed, 87 insertions(+), 149 deletions(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index a0bce948..f44770df 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -24,12 +24,12 @@ def parse_args(): """ parser = argparse.ArgumentParser(description="Perturb UM initial dump") parser.add_argument('-a', dest='amplitude', type=float, default=0.01, - help = 'Amplitude of perturbation') - parser.add_argument('-s', dest='seed', type=int, default=None, - help = 'Random number seed (must be non-negative integer)') - parser.add_argument('ifile', help='Input file (modified in place)') - parser.add_argument('-v', dest='validate', - help='To include validation set -v False', default=True) + help = 'Amplitude of the perturbation.') + parser.add_argument('-s','--seed', dest='seed', type=int, + help = 'The seed value used to generate the random perturbation (must be a non-negative integer).') + parser.add_argument('ifile', metavar="INPUT_PATH", help='Path to the input file.') + parser.add_argument('--validate', action='store_true', + help='Validate the output fields file using mule validation.') args_parsed = parser.parse_args() return args_parsed @@ -47,9 +47,11 @@ def create_random_generator(value=None): numpy.random.Generator The numpy random generator object. """ + + if value < 0: raise ValueError('Seed value must be non-negative.') - return Generator(PCG64(value)) + return Generator(PCG64(value)) def remove_timeseries(ff): """ @@ -66,150 +68,109 @@ def remove_timeseries(ff): The mule DumpFile with no timeseries. """ ff_out = ff.copy() - num_ts = 0 - - # Perform timeseries removal without rewriting file - for fld in ff.fields: - - # Check for the grid code that denotes a timeseries - if fld.lbcode in (31320, 31323): - num_ts += 1 - else: - ff_out.fields.append(fld) - - # Either return the fields with the timeseries removed - if num_ts > 0: - print(f'{num_ts} timeseries fields skipped') - return ff_out - # Or return all the feilds - else: - print('No timeseries fields found') - return ff + ff_out.fields=[field for field in ff.fields if field.lbcode not in TIMESERIES_LBCODES] + return ff_out -def create_outfile(args): +def create_default_outname(filename, suffix="_perturbed"): """ - This provides an outline for editing if a new file should be - created + Create a default output filename by appending a suffix to the input filename. + If an output filename already exists, a number will be appended to produce a unique output filename. Parameters ---------- - args: ArgumentParser object - The argument parser object with output file name + filename: str + The input filename. + suffix: str, optional + The suffix to append to the filename. Returns ---------- - output_file - str - This is a string of an output name + output_filename: str + The default output filename. """ - - #Seperate the string into the extension and the base - basename, ext = os.path.splitext(args.ifile) - output_filename = basename + '_perturbed' + ext - - #Check if that name alreay exists + output_filename = f"{filename}{suffix}" + num="" if os.path.exists(output_filename): - raise FileExistsError(f"The file '{output_filename}' already exists. Cannot save over the file") - else: - return output_filename + num = 1 + while os.path.exists(f"{output_filename}{num}"): + num += 1 + return f"{output_filename}{num}" -def create_perturbation(args, rs, nlon, nlat): +def create_perturbation(amplitude, random_generator, shape, nullify_poles = True): """ - This function create a random pertrbation of amplitude args.amplitude + Create a uniformly-distributed random perturbation of given amplitude and shape, using the given random_generator. + If nullify_poles is set to True, nullifies the perturbation amplitude at the poles. Parameters ---------- - args : Dictionary - The argumenst from the commandline (amplitude, seed) - rs : Random Object - The random object that has a seed (if defined) - Argument 2 description - nlon: Int - This is the lon - Argument 3 description + amplitude: float + The amplitude of the random perturbation. + random_generator: numpy.random.Generator + The random generator used to generate the random perturbation. + shape: tuple or list + Shape of the generated perturbation. + nullify_poles: bool, optional + If set to True, nullifies the perturbation amplitude at the poles. Returns ---------- - pertubation - Array - Returns a perturbation where the poles are set to 0 + pertubation: numpy.ndarray + The generated random perturbation. """ - perturbation = args.amplitude * (2.*rs.random(nlon*nlat).reshape((nlat,nlon)) - 1.) - + perturbation = random_generator.uniform(low = -amplitude, high = amplitude, size = shape) # Set poles to zero (only necessary for ND grids, but doesn't hurt EG) - perturbation[0] = 0 - perturbation[-1] = 0 - + if nullify_poles: + perturbation[[0,-1],:] = 0 return perturbation -def is_end_of_file(field_data, data_limit): - """ - This function checks to see if there is data associated with the metadata - Parameters - ---------- - f : umFile Object - This is the fields file that holds the restart data - - k : int - This integer is indexing the metadata in the fields file - - data_limit : int - This int is a placeholder indicating the end of the data - Returns - ---------- - boolean - True if the end of the data is reached and False everwhere else +def is_field_to_perturb(field, stash_to_perturb): """ - - if field_data == data_limit: - return True - else: - return False - -def do_perturb(field, surface_stash_code): - """ - This function checks to make sure that the correct field is used (surface temperature) - + Check if the field STASH itemcode correspond to the one to perturb. + Parameters ---------- - - field : mule fields Object - Holds the entire umfile including metadata and datai - - surface_stash_code : int + field : mule.Field + Field to check. + stash_to_perturb: int + STASH itemcode to perturb. Returns ---------- - boolean - True if this is the correct data to be perturbed. False for all other item code + bool + Returns True if the field STASH itemcode corresponds to the one to perturb. """ - if field.lbuser4 == surface_stash_code: - return True - else: - return False + return field.lbuser4 == stash_to_perturb -class SetAdditionOperator(mule.DataOperator): +class AdditionOperator(mule.DataOperator): """ - This class creates a mule operator that adds a random perturbation to a field - - Parameters - __________ - - perturb : np.array - An array of the random values to be added to the field + Create a mule operator that adds an array to a field, provided that the two have the same shape. - Returns - __________ - - field - The field with the perturbation added to it + Attributes + ---------- + array : numpy.ndarray + The array to add to the field. """ - def __init__(self, perturb): - self.perturbation = perturb + def __init__(self, array): + self.array = array def new_field(self, source_field): - """Creates the new field object""" + """ + Create the new field object by copying the source field. + """ return source_field.copy() def transform(self, source_field, new_field): - """Performs the data manipulation""" + """ + Perform the field data manipulation: check that the array and source field data have the same shape and then add them together. + """ data = source_field.get_data() - - # Multiply by 0 to keep the array shape - return data + self.perturbation + if (field_shape:=data.shape) != (array_shape:=self.array.shape): + raise ValueError(f"Array and field could not be broadcast together with shapes {array_shape} and {field_shape}.") + else: + return data + self.array def void_validation(*args, **kwargs): @@ -217,28 +178,12 @@ def void_validation(*args, **kwargs): Don't perform the validation, but print a message to inform that validation has been skipped. """ print('Skipping mule validation. To enable the validation, run using the "--validate" option.') + return -def set_validation(validate): - """ - This function sets the validation. It is for testing purposes to cirucmvent the river fields flipped grid in ESM15 - - Parameters - __________ - - validate : boolean - This variable is mandatory from the user and is True for testing purposes - - """ - if validate: - mule.DumpFile.validate = void - else: - print("May encounter an error if using ESM15 with the river field grids set validate to True to circumvent") - def main(): """ - This function executes all the steps to add the perturbation.The results if saving the perturbation - in the restart file. + Add a bi-dimensional random perturbation to the potential temperature field (STASH itemcode = 4) of a UM fields file. """ # Define all the variables @@ -249,37 +194,31 @@ def main(): # Create the output filename output_file = create_default_outname(args.ifile) - + # Create the random generator. random_generator = create_random_generator(args.seed) - # Skips the validation entirely for use on ESM15 due to river fields error - # Creates the mule field object - set_validation(args.validate) + # Skip mule validation if the "--validate" option is provided + if args.validate: + mule.DumpFile.validate = void_validation ff_raw = mule.DumpFile.from_file(args.ifile) - - # Set up the definitions of the grid the Dumpfile object doesn't have a way to do this? - nlon = 192 - nlat = 145 + # Remove the time series from the data to ensure mule will work ff = remove_timeseries(ff_raw) - # Creates a random perturbation array - perturbation = create_perturbation(args, random_obj, nlon, nlat) - - # Sets up the mule opertator to add the perturbation to the data - addperturbation = SetAdditionOperator(perturbation) - - # Loop through the fields to find the surface termperature + # loop through the fields for ifield, field in enumerate(ff.fields): + if is_field_to_perturb(field, STASH_THETA): + try: + ff.fields[ifield] = perturb_operator(field) + except NameError: # perturb_operator is not defined + # Only create the perturb_operator if it does not exist yet - # Checks the loop has reached the end of the data - if is_end_of_file(field.lbuser4, data_limit): - break - # Find the surface temperature field and add the perturbation - if field.lbuser4 == surface_temp_stash: - ff.fields[ifield] = addperturbation(field) + shape = field.get_data().shape + perturbation = create_perturbation(args.amplitude, random_generator, shape) + perturb_operator = AdditionOperator(perturbation) + ff.fields[ifield] = perturb_operator(field) ff.to_file(output_file) @@ -287,4 +226,3 @@ def main(): main() - From 1cb5fdce9a2e7e492fd02e80e81ea5c60cb9a436 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Thu, 21 Nov 2024 19:44:09 +1100 Subject: [PATCH 119/138] Update perturbIC_test.py --- tests/perturbIC_test.py | 189 ++++++++++++++++++---------------------- 1 file changed, 87 insertions(+), 102 deletions(-) diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index 5bfbc720..f5e256d7 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -1,6 +1,6 @@ import pytest import sys -from perturbIC import parse_args, set_seed, create_outfile, create_perturbation, is_end_of_file,do_perturb, SetAdditionOperator +from perturbIC import parse_args, create_random_generator, remove_timeseries, is_field_to_perturb, create_default_outname, create_perturbation, AdditionOperator from unittest.mock import Mock, MagicMock import numpy as np import numpy.random as rs @@ -9,10 +9,9 @@ @pytest.fixture def mock_command_line(): """ - This function create a callable command line input. + This function create a callable command line input - Returns - __________ + Outputs list - Command line arguements """ return ["perturbIC.py", "-a", "0.4", "-s", "23452", @@ -21,10 +20,9 @@ def mock_command_line(): @pytest.fixture def mock_perturbation(): """ - This function create a callable perturbation dimensions. + This function create a callable perturbation dimensions - Returns - __________ + Outputs nlon - int nlat - int """ @@ -37,32 +35,30 @@ def mock_perturbation(): @pytest.fixture def mock_metadata(): """ - This function create a callable metadata. + This function create a callable metadata - Returns - __________ + Outputs list - Command line arguements """ - metadata_index_false = 24 - metadata_index_true = -99 + # Mock fields with different lbuser4 values + field_theta = MagicMock() + field_not_theta = MagicMock() - end_of_data = -99 - - return metadata_index_false, metadata_index_true, end_of_data + # Correctly set the lbuser4 attribute + field_theta.lbuser4 = 4 + field_not_theta.lbuser4 = 56 + stash_code = 4 + return field_theta, field_not_theta, stash_code def test_parse_args(monkeypatch, mock_command_line): """ - This function tests the parse_args function with the fake commandline arguments. - - Parameters - __________ - fixture - A class of helpful methods for mock data + This function tests the parse_args function with the fake commandline arguments + Inputs + fixture - A class of helpful methods for mock data fixture - A list of command line arguements - - Returns - __________ + Outputs The results of assertion tests. """ @@ -70,26 +66,51 @@ def test_parse_args(monkeypatch, mock_command_line): args = parse_args() assert args.amplitude == 0.4 assert args.seed == 23452 - assert args.ifile == '~/example/path/to/the/file/restart_dump.astart' + assert args.ifile == "~/example/path/to/the/file/restart_dump.astart" -def test_creating_output_file(monkeypatch, mock_command_line): +def test_create_default_outname(monkeypatch, mock_command_line): """ - This function tests the creating the output filename. - - Parameters - __________ + This function tests the creating the output file name + Inputs fixture - A list of command line arguements - - Returns - __________ + Outputs The results of assertion tests. """ monkeypatch.setattr(sys, "argv", mock_command_line) args = parse_args() - output_filename = create_outfile(args) - print(output_filename) - assert output_filename == "~/example/path/to/the/file/restart_dump_perturbed.astart" + output_filename = create_default_outname(args.ifile) + #asssert output_filename == "~/example/path/to/the/file/restart_dump_perturbed.astart" + assert output_filename == "~/example/path/to/the/file/restart_dump.astart_perturbed" + +def test_remove_timeseries(): + + # Mock fields and their lbcode values + field1 = MagicMock() + field2 = MagicMock() + field3 = MagicMock() + field1.lbcode = 23 + field2.lbcode = 345 + field3.lbcode = 31320 + + # Mock the fields file + test_fields = MagicMock() + test_fields.fields = [field1, field2, field3] + + # Mock the copy method to return a new object (to simulate deep copy behavior) + copied_fields = MagicMock() + copied_fields.fields = test_fields.fields.copy() + test_fields.copy.return_value = copied_fields + + # Run the function + out_fields = remove_timeseries(test_fields) + + # Assertions + assert len(out_fields.fields) == 2 + assert field1 in out_fields.fields + assert field2 in out_fields.fields + assert field3 not in out_fields.fields + def test_create_perturbation(monkeypatch, mock_command_line, mock_perturbation): """ @@ -101,96 +122,60 @@ def test_create_perturbation(monkeypatch, mock_command_line, mock_perturbation): The results of assertion tests. """ - monkeypatch.setattr(sys, "argv", mock_command_line) - args = parse_args() - rs = set_seed(args) + amplitude = 0.4 + seed = 123 + rs = create_random_generator(seed) nlon, nlat = mock_perturbation - perturb = create_perturbation(args, rs, nlon, nlat) + perturb = create_perturbation(amplitude, rs, [nlat, nlon]) assert perturb.shape == (nlat,nlon) -def test_is_end_of_file_keep_going(mock_metadata): - """ - This function tests the detection of the edge of the data. - - Parameters - __________ - fixture - A fake list of arrays and a fake index - - Returns - __________ - The results of assertion tests. - """ - - metadata_index_false, metadata_index_true,end_of_data = mock_metadata - assert is_end_of_file(metadata_index_false, end_of_data) == False - assert is_end_of_file(metadata_index_true, end_of_data) == True +def test_is_field_to_perturb(mock_metadata): - - -def test_finding_field(mock_perturbation): """ - This function in the perturbIC.py is written to both check the itemcode when - it finds the correct item code to read the field and add the perturbation. + Tests the item code conditional - Parameters - __________ + Inputs fixture - A fake list of arrays and a fake index - - Returns - __________ + Outputs The results of assertion tests. """ - field_theta = Mock() - field_not_theta = Mock() - # Set up the real item code and itemcode inputs to test the conditional - stash_code = 4 - field_theta.lbuser4 = 4 - field_not_theta.lbuser4 = 3 + field_theta, field_not_theta, stash_code = mock_metadata + + # Assertions to verify the function's behavior + assert is_field_to_perturb(field_theta, stash_code) == True, "field_theta should match the stash_code" + assert is_field_to_perturb(field_not_theta, stash_code) == False, "field_not_theta should not match the stash_code" - # Testing if the perturb conditional works correctly and triggers for the right field - assert do_perturb(field_theta, stash_code) == True - assert do_perturb(field_not_theta, stash_code) == False def test_operator_initialization(): """ - This function test that the operator initializes with the correct perturbation. + Test the addition operator.. - Returns - ________ + Outputs The results of testing if the peturbation intialize worked """ - perturb = np.array([1, 2, 3]) - operator = SetAdditionOperator(perturb) - assert np.array_equal(operator.perturbation, perturb) - -def test_transform(): - """ - This function test the transform method of the SetAdditionOperator class - It creates a fake perturbationm and fake source data array then it sets - up the operator and performs the transformation - Returns - ________ - - Assertion is True if the resulting array is what is expected - - """ - perturb = np.array([34, 213, 654]) - source_data = np.array([200,234,453]) - - # Mock source_field + # Mock the source field source_field = MagicMock() - source_field.get_data.return_value = source_data # Mock get_data + source_field.get_data.return_value = np.array([[1, 2], [3, 4]]) - operator = SetAdditionOperator(perturb) - result = operator.transform(source_field, None) + # Mock the new field + new_field = MagicMock() + + # Array to add + array_to_add = np.array([[10, 20], [30, 40]]) + + # Create the operator + operator = AdditionOperator(array_to_add) - source_field.get_data.assert_called_once() # Ensure get_data is called - expected_result = source_data + perturb + # Test transform method + result = operator.transform(source_field, new_field) - assert np.array_equal(result, expected_result) + # Expected output + expected = np.array([[11, 22], [33, 44]]) + # Assertions + np.testing.assert_array_equal(result, expected) From 76fa86e92a98aab7983c7b4adfe73cafcf739733 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Tue, 26 Nov 2024 09:31:11 +1100 Subject: [PATCH 120/138] Create environment-dev.yml Condensing the environment files into one file. Update environment-dev.yml Update environment-dev.yml --- environment-dev.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 environment-dev.yml diff --git a/environment-dev.yml b/environment-dev.yml new file mode 100644 index 00000000..6014fbfe --- /dev/null +++ b/environment-dev.yml @@ -0,0 +1,17 @@ +name: umfile-utils-dev +channels: + - accessnri + - conda-forge + - coecms + - nodefaults +dependencies: + - python >=3.10, <=3.12 + - pytest + - xarray + - mule + - numpy < 2 + - versioneer + - ipykernel + - pytest-cov + - pip + From 5c6ca45adf4f5d3081993912f0cc0faf506bcea7 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Tue, 26 Nov 2024 09:43:46 +1100 Subject: [PATCH 121/138] Update pyproject.toml --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c05e7142..cb5be960 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,6 @@ authors = [ description = "Collection of tools for UM fieldsfiles." license = { file = "LICENSE" } keywords = ["UM", "UM utilities", "UM fields files", "umfile_utils"] - dynamic = ["version"] dependencies = [ "mule", "numpy <2", From 62f8501e029c8ea3e4b1c7b84cef82a94d0a04db Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Tue, 26 Nov 2024 11:46:42 +1100 Subject: [PATCH 122/138] Update perturbIC.py --- src/perturbIC.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index f44770df..5aec30b1 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -7,7 +7,7 @@ import argparse from numpy.random import PCG64, Generator import mule - +TIMESERIES_LBCODES = (31320, 31323) def parse_args(): """ From 2c4cd6840279e4436a354eaaf877519b5a6a94e3 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Tue, 26 Nov 2024 11:53:20 +1100 Subject: [PATCH 123/138] Update unit_testing_umfile_utils.yml --- .github/workflows/ unit_testing_umfile_utils.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/workflows/ unit_testing_umfile_utils.yml b/.github/workflows/ unit_testing_umfile_utils.yml index 68ee0cde..77405286 100644 --- a/.github/workflows/ unit_testing_umfile_utils.yml +++ b/.github/workflows/ unit_testing_umfile_utils.yml @@ -43,12 +43,3 @@ jobs: shell: bash -l {0} run: python -m pytest --cov=src --cov-report=html -s tests - - name: Generate coverage report - shell: bash -l {0} - run: coverage xml - - - name: Upload code coverage - uses: codecov/codecov-action@v4 - with: - token: ${{ secrets.codecov_token }} - files: ./coverage.xml From 7c87cc71574f57a19c52d34a55d1e59d5409b9e5 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Tue, 26 Nov 2024 11:56:12 +1100 Subject: [PATCH 124/138] Delete ci directory --- ci/environment-3.10.yml | 20 -------------------- ci/environment-3.11.yml | 25 ------------------------- 2 files changed, 45 deletions(-) delete mode 100644 ci/environment-3.10.yml delete mode 100644 ci/environment-3.11.yml diff --git a/ci/environment-3.10.yml b/ci/environment-3.10.yml deleted file mode 100644 index a8b4eeac..00000000 --- a/ci/environment-3.10.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: umfile-utils-dev -channels: - - accessnri - - conda-forge - - coecms - - nodefaults -dependencies: - - python >=3.10, <=3.12 - - cftime - - ecgtools>=2023.7.13 - - intake==0.7.0 - - intake-dataframe-catalog>=0.2.4 - - intake-esm>=2023.11.10 - - jsonschema - - pooch - - pre-commit - - pytest - - xarray - - mule - - pip diff --git a/ci/environment-3.11.yml b/ci/environment-3.11.yml deleted file mode 100644 index 648bed5e..00000000 --- a/ci/environment-3.11.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: umfiles-utils-test -channels: - - conda-forge - - accessnri - - defaults - - coecms -dependencies: - - python==3.11 - - cftime - - ecgtools>=2023.7.13 - - intake==0.7.0 - - intake-dataframe-catalog>=0.2.4 - - intake-esm>=2023.11.10 - - jsonschema - - pooch - - pre-commit - - pytest - - mule - - xarray - - pip - - pip: - - codecov - - pytest-cov - - six - From 921cbb1487595f9f7775018aebe77ee4509729df Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Tue, 26 Nov 2024 11:56:41 +1100 Subject: [PATCH 125/138] Delete versioneer.py --- versioneer.py | 2264 ------------------------------------------------- 1 file changed, 2264 deletions(-) delete mode 100644 versioneer.py diff --git a/versioneer.py b/versioneer.py deleted file mode 100644 index 8f14259c..00000000 --- a/versioneer.py +++ /dev/null @@ -1,2264 +0,0 @@ -# Version: 0.28 - -"""The Versioneer - like a rocketeer, but for versions. - -The Versioneer -============== - -* like a rocketeer, but for versions! -* https://github.com/python-versioneer/python-versioneer -* Brian Warner -* License: Public Domain (Unlicense) -* Compatible with: Python 3.7, 3.8, 3.9, 3.10 and pypy3 -* [![Latest Version][pypi-image]][pypi-url] -* [![Build Status][travis-image]][travis-url] - -This is a tool for managing a recorded version number in setuptools-based -python projects. The goal is to remove the tedious and error-prone "update -the embedded version string" step from your release process. Making a new -release should be as easy as recording a new tag in your version-control -system, and maybe making new tarballs. - - -## Quick Install - -Versioneer provides two installation modes. The "classic" vendored mode installs -a copy of versioneer into your repository. The experimental build-time dependency mode -is intended to allow you to skip this step and simplify the process of upgrading. - -### Vendored mode - -* `pip install versioneer` to somewhere in your $PATH - * A [conda-forge recipe](https://github.com/conda-forge/versioneer-feedstock) is - available, so you can also use `conda install -c conda-forge versioneer` -* add a `[tool.versioneer]` section to your `pyproject.toml` or a - `[versioneer]` section to your `setup.cfg` (see [Install](INSTALL.md)) - * Note that you will need to add `tomli; python_version < "3.11"` to your - build-time dependencies if you use `pyproject.toml` -* run `versioneer install --vendor` in your source tree, commit the results -* verify version information with `python setup.py version` - -### Build-time dependency mode - -* `pip install versioneer` to somewhere in your $PATH - * A [conda-forge recipe](https://github.com/conda-forge/versioneer-feedstock) is - available, so you can also use `conda install -c conda-forge versioneer` -* add a `[tool.versioneer]` section to your `pyproject.toml` or a - `[versioneer]` section to your `setup.cfg` (see [Install](INSTALL.md)) -* add `versioneer` (with `[toml]` extra, if configuring in `pyproject.toml`) - to the `requires` key of the `build-system` table in `pyproject.toml`: - ```toml - [build-system] - requires = ["setuptools", "versioneer[toml]"] - build-backend = "setuptools.build_meta" - ``` -* run `versioneer install --no-vendor` in your source tree, commit the results -* verify version information with `python setup.py version` - -## Version Identifiers - -Source trees come from a variety of places: - -* a version-control system checkout (mostly used by developers) -* a nightly tarball, produced by build automation -* a snapshot tarball, produced by a web-based VCS browser, like github's - "tarball from tag" feature -* a release tarball, produced by "setup.py sdist", distributed through PyPI - -Within each source tree, the version identifier (either a string or a number, -this tool is format-agnostic) can come from a variety of places: - -* ask the VCS tool itself, e.g. "git describe" (for checkouts), which knows - about recent "tags" and an absolute revision-id -* the name of the directory into which the tarball was unpacked -* an expanded VCS keyword ($Id$, etc) -* a `_version.py` created by some earlier build step - -For released software, the version identifier is closely related to a VCS -tag. Some projects use tag names that include more than just the version -string (e.g. "myproject-1.2" instead of just "1.2"), in which case the tool -needs to strip the tag prefix to extract the version identifier. For -unreleased software (between tags), the version identifier should provide -enough information to help developers recreate the same tree, while also -giving them an idea of roughly how old the tree is (after version 1.2, before -version 1.3). Many VCS systems can report a description that captures this, -for example `git describe --tags --dirty --always` reports things like -"0.7-1-g574ab98-dirty" to indicate that the checkout is one revision past the -0.7 tag, has a unique revision id of "574ab98", and is "dirty" (it has -uncommitted changes). - -The version identifier is used for multiple purposes: - -* to allow the module to self-identify its version: `myproject.__version__` -* to choose a name and prefix for a 'setup.py sdist' tarball - -## Theory of Operation - -Versioneer works by adding a special `_version.py` file into your source -tree, where your `__init__.py` can import it. This `_version.py` knows how to -dynamically ask the VCS tool for version information at import time. - -`_version.py` also contains `$Revision$` markers, and the installation -process marks `_version.py` to have this marker rewritten with a tag name -during the `git archive` command. As a result, generated tarballs will -contain enough information to get the proper version. - -To allow `setup.py` to compute a version too, a `versioneer.py` is added to -the top level of your source tree, next to `setup.py` and the `setup.cfg` -that configures it. This overrides several distutils/setuptools commands to -compute the version when invoked, and changes `setup.py build` and `setup.py -sdist` to replace `_version.py` with a small static file that contains just -the generated version data. - -## Installation - -See [INSTALL.md](./INSTALL.md) for detailed installation instructions. - -## Version-String Flavors - -Code which uses Versioneer can learn about its version string at runtime by -importing `_version` from your main `__init__.py` file and running the -`get_versions()` function. From the "outside" (e.g. in `setup.py`), you can -import the top-level `versioneer.py` and run `get_versions()`. - -Both functions return a dictionary with different flavors of version -information: - -* `['version']`: A condensed version string, rendered using the selected - style. This is the most commonly used value for the project's version - string. The default "pep440" style yields strings like `0.11`, - `0.11+2.g1076c97`, or `0.11+2.g1076c97.dirty`. See the "Styles" section - below for alternative styles. - -* `['full-revisionid']`: detailed revision identifier. For Git, this is the - full SHA1 commit id, e.g. "1076c978a8d3cfc70f408fe5974aa6c092c949ac". - -* `['date']`: Date and time of the latest `HEAD` commit. For Git, it is the - commit date in ISO 8601 format. This will be None if the date is not - available. - -* `['dirty']`: a boolean, True if the tree has uncommitted changes. Note that - this is only accurate if run in a VCS checkout, otherwise it is likely to - be False or None - -* `['error']`: if the version string could not be computed, this will be set - to a string describing the problem, otherwise it will be None. It may be - useful to throw an exception in setup.py if this is set, to avoid e.g. - creating tarballs with a version string of "unknown". - -Some variants are more useful than others. Including `full-revisionid` in a -bug report should allow developers to reconstruct the exact code being tested -(or indicate the presence of local changes that should be shared with the -developers). `version` is suitable for display in an "about" box or a CLI -`--version` output: it can be easily compared against release notes and lists -of bugs fixed in various releases. - -The installer adds the following text to your `__init__.py` to place a basic -version in `YOURPROJECT.__version__`: - - from ._version import get_versions - __version__ = get_versions()['version'] - del get_versions - -## Styles - -The setup.cfg `style=` configuration controls how the VCS information is -rendered into a version string. - -The default style, "pep440", produces a PEP440-compliant string, equal to the -un-prefixed tag name for actual releases, and containing an additional "local -version" section with more detail for in-between builds. For Git, this is -TAG[+DISTANCE.gHEX[.dirty]] , using information from `git describe --tags ---dirty --always`. For example "0.11+2.g1076c97.dirty" indicates that the -tree is like the "1076c97" commit but has uncommitted changes (".dirty"), and -that this commit is two revisions ("+2") beyond the "0.11" tag. For released -software (exactly equal to a known tag), the identifier will only contain the -stripped tag, e.g. "0.11". - -Other styles are available. See [details.md](details.md) in the Versioneer -source tree for descriptions. - -## Debugging - -Versioneer tries to avoid fatal errors: if something goes wrong, it will tend -to return a version of "0+unknown". To investigate the problem, run `setup.py -version`, which will run the version-lookup code in a verbose mode, and will -display the full contents of `get_versions()` (including the `error` string, -which may help identify what went wrong). - -## Known Limitations - -Some situations are known to cause problems for Versioneer. This details the -most significant ones. More can be found on Github -[issues page](https://github.com/python-versioneer/python-versioneer/issues). - -### Subprojects - -Versioneer has limited support for source trees in which `setup.py` is not in -the root directory (e.g. `setup.py` and `.git/` are *not* siblings). The are -two common reasons why `setup.py` might not be in the root: - -* Source trees which contain multiple subprojects, such as - [Buildbot](https://github.com/buildbot/buildbot), which contains both - "master" and "slave" subprojects, each with their own `setup.py`, - `setup.cfg`, and `tox.ini`. Projects like these produce multiple PyPI - distributions (and upload multiple independently-installable tarballs). -* Source trees whose main purpose is to contain a C library, but which also - provide bindings to Python (and perhaps other languages) in subdirectories. - -Versioneer will look for `.git` in parent directories, and most operations -should get the right version string. However `pip` and `setuptools` have bugs -and implementation details which frequently cause `pip install .` from a -subproject directory to fail to find a correct version string (so it usually -defaults to `0+unknown`). - -`pip install --editable .` should work correctly. `setup.py install` might -work too. - -Pip-8.1.1 is known to have this problem, but hopefully it will get fixed in -some later version. - -[Bug #38](https://github.com/python-versioneer/python-versioneer/issues/38) is tracking -this issue. The discussion in -[PR #61](https://github.com/python-versioneer/python-versioneer/pull/61) describes the -issue from the Versioneer side in more detail. -[pip PR#3176](https://github.com/pypa/pip/pull/3176) and -[pip PR#3615](https://github.com/pypa/pip/pull/3615) contain work to improve -pip to let Versioneer work correctly. - -Versioneer-0.16 and earlier only looked for a `.git` directory next to the -`setup.cfg`, so subprojects were completely unsupported with those releases. - -### Editable installs with setuptools <= 18.5 - -`setup.py develop` and `pip install --editable .` allow you to install a -project into a virtualenv once, then continue editing the source code (and -test) without re-installing after every change. - -"Entry-point scripts" (`setup(entry_points={"console_scripts": ..})`) are a -convenient way to specify executable scripts that should be installed along -with the python package. - -These both work as expected when using modern setuptools. When using -setuptools-18.5 or earlier, however, certain operations will cause -`pkg_resources.DistributionNotFound` errors when running the entrypoint -script, which must be resolved by re-installing the package. This happens -when the install happens with one version, then the egg_info data is -regenerated while a different version is checked out. Many setup.py commands -cause egg_info to be rebuilt (including `sdist`, `wheel`, and installing into -a different virtualenv), so this can be surprising. - -[Bug #83](https://github.com/python-versioneer/python-versioneer/issues/83) describes -this one, but upgrading to a newer version of setuptools should probably -resolve it. - - -## Updating Versioneer - -To upgrade your project to a new release of Versioneer, do the following: - -* install the new Versioneer (`pip install -U versioneer` or equivalent) -* edit `setup.cfg` and `pyproject.toml`, if necessary, - to include any new configuration settings indicated by the release notes. - See [UPGRADING](./UPGRADING.md) for details. -* re-run `versioneer install --[no-]vendor` in your source tree, to replace - `SRC/_version.py` -* commit any changed files - -## Future Directions - -This tool is designed to make it easily extended to other version-control -systems: all VCS-specific components are in separate directories like -src/git/ . The top-level `versioneer.py` script is assembled from these -components by running make-versioneer.py . In the future, make-versioneer.py -will take a VCS name as an argument, and will construct a version of -`versioneer.py` that is specific to the given VCS. It might also take the -configuration arguments that are currently provided manually during -installation by editing setup.py . Alternatively, it might go the other -direction and include code from all supported VCS systems, reducing the -number of intermediate scripts. - -## Similar projects - -* [setuptools_scm](https://github.com/pypa/setuptools_scm/) - a non-vendored build-time - dependency -* [minver](https://github.com/jbweston/miniver) - a lightweight reimplementation of - versioneer -* [versioningit](https://github.com/jwodder/versioningit) - a PEP 518-based setuptools - plugin - -## License - -To make Versioneer easier to embed, all its code is dedicated to the public -domain. The `_version.py` that it creates is also in the public domain. -Specifically, both are released under the "Unlicense", as described in -https://unlicense.org/. - -[pypi-image]: https://img.shields.io/pypi/v/versioneer.svg -[pypi-url]: https://pypi.python.org/pypi/versioneer/ -[travis-image]: -https://img.shields.io/travis/com/python-versioneer/python-versioneer.svg -[travis-url]: https://travis-ci.com/github/python-versioneer/python-versioneer - -""" -# pylint:disable=invalid-name,import-outside-toplevel,missing-function-docstring -# pylint:disable=missing-class-docstring,too-many-branches,too-many-statements -# pylint:disable=raise-missing-from,too-many-lines,too-many-locals,import-error -# pylint:disable=too-few-public-methods,redefined-outer-name,consider-using-with -# pylint:disable=attribute-defined-outside-init,too-many-arguments - -import configparser -import errno -import functools -import json -import os -import re -import subprocess -import sys -from pathlib import Path -from typing import Callable - -have_tomllib = True -if sys.version_info >= (3, 11): - import tomllib -else: - try: - import tomli as tomllib - except ImportError: - have_tomllib = False - - -class VersioneerConfig: - """Container for Versioneer configuration parameters.""" - - -def get_root(): - """Get the project root directory. - - We require that all commands are run from the project root, i.e. the - directory that contains setup.py, setup.cfg, and versioneer.py . - """ - root = os.path.realpath(os.path.abspath(os.getcwd())) - setup_py = os.path.join(root, "setup.py") - versioneer_py = os.path.join(root, "versioneer.py") - if not (os.path.exists(setup_py) or os.path.exists(versioneer_py)): - # allow 'python path/to/setup.py COMMAND' - root = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0]))) - setup_py = os.path.join(root, "setup.py") - versioneer_py = os.path.join(root, "versioneer.py") - if not (os.path.exists(setup_py) or os.path.exists(versioneer_py)): - err = ( - "Versioneer was unable to run the project root directory. " - "Versioneer requires setup.py to be executed from " - "its immediate directory (like 'python setup.py COMMAND'), " - "or in a way that lets it use sys.argv[0] to find the root " - "(like 'python path/to/setup.py COMMAND')." - ) - raise VersioneerBadRootError(err) - try: - # Certain runtime workflows (setup.py install/develop in a setuptools - # tree) execute all dependencies in a single python process, so - # "versioneer" may be imported multiple times, and python's shared - # module-import table will cache the first one. So we can't use - # os.path.dirname(__file__), as that will find whichever - # versioneer.py was first imported, even in later projects. - my_path = os.path.realpath(os.path.abspath(__file__)) - me_dir = os.path.normcase(os.path.splitext(my_path)[0]) - vsr_dir = os.path.normcase(os.path.splitext(versioneer_py)[0]) - if me_dir != vsr_dir and "VERSIONEER_PEP518" not in globals(): - print( - "Warning: build in %s is using versioneer.py from %s" - % (os.path.dirname(my_path), versioneer_py) - ) - except NameError: - pass - return root - - -def get_config_from_root(root): - """Read the project setup.cfg file to determine Versioneer config.""" - # This might raise OSError (if setup.cfg is missing), or - # configparser.NoSectionError (if it lacks a [versioneer] section), or - # configparser.NoOptionError (if it lacks "VCS="). See the docstring at - # the top of versioneer.py for instructions on writing your setup.cfg . - root = Path(root) - pyproject_toml = root / "pyproject.toml" - setup_cfg = root / "setup.cfg" - section = None - if pyproject_toml.exists() and have_tomllib: - try: - with open(pyproject_toml, "rb") as fobj: - pp = tomllib.load(fobj) - section = pp["tool"]["versioneer"] - except (tomllib.TOMLDecodeError, KeyError): - pass - if not section: - parser = configparser.ConfigParser() - with open(setup_cfg) as cfg_file: - parser.read_file(cfg_file) - parser.get("versioneer", "VCS") # raise error if missing - - section = parser["versioneer"] - - cfg = VersioneerConfig() - cfg.VCS = section["VCS"] - cfg.style = section.get("style", "") - cfg.versionfile_source = section.get("versionfile_source") - cfg.versionfile_build = section.get("versionfile_build") - cfg.tag_prefix = section.get("tag_prefix") - if cfg.tag_prefix in ("''", '""', None): - cfg.tag_prefix = "" - cfg.parentdir_prefix = section.get("parentdir_prefix") - cfg.verbose = section.get("verbose") - return cfg - - -class NotThisMethod(Exception): - """Exception raised if a method is not valid for the current scenario.""" - - -# these dictionaries contain VCS-specific tools -LONG_VERSION_PY: dict[str, str] = {} -HANDLERS: dict[str, dict[str, Callable]] = {} - - -def register_vcs_handler(vcs, method): # decorator - """Create decorator to mark a method as the handler of a VCS.""" - - def decorate(f): - """Store f in HANDLERS[vcs][method].""" - HANDLERS.setdefault(vcs, {})[method] = f - return f - - return decorate - - -def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env=None): - """Call the given command(s).""" - assert isinstance(commands, list) - process = None - - popen_kwargs = {} - if sys.platform == "win32": - # This hides the console window if pythonw.exe is used - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - popen_kwargs["startupinfo"] = startupinfo - - for command in commands: - try: - dispcmd = str([command] + args) - # remember shell=False, so use git.cmd on windows, not just git - process = subprocess.Popen( - [command] + args, - cwd=cwd, - env=env, - stdout=subprocess.PIPE, - stderr=(subprocess.PIPE if hide_stderr else None), - **popen_kwargs, - ) - break - except OSError: - e = sys.exc_info()[1] - if e.errno == errno.ENOENT: - continue - if verbose: - print("unable to run %s" % dispcmd) - print(e) - return None, None - else: - if verbose: - print(f"unable to find command, tried {commands}") - return None, None - stdout = process.communicate()[0].strip().decode() - if process.returncode != 0: - if verbose: - print("unable to run %s (error)" % dispcmd) - print("stdout was %s" % stdout) - return None, process.returncode - return stdout, process.returncode - - -LONG_VERSION_PY[ - "git" -] = r''' -# This file helps to compute a version number in source trees obtained from -# git-archive tarball (such as those provided by githubs download-from-tag -# feature). Distribution tarballs (built by setup.py sdist) and build -# directories (produced by setup.py build) will contain a much shorter file -# that just contains the computed version number. - -# This file is released into the public domain. -# Generated by versioneer-0.28 -# https://github.com/python-versioneer/python-versioneer - -"""Git implementation of _version.py.""" - -import errno -import os -import re -import subprocess -import sys -from typing import Callable, Dict -import functools - - -def get_keywords(): - """Get the keywords needed to look up the version information.""" - # these strings will be replaced by git during git-archive. - # setup.py/versioneer.py will grep for the variable names, so they must - # each be defined on a line of their own. _version.py will just call - # get_keywords(). - git_refnames = "%(DOLLAR)sFormat:%%d%(DOLLAR)s" - git_full = "%(DOLLAR)sFormat:%%H%(DOLLAR)s" - git_date = "%(DOLLAR)sFormat:%%ci%(DOLLAR)s" - keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} - return keywords - - -class VersioneerConfig: - """Container for Versioneer configuration parameters.""" - - -def get_config(): - """Create, populate and return the VersioneerConfig() object.""" - # these strings are filled in when 'setup.py versioneer' creates - # _version.py - cfg = VersioneerConfig() - cfg.VCS = "git" - cfg.style = "%(STYLE)s" - cfg.tag_prefix = "%(TAG_PREFIX)s" - cfg.parentdir_prefix = "%(PARENTDIR_PREFIX)s" - cfg.versionfile_source = "%(VERSIONFILE_SOURCE)s" - cfg.verbose = False - return cfg - - -class NotThisMethod(Exception): - """Exception raised if a method is not valid for the current scenario.""" - - -LONG_VERSION_PY: Dict[str, str] = {} -HANDLERS: Dict[str, Dict[str, Callable]] = {} - - -def register_vcs_handler(vcs, method): # decorator - """Create decorator to mark a method as the handler of a VCS.""" - def decorate(f): - """Store f in HANDLERS[vcs][method].""" - if vcs not in HANDLERS: - HANDLERS[vcs] = {} - HANDLERS[vcs][method] = f - return f - return decorate - - -def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, - env=None): - """Call the given command(s).""" - assert isinstance(commands, list) - process = None - - popen_kwargs = {} - if sys.platform == "win32": - # This hides the console window if pythonw.exe is used - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - popen_kwargs["startupinfo"] = startupinfo - - for command in commands: - try: - dispcmd = str([command] + args) - # remember shell=False, so use git.cmd on windows, not just git - process = subprocess.Popen([command] + args, cwd=cwd, env=env, - stdout=subprocess.PIPE, - stderr=(subprocess.PIPE if hide_stderr - else None), **popen_kwargs) - break - except OSError: - e = sys.exc_info()[1] - if e.errno == errno.ENOENT: - continue - if verbose: - print("unable to run %%s" %% dispcmd) - print(e) - return None, None - else: - if verbose: - print("unable to find command, tried %%s" %% (commands,)) - return None, None - stdout = process.communicate()[0].strip().decode() - if process.returncode != 0: - if verbose: - print("unable to run %%s (error)" %% dispcmd) - print("stdout was %%s" %% stdout) - return None, process.returncode - return stdout, process.returncode - - -def versions_from_parentdir(parentdir_prefix, root, verbose): - """Try to determine the version from the parent directory name. - - Source tarballs conventionally unpack into a directory that includes both - the project name and a version string. We will also support searching up - two directory levels for an appropriately named parent directory - """ - rootdirs = [] - - for _ in range(3): - dirname = os.path.basename(root) - if dirname.startswith(parentdir_prefix): - return {"version": dirname[len(parentdir_prefix):], - "full-revisionid": None, - "dirty": False, "error": None, "date": None} - rootdirs.append(root) - root = os.path.dirname(root) # up a level - - if verbose: - print("Tried directories %%s but none started with prefix %%s" %% - (str(rootdirs), parentdir_prefix)) - raise NotThisMethod("rootdir doesn't start with parentdir_prefix") - - -@register_vcs_handler("git", "get_keywords") -def git_get_keywords(versionfile_abs): - """Extract version information from the given file.""" - # the code embedded in _version.py can just fetch the value of these - # keywords. When used from setup.py, we don't want to import _version.py, - # so we do it with a regexp instead. This function is not used from - # _version.py. - keywords = {} - try: - with open(versionfile_abs, "r") as fobj: - for line in fobj: - if line.strip().startswith("git_refnames ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["refnames"] = mo.group(1) - if line.strip().startswith("git_full ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["full"] = mo.group(1) - if line.strip().startswith("git_date ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["date"] = mo.group(1) - except OSError: - pass - return keywords - - -@register_vcs_handler("git", "keywords") -def git_versions_from_keywords(keywords, tag_prefix, verbose): - """Get version information from git keywords.""" - if "refnames" not in keywords: - raise NotThisMethod("Short version file found") - date = keywords.get("date") - if date is not None: - # Use only the last line. Previous lines may contain GPG signature - # information. - date = date.splitlines()[-1] - - # git-2.2.0 added "%%cI", which expands to an ISO-8601 -compliant - # datestamp. However we prefer "%%ci" (which expands to an "ISO-8601 - # -like" string, which we must then edit to make compliant), because - # it's been around since git-1.5.3, and it's too difficult to - # discover which version we're using, or to work around using an - # older one. - date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) - refnames = keywords["refnames"].strip() - if refnames.startswith("$Format"): - if verbose: - print("keywords are unexpanded, not using") - raise NotThisMethod("unexpanded keywords, not a git-archive tarball") - refs = {r.strip() for r in refnames.strip("()").split(",")} - # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of - # just "foo-1.0". If we see a "tag: " prefix, prefer those. - TAG = "tag: " - tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} - if not tags: - # Either we're using git < 1.8.3, or there really are no tags. We use - # a heuristic: assume all version tags have a digit. The old git %%d - # expansion behaves like git log --decorate=short and strips out the - # refs/heads/ and refs/tags/ prefixes that would let us distinguish - # between branches and tags. By ignoring refnames without digits, we - # filter out many common branch names like "release" and - # "stabilization", as well as "HEAD" and "master". - tags = {r for r in refs if re.search(r'\d', r)} - if verbose: - print("discarding '%%s', no digits" %% ",".join(refs - tags)) - if verbose: - print("likely tags: %%s" %% ",".join(sorted(tags))) - for ref in sorted(tags): - # sorting will prefer e.g. "2.0" over "2.0rc1" - if ref.startswith(tag_prefix): - r = ref[len(tag_prefix):] - # Filter out refs that exactly match prefix or that don't start - # with a number once the prefix is stripped (mostly a concern - # when prefix is '') - if not re.match(r'\d', r): - continue - if verbose: - print("picking %%s" %% r) - return {"version": r, - "full-revisionid": keywords["full"].strip(), - "dirty": False, "error": None, - "date": date} - # no suitable tags, so version is "0+unknown", but full hex is still there - if verbose: - print("no suitable tags, using unknown + full revision id") - return {"version": "0+unknown", - "full-revisionid": keywords["full"].strip(), - "dirty": False, "error": "no suitable tags", "date": None} - - -@register_vcs_handler("git", "pieces_from_vcs") -def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command): - """Get version from 'git describe' in the root of the source tree. - - This only gets called if the git-archive 'subst' keywords were *not* - expanded, and _version.py hasn't already been rewritten with a short - version string, meaning we're inside a checked out source tree. - """ - GITS = ["git"] - if sys.platform == "win32": - GITS = ["git.cmd", "git.exe"] - - # GIT_DIR can interfere with correct operation of Versioneer. - # It may be intended to be passed to the Versioneer-versioned project, - # but that should not change where we get our version from. - env = os.environ.copy() - env.pop("GIT_DIR", None) - runner = functools.partial(runner, env=env) - - _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, - hide_stderr=not verbose) - if rc != 0: - if verbose: - print("Directory %%s not under git control" %% root) - raise NotThisMethod("'git rev-parse --git-dir' returned error") - - # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] - # if there isn't one, this yields HEX[-dirty] (no NUM) - describe_out, rc = runner(GITS, [ - "describe", "--tags", "--dirty", "--always", "--long", - "--match", f"{tag_prefix}[[:digit:]]*" - ], cwd=root) - # --long was added in git-1.5.5 - if describe_out is None: - raise NotThisMethod("'git describe' failed") - describe_out = describe_out.strip() - full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) - if full_out is None: - raise NotThisMethod("'git rev-parse' failed") - full_out = full_out.strip() - - pieces = {} - pieces["long"] = full_out - pieces["short"] = full_out[:7] # maybe improved later - pieces["error"] = None - - branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], - cwd=root) - # --abbrev-ref was added in git-1.6.3 - if rc != 0 or branch_name is None: - raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") - branch_name = branch_name.strip() - - if branch_name == "HEAD": - # If we aren't exactly on a branch, pick a branch which represents - # the current commit. If all else fails, we are on a branchless - # commit. - branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) - # --contains was added in git-1.5.4 - if rc != 0 or branches is None: - raise NotThisMethod("'git branch --contains' returned error") - branches = branches.split("\n") - - # Remove the first line if we're running detached - if "(" in branches[0]: - branches.pop(0) - - # Strip off the leading "* " from the list of branches. - branches = [branch[2:] for branch in branches] - if "master" in branches: - branch_name = "master" - elif not branches: - branch_name = None - else: - # Pick the first branch that is returned. Good or bad. - branch_name = branches[0] - - pieces["branch"] = branch_name - - # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] - # TAG might have hyphens. - git_describe = describe_out - - # look for -dirty suffix - dirty = git_describe.endswith("-dirty") - pieces["dirty"] = dirty - if dirty: - git_describe = git_describe[:git_describe.rindex("-dirty")] - - # now we have TAG-NUM-gHEX or HEX - - if "-" in git_describe: - # TAG-NUM-gHEX - mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) - if not mo: - # unparsable. Maybe git-describe is misbehaving? - pieces["error"] = ("unable to parse git-describe output: '%%s'" - %% describe_out) - return pieces - - # tag - full_tag = mo.group(1) - if not full_tag.startswith(tag_prefix): - if verbose: - fmt = "tag '%%s' doesn't start with prefix '%%s'" - print(fmt %% (full_tag, tag_prefix)) - pieces["error"] = ("tag '%%s' doesn't start with prefix '%%s'" - %% (full_tag, tag_prefix)) - return pieces - pieces["closest-tag"] = full_tag[len(tag_prefix):] - - # distance: number of commits since tag - pieces["distance"] = int(mo.group(2)) - - # commit: short hex revision ID - pieces["short"] = mo.group(3) - - else: - # HEX: no tags - pieces["closest-tag"] = None - out, rc = runner(GITS, ["rev-list", "HEAD", "--left-right"], cwd=root) - pieces["distance"] = len(out.split()) # total number of commits - - # commit date: see ISO-8601 comment in git_versions_from_keywords() - date = runner(GITS, ["show", "-s", "--format=%%ci", "HEAD"], cwd=root)[0].strip() - # Use only the last line. Previous lines may contain GPG signature - # information. - date = date.splitlines()[-1] - pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) - - return pieces - - -def plus_or_dot(pieces): - """Return a + if we don't already have one, else return a .""" - if "+" in pieces.get("closest-tag", ""): - return "." - return "+" - - -def render_pep440(pieces): - """Build up version string, with post-release "local version identifier". - - Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you - get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty - - Exceptions: - 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += plus_or_dot(pieces) - rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0+untagged.%%d.g%%s" %% (pieces["distance"], - pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def render_pep440_branch(pieces): - """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . - - The ".dev0" means not master branch. Note that .dev0 sorts backwards - (a feature branch will appear "older" than the master branch). - - Exceptions: - 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0" - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += "+untagged.%%d.g%%s" %% (pieces["distance"], - pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def pep440_split_post(ver): - """Split pep440 version string at the post-release segment. - - Returns the release segments before the post-release and the - post-release version number (or -1 if no post-release segment is present). - """ - vc = str.split(ver, ".post") - return vc[0], int(vc[1] or 0) if len(vc) == 2 else None - - -def render_pep440_pre(pieces): - """TAG[.postN.devDISTANCE] -- No -dirty. - - Exceptions: - 1: no tags. 0.post0.devDISTANCE - """ - if pieces["closest-tag"]: - if pieces["distance"]: - # update the post release segment - tag_version, post_version = pep440_split_post(pieces["closest-tag"]) - rendered = tag_version - if post_version is not None: - rendered += ".post%%d.dev%%d" %% (post_version + 1, pieces["distance"]) - else: - rendered += ".post0.dev%%d" %% (pieces["distance"]) - else: - # no commits, use the tag as the version - rendered = pieces["closest-tag"] - else: - # exception #1 - rendered = "0.post0.dev%%d" %% pieces["distance"] - return rendered - - -def render_pep440_post(pieces): - """TAG[.postDISTANCE[.dev0]+gHEX] . - - The ".dev0" means dirty. Note that .dev0 sorts backwards - (a dirty tree will appear "older" than the corresponding clean one), - but you shouldn't be releasing software with -dirty anyways. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%%d" %% pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "g%%s" %% pieces["short"] - else: - # exception #1 - rendered = "0.post%%d" %% pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - rendered += "+g%%s" %% pieces["short"] - return rendered - - -def render_pep440_post_branch(pieces): - """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . - - The ".dev0" means not master branch. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%%d" %% pieces["distance"] - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "g%%s" %% pieces["short"] - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0.post%%d" %% pieces["distance"] - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += "+g%%s" %% pieces["short"] - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def render_pep440_old(pieces): - """TAG[.postDISTANCE[.dev0]] . - - The ".dev0" means dirty. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%%d" %% pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - else: - # exception #1 - rendered = "0.post%%d" %% pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - return rendered - - -def render_git_describe(pieces): - """TAG[-DISTANCE-gHEX][-dirty]. - - Like 'git describe --tags --dirty --always'. - - Exceptions: - 1: no tags. HEX[-dirty] (note: no 'g' prefix) - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"]: - rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) - else: - # exception #1 - rendered = pieces["short"] - if pieces["dirty"]: - rendered += "-dirty" - return rendered - - -def render_git_describe_long(pieces): - """TAG-DISTANCE-gHEX[-dirty]. - - Like 'git describe --tags --dirty --always -long'. - The distance/hash is unconditional. - - Exceptions: - 1: no tags. HEX[-dirty] (note: no 'g' prefix) - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) - else: - # exception #1 - rendered = pieces["short"] - if pieces["dirty"]: - rendered += "-dirty" - return rendered - - -def render(pieces, style): - """Render the given version pieces into the requested style.""" - if pieces["error"]: - return {"version": "unknown", - "full-revisionid": pieces.get("long"), - "dirty": None, - "error": pieces["error"], - "date": None} - - if not style or style == "default": - style = "pep440" # the default - - if style == "pep440": - rendered = render_pep440(pieces) - elif style == "pep440-branch": - rendered = render_pep440_branch(pieces) - elif style == "pep440-pre": - rendered = render_pep440_pre(pieces) - elif style == "pep440-post": - rendered = render_pep440_post(pieces) - elif style == "pep440-post-branch": - rendered = render_pep440_post_branch(pieces) - elif style == "pep440-old": - rendered = render_pep440_old(pieces) - elif style == "git-describe": - rendered = render_git_describe(pieces) - elif style == "git-describe-long": - rendered = render_git_describe_long(pieces) - else: - raise ValueError("unknown style '%%s'" %% style) - - return {"version": rendered, "full-revisionid": pieces["long"], - "dirty": pieces["dirty"], "error": None, - "date": pieces.get("date")} - - -def get_versions(): - """Get version information or return default if unable to do so.""" - # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have - # __file__, we can work backwards from there to the root. Some - # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which - # case we can only use expanded keywords. - - cfg = get_config() - verbose = cfg.verbose - - try: - return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, - verbose) - except NotThisMethod: - pass - - try: - root = os.path.realpath(__file__) - # versionfile_source is the relative path from the top of the source - # tree (where the .git directory might live) to this file. Invert - # this to find the root from __file__. - for _ in cfg.versionfile_source.split('/'): - root = os.path.dirname(root) - except NameError: - return {"version": "0+unknown", "full-revisionid": None, - "dirty": None, - "error": "unable to find root of source tree", - "date": None} - - try: - pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) - return render(pieces, cfg.style) - except NotThisMethod: - pass - - try: - if cfg.parentdir_prefix: - return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) - except NotThisMethod: - pass - - return {"version": "0+unknown", "full-revisionid": None, - "dirty": None, - "error": "unable to compute version", "date": None} -''' - - -@register_vcs_handler("git", "get_keywords") -def git_get_keywords(versionfile_abs): - """Extract version information from the given file.""" - # the code embedded in _version.py can just fetch the value of these - # keywords. When used from setup.py, we don't want to import _version.py, - # so we do it with a regexp instead. This function is not used from - # _version.py. - keywords = {} - try: - with open(versionfile_abs) as fobj: - for line in fobj: - if line.strip().startswith("git_refnames ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["refnames"] = mo.group(1) - if line.strip().startswith("git_full ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["full"] = mo.group(1) - if line.strip().startswith("git_date ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["date"] = mo.group(1) - except OSError: - pass - return keywords - - -@register_vcs_handler("git", "keywords") -def git_versions_from_keywords(keywords, tag_prefix, verbose): - """Get version information from git keywords.""" - if "refnames" not in keywords: - raise NotThisMethod("Short version file found") - date = keywords.get("date") - if date is not None: - # Use only the last line. Previous lines may contain GPG signature - # information. - date = date.splitlines()[-1] - - # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant - # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 - # -like" string, which we must then edit to make compliant), because - # it's been around since git-1.5.3, and it's too difficult to - # discover which version we're using, or to work around using an - # older one. - date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) - refnames = keywords["refnames"].strip() - if refnames.startswith("$Format"): - if verbose: - print("keywords are unexpanded, not using") - raise NotThisMethod("unexpanded keywords, not a git-archive tarball") - refs = {r.strip() for r in refnames.strip("()").split(",")} - # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of - # just "foo-1.0". If we see a "tag: " prefix, prefer those. - TAG = "tag: " - tags = {r[len(TAG) :] for r in refs if r.startswith(TAG)} - if not tags: - # Either we're using git < 1.8.3, or there really are no tags. We use - # a heuristic: assume all version tags have a digit. The old git %d - # expansion behaves like git log --decorate=short and strips out the - # refs/heads/ and refs/tags/ prefixes that would let us distinguish - # between branches and tags. By ignoring refnames without digits, we - # filter out many common branch names like "release" and - # "stabilization", as well as "HEAD" and "master". - tags = {r for r in refs if re.search(r"\d", r)} - if verbose: - print("discarding '%s', no digits" % ",".join(refs - tags)) - if verbose: - print("likely tags: %s" % ",".join(sorted(tags))) - for ref in sorted(tags): - # sorting will prefer e.g. "2.0" over "2.0rc1" - if ref.startswith(tag_prefix): - r = ref[len(tag_prefix) :] - # Filter out refs that exactly match prefix or that don't start - # with a number once the prefix is stripped (mostly a concern - # when prefix is '') - if not re.match(r"\d", r): - continue - if verbose: - print("picking %s" % r) - return { - "version": r, - "full-revisionid": keywords["full"].strip(), - "dirty": False, - "error": None, - "date": date, - } - # no suitable tags, so version is "0+unknown", but full hex is still there - if verbose: - print("no suitable tags, using unknown + full revision id") - return { - "version": "0+unknown", - "full-revisionid": keywords["full"].strip(), - "dirty": False, - "error": "no suitable tags", - "date": None, - } - - -@register_vcs_handler("git", "pieces_from_vcs") -def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command): - """Get version from 'git describe' in the root of the source tree. - - This only gets called if the git-archive 'subst' keywords were *not* - expanded, and _version.py hasn't already been rewritten with a short - version string, meaning we're inside a checked out source tree. - """ - GITS = ["git"] - if sys.platform == "win32": - GITS = ["git.cmd", "git.exe"] - - # GIT_DIR can interfere with correct operation of Versioneer. - # It may be intended to be passed to the Versioneer-versioned project, - # but that should not change where we get our version from. - env = os.environ.copy() - env.pop("GIT_DIR", None) - runner = functools.partial(runner, env=env) - - _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, hide_stderr=not verbose) - if rc != 0: - if verbose: - print("Directory %s not under git control" % root) - raise NotThisMethod("'git rev-parse --git-dir' returned error") - - # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] - # if there isn't one, this yields HEX[-dirty] (no NUM) - describe_out, rc = runner( - GITS, - [ - "describe", - "--tags", - "--dirty", - "--always", - "--long", - "--match", - f"{tag_prefix}[[:digit:]]*", - ], - cwd=root, - ) - # --long was added in git-1.5.5 - if describe_out is None: - raise NotThisMethod("'git describe' failed") - describe_out = describe_out.strip() - full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) - if full_out is None: - raise NotThisMethod("'git rev-parse' failed") - full_out = full_out.strip() - - pieces = {} - pieces["long"] = full_out - pieces["short"] = full_out[:7] # maybe improved later - pieces["error"] = None - - branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], cwd=root) - # --abbrev-ref was added in git-1.6.3 - if rc != 0 or branch_name is None: - raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") - branch_name = branch_name.strip() - - if branch_name == "HEAD": - # If we aren't exactly on a branch, pick a branch which represents - # the current commit. If all else fails, we are on a branchless - # commit. - branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) - # --contains was added in git-1.5.4 - if rc != 0 or branches is None: - raise NotThisMethod("'git branch --contains' returned error") - branches = branches.split("\n") - - # Remove the first line if we're running detached - if "(" in branches[0]: - branches.pop(0) - - # Strip off the leading "* " from the list of branches. - branches = [branch[2:] for branch in branches] - if "master" in branches: - branch_name = "master" - elif not branches: - branch_name = None - else: - # Pick the first branch that is returned. Good or bad. - branch_name = branches[0] - - pieces["branch"] = branch_name - - # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] - # TAG might have hyphens. - git_describe = describe_out - - # look for -dirty suffix - dirty = git_describe.endswith("-dirty") - pieces["dirty"] = dirty - if dirty: - git_describe = git_describe[: git_describe.rindex("-dirty")] - - # now we have TAG-NUM-gHEX or HEX - - if "-" in git_describe: - # TAG-NUM-gHEX - mo = re.search(r"^(.+)-(\d+)-g([0-9a-f]+)$", git_describe) - if not mo: - # unparsable. Maybe git-describe is misbehaving? - pieces["error"] = "unable to parse git-describe output: '%s'" % describe_out - return pieces - - # tag - full_tag = mo.group(1) - if not full_tag.startswith(tag_prefix): - if verbose: - fmt = "tag '%s' doesn't start with prefix '%s'" - print(fmt % (full_tag, tag_prefix)) - pieces["error"] = "tag '{}' doesn't start with prefix '{}'".format( - full_tag, - tag_prefix, - ) - return pieces - pieces["closest-tag"] = full_tag[len(tag_prefix) :] - - # distance: number of commits since tag - pieces["distance"] = int(mo.group(2)) - - # commit: short hex revision ID - pieces["short"] = mo.group(3) - - else: - # HEX: no tags - pieces["closest-tag"] = None - out, rc = runner(GITS, ["rev-list", "HEAD", "--left-right"], cwd=root) - pieces["distance"] = len(out.split()) # total number of commits - - # commit date: see ISO-8601 comment in git_versions_from_keywords() - date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip() - # Use only the last line. Previous lines may contain GPG signature - # information. - date = date.splitlines()[-1] - pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) - - return pieces - - -def do_vcs_install(versionfile_source, ipy): - """Git-specific installation logic for Versioneer. - - For Git, this means creating/changing .gitattributes to mark _version.py - for export-subst keyword substitution. - """ - GITS = ["git"] - if sys.platform == "win32": - GITS = ["git.cmd", "git.exe"] - files = [versionfile_source] - if ipy: - files.append(ipy) - if "VERSIONEER_PEP518" not in globals(): - try: - my_path = __file__ - if my_path.endswith((".pyc", ".pyo")): - my_path = os.path.splitext(my_path)[0] + ".py" - versioneer_file = os.path.relpath(my_path) - except NameError: - versioneer_file = "versioneer.py" - files.append(versioneer_file) - present = False - try: - with open(".gitattributes") as fobj: - for line in fobj: - if line.strip().startswith(versionfile_source): - if "export-subst" in line.strip().split()[1:]: - present = True - break - except OSError: - pass - if not present: - with open(".gitattributes", "a+") as fobj: - fobj.write(f"{versionfile_source} export-subst\n") - files.append(".gitattributes") - run_command(GITS, ["add", "--"] + files) - - -def versions_from_parentdir(parentdir_prefix, root, verbose): - """Try to determine the version from the parent directory name. - - Source tarballs conventionally unpack into a directory that includes both - the project name and a version string. We will also support searching up - two directory levels for an appropriately named parent directory - """ - rootdirs = [] - - for _ in range(3): - dirname = os.path.basename(root) - if dirname.startswith(parentdir_prefix): - return { - "version": dirname[len(parentdir_prefix) :], - "full-revisionid": None, - "dirty": False, - "error": None, - "date": None, - } - rootdirs.append(root) - root = os.path.dirname(root) # up a level - - if verbose: - print( - "Tried directories %s but none started with prefix %s" - % (str(rootdirs), parentdir_prefix) - ) - raise NotThisMethod("rootdir doesn't start with parentdir_prefix") - - -SHORT_VERSION_PY = """ -# This file was generated by 'versioneer.py' (0.28) from -# revision-control system data, or from the parent directory name of an -# unpacked source archive. Distribution tarballs contain a pre-generated copy -# of this file. - -import json - -version_json = ''' -%s -''' # END VERSION_JSON - - -def get_versions(): - return json.loads(version_json) -""" - - -def versions_from_file(filename): - """Try to determine the version from _version.py if present.""" - try: - with open(filename) as f: - contents = f.read() - except OSError: - raise NotThisMethod("unable to read _version.py") - mo = re.search( - r"version_json = '''\n(.*)''' # END VERSION_JSON", contents, re.M | re.S - ) - if not mo: - mo = re.search( - r"version_json = '''\r\n(.*)''' # END VERSION_JSON", contents, re.M | re.S - ) - if not mo: - raise NotThisMethod("no version_json in _version.py") - return json.loads(mo.group(1)) - - -def write_to_version_file(filename, versions): - """Write the given version number to the given _version.py file.""" - os.unlink(filename) - contents = json.dumps(versions, sort_keys=True, indent=1, separators=(",", ": ")) - with open(filename, "w") as f: - f.write(SHORT_VERSION_PY % contents) - - print("set {} to '{}'".format(filename, versions["version"])) - - -def plus_or_dot(pieces): - """Return a + if we don't already have one, else return a .""" - if "+" in pieces.get("closest-tag", ""): - return "." - return "+" - - -def render_pep440(pieces): - """Build up version string, with post-release "local version identifier". - - Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you - get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty - - Exceptions: - 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += plus_or_dot(pieces) - rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def render_pep440_branch(pieces): - """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . - - The ".dev0" means not master branch. Note that .dev0 sorts backwards - (a feature branch will appear "older" than the master branch). - - Exceptions: - 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0" - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += "+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def pep440_split_post(ver): - """Split pep440 version string at the post-release segment. - - Returns the release segments before the post-release and the - post-release version number (or -1 if no post-release segment is present). - """ - vc = str.split(ver, ".post") - return vc[0], int(vc[1] or 0) if len(vc) == 2 else None - - -def render_pep440_pre(pieces): - """TAG[.postN.devDISTANCE] -- No -dirty. - - Exceptions: - 1: no tags. 0.post0.devDISTANCE - """ - if pieces["closest-tag"]: - if pieces["distance"]: - # update the post release segment - tag_version, post_version = pep440_split_post(pieces["closest-tag"]) - rendered = tag_version - if post_version is not None: - rendered += ".post%d.dev%d" % (post_version + 1, pieces["distance"]) - else: - rendered += ".post0.dev%d" % (pieces["distance"]) - else: - # no commits, use the tag as the version - rendered = pieces["closest-tag"] - else: - # exception #1 - rendered = "0.post0.dev%d" % pieces["distance"] - return rendered - - -def render_pep440_post(pieces): - """TAG[.postDISTANCE[.dev0]+gHEX] . - - The ".dev0" means dirty. Note that .dev0 sorts backwards - (a dirty tree will appear "older" than the corresponding clean one), - but you shouldn't be releasing software with -dirty anyways. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "g%s" % pieces["short"] - else: - # exception #1 - rendered = "0.post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - rendered += "+g%s" % pieces["short"] - return rendered - - -def render_pep440_post_branch(pieces): - """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . - - The ".dev0" means not master branch. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%d" % pieces["distance"] - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "g%s" % pieces["short"] - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0.post%d" % pieces["distance"] - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += "+g%s" % pieces["short"] - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def render_pep440_old(pieces): - """TAG[.postDISTANCE[.dev0]] . - - The ".dev0" means dirty. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - else: - # exception #1 - rendered = "0.post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - return rendered - - -def render_git_describe(pieces): - """TAG[-DISTANCE-gHEX][-dirty]. - - Like 'git describe --tags --dirty --always'. - - Exceptions: - 1: no tags. HEX[-dirty] (note: no 'g' prefix) - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"]: - rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) - else: - # exception #1 - rendered = pieces["short"] - if pieces["dirty"]: - rendered += "-dirty" - return rendered - - -def render_git_describe_long(pieces): - """TAG-DISTANCE-gHEX[-dirty]. - - Like 'git describe --tags --dirty --always -long'. - The distance/hash is unconditional. - - Exceptions: - 1: no tags. HEX[-dirty] (note: no 'g' prefix) - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) - else: - # exception #1 - rendered = pieces["short"] - if pieces["dirty"]: - rendered += "-dirty" - return rendered - - -def render(pieces, style): - """Render the given version pieces into the requested style.""" - if pieces["error"]: - return { - "version": "unknown", - "full-revisionid": pieces.get("long"), - "dirty": None, - "error": pieces["error"], - "date": None, - } - - if not style or style == "default": - style = "pep440" # the default - - if style == "pep440": - rendered = render_pep440(pieces) - elif style == "pep440-branch": - rendered = render_pep440_branch(pieces) - elif style == "pep440-pre": - rendered = render_pep440_pre(pieces) - elif style == "pep440-post": - rendered = render_pep440_post(pieces) - elif style == "pep440-post-branch": - rendered = render_pep440_post_branch(pieces) - elif style == "pep440-old": - rendered = render_pep440_old(pieces) - elif style == "git-describe": - rendered = render_git_describe(pieces) - elif style == "git-describe-long": - rendered = render_git_describe_long(pieces) - else: - raise ValueError("unknown style '%s'" % style) - - return { - "version": rendered, - "full-revisionid": pieces["long"], - "dirty": pieces["dirty"], - "error": None, - "date": pieces.get("date"), - } - - -class VersioneerBadRootError(Exception): - """The project root directory is unknown or missing key files.""" - - -def get_versions(verbose=False): - """Get the project version from whatever source is available. - - Returns dict with two keys: 'version' and 'full'. - """ - if "versioneer" in sys.modules: - # see the discussion in cmdclass.py:get_cmdclass() - del sys.modules["versioneer"] - - root = get_root() - cfg = get_config_from_root(root) - - assert cfg.VCS is not None, "please set [versioneer]VCS= in setup.cfg" - handlers = HANDLERS.get(cfg.VCS) - assert handlers, "unrecognized VCS '%s'" % cfg.VCS - verbose = verbose or cfg.verbose - assert ( - cfg.versionfile_source is not None - ), "please set versioneer.versionfile_source" - assert cfg.tag_prefix is not None, "please set versioneer.tag_prefix" - - versionfile_abs = os.path.join(root, cfg.versionfile_source) - - # extract version from first of: _version.py, VCS command (e.g. 'git - # describe'), parentdir. This is meant to work for developers using a - # source checkout, for users of a tarball created by 'setup.py sdist', - # and for users of a tarball/zipball created by 'git archive' or github's - # download-from-tag feature or the equivalent in other VCSes. - - get_keywords_f = handlers.get("get_keywords") - from_keywords_f = handlers.get("keywords") - if get_keywords_f and from_keywords_f: - try: - keywords = get_keywords_f(versionfile_abs) - ver = from_keywords_f(keywords, cfg.tag_prefix, verbose) - if verbose: - print("got version from expanded keyword %s" % ver) - return ver - except NotThisMethod: - pass - - try: - ver = versions_from_file(versionfile_abs) - if verbose: - print(f"got version from file {versionfile_abs} {ver}") - return ver - except NotThisMethod: - pass - - from_vcs_f = handlers.get("pieces_from_vcs") - if from_vcs_f: - try: - pieces = from_vcs_f(cfg.tag_prefix, root, verbose) - ver = render(pieces, cfg.style) - if verbose: - print("got version from VCS %s" % ver) - return ver - except NotThisMethod: - pass - - try: - if cfg.parentdir_prefix: - ver = versions_from_parentdir(cfg.parentdir_prefix, root, verbose) - if verbose: - print("got version from parentdir %s" % ver) - return ver - except NotThisMethod: - pass - - if verbose: - print("unable to compute version") - - return { - "version": "0+unknown", - "full-revisionid": None, - "dirty": None, - "error": "unable to compute version", - "date": None, - } - - -def get_version(): - """Get the short version string for this project.""" - return get_versions()["version"] - - -def get_cmdclass(cmdclass=None): - """Get the custom setuptools subclasses used by Versioneer. - - If the package uses a different cmdclass (e.g. one from numpy), it - should be provide as an argument. - """ - if "versioneer" in sys.modules: - del sys.modules["versioneer"] - # this fixes the "python setup.py develop" case (also 'install' and - # 'easy_install .'), in which subdependencies of the main project are - # built (using setup.py bdist_egg) in the same python process. Assume - # a main project A and a dependency B, which use different versions - # of Versioneer. A's setup.py imports A's Versioneer, leaving it in - # sys.modules by the time B's setup.py is executed, causing B to run - # with the wrong versioneer. Setuptools wraps the sub-dep builds in a - # sandbox that restores sys.modules to it's pre-build state, so the - # parent is protected against the child's "import versioneer". By - # removing ourselves from sys.modules here, before the child build - # happens, we protect the child from the parent's versioneer too. - # Also see https://github.com/python-versioneer/python-versioneer/issues/52 - - cmds = {} if cmdclass is None else cmdclass.copy() - - # we add "version" to setuptools - from setuptools import Command - - class cmd_version(Command): - description = "report generated version string" - user_options = [] - boolean_options = [] - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - def run(self): - vers = get_versions(verbose=True) - print("Version: %s" % vers["version"]) - print(" full-revisionid: %s" % vers.get("full-revisionid")) - print(" dirty: %s" % vers.get("dirty")) - print(" date: %s" % vers.get("date")) - if vers["error"]: - print(" error: %s" % vers["error"]) - - cmds["version"] = cmd_version - - # we override "build_py" in setuptools - # - # most invocation pathways end up running build_py: - # distutils/build -> build_py - # distutils/install -> distutils/build ->.. - # setuptools/bdist_wheel -> distutils/install ->.. - # setuptools/bdist_egg -> distutils/install_lib -> build_py - # setuptools/install -> bdist_egg ->.. - # setuptools/develop -> ? - # pip install: - # copies source tree to a tempdir before running egg_info/etc - # if .git isn't copied too, 'git describe' will fail - # then does setup.py bdist_wheel, or sometimes setup.py install - # setup.py egg_info -> ? - - # pip install -e . and setuptool/editable_wheel will invoke build_py - # but the build_py command is not expected to copy any files. - - # we override different "build_py" commands for both environments - if "build_py" in cmds: - _build_py = cmds["build_py"] - else: - from setuptools.command.build_py import build_py as _build_py - - class cmd_build_py(_build_py): - def run(self): - root = get_root() - cfg = get_config_from_root(root) - versions = get_versions() - _build_py.run(self) - if getattr(self, "editable_mode", False): - # During editable installs `.py` and data files are - # not copied to build_lib - return - # now locate _version.py in the new build/ directory and replace - # it with an updated value - if cfg.versionfile_build: - target_versionfile = os.path.join(self.build_lib, cfg.versionfile_build) - print("UPDATING %s" % target_versionfile) - write_to_version_file(target_versionfile, versions) - - cmds["build_py"] = cmd_build_py - - if "build_ext" in cmds: - _build_ext = cmds["build_ext"] - else: - from setuptools.command.build_ext import build_ext as _build_ext - - class cmd_build_ext(_build_ext): - def run(self): - root = get_root() - cfg = get_config_from_root(root) - versions = get_versions() - _build_ext.run(self) - if self.inplace: - # build_ext --inplace will only build extensions in - # build/lib<..> dir with no _version.py to write to. - # As in place builds will already have a _version.py - # in the module dir, we do not need to write one. - return - # now locate _version.py in the new build/ directory and replace - # it with an updated value - if not cfg.versionfile_build: - return - target_versionfile = os.path.join(self.build_lib, cfg.versionfile_build) - if not os.path.exists(target_versionfile): - print( - f"Warning: {target_versionfile} does not exist, skipping " - "version update. This can happen if you are running build_ext " - "without first running build_py." - ) - return - print("UPDATING %s" % target_versionfile) - write_to_version_file(target_versionfile, versions) - - cmds["build_ext"] = cmd_build_ext - - if "cx_Freeze" in sys.modules: # cx_freeze enabled? - from cx_Freeze.dist import build_exe as _build_exe - - # nczeczulin reports that py2exe won't like the pep440-style string - # as FILEVERSION, but it can be used for PRODUCTVERSION, e.g. - # setup(console=[{ - # "version": versioneer.get_version().split("+", 1)[0], # FILEVERSION - # "product_version": versioneer.get_version(), - # ... - - class cmd_build_exe(_build_exe): - def run(self): - root = get_root() - cfg = get_config_from_root(root) - versions = get_versions() - target_versionfile = cfg.versionfile_source - print("UPDATING %s" % target_versionfile) - write_to_version_file(target_versionfile, versions) - - _build_exe.run(self) - os.unlink(target_versionfile) - with open(cfg.versionfile_source, "w") as f: - LONG = LONG_VERSION_PY[cfg.VCS] - f.write( - LONG - % { - "DOLLAR": "$", - "STYLE": cfg.style, - "TAG_PREFIX": cfg.tag_prefix, - "PARENTDIR_PREFIX": cfg.parentdir_prefix, - "VERSIONFILE_SOURCE": cfg.versionfile_source, - } - ) - - cmds["build_exe"] = cmd_build_exe - del cmds["build_py"] - - if "py2exe" in sys.modules: # py2exe enabled? - try: - from py2exe.setuptools_buildexe import py2exe as _py2exe - except ImportError: - from py2exe.distutils_buildexe import py2exe as _py2exe - - class cmd_py2exe(_py2exe): - def run(self): - root = get_root() - cfg = get_config_from_root(root) - versions = get_versions() - target_versionfile = cfg.versionfile_source - print("UPDATING %s" % target_versionfile) - write_to_version_file(target_versionfile, versions) - - _py2exe.run(self) - os.unlink(target_versionfile) - with open(cfg.versionfile_source, "w") as f: - LONG = LONG_VERSION_PY[cfg.VCS] - f.write( - LONG - % { - "DOLLAR": "$", - "STYLE": cfg.style, - "TAG_PREFIX": cfg.tag_prefix, - "PARENTDIR_PREFIX": cfg.parentdir_prefix, - "VERSIONFILE_SOURCE": cfg.versionfile_source, - } - ) - - cmds["py2exe"] = cmd_py2exe - - # sdist farms its file list building out to egg_info - if "egg_info" in cmds: - _egg_info = cmds["egg_info"] - else: - from setuptools.command.egg_info import egg_info as _egg_info - - class cmd_egg_info(_egg_info): - def find_sources(self): - # egg_info.find_sources builds the manifest list and writes it - # in one shot - super().find_sources() - - # Modify the filelist and normalize it - root = get_root() - cfg = get_config_from_root(root) - self.filelist.append("versioneer.py") - if cfg.versionfile_source: - # There are rare cases where versionfile_source might not be - # included by default, so we must be explicit - self.filelist.append(cfg.versionfile_source) - self.filelist.sort() - self.filelist.remove_duplicates() - - # The write method is hidden in the manifest_maker instance that - # generated the filelist and was thrown away - # We will instead replicate their final normalization (to unicode, - # and POSIX-style paths) - from setuptools import unicode_utils - - normalized = [ - unicode_utils.filesys_decode(f).replace(os.sep, "/") - for f in self.filelist.files - ] - - manifest_filename = os.path.join(self.egg_info, "SOURCES.txt") - with open(manifest_filename, "w") as fobj: - fobj.write("\n".join(normalized)) - - cmds["egg_info"] = cmd_egg_info - - # we override different "sdist" commands for both environments - if "sdist" in cmds: - _sdist = cmds["sdist"] - else: - from setuptools.command.sdist import sdist as _sdist - - class cmd_sdist(_sdist): - def run(self): - versions = get_versions() - self._versioneer_generated_versions = versions - # unless we update this, the command will keep using the old - # version - self.distribution.metadata.version = versions["version"] - return _sdist.run(self) - - def make_release_tree(self, base_dir, files): - root = get_root() - cfg = get_config_from_root(root) - _sdist.make_release_tree(self, base_dir, files) - # now locate _version.py in the new base_dir directory - # (remembering that it may be a hardlink) and replace it with an - # updated value - target_versionfile = os.path.join(base_dir, cfg.versionfile_source) - print("UPDATING %s" % target_versionfile) - write_to_version_file( - target_versionfile, self._versioneer_generated_versions - ) - - cmds["sdist"] = cmd_sdist - - return cmds - - -CONFIG_ERROR = """ -setup.cfg is missing the necessary Versioneer configuration. You need -a section like: - - [versioneer] - VCS = git - style = pep440 - versionfile_source = src/myproject/_version.py - versionfile_build = myproject/_version.py - tag_prefix = - parentdir_prefix = myproject- - -You will also need to edit your setup.py to use the results: - - import versioneer - setup(version=versioneer.get_version(), - cmdclass=versioneer.get_cmdclass(), ...) - -Please read the docstring in ./versioneer.py for configuration instructions, -edit setup.cfg, and re-run the installer or 'python versioneer.py setup'. -""" - -SAMPLE_CONFIG = """ -# See the docstring in versioneer.py for instructions. Note that you must -# re-run 'versioneer.py setup' after changing this section, and commit the -# resulting files. - -[versioneer] -#VCS = git -#style = pep440 -#versionfile_source = -#versionfile_build = -#tag_prefix = -#parentdir_prefix = - -""" - -OLD_SNIPPET = """ -from ._version import get_versions -__version__ = get_versions()['version'] -del get_versions -""" - -INIT_PY_SNIPPET = """ -from . import {0} -__version__ = {0}.get_versions()['version'] -""" - - -def do_setup(): - """Do main VCS-independent setup function for installing Versioneer.""" - root = get_root() - try: - cfg = get_config_from_root(root) - except (OSError, configparser.NoSectionError, configparser.NoOptionError) as e: - if isinstance(e, (OSError, configparser.NoSectionError)): - print("Adding sample versioneer config to setup.cfg", file=sys.stderr) - with open(os.path.join(root, "setup.cfg"), "a") as f: - f.write(SAMPLE_CONFIG) - print(CONFIG_ERROR, file=sys.stderr) - return 1 - - print(" creating %s" % cfg.versionfile_source) - with open(cfg.versionfile_source, "w") as f: - LONG = LONG_VERSION_PY[cfg.VCS] - f.write( - LONG - % { - "DOLLAR": "$", - "STYLE": cfg.style, - "TAG_PREFIX": cfg.tag_prefix, - "PARENTDIR_PREFIX": cfg.parentdir_prefix, - "VERSIONFILE_SOURCE": cfg.versionfile_source, - } - ) - - ipy = os.path.join(os.path.dirname(cfg.versionfile_source), "__init__.py") - if os.path.exists(ipy): - try: - with open(ipy) as f: - old = f.read() - except OSError: - old = "" - module = os.path.splitext(os.path.basename(cfg.versionfile_source))[0] - snippet = INIT_PY_SNIPPET.format(module) - if OLD_SNIPPET in old: - print(" replacing boilerplate in %s" % ipy) - with open(ipy, "w") as f: - f.write(old.replace(OLD_SNIPPET, snippet)) - elif snippet not in old: - print(" appending to %s" % ipy) - with open(ipy, "a") as f: - f.write(snippet) - else: - print(" %s unmodified" % ipy) - else: - print(" %s doesn't exist, ok" % ipy) - ipy = None - - # Make VCS-specific changes. For git, this means creating/changing - # .gitattributes to mark _version.py for export-subst keyword - # substitution. - do_vcs_install(cfg.versionfile_source, ipy) - return 0 - - -def scan_setup_py(): - """Validate the contents of setup.py against Versioneer's expectations.""" - found = set() - setters = False - errors = 0 - with open("setup.py") as f: - for line in f.readlines(): - if "import versioneer" in line: - found.add("import") - if "versioneer.get_cmdclass()" in line: - found.add("cmdclass") - if "versioneer.get_version()" in line: - found.add("get_version") - if "versioneer.VCS" in line: - setters = True - if "versioneer.versionfile_source" in line: - setters = True - if len(found) != 3: - print("") - print("Your setup.py appears to be missing some important items") - print("(but I might be wrong). Please make sure it has something") - print("roughly like the following:") - print("") - print(" import versioneer") - print(" setup( version=versioneer.get_version(),") - print(" cmdclass=versioneer.get_cmdclass(), ...)") - print("") - errors += 1 - if setters: - print("You should remove lines like 'versioneer.VCS = ' and") - print("'versioneer.versionfile_source = ' . This configuration") - print("now lives in setup.cfg, and should be removed from setup.py") - print("") - errors += 1 - return errors - - -def setup_command(): - """Set up Versioneer and exit with appropriate error code.""" - errors = do_setup() - errors += scan_setup_py() - sys.exit(1 if errors else 0) - - -if __name__ == "__main__": - cmd = sys.argv[1] - if cmd == "setup": - setup_command() From 052a37c1e981a2fc22c223d76efaf336026e168f Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 2 Dec 2024 15:04:26 +1100 Subject: [PATCH 126/138] Update environment-dev.yml Co-authored-by: Davide Marchegiani --- environment-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment-dev.yml b/environment-dev.yml index 6014fbfe..e4540d4d 100644 --- a/environment-dev.yml +++ b/environment-dev.yml @@ -5,7 +5,7 @@ channels: - coecms - nodefaults dependencies: - - python >=3.10, <=3.12 + - python >=3.10 - pytest - xarray - mule From 56c75b1bbdb29771437b21757aa78b733e598d61 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 2 Dec 2024 15:04:38 +1100 Subject: [PATCH 127/138] Update pyproject.toml Co-authored-by: Davide Marchegiani --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index cb5be960..920fcfaa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,8 @@ authors = [ ] description = "Collection of tools for UM fieldsfiles." license = { file = "LICENSE" } - keywords = ["UM", "UM utilities", "UM fields files", "umfile_utils"] +keywords = ["UM", "UM utilities", "UM fields files", "umfile_utils"] +requires-python = ">=3.10" dependencies = [ "mule", "numpy <2", From 584dbda2a532971cc70f17eeac09c29e3edf1fe7 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 2 Dec 2024 15:04:57 +1100 Subject: [PATCH 128/138] Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani --- src/perturbIC.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index 5aec30b1..85a6a7aa 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -30,6 +30,7 @@ def parse_args(): parser.add_argument('ifile', metavar="INPUT_PATH", help='Path to the input file.') parser.add_argument('--validate', action='store_true', help='Validate the output fields file using mule validation.') + parser.add_argument('-o', '--output', dest = output_path, metavar="OUTPUT_PATH", help='Path to the output file. If omitted, the default output file is created by appending "_perturbed" to the input path.') args_parsed = parser.parse_args() return args_parsed @@ -183,7 +184,7 @@ def void_validation(*args, **kwargs): def main(): """ - Add a bi-dimensional random perturbation to the potential temperature field (STASH itemcode = 4) of a UM fields file. + Add a bi-dimensional random perturbation to the potential temperature field 'Theta' (STASH itemcode = 4) of a UM fields file. """ # Define all the variables From 2df1dec6223a8fde51a27581cbac6aaa30ce4eb3 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 2 Dec 2024 15:26:52 +1100 Subject: [PATCH 129/138] Update tests/perturbIC_test.py Co-authored-by: Davide Marchegiani --- tests/perturbIC_test.py | 54 ++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index f5e256d7..028b2048 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -68,20 +68,46 @@ def test_parse_args(monkeypatch, mock_command_line): assert args.seed == 23452 assert args.ifile == "~/example/path/to/the/file/restart_dump.astart" -def test_create_default_outname(monkeypatch, mock_command_line): - """ - This function tests the creating the output file name - Inputs - fixture - A list of command line arguements - Outputs - The results of assertion tests. - """ - - monkeypatch.setattr(sys, "argv", mock_command_line) - args = parse_args() - output_filename = create_default_outname(args.ifile) - #asssert output_filename == "~/example/path/to/the/file/restart_dump_perturbed.astart" - assert output_filename == "~/example/path/to/the/file/restart_dump.astart_perturbed" +@pytest.mark.parametrize( + # description of the arguments + "existing_files, filename, expected_output", + [ + # Case 1: Filename with suffix doesn't exist, return filename with suffix + ([], "testfilename", "testfilename_perturbed"), + # Case 2: Filename with suffix exists, returns filename with suffix appending 1 + (["testfilename_perturbed"], "testfilename", "testfilename_perturbed1"), + # Case 3: Filename with suffix and a few numbered versions exist, returns + # filename with suffix and the first numbered version that doesn't exist + ( + ["testfilename_perturbed", "testfilename_perturbed1", "testfilename_perturbed2"], + "testfilename", + "testfilename_perturbed3", + ), + ], +) +@patch("os.path.exists") +def test_create_default_outname_suffix_not_passed(mock_exists, existing_files, filename, expected_output): + """ + Test the function that creates the default output file name, without passing a suffix. + 3 cases tested with pytest.mark.parametrize. + """ + # Mock os.path.exists to simulate the presence of specific files + mock_exists.side_effect = lambda f: f in existing_files + result = create_default_outname(filename) + assert result == expected_output + +@patch("os.path.exists") +def test_create_default_outname_suffix_passed(mock_exists): + """ + Test the function that creates the default output file name, passing a custom suffix. + """ + # Mock os.path.exists to simulate the presence of specific files + mock_exists.return_value = False + filename = "testfilename" + suffix = "testsuffix" + result = create_default_outname(filename, suffix) + expected_output = "testfilenametestsuffix" + assert result == expected_output def test_remove_timeseries(): From bf84b40b509bab3921f73d5ac5213aa5c064946a Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 2 Dec 2024 15:27:11 +1100 Subject: [PATCH 130/138] Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani --- src/perturbIC.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index 85a6a7aa..fb69117f 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -23,11 +23,13 @@ def parse_args(): Argparse namespace containing the parsed command line arguments. """ parser = argparse.ArgumentParser(description="Perturb UM initial dump") + # Positional arguments + parser.add_argument('ifile', metavar="INPUT_PATH", help='Path to the input file.') + # Optional arguments parser.add_argument('-a', dest='amplitude', type=float, default=0.01, help = 'Amplitude of the perturbation.') parser.add_argument('-s','--seed', dest='seed', type=int, help = 'The seed value used to generate the random perturbation (must be a non-negative integer).') - parser.add_argument('ifile', metavar="INPUT_PATH", help='Path to the input file.') parser.add_argument('--validate', action='store_true', help='Validate the output fields file using mule validation.') parser.add_argument('-o', '--output', dest = output_path, metavar="OUTPUT_PATH", help='Path to the output file. If omitted, the default output file is created by appending "_perturbed" to the input path.') @@ -194,7 +196,7 @@ def main(): args = parse_args() # Create the output filename - output_file = create_default_outname(args.ifile) + output_file = create_default_outname(args.ifile) if args.output_path is None else args.output_path # Create the random generator. random_generator = create_random_generator(args.seed) From b992e6011193c8754f33be2bea2ca393d0ddf7b7 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 2 Dec 2024 18:39:03 +1100 Subject: [PATCH 131/138] Update pyproject.toml Co-authored-by: Davide Marchegiani --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 920fcfaa..01ccc632 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "umfile-utils" -version = "0.1.0" +dynamic = ["version"] authors = [ {name = "Martin Dix", email="martin.dix@anu.edu.au"}, {name = "Lindsey Oberhelman", email="lindsey.oberhelman@anu.edu.au"}, From a4d8b0139fc3cb21437048d668a4d95c40027fe4 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 2 Dec 2024 19:40:42 +1100 Subject: [PATCH 132/138] Update src/perturbIC.py Co-authored-by: Davide Marchegiani Update src/perturbIC.py Co-authored-by: Davide Marchegiani --- src/perturbIC.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/perturbIC.py b/src/perturbIC.py index fb69117f..735b3389 100644 --- a/src/perturbIC.py +++ b/src/perturbIC.py @@ -50,9 +50,7 @@ def create_random_generator(value=None): numpy.random.Generator The numpy random generator object. """ - - - if value < 0: + if value is not None and value < 0: raise ValueError('Seed value must be non-negative.') return Generator(PCG64(value)) From aaceef2d4d0baca5804b9c603ce1f38fa23d8aa9 Mon Sep 17 00:00:00 2001 From: Davide Marchegiani Date: Sat, 30 Nov 2024 09:57:43 +1100 Subject: [PATCH 133/138] Updated unit-testing --- .coveragerc | 9 + .gitignore | 11 + environment-dev.yml | 1 + pyproject.toml | 3 + src/umfile_utils/GLOBE30_patch_aus.py | 65 - src/umfile_utils/README.md | 1 - src/umfile_utils/access_landmask.py | 65 - src/umfile_utils/add_fields_to_dump.py | 52 - src/umfile_utils/ancil2netcdf.py | 172 - src/umfile_utils/change_calendar.py | 33 - src/umfile_utils/change_calendar365.py | 39 - src/umfile_utils/change_calendar_header.py | 28 - src/umfile_utils/change_dump_date.py | 47 - src/umfile_utils/change_dump_date2.py | 47 - src/umfile_utils/change_endianness.py | 54 - src/umfile_utils/change_stashcode.py | 45 - src/umfile_utils/check_land_overlap.py | 141 - src/umfile_utils/check_land_overlap_idx.py | 141 - src/umfile_utils/count_land.py | 54 - src/umfile_utils/count_tiles.py | 7 - src/umfile_utils/eqtoll.py | 47 - src/umfile_utils/fix_polar_anom.py | 82 - src/umfile_utils/get_calendar.py | 17 - src/umfile_utils/imit_soilmoisture.py | 36 - src/umfile_utils/interpolate_ancillary.py | 115 - src/umfile_utils/iris_stashname.py | 22 - src/umfile_utils/lbcdump.py | 78 - src/umfile_utils/levelheights.py | 61 - src/umfile_utils/mask_edit.py | 202 - src/umfile_utils/mergefiles.py | 128 - src/umfile_utils/mergefiles_region.py | 66 - src/umfile_utils/nccmp_um2netcdf.py | 101 - src/{ => umfile_utils}/perturbIC.py | 8 +- src/umfile_utils/polar_anom.py | 71 - src/umfile_utils/prog_fields_mismatch.py | 75 - src/umfile_utils/read_stashmaster.py | 132 - src/umfile_utils/remove_stash_duplicates.py | 63 - src/umfile_utils/reset_neg_snow.py | 26 - src/umfile_utils/show_land_overlap.py | 109 - src/umfile_utils/sortum.py | 41 - src/umfile_utils/split_times.py | 73 - src/umfile_utils/sstice_ancil.py | 144 - src/umfile_utils/stashvar.py | 4702 ---------------- src/umfile_utils/stashvar_cmip6.py | 4734 ----------------- .../stashvar_validate_stdnames.py | 21 - src/umfile_utils/subset_ancillary.py | 95 - src/umfile_utils/subset_dump.py | 136 - src/umfile_utils/um2netcdf.py | 232 - src/umfile_utils/um2netcdf4.py | 377 -- src/umfile_utils/um2netcdf4_cmip6.py | 367 -- src/umfile_utils/um2netcdf4_dev.py | 494 -- src/umfile_utils/um2netcdf_all.py | 233 - src/umfile_utils/um2netcdf_iris.py | 400 -- src/umfile_utils/um2netcdf_iris_mon.py | 218 - src/umfile_utils/um_complexity.py | 28 - src/umfile_utils/um_copy_field.py | 79 - src/umfile_utils/um_fields_subset.py | 143 - src/umfile_utils/um_fieldsfile_dump.py | 145 - src/umfile_utils/um_fileheaders.py | 296 -- src/umfile_utils/um_grid_flip.py | 23 - src/umfile_utils/um_modify_field.py | 40 - src/umfile_utils/um_replace_field.py | 88 - src/umfile_utils/um_timeseries.py | 458 -- src/umfile_utils/um_zero_field.py | 31 - src/umfile_utils/umfile.py | 481 -- src/umfile_utils/umv2netcdf.py | 107 - src/umfile_utils/umv2reg.py | 185 - src/umfile_utils/valid_times.py | 33 - tests/perturbIC_test.py | 533 +- 69 files changed, 421 insertions(+), 16970 deletions(-) create mode 100644 .coveragerc create mode 100644 .gitignore delete mode 100644 src/umfile_utils/GLOBE30_patch_aus.py delete mode 100644 src/umfile_utils/README.md delete mode 100644 src/umfile_utils/access_landmask.py delete mode 100644 src/umfile_utils/add_fields_to_dump.py delete mode 100644 src/umfile_utils/ancil2netcdf.py delete mode 100644 src/umfile_utils/change_calendar.py delete mode 100644 src/umfile_utils/change_calendar365.py delete mode 100644 src/umfile_utils/change_calendar_header.py delete mode 100644 src/umfile_utils/change_dump_date.py delete mode 100644 src/umfile_utils/change_dump_date2.py delete mode 100644 src/umfile_utils/change_endianness.py delete mode 100644 src/umfile_utils/change_stashcode.py delete mode 100644 src/umfile_utils/check_land_overlap.py delete mode 100644 src/umfile_utils/check_land_overlap_idx.py delete mode 100644 src/umfile_utils/count_land.py delete mode 100644 src/umfile_utils/count_tiles.py delete mode 100644 src/umfile_utils/eqtoll.py delete mode 100644 src/umfile_utils/fix_polar_anom.py delete mode 100644 src/umfile_utils/get_calendar.py delete mode 100644 src/umfile_utils/imit_soilmoisture.py delete mode 100644 src/umfile_utils/interpolate_ancillary.py delete mode 100644 src/umfile_utils/iris_stashname.py delete mode 100644 src/umfile_utils/lbcdump.py delete mode 100644 src/umfile_utils/levelheights.py delete mode 100644 src/umfile_utils/mask_edit.py delete mode 100644 src/umfile_utils/mergefiles.py delete mode 100644 src/umfile_utils/mergefiles_region.py delete mode 100644 src/umfile_utils/nccmp_um2netcdf.py rename src/{ => umfile_utils}/perturbIC.py (96%) delete mode 100644 src/umfile_utils/polar_anom.py delete mode 100644 src/umfile_utils/prog_fields_mismatch.py delete mode 100644 src/umfile_utils/read_stashmaster.py delete mode 100644 src/umfile_utils/remove_stash_duplicates.py delete mode 100644 src/umfile_utils/reset_neg_snow.py delete mode 100644 src/umfile_utils/show_land_overlap.py delete mode 100644 src/umfile_utils/sortum.py delete mode 100644 src/umfile_utils/split_times.py delete mode 100644 src/umfile_utils/sstice_ancil.py delete mode 100644 src/umfile_utils/stashvar.py delete mode 100644 src/umfile_utils/stashvar_cmip6.py delete mode 100644 src/umfile_utils/stashvar_validate_stdnames.py delete mode 100644 src/umfile_utils/subset_ancillary.py delete mode 100644 src/umfile_utils/subset_dump.py delete mode 100644 src/umfile_utils/um2netcdf.py delete mode 100644 src/umfile_utils/um2netcdf4.py delete mode 100644 src/umfile_utils/um2netcdf4_cmip6.py delete mode 100644 src/umfile_utils/um2netcdf4_dev.py delete mode 100644 src/umfile_utils/um2netcdf_all.py delete mode 100644 src/umfile_utils/um2netcdf_iris.py delete mode 100644 src/umfile_utils/um2netcdf_iris_mon.py delete mode 100644 src/umfile_utils/um_complexity.py delete mode 100644 src/umfile_utils/um_copy_field.py delete mode 100644 src/umfile_utils/um_fields_subset.py delete mode 100644 src/umfile_utils/um_fieldsfile_dump.py delete mode 100644 src/umfile_utils/um_fileheaders.py delete mode 100644 src/umfile_utils/um_grid_flip.py delete mode 100644 src/umfile_utils/um_modify_field.py delete mode 100644 src/umfile_utils/um_replace_field.py delete mode 100644 src/umfile_utils/um_timeseries.py delete mode 100644 src/umfile_utils/um_zero_field.py delete mode 100644 src/umfile_utils/umfile.py delete mode 100644 src/umfile_utils/umv2netcdf.py delete mode 100644 src/umfile_utils/umv2reg.py delete mode 100644 src/umfile_utils/valid_times.py diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 00000000..da8cb0fa --- /dev/null +++ b/.coveragerc @@ -0,0 +1,9 @@ +[run] +branch = True + +# skip coverage testing for external source files +omit = src/umfile_utils/_version.py + +[html] +title = Coverage report: umfile_utils +directory = coverage_html diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..927e73d8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +**/__pycache__/ +.hypothesis/ +.*_cache/ +.vscode/ +.DS_Store +.idea +.coverage +*~ +*.egg-info +coverage_html +*.code-workspace \ No newline at end of file diff --git a/environment-dev.yml b/environment-dev.yml index e4540d4d..4f34cb7b 100644 --- a/environment-dev.yml +++ b/environment-dev.yml @@ -11,6 +11,7 @@ dependencies: - mule - numpy < 2 - versioneer + - hypothesis - ipykernel - pytest-cov - pip diff --git a/pyproject.toml b/pyproject.toml index 01ccc632..58659bdd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,3 +37,6 @@ versionfile_source = "src/umfile_utils/_version.py" versionfile_build = "umfile_utils/_version.py" tag_prefix = "" parentdir_prefix = "umfile-utils-" + +[tool.pytest.ini_options] +pythonpath = "src" \ No newline at end of file diff --git a/src/umfile_utils/GLOBE30_patch_aus.py b/src/umfile_utils/GLOBE30_patch_aus.py deleted file mode 100644 index 38b195f4..00000000 --- a/src/umfile_utils/GLOBE30_patch_aus.py +++ /dev/null @@ -1,65 +0,0 @@ -# Replace the Australian part of the GLOBE30 data with data from -# aus_dem_9s (averaged to same 30 sec resolution) -# Note that this modifies the file in place - -# This file just has a single variable with code 0 - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * -import cdms2 -from cdms2 import MV2 - -ifile = "GLOBE30_aus.orog" -ncfile = "aus_dem_30s.nc" -ncvarname = "height" - -d = cdms2.open(ncfile) -ncvar = d.variables[ncvarname] - -f = umfile.UMFile(ifile, "r+") - -# Start of data -dstart = f.fixhd[FH_DataStart] - -# Orography uses zero over oceans rather than missing value -arr = MV2.array(ncvar[:]) -MV2.set_fill_value(arr,0) -arr = MV2.filled(arr) - -# GLOBE30 goes starts at 0E, 90N, resolution 1/120th -# aus_dem also N to S -lat = ncvar.getLatitude() -lon = ncvar.getLongitude() -lat0 = lat[0] -lon0 = lon[0] -ioff = int(round(lon[0]*120)) -joff = int(round((90-lat0)*120)) -j12s = int(round((90+12)*120)) -i128e = 128*120 -nlat = len(lat) -nlon = len(lon) - -print "JOFF", joff, j12s - -# Loop over all the fields -kout = 0 -kount = dstart-1 # dstart is index rather than offset -k = 0 # Single field -a = f.readfld(k) -print "SHAPES", a.shape, a[joff:joff+nlat,ioff:ioff+nlon].shape, arr.shape -# For first part of array, to 12 S, include only a region -# from 128 to 144E so only Australia gets changed -nregion = j12s - joff -lonstart = i128e - ioff -print "SHAPES", a[joff:j12s,i128e:i128e+1920].shape, arr[:nregion,lonstart:lonstart+1920].shape -a[joff:j12s,i128e:i128e+1920] = arr[:nregion,lonstart:lonstart+1920] -print "SHAPES", a[j12s:joff+nlat,ioff:ioff+nlon].shape, arr[nregion:].shape -a[j12s:joff+nlat,ioff:ioff+nlon] = arr[nregion:] - -f.writefld(a,k) - -f.close() diff --git a/src/umfile_utils/README.md b/src/umfile_utils/README.md deleted file mode 100644 index 8b137891..00000000 --- a/src/umfile_utils/README.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/umfile_utils/access_landmask.py b/src/umfile_utils/access_landmask.py deleted file mode 100644 index 8190b178..00000000 --- a/src/umfile_utils/access_landmask.py +++ /dev/null @@ -1,65 +0,0 @@ -# Set up a land mask file for access -# Ancillary mask file qrparm.mask at appropriate resolution must already exist. -# Also qrparm.landfrac -# Martin Dix martin.dix@csiro.au - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * -import cdms2 - -d = cdms2.open('um_n96_landseamask_gice2n96.nc') -ncvar = d('umland',squeeze=1).filled() -mask = np.where(ncvar<0.01,0,1).astype(np.int64) -frac = np.where(ncvar<0.01,0,ncvar).astype(np.float64) -print "MASK", mask.shape - -f = umfile.UMFile('qrparm.mask', "r+") -f.readheader() -f.readlookup() - -varcode = 30 - -# Loop over all the fields -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - if ilookup[ITEM_CODE] == varcode: - print "Replacing", k, ilookup[ITEM_CODE] - f.wordseek(lbegin) - npts = ilookup[LBNPT] - nrows = ilookup[LBROW] - a = f.readfld(k) - a[:] = mask[:] - f.writefld(a,k) - -f.close() - -f = umfile.UMFile('qrparm.landfrac', "r+") -f.readheader() -f.readlookup() - -varcode = 505 - -# Loop over all the fields -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - if ilookup[ITEM_CODE] == varcode: - print "Replacing", k, ilookup[ITEM_CODE] - # f.wordseek(lbegin) - npts = ilookup[LBNPT] - nrows = ilookup[LBROW] - a = f.readfld(k) - print "A", a.min(), a.max() - a.shape = (nrows,npts) - print "SHAPES", a.shape, frac.shape - a[:] = frac[:] - f.writefld(a,k) - -f.close() diff --git a/src/umfile_utils/add_fields_to_dump.py b/src/umfile_utils/add_fields_to_dump.py deleted file mode 100644 index 21f56836..00000000 --- a/src/umfile_utils/add_fields_to_dump.py +++ /dev/null @@ -1,52 +0,0 @@ -# Add fields to a dump file to allow warm restart with extra -# diagnostics. Uses a list of pairs of stashcodes, (present, new) -# where fields with the "present" stashcode are copied to the "new" -# stashcode and zeroed. - -import mule -from operator import attrgetter -from mule.operators import ScaleFactorOperator -import sys - -zero_operator = ScaleFactorOperator(0.0) - -ff = mule.DumpFile.from_file(sys.argv[1]) - -# codes = {1207:1202, 3287:3314} -# For Roger's AMIP run new fields are -newlist = [34102, 34104, 34105, 34106, 34108, 34109, 34110, 34111, - 34114, 34115, 34116, 34117, 34120, 34121, 34126] -# and can all be taken from 34072 -codes = {34072: newlist} - -newflds = [] -for fld in ff.fields: - # lbtim > 10 restricts this to diagnostic variables - if fld.lbuser4 in codes and fld.lbtim > 10: - if isinstance(codes[fld.lbuser4],list): - tmplist = codes[fld.lbuser4] - else: - tmplist = [codes[fld.lbuser4]] - for code in tmplist: - tmp = fld.copy() - tmp.lbuser4 = code - newflds.append(zero_operator(tmp)) - -# To keep proper ordering of the dump file take all the prognostic -# fields with lbtim < 10 first - -ff_out = ff.copy() -for k, fld in enumerate(ff.fields): - if fld.lbtim < 10: - ff_out.fields.append(fld) - else: - break - -# Assume sort is stable for the rest -remaining = ff.fields[k:] + newflds - -remaining.sort(key=attrgetter('lbuser4')) - -ff_out.fields += remaining - -ff_out.to_file(sys.argv[2]) diff --git a/src/umfile_utils/ancil2netcdf.py b/src/umfile_utils/ancil2netcdf.py deleted file mode 100644 index 46f1dd09..00000000 --- a/src/umfile_utils/ancil2netcdf.py +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env python - -import iris, numpy as np, datetime, sys -import stashvar_cmip6 as stashvar -from iris.coords import CellMethod -from netCDF4 import default_fillvals - -def fix_latlon_coord(cube): - def _add_coord_bounds(coord): - if len(coord.points) > 1: - if not coord.has_bounds(): - coord.guess_bounds() - else: - # For length 1, assume it's global. guess_bounds doesn't work in this case - if coord.name() == 'latitude': - if not coord.has_bounds(): - coord.bounds = np.array([[-90.,90.]]) - elif coord.name() == 'longitude': - if not coord.has_bounds(): - coord.bounds = np.array([[0.,360.]]) - - lat = cube.coord('latitude') - lat.var_name = 'lat' - _add_coord_bounds(lat) - lon = cube.coord('longitude') - lon.var_name = 'lon' - _add_coord_bounds(lon) - -def cubewrite(cube, sman, verbose): - - if cube.data.dtype == 'float64': - cube.data = cube.data.astype(np.float32) - elif cube.data.dtype == 'int64': - cube.data = cube.data.astype(np.int32) - - # Set the missing_value attribute. Use an array to force the type to match - # the data type - if cube.data.dtype.kind == 'f': - fill_value = 1.e20 - else: - # Use netCDF defaults - fill_value = default_fillvals['%s%1d' % (cube.data.dtype.kind, cube.data.dtype.itemsize)] - - cube.attributes['missing_value'] = np.array([fill_value], cube.data.dtype) - - # Check whether any of the coordinates is a pseudo-dimension - # with integer values and if so reset to int32 to prevent - # problems with possible later conversion to netCDF3 - for coord in cube.coords(): - if coord.points.dtype == np.int64: - coord.points = coord.points.astype(np.int32) - - try: - # If time is a dimension but not a coordinate dimension, coord_dims('time') returns an empty tuple - if tdim := cube.coord_dims('time'): - # For fields with a pseudo-level, time may not be the first dimension - if tdim != (0,): - tdim = tdim[0] - neworder = list(range(cube.ndim)) - neworder.remove(tdim) - neworder.insert(0,tdim) - if verbose > 1: - print("Incorrect dimension order", cube) - print("Transpose to", neworder) - cube.transpose(neworder) - sman.write(cube, zlib=True, complevel=4, unlimited_dimensions=['time'], fill_value=fill_value) - else: - tmp = iris.util.new_axis(cube,cube.coord('time')) - sman.write(tmp, zlib=True, complevel=4, unlimited_dimensions=['time'], fill_value=fill_value) - except iris.exceptions.CoordinateNotFoundError: - # No time dimension (probably ancillary file) - sman.write(cube, zlib=True, complevel=4, fill_value=fill_value) - -def fix_cell_methods(mtuple): - # Input is tuple of cell methods - newm = [] - for m in mtuple: - newi = [] - for i in m.intervals: - # Skip the misleading hour intervals - if i.find('hour') == -1: - newi.append(i) - n = CellMethod(m.method, m.coord_names, tuple(newi), m.comments) - newm.append(n) - return tuple(newm) - -def process(infile, outfile, args): - - if args.include_list and args.exclude_list: - raise Exception("Error: include list and exclude list are mutually exclusive") - cubes = iris.load(infile) - - # Sort the list by stashcode - def keyfunc(c): - return c.attributes['STASH'] - cubes.sort(key=keyfunc) - - with iris.fileformats.netcdf.Saver(outfile, 'NETCDF4') as sman: - - # Add global attributes - history = "File %s converted with ancil2netcdf.py at %s" % \ - (infile, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - sman.update_global_attributes({'history':history}) - sman.update_global_attributes({'Conventions':'CF-1.6'}) - - for c in cubes: - stashcode = c.attributes['STASH'] - itemcode = 1000*stashcode.section + stashcode.item - if args.include_list and itemcode not in args.include_list: - continue - if args.exclude_list and itemcode in args.exclude_list: - continue - umvar = stashvar.StashVar(itemcode) - if args.simple: - c.var_name = 'fld_s%2.2di%3.3d' % (stashcode.section, stashcode.item) - elif umvar.uniquename: - c.var_name = umvar.uniquename - if c.standard_name and umvar.standard_name: - if c.standard_name != umvar.standard_name: - if args.verbose: - sys.stderr.write("Standard name mismatch %d %d %s %s\n" % \ - (stashcode.section, stashcode.item, c.standard_name, umvar.standard_name) ) - c.standard_name = umvar.standard_name - if c.units and umvar.units: - # Simple testing c.units == umvar.units doesn't - # catch format differences because Unit type - # works around them. repr isn't reliable either - ustr = '%s' % c.units - if ustr != umvar.units: - if args.verbose: - sys.stderr.write("Units mismatch %d %d %s %s\n" % \ - (stashcode.section, stashcode.item, c.units, umvar.units) ) - c.units = umvar.units - # If there's no standard_name or long_name from iris - # use one from STASH - if not c.standard_name: - if umvar.standard_name: - c.standard_name = umvar.standard_name - if not c.long_name: - if umvar.long_name: - c.long_name = umvar.long_name - - # Interval in cell methods isn't reliable so better to remove it. - c.cell_methods = fix_cell_methods(c.cell_methods) - try: - fix_latlon_coord(c) - except iris.exceptions.CoordinateNotFoundError: - print('\nMissing lat/lon coordinates for variable (possible timeseries?)\n') - print(c) - raise Exception("Variable can not be processed") - - if args.verbose: - print(c.name(), itemcode) - cubewrite(c, sman, args.verbose) - -if __name__ == '__main__': - import sys, argparse - parser = argparse.ArgumentParser(description="Convert UM ancillary file to netcdf") - parser.add_argument('-v', '--verbose', dest='verbose', - action='count', default=0, help='verbose output (-vv for extra verbose)') - parser.add_argument('--include', dest='include_list', type=int, - nargs = '+', help = 'List of stash codes to include') - parser.add_argument('--exclude', dest='exclude_list', type=int, - nargs = '+', help = 'List of stash codes to exclude') - parser.add_argument('--simple', dest='simple', action='store_true', - default=False, help="Use a simple names of form fld_s01i123.") - parser.add_argument('infile', help='Input file') - parser.add_argument('outfile', help='Output file') - - args = parser.parse_args() - - process(args.infile, args.outfile, args) diff --git a/src/umfile_utils/change_calendar.py b/src/umfile_utils/change_calendar.py deleted file mode 100644 index 691efeb4..00000000 --- a/src/umfile_utils/change_calendar.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python -# Change the calendar in a UM ancillary file from Gregorian to 360 day -# Assuming monthly data, change to appropriate middle of month dates. - -from um_fileheaders import * -import umfile, sys - -print(sys.argv[1]) -f = umfile.UMFile(sys.argv[1], 'r+') - -if f.fixhd[FH_CalendarType] == 1: - f.fixhd[FH_CalendarType] = 2 - print("Changing from Gregorian to 360 day") -else: - print("Already 360 day") - sys.exit(0) - -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] -# print()"Validity time", ilookup[LBYR], ilookup[LBMON], ilookup[LBDAT], \ -# ilookup[LBHR], ilookup[LBMIN], ilookup[LBDAY]) -# print()"Data time", ilookup[LBYRD], ilookup[LBMOND], ilookup[LBDATD], \ -# ilookup[LBHRD], ilookup[LBMIND], ilookup[LBDAYD]) -# print("LBTIM", ilookup[LBTIM]) - ilookup[LBDAT] = ilookup[LBDATD] = 16 - ilookup[LBHR] = ilookup[LBHRD] = 0 - ilookup[LBMIN] = ilookup[LBMIND] = 0 - ilookup[LBDAY] = ilookup[LBDAYD] = 16 + (ilookup[LBMON]-1)*30 - if ilookup[LBTIM]%10==1: - # Reset units part of value from 1 to 2. - ilookup[LBTIM] += 1 # Crucial for CDMS. - -f.close() diff --git a/src/umfile_utils/change_calendar365.py b/src/umfile_utils/change_calendar365.py deleted file mode 100644 index f6e28cf7..00000000 --- a/src/umfile_utils/change_calendar365.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python -# Change the calendar in a UM ancillary file from 360 day to Gregorian -# Assuming monthly data, change to appropriate middle of month dates. - -from um_fileheaders import * -import umfile, sys - -print(sys.argv[1]) -f = umfile.UMFile(sys.argv[1], 'r+') - -if f.fixhd[FH_CalendarType] == f.missval_i: - print("Changing calendar from undefined to Gregorian") -elif f.fixhd[FH_CalendarType] == 2: - f.fixhd[FH_CalendarType] = 1 - print("Changing calendar from 360 day to Gregorian") -else: - print("Already Gregorian") - sys.exit(0) - -f.fixhd[FH_CalendarType] = 1 - -# Day no for 15th of month relative to 01-01 -# dayno = [0, 14, 45, 74, 105, 135, 166, 196, 227, 258, 288, 319, 349] -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] -# print("Validity time", ilookup[LBYR], ilookup[LBMON], ilookup[LBDAT], \ -# ilookup[LBHR], ilookup[LBMIN], ilookup[LBDAY]) -# print( "Data time", ilookup[LBYRD], ilookup[LBMOND], ilookup[LBDATD], \ -# ilookup[LBHRD], ilookup[LBMIND], ilookup[LBDAYD]) -# print()"LBTIM", ilookup[LBTIM]) -# ilookup[LBDAT] = ilookup[LBDATD] = 15 -# ilookup[LBHR] = ilookup[LBHRD] = 0 -# ilookup[LBMIN] = ilookup[LBMIND] = 0 -# ilookup[LBDAY] = ilookup[LBDAYD] = dayno[ilookup[LBMON]] - if ilookup[LBTIM]%10 == 2: - # Used by CDMS, though doesn't seem to be used by the model - ilookup[LBTIM] -= 1 - -f.close() diff --git a/src/umfile_utils/change_calendar_header.py b/src/umfile_utils/change_calendar_header.py deleted file mode 100644 index a94c71f4..00000000 --- a/src/umfile_utils/change_calendar_header.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python -# Change the calendar header field in a UM ancillary file. - -from __future__ import print_function -from um_fileheaders import * -import umfile, sys, argparse - -parser = argparse.ArgumentParser(description="Change calendar header in an ancillary file. If no calendar argument given it just prints the current value") -parser.add_argument('-c', dest='calendar', - help='Calendar to be set', - choices = ('gregorian', '360day', 'undefined')) - -parser.add_argument('target', help='Ancillary file to change') -args = parser.parse_args() - -f = umfile.UMFile(args.target, 'r+') - -flag = {'gregorian':1, '360day':2, 'undefined':f.missval_i} -# Reverse dictionary -calendar = { i:c for c, i in flag.items()} - -print("Original calendar value:", calendar[f.fixhd[FH_CalendarType]]) - -if args.calendar: - f.fixhd[FH_CalendarType] = flag[args.calendar] - print("New calendar value:", calendar[f.fixhd[FH_CalendarType]]) - -f.close() diff --git a/src/umfile_utils/change_dump_date.py b/src/umfile_utils/change_dump_date.py deleted file mode 100644 index ebd8e3a0..00000000 --- a/src/umfile_utils/change_dump_date.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python -# Change the initial and valid date of a UM dump file - -# Change both the file header and the date header of each record. -# The latter may not be strictly necessary but it makes looking at file with -# xconv less confusing. - -import getopt, sys -import umfile -from um_fileheaders import * - -ifile = sys.argv[1] - -f = umfile.UMFile(ifile, "r+") - -print("Initial Time", f.fixhd[FH_DTYear], f.fixhd[FH_DTMonth], - f.fixhd[FH_DTDay], f.fixhd[FH_DTHour], f.fixhd[FH_DTMinute], - f.fixhd[FH_DTSecond]) - -print("Valid Time", f.fixhd[FH_VTYear], f.fixhd[FH_VTMonth], - f.fixhd[FH_VTDay], f.fixhd[FH_VTHour], f.fixhd[FH_VTMinute], - f.fixhd[FH_VTSecond]) - -s = input('Enter year month day\n') -s = s.split() -year = int(s[0]) -month = int(s[1]) -day = int(s[2]) - -print("Using", year, month, day) - -f.fixhd[FH_DTYear] = f.fixhd[FH_VTYear] = year -f.fixhd[FH_DTMonth] = f.fixhd[FH_VTMonth] = month -f.fixhd[FH_DTDay] = f.fixhd[FH_VTDay] = day - -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - # Ignore missing fields. - break - ilookup[LBYR] = year - ilookup[LBMON] = month - ilookup[LBDAT] = day - ilookup[LBFT] = 0 - -f.close() diff --git a/src/umfile_utils/change_dump_date2.py b/src/umfile_utils/change_dump_date2.py deleted file mode 100644 index faabe869..00000000 --- a/src/umfile_utils/change_dump_date2.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python -# Change the initial and valid date of a UM dump file - -# Change both the file header and the date header of each record. -# The latter may not be strictly necessary but it makes looking at file with -# xconv less confusing. - -import getopt, sys -import umfile -from um_fileheaders import * - -ifile = sys.argv[1] - -f = umfile.UMFile(ifile, "r+") - -print("Initial Time", f.fixhd[FH_DTYear], f.fixhd[FH_DTMonth], - f.fixhd[FH_DTDay], f.fixhd[FH_DTHour], f.fixhd[FH_DTMinute], - f.fixhd[FH_DTSecond]) - -print("Valid Time", f.fixhd[FH_VTYear], f.fixhd[FH_VTMonth], - f.fixhd[FH_VTDay], f.fixhd[FH_VTHour], f.fixhd[FH_VTMinute], - f.fixhd[FH_VTSecond]) - -s = input('Enter year month day\n') -s = s.split() -year = int(s[0]) -month = int(s[1]) -day = int(s[2]) - -print("Using", year, month, day) - -f.fixhd[FH_DTYear] = f.fixhd[FH_VTYear] = year -f.fixhd[FH_DTMonth] = f.fixhd[FH_VTMonth] = month -f.fixhd[FH_DTDay] = f.fixhd[FH_VTDay] = day - -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - # Ignore missing fields. - break - ilookup[LBYR] = ilookup[LBYRD] = year - ilookup[LBMON] = ilookup[LBMOND] = month - ilookup[LBDAT] = ilookup[LBDATD] = day - ilookup[LBFT] = 0 - -f.close() diff --git a/src/umfile_utils/change_endianness.py b/src/umfile_utils/change_endianness.py deleted file mode 100644 index b2c77499..00000000 --- a/src/umfile_utils/change_endianness.py +++ /dev/null @@ -1,54 +0,0 @@ -# Swap endianness of UM fieldsfile or ancillary file - -# Martin Dix martin.dix@csiro.au - - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * - -try: - optlist, args = getopt.getopt(sys.argv[1:], 'i:o:') - for opt in optlist: - if opt[0] == '-i': - ifile = opt[1] - elif opt[0] == '-o': - ofile = opt[1] -except getopt.error: - print("Usage: change_endianness.py -i ifile -o ofile") - sys.exit(2) - -f = umfile.UMFile(ifile) - -g = umfile.UMFile(ofile, "w") -g.copyheader(f) -g.rlookup = g.rlookup.byteswap() - -# Set output byteorder to be opposite of input -if f.byteorder == '>': - g.byteorder = '<' -elif f.byteorder == '<': - g.byteorder = '>' -else: - # Native - if sys.byteorder == 'little': - g.byteorder = '>' # Big - else: - g.byteorder = '<' - -# If native byteorder set that rather than '<' or '>' to match what np.dtype uses. -if (g.byteorder == '<' and sys.byteorder == 'little') or \ - (g.byteorder == '>' and sys.byteorder == 'big'): - g.byteorder = '=' - -print("Byte orders", f.byteorder, g.byteorder) - -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - data = f.readfld(k) - # Why does this have to be explicit? - g.writefld(data,k) - -g.close() diff --git a/src/umfile_utils/change_stashcode.py b/src/umfile_utils/change_stashcode.py deleted file mode 100644 index d2a51076..00000000 --- a/src/umfile_utils/change_stashcode.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env python -# Change the stashcode of selected fields in a UM fieldsfile -# Note that the reconfiguration can read and sort an out of order file so -# don't need to worry about reordering fields here. - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * - -vdict = {} -try: - optlist, args = getopt.getopt(sys.argv[1:], 'v:') - for opt in optlist: - if opt[0] == '-v': - oldindex,newindex = opt[1].split(",") - oldindex = int(oldindex) - newindex = int(newindex) - vdict[oldindex] = newindex -except getopt.error: - print("Usage: change_stashcode.py -v oldindex,newindex file") - print(" Variables specified by STASH index = Section Number * 1000 + item number") - print(" May use multiple -v arguments") - sys.exit(2) - -ifile = args[0] -f = umfile.UMFile(ifile,'r+') - -changed = False -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] - if lbegin == -99: - break - # Format is Section Number * 1000 + item number - if ilookup[ITEM_CODE] in vdict: - changed = True - ilookup[ITEM_CODE] = vdict[ilookup[ITEM_CODE]] - -if not changed: - print("Warning - no fields changed") - -f.close() diff --git a/src/umfile_utils/check_land_overlap.py b/src/umfile_utils/check_land_overlap.py deleted file mode 100644 index 6a0f82c6..00000000 --- a/src/umfile_utils/check_land_overlap.py +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/env python -# Reconfiguration can give incorrect results if there are land points in the -# target grid but none in the matching region on the parent grid -# (even if there is land elsewhere). -# Here check for this -# Usage is check_land_overlap.py global_mask regional_mask - -# Note that this isn't going to work for rotated grids. - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import sys -import umfile -from um_fileheaders import * - -file1 = sys.argv[1] -file2 = sys.argv[2] - -f = umfile.UMFile(file1) -g = umfile.UMFile(file2) - -def getfld(f): - # Expecting only a single field - ilookup = f.ilookup[0] - - # Check field name and data type. - # Expecting stash code 1 0 30 LAND MASK - if ilookup[ITEM_CODE] != 30: - print "Variable is not land mask, stashcode is", ilookup[ITEM_CODE] - sys.exit(1) - if ilookup[DATA_TYPE] != 3: - print "Variable is not expected logical type, code is", ilookup[DATA_TYPE] - sys.exit(1) - - data = f.readfld(0) - return data, ilookup, f.rlookup[0] - -data1, ilook1, rlook1 = getfld(f) -# Check that this file is global with starting point at -90,0 -gridtype = None -if ( np.isclose(rlook1[BDY] + rlook1[BZY], -90.) and - np.isclose(rlook1[BDX] + rlook1[BZX], 0.) and - np.isclose(rlook1[BDY]*ilook1[LBROW] + rlook1[BZY], 90.) and - np.isclose(rlook1[BDX]*(ilook1[LBNPT]+1) + rlook1[BZX],360.) ): - gridtype = 'ND' -elif ( np.isclose(rlook1[BDY]*0.5 + rlook1[BZY], -90.) and - np.isclose(rlook1[BDX]*0.5 + rlook1[BZX], 0.) and - np.isclose(rlook1[BDY]*(ilook1[LBROW]+0.5) + rlook1[BZY], 90.) and - np.isclose(rlook1[BDX]*(ilook1[LBNPT]+0.5) + rlook1[BZX], 360.) ): - gridtype = 'EG' -else: - raise Exception("First file is not global") - -data2, ilook2, rlook2 = getfld(g) - -# Mask may be +-1 depending on compiler used in ancillary program. -nland2 = (data2 != 0).sum() -if nland2 == 0: - # No problem - print "No land in LAM mask so OK" -else: - # Coordinates of box centres - lat1 = rlook2[BDY] + rlook2[BZY] - lon1 = rlook2[BDX] + rlook2[BZX] - lat2 = rlook2[BDY]*ilook2[LBROW] + rlook2[BZY] - lon2 = rlook2[BDX]*ilook2[LBNPT] + rlook2[BZX] - - # Find the global coordinates that fit inside this box - i1 = int(np.ceil(lon1 / rlook1[BDX])) - i2 = int(np.ceil(lon2 / rlook1[BDX])) - j1 = int(np.ceil((lat1+90.) / rlook1[BDY])) - j2 = int(np.ceil((lat2+90.) / rlook1[BDY])) - - nland1 = (data1[j1:j2,i1:i2]!=0).sum() - - if nland1 != 0: - print "OK - land points exist in global subset" - else: - print "Error - no overlapping land points" - # Now search for land in each direction - # Set defaults in case land isn't found in that direction - i1off = -9999 - j1off = -9999 - i2off = 9999 - j2off = 9999 - for i in range(i1-1,-1,-1): - if (data1[j1:j2,i]!=0).sum() != 0: - i1off = i - break - for i in range(i2,ilook1[LBNPT]): - if (data1[j1:j2,i]!=0).sum() != 0: - i2off = i - break - for j in range(j1-1,-1,-1): - if (data1[j,i1:i2]!=0).sum() != 0: - j1off = j - break - for j in range(j2,ilook1[LBROW]): - if (data1[j,i1:i2]!=0).sum() != 0: - j2off = j - break - - print "Possible fixes" - # These corrections are on global grid, so need to convert - # to LAM - shift_E = int(np.ceil((i2off + 1 - i2)*rlook1[BDX]/rlook2[BDX])) - shift_W = int(np.ceil((i1 - i1off)*rlook1[BDX]/rlook2[BDX])) - shift_N = int(np.ceil((j2off + 1 - j2)*rlook1[BDY]/rlook2[BDY])) - shift_S = int(np.ceil((j1 - j1off)*rlook1[BDY]/rlook2[BDY])) - print " Shift grid %d points E" % shift_E - print " Shift grid %d points W" % shift_W - print " Shift grid %d points N" % shift_N - print " Shift grid %d points S" % shift_S - - # Find the minimum - shifts = [shift_E, shift_W, shift_N, shift_S] - i = np.argmin(shifts) - direction = ['E', 'W', 'N', 'S'][i] - print "Recommended shift is %d points %s" % (shifts[i], direction) - - # Full region ancillary files are start at 60 E, 45 s - # 1426 x 916 points - # ~yix/share/umlam2/ACCESS/ANCIL/TXLAPS0.11/qrparm.mask - # 4km 4320 x 2800, starting at 60E, 45 S. Spacing 0.036 - # Current coordinates - # Existing offsets - ioff = int(round((lon1-60)/rlook2[BDX],0)) - joff = int(round((lat1+45)/rlook2[BDY],0)) - - # print "Offsets in current file", ioff, joff - if direction == 'E': - ioff += shift_E - elif direction == 'W': - ioff -= shift_W - elif direction == 'N': - joff += shift_N - elif direction == 'S': - joff -= shift_S - - print "Rerun subset_ancillary with offsets", ioff, joff diff --git a/src/umfile_utils/check_land_overlap_idx.py b/src/umfile_utils/check_land_overlap_idx.py deleted file mode 100644 index d84f9522..00000000 --- a/src/umfile_utils/check_land_overlap_idx.py +++ /dev/null @@ -1,141 +0,0 @@ -# Reconfiguration can give incorrect results if there are land points in the -# target grid but none in the matching region on the parent grid -# (even if there is land elsewhere). -# Here check for this -# Usage is check_land_overlap.py global_mask regional_mask - -# Note that this isn't going to work for rotated grids. - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import sys -import umfile -from um_fileheaders import * - -file1 = sys.argv[1] -file2 = sys.argv[2] - -f = umfile.UMFile(file1) -g = umfile.UMFile(file2) - -def getfld(f): - # Expecting only a single field - ilookup = f.ilookup[0] - - # Check field name and data type. - # Expecting stash code 1 0 30 LAND MASK - if ilookup[ITEM_CODE] != 30: - print "Variable is not land mask, stashcode is", ilookup[ITEM_CODE] - sys.exit(1) - if ilookup[DATA_TYPE] != 3: - print "Variable is not expected logical type, code is", ilookup[DATA_TYPE] - sys.exit(1) - - data = f.readfld(0) - return data, ilookup, f.rlookup[0] - -data1, ilook1, rlook1 = getfld(f) -# Check that this file is global with starting point at -90,0 -gridtype = None -if ( np.isclose(rlook1[BDY] + rlook1[BZY], -90.) and - np.isclose(rlook1[BDX] + rlook1[BZX], 0.) and - np.isclose(rlook1[BDY]*ilook1[LBROW] + rlook1[BZY], 90.) and - np.isclose(rlook1[BDX]*(ilook1[LBNPT]+1) + rlook1[BZX],360.) ): - gridtype = 'ND' -elif ( np.isclose(rlook1[BDY]*0.5 + rlook1[BZY], -90.) and - np.isclose(rlook1[BDX]*0.5 + rlook1[BZX], 0.) and - np.isclose(rlook1[BDY]*(ilook1[LBROW]+0.5) + rlook1[BZY], 90.) and - np.isclose(rlook1[BDX]*(ilook1[LBNPT]+0.5) + rlook1[BZX], 360.) ): - gridtype = 'EG' -else: - raise Exception("First file is not global") - -data2, ilook2, rlook2 = getfld(g) - -# Mask may be +-1 depending on compiler used in ancillary program. -nland2 = (data2 != 0).sum() -if nland2 == 0: - # No problem - #print "No land in LAM mask so OK" - print "no no" -else: - # Coordinates of box centres - lat1 = rlook2[BDY] + rlook2[BZY] - lon1 = rlook2[BDX] + rlook2[BZX] - lat2 = rlook2[BDY]*ilook2[LBROW] + rlook2[BZY] - lon2 = rlook2[BDX]*ilook2[LBNPT] + rlook2[BZX] - - # Find the global coordinates that fit inside this box - i1 = int(np.ceil(lon1 / rlook1[BDX])) - i2 = int(np.ceil(lon2 / rlook1[BDX])) - j1 = int(np.ceil((lat1+90.) / rlook1[BDY])) - j2 = int(np.ceil((lat2+90.) / rlook1[BDY])) - - nland1 = (data1[j1:j2,i1:i2]!=0).sum() - - if nland1 != 0: - #print "OK - land points exist in global subset" - print "no no" - else: - #print "Error - no overlapping land points" - # Now search for land in each direction - # Set defaults in case land isn't found in that direction - i1off = -9999 - j1off = -9999 - i2off = 9999 - j2off = 9999 - for i in range(i1-1,-1,-1): - if (data1[j1:j2,i]!=0).sum() != 0: - i1off = i - break - for i in range(i2,ilook1[LBNPT]): - if (data1[j1:j2,i]!=0).sum() != 0: - i2off = i - break - for j in range(j1-1,-1,-1): - if (data1[j,i1:i2]!=0).sum() != 0: - j1off = j - break - for j in range(j2,ilook1[LBROW]): - if (data1[j,i1:i2]!=0).sum() != 0: - j2off = j - break - - #print "Possible fixes" - # These corrections are on global grid, so need to convert - # to LAM - shift_E = int(np.ceil((i2off + 1 - i2)*rlook1[BDX]/rlook2[BDX])) - shift_W = int(np.ceil((i1 - i1off)*rlook1[BDX]/rlook2[BDX])) - shift_N = int(np.ceil((j2off + 1 - j2)*rlook1[BDY]/rlook2[BDY])) - shift_S = int(np.ceil((j1 - j1off)*rlook1[BDY]/rlook2[BDY])) - #print "Shift grid %d points E" % shift_E - #print "Shift grid %d points W" % shift_W - #print "Shift grid %d points N" % shift_N - #print "Shift grid %d points S" % shift_S - - # Find the minimum - shifts = [shift_E, shift_W, shift_N, shift_S] - i = np.argmin(shifts) - direction = ['E', 'W', 'N', 'S'][i] - #print "Recommended shift is %d points %s" % (shifts[i], direction) - - # Full region ancillary files are start at 60 E, 45 s - # 1426 x 916 points - # ~yix/share/umlam2/ACCESS/ANCIL/TXLAPS0.11/qrparm.mask - # Current coordinates - # Existing offsets - ioff = int(round((lon1-60)/rlook2[BDX],0)) - joff = int(round((lat1+45)/rlook2[BDY],0)) - # print "Offsets in current file", ioff, joff - if direction == 'E': - ioff += shift_E - elif direction == 'W': - ioff -= shift_W - elif direction == 'N': - joff += shift_N - elif direction == 'S': - joff -= shift_S - - #print "Rerun subset_ancillary with offsets", ioff, joff - print ioff, joff diff --git a/src/umfile_utils/count_land.py b/src/umfile_utils/count_land.py deleted file mode 100644 index 73446382..00000000 --- a/src/umfile_utils/count_land.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python - -# Count number of land points in a UM landmask ancillary file. -# Program expects that the mask is the first field. -# Martin Dix martin.dix@csiro.au - -from __future__ import print_function -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * - -verbose = False -try: - optlist, args = getopt.getopt(sys.argv[1:], 'v') - for opt in optlist: - if opt[0] == '-v': - verbose = True -except getopt.error: - print("Usage: count_land [-v] file") - sys.exit(2) - -ifile = args[0] - -f = umfile.UMFile(ifile) - -# Start of data -dstart = f.fixhd[FH_DataStart] - -# Expecting only a single field -k = 0 -ilookup = f.ilookup[k] -lblrec = ilookup[LBLREC] -lbegin = ilookup[LBEGIN] # lbegin is offset from start -lbnrec = ilookup[LBNREC] # Actual size -packing = [0, ilookup[LBPACK]%10, ilookup[LBPACK]//10 % 10, - ilookup[LBPACK]//100 % 10, ilookup[LBPACK]//1000 % 10, - ilookup[LBPACK]//10000] -npts = ilookup[LBNPT] -nrows = ilookup[LBROW] - -# Check field name and data type. -# Expecting stash code 1 0 30 LAND MASK -if ilookup[ITEM_CODE] != 30: - print("Variable is not land mask, stashcode is", ilookup[ITEM_CODE]) - sys.exit(1) -if ilookup[DATA_TYPE] != 3: - print("Variable is not expected logical type, code is", ilookup[DATA_TYPE]) - sys.exit(1) - -data = f.readfld(0) - -# Mask may be +-1 depending on compiler used in ancillary program. -print((data != 0).sum()) diff --git a/src/umfile_utils/count_tiles.py b/src/umfile_utils/count_tiles.py deleted file mode 100644 index 07f66356..00000000 --- a/src/umfile_utils/count_tiles.py +++ /dev/null @@ -1,7 +0,0 @@ -# Total number of non-zero tiles in a land fraction ancillary file -import iris, sys - -frac = iris.load_cube(sys.argv[1], iris.AttributeConstraint(STASH='m01s00i216')) -ftot = frac.data.sum(axis=0) -print("No of land points", (ftot >0).sum()) -print("No of tiles", (frac.data > 0).sum()) diff --git a/src/umfile_utils/eqtoll.py b/src/umfile_utils/eqtoll.py deleted file mode 100644 index 6badc843..00000000 --- a/src/umfile_utils/eqtoll.py +++ /dev/null @@ -1,47 +0,0 @@ -# Version of the UM eqtoll routine -import numpy as np - -def eqtoll(phi_eq,lambda_eq,phi_pole,lambda_pole): - - small = 1e-6 - - # Single value versions - lambda_zero = lambda_pole+180. - sin_phi_pole = np.sin(np.radians(phi_pole)) - cos_phi_pole = np.cos(np.radians(phi_pole)) - - e_lambda = np.atleast_1d(lambda_eq) - # Put into range -180 to 180 - e_lambda[e_lambda>180.] -= 360.0 - e_lambda[e_lambda<-180.] += 360.0 - - e_lambda = np.radians(e_lambda) - e_phi = np.radians(phi_eq) - - # Compute latitude using equation (4.7) - arg = cos_phi_pole*np.cos(e_lambda)*np.cos(e_phi) + np.sin(e_phi)*sin_phi_pole - arg = np.clip(arg, -1.0, 1.0) - a_phi = np.arcsin(arg) - phi_out = np.degrees(a_phi) - - # Compute longitude using equation (4.8) - term1 = np.cos(e_phi)*np.cos(e_lambda)*sin_phi_pole - np.sin(e_phi)*cos_phi_pole - term2 = np.cos(a_phi) - # Clip should take care of term2==0 case - arg = np.clip(term1/term2, -1.0, 1.0) - a_lambda = np.degrees(np.arccos(arg)) - a_lambda = copysign(a_lambda,e_lambda) - a_lambda = a_lambda+lambda_zero - - a_lambda[term2 < small] = 0.0 - - a_lambda[a_lambda >= 360.0] -= 360.0 - a_lambda[a_lambda < 0.0] += 360.0 - - return phi_out, a_lambda - -def copysign(x,y): - # Take zero as positive - s = np.sign(y) - s = np.where(np.equal(s,0),1,s) # Set - return abs(x)*s diff --git a/src/umfile_utils/fix_polar_anom.py b/src/umfile_utils/fix_polar_anom.py deleted file mode 100644 index 87964a31..00000000 --- a/src/umfile_utils/fix_polar_anom.py +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env python - -# Fix anomalies in polar fields - -# Martin Dix martin.dix@csiro.au - -from __future__ import print_function -import numpy as np -import getopt, sys -from um_fileheaders import * -import umfile, stashvar - -verbose = False -try: - optlist, args = getopt.getopt(sys.argv[1:], 'v') - for opt in optlist: - if opt[0] == '-v': - verbose = True -except getopt.error: - print("Usage: fix_polar_anom [-v] ifile ") - sys.exit(2) - -if args: - ifile = args[0] - -f = umfile.UMFile(ifile, 'r+') - -if not f.fieldsfile: - print("Not a UM fieldsfile") - sys.exit(1) - -# if f.fixhd[FH_HorizGrid] != 0: -# print("Error - not a global grid") -# sys.exit(1) - -lastvar = None -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - rlookup = f.rlookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - - # Only fix prognostic variables in a dump - if f.fixhd[FH_Dataset]==1 and not umfile.isprog(ilookup): - continue - - var = stashvar.StashVar(ilookup[ITEM_CODE],ilookup[MODEL_CODE]) - # Determine the grid from the zeroth latitude and longitude - if not ( np.allclose(rlookup[BZY] + rlookup[BDY], -90.) and - np.allclose(rlookup[BZX] + rlookup[BDX], 0.) ): - # Only print the warning once per variable - if verbose and ilookup[LBLEV] in (1,9999): - print("Skipping grid", ilookup[ITEM_CODE], var.long_name, ilookup[LBLEV]) - continue - - data = f.readfld(k) - - if len(data.shape) != 2: - # Runoff fields in vn7.3 dumps don't have proper pack code - if verbose: - print("Unexpected shape", ilookup[ITEM_CODE], data.shape, var.long_name) - continue - - anom_sp = data[0,:].max() - data[0,:].min() - anom_np = data[-1,:].max() - data[-1,:].min() - # Reset polar values - reset = False - if anom_sp > 0: - reset = True - # With dump files using 32 bit packing, using 64 bit mean helps - # maintain precision. - data[0,:] = data[0,:].mean(dtype=np.float64) - if anom_np > 0: - reset = True - data[-1,:] = data[-1,:].mean(dtype=np.float64) - - if reset: - f.writefld(data,k,overwrite=True) - print("Fixed", ilookup[ITEM_CODE], ilookup[LBLEV], var.long_name) - -f.close() diff --git a/src/umfile_utils/get_calendar.py b/src/umfile_utils/get_calendar.py deleted file mode 100644 index 2e8445f5..00000000 --- a/src/umfile_utils/get_calendar.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python -# Change the calendar in a UM ancillary file from Gregorian to 360 day -# Assuming monthly data, change to appropriate middle of month dates. - -from um_fileheaders import * -import umfile, sys - -f = umfile.UMFile(sys.argv[1], 'r') - -if f.fixhd[FH_CalendarType] == 1: - print("Gregorian") -elif f.fixhd[FH_CalendarType] == 2: - print("360 day") -elif f.fixhd[FH_CalendarType] == f.missval_i: - print("Not set") -else: - print("Unexpected calendar value", f.fixhd[FH_CalendarType]) diff --git a/src/umfile_utils/imit_soilmoisture.py b/src/umfile_utils/imit_soilmoisture.py deleted file mode 100644 index 8c981bbd..00000000 --- a/src/umfile_utils/imit_soilmoisture.py +++ /dev/null @@ -1,36 +0,0 @@ -# Limit soil moisture to be <= saturation - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * - -dzsoil = np.array([0.1, 0.25, 0.65, 2.0]) - -f = umfile.UMFile(sys.argv[1], 'r+') - -# On the first pass, just get the saturation fraction -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - if ilookup[ITEM_CODE] == 43: - saturation = f.readfld(k) - break - -level = 0 -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - if ilookup[ITEM_CODE] == 9: - sm = f.readfld(k) - sm = np.minimum(sm, 1000*dzsoil[level]*saturation) - level += 1 - f.writefld(sm,k) - -f.close() diff --git a/src/umfile_utils/interpolate_ancillary.py b/src/umfile_utils/interpolate_ancillary.py deleted file mode 100644 index 9668e5e3..00000000 --- a/src/umfile_utils/interpolate_ancillary.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python - -# Interpolate an ancillary file to another grid -# Output word size and endianness match input. - -# Converts all variables in the file (assumed to all be on the same grid) - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * -import cdms2 -import regrid2 - -def usage(): - print "Usage: interpolate_ancillary -i ifile -o ofile -m landseamask" - sys.exit(2) - -vname = None -ifile = None -ofile = None -maskfile = None -glat = None -try: - optlist, args = getopt.getopt(sys.argv[1:], 'i:o:m:') - for opt in optlist: - if opt[0] == '-i': - ifile = opt[1] - elif opt[0] == '-o': - ofile = opt[1] - elif opt[0] == '-m': - maskfile = opt[1] -except getopt.error: - usage() - -if not ifile or not ofile or not maskfile: - print "Error: filenames undefined" - usage() - -m = umfile.UMFile(maskfile) -f = umfile.UMFile(ifile) - -# Target grid properties -nlon_target = m.inthead[IC_XLen] -nlat_target = m.inthead[IC_YLen] - -# Create new axes for the output grid -outgrid = cdms2.createUniformGrid(m.realhead[RC_FirstLat], nlat_target, m.realhead[RC_LatSpacing], m.realhead[RC_FirstLong], nlon_target, m.realhead[RC_LongSpacing]) - -g = umfile.UMFile(ofile, "w") -g.copyheader(f) - -# Change the grid values in the output header to match the chosen origin and -# size -g.inthead[IC_XLen] = nlon_target -g.inthead[IC_YLen] = nlat_target -g.realhead[RC_FirstLat] = m.realhead[RC_FirstLat] -g.realhead[RC_FirstLong] = m.realhead[RC_FirstLong] -g.realhead[RC_PoleLong] = m.realhead[RC_PoleLong] -g.realhead[RC_PoleLat] = m.realhead[RC_PoleLat] -g.realhead[RC_LatSpacing] = m.realhead[RC_LatSpacing] -g.realhead[RC_LongSpacing] = m.realhead[RC_LongSpacing] -lat0 = g.realhead[RC_FirstLat] - g.realhead[RC_LatSpacing] -lon0 = g.realhead[RC_FirstLong] - g.realhead[RC_LongSpacing] - -# Loop over all the fields -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - rlookup = f.rlookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - npts = ilookup[LBNPT] - nrows = ilookup[LBROW] - - # Set modified output grid for this field - g.ilookup[k,LBLREC] = nlon_target*nlat_target - g.ilookup[k,LBROW] = nlat_target - g.ilookup[k,LBNPT] = nlon_target - # Need to hold float values in an integer array - g.rlookup[k,BDY] = g.realhead[RC_LatSpacing] - g.rlookup[k,BDX] = g.realhead[RC_LongSpacing] - g.rlookup[k,BZY] = lat0 - g.rlookup[k,BZX] = lon0 - - data = f.readfld(k) - - # May be different to the overall file settings if it's not a proper - # ancillary file - lat1 = rlookup[BZY] + rlookup[BDY] - lon1 = rlookup[BZX] + rlookup[BDX] - ingrid = cdms2.createUniformGrid(lat1, nrows, rlookup[BDY], lon1, npts, rlookup[BDX]) - - regridfunc = regrid2.Regridder(ingrid, outgrid) - - newdata = regridfunc(data) - if newdata.dtype == np.float32: - # Output from regrid is float32, so set packing to match - g.ilookup[k,LBPACK] = (f.ilookup[k,LBPACK]%10)*10 + 2 - else: - # Don't expect this case but handle it anyway - g.ilookup[k,LBPACK] = (f.ilookup[k,LBPACK]%10)*10 - - # If this is a global grid force polar values to be the zonal means - if ( f.fixhd[FH_HorizGrid] == 0 and - np.allclose(rlookup[BZY] + rlookup[BDY], -90.) and - np.allclose(rlookup[BZX] + rlookup[BDX], 0.) ): - newdata[0,:] = newdata[0,:].mean() - newdata[-1,:] = newdata[-1,:].mean() - - g.writefld(newdata,k) - -g.close() diff --git a/src/umfile_utils/iris_stashname.py b/src/umfile_utils/iris_stashname.py deleted file mode 100644 index 35cb15c8..00000000 --- a/src/umfile_utils/iris_stashname.py +++ /dev/null @@ -1,22 +0,0 @@ -# Add stashmaster names to iris cube or cubelist - -from stashvar import atm_stashvar - -def _add_name(cube): - code = cube.attributes['STASH'] - stashcode = code.section*1000 + code.item - try: - cube.stash_name = atm_stashvar[stashcode][0] - except KeyError: - cube.stash_name = 'Unknown' - # Also add to the attributes directory so that it shows - # when cube is printed. - cube.attributes['stash_name'] = cube.stash_name - -def add_stashname(cubes): - if isinstance(cubes,list): - for c in cubes: - _add_name(c) - else: - _add_name(cubes) - diff --git a/src/umfile_utils/lbcdump.py b/src/umfile_utils/lbcdump.py deleted file mode 100644 index 2ef2fd1d..00000000 --- a/src/umfile_utils/lbcdump.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python - -# Dump header and field information from a UM LBC file -# These pack all levels together into a single record - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import getopt, sys -from um_fileheaders import * -import umfile, stashvar - -short = False -header = False -try: - optlist, args = getopt.getopt(sys.argv[1:], 'i:hs') - for opt in optlist: - if opt[0] == '-i': - ifile = opt[1] - elif opt[0] == '-h': - header = True - elif opt[0] == '-s': - short = True -except getopt.error: - print "Usage: lbc_dump [-s] -i ifile " - sys.exit(2) - -if args: - ifile = args[0] - -f = umfile.UMFile(ifile) - -if not f.fieldsfile: - print "Not a UM fieldsfile" - sys.exit(1) - -if f.fixhd[FH_Dataset] != 5: - print "Not an LBC file", f.fixhd[FH_Dataset] - sys.exit(1) - -f.print_fixhead() - -print "Integer constants", f.inthead - -print "REAL HEADER", f.realhead - -if hasattr(f,"levdep"): - print "Level dependent constants", f.levdep - -if hasattr(f,"rowdep"): - print "Row dependent constants", f.rowdep - -if hasattr(f,"coldep"): - print "Column dependent constants", f.coldep - -if not header: - - for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lblrec = ilookup[LBLREC] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - lbnrec = ilookup[LBNREC] # Actual size - if lbegin == -99: - break - var = stashvar.StashVar(ilookup[ITEM_CODE],ilookup[MODEL_CODE]) - if not short: - print "-------------------------------------------------------------" - print k, ilookup[ITEM_CODE], var.name, var.long_name - if not short: - print f.ilookup[k, :45] - print f.rlookup[k, 45:] - npts = ilookup[LBNPT] - nrows = ilookup[LBROW] - - data = f.readfld(k) - - # Sample values - print ilookup[ITEM_CODE], data[0], "Range", data.min(), data.max() diff --git a/src/umfile_utils/levelheights.py b/src/umfile_utils/levelheights.py deleted file mode 100644 index a8b0ba2d..00000000 --- a/src/umfile_utils/levelheights.py +++ /dev/null @@ -1,61 +0,0 @@ -# UM hybrid height scheme, assuming height_gen_smooth option. -# Code from setcona -# Ignore Earth_radius term to get height above MSL. - -# In the UM, dimensions are r_theta_levels(0:model_levels), r_rho_levels(1:model_levels) -# To keep the relative arragement intact, add an extra value at the start of r_rho_levels -# here - -import f90nml -import numpy as np - -def setvertlevs(vfile, orog, verbose=False): - - vertlevs = f90nml.read(vfile)['vertlevs'] - if verbose: - print("VERTLEVS", vertlevs) - - eta_theta_levels = np.array(vertlevs['eta_theta']) # (0:model_levels) - eta_rho_levels = np.array([-1e20] + vertlevs['eta_rho']) # (1:model_levels) - z_top_of_model = vertlevs['z_top_of_model'] - first_constant_r_rho_level = vertlevs['first_constant_r_rho_level'] - if verbose: - print("eta_rho", eta_rho_levels) - - ashape = (len(eta_theta_levels),) + orog.shape - if verbose: - print("ASHAPE", ashape) - - r_theta_levels = np.zeros(ashape) - r_rho_levels = np.zeros(ashape) - r_rho_levels[0] = np.nan - - r_ref_theta = eta_theta_levels * z_top_of_model - r_ref_rho = eta_rho_levels * z_top_of_model - # set bottom level, ie: orography - r_theta_levels[0] = orog[:] # + Earth_radius - - # For constant levels set r to be a constant on the level - if len(orog.shape) == 2: - r_theta_levels[first_constant_r_rho_level:] = r_ref_theta[first_constant_r_rho_level:,np.newaxis,np.newaxis] - r_rho_levels[first_constant_r_rho_level:] = r_ref_rho[first_constant_r_rho_level:,np.newaxis,np.newaxis] - else: - r_theta_levels[first_constant_r_rho_level:] = r_ref_theta[first_constant_r_rho_level:,np.newaxis] - r_rho_levels[first_constant_r_rho_level:] = r_ref_rho[first_constant_r_rho_level:,np.newaxis] - - - # Case( height_gen_smooth ) - # A smooth quadratic height generation - for k in range(1, first_constant_r_rho_level): - r_rho_levels[k] = eta_rho_levels[k] * z_top_of_model + \ - orog * (1.0 - eta_rho_levels[k]/eta_rho_levels[first_constant_r_rho_level])**2 - r_theta_levels[k] = eta_theta_levels[k] * z_top_of_model + \ - orog * (1.0 - eta_theta_levels[k]/eta_rho_levels[first_constant_r_rho_level])**2 - - return r_theta_levels, r_rho_levels - -if __name__ == '__main__': - orog = np.arange(0,6000,1000.) - r_theta_levels, r_rho_levels = setvertlevs('vertlevs_G3', orog, verbose=True) - dr0 = r_theta_levels[1:,0] - r_theta_levels[:-1,0] - drx = r_theta_levels[1:,-1] - r_theta_levels[:-1,-1] diff --git a/src/umfile_utils/mask_edit.py b/src/umfile_utils/mask_edit.py deleted file mode 100644 index b5b0b6a5..00000000 --- a/src/umfile_utils/mask_edit.py +++ /dev/null @@ -1,202 +0,0 @@ -# Plot a land mask and interactively flip points. Output a list -# of changes. - -# For a global grid need to work around quirks of iris treating -# longitude range as -180 to 180 - -from __future__ import division, print_function -import iris -import iris.plot as iplt -import matplotlib -import numpy as np -import matplotlib.pyplot as plt -import cartopy.crs as ccrs -import argparse, sys -from matplotlib.colors import BoundaryNorm - -parser = argparse.ArgumentParser(description="Interactvely edit a UM land-sea mask") -parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', - default=False, help='verbose output') - -parser.add_argument('maskfile', nargs='?', help='Input mask file (default qrparm.mask)', default='qrparm.mask') -parser.add_argument('-m', dest='mapres', required=False, default='m', help='Map resolution', choices='almh') -parser.add_argument('-o', dest='outfile', type=argparse.FileType('w'), help='Output file for corrections (default is standard out)', default=sys.stdout) - -args = parser.parse_args() - -mask = iris.load_cube(args.maskfile) - -global fmask, lon, lat, nlon, nlat, cyclic, changed -# Global files have latitude, longitude, -# LAMs have grid_latitude, grid_longitude -lat, lon = mask.dim_coords -nlat, nlon = mask.shape -cyclic = lon.circular - -if mask.data.min() < 0: - # Plots better when flipped - mask.data = -1*mask.data - -# 4th value is never used for some reason -cmap = matplotlib.colors.ListedColormap(((0.3,0.3,1),(0.7,0.7,1),(0,0.65,0),(1,1,0),(0.,0.35,0))) - -changed = False - -if cyclic: - crs = ccrs.PlateCarree(central_longitude=180) -else: - crs = ccrs.PlateCarree() - -ax = plt.axes(projection=crs) - -def draw_GAcoast(ax,coastcolor='black'): - # http://www.ga.gov.au/metadata-gateway/metadata/record/61395/ - # MapInfo Interchange format - f = open('cstauscd_l.mif') - desc = open('cstauscd_l.mid') - - l = f.readline() - while l[:4] != "DATA": - l = f.readline() - - minlon, maxlon = ax.get_xlim() - minlat, maxlat = ax.get_ylim() - - while True: - l = f.readline() - if not l: - break - dline = desc.readline() - # Exclude State border and tile edge line segements - coast = dline.find("coastline") > 0 - if l.startswith("PLINE"): - n = int(l[5:]) - lon = [] - lat = [] - for i in range(n): - l = f.readline() - lon.append(float(l.split()[0])) - lat.append(float(l.split()[1])) - if coast and min(lat) <= maxlat and max(lat) >= minlat and \ - min(lon) <= maxlon and max(lon) >= minlon : - ax.plot(lon,lat,linewidth=1,color=coastcolor) - elif l.startswith("LINE"): - s = l.split() - lon = [float(s[1]), float(s[3])] - lat = [float(s[2]), float(s[4])] - if coast and min(lat) <= maxlat and max(lat) >= minlat and \ - min(lon) <= maxlon and max(lon) >= minlon : - ax.plot(lon,lat,linewidth=1,color=coastcolor) - -global PM -# cmap = plt.get_cmap('PiYG') -norm = BoundaryNorm([-1,0,1,2,3], ncolors=cmap.N, clip=True) -PM = iplt.pcolormesh(mask, cmap=cmap, norm=norm) - -if args.mapres == 'a': - draw_GAcoast(ax) -elif args.mapres == 'l': - ax.coastlines(resolution='110m') -elif args.mapres == 'h': - ax.coastlines(resolution='10m') -else: - ax.coastlines(resolution='50m') - -ax.gridlines(linestyle='--', draw_labels=True, alpha=0.5) - -# Make a copy so can see what's changed later -# (PM.set_array alters mask.data for LAMs) -origmask = np.array(mask.data[:]) - -def grid_callback(ax): - # Try to sensibly redraw the grid lines when the map is zoomed. - xt = ax.get_xticks() - yt = ax.get_yticks() - # print("Orig",xt) - if cyclic: - for i in range(len(xt)): - if xt[i] < 0: - xt[i] = 180 + xt[i] - else: - xt[i] = xt[i] - 180 - # print("New ",xt) - # Get rid of the old lines (doesn't seem to work) - ax._gridliners = [] - ax.gridlines(linestyle='--', draw_labels=True, xlocs=xt, ylocs=yt, alpha=0.5) - -# From the image_zcoord example -def format_coord(x, y): - - global lon, lat, cyclic - if cyclic: - x += 180. - i = lon.nearest_neighbour_index(x) - j = lat.nearest_neighbour_index(y) - return 'lon=%1.4f, lat=%1.4f, [%d,%d]'%(x, y, j, i) - -ax.format_coord = format_coord -ax.callbacks.connect('xlim_changed', grid_callback) -ax.callbacks.connect('ylim_changed', grid_callback) - -# http://matplotlib.org/1.3.1/users/event_handling.html -def onclick(event): - # Disable click events if using the zoom & pan modes. - # Need to turn off zoom to restore the clicking - if plt.gcf().canvas.widgetlock.locked(): - return - if args.verbose: - print('button=%d, x=%d, y=%d, xdata=%f, ydata=%f' % ( - event.button, event.x, event.y, event.xdata, event.ydata)) - global fmask, lon, lat, PM, nlon, nlat, changed - if cyclic: - # Underlying plot still starts at -180, so fix the coordinate offset - i = lon.nearest_neighbour_index(event.xdata+180) - else: - i = lon.nearest_neighbour_index(event.xdata) - j = lat.nearest_neighbour_index(event.ydata) - changed = True - fmask = PM.get_array() - if cyclic: - fmask.shape = (nlat,nlon+1) - else: - fmask.shape = (nlat,nlon) - # To make visible which points have been flipped, set new land - # to 2, new ocean to -1 - if fmask[j,i] == 1: - fmask[j,i] = -1 - elif fmask[j,i] == 0: - fmask[j,i] = 2 - elif fmask[j,i] == -1: - # Flip back to original - fmask[j,i] = 1 - elif fmask[j,i] == 2: - fmask[j,i] = 0 -# http://wiki.scipy.org/Cookbook/Matplotlib/Animations - PM.set_array(fmask[:,:].ravel()) - plt.draw() - -cid = plt.gcf().canvas.mpl_connect('button_press_event', onclick) -plt.show() - -if changed: - - if cyclic: - # Remove the extra longitude - fmask = fmask[:,:-1] - - # Now save a list of the changed points for CAP - print("Number of points changed", np.sum(fmask != origmask)) - - # Need to flip the order here to N-S. - orig = origmask[::-1].ravel() - new = fmask[::-1].ravel() - - for k in range(len(orig)): - if orig[k] != new[k]: - if new[k] == -1: # Flipped ocean value - status = ".FALSE." - else: - status = ".TRUE." - args.outfile.write("&DATAC FIELD_NO=1, POINT_NO=%d, DATA_NEW=%s /\n" % \ - (k+1, status)) - diff --git a/src/umfile_utils/mergefiles.py b/src/umfile_utils/mergefiles.py deleted file mode 100644 index 52c0b4ff..00000000 --- a/src/umfile_utils/mergefiles.py +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env python - -# Merge two UM fieldsfiles -# All fields are merged, so for finer control subset the files -# separately first. -# Basic header information is taken from the first file. -# By default, duplicate fields are also from the first file -# (override with the -d option) - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * -import argparse - -parser = argparse.ArgumentParser(description='Merge UM files') - -parser.add_argument('-d', '--default', dest='duplicate', type=int, default=1, - help='default file for duplicate fields (1 or 2)') - -parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', - default=False, help='verbose output') - -parser.add_argument('file1', help='Input file') -parser.add_argument('file2', help='Input file') -parser.add_argument('file3', help='Output file') - -args = parser.parse_args() - -f1 = umfile.UMFile(args.file1) - -f2 = umfile.UMFile(args.file2) - -g = umfile.UMFile(args.file3, "w") -g.copyheader(f1) - -print("Lookup sizes", f1.fixhd[FH_LookupSize2], f1.fixhd[FH_LookupSize1], - f2.fixhd[FH_LookupSize2], f2.fixhd[FH_LookupSize1]) - -g.ilookup[:] = -99 # Used as missing value - -# Start of data is at fixhd[FH_DataStart], -# This should be a multiple of 2048 + 1 -# Start of lookup table fixhd[FH_LookupStart] -min_dstart = g.fixhd[FH_LookupStart] + g.fixhd[FH_LookupSize2]*g.fixhd[FH_LookupSize1] -dstart = (min_dstart//2048 + 1)*2048 + 1 -g.fixhd[FH_DataStart] = dstart - -# # Should pad g up to the start? -# # Check space -# space = dstart - g.fixhd[FH_LookupStart] -# print "Offsets 1", f1.fixhd[FH_LookupStart], f1.fixhd[FH_DataStart] -# print "Offsets 2", f2.fixhd[FH_LookupStart], f2.fixhd[FH_DataStart] -# print space, (f1.fixhd[FH_LookupSize2] + f2.fixhd[FH_LookupSize2])*f1.fixhd[FH_LookupSize1] - -k1=0 -k2=0 -kout = 0 -kount = dstart-1 # dstart is index rather than offset -nprog = 0 -ntracer = 0 -end1 = False -end2 = False - -while True: - if args.verbose: - print("K", k1, k2, kout) - if k1 >= f1.fixhd[FH_LookupSize2] or f1.ilookup[k1][LBEGIN]==-99: - end1 = True - if k2 >= f2.fixhd[FH_LookupSize2] or f2.ilookup[k2][LBEGIN]==-99: - end2 = True - - if end1 and end2: - break - if end1: - f = f2 - k = k2 - k2 += 1 - elif end2: - f = f1 - k = k1 - k1 += 1 - else: - if f1.ilookup[k1][ITEM_CODE] == f2.ilookup[k2][ITEM_CODE]: - if args.duplicate == 1: - print("Warning - duplicate (using file1 version)", f1.ilookup[k1][ITEM_CODE]) - f = f1 - k = k1 - else: - print("Warning - duplicate (using file2 version)", f1.ilookup[k1][ITEM_CODE]) - f = f2 - k = k2 - k1 += 1 - k2 += 1 - elif f1.ilookup[k1][ITEM_CODE] < f2.ilookup[k2][ITEM_CODE]: - f = f1 - k = k1 - k1 += 1 - else: - f = f2 - k = k2 - k2 += 1 - - g.ilookup[kout] = f.ilookup[k] - g.rlookup[kout] = f.rlookup[k] - - data = f.readfld(k,raw=True) - g.writefld(data,kout,raw=True) - if umfile.isprog(g.ilookup[kout]): - nprog += 1 - if umfile.istracer(g.ilookup[kout]): - ntracer += 1 - kout += 1 - -# This sort of correction should be in a new function? - -# To get correct number of tracer fields need to divide by number of levels -ntracer /= g.inthead[IC_TracerLevs] - -g.fixhd[FH_LookupSize2] = kout -g.fixhd[FH_NumProgFields] = nprog -g.inthead[IC_TracerVars] = ntracer -if ntracer > 0 and g.inthead[IC_TracerLevs] != g.inthead[IC_PLevels]: - g.inthead[IC_TracerLevs] = g.inthead[IC_PLevels] - -g.close() diff --git a/src/umfile_utils/mergefiles_region.py b/src/umfile_utils/mergefiles_region.py deleted file mode 100644 index d91a7648..00000000 --- a/src/umfile_utils/mergefiles_region.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python - -# Merge two UM fieldsfiles -# Files must have exactly same fields, grids etc - -# This version only merges the specified region (defined as for -# subset_ancillary) from field in file1 to field in file2 -# Merge region is specified by the indices of the lower left corner (x0,y0) -# and the extents nx, ny. -# These are specified as arguments -x x0,nx -y y0,ny -# Note that (x0,y0) are 0 based indices -# Martin Dix martin.dix@csiro.au - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * - -def usage(): - print "Usage: mergefiles_region.py -x x0,nx -y y0,ny file1 file2 outputfile" - sys.exit(2) - -verbose = False -try: - optlist, args = getopt.getopt(sys.argv[1:], 'x:y:v') - for opt in optlist: - if opt[0] == '-v': - verbose = True - elif opt[0] == '-x': - x0 = int(opt[1].split(',')[0]) - nx = int(opt[1].split(',')[1]) - elif opt[0] == '-y': - y0 = int(opt[1].split(',')[0]) - ny = int(opt[1].split(',')[1]) -except getopt.error: - usage() - sys.exit(2) - -if len(args) != 3: - print "Missing filename arguments" - usage() - -# Section to take -if verbose: - print "Section", x0, y0, nx, ny - -f1 = umfile.UMFile(args[0]) -f2 = umfile.UMFile(args[1]) -g = umfile.UMFile(args[2], "w") -g.copyheader(f1) - -for k in range(f1.fixhd[FH_LookupSize2]): - if f1.ilookup[k][LBEGIN]==-99 or f2.ilookup[k][LBEGIN]==-99: - break - - if f1.ilookup[k][ITEM_CODE] != f2.ilookup[k][ITEM_CODE]: - raise Exception("files do not match %d %d %d" % - (k, f1.ilookup[k][ITEM_CODE], f2.ilookup[k][ITEM_CODE])) - - data1 = f1.readfld(k) - dataout = f2.readfld(k) - dataout[y0:y0+ny,x0:x0+nx] = data1[y0:y0+ny,x0:x0+nx] - - g.writefld(dataout.astype(g.float),k) - -g.close() diff --git a/src/umfile_utils/nccmp_um2netcdf.py b/src/umfile_utils/nccmp_um2netcdf.py deleted file mode 100644 index 620b6ae1..00000000 --- a/src/umfile_utils/nccmp_um2netcdf.py +++ /dev/null @@ -1,101 +0,0 @@ -# Compare two files produced by um2netcdf4.py and variants - -import sys, netCDF4, argparse, numpy as np - -parser = argparse.ArgumentParser(description="Compare netcdf files from um2netcdf4.py") -parser.add_argument('-d', dest='strict_dims', action='store_true', - default=False, help="Strict comparison of dimensions") -parser.add_argument('-s', dest='strict', action='store_true', - default=False, help="Strict comparison") -parser.add_argument('file1', help='Input file1') -parser.add_argument('file2', help='Input file2') - -args = parser.parse_args() - -d1 = netCDF4.Dataset(args.file1) -d2 = netCDF4.Dataset(args.file2) - -if args.strict: - args.strict_dims = True - -if args.strict_dims: - # Compare dimensions - dims1 = set(d1.dimensions.keys()) - dims2 = set(d2.dimensions.keys()) - - if dims1 - dims2: - print("File 1 has dimensions not in file 2:", dims1 - dims2) - if dims2 - dims1: - print("File 2 has dimensions not in file 1:", dims2 - dims1) - if dims1.symmetric_difference(dims2): - print("Common dimensions", dims1.intersection(dims2)) - for dim in dims1.intersection(dims2): - if d1.dimensions[dim].size == d2.dimensions[dim].size: - # Check values - if dim == 'bnds': - continue - v1 = d1.variables[dim] - v2 = d2.variables[dim] - if not np.allclose(v1[:], v2[:]): - diff = abs(v1[:] - v2[:]) - imax = np.unravel_index(diff.argmax(), diff.shape) - print("Dimension values differ:", dim, imax, v1[imax], v2[imax]) - else: - print("Dimension sizes differ:", dim, d1.dimensions[dim].size, d2.dimensions[dim].size) - -# Get names of pressure dimensions and whether they're increasing or decreasing -d1inc = {} -d2inc = {} -for d in d1.dimensions: - if d == 'bnds': - continue - v = d1.variables[d] - if (hasattr(v,'long_name') and 'pressure' in v.long_name or - hasattr(v,'standard_name') and 'pressure' in v.standard_name): - if v[0] < v[-1]: - d1inc[d] = True - else: - d1inc[d] = False -for d in d2.dimensions: - if d == 'bnds': - continue - v = d2.variables[d] - if (hasattr(v,'long_name') and 'pressure' in v.long_name or - hasattr(v,'standard_name') and 'pressure' in v.standard_name): - if v[0] < v[-1]: - d2inc[d] = True - else: - d2inc[d] = False - -print("d1inc:", d1inc) -print("d2inc:", d2inc) - -# Expect variable names of form fld_* -vars1 = {v for v in d1.variables if v.startswith('fld_')} -vars2 = {v for v in d2.variables if v.startswith('fld_')} -if vars1 - vars2: - print("File 1 has variables not in file 2:", vars1 - vars2) -if vars2 - vars1: - print("File 2 has variables not in file 1:", vars2 - vars1) - -for v in sorted(vars1.intersection(vars2)): - v1 = d1.variables[v] - v2 = d2.variables[v] - # This might just be due to renaming of dimensions - if args.strict_dims and v1.dimensions != v2.dimensions: - print("Dimension mismatch:", v, v1.dimensions, v2.dimensions) - if v1.shape == v2.shape: - # Compare values - # Is the vertical axis reversed. Assume this is always the second dimension - if (v1.dimensions[1] in d1inc and v2.dimensions[1] in d2inc and - d1inc[v1.dimensions[1]] ^ d2inc[v2.dimensions[1]]): - print("Comparing %s with reversed pressure dimension" % v) - v2 = v2[:,::-1] - if not np.allclose(v1[:], v2[:]): - diff = abs(v1[:] - v2[:]) - imax = np.unravel_index(diff.argmax(), diff.shape) - print("Values differ:", v, imax, v1[imax], v2[imax]) - if v1[:].mask.sum() != v2[:].mask.sum(): - print("Number of masked points differs:", v, v1[:].mask.sum(), v2[:].mask.sum()) - else: - print("Shape mismatch:", v, v1.shape, v2.shape) diff --git a/src/perturbIC.py b/src/umfile_utils/perturbIC.py similarity index 96% rename from src/perturbIC.py rename to src/umfile_utils/perturbIC.py index 735b3389..fc152a42 100644 --- a/src/perturbIC.py +++ b/src/umfile_utils/perturbIC.py @@ -32,7 +32,8 @@ def parse_args(): help = 'The seed value used to generate the random perturbation (must be a non-negative integer).') parser.add_argument('--validate', action='store_true', help='Validate the output fields file using mule validation.') - parser.add_argument('-o', '--output', dest = output_path, metavar="OUTPUT_PATH", help='Path to the output file. If omitted, the default output file is created by appending "_perturbed" to the input path.') + parser.add_argument('-o', '--output', dest='output_path', metavar="OUTPUT_PATH", + help='Path to the output file. If omitted, the default output file is created by appending "_perturbed" to the input path.') args_parsed = parser.parse_args() return args_parsed @@ -179,7 +180,6 @@ def void_validation(*args, **kwargs): Don't perform the validation, but print a message to inform that validation has been skipped. """ print('Skipping mule validation. To enable the validation, run using the "--validate" option.') - return def main(): @@ -200,7 +200,7 @@ def main(): random_generator = create_random_generator(args.seed) # Skip mule validation if the "--validate" option is provided - if args.validate: + if not args.validate: mule.DumpFile.validate = void_validation ff_raw = mule.DumpFile.from_file(args.ifile) @@ -225,5 +225,5 @@ def main(): if __name__== "__main__": - main() + main() # pragma: no cover diff --git a/src/umfile_utils/polar_anom.py b/src/umfile_utils/polar_anom.py deleted file mode 100644 index 6b0b62f8..00000000 --- a/src/umfile_utils/polar_anom.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python - -# Check whether fields at poles have any spurious zonal variation -# Exclude fields on u and v grids (v grid not at poles, u values at poles -# not used?) - -# Martin Dix martin.dix@csiro.au - -from __future__ import print_function -import numpy as np -import getopt, sys -from um_fileheaders import * -import umfile, stashvar - -verbose = False -try: - optlist, args = getopt.getopt(sys.argv[1:], 'v') - for opt in optlist: - if opt[0] == '-v': - verbose = True -except getopt.error: - print("Usage: polar_anom [-v] ifile ") - sys.exit(2) - -if args: - ifile = args[0] - -f = umfile.UMFile(ifile) - -if not f.fieldsfile: - print("Not a UM fieldsfile") - sys.exit(1) - -if f.fixhd[FH_HorizGrid] != 0: - print("Error - not a global grid: FH_HorizGrid=", f.fixhd[FH_HorizGrid]) - sys.exit(1) - -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - rlookup = f.rlookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - - # Determine the grid from the zeroth latitude and longitude - if not ( np.allclose(rlookup[BZY] + rlookup[BDY], -90.) and - np.allclose(rlookup[BZX] + rlookup[BDX], 0.) ): - if verbose: - print("Skipping grid", ilookup[ITEM_CODE]) - continue - - data = f.readfld(k) - - if len(data.shape)==1: - print("Shape error", ilookup[ITEM_CODE], data.shape) - continue - - anom_sp = data[0,:].max() - data[0,:].min() - anom_np = data[-1,:].max() - data[-1,:].min() - if verbose: - print(ilookup[ITEM_CODE], anom_sp.max(), anom_np.max()) - if anom_sp > 0 or anom_np > 0: - print("Error - polar anomaly: Field %d Level %d Index %d" % (ilookup[ITEM_CODE], ilookup[LBLEV], k)) - rel_sp = rel_np = 0. - if anom_sp > 0: - rel_sp = anom_sp/data[0].mean() - if anom_np > 0: - rel_np = anom_np/data[-1].mean() - print(" Absolute value (SP, NP):", anom_sp, anom_np) - print(" Relative value (SP, NP):", rel_sp, rel_np) - diff --git a/src/umfile_utils/prog_fields_mismatch.py b/src/umfile_utils/prog_fields_mismatch.py deleted file mode 100644 index 093d7b73..00000000 --- a/src/umfile_utils/prog_fields_mismatch.py +++ /dev/null @@ -1,75 +0,0 @@ -# Find reason for mismatch in number of prognostic fields. -# Compare model output that lists the expected fields with the -# fields in the astart file - -# Expected fields start with -# No of objects in this submodel: 197 -# Type Modl Sect Item Address Length Levels Gridtype Halotype -# 1 0 1 0 2 1 1083684 38 18 1 - -# Arguments are model output and restart file - -import sys, umfile, collections -from um_fileheaders import * - -lines = open(sys.argv[1]).readlines() - -# Expected fields -header_found = False -for k, l in enumerate(lines): - if l.lstrip().startswith("No of objects in this submodel"): - header_found = True - break - -if not header_found: - print("Error - header line not found in %s" % (sys.argv[1])) - print("Expecting line starting with 'No of objects in this submodel'") - sys.exit(1) - -# Now look for line starting with 1 -k += 1 -while not lines[k].lstrip().startswith("1 "): - k += 1 - -expected = {} -while True: - fields = lines[k].split() - if len(fields) < 10 or fields[1] != '0': - break - # Stashcode and number of levels - expected[int(fields[4])] = int(fields[7]) - k += 1 - -# Now look at the restart file -f = umfile.UMFile(sys.argv[2]) -if not f.fieldsfile: - print("Error: %s is not a UM fieldsfile") - sys.exit(1) - -start_fields = collections.defaultdict(int) -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - if umfile.isprog(ilookup): - start_fields[ilookup[ITEM_CODE]] += 1 - - -print("No. of prognostic fields in start file:", sum(start_fields.values())) -nexpect = sum(expected.values()) -print("Expected no. of prognostic fields: ", nexpect) - -expt = set(expected.keys()) -rest = set(start_fields.keys()) - -# Fields missing from restart -missing = expt-rest -unexpected = rest-expt -if missing: - print("\nFields missing from restart", sorted(missing)) -if unexpected: - print("\nUnexpected fields in restart", sorted(unexpected)) -for fld in expt.intersection(rest): - if expected[fld] != start_fields[fld]: - print("Mismatch in number of fields with code", fld, expected[fld], start_fields[fld]) diff --git a/src/umfile_utils/read_stashmaster.py b/src/umfile_utils/read_stashmaster.py deleted file mode 100644 index 1f5103df..00000000 --- a/src/umfile_utils/read_stashmaster.py +++ /dev/null @@ -1,132 +0,0 @@ -# Read UM STASHmaster file to set up dictionary of variable names etc. -# Field names are taken from Appendix 3 of UMCP C4 - -# Format of STASHmaster file is - -#|Model |Sectn | Item |Name | -#|Space |Point | Time | Grid |LevelT|LevelF|LevelL|PseudT|PseudF|PseudL|LevCom| -#| Option Codes | Version Mask | Halo | -#|DataT |DumpP | PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PCA | -#|Rotate| PPFC | USER | LBVC | BLEV | TLEV |RBLEVV| CFLL | CFFF | - -stash_sections = { - 0:"Prognostic variables at the end of the time-step", - 1: "S.W Radiation", - 2: "L.W Radiation", - 3: "Boundary Layer/Surface", - 4: "Large-Scale Precipitation", - 5: "Convection", - 6: "Gravity Wave drag", - 7: "Vertical diffusion", - 8: "Hydrology", - 9: "Cloud: scheme", - 10: "Adjustment", - 11: "Tracer Advection", - 12: "Primary field advection", - 13: "Diffusion and filtering", - 14: "Energy adjustment", - 15: "Processed dynamics diags", - 16: "Processed physics diags", - 17: "Sulphur Cycle", - 18: "Data assimilation", - 19: "Vegetation", - 20: "Field Calc Diagnostic", - 26: "River Routing", - 30: "Processed Climate diagnostics", - 31: "LBC fields for input (ie. by a LAM model)", - 32: "LBC fields for output", - 33: "Atmospheric Tracers", - 34: "UKCA Chemistry"} - -# Variable data type -datat = { 1:"Real", 2:"Integer", 3:"Logical" } - -levelt = { 0:"Unspecified", 1:"Rho", 2:"Theta", 3:"Pressure", 4:"Obsolete", 5:"Single", 6:"Deep Soil", 7:"Pot. temp." } - -# Pseudo-levels, defined in UMDP C4 and UMUI atmos_STASH_Domain2.pan -pseudt = {0:'None', - 1:'SW radiation bands', - 2: 'LW radiation bands', - 3: 'Atmospheric assimilation groups', - 8: 'HadCM2 Sulphate Loading Pattern Index', - 9: 'Land and vegetation surface types', - 10: 'Sea-ice categories', - 11: 'Snow layers over tiles', - 12: 'COSP radar reflectivity intervals', - 13: 'COSP hydrometeors', - 14: 'COSP lidar SR intervals', - 15: 'COSP tau bins', - 16: 'COSP subcolumns', - 101: 'Atmos User Defined Type 101', - 102: 'Atmos User Defined Type 102', - 103: 'Atmos User Defined Type 103' } - - -def read_stash(filename): - f = open(filename) - - kount = 0 - last_section = 0 - stashd = {} - for l in f.readlines(): - if l.startswith("H3"): - s = l.split("=") - version = s[1].strip() - elif l.startswith("1|"): - # Start of a new variable - vard = {} - s = l.split("|") - model = int(s[1]) - if model == -1: - break - vard["model"] = model - section = int(s[2]) - item = int(s[3]) - vard["section"] = int(s[2]) - vard["item"] = int(s[3]) - vard["name"] = s[4].strip() - code = 1000*section+item - elif l.startswith("2|"): - s = l.split("|") - vard["space"] = int(s[1]) - vard["point"] = int(s[2]) - vard["time"] = int(s[3]) - vard["grid"] = int(s[4]) - vard["levelt"] = int(s[5]) - vard["levelf"] = int(s[6]) - vard["levell"] = int(s[7]) - vard["pseudt"] = int(s[8]) - vard["pseudf"] = int(s[9]) - vard["pseudl"] = int(s[10]) - vard["levcom"] = int(s[11]) - elif l.startswith("3|"): - s = l.split("|") - vard["optioncode"] = s[1].strip() - vard["version_mask"] = s[2].strip() - vard["halo"] = int(s[3]) - elif l.startswith("4|"): - s = l.split("|") - vard["datat"] = int(s[1]) - vard["dumpp"] = int(s[2]) - vard["pc"] = [int(x) for x in s[3].split()] - # print 'atm_stashvar[%d] = ["%s", "", "", ""]' % (code, long_name) - elif l.startswith("5|"): - # Last line - s = l.split("|") - vard["rotate"] = int(s[1]) - vard["ppfc"] = int(s[2]) - vard["user"] = int(s[3]) - vard["lbvc"] = int(s[4]) - vard["blev"] = int(s[5]) - vard["tlev"] = int(s[6]) - vard["rblevv"] = int(s[7]) - vard["cfll"] = int(s[8]) - vard["cfff"] = int(s[9]) - stashd[code] = vard - - return stashd - -if __name__ == '__main__': - stashd = read_stash("STASHmaster_A") - print stashd[3328] - print pseudt[stashd[3328]['pseudt']] diff --git a/src/umfile_utils/remove_stash_duplicates.py b/src/umfile_utils/remove_stash_duplicates.py deleted file mode 100644 index 68f5a6ab..00000000 --- a/src/umfile_utils/remove_stash_duplicates.py +++ /dev/null @@ -1,63 +0,0 @@ -# STASH files from Gregorian calendar runs may end up with duplicate times -# from restarting from dumps that aren't at exact month end. - -# This script looks for such duplicates and removes them -# Uses a check sum to test whether the fields are truly identical. - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * -from zlib import adler32 - -verbose = False -try: - optlist, args = getopt.getopt(sys.argv[1:], 'i::o:v') - for opt in optlist: - if opt[0] == '-i': - ifile = opt[1] - elif opt[0] == '-o': - ofile = opt[1] - elif opt[0] == '-v': - verbose = True -except getopt.error: - print "Usage: remove_stash_duplicates.py -i ifile -o ofile [-v]" - sys.exit(2) - -f = umfile.UMFile(ifile) -g = umfile.UMFile(ofile, "w") -g.copyheader(f) -g.ilookup[:] = -99 # Used as missing value -g.rlookup[:] = np.fromstring(np.array([-99],g.int).tostring(),g.float) - -# Loop over all the fields, counting the number of prognostic fields -kout = 0 -lookupset = set() -checksums = {} -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - if ilookup[LBEGIN] == -99: - break - - s = f.readfld(k,raw=True) - check = adler32(s) - - # Take a copy - tmplookup = np.array(ilookup) - tmplookup[LBEGIN] = tmplookup[NADDR] = 0 - key = tuple(tmplookup) - if key in lookupset: - print "Duplicate", k, ilookup[ITEM_CODE], ilookup[:4] - if check != checksums[key]: - raise Exception("Error - data mismatch %d", k) - else: - lookupset.add(key) - checksums[key] = check - g.ilookup[kout,:] = ilookup[:] - g.rlookup[kout,:] = f.rlookup[k,:] - g.writefld(s, kout, raw=True) - kout += 1 - -# Set the header to be just large enough -g.fixhd[FH_LookupSize2] = kout -g.close() diff --git a/src/umfile_utils/reset_neg_snow.py b/src/umfile_utils/reset_neg_snow.py deleted file mode 100644 index a4dc402d..00000000 --- a/src/umfile_utils/reset_neg_snow.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python -# Reset any negative snow values, stash codes 23 and 240 - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * - - -ifile = sys.argv[1] - -f = umfile.UMFile(ifile, 'r+') - -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - if ilookup[ITEM_CODE] in [23, 240]: - a = f.readfld(k) - a[a<0.] = 0. - f.writefld(a,k) - -f.close() diff --git a/src/umfile_utils/show_land_overlap.py b/src/umfile_utils/show_land_overlap.py deleted file mode 100644 index 72cfe266..00000000 --- a/src/umfile_utils/show_land_overlap.py +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env python - -# Reconfiguration can give incorrect results if there are land points in the -# target grid but none have an adjacent land point on the global grid - -# This script takes the full region regional mask and marks land points -# that don't have such neighbours by setting mask values to -1. - -# Create a copy of the mask with disallowed corner points - -# Usage is show_land_overlap.py global_mask regional_mask disallowed - -# Note that this isn't going to work for rotated grids. - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import sys -import umfile -from um_fileheaders import * - -file1 = sys.argv[1] -file2 = sys.argv[2] -file3 = sys.argv[3] - -f = umfile.UMFile(file1) -g = umfile.UMFile(file2, 'r+') -h = umfile.UMFile(file3, 'w') - -h.copyheader(g) -h.ilookup[:] = -99 # Used as missing value -h.rlookup[:] = np.fromstring(np.array([-99],h.int).tostring(),h.float) - -def getfld(f): - # Expecting only a single field - ilookup = f.ilookup[0] - - # Check field name and data type. - # Expecting stash code 1 0 30 LAND MASK - if ilookup[ITEM_CODE] != 30: - print "Variable is not land mask, stashcode is", ilookup[ITEM_CODE] - sys.exit(1) - if ilookup[DATA_TYPE] != 3: - print "Variable is not expected logical type, code is", ilookup[DATA_TYPE] - sys.exit(1) - - data = f.readfld(0) - return data, ilookup, f.rlookup[0] - -gmask, ilook1, rlook1 = getfld(f) -# Check that this file is global with starting point at -90,0 -if ( not (rlook1[BDY] + rlook1[BZY] == -90. and - rlook1[BDX] + rlook1[BZX] == 0.) or - not (rlook1[BDY]*ilook1[LBROW] + rlook1[BZY] == 90. and - rlook1[BDX]*(ilook1[LBNPT]+1) + rlook1[BZX] == 360.)): - raise Exception("First file is not global") - -rmask, ilook2, rlook2 = getfld(g) - -# Mask may be +-1 depending on compiler used in ancillary program. -# Coordinates of box centres -glat = rlook1[BZY] + rlook1[BDY]*np.arange(1,ilook1[LBROW]+1) -glon = rlook1[BZX] + rlook1[BDX]*np.arange(1,ilook1[LBNPT]+1) -rlat = rlook2[BZY] + rlook2[BDY]*np.arange(1,ilook2[LBROW]+1) -rlon = rlook2[BZX] + rlook2[BDX]*np.arange(1,ilook2[LBNPT]+1) - -# Find the indices of the global box to the lower left of the regional grid box -ix = np.zeros(ilook2[LBNPT],np.int) -jy = np.zeros(ilook2[LBROW],np.int) - -iarray = np.arange(len(glon)) -for i in range(ilook2[LBNPT]): - # Want index of the largest global lon that's <= rlon[i] - # Don't need to check bounds because we know the TX region is inside - ix[i] = iarray[glon - rlon[i] <= 0][-1] - -jarray = np.arange(len(glat)) -for j in range(ilook2[LBROW]): - jy[j] = jarray[glat - rlat[j] <= 0][-1] - -for j in range(ilook2[LBROW]): - jj = jy[j] - print j - for i in range(ilook2[LBNPT]): - if rmask[j,i]: - ii = ix[i] - if gmask[jj:jj+2,ii:ii+2].sum() == 0: - rmask[j,i] = -1 - -# Now set up array of bad starting points, assuming 300x300 -bad = np.zeros((ilook2[LBROW], ilook2[LBNPT]), np.int) -rmaskp = (rmask == 1) -rmaskm = (rmask == -1) -for j in range(ilook2[LBROW]-300): - print j - mp = rmaskp[j:j+300].sum(axis=0) - mm = rmaskm[j:j+300].sum(axis=0) - for i in range(ilook2[LBNPT]-300): - # If no correct land points and some problem points it's a bad start - if not np.any(mp[i:i+300]) and np.any(mm[i:i+300]): - bad[j,i] = 1 - -g.writefld(rmask,0) -g.close() - -h.ilookup[0,:] = ilook2[:] -h.rlookup[0,:] = rlook2[:] -h.writefld(bad, 0) -h.close() diff --git a/src/umfile_utils/sortum.py b/src/umfile_utils/sortum.py deleted file mode 100644 index 5447f7f7..00000000 --- a/src/umfile_utils/sortum.py +++ /dev/null @@ -1,41 +0,0 @@ -# Based on sortum perl script, but extended to work with file suffixes -# like .nc - -# For non standard file names use the prefix argument. Otherwise assume -# everything before the first . in the first filename is the prefix - -import sys, re, argparse - -parser = argparse.ArgumentParser(description="Sort list of UM files ") -parser.add_argument('-p', '--prefix', dest='prefix', help='Filename prefix') -parser.add_argument('files', nargs='+', help='Filenames to sort') -args = parser.parse_args() - -months = {'jan':'01', 'feb':'02', 'mar':'03', 'apr':'04', - 'may':'05', 'jun':'06', 'jul':'07', 'aug':'08', - 'sep':'09', 'oct':'10', 'nov':'11', 'dec':'12'} - -if not args.prefix: - fname = args.files[0] - args.prefix = fname[:fname.index('.')] -fname_re = re.compile("%s.p[0-9a-z]\d{4,4}(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec).*" % args.prefix) - -# Standard suite name -# fname_re = re.compile("[a-z][a-z]\d{3,3}a.p[a-z]\d{4,4}(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec).*") - -flist = [] -for fname in args.files: - m = fname_re.match(fname) - if m: - key = fname[m.start(0):m.start(1)] + months[m.group(1)] +\ - fname[m.end(1):m.end()] - flist.append((key, fname)) - else: - raise Exception("Error in matching name %s" % fname) - -flist.sort() - -for f in flist: - sys.stdout.write('%s ' % f[1]) - - diff --git a/src/umfile_utils/split_times.py b/src/umfile_utils/split_times.py deleted file mode 100644 index b39c0f57..00000000 --- a/src/umfile_utils/split_times.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python - -# Split a UM fieldsfiles into separate files for each valid time - -# Usage is -i input -o output -# where output is used as a file prefix - -import numpy as np -import getopt, sys -import umfile, collections, datetime -from um_fileheaders import * - -def usage(): - print "Usage: split_times.py -i ifile -o output_prefix" - sys.exit(2) - -ifile = None -oprefix = None -try: - optlist, args = getopt.getopt(sys.argv[1:], 'i:o:') - for opt in optlist: - if opt[0] == '-i': - ifile = opt[1] - elif opt[0] == '-o': - oprefix = opt[1] -except getopt.error: - usage() - -if not ifile or not oprefix: - usage() - -f = umfile.UMFile(ifile) - -# First pass through to get the number of valid times -times=collections.defaultdict(int) -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - if ilookup[LBEGIN] == -99: - break - t = datetime.datetime(ilookup[LBYR], ilookup[LBMON], - ilookup[LBDAT], ilookup[LBHR], - ilookup[LBMIN], ilookup[LBDAY]) - times[t] += 1 - - -for tout in sorted(times.keys()): - ofile = oprefix + "." + tout.strftime('%Y%m%d%H%M') - - g = umfile.UMFile(ofile, "w") - g.copyheader(f) - g.ilookup[:] = -99 # Used as missing value - g.rlookup[:] = np.fromstring(np.array([-99],g.int).tostring(),g.float) - - # Loop over all the fields, selecting those at time tout - kout = 0 - for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - if ilookup[LBEGIN] == -99: - break - t = datetime.datetime(ilookup[LBYR], ilookup[LBMON], - ilookup[LBDAT], ilookup[LBHR], - ilookup[LBMIN], ilookup[LBDAY]) - if t == tout: - g.ilookup[kout,:] = ilookup[:] - g.rlookup[kout,:] = f.rlookup[k,:] - s = f.readfld(k,raw=True) - g.writefld(s, kout, raw=True) - kout += 1 - - # Set the header to be just large enough - g.fixhd[FH_LookupSize2] = kout - print "%d fields written to %s" % (kout, ofile) - g.close() diff --git a/src/umfile_utils/sstice_ancil.py b/src/umfile_utils/sstice_ancil.py deleted file mode 100644 index 81c01f99..00000000 --- a/src/umfile_utils/sstice_ancil.py +++ /dev/null @@ -1,144 +0,0 @@ -# Set up master ancillary files for CAP from the PCMDI SST and ice -# netcdf files. - -# Need to delete the global calendar attribute first -# ncatted -a calendar,global,d,, amipobs_sst.nc - -import umfile, iris, sys, datetime -from um_fileheaders import * -import numpy as np - -# iris.FUTURE.cell_datetime_objects = True -# Not working yet - -# SST file -sst = iris.load_cube(sys.argv[1]) - -lon = sst.coord('longitude') -lat = sst.coord('latitude') -time = sst.coord('time') -dates = time.units.num2date(time.points) - -f = umfile.UMFile('temp', "w") -f.int = np.int64 -f.float = np.float64 -f.wordsize=8 -f.byteorder = '>' # Big endian -f.sectorsize = 1 - -f.createheader(15, 6) - -f.fixhd[:] = f.missval_i # Initialise to missing - -# Minimal fixed header -f.fixhd[FH_SubModel] = 1 -f.fixhd[FH_VertCoord] = 1 -f.fixhd[FH_HorizGrid] = 0 # Global -f.fixhd[FH_Dataset] = 4 # Ancillary -f.fixhd[FH_CalendarType] = 1 # Gregorian -f.fixhd[FH_GridStagger] = 3 -f.fixhd[FH_AncilDataId] = 1 # Ancillary time series -f.fixhd[FH_ModelVersion] = 805 - -# Initial date -f.fixhd[FH_DTYear] = dates[0].year -f.fixhd[FH_DTMonth] = dates[0].month -f.fixhd[FH_DTDay] = dates[0].day -f.fixhd[FH_DTHour] = dates[0].hour -f.fixhd[FH_DTMinute] = f.fixhd[FH_DTSecond] = 0 -daydiff = ( - datetime.datetime(dates[0].year,dates[0].month, dates[0].day) - - datetime.datetime(dates[0].year,1,1) ) -f.fixhd[FH_DTDayNo] = daydiff.days + 1 - -# Final date -f.fixhd[FH_VTYear] = dates[-1].year -f.fixhd[FH_VTMonth] = dates[-1].month -f.fixhd[FH_VTDay] = dates[-1].day -f.fixhd[FH_VTHour] = dates[-1].hour -f.fixhd[FH_DTMinute] = f.fixhd[FH_VTSecond] = 0 -f.fixhd[FH_VTMinute:FH_VTDayNo+1] = 0 -daydiff = ( - datetime.datetime(dates[-1].year,dates[-1].month, dates[-1].day) - - datetime.datetime(dates[-1].year,1,1) ) -f.fixhd[FH_VTDayNo] = daydiff.days + 1 - -# Monthly step -f.fixhd[FH_CTYear:FH_CTDayNo+1] = 0 -f.fixhd[FH_CTMonth] = 1 - -f.fixhd[FH_DataSize] = sst.data.size - -f.fixhd[FH_IntCSize] = 15 -f.fixhd[FH_RealCSize] = 6 - -f.inthead = np.zeros(f.fixhd[FH_IntCSize], f.int) + f.missval_i -f.inthead[IC_XLen] = len(lon.points) -f.inthead[IC_YLen] = len(lat.points) -f.inthead[2] = len(dates) # Seems to be used in ancil files -f.inthead[14] = 1 # Number of field types in file -f.inthead[IC_PLevels] = 1 - -f.realhead = np.zeros(f.fixhd[FH_RealCSize], f.float) + f.missval_r -f.realhead[RC_LongSpacing] = lon.points[1] - lon.points[0] -f.realhead[RC_LatSpacing] = lat.points[1] - lat.points[0] -f.realhead[RC_FirstLong] = lon.points[0] -f.realhead[RC_FirstLat] = lat.points[0] -f.realhead[RC_PoleLong] = 0. -f.realhead[RC_PoleLat] = 90. - -# Start integer header after the fixed header -f.fixhd[FH_IntCStart] = 257 -f.fixhd[FH_RealCStart] = f.fixhd[FH_IntCStart] + f.fixhd[FH_IntCSize] -f.fixhd[FH_LookupStart] = f.fixhd[FH_RealCStart] + f.fixhd[FH_RealCSize] -# Create lookup tables -f.fixhd[FH_LookupSize1] = 64 -f.fixhd[FH_LookupSize2] = sst.shape[0] - -f.fixhd[FH_DataStart] = f.fixhd[FH_LookupStart] + \ - f.fixhd[FH_LookupSize1]*f.fixhd[FH_LookupSize2] - -f.ilookup = np.zeros((f.fixhd[FH_LookupSize2], f.fixhd[FH_LookupSize1]), f.int) -f.rlookup = np.zeros((f.fixhd[FH_LookupSize2], f.fixhd[FH_LookupSize1]), f.float) - -for k in range(sst.shape[0]): - f.ilookup[k,MODEL_CODE] = 1 - f.ilookup[k,ITEM_CODE] = 24 # Surface temperature - f.ilookup[k,LBPACK] = 2 - f.ilookup[k,LBYR] = f.ilookup[k,LBYRD] = dates[k].year - f.ilookup[k,LBMON] = f.ilookup[k,LBMOND] = dates[k].month - f.ilookup[k,LBDAT] = f.ilookup[k,LBDATD] = dates[k].day - f.ilookup[k,LBHR] = f.ilookup[k,LBHRD] = dates[k].hour - # Day no relative to the start of the year (matches what CAP - # produces) - daydiff = ( - datetime.datetime(dates[k].year,dates[k].month, dates[k].day) - - datetime.datetime(dates[k].year,1,1) ) - f.ilookup[k,LBDAY] = f.ilookup[k,LBDAYD] = daydiff.days + 1 - - # For ancillary files at least - f.ilookup[k,LBTIM] = f.fixhd[FH_CalendarType] - f.ilookup[k,LBCODE] = 1 - f.ilookup[k,LBHEM] = 0 - f.ilookup[k,LBREL] = 2 # Header release version <= vn8.0 - f.ilookup[k,LBVC] = 129 # Surface - f.ilookup[k,DATA_TYPE] = 1 # Real - f.ilookup[k,LBROW] = len(lat.points) - f.ilookup[k,LBNPT] = len(lon.points) - - f.rlookup[k,BPLAT] = f.realhead[RC_PoleLat] - f.rlookup[k,BPLON] = f.realhead[RC_PoleLong] - f.rlookup[k,BZY] = f.realhead[RC_FirstLat] - f.realhead[RC_LatSpacing] - f.rlookup[k,BDY] = f.realhead[RC_LatSpacing] - f.rlookup[k,BZX] = f.realhead[RC_FirstLong] - f.realhead[RC_LongSpacing] - f.rlookup[k,BDX] = f.realhead[RC_LongSpacing] - - f.rlookup[k,BMDI] = f.missval_r - f.rlookup[k,BMKS] = 1.0 - - # Better way to do this on creation? - f.rlookup[k] = f.rlookup[k].newbyteorder('>') - - f.writefld(sst.data[k],k) - -f.close() diff --git a/src/umfile_utils/stashvar.py b/src/umfile_utils/stashvar.py deleted file mode 100644 index 10bd47d6..00000000 --- a/src/umfile_utils/stashvar.py +++ /dev/null @@ -1,4702 +0,0 @@ -# UM STASH variable names from section and item numbers -# Where available variable names match PCMDI convention -# Last field is a unique name suitable for filenames or creating multiple -# variables in a single file - -atm_stashvar = {} - -atm_stashvar[2] = ["U COMPNT OF WIND AFTER TIMESTEP", "ua", "m s-1", "eastward_wind", ""] -atm_stashvar[3] = ["V COMPNT OF WIND AFTER TIMESTEP", "va", "m s-1", "northward_wind", ""] -atm_stashvar[4] = ["THETA AFTER TIMESTEP", "theta", "K", "", ""] -atm_stashvar[5] = ["OROGRAPHIC GRADIENT X COMPONENT", "orog_dx", "", "", ""] -atm_stashvar[6] = ["OROGRAPHIC GRADIENT Y COMPONENT", "orog_dy", "", "", ""] -atm_stashvar[7] = ["UNFILTERED OROGRAPHY", "orog_unfilt", "", "", ""] -atm_stashvar[8] = ["SOIL BULK DENSITY", "", "kg m-3", "", ""] -atm_stashvar[9] = ["SOIL MOISTURE CONTENT IN A LAYER", "", "", "", ""] -atm_stashvar[10] = ["SPECIFIC HUMIDITY AFTER TIMESTEP", "hus", "1", "specific_humidity", ""] -atm_stashvar[12] = ["QCF AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[13] = ["CONV CLOUD AMOUNT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[14] = ["CONV CLOUD BASE LEVEL NO. AFTER TS", "", "", "", ""] -atm_stashvar[15] = ["CONV CLOUD TOP LEVEL NO. AFTER TS", "", "", "", ""] -atm_stashvar[16] = ["CONV CLOUD LIQUID WATER PATH", "", "", "", ""] -atm_stashvar[17] = ["SILHOUETTE OROGRAPHIC ROUGHNESS", "", "", "", ""] -atm_stashvar[18] = ["HALF OF (PEAK TO TROUGH HT OF OROG)", "", "", "", ""] -atm_stashvar[20] = ["DEEP SOIL TEMP AFTER TIMESTEP", "tsl", "K", "soil_temperature", ""] -atm_stashvar[21] = ["CCRad : Lowest conv. cld base layer", "", "", "", ""] -atm_stashvar[22] = ["CANOPY WATER AFTER TIMESTEP KG/M2", "", "", "", ""] -atm_stashvar[23] = ["SNOW AMOUNT OVER LAND AFT TSTP KG/M2", "snw", "kg m-2", "surface_snow_amount", ""] -atm_stashvar[24] = ["SURFACE TEMPERATURE AFTER TIMESTEP", "ts", "K", "surface_temperature", ""] -atm_stashvar[25] = ["BOUNDARY LAYER DEPTH AFTER TIMESTEP", "bldepth", "m", "", ""] -atm_stashvar[26] = ["ROUGHNESS LENGTH AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[27] = ["SNOW EDGE AFTER TIMESTEP **", "", "", "", ""] -atm_stashvar[28] = ["SURFACE ZONAL CURRENT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[29] = ["SURFACE MERID CURRENT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[30] = ["LAND MASK (No halo) (LAND=TRUE)", "lmask", "1", "land_binary_mask", ""] -atm_stashvar[31] = ["FRAC OF SEA ICE IN SEA AFTER TSTEP", "sic", "1", "sea_ice_area_fraction", ""] -atm_stashvar[32] = ["SEA ICE DEPTH (MEAN OVER ICE) M", "sit", "m", "sea_ice_thickness", ""] -atm_stashvar[33] = ["OROGRAPHY (/STRAT LOWER BC)", "orog", "m", "surface_altitude", ""] -atm_stashvar[34] = ["STANDARD DEVIATION OF OROGRAPHY", "orog_sd", "", "", ""] -atm_stashvar[35] = ["OROGRAPHIC GRADIENT XX COMPONENT", "orog_dxx", "", "", ""] -atm_stashvar[36] = ["OROGRAPHIC GRADIENT XY COMPONENT", "orog_dxy", "", "", ""] -atm_stashvar[37] = ["OROGRAPHIC GRADIENT YY COMPONENT", "orog_dyy", "", "", ""] -atm_stashvar[38] = ["ICE EDGE IN THE ANCILLARY FILE ONLY", "", "", "", ""] -atm_stashvar[39] = ["SST ANOMALY", "", "", "", ""] -atm_stashvar[40] = ["VOL SMC AT WILTING AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[41] = ["VOL SMC AT CRIT PT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[43] = ["VOL SMC AT SATURATION AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[44] = ["SAT SOIL CONDUCTIVITY AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[46] = ["THERMAL CAPACITY AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[47] = ["THERMAL CONDUCTIVITY AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[48] = ["SATURATED SOIL WATER SUCTION", "", "", "", ""] -atm_stashvar[49] = ["SEA-ICE TEMPERATURE AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[50] = ["VEGETATION FRACTION AFTER TIMESTEP", "", "1", "vegetation_area_fraction", ""] -atm_stashvar[51] = ["ROOT DEPTH AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[52] = ["SNOW-FREE SURFACE ALBEDO AFTER TS", "", "", "", ""] -atm_stashvar[53] = ["DEEP SNOW SURFACE ALBEDO AFTER TS", "", "", "", ""] -atm_stashvar[54] = ["SURFACE RESISTANCE TO EVAP AFTER TS", "", "", "", ""] -atm_stashvar[55] = ["SURFACE CAPACITY AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[56] = ["INFILTRATION FACTOR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[57] = ["TOTAL AEROSOL EMISSIONS (FOR VIS)", "", "", "", ""] -atm_stashvar[58] = ["SULPHUR DIOXIDE EMISSIONS", "", "kg m-2 s-1", "", ""] -atm_stashvar[59] = ["DIMETHYL SULPHIDE EMISSIONS (ANCIL)", "", "kg m-2 s-1", "", ""] -atm_stashvar[60] = ["OZONE **", "", "", "", ""] -atm_stashvar[70] = ["TURBULENT KINETIC ENERGY", "", "", "", ""] -atm_stashvar[71] = ["SELF COVARIANCE OF THETAL'", "", "", "", ""] -atm_stashvar[72] = ["SELF COVARIANCE OF QW'", "", "", "", ""] -atm_stashvar[73] = ["CORRELATION OF THETAL' AND QW'", "", "", "", ""] -atm_stashvar[74] = ["HEIGHT OF MIXED LAYER FOR SHCU BUOY", "", "", "", ""] -atm_stashvar[75] = ["CLOUD NUMBER AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[76] = ["RAIN NUMBER AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[77] = ["RAIN THIRD MOMENT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[78] = ["ICE NUMBER AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[79] = ["SNOW NUMBER AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[80] = ["SNOW THIRD MOMENT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[81] = ["GRAUPEL NUMBER AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[82] = ["GRAUPEL THIRD MOMENT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[83] = ["ACTSOLLIQ AEROSOL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[84] = ["ACTSOLRAIN AEROSOL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[85] = ["ACTINSOLICE AEROSOL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[86] = ["ACTSOLICE AEROSOL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[87] = ["ACTINSOLLIQUID AERO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[88] = ["ACTSOLNUMBER AERO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[89] = ["ACTINSOLNUMBER AER0 AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[90] = ["TOTAL AEROSOL (FOR VISIBILITY)", "", "", "", ""] -atm_stashvar[91] = ["LIGHTNING POTENTIAL", "", "", "", ""] -atm_stashvar[93] = ["RUNOFF COASTAL OUTFLOW POINT", "", "", "", ""] -atm_stashvar[95] = ["SNOW AMOUNT OVR SEAICE AFT TS KG/M2", "", "", "", ""] -atm_stashvar[96] = ["OCEAN NR. SURFACE CHLOROPHYLL(KGM-3)", "", "", "", ""] -atm_stashvar[97] = ["BARE SOIL MOMENTUM ROUGHNESS LENGTH", "", "", "", ""] -atm_stashvar[98] = ["LOWER BOUNDARY TENDENCIES (OROG)", "", "", "", ""] -atm_stashvar[99] = ["BDY LYR W-VARIANCE FOR MIXED PHASE", "", "", "", ""] -atm_stashvar[101] = ["SO2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[102] = ["DIMETHYL SULPHIDE MIX RAT AFTER TS", "", "", "", ""] -atm_stashvar[103] = ["SO4 AITKEN MODE AEROSOL AFTER TSTEP", "", "", "", ""] -atm_stashvar[104] = ["SO4 ACCUM. MODE AEROSOL AFTER TSTEP", "", "", "", ""] -atm_stashvar[105] = ["SO4 DISSOLVED AEROSOL AFTER TSTEP", "", "", "", ""] -atm_stashvar[106] = ["H2O2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[107] = ["NH3 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[108] = ["FRESH SOOT MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[109] = ["AGED SOOT MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[110] = ["CLOUD SOOT MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[111] = ["FRESH BIOMASS SMOKE AFTER TSTEP", "", "", "", ""] -atm_stashvar[112] = ["AGED BIOMASS SMOKE AFTER TSTEP", "", "", "", ""] -atm_stashvar[113] = ["CLOUD BIOMASS SMOKE AFTER TSTEP", "", "", "", ""] -atm_stashvar[114] = ["FRESH OCFF MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[115] = ["AGED OCFF MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[116] = ["CLOUD OCFF MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[117] = ["ACC NITR MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[118] = ["DISS NITR MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[119] = ["MIN HEIGHT FOR BB HILEV EMISS / M", "", "", "", ""] -atm_stashvar[120] = ["MAX HEIGHT FOR BB HILEV EMISS / M", "", "", "", ""] -atm_stashvar[121] = ["3D NATURAL SO2 EMISSIONS KG/M2/S", "", "", "", ""] -atm_stashvar[122] = ["3D OH CONCENTRATIONS IN MCULES/CC", "", "", "", ""] -atm_stashvar[123] = ["3D HO2 CONCENTRATIONS IN MCULES/CC", "", "", "", ""] -atm_stashvar[124] = ["3D H2O2 MIX RATIO LIMIT FIELD", "", "", "", ""] -atm_stashvar[125] = ["3D OZONE MIX RAT FOR SULPHUR CYCLE", "", "", "", ""] -atm_stashvar[126] = ["HIGH LEVEL SO2 EMISSIONS KG/M2/S", "", "", "", ""] -atm_stashvar[127] = ["AMMONIA GAS EMISSIONS KG/M2/S", "", "", "", ""] -atm_stashvar[128] = ["FRESH SOOT SURF EMISS KG/M2/S", "", "", "", ""] -atm_stashvar[129] = ["FRESH SOOT HI LEV EMISS KG/M2/S", "", "", "", ""] -atm_stashvar[130] = ["FRESH BIOMASS SURF EMISS KG/M2/S", "", "", "", ""] -atm_stashvar[131] = ["FRESH BIOMASS HI LEV EMISS KG/M2/S", "", "", "", ""] -atm_stashvar[132] = ["DMS CONCENTRATION IN SEAWATER", "", "", "", ""] -atm_stashvar[133] = ["DMS OCEAN FLUX KG[S]/M**2/S", "", "", "", ""] -atm_stashvar[134] = ["FRESH OCFF SURF EMISS KG/M2/S", "", "", "", ""] -atm_stashvar[135] = ["FRESH OCFF HI LEV EMISS KG/M2/S", "", "", "", ""] -atm_stashvar[136] = ["CONV PROG 1", "", "", "", ""] -atm_stashvar[137] = ["CONV PROG 2", "", "", "", ""] -atm_stashvar[138] = ["CONV PROG 3", "", "", "", ""] -atm_stashvar[139] = ["CONV PROG PRECIP", "", "", "", ""] -atm_stashvar[150] = ["W COMPNT OF WIND AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[151] = ["RIVER SEQUENCE", "", "", "", ""] -atm_stashvar[152] = ["RIVER DIRECTION", "", "", "", ""] -atm_stashvar[153] = ["RIVER WATER STORAGE M2", "", "", "", ""] -atm_stashvar[155] = ["ACCUMULATED SURFACE RUNOFF KG/M2", "", "", "", ""] -atm_stashvar[156] = ["ACCUMULATED SUB-SURFACE RUNOFF KG/M2", "", "", "", ""] -atm_stashvar[157] = ["GRIDBOX AREAS M2", "", "", "", ""] -atm_stashvar[160] = ["AREA DRAINING (INTEGER) PIXELS", "", "", "", ""] -atm_stashvar[161] = ["SLOPE %", "", "", "", ""] -atm_stashvar[162] = ["INITIAL FLOW VALUES M3/S", "", "", "", ""] -atm_stashvar[163] = ["X-COORDINATE OF OUTFLOW PIXEL", "", "", "", ""] -atm_stashvar[164] = ["Y-COORDINATE OF OUTFLOW PIXEL", "", "", "", ""] -atm_stashvar[165] = ["LAND-TYPE (RIVER/LAND/SEA)", "", "", "", ""] -atm_stashvar[166] = ["SURFACE STORAGE MM", "", "", "", ""] -atm_stashvar[167] = ["SUB-SURFACE STORAGE MM", "", "", "", ""] -atm_stashvar[168] = ["ACC. SURFACE INFLOW TO A PIXEL MM", "", "", "", ""] -atm_stashvar[169] = ["ACC. SUB-SURFACE INFLOW TO PIXEL MM", "", "", "", ""] -atm_stashvar[171] = ["NET DN SW RAD FLUX:OPEN SEA: CPL", "", "", "", ""] -atm_stashvar[172] = ["NET DWN SFC SW FLUX BLW 690NM: CPL", "", "", "", ""] -atm_stashvar[173] = ["NET DOWN SURFACE LW RAD FLUX: CPL", "", "", "", ""] -atm_stashvar[174] = ["NET DN LW RAD FLUX:OPEN SEA: CPL", "", "", "", ""] -atm_stashvar[176] = ["X-COMP SURF & BL WIND STR: CPL N/M2", "", "", "", ""] -atm_stashvar[177] = ["Y-COMP SURF & BL WIND STRL CPL N/M2", "", "", "", ""] -atm_stashvar[178] = ["WIND MIX EN'GY FL TO SEA: CPL W/M2", "", "", "", ""] -atm_stashvar[179] = ["SFC SH FLX FROM OPEN SEA: CPL W/M2", "", "", "", ""] -atm_stashvar[180] = ["SUBLIM. SURFACE (GBM): CPL KG/M2/S", "", "", "", ""] -atm_stashvar[181] = ["EVAP FROM OPEN SEA: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[182] = ["SEAICE SUBLIM CAT(GBM): CPL KG/M2/S", "", "", "", ""] -atm_stashvar[184] = ["Heat flx through sea ice (W/m2): CPL", "", "", "", ""] -atm_stashvar[185] = ["Heat flx in sea ice surface mlt: CPL", "", "", "", ""] -atm_stashvar[186] = ["LARGE SCALE RAIN RATE: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[187] = ["LARGE SCALE SNOW RATE: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[188] = ["CONVECTIVE RAIN RATE: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[189] = ["CONVECTIVE SNOW RATE: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[190] = ["ICEBERG CALVING FIELD: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[191] = ["10 METRE WIND SPEED ON C GRID: CPL", "", "", "", ""] -atm_stashvar[192] = ["River Runoff: CPL", "", "", "", ""] -atm_stashvar[193] = ["PRESSURE AT MEAN SEA LEVEL: CPL Pa", "", "", "", ""] -atm_stashvar[194] = ["SEA SURFACE FREEZING TEMPERATURE: K", "", "", "", ""] -atm_stashvar[195] = ["Seaice surface temperature (cat): CPL (K)", "", "", "", ""] -atm_stashvar[196] = ["SURFACE LEVEL OF CO2 TRACER (MMR): CPL", "", "", "", ""] -atm_stashvar[197] = ["TOTAL DUST DEPOSITION RATE: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[201] = ["PSTAR PERTURBATION- DUMMY", "", "", "", ""] -atm_stashvar[202] = ["U COMPNT PERTURBATION- DUMMY", "", "", "", ""] -atm_stashvar[203] = ["V COMPNT PERTURBATION- DUMMY", "", "", "", ""] -atm_stashvar[204] = ["THETA PERTURBATION- DUMMY", "", "", "", ""] -atm_stashvar[205] = ["FRACTIONAL LAND COVER", "", "", "", ""] -atm_stashvar[207] = ["CLAPP-HORNBERGER B COEFFICIENT", "", "", "", ""] -atm_stashvar[208] = ["LEAF AREA INDEX OF VEG FRACTION", "", "", "", ""] -atm_stashvar[209] = ["CANOPY HEIGHT OF VEGETATED FRACTION", "", "", "", ""] -atm_stashvar[211] = ["CCA WITH ANVIL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[212] = ["CCRad : CCW passed to radiation", "", "", "", ""] -atm_stashvar[213] = ["CANOPY CONDUCTANCE AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[214] = ["UNFROZEN SOIL MOISTURE FRAC AFTER TS", "", "", "", ""] -atm_stashvar[215] = ["FROZEN SOIL MOISTURE FRAC AFTER TS", "", "", "", ""] -atm_stashvar[216] = ["FRACTIONS OF SURFACE TYPES", "", "", "", ""] -atm_stashvar[217] = ["LEAF AREA INDEX OF PLANT FUNC TYPES", "", "", "", ""] -atm_stashvar[218] = ["CANOPY HEIGHT OF PLANT FUNC TYPES M", "", "", "", ""] -atm_stashvar[219] = ["DISTURBED FRACTION OF VEGETATION", "", "", "", ""] -atm_stashvar[220] = ["SNOW-FREE ALBEDO OF SOIL", "", "", "", ""] -atm_stashvar[221] = ["SNOW SOOT CONTENT", "", "", "", ""] -atm_stashvar[222] = ["NET ENERGY CHANGE THIS PERIOD J/M**2", "", "", "", ""] -atm_stashvar[223] = ["SOIL CARBON CONTENT KG C / M2", "", "", "", ""] -atm_stashvar[224] = ["ACCUMULATED NPP ON PFTS", "", "", "", ""] -atm_stashvar[225] = ["ACCUMULATED LEAF TURNOVER RATE PFTS", "", "", "", ""] -atm_stashvar[226] = ["ACCUMULATED PHENOL LEAF TRNVR PFTS", "", "", "", ""] -atm_stashvar[227] = ["ACCUMULATED WOOD RESPIRATION PFTS", "", "", "", ""] -atm_stashvar[228] = ["ACCUMULATED SOIL RESPIRATION", "", "", "", ""] -atm_stashvar[229] = ["CANOPY WATER ON TILES KG/M2", "", "", "", ""] -atm_stashvar[230] = ["CANOPY CAPACITY ON TILES KG/M2", "", "", "", ""] -atm_stashvar[231] = ["SNOW GRAIN SIZE ON TILES MICRONS", "", "", "", ""] -atm_stashvar[233] = ["SURFACE TEMPERATURE ON TILES K", "ts", "K", "", "ts_tile"] -atm_stashvar[234] = ["ROUGHNESS LENGTH ON TILES M", "", "", "", ""] -atm_stashvar[235] = ["NET MOISTURE FLUX IN PERIOD KG/M**2", "", "", "", ""] -atm_stashvar[236] = ["TILE MODIFIED INFILTRATION RATE", "", "", "", ""] -atm_stashvar[237] = ["DOWNWARD SW RADIATION ON TILES W/M2", "", "", "", ""] -atm_stashvar[238] = ["SURFACE DOWNWARD LW RADIATION W/M2", "rlds", "W m-2", "surface_downwelling_longwave_flux", ""] -atm_stashvar[239] = ["TOA - SURF UPWARD LW RADIATION W/M2", "", "", "", ""] -atm_stashvar[240] = ["SNOW AMOUNT ON TILES KG/M2", "", "", "", ""] -atm_stashvar[241] = ["CANOPY SNOW CAPACITY KG/M2", "", "", "", ""] -atm_stashvar[242] = ["SNOW BENEATH CANOPY KG/M2", "", "", "", ""] -atm_stashvar[243] = ["OBS/CLIM SNOW-FREE SURF SW ALBEDO", "", "", "", ""] -atm_stashvar[244] = ["OBS/CLIM SNOW-FREE SURF VIS ALBEDO", "", "", "", ""] -atm_stashvar[245] = ["OBS/CLIM SNOW-FREE SURF NIR ALBEDO", "", "", "", ""] -atm_stashvar[246] = ["THERMAL ROUGHNESS LENGTH ON TILES M", "", "", "", ""] -atm_stashvar[249] = ["TRIFFID CO2 FLUX TO ATMOS KGC/M2/YR", "", "", "", ""] -atm_stashvar[250] = ["CO2 OCEAN FLUX KG/M**2/S", "", "", "", ""] -atm_stashvar[251] = ["CO2 SURFACE EMISSIONS KG/M**2/S", "co2emiss", "kg m-2 s-1", "", ""] -atm_stashvar[252] = ["CO2 3D TRACER MASS MIXING RATIO", "co2mmr", "", "", ""] -atm_stashvar[253] = ["DENSITY*R*R AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[254] = ["QCL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[255] = ["EXNER PRESSURE (RHO) AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[256] = ["ADVECTED U CMPT OF WIND AFTER TS", "", "", "", ""] -atm_stashvar[257] = ["ADVECTED V CMPT OF WIND AFTER TS", "", "", "", ""] -atm_stashvar[258] = ["ADVECTED W CMPT OF WIND AFTER TS", "", "", "", ""] -atm_stashvar[259] = ["NUMBER OF TURBULENT MIXING LEVELS", "", "", "", ""] -atm_stashvar[260] = ["LEVEL OF BASE OF DEEP STRATOCUMULUS", "", "", "", ""] -atm_stashvar[261] = ["LEVEL OF TOP OF DEEP STRATOCUMULUS", "", "", "", ""] -atm_stashvar[262] = ["BOUNDARY LAYER CONVECTION FLAG", "", "", "", ""] -atm_stashvar[263] = ["SD TURBULENT FLUC LAYER1 TEMP", "", "", "", ""] -atm_stashvar[264] = ["SD TURBULENT FLUC LAYER1 HUMIDITY", "", "", "", ""] -atm_stashvar[265] = ["AREA CLOUD FRACTION IN EACH LAYER", "", "", "", ""] -atm_stashvar[266] = ["BULK CLOUD FRACTION IN EACH LAYER", "", "", "", ""] -atm_stashvar[267] = ["LIQUID CLOUD FRACTION IN EACH LAYER", "", "", "", ""] -atm_stashvar[268] = ["FROZEN CLOUD FRACTION IN EACH LAYER", "", "", "", ""] -atm_stashvar[269] = ["SURFACE ZONAL CURRENT AFTER TS PGRID", "", "", "", ""] -atm_stashvar[270] = ["SURFACE MERID CURRENT AFTER TS PGRID", "", "", "", ""] -atm_stashvar[271] = ["CLOUD ICE (CRYSTALS) AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[272] = ["RAIN AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[273] = ["GRAUPEL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[274] = ["MEAN TOPOGRAPHIC INDEX", "", "", "", ""] -atm_stashvar[275] = ["STANDARD DEVN IN TOPOGRAPHIC INDEX", "", "", "", ""] -atm_stashvar[276] = ["EXP DECAY IN SOIL SAT HYD CONDUCTY", "", "", "", ""] -atm_stashvar[277] = ["INTEGRATED GAMMA DISTRIBUTION", "", "", "", ""] -atm_stashvar[278] = ["MEAN WATER TABLE DEPTH M", "", "", "", ""] -atm_stashvar[279] = ["SURFACE SATURATION FRACTION", "", "", "", ""] -atm_stashvar[280] = ["SURFACE WETLAND FRACTION", "", "", "", ""] -atm_stashvar[281] = ["SATURATION FRAC IN DEEP LAYER", "", "", "", ""] -atm_stashvar[282] = ["A_FSAT HYDROLOGY FITTING PARAMETER", "", "", "", ""] -atm_stashvar[283] = ["C_FSAT HYDROLOGY FITTING PARAMETER", "", "", "", ""] -atm_stashvar[284] = ["A_FWET HYDROLOGY FITTING PARAMETER", "", "", "", ""] -atm_stashvar[285] = ["C_FWET HYDROLOGY FITTING PARAMETER", "", "", "", ""] -atm_stashvar[286] = ["PREVIOUS DIST FRAC OF VEGETATION", "", "", "", ""] -atm_stashvar[287] = ["FAST TURNOVER WOOD PRODUCT KGC/M2", "", "", "", ""] -atm_stashvar[288] = ["MEDIUM TURNOVER WOOD PRODUCT KGC/M2", "", "", "", ""] -atm_stashvar[289] = ["SLOW TURNOVER WOOD PRODUCT KGC/M2", "", "", "", ""] -atm_stashvar[290] = ["DAILY ACCUMULATED LAKE FLUX KG/M2", "", "", "", ""] -atm_stashvar[291] = ["LAKE DEPTH (M)", "", "", "", ""] -atm_stashvar[292] = ["LAKE FETCH (M)", "", "", "", ""] -atm_stashvar[293] = ["LAKE MEAN TEMPERATURE (K)", "", "", "", ""] -atm_stashvar[294] = ["LAKE MIXED-LAYER TEMPERATURE (K)", "", "", "", ""] -atm_stashvar[295] = ["LAKE ICE SURFACE TEMPERATURE (K)", "", "", "", ""] -atm_stashvar[296] = ["LAKE MIXED-LAYER DEPTH (M)", "", "", "", ""] -atm_stashvar[297] = ["LAKE ICE THICKNESS (M)", "", "", "", ""] -atm_stashvar[298] = ["LAKE T PROFILE SHAPE FACTOR", "", "", "", ""] -atm_stashvar[299] = ["LAKE GRD HT FLX / DTEMP (W m-2 K-1)", "", "", "", ""] -atm_stashvar[341] = ["TROPOPAUSE-BASED OZONE", "", "", "", ""] -atm_stashvar[342] = ["DEEP CONVECTIVE FLAG", "", "", "", ""] -atm_stashvar[343] = ["PAST CONVECTIVE PRECIP KG/M2/S", "", "", "", ""] -atm_stashvar[344] = ["PAST CONVECTIVE DEPTH M", "", "", "", ""] -atm_stashvar[345] = ["CCA FROM DEEP CONVECTION", "", "", "", ""] -atm_stashvar[346] = ["CCA FROM MID-LEVEL CONVECTION", "", "", "", ""] -atm_stashvar[347] = ["CCA FROM SHALLOW CONVECTION", "", "", "", ""] -atm_stashvar[348] = ["TOT PRECIP RATE AFTER TSTEP KG/M2/S", "", "", "", ""] -atm_stashvar[351] = ["CLIM BIOGENIC AEROSOL MMR", "", "", "", ""] -atm_stashvar[352] = ["CLIM BIOMASS-BURNING (FRESH) MMR", "", "", "", ""] -atm_stashvar[353] = ["CLIM BIOMASS-BURNING (AGED) MMR", "", "", "", ""] -atm_stashvar[354] = ["CLIM BIOMASS-BURNING (IN-CLOUD) MMR", "", "", "", ""] -atm_stashvar[355] = ["CLIM BLACK CARBON (FRESH) MMR", "", "", "", ""] -atm_stashvar[356] = ["CLIM BLACK CARBON (AGED) MMR", "", "", "", ""] -atm_stashvar[357] = ["CLIM SEA SALT (FILM MODE) NPM3", "", "", "", ""] -atm_stashvar[358] = ["CLIM SEA SALT (JET MODE) NPM3", "", "", "", ""] -atm_stashvar[359] = ["CLIM SULPHATE (ACCUMULATION MODE)MMR", "", "", "", ""] -atm_stashvar[360] = ["CLIM SULPHATE (AITKEN MODE) MMR", "", "", "", ""] -atm_stashvar[361] = ["CLIM SULPHATE (DISSOLVED) MMR", "", "", "", ""] -atm_stashvar[362] = ["CLIM DUST SIZE DIVISION 1 MMR", "", "", "", ""] -atm_stashvar[363] = ["CLIM DUST SIZE DIVISION 2 MMR", "", "", "", ""] -atm_stashvar[364] = ["CLIM DUST SIZE DIVISION 3 MMR", "", "", "", ""] -atm_stashvar[365] = ["CLIM DUST SIZE DIVISION 4 MMR", "", "", "", ""] -atm_stashvar[366] = ["CLIM DUST SIZE DIVISION 5 MMR", "", "", "", ""] -atm_stashvar[367] = ["CLIM DUST SIZE DIVISION 6 MMR", "", "", "", ""] -atm_stashvar[368] = ["CLIM ORG C FOSSIL FUEL (FRESH) MMR", "", "", "", ""] -atm_stashvar[369] = ["CLIM ORG C FOSSIL FUEL (AGED) MMR", "", "", "", ""] -atm_stashvar[370] = ["CLIM ORG C FOSSIL FUEL (IN-CLOUD)MMR", "", "", "", ""] -atm_stashvar[371] = ["CLIM DELTA AEROSOL MMR", "", "", "", ""] -atm_stashvar[376] = ["SNOW DEPTH ON GROUND ON TILES (M)", "", "", "", ""] -atm_stashvar[377] = ["SNOWPACK BULK DENSITY (KG M-3)", "", "", "", ""] -atm_stashvar[378] = ["SNOW ON THE CANOPY (KG M-2)", "", "", "", ""] -atm_stashvar[379] = ["SURFACE HEAT FLUX UNDER SNOW (W M-2)", "", "", "", ""] -atm_stashvar[380] = ["NUMBER OF SNOW LAYERS ON TILES", "", "", "", ""] -atm_stashvar[381] = ["SNOW LAYER THICKNESSES ON TILES (M)", "", "", "", ""] -atm_stashvar[382] = ["SNOW LYR ICE MASS ON TILES(KG M-2)", "", "", "", ""] -atm_stashvar[383] = ["SNOW LYR LIQUD MASS ON TILES(KG M-2)", "", "", "", ""] -atm_stashvar[384] = ["SNOW LAYER TEMPERATURE ON TILES (K)", "", "", "", ""] -atm_stashvar[385] = ["SNOW LAYER DENSITY ON TILES (KG M-3)", "", "", "", ""] -atm_stashvar[386] = ["SNOW LYR GRAIN SIZE ON TILES(MICRON)", "", "", "", ""] -atm_stashvar[387] = ["ETADOT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[388] = ["THETAVD AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[389] = ["DRY RHO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[390] = ["PSIW SURFACE AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[391] = ["VAPOUR MIXING RATIO (mv) AFTER TS", "", "", "", ""] -atm_stashvar[392] = ["CLD LIQ MIXING RATIO (mcl) AFTER TS", "", "", "", ""] -atm_stashvar[393] = ["CLD ICE MIXING RATIO (mcf) AFTER TS", "", "", "", ""] -atm_stashvar[394] = ["RAIN MIXING RATIO (mr) AFTER TS", "", "", "", ""] -atm_stashvar[395] = ["GRAUPEL MIXING RATIO (mg) AFTER TS", "", "", "", ""] -atm_stashvar[396] = ["ICE CRY MIXING RAT. (mcf2) AFTER TS", "", "", "", ""] -atm_stashvar[397] = ["PSIW LID AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[398] = ["EXNER SURF AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[406] = ["EXNER PRESSURE AT THETA LEVELS", "", "", "", ""] -atm_stashvar[407] = ["PRESSURE AT RHO LEVELS AFTER TS", "", "", "", ""] -atm_stashvar[408] = ["PRESSURE AT THETA LEVELS AFTER TS", "", "", "", ""] -atm_stashvar[409] = ["SURFACE PRESSURE AFTER TIMESTEP", "ps", "Pa", "surface_air_pressure", ""] -atm_stashvar[410] = ["SW RADIATION INCREMENTS AFTER TS", "", "", "", ""] -atm_stashvar[411] = ["LW RADIATION INCREMENTS AFTER TS", "", "", "", ""] -atm_stashvar[412] = ["FRACTION OF SURFACE TYPE AFTER TS", "", "", "", ""] -atm_stashvar[413] = ["Sea ice concentration by categories", "", "", "", ""] -atm_stashvar[414] = ["Sea ice thickness GBM by categories", "", "", "", ""] -atm_stashvar[415] = ["Sea ice top layer temp by categories (K)", "", "", "", ""] -atm_stashvar[416] = ["Sea ice snow depth by categories", "", "", "", ""] -atm_stashvar[418] = ["Dust parent soil clay fraction (anc)", "", "", "", ""] -atm_stashvar[419] = ["Dust parent soil silt fraction (anc)", "", "", "", ""] -atm_stashvar[420] = ["Dust parent soil sand fraction (anc)", "", "", "", ""] -atm_stashvar[421] = ["Dust soil mass fraction div 1 (anc)", "", "", "", ""] -atm_stashvar[422] = ["Dust soil mass fraction div 2 (anc)", "", "", "", ""] -atm_stashvar[423] = ["Dust soil mass fraction div 3 (anc)", "", "", "", ""] -atm_stashvar[424] = ["Dust soil mass fraction div 4 (anc)", "", "", "", ""] -atm_stashvar[425] = ["Dust soil mass fraction div 5 (anc)", "", "", "", ""] -atm_stashvar[426] = ["Dust soil mass fraction div 6 (anc)", "", "", "", ""] -atm_stashvar[428] = ["Sea ice meltpond fraction by cats", "", "", "", ""] -atm_stashvar[429] = ["Sea ice meltpond depth by cats (m)", "", "", "", ""] -atm_stashvar[431] = ["Dust division 1 mass mixing ratio", "", "kg kg-1", "", ""] -atm_stashvar[432] = ["Dust division 2 mass mixing ratio", "", "kg kg-1", "", ""] -atm_stashvar[433] = ["Dust division 3 mass mixing ratio", "", "kg kg-1", "", ""] -atm_stashvar[434] = ["Dust division 4 mass mixing ratio", "", "kg kg-1", "", ""] -atm_stashvar[435] = ["Dust division 5 mass mixing ratio", "", "kg kg-1", "", ""] -atm_stashvar[436] = ["Dust division 6 mass mixing ratio", "", "kg kg-1", "", ""] -atm_stashvar[440] = ["Seaice surf layer cond (cat)(W/m2/K)", "", "", "", ""] -atm_stashvar[441] = ["Seaice surface temperature (cat) (K)", "", "", "", ""] -atm_stashvar[442] = ["SOIL NITROGEN POOL (DPM) KG N / M2", "", "", "", ""] -atm_stashvar[443] = ["SOIL NITROGEN POOL (RPM) KG N / M2", "", "", "", ""] -atm_stashvar[444] = ["SOIL NITROGEN POOL (BIO) KG N / M2", "", "", "", ""] -atm_stashvar[445] = ["SOIL NITROGEN POOL (HUM) KG N / M2", "", "", "", ""] -atm_stashvar[446] = ["INORGANIC SOIL NITROGEN KG N / M2", "", "", "", ""] -atm_stashvar[447] = ["NITROGEN DEPOSITION (kgN/m2/s)", "", "", "", ""] -atm_stashvar[448] = ["CROP FRACTION", "", "", "", ""] -atm_stashvar[449] = ["CROP FRAC. AT PREV. TRIFFID CALL", "", "", "", ""] -atm_stashvar[458] = ["PASTURE FRACTION", "", "", "", ""] -atm_stashvar[459] = ["PASTURE FRAC. AT PREV. TRIFFID CALL", "", "", "", ""] -atm_stashvar[460] = ["PAR increments after timestep", "", "", "", ""] -atm_stashvar[466] = ["DPM SOIL CARBON POOL KG C / M2", "", "", "", ""] -atm_stashvar[467] = ["RPM SOIL CARBON POOL KG C / M2", "", "", "", ""] -atm_stashvar[468] = ["BIO SOIL CARBON POOL KG C / M2", "", "", "", ""] -atm_stashvar[469] = ["HUM SOIL CARBON POOL KG C / M2", "", "", "", ""] -atm_stashvar[470] = ["ACCUMULATED DPM SOIL RESP", "", "", "", ""] -atm_stashvar[471] = ["ACCUMULATED RPM SOIL RESP", "", "", "", ""] -atm_stashvar[472] = ["ACCUMULATED BIO SOIL RESP", "", "", "", ""] -atm_stashvar[473] = ["ACCUMULATED HUM SOIL RESP", "", "", "", ""] -atm_stashvar[480] = ["PROGNOSTIC OZONE TRACER", "", "", "", ""] -atm_stashvar[481] = ["CARIOLLE PROD-LOSS (P-L)", "", "", "", ""] -atm_stashvar[482] = ["CARIOLLE O3 P-L WRT O3 MIX RATIO", "", "", "", ""] -atm_stashvar[483] = ["CARIOLLE O3 VOL MIXING RATIO", "", "", "", ""] -atm_stashvar[484] = ["CARIOLLE O3 P-L WRT TEMP", "", "", "", ""] -atm_stashvar[485] = ["CARIOLLE O3 CLIM TEMP", "", "", "", ""] -atm_stashvar[486] = ["CARIOLLE O3 P-L WRT O3 ABOVE PL", "", "", "", ""] -atm_stashvar[487] = ["CARIOLLE O3 COLUMN ABOVE PL", "", "", "", ""] -atm_stashvar[490] = ["DECOUPLED SCREEN TEMP ON TILES K", "", "", "", ""] -atm_stashvar[491] = ["DECOUPLED SCREEN TEMP ON SEA/ICE K", "", "", "", ""] -atm_stashvar[492] = ["TIME SINCE TRANSITION S", "", "", "", ""] -atm_stashvar[493] = ["CONVECTIVE DOWNDRAUGHT AT CLD BASE", "", "", "", ""] -atm_stashvar[494] = ["URBAN BUILDING HEIGHT", "", "", "", ""] -atm_stashvar[495] = ["URBAN HEIGHT TO WIDTH RATIO", "", "", "", ""] -atm_stashvar[496] = ["URBAN WIDTH RATIO", "", "", "", ""] -atm_stashvar[497] = ["URBAN DISPLACEMENT HEIGHT", "", "", "", ""] -atm_stashvar[498] = ["URBAN ZTM", "", "", "", ""] -atm_stashvar[499] = ["URBAN WALL ALBEDO", "", "", "", ""] -atm_stashvar[500] = ["URBAN ROAD ALBEDO", "", "", "", ""] -atm_stashvar[501] = ["URBAN WALL EMISSIVITY", "", "", "", ""] -atm_stashvar[502] = ["URBAN ROAD EMISSIVITY", "", "", "", ""] -atm_stashvar[505] = ["Land fraction in grid box", "sftlf", "%", "land_area_fraction", ""] -atm_stashvar[506] = ["LAND SURFACE TEMP AFTER TIMESTEP", "ts", "K", "surface_temperature_where_land", "ts_land"] -atm_stashvar[507] = ["OPEN SEA SURFACE TEMP AFTER TIMESTEP", "ts", "K", "surface_temperature_where_open_sea", "ts_sea"] -atm_stashvar[508] = ["SEA-ICE SURFACE TEMP AFTER TIMESTEP", "ts", "K", "surface_temperature", "ts_ice"] -atm_stashvar[509] = ["SEA ICE ALBEDO AFTER TS", "", "", "", ""] -atm_stashvar[510] = ["MEAN LAND ALBEDO AFTER TS", "", "", "", ""] -atm_stashvar[511] = ["INLANDBASINFLOW ATM GRID KG/M2/S", "", "", "", ""] -atm_stashvar[569] = ["COLDPOOL FRONT VECTR SUM X-CMPT(M/S)", "", "", "", ""] -atm_stashvar[570] = ["COLDPOOL FRONT VECTR SUM Y-CMPT(M/S)", "", "", "", ""] -atm_stashvar[571] = ["COLDPOOL FRONT SCALAR SUM (M/S)", "", "", "", ""] -atm_stashvar[572] = ["COLDPOOL REDUCED GRAVITY (M/S2)", "", "", "", ""] -atm_stashvar[573] = ["COLDPOOL DEPTH (M)", "", "", "", ""] -atm_stashvar[574] = ["COLDPOOL REMAIN COUNTER (ISOTROPIC)", "", "", "", ""] -atm_stashvar[575] = ["COLDPOOL REMAIN COUNTER (DIRECTED)", "", "", "", ""] -atm_stashvar[576] = ["TEMP OF TILED SUBSURFACE (K)", "", "", "", ""] -atm_stashvar[577] = ["PV tracer for radiation param", "", "", "", ""] -atm_stashvar[578] = ["PV tracer for SW param", "", "", "", ""] -atm_stashvar[579] = ["PV tracer for LW param", "", "", "", ""] -atm_stashvar[580] = ["PV tracer for microphysics param", "", "", "", ""] -atm_stashvar[581] = ["PV tracer for GWD param", "", "", "", ""] -atm_stashvar[582] = ["PV tracer for slow physics", "", "", "", ""] -atm_stashvar[583] = ["PV tracer for convection param", "", "", "", ""] -atm_stashvar[584] = ["PV tracer for Boundary Layer param", "", "", "", ""] -atm_stashvar[585] = ["PV tracer for stochastic physics", "", "", "", ""] -atm_stashvar[586] = ["PV tracer for cloud pressure", "", "", "", ""] -atm_stashvar[587] = ["PV tracer for IAU", "", "", "", ""] -atm_stashvar[588] = ["PV tracer for Nudging scheme", "", "", "", ""] -atm_stashvar[589] = ["Total dPV in a timestep", "", "", "", ""] -atm_stashvar[590] = ["PV tracer for advection", "", "", "", ""] -atm_stashvar[591] = ["PV tracer for Helmholtz solver", "", "", "", ""] -atm_stashvar[592] = ["PV tracer for Mass update", "", "", "", ""] -atm_stashvar[593] = ["Advection only PV", "", "", "", ""] -atm_stashvar[595] = ["BL PERT SCHEME RANDOM NUMB FIELD", "", "", "", ""] -atm_stashvar[596] = ["BL PERT SCHEME FLAG", "", "", "", ""] -atm_stashvar[600] = ["Theta tracer for initial theta", "", "", "", ""] -atm_stashvar[601] = ["Theta tracer for BL", "", "", "", ""] -atm_stashvar[602] = ["Theta tracer for BL mixing", "", "", "", ""] -atm_stashvar[603] = ["Theta tracer for BL Latent Heat", "", "", "", ""] -atm_stashvar[604] = ["Theta tracer for Convection", "", "", "", ""] -atm_stashvar[605] = ["Theta tracer for microphysics", "", "", "", ""] -atm_stashvar[606] = ["Theta tracer for radiation", "", "", "", ""] -atm_stashvar[607] = ["Theta tracer for SW radiation", "", "", "", ""] -atm_stashvar[608] = ["Theta tracer for LW radiation", "", "", "", ""] -atm_stashvar[609] = ["Theta tracer for slow physics", "", "", "", ""] -atm_stashvar[610] = ["Theta tracer for cloud rebalancing", "", "", "", ""] -atm_stashvar[1004] = ["TEMPERATURE AFTER SW RAD INCREMENTS", "", "", "", ""] -atm_stashvar[1101] = ["HORIZON ANGLE 1 (N)", "", "", "", ""] -atm_stashvar[1102] = ["HORIZON ANGLE 2 (NE)", "", "", "", ""] -atm_stashvar[1103] = ["HORIZON ANGLE 3 (E)", "", "", "", ""] -atm_stashvar[1104] = ["HORIZON ANGLE 4 (SE)", "", "", "", ""] -atm_stashvar[1105] = ["HORIZON ANGLE 5 (S)", "", "", "", ""] -atm_stashvar[1106] = ["HORIZON ANGLE 6 (SW)", "", "", "", ""] -atm_stashvar[1107] = ["HORIZON ANGLE 7 (W)", "", "", "", ""] -atm_stashvar[1108] = ["HORIZON ANGLE 8 (NW)", "", "", "", ""] -atm_stashvar[1109] = ["HORIZON ANGLE 9 (NNE)", "", "", "", ""] -atm_stashvar[1110] = ["HORIZON ANGLE 10 (ENE)", "", "", "", ""] -atm_stashvar[1111] = ["HORIZON ANGLE 11 (ESE)", "", "", "", ""] -atm_stashvar[1112] = ["HORIZON ANGLE 12 (SSE)", "", "", "", ""] -atm_stashvar[1113] = ["HORIZON ANGLE 13 (SSW)", "", "", "", ""] -atm_stashvar[1114] = ["HORIZON ANGLE 14 (WSW)", "", "", "", ""] -atm_stashvar[1115] = ["HORIZON ANGLE 15 (WNW)", "", "", "", ""] -atm_stashvar[1116] = ["HORIZON ANGLE 16 (NNW)", "", "", "", ""] -atm_stashvar[1130] = ["SOLID ANGLE FOR TRANSIT OBSERVER 1AU", "", "", "", ""] -atm_stashvar[1140] = ["COS SOLAR ZENITH ANGLE: MODEL TSTEP", "", "", "", ""] -atm_stashvar[1141] = ["DAYLIGHT FRACTION OF MODEL TIMESTEP", "", "", "", ""] -atm_stashvar[1142] = ["COS SOLAR ZENITH ANGLE: RAD TIMESTEP", "", "", "", ""] -atm_stashvar[1143] = ["DAYLIGHT FRACTION OF RADIATION TSTEP", "", "", "", ""] -atm_stashvar[1161] = ["TEMPERATURE INCR: swrad MINUS LH PC2", "", "", "", ""] -atm_stashvar[1181] = ["TEMPERATURE INCR: swrad scheme", "", "", "", ""] -atm_stashvar[1182] = ["SPECIFIC HUMIDITY INCR: swrad scheme", "", "", "", ""] -atm_stashvar[1183] = ["QCL INCR: swrad scheme", "", "", "", ""] -atm_stashvar[1192] = ["BULK CLOUD VOL INCR: swrad scheme", "", "", "", ""] -atm_stashvar[1193] = ["LIQUID CLOUD VOL INCR: swrad scheme", "", "", "", ""] -atm_stashvar[1194] = ["QCL INCR: swrad positive", "", "", "", ""] -atm_stashvar[1195] = ["QCL INCR: swrad negative", "", "", "", ""] -atm_stashvar[1198] = ["LIQ CLOUD VOL INCR: swrad positive", "", "", "", ""] -atm_stashvar[1199] = ["LIQ CLOUD VOL INCR: swrad negative", "", "", "", ""] -atm_stashvar[1200] = ["LIT MASK FOR SW RADIATION TIMESTEP", "", "", "", ""] -atm_stashvar[1201] = ["NET DOWN SURFACE SW FLUX: SW TS ONLY", "rss", "W m-2", "surface_net_downward_shortwave_flux", ""] -atm_stashvar[1202] = ["NET DOWN SURFACE SW FLUX: CORRECTED", "rss", "W m-2", "surface_net_downward_shortwave_flux", "rss_corr"] -atm_stashvar[1203] = ["NET DN SW RAD FLUX:OPEN SEA:SEA MEAN", "rss_sea", "", "", ""] -atm_stashvar[1204] = ["NET DOWN SURFACE SW FLUX BELOW 690NM", "", "", "", ""] -atm_stashvar[1205] = ["OUTGOING SW RAD FLUX (TOA):CORRECTED", "", "", "", ""] -atm_stashvar[1207] = ["INCOMING SW RAD FLUX (TOA): ALL TSS", "rsdt", "W m-2", "toa_incoming_shortwave_flux", ""] -atm_stashvar[1208] = ["OUTGOING SW RAD FLUX (TOA)", "rsut", "W m-2", "toa_outgoing_shortwave_flux", ""] -atm_stashvar[1209] = ["CLEAR-SKY (II) UPWARD SW FLUX (TOA)", "rsutcs", "W m-2", "toa_outgoing_shortwave_flux_assuming_clear_sky", ""] -atm_stashvar[1210] = ["CLEAR-SKY (II) DOWN SURFACE SW FLUX", "rsdscs", "W m-2", "surface_downwelling_shortwave_flux_in_air_assuming_clear_sky", ""] -atm_stashvar[1211] = ["CLEAR-SKY (II) UP SURFACE SW FLUX", "rsuscs", "W m-2", "surface_upwelling_shortwave_flux_in_air_assuming_clear_sky", ""] -atm_stashvar[1212] = ["DIRECT UV FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1213] = ["UPWARDS UV FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1214] = ["DOWNWARDS UV FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1215] = ["DIRECT SURFACE SW FLUX : CORRECTED", "", "", "", ""] -atm_stashvar[1216] = ["DIFFUSE SURFACE SW FLUX : CORRECTED", "", "", "", ""] -atm_stashvar[1217] = ["UPWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1218] = ["DOWNWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1219] = ["CLEAR-SKY UPWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1220] = ["CLEAR-SKY DOWNWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1221] = ["LAYER CLD LIQ RE * LAYER CLD WEIGHT", "", "", "", ""] -atm_stashvar[1223] = ["LAYER CLOUD WEIGHT FOR MICROPHYSICS", "", "", "", ""] -atm_stashvar[1224] = ["LAYER CLD LIQUID WATER PATH * WEIGHT", "", "", "", ""] -atm_stashvar[1225] = ["CONV CLOUD LIQ RE * CONV CLD WEIGHT", "", "", "", ""] -atm_stashvar[1226] = ["CONV CLOUD WEIGHT FOR MICROPHYSICS", "", "", "", ""] -atm_stashvar[1228] = ["CLEAR UPWARD SW AT TOA * AREA WEIGHT", "", "", "", ""] -atm_stashvar[1229] = ["CLEAR-SKY SW AREA WEIGHT", "", "", "", ""] -atm_stashvar[1230] = ["DIRECT SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1231] = ["DIFFUSE SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1232] = ["SW HEATING RATES: ALL TIMESTEPS", "", "", "", ""] -atm_stashvar[1233] = ["CLEAR-SKY SW HEATING RATES", "", "", "", ""] -atm_stashvar[1235] = ["TOTAL DOWNWARD SURFACE SW FLUX", "rsds", "W m-2", "surface_downwelling_shortwave_flux_in_air", ""] -atm_stashvar[1237] = ["NET DOWNWARD SW FLUX AT THE TROP.", "", "", "", ""] -atm_stashvar[1238] = ["UPWARD SW FLUX AT THE TROPOPAUSE", "", "", "", ""] -atm_stashvar[1241] = ["DROPLET NUMBER CONC * LYR CLOUD WGT", "", "", "", ""] -atm_stashvar[1242] = ["LAYER CLOUD LWC * LAYER CLOUD WEIGHT", "", "", "", ""] -atm_stashvar[1243] = ["SO4 CCN KG/M3 * COND SAMPLING WEIGHT", "", "", "", ""] -atm_stashvar[1244] = ["CONDITIONAL SAMPLING WEIGHT", "", "", "", ""] -atm_stashvar[1245] = ["2-D RE DISTRIBUTION * 2-D RE WEIGHT", "", "", "", ""] -atm_stashvar[1246] = ["WEIGHT FOR 2-D RE DISTRIBUTION", "", "", "", ""] -atm_stashvar[1247] = ["FILM-MODE SEA-SALT AEROSOL NUMBER", "", "", "", ""] -atm_stashvar[1248] = ["JET-MODE SEA-SALT AEROSOL NUMBER", "", "", "", ""] -atm_stashvar[1254] = ["2-D RE * WEIGHT - WARM CLOUDS ONLY", "", "", "", ""] -atm_stashvar[1255] = ["WEIGHT FOR WARM CLOUD 2-D RE", "", "", "", ""] -atm_stashvar[1257] = ["NET DOWN SW FLUX: LAND", "rss", "W m-2", "surface_net_downward_shortwave_flux", ""] -atm_stashvar[1258] = ["NET DN SW FLX:SEAICE:SEA MEAN", "", "", "", ""] -atm_stashvar[1259] = ["NET DN SW SOLID SFC FLUX BELOW 690NM", "", "", "", ""] -atm_stashvar[1260] = ["NET DN SW O SEA FLX BLW 690NM:SEA MN", "", "", "", ""] -atm_stashvar[1262] = ["WEIGHTED SW CLOUD EXTINCTION", "", "", "", ""] -atm_stashvar[1263] = ["WEIGHTS FOR CLOUD SW EXTINCTION", "", "", "", ""] -atm_stashvar[1264] = ["WEIGHTED SW LAYER CLOUD EXTINCTION", "", "", "", ""] -atm_stashvar[1265] = ["WEIGHTS FOR LAYER CLD SW EXTINCTION", "", "", "", ""] -atm_stashvar[1266] = ["WEIGHTED SW CONV. CLOUD EXTINCTION", "", "", "", ""] -atm_stashvar[1267] = ["WEIGHTS FOR CONV.CLD SW EXTINCTION", "", "", "", ""] -atm_stashvar[1268] = ["DIRECT SURFACE ALBEDO ON SW BANDS", "", "", "", ""] -atm_stashvar[1269] = ["DIFFUSE SURFACE ALBEDO ON SW BANDS", "", "", "", ""] -atm_stashvar[1270] = ["VIS ALBEDO SCALING TO OBS ON TILES", "", "", "", ""] -atm_stashvar[1271] = ["NIR ALBEDO SCALING TO OBS ON TILES", "", "", "", ""] -atm_stashvar[1272] = ["DIRECT FLUX FOR SPHERICAL GEOMETRY", "", "", "", ""] -atm_stashvar[1273] = ["CLEAR DIRECT FLUX (SPHERICAL GEOM)", "", "", "", ""] -atm_stashvar[1274] = ["CLEAN DIRECT FLUX (SPHERICAL GEOM)", "", "", "", ""] -atm_stashvar[1275] = ["CLEAR-CLEAN DIRECT FLUX (SPH GEOM)", "", "", "", ""] -atm_stashvar[1276] = ["DIRECT FLUX DIVERGENCE OVER LAYERS", "", "", "", ""] -atm_stashvar[1277] = ["CLEAR-SKY DIRECT FLUX DIVERGENCE", "", "", "", ""] -atm_stashvar[1278] = ["CLEAN-AIR DIRECT FLUX DIVERGENCE", "", "", "", ""] -atm_stashvar[1279] = ["CLEAR-CLEAN DIRECT FLUX DIVERGENCE", "", "", "", ""] -atm_stashvar[1280] = ["COLUMN-INTEGRATED Nd * SAMP. WEIGHT", "", "", "", ""] -atm_stashvar[1281] = ["SAMP. WEIGHT FOR COL. INT. Nd", "", "", "", ""] -atm_stashvar[1288] = ["DOWNWARD SURFACE UV FLUX", "", "", "", ""] -atm_stashvar[1289] = ["CLEAR-SKY DOWNWARD SURFACE UV FLUX", "", "", "", ""] -atm_stashvar[1290] = ["TOTAL DOWNWARD PAR FLUX AT SURFACE", "", "", "", ""] -atm_stashvar[1291] = ["DIRECT COMPONENT OF SURF PAR FLUX", "", "", "", ""] -atm_stashvar[1292] = ["MEAN SOLAR BEARING OVER RAD TS", "", "", "", ""] -atm_stashvar[1293] = ["SLOPE ASPECT", "", "", "", ""] -atm_stashvar[1294] = ["SLOPE ANGLE", "", "", "", ""] -atm_stashvar[1295] = ["OROG CORR FACTOR TO DIRECT SURF SW", "", "", "", ""] -atm_stashvar[1296] = ["EXTRA SW SURF FLUX AFTER OROG CORR", "", "", "", ""] -atm_stashvar[1298] = ["CDNC @CLOUD TOP * WEIGHT", "", "", "", ""] -atm_stashvar[1299] = ["WEIGHT FOR CDNC @CLOUD TOP", "", "", "", ""] -atm_stashvar[1408] = ["OUTGOING SW RAD FORCING (TOA)", "", "", "", ""] -atm_stashvar[1409] = ["CLEAR-SKY (II) UPWARD SW FORC.(TOA)", "", "", "", ""] -atm_stashvar[1410] = ["CLEAR-SKY (II) DOWN SURF. SW FORC.", "", "", "", ""] -atm_stashvar[1411] = ["CLEAR-SKY (II) UP SURF. SW FORC.", "", "", "", ""] -atm_stashvar[1417] = ["UPWARD SW FLUX ON LEVELS W/ FORCING", "", "", "", ""] -atm_stashvar[1418] = ["DOWNWARD SW FLUX ON LEVELS W/ FORC", "", "", "", ""] -atm_stashvar[1419] = ["CLEAR-SKY UP SW ON LEVELS W/ FORCING", "", "", "", ""] -atm_stashvar[1420] = ["CLEAR-SKY DOWN SW ON LEVELS W/ FORC", "", "", "", ""] -atm_stashvar[1433] = ["CLEAR-SKY SW HEATING RATES W/ FORC", "", "", "", ""] -atm_stashvar[1435] = ["TOTAL DOWNWARD SURF. SW FORCING", "", "", "", ""] -atm_stashvar[1437] = ["NET DOWNWARD SW AT TROP. W/ FORCING", "", "", "", ""] -atm_stashvar[1438] = ["UPWARD SW AT TROPOPAUSE W/ FORCING", "", "", "", ""] -atm_stashvar[1472] = ["DIRECT FLUX SPHERICAL GEOM 2nd CALL", "", "", "", ""] -atm_stashvar[1473] = ["CLEAR DIRECT FLUX SPH GEOM 2nd CALL", "", "", "", ""] -atm_stashvar[1474] = ["CLEAN DIRECT FLUX SPH GEOM 2nd CALL", "", "", "", ""] -atm_stashvar[1475] = ["CLR-CLN DIRECT FLX SPH GEOM 2nd CALL", "", "", "", ""] -atm_stashvar[1476] = ["DIRECT FLUX DIVERGENCE 2nd CALL", "", "", "", ""] -atm_stashvar[1477] = ["CLEAR-SKY DIRECT FLUX DIV 2nd CALL", "", "", "", ""] -atm_stashvar[1478] = ["CLEAN-AIR DIRECT FLUX DIV 2nd CALL", "", "", "", ""] -atm_stashvar[1479] = ["CLEAR-CLEAN DIRECT FLUX DIV 2nd CALL", "", "", "", ""] -atm_stashvar[1500] = ["SW DOWN OVER ICE, WGHTD (cats)(W/m2)", "", "", "", ""] -atm_stashvar[1501] = ["SW DOWN OVER ICE, WGHTD (aggr)(W/m2)", "", "", "", ""] -atm_stashvar[1502] = ["SW UP OVER ICE, WGHTED (cats)(W/m2)", "", "", "", ""] -atm_stashvar[1503] = ["SW UP OVER ICE, WGHTED (aggr)(W/m2)", "", "", "", ""] -atm_stashvar[1504] = ["SEA ICE ALBEDO, WEIGHTED (cats)", "", "", "", ""] -atm_stashvar[1505] = ["SEA ICE ALBEDO, WEIGHTED (aggregate)", "", "", "", ""] -atm_stashvar[1506] = ["TOTAL AOD IN LAYERS AND SW BANDS", "", "", "", ""] -atm_stashvar[1507] = ["TOTAL SCATTERING AOD LAYERS/SW BANDS", "", "", "", ""] -atm_stashvar[1508] = ["AERO ASYM (WGTD) IN LAYERS/SW BANDS", "", "", "", ""] -atm_stashvar[1509] = ["UPWARD SW FLUX ON LEVELS AND BANDS", "", "", "", ""] -atm_stashvar[1510] = ["DOWNWARD SW FLUX ON LEVELS AND BANDS", "", "", "", ""] -atm_stashvar[1511] = ["CLEAR UP SW FLUX ON LEVELS AND BANDS", "", "", "", ""] -atm_stashvar[1512] = ["CLEAR DOWN SW FLUX ON LEVS AND BANDS", "", "", "", ""] -atm_stashvar[1513] = ["SW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1514] = ["CLEAR-SKY SW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1515] = ["CLEAN-AIR SW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1516] = ["CLEAR-CLEAN SW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1517] = ["CLEAN-AIR UPWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1518] = ["CLEAN-AIR DOWNWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1519] = ["CLEAR-CLEAN UPWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1520] = ["CLEAR-CLEAN DOWNWARD SW FLUX ON LEVS", "", "", "", ""] -atm_stashvar[1521] = ["UPWARD SW FLUX ON LEVELS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1522] = ["DOWNWARD SW FLUX ON LEVS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1523] = ["CLEAR UP SW FLUX ON LEVS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1524] = ["CLR DOWN SW FLUX ON LEVS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1525] = ["UP SW FLUX LEVS/BANDS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1526] = ["DOWN SW FLUX LEVS/BANDS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1527] = ["CLR UP SW FLUX LEVS/BNDS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1528] = ["CLR DOWN SW FLUX LVS/BNDS W/GHG FORC", "", "", "", ""] -atm_stashvar[1529] = ["DIRECT FLUX SPH GEOM W/ GHG FORCING", "", "", "", ""] -atm_stashvar[1530] = ["CLR DIRECT FLUX SPH GEOM W/ GHG FORC", "", "", "", ""] -atm_stashvar[1531] = ["DIRECT FLUX DIVERGENCE W/ GHG FORC", "", "", "", ""] -atm_stashvar[1532] = ["CLEAR DIRECT FLUX DIV W/ GHG FORCING", "", "", "", ""] -atm_stashvar[1533] = ["DIRECT FLUX SPH BANDS W/ GHG FORCING", "", "", "", ""] -atm_stashvar[1534] = ["CLR DIRECT FLUX SPH BANDS W/GHG FORC", "", "", "", ""] -atm_stashvar[1535] = ["DIRECT FLUX DIV BANDS W/ GHG FORCING", "", "", "", ""] -atm_stashvar[1536] = ["CLR DIRECT FLUX DIV BANDS W/GHG FORC", "", "", "", ""] -atm_stashvar[1537] = ["DIRECT FLUX (SPHERICAL GEOM) BANDS", "", "", "", ""] -atm_stashvar[1538] = ["CLEAR DIRECT FLUX (SPH GEOM) BANDS", "", "", "", ""] -atm_stashvar[1539] = ["CLEAN DIRECT FLUX (SPH GEOM) BANDS", "", "", "", ""] -atm_stashvar[1540] = ["CLR-CLN DIRECT FLUX (SPH GEOM) BANDS", "", "", "", ""] -atm_stashvar[1541] = ["DIRECT FLUX DIVERGENCE ON BANDS", "", "", "", ""] -atm_stashvar[1542] = ["CLEAR-SKY DIRECT FLUX DIV ON BANDS", "", "", "", ""] -atm_stashvar[1543] = ["CLEAN-AIR DIRECT FLUX DIV ON BANDS", "", "", "", ""] -atm_stashvar[1544] = ["CLEAR-CLEAN DIRECT FLUX DIV ON BANDS", "", "", "", ""] -atm_stashvar[1545] = ["CLEAN-AIR UP SW FLUX ON LEVELS/BANDS", "", "", "", ""] -atm_stashvar[1546] = ["CLEAN-AIR DOWN SW FLUX LEVELS/BANDS", "", "", "", ""] -atm_stashvar[1547] = ["CLEAR-CLEAN UP SW FLUX LEVELS/BANDS", "", "", "", ""] -atm_stashvar[1548] = ["CLEAR-CLEAN DOWN SW FLUX LEVS/BANDS", "", "", "", ""] -atm_stashvar[1550] = ["EASYAEROSOL EXTINCTION ON SW BANDS", "", "", "", ""] -atm_stashvar[1551] = ["EASYAEROSOL ABSORPTION ON SW BANDS", "", "", "", ""] -atm_stashvar[1552] = ["EASYAEROSOL SCATTERING ON SW BANDS", "", "", "", ""] -atm_stashvar[1553] = ["EASYAEROSOL ASY*SCA ON SW BANDS", "", "", "", ""] -atm_stashvar[1555] = ["TRANSMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1556] = ["CLEAR-SKY TRANSMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1557] = ["CLEAN-AIR TRANSMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1558] = ["CLEAR-CLEAN TRANSMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1709] = ["UPWARD SW FLUX LEVS/BANDS W/ FORCING", "", "", "", ""] -atm_stashvar[1710] = ["DOWNWARD SW FLUX LEVS/BANDS W/ FORC", "", "", "", ""] -atm_stashvar[1711] = ["CLEAR UP SW FLUX LEVS/BANDS W/ FORC", "", "", "", ""] -atm_stashvar[1712] = ["CLEAR DOWN SW FLUX LEVS/BNDS W/ FORC", "", "", "", ""] -atm_stashvar[1713] = ["SW EMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[1714] = ["CLEAR SW EMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[1715] = ["CLEAN SW EMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[1716] = ["CLR-CLN SW EMISSION SPEC 2nd CALL", "", "", "", ""] -atm_stashvar[1717] = ["CLEAN-AIR UPWARD SW FLUX 2nd CALL", "", "", "", ""] -atm_stashvar[1718] = ["CLEAN-AIR DOWNWARD SW FLUX 2nd CALL", "", "", "", ""] -atm_stashvar[1719] = ["CLEAR-CLEAN UPWARD SW FLUX 2nd CALL", "", "", "", ""] -atm_stashvar[1720] = ["CLEAR-CLEAN DOWN SW FLUX 2nd CALL", "", "", "", ""] -atm_stashvar[1737] = ["DIRECT FLUX SPH GEOM BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1738] = ["CLEAR DIRECT FLUX SPH BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1739] = ["CLEAN DIRECT FLUX SPH BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1740] = ["CLR-CLN DIRECT FLX SPH BAND 2nd CALL", "", "", "", ""] -atm_stashvar[1741] = ["DIRECT FLUX DIV ON BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1742] = ["CLEAR DIRECT FLUX DIV BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1743] = ["CLEAN DIRECT FLUX DIV BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1744] = ["CLR-CLN DIRECT FLX DIV BAND 2nd CALL", "", "", "", ""] -atm_stashvar[1745] = ["CLEAN UP SW FLUX ON BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1746] = ["CLEAN DOWN SW FLUX ON BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1747] = ["CLR-CLN UP SW FLUX ON BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1748] = ["CLR-CLN DOWN SW FLUX BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1755] = ["TRANSMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[1756] = ["CLEAR TRANSMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[1757] = ["CLEAN TRANSMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[1758] = ["CLR-CLN TRANSMISSION SPEC 2nd CALL", "", "", "", ""] -atm_stashvar[2004] = ["TEMPERATURE AFTER LW RAD INCREMENTS", "", "", "", ""] -atm_stashvar[2101] = ["SKYVIEW FACTOR", "", "", "", ""] -atm_stashvar[2110] = ["MASS USED FOR RAD LAYERS (kg/m2)", "", "", "", ""] -atm_stashvar[2111] = ["DENSITY USED FOR RAD LAYERS (kg/m3)", "", "", "", ""] -atm_stashvar[2112] = ["HEAT CAPACITY OF RAD LAYERS (J/K.m2)", "", "", "", ""] -atm_stashvar[2113] = ["PRESSURE USED FOR RAD LAYERS (Pa)", "", "", "", ""] -atm_stashvar[2114] = ["TEMPERATURE USED FOR RAD LAYERS (K)", "", "", "", ""] -atm_stashvar[2115] = ["PRESSURE USED FOR RAD LEVELS (Pa)", "", "", "", ""] -atm_stashvar[2116] = ["TEMPERATURE USED FOR RAD LEVELS (K)", "", "", "", ""] -atm_stashvar[2130] = ["SOLID ANGLE FOR OBSERVER AT 1AU", "", "", "", ""] -atm_stashvar[2161] = ["TEMPERATURE INCR: lwrad MINUS LH PC2", "", "", "", ""] -atm_stashvar[2181] = ["TEMPERATURE INCR: lwrad scheme", "", "", "", ""] -atm_stashvar[2182] = ["SPECIFIC HUMIDITY INCR: lwrad scheme", "", "", "", ""] -atm_stashvar[2183] = ["QCL INCR: lwrad scheme", "", "", "", ""] -atm_stashvar[2192] = ["BULK CLOUD VOL INCR: lwrad scheme", "", "", "", ""] -atm_stashvar[2193] = ["LIQUID CLOUD VOL INCR: lwrad scheme", "", "", "", ""] -atm_stashvar[2194] = ["QCL INCR: lwrad positive", "", "", "", ""] -atm_stashvar[2195] = ["QCL INCR: lwrad negative", "", "", "", ""] -atm_stashvar[2198] = ["LIQ CLOUD VOL INCR: lwrad positive", "", "", "", ""] -atm_stashvar[2199] = ["LIQ CLOUD VOL INCR: lwrad negative", "", "", "", ""] -atm_stashvar[2201] = ["NET DOWN SURFACE LW RAD FLUX", "rls", "W m-2", "surface_net_downward_longwave_flux", ""] -atm_stashvar[2203] = ["NET DN LW RAD FLUX:OPEN SEA:SEA MEAN", "", "", "", ""] -atm_stashvar[2204] = ["TOTAL CLOUD AMOUNT IN LW RADIATION", "clt", "1", "cloud_area_fraction", ""] -atm_stashvar[2205] = ["OUTGOING LW RAD FLUX (TOA)", "rlut", "W m-2", "toa_outgoing_longwave_flux", ""] -atm_stashvar[2206] = ["CLEAR-SKY (II) UPWARD LW FLUX (TOA)", "rlutcs", "W m-2", "toa_outgoing_longwave_flux_assuming_clear_sky", ""] -atm_stashvar[2207] = ["DOWNWARD LW RAD FLUX: SURFACE", "rlds", "W m-2", "surface_downwelling_longwave_flux_in_air", ""] -atm_stashvar[2208] = ["CLEAR-SKY (II) DOWN SURFACE LW FLUX", "rldscs", "W m-2", "surface_downwelling_longwave_flux_in_air_assuming_clear_sky", ""] -atm_stashvar[2217] = ["UPWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2218] = ["DOWNWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2219] = ["CLEAR-SKY UPWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2220] = ["CLEAR-SKY DOWNWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2228] = ["CLEAR UPWARD LW AT TOA * AREA WEIGHT", "", "", "", ""] -atm_stashvar[2229] = ["CLEAR-SKY LW AREA WEIGHT", "", "", "", ""] -atm_stashvar[2232] = ["LW HEATING RATES", "", "", "", ""] -atm_stashvar[2233] = ["CLEAR-SKY LW HEATING RATES", "", "", "", ""] -atm_stashvar[2237] = ["NET DOWNWARD LW FLUX AT THE TROP.", "", "", "", ""] -atm_stashvar[2238] = ["DOWNWARD LW FLUX AT THE TROPOPAUSE", "", "", "", ""] -atm_stashvar[2240] = ["AITKEN (SOLUBLE) ABS OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2241] = ["ACCUM (SOLUBLE) ABS OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2242] = ["COARSE (SOLUBLE) ABS OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2243] = ["AITKEN (INSOL) ABS OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2244] = ["ACCUM (INSOL) ABS OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2245] = ["COARSE (INSOL) ABS OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2251] = ["AITKEN MODE (SOLUBLE) STRATO AOD", "", "", "", ""] -atm_stashvar[2252] = ["ACCUM MODE (SOLUBLE) STRATO AOD", "", "", "", ""] -atm_stashvar[2253] = ["COARSE MODE (SOLUBLE) STRATO AOD", "", "", "", ""] -atm_stashvar[2254] = ["AITKEN MODE (INSOL) STRATO AOD", "", "", "", ""] -atm_stashvar[2255] = ["ACCUM MODE (INSOL) STRATO AOD", "", "", "", ""] -atm_stashvar[2256] = ["COARSE MODE (INSOL) STRATO AOD", "", "", "", ""] -atm_stashvar[2260] = ["OZONE MASS MIXING RATIO AFTER LW", "", "", "", ""] -atm_stashvar[2261] = ["TOTAL CLOUD AMOUNT ON LEVELS", "", "", "", ""] -atm_stashvar[2262] = ["WEIGHTED CLOUD ABSORPTIVITY", "", "", "", ""] -atm_stashvar[2263] = ["WEIGHTS FOR CLOUD ABSORPTIVITY", "", "", "", ""] -atm_stashvar[2264] = ["WEIGHTED LAYER CLOUD ABSORPTIVITY", "", "", "", ""] -atm_stashvar[2265] = ["WEIGHTS FOR LAYER CLD ABSORPTIVITY", "", "", "", ""] -atm_stashvar[2266] = ["WEIGHTED CONV.CLOUD ABSORPTIVITY", "", "", "", ""] -atm_stashvar[2267] = ["WEIGHTS FOR CONV.CLOUD ABSORPTIVITY", "", "", "", ""] -atm_stashvar[2269] = ["ISCCP CLOUD WEIGHTS", "", "", "", ""] -atm_stashvar[2270] = ["ISCCP CLOUD 0.3 <= tau", "", "", "", ""] -atm_stashvar[2271] = ["ISCCP CLOUD tau < 0.3", "", "", "", ""] -atm_stashvar[2272] = ["ISCCP CLOUD 0.3 <= tau < 1.3", "", "", "", ""] -atm_stashvar[2273] = ["ISCCP CLOUD 1.3 <= tau < 3.6", "", "", "", ""] -atm_stashvar[2274] = ["ISCCP CLOUD 3.6 <= tau < 9.4", "", "", "", ""] -atm_stashvar[2275] = ["ISCCP CLOUD 9.4 <= tau < 23.0", "", "", "", ""] -atm_stashvar[2276] = ["ISCCP CLOUD 23.0 <= tau < 60.0", "", "", "", ""] -atm_stashvar[2277] = ["ISCCP CLOUD 60.0 <= tau", "", "", "", ""] -atm_stashvar[2280] = ["Ozone Tropopause Index", "", "", "", ""] -atm_stashvar[2281] = ["Ozone Tropopause Height", "", "", "", ""] -atm_stashvar[2282] = ["Thermal Tropopause Index", "", "", "", ""] -atm_stashvar[2283] = ["Thermal Tropopause Height", "", "", "", ""] -atm_stashvar[2284] = ["SULPHATE OPTICAL DEPTH IN RADIATION", "aod_so4", "", "", ""] -atm_stashvar[2285] = ["MINERAL DUST OPTICAL DEPTH IN RADN.", "aod_dust", "", "", ""] -atm_stashvar[2286] = ["SEA SALT OPTICAL DEPTH IN RADIATION", "aod_ss", "", "", ""] -atm_stashvar[2287] = ["SOOT OPTICAL DEPTH IN RADIATION", "aod_bc", "", "", ""] -atm_stashvar[2288] = ["BIOMASS OPTICAL DEPTH IN RADIATION", "aod_biomass", "", "", ""] -atm_stashvar[2289] = ["BIOGENIC OPTICAL DEPTH IN RADIATION", "aod_biogenic", "", "", ""] -atm_stashvar[2290] = ["WEIGHTED ISCCP CLOUD ALBEDO", "", "", "", ""] -atm_stashvar[2291] = ["WEIGHTED ISCCP CLOUD OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2292] = ["WEIGHTED ISCCP CLOUD TOP PRESSURE", "", "", "", ""] -atm_stashvar[2293] = ["WEIGHTED ISCCP TOTAL CLOUD AREA", "", "", "", ""] -atm_stashvar[2295] = ["FOSSIL FUEL ORG C OPTIC DEPTH IN RAD", "", "", "", ""] -atm_stashvar[2296] = ["DELTA AEROSOL OPTICAL DEPTH IN RADN.", "", "", "", ""] -atm_stashvar[2297] = ["AMMONIUM NITRATE OPTICAL DEPTH RADN.", "", "", "", ""] -atm_stashvar[2298] = ["TOTAL OPTICAL DEPTH IN RADIATION", "", "", "", ""] -atm_stashvar[2299] = ["ANGSTROM FROM TOTAL AOD IN RADIATION", "", "", "", ""] -atm_stashvar[2300] = ["AITKEN MODE (SOLUBLE) OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2301] = ["ACCUM MODE (SOLUBLE) OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2302] = ["COARSE MODE (SOLUBLE) OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2303] = ["AITKEN MODE (INSOL) OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2304] = ["ACCUM MODE (INSOL) OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2305] = ["COARSE MODE (INSOL) OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2308] = ["GRIDBOX LSC Qcl IN RADIATION KG/KG", "", "", "", ""] -atm_stashvar[2309] = ["GRIDBOX LSC Qcf IN RADIATION KG/KG", "", "", "", ""] -atm_stashvar[2310] = ["GRIDBOX CNV Qcl IN RADIATION KG/KG", "", "", "", ""] -atm_stashvar[2311] = ["GRIDBOX CNV Qcf IN RADIATION KG/KG", "", "", "", ""] -atm_stashvar[2312] = ["GRIDBOX LIQ LSC CF IN RADIATION", "", "", "", ""] -atm_stashvar[2313] = ["GRIDBOX ICE LSC CF IN RADIATION", "", "", "", ""] -atm_stashvar[2314] = ["GRIDBOX LIQ CCA IN RADIATION", "", "", "", ""] -atm_stashvar[2315] = ["GRIDBOX ICE CCA IN RADIATION", "", "", "", ""] -atm_stashvar[2317] = ["CONVECTIVE CORE 3D CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2318] = ["GRIDBOX CONVECTIVE CORE Qcl KG/KG", "", "", "", ""] -atm_stashvar[2319] = ["GRIDBOX CONVECTIVE CORE Qcf KG/KG", "", "", "", ""] -atm_stashvar[2320] = ["COSP: MASK FOR CALIPSO CF ON LVLS", "", "", "", ""] -atm_stashvar[2321] = ["COSP: MASK FOR CALIPSO LOW-LEVEL CF", "", "", "", ""] -atm_stashvar[2322] = ["COSP: MASK FOR CALIPSO MID-LEVEL CF", "", "", "", ""] -atm_stashvar[2323] = ["COSP: MASK FOR CALIPSO HIGH-LEVEL CF", "", "", "", ""] -atm_stashvar[2324] = ["COSP: MASK FOR CALIPSO TOTAL CF", "", "", "", ""] -atm_stashvar[2325] = ["COSP: MASK FOR CALIPSO CF ON 40 LVLS", "", "", "", ""] -atm_stashvar[2326] = ["COSP: MASK FOR 2.358", "", "", "", ""] -atm_stashvar[2327] = ["COSP: MASK FOR 2.359", "", "", "", ""] -atm_stashvar[2330] = ["COSP: ISCCP/MISR/MODIS CLOUD WEIGHTS", "", "", "", ""] -atm_stashvar[2331] = ["COSP: ISCCP WEIGHTED CLOUD ALBEDO", "", "", "", ""] -atm_stashvar[2332] = ["COSP: ISCCP WEIGHTED CLOUD TAU", "", "", "", ""] -atm_stashvar[2333] = ["COSP: ISCCP WEIGHTED CLOUD TOP PRES.", "", "", "", ""] -atm_stashvar[2334] = ["COSP: ISCCP TOTAL CLOUD AREA", "", "", "", ""] -atm_stashvar[2335] = ["COSP: ISCCP ALL-SKY 10.5 MICRON Tb", "", "", "", ""] -atm_stashvar[2336] = ["COSP: ISCCP CLEAR-SKY 10.5 MICRON Tb", "", "", "", ""] -atm_stashvar[2337] = ["COSP: ISCCP CTP-TAU HISTOGRAM", "", "", "", ""] -atm_stashvar[2340] = ["COSP: CALIPSO MOLECULAR BACKSCATTER", "", "", "", ""] -atm_stashvar[2341] = ["COSP: CALIPSO TOTAL BACKSCATTER", "", "", "", ""] -atm_stashvar[2342] = ["COSP: CALIPSO CFAD SCATTERING RATIO", "", "", "", ""] -atm_stashvar[2343] = ["COSP: CALIPSO CLOUD AREA ON LEVELS", "", "", "", ""] -atm_stashvar[2344] = ["COSP: CALIPSO LOW-LEVEL CLOUD", "", "", "", ""] -atm_stashvar[2345] = ["COSP: CALIPSO MID-LEVEL CLOUD", "", "", "", ""] -atm_stashvar[2346] = ["COSP: CALIPSO HIGH-LEVEL CLOUD", "", "", "", ""] -atm_stashvar[2347] = ["COSP: CALIPSO TOTAL CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2348] = ["COSP: PARASOL TOA REFLECTANCE", "", "", "", ""] -atm_stashvar[2349] = ["COSP: CALIPSO-ONLY 3D CLOUD AREA", "", "", "", ""] -atm_stashvar[2350] = ["COSP: CLOUDSAT CFAD REFLECTIVITY", "", "", "", ""] -atm_stashvar[2351] = ["COSP: CLOUDSAT REFLECTIVITY", "", "", "", ""] -atm_stashvar[2352] = ["COSP: SUBCOLUMN CLOUD ARRAY", "", "", "", ""] -atm_stashvar[2353] = ["COSP: GBX-MEAN CSAT Ze MDL LEVELS", "", "", "", ""] -atm_stashvar[2354] = ["COSP: GBX-MEAN CSAT Ze 40 LEVELS", "", "", "", ""] -atm_stashvar[2355] = ["COSP: GBX-MEAN CALIPSO ATB MDL LVLS", "", "", "", ""] -atm_stashvar[2356] = ["COSP: GBX-MEAN CALIPSO ATB 40 LVLS", "", "", "", ""] -atm_stashvar[2357] = ["COSP: CALIPSO MOLECULAR ATB 40 LVLS", "", "", "", ""] -atm_stashvar[2358] = ["COSP: CALIPSO/CLOUDSAT CLOUD MDL LEV", "", "", "", ""] -atm_stashvar[2359] = ["COSP: CALIPSO/CLOUDSAT CLOUD 40 LEV", "", "", "", ""] -atm_stashvar[2360] = ["COSP: MISR CTH-TAU HISTOGRAM", "", "", "", ""] -atm_stashvar[2370] = ["COSP: CALIPSO CFAD SR 40 CSAT LEVELS", "", "", "", ""] -atm_stashvar[2371] = ["COSP: CALIPSO CLOUD AREA 40 CSAT LVS", "", "", "", ""] -atm_stashvar[2372] = ["COSP: CLOUDSAT CFAD Ze 40 CSAT LVLS", "", "", "", ""] -atm_stashvar[2373] = ["COSP: HYDROMETEOR EFFECTIVE RADIUS", "", "", "", ""] -atm_stashvar[2374] = ["COSP: CALIPSO-ONLY 3D CLOUD 40 LVLS", "", "", "", ""] -atm_stashvar[2375] = ["COSP: LARGE-SCALE CLOUD OPT. DEPTH", "", "", "", ""] -atm_stashvar[2376] = ["COSP: LARGE-SCALE CLOUD EMISSIVITY", "", "", "", ""] -atm_stashvar[2377] = ["COSP: CONVECTIVE CLOUD OPT. DEPTH", "", "", "", ""] -atm_stashvar[2378] = ["COSP: CONVECTIVE CLOUD EMISSIVITY", "", "", "", ""] -atm_stashvar[2380] = ["COSP: Reff L-S CLOUD LIQUID WATER", "", "", "", ""] -atm_stashvar[2381] = ["COSP: Reff L-S CLOUD ICE", "", "", "", ""] -atm_stashvar[2382] = ["COSP: Reff L-S CLOUD RAINFALL", "", "", "", ""] -atm_stashvar[2383] = ["COSP: Reff L-S CLOUD SNOWFALL", "", "", "", ""] -atm_stashvar[2384] = ["COSP: Reff CONV CLOUD LIQUID WATER", "", "", "", ""] -atm_stashvar[2385] = ["COSP: Reff CONV CLOUD ICE", "", "", "", ""] -atm_stashvar[2386] = ["COSP: Reff CONV CLOUD RAINFALL", "", "", "", ""] -atm_stashvar[2387] = ["COSP: Reff CONV CLOUD SNOWFALL", "", "", "", ""] -atm_stashvar[2388] = ["COSP: Reff L-S CLOUD GRAUPEL", "", "", "", ""] -atm_stashvar[2389] = ["COSP: 3D CONVECTIVE RAINFALL RATE", "", "", "", ""] -atm_stashvar[2390] = ["COSP: 3D CONVECTIVE SNOWFALL RATE", "", "", "", ""] -atm_stashvar[2391] = ["LARGE SCALE LIQUID WATER PATH kg/m2", "", "", "", ""] -atm_stashvar[2392] = ["LARGE SCALE ICE WATER PATH kg/m2", "", "", "", ""] -atm_stashvar[2393] = ["CONVECTIVE LIQUID WATER PATH kg/m2", "", "", "", ""] -atm_stashvar[2394] = ["CONVECTIVE ICE WATER PATH kg/m2", "", "", "", ""] -atm_stashvar[2395] = ["CONV. CORE LIQUID WATER PATH kg/m2", "", "", "", ""] -atm_stashvar[2396] = ["CONVECTIVE CORE ICE WATER PATH kg/m2", "", "", "", ""] -atm_stashvar[2397] = ["L-S LIQ WEIGHTED EFFECTIVE DIMENSION", "", "", "", ""] -atm_stashvar[2398] = ["L-S ICE WEIGHTED EFFECTIVE DIMENSION", "", "", "", ""] -atm_stashvar[2399] = ["CNV LIQ WEIGHTED EFFECTIVE DIMENSION", "", "", "", ""] -atm_stashvar[2400] = ["CNV ICE WEIGHTED EFFECTIVE DIMENSION", "", "", "", ""] -atm_stashvar[2406] = ["CLEAR-SKY (II) UPWARD LW FORC.(TOA)", "", "", "", ""] -atm_stashvar[2407] = ["DOWNWARD LW RAD FORCING: SURFACE", "", "", "", ""] -atm_stashvar[2408] = ["CLEAR-SKY (II) DOWN SURF. LW FORC.", "", "", "", ""] -atm_stashvar[2417] = ["UPWARD LW FLUX ON LEVELS W/ FORCING", "", "", "", ""] -atm_stashvar[2418] = ["DOWNWARD LW FLUX ON LEVELS W/ FORC", "", "", "", ""] -atm_stashvar[2419] = ["CLEAR-SKY UP LW ON LEVELS W/ FORCING", "", "", "", ""] -atm_stashvar[2420] = ["CLEAR-SKY DOWN LW ON LEVELS W/ FORC", "", "", "", ""] -atm_stashvar[2421] = ["SULPHATE OPTICAL DEPTH FROM PROGN.", "", "", "", ""] -atm_stashvar[2422] = ["DUST OPTICAL DEPTH FROM PROGNOSTIC", "", "", "", ""] -atm_stashvar[2423] = ["SEA SALT OPTICAL DEPTH, DIAGNOSED", "", "", "", ""] -atm_stashvar[2424] = ["SOOT OPTICAL DEPTH FROM PROGNOSTIC", "", "", "", ""] -atm_stashvar[2425] = ["BIOMASS OPTICAL DEPTH FROM PROGN.", "", "", "", ""] -atm_stashvar[2426] = ["OCFF OPTICAL DEPTH FROM PROGNOSTIC", "", "", "", ""] -atm_stashvar[2427] = ["AMM. NITRATE OPT. DEPTH FROM PROGN.", "", "", "", ""] -atm_stashvar[2433] = ["CLEAR-SKY LW HEATING RATES W/ FORC", "", "", "", ""] -atm_stashvar[2437] = ["NET DOWNWARD LW AT TROP W/ FORCING", "", "", "", ""] -atm_stashvar[2438] = ["DOWNWARD LW AT TROPOPAUSE W/ FORCING", "", "", "", ""] -atm_stashvar[2450] = ["COSP: MODIS CTP-TAU HISTOGRAM", "", "", "", ""] -atm_stashvar[2451] = ["COSP: MODIS WEIGHTED TOT. CLOUD AREA", "", "", "", ""] -atm_stashvar[2452] = ["COSP: MODIS LIQUID CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2453] = ["COSP: MODIS ICE CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2454] = ["COSP: MODIS HIGH-LVL CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2455] = ["COSP: MODIS MID-LVL CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2456] = ["COSP: MODIS LOW-LVL CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2457] = ["COSP: MODIS WEIGHTED TAU - TOTAL", "", "", "", ""] -atm_stashvar[2458] = ["COSP: MODIS WEIGHTED TAU - LIQUID", "", "", "", ""] -atm_stashvar[2459] = ["COSP: MODIS WEIGHTED TAU - ICE", "", "", "", ""] -atm_stashvar[2460] = ["COSP: MODIS WEIGHTED LOG(TAU) -TOTAL", "", "", "", ""] -atm_stashvar[2461] = ["COSP: MODIS WEIGHTED LOG(TAU) - LIQ", "", "", "", ""] -atm_stashvar[2462] = ["COSP: MODIS WEIGHTED LOG(TAU) - ICE", "", "", "", ""] -atm_stashvar[2463] = ["COSP: MODIS WEIGHTED Reff LIQUID", "", "", "", ""] -atm_stashvar[2464] = ["COSP: MODIS WEIGHTED Reff ICE", "", "", "", ""] -atm_stashvar[2465] = ["COSP: MODIS WEIGHTED CLOUD TOP PRES.", "", "", "", ""] -atm_stashvar[2466] = ["COSP: MODIS WEIGHTED LIQUID W. PATH", "", "", "", ""] -atm_stashvar[2467] = ["COSP: MODIS WEIGHTED ICE WATER PATH", "", "", "", ""] -atm_stashvar[2473] = ["COSP: CALIPSO CF 40 LVLS (LIQ)", "", "", "", ""] -atm_stashvar[2474] = ["COSP: CALIPSO CF 40 LVLS (ICE)", "", "", "", ""] -atm_stashvar[2475] = ["COSP: CALIPSO CF 40 LVLS (UNDET)", "", "", "", ""] -atm_stashvar[2476] = ["COSP: CALIPSO LOW-LEVEL CF (LIQ)", "", "", "", ""] -atm_stashvar[2477] = ["COSP: CALIPSO MID-LEVEL CF (LIQ)", "", "", "", ""] -atm_stashvar[2478] = ["COSP: CALIPSO HIGH-LEVEL CF (LIQ)", "", "", "", ""] -atm_stashvar[2479] = ["COSP: CALIPSO TOTAL CLOUD (LIQ)", "", "", "", ""] -atm_stashvar[2480] = ["COSP: CALIPSO LOW-LEVEL CF (ICE)", "", "", "", ""] -atm_stashvar[2481] = ["COSP: CALIPSO MID-LEVEL CF (ICE)", "", "", "", ""] -atm_stashvar[2482] = ["COSP: CALIPSO HIGH-LEVEL CF (ICE)", "", "", "", ""] -atm_stashvar[2483] = ["COSP: CALIPSO TOTAL CLOUD (ICE)", "", "", "", ""] -atm_stashvar[2484] = ["COSP: CALIPSO LOW-LEVEL CF (UNDET)", "", "", "", ""] -atm_stashvar[2485] = ["COSP: CALIPSO MID-LEVEL CF (UNDET)", "", "", "", ""] -atm_stashvar[2486] = ["COSP: CALIPSO HIGH-LEVEL CF (UNDET)", "", "", "", ""] -atm_stashvar[2487] = ["COSP: CALIPSO TOTAL CLOUD (UNDET)", "", "", "", ""] -atm_stashvar[2500] = ["LW DOWN OVER ICE, WGHTD (cats)(W/m2)", "", "", "", ""] -atm_stashvar[2501] = ["LW DOWN OVER ICE, WGHTD (aggr)(W/m2)", "", "", "", ""] -atm_stashvar[2502] = ["LW UP OVR ICE WGHTD(cats)(W/m2)(ret)", "", "", "", ""] -atm_stashvar[2503] = ["LW UP OVR ICE WGHTD(aggr)(W/m2)(ret)", "", "", "", ""] -atm_stashvar[2505] = ["DEPTH OF LAYERS IN RADIATION (M)", "", "", "", ""] -atm_stashvar[2506] = ["TOTAL AOD IN LAYERS AND LW BANDS", "", "", "", ""] -atm_stashvar[2507] = ["TOTAL SCATTERING AOD LAYERS/LW BANDS", "", "", "", ""] -atm_stashvar[2508] = ["AERO ASYM (WGTD) IN LAYERS/LW BANDS", "", "", "", ""] -atm_stashvar[2509] = ["UPWARD LW FLUX ON LEVELS AND BANDS", "", "", "", ""] -atm_stashvar[2510] = ["DOWNWARD LW FLUX ON LEVELS AND BANDS", "", "", "", ""] -atm_stashvar[2511] = ["CLEAR UP LW FLUX ON LEVELS AND BANDS", "", "", "", ""] -atm_stashvar[2512] = ["CLEAR DOWN LW FLUX ON LEVS AND BANDS", "", "", "", ""] -atm_stashvar[2513] = ["LW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[2514] = ["CLEAR-SKY LW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[2515] = ["CLEAN-AIR LW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[2516] = ["CLEAR-CLEAN LW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[2517] = ["CLEAN-AIR UPWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2518] = ["CLEAN-AIR DOWNWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2519] = ["CLEAR-CLEAN UPWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2520] = ["CLEAR-CLEAN DOWNWARD LW FLUX ON LEVS", "", "", "", ""] -atm_stashvar[2521] = ["UPWARD LW FLUX ON LEVELS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2522] = ["DOWNWARD LW FLUX ON LEVS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2523] = ["CLEAR UP LW FLUX ON LEVS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2524] = ["CLR DOWN LW FLUX ON LEVS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2525] = ["UP LW FLUX LEVS/BANDS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2526] = ["DOWN LW FLUX LEVS/BANDS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2527] = ["CLR UP LW FLUX LEVS/BNDS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2528] = ["CLR DOWN LW FLUX LVS/BNDS W/GHG FORC", "", "", "", ""] -atm_stashvar[2530] = ["UKCA 3D AEROSOL EXTINCTION", "", "", "", ""] -atm_stashvar[2531] = ["UKCA 3D AEROSOL ABSORPTION", "", "", "", ""] -atm_stashvar[2532] = ["UKCA 3D AEROSOL SCATTERING", "", "", "", ""] -atm_stashvar[2533] = ["UKCA 3D AEROSOL ASY * SCATTERING", "", "", "", ""] -atm_stashvar[2540] = ["CLASSIC 3D AEROSOL EXTINCTION", "", "", "", ""] -atm_stashvar[2541] = ["CLASSIC 3D AEROSOL ABSORPTION", "", "", "", ""] -atm_stashvar[2542] = ["CLASSIC 3D AEROSOL SCATTERING", "", "", "", ""] -atm_stashvar[2545] = ["CLEAN-AIR UP LW FLUX ON LEVELS/BANDS", "", "", "", ""] -atm_stashvar[2546] = ["CLEAN-AIR DOWN LW FLUX LEVELS/BANDS", "", "", "", ""] -atm_stashvar[2547] = ["CLEAR-CLEAN UP LW FLUX LEVELS/BANDS", "", "", "", ""] -atm_stashvar[2548] = ["CLEAR-CLEAN DOWN LW FLUX LEVS/BANDS", "", "", "", ""] -atm_stashvar[2550] = ["EASYAEROSOL EXTINCTION ON LW BANDS", "", "", "", ""] -atm_stashvar[2551] = ["EASYAEROSOL ABSORPTION ON LW BANDS", "", "", "", ""] -atm_stashvar[2552] = ["EASYAEROSOL SCATTERING ON LW BANDS", "", "", "", ""] -atm_stashvar[2553] = ["EASYAEROSOL ASY*SCA ON LW BANDS", "", "", "", ""] -atm_stashvar[2584] = ["SULPHATE ABSORPTION OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2585] = ["MINERAL DUST ABS. OPICAL DEPTH", "", "", "", ""] -atm_stashvar[2586] = ["SEA SALT ABSORPTION OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2587] = ["SOOT ABSORPTION OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2588] = ["BIOMASS ABSORPTION OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2589] = ["BIOGENIC ABSORPTION OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2595] = ["FOSSIL FUEL ORG C ABS. OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2597] = ["AMMONIUM NITRATE ABS. OPTICAL DEPTH", "", "", "", ""] -atm_stashvar[2709] = ["UPWARD LW FLUX LEVS/BANDS W/ FORCING", "", "", "", ""] -atm_stashvar[2710] = ["DOWNWARD LW FLUX LEVS/BANDS W/ FORC", "", "", "", ""] -atm_stashvar[2711] = ["CLEAR UP LW FLUX LEVS/BANDS W/ FORC", "", "", "", ""] -atm_stashvar[2712] = ["CLEAR DOWN LW FLUX LEVS/BNDS W/ FORC", "", "", "", ""] -atm_stashvar[2713] = ["LW EMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[2714] = ["CLEAR LW EMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[2715] = ["CLEAN LW EMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[2716] = ["CLR-CLN LW EMISSION SPEC 2nd CALL", "", "", "", ""] -atm_stashvar[3002] = ["U COMPNT OF WIND AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3003] = ["V COMPNT OF WIND AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3004] = ["TEMPERATURE AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3010] = ["SPECIFIC HUMIDITY AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3024] = ["SURFACE TEMPERATURE AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3025] = ["BOUNDARY LAYER DEPTH AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3026] = ["ROUGHNESS LEN. AFTER B.L. (SEE DOC)", "", "", "", ""] -atm_stashvar[3027] = ["EFFECTIVE ROUGHNESS LEN FOR SCALARS", "", "", "", ""] -atm_stashvar[3028] = ["ROUGH LEN FOR MOMENTUM WITHOUT OROG", "", "", "", ""] -atm_stashvar[3049] = ["SEA-ICE TEMPERATURE AFTER B. LAYER", "", "", "", ""] -atm_stashvar[3050] = ["MOISTURE EXCHANGE COEFFS", "", "", "", ""] -atm_stashvar[3051] = ["COMBINED RESIST. TO EVAP ON TILES", "", "", "", ""] -atm_stashvar[3052] = ["COEFFS RATIO FOR 1.5M T ON TILES", "", "", "", ""] -atm_stashvar[3053] = ["QSAT GRAD W.R. T SURF L1 ON TILES", "", "", "", ""] -atm_stashvar[3054] = ["AERODYNAMIC RESISTANCE (S/M)", "", "", "", ""] -atm_stashvar[3055] = ["CUMULATIVE FRACTION TRANSPIRATION", "", "", "", ""] -atm_stashvar[3056] = ["LAND MEAN COMBINED RESIST. TO EVAP", "", "", "", ""] -atm_stashvar[3057] = ["LAND MEAN COEFFS RATIO FOR 1.5M T", "", "", "", ""] -atm_stashvar[3058] = ["LAND MEAN QSAT GRAD W.R. T SURF L1", "", "", "", ""] -atm_stashvar[3060] = ["RHOKH_MIX", "", "", "", ""] -atm_stashvar[3061] = ["RHO_ARESIST (RHOSTAR*CD_STD*VSHR)", "", "", "", ""] -atm_stashvar[3062] = ["ARESIST [ 1/(CD_STD*VSHR) ]", "", "", "", ""] -atm_stashvar[3063] = ["RESIST_B (1/CH-1/CD_STD)/VSHR", "", "", "", ""] -atm_stashvar[3064] = ["DTRDZ_CHARNEY_GRID", "", "", "", ""] -atm_stashvar[3065] = ["GRID-LEVEL OF SML INVERSION (kent)", "", "", "", ""] -atm_stashvar[3066] = ["Rho * entrainment rate (we_lim)", "", "", "", ""] -atm_stashvar[3067] = ["Fraction of the timestep (t_frac)", "", "", "", ""] -atm_stashvar[3068] = ["zrzi", "", "", "", ""] -atm_stashvar[3069] = ["GRID-LEVEL OF DSC INVERSION (kent)", "", "", "", ""] -atm_stashvar[3070] = ["Rho * entrainment rate dsc", "", "", "", ""] -atm_stashvar[3071] = ["Fraction of the timestep dsc", "", "", "", ""] -atm_stashvar[3072] = ["zrzi dsc", "", "", "", ""] -atm_stashvar[3073] = ["ZHSC Top of decoupled layer", "", "", "", ""] -atm_stashvar[3074] = ["Dust div1 surf. layer resist (s/m)", "", "", "", ""] -atm_stashvar[3075] = ["Dust div2 surf. layer resist (s/m)", "", "", "", ""] -atm_stashvar[3076] = ["Dust div3 surf. layer resist (s/m)", "", "", "", ""] -atm_stashvar[3077] = ["Dust div4 surf. layer resist (s/m)", "", "", "", ""] -atm_stashvar[3078] = ["Dust div5 surf. layer resist (s/m)", "", "", "", ""] -atm_stashvar[3079] = ["Dust div6 surf. layer resist (s/m)", "", "", "", ""] -atm_stashvar[3100] = ["FLUX OF TRACER 1 IN BL", "", "", "", ""] -atm_stashvar[3101] = ["FLUX OF TRACER 2 IN BL", "", "", "", ""] -atm_stashvar[3102] = ["FLUX OF TRACER 3 IN BL", "", "", "", ""] -atm_stashvar[3103] = ["FLUX OF TRACER 4 IN BL", "", "", "", ""] -atm_stashvar[3104] = ["FLUX OF TRACER 5 IN BL", "", "", "", ""] -atm_stashvar[3105] = ["FLUX OF TRACER 6 IN BL", "", "", "", ""] -atm_stashvar[3106] = ["FLUX OF TRACER 7 IN BL", "", "", "", ""] -atm_stashvar[3107] = ["FLUX OF TRACER 8 IN BL", "", "", "", ""] -atm_stashvar[3108] = ["FLUX OF TRACER 9 IN BL", "", "", "", ""] -atm_stashvar[3109] = ["FLUX OF TRACER 10 IN BL", "", "", "", ""] -atm_stashvar[3110] = ["FLUX OF TRACER 11 IN BL", "", "", "", ""] -atm_stashvar[3111] = ["FLUX OF TRACER 12 IN BL", "", "", "", ""] -atm_stashvar[3112] = ["FLUX OF TRACER 13 IN BL", "", "", "", ""] -atm_stashvar[3113] = ["FLUX OF TRACER 14 IN BL", "", "", "", ""] -atm_stashvar[3114] = ["FLUX OF TRACER 15 IN BL", "", "", "", ""] -atm_stashvar[3115] = ["FLUX OF TRACER 16 IN BL", "", "", "", ""] -atm_stashvar[3116] = ["FLUX OF TRACER 17 IN BL", "", "", "", ""] -atm_stashvar[3117] = ["FLUX OF TRACER 18 IN BL", "", "", "", ""] -atm_stashvar[3118] = ["FLUX OF TRACER 19 IN BL", "", "", "", ""] -atm_stashvar[3119] = ["FLUX OF TRACER 20 IN BL", "", "", "", ""] -atm_stashvar[3120] = ["FLUX OF TRACER 21 IN BL", "", "", "", ""] -atm_stashvar[3121] = ["FLUX OF TRACER 22 IN BL", "", "", "", ""] -atm_stashvar[3122] = ["FLUX OF TRACER 23 IN BL", "", "", "", ""] -atm_stashvar[3123] = ["FLUX OF TRACER 24 IN BL", "", "", "", ""] -atm_stashvar[3124] = ["FLUX OF TRACER 25 IN BL", "", "", "", ""] -atm_stashvar[3125] = ["FLUX OF TRACER 26 IN BL", "", "", "", ""] -atm_stashvar[3126] = ["FLUX OF TRACER 27 IN BL", "", "", "", ""] -atm_stashvar[3127] = ["FLUX OF TRACER 28 IN BL", "", "", "", ""] -atm_stashvar[3128] = ["FLUX OF TRACER 29 IN BL", "", "", "", ""] -atm_stashvar[3129] = ["FLUX OF TOTAL AEROSOL IN BL", "", "", "", ""] -atm_stashvar[3130] = ["COUNTER GRADIENT TERM OF TAUX", "", "", "", ""] -atm_stashvar[3131] = ["COUNTER GRADIENT TERM OF TAUY", "", "", "", ""] -atm_stashvar[3132] = ["COUNTER GRADIENT TERM OF FTL", "", "", "", ""] -atm_stashvar[3133] = ["COUNTER GRADIENT TERM OF FQW", "", "", "", ""] -atm_stashvar[3134] = ["MIXING LENGTH", "", "", "", ""] -atm_stashvar[3135] = ["PRODUCTION RATE OF TKE BY SHEAR", "", "", "", ""] -atm_stashvar[3136] = ["PRODUCTION RATE OF TKE BY BUOYANCY", "", "", "", ""] -atm_stashvar[3137] = ["DISSIPATION RATE OF TKE", "", "", "", ""] -atm_stashvar[3138] = ["NON-DIM DIFFUSION COEFS FOR UV (SM)", "", "", "", ""] -atm_stashvar[3139] = ["NON-DIM DIFFUSION COEFS FOR TQ (SH)", "", "", "", ""] -atm_stashvar[3140] = ["NON-GRADIENT BUOYANCY FLUX", "", "", "", ""] -atm_stashvar[3141] = ["CLOUD FRACTION IN THE TKE SCHEMES", "", "", "", ""] -atm_stashvar[3142] = ["CONDENSED WATER IN THE TKE SCHEMES", "", "", "", ""] -atm_stashvar[3143] = ["STD. DEV. OF GAUSSIAN", "", "", "", ""] -atm_stashvar[3170] = ["QCL INCR: bdy layer positive", "", "", "", ""] -atm_stashvar[3171] = ["QCL INCR: bdy layer negative", "", "", "", ""] -atm_stashvar[3172] = ["QCF INCR: bdy layer positive", "", "", "", ""] -atm_stashvar[3173] = ["QCF INCR: bdy layer negative", "", "", "", ""] -atm_stashvar[3176] = ["LIQ CLOUD VOL INCR: bdy layer positi", "", "", "", ""] -atm_stashvar[3177] = ["LIQ CLOUD VOL INCR: bdy layer negati", "", "", "", ""] -atm_stashvar[3178] = ["ICE CLOUD VOL INCR: bdy layer positi", "", "", "", ""] -atm_stashvar[3179] = ["ICE CLOUD VOL INCR: bdy layer negati", "", "", "", ""] -atm_stashvar[3181] = ["TEMPERATURE INCR: bdy layer", "", "", "", ""] -atm_stashvar[3182] = ["SPECIFIC HUMIDITY INCR: bdy layer", "", "", "", ""] -atm_stashvar[3183] = ["QCL INCR: bdy layer", "", "", "", ""] -atm_stashvar[3184] = ["QCF INCR: bdy layer", "", "", "", ""] -atm_stashvar[3185] = ["U WIND INCR: bdy layer", "", "", "", ""] -atm_stashvar[3186] = ["V WIND INCR: bdy layer", "", "", "", ""] -atm_stashvar[3187] = ["W WIND INCR: bdy layer", "", "", "", ""] -atm_stashvar[3188] = ["LIQUID WATER TEMP INCR: FRIC DISSIP", "", "", "", ""] -atm_stashvar[3189] = ["LIQUID WATER TEMP INCR: bdy layer", "", "", "", ""] -atm_stashvar[3190] = ["TOTAL (LIQ) WATER INCR: bdy layer", "", "", "", ""] -atm_stashvar[3192] = ["BULK CLOUD VOL INCR: bdy layer", "", "", "", ""] -atm_stashvar[3193] = ["LIQUID CLOUD VOL INCR: bdy layer", "", "", "", ""] -atm_stashvar[3194] = ["FROZEN CLOUD VOL INCR: bdy layer", "", "", "", ""] -atm_stashvar[3195] = ["U WIND INCR: Leonard term", "", "", "", ""] -atm_stashvar[3196] = ["V WIND INCR: Leonard term", "", "", "", ""] -atm_stashvar[3197] = ["TEMPERATURE INCR: Leonard term", "", "", "", ""] -atm_stashvar[3198] = ["SPECIFIC HUMIDITY INCR: Leonard term", "", "", "", ""] -atm_stashvar[3199] = ["W WIND INCR: Leonard term", "", "", "", ""] -atm_stashvar[3201] = ["HT FLUX THROUGH SEAICE:SEA MEAN W/M2", "hfss_ice", "W m-2", "downward_heat_flux_in_sea_ice", ""] -atm_stashvar[3202] = ["HT FLUX FROM SURF TO DEEP SOIL LEV 1", "", "W m-2", "downward_heat_flux_at_ground_level_in_soil", ""] -atm_stashvar[3208] = ["LOWEST LAYER BULK RICHARDSON NO. RIB", "", "", "", ""] -atm_stashvar[3209] = ["10 METRE WIND U-COMP", "uas", "m s-1", "eastward_wind", ""] -atm_stashvar[3210] = ["10 METRE WIND V-COMP", "vas", "m s-1", "northward_wind", ""] -atm_stashvar[3216] = ["BOUNDARY LAYER HEAT FLUXES W/M2", "", "", "", ""] -atm_stashvar[3217] = ["SURFACE SENSIBLE HEAT FLUX W/M2", "hfss", "W m-2", "surface_upward_sensible_heat_flux", ""] -atm_stashvar[3219] = ["X-COMP OF SURF & BL WIND STRESS N/M2", "tauu", "N m-2", "surface_downward_eastward_stress", ""] -atm_stashvar[3220] = ["Y-COMP OF SURF & BL WIND STRESS N/M2", "tauv", "N m-2", "surface_downward_northward_stress", ""] -atm_stashvar[3221] = ["MAG OF SURF & BL WIND STRESS B GRID", "", "", "", ""] -atm_stashvar[3222] = ["B.LAYER TOTAL MOISTURE FLUXS KG/M2/S", "", "", "", ""] -atm_stashvar[3223] = ["SURFACE TOTAL MOISTURE FLUX KG/M2/S", "evspsbl", "kg m-2 s-1", "water_evaporation_flux", ""] -atm_stashvar[3224] = ["WIND MIX EN'GY FL TO SEA:SEA MN W/M2", "", "", "", ""] -atm_stashvar[3225] = ["10 METRE WIND U-COMP B GRID", "uas", "m s-1", "eastward_wind", ""] -atm_stashvar[3226] = ["10 METRE WIND V-COMP B GRID", "vas", "m s-1", "northward_wind", ""] -atm_stashvar[3227] = ["10 METRE WIND SPEED ON B GRID", "wnd", "m s-1", "wind_speed", ""] -atm_stashvar[3228] = ["SFC SH FLX FROM OPEN SEA:SEA MN W/M2", "", "", "", ""] -atm_stashvar[3229] = ["EVAP FROM SOIL SURF -AMOUNT KG/M2/TS", "evpsoil", "kg m-2", "water_evaporation_flux_from_soil", "evpsoil_step"] -atm_stashvar[3230] = ["10 METRE WIND SPEED ON C GRID", "", "", "", ""] -atm_stashvar[3231] = ["SUBLIM. FROM SURFACE (GBM) KG/M2/TS", "", "", "", ""] -atm_stashvar[3232] = ["EVAP FROM OPEN SEA: SEA MEAN KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3234] = ["SURFACE LATENT HEAT FLUX W/M2", "hfls", "W m-2", "surface_upward_latent_heat_flux", ""] -atm_stashvar[3235] = ["SEAICE TOP MELT LH FLX:SEA MEAN W/M2", "", "W m-2", "", ""] -atm_stashvar[3236] = ["TEMPERATURE AT 1.5M", "tas", "K", "air_temperature", ""] -atm_stashvar[3237] = ["SPECIFIC HUMIDITY AT 1.5M", "huss", "1", "specific_humidity", ""] -atm_stashvar[3238] = ["DEEP SOIL TEMPERATURE AFTER B.LAYER", "tsl", "K", "soil_temperature", ""] -atm_stashvar[3239] = ["CLOUD LIQUID WATER AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3240] = ["CLOUD ICE CONTENT AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3241] = ["TOTAL SURF MOIST FLUX PER TIMESTEP", "", "", "", ""] -atm_stashvar[3245] = ["RELATIVE HUMIDITY AT 1.5M", "", "%", "relative_humidity", ""] -atm_stashvar[3247] = ["VISIBILITY AT 1.5M M", "", "", "", ""] -atm_stashvar[3248] = ["FOG FRACTION AT 1.5 M", "", "", "", ""] -atm_stashvar[3250] = ["DEWPOINT AT 1.5M (K)", "", "", "", ""] -atm_stashvar[3251] = ["SILHOUETTE OROGRAPHIC ROUGHNESS", "", "", "", ""] -atm_stashvar[3252] = ["HALF OF (PEAK TO TROUGH HT OF OROG)", "", "", "", ""] -atm_stashvar[3253] = ["PROBABILITY OF VIS LESS THAN 5 KM", "", "", "", ""] -atm_stashvar[3254] = ["TL AT 1.5M", "", "", "", ""] -atm_stashvar[3255] = ["QT AT 1.5M", "", "", "", ""] -atm_stashvar[3256] = ["Heat flux through sea ice (W/m2)", "", "", "", ""] -atm_stashvar[3257] = ["Heat flux in sea ice surface melt", "", "", "", ""] -atm_stashvar[3258] = ["SURFACE SNOWMELT HEAT FLUX W/M2", "", "", "", ""] -atm_stashvar[3259] = ["CANOPY CONDUCTANCE M/S", "", "", "", ""] -atm_stashvar[3261] = ["GROSS PRIMARY PRODUCTIVITY KG C/M2/S", "gpp", "kg m-2 s-1", "gross_primary_productivity_of_biomass_expressed_as_carbon", ""] -atm_stashvar[3262] = ["NET PRIMARY PRODUCTIVITY KG C/M2/S", "npp", "kg m-2 s-1", "net_primary_productivity_of_biomass_expressed_as_carbon", ""] -atm_stashvar[3263] = ["PLANT RESPIRATION KG/M2/S", "resp", "kg m-2 s-1", "plant_respiration_carbon_flux", ""] -atm_stashvar[3270] = ["SO2 SURFACE DRY DEP FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3271] = ["SO4 AIT SURF DRY DEP FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3272] = ["SO4 ACC SURF DRY DEP FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3273] = ["SO4 DIS SURF DRY DEP FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3274] = ["ACCUM NITRATE DRY DEP FLX KG[N]/M2/S", "", "", "", ""] -atm_stashvar[3275] = ["DISS NITRATE DRY DEP FLUX KG[N]/M2/S", "", "", "", ""] -atm_stashvar[3281] = ["VIS AT 1.5M (incl precip) M", "", "", "", ""] -atm_stashvar[3282] = ["PROB OF VIS < 1 KM (incl precip)", "", "", "", ""] -atm_stashvar[3283] = ["PROB OF VIS < 5 KM (incl precip)", "", "", "", ""] -atm_stashvar[3284] = ["VISIBILITY AT 1.5M IN LS PPTN M", "", "", "", ""] -atm_stashvar[3285] = ["VISIBILITY AT 1.5M IN CONV PPTN M", "", "", "", ""] -atm_stashvar[3287] = ["CANOPY EVAPORATION ON TILES", "evspsblveg_tile", "kg m-2 s-1", "water_evaporation_flux_from_canopy", ""] -atm_stashvar[3288] = ["TRANSPIRATION+SOIL EVP ON TILES", "hfls", "kg m-2 s-1", "surface_upward_latent_heat_flux", "hfls_tile"] -atm_stashvar[3289] = ["GROSS PRIMARY PRODUCTIVITY ON PFTS", "gpp_tile", "kg m-2 s-1", "gross_primary_productivity_of_biomass_expressed_as_carbon", ""] -atm_stashvar[3290] = ["SURFACE SENSIBLE HEAT FLUX ON TILES", "hfss", "W m-2", "surface_upward_sensible_heat_flux", "hfss_tile"] -atm_stashvar[3291] = ["NET PRIMARY PRODUCTIVITY ON PFTS", "npp_tile", "kg m-2 s-1", "net_primary_productivity_of_biomass_expressed_as_carbon", ""] -atm_stashvar[3292] = ["PLANT RESPIRATION ON PFTS KG C/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3293] = ["SOIL RESPIRATION KG C/M2/S", "resp_soil", "kg m-2 s-1", "", ""] -atm_stashvar[3294] = ["BULK RICHARDSON NUMBER ON TILES", "", "", "", ""] -atm_stashvar[3296] = ["EVAP FROM SOIL SURF : RATE KG/M2/S", "evspsblsoil", "kg m-2 s-1", "water_evaporation_flux_from_soil", ""] -atm_stashvar[3297] = ["EVAP FROM CANOPY : RATE KG/M2/S", "evspsblveg", "kg m-2 s-1", "water_evaporation_flux_from_canopy", ""] -atm_stashvar[3298] = ["SUBLIM. SURFACE (GBM) : RATE KG/M2/S", "sbl", "kg m-2 s-1", "surface_snow_and_ice_sublimation_flux", ""] -atm_stashvar[3300] = ["NH3 SURFACE DRY DEP FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3301] = ["FRESH SOOT DRY DEPN FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3302] = ["AGED SOOT DRY DEPN FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3303] = ["SOOT IN CLOUD DEPN FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3304] = ["TURBULENT MIXING HT AFTER B.LAYER m", "", "", "", ""] -atm_stashvar[3305] = ["STABLE BL INDICATOR", "", "", "", ""] -atm_stashvar[3306] = ["STRATOCUM. OVER STABLE BL INDICATOR", "", "", "", ""] -atm_stashvar[3307] = ["WELL_MIXED BL INDICATOR", "", "", "", ""] -atm_stashvar[3308] = ["DECOUPLED SC. NOT OVER CU. INDICATOR", "", "", "", ""] -atm_stashvar[3309] = ["DECOUPLED SC. OVER CU. INDICATOR", "", "", "", ""] -atm_stashvar[3310] = ["CUMULUS-CAPPED BL INDICATOR", "", "", "", ""] -atm_stashvar[3313] = ["SOIL MOIS AVAIL FACTOR ON PFTS", "", "", "", ""] -atm_stashvar[3314] = ["SURFACE NET RADIATION ON TILES", "netrad_tile", "W m-2", "", ""] -atm_stashvar[3316] = ["SURFACE TEMP ON TILES K", "ts", "K", "surface_temperature", "ts_tile"] -atm_stashvar[3317] = ["SURFACE TILE FRACTIONS", "", "", "", ""] -atm_stashvar[3318] = ["LEAF AREA INDICES ON PFTS", "", "", "", ""] -atm_stashvar[3319] = ["CANOPY HEIGHT ON PFTS", "", "", "", ""] -atm_stashvar[3320] = ["SOIL CARBON CONTENT (B.LAYER) KGC/M2", "", "", "", ""] -atm_stashvar[3321] = ["CANOPY WATER ON TILES KG/M2", "cw_tile", "kg m-2", "", ""] -atm_stashvar[3322] = ["CANOPY CAPACITY ON TILES KG/M2", "", "", "", ""] -atm_stashvar[3324] = ["ROUGHNESS LENGTH ON TILES M", "", "", "", ""] -atm_stashvar[3325] = ["LEAF TURNOVER RATE ON PFTS", "", "", "", ""] -atm_stashvar[3326] = ["CO2 LAND SURFACE FLUX KG/M**2/S", "", "", "", ""] -atm_stashvar[3327] = ["CO2 TOTAL FLUX TO ATMOS KG/M**2/S", "", "", "", ""] -atm_stashvar[3328] = ["1.5M TEMPERATURE OVER TILES", "tas_tile", "K", "", ""] -atm_stashvar[3329] = ["1.5M SPECIFIC HUMIDITY OVER TILES", "", "", "", ""] -atm_stashvar[3330] = ["SURFACE LATENT HEAT FLUX ON TILES", "hfls_tile", "", "", ""] -atm_stashvar[3331] = ["SUBLIMATION MOISTURE FLUX ON TILES", "sbl_tile", "kg m-2 s-1", "", ""] -atm_stashvar[3332] = ["TOA OUTGOING LW RAD AFTER B.LAYER", "rlut", "W m-2", "toa_outgoing_longwave_flux", "rlut_afterbl"] -atm_stashvar[3333] = ["GRID-BOX AVERAGE SURF NET RAD", "", "", "", ""] -atm_stashvar[3334] = ["LAND MEAN POTENTIAL EVAPORATION", "pevap", "kg m-2 s-1", "water_potential_evaporation_flux", ""] -atm_stashvar[3335] = ["POTENTIAL EVAPORATION ON TILES", "pevap", "kg m-2 s-1", "water_potential_evaporation_flux", ""] -atm_stashvar[3337] = ["LAND HT FLUX FROM SURF TO DEEP LEV 1", "", "", "", ""] -atm_stashvar[3338] = ["NET SURF SEA-ICE HT FLUX (SEA MEAN)", "", "", "", ""] -atm_stashvar[3339] = ["LOWEST LAYER BULK RIB: SEA MEAN", "", "", "", ""] -atm_stashvar[3340] = ["SHEAR-DRIVEN B.LAYER INDICATOR", "", "", "", ""] -atm_stashvar[3341] = ["LAND MEAN TEMPERATURE AT 1.5M", "tas", "K", "air_temperature", ""] -atm_stashvar[3342] = ["LAND MEAN SPECIFIC HUMIDITY AT 1.5M", "", "", "", ""] -atm_stashvar[3343] = ["MEAN SEA SFC SH FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3344] = ["10m TEMP OVER SEA/SEAICE K", "", "", "", ""] -atm_stashvar[3345] = ["10m SPEC HUM OVER SEA/SEAICE KG/KG", "", "", "", ""] -atm_stashvar[3347] = ["MOISTURE FLUX FROM MEAN SEA KG/M2/S", "", "", "", ""] -atm_stashvar[3353] = ["SUBLIM. SEAICE:SEA MEAN RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3355] = ["BL THERMAL SPEED (M/S)", "", "", "", ""] -atm_stashvar[3356] = ["HEIGHT OF SURFACE MIXED LAYR TOP (M)", "", "", "", ""] -atm_stashvar[3357] = ["HEIGHT OF DEC STRATOCU LAYER TOP (M)", "", "", "", ""] -atm_stashvar[3358] = ["BL DEPTH DIAGNOSED FROM RICRIT (M)", "", "", "", ""] -atm_stashvar[3359] = ["HEIGHT OF DIAGNOSTIC PARCEL TOP (M)", "", "", "", ""] -atm_stashvar[3360] = ["HEIGHT OF DECOUPLED LAYER BASE", "", "", "", ""] -atm_stashvar[3361] = ["HEIGHT OF STRATOCUMULUS CLOUD BASE", "", "", "", ""] -atm_stashvar[3362] = ["ENTRAINMENT RATE FOR SURFACE ML", "", "", "", ""] -atm_stashvar[3363] = ["ENTRAINMENT RATE FOR BOUNDARY LAYER", "", "", "", ""] -atm_stashvar[3364] = ["INVERSION THICKNESS (M)", "", "", "", ""] -atm_stashvar[3365] = ["10 METRE NEUTRAL WIND U-COMP B GRID", "", "", "", ""] -atm_stashvar[3366] = ["10 METRE NEUTRAL WIND V-COMP B GRID", "", "", "", ""] -atm_stashvar[3367] = ["10 METRE NEUTRAL WIND SPEED B GRID", "", "", "", ""] -atm_stashvar[3368] = ["10 METRE NEUTRAL WIND U-COMP", "", "", "", ""] -atm_stashvar[3369] = ["10 METRE NEUTRAL WIND V-COMP", "", "", "", ""] -atm_stashvar[3370] = ["X-COMP OF SURF PSEUDOSTRESS M2.S-2", "", "", "", ""] -atm_stashvar[3371] = ["Y-COMP OF SURF PSEUDOSTRESS M2.S-2", "", "", "", ""] -atm_stashvar[3380] = ["SURF NET RAD OVER OPEN SEA", "", "", "", ""] -atm_stashvar[3381] = ["SFC NET RADN. OVER SEA-ICE:SEA MEAN", "", "", "", ""] -atm_stashvar[3382] = ["SURFACE NET SW RADIATION ON TILES", "", "", "", ""] -atm_stashvar[3383] = ["SURFACE UP LW RADIATION ON TILES", "", "", "", ""] -atm_stashvar[3384] = ["SURFACE DOWN LW RADIATION ON TILES", "", "", "", ""] -atm_stashvar[3389] = ["SURFACE LAYER WIND SHEAR OVER LAND", "", "", "", ""] -atm_stashvar[3390] = ["MEAN SEA SURFACE LAYER WIND SHEAR", "", "", "", ""] -atm_stashvar[3391] = ["X-COMP OF LAND SURF WIND STRESS N/M2", "", "", "", ""] -atm_stashvar[3392] = ["X-COMP OF MEAN SEA SURF STRESS N/M2", "tauu", "N m-2", "", ""] -atm_stashvar[3393] = ["Y-COMP OF LAND SURF WIND STRESS N/M2", "", "", "", ""] -atm_stashvar[3394] = ["Y-COMP OF MEAN SEA SURF STRESS N/M2", "tauv", "N m-2", "", ""] -atm_stashvar[3395] = ["FRACTION OF LAND", "sftlf", "1", "land_area_fraction", ""] -atm_stashvar[3396] = ["FRESH BIOMASS DRY DEPN FLUX KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3397] = ["AGED BIOMASS DRY DEPN FLUX KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3398] = ["BIOMASS IN CLOUD DEPN FLUX KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3400] = ["Tile area frac. for dust emissions", "", "", "", ""] -atm_stashvar[3401] = ["Dust emissions div 1 (kg/m2/s)", "", "kg m-2 s-1", "", ""] -atm_stashvar[3402] = ["Dust emissions div 2 (kg/m2/s)", "", "kg m-2 s-1", "", ""] -atm_stashvar[3403] = ["Dust emissions div 3 (kg/m2/s)", "", "kg m-2 s-1", "", ""] -atm_stashvar[3404] = ["Dust emissions div 4 (kg/m2/s)", "", "kg m-2 s-1", "", ""] -atm_stashvar[3405] = ["Dust emissions div 5 (kg/m2/s)", "", "kg m-2 s-1", "", ""] -atm_stashvar[3406] = ["Dust emissions div 6 (kg/m2/s)", "", "kg m-2 s-1", "", ""] -atm_stashvar[3407] = ["FRESH OCFF DRY DEPN FLUX KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3408] = ["AGED OCFF DRY DEPN FLUX KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3409] = ["OCFF IN CLOUD DEPN FLUX KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3411] = ["Dust threshold U* on tiles div 1", "", "", "", ""] -atm_stashvar[3412] = ["Dust threshold U* on tiles div 2", "", "", "", ""] -atm_stashvar[3413] = ["Dust threshold U* on tiles div 3", "", "", "", ""] -atm_stashvar[3414] = ["Dust threshold U* on tiles div 4", "", "", "", ""] -atm_stashvar[3415] = ["Dust threshold U* on tiles div 5", "", "", "", ""] -atm_stashvar[3416] = ["Dust threshold U* on tiles div 6", "", "", "", ""] -atm_stashvar[3417] = ["Dust threshold U* on tiles div 7", "", "", "", ""] -atm_stashvar[3418] = ["Dust threshold U* on tiles div 8", "", "", "", ""] -atm_stashvar[3419] = ["Dust threshold U* on tiles div 9", "", "", "", ""] -atm_stashvar[3421] = ["Dust dry threshold U* on tiles div 1", "", "", "", ""] -atm_stashvar[3422] = ["Dust dry threshold U* on tiles div 2", "", "", "", ""] -atm_stashvar[3423] = ["Dust dry threshold U* on tiles div 3", "", "", "", ""] -atm_stashvar[3424] = ["Dust dry threshold U* on tiles div 4", "", "", "", ""] -atm_stashvar[3425] = ["Dust dry threshold U* on tiles div 5", "", "", "", ""] -atm_stashvar[3426] = ["Dust dry threshold U* on tiles div 6", "", "", "", ""] -atm_stashvar[3427] = ["Dust dry threshold U* on tiles div 7", "", "", "", ""] -atm_stashvar[3428] = ["Dust dry threshold U* on tiles div 8", "", "", "", ""] -atm_stashvar[3429] = ["Dust dry threshold U* on tiles div 9", "", "", "", ""] -atm_stashvar[3430] = ["Dust Friction velocity (U*) on tiles", "", "m s-1", "", ""] -atm_stashvar[3440] = ["TOTAL DUST DEPOSITION FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3441] = ["Dust dry dep flux from lev 1 div 1", "", "kg m-2 s-1", "", ""] -atm_stashvar[3442] = ["Dust dry dep flux from lev 1 div 2", "", "kg m-2 s-1", "", ""] -atm_stashvar[3443] = ["Dust dry dep flux from lev 1 div 3", "", "kg m-2 s-1", "", ""] -atm_stashvar[3444] = ["Dust dry dep flux from lev 1 div 4", "", "kg m-2 s-1", "", ""] -atm_stashvar[3445] = ["Dust dry dep flux from lev 1 div 5", "", "kg m-2 s-1", "", ""] -atm_stashvar[3446] = ["Dust dry dep flux from lev 1 div 6", "", "kg m-2 s-1", "", ""] -atm_stashvar[3451] = ["Dust dry dep flux from lev 2 div 1", "", "kg m-2 s-1", "", ""] -atm_stashvar[3452] = ["Dust dry dep flux from lev 2 div 2", "", "kg m-2 s-1", "", ""] -atm_stashvar[3453] = ["Dust dry dep flux from lev 2 div 3", "", "kg m-2 s-1", "", ""] -atm_stashvar[3454] = ["Dust dry dep flux from lev 2 div 4", "", "kg m-2 s-1", "", ""] -atm_stashvar[3455] = ["Dust dry dep flux from lev 2 div 5", "", "kg m-2 s-1", "", ""] -atm_stashvar[3456] = ["Dust dry dep flux from lev 2 div 6", "", "kg m-2 s-1", "", ""] -atm_stashvar[3460] = ["X-COMP SURFACE BL STRESS", "", "", "", ""] -atm_stashvar[3461] = ["Y-COMP SURFACE BL STRESS", "", "", "", ""] -atm_stashvar[3462] = ["STOMATAL CONDUCTANCE ON PFTS (M/S)", "", "", "", ""] -atm_stashvar[3463] = ["WIND GUST", "", "", "", ""] -atm_stashvar[3464] = ["OBUKHOV LENGTH", "", "", "", ""] -atm_stashvar[3465] = ["EXPLICIT FRICTION VELOCITY", "", "", "", ""] -atm_stashvar[3466] = ["CONVECTIVE BL VELOCITY SCALE", "", "", "", ""] -atm_stashvar[3467] = ["SURFACE BUOYANCY FLUX", "", "", "", ""] -atm_stashvar[3468] = ["GRADIENT RICHARDSON NUMBER", "", "", "", ""] -atm_stashvar[3469] = ["VERTICAL BUOYANCY GRADIENT", "", "", "", ""] -atm_stashvar[3470] = ["MODULUS OF WIND SHEAR", "", "", "", ""] -atm_stashvar[3471] = ["BL MOMENTUM DIFFUSION", "", "", "", ""] -atm_stashvar[3472] = ["BL HEAT DIFFUSION", "", "", "", ""] -atm_stashvar[3473] = ["TURBULENT KINETIC ENERGY", "", "", "", ""] -atm_stashvar[3474] = ["X-COMP OF DIST OROGRAPHIC STRESS", "", "", "", ""] -atm_stashvar[3475] = ["Y-COMP OF DIST OROGRAPHIC STRESS", "", "", "", ""] -atm_stashvar[3476] = ["COMBINED BOUNDARY LAYER TYPE", "", "", "", ""] -atm_stashvar[3477] = ["DPM SOIL CARBON POOL(B.LAYER) KGC/M2", "", "", "", ""] -atm_stashvar[3478] = ["RPM SOIL CARBON POOL(B.LAYER) KGC/M2", "", "", "", ""] -atm_stashvar[3479] = ["BIO SOIL CARBON POOL(B.LAYER) KGC/M2", "", "", "", ""] -atm_stashvar[3480] = ["HUM SOIL CARBON POOL(B.LAYER) KGC/M2", "", "", "", ""] -atm_stashvar[3481] = ["DPM SOIL RESPIRATION KG C/M2/S", "", "", "", ""] -atm_stashvar[3482] = ["RPM SOIL RESPIRATION KG C/M2/S", "", "", "", ""] -atm_stashvar[3483] = ["BIO SOIL RESPIRATION KG C/M2/S", "", "", "", ""] -atm_stashvar[3484] = ["HUM SOIL RESPIRATION KG C/M2/S", "", "", "", ""] -atm_stashvar[3485] = ["SOIL RESP TEMPERATURE RATE MODIFIER", "", "", "", ""] -atm_stashvar[3486] = ["SOIL RESP MOISTURE RATE MODIFIER", "", "", "", ""] -atm_stashvar[3487] = ["THETA STAR FROM SURFACE FLUX (K)", "", "", "", ""] -atm_stashvar[3488] = ["QV_STAR FROM SURFACE FLUX (kg/kg)", "", "", "", ""] -atm_stashvar[3489] = ["SOIL RESP VEG COVER RATE MODIFIER", "", "", "", ""] -atm_stashvar[3490] = ["ISOPRENE SURF EMIS PER PFTS", "", "", "", ""] -atm_stashvar[3491] = ["TERPENE SURF EMIS PER PFTS", "", "", "", ""] -atm_stashvar[3492] = ["METHANOL SURF EMIS PER PFTS", "", "", "", ""] -atm_stashvar[3493] = ["ACETONE SURF EMIS PER PFTS", "", "", "", ""] -atm_stashvar[3495] = ["ISOPRENE SURF EMIS", "", "", "", ""] -atm_stashvar[3496] = ["TERPENE SURF EMIS", "", "", "", ""] -atm_stashvar[3497] = ["METHANOL SURF EMIS", "", "", "", ""] -atm_stashvar[3498] = ["ACETONE SURF EMIS", "", "", "", ""] -atm_stashvar[3500] = ["IMPLICIT FRICTION VELOCITY", "", "", "", ""] -atm_stashvar[3501] = ["MIXING LENGTH FOR MOMENTUM (M)", "", "", "", ""] -atm_stashvar[3502] = ["MIXING LENGTH FOR SCALARS (M)", "", "", "", ""] -atm_stashvar[3503] = ["RHOKM DIFF COEFF - LOCAL SCHEME", "", "", "", ""] -atm_stashvar[3504] = ["RHOKH DIFF COEFF - LOCAL SCHEME", "", "", "", ""] -atm_stashvar[3505] = ["RHOKM DIFF COEFF - SURF-DRIVEN TURB", "", "", "", ""] -atm_stashvar[3506] = ["RHOKH DIFF COEFF - SURF-DRIVEN TURB", "", "", "", ""] -atm_stashvar[3507] = ["RHOKM DIFF COEFF - CLD-TOP-DRIVEN", "", "", "", ""] -atm_stashvar[3508] = ["RHOKH DIFF COEFF - CLD-TOP-DRIVEN", "", "", "", ""] -atm_stashvar[3509] = ["Seaice sublimation (cats) (kg/m2/s)", "", "", "", ""] -atm_stashvar[3510] = ["Net surf seaice ht flux (cats)(W/m2)", "", "", "", ""] -atm_stashvar[3511] = ["STABILITY FUNCTION FOR SCALARS", "", "", "", ""] -atm_stashvar[3512] = ["STABILITY FUNCTION FOR MOMENTUM", "", "", "", ""] -atm_stashvar[3513] = ["BLENDING WEIGHT FOR 1D BL SCHEME", "", "", "", ""] -atm_stashvar[3520] = ["SURFACE-BASED THETA PERTURBATION (K)", "", "", "", ""] -atm_stashvar[3521] = ["SURFACE-BASED MOISTURE PERTURBATION", "", "", "", ""] -atm_stashvar[3530] = ["LW UP OVER ICE, WEIGHTED(cats)(W/m2)", "", "", "", ""] -atm_stashvar[3531] = ["LW UP OVER ICE, WEIGHTED(aggr)(W/m2)", "", "", "", ""] -atm_stashvar[3532] = ["SENS. HF OVER ICE, WGTED(cats)(W/m2)", "", "", "", ""] -atm_stashvar[3533] = ["SENS. HF OVER ICE, WGTED(aggr)(W/m2)", "", "", "", ""] -atm_stashvar[3534] = ["TSTAR OVER ICE, WEIGHTED(cats)(K)", "", "", "", ""] -atm_stashvar[3535] = ["TSTAR OVER ICE, WEIGHTED(aggr)(K)", "", "", "", ""] -atm_stashvar[3536] = ["SEA ICE TIME FRACTION (cats)", "", "", "", ""] -atm_stashvar[3537] = ["SEA ICE TIME FRACTION (aggregate)", "", "", "", ""] -atm_stashvar[3538] = ["SEA AND SEA ICE DRAG COEFFICIENT", "", "", "", ""] -atm_stashvar[3539] = ["TRANSPIRATION GRIDBOX MEAN", "", "", "", ""] -atm_stashvar[3540] = ["TRANSPIRATION ON TILES", "", "", "", ""] -atm_stashvar[3541] = ["SEA AND SEA ICE DRAG COEFF HEAT", "", "", "", ""] -atm_stashvar[3550] = ["LEONARD TERM PARAMETER FOR U", "", "", "", ""] -atm_stashvar[3551] = ["LEONARD TERM PARAMETER FOR V", "", "", "", ""] -atm_stashvar[3552] = ["LEONARD TERM PARAMETER FOR SCALARS", "", "", "", ""] -atm_stashvar[3553] = ["LEONARD TERM VERTICAL FLUX U WIND", "", "", "", ""] -atm_stashvar[3554] = ["LEONARD TERM VERTICAL FLUX V WIND", "", "", "", ""] -atm_stashvar[3555] = ["LEONARD TERM VERTICAL FLUX W WIND", "", "", "", ""] -atm_stashvar[3556] = ["LEONARD TERM VERTICAL FLUX theta_l", "", "", "", ""] -atm_stashvar[3557] = ["LEONARD TERM VERTICAL FLUX qw", "", "", "", ""] -atm_stashvar[3560] = ["X-COMP OF BL WIND STRESS ON P GRID", "", "", "", ""] -atm_stashvar[3561] = ["Y-COMP OF BL WIND STRESS ON P GRID", "", "", "", ""] -atm_stashvar[3662] = ["POTENTIAL NET PRIM PRODUC KG C/M2/S", "", "", "", ""] -atm_stashvar[3663] = ["POTENTIAL PLANT RESPIRATION KG/M2/S", "", "", "", ""] -atm_stashvar[3691] = ["POTEN NET PRIM PRODUC PFTS KG C/M2/S", "", "", "", ""] -atm_stashvar[3692] = ["POTEN PLANT RESP ON PFTS KG C/M2/S", "", "", "", ""] -atm_stashvar[4004] = ["TEMPERATURE AFTER LARGE SCALE PRECIP", "", "", "", ""] -atm_stashvar[4010] = ["SPECIFIC HUMIDITY AFTER LS PRECIP", "", "", "", ""] -atm_stashvar[4100] = ["ICE AGGREGATE FRACTION", "", "", "", ""] -atm_stashvar[4101] = ["MICROPHYSICS GRID BOX FLAG", "", "", "", ""] -atm_stashvar[4102] = ["MEAN FALLSPEED CRYSTALS", "", "", "", ""] -atm_stashvar[4103] = ["MEAN FALLSPEED AGGREGATES", "", "", "", ""] -atm_stashvar[4104] = ["FALLSPEED BRANCH FLAG", "", "", "", ""] -atm_stashvar[4105] = ["FALLSPEED USED", "", "", "", ""] -atm_stashvar[4110] = ["SURFACE RADAR REFLECTIVITY (dBZ)", "", "", "", ""] -atm_stashvar[4111] = ["MAX REFLECTIVITY IN COLUMN (dBZ)", "", "", "", ""] -atm_stashvar[4112] = ["RADAR REFLECTIVITY AT 1KM AGL (dBZ)", "", "", "", ""] -atm_stashvar[4113] = ["GRAUPEL RADAR REFLECTIVITY (dBZ)", "", "", "", ""] -atm_stashvar[4114] = ["ICE AGG RADAR REFLECTIVITY (dBZ)", "", "", "", ""] -atm_stashvar[4115] = ["ICE CRY RADAR REFLECTIVITY (dBZ)", "", "", "", ""] -atm_stashvar[4116] = ["RAIN RADAR REFLECTIVITY (dBZ)", "", "", "", ""] -atm_stashvar[4117] = ["LIQ. CLOUD RADAR REFLECTIVITY (dBZ)", "", "", "", ""] -atm_stashvar[4118] = ["TOTAL RADAR REFLECTIVITY 3D (dBZ)", "", "", "", ""] -atm_stashvar[4130] = ["QCL INCR: pc2 checks positive", "", "", "", ""] -atm_stashvar[4131] = ["QCL INCR: pc2 checks negative", "", "", "", ""] -atm_stashvar[4132] = ["QCF INCR: pc2 checks positive", "", "", "", ""] -atm_stashvar[4133] = ["QCF INCR: pc2 checks negative", "", "", "", ""] -atm_stashvar[4136] = ["LIQ CLOUD VOL INCR: pc2 checks posit", "", "", "", ""] -atm_stashvar[4137] = ["LIQ CLOUD VOL INCR: pc2 checks negat", "", "", "", ""] -atm_stashvar[4138] = ["ICE CLOUD VOL INCR: pc2 checks posit", "", "", "", ""] -atm_stashvar[4139] = ["ICE CLOUD VOL INCR: pc2 checks negat", "", "", "", ""] -atm_stashvar[4141] = ["TEMPERATURE INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4142] = ["SPECIFIC HUMIDITY INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4143] = ["QCL INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4144] = ["QCF INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4152] = ["BULK CLOUD VOL INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4153] = ["LIQ CLOUD VOL INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4154] = ["ICE CLOUD VOL INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4170] = ["QCL INCR: ls rain positive", "", "", "", ""] -atm_stashvar[4171] = ["QCL INCR: ls rain negative", "", "", "", ""] -atm_stashvar[4172] = ["QCF INCR: ls rain positive", "", "", "", ""] -atm_stashvar[4173] = ["QCF INCR: ls rain negative", "", "", "", ""] -atm_stashvar[4176] = ["LIQ CLOUD VOL INCR: ls rain positive", "", "", "", ""] -atm_stashvar[4177] = ["LIQ CLOUD VOL INCR: ls rain negative", "", "", "", ""] -atm_stashvar[4178] = ["ICE CLOUD VOL INCR: ls rain positive", "", "", "", ""] -atm_stashvar[4179] = ["ICE CLOUD VOL INCR: ls rain negative", "", "", "", ""] -atm_stashvar[4181] = ["TEMPERATURE INCR: ls rain", "", "", "", ""] -atm_stashvar[4182] = ["SPECIFIC HUMIDITY INCR: ls rain", "", "", "", ""] -atm_stashvar[4183] = ["QCL INCR: ls rain", "", "", "", ""] -atm_stashvar[4184] = ["QCF INCR: ls rain", "", "", "", ""] -atm_stashvar[4189] = ["RAIN INCR: ls rain kg/kg/timestep", "", "", "", ""] -atm_stashvar[4190] = ["GRAUPEL INCR: ls rain kg/kg/timestep", "", "", "", ""] -atm_stashvar[4191] = ["QCF2 INCR: ls rain kg/kg/timestep", "", "", "", ""] -atm_stashvar[4192] = ["BULK CLOUD VOL INCR: ls rain", "", "", "", ""] -atm_stashvar[4193] = ["LIQUID CLOUD VOL INCR: ls rain", "", "", "", ""] -atm_stashvar[4194] = ["FROZEN CLOUD VOL INCR: ls rain", "", "", "", ""] -atm_stashvar[4201] = ["LARGE SCALE RAIN AMOUNT KG/M2/TS", "", "", "", ""] -atm_stashvar[4202] = ["LARGE SCALE SNOW AMOUNT KG/M2/TS", "", "", "", ""] -atm_stashvar[4203] = ["LARGE SCALE RAINFALL RATE KG/M2/S", "", "", "", ""] -atm_stashvar[4204] = ["LARGE SCALE SNOWFALL RATE KG/M2/S", "", "", "", ""] -atm_stashvar[4205] = ["CLOUD LIQUID WATER AFTER LS PRECIP", "", "", "", ""] -atm_stashvar[4206] = ["CLOUD ICE CONTENT AFTER LS PRECIP", "", "", "", ""] -atm_stashvar[4207] = ["RELATIVE HUMIDITY AFTER LS PRECIP", "", "", "", ""] -atm_stashvar[4208] = ["R. HUMIDITY WRT WATER AFTER PRECIP", "", "", "", ""] -atm_stashvar[4209] = ["LARGE SCALE GRAUPEL AMOUNT KG/M2/TS", "", "", "", ""] -atm_stashvar[4210] = ["CLOUD DROP NUMBER CONC. /m3", "", "", "", ""] -atm_stashvar[4211] = ["POT. CLOUD DROP NUMBER CONC. /m3", "", "", "", ""] -atm_stashvar[4212] = ["LARGE SCALE GRAUPEL RATE KG/M2/S", "", "", "", ""] -atm_stashvar[4213] = ["DISS NITR RNOUT BY LS PPN KG[N]/M2/S", "", "", "", ""] -atm_stashvar[4214] = ["ACC NITR WSHOUT BY LS PPN KG[N]/M2/S", "", "", "", ""] -atm_stashvar[4215] = ["NH3 SCAVENGED BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4216] = ["SO2 SCAVENGED BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4219] = ["SO4 DIS SCAVNGD BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4220] = ["SOOT RAINOUT BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4221] = ["SOOT WASHOUT BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4222] = ["RAINFALL RATE OUT OF MODEL LEVELS", "", "", "", ""] -atm_stashvar[4223] = ["SNOWFALL RATE OUT OF MODEL LEVELS", "", "", "", ""] -atm_stashvar[4224] = ["SUPERCOOLED LIQUID WATER CONTENT", "", "", "", ""] -atm_stashvar[4225] = ["SUPERCOOLED RAIN OUT OF MODEL LEVELS", "", "", "", ""] -atm_stashvar[4226] = ["GRAUPEL FALL RATE ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[4227] = ["RAIN FRACTION OUT OF MODEL LEVELS", "", "", "", ""] -atm_stashvar[4228] = ["OCFF RAINOUT BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4229] = ["OCFF WASHOUT BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4231] = ["Dust wet dep flux ls precip div 1", "", "kg m-2 s-1", "", ""] -atm_stashvar[4232] = ["Dust wet dep flux ls precip div 2", "", "kg m-2 s-1", "", ""] -atm_stashvar[4233] = ["Dust wet dep flux ls precip div 3", "", "kg m-2 s-1", "", ""] -atm_stashvar[4234] = ["Dust wet dep flux ls precip div 4", "", "kg m-2 s-1", "", ""] -atm_stashvar[4235] = ["Dust wet dep flux ls precip div 5", "", "kg m-2 s-1", "", ""] -atm_stashvar[4236] = ["Dust wet dep flux ls precip div 6", "", "kg m-2 s-1", "", ""] -atm_stashvar[4237] = ["BIOMASS RAINOUT BY LS PPN KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[4238] = ["BIOMASS WASHOUT BY LS PPN KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[4240] = ["HOMOGENEOUS NUCLEATION RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4241] = ["HETEROGENOUS NUCLEATION RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4243] = ["DEPOSITION RATE CRY kg/kg/s", "", "", "", ""] -atm_stashvar[4245] = ["DEPOSITION RATE AGG kg/kg/s", "", "", "", ""] -atm_stashvar[4247] = ["RIMING RATE CRY kg/kg/s", "", "", "", ""] -atm_stashvar[4248] = ["RIMING RATE AGG kg/kg/s", "", "", "", ""] -atm_stashvar[4249] = ["CRY RAIN-CAPTURE RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4250] = ["AGG RAIN-CAPTURE RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4251] = ["EVAP OF MELTING CRY kg/kg/s", "", "", "", ""] -atm_stashvar[4252] = ["EVAP OF MELTING SNOW AGG kg/kg/s", "", "", "", ""] -atm_stashvar[4253] = ["MELTING RATE CRY kg/kg/s", "", "", "", ""] -atm_stashvar[4254] = ["MELTING RATE AGG kg/kg/s", "", "", "", ""] -atm_stashvar[4255] = ["SNOW AUTOCONV RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4256] = ["SNOW CAPTURE OF CRYSTALS kg/kg/s", "", "", "", ""] -atm_stashvar[4257] = ["RAIN AUTOCONV RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4258] = ["RAIN ACCRETION RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4259] = ["EVAPORATION OF RAIN RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4260] = ["GRAUPEL AUTOCONV RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4261] = ["GRAUPEL ACCRETION RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4262] = ["GRAUPEL SNOW-CAPTURE RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4263] = ["GRAUPEL MELTING RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4264] = ["GRAUPEL EVAPORATION RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4265] = ["ICE CRYSTAL SEDIMENT RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4266] = ["SNOW AGG. SEDIMENT RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4267] = ["RAIN SEDIMENT RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4268] = ["GRAUPEL SEDIMENT RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4269] = ["DROPLET SETTLE RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4270] = ["DROPLET SETTLE EVAP RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4271] = ["HOMOG FREEZING NUC RAIN. kg/ks/s", "", "", "", ""] -atm_stashvar[4275] = ["SURFACE MAX HAIL DIAMETER mm", "", "", "", ""] -atm_stashvar[4276] = ["COLUMN MAX HAIL DIAMETER mm", "", "", "", ""] -atm_stashvar[4277] = ["MAX HAIL DIAMETER MODEL LEVELS mm", "", "", "", ""] -atm_stashvar[4281] = ["TEMPERATURE INCR: pc2 erosion", "", "", "", ""] -atm_stashvar[4282] = ["SPECIFIC HUMIDITY INCR: pc2 erosion", "", "", "", ""] -atm_stashvar[4283] = ["QCL INCR: pc2 erosion", "", "", "", ""] -atm_stashvar[4292] = ["BULK CLOUD VOL INCR: pc2 erosion", "", "", "", ""] -atm_stashvar[4293] = ["LIQ CLOUD VOL INCR: pc2 erosion", "", "", "", ""] -atm_stashvar[4294] = ["QCL DIAG: TURB. MIXED PHASE (KG/KG)", "", "", "", ""] -atm_stashvar[4295] = ["CFL DIAGNOSED: TURB. MIXED PHASE", "", "", "", ""] -atm_stashvar[4296] = ["TURB. DECORRELATION TIMESCALE (S)", "", "", "", ""] -atm_stashvar[4297] = ["INV. PHASE-RELAXATION TIMESCALE", "", "", "", ""] -atm_stashvar[4298] = ["DIAGNOSED TURBULENT DISSIPATION RATE", "", "", "", ""] -atm_stashvar[4299] = ["INVERSE MIXING TIMESCALE (S-1)", "", "", "", ""] -atm_stashvar[4300] = ["MEAN OF SUBGRID SUPERSAT. PDF", "", "", "", ""] -atm_stashvar[4301] = ["VARIANCE OF SUBGRID SUPERSAT. PDF", "", "", "", ""] -atm_stashvar[4302] = ["L.S. SNOW AMOUNT NO GRAUP KG/M2/TS", "", "", "", ""] -atm_stashvar[4303] = ["QCL INCR MIXED PHASE USING PC2", "", "", "", ""] -atm_stashvar[4304] = ["L.S. SNOWFALL RATE NO GRAUP KG/M2/S", "", "", "", ""] -atm_stashvar[4313] = ["CFL INCR MIXED PHASE USING PC2", "", "", "", ""] -atm_stashvar[4323] = ["SNOWFALL RATE NO GRAUPEL MODEL LEVS", "", "", "", ""] -atm_stashvar[4325] = ["CLOUD COND/EVAP RATE KG/KG/S", "", "", "", ""] -atm_stashvar[4336] = ["ICE CLOUD SEDIMENT. RATE KG/KG/S", "", "", "", ""] -atm_stashvar[4350] = ["HOMO FREEZING OF CLOUD NUMBER TEND.", "", "", "", ""] -atm_stashvar[4351] = ["HOMO FREEZING OF RAIN NUMBER TEND.", "", "", "", ""] -atm_stashvar[4352] = ["HALLETT MOSSOP ICE NUMBER TEND.", "", "", "", ""] -atm_stashvar[4353] = ["ICE NUCLEATION ICE NUMBER TEND.", "", "", "", ""] -atm_stashvar[4354] = ["ICE SEDIMENTATION NUMBER TEND.", "", "", "", ""] -atm_stashvar[4355] = ["SNOW SEDIMENTATION NUMBER TEND.", "", "", "", ""] -atm_stashvar[4356] = ["GRAUPEL SEDIMENTATION NUMBER TEND.", "", "", "", ""] -atm_stashvar[4400] = ["SUBGRID OROG WATER MIX RATIO kg/kg", "", "", "", ""] -atm_stashvar[4401] = ["SUBGRID OROG RAIN ACCR RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4402] = ["SUBGRID OROG SNOW RMNG RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4982] = ["Q INCR: methane oxidation", "", "", "", ""] -atm_stashvar[5010] = ["SPECIFIC HUMIDITY AFTER CONVECTION", "", "", "", ""] -atm_stashvar[5140] = ["QCL INCR: conv inhom positive", "", "", "", ""] -atm_stashvar[5141] = ["QCL INCR: conv inhom negative", "", "", "", ""] -atm_stashvar[5142] = ["QCF INCR: conv inhom positive", "", "", "", ""] -atm_stashvar[5143] = ["QCF INCR: conv inhom negative", "", "", "", ""] -atm_stashvar[5146] = ["LIQ CLOUD VOL INCR: conv inhom posit", "", "", "", ""] -atm_stashvar[5147] = ["LIQ CLOUD VOL INCR: conv inhom negat", "", "", "", ""] -atm_stashvar[5148] = ["ICE CLOUD VOL INCR: conv inhom posit", "", "", "", ""] -atm_stashvar[5149] = ["ICE CLOUD VOL INCR: conv inhom negat", "", "", "", ""] -atm_stashvar[5150] = ["QCL INCR: pc2 turbulence", "", "", "", ""] -atm_stashvar[5151] = ["QCL INCR: pc2 turbulence positive", "", "", "", ""] -atm_stashvar[5152] = ["QCL INCR: pc2 turbulence negative", "", "", "", ""] -atm_stashvar[5156] = ["LIQ CLOUD VOL INCR: pc2 turbulence", "", "", "", ""] -atm_stashvar[5157] = ["LIQ CLOUD VOL INCR: pc2 turb positiv", "", "", "", ""] -atm_stashvar[5158] = ["LIQ CLOUD VOL INCR: pc2 turb negativ", "", "", "", ""] -atm_stashvar[5161] = ["TEMPERATURE INCR: convection", "", "", "", ""] -atm_stashvar[5162] = ["SPECIFIC HUMIDITY INCR: convection", "", "", "", ""] -atm_stashvar[5163] = ["QCL INCR: conv inhom", "", "", "", ""] -atm_stashvar[5164] = ["QCF INCR: conv inhom", "", "", "", ""] -atm_stashvar[5172] = ["BULK CLOUD VOL INCR: conv inhom", "", "", "", ""] -atm_stashvar[5173] = ["LIQUID CLOUD VOL INCR: conv inhom", "", "", "", ""] -atm_stashvar[5174] = ["FROZEN CLOUD VOL INCR: conv inhom", "", "", "", ""] -atm_stashvar[5175] = ["du/dt from downdraughts(ms-2 P grid)", "", "", "", ""] -atm_stashvar[5176] = ["dv/dt from downdraughts(ms-2 P grid)", "", "", "", ""] -atm_stashvar[5181] = ["TEMPERATURE INC:convect +(PC2 inhom)", "", "", "", ""] -atm_stashvar[5182] = ["Q INCR: convection +(PC2 inhom)", "", "", "", ""] -atm_stashvar[5183] = ["QCL INCR: convection +(PC2 inhom)", "", "", "", ""] -atm_stashvar[5184] = ["QCF INCR: convection +(PC2 inhom)", "", "", "", ""] -atm_stashvar[5185] = ["U WIND INCR: convection", "", "", "", ""] -atm_stashvar[5186] = ["V WIND INCR: convection", "", "", "", ""] -atm_stashvar[5187] = ["TEMP INCR: convection (no shallowc)", "", "", "", ""] -atm_stashvar[5188] = ["SPEC HUM INCR:convect. (no shallowc)", "", "", "", ""] -atm_stashvar[5192] = ["BULK CLOUD VOL INCR: convection", "", "", "", ""] -atm_stashvar[5193] = ["LIQUID CLOUD VOL INCR: convection", "", "", "", ""] -atm_stashvar[5194] = ["FROZEN CLOUD VOL INCR: convection", "", "", "", ""] -atm_stashvar[5196] = ["(Convective vert. vel.)^2 [(m/s)^2]", "", "", "", ""] -atm_stashvar[5197] = ["Convective vertical velocity [m/s]", "", "", "", ""] -atm_stashvar[5198] = ["d(Temp)/dt from downdraughts K/s", "", "", "", ""] -atm_stashvar[5199] = ["d(q)/dt from downdraughts kg/kg/s", "", "", "", ""] -atm_stashvar[5201] = ["CONVECTIVE RAIN AMOUNT KG/M2/TS", "", "", "", ""] -atm_stashvar[5202] = ["CONVECTIVE SNOW AMOUNT KG/M2/TS", "", "", "", ""] -atm_stashvar[5205] = ["CONVECTIVE RAINFALL RATE KG/M2/S", "", "kg m-2 s-1", "convective_rainfall_rate", ""] -atm_stashvar[5206] = ["CONVECTIVE SNOWFALL RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[5207] = ["PRESSURE AT CONVECTIVE CLOUD BASE", "ccb", "Pa", "air_pressure_at_convective_cloud_base", ""] -atm_stashvar[5208] = ["PRESSURE AT CONVECTIVE CLOUD TOP", "cct", "Pa", "air_pressure_at_convective_cloud_top", ""] -atm_stashvar[5209] = ["TEMPERATURE AFTER CONVECTION", "", "", "", ""] -atm_stashvar[5210] = ["ICAO HT OF CONVECTIVE CLOUD BASE", "", "", "", ""] -atm_stashvar[5211] = ["ICAO HT OF CONVECTIVE CLOUD TOP", "", "", "", ""] -atm_stashvar[5212] = ["CONV. CLOUD AMOUNT ON EACH MODEL LEV", "", "", "", ""] -atm_stashvar[5213] = ["CONV CLOUD CONDENSED WATER KG/KG", "", "", "", ""] -atm_stashvar[5214] = ["TOTAL RAINFALL RATE: LS+CONV KG/M2/S", "prrn", "kg m-2 s-1", "rainfall_flux", ""] -atm_stashvar[5215] = ["TOTAL SNOWFALL RATE: LS+CONV KG/M2/S", "prsn", "kg m-2 s-1", "snowfall_flux", ""] -atm_stashvar[5216] = ["TOTAL PRECIPITATION RATE KG/M2/S", "pr", "kg m-2 s-1", "precipitation_flux", ""] -atm_stashvar[5217] = ["DILUTE CONVECTIVELY AVAIL POT E J/KG", "", "", "", ""] -atm_stashvar[5218] = ["LOWEST CONV CLOUD BASE LEVEL NO.", "", "", "", ""] -atm_stashvar[5219] = ["LOWEST CONV CLOUD TOP LEVEL NO.", "", "", "", ""] -atm_stashvar[5220] = ["LOWEST CONV CLOUD AMOUNT AFTER CONV", "", "", "", ""] -atm_stashvar[5222] = ["PRESSURE AT LOWEST CONV CLOUD BASE", "", "", "", ""] -atm_stashvar[5223] = ["PRESSURE AT LOWEST CONV CLOUD TOP", "", "", "", ""] -atm_stashvar[5224] = ["ICAO HT OF LOWEST CONV CLOUD BASE", "", "", "", ""] -atm_stashvar[5225] = ["ICAO HT OF LOWEST CONV CLOUD TOP", "", "", "", ""] -atm_stashvar[5226] = ["TOTAL PRECIPITATION AMOUNT KG/M2/TS", "", "kg m-2", "precipitation_amount", ""] -atm_stashvar[5227] = ["NOMINAL 3D CONVECTIVE RAINFALL RATE", "", "", "", ""] -atm_stashvar[5228] = ["NOMINAL 3D CONVECTIVE SNOWFALL RATE", "", "", "", ""] -atm_stashvar[5229] = ["Fractional updraught area", "", "", "", ""] -atm_stashvar[5230] = ["Fractional downdraught area", "", "", "", ""] -atm_stashvar[5231] = ["CAPE TIMESCALE (DEEP) S", "", "", "", ""] -atm_stashvar[5232] = ["INDICATOR REDUCED CAPE TIMESCALE", "", "", "", ""] -atm_stashvar[5233] = ["UNDILUTE CAPE J/KG", "", "", "", ""] -atm_stashvar[5234] = ["UNDILUTE PARCEL CIN J/KG", "", "", "", ""] -atm_stashvar[5235] = ["U compnt of wind after convection", "", "", "", ""] -atm_stashvar[5236] = ["V compnt of wind after convection", "", "", "", ""] -atm_stashvar[5237] = ["NH3 SCAVENGED BY CONV PPN KG/M2/SEC", "", "", "", ""] -atm_stashvar[5238] = ["SO2 SCAVENGED BY CONV PPN KG/M2/SEC", "", "", "", ""] -atm_stashvar[5239] = ["SO4 AIT SCAVNGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5240] = ["SO4 ACC SCAVNGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5241] = ["SO4 DIS SCAVNGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5242] = ["SOOT SCAVNGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5243] = ["BIOMASS SCAVNGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5244] = ["OCFF SCAVNGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5246] = ["UD MFLUX(rho lev) Component A (Pa/s)", "", "", "", ""] -atm_stashvar[5247] = ["ACC NIT SCVGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5248] = ["DISS NIT SCVGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5249] = ["UD MASS FLUX rho levels (Pa/s)", "", "", "", ""] -atm_stashvar[5250] = ["UPDRAUGHT MASS FLUX (Pa/s)", "", "", "", ""] -atm_stashvar[5251] = ["DOWNDRAUGHT MASS FLUX (PA/S)", "", "", "", ""] -atm_stashvar[5252] = ["UPDRAUGHT ENTRAINMENT RATE (S-1)", "", "", "", ""] -atm_stashvar[5253] = ["UPDRAUGHT DETRAINMENT RATE (S-1)", "", "", "", ""] -atm_stashvar[5254] = ["DOWNDRAUGHT ENTRAINMENT RATE (S-1)", "", "", "", ""] -atm_stashvar[5255] = ["DOWNDRAUGHT DETRAINMENT RATE (S-1)", "", "", "", ""] -atm_stashvar[5256] = ["U INCREMENT MS-2 ( P GRID)", "", "", "", ""] -atm_stashvar[5257] = ["V INCREMENT MS-2 ( P GRID)", "", "", "", ""] -atm_stashvar[5258] = ["DEEP UW STRESS KG M-1 S-2 P GRID", "", "", "", ""] -atm_stashvar[5259] = ["DEEP VW STRESS KG M-1 S-2 P GRID", "", "", "", ""] -atm_stashvar[5260] = ["SHALL UW STRESS KG M-1 S-2 P GRID", "", "", "", ""] -atm_stashvar[5261] = ["SHALL VW STRESS KG M-1 S-2 P GRID", "", "", "", ""] -atm_stashvar[5262] = ["2D CONVECTIVE CLOUD AMOUNT", "", "", "", ""] -atm_stashvar[5263] = ["MID UW STRESS KG M-1 S-2 P GRID", "", "", "", ""] -atm_stashvar[5264] = ["MID VW STRESS KG M-1 S-2 P GRID", "", "", "", ""] -atm_stashvar[5267] = ["DEEP CONVECTION CFL LIMITED", "", "", "", ""] -atm_stashvar[5268] = ["MID-LEVEL CONVECTION CFL LIMITED", "", "", "", ""] -atm_stashvar[5269] = ["DEEP CONVECTION INDICATOR", "", "", "", ""] -atm_stashvar[5270] = ["SHALLOW CONVECTION INDICATOR", "", "", "", ""] -atm_stashvar[5271] = ["CUMULUS OVER OROGRAPHY INDICATOR", "", "", "", ""] -atm_stashvar[5272] = ["MID LEVEL CONVECTION INDICATOR", "", "", "", ""] -atm_stashvar[5273] = ["TOP LEVEL SURFACE MIXING LAYER", "", "", "", ""] -atm_stashvar[5274] = ["TOP LEVEL INITIAL PARCEL ASCENT", "", "", "", ""] -atm_stashvar[5275] = ["MODEL FREEZING LEVEL", "", "", "", ""] -atm_stashvar[5276] = ["TERMINATION LEVEL for DEEP CONVECT", "", "", "", ""] -atm_stashvar[5277] = ["DEEP CONV PRECIP RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[5278] = ["SHALLOW CONV PRECIP RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[5279] = ["MID LEVEL CONV PRECIP RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[5280] = ["CONGESTUS CONV PRECIP RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[5281] = ["Dust wet dep flux conv precip div 1", "", "kg m-2 s-1", "", ""] -atm_stashvar[5282] = ["Dust wet dep flux conv precip div 2", "", "kg m-2 s-1", "", ""] -atm_stashvar[5283] = ["Dust wet dep flux conv precip div 3", "", "kg m-2 s-1", "", ""] -atm_stashvar[5284] = ["Dust wet dep flux conv precip div 4", "", "kg m-2 s-1", "", ""] -atm_stashvar[5285] = ["Dust wet dep flux conv precip div 5", "", "kg m-2 s-1", "", ""] -atm_stashvar[5286] = ["Dust wet dep flux conv precip div 6", "", "kg m-2 s-1", "", ""] -atm_stashvar[5290] = ["WQT FLUX KG/KG M/S UV LEVEL P GRID", "", "", "", ""] -atm_stashvar[5291] = ["WQL FLUX KG/KG M/S UV LEVEL P GRID", "", "", "", ""] -atm_stashvar[5292] = ["WTHETAL FLUX K M/S UV LEV P GRID", "", "", "", ""] -atm_stashvar[5293] = ["WTHETAV FLUX K M/S UV LEV P GRID", "", "", "", ""] -atm_stashvar[5300] = ["SUBCLOUD LAYER CONV VEL SCALE M/S", "", "", "", ""] -atm_stashvar[5301] = ["CUMULUS LAYER CONV VEL SCALE M/S", "", "", "", ""] -atm_stashvar[5302] = ["CLOUD BASE MASS FLUX 1 M/S", "", "", "", ""] -atm_stashvar[5303] = ["CLOUD BASE MASS FLUX 2 M/S", "", "", "", ""] -atm_stashvar[5304] = ["WQT FLUX AT CLOUD BASE KG/KG M/S", "", "", "", ""] -atm_stashvar[5305] = ["WTHETAL FLUX AT CLOUD BASE KG/KGM/S", "", "", "", ""] -atm_stashvar[5306] = ["WQT FLUX AT INVERSION KG/KG M/S", "", "", "", ""] -atm_stashvar[5307] = ["WTHETAL FLUX AT INVERSION KG/KG M/S", "", "", "", ""] -atm_stashvar[5308] = ["HEIGHT OF TOP OF SHALLOW CONV M", "", "", "", ""] -atm_stashvar[5309] = ["HEIGHT OF BASE OF SHALLOW CONV M", "", "", "", ""] -atm_stashvar[5310] = ["CONGESTUS CONVECTION INDICATOR", "", "", "", ""] -atm_stashvar[5311] = ["CONGESTUS CONVECTION INDICATOR 2", "", "", "", ""] -atm_stashvar[5312] = ["TERMINATION LEVEL FOR CONGESTUS", "", "", "", ""] -atm_stashvar[5313] = ["HEIGHT OF TOP OF CONGESTUS M", "", "", "", ""] -atm_stashvar[5314] = ["HEIGHT OF BASE OF CONGESTUS M", "", "", "", ""] -atm_stashvar[5319] = ["FREQ DEEP CONVECTION TERM HERE", "", "", "", ""] -atm_stashvar[5320] = ["MASS FLUX DEEP CONVECTION", "", "", "", ""] -atm_stashvar[5321] = ["MASS FLUX CONGESTUS CONVECTION", "", "", "", ""] -atm_stashvar[5322] = ["MASS FLUX SHALLOW CONVECTION", "", "", "", ""] -atm_stashvar[5323] = ["MASS FLUX MID-LEVEL CONVECTION", "", "", "", ""] -atm_stashvar[5324] = ["DT FROM DEEP CONVECTION K/S", "", "", "", ""] -atm_stashvar[5325] = ["DT FROM CONGESTUS CONVECTION K/S", "", "", "", ""] -atm_stashvar[5326] = ["DT FROM SHALLOW CONVECTION K/S", "", "", "", ""] -atm_stashvar[5327] = ["DT FROM MID-LEVEL CONVECTION K/S", "", "", "", ""] -atm_stashvar[5328] = ["DQ FROM DEEP CONVECTION KG/KG/S", "", "", "", ""] -atm_stashvar[5329] = ["DQ FROM CONGESTUS CONVECTION KG/KG/S", "", "", "", ""] -atm_stashvar[5330] = ["DQ FROM SHALLOW CONVECTION KG/KG/S", "", "", "", ""] -atm_stashvar[5331] = ["DQ FROM MID-LEVEL CONVECTION KG/KG/S", "", "", "", ""] -atm_stashvar[5332] = ["DU FROM DEEP CONV M/S2 ( P GRID)", "", "", "", ""] -atm_stashvar[5333] = ["DU FROM CONGESTUS CONV M/S2 (P GRID)", "", "", "", ""] -atm_stashvar[5334] = ["DU FROM SHALLOW CONV M/S2 ( P GRID)", "", "", "", ""] -atm_stashvar[5335] = ["DU FROM MID-LEVEL CONV M/S2 (P GRID)", "", "", "", ""] -atm_stashvar[5336] = ["DV FROM DEEP CONV M/S2 ( P GRID)", "", "", "", ""] -atm_stashvar[5337] = ["DV FROM CONGESTUS CONV MS-2 (P GRID)", "", "", "", ""] -atm_stashvar[5338] = ["DV FROM SHALLOW CONV MS-2 (P GRID)", "", "", "", ""] -atm_stashvar[5339] = ["DV FROM MID-LEVEL CONV MS-2 (P GRID)", "", "", "", ""] -atm_stashvar[5400] = ["CONV_TYPE INDICATOR", "", "", "", ""] -atm_stashvar[5401] = ["CONV_TYPE INDICATOR 1", "", "", "", ""] -atm_stashvar[5402] = ["CONV_TYPE INDICATOR 2", "", "", "", ""] -atm_stashvar[5403] = ["CONV_TYPE INDICATOR 3", "", "", "", ""] -atm_stashvar[5404] = ["CONV_TYPE INDICATOR 4", "", "", "", ""] -atm_stashvar[5405] = ["CONV_TYPE 1 PRECIP RATE KG/M2/S", "", "", "", ""] -atm_stashvar[5406] = ["CONV_TYPE 2 PRECIP RATE KG/M2/S", "", "", "", ""] -atm_stashvar[5407] = ["CONV_TYPE 3 PRECIP RATE KG/M2/S", "", "", "", ""] -atm_stashvar[5408] = ["CONV_TYPE 4 PRECIP RATE KG/M2/S", "", "", "", ""] -atm_stashvar[5409] = ["DT FROM CONV_TYPE 1 K/S", "", "", "", ""] -atm_stashvar[5410] = ["DT FROM CONV_TYPE 2 K/S", "", "", "", ""] -atm_stashvar[5411] = ["DT FROM CONV_TYPE 3 K/S", "", "", "", ""] -atm_stashvar[5412] = ["DT FROM CONV_TYPE 4 K/S", "", "", "", ""] -atm_stashvar[5413] = ["DQ FROM CONV_TYPE 1 KG/KG/S", "", "", "", ""] -atm_stashvar[5414] = ["DQ FROM CONV_TYPE 2 KG/KG/S", "", "", "", ""] -atm_stashvar[5415] = ["DQ FROM CONV_TYPE 3 KG/KG/S", "", "", "", ""] -atm_stashvar[5416] = ["DQ FROM CONV_TYPE 4 KG/KG/S", "", "", "", ""] -atm_stashvar[5417] = ["MASS FLUX CONV_TYPE 1", "", "", "", ""] -atm_stashvar[5418] = ["MASS FLUX CONV_TYPE 2", "", "", "", ""] -atm_stashvar[5419] = ["MASS FLUX CONV_TYPE 3", "", "", "", ""] -atm_stashvar[5420] = ["MASS FLUX CONV_TYPE 4", "", "", "", ""] -atm_stashvar[5421] = ["HIGHEST LEVEL OF CONV_TYPE 1", "", "", "", ""] -atm_stashvar[5422] = ["HIGHEST LEVEL OF CONV_TYPE 2", "", "", "", ""] -atm_stashvar[5423] = ["HIGHEST LEVEL OF CONV_TYPE 3", "", "", "", ""] -atm_stashvar[5424] = ["HIGHEST LEVEL OF CONV_TYPE 4", "", "", "", ""] -atm_stashvar[5425] = ["WTHETA_L CONV_TYPE 1", "", "", "", ""] -atm_stashvar[5426] = ["WTHETA_L CONV_TYPE 2", "", "", "", ""] -atm_stashvar[5427] = ["WTHETA_L CONV_TYPE 3", "", "", "", ""] -atm_stashvar[5428] = ["WTHETA_L CONV_TYPE 4", "", "", "", ""] -atm_stashvar[5429] = ["WQT CONV_TYPE 1", "", "", "", ""] -atm_stashvar[5430] = ["WQT CONV_TYPE 2", "", "", "", ""] -atm_stashvar[5431] = ["WQT CONV_TYPE 3", "", "", "", ""] -atm_stashvar[5432] = ["WQT CONV_TYPE 4", "", "", "", ""] -atm_stashvar[6002] = ["U COMPNT OF WIND AFTER G.WAVE DRAG", "", "", "", ""] -atm_stashvar[6003] = ["V COMPNT OF WIND AFTER G.WAVE DRAG", "", "", "", ""] -atm_stashvar[6101] = ["EASTWARD FLUX - SPECTRAL PSEUDOMOM.", "", "", "", ""] -atm_stashvar[6102] = ["SOUTHWARD FLUX - SPECTRAL PSEUDOMOM.", "", "", "", ""] -atm_stashvar[6103] = ["WESTWARD FLUX - SPECTRAL PSEUDOMOM.", "", "", "", ""] -atm_stashvar[6104] = ["NORTHWARD FLUX - SPECTRAL PSEUDOMOM.", "", "", "", ""] -atm_stashvar[6105] = ["EASTWARD FORCE FROM SPECTRAL GW", "", "", "", ""] -atm_stashvar[6106] = ["NORTHWARD FORCE FROM SPECTRAL GW", "", "", "", ""] -atm_stashvar[6111] = ["E. FLUX SPECTRAL PSEUDOMOM. P LEVS", "", "", "", ""] -atm_stashvar[6113] = ["W. FLUX SPECTRAL PSEUDOMOM. P LEVS", "", "", "", ""] -atm_stashvar[6115] = ["EAST. FORCE FROM SPECTRAL GW P LEVS", "", "", "", ""] -atm_stashvar[6181] = ["GW HEATING TEMPERATURE INC", "", "", "", ""] -atm_stashvar[6185] = ["U WIND INCR: gwd scheme", "", "", "", ""] -atm_stashvar[6186] = ["V WIND INCR: gwd scheme", "", "", "", ""] -atm_stashvar[6201] = ["X COMPONENT OF GRAVITY WAVE STRESS", "", "", "", ""] -atm_stashvar[6202] = ["Y COMPONENT OF GRAVITY WAVE STRESS", "", "", "", ""] -atm_stashvar[6203] = ["STANDARD DEVIATION OF OROGRAPHY", "", "", "", ""] -atm_stashvar[6204] = ["OROGRAPHIC GRADIENT XX COMPONENT", "", "", "", ""] -atm_stashvar[6205] = ["OROGRAPHIC GRADIENT XY COMPONENT", "", "", "", ""] -atm_stashvar[6206] = ["OROGRAPHIC GRADIENT YY COMPONENT", "", "", "", ""] -atm_stashvar[6207] = ["U-ACCEL FROM SATURATED STRESS", "", "", "", ""] -atm_stashvar[6208] = ["V-ACCEL FROM SATURATED STRESS", "", "", "", ""] -atm_stashvar[6214] = ["U in the GWD surface layer", "", "", "", ""] -atm_stashvar[6215] = ["V in the GWD surface layer", "", "", "", ""] -atm_stashvar[6216] = ["N in the GWD surface layer", "", "", "", ""] -atm_stashvar[6217] = ["GWD Froude number", "", "", "", ""] -atm_stashvar[6218] = ["GWD Blocked Layer Depth", "", "", "", ""] -atm_stashvar[6222] = ["Percent of time with blocked flow", "", "", "", ""] -atm_stashvar[6223] = ["X COMPONENT OF GW SATURATION STRESS", "", "", "", ""] -atm_stashvar[6224] = ["Y COMPONENT OF GW SATURATION STRESS", "", "", "", ""] -atm_stashvar[6227] = ["X COMPONENT OF BLOCKED FLOW STRESS", "", "", "", ""] -atm_stashvar[6228] = ["Y COMPONENT OF BLOCKED FLOW STRESS", "", "", "", ""] -atm_stashvar[6231] = ["U-ACCEL FROM BLOCKED FLOW", "", "", "", ""] -atm_stashvar[6232] = ["V-ACCEL FROM BLOCKED FLOW", "", "", "", ""] -atm_stashvar[6233] = ["% of time num limiter invoked", "", "", "", ""] -atm_stashvar[6234] = ["% redn. of block stress by limiter", "", "", "", ""] -atm_stashvar[6235] = ["X-COMPONENT OF SURFACE SSO STRESS", "", "", "", ""] -atm_stashvar[6236] = ["Y-COMPONENT OF SURFACE SSO STRESS", "", "", "", ""] -atm_stashvar[6237] = ["Froude No. scaling of surface stress", "", "", "", ""] -atm_stashvar[6241] = ["X COMPT OF GRAV. WAVE STRESS P LEVS", "", "", "", ""] -atm_stashvar[6247] = ["U-ACCEL FROM SATURATED STRESS P LEVS", "", "", "", ""] -atm_stashvar[6248] = ["OROGRAPHIC SUB-GRID SLOPE", "", "", "", ""] -atm_stashvar[6249] = ["OROGRAPHIC SUB-GRID ANISOTROPY", "", "", "", ""] -atm_stashvar[6250] = ["OROGRAPHIC SUB-GRID ORIENTATION", "", "", "", ""] -atm_stashvar[8023] = ["SNOW MASS AFTER HYDROLOGY KG/M2", "snw", "kg m-2", "surface_snow_amount", "snw_afterhydrol"] -atm_stashvar[8201] = ["LAND SNOW MELT AMOUNT KG/M2/TS", "", "", "", ""] -atm_stashvar[8202] = ["LAND SNOW MELT HEAT FLUX W/M2", "", "", "", ""] -atm_stashvar[8204] = ["SFC RUNOFF AMOUNT:LAND MEAN KG/M2/TS", "", "", "", ""] -atm_stashvar[8205] = ["SUB-SFC RUNOFF AMT:LAND MN KG/M2/TS", "", "", "", ""] -atm_stashvar[8208] = ["SOIL MOISTURE CONTENT", "", "", "", ""] -atm_stashvar[8209] = ["CANOPY WATER CONTENT", "cw", "kg m-2", "", ""] -atm_stashvar[8223] = ["SOIL MOISTURE CONTENT IN A LAYER", "mrsos", "kg m-2", "moisture_content_of_soil_layer", ""] -atm_stashvar[8225] = ["DEEP SOIL TEMP. AFTER HYDROLOGY DEGK", "tsoil", "K", "soil_temperature", ""] -atm_stashvar[8229] = ["UNFROZEN SOIL MOISTURE FRACTION", "mrlqso", "1", "mass_fraction_of_unfrozen_water_in_soil_moisture", ""] -atm_stashvar[8230] = ["FROZEN SOIL MOISTURE FRACTION", "mrfsofr", "1", "mass_fraction_of_frozen_water_in_soil_moisture", ""] -atm_stashvar[8231] = ["LAND SNOW MELT RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[8233] = ["CANOPY THROUGHFALL RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[8234] = ["SURFACE RUNOFF RATE KG/M2/S", "mrros", "kg m-2 s-1", "surface_runoff_flux", ""] -atm_stashvar[8235] = ["SUB-SURFACE RUNOFF RATE KG/M2/S", "mrrob", "kg m-2 s-1", "subsurface_runoff_flux", ""] -atm_stashvar[8236] = ["SNOW AMOUNT ON TILES KG/M2", "", "", "", ""] -atm_stashvar[8237] = ["SNOW MELT RATE ON TILES KG/M2/S", "", "", "", ""] -atm_stashvar[8238] = ["SNOW GRAIN SIZE ON TILES MICRONS", "", "", "", ""] -atm_stashvar[8239] = ["BASE FLOW AMOUNT KG/M2/S", "", "", "", ""] -atm_stashvar[8240] = ["DUNNE RUNOFF KG/M2/S", "", "", "", ""] -atm_stashvar[8241] = ["BASE FLOW FROM ZW LAYER KG/M2/S", "", "", "", ""] -atm_stashvar[8242] = ["CH4 WETLAND FLUX(FOR UKCA) UG C/M2/S", "", "", "", ""] -atm_stashvar[8243] = ["MEAN TOPOGRAPHIC INDEX", "", "", "", ""] -atm_stashvar[8244] = ["STANDARD DEVN IN TOPOGRAPHIC INDEX", "", "", "", ""] -atm_stashvar[8245] = ["INLANDBASINFLOW ATM GRID KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[8246] = ["INTEGRATED GAMMA DISTRIBUTION", "", "", "", ""] -atm_stashvar[8247] = ["SURFACE SATURATION FRACTION", "", "", "", ""] -atm_stashvar[8248] = ["SURFACE WETLAND FRACTION", "", "", "", ""] -atm_stashvar[8249] = ["MEAN WATER TABLE DEPTH M", "", "", "", ""] -atm_stashvar[8250] = ["SATURATION FRAC IN DEEP LAYER", "", "", "", ""] -atm_stashvar[8251] = ["EXP DECAY IN SOIL SAT HYD CONDUCTY", "", "", "", ""] -atm_stashvar[8252] = ["DRAINAGE OUT OF SOIL MODEL KG/M2/S", "", "", "", ""] -atm_stashvar[8258] = ["ACCUM SURFACE RUNOFF RATE KG/M2/S", "", "", "", ""] -atm_stashvar[8259] = ["ACCUM SUB-SURFACE RUNOFF RATEKG/M2/S", "", "", "", ""] -atm_stashvar[8260] = ["CH4 WETLAND FLX(CS) KG C/M2/S", "", "", "", ""] -atm_stashvar[8261] = ["CH4 WETLAND FLX(NPP) KG C/M2/S", "", "", "", ""] -atm_stashvar[8262] = ["CH4 WETLAND FLX(SOIL RESP) KG C/M2/S", "", "", "", ""] -atm_stashvar[8376] = ["SNOW DEPTH ON GROUND ON TILES (M)", "", "", "", ""] -atm_stashvar[8576] = ["TEMP OF TILED SUBSURFACE (K)", "", "", "", ""] -atm_stashvar[8577] = ["TILED HEAT FLUX TO SUBSURFACE W/M2", "", "", "", ""] -atm_stashvar[8578] = ["TILED SNOW MASS BALANCE KG/M2/S", "", "", "", ""] -atm_stashvar[8579] = ["TILED SNOW TOTAL MELT RATE KG/M2/S", "", "", "", ""] -atm_stashvar[8580] = ["TILED SNOW TOTAL REFREEZE KG/M2/S", "", "", "", ""] -atm_stashvar[8581] = ["TILED SNOW SOLIDMASS CHANGE KG/M2/S", "", "", "", ""] -atm_stashvar[8582] = ["TILED SNOW LIQUID CHANGE KG/M2/S", "", "", "", ""] -atm_stashvar[8583] = ["TILED SNOW NET RUNOFF KG/M2/S", "", "", "", ""] -atm_stashvar[8700] = ["BURNT AREA FRACTION(POTEN) S-1", "", "", "", ""] -atm_stashvar[8701] = ["C EMISS (POTEN) KG C/M2/S", "", "", "", ""] -atm_stashvar[8702] = ["DPM C EMISS (POTEN) KG C/M2/S", "", "", "", ""] -atm_stashvar[8703] = ["RPM C EMISS (POTEN) KG C/M2/S", "", "", "", ""] -atm_stashvar[8710] = ["BURNT AREA FRAC ON PFTS (POTEN) S-1", "", "", "", ""] -atm_stashvar[8711] = ["C EMISS ON PFTS (POTEN) KG C/M2/S", "", "", "", ""] -atm_stashvar[8720] = ["CO2 EMISS (POTEN) KG/M2/S", "", "", "", ""] -atm_stashvar[8721] = ["CO EMISS (POTEN) KG/M2/S", "", "", "", ""] -atm_stashvar[8722] = ["CH4 EMISS (POTEN) KG/M2/S", "", "", "", ""] -atm_stashvar[8723] = ["NOx EMISS (POTEN) KG NO/M2/S", "", "", "", ""] -atm_stashvar[8735] = ["CO2 EMISS ON PFTS (POTEN) KG/M2/S", "", "", "", ""] -atm_stashvar[8736] = ["CO EMISS ON PFTS (POTEN) KG/M2/S", "", "", "", ""] -atm_stashvar[8737] = ["CH4 EMISS ON PFTS (POTEN) KG/M2/S", "", "", "", ""] -atm_stashvar[8738] = ["NOx EMISS ON PFTS (POT) KG NO/M2/S", "", "", "", ""] -atm_stashvar[8750] = ["SO2 EMISS (POTEN) KG SO2/M2/S", "", "", "", ""] -atm_stashvar[8751] = ["BC EMISS (POTEN) KG BC/M2/S", "", "", "", ""] -atm_stashvar[8752] = ["OC EMISS (POTEN) KG OC/M2/S", "", "", "", ""] -atm_stashvar[8765] = ["SO2 EMISS ON PFTS (POT) KG SO2/M2/S", "", "", "", ""] -atm_stashvar[8766] = ["BC EMISS ON PFTS (POT) KG BC/M2/S", "", "", "", ""] -atm_stashvar[8767] = ["OC EMISS ON PFTS (POT) KG OC/M2/S", "", "", "", ""] -atm_stashvar[9004] = ["TEMPERATURE AFTER MAIN DYN CLOUD", "", "", "", ""] -atm_stashvar[9010] = ["SPEC. HUMIDITY AFTER MAIN DYN CLOUD", "", "", "", ""] -atm_stashvar[9181] = ["TEMPERATURE INC: bdy layer + ls cld", "", "", "", ""] -atm_stashvar[9182] = ["SPEC HUMIDITY INC: bdy layr + ls cld", "", "", "", ""] -atm_stashvar[9183] = ["QCL INC: bdy layer + ls cld", "", "", "", ""] -atm_stashvar[9201] = ["BULK CLOUD AMOUNT AFTER MAIN CLOUD", "", "", "", ""] -atm_stashvar[9202] = ["VERY LOW CLOUD AMOUNT", "", "", "", ""] -atm_stashvar[9203] = ["LOW CLOUD AMOUNT", "", "", "", ""] -atm_stashvar[9204] = ["MEDIUM CLOUD AMOUNT", "", "", "", ""] -atm_stashvar[9205] = ["HIGH CLOUD AMOUNT", "", "", "", ""] -atm_stashvar[9206] = ["CLOUD LIQUID WATER AFTER MAIN CLOUD", "", "", "", ""] -atm_stashvar[9207] = ["CLOUD ICE CONTENT AFTER DYNAM CLOUD", "", "", "", ""] -atm_stashvar[9208] = ["CLOUD BASE ASL COVER.GT.0.1 OCTA KFT", "", "", "", ""] -atm_stashvar[9209] = ["CLOUD BASE ASL COVER.GT.1.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9210] = ["CLOUD BASE ASL COVER.GT.2.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9211] = ["CLOUD BASE ASL COVER.GT.3.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9212] = ["CLOUD BASE ASL COVER.GT.4.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9213] = ["CLOUD BASE ASL COVER.GT.5.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9214] = ["CLOUD BASE ASL COVER.GT.6.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9215] = ["CLOUD BASE ASL COVER.GT.7.9 OCTA KFT", "", "", "", ""] -atm_stashvar[9216] = ["TOTAL CLOUD AMOUNT - RANDOM OVERLAP", "", "", "", ""] -atm_stashvar[9217] = ["TOTAL CLOUD AMOUNT MAX/RANDOM OVERLP", "clt", "1", "cloud_area_fraction", ""] -atm_stashvar[9218] = ["CLOUD FRACTION BELOW 1000 FT ASL", "", "", "", ""] -atm_stashvar[9219] = ["LOW CLOUD BASE (FT ASL)", "", "", "", ""] -atm_stashvar[9220] = ["LOW CLOUD TOP (FT ASL)", "", "", "", ""] -atm_stashvar[9221] = ["WET BULB FREEZING LEV HEIGHT (M)", "", "", "", ""] -atm_stashvar[9222] = ["WET BULB TEMPERATURE (K)", "", "", "", ""] -atm_stashvar[9223] = ["TOTAL CLOUD TOP HEIGHT (KFT)", "", "", "", ""] -atm_stashvar[9226] = ["LAYER CLOUD FREQUENCY IN EACH LAYER", "", "", "", ""] -atm_stashvar[9228] = ["CRITICAL RELATIVE HUMIDITY IN LAYERS", "", "", "", ""] -atm_stashvar[9229] = ["RELATIVE HUMIDITY AFTER MAIN CLOUD", "", "", "", ""] -atm_stashvar[9230] = ["VISIBILITY ON MODEL LEVELS M", "", "", "", ""] -atm_stashvar[9231] = ["COMBINED CLOUD AMOUNT IN EACH LAYER", "", "", "", ""] -atm_stashvar[9232] = ["CEILOMETER CLD AMT - RANDOM OVERLAP", "", "", "", ""] -atm_stashvar[9233] = ["CEILOMETER CLD AMT MAX/RANDOM OVERLP", "", "", "", ""] -atm_stashvar[9234] = ["CEILOMETER CLOUD AMT IN EACH LAYER", "", "", "", ""] -atm_stashvar[9238] = ["CLOUD TOP ASL COVER.GT.0.1 OCTA KFT", "", "", "", ""] -atm_stashvar[9239] = ["CLOUD TOP ASL COVER.GT.1.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9240] = ["CLOUD TOP ASL COVER.GT.2.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9241] = ["CLOUD TOP ASL COVER.GT.3.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9242] = ["CLOUD TOP ASL COVER.GT.4.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9243] = ["CLOUD TOP ASL COVER.GT.5.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9244] = ["CLOUD TOP ASL COVER.GT.6.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9245] = ["CLOUD TOP ASL COVER.GT.7.9 OCTA KFT", "", "", "", ""] -atm_stashvar[9310] = ["Icing Index II(RH)", "", "", "", ""] -atm_stashvar[9311] = ["Icing Index Flag II(RH)>0.1", "", "", "", ""] -atm_stashvar[9312] = ["Icing Index Flag II(RH)>0.2", "", "", "", ""] -atm_stashvar[9313] = ["Icing Index Flag II(RH)>0.3", "", "", "", ""] -atm_stashvar[9314] = ["Icing Index Flag II(RH)>0.4", "", "", "", ""] -atm_stashvar[9315] = ["Icing Index Flag II(RH)>0.5", "", "", "", ""] -atm_stashvar[9316] = ["Icing Index Flag II(RH)>0.6", "", "", "", ""] -atm_stashvar[9317] = ["Icing Index Flag II(RH)>0.7", "", "", "", ""] -atm_stashvar[9318] = ["Icing Index Flag II(RH)>0.8", "", "", "", ""] -atm_stashvar[9319] = ["Icing Index Flag II(RH)>0.9", "", "", "", ""] -atm_stashvar[9320] = ["Icing Index II(RHCldPres)", "", "", "", ""] -atm_stashvar[9321] = ["Icing Index Flag II(RHCldPres)>0.1", "", "", "", ""] -atm_stashvar[9322] = ["Icing Index Flag II(RHCldPres)>0.2", "", "", "", ""] -atm_stashvar[9323] = ["Icing Index Flag II(RHCldPres)>0.3", "", "", "", ""] -atm_stashvar[9324] = ["Icing Index Flag II(RHCldPres)>0.4", "", "", "", ""] -atm_stashvar[9325] = ["Icing Index Flag II(RHCldPres)>0.5", "", "", "", ""] -atm_stashvar[9326] = ["Icing Index Flag II(RHCldPres)>0.6", "", "", "", ""] -atm_stashvar[9327] = ["Icing Index Flag II(RHCldPres)>0.7", "", "", "", ""] -atm_stashvar[9328] = ["Icing Index Flag II(RHCldPres)>0.8", "", "", "", ""] -atm_stashvar[9329] = ["Icing Index Flag II(RHCldPres)>0.9", "", "", "", ""] -atm_stashvar[9330] = ["Icing Index II(CF)", "", "", "", ""] -atm_stashvar[9331] = ["Icing Index Flag II(CF)>0.1", "", "", "", ""] -atm_stashvar[9332] = ["Icing Index II(CF)>0.2", "", "", "", ""] -atm_stashvar[9333] = ["Icing Index Flag II(CF)>0.3", "", "", "", ""] -atm_stashvar[9334] = ["Icing Index Flag II(CF)>0.4", "", "", "", ""] -atm_stashvar[9335] = ["Icing Index Flag II(CF)>0.5", "", "", "", ""] -atm_stashvar[9336] = ["Icing Index Flag II(CF)>0.6", "", "", "", ""] -atm_stashvar[9337] = ["Icing Index Flag II(CF)>0.7", "", "", "", ""] -atm_stashvar[9338] = ["Icing Index Flag II(CF)>0.8", "", "", "", ""] -atm_stashvar[9339] = ["Icing Index Flag II(CF)>0.9", "", "", "", ""] -atm_stashvar[9340] = ["Icing Index II(LCF)", "", "", "", ""] -atm_stashvar[9341] = ["Icing Index Flag II(LCF)>0.1", "", "", "", ""] -atm_stashvar[9342] = ["Icing Index Flag II(LCF)>0.2", "", "", "", ""] -atm_stashvar[9343] = ["Icing Index Flag II(LCF)>0.3", "", "", "", ""] -atm_stashvar[9344] = ["Icing Index Flag II(LCF)>0.4", "", "", "", ""] -atm_stashvar[9345] = ["Icing Index Flag II(LCF)>0.5", "", "", "", ""] -atm_stashvar[9346] = ["Icing Index Flag II(LCF)>0.6", "", "", "", ""] -atm_stashvar[9347] = ["Icing Index Flag II(LCF)>0.7", "", "", "", ""] -atm_stashvar[9348] = ["Icing Index Flag II(LCF)>0.8", "", "", "", ""] -atm_stashvar[9349] = ["Icing Index Flag II(LCF)>0.9", "", "", "", ""] -atm_stashvar[9350] = ["Icing Index II(LWC)", "", "", "", ""] -atm_stashvar[9351] = ["Icing Index Flag II(LWC)>0.1", "", "", "", ""] -atm_stashvar[9352] = ["Icing Index Flag II(LWC)>0.2", "", "", "", ""] -atm_stashvar[9353] = ["Icing Index Flag II(LWC)>0.3", "", "", "", ""] -atm_stashvar[9354] = ["Icing Index Flag II(LWC)>0.4", "", "", "", ""] -atm_stashvar[9355] = ["Icing Index Flag II(LWC)>0.5", "", "", "", ""] -atm_stashvar[9356] = ["Icing Index Flag II(LWC)>0.6", "", "", "", ""] -atm_stashvar[9357] = ["Icing Index Flag II(LWC)>0.7", "", "", "", ""] -atm_stashvar[9358] = ["Icing Index Flag II(LWC)>0.8", "", "", "", ""] -atm_stashvar[9359] = ["Icing Index Flag II(LWC)>0.9", "", "", "", ""] -atm_stashvar[9360] = ["Icing Index II(icLWC)", "", "", "", ""] -atm_stashvar[9361] = ["Icing Index Flag II(icLWC)>0.1", "", "", "", ""] -atm_stashvar[9362] = ["Icing Index Flag II(icLWC)>0.2", "", "", "", ""] -atm_stashvar[9363] = ["Icing Index Flag II(icLWC)>0.3", "", "", "", ""] -atm_stashvar[9364] = ["Icing Index Flag II(icLWC)>0.4", "", "", "", ""] -atm_stashvar[9365] = ["Icing Index Flag II(icLWC)>0.5", "", "", "", ""] -atm_stashvar[9366] = ["Icing Index Flag II(icLWC)>0.6", "", "", "", ""] -atm_stashvar[9367] = ["Icing Index Flag II(icLWC)>0.7", "", "", "", ""] -atm_stashvar[9368] = ["Icing Index Flag II(icLWC)>0.8", "", "", "", ""] -atm_stashvar[9369] = ["Icing Index Flag II(icLWC)>0.9", "", "", "", ""] -atm_stashvar[9370] = ["Icing Index II(FROST-LN)", "", "", "", ""] -atm_stashvar[9371] = ["Icing Index Flag II(FROST-LN)>0.1", "", "", "", ""] -atm_stashvar[9372] = ["Icing Index Flag II(FROST-LN)>0.2", "", "", "", ""] -atm_stashvar[9373] = ["Icing Index Flag II(FROST-LN)>0.3", "", "", "", ""] -atm_stashvar[9374] = ["Icing Index Flag II(FROST-LN)>0.4", "", "", "", ""] -atm_stashvar[9375] = ["Icing Index Flag II(FROST-LN)>0.5", "", "", "", ""] -atm_stashvar[9376] = ["Icing Index Flag II(FROST-LN)>0.6", "", "", "", ""] -atm_stashvar[9377] = ["Icing Index Flag II(FROST-LN)>0.7", "", "", "", ""] -atm_stashvar[9378] = ["Icing Index Flag II(FROST-LN)>0.8", "", "", "", ""] -atm_stashvar[9379] = ["Icing Index Flag II(FROST-LN)>0.9", "", "", "", ""] -atm_stashvar[9380] = ["Icing Index II(FROST-Gamma)", "", "", "", ""] -atm_stashvar[9381] = ["Icing Index Flag II(FROSTGamma)>0.1", "", "", "", ""] -atm_stashvar[9382] = ["Icing Index Flag II(FROSTGamma)>0.2", "", "", "", ""] -atm_stashvar[9383] = ["Icing Index Flag II(FROSTGamma)>0.3", "", "", "", ""] -atm_stashvar[9384] = ["Icing Index Flag II(FROSTGamma)>0.4", "", "", "", ""] -atm_stashvar[9385] = ["Icing Index Flag II(FROSTGamma)>0.5", "", "", "", ""] -atm_stashvar[9386] = ["Icing Index Flag II(FROSTGamma)>0.6", "", "", "", ""] -atm_stashvar[9387] = ["Icing Index Flag II(FROSTGamma)>0.7", "", "", "", ""] -atm_stashvar[9388] = ["Icing Index Flag II(FROSTGamma)>0.8", "", "", "", ""] -atm_stashvar[9389] = ["Icing Index Flag II(FROSTGamma)>0.9", "", "", "", ""] -atm_stashvar[9391] = ["Icing Index 2d MaxRan II(RH)", "", "", "", ""] -atm_stashvar[9392] = ["Icing Index 2d MaxRan II(RHCldPres)", "", "", "", ""] -atm_stashvar[9393] = ["Icing Index 2d MaxRan II(CF)", "", "", "", ""] -atm_stashvar[9394] = ["Icing Index 2d MaxRan II(LCF)", "", "", "", ""] -atm_stashvar[9395] = ["Icing Index 2d MaxRan II(LWC)", "", "", "", ""] -atm_stashvar[9396] = ["Icing Index 2d MaxRan II(icLWC)", "", "", "", ""] -atm_stashvar[9397] = ["Icing Index 2d MaxRan II(FROST-LN)", "", "", "", ""] -atm_stashvar[9398] = ["Icing Index 2d MaxRan II(FROST-Gamma", "", "", "", ""] -atm_stashvar[10181] = ["dT SOLVER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[10185] = ["dU SOLVER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[10186] = ["dV SOLVER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[10187] = ["dW SOLVER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[12002] = ["U (MODEL LEVELS) AFTER ADVECTION", "", "", "", ""] -atm_stashvar[12003] = ["V (MODEL LEVELS) AFTER ADVECTION", "", "", "", ""] -atm_stashvar[12004] = ["TEMPERATURE AFTER ADVECTION", "", "", "", ""] -atm_stashvar[12010] = ["SPECIFIC HUMIDITY AFTER ADVECTION", "", "", "", ""] -atm_stashvar[12012] = ["QCF AFTER ADVECTION", "", "", "", ""] -atm_stashvar[12170] = ["QCL INCR: advect positive", "", "", "", ""] -atm_stashvar[12171] = ["QCL INCR: advect negative", "", "", "", ""] -atm_stashvar[12172] = ["QCF INCR: advect positive", "", "", "", ""] -atm_stashvar[12173] = ["QCF INCR: advect negative", "", "", "", ""] -atm_stashvar[12176] = ["LIQ CLOUD VOL INCR: advect positive", "", "", "", ""] -atm_stashvar[12177] = ["LIQ CLOUD VOL INCR: advect negative", "", "", "", ""] -atm_stashvar[12178] = ["FROZEN CLOUD VOL INCR:advect positiv", "", "", "", ""] -atm_stashvar[12179] = ["FROZEN CLOUD VOL INCR:advect negativ", "", "", "", ""] -atm_stashvar[12181] = ["TEMPERATURE INCR: advect K/Timestep", "", "", "", ""] -atm_stashvar[12182] = ["Q INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12183] = ["QCL INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12184] = ["QCF INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12185] = ["U WIND INCR: advection", "", "", "", ""] -atm_stashvar[12186] = ["V WIND INCR: advection", "", "", "", ""] -atm_stashvar[12187] = ["W INCR: advect m/s/timestep", "", "", "", ""] -atm_stashvar[12189] = ["RAIN INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12190] = ["GRAUPEL INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12191] = ["QCF2 INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12192] = ["BULK CLOUD VOL INCR: advect", "", "", "", ""] -atm_stashvar[12193] = ["LIQUID CLOUD VOL INCR: advect", "", "", "", ""] -atm_stashvar[12194] = ["FROZEN CLOUD VOL INCR: advect", "", "", "", ""] -atm_stashvar[12195] = ["M_V INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12196] = ["M_CL INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12197] = ["M_CF INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12198] = ["M_RAIN INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12199] = ["M_GRAUP INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12200] = ["M_CF2 INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12203] = ["dz to w departure point m", "", "", "", ""] -atm_stashvar[12204] = ["lambda w departure point radians", "", "", "", ""] -atm_stashvar[12205] = ["phi w departure point radians", "", "", "", ""] -atm_stashvar[12254] = ["QCL AFTER ADVECTION", "", "", "", ""] -atm_stashvar[12381] = ["TEMP INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12382] = ["Q INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12383] = ["QCL INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12384] = ["QCF INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12389] = ["RAIN INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12390] = ["GRAUPEL INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12391] = ["QCF2 INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12395] = ["M_V INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12396] = ["M_CL INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12397] = ["M_CF INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12398] = ["M_RAIN INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12399] = ["M_GRAUP INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12400] = ["M_CF2 INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[13181] = ["dT DIFFUSION INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13182] = ["dQ DIFFUSION INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13185] = ["dU DIFFUSION INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13186] = ["dV DIFFUSION INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13187] = ["dW DIFFUSION INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13190] = ["SMAG: VISC_M", "", "", "", ""] -atm_stashvar[13191] = ["SMAG: VISC_H", "", "", "", ""] -atm_stashvar[13192] = ["SMAG: S (SHEAR TERM)", "", "", "", ""] -atm_stashvar[13193] = ["MIXING LENGTH RNEUTML", "", "", "", ""] -atm_stashvar[13201] = ["Indicator of local q diffusion", "", "", "", ""] -atm_stashvar[13381] = ["dT FILTER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13385] = ["dU FILTER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13386] = ["dV FILTER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13387] = ["dW FILTER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13388] = ["dEXNER FILTER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13481] = ["dT FILTER INC INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13485] = ["dU FILTER INC INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13486] = ["dV FILTER INC INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13487] = ["dW FILTER INC INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[14181] = ["TEMPERATURE INCR: En cor K/Timestep", "", "", "", ""] -atm_stashvar[14201] = ["ATMOS ENERGY CORR'N IN COLUMN W/M2", "", "", "", ""] -atm_stashvar[15002] = ["U WIND ON MODEL LEVELS B GRID", "ua", "m s-1", "eastward_wind", ""] -atm_stashvar[15003] = ["V WIND ON MODEL LEVELS B GRID", "va", "m s-1", "northward_wind", ""] -atm_stashvar[15101] = ["H OF THETA MODEL LEVS FROM SEA LEVEL", "", "", "", ""] -atm_stashvar[15102] = ["H OF RHO MODEL LEVS FROM SEA LEVEL", "", "", "", ""] -atm_stashvar[15108] = ["PRESSURE ON GEOMETRIC HEIGHT LEVELS", "", "", "", ""] -atm_stashvar[15119] = ["THETA ON GEOMETRIC HEIGHT LEVELS", "", "K", "air_potential_temperature", ""] -atm_stashvar[15127] = ["RHO ON GEOMETRIC HEIGHT LEVELS", "", "", "", ""] -atm_stashvar[15142] = ["W ON GEOMETRIC HEIGHT LEVELS", "", "", "", ""] -atm_stashvar[15143] = ["U ON GEOMETRIC HEIGHT LEVELS", "", "", "", ""] -atm_stashvar[15144] = ["V ON GEOMETRIC HEIGHT LEVELS", "", "", "", ""] -atm_stashvar[15181] = ["dT INC FROM QT_BAL_CLD", "", "", "", ""] -atm_stashvar[15182] = ["DQ INC FROM QT_BAL_CLD", "", "", "", ""] -atm_stashvar[15183] = ["DQCL INC FROM QT_BAL_CLD", "", "", "", ""] -atm_stashvar[15201] = ["U WIND ON PRESSURE LEVELS B GRID", "ua", "m s-1", "eastward_wind", ""] -atm_stashvar[15202] = ["V WIND ON PRESSURE LEVELS B GRID", "va", "m s-1", "northward_wind", ""] -atm_stashvar[15212] = ["50 METRE WIND U-COMPONENT B GRID", "", "", "", ""] -atm_stashvar[15213] = ["50 METRE WIND V-COMPONENT B GRID", "", "", "", ""] -atm_stashvar[15214] = ["ERTEL POTENTIAL VORTICITY THETA SURF", "", "", "", ""] -atm_stashvar[15215] = ["THETA ON PV=+/-2 SURFACE", "", "K", "air_potential_temperature", ""] -atm_stashvar[15216] = ["THETA AT PV POINTS", "", "K", "air_potential_temperature", ""] -atm_stashvar[15217] = ["PV ON MODEL LEVELS(CALC PV)", "", "", "", ""] -atm_stashvar[15218] = ["PV on model theta levels", "", "", "", ""] -atm_stashvar[15229] = ["POTENTIAL VORTICITY ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[15231] = ["TEST FIELD ON V-GRID-SINGLE LEVEL", "", "", "", ""] -atm_stashvar[15232] = ["TEST FIELD ON P GRID-SINGLE LEVEL", "", "", "", ""] -atm_stashvar[15233] = ["TEST FIELD ON P GRID-PRESS LEVELS", "", "", "", ""] -atm_stashvar[15234] = ["TEST FIELD ON P GRID-MODEL LEVELS", "", "", "", ""] -atm_stashvar[15242] = ["W COMPNT (OF WIND) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[15243] = ["U WIND ON PRESSURE LEVELS", "ua", "m s-1", "eastward_wind", ""] -atm_stashvar[15244] = ["V WIND ON PRESSURE LEVELS", "va", "m s-1", "northward_wind", ""] -atm_stashvar[15245] = ["50 METRE WIND U-COMPONENT", "", "", "", ""] -atm_stashvar[15246] = ["50 METRE WIND V-COMPONENT", "", "", "", ""] -atm_stashvar[15260] = ["Rho*w on rho levels", "", "", "", ""] -atm_stashvar[15261] = ["Rho*u*w on rho levels", "", "", "", ""] -atm_stashvar[15262] = ["Rho*v*w on rho levels", "", "", "", ""] -atm_stashvar[15263] = ["Rho*w with w > 0m/s on rho levels", "", "", "", ""] -atm_stashvar[15264] = ["Rho*w with w < 0m/s on rho levels", "", "", "", ""] -atm_stashvar[15265] = ["Rho*w with w > 1m/s on rho levels", "", "", "", ""] -atm_stashvar[15266] = ["Rho*w with w < -1m/s on rho levels", "", "", "", ""] -atm_stashvar[15270] = ["SQU OF NORM OF FOURIER TRANS OF W", "", "", "", ""] -atm_stashvar[15271] = ["True unscaled density", "", "", "", ""] -atm_stashvar[16004] = ["TEMPERATURE ON THETA LEVELS", "ta", "K", "air_temperature", ""] -atm_stashvar[16140] = ["QCL INCR: pc2 init positive", "", "", "", ""] -atm_stashvar[16141] = ["QCL INCR: pc2 init negative", "", "", "", ""] -atm_stashvar[16142] = ["QCF INCR: pc2 init positive", "", "", "", ""] -atm_stashvar[16143] = ["QCF INCR: pc2 init negative", "", "", "", ""] -atm_stashvar[16146] = ["LIQ CLOUD VOL INCR: pc2 init positiv", "", "", "", ""] -atm_stashvar[16147] = ["LIQ CLOUD VOL INCR: pc2 init negativ", "", "", "", ""] -atm_stashvar[16148] = ["ICE CLOUD VOL INCR: pc2 init positiv", "", "", "", ""] -atm_stashvar[16149] = ["ICE CLOUD VOL INCR: pc2 init negativ", "", "", "", ""] -atm_stashvar[16150] = ["QCL INCR: pc2 pressure change positi", "", "", "", ""] -atm_stashvar[16151] = ["QCL INCR: pc2 pressure change negati", "", "", "", ""] -atm_stashvar[16156] = ["LIQ CLOUD VOL INCR: pc2 press positi", "", "", "", ""] -atm_stashvar[16157] = ["LIQ CLOUD VOL INCR: pc2 press negati", "", "", "", ""] -atm_stashvar[16161] = ["TEMPERATURE INCR: pc2 initialisation", "", "", "", ""] -atm_stashvar[16162] = ["SPECIFIC HUMIDITY INCR: pc2 initiali", "", "", "", ""] -atm_stashvar[16163] = ["QCL INCR: pc2 initialisation", "", "", "", ""] -atm_stashvar[16164] = ["QCF INCR: pc2 initialisation", "", "", "", ""] -atm_stashvar[16172] = ["BULK CLOUD VOL INCR: pc2 initialisat", "", "", "", ""] -atm_stashvar[16173] = ["LIQ CLOUD VOL INCR: pc2 init", "", "", "", ""] -atm_stashvar[16174] = ["ICE CLOUD VOL INCR: pc2 initialise", "", "", "", ""] -atm_stashvar[16181] = ["TEMPERATURE INCR: pc2 pres change", "", "", "", ""] -atm_stashvar[16182] = ["SPECIFIC HUMIDITY INCR: pc2 pressure", "", "", "", ""] -atm_stashvar[16183] = ["QCL INCR: pc2 pressure change", "", "", "", ""] -atm_stashvar[16184] = ["QCF INCR: from pc2 pressure change", "", "", "", ""] -atm_stashvar[16192] = ["BULK CLOUD VOL INCR: pc2 pres change", "", "", "", ""] -atm_stashvar[16193] = ["LIQ CLOUD VOL INCR: pc2 pressure cha", "", "", "", ""] -atm_stashvar[16194] = ["FROZEN CLOUD VOL INCR: pc2 pressure", "", "", "", ""] -atm_stashvar[16201] = ["GEOPOTENTIAL HEIGHT ON THETA LEVELS", "zg", "m", "geopotential_height", ""] -atm_stashvar[16202] = ["GEOPOTENTIAL HEIGHT ON P LEV/P GRID", "zg", "m", "geopotential_height", ""] -atm_stashvar[16203] = ["TEMPERATURE ON P LEV/P GRID", "ta", "K", "air_temperature", ""] -atm_stashvar[16204] = ["RH WRT ICE ON P LEV/P GRID", "hur", "%", "relative_humidity", ""] -atm_stashvar[16205] = ["WET BULB POTENTIAL TEMPERATURE K", "", "", "", ""] -atm_stashvar[16206] = ["CLOUD WATER CONTENT (qc)", "", "", "", ""] -atm_stashvar[16207] = ["TOTAL SPECIFIC HUMIDITY (qT)", "", "", "", ""] -atm_stashvar[16222] = ["PRESSURE AT MEAN SEA LEVEL", "psl", "Pa", "air_pressure_at_sea_level", ""] -atm_stashvar[16255] = ["GEOPOTENTIAL HEIGHT ON RHO LEVELS", "zg", "m", "geopotential_height", ""] -atm_stashvar[16256] = ["RH WRT WATER ON P LEV/P GRID", "hur", "%", "relative_humidity", ""] -atm_stashvar[17203] = ["MSA MASS MIXING RATIO FLUX KG/KG/S", "", "", "", ""] -atm_stashvar[17204] = ["NH3 DEPLETION KG/KG AFTER TSTEP", "", "", "", ""] -atm_stashvar[17205] = ["DIMETHYL SULPHIDE EMISSIONS", "", "", "", ""] -atm_stashvar[17206] = ["DMS DRY OXIDATION MMR FLUX KG/KG/S", "", "", "", ""] -atm_stashvar[17207] = ["DMS DRY OXIDATION TO SO2 KG/KG/S", "", "", "", ""] -atm_stashvar[17208] = ["DMS DRY OXIDATION TO SO4 ACC KG/KG/S", "", "", "", ""] -atm_stashvar[17209] = ["DMS DRY OXIDATION TO SO4 AIT KG/KG/S", "", "", "", ""] -atm_stashvar[17210] = ["SO2 DRY OXID BY OH MMR FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17211] = ["SO2 WET OXID BY H2O2 FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17212] = ["SO2 WET OXID BY O3 FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17213] = ["SO4 DIS TO ACC BY EVAP FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17214] = ["SO4 ACC TO DIS BY NUCL FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17215] = ["SO4 AIT TO DIS BY DIFF FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17216] = ["SO4 AIT TO ACC BY COAG FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17217] = ["SO2 DRY OXID TO SO4 ACC FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17218] = ["SO2 DRY OXID TO SO4 AIT FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17219] = ["SO4 AIT-ACC BY MODE MERGING kg/kg/s", "", "", "", ""] -atm_stashvar[17220] = ["PM10 CONCENTRATION", "", "", "", ""] -atm_stashvar[17221] = ["PM2.5 CONCENTRATION", "", "", "", ""] -atm_stashvar[17222] = ["SULPHATE CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17223] = ["SULPHATE CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17224] = ["BLACK CARBON CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17225] = ["BLACK CARBON CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17226] = ["BIOM BURNING CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17227] = ["BIOM BURNING CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17228] = ["OCFF CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17229] = ["OCFF CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17230] = ["SOA CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17231] = ["SOA CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17232] = ["SEA SALT CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17233] = ["SEA SALT CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17234] = ["DUST CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17235] = ["DUST CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17236] = ["NITRATE CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17237] = ["NITRATE CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17240] = ["NH3 OXID BY HNO3 MMR FLX KG[N]/KG/S", "", "", "", ""] -atm_stashvar[17241] = ["NIT ACC TO DIS BY NUC FLX KG[N]/KG/S", "", "", "", ""] -atm_stashvar[17242] = ["NIT DIS-ACC BY EVAP FLX KG[N]/KG/S", "", "", "", ""] -atm_stashvar[17257] = ["TOTAL DUST CONC (microg/m3)", "", "", "", ""] -atm_stashvar[19001] = ["VEGETATION CARBON ON PFTS KG C/M2", "", "", "", ""] -atm_stashvar[19002] = ["GRIDBOX MEAN VEG CARBON KG C/M2", "", "", "", ""] -atm_stashvar[19003] = ["PHENOLOGICAL LEAF TURNOVER RATE PFTS", "", "", "", ""] -atm_stashvar[19004] = ["LITTER CARBON ON PFTS KG C/M2/YEAR", "", "", "", ""] -atm_stashvar[19005] = ["GRIDBOX MEAN LITTER CARBN KGC/M2/YR", "", "", "", ""] -atm_stashvar[19006] = ["MEAN LEAF TRNVR RATE PFTS FOR PHENOL", "", "", "", ""] -atm_stashvar[19007] = ["LEAF AREA INDEX PFTS AFTER PHENOLOGY", "", "", "", ""] -atm_stashvar[19008] = ["MN LEAF TRNVR RATE PFTS FOR TRIFFID", "", "", "", ""] -atm_stashvar[19009] = ["MEAN NPP ON PFTS FOR TRIFFID", "", "", "", ""] -atm_stashvar[19010] = ["MEAN WOOD RESP ON PFTS FOR TRIFFID", "", "", "", ""] -atm_stashvar[19011] = ["MEAN SOIL RESPIRATION FOR TRIFFID", "", "", "", ""] -atm_stashvar[19012] = ["DISTURBED FRACTION OF VEGETATION", "", "", "", ""] -atm_stashvar[19013] = ["SURFACE TYPE FRACTIONS AFTER TRIFFID", "", "", "", ""] -atm_stashvar[19014] = ["LEAF AREA INDEX PFTS AFTER TRIFFID", "", "", "", ""] -atm_stashvar[19015] = ["CANOPY HEIGHT ON PFTS AFTER TRIFFID", "", "", "", ""] -atm_stashvar[19016] = ["SOIL CARBON CONTENT AFTER TRIFFID", "", "", "", ""] -atm_stashvar[19017] = ["DPM SOIL RESP FOR TRIFFID KG C/M2/S", "", "", "", ""] -atm_stashvar[19018] = ["RPM SOIL RESP FOR TRIFFID KG C/M2/S", "", "", "", ""] -atm_stashvar[19019] = ["BIO SOIL RESP FOR TRIFFID KG C/M2/S", "", "", "", ""] -atm_stashvar[19020] = ["HUM SOIL RESP FOR TRIFFID KG C/M2/S", "", "", "", ""] -atm_stashvar[19021] = ["DPM SOIL-C AFTER TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19022] = ["RPM SOIL-C AFTER TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19023] = ["BIO SOIL-C AFTER TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19024] = ["HUM SOIL-C AFTER TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19025] = ["LEAF CARBON ON PFTS KGC/M2", "", "", "", ""] -atm_stashvar[19026] = ["GRIDBOX MEAN LEAF CARBON KGC/M2", "", "", "", ""] -atm_stashvar[19027] = ["WOOD CARBON ON PFTS KGC/M2", "", "", "", ""] -atm_stashvar[19028] = ["GRIDBOX MEAN WOOD CARBON KGC/M2", "", "", "", ""] -atm_stashvar[19029] = ["ROOT CARBON ON PFTS KGC/M2", "", "", "", ""] -atm_stashvar[19030] = ["GRIDBOX MEAN ROOT CARBON KGC/M2", "", "", "", ""] -atm_stashvar[19031] = ["PREVIOUS DIST FRAC OF VEGETATION", "", "", "", ""] -atm_stashvar[19032] = ["FAST TURNOVER WOOD PRODUCT KGC/M2", "", "", "", ""] -atm_stashvar[19033] = ["MEDIUM TURNOVER WOOD PRODUCT KGC/M2", "", "", "", ""] -atm_stashvar[19034] = ["SLOW TURNOVER WOOD PRODUCT KGC/M2", "", "", "", ""] -atm_stashvar[19036] = ["LU C FLUX TO FAST POOL KGC/M2/YR", "", "", "", ""] -atm_stashvar[19037] = ["LU C FLUX TO MEDIUM POOL KGC/M2/YR", "", "", "", ""] -atm_stashvar[19038] = ["LU C FLUX TO SLOW POOL KGC/M2/YR", "", "", "", ""] -atm_stashvar[19039] = ["FAST POOL DECOMP C FLUX KGC/M2/YR", "", "", "", ""] -atm_stashvar[19040] = ["MEDIUM POOL DECOMP C FLUX KGC/M2/YR", "", "", "", ""] -atm_stashvar[19041] = ["SLOW POOL DECOMP C FLUX KGC/M2/YR", "", "", "", ""] -atm_stashvar[19042] = ["LANDUSE CO2 FLUX TO ATM KGC/M2/YR", "", "", "", ""] -atm_stashvar[19043] = ["HARVEST C ON PFTS KGC/M2/360d", "", "", "", ""] -atm_stashvar[19044] = ["HARVEST C (GBM) KGC/M2/360d", "", "", "", ""] -atm_stashvar[19045] = ["LANDUSE C TO SOIL ON PFTS KG/M2/YR", "", "", "", ""] -atm_stashvar[19046] = ["LANDUSE C TO SOIL (GBM) KGC/M2/YR", "", "", "", ""] -atm_stashvar[19047] = ["TRIFFID CO2 FLUX TO ATMOS KGC/M2/YR", "", "", "", ""] -atm_stashvar[19048] = ["CARBON ERROR IN VEG2 KGC/M2", "", "", "", ""] -atm_stashvar[19049] = ["CARBON ERROR IN TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19050] = ["VEG CARBON ERROR IN TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19051] = ["SOIL CARBON ERROR IN TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19052] = ["WP CARBON ERROR IN TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19053] = ["SOIL TO ATMOS RESP FLUX KGC/M2/YR", "", "", "", ""] -atm_stashvar[19054] = ["FRAC. OF TOTAL LITTER GOING TO DPM", "", "", "", ""] -atm_stashvar[19101] = ["NPP ON PFTS POST N-LIMIT KGC/M2/YR", "", "", "", ""] -atm_stashvar[19102] = ["NPP POST N-LIMIT (GBM) KGC/M2/YR", "", "", "", ""] -atm_stashvar[19103] = ["EXUDATES ON PFTS KGC/M2/YR", "", "", "", ""] -atm_stashvar[19104] = ["GRIDBOX MEAN EXUDATES KGC/M2/YR", "", "", "", ""] -atm_stashvar[19111] = ["NITROGEN DEPOSITION KGN/M2/YR", "", "", "", ""] -atm_stashvar[19112] = ["NITROGEN FIXATION PFTS KGC/M2/YR", "", "", "", ""] -atm_stashvar[19113] = ["NITROGEN FIXATION (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19114] = ["NITROGEN LEACHING (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19115] = ["MINERALISED NIT. GAS LOSS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19116] = ["INORG NITROGEN LOSS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19117] = ["NITROGEN ATM GAS LOSS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19118] = ["NITROGEN TOTAL LOSS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19119] = ["HARVEST N ON PFTS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19120] = ["HARVEST N (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19121] = ["NITROGEN LUC ON PFTS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19122] = ["NITROGEN LUC (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19123] = ["NITROGEN LITTER ON PFTS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19124] = ["NITROGEN LITTER (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19125] = ["N FERTILISER ON PFTS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19126] = ["N FERTILISER (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19127] = ["LANDUSE N TO SOIL ON PFTS KG/M2/YR", "", "", "", ""] -atm_stashvar[19128] = ["LANDUSE N TO SOIL (GBM) KGC/M2/YR", "", "", "", ""] -atm_stashvar[19131] = ["NITROGEN STEM/WOOD KGN/M2", "", "", "", ""] -atm_stashvar[19132] = ["NITROGEN LEAF KGN/M2", "", "", "", ""] -atm_stashvar[19133] = ["NITROGEN ROOT KGN/M2", "", "", "", ""] -atm_stashvar[19134] = ["NITROGEN LEAF LABILE KGN/M2", "", "", "", ""] -atm_stashvar[19135] = ["NITROGEN LEAF ALLOCATED KGN/M2", "", "", "", ""] -atm_stashvar[19136] = ["NITROGEN VEG KGN/M2", "", "", "", ""] -atm_stashvar[19137] = ["NITROGEN VEG (GBM) KGN/M2", "", "", "", ""] -atm_stashvar[19141] = ["NITROGEN SOIL RPM KGN/M2", "", "", "", ""] -atm_stashvar[19142] = ["NITROGEN SOIL DPM KGN/M2", "", "", "", ""] -atm_stashvar[19143] = ["NITROGEN SOIL BIO KGN/M2", "", "", "", ""] -atm_stashvar[19144] = ["NITROGEN SOIL HUM KGN/M2", "", "", "", ""] -atm_stashvar[19145] = ["NITROGEN SOIL TOTAL KGN/M2", "", "", "", ""] -atm_stashvar[19146] = ["INORGANIC NITROGEN KGN/M2", "", "", "", ""] -atm_stashvar[19147] = ["NITROGEN TOTAL ECOSYSTEM KGN/M2", "", "", "", ""] -atm_stashvar[19152] = ["N DEMAND GROWTH KGN/M2/YR", "", "", "", ""] -atm_stashvar[19153] = ["N DEMAND SPREAD KGN/M2/YR", "", "", "", ""] -atm_stashvar[19154] = ["N DEMAND TOTAL KGN/M2/YR", "", "", "", ""] -atm_stashvar[19155] = ["N DEMAND TOTAL (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19156] = ["N UPTAKE TURNOVER KGN/M2/YR", "", "", "", ""] -atm_stashvar[19157] = ["N UPTAKE GROWTH KGN/M2/YR", "", "", "", ""] -atm_stashvar[19158] = ["N UPTAKE SPREAD KGN/M2/YR", "", "", "", ""] -atm_stashvar[19159] = ["N UPTAKE TOTAL KGN/M2/YR", "", "", "", ""] -atm_stashvar[19160] = ["N UPTAKE TOTAL (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19161] = ["N SOIL DECOMPOSITION RATE MODIFIER", "", "", "", ""] -atm_stashvar[19162] = ["N IMMOBILIS POTEN DPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19163] = ["N IMMOBILIS POTEN RPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19164] = ["N IMMOBILIS POTEN BIO KGN/M2/YR", "", "", "", ""] -atm_stashvar[19165] = ["N IMMOBILIS POTEN HUM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19166] = ["N IMMOBILIS POTEN TOT KGN/M2/YR", "", "", "", ""] -atm_stashvar[19167] = ["N IMMOBILIS DPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19168] = ["N IMMOBILIS RPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19169] = ["N IMMOBILIS BIO KGN/M2/YR", "", "", "", ""] -atm_stashvar[19170] = ["N IMMOBILIS HUM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19171] = ["N IMMOBILIS TOT KGN/M2/YR", "", "", "", ""] -atm_stashvar[19172] = ["N MINERALIS POTEN DPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19173] = ["N MINERALIS POTEN RPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19174] = ["N MINERALIS POTEN BIO KGN/M2/YR", "", "", "", ""] -atm_stashvar[19175] = ["N MINERALIS POTEN HUM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19176] = ["N MINERALIS POTEN TOT KGN/M2/YR", "", "", "", ""] -atm_stashvar[19177] = ["N MINERALIS DPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19178] = ["N MINERALIS RPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19179] = ["N MINERALIS BIO KGN/M2/YR", "", "", "", ""] -atm_stashvar[19180] = ["N MINERALIS HUM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19181] = ["N MINERALIS TOT KGN/M2/YR", "", "", "", ""] -atm_stashvar[19182] = ["GPP ON PFTS (KGC/M2/YR)", "", "", "", ""] -atm_stashvar[19183] = ["GPP GRIDBOX MEAN (KGC/M2/YR)", "", "", "", ""] -atm_stashvar[19184] = ["PLANT RESP AFT N LIM PFTS KGC/M2/YR", "", "", "", ""] -atm_stashvar[19185] = ["PLANT RESP AFT N LIM GBM KGC/M2/YR", "", "", "", ""] -atm_stashvar[19186] = ["VEG NITROGEN ERROR IN TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19187] = ["SOIL NITROGEN ERROR TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19188] = ["INORG NITROGEN ERROR TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19189] = ["NITROGEN ERROR IN TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[20001] = ["THICKNESS : 1000-500 MB", "", "", "", ""] -atm_stashvar[20002] = ["THICKNESS : 1000-850 MB", "", "", "", ""] -atm_stashvar[20003] = ["WIND SPEEDS : 10 METRES B GRID", "", "", "", ""] -atm_stashvar[20004] = ["WIND SPEEDS : PRESSURE LEVEL", "", "", "", ""] -atm_stashvar[20005] = ["DIVERGENCE", "", "", "", ""] -atm_stashvar[20006] = ["RELATIVE VORTICITY", "", "", "", ""] -atm_stashvar[20007] = ["MOUNTAIN WAVE TURBULENCE PREDICTOR", "", "", "", ""] -atm_stashvar[20012] = ["CONVECTIVE CLOUD DEPTHS (kft)", "", "", "", ""] -atm_stashvar[20013] = ["TOTAL PRECIP ACCUMULATION : 6 HOURS", "", "", "", ""] -atm_stashvar[20014] = ["PRECIPITATION SYMBOL", "", "", "", ""] -atm_stashvar[20015] = ["PRESENT WEATHER CODE", "", "", "", ""] -atm_stashvar[20016] = ["CAT PREDICTOR", "", "", "", ""] -atm_stashvar[20017] = ["MAX CAT", "", "", "", ""] -atm_stashvar[20018] = ["MAX CAT PRESSURE", "", "", "", ""] -atm_stashvar[20020] = ["MAX WIND U-COMPONENT", "", "", "", ""] -atm_stashvar[20021] = ["MAX WIND V-COMPONENT", "", "", "", ""] -atm_stashvar[20022] = ["MAX WIND PRESSURE", "", "", "", ""] -atm_stashvar[20023] = ["MAX WIND ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20024] = ["TROPOPAUSE PRESSURE", "", "", "", ""] -atm_stashvar[20025] = ["TROPOPAUSE TEMPERATURE", "", "", "", ""] -atm_stashvar[20026] = ["TROPOPAUSE HEIGHT", "", "", "", ""] -atm_stashvar[20027] = ["TROPOPAUSE ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20028] = ["SNOW PROBABILITY", "", "", "", ""] -atm_stashvar[20029] = ["CONTRAIL - LOWER LIMIT", "", "", "", ""] -atm_stashvar[20030] = ["CONTRAIL - UPPER LIMIT", "", "", "", ""] -atm_stashvar[20031] = ["THERMAL ADVECTION", "", "", "", ""] -atm_stashvar[20032] = ["MEAN THERMAL ADVECTION", "", "", "", ""] -atm_stashvar[20033] = ["FREEZING LEVEL GEOPOTENTIAL HEIGHT", "", "", "", ""] -atm_stashvar[20034] = ["FREEZING LEVEL PRESSURE", "", "", "", ""] -atm_stashvar[20035] = ["FREEZING LEVEL ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20036] = ["-20C ISOTHERM GEOPOTENTIAL HEIGHT", "", "", "", ""] -atm_stashvar[20037] = ["-20C ISOTHERM PRESSURE", "", "", "", ""] -atm_stashvar[20038] = ["-20C ISOTHERM ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20039] = ["CONV CLOUD BASE ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20040] = ["CONV CLOUD TOP ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20041] = ["MAXIMUM WIND BASE - ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20042] = ["MAXIMUM WIND TOP - ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20043] = ["WAFC ICING POTENTIAL", "", "", "", ""] -atm_stashvar[20044] = ["WAFC ICING POTENTIAL (retired)", "", "", "", ""] -atm_stashvar[20045] = ["WAFC IN-CLOUD TURB POTENTIAL", "", "", "", ""] -atm_stashvar[20046] = ["WAFC IN-CLOUD TURB POTENTIAL (ret)", "", "", "", ""] -atm_stashvar[20047] = ["WAFC CAT POTENTIAL", "", "", "", ""] -atm_stashvar[20048] = ["WAFC CAT POTENTIAL (retired)", "", "", "", ""] -atm_stashvar[20049] = ["WAFC CB HORIZONTAL EXTENT", "", "", "", ""] -atm_stashvar[20050] = ["WAFC PRESSURE AT CB BASE", "", "", "", ""] -atm_stashvar[20051] = ["WAFC PRESSURE AT CB TOP", "", "", "", ""] -atm_stashvar[20052] = ["WAFC PRESSURE AT EMBD CB BASE", "", "", "", ""] -atm_stashvar[20053] = ["WAFC PRESSURE AT EMBD CB TOP", "", "", "", ""] -atm_stashvar[20054] = ["WAFC ICAO HEIGHT AT CB BASE", "", "", "", ""] -atm_stashvar[20055] = ["WAFC ICAO HEIGHT AT CB TOP", "", "", "", ""] -atm_stashvar[20056] = ["WAFC ICAO HGHT EMBD CB BASE", "", "", "", ""] -atm_stashvar[20057] = ["WAFC ICAO HGHT EMBD CB TOP", "", "", "", ""] -atm_stashvar[20058] = ["SURFACE DUST CONCENTRATION (g/m3)", "", "", "", ""] -atm_stashvar[20059] = ["2000-5000FT DUST CONCENTRATION(g/m3)", "", "", "", ""] -atm_stashvar[20060] = ["ZENITH TOTAL DELAY", "", "", "", ""] -atm_stashvar[20061] = ["-70C ISOTHERM GEOPOTENTIAL HEIGHT", "", "", "", ""] -atm_stashvar[20062] = ["-70C ISOTHERM PRESSURE", "", "", "", ""] -atm_stashvar[20063] = ["-70C ISOTHERM ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20064] = ["TROPOPAUSE PRESSURE", "", "", "", ""] -atm_stashvar[20065] = ["TROPOPAUSE TEMPERATURE", "", "", "", ""] -atm_stashvar[20066] = ["TROPOPAUSE HEIGHT", "", "", "", ""] -atm_stashvar[20067] = ["TROPOPAUSE ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20068] = ["THINNED LS RAINFALL RATE KG/M2/S", "", "", "", ""] -atm_stashvar[20069] = ["THINNED TOTAL PRECIP RATE KG/M2/S", "", "", "", ""] -atm_stashvar[20070] = ["VIS AT 1.5M (incl ppn and dust) M", "", "", "", ""] -atm_stashvar[20071] = ["VIS IN DUST ONLY AT 1.5M M", "", "", "", ""] -atm_stashvar[20072] = ["CONVECTIVE PRECIP RATE: kg/m2/s", "", "", "", ""] -atm_stashvar[20073] = ["EXTENDED CONV PRECIP RATE: kg/m2/s", "", "", "", ""] -atm_stashvar[20074] = ["COLSON-PANOFSKY TURB INDEX m2/s2", "", "", "", ""] -atm_stashvar[20075] = ["ELLRODS TI1 TURBULENCE INDEX s-2", "", "", "", ""] -atm_stashvar[20076] = ["INVERSE RICHARDSON NUMBER (-)", "", "", "", ""] -atm_stashvar[20077] = ["WAFC CAT POT. (Turp et al) (StaGE)", "", "", "", ""] -atm_stashvar[20080] = ["UPDRAFT HELICITY 2000-5000m M2/S2", "", "", "", ""] -atm_stashvar[20084] = ["TROPOPAUSE PRESSURE", "", "", "", ""] -atm_stashvar[20085] = ["TROPOPAUSE TEMPERATURE", "", "", "", ""] -atm_stashvar[20086] = ["TROPOPAUSE HEIGHT", "", "", "", ""] -atm_stashvar[20087] = ["TROPOPAUSE ICAO HEIGHT", "", "", "", ""] -atm_stashvar[21100] = ["FLASH RATE S-1", "", "", "", ""] -atm_stashvar[21101] = ["STORM LOCATION FLAG", "", "", "", ""] -atm_stashvar[21102] = ["GRAUPEL WATER PATH IN ELEC KG M-2", "", "", "", ""] -atm_stashvar[21103] = ["TOTAL ICE WATER PATH IN ELEC KG M-2", "", "", "", ""] -atm_stashvar[21104] = ["NUMBER OF LIGHTNING FLASHES", "", "", "", ""] -atm_stashvar[21105] = ["FLASH RATE: GRAUP. FLX (MCCAUL) S-1", "", "", "", ""] -atm_stashvar[21106] = ["FLASH RATE: TOTAL ICE (MCCAUL) S-1", "", "", "", ""] -atm_stashvar[26001] = ["RIVER WATER STORAGE KG", "", "", "", ""] -atm_stashvar[26002] = ["GRIDBOX OUTFLOW KG/S", "", "kg s-1", "", ""] -atm_stashvar[26003] = ["GRIDBOX INFLOW KG/S", "", "kg s-1", "", ""] -atm_stashvar[26004] = ["RIVER OUTFLOW KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[26006] = ["INLANDBASINFLOW TRIP GRID KG/S", "", "kg s", "", ""] -atm_stashvar[30001] = ["U COMPNT OF WIND RHO GRID", "ua", "m s-1", "eastward_wind", ""] -atm_stashvar[30002] = ["V COMPNT OF WIND RHO GRID", "va", "m s-1", "northward_wind", ""] -atm_stashvar[30003] = ["W COMPNT OF WIND RHO GRID", "", "", "", ""] -atm_stashvar[30004] = ["TEMPERATURE RHO GRID", "ta", "K", "air_temperature", ""] -atm_stashvar[30005] = ["SPECIFIC HUMIDITY RHO GRID", "hus", "1", "specific_humidity", ""] -atm_stashvar[30006] = ["height model levels RHO GRID M", "", "", "", ""] -atm_stashvar[30007] = ["KE model levels RHO GRID m2/s2", "", "", "", ""] -atm_stashvar[30008] = ["OMEGA ON THETA LEVELS (C GRID)", "", "", "", ""] -atm_stashvar[30011] = ["U*U*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30012] = ["U*V*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30013] = ["U*W*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30014] = ["U*T*rho_dry*dr X1.E-5 kgK/ms", "", "", "", ""] -atm_stashvar[30015] = ["U*Q*rho_dry*dr X1.E-5 kg/ms", "", "", "", ""] -atm_stashvar[30016] = ["U*Z*rho_dry*dr X1.E-5 kg/s", "", "", "", ""] -atm_stashvar[30017] = ["U*KE*rho_dry*dr X1.E-5 kgm/s3", "", "", "", ""] -atm_stashvar[30022] = ["V*V*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30023] = ["V*W*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30024] = ["V*T*rho_dry*dr X1.E-5 kgK/ms", "", "", "", ""] -atm_stashvar[30025] = ["V*Q *rho_dry*dr X1.E-5 kg/ms", "", "", "", ""] -atm_stashvar[30026] = ["V*Z*rho_dry*dr X1.E-5 kg/s", "", "", "", ""] -atm_stashvar[30027] = ["V*KE*rho_dry*dr X1.E-5 kgm/s3", "", "", "", ""] -atm_stashvar[30033] = ["W*W*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30034] = ["W*T*rho_dry*dr X1.E-5 kgK/ms", "", "", "", ""] -atm_stashvar[30035] = ["W*Q *rho_dry*dr X1.E-5 kg/ms", "", "", "", ""] -atm_stashvar[30036] = ["W*Z*rho_dry*dr X1.E-5 kg/s", "", "", "", ""] -atm_stashvar[30037] = ["W*KE*rho_dry*dr X1.E-5 kgm/s3", "", "", "", ""] -atm_stashvar[30044] = ["T*T*rho_dry*dr X1.E-5 kgK2/m2", "", "", "", ""] -atm_stashvar[30045] = ["T*Q*rho_dry*dr X1.E-5 kgK/m2", "", "", "", ""] -atm_stashvar[30046] = ["TZ*rho_dry*dr X1.E-5 kgK/m", "", "", "", ""] -atm_stashvar[30047] = ["T*KE*rho_dry*dr X1.E-5 kgK/s2", "", "", "", ""] -atm_stashvar[30055] = ["QQ*rho_dry*dr X1.E-5 kg/m2", "", "", "", ""] -atm_stashvar[30056] = ["Q*Z*rho_dry*dr X1.E-5 kg", "", "", "", ""] -atm_stashvar[30057] = ["Q*KE*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30066] = ["Z*Z*rho_dry*dr X1.E-5 kg", "", "", "", ""] -atm_stashvar[30067] = ["Z*KE*rho_dry*dr X1.E-5 kg/ms2", "", "", "", ""] -atm_stashvar[30077] = ["KE*KE*rho_dry*dr X1.E-5 kg/m4s4", "", "", "", ""] -atm_stashvar[30078] = ["ZOM RHO GRID X1.E-16", "", "", "", ""] -atm_stashvar[30101] = ["U MASS WEIGHTED RHO GRID kgm/s", "", "", "", ""] -atm_stashvar[30102] = ["V MASS WEIGHTED RHO GRID kg/ms", "", "", "", ""] -atm_stashvar[30103] = ["W MASS WEIGHTED RHO GRID kg/ms", "", "", "", ""] -atm_stashvar[30104] = ["T MASS WEIGHTED RHO GRID kgK/m2", "", "", "", ""] -atm_stashvar[30105] = ["Q MASS WEIGHTED RHO GRID kg/m2", "", "", "", ""] -atm_stashvar[30106] = ["height mass weighted kg/m", "", "", "", ""] -atm_stashvar[30107] = ["KE mass weighted RHO GRID kg/s2", "", "", "", ""] -atm_stashvar[30111] = ["T AT EOT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30112] = ["WBIG Set to 1 if w GT 1.0m/s", "", "", "", ""] -atm_stashvar[30113] = ["RH on model levels at end timestep", "", "", "", ""] -atm_stashvar[30114] = ["WBIG Set to 1 if w GT 0.1m/s", "", "", "", ""] -atm_stashvar[30115] = ["DRY MASS WEIGHTING MODEL LEV KG/M2", "", "", "", ""] -atm_stashvar[30171] = ["dT**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30172] = ["dQ**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30173] = ["dQcl**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30174] = ["dQcf**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30175] = ["dU**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30176] = ["dV**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30177] = ["dW**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30178] = ["dRHO**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30181] = ["T TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30182] = ["Q TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30183] = ["QCL TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30184] = ["QCF TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30185] = ["U TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30186] = ["V TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30187] = ["W TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30188] = ["RHO TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30189] = ["RAIN TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30190] = ["GRAUPEL TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30191] = ["QCF2 TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30192] = ["CF TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30193] = ["CFL TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30194] = ["CFF TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30195] = ["M_V TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30196] = ["M_CL TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30197] = ["M_CF TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30198] = ["M_RAIN TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30199] = ["M_GRAUP TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30200] = ["M_CF2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30201] = ["U COMPNT OF WIND ON P LEV/UV GRID", "ua", "m s-1", "eastward_wind", "ua_plev"] -atm_stashvar[30202] = ["V COMPNT OF WIND ON P LEV/UV GRID", "va", "m s-1", "northward_wind", "va_plev"] -atm_stashvar[30203] = ["W COMPNT OF WIND ON P LEV/UV GRID", "wa", "m s-1", "upward_air_velocity", "wa_plev"] -atm_stashvar[30204] = ["TEMPERATURE ON P LEV/UV GRID", "ta", "K", "air_temperature", "ta_plev"] -atm_stashvar[30205] = ["SPECIFIC HUMIDITY ON P LEV/UV GRID", "hus", "1", "specific_humidity", "hus_plev"] -atm_stashvar[30206] = ["RELATIVE HUMIDITY ON P LEV/UV GRID", "hur", "%", "relative_humidity", "hur_plev"] -atm_stashvar[30207] = ["GEOPOTENTIAL HEIGHT ON P LEV/UV GRID", "zg", "m", "geopotential_height", "zg_plev"] -atm_stashvar[30208] = ["OMEGA ON P LEV/UV GRID", "wap", "Pa s-1", "lagrangian_tendency_of_air_pressure", "wap_plev"] -atm_stashvar[30211] = ["UU ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30212] = ["UV ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30213] = ["UW ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30214] = ["UT ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30215] = ["UQ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30217] = ["UZ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30218] = ["UOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30222] = ["VV ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30223] = ["VW ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30224] = ["VT ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30225] = ["VQ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30227] = ["VZ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30228] = ["VOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30233] = ["WW ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30234] = ["WT ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30235] = ["WQ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30237] = ["WZ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30238] = ["WOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30244] = ["TT ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30245] = ["TQ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30247] = ["TZ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30248] = ["TOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30255] = ["QQ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30257] = ["QZ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30258] = ["QOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30277] = ["ZZ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30278] = ["ZOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30288] = ["OMOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30293] = ["W COMPNT OF WIND ON P LEV/T GRID", "", "", "", ""] -atm_stashvar[30294] = ["TEMPERATURE ON P LEV/T GRID", "ta", "K", "air_temperature", "ta_plev"] -atm_stashvar[30295] = ["SPECIFIC HUMIDITY ON P LEV/T GRID", "hus", "1", "specific_humidity", "hus_plev"] -atm_stashvar[30296] = ["RELATIVE HUMIDITY ON P LEV/T GRID", "hur", "%", "relative_humidity", "hur_plev"] -atm_stashvar[30297] = ["GEOPOTENTIAL HEIGHT ON P LEV/T GRID", "zg", "m", "geopotential_height", "zg_plev"] -atm_stashvar[30298] = ["OMEGA ON P LEV/T GRID", "wa", "Pa s-1", "lagrangian_tendency_of_air_pressure", "wap_plev"] -atm_stashvar[30301] = ["HEAVYSIDE FN ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30302] = ["VIRTUAL TEMPERATURE ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30303] = ["VIRTUAL TEMP*OMEGA ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30304] = ["HEAVYSIDE FN ON P LEV/T GRID", "", "", "", ""] -atm_stashvar[30310] = ["RESIDUAL MN MERID. CIRC. VSTARBAR", "", "", "", ""] -atm_stashvar[30311] = ["RESIDUAL MN MERID. CIRC. WSTARBAR", "", "", "", ""] -atm_stashvar[30312] = ["ELIASSEN-PALM FLUX (MERID. COMPNT)", "", "", "", ""] -atm_stashvar[30313] = ["ELIASSEN-PALM FLUX (VERT. COMPNT)", "", "", "", ""] -atm_stashvar[30314] = ["DIVERGENCE OF ELIASSEN-PALM FLUX", "", "", "", ""] -atm_stashvar[30315] = ["MERIDIONAL HEAT FLUX", "", "", "", ""] -atm_stashvar[30316] = ["MERIDIONAL MOMENTUM FLUX", "", "", "", ""] -atm_stashvar[30401] = ["TOTAL KE PER UNIT AREA RHO GRID", "", "", "", ""] -atm_stashvar[30402] = ["TOTAL KE PER UA WITH W RHO GRID", "", "", "", ""] -atm_stashvar[30403] = ["TOTAL COLUMN DRY MASS RHO GRID", "", "", "", ""] -atm_stashvar[30404] = ["TOTAL COLUMN WET MASS RHO GRID", "", "", "", ""] -atm_stashvar[30405] = ["TOTAL COLUMN QCL RHO GRID", "lwp", "kg m-2", "atmosphere_cloud_liquid_water_content", ""] -atm_stashvar[30406] = ["TOTAL COLUMN QCF RHO GRID", "clivi", "kg m-2", "atmosphere_cloud_ice_content", ""] -atm_stashvar[30407] = ["TOTAL WATER VAPOUR FLUX U RHO GRID", "", "", "", ""] -atm_stashvar[30408] = ["TOTAL WATER VAPOUR FLUX V RHO GRID", "", "", "", ""] -atm_stashvar[30409] = ["TOTAL WATER VAPOUR FLUX W RHO GRID", "", "", "", ""] -atm_stashvar[30410] = ["MOUNTAIN TORQUE PER UNIT AREA N/M", "", "", "", ""] -atm_stashvar[30411] = ["ANGULAR MOMENTUM M1 KG M2/S X10-24", "", "", "", ""] -atm_stashvar[30412] = ["ANGULAR MOMENTUM M2 KG M2/S X10-24", "", "", "", ""] -atm_stashvar[30413] = ["ANGULAR MOMENTUM M3 KG M2/S X10-24", "", "", "", ""] -atm_stashvar[30414] = ["ANGULAR MOMENTUM W1 KG M2/S X10-24", "", "", "", ""] -atm_stashvar[30415] = ["ANGULAR MOMENTUM W2 KG M2/S X10-24", "", "", "", ""] -atm_stashvar[30416] = ["ANGULAR MOMENTUM W3 KG M2/S X10-24", "", "", "", ""] -atm_stashvar[30417] = ["PSTAR P GRID", "", "Pa", "surface_air_pressure", ""] -atm_stashvar[30418] = ["PSTAR UV GRID", "", "", "", ""] -atm_stashvar[30419] = ["ENERGY CORR P GRID IN COLUMN W/M2", "", "", "", ""] -atm_stashvar[30420] = ["column integral cvT per unit area", "", "", "", ""] -atm_stashvar[30421] = ["column integral gr per unit area", "", "", "", ""] -atm_stashvar[30422] = ["dry mass col int u*gz per unit area", "", "", "", ""] -atm_stashvar[30423] = ["dry mass col int v*gz per unit area", "", "", "", ""] -atm_stashvar[30424] = ["dry mass col int w*gz per unit area", "", "", "", ""] -atm_stashvar[30425] = ["dry mass col int u*T per unit area", "", "", "", ""] -atm_stashvar[30426] = ["dry mass col int v*T per unit area", "", "", "", ""] -atm_stashvar[30427] = ["dry mass col int w*T per unit area", "", "", "", ""] -atm_stashvar[30428] = ["dry mass col int u*q per unit area", "", "", "", ""] -atm_stashvar[30429] = ["dry mass col int v*q per unit area", "", "", "", ""] -atm_stashvar[30430] = ["dry mass col int w*q per unit area", "", "", "", ""] -atm_stashvar[30431] = ["dry mass col int u*v per unit area", "", "", "", ""] -atm_stashvar[30432] = ["dry mass col int u*w per unit area", "", "", "", ""] -atm_stashvar[30433] = ["dry mass col int v*w per unit area", "", "", "", ""] -atm_stashvar[30434] = ["dry mass col int u*KE per unit area", "", "", "", ""] -atm_stashvar[30435] = ["dry mass col int v*KE per unit area", "", "", "", ""] -atm_stashvar[30436] = ["dry mass col int w*KE per unit area", "", "", "", ""] -atm_stashvar[30437] = ["dry mass col int u per unit area", "", "", "", ""] -atm_stashvar[30438] = ["dry mass col int v per unit area", "", "", "", ""] -atm_stashvar[30439] = ["dry mass col int w per unit area", "", "", "", ""] -atm_stashvar[30440] = ["mountain x-surf. pressure drag N/m-2", "", "", "", ""] -atm_stashvar[30441] = ["mountain y-surf. pressure drag N/m-2", "", "", "", ""] -atm_stashvar[30442] = ["COLUMN SATURATION FRACTION", "", "", "", ""] -atm_stashvar[30451] = ["Pressure at Tropopause Level", "", "", "", ""] -atm_stashvar[30452] = ["Temperature at Tropopause Level", "", "", "", ""] -atm_stashvar[30453] = ["Height at Tropopause Level", "", "", "", ""] -atm_stashvar[30454] = ["ICAO HT OF TROP- NEED HT,TEMP,PRESS", "", "", "", ""] -atm_stashvar[30455] = ["VORTICITY 850", "", "", "", ""] -atm_stashvar[30456] = ["FILTERED VORTICITY 850", "", "", "", ""] -atm_stashvar[30457] = ["VORTICITY TC", "", "", "", ""] -atm_stashvar[30458] = ["FILTERED VORTICITY TC", "", "", "", ""] -atm_stashvar[30459] = ["MEAN VORTICITY of req. levels", "", "", "", ""] -atm_stashvar[30460] = ["FIL MEAN VORT of req. levels", "", "", "", ""] -atm_stashvar[30461] = ["TOTAL COLUMN Q (WATER VAPOUR PATH)", "", "", "", ""] -atm_stashvar[30462] = ["TOTAL MOISTURE FLUX U RHO GRID", "", "", "", ""] -atm_stashvar[30463] = ["TOTAL MOISTURE FLUX V RHO GRID", "", "", "", ""] -atm_stashvar[30464] = ["ATMOSPHERIC CO2 BURDEN IN GtC", "", "", "", ""] -atm_stashvar[30465] = ["ATMOSPHERIC CO2 BURDEN IN kg(CO2)", "", "", "", ""] -atm_stashvar[30466] = ["CO2 CONCENTRATION (ppmv)", "", "", "", ""] -atm_stashvar[30467] = ["CO2 MASS MIXING RATIO (kg/kg)", "", "", "", ""] -atm_stashvar[30901] = ["THETA TOTAL INCR ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30902] = ["THETAVD TOTAL INCR ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30903] = ["DRY RHO TOTAL INCR ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[31001] = ["OROGRAPHY HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31002] = ["U HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31003] = ["V HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31004] = ["W HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31005] = ["DENSITY HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31006] = ["POTENTIAL TEMP HORIZ BOUND VALUE", "", "", "", ""] -atm_stashvar[31007] = ["SPECIFIC HUMIDTY HORIZ BOUND VALUE", "", "", "", ""] -atm_stashvar[31008] = ["QCL HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31009] = ["QCF HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31010] = ["EXNER PRESSURE HORIZ BOUND VALUE", "", "", "", ""] -atm_stashvar[31011] = ["U_ADV HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31012] = ["V_ADV HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31013] = ["W_ADV HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31014] = ["CLD ICE (CRY) HORIZ. BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31015] = ["RAIN HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31016] = ["GRAUPEL HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31017] = ["TOTAL CLOUD FRACTION BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31018] = ["LIQUID CLOUD FRACTION BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31019] = ["FROZEN CLOUD FRACTION BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31020] = ["TOTAL AEROSOL (MURK) BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31023] = ["DUST DIV 1 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31024] = ["DUST DIV 2 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31025] = ["DUST DIV 3 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31026] = ["DUST DIV 4 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31027] = ["DUST DIV 5 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31028] = ["DUST DIV 6 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31029] = ["SO2 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31030] = ["DMS BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31031] = ["SO4_AITKEN BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31032] = ["SO4_ACCU BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31033] = ["SO4_DISS BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31035] = ["NH3 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31036] = ["SOOT_NEW BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31037] = ["SOOT_AGD BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31038] = ["SOOT_CLD BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31039] = ["BMASS_NEW BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31040] = ["BMASS_AGD BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31041] = ["BMASS_CLD BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31042] = ["OCFF_NEW BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31043] = ["OCFF_AGD BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31044] = ["OCFF_CLD BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31045] = ["NITR_ACC BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31046] = ["NITR_DISS BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31257] = ["U HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31258] = ["V HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31259] = ["W HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31260] = ["DENSITY HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31261] = ["POTENTIAL TEMP HORIZ BOUND TENDENCY", "", "", "", ""] -atm_stashvar[31262] = ["SPECIFIC HUMIDTY HORIZ BOUND TEND", "", "", "", ""] -atm_stashvar[31263] = ["QCL HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31264] = ["QCF HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31265] = ["EXNER PRESSURE HORIZ BOUND TENDENCY", "", "", "", ""] -atm_stashvar[31266] = ["U_ADV HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31267] = ["V_ADV HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31268] = ["W_ADV HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31269] = ["CLD ICE (CRY) HORIZ. BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31270] = ["RAIN HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31271] = ["GRAUPEL HORIZONTAL BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31272] = ["TOTAL CLOUD FRACTN BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31273] = ["LIQUID CLOUD FRACN BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31274] = ["FROZEN CLOUD FRACN BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31275] = ["TOTAL AEROSOL (MURK) BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31276] = ["DUST DIV 1 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31277] = ["DUST DIV 2 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31278] = ["DUST DIV 3 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31279] = ["DUST DIV 4 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31280] = ["DUST DIV 5 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31281] = ["DUST DIV 6 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31282] = ["SO2 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31283] = ["DMS BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31284] = ["SO4_AITKEN BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31285] = ["SO4_ACCU BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31286] = ["SO4_DISS BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31288] = ["NH3 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31289] = ["SOOT_NEW BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31290] = ["SOOT_AGD BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31291] = ["SOOT_CLD BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31292] = ["BMASS_NEW BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31293] = ["BMASS_AGD BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31294] = ["BMASS_CLD BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31295] = ["OCFF_NEW BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31296] = ["OCFF_AGD BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31297] = ["OCFF_CLD BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31298] = ["NITR_ACC BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31299] = ["NITR_DISS BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[32001] = ["OROGRAPHY HORIZONTAL BV OUT retired", "", "", "", ""] -atm_stashvar[32002] = ["U HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32003] = ["V HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32004] = ["W HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32005] = ["DENSITY HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32006] = ["POTENTIAL TEMP HORIZ BV OUT(retired)", "", "", "", ""] -atm_stashvar[32007] = ["SPECIFIC HUMIDTY HORIZ BV OUT (retd)", "", "", "", ""] -atm_stashvar[32008] = ["QCL HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32009] = ["QCF HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32010] = ["EXNER PRESSURE HORIZ BV OUT(retired)", "", "", "", ""] -atm_stashvar[32011] = ["U_ADV HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32012] = ["V_ADV HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32013] = ["W_ADV HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32014] = ["CLOUD ICE HORIZONTAL BV OUT retired", "", "", "", ""] -atm_stashvar[32015] = ["RAIN HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32016] = ["GRAUPEL HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32017] = ["TOTAL CLOUD FRACTION BV OUT(retired)", "", "", "", ""] -atm_stashvar[32018] = ["LIQUID CLOUD FRACTION BV OUT", "", "", "", ""] -atm_stashvar[32019] = ["FROZEN CLOUD FRACTION BV OUT (retd)", "", "", "", ""] -atm_stashvar[32020] = ["TOTAL AEROSOL (MURK) BV OUT (retd)", "", "", "", ""] -atm_stashvar[32021] = ["ATM FREE TRACER BOUND VAL. OUT retd", "", "", "", ""] -atm_stashvar[32022] = ["UKCA TRACER BOUND VAL. OUT (retired)", "", "", "", ""] -atm_stashvar[32023] = ["DUST DIV 1 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32024] = ["DUST DIV 2 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32025] = ["DUST DIV 3 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32026] = ["DUST DIV 4 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32027] = ["DUST DIV 5 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32028] = ["DUST DIV 6 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32029] = ["SO2 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32030] = ["DMS BV OUT (retired)", "", "", "", ""] -atm_stashvar[32031] = ["SO4_AITKEN BV OUT (retired)", "", "", "", ""] -atm_stashvar[32032] = ["SO4_ACCU BV OUT (retired)", "", "", "", ""] -atm_stashvar[32033] = ["SO4_DISS BV OUT (retired)", "", "", "", ""] -atm_stashvar[32035] = ["NH3 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32036] = ["SOOT_NEW BV OUT (retired)", "", "", "", ""] -atm_stashvar[32037] = ["SOOT_AGD BV OUT (retired)", "", "", "", ""] -atm_stashvar[32038] = ["SOOT_CLD BV OUT (retired)", "", "", "", ""] -atm_stashvar[32039] = ["BMASS_NEW BV OUT (retired)", "", "", "", ""] -atm_stashvar[32040] = ["BMASS_AGD BV OUT (retired)", "", "", "", ""] -atm_stashvar[32041] = ["BMASS_CLD BV OUT (retired)", "", "", "", ""] -atm_stashvar[32042] = ["OCFF_NEW BV OUT (retired)", "", "", "", ""] -atm_stashvar[32043] = ["OCFF_AGD BV OUT (retired)", "", "", "", ""] -atm_stashvar[32044] = ["OCFF_CLD BV OUT (retired)", "", "", "", ""] -atm_stashvar[32045] = ["NITR_ACC BV OUT (retired)", "", "", "", ""] -atm_stashvar[32046] = ["NITR_DISS BV OUT (retired)", "", "", "", ""] -atm_stashvar[33001] = ["ATM TRACER 1 AFTER TS", "", "", "", ""] -atm_stashvar[33002] = ["ATM TRACER 2 AFTER TS", "", "", "", ""] -atm_stashvar[33003] = ["ATM TRACER 3 AFTER TS", "", "", "", ""] -atm_stashvar[33004] = ["ATM TRACER 4 AFTER TS", "", "", "", ""] -atm_stashvar[33005] = ["ATM TRACER 5 AFTER TS", "", "", "", ""] -atm_stashvar[33006] = ["ATM TRACER 6 AFTER TS", "", "", "", ""] -atm_stashvar[33007] = ["ATM TRACER 7 AFTER TS", "", "", "", ""] -atm_stashvar[33008] = ["ATM TRACER 8 AFTER TS", "", "", "", ""] -atm_stashvar[33009] = ["ATM TRACER 9 AFTER TS", "", "", "", ""] -atm_stashvar[33010] = ["ATM TRACER 10 AFTER TS", "", "", "", ""] -atm_stashvar[33011] = ["ATM TRACER 11 AFTER TS", "", "", "", ""] -atm_stashvar[33012] = ["ATM TRACER 12 AFTER TS", "", "", "", ""] -atm_stashvar[33013] = ["ATM TRACER 13 AFTER TS", "", "", "", ""] -atm_stashvar[33014] = ["ATM TRACER 14 AFTER TS", "", "", "", ""] -atm_stashvar[33015] = ["ATM TRACER 15 AFTER TS", "", "", "", ""] -atm_stashvar[33016] = ["ATM TRACER 16 AFTER TS", "", "", "", ""] -atm_stashvar[33017] = ["ATM TRACER 17 AFTER TS", "", "", "", ""] -atm_stashvar[33018] = ["ATM TRACER 18 AFTER TS", "", "", "", ""] -atm_stashvar[33019] = ["ATM TRACER 19 AFTER TS", "", "", "", ""] -atm_stashvar[33020] = ["ATM TRACER 20 AFTER TS", "", "", "", ""] -atm_stashvar[33021] = ["ATM TRACER 21 AFTER TS", "", "", "", ""] -atm_stashvar[33022] = ["ATM TRACER 22 AFTER TS", "", "", "", ""] -atm_stashvar[33023] = ["ATM TRACER 23 AFTER TS", "", "", "", ""] -atm_stashvar[33024] = ["ATM TRACER 24 AFTER TS", "", "", "", ""] -atm_stashvar[33025] = ["ATM TRACER 25 AFTER TS", "", "", "", ""] -atm_stashvar[33026] = ["ATM TRACER 26 AFTER TS", "", "", "", ""] -atm_stashvar[33027] = ["ATM TRACER 27 AFTER TS", "", "", "", ""] -atm_stashvar[33028] = ["ATM TRACER 28 AFTER TS", "", "", "", ""] -atm_stashvar[33029] = ["ATM TRACER 29 AFTER TS", "", "", "", ""] -atm_stashvar[33030] = ["ATM TRACER 30 AFTER TS", "", "", "", ""] -atm_stashvar[33031] = ["ATM TRACER 31 AFTER TS", "", "", "", ""] -atm_stashvar[33032] = ["ATM TRACER 32 AFTER TS", "", "", "", ""] -atm_stashvar[33033] = ["ATM TRACER 33 AFTER TS", "", "", "", ""] -atm_stashvar[33034] = ["ATM TRACER 34 AFTER TS", "", "", "", ""] -atm_stashvar[33035] = ["ATM TRACER 35 AFTER TS", "", "", "", ""] -atm_stashvar[33036] = ["ATM TRACER 36 AFTER TS", "", "", "", ""] -atm_stashvar[33037] = ["ATM TRACER 37 AFTER TS", "", "", "", ""] -atm_stashvar[33038] = ["ATM TRACER 38 AFTER TS", "", "", "", ""] -atm_stashvar[33039] = ["ATM TRACER 39 AFTER TS", "", "", "", ""] -atm_stashvar[33040] = ["ATM TRACER 40 AFTER TS", "", "", "", ""] -atm_stashvar[33041] = ["ATM TRACER 41 AFTER TS", "", "", "", ""] -atm_stashvar[33042] = ["ATM TRACER 42 AFTER TS", "", "", "", ""] -atm_stashvar[33043] = ["ATM TRACER 43 AFTER TS", "", "", "", ""] -atm_stashvar[33044] = ["ATM TRACER 44 AFTER TS", "", "", "", ""] -atm_stashvar[33045] = ["ATM TRACER 45 AFTER TS", "", "", "", ""] -atm_stashvar[33046] = ["ATM TRACER 46 AFTER TS", "", "", "", ""] -atm_stashvar[33047] = ["ATM TRACER 47 AFTER TS", "", "", "", ""] -atm_stashvar[33048] = ["ATM TRACER 48 AFTER TS", "", "", "", ""] -atm_stashvar[33049] = ["ATM TRACER 49 AFTER TS", "", "", "", ""] -atm_stashvar[33050] = ["ATM TRACER 50 AFTER TS", "", "", "", ""] -atm_stashvar[33051] = ["ATM TRACER 51 AFTER TS", "", "", "", ""] -atm_stashvar[33052] = ["ATM TRACER 52 AFTER TS", "", "", "", ""] -atm_stashvar[33053] = ["ATM TRACER 53 AFTER TS", "", "", "", ""] -atm_stashvar[33054] = ["ATM TRACER 54 AFTER TS", "", "", "", ""] -atm_stashvar[33055] = ["ATM TRACER 55 AFTER TS", "", "", "", ""] -atm_stashvar[33056] = ["ATM TRACER 56 AFTER TS", "", "", "", ""] -atm_stashvar[33057] = ["ATM TRACER 57 AFTER TS", "", "", "", ""] -atm_stashvar[33058] = ["ATM TRACER 58 AFTER TS", "", "", "", ""] -atm_stashvar[33059] = ["ATM TRACER 59 AFTER TS", "", "", "", ""] -atm_stashvar[33060] = ["ATM TRACER 60 AFTER TS", "", "", "", ""] -atm_stashvar[33061] = ["ATM TRACER 61 AFTER TS", "", "", "", ""] -atm_stashvar[33062] = ["ATM TRACER 62 AFTER TS", "", "", "", ""] -atm_stashvar[33063] = ["ATM TRACER 63 AFTER TS", "", "", "", ""] -atm_stashvar[33064] = ["ATM TRACER 64 AFTER TS", "", "", "", ""] -atm_stashvar[33065] = ["ATM TRACER 65 AFTER TS", "", "", "", ""] -atm_stashvar[33066] = ["ATM TRACER 66 AFTER TS", "", "", "", ""] -atm_stashvar[33067] = ["ATM TRACER 67 AFTER TS", "", "", "", ""] -atm_stashvar[33068] = ["ATM TRACER 68 AFTER TS", "", "", "", ""] -atm_stashvar[33069] = ["ATM TRACER 69 AFTER TS", "", "", "", ""] -atm_stashvar[33070] = ["ATM TRACER 70 AFTER TS", "", "", "", ""] -atm_stashvar[33071] = ["ATM TRACER 71 AFTER TS", "", "", "", ""] -atm_stashvar[33072] = ["ATM TRACER 72 AFTER TS", "", "", "", ""] -atm_stashvar[33073] = ["ATM TRACER 73 AFTER TS", "", "", "", ""] -atm_stashvar[33074] = ["ATM TRACER 74 AFTER TS", "", "", "", ""] -atm_stashvar[33075] = ["ATM TRACER 75 AFTER TS", "", "", "", ""] -atm_stashvar[33076] = ["ATM TRACER 76 AFTER TS", "", "", "", ""] -atm_stashvar[33077] = ["ATM TRACER 77 AFTER TS", "", "", "", ""] -atm_stashvar[33078] = ["ATM TRACER 78 AFTER TS", "", "", "", ""] -atm_stashvar[33079] = ["ATM TRACER 79 AFTER TS", "", "", "", ""] -atm_stashvar[33080] = ["ATM TRACER 80 AFTER TS", "", "", "", ""] -atm_stashvar[33081] = ["ATM TRACER 81 AFTER TS", "", "", "", ""] -atm_stashvar[33082] = ["ATM TRACER 82 AFTER TS", "", "", "", ""] -atm_stashvar[33083] = ["ATM TRACER 83 AFTER TS", "", "", "", ""] -atm_stashvar[33084] = ["ATM TRACER 84 AFTER TS", "", "", "", ""] -atm_stashvar[33085] = ["ATM TRACER 85 AFTER TS", "", "", "", ""] -atm_stashvar[33086] = ["ATM TRACER 86 AFTER TS", "", "", "", ""] -atm_stashvar[33087] = ["ATM TRACER 87 AFTER TS", "", "", "", ""] -atm_stashvar[33088] = ["ATM TRACER 88 AFTER TS", "", "", "", ""] -atm_stashvar[33089] = ["ATM TRACER 89 AFTER TS", "", "", "", ""] -atm_stashvar[33090] = ["ATM TRACER 90 AFTER TS", "", "", "", ""] -atm_stashvar[33091] = ["ATM TRACER 91 AFTER TS", "", "", "", ""] -atm_stashvar[33092] = ["ATM TRACER 92 AFTER TS", "", "", "", ""] -atm_stashvar[33093] = ["ATM TRACER 93 AFTER TS", "", "", "", ""] -atm_stashvar[33094] = ["ATM TRACER 94 AFTER TS", "", "", "", ""] -atm_stashvar[33095] = ["ATM TRACER 95 AFTER TS", "", "", "", ""] -atm_stashvar[33096] = ["ATM TRACER 96 AFTER TS", "", "", "", ""] -atm_stashvar[33097] = ["ATM TRACER 97 AFTER TS", "", "", "", ""] -atm_stashvar[33098] = ["ATM TRACER 98 AFTER TS", "", "", "", ""] -atm_stashvar[33099] = ["ATM TRACER 99 AFTER TS", "", "", "", ""] -atm_stashvar[33100] = ["ATM TRACER100 AFTER TS", "", "", "", ""] -atm_stashvar[33101] = ["ATM TRACER101 AFTER TS", "", "", "", ""] -atm_stashvar[33102] = ["ATM TRACER102 AFTER TS", "", "", "", ""] -atm_stashvar[33103] = ["ATM TRACER103 AFTER TS", "", "", "", ""] -atm_stashvar[33104] = ["ATM TRACER104 AFTER TS", "", "", "", ""] -atm_stashvar[33105] = ["ATM TRACER105 AFTER TS", "", "", "", ""] -atm_stashvar[33106] = ["ATM TRACER106 AFTER TS", "", "", "", ""] -atm_stashvar[33107] = ["ATM TRACER107 AFTER TS", "", "", "", ""] -atm_stashvar[33108] = ["ATM TRACER108 AFTER TS", "", "", "", ""] -atm_stashvar[33109] = ["ATM TRACER109 AFTER TS", "", "", "", ""] -atm_stashvar[33110] = ["ATM TRACER110 AFTER TS", "", "", "", ""] -atm_stashvar[33111] = ["ATM TRACER111 AFTER TS", "", "", "", ""] -atm_stashvar[33112] = ["ATM TRACER112 AFTER TS", "", "", "", ""] -atm_stashvar[33113] = ["ATM TRACER113 AFTER TS", "", "", "", ""] -atm_stashvar[33114] = ["ATM TRACER114 AFTER TS", "", "", "", ""] -atm_stashvar[33115] = ["ATM TRACER115 AFTER TS", "", "", "", ""] -atm_stashvar[33116] = ["ATM TRACER116 AFTER TS", "", "", "", ""] -atm_stashvar[33117] = ["ATM TRACER117 AFTER TS", "", "", "", ""] -atm_stashvar[33118] = ["ATM TRACER118 AFTER TS", "", "", "", ""] -atm_stashvar[33119] = ["ATM TRACER119 AFTER TS", "", "", "", ""] -atm_stashvar[33120] = ["ATM TRACER120 AFTER TS", "", "", "", ""] -atm_stashvar[33121] = ["ATM TRACER121 AFTER TS", "", "", "", ""] -atm_stashvar[33122] = ["ATM TRACER122 AFTER TS", "", "", "", ""] -atm_stashvar[33123] = ["ATM TRACER123 AFTER TS", "", "", "", ""] -atm_stashvar[33124] = ["ATM TRACER124 AFTER TS", "", "", "", ""] -atm_stashvar[33125] = ["ATM TRACER125 AFTER TS", "", "", "", ""] -atm_stashvar[33126] = ["ATM TRACER126 AFTER TS", "", "", "", ""] -atm_stashvar[33127] = ["ATM TRACER127 AFTER TS", "", "", "", ""] -atm_stashvar[33128] = ["ATM TRACER128 AFTER TS", "", "", "", ""] -atm_stashvar[33129] = ["ATM TRACER129 AFTER TS", "", "", "", ""] -atm_stashvar[33130] = ["ATM TRACER130 AFTER TS", "", "", "", ""] -atm_stashvar[33131] = ["ATM TRACER131 AFTER TS", "", "", "", ""] -atm_stashvar[33132] = ["ATM TRACER132 AFTER TS", "", "", "", ""] -atm_stashvar[33133] = ["ATM TRACER133 AFTER TS", "", "", "", ""] -atm_stashvar[33134] = ["ATM TRACER134 AFTER TS", "", "", "", ""] -atm_stashvar[33135] = ["ATM TRACER135 AFTER TS", "", "", "", ""] -atm_stashvar[33136] = ["ATM TRACER136 AFTER TS", "", "", "", ""] -atm_stashvar[33137] = ["ATM TRACER137 AFTER TS", "", "", "", ""] -atm_stashvar[33138] = ["ATM TRACER138 AFTER TS", "", "", "", ""] -atm_stashvar[33139] = ["ATM TRACER139 AFTER TS", "", "", "", ""] -atm_stashvar[33140] = ["ATM TRACER140 AFTER TS", "", "", "", ""] -atm_stashvar[33141] = ["ATM TRACER141 AFTER TS", "", "", "", ""] -atm_stashvar[33142] = ["ATM TRACER142 AFTER TS", "", "", "", ""] -atm_stashvar[33143] = ["ATM TRACER143 AFTER TS", "", "", "", ""] -atm_stashvar[33144] = ["ATM TRACER144 AFTER TS", "", "", "", ""] -atm_stashvar[33145] = ["ATM TRACER145 AFTER TS", "", "", "", ""] -atm_stashvar[33146] = ["ATM TRACER146 AFTER TS", "", "", "", ""] -atm_stashvar[33147] = ["ATM TRACER147 AFTER TS", "", "", "", ""] -atm_stashvar[33148] = ["ATM TRACER148 AFTER TS", "", "", "", ""] -atm_stashvar[33149] = ["ATM TRACER149 AFTER TS", "", "", "", ""] -atm_stashvar[33150] = ["ATM TRACER150 AFTER TS", "", "", "", ""] -atm_stashvar[34001] = ["O3 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34002] = ["NO MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34003] = ["NO3 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34004] = ["NO2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34005] = ["N2O5 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34006] = ["HO2NO2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34007] = ["HONO2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34008] = ["H2O2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34009] = ["CH4 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34010] = ["CO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34011] = ["HCHO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34012] = ["MeOOH MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34013] = ["HONO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34014] = ["C2H6 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34015] = ["EtOOH MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34016] = ["MeCHO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34017] = ["PAN MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34018] = ["C3H8 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34019] = ["n-PrOOH MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34020] = ["i-PrOOH MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34021] = ["EtCHO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34022] = ["Me2CO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34023] = ["MeCOCH2OOH MASS MIXING RATIO AFT TS", "", "", "", ""] -atm_stashvar[34024] = ["PPAN MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34025] = ["MeONO2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34026] = ["O3S MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34027] = ["C5H8 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34028] = ["ISOOH MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34029] = ["ISON MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34030] = ["MACR MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34031] = ["MACROOH MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34032] = ["MPAN MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34033] = ["HACET MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34034] = ["MGLY MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34035] = ["NALD MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34036] = ["HCOOH MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34037] = ["MeCO3H MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34038] = ["MeCO2H MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34039] = ["MVK MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34040] = ["MVKOOH MASS MIXING RATIO AFTER T", "", "", "", ""] -atm_stashvar[34041] = ["Cl MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34042] = ["ClO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34043] = ["Cl2O2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34044] = ["OClO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34045] = ["Br MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34047] = ["BrCl MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34048] = ["BrONO2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34049] = ["N2O MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34051] = ["HOCl MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34052] = ["HBr MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34053] = ["HOBr MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34054] = ["ClONO2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34055] = ["CFCl3 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34056] = ["CF2Cl2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34057] = ["MeBr MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34058] = ["N MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34059] = ["O3P MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34060] = ["ORGNIT MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34069] = ["CH3OH MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34070] = ["H2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34071] = ["DMS MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34072] = ["SO2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34073] = ["H2SO4 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34074] = ["MSA MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34075] = ["DMSO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34076] = ["NH3 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34077] = ["CS2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34078] = ["COS MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34079] = ["H2S MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34080] = ["H MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34081] = ["OH MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34082] = ["HO2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34083] = ["MeOO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34084] = ["EtOO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34085] = ["MeCO3 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34086] = ["n-PrOO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34087] = ["i-PrOO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34088] = ["EtCO3 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34089] = ["MeCOCH2OO MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34090] = ["MeOH MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34091] = ["MONOTERPENE MASS MIXING RATIO AFT TS", "", "", "", ""] -atm_stashvar[34092] = ["SEC_ORG MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34093] = ["C3H6 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34094] = ["SO3 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34095] = ["C4H9OOH MASS MIXING RATIO AFT TSTEP", "", "", "", ""] -atm_stashvar[34096] = ["MEK MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34097] = ["TOLUENE MASS MIXING RATIO AFT TSTEP", "", "", "", ""] -atm_stashvar[34098] = ["LUMPED N (as NO2) MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34099] = ["LUMPED Br (as BrO) MMR AFTER TSTEP", "", "", "", ""] -atm_stashvar[34100] = ["LUMPED Cl (as HCl) MMR AFTER TSTEP", "", "", "", ""] -atm_stashvar[34101] = ["NUCLEATION MODE (SOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34102] = ["NUCLEATION MODE (SOLUBLE) H2SO4 MMR", "", "", "", ""] -atm_stashvar[34103] = ["AITKEN MODE (SOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34104] = ["AITKEN MODE (SOLUBLE) H2SO4 MMR", "", "", "", ""] -atm_stashvar[34105] = ["AITKEN MODE (SOLUBLE) BC MMR", "", "", "", ""] -atm_stashvar[34106] = ["AITKEN MODE (SOLUBLE) OM MMR", "", "", "", ""] -atm_stashvar[34107] = ["ACCUMULATION MODE (SOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34108] = ["ACCUMULATION MODE (SOL) H2SO4 MMR", "", "", "", ""] -atm_stashvar[34109] = ["ACCUMULATION MODE (SOL) BC MMR", "", "", "", ""] -atm_stashvar[34110] = ["ACCUMULATION MODE (SOL) OM MMR", "", "", "", ""] -atm_stashvar[34111] = ["ACCUMULATION MODE (SOL) SEA SALT MMR", "", "", "", ""] -atm_stashvar[34112] = ["ACCUMULATION MODE (SOL) DUST MMR", "", "", "", ""] -atm_stashvar[34113] = ["COARSE MODE (SOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34114] = ["COARSE MODE (SOLUBLE) H2SO4 MMR", "", "", "", ""] -atm_stashvar[34115] = ["COARSE MODE (SOLUBLE) BC MMR", "", "", "", ""] -atm_stashvar[34116] = ["COARSE MODE (SOLUBLE) OM MMR", "", "", "", ""] -atm_stashvar[34117] = ["COARSE MODE (SOLUBLE) SEA SALT MMR", "", "", "", ""] -atm_stashvar[34118] = ["COARSE MODE (SOLUBLE) DUST MMR", "", "", "", ""] -atm_stashvar[34119] = ["AITKEN MODE (INSOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34120] = ["AITKEN MODE (INSOLUBLE) BC MMR", "", "", "", ""] -atm_stashvar[34121] = ["AITKEN MODE (INSOLUBLE) OM MMR", "", "", "", ""] -atm_stashvar[34122] = ["ACCUMULATION MODE (INSOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34123] = ["ACCUMULATION MODE (INSOLUBLE) DUST", "", "", "", ""] -atm_stashvar[34124] = ["COARSE MODE (INSOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34125] = ["COARSE MODE (INSOLUBLE) DUST MMR", "", "", "", ""] -atm_stashvar[34126] = ["NUCLEATION MODE (SOLUBLE) OM MMR", "", "", "", ""] -atm_stashvar[34127] = ["AITKEN MODE (SOLUBLE) SEA SALT MMR", "", "", "", ""] -atm_stashvar[34128] = ["NUCLEATION MODE (SOLUBLE) OM2 MMR", "", "", "", ""] -atm_stashvar[34129] = ["AITKEN MODE (SOLUBLE) OM2 MMR", "", "", "", ""] -atm_stashvar[34130] = ["ACCUMULATION MODE (SOLUBLE) OM2 MMR", "", "", "", ""] -atm_stashvar[34131] = ["COARSE MODE (SOLUBLE) OM2 MMR", "", "", "", ""] -atm_stashvar[34132] = ["NUCLEATION MODE (SOLUBLE) NH4 MMR", "", "", "", ""] -atm_stashvar[34133] = ["AITKEN MODE (SOLUBLE) NH4 MMR", "", "", "", ""] -atm_stashvar[34134] = ["ACCUMULATION MODE (SOLUBLE) NH4 MMR", "", "", "", ""] -atm_stashvar[34135] = ["COARSE MODE (SOLUBLE) NH4 MMR", "", "", "", ""] -atm_stashvar[34136] = ["NUCLEATION MODE (SOLUBLE) NO3 MMR", "", "", "", ""] -atm_stashvar[34137] = ["AITKEN MODE (SOLUBLE) NO3 MMR", "", "", "", ""] -atm_stashvar[34138] = ["ACCUMULATION MODE (SOLUBLE) NO3 MMR", "", "", "", ""] -atm_stashvar[34139] = ["COARSE MODE (SOLUBLE) NO3 MMR", "", "", "", ""] -atm_stashvar[34149] = ["PASSIVE O3 MASS MIXING RATIO", "", "", "", ""] -atm_stashvar[34150] = ["AGE OF AIR IN SECONDS", "", "", "", ""] -atm_stashvar[34151] = ["UKCA NON-TRANSP SPECIES 151 RETIRED", "", "", "", ""] -atm_stashvar[34152] = ["UKCA NON-TRANSP SPECIES 152 RETIRED", "", "", "", ""] -atm_stashvar[34153] = ["UKCA NON-TRANSP SPECIES 153 RETIRED", "", "", "", ""] -atm_stashvar[34154] = ["UKCA NON-TRANSP SPECIES 154 RETIRED", "", "", "", ""] -atm_stashvar[34155] = ["UKCA NON-TRANSP SPECIES 155 RETIRED", "", "", "", ""] -atm_stashvar[34156] = ["UKCA NON-TRANSP SPECIES 156 RETIRED", "", "", "", ""] -atm_stashvar[34157] = ["UKCA NON-TRANSP SPECIES 157 RETIRED", "", "", "", ""] -atm_stashvar[34158] = ["UKCA NON-TRANSP SPECIES 158 RETIRED", "", "", "", ""] -atm_stashvar[34159] = ["UKCA NON-TRANSP SPECIES 159 RETIRED", "", "", "", ""] -atm_stashvar[34160] = ["UKCA NON-TRANSP SPECIES 160 RETIRED", "", "", "", ""] -atm_stashvar[34161] = ["UKCA NON-TRANSP SPECIES 161 RETIRED", "", "", "", ""] -atm_stashvar[34162] = ["UKCA NON-TRANSP SPECIES 162 RETIRED", "", "", "", ""] -atm_stashvar[34163] = ["UKCA NON-TRANSP SPECIES 163 RETIRED", "", "", "", ""] -atm_stashvar[34164] = ["UKCA NON-TRANSP SPECIES 164 RETIRED", "", "", "", ""] -atm_stashvar[34165] = ["UKCA NON-TRANSP SPECIES 165 RETIRED", "", "", "", ""] -atm_stashvar[34166] = ["UKCA NON-TRANSP SPECIES 166 RETIRED", "", "", "", ""] -atm_stashvar[34167] = ["UKCA NON-TRANSP SPECIES 167 RETIRED", "", "", "", ""] -atm_stashvar[34168] = ["UKCA NON-TRANSP SPECIES 168 RETIRED", "", "", "", ""] -atm_stashvar[34169] = ["UKCA NON-TRANSP SPECIES 169 RETIRED", "", "", "", ""] -atm_stashvar[34170] = ["UKCA NON-TRANSP SPECIES 170 RETIRED", "", "", "", ""] -atm_stashvar[34171] = ["UKCA NON-TRANSP SPECIES 171 RETIRED", "", "", "", ""] -atm_stashvar[34172] = ["UKCA NON-TRANSP SPECIES 172 RETIRED", "", "", "", ""] -atm_stashvar[34921] = ["DRY PARTICLE DIAMETER AITKEN-SOL", "", "", "", ""] -atm_stashvar[34922] = ["DRY PARTICLE DIAMETER ACCUMULATN-SOL", "", "", "", ""] -atm_stashvar[34923] = ["DRY PARTICLE DIAMETER COARSE-SOL", "", "", "", ""] -atm_stashvar[34924] = ["DRY PARTICLE DIAMETER AITKEN-INS", "", "", "", ""] -atm_stashvar[34925] = ["DRY PARTICLE DIAMETER ACCUMULATN-INS", "", "", "", ""] -atm_stashvar[34926] = ["DRY PARTICLE DIAMETER COARSE-INSOL", "", "", "", ""] -atm_stashvar[34927] = ["WET PARTICLE DIAMETER AITKEN-SOL", "", "", "", ""] -atm_stashvar[34928] = ["WET PARTICLE DIAMETER ACCUMULATN-SOL", "", "", "", ""] -atm_stashvar[34929] = ["WET PARTICLE DIAMETER COARSE-SOL", "", "", "", ""] -atm_stashvar[34930] = ["PTCL MASS DENSITY AITKEN-SOL (WET)", "", "", "", ""] -atm_stashvar[34931] = ["PTCL MASS DENSITY ACCUM.-SOL (WET)", "", "", "", ""] -atm_stashvar[34932] = ["PTCL MASS DENSITY COARSE-SOL (WET)", "", "", "", ""] -atm_stashvar[34933] = ["PTCL MASS DENSITY AITKEN-INS", "", "", "", ""] -atm_stashvar[34934] = ["PTCL MASS DENSITY ACCUM.-INS", "", "", "", ""] -atm_stashvar[34935] = ["PTCL MASS DENSITY COARSE-INS", "", "", "", ""] -atm_stashvar[34936] = ["H2SO4 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[34937] = ["BC PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[34938] = ["OM1 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[34939] = ["NO3 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[34940] = ["OM2 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[34941] = ["H2O PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[34942] = ["H2SO4 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34943] = ["BC PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34944] = ["OM1 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34945] = ["SS PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34946] = ["NO3 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34947] = ["DU PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34948] = ["OM2 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34949] = ["CL PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34950] = ["NA PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34951] = ["H2O PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34952] = ["H2SO4 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34953] = ["BC PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34954] = ["OM1 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34955] = ["SSALT PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34956] = ["NO3 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34957] = ["DU PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34958] = ["OM2 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34959] = ["CL PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34960] = ["NA PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34961] = ["H2O PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34962] = ["BC PARTIAL VOLUME CONC (AIT-INS)", "", "", "", ""] -atm_stashvar[34963] = ["OM1 PARTIAL VOLUME CONC (AIT-INS)", "", "", "", ""] -atm_stashvar[34964] = ["DU PARTIAL VOLUME CONC (ACC-INS)", "", "", "", ""] -atm_stashvar[34965] = ["DU PARTIAL VOLUME CONC (COR-INS)", "", "", "", ""] -atm_stashvar[34966] = ["Aerosol surface area dens (cm2/cm3)", "", "", "", ""] -atm_stashvar[34967] = ["Cloud Droplet No. Conc. ^-1/3 (m-1)", "", "", "", ""] -atm_stashvar[34968] = ["Cloud Droplet No. Conc. (m-3)", "", "", "", ""] -atm_stashvar[34969] = ["Stratospheric HO2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34970] = ["Stratospheric OH MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34971] = ["Stratospheric O(1D) MMR AFTER TSTEP", "", "", "", ""] -atm_stashvar[34972] = ["Stratospheric O(3P) MMR AFTER TSTEP", "", "", "", ""] -atm_stashvar[34973] = ["Self reaction of HO2 on aerosol (s-1)", "", "", "", ""] -atm_stashvar[34974] = ["Loss rate of N2O5 on aerosol (s-1)", "", "", "", ""] -atm_stashvar[34975] = ["HOC6H5CH3O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34976] = ["HOC5H8O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34977] = ["CH3COCH(O2)CH2OH MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34978] = ["CHOCH(OH)CO2CH3CHO MMR AFTER TSTEP", "", "", "", ""] -atm_stashvar[34979] = ["C6H5CH2O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34980] = ["CH3CHO2CH2OH MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34981] = ["CH2O2CH2OH MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34982] = ["CH3COCH(O2)CH3 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34983] = ["CH3COCH2O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34984] = ["CH3COC2O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34985] = ["C2H5COO2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34986] = ["i-C2H7O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34987] = ["s-C4H9O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34988] = ["n-C2H7O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34989] = ["CH3COO2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34990] = ["C2H5O2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34991] = ["CH3O2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34992] = ["HCl MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34993] = ["HO2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34994] = ["BrO MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34995] = ["OH MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34996] = ["NO2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34997] = ["O(1D) MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34998] = ["O(3P) MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[35001] = ["U COMPNT OF WIND AFTER SKEB2", "", "", "", ""] -atm_stashvar[35002] = ["V COMPNT OF WIND AFTER SKEB2", "", "", "", ""] -atm_stashvar[35003] = ["U COMPNT OF WIND INCR SKEB2", "", "", "", ""] -atm_stashvar[35004] = ["V COMPNT OF WIND INCR SKEB2", "", "", "", ""] -atm_stashvar[35005] = ["ROT U COMPNT OF WIND INCR SKEB2", "", "", "", ""] -atm_stashvar[35006] = ["ROT V COMPNT OF WIND INCR SKEB2", "", "", "", ""] -atm_stashvar[35007] = ["DIV U COMPNT OF WIND INCR SKEB2", "", "", "", ""] -atm_stashvar[35008] = ["DIV V COMPNT OF WIND INCR SKEB2", "", "", "", ""] -atm_stashvar[35009] = ["SKEB2 DISSIPATION FROM SMAG", "", "", "", ""] -atm_stashvar[35010] = ["SKEB2 DISSIPATION FROM CONVECTION", "", "", "", ""] -atm_stashvar[35011] = ["SKEB2 DISS FROM SKEB1-TYPE PATTERN", "", "", "", ""] -atm_stashvar[35012] = ["SKEB2 SMOOTHED MODULATING FIELD", "", "", "", ""] -atm_stashvar[35013] = ["SKEB2 STREAMFUNCTION FORC FIELD", "", "", "", ""] -atm_stashvar[35014] = ["SKEB2 INITIAL RANDOM PATTERN", "", "", "", ""] -atm_stashvar[35015] = ["MASS VERT INT OF STRM FORC FIELD", "", "", "", ""] -atm_stashvar[35016] = ["VERT INTEG NUMERICAL DISSP (W/M^2)", "", "", "", ""] -atm_stashvar[35017] = ["VERT INTEG CONVECTVE DISSP (W/M^2)", "", "", "", ""] -atm_stashvar[35018] = ["VERT INTEG SKEB1-TYPE DISS (W/M^2)", "", "", "", ""] -atm_stashvar[35019] = ["MASS VERT INT OF MODULATED STRMFUNC", "", "", "", ""] -atm_stashvar[35020] = ["V INT KE WIND INCR PRE SKEB2 (J/M^2)", "", "", "", ""] -atm_stashvar[35021] = ["V INT KE WIND INCR SKEB2 (J/M^2)", "", "", "", ""] -atm_stashvar[35022] = ["V INT KE WIND INCR POST SKEB2(J/M^2)", "", "", "", ""] -atm_stashvar[35023] = ["SPT FORCING PATTERN", "", "", "", ""] -atm_stashvar[35024] = ["THETA TENDENCY SPT INCREMENT", "", "", "", ""] -atm_stashvar[35025] = ["Q TENDENCY SPT INCREMENT", "", "", "", ""] -atm_stashvar[35026] = ["U TENDENCY SPT INCREMENT", "", "", "", ""] -atm_stashvar[35027] = ["V TENDENCY SPT INCREMENT", "", "", "", ""] -atm_stashvar[35028] = ["CFL criteria breached", "", "", "", ""] -atm_stashvar[35029] = ["T TENDENCY SPT INCREMENT", "", "", "", ""] -atm_stashvar[36001] = ["ATM TRACER 1 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36002] = ["ATM TRACER 2 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36003] = ["ATM TRACER 3 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36004] = ["ATM TRACER 4 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36005] = ["ATM TRACER 5 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36006] = ["ATM TRACER 6 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36007] = ["ATM TRACER 7 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36008] = ["ATM TRACER 8 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36009] = ["ATM TRACER 9 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36010] = ["ATM TRACER 10 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36011] = ["ATM TRACER 11 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36012] = ["ATM TRACER 12 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36013] = ["ATM TRACER 13 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36014] = ["ATM TRACER 14 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36015] = ["ATM TRACER 15 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36016] = ["ATM TRACER 16 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36017] = ["ATM TRACER 17 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36018] = ["ATM TRACER 18 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36019] = ["ATM TRACER 19 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36020] = ["ATM TRACER 20 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36021] = ["ATM TRACER 21 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36022] = ["ATM TRACER 22 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36023] = ["ATM TRACER 23 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36024] = ["ATM TRACER 24 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36025] = ["ATM TRACER 25 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36026] = ["ATM TRACER 26 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36027] = ["ATM TRACER 27 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36028] = ["ATM TRACER 28 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36029] = ["ATM TRACER 29 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36030] = ["ATM TRACER 30 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36031] = ["ATM TRACER 31 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36032] = ["ATM TRACER 32 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36033] = ["ATM TRACER 33 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36034] = ["ATM TRACER 34 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36035] = ["ATM TRACER 35 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36036] = ["ATM TRACER 36 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36037] = ["ATM TRACER 37 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36038] = ["ATM TRACER 38 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36039] = ["ATM TRACER 39 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36040] = ["ATM TRACER 40 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36041] = ["ATM TRACER 41 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36042] = ["ATM TRACER 42 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36043] = ["ATM TRACER 43 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36044] = ["ATM TRACER 44 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36045] = ["ATM TRACER 45 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36046] = ["ATM TRACER 46 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36047] = ["ATM TRACER 47 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36048] = ["ATM TRACER 48 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36049] = ["ATM TRACER 49 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36050] = ["ATM TRACER 50 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36051] = ["ATM TRACER 51 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36052] = ["ATM TRACER 52 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36053] = ["ATM TRACER 53 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36054] = ["ATM TRACER 54 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36055] = ["ATM TRACER 55 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36056] = ["ATM TRACER 56 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36057] = ["ATM TRACER 57 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36058] = ["ATM TRACER 58 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36059] = ["ATM TRACER 59 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36060] = ["ATM TRACER 60 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36061] = ["ATM TRACER 61 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36062] = ["ATM TRACER 62 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36063] = ["ATM TRACER 63 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36064] = ["ATM TRACER 64 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36065] = ["ATM TRACER 65 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36066] = ["ATM TRACER 66 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36067] = ["ATM TRACER 67 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36068] = ["ATM TRACER 68 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36069] = ["ATM TRACER 69 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36070] = ["ATM TRACER 70 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36071] = ["ATM TRACER 71 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36072] = ["ATM TRACER 72 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36073] = ["ATM TRACER 73 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36074] = ["ATM TRACER 74 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36075] = ["ATM TRACER 75 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36076] = ["ATM TRACER 76 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36077] = ["ATM TRACER 77 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36078] = ["ATM TRACER 78 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36079] = ["ATM TRACER 79 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36080] = ["ATM TRACER 80 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36081] = ["ATM TRACER 81 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36082] = ["ATM TRACER 82 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36083] = ["ATM TRACER 83 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36084] = ["ATM TRACER 84 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36085] = ["ATM TRACER 85 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36086] = ["ATM TRACER 86 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36087] = ["ATM TRACER 87 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36088] = ["ATM TRACER 88 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36089] = ["ATM TRACER 89 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36090] = ["ATM TRACER 90 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36091] = ["ATM TRACER 91 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36092] = ["ATM TRACER 92 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36093] = ["ATM TRACER 93 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36094] = ["ATM TRACER 94 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36095] = ["ATM TRACER 95 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36096] = ["ATM TRACER 96 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36097] = ["ATM TRACER 97 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36098] = ["ATM TRACER 98 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36099] = ["ATM TRACER 99 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36100] = ["ATM TRACER 100 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36101] = ["ATM TRACER 101 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36102] = ["ATM TRACER 102 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36103] = ["ATM TRACER 103 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36104] = ["ATM TRACER 104 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36105] = ["ATM TRACER 105 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36106] = ["ATM TRACER 106 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36107] = ["ATM TRACER 107 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36108] = ["ATM TRACER 108 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36109] = ["ATM TRACER 109 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36110] = ["ATM TRACER 110 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36111] = ["ATM TRACER 111 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36112] = ["ATM TRACER 112 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36113] = ["ATM TRACER 113 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36114] = ["ATM TRACER 114 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36115] = ["ATM TRACER 115 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36116] = ["ATM TRACER 116 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36117] = ["ATM TRACER 117 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36118] = ["ATM TRACER 118 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36119] = ["ATM TRACER 119 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36120] = ["ATM TRACER 120 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36121] = ["ATM TRACER 121 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36122] = ["ATM TRACER 122 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36123] = ["ATM TRACER 123 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36124] = ["ATM TRACER 124 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36125] = ["ATM TRACER 125 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36126] = ["ATM TRACER 126 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36127] = ["ATM TRACER 127 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36128] = ["ATM TRACER 128 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36129] = ["ATM TRACER 129 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36130] = ["ATM TRACER 130 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36131] = ["ATM TRACER 131 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36132] = ["ATM TRACER 132 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36133] = ["ATM TRACER 133 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36134] = ["ATM TRACER 134 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36135] = ["ATM TRACER 135 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36136] = ["ATM TRACER 136 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36137] = ["ATM TRACER 137 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36138] = ["ATM TRACER 138 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36139] = ["ATM TRACER 139 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36140] = ["ATM TRACER 140 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36141] = ["ATM TRACER 141 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36142] = ["ATM TRACER 142 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36143] = ["ATM TRACER 143 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36144] = ["ATM TRACER 144 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36145] = ["ATM TRACER 145 LATERAL BOUNDARY", "", "", "", ""] -atm_stashvar[36146] = ["ATM TRACER 146 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36147] = ["ATM TRACER 147 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36148] = ["ATM TRACER 148 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36149] = ["ATM TRACER 149 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36150] = ["ATM TRACER 150 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36257] = ["ATM TRACER 1 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36258] = ["ATM TRACER 2 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36259] = ["ATM TRACER 3 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36260] = ["ATM TRACER 4 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36261] = ["ATM TRACER 5 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36262] = ["ATM TRACER 6 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36263] = ["ATM TRACER 7 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36264] = ["ATM TRACER 8 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36265] = ["ATM TRACER 9 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36266] = ["ATM TRACER 10 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36267] = ["ATM TRACER 11 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36268] = ["ATM TRACER 12 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36269] = ["ATM TRACER 13 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36270] = ["ATM TRACER 14 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36271] = ["ATM TRACER 15 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36272] = ["ATM TRACER 16 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36273] = ["ATM TRACER 17 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36274] = ["ATM TRACER 18 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36275] = ["ATM TRACER 19 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36276] = ["ATM TRACER 20 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36277] = ["ATM TRACER 21 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36278] = ["ATM TRACER 22 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36279] = ["ATM TRACER 23 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36280] = ["ATM TRACER 24 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36281] = ["ATM TRACER 25 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36282] = ["ATM TRACER 26 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36283] = ["ATM TRACER 27 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36284] = ["ATM TRACER 28 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36285] = ["ATM TRACER 29 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36286] = ["ATM TRACER 30 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36287] = ["ATM TRACER 31 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36288] = ["ATM TRACER 32 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36289] = ["ATM TRACER 33 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36290] = ["ATM TRACER 34 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36291] = ["ATM TRACER 35 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36292] = ["ATM TRACER 36 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36293] = ["ATM TRACER 37 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36294] = ["ATM TRACER 38 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36295] = ["ATM TRACER 39 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36296] = ["ATM TRACER 40 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36297] = ["ATM TRACER 41 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36298] = ["ATM TRACER 42 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36299] = ["ATM TRACER 43 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36300] = ["ATM TRACER 44 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36301] = ["ATM TRACER 45 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36302] = ["ATM TRACER 46 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36303] = ["ATM TRACER 47 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36304] = ["ATM TRACER 48 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36305] = ["ATM TRACER 49 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36306] = ["ATM TRACER 50 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36307] = ["ATM TRACER 51 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36308] = ["ATM TRACER 52 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36309] = ["ATM TRACER 53 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36310] = ["ATM TRACER 54 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36311] = ["ATM TRACER 55 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36312] = ["ATM TRACER 56 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36313] = ["ATM TRACER 57 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36314] = ["ATM TRACER 58 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36315] = ["ATM TRACER 59 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36316] = ["ATM TRACER 60 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36317] = ["ATM TRACER 61 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36318] = ["ATM TRACER 62 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36319] = ["ATM TRACER 63 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36320] = ["ATM TRACER 64 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36321] = ["ATM TRACER 65 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36322] = ["ATM TRACER 66 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36323] = ["ATM TRACER 67 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36324] = ["ATM TRACER 68 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36325] = ["ATM TRACER 69 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36326] = ["ATM TRACER 70 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36327] = ["ATM TRACER 71 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36328] = ["ATM TRACER 72 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36329] = ["ATM TRACER 73 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36330] = ["ATM TRACER 74 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36331] = ["ATM TRACER 75 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36332] = ["ATM TRACER 76 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36333] = ["ATM TRACER 77 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36334] = ["ATM TRACER 78 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36335] = ["ATM TRACER 79 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36336] = ["ATM TRACER 80 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36337] = ["ATM TRACER 81 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36338] = ["ATM TRACER 82 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36339] = ["ATM TRACER 83 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36340] = ["ATM TRACER 84 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36341] = ["ATM TRACER 85 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36342] = ["ATM TRACER 86 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36343] = ["ATM TRACER 87 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36344] = ["ATM TRACER 88 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36345] = ["ATM TRACER 89 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36346] = ["ATM TRACER 90 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36347] = ["ATM TRACER 91 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36348] = ["ATM TRACER 92 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36349] = ["ATM TRACER 93 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36350] = ["ATM TRACER 94 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36351] = ["ATM TRACER 95 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36352] = ["ATM TRACER 96 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36353] = ["ATM TRACER 97 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36354] = ["ATM TRACER 98 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36355] = ["ATM TRACER 99 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36356] = ["ATM TRACER 100 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36357] = ["ATM TRACER 101 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36358] = ["ATM TRACER 102 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36359] = ["ATM TRACER 103 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36360] = ["ATM TRACER 104 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36361] = ["ATM TRACER 105 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36362] = ["ATM TRACER 106 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36363] = ["ATM TRACER 107 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36364] = ["ATM TRACER 108 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36365] = ["ATM TRACER 109 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36366] = ["ATM TRACER 110 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36367] = ["ATM TRACER 111 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36368] = ["ATM TRACER 112 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36369] = ["ATM TRACER 113 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36370] = ["ATM TRACER 114 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36371] = ["ATM TRACER 115 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36372] = ["ATM TRACER 116 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36373] = ["ATM TRACER 117 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36374] = ["ATM TRACER 118 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36375] = ["ATM TRACER 119 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36376] = ["ATM TRACER 120 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36377] = ["ATM TRACER 121 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36378] = ["ATM TRACER 122 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36379] = ["ATM TRACER 123 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36380] = ["ATM TRACER 124 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36381] = ["ATM TRACER 125 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36382] = ["ATM TRACER 126 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36383] = ["ATM TRACER 127 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36384] = ["ATM TRACER 128 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36385] = ["ATM TRACER 129 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36386] = ["ATM TRACER 130 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36387] = ["ATM TRACER 131 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36388] = ["ATM TRACER 132 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36389] = ["ATM TRACER 133 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36390] = ["ATM TRACER 134 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36391] = ["ATM TRACER 135 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36392] = ["ATM TRACER 136 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36393] = ["ATM TRACER 137 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36394] = ["ATM TRACER 138 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36395] = ["ATM TRACER 139 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36396] = ["ATM TRACER 140 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36397] = ["ATM TRACER 141 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36398] = ["ATM TRACER 142 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36399] = ["ATM TRACER 143 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36400] = ["ATM TRACER 144 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36401] = ["ATM TRACER 145 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36402] = ["ATM TRACER 146 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36403] = ["ATM TRACER 147 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36404] = ["ATM TRACER 148 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36405] = ["ATM TRACER 149 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36406] = ["ATM TRACER 150 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37001] = ["UKCA TRACER 1 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37002] = ["UKCA TRACER 2 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37003] = ["UKCA TRACER 3 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37004] = ["UKCA TRACER 4 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37005] = ["UKCA TRACER 5 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37006] = ["UKCA TRACER 6 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37007] = ["UKCA TRACER 7 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37008] = ["UKCA TRACER 8 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37009] = ["UKCA TRACER 9 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37010] = ["UKCA TRACER 10 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37011] = ["UKCA TRACER 11 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37012] = ["UKCA TRACER 12 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37013] = ["UKCA TRACER 13 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37014] = ["UKCA TRACER 14 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37015] = ["UKCA TRACER 15 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37016] = ["UKCA TRACER 16 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37017] = ["UKCA TRACER 17 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37018] = ["UKCA TRACER 18 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37019] = ["UKCA TRACER 19 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37020] = ["UKCA TRACER 20 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37021] = ["UKCA TRACER 21 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37022] = ["UKCA TRACER 22 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37023] = ["UKCA TRACER 23 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37024] = ["UKCA TRACER 24 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37025] = ["UKCA TRACER 25 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37026] = ["UKCA TRACER 26 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37027] = ["UKCA TRACER 27 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37028] = ["UKCA TRACER 28 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37029] = ["UKCA TRACER 29 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37030] = ["UKCA TRACER 30 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37031] = ["UKCA TRACER 31 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37032] = ["UKCA TRACER 32 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37033] = ["UKCA TRACER 33 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37034] = ["UKCA TRACER 34 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37035] = ["UKCA TRACER 35 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37036] = ["UKCA TRACER 36 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37037] = ["UKCA TRACER 37 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37038] = ["UKCA TRACER 38 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37039] = ["UKCA TRACER 39 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37040] = ["UKCA TRACER 40 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37041] = ["UKCA TRACER 41 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37042] = ["UKCA TRACER 42 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37043] = ["UKCA TRACER 43 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37044] = ["UKCA TRACER 44 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37045] = ["UKCA TRACER 45 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37046] = ["UKCA TRACER 46 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37047] = ["UKCA TRACER 47 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37048] = ["UKCA TRACER 48 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37049] = ["UKCA TRACER 49 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37050] = ["UKCA TRACER 50 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37051] = ["UKCA TRACER 51 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37052] = ["UKCA TRACER 52 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37053] = ["UKCA TRACER 53 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37054] = ["UKCA TRACER 54 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37055] = ["UKCA TRACER 55 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37056] = ["UKCA TRACER 56 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37057] = ["UKCA TRACER 57 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37058] = ["UKCA TRACER 58 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37059] = ["UKCA TRACER 59 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37060] = ["UKCA TRACER 60 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37061] = ["UKCA TRACER 61 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37062] = ["UKCA TRACER 62 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37063] = ["UKCA TRACER 63 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37064] = ["UKCA TRACER 64 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37065] = ["UKCA TRACER 65 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37066] = ["UKCA TRACER 66 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37067] = ["UKCA TRACER 67 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37068] = ["UKCA TRACER 68 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37069] = ["UKCA TRACER 69 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37070] = ["UKCA TRACER 70 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37071] = ["UKCA TRACER 71 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37072] = ["UKCA TRACER 72 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37073] = ["UKCA TRACER 73 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37074] = ["UKCA TRACER 74 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37075] = ["UKCA TRACER 75 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37076] = ["UKCA TRACER 76 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37077] = ["UKCA TRACER 77 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37078] = ["UKCA TRACER 78 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37079] = ["UKCA TRACER 79 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37080] = ["UKCA TRACER 80 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37081] = ["UKCA TRACER 81 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37082] = ["UKCA TRACER 82 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37083] = ["UKCA TRACER 83 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37084] = ["UKCA TRACER 84 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37085] = ["UKCA TRACER 85 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37086] = ["UKCA TRACER 86 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37087] = ["UKCA TRACER 87 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37088] = ["UKCA TRACER 88 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37089] = ["UKCA TRACER 89 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37090] = ["UKCA TRACER 90 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37091] = ["UKCA TRACER 91 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37092] = ["UKCA TRACER 92 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37093] = ["UKCA TRACER 93 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37094] = ["UKCA TRACER 94 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37095] = ["UKCA TRACER 95 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37096] = ["UKCA TRACER 96 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37097] = ["UKCA TRACER 97 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37098] = ["UKCA TRACER 98 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37099] = ["UKCA TRACER 99 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37100] = ["UKCA TRACER 100 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37101] = ["UKCA TRACER 101 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37102] = ["UKCA TRACER 102 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37103] = ["UKCA TRACER 103 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37104] = ["UKCA TRACER 104 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37105] = ["UKCA TRACER 105 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37106] = ["UKCA TRACER 106 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37107] = ["UKCA TRACER 107 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37108] = ["UKCA TRACER 108 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37109] = ["UKCA TRACER 109 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37110] = ["UKCA TRACER 110 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37111] = ["UKCA TRACER 111 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37112] = ["UKCA TRACER 112 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37113] = ["UKCA TRACER 113 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37114] = ["UKCA TRACER 114 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37115] = ["UKCA TRACER 115 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37116] = ["UKCA TRACER 116 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37117] = ["UKCA TRACER 117 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37118] = ["UKCA TRACER 118 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37119] = ["UKCA TRACER 119 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37120] = ["UKCA TRACER 120 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37121] = ["UKCA TRACER 121 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37122] = ["UKCA TRACER 122 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37123] = ["UKCA TRACER 123 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37124] = ["UKCA TRACER 124 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37125] = ["UKCA TRACER 125 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37126] = ["UKCA TRACER 126 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37127] = ["UKCA TRACER 127 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37128] = ["UKCA TRACER 128 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37129] = ["UKCA TRACER 129 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37130] = ["UKCA TRACER 130 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37131] = ["UKCA TRACER 131 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37132] = ["UKCA TRACER 132 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37133] = ["UKCA TRACER 133 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37134] = ["UKCA TRACER 134 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37135] = ["UKCA TRACER 135 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37136] = ["UKCA TRACER 136 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37137] = ["UKCA TRACER 137 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37138] = ["UKCA TRACER 138 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37139] = ["UKCA TRACER 139 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37140] = ["UKCA TRACER 140 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37141] = ["UKCA TRACER 141 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37142] = ["UKCA TRACER 142 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37143] = ["UKCA TRACER 143 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37144] = ["UKCA TRACER 144 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37145] = ["UKCA TRACER 145 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37146] = ["UKCA TRACER 146 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37147] = ["UKCA TRACER 147 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37148] = ["UKCA TRACER 148 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37149] = ["UKCA TRACER 149 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37150] = ["UKCA TRACER 150 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37257] = ["UKCA TRACER 1 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37258] = ["UKCA TRACER 2 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37259] = ["UKCA TRACER 3 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37260] = ["UKCA TRACER 4 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37261] = ["UKCA TRACER 5 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37262] = ["UKCA TRACER 6 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37263] = ["UKCA TRACER 7 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37264] = ["UKCA TRACER 8 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37265] = ["UKCA TRACER 9 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37266] = ["UKCA TRACER 10 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37267] = ["UKCA TRACER 11 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37268] = ["UKCA TRACER 12 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37269] = ["UKCA TRACER 13 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37270] = ["UKCA TRACER 14 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37271] = ["UKCA TRACER 15 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37272] = ["UKCA TRACER 16 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37273] = ["UKCA TRACER 17 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37274] = ["UKCA TRACER 18 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37275] = ["UKCA TRACER 19 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37276] = ["UKCA TRACER 20 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37277] = ["UKCA TRACER 21 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37278] = ["UKCA TRACER 22 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37279] = ["UKCA TRACER 23 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37280] = ["UKCA TRACER 24 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37281] = ["UKCA TRACER 25 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37282] = ["UKCA TRACER 26 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37283] = ["UKCA TRACER 27 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37284] = ["UKCA TRACER 28 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37285] = ["UKCA TRACER 29 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37286] = ["UKCA TRACER 30 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37287] = ["UKCA TRACER 31 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37288] = ["UKCA TRACER 32 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37289] = ["UKCA TRACER 33 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37290] = ["UKCA TRACER 34 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37291] = ["UKCA TRACER 35 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37292] = ["UKCA TRACER 36 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37293] = ["UKCA TRACER 37 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37294] = ["UKCA TRACER 38 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37295] = ["UKCA TRACER 39 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37296] = ["UKCA TRACER 40 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37297] = ["UKCA TRACER 41 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37298] = ["UKCA TRACER 42 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37299] = ["UKCA TRACER 43 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37300] = ["UKCA TRACER 44 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37301] = ["UKCA TRACER 45 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37302] = ["UKCA TRACER 46 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37303] = ["UKCA TRACER 47 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37304] = ["UKCA TRACER 48 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37305] = ["UKCA TRACER 49 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37306] = ["UKCA TRACER 50 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37307] = ["UKCA TRACER 51 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37308] = ["UKCA TRACER 52 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37309] = ["UKCA TRACER 53 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37310] = ["UKCA TRACER 54 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37311] = ["UKCA TRACER 55 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37312] = ["UKCA TRACER 56 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37313] = ["UKCA TRACER 57 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37314] = ["UKCA TRACER 58 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37315] = ["UKCA TRACER 59 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37316] = ["UKCA TRACER 60 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37317] = ["UKCA TRACER 61 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37318] = ["UKCA TRACER 62 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37319] = ["UKCA TRACER 63 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37320] = ["UKCA TRACER 64 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37321] = ["UKCA TRACER 65 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37322] = ["UKCA TRACER 66 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37323] = ["UKCA TRACER 67 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37324] = ["UKCA TRACER 68 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37325] = ["UKCA TRACER 69 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37326] = ["UKCA TRACER 70 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37327] = ["UKCA TRACER 71 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37328] = ["UKCA TRACER 72 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37329] = ["UKCA TRACER 73 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37330] = ["UKCA TRACER 74 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37331] = ["UKCA TRACER 75 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37332] = ["UKCA TRACER 76 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37333] = ["UKCA TRACER 77 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37334] = ["UKCA TRACER 78 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37335] = ["UKCA TRACER 79 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37336] = ["UKCA TRACER 80 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37337] = ["UKCA TRACER 81 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37338] = ["UKCA TRACER 82 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37339] = ["UKCA TRACER 83 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37340] = ["UKCA TRACER 84 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37341] = ["UKCA TRACER 85 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37342] = ["UKCA TRACER 86 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37343] = ["UKCA TRACER 87 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37344] = ["UKCA TRACER 88 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37345] = ["UKCA TRACER 89 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37346] = ["UKCA TRACER 90 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37347] = ["UKCA TRACER 91 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37348] = ["UKCA TRACER 92 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37349] = ["UKCA TRACER 93 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37350] = ["UKCA TRACER 94 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37351] = ["UKCA TRACER 95 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37352] = ["UKCA TRACER 96 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37353] = ["UKCA TRACER 97 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37354] = ["UKCA TRACER 98 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37355] = ["UKCA TRACER 99 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37356] = ["UKCA TRACER 100 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37357] = ["UKCA TRACER 101 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37358] = ["UKCA TRACER 102 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37359] = ["UKCA TRACER 103 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37360] = ["UKCA TRACER 104 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37361] = ["UKCA TRACER 105 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37362] = ["UKCA TRACER 106 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37363] = ["UKCA TRACER 107 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37364] = ["UKCA TRACER 108 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37365] = ["UKCA TRACER 109 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37366] = ["UKCA TRACER 110 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37367] = ["UKCA TRACER 111 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37368] = ["UKCA TRACER 112 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37369] = ["UKCA TRACER 113 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37370] = ["UKCA TRACER 114 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37371] = ["UKCA TRACER 115 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37372] = ["UKCA TRACER 116 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37373] = ["UKCA TRACER 117 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37374] = ["UKCA TRACER 118 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37375] = ["UKCA TRACER 119 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37376] = ["UKCA TRACER 120 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37377] = ["UKCA TRACER 121 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37378] = ["UKCA TRACER 122 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37379] = ["UKCA TRACER 123 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37380] = ["UKCA TRACER 124 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37381] = ["UKCA TRACER 125 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37382] = ["UKCA TRACER 126 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37383] = ["UKCA TRACER 127 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37384] = ["UKCA TRACER 128 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37385] = ["UKCA TRACER 129 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37386] = ["UKCA TRACER 130 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37387] = ["UKCA TRACER 131 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37388] = ["UKCA TRACER 132 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37389] = ["UKCA TRACER 133 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37390] = ["UKCA TRACER 134 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37391] = ["UKCA TRACER 135 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37392] = ["UKCA TRACER 136 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37393] = ["UKCA TRACER 137 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37394] = ["UKCA TRACER 138 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37395] = ["UKCA TRACER 139 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37396] = ["UKCA TRACER 140 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37397] = ["UKCA TRACER 141 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37398] = ["UKCA TRACER 142 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37399] = ["UKCA TRACER 143 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37400] = ["UKCA TRACER 144 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37401] = ["UKCA TRACER 145 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37402] = ["UKCA TRACER 146 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37403] = ["UKCA TRACER 147 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37404] = ["UKCA TRACER 148 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37405] = ["UKCA TRACER 149 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37406] = ["UKCA TRACER 150 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[38201] = ["PRIMARY H2SO4 TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38202] = ["PRIMARY H2SO4 TO ACCUMULATION (SOL)", "", "", "", ""] -atm_stashvar[38203] = ["PRIMARY H2SO4 TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38204] = ["PRIMARY SEA-SALT TO ACCUMULTN (SOL)", "", "", "", ""] -atm_stashvar[38205] = ["PRIMARY SEA-SALT TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38206] = ["PRIMARY BLACK CARBON TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38207] = ["PRIMARY BLACK CARBON TO AITKEN (INS)", "", "", "", ""] -atm_stashvar[38208] = ["PRIMARY OM TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38209] = ["PRIMARY OM TO AITKEN (INS)", "", "", "", ""] -atm_stashvar[38210] = ["PRIMARY DUST TO ACCUMULATION (SOL)", "", "", "", ""] -atm_stashvar[38211] = ["PRIMARY DUST TO ACCUMULATION (INS)", "", "", "", ""] -atm_stashvar[38212] = ["PRIMARY DUST TO COARSE (SOLUBLE)", "", "", "", ""] -atm_stashvar[38213] = ["PRIMARY DUST TO COARSE (INSOLUBLE)", "", "", "", ""] -atm_stashvar[38214] = ["DRY DEPOSITION H2SO4 NUCLN. (SOL)", "", "", "", ""] -atm_stashvar[38215] = ["DRY DEPOSITION H2SO4 AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38216] = ["DRY DEPOSITION H2SO4 ACCUMULTN (SOL)", "", "", "", ""] -atm_stashvar[38217] = ["DRY DEPOSITION H2SO4 COARSE (SOL)", "", "", "", ""] -atm_stashvar[38218] = ["DRY DEPOSITION SEA-SALT ACC (SOL)", "", "", "", ""] -atm_stashvar[38219] = ["DRY DEPOSITION SEA-SALT COARSE (SOL)", "", "", "", ""] -atm_stashvar[38220] = ["DRY DEPOSITION BLK CARB AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38221] = ["DRY DEPOSITION BLK CARB ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38222] = ["DRY DEPOSITION BLK CARB COARSE (SOL)", "", "", "", ""] -atm_stashvar[38223] = ["DRY DEPOSITION BLK CARB AITKEN (INS)", "", "", "", ""] -atm_stashvar[38224] = ["DRY DEPOSITION OM NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38225] = ["DRY DEPOSITION OM AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38226] = ["DRY DEPOSITION OM ACCUMULATION (SOL)", "", "", "", ""] -atm_stashvar[38227] = ["DRY DEPOSITION OM COARSE (SOL)", "", "", "", ""] -atm_stashvar[38228] = ["DRY DEPOSITION OM AITKEN (INS)", "", "", "", ""] -atm_stashvar[38229] = ["DRY DEPOSITION OM2 NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38230] = ["DRY DEPOSITION OM2 AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38231] = ["DRY DEPOSITION OM2 ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38232] = ["DRY DEPOSITION OM2 COARSE (SOL)", "", "", "", ""] -atm_stashvar[38233] = ["DRY DEPOSITION DUST ACCUMULATN (SOL)", "", "", "", ""] -atm_stashvar[38234] = ["DRY DEPOSITION DUST COARSE (SOL)", "", "", "", ""] -atm_stashvar[38235] = ["DRY DEPOSITION DUST ACCUMULATN (INS)", "", "", "", ""] -atm_stashvar[38236] = ["DRY DEPOSITION DUST COARSE (INS)", "", "", "", ""] -atm_stashvar[38237] = ["NUC SCAVENGING H2SO4 NUCLN. (SOL)", "", "", "", ""] -atm_stashvar[38238] = ["NUC SCAVENGING H2SO4 AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38239] = ["NUC SCAVENGING H2SO4 ACCUMULTN (SOL)", "", "", "", ""] -atm_stashvar[38240] = ["NUC SCAVENGING H2SO4 COARSE (SOL)", "", "", "", ""] -atm_stashvar[38241] = ["NUC SCAVENGING SEA-SALT ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38242] = ["NUC SCAVENGING SEA-SALT COARSE (SOL)", "", "", "", ""] -atm_stashvar[38243] = ["NUC SCAVENGING BLK CARB AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38244] = ["NUC SCAVENGING BLK CARB ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38245] = ["NUC SCAVENGING BLK CARB COARSE (SOL)", "", "", "", ""] -atm_stashvar[38246] = ["NUC SCAVENGING BLK CARB AITKEN (INS)", "", "", "", ""] -atm_stashvar[38247] = ["NUC SCAVENGING OM NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38248] = ["NUC SCAVENGING OM AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38249] = ["NUC SCAVENGING OM ACCUMULATION (SOL)", "", "", "", ""] -atm_stashvar[38250] = ["NUC SCAVENGING OM COARSE (SOL)", "", "", "", ""] -atm_stashvar[38251] = ["NUC SCAVENGING OM AITKEN (INS)", "", "", "", ""] -atm_stashvar[38252] = ["NUC SCAVENGING OM2 NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38253] = ["NUC SCAVENGING OM2 AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38254] = ["NUC SCAVENGING OM2 ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38255] = ["NUC SCAVENGING OM2 COARSE (SOL)", "", "", "", ""] -atm_stashvar[38257] = ["NUC SCAVENGING DUST ACCUMULTN. (SOL)", "", "", "", ""] -atm_stashvar[38258] = ["NUC SCAVENGING DUST COARSE (SOL)", "", "", "", ""] -atm_stashvar[38259] = ["NUC SCAVENGING DUST ACCUMULTN. (INS)", "", "", "", ""] -atm_stashvar[38260] = ["NUC SCAVENGING DUST COARSE (INS)", "", "", "", ""] -atm_stashvar[38261] = ["IMP SCAVENGING H2SO4 NUCLN. (SOL)", "", "", "", ""] -atm_stashvar[38262] = ["IMP SCAVENGING H2SO4 AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38263] = ["IMP SCAVENGING H2SO4 ACCUMULTN (SOL)", "", "", "", ""] -atm_stashvar[38264] = ["IMP SCAVENGING H2SO4 COARSE (SOL)", "", "", "", ""] -atm_stashvar[38265] = ["IMP SCAVENGING SEA-SALT ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38266] = ["IMP SCAVENGING SEA-SALT COARSE (SOL)", "", "", "", ""] -atm_stashvar[38267] = ["IMP SCAVENGING BLK CARB AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38268] = ["IMP SCAVENGING BLK CARB ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38269] = ["IMP SCAVENGING BLK CARB COARSE (SOL)", "", "", "", ""] -atm_stashvar[38270] = ["IMP SCAVENGING BLK CARB AITKEN (INS)", "", "", "", ""] -atm_stashvar[38271] = ["IMP SCAVENGING OM NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38272] = ["IMP SCAVENGING OM AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38273] = ["IMP SCAVENGING OM ACCUMULATION (SOL)", "", "", "", ""] -atm_stashvar[38274] = ["IMP SCAVENGING OM COARSE (SOL)", "", "", "", ""] -atm_stashvar[38275] = ["IMP SCAVENGING OM AITKEN (INS)", "", "", "", ""] -atm_stashvar[38276] = ["IMP SCAVENGING OM2 NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38277] = ["IMP SCAVENGING OM2 AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38278] = ["IMP SCAVENGING OM2 ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38279] = ["IMP SCAVENGING OM2 COARSE (SOL)", "", "", "", ""] -atm_stashvar[38280] = ["IMP SCAVENGING DUST ACCUMULTN. (SOL)", "", "", "", ""] -atm_stashvar[38281] = ["IMP SCAVENGING DUST COARSE (SOL)", "", "", "", ""] -atm_stashvar[38282] = ["IMP SCAVENGING DUST ACCUMULTN. (INS)", "", "", "", ""] -atm_stashvar[38283] = ["IMP SCAVENGING DUST COARSE (INS)", "", "", "", ""] -atm_stashvar[38284] = ["INCLOUD H2SO4 (H2O2) TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38285] = ["INCLOUD H2SO4 (H2O2) TO ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38286] = ["INCLOUD H2SO4 (H2O2) TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38287] = ["INCLOUD H2SO4 (O3) TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38288] = ["INCLOUD H2SO4 (O3) TO ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38289] = ["INCLOUD H2SO4 (O3) TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38290] = ["CLOUDPROC H2SO4 AITSOL --> ACCSOL", "", "", "", ""] -atm_stashvar[38291] = ["CLOUDPROC BC AITSOL --> ACCSOL", "", "", "", ""] -atm_stashvar[38292] = ["CLOUDPROC OM AITSOL --> ACCSOL", "", "", "", ""] -atm_stashvar[38293] = ["CLOUDPROC OM2 AITSOL --> ACCSOL", "", "", "", ""] -atm_stashvar[38294] = ["CONDENSATION H2SO4 TO NUCLN. (SOL)", "", "", "", ""] -atm_stashvar[38295] = ["CONDENSATION H2SO4 TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38296] = ["CONDENSATION H2SO4 TO ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38297] = ["CONDENSATION H2SO4 TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38298] = ["CONDENSATION H2SO4 TO AITKEN (INSOL)", "", "", "", ""] -atm_stashvar[38299] = ["CONDENSATION H2SO4 TO ACCUM. (INSOL)", "", "", "", ""] -atm_stashvar[38300] = ["CONDENSATION H2SO4 TO COARSE (INSOL)", "", "", "", ""] -atm_stashvar[38301] = ["CONDENSATION OM1 TO NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38302] = ["CONDENSATION OM1 TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38303] = ["CONDENSATION OM1 TO ACCUMULTN (SOL)", "", "", "", ""] -atm_stashvar[38304] = ["CONDENSATION OM1 TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38305] = ["CONDENSATION OM1 TO AITKEN (INSOL)", "", "", "", ""] -atm_stashvar[38306] = ["CONDENSATION OM1 TO ACCUM. (INSOL)", "", "", "", ""] -atm_stashvar[38307] = ["CONDENSATION OM1 TO COARSE (INSOL)", "", "", "", ""] -atm_stashvar[38308] = ["CONDENSATION OM2 TO NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38309] = ["CONDENSATION OM2 TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38310] = ["CONDENSATION OM2 TO ACCUMULTN (SOL)", "", "", "", ""] -atm_stashvar[38311] = ["CONDENSATION OM2 TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38312] = ["CONDENSATION OM2 TO AITKEN (INSOL)", "", "", "", ""] -atm_stashvar[38313] = ["CONDENSATION OM2 TO ACCUM. (INSOL)", "", "", "", ""] -atm_stashvar[38314] = ["CONDENSATION OM2 TO COARSE (INSOL)", "", "", "", ""] -atm_stashvar[38315] = ["HETOX ON DUST {SO2 -> SO4} (ACC-SOL)", "", "", "", ""] -atm_stashvar[38316] = ["HETOX ON DUST {SO2 -> SO4} (COR-SOL)", "", "", "", ""] -atm_stashvar[38317] = ["HETOX ON DUST {SO2 -> SO4} (ACC-INS)", "", "", "", ""] -atm_stashvar[38318] = ["HETOX ON DUST {SO2 -> SO4} (COR-INS)", "", "", "", ""] -atm_stashvar[38319] = ["NUCLEATION OF H2SO4 (TO NUC-SOL)", "", "", "", ""] -atm_stashvar[38320] = ["COAG H2SO4 NUCLTN-SOL TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38321] = ["COAG H2SO4 NUCLTN-SOL TO ACCUM.-SOL", "", "", "", ""] -atm_stashvar[38322] = ["COAG H2SO4 NUCLTN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38323] = ["COAG H2SO4 NUCLTN-SOL TO AITKEN-INS", "", "", "", ""] -atm_stashvar[38324] = ["COAG H2SO4 NUCLTN-SOL TO ACCUM.-INS", "", "", "", ""] -atm_stashvar[38325] = ["COAG H2SO4 NUCLTN-SOL TO COARSE-INS", "", "", "", ""] -atm_stashvar[38326] = ["COAG OM1 NUCLTN-SOL TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38327] = ["COAG OM1 NUCLTN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38328] = ["COAG OM1 NUCLTN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38329] = ["COAG OM1 NUCLTN-SOL TO AITKEN-INSOL", "", "", "", ""] -atm_stashvar[38330] = ["COAG OM1 NUCLTN-SOL TO ACCUM.-INSOL", "", "", "", ""] -atm_stashvar[38331] = ["COAG OM1 NUCLTN-SOL TO COARSE-INSOL", "", "", "", ""] -atm_stashvar[38332] = ["COAG OM2 NUCLTN-SOL TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38333] = ["COAG OM2 NUCLTN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38334] = ["COAG OM2 NUCLTN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38335] = ["COAG OM2 NUCLTN-SOL TO AITKEN-INSOL", "", "", "", ""] -atm_stashvar[38336] = ["COAG OM2 NUCLTN-SOL TO ACCUM.-INSOL", "", "", "", ""] -atm_stashvar[38337] = ["COAG OM2 NUCLTN-SOL TO COARSE-INSOL", "", "", "", ""] -atm_stashvar[38338] = ["COAG H2SO4 AITKEN-SOL TO ACCUM.-SOL", "", "", "", ""] -atm_stashvar[38339] = ["COAG H2SO4 AITKEN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38342] = ["COAG BC AITKEN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38343] = ["COAG BC AITKEN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38346] = ["COAG OM1 AITKEN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38347] = ["COAG OM1 AITKEN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38350] = ["COAG OM2 AITKEN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38351] = ["COAG OM2 AITKEN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38354] = ["COAG H2SO4 ACCUM.-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38356] = ["COAG BC ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38358] = ["COAG OM1 ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38360] = ["COAG SEA-SALT ACC-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38362] = ["COAG OM2 ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38364] = ["COAG DU ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38366] = ["COAG BC AITKEN-INS TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38367] = ["COAG OM1 AITKEN-INS TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38368] = ["COAG BC AITKEN-INS TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38369] = ["COAG OM1 AITKEN-INS TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38370] = ["COAG DU ACCUM.-INS TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38371] = ["AGEING H2SO4 AITKEN-INS TO AIT.-SOL", "", "", "", ""] -atm_stashvar[38372] = ["AGEING BC AITKEN-INS TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38373] = ["AGEING OM1 AITKEN-INS TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38374] = ["AGEING OM2 AITKEN-INS TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38375] = ["MERGE H2SO4 NUCLTN-SOL TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38376] = ["MERGE OM1 NUCLTN-SOL TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38377] = ["MERGE OM2 NUCLTN-SOL TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38378] = ["MERGE H2SO4 AITKEN-SOL TO ACCUM.-SOL", "", "", "", ""] -atm_stashvar[38379] = ["MERGE BC AITKEN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38380] = ["MERGE OM1 AITKEN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38381] = ["MERGE OM2 AITKEN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38382] = ["MERGE H2SO4 ACCUM.-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38383] = ["MERGE SEA_SALT ACC-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38384] = ["MERGE BC ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38385] = ["MERGE OM1 ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38386] = ["MERGE DU ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38387] = ["MERGE OM2 ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38401] = ["DRY PARTICLE DIAMETER NUCLEATION-SOL", "", "", "", ""] -atm_stashvar[38402] = ["DRY PARTICLE DIAMETER AITKEN-SOL", "", "", "", ""] -atm_stashvar[38403] = ["DRY PARTICLE DIAMETER ACCUMULATN-SOL", "", "", "", ""] -atm_stashvar[38404] = ["DRY PARTICLE DIAMETER COARSE-SOL", "", "", "", ""] -atm_stashvar[38405] = ["DRY PARTICLE DIAMETER AITKEN-INS", "", "", "", ""] -atm_stashvar[38406] = ["DRY PARTICLE DIAMETER ACCUMULATN-INS", "", "", "", ""] -atm_stashvar[38407] = ["DRY PARTICLE DIAMETER COARSE-INS", "", "", "", ""] -atm_stashvar[38408] = ["WET PARTICLE DIAMETER NUCLEATION-SOL", "", "", "", ""] -atm_stashvar[38409] = ["WET PARTICLE DIAMETER AITKEN-SOL", "", "", "", ""] -atm_stashvar[38410] = ["WET PARTICLE DIAMETER ACCUMULATN-SOL", "", "", "", ""] -atm_stashvar[38411] = ["WET PARTICLE DIAMETER COARSE-SOL", "", "", "", ""] -atm_stashvar[38412] = ["WATER CONTENT FOR NUCLEATION-SOLUBLE", "", "", "", ""] -atm_stashvar[38413] = ["WATER CONTENT FOR AITKEN -SOLUBLE", "", "", "", ""] -atm_stashvar[38414] = ["WATER CONTENT FOR ACCUMULTN.-SOLUBLE", "", "", "", ""] -atm_stashvar[38415] = ["WATER CONTENT FOR COARSE -SOLUBLE", "", "", "", ""] -atm_stashvar[38416] = ["SURFACE AREA CONC NUCLN.-SOL (WET)", "", "", "", ""] -atm_stashvar[38417] = ["SURFACE AREA CONC AITKEN-SOL (WET)", "", "", "", ""] -atm_stashvar[38418] = ["SURFACE AREA CONC ACCUM.-SOL (WET)", "", "", "", ""] -atm_stashvar[38419] = ["SURFACE AREA CONC COARSE-SOL (WET)", "", "", "", ""] -atm_stashvar[38420] = ["SURFACE AREA CONC AITKEN-INS", "", "", "", ""] -atm_stashvar[38421] = ["SURFACE AREA CONC ACCUM.-INS", "", "", "", ""] -atm_stashvar[38422] = ["SURFACE AREA CONC COARSE-INS", "", "", "", ""] -atm_stashvar[38423] = ["VOLUME CONCENTRN. NUCLN.-SOL (WET)", "", "", "", ""] -atm_stashvar[38424] = ["VOLUME CONCENTRN. AITKEN-SOL (WET)", "", "", "", ""] -atm_stashvar[38425] = ["VOLUME CONCENTRN. ACCUM.-SOL (WET)", "", "", "", ""] -atm_stashvar[38426] = ["VOLUME CONCENTRN. COARSE-SOL (WET)", "", "", "", ""] -atm_stashvar[38427] = ["VOLUME CONCENTRN. AITKEN-INS", "", "", "", ""] -atm_stashvar[38428] = ["VOLUME CONCENTRN. ACCUM.-INS", "", "", "", ""] -atm_stashvar[38429] = ["VOLUME CONCENTRN. COARSE-INS", "", "", "", ""] -atm_stashvar[38430] = ["PTCL MASS DENSITY NUCLN.-SOL (WET)", "", "", "", ""] -atm_stashvar[38431] = ["PTCL MASS DENSITY AITKEN-SOL (WET)", "", "", "", ""] -atm_stashvar[38432] = ["PTCL MASS DENSITY ACCUM.-SOL (WET)", "", "", "", ""] -atm_stashvar[38433] = ["PTCL MASS DENSITY COARSE-SOL (WET)", "", "", "", ""] -atm_stashvar[38434] = ["PTCL MASS DENSITY AITKEN-INS", "", "", "", ""] -atm_stashvar[38435] = ["PTCL MASS DENSITY ACCUM.-INS", "", "", "", ""] -atm_stashvar[38436] = ["PTCL MASS DENSITY COARSE-INS", "", "", "", ""] -atm_stashvar[38437] = ["CN NUMBER CONCENTRATION", "", "", "", ""] -atm_stashvar[38438] = ["CCN NO. CONCENTRN. (ACC+COR)", "", "", "", ""] -atm_stashvar[38439] = ["CCN NO. CONCENTRN. (ACC+COR+AIT>25r)", "", "", "", ""] -atm_stashvar[38440] = ["CCN NO. CONCENTRN. (ACC+COR+AIT>35r)", "", "", "", ""] -atm_stashvar[38441] = ["CD NUMBER CONCENTRATION", "", "", "", ""] -atm_stashvar[38442] = ["H2SO4 PARTIAL VOLUME CONC (NUC-SOL)", "", "", "", ""] -atm_stashvar[38443] = ["OM1 PARTIAL VOLUME CONC (NUC-SOL)", "", "", "", ""] -atm_stashvar[38444] = ["OM2 PARTIAL VOLUME CONC (NUC-SOL)", "", "", "", ""] -atm_stashvar[38445] = ["H2O PARTIAL VOLUME CONC (NUC-SOL)", "", "", "", ""] -atm_stashvar[38446] = ["H2SO4 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[38447] = ["BC PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[38448] = ["OM1 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[38449] = ["OM2 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[38450] = ["H2O PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[38451] = ["H2SO4 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38452] = ["BC PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38453] = ["OM1 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38454] = ["SS PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38455] = ["DU PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38456] = ["OM2 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38457] = ["H2O PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38458] = ["H2SO4 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38459] = ["BC PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38460] = ["OM1 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38461] = ["SSALT PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38462] = ["DU PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38463] = ["OM2 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38464] = ["H2O PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38465] = ["BC PARTIAL VOLUME CONC (AIT-INS)", "", "", "", ""] -atm_stashvar[38466] = ["OM1 PARTIAL VOLUME CONC (AIT-INS)", "", "", "", ""] -atm_stashvar[38467] = ["DU PARTIAL VOLUME CONC (ACC-INS)", "", "", "", ""] -atm_stashvar[38468] = ["DU PARTIAL VOLUME CONC (COR-INS)", "", "", "", ""] -atm_stashvar[38469] = ["ACTIVE CLOUD DROP NO CONC (NUC-SOL)", "", "", "", ""] -atm_stashvar[38470] = ["ACTIVE CLOUD DROP NO CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[38471] = ["ACTIVE CLOUD DROP NO CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38472] = ["ACTIVE CLOUD DROP NO CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38473] = ["Maximum Supersaturation (percent)", "", "", "", ""] -atm_stashvar[38474] = ["Cloud base for aerosol activation", "", "", "", ""] -atm_stashvar[38475] = ["Sigmaw Updraught Velocity", "", "", "", ""] -atm_stashvar[38476] = ["CLOUD LIQUID FRACTION", "", "", "", ""] -atm_stashvar[38477] = ["TOTAL CDNC * CLOUD LIQ FRACTION", "", "", "", ""] -atm_stashvar[38478] = ["CLOUD FLAG", "", "", "", ""] -atm_stashvar[38479] = ["TOTAL CDNC * CLOUD FLAG (m^-3)", "", "", "", ""] -atm_stashvar[38480] = ["Max SuperSaturation*CLD FLAG (perc)", "", "", "", ""] -atm_stashvar[38481] = ["Charac updraft * CLD FLAG (m s^-1)", "", "", "", ""] -atm_stashvar[38482] = ["Sigmaw * CLOUD FLAG (m s^-1)", "", "", "", ""] -atm_stashvar[38483] = ["BL TKE * CLOUD FLAG (m^2 s^-2)", "", "", "", ""] -atm_stashvar[38484] = ["CCN at fixed Supersaturation (m^-3)", "", "", "", ""] -atm_stashvar[38485] = ["H2SO4 Nucleation-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38486] = ["H2SO4 Aitken-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38487] = ["H2SO4 accumulation-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38488] = ["H2SO4 coarse-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38489] = ["BC Aitken-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38490] = ["BC accumulation-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38491] = ["BC coarse-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38492] = ["BC Aitken-insol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38493] = ["OM Nucleation-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38494] = ["OM Aitken-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38495] = ["OM accumulation-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38496] = ["OM coarse-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38497] = ["OM Aitken-insol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38498] = ["Sea-salt accumln-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38499] = ["Sea-salt coarse-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38500] = ["Dust accumln-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38501] = ["Dust coarse-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38502] = ["Dust accumln-insol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38503] = ["Dust coarse-insol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38504] = ["Number Nucleation-sol mode (m^-3)", "", "", "", ""] -atm_stashvar[38505] = ["Number Aitken-sol mode (m^-3)", "", "", "", ""] -atm_stashvar[38506] = ["Number accumulation-sol mode (m^-3)", "", "", "", ""] -atm_stashvar[38507] = ["Number coarse-sol mode (m^-3)", "", "", "", ""] -atm_stashvar[38508] = ["Number Aitken-insol mode (m^-3)", "", "", "", ""] -atm_stashvar[38509] = ["Number accumln-insol mode (m^-3)", "", "", "", ""] -atm_stashvar[38510] = ["Number coarse-insol mode (m^-3)", "", "", "", ""] -atm_stashvar[38511] = ["H2O Nucleation-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38512] = ["H2O Aitken-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38513] = ["H2O accumulation-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38514] = ["H2O coarse-sol mode (kgm^-3)", "", "", "", ""] -atm_stashvar[38515] = ["Total aerosol water content (kgm^-3)", "", "", "", ""] -atm_stashvar[38516] = ["H2SO4 load Nucleation-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38517] = ["H2SO4 load Aitken-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38518] = ["H2SO4 load accumulation-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38519] = ["H2SO4 load coarse-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38520] = ["Total aerosol H2SO4 load (kgm^-2)", "", "", "", ""] -atm_stashvar[38521] = ["BC load Aitken-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38522] = ["BC load accumulation-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38523] = ["BC load coarse-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38524] = ["BC load Aitken-insol (kgm^-2)", "", "", "", ""] -atm_stashvar[38525] = ["Total aerosol BC load (kgm^-2)", "", "", "", ""] -atm_stashvar[38526] = ["OM load Nucleation-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38527] = ["OM load Aitken-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38528] = ["OM load accumulation-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38529] = ["OM load coarse-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38530] = ["OM load Aitken-insol (kgm^-2)", "", "", "", ""] -atm_stashvar[38531] = ["Total aerosol OM load (kgm^-2)", "", "", "", ""] -atm_stashvar[38532] = ["Dust load accumulation-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38533] = ["Dust load coarse-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38534] = ["Dust load accumultn-insol (kgm^-2)", "", "", "", ""] -atm_stashvar[38535] = ["Dust load coarse-insol (kgm^-2)", "", "", "", ""] -atm_stashvar[38536] = ["Total aerosol Dust load (kgm^-2)", "", "", "", ""] -atm_stashvar[38537] = ["Sea-salt load accumltn-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38538] = ["Sea-salt load coarse-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38539] = ["Total aerosol Sea-salt load (kgm^-2)", "", "", "", ""] -atm_stashvar[38540] = ["H2O load nucleation-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38541] = ["H2O load Aitken-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38542] = ["H2O load accumulation-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38543] = ["H2O load coarse-sol (kgm^-2)", "", "", "", ""] -atm_stashvar[38544] = ["Total aerosol H2O load (kgm^-2)", "", "", "", ""] -atm_stashvar[38545] = ["H2O mass mixing ratio (kg/kg)", "", "", "", ""] -atm_stashvar[38546] = ["MASS REMOVED BY MDT FIX NUCL-SOL", "", "", "", ""] -atm_stashvar[38547] = ["MASS REMOVED BY MDT FIX AITKEN-SOL", "", "", "", ""] -atm_stashvar[38548] = ["MASS REMOVED BY MDT FIX ACCUM-SOL", "", "", "", ""] -atm_stashvar[38549] = ["MASS REMOVED BY MDT FIX COARSE-SOL", "", "", "", ""] -atm_stashvar[38550] = ["MASS REMOVED BY MDT FIX AITKEN-INS", "", "", "", ""] -atm_stashvar[38551] = ["MASS REMOVED BY MDT FIX ACCUM-INS", "", "", "", ""] -atm_stashvar[38552] = ["MASS REMOVED BY MDT FIX COARSE-INS", "", "", "", ""] -atm_stashvar[38553] = ["FREQUENCY MDT FIX (%) NUCL-SOL", "", "", "", ""] -atm_stashvar[38554] = ["FREQUENCY MDT FIX (%) AITKEN-SOL", "", "", "", ""] -atm_stashvar[38555] = ["FREQUENCY MDT FIX (%) ACCUM-SOL", "", "", "", ""] -atm_stashvar[38556] = ["FREQUENCY MDT FIX (%) COARSE-SOL", "", "", "", ""] -atm_stashvar[38557] = ["FREQUENCY MDT FIX (%) AITKEN-INS", "", "", "", ""] -atm_stashvar[38558] = ["FREQUENCY MDT FIX (%) ACCUM-INS", "", "", "", ""] -atm_stashvar[38559] = ["FREQUENCY MDT FIX (%) COARSE-INS", "", "", "", ""] -atm_stashvar[38560] = ["PM10 concentration, wet (ug m-3)", "", "", "", ""] -atm_stashvar[38561] = ["PM2.5 concentration, wet (ug m-3)", "", "", "", ""] -atm_stashvar[38562] = ["PM10 concentration, dry (ug m-3)", "", "", "", ""] -atm_stashvar[38563] = ["PM2.5 concentration, dry (ug m-3)", "", "", "", ""] -atm_stashvar[38564] = ["H2SO4 contribution to PM10 (ug m-3)", "", "", "", ""] -atm_stashvar[38565] = ["H2SO4 contribution to PM2.5 (ug m-3)", "", "", "", ""] -atm_stashvar[38566] = ["BC contribution to PM10 (ug m-3)", "", "", "", ""] -atm_stashvar[38567] = ["BC contribution to PM2.5 (ug m-3)", "", "", "", ""] -atm_stashvar[38568] = ["OM contribution to PM10 (ug m-3)", "", "", "", ""] -atm_stashvar[38569] = ["OM contribution to PM2.5 (ug m-3)", "", "", "", ""] -atm_stashvar[38570] = ["Sea-salt contrib. to PM10 (ug m-3)", "", "", "", ""] -atm_stashvar[38571] = ["Sea-salt contrib. to PM2.5 (ug m-3)", "", "", "", ""] -atm_stashvar[38572] = ["Dust contribution to PM10 (ug m-3)", "", "", "", ""] -atm_stashvar[38573] = ["Dust contribution to PM2.5 (ug m-3)", "", "", "", ""] -atm_stashvar[38900] = ["Plume scvnging Nuc-sol H2SO4 (mol/s)", "", "", "", ""] -atm_stashvar[38901] = ["Plume scavenging Nuc-sol OM (mol/s)", "", "", "", ""] -atm_stashvar[38902] = ["Plume scavenging Nuc-sol OM2 (mol/s)", "", "", "", ""] -atm_stashvar[38903] = ["Plume scavenging Nuc-sol NO3 (mol/s)", "", "", "", ""] -atm_stashvar[38904] = ["Plume scavenging Nuc-sol NH4 (mol/s)", "", "", "", ""] -atm_stashvar[38905] = ["Plume scvnging Ait-sol H2SO4 (mol/s)", "", "", "", ""] -atm_stashvar[38906] = ["Plume scavenging Ait-sol BC (mol/s)", "", "", "", ""] -atm_stashvar[38907] = ["Plume scavenging Ait-sol OM (mol/s)", "", "", "", ""] -atm_stashvar[38908] = ["Plume scavenging Ait-sol OM2 (mol/s)", "", "", "", ""] -atm_stashvar[38909] = ["Plume scavenging Ait-sol NO3 (mol/s)", "", "", "", ""] -atm_stashvar[38910] = ["Plume scavenging Ait-sol NH4 (mol/s)", "", "", "", ""] -atm_stashvar[38911] = ["Plume scvnging acc-sol H2SO4 (mol/s)", "", "", "", ""] -atm_stashvar[38912] = ["Plume scavenging acc-sol BC (mol/s)", "", "", "", ""] -atm_stashvar[38913] = ["Plume scavenging acc-sol OM (mol/s)", "", "", "", ""] -atm_stashvar[38914] = ["Plume scavenging acc-sol Cl (mol/s)", "", "", "", ""] -atm_stashvar[38915] = ["Plume scavenging acc-sol Na (mol/s)", "", "", "", ""] -atm_stashvar[38916] = ["Plume scavenging acc-sol Dust(mol/s)", "", "", "", ""] -atm_stashvar[38917] = ["Plume scavenging acc-sol OM2 (mol/s)", "", "", "", ""] -atm_stashvar[38918] = ["Plume scavenging acc-sol NO3 (mol/s)", "", "", "", ""] -atm_stashvar[38919] = ["Plume scavenging acc-sol NH4 (mol/s)", "", "", "", ""] -atm_stashvar[38920] = ["Plume scvnging cor-sol H2SO4 (mol/s)", "", "", "", ""] -atm_stashvar[38921] = ["Plume scavenging cor-sol BC (mol/s)", "", "", "", ""] -atm_stashvar[38922] = ["Plume scavenging cor-sol OM (mol/s)", "", "", "", ""] -atm_stashvar[38923] = ["Plume scavenging cor-sol Cl (mol/s)", "", "", "", ""] -atm_stashvar[38924] = ["Plume scavenging cor-sol Na (mol/s)", "", "", "", ""] -atm_stashvar[38925] = ["Plume scavenging cor-sol Dust(mol/s)", "", "", "", ""] -atm_stashvar[38926] = ["Plume scavenging cor-sol OM2 (mol/s)", "", "", "", ""] -atm_stashvar[38927] = ["Plume scavenging cor-sol NO3 (mol/s)", "", "", "", ""] -atm_stashvar[38928] = ["Plume scavenging cor-sol NH4 (mol/s)", "", "", "", ""] -atm_stashvar[38929] = ["Plume scavenging Ait-ins BC (mol/s)", "", "", "", ""] -atm_stashvar[38930] = ["Plume scavenging Ait-ins OM (mol/s)", "", "", "", ""] -atm_stashvar[38931] = ["Plume scavenging acc-ins Dust(mol/s)", "", "", "", ""] -atm_stashvar[38932] = ["Plume scavenging cor-ins Dust(mol/s)", "", "", "", ""] -atm_stashvar[39001] = ["ANALYSIS TEMPERATURE ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[39002] = ["MODEL TEMPERATURE AFTER NUDGING", "", "", "", ""] -atm_stashvar[39003] = ["TEMPERATURE INCREMENT DUE TO NUDG", "", "", "", ""] -atm_stashvar[39004] = ["TEMPERATURE INCREMENT DUE TO OTHER", "", "", "", ""] -atm_stashvar[39005] = ["TEMPERATURE RELAXATION PARAMETER", "", "", "", ""] -atm_stashvar[39006] = ["ANALYSIS U WIND ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[39007] = ["U COMPNT OF WIND AFTER NUDGING", "", "", "", ""] -atm_stashvar[39008] = ["U WIND INCREMENT DUE TO NUDGING", "", "", "", ""] -atm_stashvar[39009] = ["U WIND INCREMENT DUE TO OTHER", "", "", "", ""] -atm_stashvar[39010] = ["U WIND RELAXATION PARAMETER", "", "", "", ""] -atm_stashvar[39011] = ["ANALYSIS V WIND ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[39012] = ["V COMPNT OF WIND AFTER NUDGING", "", "", "", ""] -atm_stashvar[39013] = ["V WIND INCREMENT DUE TO NUDGING", "", "", "", ""] -atm_stashvar[39014] = ["V WIND INCREMENT DUE TO OTHER", "", "", "", ""] -atm_stashvar[39015] = ["V WIND RELAXATION PARAMETER", "", "", "", ""] -atm_stashvar[44001] = ["Karbou surface emissivity 23.8 GHz", "", "", "", ""] -atm_stashvar[44002] = ["Karbou surf emiss (stdev) 23.8 GHz", "", "", "", ""] -atm_stashvar[44003] = ["Karbou surface emissivity 31.4 GHz", "", "", "", ""] -atm_stashvar[44004] = ["Karbou surf emiss (stdev) 31.4 GHz", "", "", "", ""] -atm_stashvar[44005] = ["Karbou surface emissivity 50.0 GHz", "", "", "", ""] -atm_stashvar[44006] = ["Karbou surf emiss (stdev) 50.0 GHz", "", "", "", ""] -atm_stashvar[44007] = ["Karbou surface emissivity 89.0 GHz", "", "", "", ""] -atm_stashvar[44008] = ["Karbou surf emiss (stdev) 89.0 GHz", "", "", "", ""] -atm_stashvar[44009] = ["Karbou surface emissivity 150.0 GHz", "", "", "", ""] -atm_stashvar[44010] = ["Karbou surf emiss (stdev) 150.0 GHz", "", "", "", ""] -atm_stashvar[44011] = ["DISTANCE OFF-SHORE", "", "", "", ""] -atm_stashvar[44012] = ["MW Surface Emissivity", "", "", "", ""] -atm_stashvar[44013] = ["MW Surface Emissivity (stdev)", "", "", "", ""] -atm_stashvar[50001] = ["Ox PROD: HO2+NO", "", "", "", ""] -atm_stashvar[50002] = ["Ox PROD: MeOO+NO", "", "", "", ""] -atm_stashvar[50003] = ["Ox PROD: NO+RO2", "", "", "", ""] -atm_stashvar[50004] = ["Ox PROD: OH+INORGANIC ACID", "", "", "", ""] -atm_stashvar[50005] = ["Ox PROD: OH+ORGANIC NITRATE", "", "", "", ""] -atm_stashvar[50006] = ["Ox PROD: ORGANIC NITRATE PHOTOLYSIS", "", "", "", ""] -atm_stashvar[50007] = ["Ox PROD: OH + PAN-TYPE REACTIONS", "", "", "", ""] -atm_stashvar[50011] = ["Ox LOSS: O(1D)+H2O", "", "", "", ""] -atm_stashvar[50012] = ["Ox LOSS: MINOR LOSS REACTIONS", "", "", "", ""] -atm_stashvar[50013] = ["Ox LOSS: HO2+O3", "", "", "", ""] -atm_stashvar[50014] = ["Ox LOSS: OH+O3", "", "", "", ""] -atm_stashvar[50015] = ["Ox LOSS: O3+ALKENE", "", "", "", ""] -atm_stashvar[50016] = ["Ox LOSS: N2O5+H2O", "", "", "", ""] -atm_stashvar[50017] = ["Ox LOSS: NO3 CHEMICAL LOSS", "", "", "", ""] -atm_stashvar[50021] = ["Ox BUDGET: O3 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50022] = ["Ox BUDGET: NOy DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50031] = ["Ox BUDGET: NOy WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50041] = ["RXN FLUX: OH+CH4 (CH4 LIFETIME) TROP", "", "", "", ""] -atm_stashvar[50042] = ["RXN FLUX: NO3+C5H8->ISON", "", "", "", ""] -atm_stashvar[50043] = ["RXN FLUX: NO+ISO2->ISON", "", "", "", ""] -atm_stashvar[50044] = ["RXN FLUX: H2O2 PRODUCTION", "", "", "", ""] -atm_stashvar[50045] = ["RXN FLUX: ROOH PRODUCTION", "", "", "", ""] -atm_stashvar[50046] = ["RXN FLUX: HONO2 PRODUCTION (HNO3)", "", "", "", ""] -atm_stashvar[50051] = ["STE: O3", "", "", "", ""] -atm_stashvar[50052] = ["TENDENCY: O3 (TROP ONLY)", "", "", "", ""] -atm_stashvar[50053] = ["TROPOSPHERIC O3", "", "", "", ""] -atm_stashvar[50054] = ["TENDENCY: O3 (WHOLE ATMOS)", "", "", "", ""] -atm_stashvar[50061] = ["AIR MASS DIAGNOSTIC (TROP ONLY)", "", "", "", ""] -atm_stashvar[50062] = ["TROPOSPHERIC MASK", "", "", "", ""] -atm_stashvar[50063] = ["AIR MASS DIAGNOSTIC (WHOLE ATMOS)", "", "", "", ""] -atm_stashvar[50071] = ["CO BUDGET: CO LOSS VIA OH+CO", "", "", "", ""] -atm_stashvar[50072] = ["CO BUDGET: CO PROD VIA HCHO+OH/NO3", "", "", "", ""] -atm_stashvar[50073] = ["CO BUDGET: CO PROD VIA MGLY+OH/NO3", "", "", "", ""] -atm_stashvar[50074] = ["CO BUDGET: CO MISC PROD&O3+MACR/ISOP", "", "", "", ""] -atm_stashvar[50075] = ["CO BUDGET: CO PROD VIA HCHO PHOT RAD", "", "", "", ""] -atm_stashvar[50076] = ["CO BUDGET: CO PROD VIA HCHO PHOT MOL", "", "", "", ""] -atm_stashvar[50077] = ["CO BUDGET: CO PROD VIA MGLY PHOTOL", "", "", "", ""] -atm_stashvar[50078] = ["CO BUDGET: CO PROD VIA MISC PHOTOL", "", "", "", ""] -atm_stashvar[50079] = ["CO BUDGET: CO DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50081] = ["LIGHTNING NOx EMISSIONS 3D", "", "", "", ""] -atm_stashvar[50082] = ["LIGHTNING DIAGNOSTIC: TOT FLASHES 2D", "", "", "", ""] -atm_stashvar[50083] = ["LIGHTNING DIAG: CLD TO GRND FLSH 2D", "", "", "", ""] -atm_stashvar[50084] = ["LIGHTNING DIAG: CLD TO CLD FLSH 2D", "", "", "", ""] -atm_stashvar[50085] = ["LIGHTNING DIAG: TOTAL N PRODUCED 2D", "", "", "", ""] -atm_stashvar[50091] = ["STRATOSPHERIC OH PRODUCTION", "", "", "", ""] -atm_stashvar[50092] = ["STRATOSPHERIC OH LOSS", "", "", "", ""] -atm_stashvar[50101] = ["STRAT O3 PROD: O2+PHOTON->O(3P)+O(3P", "", "", "", ""] -atm_stashvar[50102] = ["STRAT O3 PROD: O2+PHOTON->O(3P)+O(1D", "", "", "", ""] -atm_stashvar[50103] = ["STRAT O3 PROD: HO2 + NO", "", "", "", ""] -atm_stashvar[50104] = ["STRAT O3 PROD: MeOO + NO", "", "", "", ""] -atm_stashvar[50111] = ["STRAT O3 LOSS: Cl2O2 + PHOTON", "", "", "", ""] -atm_stashvar[50112] = ["STRAT O3 LOSS: BrO + ClO", "", "", "", ""] -atm_stashvar[50113] = ["STRAT O3 LOSS: HO2 + O3", "", "", "", ""] -atm_stashvar[50114] = ["STRAT O3 LOSS: ClO + HO2", "", "", "", ""] -atm_stashvar[50115] = ["STRAT O3 LOSS: BrO + HO2", "", "", "", ""] -atm_stashvar[50116] = ["STRAT O3 LOSS: O(3P) + ClO", "", "", "", ""] -atm_stashvar[50117] = ["STRAT O3 LOSS: O(3P) + NO2", "", "", "", ""] -atm_stashvar[50118] = ["STRAT O3 LOSS: O(3P) + HO2", "", "", "", ""] -atm_stashvar[50119] = ["STRAT O3 LOSS: O3 + H", "", "", "", ""] -atm_stashvar[50120] = ["STRAT O3 LOSS: O(3P) + O3", "", "", "", ""] -atm_stashvar[50121] = ["STRAT O3 LOSS: NO3 + PHOTON", "", "", "", ""] -atm_stashvar[50122] = ["STRAT O3 LOSS: O(1D) + H2O", "", "", "", ""] -atm_stashvar[50123] = ["STRAT O3 LOSS: HO2 + NO3", "", "", "", ""] -atm_stashvar[50124] = ["STRAT O3 LOSS: OH + NO3", "", "", "", ""] -atm_stashvar[50125] = ["STRAT O3 LOSS: NO3 + HCHO", "", "", "", ""] -atm_stashvar[50131] = ["STRAT MISC: O3 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50132] = ["STRAT MISC: NOy DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50133] = ["STRAT MISC: NOy WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50140] = ["DMS + OH => SO2 + MeOO + HCHO", "", "", "", ""] -atm_stashvar[50141] = ["DMS + OH => 0.6SO2 + 0.4DMSO + MeOO", "", "", "", ""] -atm_stashvar[50142] = ["DMS + NO3 => SO2 + HONO2 + MeOO", "", "", "", ""] -atm_stashvar[50143] = ["DMSO + OH => 0.6SO2 + 0.4MSA", "", "", "", ""] -atm_stashvar[50144] = ["CS2 + OH => SO2 + COS", "", "", "", ""] -atm_stashvar[50145] = ["H2S + OH => SO2", "", "", "", ""] -atm_stashvar[50146] = ["COS + OH => SO2", "", "", "", ""] -atm_stashvar[50147] = ["Monoterp + OH => Sec_org", "", "", "", ""] -atm_stashvar[50148] = ["Monoterp + O3 => Sec_org", "", "", "", ""] -atm_stashvar[50149] = ["Monoterp + NO3 => Sec_org", "", "", "", ""] -atm_stashvar[50150] = ["SO2 + OH => HO2 + H2SO4", "", "", "", ""] -atm_stashvar[50151] = ["SO2 + H2O2 => NULL0", "", "", "", ""] -atm_stashvar[50152] = ["SO2 + O3 => NULL1", "", "", "", ""] -atm_stashvar[50153] = ["SO2 + O3 => NULL2", "", "", "", ""] -atm_stashvar[50154] = ["SO2 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50155] = ["SO2 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50156] = ["NO surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50157] = ["CH4 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50158] = ["CO surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50159] = ["HCHO surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50160] = ["C2H6 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50161] = ["C3H8 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50162] = ["Me2CO surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50163] = ["MeCHO surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50164] = ["C5H8 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50165] = ["C4H10 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50166] = ["C2H4 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50167] = ["C3H6 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50168] = ["TOLUENE surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50169] = ["oXYLENE surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50170] = ["CH3OH surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50171] = ["H2 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50172] = ["NO emiss from aircraft (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50173] = ["NO2 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50174] = ["HNO3 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50175] = ["H2O2 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50176] = ["CH4 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50177] = ["MeOOH DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50178] = ["EtOOH DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50179] = ["PAN DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50180] = ["i-PrOOH DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50181] = ["O3S DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50182] = ["ISOOH DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50183] = ["MVKOOH DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50184] = ["ORGNIT DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50185] = ["H2 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50186] = ["s-BuOOH DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50187] = ["NO3 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50188] = ["N2O5 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50189] = ["HO2NO2 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50190] = ["HONO2 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50191] = ["H2O2 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50192] = ["HCHO WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50193] = ["HO2 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50194] = ["MeOO WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50195] = ["MeOOH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50196] = ["EtOOH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50197] = ["i-PrOOH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50198] = ["ISOOH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50199] = ["ISON WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50200] = ["MGLY WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50201] = ["MVKOOH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50202] = ["ORGNIT WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50203] = ["CH3OH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50204] = ["s-BuOOH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50205] = ["GLY WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50206] = ["O3 as Offline oxidant (MMR)", "", "", "", ""] -atm_stashvar[50207] = ["OH as Offline oxidant (MMR)", "", "", "", ""] -atm_stashvar[50208] = ["NO3 as Offline oxidant (MMR)", "", "", "", ""] -atm_stashvar[50209] = ["HO2 as Offline oxidant (MMR)", "", "", "", ""] -atm_stashvar[50210] = ["H2O2 as Offline oxidant (MMR)", "", "", "", ""] -atm_stashvar[50211] = ["Monoterp surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50212] = ["NVOC surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50213] = ["NH3 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50214] = ["DMS surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50215] = ["SO2 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50216] = ["SO2 high lev emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50217] = ["SO2 natural emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50218] = ["Nitric Acid Trihydrate (kg/kg)", "", "", "", ""] -atm_stashvar[50219] = ["Ozone column in Dobson Units", "", "", "", ""] -atm_stashvar[50220] = ["Tropospheric CH4 burden in moles", "", "", "", ""] -atm_stashvar[50221] = ["Tropospheric O3 burden in moles", "", "", "", ""] -atm_stashvar[50222] = ["Tropospheric OH burden in moles", "", "", "", ""] -atm_stashvar[50223] = ["Stratospheric CH4 burden in moles", "", "", "", ""] -atm_stashvar[50224] = ["Pressure of PV-THETA tropopause (Pa)", "", "", "", ""] -atm_stashvar[50226] = ["Stratospheric CH4 loss rate (mol/s)", "", "", "", ""] -atm_stashvar[50227] = ["Total reactive nitrogen, NOy (VMR)", "", "", "", ""] -atm_stashvar[50228] = ["Photolysis rate JO1D (s-1)", "", "", "", ""] -atm_stashvar[50229] = ["Photolysis rate JNO2 (s-1)", "", "", "", ""] -atm_stashvar[50230] = ["Non-methane VOC (ug (C) m-3)", "", "", "", ""] -atm_stashvar[50231] = ["Atmospheric Burden of CH4 in moles", "", "", "", ""] -atm_stashvar[50232] = ["Atmospheric Burden of CO in moles", "", "", "", ""] -atm_stashvar[50233] = ["Atmospheric Burden of N2O in moles", "", "", "", ""] -atm_stashvar[50234] = ["Atmospheric Burden of CFC12 in moles", "", "", "", ""] -atm_stashvar[50235] = ["Atmospheric Burden of CFC11 in moles", "", "", "", ""] -atm_stashvar[50236] = ["Atmospheric Burden of CH3Br in moles", "", "", "", ""] -atm_stashvar[50237] = ["Atmospheric Burden of H2 in moles", "", "", "", ""] -atm_stashvar[50238] = ["H2O production from chemistry", "", "", "", ""] -atm_stashvar[50239] = ["H2O loss from chemistry", "", "", "", ""] -atm_stashvar[50240] = ["Specific humidity change from UKCA", "", "", "", ""] -atm_stashvar[50245] = ["Photolysis rate JO2 (s-1)", "", "", "", ""] -atm_stashvar[50246] = ["Photolysis rate JO3P (s-1)", "", "", "", ""] -atm_stashvar[50247] = ["RXN FLUX: CH4 OXIDATION", "", "", "", ""] -atm_stashvar[50248] = ["RXN FLUX: RC(O)O2+NO2 (PAN PROD)", "", "", "", ""] -atm_stashvar[50249] = ["RXN FLUX: RO2+HO2", "", "", "", ""] -atm_stashvar[50250] = ["RXN FLUX: RO2+NO3", "", "", "", ""] -atm_stashvar[50251] = ["RXN FLUX: RO2+RO2", "", "", "", ""] -atm_stashvar[50254] = ["Gross Chemical Prod: O(1D)", "", "", "", ""] -atm_stashvar[50255] = ["UKCA Theta Grid Cell Volume (m^3)", "", "", "", ""] -atm_stashvar[50256] = ["Aerosol surface area in PSC chem", "", "", "", ""] -atm_stashvar[50300] = ["C5H8 ems-flux chk (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50301] = ["Monoterp ems-flux chk (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50302] = ["MeOH ems-flux chk (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50303] = ["Me2CO ems-flux chk (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[51001] = ["O3 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51002] = ["NO MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51003] = ["NO3 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51004] = ["NO2 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51005] = ["N2O5 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51006] = ["HO2NO2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51007] = ["HONO2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51008] = ["H2O2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51009] = ["CH4 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51010] = ["CO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51011] = ["HCHO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51012] = ["MeOOH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51013] = ["HONO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51014] = ["C2H6 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51015] = ["EtOOH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51016] = ["MeCHO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51017] = ["PAN MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51018] = ["C3H8 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51019] = ["n-PrOOH MASS MIX RATIO ON PRESS LEV", "", "", "", ""] -atm_stashvar[51020] = ["i-PrOOH MASS MIX RATIO ON PRESS LEV", "", "", "", ""] -atm_stashvar[51021] = ["EtCHO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51022] = ["Me2CO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51023] = ["MeCOCH2OOH MASS MIX RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51024] = ["PPAN MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51025] = ["MeONO2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51026] = ["O3S MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51027] = ["C5H8 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51028] = ["ISOOH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51029] = ["ISON MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51030] = ["MACR MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51031] = ["MACROOH MASS MIX RATIO ON PRESS LEV", "", "", "", ""] -atm_stashvar[51032] = ["MPAN MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51033] = ["HACET MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51034] = ["MGLY MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51035] = ["NALD MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51036] = ["HCOOH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51037] = ["MeCO3H MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51038] = ["MeCO2H MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51039] = ["MVK MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51040] = ["MVKOOH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51041] = ["Cl MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51042] = ["ClO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51043] = ["Cl2O2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51044] = ["OClO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51045] = ["Br MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51047] = ["BrCl MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51048] = ["BrONO2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51049] = ["N2O MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51051] = ["HOCl MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51052] = ["HBr MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51053] = ["HOBr MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51054] = ["ClONO2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51055] = ["CFCl3 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51056] = ["CF2Cl2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51057] = ["MeBr MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51058] = ["N MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51059] = ["O3P MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51060] = ["ORGNIT MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51069] = ["CH3OH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51070] = ["H2 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51071] = ["DMS MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51072] = ["SO2 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51073] = ["H2SO4 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51074] = ["MSA MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51075] = ["DMSO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51076] = ["NH3 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51077] = ["CS2 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51078] = ["COS MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51079] = ["H2S MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51080] = ["H MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51081] = ["OH MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51082] = ["HO2 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51083] = ["MeOO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51084] = ["EtOO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51085] = ["MeCO3 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51086] = ["n-PrOO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51087] = ["i-PrOO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51088] = ["EtCO3 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51089] = ["MeCOCH2OO MASS MIX RATIO ON PR LEVS", "", "", "", ""] -atm_stashvar[51090] = ["MeOH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51091] = ["MONOTERPENE MMR ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[51092] = ["SEC_ORG MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51093] = ["C3H6 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51094] = ["SO3 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51095] = ["C4H9OOH MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51096] = ["MEK MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51097] = ["TOLUENE MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51098] = ["LUMPED N (as NO2) MMR ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51099] = ["LUMPED Br (as BrO) MMR ON P LEVELS", "", "", "", ""] -atm_stashvar[51100] = ["LUMPED Cl (as HCl) MMR ON P LEVELS", "", "", "", ""] -atm_stashvar[51101] = ["NUCL MODE (SOL) NUMBER ON PRESS LEV", "", "", "", ""] -atm_stashvar[51102] = ["NUCL MODE (SOL) H2SO4 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51103] = ["AITK MODE (SOL) NUMBER ON PRESS LEV", "", "", "", ""] -atm_stashvar[51104] = ["AITK MODE (SOL) H2SO4 ON PRESS LEV", "", "", "", ""] -atm_stashvar[51105] = ["AITK MODE (SOL) BC ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51106] = ["AITK MODE (SOL) OM ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51107] = ["ACCUM MODE (SOL) NBR ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51108] = ["ACCUM MODE (SOL) H2SO4 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51109] = ["ACCUM MODE (SOL) BC ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51110] = ["ACCUM MODE (SOL) OM ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51111] = ["ACCUM MODE (SOL) SEASALT ON PR LEVS", "", "", "", ""] -atm_stashvar[51112] = ["ACCUM MODE (SOL) DUST ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51113] = ["COARSE MODE (SOL) NBR ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51114] = ["COARSE MODE (SOL) H2SO4 ON PRS LEVS", "", "", "", ""] -atm_stashvar[51115] = ["COARSE MODE (SOL) BC ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51116] = ["COARSE MODE (SOL) OM ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51117] = ["COARSE MODE (SOL) SEASALT ON PR LEV", "", "", "", ""] -atm_stashvar[51118] = ["COARSE MODE (SOL) DUST ON PRES LEVS", "", "", "", ""] -atm_stashvar[51119] = ["AITK MODE (INS) NBR ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51120] = ["AITK MODE (INS) BC ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51121] = ["AITK MODE (INS) OM ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51122] = ["ACCUM MODE (INS) NBR ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51123] = ["ACCUM MODE (INS) DUST ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51124] = ["COARSE MODE (INS) NBR ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51125] = ["COARSE MODE (INS) DUST ON PRESS LEV", "", "", "", ""] -atm_stashvar[51126] = ["NUCL MODE (SOL) OM ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51127] = ["AITK MODE (SOL) SEASALT ON PRS LEVS", "", "", "", ""] -atm_stashvar[51128] = ["NUCL MODE (SOL) OM2 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51129] = ["AITK MODE (SOL) OM2 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51130] = ["ACCUM MODE (SOL) OM2 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51131] = ["COARSE MODE (SOL) OM2 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51132] = ["NUCL MODE (SOL) NH4 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51133] = ["AITK MODE (SOL) NH4 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51134] = ["ACCUM MODE (SOL) NH4 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51135] = ["COARSE MODE (SOL) NH4 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51136] = ["NUCL MODE (SOL) NO3 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51137] = ["AITK MODE (SOL) NO3 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51138] = ["ACCUM MODE (SOL) NO3 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51139] = ["COARSE MODE (SOL) NO3 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51149] = ["PASSIVE O3 MMR ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[51150] = ["AGE OF AIR (SEC) ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51151] = ["UKCA NON-TRANS SPEC 151 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51152] = ["UKCA NON-TRANS SPEC 152 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51153] = ["UKCA NON-TRANS SPEC 153 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51154] = ["UKCA NON-TRANS SPEC 154 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51155] = ["UKCA NON-TRANS SPEC 155 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51156] = ["UKCA NON-TRANS SPEC 156 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51157] = ["UKCA NON-TRANS SPEC 157 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51158] = ["UKCA NON-TRANS SPEC 158 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51159] = ["UKCA NON-TRANS SPEC 159 IN PLEV RETD", "", "", "", ""] -atm_stashvar[51160] = ["UKCA NON-TRANS SPEC 160 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51161] = ["UKCA NON-TRANS SPEC 161 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51162] = ["UKCA NON-TRANS SPEC 162 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51163] = ["UKCA NON-TRANS SPEC 163 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51164] = ["UKCA NON-TRANS SPEC 164 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51165] = ["UKCA NON-TRANS SPEC 165 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51166] = ["UKCA NON-TRANS SPEC 166 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51167] = ["UKCA NON-TRANS SPEC 167 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51168] = ["UKCA NON-TRANS SPEC 168 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51169] = ["UKCA NON-TRANS SPEC 169 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51170] = ["UKCA NON-TRANS SPEC 170 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51171] = ["UKCA NON-TRANS SPEC 171 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51172] = ["UKCA NON-TRANS SPEC 172 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51921] = ["DRY PARTICLE DIAMETER AITKEN-SOL", "", "", "", ""] -atm_stashvar[51922] = ["DRY PARTICLE DIAMETER ACCUMULATN-SOL", "", "", "", ""] -atm_stashvar[51923] = ["DRY PARTICLE DIAMETER COARSE-SOL", "", "", "", ""] -atm_stashvar[51924] = ["DRY PARTICLE DIAMETER AITKEN-INS", "", "", "", ""] -atm_stashvar[51925] = ["DRY PARTICLE DIAMETER ACCUMULATN-INS", "", "", "", ""] -atm_stashvar[51926] = ["DRY PARTICLE DIAMETER COARSE-INSOL", "", "", "", ""] -atm_stashvar[51927] = ["WET PARTICLE DIAMETER AITKEN-SOL", "", "", "", ""] -atm_stashvar[51928] = ["WET PARTICLE DIAMETER ACCUMULATN-SOL", "", "", "", ""] -atm_stashvar[51929] = ["WET PARTICLE DIAMETER COARSE-SOL", "", "", "", ""] -atm_stashvar[51930] = ["PTCL MASS DENSITY AITKEN-SOL (WET)", "", "", "", ""] -atm_stashvar[51931] = ["PTCL MASS DENSITY ACCUM.-SOL (WET)", "", "", "", ""] -atm_stashvar[51932] = ["PTCL MASS DENSITY COARSE-SOL (WET)", "", "", "", ""] -atm_stashvar[51933] = ["PTCL MASS DENSITY AITKEN-INS", "", "", "", ""] -atm_stashvar[51934] = ["PTCL MASS DENSITY ACCUM.-INS", "", "", "", ""] -atm_stashvar[51935] = ["PTCL MASS DENSITY COARSE-INS", "", "", "", ""] -atm_stashvar[51936] = ["H2SO4 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[51937] = ["BC PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[51938] = ["OM1 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[51939] = ["NO3 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[51940] = ["OM2 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[51941] = ["H2O PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[51942] = ["H2SO4 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51943] = ["BC PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51944] = ["OM1 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51945] = ["SS PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51946] = ["NO3 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51947] = ["DU PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51948] = ["OM2 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51949] = ["CL PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51950] = ["NA PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51951] = ["H2O PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51952] = ["H2SO4 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51953] = ["BC PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51954] = ["OM1 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51955] = ["SSALT PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51956] = ["NO3 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51957] = ["DU PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51958] = ["OM2 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51959] = ["CL PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51960] = ["NA PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51961] = ["H2O PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51962] = ["BC PARTIAL VOLUME CONC (AIT-INS)", "", "", "", ""] -atm_stashvar[51963] = ["OM1 PARTIAL VOLUME CONC (AIT-INS)", "", "", "", ""] -atm_stashvar[51964] = ["DU PARTIAL VOLUME CONC (ACC-INS)", "", "", "", ""] -atm_stashvar[51965] = ["DU PARTIAL VOLUME CONC (COR-INS)", "", "", "", ""] -atm_stashvar[51966] = ["Aero surf area (cm2/cm3) ON P LEVS", "", "", "", ""] -atm_stashvar[51967] = ["CDNC. ^-1/3 (m-1) ON P LEVELS", "", "", "", ""] -atm_stashvar[51968] = ["CDNC (m-3) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[51969] = ["Stratospheric HO2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51970] = ["Stratospheric OH MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51971] = ["Stratospheric O(1D) MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51972] = ["Stratospheric O(3P) MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51973] = ["HO2 loss on aerosol (s-1) ON P LEVS", "", "", "", ""] -atm_stashvar[51974] = ["N2O5 loss on aerosol (s-1) ON P LEVS", "", "", "", ""] -atm_stashvar[51975] = ["HOC6H5CH3O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51976] = ["HOC5H8O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51977] = ["CH3COCH(O2)CH2OH MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51978] = ["CHOCH(OH)CO2CH3CHO MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51979] = ["C6H5CH2O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51980] = ["CH3CHO2CH2OH MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51981] = ["CH2O2CH2OH MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51982] = ["CH3COCH(O2)CH3 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51983] = ["CH3COCH2O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51984] = ["CH3COC2O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51985] = ["C2H5COO2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51986] = ["i-C2H7O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51987] = ["s-C4H9O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51988] = ["n-C2H7O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51989] = ["CH3COO2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51990] = ["C2H5O2 MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51991] = ["CH3O2 MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51992] = ["HCl MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51993] = ["HO2 MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51994] = ["BrO MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51995] = ["OH MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51996] = ["NO2 MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51997] = ["O(1D) MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51998] = ["O(3P) MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51999] = ["HEAVYSIDE FUNC FOR P LEVEL DIAGS", "", "", "", ""] -atm_stashvar[52001] = ["Ox PRD:HO2+NO ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52002] = ["Ox PRD:MeOO+NO ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52003] = ["Ox PRD:NO+RO2 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52004] = ["Ox PRD:OH+INORG ACID ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52005] = ["Ox PRD:OH+ORG NITR ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52006] = ["Ox PRD:ORG NITR PHOT ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52007] = ["Ox PRD:OH+PAN REACN ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52011] = ["Ox LOSS:O(1D)+H2O ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52012] = ["Ox LOSS:MINOR REACN ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52013] = ["Ox LOSS:HO2+O3 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52014] = ["Ox LOSS:OH+O3 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52015] = ["Ox LOSS:O3+ALK ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52016] = ["Ox LOSS:N2O5+H2O ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52017] = ["Ox LOSS:NO3 CHEM LOSS ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52021] = ["Ox BDGT:O3 DRY DEP(3D) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52022] = ["Ox BDGT:NOy DRY DEP(3D) ON PRESS LEV", "", "", "", ""] -atm_stashvar[52031] = ["Ox BDGT:NOy WET DEP(3D) ON PRESS LEV", "", "", "", ""] -atm_stashvar[52041] = ["FLUX:OH+CH4 (CH4 LIFETIME) ON PR LEV", "", "", "", ""] -atm_stashvar[52042] = ["FLUX:NO3+C5H8->ISON ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52043] = ["FLUX:NO+ISO2->ISON ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52044] = ["FLUX:H2O2 PROD ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52045] = ["FLUX:ROOH PROD ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52046] = ["FLUX:HONO2 PROD (HNO3) ON PRES LEVS", "", "", "", ""] -atm_stashvar[52051] = ["STE: O3 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52052] = ["TEND:O3 (TROP ONLY) ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52053] = ["TROPOSPHERIC O3 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52054] = ["TEND:O3 (WHOLE ATMOS) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52061] = ["AIR MASS DIAG(TROP) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52062] = ["TROPOSPHERIC MASK ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52063] = ["AIR MASS DIAG(WHOLE ATM) ON PRS LEV", "", "", "", ""] -atm_stashvar[52071] = ["CO BDG:LOSS OH+CO ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52072] = ["CO BDG:PROD HCHO+OH/NO3 ON PRS LEVS", "", "", "", ""] -atm_stashvar[52073] = ["CO BDG:PROD MGLY+OH/NO3 ON PRS LEVS", "", "", "", ""] -atm_stashvar[52074] = ["CO BDG: MISC PROD ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52075] = ["CO BDG:PROD HCHO PHOT RAD ON PR LEVS", "", "", "", ""] -atm_stashvar[52076] = ["CO BDG:PROD HCHO PHOT MOL ON PR LEVS", "", "", "", ""] -atm_stashvar[52077] = ["CO BDG:PROD MGLY PHOT ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52078] = ["CO BDG:PROD MISC PHOT ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52079] = ["CO BDG:CO DRY DEP(3D) ON PRESS LEVEL", "", "", "", ""] -atm_stashvar[52081] = ["LIT NOx EMISS 3D ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52091] = ["STRAT OH PROD ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52092] = ["STRAT OH LOSS ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52101] = ["STRO3 PRD:O2+PHOT O(3P) ON PRESS LEV", "", "", "", ""] -atm_stashvar[52102] = ["STRO3 PRD:O2+PHOT O(1D) ON PRESS LEV", "", "", "", ""] -atm_stashvar[52103] = ["STRO3 PRD: HO2+NO ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52104] = ["STRO3 PRD: MeOO+NO ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52111] = ["STRO3 LOSS:Cl2O2+PHOT ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52112] = ["STRO3 LOSS:BrO+ClO ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52113] = ["STRO3 LOSS:HO2+O3 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52114] = ["STRO3 LOSS:ClO+HO2 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52115] = ["STRO3 LOSS:BrO+HO2 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52116] = ["STRO3 LOSS:O3P+ClO ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52117] = ["STRO3 LOSS:O3P+NO2 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52118] = ["STRO3 LOSS:O3P+HO2 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52119] = ["STRO3 LOSS:O3+H ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52120] = ["STRO3 LOSS:O3P+O3 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52121] = ["STRO3 LOSS:NO3+PHOT ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52122] = ["STRO3 LOSS:O1D+H2O ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52123] = ["STRO3 LOSS: HO2+NO3 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52124] = ["STRO3 LOSS: OH+NO3 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52125] = ["STRO3 LOSS: NO3+HCHO ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52131] = ["STRAT MISC:O3 DRY DP(3D) ON PRS LEV", "", "", "", ""] -atm_stashvar[52132] = ["STRAT MISC:NOy DRY DP(3D) ON PRS LEV", "", "", "", ""] -atm_stashvar[52133] = ["STRAT MISC:NOy WET DP(3D) ON PRS LEV", "", "", "", ""] -atm_stashvar[52140] = ["DMS+OH=>SO2+MeOO+HCHO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52141] = ["DMS+OH=>SO2+DMSO+MeOO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52142] = ["DMS+NO3=>SO2+HONO2+MeOO ON PRESS LEV", "", "", "", ""] -atm_stashvar[52143] = ["DMSO+OH=>SO2+MSA ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52144] = ["CS2+OH=>SO2+COS ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52145] = ["H2S + OH => SO2 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52146] = ["COS + OH => SO2 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52147] = ["Monoterp+OH=>Sec_org ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52148] = ["Monoterp+O3=>Sec_org ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52149] = ["Monoterp+NO3=>Sec_org ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52150] = ["SO2+OH=>HO2+H2SO4 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52151] = ["SO2 + H2O2 => NULL0 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52152] = ["SO2 + O3 => NULL1 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52153] = ["SO2 + O3 => NULL2 ON PRESSURE LEVEL", "", "", "", ""] -atm_stashvar[52154] = ["SO2 DRY DEP (3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52155] = ["SO2 WET DEP (3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52172] = ["NO aircrft ems(kg m-2 s-1) ON PR LEV", "", "", "", ""] -atm_stashvar[52173] = ["NO2 DRY DEP (3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52174] = ["HNO3 DRY DEP (3D) ON PRESSURE LEVEL", "", "", "", ""] -atm_stashvar[52175] = ["H2O2 DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52176] = ["CH4 DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52177] = ["MeOOH DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52178] = ["EtOOH DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52179] = ["PAN DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52180] = ["i-PrOOH DRY DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52181] = ["O3S DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52182] = ["ISOOH DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52183] = ["MVKOOH DRY DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52184] = ["ORGNIT DRY DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52185] = ["H2 DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52186] = ["s-BuOOH DRY DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52187] = ["NO3 WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52188] = ["N2O5 WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52189] = ["HO2NO2 WET DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52190] = ["HONO2 WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52191] = ["H2O2 WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52192] = ["HCHO WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52193] = ["HO2 WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52194] = ["MeOO WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52195] = ["MeOOH WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52196] = ["EtOOH WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52197] = ["i-PrOOH WET DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52198] = ["ISOOH WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52199] = ["ISON WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52200] = ["MGLY WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52201] = ["MVKOOH WET DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52202] = ["ORGNIT WET DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52203] = ["CH3OH WET DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52204] = ["s-BuOOH WET DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52205] = ["GLY WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52206] = ["O3 Offline oxid (MMR) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52207] = ["OH Offline oxid (MMR) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52208] = ["NO3 Offline oxid (MMR) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52209] = ["HO2 Offline oxid (MMR) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52210] = ["H2O2 Offl oxid (MMR) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52218] = ["NAT mass mixing ratio on press levs", "", "", "", ""] -atm_stashvar[52219] = ["O3 Column in Dobson Units on p levs", "", "", "", ""] -atm_stashvar[52227] = ["NOy (VMR) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52228] = ["Photolysis rate JO1D on press levs", "", "", "", ""] -atm_stashvar[52229] = ["Photolysis rate JNO2 on press levs", "", "", "", ""] -atm_stashvar[52230] = ["Non-methane VOC (ug C m-3) on p levs", "", "", "", ""] -atm_stashvar[52245] = ["Photolysis rate JO2 on press levs", "", "", "", ""] -atm_stashvar[52246] = ["Photolysis rate JO3P on press levs", "", "", "", ""] -atm_stashvar[52247] = ["RXN FLUX: CH4 OXIDATION ON PLEVS", "", "", "", ""] -atm_stashvar[52248] = ["RXN: RC(O)O2+NO2 (PAN PROD) ON PLEV", "", "", "", ""] -atm_stashvar[52249] = ["RXN FLUX: RO2+HO2 ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52250] = ["RXN FLUX: RO2+NO3 ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52251] = ["RXN FLUX: RO2+RO2 ON PRESSSURE LEVS", "", "", "", ""] -atm_stashvar[52254] = ["Gross Chem Prod : O(1D) On PLEVS", "", "", "", ""] -atm_stashvar[52256] = ["Aerosol surf area in PSC chem plevs", "", "", "", ""] -atm_stashvar[53181] = ["Temperature Inc: Idealised (K/step)", "", "", "", ""] -atm_stashvar[53182] = ["water vapour Inc: Ideal (kg/kg/step)", "", "", "", ""] -atm_stashvar[53185] = ["U wind Inc: Idealised (m/s/step)", "", "", "", ""] -atm_stashvar[53186] = ["V wind Inc: Idealised (m/s/step)", "", "", "", ""] -atm_stashvar[53190] = ["Pot. temp. Inc: Idealised (K/step)", "", "", "", ""] -atm_stashvar[53201] = ["Column vapour added: Ideal (kg/m2/s)", "", "", "", ""] -atm_stashvar[53202] = ["Potential temperature ref. prof (K)", "", "", "", ""] -atm_stashvar[53203] = ["Water vapour reference profile kg/kg", "", "", "", ""] -atm_stashvar[53204] = ["U wind reference profile (m/s)", "", "", "", ""] -atm_stashvar[53205] = ["V wind reference profile (m/s)", "", "", "", ""] -atm_stashvar[53206] = ["Col energy change due to dT (J/m2)", "", "", "", ""] -atm_stashvar[53207] = ["Col energy change due to dU (J/m2)", "", "", "", ""] -atm_stashvar[53208] = ["Col energy change due to dV (J/m2)", "", "", "", ""] -atm_stashvar[54101] = ["NUCLEATION MODE (SOL) NUMBER CLIM", "", "", "", ""] -atm_stashvar[54102] = ["NUCLEATION MODE (SOL) H2SO4 MMR CLIM", "", "", "", ""] -atm_stashvar[54103] = ["AITKEN MODE (SOL) NUMBER CLIM", "", "", "", ""] -atm_stashvar[54104] = ["AITKEN MODE (SOL) H2SO4 MMR CLIM", "", "", "", ""] -atm_stashvar[54105] = ["AITKEN MODE (SOL) BC MMR CLIM", "", "", "", ""] -atm_stashvar[54106] = ["AITKEN MODE (SOL) OM MMR CLIM", "", "", "", ""] -atm_stashvar[54107] = ["ACCUMULATION MODE (SOL) NUMBER CLIM", "", "", "", ""] -atm_stashvar[54108] = ["ACCUMULATION MODE(SOL)H2SO4 MMR CLIM", "", "", "", ""] -atm_stashvar[54109] = ["ACCUMULATION MODE (SOL) BC MMR CLIM", "", "", "", ""] -atm_stashvar[54110] = ["ACCUMULATION MODE (SOL) OM MMR CLIM", "", "", "", ""] -atm_stashvar[54111] = ["ACC MODE (SOL) SEA SALT MMR CLIM", "", "", "", ""] -atm_stashvar[54112] = ["ACCUMULATION MODE(SOL) DUST MMR CLIM", "", "", "", ""] -atm_stashvar[54113] = ["COARSE MODE (SOLUBLE) NUMBER CLIM", "", "", "", ""] -atm_stashvar[54114] = ["COARSE MODE (SOLUBLE) H2SO4 MMR CLIM", "", "", "", ""] -atm_stashvar[54115] = ["COARSE MODE (SOLUBLE) BC MMR CLIM", "", "", "", ""] -atm_stashvar[54116] = ["COARSE MODE (SOLUBLE) OM MMR CLIM", "", "", "", ""] -atm_stashvar[54117] = ["COARSE MODE (SOL) SEA SALT MMR CLIM", "", "", "", ""] -atm_stashvar[54118] = ["COARSE MODE (SOLUBLE) DUST MMR CLIM", "", "", "", ""] -atm_stashvar[54119] = ["AITKEN MODE (INSOLUBLE) NUMBER CLIM", "", "", "", ""] -atm_stashvar[54120] = ["AITKEN MODE (INSOLUBLE) BC MMR CLIM", "", "", "", ""] -atm_stashvar[54121] = ["AITKEN MODE (INSOLUBLE) OM MMR CLIM", "", "", "", ""] -atm_stashvar[54122] = ["ACCUMULATION MODE (INSOL)NUMBER CLIM", "", "", "", ""] -atm_stashvar[54123] = ["ACCUMULATION MODE (INSOL) DUST CLIM", "", "", "", ""] -atm_stashvar[54124] = ["COARSE MODE (INSOLUBLE) NUMBER CLIM", "", "", "", ""] -atm_stashvar[54125] = ["COARSE MODE (INSOL) DUST MMR CLIM", "", "", "", ""] -atm_stashvar[54126] = ["NUCLEATION MODE (SOL) OM MMR CLIM", "", "", "", ""] -atm_stashvar[54127] = ["AITKEN MODE (SOL) SEA SALT MMR CLIM", "", "", "", ""] -atm_stashvar[54128] = ["NUCLEATION MODE (SOL) OM2 MMR CLIM", "", "", "", ""] -atm_stashvar[54129] = ["AITKEN MODE (SOL) OM2 MMR CLIM", "", "", "", ""] -atm_stashvar[54130] = ["ACCUMULATION MODE (SOL) OM2 MMR CLIM", "", "", "", ""] -atm_stashvar[54131] = ["COARSE MODE (SOLUBLE) OM2 MMR CLIM", "", "", "", ""] -atm_stashvar[54132] = ["NUCLEATION MODE (SOL) NH4 MMR CLIM", "", "", "", ""] -atm_stashvar[54133] = ["AITKEN MODE (SOLUBLE) NH4 MMR CLIM", "", "", "", ""] -atm_stashvar[54134] = ["ACCUMULATION MODE (SOL) NH4 MMR CLIM", "", "", "", ""] -atm_stashvar[54135] = ["COARSE MODE (SOLUBLE) NH4 MMR CLIM", "", "", "", ""] -atm_stashvar[54136] = ["NUCLEATION MODE (SOL) NO3 MMR CLIM", "", "", "", ""] -atm_stashvar[54137] = ["AITKEN MODE (SOLUBLE) NO3 MMR CLIM", "", "", "", ""] -atm_stashvar[54138] = ["ACCUMULATION MODE (SOL) NO3 MMR CLIM", "", "", "", ""] -atm_stashvar[54139] = ["COARSE MODE (SOLUBLE) NO3 MMR CLIM", "", "", "", ""] -atm_stashvar[54476] = ["GC CLOUD LIQUID FRACTION", "", "", "", ""] -atm_stashvar[54477] = ["GC TOTAL CDNC * CLOUD LIQ FRACTION", "", "", "", ""] -atm_stashvar[54921] = ["DRY PARTICLE DIAMETER AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54922] = ["DRY PARTICLE DIAMETER ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54923] = ["DRY PARTICLE DIAMETER COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54924] = ["DRY PARTICLE DIAMETER AIT-INS CLIM", "", "", "", ""] -atm_stashvar[54925] = ["DRY PARTICLE DIAMETER ACC-INS CLIM", "", "", "", ""] -atm_stashvar[54926] = ["DRY PARTICLE DIAMETER COR-INS CLIM", "", "", "", ""] -atm_stashvar[54927] = ["WET PARTICLE DIAMETER AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54928] = ["WET PARTICLE DIAMETER ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54929] = ["WET PARTICLE DIAMETER COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54930] = ["PTCL MASS DENSITY AIT-SOL CLIM (WET)", "", "", "", ""] -atm_stashvar[54931] = ["PTCL MASS DENSITY ACC-SOL CLIM (WET)", "", "", "", ""] -atm_stashvar[54932] = ["PTCL MASS DENSITY COR-SOL CLIM (WET)", "", "", "", ""] -atm_stashvar[54933] = ["PTCL MASS DENSITY AIT-INS CLIM", "", "", "", ""] -atm_stashvar[54934] = ["PTCL MASS DENSITY ACC-INS CLIM", "", "", "", ""] -atm_stashvar[54935] = ["PTCL MASS DENSITY COR-INS CLIM", "", "", "", ""] -atm_stashvar[54936] = ["H2SO4 PARTIAL VOL CONC AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54937] = ["BC PARTIAL VOLUME CONC AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54938] = ["OM1 PARTIAL VOLUME CONC AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54939] = ["NO3 PARTIAL VOLUME CONC AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54940] = ["OM2 PARTIAL VOLUME CONC AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54941] = ["H2O PARTIAL VOLUME CONC AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54942] = ["H2SO4 PARTIAL VOL CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54943] = ["BC PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54944] = ["OM1 PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54945] = ["SS PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54946] = ["NO3 PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54947] = ["DU PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54948] = ["OM2 PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54949] = ["CL PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54950] = ["NA PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54951] = ["H2O PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54952] = ["H2SO4 PARTIAL VOL CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54953] = ["BC PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54954] = ["OM1 PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54955] = ["SS PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54956] = ["NO3 PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54957] = ["DU PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54958] = ["OM2 PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54959] = ["CL PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54960] = ["NA PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54961] = ["H2O PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54962] = ["BC PARTIAL VOLUME CONC AIT-INS CLIM", "", "", "", ""] -atm_stashvar[54963] = ["OM1 PARTIAL VOLUME CONC AIT-INS CLIM", "", "", "", ""] -atm_stashvar[54964] = ["DU PARTIAL VOLUME CONC ACC-INS CLIM", "", "", "", ""] -atm_stashvar[54965] = ["DU PARTIAL VOLUME CONC COR-INS CLIM", "", "", "", ""] -atm_stashvar[54967] = ["CLOUD DROP. No. CONC. ^-1/3 m-1 CLIM", "", "", "", ""] -atm_stashvar[54968] = ["CLOUD DROP. No. CONC. (m-3) CLIM", "", "", "", ""] - -class StashVar: - - def __init__(self, code, model=1): - # Allow this to be 0 to support some ancillary files - if model in [0, 1]: - # Should this be trapped so that we can return None? - try: - var = atm_stashvar[code] - except KeyError: - var = ["UNKNOWN VARIABLE","", "", "", ""] - else: - raise Exception("Model type %d not supported at the moment" % model) - self.long_name = var[0] - # Should there be a dictionary somewhere so this returns a unique - # set of names? unique as an optional argument? - if var[1]: - self.name = var[1] - else: - self.name = "field%d" % code - self.units = var[2] - self.standard_name = var[3] - self.code = code - if var[4]: - self.uniquename = var[4] - else: - self.uniquename = self.name diff --git a/src/umfile_utils/stashvar_cmip6.py b/src/umfile_utils/stashvar_cmip6.py deleted file mode 100644 index 04b047cc..00000000 --- a/src/umfile_utils/stashvar_cmip6.py +++ /dev/null @@ -1,4734 +0,0 @@ -# UM STASH variable names from section and item numbers -# Where available variable names match PCMDI convention -# Fifth field is a unique name suitable for filenames or creating multiple -# variables in a single file - -atm_stashvar = {} - -atm_stashvar[2] = ["U COMPNT OF WIND AFTER TIMESTEP", "ua", "m s-1", "eastward_wind", ""] -atm_stashvar[3] = ["V COMPNT OF WIND AFTER TIMESTEP", "va", "m s-1", "northward_wind", ""] -atm_stashvar[4] = ["THETA AFTER TIMESTEP", "theta", "K", "air_potential_temperature", ""] -atm_stashvar[5] = ["OROGRAPHIC GRADIENT X COMPONENT", "orog_dx", "", "", ""] -atm_stashvar[6] = ["OROGRAPHIC GRADIENT Y COMPONENT", "orog_dy", "", "", ""] -atm_stashvar[7] = ["UNFILTERED OROGRAPHY", "orog_unfilt", "", "", ""] -atm_stashvar[8] = ["SOIL BULK DENSITY", "", "kg m-3", "", ""] -atm_stashvar[9] = ["SOIL MOISTURE CONTENT IN A LAYER", "", "", "", ""] -atm_stashvar[10] = ["SPECIFIC HUMIDITY AFTER TIMESTEP", "hus", "1", "specific_humidity", ""] -atm_stashvar[12] = ["QCF AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[13] = ["CONV CLOUD AMOUNT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[14] = ["CONV CLOUD BASE LEVEL NO. AFTER TS", "", "", "", ""] -atm_stashvar[15] = ["CONV CLOUD TOP LEVEL NO. AFTER TS", "", "", "", ""] -atm_stashvar[16] = ["CONV CLOUD LIQUID WATER PATH", "", "", "", ""] -atm_stashvar[17] = ["SILHOUETTE OROGRAPHIC ROUGHNESS", "", "", "", ""] -atm_stashvar[18] = ["HALF OF (PEAK TO TROUGH HT OF OROG)", "", "", "", ""] -atm_stashvar[20] = ["DEEP SOIL TEMP AFTER TIMESTEP", "tsl", "K", "soil_temperature", ""] -atm_stashvar[21] = ["CCRad : Lowest conv. cld base layer", "", "", "", ""] -atm_stashvar[22] = ["CANOPY WATER AFTER TIMESTEP KG/M2", "", "", "", ""] -atm_stashvar[23] = ["SNOW AMOUNT OVER LAND AFT TSTP KG/M2", "snw", "kg m-2", "surface_snow_amount", ""] -atm_stashvar[24] = ["SURFACE TEMPERATURE AFTER TIMESTEP", "ts", "K", "surface_temperature", ""] -atm_stashvar[25] = ["BOUNDARY LAYER DEPTH AFTER TIMESTEP", "bldepth", "m", "", ""] -atm_stashvar[26] = ["ROUGHNESS LENGTH AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[27] = ["SNOW EDGE AFTER TIMESTEP **", "", "", "", ""] -atm_stashvar[28] = ["SURFACE ZONAL CURRENT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[29] = ["SURFACE MERID CURRENT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[30] = ["LAND MASK (No halo) (LAND=TRUE)", "lmask", "1", "land_binary_mask", ""] -atm_stashvar[31] = ["FRAC OF SEA ICE IN SEA AFTER TSTEP", "sic", "1", "sea_ice_area_fraction", ""] -atm_stashvar[32] = ["SEA ICE DEPTH (MEAN OVER ICE) M", "sit", "m", "sea_ice_thickness", ""] -atm_stashvar[33] = ["OROGRAPHY (/STRAT LOWER BC)", "orog", "m", "surface_altitude", ""] -atm_stashvar[34] = ["STANDARD DEVIATION OF OROGRAPHY", "orog_sd", "", "", ""] -atm_stashvar[35] = ["OROGRAPHIC GRADIENT XX COMPONENT", "orog_dxx", "", "", ""] -atm_stashvar[36] = ["OROGRAPHIC GRADIENT XY COMPONENT", "orog_dxy", "", "", ""] -atm_stashvar[37] = ["OROGRAPHIC GRADIENT YY COMPONENT", "orog_dyy", "", "", ""] -atm_stashvar[38] = ["ICE EDGE IN THE ANCILLARY FILE ONLY", "", "", "", ""] -atm_stashvar[39] = ["SST ANOMALY", "", "", "", ""] -atm_stashvar[40] = ["VOL SMC AT WILTING AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[41] = ["VOL SMC AT CRIT PT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[43] = ["VOL SMC AT SATURATION AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[44] = ["SAT SOIL CONDUCTIVITY AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[46] = ["THERMAL CAPACITY AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[47] = ["THERMAL CONDUCTIVITY AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[48] = ["SATURATED SOIL WATER SUCTION", "", "", "", ""] -atm_stashvar[49] = ["SEA-ICE TEMPERATURE AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[50] = ["VEGETATION FRACTION AFTER TIMESTEP", "", "1", "vegetation_area_fraction", ""] -atm_stashvar[51] = ["ROOT DEPTH AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[52] = ["SNOW-FREE SURFACE ALBEDO AFTER TS", "", "1", "", ""] -atm_stashvar[53] = ["DEEP SNOW SURFACE ALBEDO AFTER TS", "", "1", "", ""] -atm_stashvar[54] = ["SURFACE RESISTANCE TO EVAP AFTER TS", "", "", "", ""] -atm_stashvar[55] = ["SURFACE CAPACITY AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[56] = ["INFILTRATION FACTOR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[57] = ["TOTAL AEROSOL EMISSIONS (FOR VIS)", "", "", "", ""] -atm_stashvar[58] = ["SULPHUR DIOXIDE EMISSIONS", "", "kg m-2 s-1", "", ""] -atm_stashvar[59] = ["DIMETHYL SULPHIDE EMISSIONS (ANCIL)", "", "kg m-2 s-1", "", ""] -atm_stashvar[60] = ["OZONE **", "", "", "", ""] -atm_stashvar[70] = ["TURBULENT KINETIC ENERGY", "", "", "", ""] -atm_stashvar[71] = ["SELF COVARIANCE OF THETAL'", "", "", "", ""] -atm_stashvar[72] = ["SELF COVARIANCE OF QW'", "", "", "", ""] -atm_stashvar[73] = ["CORRELATION OF THETAL' AND QW'", "", "", "", ""] -atm_stashvar[74] = ["HEIGHT OF MIXED LAYER FOR SHCU BUOY", "", "", "", ""] -atm_stashvar[75] = ["CLOUD NUMBER AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[76] = ["RAIN NUMBER AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[77] = ["RAIN THIRD MOMENT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[78] = ["ICE NUMBER AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[79] = ["SNOW NUMBER AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[80] = ["SNOW THIRD MOMENT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[81] = ["GRAUPEL NUMBER AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[82] = ["GRAUPEL THIRD MOMENT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[83] = ["ACTSOLLIQ AEROSOL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[84] = ["ACTSOLRAIN AEROSOL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[85] = ["ACTINSOLICE AEROSOL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[86] = ["ACTSOLICE AEROSOL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[87] = ["ACTINSOLLIQUID AERO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[88] = ["ACTSOLNUMBER AERO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[89] = ["ACTINSOLNUMBER AER0 AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[90] = ["TOTAL AEROSOL (FOR VISIBILITY)", "", "", "", ""] -atm_stashvar[91] = ["LIGHTNING POTENTIAL", "", "", "", ""] -atm_stashvar[93] = ["RUNOFF COASTAL OUTFLOW POINT", "", "", "", ""] -atm_stashvar[95] = ["SNOW AMOUNT OVR SEAICE AFT TS KG/M2", "", "", "", ""] -atm_stashvar[96] = ["OCEAN NR. SURFACE CHLOROPHYLL(KGM-3)", "", "", "", ""] -atm_stashvar[97] = ["BARE SOIL MOMENTUM ROUGHNESS LENGTH", "", "", "", ""] -atm_stashvar[98] = ["LOWER BOUNDARY TENDENCIES (OROG)", "", "", "", ""] -atm_stashvar[99] = ["BDY LYR W-VARIANCE FOR MIXED PHASE", "", "", "", ""] -atm_stashvar[101] = ["SO2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[102] = ["DIMETHYL SULPHIDE MIX RAT AFTER TS", "", "", "", ""] -atm_stashvar[103] = ["SO4 AITKEN MODE AEROSOL AFTER TSTEP", "", "", "", ""] -atm_stashvar[104] = ["SO4 ACCUM. MODE AEROSOL AFTER TSTEP", "", "", "", ""] -atm_stashvar[105] = ["SO4 DISSOLVED AEROSOL AFTER TSTEP", "", "", "", ""] -atm_stashvar[106] = ["H2O2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[107] = ["NH3 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[108] = ["FRESH SOOT MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[109] = ["AGED SOOT MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[110] = ["CLOUD SOOT MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[111] = ["FRESH BIOMASS SMOKE AFTER TSTEP", "", "", "", ""] -atm_stashvar[112] = ["AGED BIOMASS SMOKE AFTER TSTEP", "", "", "", ""] -atm_stashvar[113] = ["CLOUD BIOMASS SMOKE AFTER TSTEP", "", "", "", ""] -atm_stashvar[114] = ["FRESH OCFF MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[115] = ["AGED OCFF MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[116] = ["CLOUD OCFF MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[117] = ["ACC NITR MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[118] = ["DISS NITR MASS MIX RAT AFTER TSTEP", "", "", "", ""] -atm_stashvar[119] = ["MIN HEIGHT FOR BB HILEV EMISS / M", "", "", "", ""] -atm_stashvar[120] = ["MAX HEIGHT FOR BB HILEV EMISS / M", "", "", "", ""] -atm_stashvar[121] = ["3D NATURAL SO2 EMISSIONS KG/M2/S", "", "", "", ""] -atm_stashvar[122] = ["3D OH CONCENTRATIONS IN MCULES/CC", "", "", "", ""] -atm_stashvar[123] = ["3D HO2 CONCENTRATIONS IN MCULES/CC", "", "", "", ""] -atm_stashvar[124] = ["3D H2O2 MIX RATIO LIMIT FIELD", "", "", "", ""] -atm_stashvar[125] = ["3D OZONE MIX RAT FOR SULPHUR CYCLE", "", "", "", ""] -atm_stashvar[126] = ["HIGH LEVEL SO2 EMISSIONS KG/M2/S", "", "", "", ""] -atm_stashvar[127] = ["AMMONIA GAS EMISSIONS KG/M2/S", "", "", "", ""] -atm_stashvar[128] = ["FRESH SOOT SURF EMISS KG/M2/S", "", "", "", ""] -atm_stashvar[129] = ["FRESH SOOT HI LEV EMISS KG/M2/S", "", "", "", ""] -atm_stashvar[130] = ["FRESH BIOMASS SURF EMISS KG/M2/S", "", "", "", ""] -atm_stashvar[131] = ["FRESH BIOMASS HI LEV EMISS KG/M2/S", "", "", "", ""] -atm_stashvar[132] = ["DMS CONCENTRATION IN SEAWATER", "", "", "", ""] -atm_stashvar[133] = ["DMS OCEAN FLUX KG[S]/M**2/S", "", "", "", ""] -atm_stashvar[134] = ["FRESH OCFF SURF EMISS KG/M2/S", "", "", "", ""] -atm_stashvar[135] = ["FRESH OCFF HI LEV EMISS KG/M2/S", "", "", "", ""] -atm_stashvar[136] = ["CONV PROG 1", "", "", "", ""] -atm_stashvar[137] = ["CONV PROG 2", "", "", "", ""] -atm_stashvar[138] = ["CONV PROG 3", "", "", "", ""] -atm_stashvar[139] = ["CONV PROG PRECIP", "", "", "", ""] -atm_stashvar[150] = ["W COMPNT OF WIND AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[151] = ["RIVER SEQUENCE", "", "", "", ""] -atm_stashvar[152] = ["RIVER DIRECTION", "", "", "", ""] -atm_stashvar[153] = ["RIVER WATER STORAGE M2", "", "", "", ""] -atm_stashvar[155] = ["ACCUMULATED SURFACE RUNOFF KG/M2", "", "", "", ""] -atm_stashvar[156] = ["ACCUMULATED SUB-SURFACE RUNOFF KG/M2", "", "", "", ""] -atm_stashvar[157] = ["GRIDBOX AREAS M2", "", "", "", ""] -atm_stashvar[160] = ["AREA DRAINING (INTEGER) PIXELS", "", "", "", ""] -atm_stashvar[161] = ["SLOPE %", "", "", "", ""] -atm_stashvar[162] = ["INITIAL FLOW VALUES M3/S", "", "", "", ""] -atm_stashvar[163] = ["X-COORDINATE OF OUTFLOW PIXEL", "", "", "", ""] -atm_stashvar[164] = ["Y-COORDINATE OF OUTFLOW PIXEL", "", "", "", ""] -atm_stashvar[165] = ["LAND-TYPE (RIVER/LAND/SEA)", "", "", "", ""] -atm_stashvar[166] = ["SURFACE STORAGE MM", "", "", "", ""] -atm_stashvar[167] = ["SUB-SURFACE STORAGE MM", "", "", "", ""] -atm_stashvar[168] = ["ACC. SURFACE INFLOW TO A PIXEL MM", "", "", "", ""] -atm_stashvar[169] = ["ACC. SUB-SURFACE INFLOW TO PIXEL MM", "", "", "", ""] -atm_stashvar[171] = ["NET DN SW RAD FLUX:OPEN SEA: CPL", "", "", "", ""] -atm_stashvar[172] = ["NET DWN SFC SW FLUX BLW 690NM: CPL", "", "", "", ""] -atm_stashvar[173] = ["NET DOWN SURFACE LW RAD FLUX: CPL", "", "", "", ""] -atm_stashvar[174] = ["NET DN LW RAD FLUX:OPEN SEA: CPL", "", "", "", ""] -atm_stashvar[176] = ["X-COMP SURF & BL WIND STR: CPL N/M2", "", "", "", ""] -atm_stashvar[177] = ["Y-COMP SURF & BL WIND STRL CPL N/M2", "", "", "", ""] -atm_stashvar[178] = ["WIND MIX EN'GY FL TO SEA: CPL W/M2", "", "", "", ""] -atm_stashvar[179] = ["SFC SH FLX FROM OPEN SEA: CPL W/M2", "", "", "", ""] -atm_stashvar[180] = ["SUBLIM. SURFACE (GBM): CPL KG/M2/S", "", "", "", ""] -atm_stashvar[181] = ["EVAP FROM OPEN SEA: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[182] = ["SEAICE SUBLIM CAT(GBM): CPL KG/M2/S", "", "", "", ""] -atm_stashvar[184] = ["Heat flx through sea ice (W/m2): CPL", "", "", "", ""] -atm_stashvar[185] = ["Heat flx in sea ice surface mlt: CPL", "", "", "", ""] -atm_stashvar[186] = ["LARGE SCALE RAIN RATE: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[187] = ["LARGE SCALE SNOW RATE: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[188] = ["CONVECTIVE RAIN RATE: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[189] = ["CONVECTIVE SNOW RATE: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[190] = ["ICEBERG CALVING FIELD: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[191] = ["10 METRE WIND SPEED ON C GRID: CPL", "", "", "", ""] -atm_stashvar[192] = ["River Runoff: CPL", "", "", "", ""] -atm_stashvar[193] = ["PRESSURE AT MEAN SEA LEVEL: CPL Pa", "", "", "", ""] -atm_stashvar[194] = ["SEA SURFACE FREEZING TEMPERATURE: K", "", "", "", ""] -atm_stashvar[195] = ["Seaice surface temperature (cat): CPL (K)", "", "", "", ""] -atm_stashvar[196] = ["SURFACE LEVEL OF CO2 TRACER (MMR): CPL", "", "", "", ""] -atm_stashvar[197] = ["TOTAL DUST DEPOSITION RATE: CPL KG/M2/S", "", "", "", ""] -atm_stashvar[201] = ["PSTAR PERTURBATION- DUMMY", "", "", "", ""] -atm_stashvar[202] = ["U COMPNT PERTURBATION- DUMMY", "", "", "", ""] -atm_stashvar[203] = ["V COMPNT PERTURBATION- DUMMY", "", "", "", ""] -atm_stashvar[204] = ["THETA PERTURBATION- DUMMY", "", "", "", ""] -atm_stashvar[205] = ["FRACTIONAL LAND COVER", "", "", "", ""] -atm_stashvar[207] = ["CLAPP-HORNBERGER B COEFFICIENT", "", "", "", ""] -atm_stashvar[208] = ["LEAF AREA INDEX OF VEG FRACTION", "", "", "", ""] -atm_stashvar[209] = ["CANOPY HEIGHT OF VEGETATED FRACTION", "", "", "", ""] -atm_stashvar[211] = ["CCA WITH ANVIL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[212] = ["CCRad : CCW passed to radiation", "", "", "", ""] -atm_stashvar[213] = ["CANOPY CONDUCTANCE AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[214] = ["UNFROZEN SOIL MOISTURE FRAC AFTER TS", "", "", "", ""] -atm_stashvar[215] = ["FROZEN SOIL MOISTURE FRAC AFTER TS", "", "", "", ""] -atm_stashvar[216] = ["FRACTIONS OF SURFACE TYPES", "landCoverFrac", "1", "area_fraction", ""] -atm_stashvar[217] = ["LEAF AREA INDEX OF PLANT FUNC TYPES", "", "", "", ""] -atm_stashvar[218] = ["CANOPY HEIGHT OF PLANT FUNC TYPES M", "", "", "", ""] -atm_stashvar[219] = ["DISTURBED FRACTION OF VEGETATION", "", "", "", ""] -atm_stashvar[220] = ["SNOW-FREE ALBEDO OF SOIL", "", "1", "", ""] -atm_stashvar[221] = ["SNOW SOOT CONTENT", "", "", "", ""] -atm_stashvar[222] = ["NET ENERGY CHANGE THIS PERIOD J/M**2", "", "", "", ""] -atm_stashvar[223] = ["SOIL CARBON CONTENT KG C / M2", "", "", "", ""] -atm_stashvar[224] = ["ACCUMULATED NPP ON PFTS", "", "", "", ""] -atm_stashvar[225] = ["ACCUMULATED LEAF TURNOVER RATE PFTS", "", "", "", ""] -atm_stashvar[226] = ["ACCUMULATED PHENOL LEAF TRNVR PFTS", "", "", "", ""] -atm_stashvar[227] = ["ACCUMULATED WOOD RESPIRATION PFTS", "", "", "", ""] -atm_stashvar[228] = ["ACCUMULATED SOIL RESPIRATION", "", "", "", ""] -atm_stashvar[229] = ["CANOPY WATER ON TILES KG/M2", "", "", "", ""] -atm_stashvar[230] = ["CANOPY CAPACITY ON TILES KG/M2", "", "", "", ""] -atm_stashvar[231] = ["SNOW GRAIN SIZE ON TILES MICRONS", "", "", "", ""] -atm_stashvar[233] = ["SURFACE TEMPERATURE ON TILES K", "ts", "K", "", "ts_tile"] -atm_stashvar[234] = ["ROUGHNESS LENGTH ON TILES M", "", "", "", ""] -atm_stashvar[235] = ["NET MOISTURE FLUX IN PERIOD KG/M**2", "", "", "", ""] -atm_stashvar[236] = ["TILE MODIFIED INFILTRATION RATE", "", "", "", ""] -atm_stashvar[237] = ["DOWNWARD SW RADIATION ON TILES W/M2", "", "", "", ""] -atm_stashvar[238] = ["SURFACE DOWNWARD LW RADIATION W/M2", "rlds", "W m-2", "surface_downwelling_longwave_flux", ""] -atm_stashvar[239] = ["TOA - SURF UPWARD LW RADIATION W/M2", "", "", "", ""] -atm_stashvar[240] = ["SNOW AMOUNT ON TILES KG/M2", "", "", "", ""] -atm_stashvar[241] = ["CANOPY SNOW CAPACITY KG/M2", "", "", "", ""] -atm_stashvar[242] = ["SNOW BENEATH CANOPY KG/M2", "", "", "", ""] -atm_stashvar[243] = ["OBS/CLIM SNOW-FREE SURF SW ALBEDO", "", "1", "", ""] -atm_stashvar[244] = ["OBS/CLIM SNOW-FREE SURF VIS ALBEDO", "", "1", "", ""] -atm_stashvar[245] = ["OBS/CLIM SNOW-FREE SURF NIR ALBEDO", "", "1", "", ""] -atm_stashvar[246] = ["THERMAL ROUGHNESS LENGTH ON TILES M", "", "", "", ""] -atm_stashvar[249] = ["TRIFFID CO2 FLUX TO ATMOS KGC/M2/YR", "", "", "", ""] -atm_stashvar[250] = ["CO2 OCEAN FLUX KG/M**2/S", "", "", "", ""] -atm_stashvar[251] = ["CO2 SURFACE EMISSIONS KG/M**2/S", "co2emiss", "kg m-2 s-1", "", ""] -atm_stashvar[252] = ["CO2 3D TRACER MASS MIXING RATIO", "co2mmr", "", "", ""] -atm_stashvar[253] = ["DENSITY*R*R AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[254] = ["QCL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[255] = ["EXNER PRESSURE (RHO) AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[256] = ["ADVECTED U CMPT OF WIND AFTER TS", "", "", "", ""] -atm_stashvar[257] = ["ADVECTED V CMPT OF WIND AFTER TS", "", "", "", ""] -atm_stashvar[258] = ["ADVECTED W CMPT OF WIND AFTER TS", "", "", "", ""] -atm_stashvar[259] = ["NUMBER OF TURBULENT MIXING LEVELS", "", "", "", ""] -atm_stashvar[260] = ["LEVEL OF BASE OF DEEP STRATOCUMULUS", "", "", "", ""] -atm_stashvar[261] = ["LEVEL OF TOP OF DEEP STRATOCUMULUS", "", "", "", ""] -atm_stashvar[262] = ["BOUNDARY LAYER CONVECTION FLAG", "", "", "", ""] -atm_stashvar[263] = ["SD TURBULENT FLUC LAYER1 TEMP", "", "", "", ""] -atm_stashvar[264] = ["SD TURBULENT FLUC LAYER1 HUMIDITY", "", "", "", ""] -atm_stashvar[265] = ["AREA CLOUD FRACTION IN EACH LAYER", "", "", "", ""] -atm_stashvar[266] = ["BULK CLOUD FRACTION IN EACH LAYER", "", "", "", ""] -atm_stashvar[267] = ["LIQUID CLOUD FRACTION IN EACH LAYER", "", "", "", ""] -atm_stashvar[268] = ["FROZEN CLOUD FRACTION IN EACH LAYER", "", "", "", ""] -atm_stashvar[269] = ["SURFACE ZONAL CURRENT AFTER TS PGRID", "", "", "", ""] -atm_stashvar[270] = ["SURFACE MERID CURRENT AFTER TS PGRID", "", "", "", ""] -atm_stashvar[271] = ["CLOUD ICE (CRYSTALS) AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[272] = ["RAIN AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[273] = ["GRAUPEL AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[274] = ["MEAN TOPOGRAPHIC INDEX", "", "", "", ""] -atm_stashvar[275] = ["STANDARD DEVN IN TOPOGRAPHIC INDEX", "", "", "", ""] -atm_stashvar[276] = ["EXP DECAY IN SOIL SAT HYD CONDUCTY", "", "", "", ""] -atm_stashvar[277] = ["INTEGRATED GAMMA DISTRIBUTION", "", "", "", ""] -atm_stashvar[278] = ["MEAN WATER TABLE DEPTH M", "", "", "", ""] -atm_stashvar[279] = ["SURFACE SATURATION FRACTION", "", "", "", ""] -atm_stashvar[280] = ["SURFACE WETLAND FRACTION", "", "", "", ""] -atm_stashvar[281] = ["SATURATION FRAC IN DEEP LAYER", "", "", "", ""] -atm_stashvar[282] = ["A_FSAT HYDROLOGY FITTING PARAMETER", "", "", "", ""] -atm_stashvar[283] = ["C_FSAT HYDROLOGY FITTING PARAMETER", "", "", "", ""] -atm_stashvar[284] = ["A_FWET HYDROLOGY FITTING PARAMETER", "", "", "", ""] -atm_stashvar[285] = ["C_FWET HYDROLOGY FITTING PARAMETER", "", "", "", ""] -atm_stashvar[286] = ["PREVIOUS DIST FRAC OF VEGETATION", "", "", "", ""] -atm_stashvar[287] = ["FAST TURNOVER WOOD PRODUCT KGC/M2", "", "", "", ""] -atm_stashvar[288] = ["MEDIUM TURNOVER WOOD PRODUCT KGC/M2", "", "", "", ""] -atm_stashvar[289] = ["SLOW TURNOVER WOOD PRODUCT KGC/M2", "", "", "", ""] -atm_stashvar[290] = ["DAILY ACCUMULATED LAKE FLUX KG/M2", "", "", "", ""] -atm_stashvar[291] = ["LAKE DEPTH (M)", "", "", "", ""] -atm_stashvar[292] = ["LAKE FETCH (M)", "", "", "", ""] -atm_stashvar[293] = ["LAKE MEAN TEMPERATURE (K)", "", "", "", ""] -atm_stashvar[294] = ["LAKE MIXED-LAYER TEMPERATURE (K)", "", "", "", ""] -atm_stashvar[295] = ["LAKE ICE SURFACE TEMPERATURE (K)", "", "", "", ""] -atm_stashvar[296] = ["LAKE MIXED-LAYER DEPTH (M)", "", "", "", ""] -atm_stashvar[297] = ["LAKE ICE THICKNESS (M)", "", "", "", ""] -atm_stashvar[298] = ["LAKE T PROFILE SHAPE FACTOR", "", "", "", ""] -atm_stashvar[299] = ["LAKE GRD HT FLX / DTEMP (W m-2 K-1)", "", "", "", ""] -atm_stashvar[341] = ["TROPOPAUSE-BASED OZONE", "", "", "", ""] -atm_stashvar[342] = ["DEEP CONVECTIVE FLAG", "", "", "", ""] -atm_stashvar[343] = ["PAST CONVECTIVE PRECIP KG/M2/S", "", "", "", ""] -atm_stashvar[344] = ["PAST CONVECTIVE DEPTH M", "", "", "", ""] -atm_stashvar[345] = ["CCA FROM DEEP CONVECTION", "", "", "", ""] -atm_stashvar[346] = ["CCA FROM MID-LEVEL CONVECTION", "", "", "", ""] -atm_stashvar[347] = ["CCA FROM SHALLOW CONVECTION", "", "", "", ""] -atm_stashvar[348] = ["TOT PRECIP RATE AFTER TSTEP KG/M2/S", "", "", "", ""] -atm_stashvar[351] = ["CLIM BIOGENIC AEROSOL MMR", "", "", "", ""] -atm_stashvar[352] = ["CLIM BIOMASS-BURNING (FRESH) MMR", "", "", "", ""] -atm_stashvar[353] = ["CLIM BIOMASS-BURNING (AGED) MMR", "", "", "", ""] -atm_stashvar[354] = ["CLIM BIOMASS-BURNING (IN-CLOUD) MMR", "", "", "", ""] -atm_stashvar[355] = ["CLIM BLACK CARBON (FRESH) MMR", "", "", "", ""] -atm_stashvar[356] = ["CLIM BLACK CARBON (AGED) MMR", "", "", "", ""] -atm_stashvar[357] = ["CLIM SEA SALT (FILM MODE) NPM3", "", "", "", ""] -atm_stashvar[358] = ["CLIM SEA SALT (JET MODE) NPM3", "", "", "", ""] -atm_stashvar[359] = ["CLIM SULPHATE (ACCUMULATION MODE)MMR", "", "", "", ""] -atm_stashvar[360] = ["CLIM SULPHATE (AITKEN MODE) MMR", "", "", "", ""] -atm_stashvar[361] = ["CLIM SULPHATE (DISSOLVED) MMR", "", "", "", ""] -atm_stashvar[362] = ["CLIM DUST SIZE DIVISION 1 MMR", "", "", "", ""] -atm_stashvar[363] = ["CLIM DUST SIZE DIVISION 2 MMR", "", "", "", ""] -atm_stashvar[364] = ["CLIM DUST SIZE DIVISION 3 MMR", "", "", "", ""] -atm_stashvar[365] = ["CLIM DUST SIZE DIVISION 4 MMR", "", "", "", ""] -atm_stashvar[366] = ["CLIM DUST SIZE DIVISION 5 MMR", "", "", "", ""] -atm_stashvar[367] = ["CLIM DUST SIZE DIVISION 6 MMR", "", "", "", ""] -atm_stashvar[368] = ["CLIM ORG C FOSSIL FUEL (FRESH) MMR", "", "", "", ""] -atm_stashvar[369] = ["CLIM ORG C FOSSIL FUEL (AGED) MMR", "", "", "", ""] -atm_stashvar[370] = ["CLIM ORG C FOSSIL FUEL (IN-CLOUD)MMR", "", "", "", ""] -atm_stashvar[371] = ["CLIM DELTA AEROSOL MMR", "", "", "", ""] -atm_stashvar[376] = ["SNOW DEPTH ON GROUND ON TILES (M)", "", "", "", ""] -atm_stashvar[377] = ["SNOWPACK BULK DENSITY (KG M-3)", "", "", "", ""] -atm_stashvar[378] = ["SNOW ON THE CANOPY (KG M-2)", "", "", "", ""] -atm_stashvar[379] = ["SURFACE HEAT FLUX UNDER SNOW (W M-2)", "", "", "", ""] -atm_stashvar[380] = ["NUMBER OF SNOW LAYERS ON TILES", "", "", "", ""] -atm_stashvar[381] = ["SNOW LAYER THICKNESSES ON TILES (M)", "", "", "", ""] -atm_stashvar[382] = ["SNOW LYR ICE MASS ON TILES(KG M-2)", "", "", "", ""] -atm_stashvar[383] = ["SNOW LYR LIQUD MASS ON TILES(KG M-2)", "", "", "", ""] -atm_stashvar[384] = ["SNOW LAYER TEMPERATURE ON TILES (K)", "", "", "", ""] -atm_stashvar[385] = ["SNOW LAYER DENSITY ON TILES (KG M-3)", "", "", "", ""] -atm_stashvar[386] = ["SNOW LYR GRAIN SIZE ON TILES(MICRON)", "", "", "", ""] -atm_stashvar[387] = ["ETADOT AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[388] = ["THETAVD AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[389] = ["DRY RHO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[390] = ["PSIW SURFACE AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[391] = ["VAPOUR MIXING RATIO (mv) AFTER TS", "", "", "", ""] -atm_stashvar[392] = ["CLD LIQ MIXING RATIO (mcl) AFTER TS", "", "", "", ""] -atm_stashvar[393] = ["CLD ICE MIXING RATIO (mcf) AFTER TS", "", "", "", ""] -atm_stashvar[394] = ["RAIN MIXING RATIO (mr) AFTER TS", "", "", "", ""] -atm_stashvar[395] = ["GRAUPEL MIXING RATIO (mg) AFTER TS", "", "", "", ""] -atm_stashvar[396] = ["ICE CRY MIXING RAT. (mcf2) AFTER TS", "", "", "", ""] -atm_stashvar[397] = ["PSIW LID AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[398] = ["EXNER SURF AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[406] = ["EXNER PRESSURE AT THETA LEVELS", "", "", "", ""] -atm_stashvar[407] = ["PRESSURE AT RHO LEVELS AFTER TS", "", "", "", ""] -atm_stashvar[408] = ["PRESSURE AT THETA LEVELS AFTER TS", "", "", "", ""] -atm_stashvar[409] = ["SURFACE PRESSURE AFTER TIMESTEP", "ps", "Pa", "surface_air_pressure", ""] -atm_stashvar[410] = ["SW RADIATION INCREMENTS AFTER TS", "", "", "", ""] -atm_stashvar[411] = ["LW RADIATION INCREMENTS AFTER TS", "", "", "", ""] -atm_stashvar[412] = ["FRACTION OF SURFACE TYPE AFTER TS", "", "", "", ""] -atm_stashvar[413] = ["Sea ice concentration by categories", "", "", "", ""] -atm_stashvar[414] = ["Sea ice thickness GBM by categories", "", "", "", ""] -atm_stashvar[415] = ["Sea ice top layer temp by categories (K)", "", "", "", ""] -atm_stashvar[416] = ["Sea ice snow depth by categories", "", "", "", ""] -atm_stashvar[418] = ["Dust parent soil clay fraction (anc)", "", "", "", ""] -atm_stashvar[419] = ["Dust parent soil silt fraction (anc)", "", "", "", ""] -atm_stashvar[420] = ["Dust parent soil sand fraction (anc)", "", "", "", ""] -atm_stashvar[421] = ["Dust soil mass fraction div 1 (anc)", "", "", "", ""] -atm_stashvar[422] = ["Dust soil mass fraction div 2 (anc)", "", "", "", ""] -atm_stashvar[423] = ["Dust soil mass fraction div 3 (anc)", "", "", "", ""] -atm_stashvar[424] = ["Dust soil mass fraction div 4 (anc)", "", "", "", ""] -atm_stashvar[425] = ["Dust soil mass fraction div 5 (anc)", "", "", "", ""] -atm_stashvar[426] = ["Dust soil mass fraction div 6 (anc)", "", "", "", ""] -atm_stashvar[428] = ["Sea ice meltpond fraction by cats", "", "", "", ""] -atm_stashvar[429] = ["Sea ice meltpond depth by cats (m)", "", "", "", ""] -atm_stashvar[431] = ["Dust division 1 mass mixing ratio", "", "kg kg-1", "", ""] -atm_stashvar[432] = ["Dust division 2 mass mixing ratio", "", "kg kg-1", "", ""] -atm_stashvar[433] = ["Dust division 3 mass mixing ratio", "", "kg kg-1", "", ""] -atm_stashvar[434] = ["Dust division 4 mass mixing ratio", "", "kg kg-1", "", ""] -atm_stashvar[435] = ["Dust division 5 mass mixing ratio", "", "kg kg-1", "", ""] -atm_stashvar[436] = ["Dust division 6 mass mixing ratio", "", "kg kg-1", "", ""] -atm_stashvar[440] = ["Seaice surf layer cond (cat)(W/m2/K)", "", "", "", ""] -atm_stashvar[441] = ["Seaice surface temperature (cat) (K)", "", "", "", ""] -atm_stashvar[442] = ["SOIL NITROGEN POOL (DPM) KG N / M2", "", "", "", ""] -atm_stashvar[443] = ["SOIL NITROGEN POOL (RPM) KG N / M2", "", "", "", ""] -atm_stashvar[444] = ["SOIL NITROGEN POOL (BIO) KG N / M2", "", "", "", ""] -atm_stashvar[445] = ["SOIL NITROGEN POOL (HUM) KG N / M2", "", "", "", ""] -atm_stashvar[446] = ["INORGANIC SOIL NITROGEN KG N / M2", "", "", "", ""] -atm_stashvar[447] = ["NITROGEN DEPOSITION (kgN/m2/s)", "", "", "", ""] -atm_stashvar[448] = ["CROP FRACTION", "", "", "", ""] -atm_stashvar[449] = ["CROP FRAC. AT PREV. TRIFFID CALL", "", "", "", ""] -atm_stashvar[458] = ["PASTURE FRACTION", "", "", "", ""] -atm_stashvar[459] = ["PASTURE FRAC. AT PREV. TRIFFID CALL", "", "", "", ""] -atm_stashvar[460] = ["PAR increments after timestep", "", "", "", ""] -atm_stashvar[466] = ["DPM SOIL CARBON POOL KG C / M2", "", "", "", ""] -atm_stashvar[467] = ["RPM SOIL CARBON POOL KG C / M2", "", "", "", ""] -atm_stashvar[468] = ["BIO SOIL CARBON POOL KG C / M2", "", "", "", ""] -atm_stashvar[469] = ["HUM SOIL CARBON POOL KG C / M2", "", "", "", ""] -atm_stashvar[470] = ["ACCUMULATED DPM SOIL RESP", "", "", "", ""] -atm_stashvar[471] = ["ACCUMULATED RPM SOIL RESP", "", "", "", ""] -atm_stashvar[472] = ["ACCUMULATED BIO SOIL RESP", "", "", "", ""] -atm_stashvar[473] = ["ACCUMULATED HUM SOIL RESP", "", "", "", ""] -atm_stashvar[480] = ["PROGNOSTIC OZONE TRACER", "", "", "", ""] -atm_stashvar[481] = ["CARIOLLE PROD-LOSS (P-L)", "", "", "", ""] -atm_stashvar[482] = ["CARIOLLE O3 P-L WRT O3 MIX RATIO", "", "", "", ""] -atm_stashvar[483] = ["CARIOLLE O3 VOL MIXING RATIO", "", "", "", ""] -atm_stashvar[484] = ["CARIOLLE O3 P-L WRT TEMP", "", "", "", ""] -atm_stashvar[485] = ["CARIOLLE O3 CLIM TEMP", "", "", "", ""] -atm_stashvar[486] = ["CARIOLLE O3 P-L WRT O3 ABOVE PL", "", "", "", ""] -atm_stashvar[487] = ["CARIOLLE O3 COLUMN ABOVE PL", "", "", "", ""] -atm_stashvar[490] = ["DECOUPLED SCREEN TEMP ON TILES K", "", "", "", ""] -atm_stashvar[491] = ["DECOUPLED SCREEN TEMP ON SEA/ICE K", "", "", "", ""] -atm_stashvar[492] = ["TIME SINCE TRANSITION S", "", "", "", ""] -atm_stashvar[493] = ["CONVECTIVE DOWNDRAUGHT AT CLD BASE", "", "", "", ""] -atm_stashvar[494] = ["URBAN BUILDING HEIGHT", "", "", "", ""] -atm_stashvar[495] = ["URBAN HEIGHT TO WIDTH RATIO", "", "", "", ""] -atm_stashvar[496] = ["URBAN WIDTH RATIO", "", "", "", ""] -atm_stashvar[497] = ["URBAN DISPLACEMENT HEIGHT", "", "", "", ""] -atm_stashvar[498] = ["URBAN ZTM", "", "", "", ""] -atm_stashvar[499] = ["URBAN WALL ALBEDO", "", "1", "", ""] -atm_stashvar[500] = ["URBAN ROAD ALBEDO", "", "1", "", ""] -atm_stashvar[501] = ["URBAN WALL EMISSIVITY", "", "1", "", ""] -atm_stashvar[502] = ["URBAN ROAD EMISSIVITY", "", "1", "", ""] -atm_stashvar[505] = ["Land fraction in grid box", "sftlf", "1", "land_area_fraction", ""] -atm_stashvar[506] = ["LAND SURFACE TEMP AFTER TIMESTEP", "ts", "K", "surface_temperature_where_land", "ts_land"] -atm_stashvar[507] = ["OPEN SEA SURFACE TEMP AFTER TIMESTEP", "ts", "K", "surface_temperature_where_open_sea", "ts_sea"] -atm_stashvar[508] = ["SEA-ICE SURFACE TEMP AFTER TIMESTEP", "ts", "K", "surface_temperature", "ts_ice"] -atm_stashvar[509] = ["SEA ICE ALBEDO AFTER TS", "", "1", "", ""] -atm_stashvar[510] = ["MEAN LAND ALBEDO AFTER TS", "", "1", "", ""] -atm_stashvar[511] = ["INLANDBASINFLOW ATM GRID KG/M2/S", "", "", "", ""] -atm_stashvar[569] = ["COLDPOOL FRONT VECTR SUM X-CMPT(M/S)", "", "", "", ""] -atm_stashvar[570] = ["COLDPOOL FRONT VECTR SUM Y-CMPT(M/S)", "", "", "", ""] -atm_stashvar[571] = ["COLDPOOL FRONT SCALAR SUM (M/S)", "", "", "", ""] -atm_stashvar[572] = ["COLDPOOL REDUCED GRAVITY (M/S2)", "", "", "", ""] -atm_stashvar[573] = ["COLDPOOL DEPTH (M)", "", "", "", ""] -atm_stashvar[574] = ["COLDPOOL REMAIN COUNTER (ISOTROPIC)", "", "", "", ""] -atm_stashvar[575] = ["COLDPOOL REMAIN COUNTER (DIRECTED)", "", "", "", ""] -atm_stashvar[576] = ["TEMP OF TILED SUBSURFACE (K)", "", "", "", ""] -atm_stashvar[577] = ["PV tracer for radiation param", "", "", "", ""] -atm_stashvar[578] = ["PV tracer for SW param", "", "", "", ""] -atm_stashvar[579] = ["PV tracer for LW param", "", "", "", ""] -atm_stashvar[580] = ["PV tracer for microphysics param", "", "", "", ""] -atm_stashvar[581] = ["PV tracer for GWD param", "", "", "", ""] -atm_stashvar[582] = ["PV tracer for slow physics", "", "", "", ""] -atm_stashvar[583] = ["PV tracer for convection param", "", "", "", ""] -atm_stashvar[584] = ["PV tracer for Boundary Layer param", "", "", "", ""] -atm_stashvar[585] = ["PV tracer for stochastic physics", "", "", "", ""] -atm_stashvar[586] = ["PV tracer for cloud pressure", "", "", "", ""] -atm_stashvar[587] = ["PV tracer for IAU", "", "", "", ""] -atm_stashvar[588] = ["PV tracer for Nudging scheme", "", "", "", ""] -atm_stashvar[589] = ["Total dPV in a timestep", "", "", "", ""] -atm_stashvar[590] = ["PV tracer for advection", "", "", "", ""] -atm_stashvar[591] = ["PV tracer for Helmholtz solver", "", "", "", ""] -atm_stashvar[592] = ["PV tracer for Mass update", "", "", "", ""] -atm_stashvar[593] = ["Advection only PV", "", "", "", ""] -atm_stashvar[595] = ["BL PERT SCHEME RANDOM NUMB FIELD", "", "", "", ""] -atm_stashvar[596] = ["BL PERT SCHEME FLAG", "", "", "", ""] -atm_stashvar[600] = ["Theta tracer for initial theta", "", "", "", ""] -atm_stashvar[601] = ["Theta tracer for BL", "", "", "", ""] -atm_stashvar[602] = ["Theta tracer for BL mixing", "", "", "", ""] -atm_stashvar[603] = ["Theta tracer for BL Latent Heat", "", "", "", ""] -atm_stashvar[604] = ["Theta tracer for Convection", "", "", "", ""] -atm_stashvar[605] = ["Theta tracer for microphysics", "", "", "", ""] -atm_stashvar[606] = ["Theta tracer for radiation", "", "", "", ""] -atm_stashvar[607] = ["Theta tracer for SW radiation", "", "", "", ""] -atm_stashvar[608] = ["Theta tracer for LW radiation", "", "", "", ""] -atm_stashvar[609] = ["Theta tracer for slow physics", "", "", "", ""] -atm_stashvar[610] = ["Theta tracer for cloud rebalancing", "", "", "", ""] -atm_stashvar[1004] = ["TEMPERATURE AFTER SW RAD INCREMENTS", "", "", "", ""] -atm_stashvar[1101] = ["HORIZON ANGLE 1 (N)", "", "", "", ""] -atm_stashvar[1102] = ["HORIZON ANGLE 2 (NE)", "", "", "", ""] -atm_stashvar[1103] = ["HORIZON ANGLE 3 (E)", "", "", "", ""] -atm_stashvar[1104] = ["HORIZON ANGLE 4 (SE)", "", "", "", ""] -atm_stashvar[1105] = ["HORIZON ANGLE 5 (S)", "", "", "", ""] -atm_stashvar[1106] = ["HORIZON ANGLE 6 (SW)", "", "", "", ""] -atm_stashvar[1107] = ["HORIZON ANGLE 7 (W)", "", "", "", ""] -atm_stashvar[1108] = ["HORIZON ANGLE 8 (NW)", "", "", "", ""] -atm_stashvar[1109] = ["HORIZON ANGLE 9 (NNE)", "", "", "", ""] -atm_stashvar[1110] = ["HORIZON ANGLE 10 (ENE)", "", "", "", ""] -atm_stashvar[1111] = ["HORIZON ANGLE 11 (ESE)", "", "", "", ""] -atm_stashvar[1112] = ["HORIZON ANGLE 12 (SSE)", "", "", "", ""] -atm_stashvar[1113] = ["HORIZON ANGLE 13 (SSW)", "", "", "", ""] -atm_stashvar[1114] = ["HORIZON ANGLE 14 (WSW)", "", "", "", ""] -atm_stashvar[1115] = ["HORIZON ANGLE 15 (WNW)", "", "", "", ""] -atm_stashvar[1116] = ["HORIZON ANGLE 16 (NNW)", "", "", "", ""] -atm_stashvar[1130] = ["SOLID ANGLE FOR TRANSIT OBSERVER 1AU", "", "", "", ""] -atm_stashvar[1140] = ["COS SOLAR ZENITH ANGLE: MODEL TSTEP", "", "", "", ""] -atm_stashvar[1141] = ["DAYLIGHT FRACTION OF MODEL TIMESTEP", "", "", "", ""] -atm_stashvar[1142] = ["COS SOLAR ZENITH ANGLE: RAD TIMESTEP", "", "", "", ""] -atm_stashvar[1143] = ["DAYLIGHT FRACTION OF RADIATION TSTEP", "", "", "", ""] -atm_stashvar[1161] = ["TEMPERATURE INCR: swrad MINUS LH PC2", "", "", "", ""] -atm_stashvar[1181] = ["TEMPERATURE INCR: swrad scheme", "", "", "", ""] -atm_stashvar[1182] = ["SPECIFIC HUMIDITY INCR: swrad scheme", "", "", "", ""] -atm_stashvar[1183] = ["QCL INCR: swrad scheme", "", "", "", ""] -atm_stashvar[1192] = ["BULK CLOUD VOL INCR: swrad scheme", "", "", "", ""] -atm_stashvar[1193] = ["LIQUID CLOUD VOL INCR: swrad scheme", "", "", "", ""] -atm_stashvar[1194] = ["QCL INCR: swrad positive", "", "", "", ""] -atm_stashvar[1195] = ["QCL INCR: swrad negative", "", "", "", ""] -atm_stashvar[1198] = ["LIQ CLOUD VOL INCR: swrad positive", "", "", "", ""] -atm_stashvar[1199] = ["LIQ CLOUD VOL INCR: swrad negative", "", "", "", ""] -atm_stashvar[1200] = ["LIT MASK FOR SW RADIATION TIMESTEP", "", "", "", ""] -atm_stashvar[1201] = ["NET DOWN SURFACE SW FLUX: SW TS ONLY", "rss", "W m-2", "surface_net_downward_shortwave_flux", ""] -atm_stashvar[1202] = ["NET DOWN SURFACE SW FLUX: CORRECTED", "rss", "W m-2", "surface_net_downward_shortwave_flux", "rss_corr"] -atm_stashvar[1203] = ["NET DN SW RAD FLUX:OPEN SEA:SEA MEAN", "rss_sea", "", "", ""] -atm_stashvar[1204] = ["NET DOWN SURFACE SW FLUX BELOW 690NM", "", "", "", ""] -atm_stashvar[1205] = ["OUTGOING SW RAD FLUX (TOA):CORRECTED", "", "", "", ""] -atm_stashvar[1207] = ["INCOMING SW RAD FLUX (TOA): ALL TSS", "rsdt", "W m-2", "toa_incoming_shortwave_flux", ""] -atm_stashvar[1208] = ["OUTGOING SW RAD FLUX (TOA)", "rsut", "W m-2", "toa_outgoing_shortwave_flux", ""] -atm_stashvar[1209] = ["CLEAR-SKY (II) UPWARD SW FLUX (TOA)", "rsutcs", "W m-2", "toa_outgoing_shortwave_flux_assuming_clear_sky", ""] -atm_stashvar[1210] = ["CLEAR-SKY (II) DOWN SURFACE SW FLUX", "rsdscs", "W m-2", "surface_downwelling_shortwave_flux_in_air_assuming_clear_sky", ""] -atm_stashvar[1211] = ["CLEAR-SKY (II) UP SURFACE SW FLUX", "rsuscs", "W m-2", "surface_upwelling_shortwave_flux_in_air_assuming_clear_sky", ""] -atm_stashvar[1212] = ["DIRECT UV FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1213] = ["UPWARDS UV FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1214] = ["DOWNWARDS UV FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1215] = ["DIRECT SURFACE SW FLUX : CORRECTED", "", "", "", ""] -atm_stashvar[1216] = ["DIFFUSE SURFACE SW FLUX : CORRECTED", "", "", "", ""] -atm_stashvar[1217] = ["UPWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1218] = ["DOWNWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1219] = ["CLEAR-SKY UPWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1220] = ["CLEAR-SKY DOWNWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1221] = ["LAYER CLD LIQ RE * LAYER CLD WEIGHT", "", "", "", ""] -atm_stashvar[1223] = ["LAYER CLOUD WEIGHT FOR MICROPHYSICS", "", "", "", ""] -atm_stashvar[1224] = ["LAYER CLD LIQUID WATER PATH * WEIGHT", "", "", "", ""] -atm_stashvar[1225] = ["CONV CLOUD LIQ RE * CONV CLD WEIGHT", "", "", "", ""] -atm_stashvar[1226] = ["CONV CLOUD WEIGHT FOR MICROPHYSICS", "", "", "", ""] -atm_stashvar[1228] = ["CLEAR UPWARD SW AT TOA * AREA WEIGHT", "", "", "", ""] -atm_stashvar[1229] = ["CLEAR-SKY SW AREA WEIGHT", "", "", "", ""] -atm_stashvar[1230] = ["DIRECT SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1231] = ["DIFFUSE SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1232] = ["SW HEATING RATES: ALL TIMESTEPS", "", "", "", ""] -atm_stashvar[1233] = ["CLEAR-SKY SW HEATING RATES", "", "", "", ""] -atm_stashvar[1235] = ["TOTAL DOWNWARD SURFACE SW FLUX", "rsds", "W m-2", "surface_downwelling_shortwave_flux_in_air", ""] -atm_stashvar[1237] = ["NET DOWNWARD SW FLUX AT THE TROP.", "", "W m-2", "", ""] -atm_stashvar[1238] = ["UPWARD SW FLUX AT THE TROPOPAUSE", "", "W m-2", "", ""] -atm_stashvar[1241] = ["DROPLET NUMBER CONC * LYR CLOUD WGT", "", "", "", ""] -atm_stashvar[1242] = ["LAYER CLOUD LWC * LAYER CLOUD WEIGHT", "", "", "", ""] -atm_stashvar[1243] = ["SO4 CCN KG/M3 * COND SAMPLING WEIGHT", "", "", "", ""] -atm_stashvar[1244] = ["CONDITIONAL SAMPLING WEIGHT", "", "", "", ""] -atm_stashvar[1245] = ["2-D RE DISTRIBUTION * 2-D RE WEIGHT", "", "", "", ""] -atm_stashvar[1246] = ["WEIGHT FOR 2-D RE DISTRIBUTION", "", "", "", ""] -atm_stashvar[1247] = ["FILM-MODE SEA-SALT AEROSOL NUMBER", "", "", "", ""] -atm_stashvar[1248] = ["JET-MODE SEA-SALT AEROSOL NUMBER", "", "", "", ""] -atm_stashvar[1254] = ["2-D RE * WEIGHT - WARM CLOUDS ONLY", "", "", "", ""] -atm_stashvar[1255] = ["WEIGHT FOR WARM CLOUD 2-D RE", "", "", "", ""] -atm_stashvar[1257] = ["NET DOWN SW FLUX: LAND", "rss", "W m-2", "surface_net_downward_shortwave_flux", ""] -atm_stashvar[1258] = ["NET DN SW FLX:SEAICE:SEA MEAN", "", "W m-2", "", ""] -atm_stashvar[1259] = ["NET DN SW SOLID SFC FLUX BELOW 690NM", "", "W m-2", "", ""] -atm_stashvar[1260] = ["NET DN SW O SEA FLX BLW 690NM:SEA MN", "", "W m-2", "", ""] -atm_stashvar[1262] = ["WEIGHTED SW CLOUD EXTINCTION", "", "", "", ""] -atm_stashvar[1263] = ["WEIGHTS FOR CLOUD SW EXTINCTION", "", "", "", ""] -atm_stashvar[1264] = ["WEIGHTED SW LAYER CLOUD EXTINCTION", "", "", "", ""] -atm_stashvar[1265] = ["WEIGHTS FOR LAYER CLD SW EXTINCTION", "", "", "", ""] -atm_stashvar[1266] = ["WEIGHTED SW CONV. CLOUD EXTINCTION", "", "", "", ""] -atm_stashvar[1267] = ["WEIGHTS FOR CONV.CLD SW EXTINCTION", "", "", "", ""] -atm_stashvar[1268] = ["DIRECT SURFACE ALBEDO ON SW BANDS", "", "1", "", ""] -atm_stashvar[1269] = ["DIFFUSE SURFACE ALBEDO ON SW BANDS", "", "1", "", ""] -atm_stashvar[1270] = ["VIS ALBEDO SCALING TO OBS ON TILES", "", "1", "", ""] -atm_stashvar[1271] = ["NIR ALBEDO SCALING TO OBS ON TILES", "", "1", "", ""] -atm_stashvar[1272] = ["DIRECT FLUX FOR SPHERICAL GEOMETRY", "", "", "", ""] -atm_stashvar[1273] = ["CLEAR DIRECT FLUX (SPHERICAL GEOM)", "", "", "", ""] -atm_stashvar[1274] = ["CLEAN DIRECT FLUX (SPHERICAL GEOM)", "", "", "", ""] -atm_stashvar[1275] = ["CLEAR-CLEAN DIRECT FLUX (SPH GEOM)", "", "", "", ""] -atm_stashvar[1276] = ["DIRECT FLUX DIVERGENCE OVER LAYERS", "", "", "", ""] -atm_stashvar[1277] = ["CLEAR-SKY DIRECT FLUX DIVERGENCE", "", "", "", ""] -atm_stashvar[1278] = ["CLEAN-AIR DIRECT FLUX DIVERGENCE", "", "", "", ""] -atm_stashvar[1279] = ["CLEAR-CLEAN DIRECT FLUX DIVERGENCE", "", "", "", ""] -atm_stashvar[1280] = ["COLUMN-INTEGRATED Nd * SAMP. WEIGHT", "", "", "", ""] -atm_stashvar[1281] = ["SAMP. WEIGHT FOR COL. INT. Nd", "", "", "", ""] -atm_stashvar[1288] = ["DOWNWARD SURFACE UV FLUX", "", "W m-2", "", ""] -atm_stashvar[1289] = ["CLEAR-SKY DOWNWARD SURFACE UV FLUX", "", "W m-2", "", ""] -atm_stashvar[1290] = ["TOTAL DOWNWARD PAR FLUX AT SURFACE", "", "W m-2", "", ""] -atm_stashvar[1291] = ["DIRECT COMPONENT OF SURF PAR FLUX", "", "", "", ""] -atm_stashvar[1292] = ["MEAN SOLAR BEARING OVER RAD TS", "", "", "", ""] -atm_stashvar[1293] = ["SLOPE ASPECT", "", "", "", ""] -atm_stashvar[1294] = ["SLOPE ANGLE", "", "", "", ""] -atm_stashvar[1295] = ["OROG CORR FACTOR TO DIRECT SURF SW", "", "", "", ""] -atm_stashvar[1296] = ["EXTRA SW SURF FLUX AFTER OROG CORR", "", "", "", ""] -atm_stashvar[1298] = ["CDNC @CLOUD TOP * WEIGHT", "", "", "", ""] -atm_stashvar[1299] = ["WEIGHT FOR CDNC @CLOUD TOP", "", "", "", ""] -atm_stashvar[1408] = ["OUTGOING SW RAD FORCING (TOA)", "", "", "", ""] -atm_stashvar[1409] = ["CLEAR-SKY (II) UPWARD SW FORC.(TOA)", "", "W m-2", "", ""] -atm_stashvar[1410] = ["CLEAR-SKY (II) DOWN SURF. SW FORC.", "", "W m-2", "", ""] -atm_stashvar[1411] = ["CLEAR-SKY (II) UP SURF. SW FORC.", "", "W m-2", "", ""] -atm_stashvar[1417] = ["UPWARD SW FLUX ON LEVELS W/ FORCING", "", "W m-2", "", ""] -atm_stashvar[1418] = ["DOWNWARD SW FLUX ON LEVELS W/ FORC", "", "W m-2", "", ""] -atm_stashvar[1419] = ["CLEAR-SKY UP SW ON LEVELS W/ FORCING", "", "W m-2", "", ""] -atm_stashvar[1420] = ["CLEAR-SKY DOWN SW ON LEVELS W/ FORC", "", "W m-2", "", ""] -atm_stashvar[1433] = ["CLEAR-SKY SW HEATING RATES W/ FORC", "", "", "", ""] -atm_stashvar[1435] = ["TOTAL DOWNWARD SURF. SW FORCING", "", "", "", ""] -atm_stashvar[1437] = ["NET DOWNWARD SW AT TROP. W/ FORCING", "", "W m-2", "", ""] -atm_stashvar[1438] = ["UPWARD SW AT TROPOPAUSE W/ FORCING", "", "W m-2", "", ""] -atm_stashvar[1472] = ["DIRECT FLUX SPHERICAL GEOM 2nd CALL", "", "", "", ""] -atm_stashvar[1473] = ["CLEAR DIRECT FLUX SPH GEOM 2nd CALL", "", "", "", ""] -atm_stashvar[1474] = ["CLEAN DIRECT FLUX SPH GEOM 2nd CALL", "", "", "", ""] -atm_stashvar[1475] = ["CLR-CLN DIRECT FLX SPH GEOM 2nd CALL", "", "", "", ""] -atm_stashvar[1476] = ["DIRECT FLUX DIVERGENCE 2nd CALL", "", "", "", ""] -atm_stashvar[1477] = ["CLEAR-SKY DIRECT FLUX DIV 2nd CALL", "", "", "", ""] -atm_stashvar[1478] = ["CLEAN-AIR DIRECT FLUX DIV 2nd CALL", "", "", "", ""] -atm_stashvar[1479] = ["CLEAR-CLEAN DIRECT FLUX DIV 2nd CALL", "", "", "", ""] -atm_stashvar[1500] = ["SW DOWN OVER ICE, WGHTD (cats)(W/m2)", "", "W m-2", "", ""] -atm_stashvar[1501] = ["SW DOWN OVER ICE, WGHTD (aggr)(W/m2)", "", "W m-2", "", ""] -atm_stashvar[1502] = ["SW UP OVER ICE, WGHTED (cats)(W/m2)", "", "W m-2", "", ""] -atm_stashvar[1503] = ["SW UP OVER ICE, WGHTED (aggr)(W/m2)", "", "W m-2", "", ""] -atm_stashvar[1504] = ["SEA ICE ALBEDO, WEIGHTED (cats)", "", "1", "", ""] -atm_stashvar[1505] = ["SEA ICE ALBEDO, WEIGHTED (aggregate)", "", "1", "", ""] -atm_stashvar[1506] = ["TOTAL AOD IN LAYERS AND SW BANDS", "", "1", "", ""] -atm_stashvar[1507] = ["TOTAL SCATTERING AOD LAYERS/SW BANDS", "", "1", "", ""] -atm_stashvar[1508] = ["AERO ASYM (WGTD) IN LAYERS/SW BANDS", "", "", "", ""] -atm_stashvar[1509] = ["UPWARD SW FLUX ON LEVELS AND BANDS", "", "", "", ""] -atm_stashvar[1510] = ["DOWNWARD SW FLUX ON LEVELS AND BANDS", "", "", "", ""] -atm_stashvar[1511] = ["CLEAR UP SW FLUX ON LEVELS AND BANDS", "", "", "", ""] -atm_stashvar[1512] = ["CLEAR DOWN SW FLUX ON LEVS AND BANDS", "", "", "", ""] -atm_stashvar[1513] = ["SW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1514] = ["CLEAR-SKY SW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1515] = ["CLEAN-AIR SW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1516] = ["CLEAR-CLEAN SW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1517] = ["CLEAN-AIR UPWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1518] = ["CLEAN-AIR DOWNWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1519] = ["CLEAR-CLEAN UPWARD SW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[1520] = ["CLEAR-CLEAN DOWNWARD SW FLUX ON LEVS", "", "", "", ""] -atm_stashvar[1521] = ["UPWARD SW FLUX ON LEVELS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1522] = ["DOWNWARD SW FLUX ON LEVS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1523] = ["CLEAR UP SW FLUX ON LEVS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1524] = ["CLR DOWN SW FLUX ON LEVS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1525] = ["UP SW FLUX LEVS/BANDS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1526] = ["DOWN SW FLUX LEVS/BANDS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1527] = ["CLR UP SW FLUX LEVS/BNDS W/ GHG FORC", "", "", "", ""] -atm_stashvar[1528] = ["CLR DOWN SW FLUX LVS/BNDS W/GHG FORC", "", "", "", ""] -atm_stashvar[1529] = ["DIRECT FLUX SPH GEOM W/ GHG FORCING", "", "", "", ""] -atm_stashvar[1530] = ["CLR DIRECT FLUX SPH GEOM W/ GHG FORC", "", "", "", ""] -atm_stashvar[1531] = ["DIRECT FLUX DIVERGENCE W/ GHG FORC", "", "", "", ""] -atm_stashvar[1532] = ["CLEAR DIRECT FLUX DIV W/ GHG FORCING", "", "", "", ""] -atm_stashvar[1533] = ["DIRECT FLUX SPH BANDS W/ GHG FORCING", "", "", "", ""] -atm_stashvar[1534] = ["CLR DIRECT FLUX SPH BANDS W/GHG FORC", "", "", "", ""] -atm_stashvar[1535] = ["DIRECT FLUX DIV BANDS W/ GHG FORCING", "", "", "", ""] -atm_stashvar[1536] = ["CLR DIRECT FLUX DIV BANDS W/GHG FORC", "", "", "", ""] -atm_stashvar[1537] = ["DIRECT FLUX (SPHERICAL GEOM) BANDS", "", "", "", ""] -atm_stashvar[1538] = ["CLEAR DIRECT FLUX (SPH GEOM) BANDS", "", "", "", ""] -atm_stashvar[1539] = ["CLEAN DIRECT FLUX (SPH GEOM) BANDS", "", "", "", ""] -atm_stashvar[1540] = ["CLR-CLN DIRECT FLUX (SPH GEOM) BANDS", "", "", "", ""] -atm_stashvar[1541] = ["DIRECT FLUX DIVERGENCE ON BANDS", "", "", "", ""] -atm_stashvar[1542] = ["CLEAR-SKY DIRECT FLUX DIV ON BANDS", "", "", "", ""] -atm_stashvar[1543] = ["CLEAN-AIR DIRECT FLUX DIV ON BANDS", "", "", "", ""] -atm_stashvar[1544] = ["CLEAR-CLEAN DIRECT FLUX DIV ON BANDS", "", "", "", ""] -atm_stashvar[1545] = ["CLEAN-AIR UP SW FLUX ON LEVELS/BANDS", "", "", "", ""] -atm_stashvar[1546] = ["CLEAN-AIR DOWN SW FLUX LEVELS/BANDS", "", "", "", ""] -atm_stashvar[1547] = ["CLEAR-CLEAN UP SW FLUX LEVELS/BANDS", "", "", "", ""] -atm_stashvar[1548] = ["CLEAR-CLEAN DOWN SW FLUX LEVS/BANDS", "", "", "", ""] -atm_stashvar[1550] = ["EASYAEROSOL EXTINCTION ON SW BANDS", "", "", "", ""] -atm_stashvar[1551] = ["EASYAEROSOL ABSORPTION ON SW BANDS", "", "", "", ""] -atm_stashvar[1552] = ["EASYAEROSOL SCATTERING ON SW BANDS", "", "", "", ""] -atm_stashvar[1553] = ["EASYAEROSOL ASY*SCA ON SW BANDS", "", "", "", ""] -atm_stashvar[1555] = ["TRANSMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1556] = ["CLEAR-SKY TRANSMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1557] = ["CLEAN-AIR TRANSMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1558] = ["CLEAR-CLEAN TRANSMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[1709] = ["UPWARD SW FLUX LEVS/BANDS W/ FORCING", "", "", "", ""] -atm_stashvar[1710] = ["DOWNWARD SW FLUX LEVS/BANDS W/ FORC", "", "", "", ""] -atm_stashvar[1711] = ["CLEAR UP SW FLUX LEVS/BANDS W/ FORC", "", "", "", ""] -atm_stashvar[1712] = ["CLEAR DOWN SW FLUX LEVS/BNDS W/ FORC", "", "", "", ""] -atm_stashvar[1713] = ["SW EMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[1714] = ["CLEAR SW EMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[1715] = ["CLEAN SW EMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[1716] = ["CLR-CLN SW EMISSION SPEC 2nd CALL", "", "", "", ""] -atm_stashvar[1717] = ["CLEAN-AIR UPWARD SW FLUX 2nd CALL", "", "", "", ""] -atm_stashvar[1718] = ["CLEAN-AIR DOWNWARD SW FLUX 2nd CALL", "", "", "", ""] -atm_stashvar[1719] = ["CLEAR-CLEAN UPWARD SW FLUX 2nd CALL", "", "", "", ""] -atm_stashvar[1720] = ["CLEAR-CLEAN DOWN SW FLUX 2nd CALL", "", "", "", ""] -atm_stashvar[1737] = ["DIRECT FLUX SPH GEOM BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1738] = ["CLEAR DIRECT FLUX SPH BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1739] = ["CLEAN DIRECT FLUX SPH BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1740] = ["CLR-CLN DIRECT FLX SPH BAND 2nd CALL", "", "", "", ""] -atm_stashvar[1741] = ["DIRECT FLUX DIV ON BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1742] = ["CLEAR DIRECT FLUX DIV BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1743] = ["CLEAN DIRECT FLUX DIV BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1744] = ["CLR-CLN DIRECT FLX DIV BAND 2nd CALL", "", "", "", ""] -atm_stashvar[1745] = ["CLEAN UP SW FLUX ON BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1746] = ["CLEAN DOWN SW FLUX ON BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1747] = ["CLR-CLN UP SW FLUX ON BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1748] = ["CLR-CLN DOWN SW FLUX BANDS 2nd CALL", "", "", "", ""] -atm_stashvar[1755] = ["TRANSMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[1756] = ["CLEAR TRANSMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[1757] = ["CLEAN TRANSMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[1758] = ["CLR-CLN TRANSMISSION SPEC 2nd CALL", "", "", "", ""] -atm_stashvar[2004] = ["TEMPERATURE AFTER LW RAD INCREMENTS", "", "", "", ""] -atm_stashvar[2101] = ["SKYVIEW FACTOR", "", "", "", ""] -atm_stashvar[2110] = ["MASS USED FOR RAD LAYERS (kg/m2)", "", "", "", ""] -atm_stashvar[2111] = ["DENSITY USED FOR RAD LAYERS (kg/m3)", "", "", "", ""] -atm_stashvar[2112] = ["HEAT CAPACITY OF RAD LAYERS (J/K.m2)", "", "", "", ""] -atm_stashvar[2113] = ["PRESSURE USED FOR RAD LAYERS (Pa)", "", "", "", ""] -atm_stashvar[2114] = ["TEMPERATURE USED FOR RAD LAYERS (K)", "", "", "", ""] -atm_stashvar[2115] = ["PRESSURE USED FOR RAD LEVELS (Pa)", "", "", "", ""] -atm_stashvar[2116] = ["TEMPERATURE USED FOR RAD LEVELS (K)", "", "", "", ""] -atm_stashvar[2130] = ["SOLID ANGLE FOR OBSERVER AT 1AU", "", "", "", ""] -atm_stashvar[2161] = ["TEMPERATURE INCR: lwrad MINUS LH PC2", "", "", "", ""] -atm_stashvar[2181] = ["TEMPERATURE INCR: lwrad scheme", "", "", "", ""] -atm_stashvar[2182] = ["SPECIFIC HUMIDITY INCR: lwrad scheme", "", "", "", ""] -atm_stashvar[2183] = ["QCL INCR: lwrad scheme", "", "", "", ""] -atm_stashvar[2192] = ["BULK CLOUD VOL INCR: lwrad scheme", "", "", "", ""] -atm_stashvar[2193] = ["LIQUID CLOUD VOL INCR: lwrad scheme", "", "", "", ""] -atm_stashvar[2194] = ["QCL INCR: lwrad positive", "", "", "", ""] -atm_stashvar[2195] = ["QCL INCR: lwrad negative", "", "", "", ""] -atm_stashvar[2198] = ["LIQ CLOUD VOL INCR: lwrad positive", "", "", "", ""] -atm_stashvar[2199] = ["LIQ CLOUD VOL INCR: lwrad negative", "", "", "", ""] -atm_stashvar[2201] = ["NET DOWN SURFACE LW RAD FLUX", "rls", "W m-2", "surface_net_downward_longwave_flux", ""] -atm_stashvar[2203] = ["NET DN LW RAD FLUX:OPEN SEA:SEA MEAN", "", "", "", ""] -atm_stashvar[2204] = ["TOTAL CLOUD AMOUNT IN LW RADIATION", "clt", "1", "cloud_area_fraction", ""] -atm_stashvar[2205] = ["OUTGOING LW RAD FLUX (TOA)", "rlut", "W m-2", "toa_outgoing_longwave_flux", ""] -atm_stashvar[2206] = ["CLEAR-SKY (II) UPWARD LW FLUX (TOA)", "rlutcs", "W m-2", "toa_outgoing_longwave_flux_assuming_clear_sky", ""] -atm_stashvar[2207] = ["DOWNWARD LW RAD FLUX: SURFACE", "rlds", "W m-2", "surface_downwelling_longwave_flux_in_air", ""] -atm_stashvar[2208] = ["CLEAR-SKY (II) DOWN SURFACE LW FLUX", "rldscs", "W m-2", "surface_downwelling_longwave_flux_in_air_assuming_clear_sky", ""] -atm_stashvar[2217] = ["UPWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2218] = ["DOWNWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2219] = ["CLEAR-SKY UPWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2220] = ["CLEAR-SKY DOWNWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2228] = ["CLEAR UPWARD LW AT TOA * AREA WEIGHT", "", "", "", ""] -atm_stashvar[2229] = ["CLEAR-SKY LW AREA WEIGHT", "", "", "", ""] -atm_stashvar[2232] = ["LW HEATING RATES", "", "", "", ""] -atm_stashvar[2233] = ["CLEAR-SKY LW HEATING RATES", "", "", "", ""] -atm_stashvar[2237] = ["NET DOWNWARD LW FLUX AT THE TROP.", "", "", "", ""] -atm_stashvar[2238] = ["DOWNWARD LW FLUX AT THE TROPOPAUSE", "", "", "", ""] -atm_stashvar[2240] = ["AITKEN (SOLUBLE) ABS OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2241] = ["ACCUM (SOLUBLE) ABS OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2242] = ["COARSE (SOLUBLE) ABS OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2243] = ["AITKEN (INSOL) ABS OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2244] = ["ACCUM (INSOL) ABS OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2245] = ["COARSE (INSOL) ABS OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2251] = ["AITKEN MODE (SOLUBLE) STRATO AOD", "", "1", "", ""] -atm_stashvar[2252] = ["ACCUM MODE (SOLUBLE) STRATO AOD", "", "1", "", ""] -atm_stashvar[2253] = ["COARSE MODE (SOLUBLE) STRATO AOD", "", "1", "", ""] -atm_stashvar[2254] = ["AITKEN MODE (INSOL) STRATO AOD", "", "1", "", ""] -atm_stashvar[2255] = ["ACCUM MODE (INSOL) STRATO AOD", "", "1", "", ""] -atm_stashvar[2256] = ["COARSE MODE (INSOL) STRATO AOD", "", "1", "", ""] -atm_stashvar[2260] = ["OZONE MASS MIXING RATIO AFTER LW", "", "", "", ""] -atm_stashvar[2261] = ["TOTAL CLOUD AMOUNT ON LEVELS", "", "", "", ""] -atm_stashvar[2262] = ["WEIGHTED CLOUD ABSORPTIVITY", "", "", "", ""] -atm_stashvar[2263] = ["WEIGHTS FOR CLOUD ABSORPTIVITY", "", "", "", ""] -atm_stashvar[2264] = ["WEIGHTED LAYER CLOUD ABSORPTIVITY", "", "", "", ""] -atm_stashvar[2265] = ["WEIGHTS FOR LAYER CLD ABSORPTIVITY", "", "", "", ""] -atm_stashvar[2266] = ["WEIGHTED CONV.CLOUD ABSORPTIVITY", "", "", "", ""] -atm_stashvar[2267] = ["WEIGHTS FOR CONV.CLOUD ABSORPTIVITY", "", "", "", ""] -atm_stashvar[2269] = ["ISCCP CLOUD WEIGHTS", "", "", "", ""] -atm_stashvar[2270] = ["ISCCP CLOUD 0.3 <= tau", "", "", "", ""] -atm_stashvar[2271] = ["ISCCP CLOUD tau < 0.3", "", "", "", ""] -atm_stashvar[2272] = ["ISCCP CLOUD 0.3 <= tau < 1.3", "", "", "", ""] -atm_stashvar[2273] = ["ISCCP CLOUD 1.3 <= tau < 3.6", "", "", "", ""] -atm_stashvar[2274] = ["ISCCP CLOUD 3.6 <= tau < 9.4", "", "", "", ""] -atm_stashvar[2275] = ["ISCCP CLOUD 9.4 <= tau < 23.0", "", "", "", ""] -atm_stashvar[2276] = ["ISCCP CLOUD 23.0 <= tau < 60.0", "", "", "", ""] -atm_stashvar[2277] = ["ISCCP CLOUD 60.0 <= tau", "", "", "", ""] -atm_stashvar[2280] = ["Ozone Tropopause Index", "", "", "", ""] -atm_stashvar[2281] = ["Ozone Tropopause Height", "", "", "", ""] -atm_stashvar[2282] = ["Thermal Tropopause Index", "", "", "", ""] -atm_stashvar[2283] = ["Thermal Tropopause Height", "", "", "", ""] -atm_stashvar[2284] = ["SULPHATE OPTICAL DEPTH IN RADIATION", "aod_so4", "1", "", ""] -atm_stashvar[2285] = ["MINERAL DUST OPTICAL DEPTH IN RADN.", "aod_dust", "1", "", ""] -atm_stashvar[2286] = ["SEA SALT OPTICAL DEPTH IN RADIATION", "aod_ss", "1", "", ""] -atm_stashvar[2287] = ["SOOT OPTICAL DEPTH IN RADIATION", "aod_bc", "1", "", ""] -atm_stashvar[2288] = ["BIOMASS OPTICAL DEPTH IN RADIATION", "aod_biomass", "1", "", ""] -atm_stashvar[2289] = ["BIOGENIC OPTICAL DEPTH IN RADIATION", "aod_biogenic", "1", "", ""] -atm_stashvar[2290] = ["WEIGHTED ISCCP CLOUD ALBEDO", "", "1", "", ""] -atm_stashvar[2291] = ["WEIGHTED ISCCP CLOUD OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2292] = ["WEIGHTED ISCCP CLOUD TOP PRESSURE", "", "", "", ""] -atm_stashvar[2293] = ["WEIGHTED ISCCP TOTAL CLOUD AREA", "", "", "", ""] -atm_stashvar[2295] = ["FOSSIL FUEL ORG C OPTIC DEPTH IN RAD", "", "1", "", ""] -atm_stashvar[2296] = ["DELTA AEROSOL OPTICAL DEPTH IN RADN.", "", "1", "", ""] -atm_stashvar[2297] = ["AMMONIUM NITRATE OPTICAL DEPTH RADN.", "1", "", "", ""] -atm_stashvar[2298] = ["TOTAL OPTICAL DEPTH IN RADIATION", "", "1", "", ""] -atm_stashvar[2299] = ["ANGSTROM FROM TOTAL AOD IN RADIATION", "", "", "", ""] -atm_stashvar[2300] = ["AITKEN MODE (SOLUBLE) OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2301] = ["ACCUM MODE (SOLUBLE) OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2302] = ["COARSE MODE (SOLUBLE) OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2303] = ["AITKEN MODE (INSOL) OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2304] = ["ACCUM MODE (INSOL) OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2305] = ["COARSE MODE (INSOL) OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2308] = ["GRIDBOX LSC Qcl IN RADIATION KG/KG", "", "", "", ""] -atm_stashvar[2309] = ["GRIDBOX LSC Qcf IN RADIATION KG/KG", "", "", "", ""] -atm_stashvar[2310] = ["GRIDBOX CNV Qcl IN RADIATION KG/KG", "", "", "", ""] -atm_stashvar[2311] = ["GRIDBOX CNV Qcf IN RADIATION KG/KG", "", "", "", ""] -atm_stashvar[2312] = ["GRIDBOX LIQ LSC CF IN RADIATION", "", "", "", ""] -atm_stashvar[2313] = ["GRIDBOX ICE LSC CF IN RADIATION", "", "", "", ""] -atm_stashvar[2314] = ["GRIDBOX LIQ CCA IN RADIATION", "", "", "", ""] -atm_stashvar[2315] = ["GRIDBOX ICE CCA IN RADIATION", "", "", "", ""] -atm_stashvar[2317] = ["CONVECTIVE CORE 3D CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2318] = ["GRIDBOX CONVECTIVE CORE Qcl KG/KG", "", "", "", ""] -atm_stashvar[2319] = ["GRIDBOX CONVECTIVE CORE Qcf KG/KG", "", "", "", ""] -atm_stashvar[2320] = ["COSP: MASK FOR CALIPSO CF ON LVLS", "", "", "", ""] -atm_stashvar[2321] = ["COSP: MASK FOR CALIPSO LOW-LEVEL CF", "", "", "", ""] -atm_stashvar[2322] = ["COSP: MASK FOR CALIPSO MID-LEVEL CF", "", "", "", ""] -atm_stashvar[2323] = ["COSP: MASK FOR CALIPSO HIGH-LEVEL CF", "", "", "", ""] -atm_stashvar[2324] = ["COSP: MASK FOR CALIPSO TOTAL CF", "", "", "", ""] -atm_stashvar[2325] = ["COSP: MASK FOR CALIPSO CF ON 40 LVLS", "", "", "", ""] -atm_stashvar[2326] = ["COSP: MASK FOR 2.358", "", "", "", ""] -atm_stashvar[2327] = ["COSP: MASK FOR 2.359", "", "", "", ""] -atm_stashvar[2330] = ["COSP: ISCCP/MISR/MODIS CLOUD WEIGHTS", "", "", "", ""] -atm_stashvar[2331] = ["COSP: ISCCP WEIGHTED CLOUD ALBEDO", "", "1", "", ""] -atm_stashvar[2332] = ["COSP: ISCCP WEIGHTED CLOUD TAU", "", "", "", ""] -atm_stashvar[2333] = ["COSP: ISCCP WEIGHTED CLOUD TOP PRES.", "", "", "", ""] -atm_stashvar[2334] = ["COSP: ISCCP TOTAL CLOUD AREA", "", "", "", ""] -atm_stashvar[2335] = ["COSP: ISCCP ALL-SKY 10.5 MICRON Tb", "", "", "", ""] -atm_stashvar[2336] = ["COSP: ISCCP CLEAR-SKY 10.5 MICRON Tb", "", "", "", ""] -atm_stashvar[2337] = ["COSP: ISCCP CTP-TAU HISTOGRAM", "", "", "", ""] -atm_stashvar[2340] = ["COSP: CALIPSO MOLECULAR BACKSCATTER", "", "", "", ""] -atm_stashvar[2341] = ["COSP: CALIPSO TOTAL BACKSCATTER", "", "", "", ""] -atm_stashvar[2342] = ["COSP: CALIPSO CFAD SCATTERING RATIO", "", "", "", ""] -atm_stashvar[2343] = ["COSP: CALIPSO CLOUD AREA ON LEVELS", "", "", "", ""] -atm_stashvar[2344] = ["COSP: CALIPSO LOW-LEVEL CLOUD", "", "", "", ""] -atm_stashvar[2345] = ["COSP: CALIPSO MID-LEVEL CLOUD", "", "", "", ""] -atm_stashvar[2346] = ["COSP: CALIPSO HIGH-LEVEL CLOUD", "", "", "", ""] -atm_stashvar[2347] = ["COSP: CALIPSO TOTAL CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2348] = ["COSP: PARASOL TOA REFLECTANCE", "", "", "", ""] -atm_stashvar[2349] = ["COSP: CALIPSO-ONLY 3D CLOUD AREA", "", "", "", ""] -atm_stashvar[2350] = ["COSP: CLOUDSAT CFAD REFLECTIVITY", "", "", "", ""] -atm_stashvar[2351] = ["COSP: CLOUDSAT REFLECTIVITY", "", "", "", ""] -atm_stashvar[2352] = ["COSP: SUBCOLUMN CLOUD ARRAY", "", "", "", ""] -atm_stashvar[2353] = ["COSP: GBX-MEAN CSAT Ze MDL LEVELS", "", "", "", ""] -atm_stashvar[2354] = ["COSP: GBX-MEAN CSAT Ze 40 LEVELS", "", "", "", ""] -atm_stashvar[2355] = ["COSP: GBX-MEAN CALIPSO ATB MDL LVLS", "", "", "", ""] -atm_stashvar[2356] = ["COSP: GBX-MEAN CALIPSO ATB 40 LVLS", "", "", "", ""] -atm_stashvar[2357] = ["COSP: CALIPSO MOLECULAR ATB 40 LVLS", "", "", "", ""] -atm_stashvar[2358] = ["COSP: CALIPSO/CLOUDSAT CLOUD MDL LEV", "", "", "", ""] -atm_stashvar[2359] = ["COSP: CALIPSO/CLOUDSAT CLOUD 40 LEV", "", "", "", ""] -atm_stashvar[2360] = ["COSP: MISR CTH-TAU HISTOGRAM", "", "", "", ""] -atm_stashvar[2370] = ["COSP: CALIPSO CFAD SR 40 CSAT LEVELS", "", "", "", ""] -atm_stashvar[2371] = ["COSP: CALIPSO CLOUD AREA 40 CSAT LVS", "", "", "", ""] -atm_stashvar[2372] = ["COSP: CLOUDSAT CFAD Ze 40 CSAT LVLS", "", "", "", ""] -atm_stashvar[2373] = ["COSP: HYDROMETEOR EFFECTIVE RADIUS", "", "", "", ""] -atm_stashvar[2374] = ["COSP: CALIPSO-ONLY 3D CLOUD 40 LVLS", "", "", "", ""] -atm_stashvar[2375] = ["COSP: LARGE-SCALE CLOUD OPT. DEPTH", "", "", "", ""] -atm_stashvar[2376] = ["COSP: LARGE-SCALE CLOUD EMISSIVITY", "", "", "", ""] -atm_stashvar[2377] = ["COSP: CONVECTIVE CLOUD OPT. DEPTH", "", "", "", ""] -atm_stashvar[2378] = ["COSP: CONVECTIVE CLOUD EMISSIVITY", "", "", "", ""] -atm_stashvar[2380] = ["COSP: Reff L-S CLOUD LIQUID WATER", "", "", "", ""] -atm_stashvar[2381] = ["COSP: Reff L-S CLOUD ICE", "", "", "", ""] -atm_stashvar[2382] = ["COSP: Reff L-S CLOUD RAINFALL", "", "", "", ""] -atm_stashvar[2383] = ["COSP: Reff L-S CLOUD SNOWFALL", "", "", "", ""] -atm_stashvar[2384] = ["COSP: Reff CONV CLOUD LIQUID WATER", "", "", "", ""] -atm_stashvar[2385] = ["COSP: Reff CONV CLOUD ICE", "", "", "", ""] -atm_stashvar[2386] = ["COSP: Reff CONV CLOUD RAINFALL", "", "", "", ""] -atm_stashvar[2387] = ["COSP: Reff CONV CLOUD SNOWFALL", "", "", "", ""] -atm_stashvar[2388] = ["COSP: Reff L-S CLOUD GRAUPEL", "", "", "", ""] -atm_stashvar[2389] = ["COSP: 3D CONVECTIVE RAINFALL RATE", "", "", "", ""] -atm_stashvar[2390] = ["COSP: 3D CONVECTIVE SNOWFALL RATE", "", "", "", ""] -atm_stashvar[2391] = ["LARGE SCALE LIQUID WATER PATH kg/m2", "", "", "", ""] -atm_stashvar[2392] = ["LARGE SCALE ICE WATER PATH kg/m2", "", "", "", ""] -atm_stashvar[2393] = ["CONVECTIVE LIQUID WATER PATH kg/m2", "", "", "", ""] -atm_stashvar[2394] = ["CONVECTIVE ICE WATER PATH kg/m2", "", "", "", ""] -atm_stashvar[2395] = ["CONV. CORE LIQUID WATER PATH kg/m2", "", "", "", ""] -atm_stashvar[2396] = ["CONVECTIVE CORE ICE WATER PATH kg/m2", "", "", "", ""] -atm_stashvar[2397] = ["L-S LIQ WEIGHTED EFFECTIVE DIMENSION", "", "", "", ""] -atm_stashvar[2398] = ["L-S ICE WEIGHTED EFFECTIVE DIMENSION", "", "", "", ""] -atm_stashvar[2399] = ["CNV LIQ WEIGHTED EFFECTIVE DIMENSION", "", "", "", ""] -atm_stashvar[2400] = ["CNV ICE WEIGHTED EFFECTIVE DIMENSION", "", "", "", ""] -atm_stashvar[2406] = ["CLEAR-SKY (II) UPWARD LW FORC.(TOA)", "", "", "", ""] -atm_stashvar[2407] = ["DOWNWARD LW RAD FORCING: SURFACE", "", "", "", ""] -atm_stashvar[2408] = ["CLEAR-SKY (II) DOWN SURF. LW FORC.", "", "", "", ""] -atm_stashvar[2417] = ["UPWARD LW FLUX ON LEVELS W/ FORCING", "", "", "", ""] -atm_stashvar[2418] = ["DOWNWARD LW FLUX ON LEVELS W/ FORC", "", "", "", ""] -atm_stashvar[2419] = ["CLEAR-SKY UP LW ON LEVELS W/ FORCING", "", "", "", ""] -atm_stashvar[2420] = ["CLEAR-SKY DOWN LW ON LEVELS W/ FORC", "", "", "", ""] -atm_stashvar[2421] = ["SULPHATE OPTICAL DEPTH FROM PROGN.", "", "1", "", ""] -atm_stashvar[2422] = ["DUST OPTICAL DEPTH FROM PROGNOSTIC", "", "1", "", ""] -atm_stashvar[2423] = ["SEA SALT OPTICAL DEPTH, DIAGNOSED", "", "1", "", ""] -atm_stashvar[2424] = ["SOOT OPTICAL DEPTH FROM PROGNOSTIC", "", "1", "", ""] -atm_stashvar[2425] = ["BIOMASS OPTICAL DEPTH FROM PROGN.", "", "1", "", ""] -atm_stashvar[2426] = ["OCFF OPTICAL DEPTH FROM PROGNOSTIC", "", "1", "", ""] -atm_stashvar[2427] = ["AMM. NITRATE OPT. DEPTH FROM PROGN.", "", "1", "", ""] -atm_stashvar[2433] = ["CLEAR-SKY LW HEATING RATES W/ FORC", "", "", "", ""] -atm_stashvar[2437] = ["NET DOWNWARD LW AT TROP W/ FORCING", "", "", "", ""] -atm_stashvar[2438] = ["DOWNWARD LW AT TROPOPAUSE W/ FORCING", "", "", "", ""] -atm_stashvar[2450] = ["COSP: MODIS CTP-TAU HISTOGRAM", "", "", "", ""] -atm_stashvar[2451] = ["COSP: MODIS WEIGHTED TOT. CLOUD AREA", "", "", "", ""] -atm_stashvar[2452] = ["COSP: MODIS LIQUID CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2453] = ["COSP: MODIS ICE CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2454] = ["COSP: MODIS HIGH-LVL CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2455] = ["COSP: MODIS MID-LVL CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2456] = ["COSP: MODIS LOW-LVL CLOUD FRACTION", "", "", "", ""] -atm_stashvar[2457] = ["COSP: MODIS WEIGHTED TAU - TOTAL", "", "", "", ""] -atm_stashvar[2458] = ["COSP: MODIS WEIGHTED TAU - LIQUID", "", "", "", ""] -atm_stashvar[2459] = ["COSP: MODIS WEIGHTED TAU - ICE", "", "", "", ""] -atm_stashvar[2460] = ["COSP: MODIS WEIGHTED LOG(TAU) -TOTAL", "", "", "", ""] -atm_stashvar[2461] = ["COSP: MODIS WEIGHTED LOG(TAU) - LIQ", "", "", "", ""] -atm_stashvar[2462] = ["COSP: MODIS WEIGHTED LOG(TAU) - ICE", "", "", "", ""] -atm_stashvar[2463] = ["COSP: MODIS WEIGHTED Reff LIQUID", "", "", "", ""] -atm_stashvar[2464] = ["COSP: MODIS WEIGHTED Reff ICE", "", "", "", ""] -atm_stashvar[2465] = ["COSP: MODIS WEIGHTED CLOUD TOP PRES.", "", "", "", ""] -atm_stashvar[2466] = ["COSP: MODIS WEIGHTED LIQUID W. PATH", "", "", "", ""] -atm_stashvar[2467] = ["COSP: MODIS WEIGHTED ICE WATER PATH", "", "", "", ""] -atm_stashvar[2473] = ["COSP: CALIPSO CF 40 LVLS (LIQ)", "", "", "", ""] -atm_stashvar[2474] = ["COSP: CALIPSO CF 40 LVLS (ICE)", "", "", "", ""] -atm_stashvar[2475] = ["COSP: CALIPSO CF 40 LVLS (UNDET)", "", "", "", ""] -atm_stashvar[2476] = ["COSP: CALIPSO LOW-LEVEL CF (LIQ)", "", "", "", ""] -atm_stashvar[2477] = ["COSP: CALIPSO MID-LEVEL CF (LIQ)", "", "", "", ""] -atm_stashvar[2478] = ["COSP: CALIPSO HIGH-LEVEL CF (LIQ)", "", "", "", ""] -atm_stashvar[2479] = ["COSP: CALIPSO TOTAL CLOUD (LIQ)", "", "", "", ""] -atm_stashvar[2480] = ["COSP: CALIPSO LOW-LEVEL CF (ICE)", "", "", "", ""] -atm_stashvar[2481] = ["COSP: CALIPSO MID-LEVEL CF (ICE)", "", "", "", ""] -atm_stashvar[2482] = ["COSP: CALIPSO HIGH-LEVEL CF (ICE)", "", "", "", ""] -atm_stashvar[2483] = ["COSP: CALIPSO TOTAL CLOUD (ICE)", "", "", "", ""] -atm_stashvar[2484] = ["COSP: CALIPSO LOW-LEVEL CF (UNDET)", "", "", "", ""] -atm_stashvar[2485] = ["COSP: CALIPSO MID-LEVEL CF (UNDET)", "", "", "", ""] -atm_stashvar[2486] = ["COSP: CALIPSO HIGH-LEVEL CF (UNDET)", "", "", "", ""] -atm_stashvar[2487] = ["COSP: CALIPSO TOTAL CLOUD (UNDET)", "", "", "", ""] -atm_stashvar[2500] = ["LW DOWN OVER ICE, WGHTD (cats)(W/m2)", "", "W m-2", "", ""] -atm_stashvar[2501] = ["LW DOWN OVER ICE, WGHTD (aggr)(W/m2)", "", "W m-2", "", ""] -atm_stashvar[2502] = ["LW UP OVR ICE WGHTD(cats)(W/m2)(ret)", "", "W m-2", "", ""] -atm_stashvar[2503] = ["LW UP OVR ICE WGHTD(aggr)(W/m2)(ret)", "", "W m-2", "", ""] -atm_stashvar[2505] = ["DEPTH OF LAYERS IN RADIATION (M)", "", "", "", ""] -atm_stashvar[2506] = ["TOTAL AOD IN LAYERS AND LW BANDS", "", "", "", ""] -atm_stashvar[2507] = ["TOTAL SCATTERING AOD LAYERS/LW BANDS", "", "", "", ""] -atm_stashvar[2508] = ["AERO ASYM (WGTD) IN LAYERS/LW BANDS", "", "", "", ""] -atm_stashvar[2509] = ["UPWARD LW FLUX ON LEVELS AND BANDS", "", "", "", ""] -atm_stashvar[2510] = ["DOWNWARD LW FLUX ON LEVELS AND BANDS", "", "", "", ""] -atm_stashvar[2511] = ["CLEAR UP LW FLUX ON LEVELS AND BANDS", "", "", "", ""] -atm_stashvar[2512] = ["CLEAR DOWN LW FLUX ON LEVS AND BANDS", "", "", "", ""] -atm_stashvar[2513] = ["LW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[2514] = ["CLEAR-SKY LW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[2515] = ["CLEAN-AIR LW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[2516] = ["CLEAR-CLEAN LW EMISSION SPECTRUM", "", "", "", ""] -atm_stashvar[2517] = ["CLEAN-AIR UPWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2518] = ["CLEAN-AIR DOWNWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2519] = ["CLEAR-CLEAN UPWARD LW FLUX ON LEVELS", "", "", "", ""] -atm_stashvar[2520] = ["CLEAR-CLEAN DOWNWARD LW FLUX ON LEVS", "", "", "", ""] -atm_stashvar[2521] = ["UPWARD LW FLUX ON LEVELS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2522] = ["DOWNWARD LW FLUX ON LEVS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2523] = ["CLEAR UP LW FLUX ON LEVS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2524] = ["CLR DOWN LW FLUX ON LEVS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2525] = ["UP LW FLUX LEVS/BANDS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2526] = ["DOWN LW FLUX LEVS/BANDS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2527] = ["CLR UP LW FLUX LEVS/BNDS W/ GHG FORC", "", "", "", ""] -atm_stashvar[2528] = ["CLR DOWN LW FLUX LVS/BNDS W/GHG FORC", "", "", "", ""] -atm_stashvar[2530] = ["UKCA 3D AEROSOL EXTINCTION", "", "", "", ""] -atm_stashvar[2531] = ["UKCA 3D AEROSOL ABSORPTION", "", "", "", ""] -atm_stashvar[2532] = ["UKCA 3D AEROSOL SCATTERING", "", "", "", ""] -atm_stashvar[2533] = ["UKCA 3D AEROSOL ASY * SCATTERING", "", "", "", ""] -atm_stashvar[2540] = ["CLASSIC 3D AEROSOL EXTINCTION", "", "", "", ""] -atm_stashvar[2541] = ["CLASSIC 3D AEROSOL ABSORPTION", "", "", "", ""] -atm_stashvar[2542] = ["CLASSIC 3D AEROSOL SCATTERING", "", "", "", ""] -atm_stashvar[2545] = ["CLEAN-AIR UP LW FLUX ON LEVELS/BANDS", "", "", "", ""] -atm_stashvar[2546] = ["CLEAN-AIR DOWN LW FLUX LEVELS/BANDS", "", "", "", ""] -atm_stashvar[2547] = ["CLEAR-CLEAN UP LW FLUX LEVELS/BANDS", "", "", "", ""] -atm_stashvar[2548] = ["CLEAR-CLEAN DOWN LW FLUX LEVS/BANDS", "", "", "", ""] -atm_stashvar[2550] = ["EASYAEROSOL EXTINCTION ON LW BANDS", "", "", "", ""] -atm_stashvar[2551] = ["EASYAEROSOL ABSORPTION ON LW BANDS", "", "", "", ""] -atm_stashvar[2552] = ["EASYAEROSOL SCATTERING ON LW BANDS", "", "", "", ""] -atm_stashvar[2553] = ["EASYAEROSOL ASY*SCA ON LW BANDS", "", "", "", ""] -atm_stashvar[2584] = ["SULPHATE ABSORPTION OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2585] = ["MINERAL DUST ABS. OPICAL DEPTH", "", "1", "", ""] -atm_stashvar[2586] = ["SEA SALT ABSORPTION OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2587] = ["SOOT ABSORPTION OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2588] = ["BIOMASS ABSORPTION OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2589] = ["BIOGENIC ABSORPTION OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2595] = ["FOSSIL FUEL ORG C ABS. OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2597] = ["AMMONIUM NITRATE ABS. OPTICAL DEPTH", "", "1", "", ""] -atm_stashvar[2709] = ["UPWARD LW FLUX LEVS/BANDS W/ FORCING", "", "", "", ""] -atm_stashvar[2710] = ["DOWNWARD LW FLUX LEVS/BANDS W/ FORC", "", "", "", ""] -atm_stashvar[2711] = ["CLEAR UP LW FLUX LEVS/BANDS W/ FORC", "", "", "", ""] -atm_stashvar[2712] = ["CLEAR DOWN LW FLUX LEVS/BNDS W/ FORC", "", "", "", ""] -atm_stashvar[2713] = ["LW EMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[2714] = ["CLEAR LW EMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[2715] = ["CLEAN LW EMISSION SPECTRUM 2nd CALL", "", "", "", ""] -atm_stashvar[2716] = ["CLR-CLN LW EMISSION SPEC 2nd CALL", "", "", "", ""] -atm_stashvar[3002] = ["U COMPNT OF WIND AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3003] = ["V COMPNT OF WIND AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3004] = ["TEMPERATURE AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3010] = ["SPECIFIC HUMIDITY AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3024] = ["SURFACE TEMPERATURE AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3025] = ["BOUNDARY LAYER DEPTH AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3026] = ["ROUGHNESS LEN. AFTER B.L. (SEE DOC)", "", "", "", ""] -atm_stashvar[3027] = ["EFFECTIVE ROUGHNESS LEN FOR SCALARS", "", "", "", ""] -atm_stashvar[3028] = ["ROUGH LEN FOR MOMENTUM WITHOUT OROG", "", "", "", ""] -atm_stashvar[3049] = ["SEA-ICE TEMPERATURE AFTER B. LAYER", "", "", "", ""] -atm_stashvar[3050] = ["MOISTURE EXCHANGE COEFFS", "", "", "", ""] -atm_stashvar[3051] = ["COMBINED RESIST. TO EVAP ON TILES", "", "", "", ""] -atm_stashvar[3052] = ["COEFFS RATIO FOR 1.5M T ON TILES", "", "", "", ""] -atm_stashvar[3053] = ["QSAT GRAD W.R. T SURF L1 ON TILES", "", "", "", ""] -atm_stashvar[3054] = ["AERODYNAMIC RESISTANCE (S/M)", "", "", "", ""] -atm_stashvar[3055] = ["CUMULATIVE FRACTION TRANSPIRATION", "", "", "", ""] -atm_stashvar[3056] = ["LAND MEAN COMBINED RESIST. TO EVAP", "", "", "", ""] -atm_stashvar[3057] = ["LAND MEAN COEFFS RATIO FOR 1.5M T", "", "", "", ""] -atm_stashvar[3058] = ["LAND MEAN QSAT GRAD W.R. T SURF L1", "", "", "", ""] -atm_stashvar[3060] = ["RHOKH_MIX", "", "", "", ""] -atm_stashvar[3061] = ["RHO_ARESIST (RHOSTAR*CD_STD*VSHR)", "", "", "", ""] -atm_stashvar[3062] = ["ARESIST [ 1/(CD_STD*VSHR) ]", "", "", "", ""] -atm_stashvar[3063] = ["RESIST_B (1/CH-1/CD_STD)/VSHR", "", "", "", ""] -atm_stashvar[3064] = ["DTRDZ_CHARNEY_GRID", "", "", "", ""] -atm_stashvar[3065] = ["GRID-LEVEL OF SML INVERSION (kent)", "", "", "", ""] -atm_stashvar[3066] = ["Rho * entrainment rate (we_lim)", "", "", "", ""] -atm_stashvar[3067] = ["Fraction of the timestep (t_frac)", "", "", "", ""] -atm_stashvar[3068] = ["zrzi", "", "", "", ""] -atm_stashvar[3069] = ["GRID-LEVEL OF DSC INVERSION (kent)", "", "", "", ""] -atm_stashvar[3070] = ["Rho * entrainment rate dsc", "", "", "", ""] -atm_stashvar[3071] = ["Fraction of the timestep dsc", "", "", "", ""] -atm_stashvar[3072] = ["zrzi dsc", "", "", "", ""] -atm_stashvar[3073] = ["ZHSC Top of decoupled layer", "", "", "", ""] -atm_stashvar[3074] = ["Dust div1 surf. layer resist (s/m)", "", "", "", ""] -atm_stashvar[3075] = ["Dust div2 surf. layer resist (s/m)", "", "", "", ""] -atm_stashvar[3076] = ["Dust div3 surf. layer resist (s/m)", "", "", "", ""] -atm_stashvar[3077] = ["Dust div4 surf. layer resist (s/m)", "", "", "", ""] -atm_stashvar[3078] = ["Dust div5 surf. layer resist (s/m)", "", "", "", ""] -atm_stashvar[3079] = ["Dust div6 surf. layer resist (s/m)", "", "", "", ""] -atm_stashvar[3100] = ["FLUX OF TRACER 1 IN BL", "", "", "", ""] -atm_stashvar[3101] = ["FLUX OF TRACER 2 IN BL", "", "", "", ""] -atm_stashvar[3102] = ["FLUX OF TRACER 3 IN BL", "", "", "", ""] -atm_stashvar[3103] = ["FLUX OF TRACER 4 IN BL", "", "", "", ""] -atm_stashvar[3104] = ["FLUX OF TRACER 5 IN BL", "", "", "", ""] -atm_stashvar[3105] = ["FLUX OF TRACER 6 IN BL", "", "", "", ""] -atm_stashvar[3106] = ["FLUX OF TRACER 7 IN BL", "", "", "", ""] -atm_stashvar[3107] = ["FLUX OF TRACER 8 IN BL", "", "", "", ""] -atm_stashvar[3108] = ["FLUX OF TRACER 9 IN BL", "", "", "", ""] -atm_stashvar[3109] = ["FLUX OF TRACER 10 IN BL", "", "", "", ""] -atm_stashvar[3110] = ["FLUX OF TRACER 11 IN BL", "", "", "", ""] -atm_stashvar[3111] = ["FLUX OF TRACER 12 IN BL", "", "", "", ""] -atm_stashvar[3112] = ["FLUX OF TRACER 13 IN BL", "", "", "", ""] -atm_stashvar[3113] = ["FLUX OF TRACER 14 IN BL", "", "", "", ""] -atm_stashvar[3114] = ["FLUX OF TRACER 15 IN BL", "", "", "", ""] -atm_stashvar[3115] = ["FLUX OF TRACER 16 IN BL", "", "", "", ""] -atm_stashvar[3116] = ["FLUX OF TRACER 17 IN BL", "", "", "", ""] -atm_stashvar[3117] = ["FLUX OF TRACER 18 IN BL", "", "", "", ""] -atm_stashvar[3118] = ["FLUX OF TRACER 19 IN BL", "", "", "", ""] -atm_stashvar[3119] = ["FLUX OF TRACER 20 IN BL", "", "", "", ""] -atm_stashvar[3120] = ["FLUX OF TRACER 21 IN BL", "", "", "", ""] -atm_stashvar[3121] = ["FLUX OF TRACER 22 IN BL", "", "", "", ""] -atm_stashvar[3122] = ["FLUX OF TRACER 23 IN BL", "", "", "", ""] -atm_stashvar[3123] = ["FLUX OF TRACER 24 IN BL", "", "", "", ""] -atm_stashvar[3124] = ["FLUX OF TRACER 25 IN BL", "", "", "", ""] -atm_stashvar[3125] = ["FLUX OF TRACER 26 IN BL", "", "", "", ""] -atm_stashvar[3126] = ["FLUX OF TRACER 27 IN BL", "", "", "", ""] -atm_stashvar[3127] = ["FLUX OF TRACER 28 IN BL", "", "", "", ""] -atm_stashvar[3128] = ["FLUX OF TRACER 29 IN BL", "", "", "", ""] -atm_stashvar[3129] = ["FLUX OF TOTAL AEROSOL IN BL", "", "", "", ""] -atm_stashvar[3130] = ["COUNTER GRADIENT TERM OF TAUX", "", "", "", ""] -atm_stashvar[3131] = ["COUNTER GRADIENT TERM OF TAUY", "", "", "", ""] -atm_stashvar[3132] = ["COUNTER GRADIENT TERM OF FTL", "", "", "", ""] -atm_stashvar[3133] = ["COUNTER GRADIENT TERM OF FQW", "", "", "", ""] -atm_stashvar[3134] = ["MIXING LENGTH", "", "", "", ""] -atm_stashvar[3135] = ["PRODUCTION RATE OF TKE BY SHEAR", "", "", "", ""] -atm_stashvar[3136] = ["PRODUCTION RATE OF TKE BY BUOYANCY", "", "", "", ""] -atm_stashvar[3137] = ["DISSIPATION RATE OF TKE", "", "", "", ""] -atm_stashvar[3138] = ["NON-DIM DIFFUSION COEFS FOR UV (SM)", "", "", "", ""] -atm_stashvar[3139] = ["NON-DIM DIFFUSION COEFS FOR TQ (SH)", "", "", "", ""] -atm_stashvar[3140] = ["NON-GRADIENT BUOYANCY FLUX", "", "", "", ""] -atm_stashvar[3141] = ["CLOUD FRACTION IN THE TKE SCHEMES", "", "", "", ""] -atm_stashvar[3142] = ["CONDENSED WATER IN THE TKE SCHEMES", "", "", "", ""] -atm_stashvar[3143] = ["STD. DEV. OF GAUSSIAN", "", "", "", ""] -atm_stashvar[3170] = ["QCL INCR: bdy layer positive", "", "", "", ""] -atm_stashvar[3171] = ["QCL INCR: bdy layer negative", "", "", "", ""] -atm_stashvar[3172] = ["QCF INCR: bdy layer positive", "", "", "", ""] -atm_stashvar[3173] = ["QCF INCR: bdy layer negative", "", "", "", ""] -atm_stashvar[3176] = ["LIQ CLOUD VOL INCR: bdy layer positi", "", "", "", ""] -atm_stashvar[3177] = ["LIQ CLOUD VOL INCR: bdy layer negati", "", "", "", ""] -atm_stashvar[3178] = ["ICE CLOUD VOL INCR: bdy layer positi", "", "", "", ""] -atm_stashvar[3179] = ["ICE CLOUD VOL INCR: bdy layer negati", "", "", "", ""] -atm_stashvar[3181] = ["TEMPERATURE INCR: bdy layer", "", "", "", ""] -atm_stashvar[3182] = ["SPECIFIC HUMIDITY INCR: bdy layer", "", "", "", ""] -atm_stashvar[3183] = ["QCL INCR: bdy layer", "", "", "", ""] -atm_stashvar[3184] = ["QCF INCR: bdy layer", "", "", "", ""] -atm_stashvar[3185] = ["U WIND INCR: bdy layer", "", "", "", ""] -atm_stashvar[3186] = ["V WIND INCR: bdy layer", "", "", "", ""] -atm_stashvar[3187] = ["W WIND INCR: bdy layer", "", "", "", ""] -atm_stashvar[3188] = ["LIQUID WATER TEMP INCR: FRIC DISSIP", "", "", "", ""] -atm_stashvar[3189] = ["LIQUID WATER TEMP INCR: bdy layer", "", "", "", ""] -atm_stashvar[3190] = ["TOTAL (LIQ) WATER INCR: bdy layer", "", "", "", ""] -atm_stashvar[3192] = ["BULK CLOUD VOL INCR: bdy layer", "", "", "", ""] -atm_stashvar[3193] = ["LIQUID CLOUD VOL INCR: bdy layer", "", "", "", ""] -atm_stashvar[3194] = ["FROZEN CLOUD VOL INCR: bdy layer", "", "", "", ""] -atm_stashvar[3195] = ["U WIND INCR: Leonard term", "", "", "", ""] -atm_stashvar[3196] = ["V WIND INCR: Leonard term", "", "", "", ""] -atm_stashvar[3197] = ["TEMPERATURE INCR: Leonard term", "", "", "", ""] -atm_stashvar[3198] = ["SPECIFIC HUMIDITY INCR: Leonard term", "", "", "", ""] -atm_stashvar[3199] = ["W WIND INCR: Leonard term", "", "", "", ""] -atm_stashvar[3201] = ["HT FLUX THROUGH SEAICE:SEA MEAN W/M2", "hfss_ice", "W m-2", "downward_heat_flux_in_sea_ice", ""] -atm_stashvar[3202] = ["HT FLUX FROM SURF TO DEEP SOIL LEV 1", "", "W m-2", "downward_heat_flux_at_ground_level_in_soil", ""] -atm_stashvar[3208] = ["LOWEST LAYER BULK RICHARDSON NO. RIB", "", "", "", ""] -atm_stashvar[3209] = ["10 METRE WIND U-COMP", "uas", "m s-1", "eastward_wind", ""] -atm_stashvar[3210] = ["10 METRE WIND V-COMP", "vas", "m s-1", "northward_wind", ""] -atm_stashvar[3216] = ["BOUNDARY LAYER HEAT FLUXES W/M2", "", "", "", ""] -atm_stashvar[3217] = ["SURFACE SENSIBLE HEAT FLUX W/M2", "hfss", "W m-2", "surface_upward_sensible_heat_flux", ""] -atm_stashvar[3219] = ["X-COMP OF SURF & BL WIND STRESS N/M2", "tauu", "N m-2", "surface_downward_eastward_stress", ""] -atm_stashvar[3220] = ["Y-COMP OF SURF & BL WIND STRESS N/M2", "tauv", "N m-2", "surface_downward_northward_stress", ""] -atm_stashvar[3221] = ["MAG OF SURF & BL WIND STRESS B GRID", "", "", "", ""] -atm_stashvar[3222] = ["B.LAYER TOTAL MOISTURE FLUXS KG/M2/S", "", "", "", ""] -atm_stashvar[3223] = ["SURFACE TOTAL MOISTURE FLUX KG/M2/S", "evspsbl", "kg m-2 s-1", "water_evaporation_flux", ""] -atm_stashvar[3224] = ["WIND MIX EN'GY FL TO SEA:SEA MN W/M2", "", "", "", ""] -atm_stashvar[3225] = ["10 METRE WIND U-COMP B GRID", "uas", "m s-1", "eastward_wind", ""] -atm_stashvar[3226] = ["10 METRE WIND V-COMP B GRID", "vas", "m s-1", "northward_wind", ""] -atm_stashvar[3227] = ["10 METRE WIND SPEED ON B GRID", "wnd", "m s-1", "wind_speed", ""] -atm_stashvar[3228] = ["SFC SH FLX FROM OPEN SEA:SEA MN W/M2", "", "", "", ""] -atm_stashvar[3229] = ["EVAP FROM SOIL SURF -AMOUNT KG/M2/TS", "evpsoil", "kg m-2", "water_evaporation_flux_from_soil", "evpsoil_step"] -atm_stashvar[3230] = ["10 METRE WIND SPEED ON C GRID", "", "", "", ""] -atm_stashvar[3231] = ["SUBLIM. FROM SURFACE (GBM) KG/M2/TS", "", "", "", ""] -atm_stashvar[3232] = ["EVAP FROM OPEN SEA: SEA MEAN KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3234] = ["SURFACE LATENT HEAT FLUX W/M2", "hfls", "W m-2", "surface_upward_latent_heat_flux", ""] -atm_stashvar[3235] = ["SEAICE TOP MELT LH FLX:SEA MEAN W/M2", "", "W m-2", "", ""] -atm_stashvar[3236] = ["TEMPERATURE AT 1.5M", "tas", "K", "air_temperature", ""] -atm_stashvar[3237] = ["SPECIFIC HUMIDITY AT 1.5M", "huss", "1", "specific_humidity", ""] -atm_stashvar[3238] = ["DEEP SOIL TEMPERATURE AFTER B.LAYER", "tsl", "K", "soil_temperature", ""] -atm_stashvar[3239] = ["CLOUD LIQUID WATER AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3240] = ["CLOUD ICE CONTENT AFTER B.LAYER", "", "", "", ""] -atm_stashvar[3241] = ["TOTAL SURF MOIST FLUX PER TIMESTEP", "", "", "", ""] -atm_stashvar[3245] = ["RELATIVE HUMIDITY AT 1.5M", "", "%", "relative_humidity", ""] -atm_stashvar[3247] = ["VISIBILITY AT 1.5M M", "", "", "", ""] -atm_stashvar[3248] = ["FOG FRACTION AT 1.5 M", "", "", "", ""] -atm_stashvar[3250] = ["DEWPOINT AT 1.5M (K)", "", "", "", ""] -atm_stashvar[3251] = ["SILHOUETTE OROGRAPHIC ROUGHNESS", "", "", "", ""] -atm_stashvar[3252] = ["HALF OF (PEAK TO TROUGH HT OF OROG)", "", "", "", ""] -atm_stashvar[3253] = ["PROBABILITY OF VIS LESS THAN 5 KM", "", "", "", ""] -atm_stashvar[3254] = ["TL AT 1.5M", "", "", "", ""] -atm_stashvar[3255] = ["QT AT 1.5M", "", "", "", ""] -atm_stashvar[3256] = ["Heat flux through sea ice (W/m2)", "", "", "", ""] -atm_stashvar[3257] = ["Heat flux in sea ice surface melt", "", "W m-2", "", ""] -atm_stashvar[3258] = ["SURFACE SNOWMELT HEAT FLUX W/M2", "", "W m-2", "surface_snow_melt_heat_flux", ""] -atm_stashvar[3259] = ["CANOPY CONDUCTANCE M/S", "", "", "", ""] -atm_stashvar[3261] = ["GROSS PRIMARY PRODUCTIVITY KG C/M2/S", "gpp", "kg m-2 s-1", "gross_primary_productivity_of_biomass_expressed_as_carbon", ""] -atm_stashvar[3262] = ["NET PRIMARY PRODUCTIVITY KG C/M2/S", "npp", "kg m-2 s-1", "net_primary_productivity_of_biomass_expressed_as_carbon", ""] -atm_stashvar[3263] = ["PLANT RESPIRATION KG/M2/S", "resp", "kg m-2 s-1", "plant_respiration_carbon_flux", ""] -atm_stashvar[3270] = ["SO2 SURFACE DRY DEP FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3271] = ["SO4 AIT SURF DRY DEP FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3272] = ["SO4 ACC SURF DRY DEP FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3273] = ["SO4 DIS SURF DRY DEP FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3274] = ["ACCUM NITRATE DRY DEP FLX KG[N]/M2/S", "", "", "", ""] -atm_stashvar[3275] = ["DISS NITRATE DRY DEP FLUX KG[N]/M2/S", "", "", "", ""] -atm_stashvar[3281] = ["VIS AT 1.5M (incl precip) M", "", "", "", ""] -atm_stashvar[3282] = ["PROB OF VIS < 1 KM (incl precip)", "", "", "", ""] -atm_stashvar[3283] = ["PROB OF VIS < 5 KM (incl precip)", "", "", "", ""] -atm_stashvar[3284] = ["VISIBILITY AT 1.5M IN LS PPTN M", "", "", "", ""] -atm_stashvar[3285] = ["VISIBILITY AT 1.5M IN CONV PPTN M", "", "", "", ""] -atm_stashvar[3287] = ["CANOPY EVAPORATION ON TILES", "evspsblveg_tile", "kg m-2 s-1", "water_evaporation_flux_from_canopy", ""] -atm_stashvar[3288] = ["TRANSPIRATION+SOIL EVP ON TILES", "", "kg m-2 s-1", "water_evaporation_flux", ""] -atm_stashvar[3289] = ["GROSS PRIMARY PRODUCTIVITY ON PFTS", "gpp_tile", "kg m-2 s-1", "gross_primary_productivity_of_biomass_expressed_as_carbon", ""] -atm_stashvar[3290] = ["SURFACE SENSIBLE HEAT FLUX ON TILES", "hfss", "W m-2", "surface_upward_sensible_heat_flux", "hfss_tile"] -atm_stashvar[3291] = ["NET PRIMARY PRODUCTIVITY ON PFTS", "npp_tile", "kg m-2 s-1", "net_primary_productivity_of_biomass_expressed_as_carbon", ""] -atm_stashvar[3292] = ["PLANT RESPIRATION ON PFTS KG C/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3293] = ["SOIL RESPIRATION KG C/M2/S", "resp_soil", "kg m-2 s-1", "", ""] -atm_stashvar[3294] = ["BULK RICHARDSON NUMBER ON TILES", "", "", "", ""] -atm_stashvar[3296] = ["EVAP FROM SOIL SURF : RATE KG/M2/S", "evspsblsoil", "kg m-2 s-1", "water_evaporation_flux_from_soil", ""] -atm_stashvar[3297] = ["EVAP FROM CANOPY : RATE KG/M2/S", "evspsblveg", "kg m-2 s-1", "water_evaporation_flux_from_canopy", ""] -atm_stashvar[3298] = ["SUBLIM. SURFACE (GBM) : RATE KG/M2/S", "sbl", "kg m-2 s-1", "surface_snow_and_ice_sublimation_flux", ""] -atm_stashvar[3300] = ["NH3 SURFACE DRY DEP FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3301] = ["FRESH SOOT DRY DEPN FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3302] = ["AGED SOOT DRY DEPN FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3303] = ["SOOT IN CLOUD DEPN FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3304] = ["TURBULENT MIXING HT AFTER B.LAYER m", "", "", "", ""] -atm_stashvar[3305] = ["STABLE BL INDICATOR", "", "", "", ""] -atm_stashvar[3306] = ["STRATOCUM. OVER STABLE BL INDICATOR", "", "", "", ""] -atm_stashvar[3307] = ["WELL_MIXED BL INDICATOR", "", "", "", ""] -atm_stashvar[3308] = ["DECOUPLED SC. NOT OVER CU. INDICATOR", "", "", "", ""] -atm_stashvar[3309] = ["DECOUPLED SC. OVER CU. INDICATOR", "", "", "", ""] -atm_stashvar[3310] = ["CUMULUS-CAPPED BL INDICATOR", "", "", "", ""] -atm_stashvar[3313] = ["SOIL MOIS AVAIL FACTOR ON PFTS", "", "", "", ""] -atm_stashvar[3314] = ["SURFACE NET RADIATION ON TILES", "netrad_tile", "W m-2", "", ""] -atm_stashvar[3316] = ["SURFACE TEMP ON TILES K", "ts", "K", "surface_temperature", "ts_tile"] -atm_stashvar[3317] = ["SURFACE TILE FRACTIONS", "", "1", "", ""] -atm_stashvar[3318] = ["LEAF AREA INDICES ON PFTS", "", "1", "", ""] -atm_stashvar[3319] = ["CANOPY HEIGHT ON PFTS", "", "m", "", ""] -atm_stashvar[3320] = ["SOIL CARBON CONTENT (B.LAYER) KGC/M2", "", "", "", ""] -atm_stashvar[3321] = ["CANOPY WATER ON TILES KG/M2", "cw_tile", "kg m-2", "", ""] -atm_stashvar[3322] = ["CANOPY CAPACITY ON TILES KG/M2", "", "", "", ""] -atm_stashvar[3324] = ["ROUGHNESS LENGTH ON TILES M", "", "", "", ""] -atm_stashvar[3325] = ["LEAF TURNOVER RATE ON PFTS", "", "", "", ""] -atm_stashvar[3326] = ["CO2 LAND SURFACE FLUX KG/M**2/S", "", "", "", ""] -atm_stashvar[3327] = ["CO2 TOTAL FLUX TO ATMOS KG/M**2/S", "", "", "", ""] -atm_stashvar[3328] = ["1.5M TEMPERATURE OVER TILES", "tas_tile", "K", "", ""] -atm_stashvar[3329] = ["1.5M SPECIFIC HUMIDITY OVER TILES", "", "", "", ""] -atm_stashvar[3330] = ["SURFACE LATENT HEAT FLUX ON TILES", "hfls_tile", "W m-2", "", ""] -atm_stashvar[3331] = ["SUBLIMATION MOISTURE FLUX ON TILES", "sbl_tile", "kg m-2 s-1", "", ""] -atm_stashvar[3332] = ["TOA OUTGOING LW RAD AFTER B.LAYER", "rlut", "W m-2", "toa_outgoing_longwave_flux", "rlut_afterbl"] -atm_stashvar[3333] = ["GRID-BOX AVERAGE SURF NET RAD", "", "", "", ""] -atm_stashvar[3334] = ["LAND MEAN POTENTIAL EVAPORATION", "pevap", "kg m-2 s-1", "water_potential_evaporation_flux", ""] -atm_stashvar[3335] = ["POTENTIAL EVAPORATION ON TILES", "pevap", "kg m-2 s-1", "water_potential_evaporation_flux", ""] -atm_stashvar[3337] = ["LAND HT FLUX FROM SURF TO DEEP LEV 1", "", "", "", ""] -atm_stashvar[3338] = ["NET SURF SEA-ICE HT FLUX (SEA MEAN)", "", "", "", ""] -atm_stashvar[3339] = ["LOWEST LAYER BULK RIB: SEA MEAN", "", "", "", ""] -atm_stashvar[3340] = ["SHEAR-DRIVEN B.LAYER INDICATOR", "", "", "", ""] -atm_stashvar[3341] = ["LAND MEAN TEMPERATURE AT 1.5M", "tas", "K", "air_temperature", ""] -atm_stashvar[3342] = ["LAND MEAN SPECIFIC HUMIDITY AT 1.5M", "", "", "", ""] -atm_stashvar[3343] = ["MEAN SEA SFC SH FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3344] = ["10m TEMP OVER SEA/SEAICE K", "", "", "", ""] -atm_stashvar[3345] = ["10m SPEC HUM OVER SEA/SEAICE KG/KG", "", "", "", ""] -atm_stashvar[3347] = ["MOISTURE FLUX FROM MEAN SEA KG/M2/S", "", "", "", ""] -atm_stashvar[3353] = ["SUBLIM. SEAICE:SEA MEAN RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3355] = ["BL THERMAL SPEED (M/S)", "", "", "", ""] -atm_stashvar[3356] = ["HEIGHT OF SURFACE MIXED LAYR TOP (M)", "", "", "", ""] -atm_stashvar[3357] = ["HEIGHT OF DEC STRATOCU LAYER TOP (M)", "", "", "", ""] -atm_stashvar[3358] = ["BL DEPTH DIAGNOSED FROM RICRIT (M)", "", "", "", ""] -atm_stashvar[3359] = ["HEIGHT OF DIAGNOSTIC PARCEL TOP (M)", "", "", "", ""] -atm_stashvar[3360] = ["HEIGHT OF DECOUPLED LAYER BASE", "", "", "", ""] -atm_stashvar[3361] = ["HEIGHT OF STRATOCUMULUS CLOUD BASE", "", "", "", ""] -atm_stashvar[3362] = ["ENTRAINMENT RATE FOR SURFACE ML", "", "", "", ""] -atm_stashvar[3363] = ["ENTRAINMENT RATE FOR BOUNDARY LAYER", "", "", "", ""] -atm_stashvar[3364] = ["INVERSION THICKNESS (M)", "", "", "", ""] -atm_stashvar[3365] = ["10 METRE NEUTRAL WIND U-COMP B GRID", "", "", "", ""] -atm_stashvar[3366] = ["10 METRE NEUTRAL WIND V-COMP B GRID", "", "", "", ""] -atm_stashvar[3367] = ["10 METRE NEUTRAL WIND SPEED B GRID", "", "", "", ""] -atm_stashvar[3368] = ["10 METRE NEUTRAL WIND U-COMP", "", "", "", ""] -atm_stashvar[3369] = ["10 METRE NEUTRAL WIND V-COMP", "", "", "", ""] -atm_stashvar[3370] = ["X-COMP OF SURF PSEUDOSTRESS M2.S-2", "", "", "", ""] -atm_stashvar[3371] = ["Y-COMP OF SURF PSEUDOSTRESS M2.S-2", "", "", "", ""] -atm_stashvar[3380] = ["SURF NET RAD OVER OPEN SEA", "", "W m-2", "", ""] -atm_stashvar[3381] = ["SFC NET RADN. OVER SEA-ICE:SEA MEAN", "", "W m-2", "", ""] -atm_stashvar[3382] = ["SURFACE NET SW RADIATION ON TILES", "", "W m-2", "", ""] -atm_stashvar[3383] = ["SURFACE UP LW RADIATION ON TILES", "", "W m-2", "", ""] -atm_stashvar[3384] = ["SURFACE DOWN LW RADIATION ON TILES", "", "W m-2", "", ""] -atm_stashvar[3389] = ["SURFACE LAYER WIND SHEAR OVER LAND", "", "", "", ""] -atm_stashvar[3390] = ["MEAN SEA SURFACE LAYER WIND SHEAR", "", "", "", ""] -atm_stashvar[3391] = ["X-COMP OF LAND SURF WIND STRESS N/M2", "", "", "", ""] -atm_stashvar[3392] = ["X-COMP OF MEAN SEA SURF STRESS N/M2", "tauu", "N m-2", "", ""] -atm_stashvar[3393] = ["Y-COMP OF LAND SURF WIND STRESS N/M2", "", "", "", ""] -atm_stashvar[3394] = ["Y-COMP OF MEAN SEA SURF STRESS N/M2", "tauv", "N m-2", "", ""] -atm_stashvar[3395] = ["FRACTION OF LAND", "sftlf", "1", "land_area_fraction", ""] -atm_stashvar[3396] = ["FRESH BIOMASS DRY DEPN FLUX KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3397] = ["AGED BIOMASS DRY DEPN FLUX KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3398] = ["BIOMASS IN CLOUD DEPN FLUX KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3400] = ["Tile area frac. for dust emissions", "", "", "", ""] -atm_stashvar[3401] = ["Dust emissions div 1 (kg/m2/s)", "", "kg m-2 s-1", "", ""] -atm_stashvar[3402] = ["Dust emissions div 2 (kg/m2/s)", "", "kg m-2 s-1", "", ""] -atm_stashvar[3403] = ["Dust emissions div 3 (kg/m2/s)", "", "kg m-2 s-1", "", ""] -atm_stashvar[3404] = ["Dust emissions div 4 (kg/m2/s)", "", "kg m-2 s-1", "", ""] -atm_stashvar[3405] = ["Dust emissions div 5 (kg/m2/s)", "", "kg m-2 s-1", "", ""] -atm_stashvar[3406] = ["Dust emissions div 6 (kg/m2/s)", "", "kg m-2 s-1", "", ""] -atm_stashvar[3407] = ["FRESH OCFF DRY DEPN FLUX KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3408] = ["AGED OCFF DRY DEPN FLUX KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3409] = ["OCFF IN CLOUD DEPN FLUX KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[3411] = ["Dust threshold U* on tiles div 1", "", "", "", ""] -atm_stashvar[3412] = ["Dust threshold U* on tiles div 2", "", "", "", ""] -atm_stashvar[3413] = ["Dust threshold U* on tiles div 3", "", "", "", ""] -atm_stashvar[3414] = ["Dust threshold U* on tiles div 4", "", "", "", ""] -atm_stashvar[3415] = ["Dust threshold U* on tiles div 5", "", "", "", ""] -atm_stashvar[3416] = ["Dust threshold U* on tiles div 6", "", "", "", ""] -atm_stashvar[3417] = ["Dust threshold U* on tiles div 7", "", "", "", ""] -atm_stashvar[3418] = ["Dust threshold U* on tiles div 8", "", "", "", ""] -atm_stashvar[3419] = ["Dust threshold U* on tiles div 9", "", "", "", ""] -atm_stashvar[3421] = ["Dust dry threshold U* on tiles div 1", "", "", "", ""] -atm_stashvar[3422] = ["Dust dry threshold U* on tiles div 2", "", "", "", ""] -atm_stashvar[3423] = ["Dust dry threshold U* on tiles div 3", "", "", "", ""] -atm_stashvar[3424] = ["Dust dry threshold U* on tiles div 4", "", "", "", ""] -atm_stashvar[3425] = ["Dust dry threshold U* on tiles div 5", "", "", "", ""] -atm_stashvar[3426] = ["Dust dry threshold U* on tiles div 6", "", "", "", ""] -atm_stashvar[3427] = ["Dust dry threshold U* on tiles div 7", "", "", "", ""] -atm_stashvar[3428] = ["Dust dry threshold U* on tiles div 8", "", "", "", ""] -atm_stashvar[3429] = ["Dust dry threshold U* on tiles div 9", "", "", "", ""] -atm_stashvar[3430] = ["Dust Friction velocity (U*) on tiles", "", "m s-1", "", ""] -atm_stashvar[3440] = ["TOTAL DUST DEPOSITION FLUX KG/M2/S", "", "", "", ""] -atm_stashvar[3441] = ["Dust dry dep flux from lev 1 div 1", "", "kg m-2 s-1", "", ""] -atm_stashvar[3442] = ["Dust dry dep flux from lev 1 div 2", "", "kg m-2 s-1", "", ""] -atm_stashvar[3443] = ["Dust dry dep flux from lev 1 div 3", "", "kg m-2 s-1", "", ""] -atm_stashvar[3444] = ["Dust dry dep flux from lev 1 div 4", "", "kg m-2 s-1", "", ""] -atm_stashvar[3445] = ["Dust dry dep flux from lev 1 div 5", "", "kg m-2 s-1", "", ""] -atm_stashvar[3446] = ["Dust dry dep flux from lev 1 div 6", "", "kg m-2 s-1", "", ""] -atm_stashvar[3451] = ["Dust dry dep flux from lev 2 div 1", "", "kg m-2 s-1", "", ""] -atm_stashvar[3452] = ["Dust dry dep flux from lev 2 div 2", "", "kg m-2 s-1", "", ""] -atm_stashvar[3453] = ["Dust dry dep flux from lev 2 div 3", "", "kg m-2 s-1", "", ""] -atm_stashvar[3454] = ["Dust dry dep flux from lev 2 div 4", "", "kg m-2 s-1", "", ""] -atm_stashvar[3455] = ["Dust dry dep flux from lev 2 div 5", "", "kg m-2 s-1", "", ""] -atm_stashvar[3456] = ["Dust dry dep flux from lev 2 div 6", "", "kg m-2 s-1", "", ""] -atm_stashvar[3460] = ["X-COMP SURFACE BL STRESS", "", "", "", ""] -atm_stashvar[3461] = ["Y-COMP SURFACE BL STRESS", "", "", "", ""] -atm_stashvar[3462] = ["STOMATAL CONDUCTANCE ON PFTS (M/S)", "", "", "", ""] -atm_stashvar[3463] = ["WIND GUST", "", "", "", ""] -atm_stashvar[3464] = ["OBUKHOV LENGTH", "", "", "", ""] -atm_stashvar[3465] = ["EXPLICIT FRICTION VELOCITY", "", "", "", ""] -atm_stashvar[3466] = ["CONVECTIVE BL VELOCITY SCALE", "", "", "", ""] -atm_stashvar[3467] = ["SURFACE BUOYANCY FLUX", "", "", "", ""] -atm_stashvar[3468] = ["GRADIENT RICHARDSON NUMBER", "", "", "", ""] -atm_stashvar[3469] = ["VERTICAL BUOYANCY GRADIENT", "", "", "", ""] -atm_stashvar[3470] = ["MODULUS OF WIND SHEAR", "", "", "", ""] -atm_stashvar[3471] = ["BL MOMENTUM DIFFUSION", "", "", "", ""] -atm_stashvar[3472] = ["BL HEAT DIFFUSION", "", "", "", ""] -atm_stashvar[3473] = ["TURBULENT KINETIC ENERGY", "", "", "", ""] -atm_stashvar[3474] = ["X-COMP OF DIST OROGRAPHIC STRESS", "", "", "", ""] -atm_stashvar[3475] = ["Y-COMP OF DIST OROGRAPHIC STRESS", "", "", "", ""] -atm_stashvar[3476] = ["COMBINED BOUNDARY LAYER TYPE", "", "", "", ""] -atm_stashvar[3477] = ["DPM SOIL CARBON POOL(B.LAYER) KGC/M2", "", "", "", ""] -atm_stashvar[3478] = ["RPM SOIL CARBON POOL(B.LAYER) KGC/M2", "", "", "", ""] -atm_stashvar[3479] = ["BIO SOIL CARBON POOL(B.LAYER) KGC/M2", "", "", "", ""] -atm_stashvar[3480] = ["HUM SOIL CARBON POOL(B.LAYER) KGC/M2", "", "", "", ""] -atm_stashvar[3481] = ["DPM SOIL RESPIRATION KG C/M2/S", "", "", "", ""] -atm_stashvar[3482] = ["RPM SOIL RESPIRATION KG C/M2/S", "", "", "", ""] -atm_stashvar[3483] = ["BIO SOIL RESPIRATION KG C/M2/S", "", "", "", ""] -atm_stashvar[3484] = ["HUM SOIL RESPIRATION KG C/M2/S", "", "", "", ""] -atm_stashvar[3485] = ["SOIL RESP TEMPERATURE RATE MODIFIER", "", "", "", ""] -atm_stashvar[3486] = ["SOIL RESP MOISTURE RATE MODIFIER", "", "", "", ""] -atm_stashvar[3487] = ["THETA STAR FROM SURFACE FLUX (K)", "", "", "", ""] -atm_stashvar[3488] = ["QV_STAR FROM SURFACE FLUX (kg/kg)", "", "", "", ""] -atm_stashvar[3489] = ["SOIL RESP VEG COVER RATE MODIFIER", "", "", "", ""] -atm_stashvar[3490] = ["ISOPRENE SURF EMIS PER PFTS", "", "", "", ""] -atm_stashvar[3491] = ["TERPENE SURF EMIS PER PFTS", "", "", "", ""] -atm_stashvar[3492] = ["METHANOL SURF EMIS PER PFTS", "", "", "", ""] -atm_stashvar[3493] = ["ACETONE SURF EMIS PER PFTS", "", "", "", ""] -atm_stashvar[3495] = ["ISOPRENE SURF EMIS", "", "", "", ""] -atm_stashvar[3496] = ["TERPENE SURF EMIS", "", "", "", ""] -atm_stashvar[3497] = ["METHANOL SURF EMIS", "", "", "", ""] -atm_stashvar[3498] = ["ACETONE SURF EMIS", "", "", "", ""] -atm_stashvar[3500] = ["IMPLICIT FRICTION VELOCITY", "", "", "", ""] -atm_stashvar[3501] = ["MIXING LENGTH FOR MOMENTUM (M)", "", "", "", ""] -atm_stashvar[3502] = ["MIXING LENGTH FOR SCALARS (M)", "", "", "", ""] -atm_stashvar[3503] = ["RHOKM DIFF COEFF - LOCAL SCHEME", "", "", "", ""] -atm_stashvar[3504] = ["RHOKH DIFF COEFF - LOCAL SCHEME", "", "", "", ""] -atm_stashvar[3505] = ["RHOKM DIFF COEFF - SURF-DRIVEN TURB", "", "", "", ""] -atm_stashvar[3506] = ["RHOKH DIFF COEFF - SURF-DRIVEN TURB", "", "", "", ""] -atm_stashvar[3507] = ["RHOKM DIFF COEFF - CLD-TOP-DRIVEN", "", "", "", ""] -atm_stashvar[3508] = ["RHOKH DIFF COEFF - CLD-TOP-DRIVEN", "", "", "", ""] -atm_stashvar[3509] = ["Seaice sublimation (cats) (kg/m2/s)", "", "", "", ""] -atm_stashvar[3510] = ["Net surf seaice ht flux (cats)(W/m2)", "", "", "", ""] -atm_stashvar[3511] = ["STABILITY FUNCTION FOR SCALARS", "", "", "", ""] -atm_stashvar[3512] = ["STABILITY FUNCTION FOR MOMENTUM", "", "", "", ""] -atm_stashvar[3513] = ["BLENDING WEIGHT FOR 1D BL SCHEME", "", "", "", ""] -atm_stashvar[3520] = ["SURFACE-BASED THETA PERTURBATION (K)", "", "", "", ""] -atm_stashvar[3521] = ["SURFACE-BASED MOISTURE PERTURBATION", "", "", "", ""] -atm_stashvar[3530] = ["LW UP OVER ICE, WEIGHTED(cats)(W/m2)", "", "W m-2", "", ""] -atm_stashvar[3531] = ["LW UP OVER ICE, WEIGHTED(aggr)(W/m2)", "", "W m-2", "", ""] -atm_stashvar[3532] = ["SENS. HF OVER ICE, WGTED(cats)(W/m2)", "", "W m-2", "", ""] -atm_stashvar[3533] = ["SENS. HF OVER ICE, WGTED(aggr)(W/m2)", "", "W m-2", "", ""] -atm_stashvar[3534] = ["TSTAR OVER ICE, WEIGHTED(cats)(K)", "", "K", "", ""] -atm_stashvar[3535] = ["TSTAR OVER ICE, WEIGHTED(aggr)(K)", "", "K", "", ""] -atm_stashvar[3536] = ["SEA ICE TIME FRACTION (cats)", "", "1", "", ""] -atm_stashvar[3537] = ["SEA ICE TIME FRACTION (aggregate)", "", "1", "", ""] -atm_stashvar[3538] = ["SEA AND SEA ICE DRAG COEFFICIENT", "", "", "", ""] -atm_stashvar[3539] = ["TRANSPIRATION GRIDBOX MEAN", "", "", "", ""] -atm_stashvar[3540] = ["TRANSPIRATION ON TILES", "", "", "", ""] -atm_stashvar[3541] = ["SEA AND SEA ICE DRAG COEFF HEAT", "", "", "", ""] -atm_stashvar[3550] = ["LEONARD TERM PARAMETER FOR U", "", "", "", ""] -atm_stashvar[3551] = ["LEONARD TERM PARAMETER FOR V", "", "", "", ""] -atm_stashvar[3552] = ["LEONARD TERM PARAMETER FOR SCALARS", "", "", "", ""] -atm_stashvar[3553] = ["LEONARD TERM VERTICAL FLUX U WIND", "", "", "", ""] -atm_stashvar[3554] = ["LEONARD TERM VERTICAL FLUX V WIND", "", "", "", ""] -atm_stashvar[3555] = ["LEONARD TERM VERTICAL FLUX W WIND", "", "", "", ""] -atm_stashvar[3556] = ["LEONARD TERM VERTICAL FLUX theta_l", "", "", "", ""] -atm_stashvar[3557] = ["LEONARD TERM VERTICAL FLUX qw", "", "", "", ""] -atm_stashvar[3560] = ["X-COMP OF BL WIND STRESS ON P GRID", "", "", "", ""] -atm_stashvar[3561] = ["Y-COMP OF BL WIND STRESS ON P GRID", "", "", "", ""] -atm_stashvar[3662] = ["POTENTIAL NET PRIM PRODUC KG C/M2/S", "", "", "", ""] -atm_stashvar[3663] = ["POTENTIAL PLANT RESPIRATION KG/M2/S", "", "", "", ""] -atm_stashvar[3691] = ["POTEN NET PRIM PRODUC PFTS KG C/M2/S", "", "", "", ""] -atm_stashvar[3692] = ["POTEN PLANT RESP ON PFTS KG C/M2/S", "", "", "", ""] -atm_stashvar[3801] = ["CABLE SOIL TEMPERATURE ON TILES LAYER 1", "tsl_1", "K", "soil_temperature", ""] -atm_stashvar[3802] = ["CABLE SOIL TEMPERATURE ON TILES LAYER 2", "tsl_2", "K", "soil_temperature", ""] -atm_stashvar[3803] = ["CABLE SOIL TEMPERATURE ON TILES LAYER 3", "tsl_3", "K", "soil_temperature", ""] -atm_stashvar[3804] = ["CABLE SOIL TEMPERATURE ON TILES LAYER 4", "tsl_4", "K", "soil_temperature", ""] -atm_stashvar[3805] = ["CABLE SOIL TEMPERATURE ON TILES LAYER 5", "tsl_5", "K", "soil_temperature", ""] -atm_stashvar[3806] = ["CABLE SOIL TEMPERATURE ON TILES LAYER 6", "tsl_6", "K", "soil_temperature", ""] -atm_stashvar[3807] = ["CABLE SOIL MOISTURE ON TILES LAYER 1", "mrsol_1", "kg m-2", "moisture_content_of_soil_layer", ""] -atm_stashvar[3808] = ["CABLE SOIL MOISTURE ON TILES LAYER 2", "mrsol_2", "kg m-2", "moisture_content_of_soil_layer", ""] -atm_stashvar[3809] = ["CABLE SOIL MOISTURE ON TILES LAYER 3" , "mrsol_3", "kg m-2", "moisture_content_of_soil_layer", ""] -atm_stashvar[3810] = ["CABLE SOIL MOISTURE ON TILES LAYER 4", "mrsol_4", "kg m-2", "moisture_content_of_soil_layer", ""] -atm_stashvar[3811] = ["CABLE SOIL MOISTURE ON TILES LAYER 5", "mrsol_5", "kg m-2", "moisture_content_of_soil_layer", ""] -atm_stashvar[3812] = ["CABLE SOIL MOISTURE ON TILES LAYER 6", "mrsol_6", "kg m-2", "moisture_content_of_soil_layer", ""] -atm_stashvar[3813] = ["CABLE FROZEN SOIL MOIST FRAC ON TILES LAYER 1", "mrfsofr_1", "1", "mass_fraction_of_frozen_water_in_soil_moisture", ""] -atm_stashvar[3814] = ["CABLE FROZEN SOIL MOIST FRAC ON TILES LAYER 2", "mrfsofr_2", "1", "mass_fraction_of_frozen_water_in_soil_moisture", ""] -atm_stashvar[3815] = ["CABLE FROZEN SOIL MOIST FRAC ON TILES LAYER 3", "mrfsofr_3", "1", "mass_fraction_of_frozen_water_in_soil_moisture", ""] -atm_stashvar[3816] = ["CABLE FROZEN SOIL MOIST FRAC ON TILES LAYER 4", "mrfsofr_4", "1", "mass_fraction_of_frozen_water_in_soil_moisture", ""] -atm_stashvar[3817] = ["CABLE FROZEN SOIL MOIST FRAC ON TILES LAYER 5", "mrfsofr_5", "1", "mass_fraction_of_frozen_water_in_soil_moisture", ""] -atm_stashvar[3818] = ["CABLE FROZEN SOIL MOIST FRAC ON TILES LAYER 6", "mrfsofr_6", "1", "mass_fraction_of_frozen_water_in_soil_moisture", ""] -atm_stashvar[3819] = ["CABLE SNOW DEPTH ON TILES LAYER 1", "snd_1", "m", "surface_snow_thickness", ""] -atm_stashvar[3820] = ["CABLE SNOW DEPTH ON TILES LAYER 2", "snd_2", "m", "surface_snow_thickness", ""] -atm_stashvar[3821] = ["CABLE SNOW DEPTH ON TILES LAYER 3", "snd_3", "m", "surface_snow_thickness", ""] -atm_stashvar[3822] = ["CABLE SNOW MASS ON TILES LAYER 1", "snw_1", "kg m-2", "surface_snow_amount", ""] -atm_stashvar[3823] = ["CABLE SNOW MASS ON TILES LAYER 2", "snw_2", "kg m-2", "surface_snow_amount", ""] -atm_stashvar[3824] = ["CABLE SNOW MASS ON TILES LAYER 3", "snw_3", "kg m-2", "surface_snow_amount", ""] -atm_stashvar[3825] = ["CABLE SNOW TEMPERATURE ON TILES LAYER 1", "tsn_1", "K", "temperature_in_surface_snow", ""] -atm_stashvar[3826] = ["CABLE SNOW TEMPERATURE ON TILES LAYER 2", "tsn_2", "K", "temperature_in_surface_snow", ""] -atm_stashvar[3827] = ["CABLE SNOW TEMPERATURE ON TILES LAYER 3", "tsn_3", "K", "temperature_in_surface_snow", ""] -atm_stashvar[3828] = ["CABLE SNOW DENSITY ON TILES LAYER 1", "snow_dens_1", "kg m-3", "snow_density", ""] -atm_stashvar[3829] = ["CABLE SNOW DENSITY ON TILES LAYER 2", "snow_dens_2", "kg m-3", "snow_density", ""] -atm_stashvar[3830] = ["CABLE SNOW DENSITY ON TILES LAYER 3", "snow_dens_3", "kg m-3", "snow_density", ""] -atm_stashvar[3831] = ["CABLE MEAN SNOW DENSITY ON TILES", "snow_dens", "kg m-3", "snow_density", ""] -atm_stashvar[3832] = ["CABLE SNOW AGE ON TILES", "snow_age", "day", "age_of_surface_snow", ""] -atm_stashvar[4004] = ["TEMPERATURE AFTER LARGE SCALE PRECIP", "", "", "", ""] -atm_stashvar[4010] = ["SPECIFIC HUMIDITY AFTER LS PRECIP", "", "", "", ""] -atm_stashvar[4100] = ["ICE AGGREGATE FRACTION", "", "", "", ""] -atm_stashvar[4101] = ["MICROPHYSICS GRID BOX FLAG", "", "", "", ""] -atm_stashvar[4102] = ["MEAN FALLSPEED CRYSTALS", "", "", "", ""] -atm_stashvar[4103] = ["MEAN FALLSPEED AGGREGATES", "", "", "", ""] -atm_stashvar[4104] = ["FALLSPEED BRANCH FLAG", "", "", "", ""] -atm_stashvar[4105] = ["FALLSPEED USED", "", "", "", ""] -atm_stashvar[4110] = ["SURFACE RADAR REFLECTIVITY (dBZ)", "", "", "", ""] -atm_stashvar[4111] = ["MAX REFLECTIVITY IN COLUMN (dBZ)", "", "", "", ""] -atm_stashvar[4112] = ["RADAR REFLECTIVITY AT 1KM AGL (dBZ)", "", "", "", ""] -atm_stashvar[4113] = ["GRAUPEL RADAR REFLECTIVITY (dBZ)", "", "", "", ""] -atm_stashvar[4114] = ["ICE AGG RADAR REFLECTIVITY (dBZ)", "", "", "", ""] -atm_stashvar[4115] = ["ICE CRY RADAR REFLECTIVITY (dBZ)", "", "", "", ""] -atm_stashvar[4116] = ["RAIN RADAR REFLECTIVITY (dBZ)", "", "", "", ""] -atm_stashvar[4117] = ["LIQ. CLOUD RADAR REFLECTIVITY (dBZ)", "", "", "", ""] -atm_stashvar[4118] = ["TOTAL RADAR REFLECTIVITY 3D (dBZ)", "", "", "", ""] -atm_stashvar[4130] = ["QCL INCR: pc2 checks positive", "", "", "", ""] -atm_stashvar[4131] = ["QCL INCR: pc2 checks negative", "", "", "", ""] -atm_stashvar[4132] = ["QCF INCR: pc2 checks positive", "", "", "", ""] -atm_stashvar[4133] = ["QCF INCR: pc2 checks negative", "", "", "", ""] -atm_stashvar[4136] = ["LIQ CLOUD VOL INCR: pc2 checks posit", "", "", "", ""] -atm_stashvar[4137] = ["LIQ CLOUD VOL INCR: pc2 checks negat", "", "", "", ""] -atm_stashvar[4138] = ["ICE CLOUD VOL INCR: pc2 checks posit", "", "", "", ""] -atm_stashvar[4139] = ["ICE CLOUD VOL INCR: pc2 checks negat", "", "", "", ""] -atm_stashvar[4141] = ["TEMPERATURE INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4142] = ["SPECIFIC HUMIDITY INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4143] = ["QCL INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4144] = ["QCF INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4152] = ["BULK CLOUD VOL INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4153] = ["LIQ CLOUD VOL INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4154] = ["ICE CLOUD VOL INCR: pc2 checks", "", "", "", ""] -atm_stashvar[4170] = ["QCL INCR: ls rain positive", "", "", "", ""] -atm_stashvar[4171] = ["QCL INCR: ls rain negative", "", "", "", ""] -atm_stashvar[4172] = ["QCF INCR: ls rain positive", "", "", "", ""] -atm_stashvar[4173] = ["QCF INCR: ls rain negative", "", "", "", ""] -atm_stashvar[4176] = ["LIQ CLOUD VOL INCR: ls rain positive", "", "", "", ""] -atm_stashvar[4177] = ["LIQ CLOUD VOL INCR: ls rain negative", "", "", "", ""] -atm_stashvar[4178] = ["ICE CLOUD VOL INCR: ls rain positive", "", "", "", ""] -atm_stashvar[4179] = ["ICE CLOUD VOL INCR: ls rain negative", "", "", "", ""] -atm_stashvar[4181] = ["TEMPERATURE INCR: ls rain", "", "", "", ""] -atm_stashvar[4182] = ["SPECIFIC HUMIDITY INCR: ls rain", "", "", "", ""] -atm_stashvar[4183] = ["QCL INCR: ls rain", "", "", "", ""] -atm_stashvar[4184] = ["QCF INCR: ls rain", "", "", "", ""] -atm_stashvar[4189] = ["RAIN INCR: ls rain kg/kg/timestep", "", "", "", ""] -atm_stashvar[4190] = ["GRAUPEL INCR: ls rain kg/kg/timestep", "", "", "", ""] -atm_stashvar[4191] = ["QCF2 INCR: ls rain kg/kg/timestep", "", "", "", ""] -atm_stashvar[4192] = ["BULK CLOUD VOL INCR: ls rain", "", "", "", ""] -atm_stashvar[4193] = ["LIQUID CLOUD VOL INCR: ls rain", "", "", "", ""] -atm_stashvar[4194] = ["FROZEN CLOUD VOL INCR: ls rain", "", "", "", ""] -atm_stashvar[4201] = ["LARGE SCALE RAIN AMOUNT KG/M2/TS", "", "", "", ""] -atm_stashvar[4202] = ["LARGE SCALE SNOW AMOUNT KG/M2/TS", "", "", "", ""] -atm_stashvar[4203] = ["LARGE SCALE RAINFALL RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[4204] = ["LARGE SCALE SNOWFALL RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[4205] = ["CLOUD LIQUID WATER AFTER LS PRECIP", "", "", "", ""] -atm_stashvar[4206] = ["CLOUD ICE CONTENT AFTER LS PRECIP", "", "", "", ""] -atm_stashvar[4207] = ["RELATIVE HUMIDITY AFTER LS PRECIP", "", "", "", ""] -atm_stashvar[4208] = ["R. HUMIDITY WRT WATER AFTER PRECIP", "", "", "", ""] -atm_stashvar[4209] = ["LARGE SCALE GRAUPEL AMOUNT KG/M2/TS", "", "", "", ""] -atm_stashvar[4210] = ["CLOUD DROP NUMBER CONC. /m3", "", "", "", ""] -atm_stashvar[4211] = ["POT. CLOUD DROP NUMBER CONC. /m3", "", "", "", ""] -atm_stashvar[4212] = ["LARGE SCALE GRAUPEL RATE KG/M2/S", "", "", "", ""] -atm_stashvar[4213] = ["DISS NITR RNOUT BY LS PPN KG[N]/M2/S", "", "", "", ""] -atm_stashvar[4214] = ["ACC NITR WSHOUT BY LS PPN KG[N]/M2/S", "", "", "", ""] -atm_stashvar[4215] = ["NH3 SCAVENGED BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4216] = ["SO2 SCAVENGED BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4219] = ["SO4 DIS SCAVNGD BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4220] = ["SOOT RAINOUT BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4221] = ["SOOT WASHOUT BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4222] = ["RAINFALL RATE OUT OF MODEL LEVELS", "", "", "", ""] -atm_stashvar[4223] = ["SNOWFALL RATE OUT OF MODEL LEVELS", "", "", "", ""] -atm_stashvar[4224] = ["SUPERCOOLED LIQUID WATER CONTENT", "", "", "", ""] -atm_stashvar[4225] = ["SUPERCOOLED RAIN OUT OF MODEL LEVELS", "", "", "", ""] -atm_stashvar[4226] = ["GRAUPEL FALL RATE ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[4227] = ["RAIN FRACTION OUT OF MODEL LEVELS", "", "", "", ""] -atm_stashvar[4228] = ["OCFF RAINOUT BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4229] = ["OCFF WASHOUT BY LS PPN KG/M2/S", "", "", "", ""] -atm_stashvar[4231] = ["Dust wet dep flux ls precip div 1", "", "kg m-2 s-1", "", ""] -atm_stashvar[4232] = ["Dust wet dep flux ls precip div 2", "", "kg m-2 s-1", "", ""] -atm_stashvar[4233] = ["Dust wet dep flux ls precip div 3", "", "kg m-2 s-1", "", ""] -atm_stashvar[4234] = ["Dust wet dep flux ls precip div 4", "", "kg m-2 s-1", "", ""] -atm_stashvar[4235] = ["Dust wet dep flux ls precip div 5", "", "kg m-2 s-1", "", ""] -atm_stashvar[4236] = ["Dust wet dep flux ls precip div 6", "", "kg m-2 s-1", "", ""] -atm_stashvar[4237] = ["BIOMASS RAINOUT BY LS PPN KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[4238] = ["BIOMASS WASHOUT BY LS PPN KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[4240] = ["HOMOGENEOUS NUCLEATION RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4241] = ["HETEROGENOUS NUCLEATION RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4243] = ["DEPOSITION RATE CRY kg/kg/s", "", "", "", ""] -atm_stashvar[4245] = ["DEPOSITION RATE AGG kg/kg/s", "", "", "", ""] -atm_stashvar[4247] = ["RIMING RATE CRY kg/kg/s", "", "", "", ""] -atm_stashvar[4248] = ["RIMING RATE AGG kg/kg/s", "", "", "", ""] -atm_stashvar[4249] = ["CRY RAIN-CAPTURE RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4250] = ["AGG RAIN-CAPTURE RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4251] = ["EVAP OF MELTING CRY kg/kg/s", "", "", "", ""] -atm_stashvar[4252] = ["EVAP OF MELTING SNOW AGG kg/kg/s", "", "", "", ""] -atm_stashvar[4253] = ["MELTING RATE CRY kg/kg/s", "", "", "", ""] -atm_stashvar[4254] = ["MELTING RATE AGG kg/kg/s", "", "", "", ""] -atm_stashvar[4255] = ["SNOW AUTOCONV RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4256] = ["SNOW CAPTURE OF CRYSTALS kg/kg/s", "", "", "", ""] -atm_stashvar[4257] = ["RAIN AUTOCONV RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4258] = ["RAIN ACCRETION RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4259] = ["EVAPORATION OF RAIN RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4260] = ["GRAUPEL AUTOCONV RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4261] = ["GRAUPEL ACCRETION RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4262] = ["GRAUPEL SNOW-CAPTURE RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4263] = ["GRAUPEL MELTING RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4264] = ["GRAUPEL EVAPORATION RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4265] = ["ICE CRYSTAL SEDIMENT RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4266] = ["SNOW AGG. SEDIMENT RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4267] = ["RAIN SEDIMENT RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4268] = ["GRAUPEL SEDIMENT RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4269] = ["DROPLET SETTLE RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4270] = ["DROPLET SETTLE EVAP RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4271] = ["HOMOG FREEZING NUC RAIN. kg/ks/s", "", "", "", ""] -atm_stashvar[4275] = ["SURFACE MAX HAIL DIAMETER mm", "", "", "", ""] -atm_stashvar[4276] = ["COLUMN MAX HAIL DIAMETER mm", "", "", "", ""] -atm_stashvar[4277] = ["MAX HAIL DIAMETER MODEL LEVELS mm", "", "", "", ""] -atm_stashvar[4281] = ["TEMPERATURE INCR: pc2 erosion", "", "", "", ""] -atm_stashvar[4282] = ["SPECIFIC HUMIDITY INCR: pc2 erosion", "", "", "", ""] -atm_stashvar[4283] = ["QCL INCR: pc2 erosion", "", "", "", ""] -atm_stashvar[4292] = ["BULK CLOUD VOL INCR: pc2 erosion", "", "", "", ""] -atm_stashvar[4293] = ["LIQ CLOUD VOL INCR: pc2 erosion", "", "", "", ""] -atm_stashvar[4294] = ["QCL DIAG: TURB. MIXED PHASE (KG/KG)", "", "", "", ""] -atm_stashvar[4295] = ["CFL DIAGNOSED: TURB. MIXED PHASE", "", "", "", ""] -atm_stashvar[4296] = ["TURB. DECORRELATION TIMESCALE (S)", "", "", "", ""] -atm_stashvar[4297] = ["INV. PHASE-RELAXATION TIMESCALE", "", "", "", ""] -atm_stashvar[4298] = ["DIAGNOSED TURBULENT DISSIPATION RATE", "", "", "", ""] -atm_stashvar[4299] = ["INVERSE MIXING TIMESCALE (S-1)", "", "", "", ""] -atm_stashvar[4300] = ["MEAN OF SUBGRID SUPERSAT. PDF", "", "", "", ""] -atm_stashvar[4301] = ["VARIANCE OF SUBGRID SUPERSAT. PDF", "", "", "", ""] -atm_stashvar[4302] = ["L.S. SNOW AMOUNT NO GRAUP KG/M2/TS", "", "", "", ""] -atm_stashvar[4303] = ["QCL INCR MIXED PHASE USING PC2", "", "", "", ""] -atm_stashvar[4304] = ["L.S. SNOWFALL RATE NO GRAUP KG/M2/S", "", "", "", ""] -atm_stashvar[4313] = ["CFL INCR MIXED PHASE USING PC2", "", "", "", ""] -atm_stashvar[4323] = ["SNOWFALL RATE NO GRAUPEL MODEL LEVS", "", "", "", ""] -atm_stashvar[4325] = ["CLOUD COND/EVAP RATE KG/KG/S", "", "", "", ""] -atm_stashvar[4336] = ["ICE CLOUD SEDIMENT. RATE KG/KG/S", "", "", "", ""] -atm_stashvar[4350] = ["HOMO FREEZING OF CLOUD NUMBER TEND.", "", "", "", ""] -atm_stashvar[4351] = ["HOMO FREEZING OF RAIN NUMBER TEND.", "", "", "", ""] -atm_stashvar[4352] = ["HALLETT MOSSOP ICE NUMBER TEND.", "", "", "", ""] -atm_stashvar[4353] = ["ICE NUCLEATION ICE NUMBER TEND.", "", "", "", ""] -atm_stashvar[4354] = ["ICE SEDIMENTATION NUMBER TEND.", "", "", "", ""] -atm_stashvar[4355] = ["SNOW SEDIMENTATION NUMBER TEND.", "", "", "", ""] -atm_stashvar[4356] = ["GRAUPEL SEDIMENTATION NUMBER TEND.", "", "", "", ""] -atm_stashvar[4400] = ["SUBGRID OROG WATER MIX RATIO kg/kg", "", "", "", ""] -atm_stashvar[4401] = ["SUBGRID OROG RAIN ACCR RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4402] = ["SUBGRID OROG SNOW RMNG RATE kg/kg/s", "", "", "", ""] -atm_stashvar[4982] = ["Q INCR: methane oxidation", "", "", "", ""] -atm_stashvar[5010] = ["SPECIFIC HUMIDITY AFTER CONVECTION", "", "", "", ""] -atm_stashvar[5140] = ["QCL INCR: conv inhom positive", "", "", "", ""] -atm_stashvar[5141] = ["QCL INCR: conv inhom negative", "", "", "", ""] -atm_stashvar[5142] = ["QCF INCR: conv inhom positive", "", "", "", ""] -atm_stashvar[5143] = ["QCF INCR: conv inhom negative", "", "", "", ""] -atm_stashvar[5146] = ["LIQ CLOUD VOL INCR: conv inhom posit", "", "", "", ""] -atm_stashvar[5147] = ["LIQ CLOUD VOL INCR: conv inhom negat", "", "", "", ""] -atm_stashvar[5148] = ["ICE CLOUD VOL INCR: conv inhom posit", "", "", "", ""] -atm_stashvar[5149] = ["ICE CLOUD VOL INCR: conv inhom negat", "", "", "", ""] -atm_stashvar[5150] = ["QCL INCR: pc2 turbulence", "", "", "", ""] -atm_stashvar[5151] = ["QCL INCR: pc2 turbulence positive", "", "", "", ""] -atm_stashvar[5152] = ["QCL INCR: pc2 turbulence negative", "", "", "", ""] -atm_stashvar[5156] = ["LIQ CLOUD VOL INCR: pc2 turbulence", "", "", "", ""] -atm_stashvar[5157] = ["LIQ CLOUD VOL INCR: pc2 turb positiv", "", "", "", ""] -atm_stashvar[5158] = ["LIQ CLOUD VOL INCR: pc2 turb negativ", "", "", "", ""] -atm_stashvar[5161] = ["TEMPERATURE INCR: convection", "", "", "", ""] -atm_stashvar[5162] = ["SPECIFIC HUMIDITY INCR: convection", "", "", "", ""] -atm_stashvar[5163] = ["QCL INCR: conv inhom", "", "", "", ""] -atm_stashvar[5164] = ["QCF INCR: conv inhom", "", "", "", ""] -atm_stashvar[5172] = ["BULK CLOUD VOL INCR: conv inhom", "", "", "", ""] -atm_stashvar[5173] = ["LIQUID CLOUD VOL INCR: conv inhom", "", "", "", ""] -atm_stashvar[5174] = ["FROZEN CLOUD VOL INCR: conv inhom", "", "", "", ""] -atm_stashvar[5175] = ["du/dt from downdraughts(ms-2 P grid)", "", "", "", ""] -atm_stashvar[5176] = ["dv/dt from downdraughts(ms-2 P grid)", "", "", "", ""] -atm_stashvar[5181] = ["TEMPERATURE INC:convect +(PC2 inhom)", "", "", "", ""] -atm_stashvar[5182] = ["Q INCR: convection +(PC2 inhom)", "", "", "", ""] -atm_stashvar[5183] = ["QCL INCR: convection +(PC2 inhom)", "", "", "", ""] -atm_stashvar[5184] = ["QCF INCR: convection +(PC2 inhom)", "", "", "", ""] -atm_stashvar[5185] = ["U WIND INCR: convection", "", "", "", ""] -atm_stashvar[5186] = ["V WIND INCR: convection", "", "", "", ""] -atm_stashvar[5187] = ["TEMP INCR: convection (no shallowc)", "", "", "", ""] -atm_stashvar[5188] = ["SPEC HUM INCR:convect. (no shallowc)", "", "", "", ""] -atm_stashvar[5192] = ["BULK CLOUD VOL INCR: convection", "", "", "", ""] -atm_stashvar[5193] = ["LIQUID CLOUD VOL INCR: convection", "", "", "", ""] -atm_stashvar[5194] = ["FROZEN CLOUD VOL INCR: convection", "", "", "", ""] -atm_stashvar[5196] = ["(Convective vert. vel.)^2 [(m/s)^2]", "", "", "", ""] -atm_stashvar[5197] = ["Convective vertical velocity [m/s]", "", "", "", ""] -atm_stashvar[5198] = ["d(Temp)/dt from downdraughts K/s", "", "", "", ""] -atm_stashvar[5199] = ["d(q)/dt from downdraughts kg/kg/s", "", "", "", ""] -atm_stashvar[5201] = ["CONVECTIVE RAIN AMOUNT KG/M2/TS", "", "", "", ""] -atm_stashvar[5202] = ["CONVECTIVE SNOW AMOUNT KG/M2/TS", "", "", "", ""] -atm_stashvar[5205] = ["CONVECTIVE RAINFALL RATE KG/M2/S", "", "kg m-2 s-1", "convective_rainfall_flux", ""] -atm_stashvar[5206] = ["CONVECTIVE SNOWFALL RATE KG/M2/S", "", "kg m-2 s-1", "convective_snowfall_flux", ""] -atm_stashvar[5207] = ["PRESSURE AT CONVECTIVE CLOUD BASE", "ccb", "Pa", "air_pressure_at_convective_cloud_base", ""] -atm_stashvar[5208] = ["PRESSURE AT CONVECTIVE CLOUD TOP", "cct", "Pa", "air_pressure_at_convective_cloud_top", ""] -atm_stashvar[5209] = ["TEMPERATURE AFTER CONVECTION", "", "", "", ""] -atm_stashvar[5210] = ["ICAO HT OF CONVECTIVE CLOUD BASE", "", "", "", ""] -atm_stashvar[5211] = ["ICAO HT OF CONVECTIVE CLOUD TOP", "", "", "", ""] -atm_stashvar[5212] = ["CONV. CLOUD AMOUNT ON EACH MODEL LEV", "", "", "", ""] -atm_stashvar[5213] = ["CONV CLOUD CONDENSED WATER KG/KG", "", "", "", ""] -atm_stashvar[5214] = ["TOTAL RAINFALL RATE: LS+CONV KG/M2/S", "prrn", "kg m-2 s-1", "rainfall_flux", ""] -atm_stashvar[5215] = ["TOTAL SNOWFALL RATE: LS+CONV KG/M2/S", "prsn", "kg m-2 s-1", "snowfall_flux", ""] -atm_stashvar[5216] = ["TOTAL PRECIPITATION RATE KG/M2/S", "pr", "kg m-2 s-1", "precipitation_flux", ""] -atm_stashvar[5217] = ["DILUTE CONVECTIVELY AVAIL POT E J/KG", "", "", "", ""] -atm_stashvar[5218] = ["LOWEST CONV CLOUD BASE LEVEL NO.", "", "", "", ""] -atm_stashvar[5219] = ["LOWEST CONV CLOUD TOP LEVEL NO.", "", "", "", ""] -atm_stashvar[5220] = ["LOWEST CONV CLOUD AMOUNT AFTER CONV", "", "", "", ""] -atm_stashvar[5222] = ["PRESSURE AT LOWEST CONV CLOUD BASE", "", "", "", ""] -atm_stashvar[5223] = ["PRESSURE AT LOWEST CONV CLOUD TOP", "", "", "", ""] -atm_stashvar[5224] = ["ICAO HT OF LOWEST CONV CLOUD BASE", "", "", "", ""] -atm_stashvar[5225] = ["ICAO HT OF LOWEST CONV CLOUD TOP", "", "", "", ""] -atm_stashvar[5226] = ["TOTAL PRECIPITATION AMOUNT KG/M2/TS", "", "kg m-2", "precipitation_amount", ""] -atm_stashvar[5227] = ["NOMINAL 3D CONVECTIVE RAINFALL RATE", "", "", "", ""] -atm_stashvar[5228] = ["NOMINAL 3D CONVECTIVE SNOWFALL RATE", "", "", "", ""] -atm_stashvar[5229] = ["Fractional updraught area", "", "", "", ""] -atm_stashvar[5230] = ["Fractional downdraught area", "", "", "", ""] -atm_stashvar[5231] = ["CAPE TIMESCALE (DEEP) S", "", "", "", ""] -atm_stashvar[5232] = ["INDICATOR REDUCED CAPE TIMESCALE", "", "", "", ""] -atm_stashvar[5233] = ["UNDILUTE CAPE J/KG", "", "", "", ""] -atm_stashvar[5234] = ["UNDILUTE PARCEL CIN J/KG", "", "", "", ""] -atm_stashvar[5235] = ["U compnt of wind after convection", "", "", "", ""] -atm_stashvar[5236] = ["V compnt of wind after convection", "", "", "", ""] -atm_stashvar[5237] = ["NH3 SCAVENGED BY CONV PPN KG/M2/SEC", "", "", "", ""] -atm_stashvar[5238] = ["SO2 SCAVENGED BY CONV PPN KG/M2/SEC", "", "", "", ""] -atm_stashvar[5239] = ["SO4 AIT SCAVNGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5240] = ["SO4 ACC SCAVNGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5241] = ["SO4 DIS SCAVNGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5242] = ["SOOT SCAVNGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5243] = ["BIOMASS SCAVNGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5244] = ["OCFF SCAVNGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5246] = ["UD MFLUX(rho lev) Component A (Pa/s)", "", "", "", ""] -atm_stashvar[5247] = ["ACC NIT SCVGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5248] = ["DISS NIT SCVGD BY CONV PPN KG/M2/S", "", "", "", ""] -atm_stashvar[5249] = ["UD MASS FLUX rho levels (Pa/s)", "", "Pa s-1", "", ""] -atm_stashvar[5250] = ["UPDRAUGHT MASS FLUX (Pa/s)", "", "Pa s-1", "", ""] -atm_stashvar[5251] = ["DOWNDRAUGHT MASS FLUX (PA/S)", "", "Pa s-1", "", ""] -atm_stashvar[5252] = ["UPDRAUGHT ENTRAINMENT RATE (S-1)", "", "", "", ""] -atm_stashvar[5253] = ["UPDRAUGHT DETRAINMENT RATE (S-1)", "", "", "", ""] -atm_stashvar[5254] = ["DOWNDRAUGHT ENTRAINMENT RATE (S-1)", "", "", "", ""] -atm_stashvar[5255] = ["DOWNDRAUGHT DETRAINMENT RATE (S-1)", "", "", "", ""] -atm_stashvar[5256] = ["U INCREMENT MS-2 ( P GRID)", "", "", "", ""] -atm_stashvar[5257] = ["V INCREMENT MS-2 ( P GRID)", "", "", "", ""] -atm_stashvar[5258] = ["DEEP UW STRESS KG M-1 S-2 P GRID", "", "", "", ""] -atm_stashvar[5259] = ["DEEP VW STRESS KG M-1 S-2 P GRID", "", "", "", ""] -atm_stashvar[5260] = ["SHALL UW STRESS KG M-1 S-2 P GRID", "", "", "", ""] -atm_stashvar[5261] = ["SHALL VW STRESS KG M-1 S-2 P GRID", "", "", "", ""] -atm_stashvar[5262] = ["2D CONVECTIVE CLOUD AMOUNT", "", "", "", ""] -atm_stashvar[5263] = ["MID UW STRESS KG M-1 S-2 P GRID", "", "", "", ""] -atm_stashvar[5264] = ["MID VW STRESS KG M-1 S-2 P GRID", "", "", "", ""] -atm_stashvar[5267] = ["DEEP CONVECTION CFL LIMITED", "", "", "", ""] -atm_stashvar[5268] = ["MID-LEVEL CONVECTION CFL LIMITED", "", "", "", ""] -atm_stashvar[5269] = ["DEEP CONVECTION INDICATOR", "", "", "", ""] -atm_stashvar[5270] = ["SHALLOW CONVECTION INDICATOR", "", "", "", ""] -atm_stashvar[5271] = ["CUMULUS OVER OROGRAPHY INDICATOR", "", "", "", ""] -atm_stashvar[5272] = ["MID LEVEL CONVECTION INDICATOR", "", "", "", ""] -atm_stashvar[5273] = ["TOP LEVEL SURFACE MIXING LAYER", "", "", "", ""] -atm_stashvar[5274] = ["TOP LEVEL INITIAL PARCEL ASCENT", "", "", "", ""] -atm_stashvar[5275] = ["MODEL FREEZING LEVEL", "", "", "", ""] -atm_stashvar[5276] = ["TERMINATION LEVEL for DEEP CONVECT", "", "", "", ""] -atm_stashvar[5277] = ["DEEP CONV PRECIP RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[5278] = ["SHALLOW CONV PRECIP RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[5279] = ["MID LEVEL CONV PRECIP RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[5280] = ["CONGESTUS CONV PRECIP RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[5281] = ["Dust wet dep flux conv precip div 1", "", "kg m-2 s-1", "", ""] -atm_stashvar[5282] = ["Dust wet dep flux conv precip div 2", "", "kg m-2 s-1", "", ""] -atm_stashvar[5283] = ["Dust wet dep flux conv precip div 3", "", "kg m-2 s-1", "", ""] -atm_stashvar[5284] = ["Dust wet dep flux conv precip div 4", "", "kg m-2 s-1", "", ""] -atm_stashvar[5285] = ["Dust wet dep flux conv precip div 5", "", "kg m-2 s-1", "", ""] -atm_stashvar[5286] = ["Dust wet dep flux conv precip div 6", "", "kg m-2 s-1", "", ""] -atm_stashvar[5290] = ["WQT FLUX KG/KG M/S UV LEVEL P GRID", "", "", "", ""] -atm_stashvar[5291] = ["WQL FLUX KG/KG M/S UV LEVEL P GRID", "", "", "", ""] -atm_stashvar[5292] = ["WTHETAL FLUX K M/S UV LEV P GRID", "", "", "", ""] -atm_stashvar[5293] = ["WTHETAV FLUX K M/S UV LEV P GRID", "", "", "", ""] -atm_stashvar[5300] = ["SUBCLOUD LAYER CONV VEL SCALE M/S", "", "", "", ""] -atm_stashvar[5301] = ["CUMULUS LAYER CONV VEL SCALE M/S", "", "", "", ""] -atm_stashvar[5302] = ["CLOUD BASE MASS FLUX 1 M/S", "", "", "", ""] -atm_stashvar[5303] = ["CLOUD BASE MASS FLUX 2 M/S", "", "", "", ""] -atm_stashvar[5304] = ["WQT FLUX AT CLOUD BASE KG/KG M/S", "", "", "", ""] -atm_stashvar[5305] = ["WTHETAL FLUX AT CLOUD BASE KG/KGM/S", "", "", "", ""] -atm_stashvar[5306] = ["WQT FLUX AT INVERSION KG/KG M/S", "", "", "", ""] -atm_stashvar[5307] = ["WTHETAL FLUX AT INVERSION KG/KG M/S", "", "", "", ""] -atm_stashvar[5308] = ["HEIGHT OF TOP OF SHALLOW CONV M", "", "", "", ""] -atm_stashvar[5309] = ["HEIGHT OF BASE OF SHALLOW CONV M", "", "", "", ""] -atm_stashvar[5310] = ["CONGESTUS CONVECTION INDICATOR", "", "", "", ""] -atm_stashvar[5311] = ["CONGESTUS CONVECTION INDICATOR 2", "", "", "", ""] -atm_stashvar[5312] = ["TERMINATION LEVEL FOR CONGESTUS", "", "", "", ""] -atm_stashvar[5313] = ["HEIGHT OF TOP OF CONGESTUS M", "", "", "", ""] -atm_stashvar[5314] = ["HEIGHT OF BASE OF CONGESTUS M", "", "", "", ""] -atm_stashvar[5319] = ["FREQ DEEP CONVECTION TERM HERE", "", "", "", ""] -atm_stashvar[5320] = ["MASS FLUX DEEP CONVECTION", "", "", "", ""] -atm_stashvar[5321] = ["MASS FLUX CONGESTUS CONVECTION", "", "", "", ""] -atm_stashvar[5322] = ["MASS FLUX SHALLOW CONVECTION", "", "", "", ""] -atm_stashvar[5323] = ["MASS FLUX MID-LEVEL CONVECTION", "", "", "", ""] -atm_stashvar[5324] = ["DT FROM DEEP CONVECTION K/S", "", "", "", ""] -atm_stashvar[5325] = ["DT FROM CONGESTUS CONVECTION K/S", "", "", "", ""] -atm_stashvar[5326] = ["DT FROM SHALLOW CONVECTION K/S", "", "", "", ""] -atm_stashvar[5327] = ["DT FROM MID-LEVEL CONVECTION K/S", "", "", "", ""] -atm_stashvar[5328] = ["DQ FROM DEEP CONVECTION KG/KG/S", "", "", "", ""] -atm_stashvar[5329] = ["DQ FROM CONGESTUS CONVECTION KG/KG/S", "", "", "", ""] -atm_stashvar[5330] = ["DQ FROM SHALLOW CONVECTION KG/KG/S", "", "", "", ""] -atm_stashvar[5331] = ["DQ FROM MID-LEVEL CONVECTION KG/KG/S", "", "", "", ""] -atm_stashvar[5332] = ["DU FROM DEEP CONV M/S2 ( P GRID)", "", "", "", ""] -atm_stashvar[5333] = ["DU FROM CONGESTUS CONV M/S2 (P GRID)", "", "", "", ""] -atm_stashvar[5334] = ["DU FROM SHALLOW CONV M/S2 ( P GRID)", "", "", "", ""] -atm_stashvar[5335] = ["DU FROM MID-LEVEL CONV M/S2 (P GRID)", "", "", "", ""] -atm_stashvar[5336] = ["DV FROM DEEP CONV M/S2 ( P GRID)", "", "", "", ""] -atm_stashvar[5337] = ["DV FROM CONGESTUS CONV MS-2 (P GRID)", "", "", "", ""] -atm_stashvar[5338] = ["DV FROM SHALLOW CONV MS-2 (P GRID)", "", "", "", ""] -atm_stashvar[5339] = ["DV FROM MID-LEVEL CONV MS-2 (P GRID)", "", "", "", ""] -atm_stashvar[5400] = ["CONV_TYPE INDICATOR", "", "", "", ""] -atm_stashvar[5401] = ["CONV_TYPE INDICATOR 1", "", "", "", ""] -atm_stashvar[5402] = ["CONV_TYPE INDICATOR 2", "", "", "", ""] -atm_stashvar[5403] = ["CONV_TYPE INDICATOR 3", "", "", "", ""] -atm_stashvar[5404] = ["CONV_TYPE INDICATOR 4", "", "", "", ""] -atm_stashvar[5405] = ["CONV_TYPE 1 PRECIP RATE KG/M2/S", "", "", "", ""] -atm_stashvar[5406] = ["CONV_TYPE 2 PRECIP RATE KG/M2/S", "", "", "", ""] -atm_stashvar[5407] = ["CONV_TYPE 3 PRECIP RATE KG/M2/S", "", "", "", ""] -atm_stashvar[5408] = ["CONV_TYPE 4 PRECIP RATE KG/M2/S", "", "", "", ""] -atm_stashvar[5409] = ["DT FROM CONV_TYPE 1 K/S", "", "", "", ""] -atm_stashvar[5410] = ["DT FROM CONV_TYPE 2 K/S", "", "", "", ""] -atm_stashvar[5411] = ["DT FROM CONV_TYPE 3 K/S", "", "", "", ""] -atm_stashvar[5412] = ["DT FROM CONV_TYPE 4 K/S", "", "", "", ""] -atm_stashvar[5413] = ["DQ FROM CONV_TYPE 1 KG/KG/S", "", "", "", ""] -atm_stashvar[5414] = ["DQ FROM CONV_TYPE 2 KG/KG/S", "", "", "", ""] -atm_stashvar[5415] = ["DQ FROM CONV_TYPE 3 KG/KG/S", "", "", "", ""] -atm_stashvar[5416] = ["DQ FROM CONV_TYPE 4 KG/KG/S", "", "", "", ""] -atm_stashvar[5417] = ["MASS FLUX CONV_TYPE 1", "", "", "", ""] -atm_stashvar[5418] = ["MASS FLUX CONV_TYPE 2", "", "", "", ""] -atm_stashvar[5419] = ["MASS FLUX CONV_TYPE 3", "", "", "", ""] -atm_stashvar[5420] = ["MASS FLUX CONV_TYPE 4", "", "", "", ""] -atm_stashvar[5421] = ["HIGHEST LEVEL OF CONV_TYPE 1", "", "", "", ""] -atm_stashvar[5422] = ["HIGHEST LEVEL OF CONV_TYPE 2", "", "", "", ""] -atm_stashvar[5423] = ["HIGHEST LEVEL OF CONV_TYPE 3", "", "", "", ""] -atm_stashvar[5424] = ["HIGHEST LEVEL OF CONV_TYPE 4", "", "", "", ""] -atm_stashvar[5425] = ["WTHETA_L CONV_TYPE 1", "", "", "", ""] -atm_stashvar[5426] = ["WTHETA_L CONV_TYPE 2", "", "", "", ""] -atm_stashvar[5427] = ["WTHETA_L CONV_TYPE 3", "", "", "", ""] -atm_stashvar[5428] = ["WTHETA_L CONV_TYPE 4", "", "", "", ""] -atm_stashvar[5429] = ["WQT CONV_TYPE 1", "", "", "", ""] -atm_stashvar[5430] = ["WQT CONV_TYPE 2", "", "", "", ""] -atm_stashvar[5431] = ["WQT CONV_TYPE 3", "", "", "", ""] -atm_stashvar[5432] = ["WQT CONV_TYPE 4", "", "", "", ""] -atm_stashvar[6002] = ["U COMPNT OF WIND AFTER G.WAVE DRAG", "", "", "", ""] -atm_stashvar[6003] = ["V COMPNT OF WIND AFTER G.WAVE DRAG", "", "", "", ""] -atm_stashvar[6101] = ["EASTWARD FLUX - SPECTRAL PSEUDOMOM.", "", "", "", ""] -atm_stashvar[6102] = ["SOUTHWARD FLUX - SPECTRAL PSEUDOMOM.", "", "", "", ""] -atm_stashvar[6103] = ["WESTWARD FLUX - SPECTRAL PSEUDOMOM.", "", "", "", ""] -atm_stashvar[6104] = ["NORTHWARD FLUX - SPECTRAL PSEUDOMOM.", "", "", "", ""] -atm_stashvar[6105] = ["EASTWARD FORCE FROM SPECTRAL GW", "", "", "", ""] -atm_stashvar[6106] = ["NORTHWARD FORCE FROM SPECTRAL GW", "", "", "", ""] -atm_stashvar[6111] = ["E. FLUX SPECTRAL PSEUDOMOM. P LEVS", "", "", "", ""] -atm_stashvar[6113] = ["W. FLUX SPECTRAL PSEUDOMOM. P LEVS", "", "", "", ""] -atm_stashvar[6115] = ["EAST. FORCE FROM SPECTRAL GW P LEVS", "", "", "", ""] -atm_stashvar[6181] = ["GW HEATING TEMPERATURE INC", "", "", "", ""] -atm_stashvar[6185] = ["U WIND INCR: gwd scheme", "", "", "", ""] -atm_stashvar[6186] = ["V WIND INCR: gwd scheme", "", "", "", ""] -atm_stashvar[6201] = ["X COMPONENT OF GRAVITY WAVE STRESS", "", "", "", ""] -atm_stashvar[6202] = ["Y COMPONENT OF GRAVITY WAVE STRESS", "", "", "", ""] -atm_stashvar[6203] = ["STANDARD DEVIATION OF OROGRAPHY", "", "", "", ""] -atm_stashvar[6204] = ["OROGRAPHIC GRADIENT XX COMPONENT", "", "", "", ""] -atm_stashvar[6205] = ["OROGRAPHIC GRADIENT XY COMPONENT", "", "", "", ""] -atm_stashvar[6206] = ["OROGRAPHIC GRADIENT YY COMPONENT", "", "", "", ""] -atm_stashvar[6207] = ["U-ACCEL FROM SATURATED STRESS", "", "", "", ""] -atm_stashvar[6208] = ["V-ACCEL FROM SATURATED STRESS", "", "", "", ""] -atm_stashvar[6214] = ["U in the GWD surface layer", "", "", "", ""] -atm_stashvar[6215] = ["V in the GWD surface layer", "", "", "", ""] -atm_stashvar[6216] = ["N in the GWD surface layer", "", "", "", ""] -atm_stashvar[6217] = ["GWD Froude number", "", "", "", ""] -atm_stashvar[6218] = ["GWD Blocked Layer Depth", "", "", "", ""] -atm_stashvar[6222] = ["Percent of time with blocked flow", "", "", "", ""] -atm_stashvar[6223] = ["X COMPONENT OF GW SATURATION STRESS", "", "", "", ""] -atm_stashvar[6224] = ["Y COMPONENT OF GW SATURATION STRESS", "", "", "", ""] -atm_stashvar[6227] = ["X COMPONENT OF BLOCKED FLOW STRESS", "", "", "", ""] -atm_stashvar[6228] = ["Y COMPONENT OF BLOCKED FLOW STRESS", "", "", "", ""] -atm_stashvar[6231] = ["U-ACCEL FROM BLOCKED FLOW", "", "", "", ""] -atm_stashvar[6232] = ["V-ACCEL FROM BLOCKED FLOW", "", "", "", ""] -atm_stashvar[6233] = ["% of time num limiter invoked", "", "", "", ""] -atm_stashvar[6234] = ["% redn. of block stress by limiter", "", "", "", ""] -atm_stashvar[6235] = ["X-COMPONENT OF SURFACE SSO STRESS", "", "", "", ""] -atm_stashvar[6236] = ["Y-COMPONENT OF SURFACE SSO STRESS", "", "", "", ""] -atm_stashvar[6237] = ["Froude No. scaling of surface stress", "", "", "", ""] -atm_stashvar[6241] = ["X COMPT OF GRAV. WAVE STRESS P LEVS", "", "", "", ""] -atm_stashvar[6247] = ["U-ACCEL FROM SATURATED STRESS P LEVS", "", "", "", ""] -atm_stashvar[6248] = ["OROGRAPHIC SUB-GRID SLOPE", "", "", "", ""] -atm_stashvar[6249] = ["OROGRAPHIC SUB-GRID ANISOTROPY", "", "", "", ""] -atm_stashvar[6250] = ["OROGRAPHIC SUB-GRID ORIENTATION", "", "", "", ""] -atm_stashvar[8023] = ["SNOW MASS AFTER HYDROLOGY KG/M2", "snw", "kg m-2", "surface_snow_amount", "snw_afterhydrol"] -atm_stashvar[8201] = ["LAND SNOW MELT AMOUNT KG/M2/TS", "", "", "", ""] -atm_stashvar[8202] = ["LAND SNOW MELT HEAT FLUX W/M2", "", "", "", ""] -atm_stashvar[8204] = ["SFC RUNOFF AMOUNT:LAND MEAN KG/M2/TS", "", "", "", ""] -atm_stashvar[8205] = ["SUB-SFC RUNOFF AMT:LAND MN KG/M2/TS", "", "", "", ""] -atm_stashvar[8208] = ["SOIL MOISTURE CONTENT", "mrso", "kg m-2", "mass_content_of_water_in_soil", ""] -atm_stashvar[8209] = ["CANOPY WATER CONTENT", "cw", "kg m-2", "", ""] -atm_stashvar[8223] = ["SOIL MOISTURE CONTENT IN A LAYER", "mrsol", "kg m-2", "mass_content_of_water_in_soil_layer", ""] -atm_stashvar[8225] = ["DEEP SOIL TEMP. AFTER HYDROLOGY DEGK", "tsl", "K", "soil_temperature", ""] -atm_stashvar[8229] = ["UNFROZEN SOIL MOISTURE FRACTION", "mrlqso", "1", "mass_fraction_of_unfrozen_water_in_soil_moisture", ""] -atm_stashvar[8230] = ["FROZEN SOIL MOISTURE FRACTION", "mrfsofr", "1", "mass_fraction_of_frozen_water_in_soil_moisture", ""] -atm_stashvar[8231] = ["LAND SNOW MELT RATE KG/M2/S", "snm", "kg m-2 s-1", "surface_snow_melt_flux", ""] -atm_stashvar[8233] = ["CANOPY THROUGHFALL RATE KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[8234] = ["SURFACE RUNOFF RATE KG/M2/S", "mrros", "kg m-2 s-1", "surface_runoff_flux", ""] -atm_stashvar[8235] = ["SUB-SURFACE RUNOFF RATE KG/M2/S", "mrrob", "kg m-2 s-1", "subsurface_runoff_flux", ""] -atm_stashvar[8236] = ["SNOW AMOUNT ON TILES KG/M2", "", "kg m-2", "", ""] -atm_stashvar[8237] = ["SNOW MELT RATE ON TILES KG/M2/S", "snm_tile", "kg m-2 s-1", "surface_snow_melt_flux", ""] -atm_stashvar[8238] = ["SNOW GRAIN SIZE ON TILES MICRONS", "", "", "", ""] -atm_stashvar[8239] = ["BASE FLOW AMOUNT KG/M2/S", "", "", "", ""] -atm_stashvar[8240] = ["DUNNE RUNOFF KG/M2/S", "", "", "", ""] -atm_stashvar[8241] = ["BASE FLOW FROM ZW LAYER KG/M2/S", "", "", "", ""] -atm_stashvar[8242] = ["CH4 WETLAND FLUX(FOR UKCA) UG C/M2/S", "", "", "", ""] -atm_stashvar[8243] = ["MEAN TOPOGRAPHIC INDEX", "", "", "", ""] -atm_stashvar[8244] = ["STANDARD DEVN IN TOPOGRAPHIC INDEX", "", "", "", ""] -atm_stashvar[8245] = ["INLANDBASINFLOW ATM GRID KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[8246] = ["INTEGRATED GAMMA DISTRIBUTION", "", "", "", ""] -atm_stashvar[8247] = ["SURFACE SATURATION FRACTION", "", "", "", ""] -atm_stashvar[8248] = ["SURFACE WETLAND FRACTION", "", "", "", ""] -atm_stashvar[8249] = ["MEAN WATER TABLE DEPTH M", "", "", "", ""] -atm_stashvar[8250] = ["SATURATION FRAC IN DEEP LAYER", "", "", "", ""] -atm_stashvar[8251] = ["EXP DECAY IN SOIL SAT HYD CONDUCTY", "", "", "", ""] -atm_stashvar[8252] = ["DRAINAGE OUT OF SOIL MODEL KG/M2/S", "", "", "", ""] -atm_stashvar[8258] = ["ACCUM SURFACE RUNOFF RATE KG/M2/S", "", "", "", ""] -atm_stashvar[8259] = ["ACCUM SUB-SURFACE RUNOFF RATEKG/M2/S", "", "", "", ""] -atm_stashvar[8260] = ["CH4 WETLAND FLX(CS) KG C/M2/S", "", "", "", ""] -atm_stashvar[8261] = ["CH4 WETLAND FLX(NPP) KG C/M2/S", "", "", "", ""] -atm_stashvar[8262] = ["CH4 WETLAND FLX(SOIL RESP) KG C/M2/S", "", "", "", ""] -atm_stashvar[8376] = ["SNOW DEPTH ON GROUND ON TILES (M)", "", "", "", ""] -atm_stashvar[8576] = ["TEMP OF TILED SUBSURFACE (K)", "", "", "", ""] -atm_stashvar[8577] = ["TILED HEAT FLUX TO SUBSURFACE W/M2", "", "", "", ""] -atm_stashvar[8578] = ["TILED SNOW MASS BALANCE KG/M2/S", "", "", "", ""] -atm_stashvar[8579] = ["TILED SNOW TOTAL MELT RATE KG/M2/S", "", "", "", ""] -atm_stashvar[8580] = ["TILED SNOW TOTAL REFREEZE KG/M2/S", "", "", "", ""] -atm_stashvar[8581] = ["TILED SNOW SOLIDMASS CHANGE KG/M2/S", "", "", "", ""] -atm_stashvar[8582] = ["TILED SNOW LIQUID CHANGE KG/M2/S", "", "", "", ""] -atm_stashvar[8583] = ["TILED SNOW NET RUNOFF KG/M2/S", "", "", "", ""] -atm_stashvar[8700] = ["BURNT AREA FRACTION(POTEN) S-1", "", "", "", ""] -atm_stashvar[8701] = ["C EMISS (POTEN) KG C/M2/S", "", "", "", ""] -atm_stashvar[8702] = ["DPM C EMISS (POTEN) KG C/M2/S", "", "", "", ""] -atm_stashvar[8703] = ["RPM C EMISS (POTEN) KG C/M2/S", "", "", "", ""] -atm_stashvar[8710] = ["BURNT AREA FRAC ON PFTS (POTEN) S-1", "", "", "", ""] -atm_stashvar[8711] = ["C EMISS ON PFTS (POTEN) KG C/M2/S", "", "", "", ""] -atm_stashvar[8720] = ["CO2 EMISS (POTEN) KG/M2/S", "", "", "", ""] -atm_stashvar[8721] = ["CO EMISS (POTEN) KG/M2/S", "", "", "", ""] -atm_stashvar[8722] = ["CH4 EMISS (POTEN) KG/M2/S", "", "", "", ""] -atm_stashvar[8723] = ["NOx EMISS (POTEN) KG NO/M2/S", "", "", "", ""] -atm_stashvar[8735] = ["CO2 EMISS ON PFTS (POTEN) KG/M2/S", "", "", "", ""] -atm_stashvar[8736] = ["CO EMISS ON PFTS (POTEN) KG/M2/S", "", "", "", ""] -atm_stashvar[8737] = ["CH4 EMISS ON PFTS (POTEN) KG/M2/S", "", "", "", ""] -atm_stashvar[8738] = ["NOx EMISS ON PFTS (POT) KG NO/M2/S", "", "", "", ""] -atm_stashvar[8750] = ["SO2 EMISS (POTEN) KG SO2/M2/S", "", "", "", ""] -atm_stashvar[8751] = ["BC EMISS (POTEN) KG BC/M2/S", "", "", "", ""] -atm_stashvar[8752] = ["OC EMISS (POTEN) KG OC/M2/S", "", "", "", ""] -atm_stashvar[8765] = ["SO2 EMISS ON PFTS (POT) KG SO2/M2/S", "", "", "", ""] -atm_stashvar[8766] = ["BC EMISS ON PFTS (POT) KG BC/M2/S", "", "", "", ""] -atm_stashvar[8767] = ["OC EMISS ON PFTS (POT) KG OC/M2/S", "", "", "", ""] -atm_stashvar[9004] = ["TEMPERATURE AFTER MAIN DYN CLOUD", "", "", "", ""] -atm_stashvar[9010] = ["SPEC. HUMIDITY AFTER MAIN DYN CLOUD", "", "", "", ""] -atm_stashvar[9181] = ["TEMPERATURE INC: bdy layer + ls cld", "", "", "", ""] -atm_stashvar[9182] = ["SPEC HUMIDITY INC: bdy layr + ls cld", "", "", "", ""] -atm_stashvar[9183] = ["QCL INC: bdy layer + ls cld", "", "", "", ""] -atm_stashvar[9201] = ["BULK CLOUD AMOUNT AFTER MAIN CLOUD", "", "", "", ""] -atm_stashvar[9202] = ["VERY LOW CLOUD AMOUNT", "", "", "", ""] -atm_stashvar[9203] = ["LOW CLOUD AMOUNT", "", "", "", ""] -atm_stashvar[9204] = ["MEDIUM CLOUD AMOUNT", "", "", "", ""] -atm_stashvar[9205] = ["HIGH CLOUD AMOUNT", "", "", "", ""] -atm_stashvar[9206] = ["CLOUD LIQUID WATER AFTER MAIN CLOUD", "", "", "", ""] -atm_stashvar[9207] = ["CLOUD ICE CONTENT AFTER DYNAM CLOUD", "", "", "", ""] -atm_stashvar[9208] = ["CLOUD BASE ASL COVER.GT.0.1 OCTA KFT", "", "", "", ""] -atm_stashvar[9209] = ["CLOUD BASE ASL COVER.GT.1.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9210] = ["CLOUD BASE ASL COVER.GT.2.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9211] = ["CLOUD BASE ASL COVER.GT.3.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9212] = ["CLOUD BASE ASL COVER.GT.4.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9213] = ["CLOUD BASE ASL COVER.GT.5.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9214] = ["CLOUD BASE ASL COVER.GT.6.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9215] = ["CLOUD BASE ASL COVER.GT.7.9 OCTA KFT", "", "", "", ""] -atm_stashvar[9216] = ["TOTAL CLOUD AMOUNT - RANDOM OVERLAP", "", "", "", ""] -atm_stashvar[9217] = ["TOTAL CLOUD AMOUNT MAX/RANDOM OVERLP", "clt", "1", "cloud_area_fraction", ""] -atm_stashvar[9218] = ["CLOUD FRACTION BELOW 1000 FT ASL", "", "", "", ""] -atm_stashvar[9219] = ["LOW CLOUD BASE (FT ASL)", "", "", "", ""] -atm_stashvar[9220] = ["LOW CLOUD TOP (FT ASL)", "", "", "", ""] -atm_stashvar[9221] = ["WET BULB FREEZING LEV HEIGHT (M)", "", "", "", ""] -atm_stashvar[9222] = ["WET BULB TEMPERATURE (K)", "", "", "", ""] -atm_stashvar[9223] = ["TOTAL CLOUD TOP HEIGHT (KFT)", "", "", "", ""] -atm_stashvar[9226] = ["LAYER CLOUD FREQUENCY IN EACH LAYER", "", "", "", ""] -atm_stashvar[9228] = ["CRITICAL RELATIVE HUMIDITY IN LAYERS", "", "", "", ""] -atm_stashvar[9229] = ["RELATIVE HUMIDITY AFTER MAIN CLOUD", "", "", "", ""] -atm_stashvar[9230] = ["VISIBILITY ON MODEL LEVELS M", "", "", "", ""] -atm_stashvar[9231] = ["COMBINED CLOUD AMOUNT IN EACH LAYER", "", "", "", ""] -atm_stashvar[9232] = ["CEILOMETER CLD AMT - RANDOM OVERLAP", "", "", "", ""] -atm_stashvar[9233] = ["CEILOMETER CLD AMT MAX/RANDOM OVERLP", "", "", "", ""] -atm_stashvar[9234] = ["CEILOMETER CLOUD AMT IN EACH LAYER", "", "", "", ""] -atm_stashvar[9238] = ["CLOUD TOP ASL COVER.GT.0.1 OCTA KFT", "", "", "", ""] -atm_stashvar[9239] = ["CLOUD TOP ASL COVER.GT.1.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9240] = ["CLOUD TOP ASL COVER.GT.2.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9241] = ["CLOUD TOP ASL COVER.GT.3.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9242] = ["CLOUD TOP ASL COVER.GT.4.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9243] = ["CLOUD TOP ASL COVER.GT.5.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9244] = ["CLOUD TOP ASL COVER.GT.6.5 OCTA KFT", "", "", "", ""] -atm_stashvar[9245] = ["CLOUD TOP ASL COVER.GT.7.9 OCTA KFT", "", "", "", ""] -atm_stashvar[9310] = ["Icing Index II(RH)", "", "", "", ""] -atm_stashvar[9311] = ["Icing Index Flag II(RH)>0.1", "", "", "", ""] -atm_stashvar[9312] = ["Icing Index Flag II(RH)>0.2", "", "", "", ""] -atm_stashvar[9313] = ["Icing Index Flag II(RH)>0.3", "", "", "", ""] -atm_stashvar[9314] = ["Icing Index Flag II(RH)>0.4", "", "", "", ""] -atm_stashvar[9315] = ["Icing Index Flag II(RH)>0.5", "", "", "", ""] -atm_stashvar[9316] = ["Icing Index Flag II(RH)>0.6", "", "", "", ""] -atm_stashvar[9317] = ["Icing Index Flag II(RH)>0.7", "", "", "", ""] -atm_stashvar[9318] = ["Icing Index Flag II(RH)>0.8", "", "", "", ""] -atm_stashvar[9319] = ["Icing Index Flag II(RH)>0.9", "", "", "", ""] -atm_stashvar[9320] = ["Icing Index II(RHCldPres)", "", "", "", ""] -atm_stashvar[9321] = ["Icing Index Flag II(RHCldPres)>0.1", "", "", "", ""] -atm_stashvar[9322] = ["Icing Index Flag II(RHCldPres)>0.2", "", "", "", ""] -atm_stashvar[9323] = ["Icing Index Flag II(RHCldPres)>0.3", "", "", "", ""] -atm_stashvar[9324] = ["Icing Index Flag II(RHCldPres)>0.4", "", "", "", ""] -atm_stashvar[9325] = ["Icing Index Flag II(RHCldPres)>0.5", "", "", "", ""] -atm_stashvar[9326] = ["Icing Index Flag II(RHCldPres)>0.6", "", "", "", ""] -atm_stashvar[9327] = ["Icing Index Flag II(RHCldPres)>0.7", "", "", "", ""] -atm_stashvar[9328] = ["Icing Index Flag II(RHCldPres)>0.8", "", "", "", ""] -atm_stashvar[9329] = ["Icing Index Flag II(RHCldPres)>0.9", "", "", "", ""] -atm_stashvar[9330] = ["Icing Index II(CF)", "", "", "", ""] -atm_stashvar[9331] = ["Icing Index Flag II(CF)>0.1", "", "", "", ""] -atm_stashvar[9332] = ["Icing Index II(CF)>0.2", "", "", "", ""] -atm_stashvar[9333] = ["Icing Index Flag II(CF)>0.3", "", "", "", ""] -atm_stashvar[9334] = ["Icing Index Flag II(CF)>0.4", "", "", "", ""] -atm_stashvar[9335] = ["Icing Index Flag II(CF)>0.5", "", "", "", ""] -atm_stashvar[9336] = ["Icing Index Flag II(CF)>0.6", "", "", "", ""] -atm_stashvar[9337] = ["Icing Index Flag II(CF)>0.7", "", "", "", ""] -atm_stashvar[9338] = ["Icing Index Flag II(CF)>0.8", "", "", "", ""] -atm_stashvar[9339] = ["Icing Index Flag II(CF)>0.9", "", "", "", ""] -atm_stashvar[9340] = ["Icing Index II(LCF)", "", "", "", ""] -atm_stashvar[9341] = ["Icing Index Flag II(LCF)>0.1", "", "", "", ""] -atm_stashvar[9342] = ["Icing Index Flag II(LCF)>0.2", "", "", "", ""] -atm_stashvar[9343] = ["Icing Index Flag II(LCF)>0.3", "", "", "", ""] -atm_stashvar[9344] = ["Icing Index Flag II(LCF)>0.4", "", "", "", ""] -atm_stashvar[9345] = ["Icing Index Flag II(LCF)>0.5", "", "", "", ""] -atm_stashvar[9346] = ["Icing Index Flag II(LCF)>0.6", "", "", "", ""] -atm_stashvar[9347] = ["Icing Index Flag II(LCF)>0.7", "", "", "", ""] -atm_stashvar[9348] = ["Icing Index Flag II(LCF)>0.8", "", "", "", ""] -atm_stashvar[9349] = ["Icing Index Flag II(LCF)>0.9", "", "", "", ""] -atm_stashvar[9350] = ["Icing Index II(LWC)", "", "", "", ""] -atm_stashvar[9351] = ["Icing Index Flag II(LWC)>0.1", "", "", "", ""] -atm_stashvar[9352] = ["Icing Index Flag II(LWC)>0.2", "", "", "", ""] -atm_stashvar[9353] = ["Icing Index Flag II(LWC)>0.3", "", "", "", ""] -atm_stashvar[9354] = ["Icing Index Flag II(LWC)>0.4", "", "", "", ""] -atm_stashvar[9355] = ["Icing Index Flag II(LWC)>0.5", "", "", "", ""] -atm_stashvar[9356] = ["Icing Index Flag II(LWC)>0.6", "", "", "", ""] -atm_stashvar[9357] = ["Icing Index Flag II(LWC)>0.7", "", "", "", ""] -atm_stashvar[9358] = ["Icing Index Flag II(LWC)>0.8", "", "", "", ""] -atm_stashvar[9359] = ["Icing Index Flag II(LWC)>0.9", "", "", "", ""] -atm_stashvar[9360] = ["Icing Index II(icLWC)", "", "", "", ""] -atm_stashvar[9361] = ["Icing Index Flag II(icLWC)>0.1", "", "", "", ""] -atm_stashvar[9362] = ["Icing Index Flag II(icLWC)>0.2", "", "", "", ""] -atm_stashvar[9363] = ["Icing Index Flag II(icLWC)>0.3", "", "", "", ""] -atm_stashvar[9364] = ["Icing Index Flag II(icLWC)>0.4", "", "", "", ""] -atm_stashvar[9365] = ["Icing Index Flag II(icLWC)>0.5", "", "", "", ""] -atm_stashvar[9366] = ["Icing Index Flag II(icLWC)>0.6", "", "", "", ""] -atm_stashvar[9367] = ["Icing Index Flag II(icLWC)>0.7", "", "", "", ""] -atm_stashvar[9368] = ["Icing Index Flag II(icLWC)>0.8", "", "", "", ""] -atm_stashvar[9369] = ["Icing Index Flag II(icLWC)>0.9", "", "", "", ""] -atm_stashvar[9370] = ["Icing Index II(FROST-LN)", "", "", "", ""] -atm_stashvar[9371] = ["Icing Index Flag II(FROST-LN)>0.1", "", "", "", ""] -atm_stashvar[9372] = ["Icing Index Flag II(FROST-LN)>0.2", "", "", "", ""] -atm_stashvar[9373] = ["Icing Index Flag II(FROST-LN)>0.3", "", "", "", ""] -atm_stashvar[9374] = ["Icing Index Flag II(FROST-LN)>0.4", "", "", "", ""] -atm_stashvar[9375] = ["Icing Index Flag II(FROST-LN)>0.5", "", "", "", ""] -atm_stashvar[9376] = ["Icing Index Flag II(FROST-LN)>0.6", "", "", "", ""] -atm_stashvar[9377] = ["Icing Index Flag II(FROST-LN)>0.7", "", "", "", ""] -atm_stashvar[9378] = ["Icing Index Flag II(FROST-LN)>0.8", "", "", "", ""] -atm_stashvar[9379] = ["Icing Index Flag II(FROST-LN)>0.9", "", "", "", ""] -atm_stashvar[9380] = ["Icing Index II(FROST-Gamma)", "", "", "", ""] -atm_stashvar[9381] = ["Icing Index Flag II(FROSTGamma)>0.1", "", "", "", ""] -atm_stashvar[9382] = ["Icing Index Flag II(FROSTGamma)>0.2", "", "", "", ""] -atm_stashvar[9383] = ["Icing Index Flag II(FROSTGamma)>0.3", "", "", "", ""] -atm_stashvar[9384] = ["Icing Index Flag II(FROSTGamma)>0.4", "", "", "", ""] -atm_stashvar[9385] = ["Icing Index Flag II(FROSTGamma)>0.5", "", "", "", ""] -atm_stashvar[9386] = ["Icing Index Flag II(FROSTGamma)>0.6", "", "", "", ""] -atm_stashvar[9387] = ["Icing Index Flag II(FROSTGamma)>0.7", "", "", "", ""] -atm_stashvar[9388] = ["Icing Index Flag II(FROSTGamma)>0.8", "", "", "", ""] -atm_stashvar[9389] = ["Icing Index Flag II(FROSTGamma)>0.9", "", "", "", ""] -atm_stashvar[9391] = ["Icing Index 2d MaxRan II(RH)", "", "", "", ""] -atm_stashvar[9392] = ["Icing Index 2d MaxRan II(RHCldPres)", "", "", "", ""] -atm_stashvar[9393] = ["Icing Index 2d MaxRan II(CF)", "", "", "", ""] -atm_stashvar[9394] = ["Icing Index 2d MaxRan II(LCF)", "", "", "", ""] -atm_stashvar[9395] = ["Icing Index 2d MaxRan II(LWC)", "", "", "", ""] -atm_stashvar[9396] = ["Icing Index 2d MaxRan II(icLWC)", "", "", "", ""] -atm_stashvar[9397] = ["Icing Index 2d MaxRan II(FROST-LN)", "", "", "", ""] -atm_stashvar[9398] = ["Icing Index 2d MaxRan II(FROST-Gamma", "", "", "", ""] -atm_stashvar[10181] = ["dT SOLVER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[10185] = ["dU SOLVER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[10186] = ["dV SOLVER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[10187] = ["dW SOLVER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[12002] = ["U (MODEL LEVELS) AFTER ADVECTION", "", "", "", ""] -atm_stashvar[12003] = ["V (MODEL LEVELS) AFTER ADVECTION", "", "", "", ""] -atm_stashvar[12004] = ["TEMPERATURE AFTER ADVECTION", "", "", "", ""] -atm_stashvar[12010] = ["SPECIFIC HUMIDITY AFTER ADVECTION", "", "", "", ""] -atm_stashvar[12012] = ["QCF AFTER ADVECTION", "", "", "", ""] -atm_stashvar[12170] = ["QCL INCR: advect positive", "", "", "", ""] -atm_stashvar[12171] = ["QCL INCR: advect negative", "", "", "", ""] -atm_stashvar[12172] = ["QCF INCR: advect positive", "", "", "", ""] -atm_stashvar[12173] = ["QCF INCR: advect negative", "", "", "", ""] -atm_stashvar[12176] = ["LIQ CLOUD VOL INCR: advect positive", "", "", "", ""] -atm_stashvar[12177] = ["LIQ CLOUD VOL INCR: advect negative", "", "", "", ""] -atm_stashvar[12178] = ["FROZEN CLOUD VOL INCR:advect positiv", "", "", "", ""] -atm_stashvar[12179] = ["FROZEN CLOUD VOL INCR:advect negativ", "", "", "", ""] -atm_stashvar[12181] = ["TEMPERATURE INCR: advect K/Timestep", "", "", "", ""] -atm_stashvar[12182] = ["Q INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12183] = ["QCL INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12184] = ["QCF INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12185] = ["U WIND INCR: advection", "", "", "", ""] -atm_stashvar[12186] = ["V WIND INCR: advection", "", "", "", ""] -atm_stashvar[12187] = ["W INCR: advect m/s/timestep", "", "", "", ""] -atm_stashvar[12189] = ["RAIN INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12190] = ["GRAUPEL INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12191] = ["QCF2 INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12192] = ["BULK CLOUD VOL INCR: advect", "", "", "", ""] -atm_stashvar[12193] = ["LIQUID CLOUD VOL INCR: advect", "", "", "", ""] -atm_stashvar[12194] = ["FROZEN CLOUD VOL INCR: advect", "", "", "", ""] -atm_stashvar[12195] = ["M_V INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12196] = ["M_CL INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12197] = ["M_CF INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12198] = ["M_RAIN INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12199] = ["M_GRAUP INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12200] = ["M_CF2 INCR: advect kg/kg/timestep", "", "", "", ""] -atm_stashvar[12203] = ["dz to w departure point m", "", "", "", ""] -atm_stashvar[12204] = ["lambda w departure point radians", "", "", "", ""] -atm_stashvar[12205] = ["phi w departure point radians", "", "", "", ""] -atm_stashvar[12254] = ["QCL AFTER ADVECTION", "", "", "", ""] -atm_stashvar[12381] = ["TEMP INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12382] = ["Q INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12383] = ["QCL INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12384] = ["QCF INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12389] = ["RAIN INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12390] = ["GRAUPEL INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12391] = ["QCF2 INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12395] = ["M_V INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12396] = ["M_CL INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12397] = ["M_CF INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12398] = ["M_RAIN INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12399] = ["M_GRAUP INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[12400] = ["M_CF2 INC DUE TO ADV CORRECTION", "", "", "", ""] -atm_stashvar[13181] = ["dT DIFFUSION INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13182] = ["dQ DIFFUSION INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13185] = ["dU DIFFUSION INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13186] = ["dV DIFFUSION INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13187] = ["dW DIFFUSION INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13190] = ["SMAG: VISC_M", "", "", "", ""] -atm_stashvar[13191] = ["SMAG: VISC_H", "", "", "", ""] -atm_stashvar[13192] = ["SMAG: S (SHEAR TERM)", "", "", "", ""] -atm_stashvar[13193] = ["MIXING LENGTH RNEUTML", "", "", "", ""] -atm_stashvar[13201] = ["Indicator of local q diffusion", "", "", "", ""] -atm_stashvar[13381] = ["dT FILTER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13385] = ["dU FILTER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13386] = ["dV FILTER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13387] = ["dW FILTER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13388] = ["dEXNER FILTER INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13481] = ["dT FILTER INC INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13485] = ["dU FILTER INC INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13486] = ["dV FILTER INC INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[13487] = ["dW FILTER INC INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[14181] = ["TEMPERATURE INCR: En cor K/Timestep", "", "", "", ""] -atm_stashvar[14201] = ["ATMOS ENERGY CORR'N IN COLUMN W/M2", "", "", "", ""] -atm_stashvar[15002] = ["U WIND ON MODEL LEVELS B GRID", "ua", "m s-1", "eastward_wind", ""] -atm_stashvar[15003] = ["V WIND ON MODEL LEVELS B GRID", "va", "m s-1", "northward_wind", ""] -atm_stashvar[15101] = ["H OF THETA MODEL LEVS FROM SEA LEVEL", "", "", "", ""] -atm_stashvar[15102] = ["H OF RHO MODEL LEVS FROM SEA LEVEL", "", "", "", ""] -atm_stashvar[15108] = ["PRESSURE ON GEOMETRIC HEIGHT LEVELS", "", "", "", ""] -atm_stashvar[15119] = ["THETA ON GEOMETRIC HEIGHT LEVELS", "", "K", "air_potential_temperature", ""] -atm_stashvar[15127] = ["RHO ON GEOMETRIC HEIGHT LEVELS", "", "", "", ""] -atm_stashvar[15142] = ["W ON GEOMETRIC HEIGHT LEVELS", "", "", "", ""] -atm_stashvar[15143] = ["U ON GEOMETRIC HEIGHT LEVELS", "", "", "", ""] -atm_stashvar[15144] = ["V ON GEOMETRIC HEIGHT LEVELS", "", "", "", ""] -atm_stashvar[15181] = ["dT INC FROM QT_BAL_CLD", "", "", "", ""] -atm_stashvar[15182] = ["DQ INC FROM QT_BAL_CLD", "", "", "", ""] -atm_stashvar[15183] = ["DQCL INC FROM QT_BAL_CLD", "", "", "", ""] -atm_stashvar[15201] = ["U WIND ON PRESSURE LEVELS B GRID", "ua", "m s-1", "eastward_wind", ""] -atm_stashvar[15202] = ["V WIND ON PRESSURE LEVELS B GRID", "va", "m s-1", "northward_wind", ""] -atm_stashvar[15212] = ["50 METRE WIND U-COMPONENT B GRID", "", "", "", ""] -atm_stashvar[15213] = ["50 METRE WIND V-COMPONENT B GRID", "", "", "", ""] -atm_stashvar[15214] = ["ERTEL POTENTIAL VORTICITY THETA SURF", "", "", "", ""] -atm_stashvar[15215] = ["THETA ON PV=+/-2 SURFACE", "", "K", "air_potential_temperature", ""] -atm_stashvar[15216] = ["THETA AT PV POINTS", "", "K", "air_potential_temperature", ""] -atm_stashvar[15217] = ["PV ON MODEL LEVELS(CALC PV)", "", "", "", ""] -atm_stashvar[15218] = ["PV on model theta levels", "", "", "", ""] -atm_stashvar[15229] = ["POTENTIAL VORTICITY ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[15231] = ["TEST FIELD ON V-GRID-SINGLE LEVEL", "", "", "", ""] -atm_stashvar[15232] = ["TEST FIELD ON P GRID-SINGLE LEVEL", "", "", "", ""] -atm_stashvar[15233] = ["TEST FIELD ON P GRID-PRESS LEVELS", "", "", "", ""] -atm_stashvar[15234] = ["TEST FIELD ON P GRID-MODEL LEVELS", "", "", "", ""] -atm_stashvar[15242] = ["W COMPNT (OF WIND) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[15243] = ["U WIND ON PRESSURE LEVELS", "ua", "m s-1", "eastward_wind", ""] -atm_stashvar[15244] = ["V WIND ON PRESSURE LEVELS", "va", "m s-1", "northward_wind", ""] -atm_stashvar[15245] = ["50 METRE WIND U-COMPONENT", "", "", "", ""] -atm_stashvar[15246] = ["50 METRE WIND V-COMPONENT", "", "", "", ""] -atm_stashvar[15260] = ["Rho*w on rho levels", "", "", "", ""] -atm_stashvar[15261] = ["Rho*u*w on rho levels", "", "", "", ""] -atm_stashvar[15262] = ["Rho*v*w on rho levels", "", "", "", ""] -atm_stashvar[15263] = ["Rho*w with w > 0m/s on rho levels", "", "", "", ""] -atm_stashvar[15264] = ["Rho*w with w < 0m/s on rho levels", "", "", "", ""] -atm_stashvar[15265] = ["Rho*w with w > 1m/s on rho levels", "", "", "", ""] -atm_stashvar[15266] = ["Rho*w with w < -1m/s on rho levels", "", "", "", ""] -atm_stashvar[15270] = ["SQU OF NORM OF FOURIER TRANS OF W", "", "", "", ""] -atm_stashvar[15271] = ["True unscaled density", "", "", "", ""] -atm_stashvar[16004] = ["TEMPERATURE ON THETA LEVELS", "ta", "K", "air_temperature", ""] -atm_stashvar[16140] = ["QCL INCR: pc2 init positive", "", "", "", ""] -atm_stashvar[16141] = ["QCL INCR: pc2 init negative", "", "", "", ""] -atm_stashvar[16142] = ["QCF INCR: pc2 init positive", "", "", "", ""] -atm_stashvar[16143] = ["QCF INCR: pc2 init negative", "", "", "", ""] -atm_stashvar[16146] = ["LIQ CLOUD VOL INCR: pc2 init positiv", "", "", "", ""] -atm_stashvar[16147] = ["LIQ CLOUD VOL INCR: pc2 init negativ", "", "", "", ""] -atm_stashvar[16148] = ["ICE CLOUD VOL INCR: pc2 init positiv", "", "", "", ""] -atm_stashvar[16149] = ["ICE CLOUD VOL INCR: pc2 init negativ", "", "", "", ""] -atm_stashvar[16150] = ["QCL INCR: pc2 pressure change positi", "", "", "", ""] -atm_stashvar[16151] = ["QCL INCR: pc2 pressure change negati", "", "", "", ""] -atm_stashvar[16156] = ["LIQ CLOUD VOL INCR: pc2 press positi", "", "", "", ""] -atm_stashvar[16157] = ["LIQ CLOUD VOL INCR: pc2 press negati", "", "", "", ""] -atm_stashvar[16161] = ["TEMPERATURE INCR: pc2 initialisation", "", "", "", ""] -atm_stashvar[16162] = ["SPECIFIC HUMIDITY INCR: pc2 initiali", "", "", "", ""] -atm_stashvar[16163] = ["QCL INCR: pc2 initialisation", "", "", "", ""] -atm_stashvar[16164] = ["QCF INCR: pc2 initialisation", "", "", "", ""] -atm_stashvar[16172] = ["BULK CLOUD VOL INCR: pc2 initialisat", "", "", "", ""] -atm_stashvar[16173] = ["LIQ CLOUD VOL INCR: pc2 init", "", "", "", ""] -atm_stashvar[16174] = ["ICE CLOUD VOL INCR: pc2 initialise", "", "", "", ""] -atm_stashvar[16181] = ["TEMPERATURE INCR: pc2 pres change", "", "", "", ""] -atm_stashvar[16182] = ["SPECIFIC HUMIDITY INCR: pc2 pressure", "", "", "", ""] -atm_stashvar[16183] = ["QCL INCR: pc2 pressure change", "", "", "", ""] -atm_stashvar[16184] = ["QCF INCR: from pc2 pressure change", "", "", "", ""] -atm_stashvar[16192] = ["BULK CLOUD VOL INCR: pc2 pres change", "", "", "", ""] -atm_stashvar[16193] = ["LIQ CLOUD VOL INCR: pc2 pressure cha", "", "", "", ""] -atm_stashvar[16194] = ["FROZEN CLOUD VOL INCR: pc2 pressure", "", "", "", ""] -atm_stashvar[16201] = ["GEOPOTENTIAL HEIGHT ON THETA LEVELS", "zg", "m", "geopotential_height", ""] -atm_stashvar[16202] = ["GEOPOTENTIAL HEIGHT ON P LEV/P GRID", "zg", "m", "geopotential_height", ""] -atm_stashvar[16203] = ["TEMPERATURE ON P LEV/P GRID", "ta", "K", "air_temperature", ""] -atm_stashvar[16204] = ["RH WRT ICE ON P LEV/P GRID", "hur", "%", "relative_humidity", ""] -atm_stashvar[16205] = ["WET BULB POTENTIAL TEMPERATURE K", "", "", "", ""] -atm_stashvar[16206] = ["CLOUD WATER CONTENT (qc)", "", "", "", ""] -atm_stashvar[16207] = ["TOTAL SPECIFIC HUMIDITY (qT)", "", "", "", ""] -atm_stashvar[16222] = ["PRESSURE AT MEAN SEA LEVEL", "psl", "Pa", "air_pressure_at_sea_level", ""] -atm_stashvar[16255] = ["GEOPOTENTIAL HEIGHT ON RHO LEVELS", "zg", "m", "geopotential_height", ""] -atm_stashvar[16256] = ["RH WRT WATER ON P LEV/P GRID", "hur", "%", "relative_humidity", ""] -atm_stashvar[17203] = ["MSA MASS MIXING RATIO FLUX KG/KG/S", "", "", "", ""] -atm_stashvar[17204] = ["NH3 DEPLETION KG/KG AFTER TSTEP", "", "", "", ""] -atm_stashvar[17205] = ["DIMETHYL SULPHIDE EMISSIONS", "", "", "", ""] -atm_stashvar[17206] = ["DMS DRY OXIDATION MMR FLUX KG/KG/S", "", "", "", ""] -atm_stashvar[17207] = ["DMS DRY OXIDATION TO SO2 KG/KG/S", "", "", "", ""] -atm_stashvar[17208] = ["DMS DRY OXIDATION TO SO4 ACC KG/KG/S", "", "", "", ""] -atm_stashvar[17209] = ["DMS DRY OXIDATION TO SO4 AIT KG/KG/S", "", "", "", ""] -atm_stashvar[17210] = ["SO2 DRY OXID BY OH MMR FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17211] = ["SO2 WET OXID BY H2O2 FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17212] = ["SO2 WET OXID BY O3 FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17213] = ["SO4 DIS TO ACC BY EVAP FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17214] = ["SO4 ACC TO DIS BY NUCL FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17215] = ["SO4 AIT TO DIS BY DIFF FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17216] = ["SO4 AIT TO ACC BY COAG FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17217] = ["SO2 DRY OXID TO SO4 ACC FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17218] = ["SO2 DRY OXID TO SO4 AIT FLX KG/KG/S", "", "", "", ""] -atm_stashvar[17219] = ["SO4 AIT-ACC BY MODE MERGING kg/kg/s", "", "", "", ""] -atm_stashvar[17220] = ["PM10 CONCENTRATION", "", "", "", ""] -atm_stashvar[17221] = ["PM2.5 CONCENTRATION", "", "", "", ""] -atm_stashvar[17222] = ["SULPHATE CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17223] = ["SULPHATE CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17224] = ["BLACK CARBON CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17225] = ["BLACK CARBON CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17226] = ["BIOM BURNING CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17227] = ["BIOM BURNING CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17228] = ["OCFF CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17229] = ["OCFF CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17230] = ["SOA CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17231] = ["SOA CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17232] = ["SEA SALT CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17233] = ["SEA SALT CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17234] = ["DUST CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17235] = ["DUST CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17236] = ["NITRATE CONTRIB TO PM10 CONC", "", "", "", ""] -atm_stashvar[17237] = ["NITRATE CONTRIB TO PM2.5 CONC", "", "", "", ""] -atm_stashvar[17240] = ["NH3 OXID BY HNO3 MMR FLX KG[N]/KG/S", "", "", "", ""] -atm_stashvar[17241] = ["NIT ACC TO DIS BY NUC FLX KG[N]/KG/S", "", "", "", ""] -atm_stashvar[17242] = ["NIT DIS-ACC BY EVAP FLX KG[N]/KG/S", "", "", "", ""] -atm_stashvar[17257] = ["TOTAL DUST CONC (microg/m3)", "", "", "", ""] -atm_stashvar[19001] = ["VEGETATION CARBON ON PFTS KG C/M2", "", "", "", ""] -atm_stashvar[19002] = ["GRIDBOX MEAN VEG CARBON KG C/M2", "", "", "", ""] -atm_stashvar[19003] = ["PHENOLOGICAL LEAF TURNOVER RATE PFTS", "", "", "", ""] -atm_stashvar[19004] = ["LITTER CARBON ON PFTS KG C/M2/YEAR", "", "", "", ""] -atm_stashvar[19005] = ["GRIDBOX MEAN LITTER CARBN KGC/M2/YR", "", "", "", ""] -atm_stashvar[19006] = ["MEAN LEAF TRNVR RATE PFTS FOR PHENOL", "", "", "", ""] -atm_stashvar[19007] = ["LEAF AREA INDEX PFTS AFTER PHENOLOGY", "", "", "", ""] -atm_stashvar[19008] = ["MN LEAF TRNVR RATE PFTS FOR TRIFFID", "", "", "", ""] -atm_stashvar[19009] = ["MEAN NPP ON PFTS FOR TRIFFID", "", "", "", ""] -atm_stashvar[19010] = ["MEAN WOOD RESP ON PFTS FOR TRIFFID", "", "", "", ""] -atm_stashvar[19011] = ["MEAN SOIL RESPIRATION FOR TRIFFID", "", "", "", ""] -atm_stashvar[19012] = ["DISTURBED FRACTION OF VEGETATION", "", "", "", ""] -atm_stashvar[19013] = ["SURFACE TYPE FRACTIONS AFTER TRIFFID", "", "", "", ""] -atm_stashvar[19014] = ["LEAF AREA INDEX PFTS AFTER TRIFFID", "", "", "", ""] -atm_stashvar[19015] = ["CANOPY HEIGHT ON PFTS AFTER TRIFFID", "", "", "", ""] -atm_stashvar[19016] = ["SOIL CARBON CONTENT AFTER TRIFFID", "", "", "", ""] -atm_stashvar[19017] = ["DPM SOIL RESP FOR TRIFFID KG C/M2/S", "", "", "", ""] -atm_stashvar[19018] = ["RPM SOIL RESP FOR TRIFFID KG C/M2/S", "", "", "", ""] -atm_stashvar[19019] = ["BIO SOIL RESP FOR TRIFFID KG C/M2/S", "", "", "", ""] -atm_stashvar[19020] = ["HUM SOIL RESP FOR TRIFFID KG C/M2/S", "", "", "", ""] -atm_stashvar[19021] = ["DPM SOIL-C AFTER TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19022] = ["RPM SOIL-C AFTER TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19023] = ["BIO SOIL-C AFTER TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19024] = ["HUM SOIL-C AFTER TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19025] = ["LEAF CARBON ON PFTS KGC/M2", "", "", "", ""] -atm_stashvar[19026] = ["GRIDBOX MEAN LEAF CARBON KGC/M2", "", "", "", ""] -atm_stashvar[19027] = ["WOOD CARBON ON PFTS KGC/M2", "", "", "", ""] -atm_stashvar[19028] = ["GRIDBOX MEAN WOOD CARBON KGC/M2", "", "", "", ""] -atm_stashvar[19029] = ["ROOT CARBON ON PFTS KGC/M2", "", "", "", ""] -atm_stashvar[19030] = ["GRIDBOX MEAN ROOT CARBON KGC/M2", "", "", "", ""] -atm_stashvar[19031] = ["PREVIOUS DIST FRAC OF VEGETATION", "", "", "", ""] -atm_stashvar[19032] = ["FAST TURNOVER WOOD PRODUCT KGC/M2", "", "", "", ""] -atm_stashvar[19033] = ["MEDIUM TURNOVER WOOD PRODUCT KGC/M2", "", "", "", ""] -atm_stashvar[19034] = ["SLOW TURNOVER WOOD PRODUCT KGC/M2", "", "", "", ""] -atm_stashvar[19036] = ["LU C FLUX TO FAST POOL KGC/M2/YR", "", "", "", ""] -atm_stashvar[19037] = ["LU C FLUX TO MEDIUM POOL KGC/M2/YR", "", "", "", ""] -atm_stashvar[19038] = ["LU C FLUX TO SLOW POOL KGC/M2/YR", "", "", "", ""] -atm_stashvar[19039] = ["FAST POOL DECOMP C FLUX KGC/M2/YR", "", "", "", ""] -atm_stashvar[19040] = ["MEDIUM POOL DECOMP C FLUX KGC/M2/YR", "", "", "", ""] -atm_stashvar[19041] = ["SLOW POOL DECOMP C FLUX KGC/M2/YR", "", "", "", ""] -atm_stashvar[19042] = ["LANDUSE CO2 FLUX TO ATM KGC/M2/YR", "", "", "", ""] -atm_stashvar[19043] = ["HARVEST C ON PFTS KGC/M2/360d", "", "", "", ""] -atm_stashvar[19044] = ["HARVEST C (GBM) KGC/M2/360d", "", "", "", ""] -atm_stashvar[19045] = ["LANDUSE C TO SOIL ON PFTS KG/M2/YR", "", "", "", ""] -atm_stashvar[19046] = ["LANDUSE C TO SOIL (GBM) KGC/M2/YR", "", "", "", ""] -atm_stashvar[19047] = ["TRIFFID CO2 FLUX TO ATMOS KGC/M2/YR", "", "", "", ""] -atm_stashvar[19048] = ["CARBON ERROR IN VEG2 KGC/M2", "", "", "", ""] -atm_stashvar[19049] = ["CARBON ERROR IN TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19050] = ["VEG CARBON ERROR IN TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19051] = ["SOIL CARBON ERROR IN TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19052] = ["WP CARBON ERROR IN TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19053] = ["SOIL TO ATMOS RESP FLUX KGC/M2/YR", "", "", "", ""] -atm_stashvar[19054] = ["FRAC. OF TOTAL LITTER GOING TO DPM", "", "", "", ""] -atm_stashvar[19101] = ["NPP ON PFTS POST N-LIMIT KGC/M2/YR", "", "", "", ""] -atm_stashvar[19102] = ["NPP POST N-LIMIT (GBM) KGC/M2/YR", "", "", "", ""] -atm_stashvar[19103] = ["EXUDATES ON PFTS KGC/M2/YR", "", "", "", ""] -atm_stashvar[19104] = ["GRIDBOX MEAN EXUDATES KGC/M2/YR", "", "", "", ""] -atm_stashvar[19111] = ["NITROGEN DEPOSITION KGN/M2/YR", "", "", "", ""] -atm_stashvar[19112] = ["NITROGEN FIXATION PFTS KGC/M2/YR", "", "", "", ""] -atm_stashvar[19113] = ["NITROGEN FIXATION (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19114] = ["NITROGEN LEACHING (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19115] = ["MINERALISED NIT. GAS LOSS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19116] = ["INORG NITROGEN LOSS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19117] = ["NITROGEN ATM GAS LOSS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19118] = ["NITROGEN TOTAL LOSS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19119] = ["HARVEST N ON PFTS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19120] = ["HARVEST N (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19121] = ["NITROGEN LUC ON PFTS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19122] = ["NITROGEN LUC (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19123] = ["NITROGEN LITTER ON PFTS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19124] = ["NITROGEN LITTER (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19125] = ["N FERTILISER ON PFTS KGN/M2/YR", "", "", "", ""] -atm_stashvar[19126] = ["N FERTILISER (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19127] = ["LANDUSE N TO SOIL ON PFTS KG/M2/YR", "", "", "", ""] -atm_stashvar[19128] = ["LANDUSE N TO SOIL (GBM) KGC/M2/YR", "", "", "", ""] -atm_stashvar[19131] = ["NITROGEN STEM/WOOD KGN/M2", "", "", "", ""] -atm_stashvar[19132] = ["NITROGEN LEAF KGN/M2", "", "", "", ""] -atm_stashvar[19133] = ["NITROGEN ROOT KGN/M2", "", "", "", ""] -atm_stashvar[19134] = ["NITROGEN LEAF LABILE KGN/M2", "", "", "", ""] -atm_stashvar[19135] = ["NITROGEN LEAF ALLOCATED KGN/M2", "", "", "", ""] -atm_stashvar[19136] = ["NITROGEN VEG KGN/M2", "", "", "", ""] -atm_stashvar[19137] = ["NITROGEN VEG (GBM) KGN/M2", "", "", "", ""] -atm_stashvar[19141] = ["NITROGEN SOIL RPM KGN/M2", "", "", "", ""] -atm_stashvar[19142] = ["NITROGEN SOIL DPM KGN/M2", "", "", "", ""] -atm_stashvar[19143] = ["NITROGEN SOIL BIO KGN/M2", "", "", "", ""] -atm_stashvar[19144] = ["NITROGEN SOIL HUM KGN/M2", "", "", "", ""] -atm_stashvar[19145] = ["NITROGEN SOIL TOTAL KGN/M2", "", "", "", ""] -atm_stashvar[19146] = ["INORGANIC NITROGEN KGN/M2", "", "", "", ""] -atm_stashvar[19147] = ["NITROGEN TOTAL ECOSYSTEM KGN/M2", "", "", "", ""] -atm_stashvar[19152] = ["N DEMAND GROWTH KGN/M2/YR", "", "", "", ""] -atm_stashvar[19153] = ["N DEMAND SPREAD KGN/M2/YR", "", "", "", ""] -atm_stashvar[19154] = ["N DEMAND TOTAL KGN/M2/YR", "", "", "", ""] -atm_stashvar[19155] = ["N DEMAND TOTAL (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19156] = ["N UPTAKE TURNOVER KGN/M2/YR", "", "", "", ""] -atm_stashvar[19157] = ["N UPTAKE GROWTH KGN/M2/YR", "", "", "", ""] -atm_stashvar[19158] = ["N UPTAKE SPREAD KGN/M2/YR", "", "", "", ""] -atm_stashvar[19159] = ["N UPTAKE TOTAL KGN/M2/YR", "", "", "", ""] -atm_stashvar[19160] = ["N UPTAKE TOTAL (GBM) KGN/M2/YR", "", "", "", ""] -atm_stashvar[19161] = ["N SOIL DECOMPOSITION RATE MODIFIER", "", "", "", ""] -atm_stashvar[19162] = ["N IMMOBILIS POTEN DPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19163] = ["N IMMOBILIS POTEN RPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19164] = ["N IMMOBILIS POTEN BIO KGN/M2/YR", "", "", "", ""] -atm_stashvar[19165] = ["N IMMOBILIS POTEN HUM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19166] = ["N IMMOBILIS POTEN TOT KGN/M2/YR", "", "", "", ""] -atm_stashvar[19167] = ["N IMMOBILIS DPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19168] = ["N IMMOBILIS RPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19169] = ["N IMMOBILIS BIO KGN/M2/YR", "", "", "", ""] -atm_stashvar[19170] = ["N IMMOBILIS HUM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19171] = ["N IMMOBILIS TOT KGN/M2/YR", "", "", "", ""] -atm_stashvar[19172] = ["N MINERALIS POTEN DPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19173] = ["N MINERALIS POTEN RPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19174] = ["N MINERALIS POTEN BIO KGN/M2/YR", "", "", "", ""] -atm_stashvar[19175] = ["N MINERALIS POTEN HUM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19176] = ["N MINERALIS POTEN TOT KGN/M2/YR", "", "", "", ""] -atm_stashvar[19177] = ["N MINERALIS DPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19178] = ["N MINERALIS RPM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19179] = ["N MINERALIS BIO KGN/M2/YR", "", "", "", ""] -atm_stashvar[19180] = ["N MINERALIS HUM KGN/M2/YR", "", "", "", ""] -atm_stashvar[19181] = ["N MINERALIS TOT KGN/M2/YR", "", "", "", ""] -atm_stashvar[19182] = ["GPP ON PFTS (KGC/M2/YR)", "", "", "", ""] -atm_stashvar[19183] = ["GPP GRIDBOX MEAN (KGC/M2/YR)", "", "", "", ""] -atm_stashvar[19184] = ["PLANT RESP AFT N LIM PFTS KGC/M2/YR", "", "", "", ""] -atm_stashvar[19185] = ["PLANT RESP AFT N LIM GBM KGC/M2/YR", "", "", "", ""] -atm_stashvar[19186] = ["VEG NITROGEN ERROR IN TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19187] = ["SOIL NITROGEN ERROR TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19188] = ["INORG NITROGEN ERROR TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[19189] = ["NITROGEN ERROR IN TRIFFID KGC/M2", "", "", "", ""] -atm_stashvar[20001] = ["THICKNESS : 1000-500 MB", "", "", "", ""] -atm_stashvar[20002] = ["THICKNESS : 1000-850 MB", "", "", "", ""] -atm_stashvar[20003] = ["WIND SPEEDS : 10 METRES B GRID", "", "", "", ""] -atm_stashvar[20004] = ["WIND SPEEDS : PRESSURE LEVEL", "", "", "", ""] -atm_stashvar[20005] = ["DIVERGENCE", "", "", "", ""] -atm_stashvar[20006] = ["RELATIVE VORTICITY", "", "", "", ""] -atm_stashvar[20007] = ["MOUNTAIN WAVE TURBULENCE PREDICTOR", "", "", "", ""] -atm_stashvar[20012] = ["CONVECTIVE CLOUD DEPTHS (kft)", "", "", "", ""] -atm_stashvar[20013] = ["TOTAL PRECIP ACCUMULATION : 6 HOURS", "", "", "", ""] -atm_stashvar[20014] = ["PRECIPITATION SYMBOL", "", "", "", ""] -atm_stashvar[20015] = ["PRESENT WEATHER CODE", "", "", "", ""] -atm_stashvar[20016] = ["CAT PREDICTOR", "", "", "", ""] -atm_stashvar[20017] = ["MAX CAT", "", "", "", ""] -atm_stashvar[20018] = ["MAX CAT PRESSURE", "", "", "", ""] -atm_stashvar[20020] = ["MAX WIND U-COMPONENT", "", "", "", ""] -atm_stashvar[20021] = ["MAX WIND V-COMPONENT", "", "", "", ""] -atm_stashvar[20022] = ["MAX WIND PRESSURE", "", "", "", ""] -atm_stashvar[20023] = ["MAX WIND ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20024] = ["TROPOPAUSE PRESSURE", "", "", "", ""] -atm_stashvar[20025] = ["TROPOPAUSE TEMPERATURE", "", "", "", ""] -atm_stashvar[20026] = ["TROPOPAUSE HEIGHT", "", "", "", ""] -atm_stashvar[20027] = ["TROPOPAUSE ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20028] = ["SNOW PROBABILITY", "", "", "", ""] -atm_stashvar[20029] = ["CONTRAIL - LOWER LIMIT", "", "", "", ""] -atm_stashvar[20030] = ["CONTRAIL - UPPER LIMIT", "", "", "", ""] -atm_stashvar[20031] = ["THERMAL ADVECTION", "", "", "", ""] -atm_stashvar[20032] = ["MEAN THERMAL ADVECTION", "", "", "", ""] -atm_stashvar[20033] = ["FREEZING LEVEL GEOPOTENTIAL HEIGHT", "", "", "", ""] -atm_stashvar[20034] = ["FREEZING LEVEL PRESSURE", "", "", "", ""] -atm_stashvar[20035] = ["FREEZING LEVEL ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20036] = ["-20C ISOTHERM GEOPOTENTIAL HEIGHT", "", "", "", ""] -atm_stashvar[20037] = ["-20C ISOTHERM PRESSURE", "", "", "", ""] -atm_stashvar[20038] = ["-20C ISOTHERM ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20039] = ["CONV CLOUD BASE ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20040] = ["CONV CLOUD TOP ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20041] = ["MAXIMUM WIND BASE - ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20042] = ["MAXIMUM WIND TOP - ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20043] = ["WAFC ICING POTENTIAL", "", "", "", ""] -atm_stashvar[20044] = ["WAFC ICING POTENTIAL (retired)", "", "", "", ""] -atm_stashvar[20045] = ["WAFC IN-CLOUD TURB POTENTIAL", "", "", "", ""] -atm_stashvar[20046] = ["WAFC IN-CLOUD TURB POTENTIAL (ret)", "", "", "", ""] -atm_stashvar[20047] = ["WAFC CAT POTENTIAL", "", "", "", ""] -atm_stashvar[20048] = ["WAFC CAT POTENTIAL (retired)", "", "", "", ""] -atm_stashvar[20049] = ["WAFC CB HORIZONTAL EXTENT", "", "", "", ""] -atm_stashvar[20050] = ["WAFC PRESSURE AT CB BASE", "", "", "", ""] -atm_stashvar[20051] = ["WAFC PRESSURE AT CB TOP", "", "", "", ""] -atm_stashvar[20052] = ["WAFC PRESSURE AT EMBD CB BASE", "", "", "", ""] -atm_stashvar[20053] = ["WAFC PRESSURE AT EMBD CB TOP", "", "", "", ""] -atm_stashvar[20054] = ["WAFC ICAO HEIGHT AT CB BASE", "", "", "", ""] -atm_stashvar[20055] = ["WAFC ICAO HEIGHT AT CB TOP", "", "", "", ""] -atm_stashvar[20056] = ["WAFC ICAO HGHT EMBD CB BASE", "", "", "", ""] -atm_stashvar[20057] = ["WAFC ICAO HGHT EMBD CB TOP", "", "", "", ""] -atm_stashvar[20058] = ["SURFACE DUST CONCENTRATION (g/m3)", "", "", "", ""] -atm_stashvar[20059] = ["2000-5000FT DUST CONCENTRATION(g/m3)", "", "", "", ""] -atm_stashvar[20060] = ["ZENITH TOTAL DELAY", "", "", "", ""] -atm_stashvar[20061] = ["-70C ISOTHERM GEOPOTENTIAL HEIGHT", "", "", "", ""] -atm_stashvar[20062] = ["-70C ISOTHERM PRESSURE", "", "", "", ""] -atm_stashvar[20063] = ["-70C ISOTHERM ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20064] = ["TROPOPAUSE PRESSURE", "", "", "", ""] -atm_stashvar[20065] = ["TROPOPAUSE TEMPERATURE", "", "", "", ""] -atm_stashvar[20066] = ["TROPOPAUSE HEIGHT", "", "", "", ""] -atm_stashvar[20067] = ["TROPOPAUSE ICAO HEIGHT", "", "", "", ""] -atm_stashvar[20068] = ["THINNED LS RAINFALL RATE KG/M2/S", "", "", "", ""] -atm_stashvar[20069] = ["THINNED TOTAL PRECIP RATE KG/M2/S", "", "", "", ""] -atm_stashvar[20070] = ["VIS AT 1.5M (incl ppn and dust) M", "", "", "", ""] -atm_stashvar[20071] = ["VIS IN DUST ONLY AT 1.5M M", "", "", "", ""] -atm_stashvar[20072] = ["CONVECTIVE PRECIP RATE: kg/m2/s", "", "", "", ""] -atm_stashvar[20073] = ["EXTENDED CONV PRECIP RATE: kg/m2/s", "", "", "", ""] -atm_stashvar[20074] = ["COLSON-PANOFSKY TURB INDEX m2/s2", "", "", "", ""] -atm_stashvar[20075] = ["ELLRODS TI1 TURBULENCE INDEX s-2", "", "", "", ""] -atm_stashvar[20076] = ["INVERSE RICHARDSON NUMBER (-)", "", "", "", ""] -atm_stashvar[20077] = ["WAFC CAT POT. (Turp et al) (StaGE)", "", "", "", ""] -atm_stashvar[20080] = ["UPDRAFT HELICITY 2000-5000m M2/S2", "", "", "", ""] -atm_stashvar[20084] = ["TROPOPAUSE PRESSURE", "", "", "", ""] -atm_stashvar[20085] = ["TROPOPAUSE TEMPERATURE", "", "", "", ""] -atm_stashvar[20086] = ["TROPOPAUSE HEIGHT", "", "", "", ""] -atm_stashvar[20087] = ["TROPOPAUSE ICAO HEIGHT", "", "", "", ""] -atm_stashvar[21100] = ["FLASH RATE S-1", "", "", "", ""] -atm_stashvar[21101] = ["STORM LOCATION FLAG", "", "", "", ""] -atm_stashvar[21102] = ["GRAUPEL WATER PATH IN ELEC KG M-2", "", "", "", ""] -atm_stashvar[21103] = ["TOTAL ICE WATER PATH IN ELEC KG M-2", "", "", "", ""] -atm_stashvar[21104] = ["NUMBER OF LIGHTNING FLASHES", "", "", "", ""] -atm_stashvar[21105] = ["FLASH RATE: GRAUP. FLX (MCCAUL) S-1", "", "", "", ""] -atm_stashvar[21106] = ["FLASH RATE: TOTAL ICE (MCCAUL) S-1", "", "", "", ""] -atm_stashvar[26001] = ["RIVER WATER STORAGE KG", "", "", "", ""] -atm_stashvar[26002] = ["GRIDBOX OUTFLOW KG/S", "", "kg s-1", "", ""] -atm_stashvar[26003] = ["GRIDBOX INFLOW KG/S", "", "kg s-1", "", ""] -atm_stashvar[26004] = ["RIVER OUTFLOW KG/M2/S", "", "kg m-2 s-1", "", ""] -atm_stashvar[26006] = ["INLANDBASINFLOW TRIP GRID KG/S", "", "kg s-1", "", ""] -atm_stashvar[30001] = ["U COMPNT OF WIND RHO GRID", "ua", "m s-1", "eastward_wind", ""] -atm_stashvar[30002] = ["V COMPNT OF WIND RHO GRID", "va", "m s-1", "northward_wind", ""] -atm_stashvar[30003] = ["W COMPNT OF WIND RHO GRID", "", "", "", ""] -atm_stashvar[30004] = ["TEMPERATURE RHO GRID", "ta", "K", "air_temperature", ""] -atm_stashvar[30005] = ["SPECIFIC HUMIDITY RHO GRID", "hus", "1", "specific_humidity", ""] -atm_stashvar[30006] = ["height model levels RHO GRID M", "", "", "", ""] -atm_stashvar[30007] = ["KE model levels RHO GRID m2/s2", "", "", "", ""] -atm_stashvar[30008] = ["OMEGA ON THETA LEVELS (C GRID)", "", "", "", ""] -atm_stashvar[30011] = ["U*U*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30012] = ["U*V*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30013] = ["U*W*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30014] = ["U*T*rho_dry*dr X1.E-5 kgK/ms", "", "", "", ""] -atm_stashvar[30015] = ["U*Q*rho_dry*dr X1.E-5 kg/ms", "", "", "", ""] -atm_stashvar[30016] = ["U*Z*rho_dry*dr X1.E-5 kg/s", "", "", "", ""] -atm_stashvar[30017] = ["U*KE*rho_dry*dr X1.E-5 kgm/s3", "", "", "", ""] -atm_stashvar[30022] = ["V*V*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30023] = ["V*W*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30024] = ["V*T*rho_dry*dr X1.E-5 kgK/ms", "", "", "", ""] -atm_stashvar[30025] = ["V*Q *rho_dry*dr X1.E-5 kg/ms", "", "", "", ""] -atm_stashvar[30026] = ["V*Z*rho_dry*dr X1.E-5 kg/s", "", "", "", ""] -atm_stashvar[30027] = ["V*KE*rho_dry*dr X1.E-5 kgm/s3", "", "", "", ""] -atm_stashvar[30033] = ["W*W*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30034] = ["W*T*rho_dry*dr X1.E-5 kgK/ms", "", "", "", ""] -atm_stashvar[30035] = ["W*Q *rho_dry*dr X1.E-5 kg/ms", "", "", "", ""] -atm_stashvar[30036] = ["W*Z*rho_dry*dr X1.E-5 kg/s", "", "", "", ""] -atm_stashvar[30037] = ["W*KE*rho_dry*dr X1.E-5 kgm/s3", "", "", "", ""] -atm_stashvar[30044] = ["T*T*rho_dry*dr X1.E-5 kgK2/m2", "", "", "", ""] -atm_stashvar[30045] = ["T*Q*rho_dry*dr X1.E-5 kgK/m2", "", "", "", ""] -atm_stashvar[30046] = ["TZ*rho_dry*dr X1.E-5 kgK/m", "", "", "", ""] -atm_stashvar[30047] = ["T*KE*rho_dry*dr X1.E-5 kgK/s2", "", "", "", ""] -atm_stashvar[30055] = ["QQ*rho_dry*dr X1.E-5 kg/m2", "", "", "", ""] -atm_stashvar[30056] = ["Q*Z*rho_dry*dr X1.E-5 kg", "", "", "", ""] -atm_stashvar[30057] = ["Q*KE*rho_dry*dr X1.E-5 kg/s2", "", "", "", ""] -atm_stashvar[30066] = ["Z*Z*rho_dry*dr X1.E-5 kg", "", "", "", ""] -atm_stashvar[30067] = ["Z*KE*rho_dry*dr X1.E-5 kg/ms2", "", "", "", ""] -atm_stashvar[30077] = ["KE*KE*rho_dry*dr X1.E-5 kg/m4s4", "", "", "", ""] -atm_stashvar[30078] = ["ZOM RHO GRID X1.E-16", "", "", "", ""] -atm_stashvar[30101] = ["U MASS WEIGHTED RHO GRID kgm/s", "", "", "", ""] -atm_stashvar[30102] = ["V MASS WEIGHTED RHO GRID kg/ms", "", "", "", ""] -atm_stashvar[30103] = ["W MASS WEIGHTED RHO GRID kg/ms", "", "", "", ""] -atm_stashvar[30104] = ["T MASS WEIGHTED RHO GRID kgK/m2", "", "", "", ""] -atm_stashvar[30105] = ["Q MASS WEIGHTED RHO GRID kg/m2", "", "", "", ""] -atm_stashvar[30106] = ["height mass weighted kg/m", "", "", "", ""] -atm_stashvar[30107] = ["KE mass weighted RHO GRID kg/s2", "", "", "", ""] -atm_stashvar[30111] = ["T AT EOT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30112] = ["WBIG Set to 1 if w GT 1.0m/s", "", "", "", ""] -atm_stashvar[30113] = ["RH on model levels at end timestep", "", "", "", ""] -atm_stashvar[30114] = ["WBIG Set to 1 if w GT 0.1m/s", "", "", "", ""] -atm_stashvar[30115] = ["DRY MASS WEIGHTING MODEL LEV KG/M2", "", "", "", ""] -atm_stashvar[30171] = ["dT**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30172] = ["dQ**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30173] = ["dQcl**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30174] = ["dQcf**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30175] = ["dU**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30176] = ["dV**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30177] = ["dW**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30178] = ["dRHO**2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30181] = ["T TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30182] = ["Q TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30183] = ["QCL TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30184] = ["QCF TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30185] = ["U TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30186] = ["V TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30187] = ["W TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30188] = ["RHO TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30189] = ["RAIN TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30190] = ["GRAUPEL TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30191] = ["QCF2 TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30192] = ["CF TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30193] = ["CFL TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30194] = ["CFF TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30195] = ["M_V TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30196] = ["M_CL TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30197] = ["M_CF TOTAL INCREMENT ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30198] = ["M_RAIN TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30199] = ["M_GRAUP TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30200] = ["M_CF2 TOTAL INC ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30201] = ["U COMPNT OF WIND ON P LEV/UV GRID", "ua", "m s-1", "eastward_wind", "ua_plev"] -atm_stashvar[30202] = ["V COMPNT OF WIND ON P LEV/UV GRID", "va", "m s-1", "northward_wind", "va_plev"] -atm_stashvar[30203] = ["W COMPNT OF WIND ON P LEV/UV GRID", "wa", "m s-1", "upward_air_velocity", "wa_plev"] -atm_stashvar[30204] = ["TEMPERATURE ON P LEV/UV GRID", "ta", "K", "air_temperature", "ta_plev"] -atm_stashvar[30205] = ["SPECIFIC HUMIDITY ON P LEV/UV GRID", "hus", "1", "specific_humidity", "hus_plev"] -atm_stashvar[30206] = ["RELATIVE HUMIDITY ON P LEV/UV GRID", "hur", "%", "relative_humidity", "hur_plev"] -atm_stashvar[30207] = ["GEOPOTENTIAL HEIGHT ON P LEV/UV GRID", "zg", "m", "geopotential_height", "zg_plev"] -atm_stashvar[30208] = ["OMEGA ON P LEV/UV GRID", "wap", "Pa s-1", "lagrangian_tendency_of_air_pressure", "wap_plev"] -atm_stashvar[30211] = ["UU ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30212] = ["UV ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30213] = ["UW ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30214] = ["UT ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30215] = ["UQ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30217] = ["UZ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30218] = ["UOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30222] = ["VV ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30223] = ["VW ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30224] = ["VT ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30225] = ["VQ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30227] = ["VZ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30228] = ["VOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30233] = ["WW ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30234] = ["WT ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30235] = ["WQ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30237] = ["WZ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30238] = ["WOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30244] = ["TT ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30245] = ["TQ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30247] = ["TZ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30248] = ["TOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30255] = ["QQ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30257] = ["QZ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30258] = ["QOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30277] = ["ZZ ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30278] = ["ZOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30288] = ["OMOM ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30293] = ["W COMPNT OF WIND ON P LEV/T GRID", "", "", "", ""] -atm_stashvar[30294] = ["TEMPERATURE ON P LEV/T GRID", "ta", "K", "air_temperature", "ta_plev"] -atm_stashvar[30295] = ["SPECIFIC HUMIDITY ON P LEV/T GRID", "hus", "1", "specific_humidity", "hus_plev"] -atm_stashvar[30296] = ["RELATIVE HUMIDITY ON P LEV/T GRID", "hur", "%", "relative_humidity", "hur_plev"] -atm_stashvar[30297] = ["GEOPOTENTIAL HEIGHT ON P LEV/T GRID", "zg", "m", "geopotential_height", "zg_plev"] -atm_stashvar[30298] = ["OMEGA ON P LEV/T GRID", "wa", "Pa s-1", "lagrangian_tendency_of_air_pressure", "wap_plev"] -atm_stashvar[30301] = ["HEAVYSIDE FN ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30302] = ["VIRTUAL TEMPERATURE ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30303] = ["VIRTUAL TEMP*OMEGA ON P LEV/UV GRID", "", "", "", ""] -atm_stashvar[30304] = ["HEAVYSIDE FN ON P LEV/T GRID", "", "", "", ""] -atm_stashvar[30310] = ["RESIDUAL MN MERID. CIRC. VSTARBAR", "", "", "", ""] -atm_stashvar[30311] = ["RESIDUAL MN MERID. CIRC. WSTARBAR", "", "", "", ""] -atm_stashvar[30312] = ["ELIASSEN-PALM FLUX (MERID. COMPNT)", "", "", "", ""] -atm_stashvar[30313] = ["ELIASSEN-PALM FLUX (VERT. COMPNT)", "", "", "", ""] -atm_stashvar[30314] = ["DIVERGENCE OF ELIASSEN-PALM FLUX", "", "", "", ""] -atm_stashvar[30315] = ["MERIDIONAL HEAT FLUX", "", "", "", ""] -atm_stashvar[30316] = ["MERIDIONAL MOMENTUM FLUX", "", "", "", ""] -atm_stashvar[30401] = ["TOTAL KE PER UNIT AREA RHO GRID", "", "", "", ""] -atm_stashvar[30402] = ["TOTAL KE PER UA WITH W RHO GRID", "", "", "", ""] -atm_stashvar[30403] = ["TOTAL COLUMN DRY MASS RHO GRID", "", "kg m-2", "", ""] -atm_stashvar[30404] = ["TOTAL COLUMN WET MASS RHO GRID", "", "kg m-2", "", ""] -atm_stashvar[30405] = ["TOTAL COLUMN QCL RHO GRID", "lwp", "kg m-2", "atmosphere_cloud_liquid_water_content", ""] -atm_stashvar[30406] = ["TOTAL COLUMN QCF RHO GRID", "clivi", "kg m-2", "atmosphere_cloud_ice_content", ""] -atm_stashvar[30407] = ["TOTAL WATER VAPOUR FLUX U RHO GRID", "", "", "", ""] -atm_stashvar[30408] = ["TOTAL WATER VAPOUR FLUX V RHO GRID", "", "", "", ""] -atm_stashvar[30409] = ["TOTAL WATER VAPOUR FLUX W RHO GRID", "", "", "", ""] -atm_stashvar[30410] = ["MOUNTAIN TORQUE PER UNIT AREA N/M", "", "", "", ""] -atm_stashvar[30411] = ["ANGULAR MOMENTUM M1 KG M2/S X10-24", "", "", "", ""] -atm_stashvar[30412] = ["ANGULAR MOMENTUM M2 KG M2/S X10-24", "", "", "", ""] -atm_stashvar[30413] = ["ANGULAR MOMENTUM M3 KG M2/S X10-24", "", "", "", ""] -atm_stashvar[30414] = ["ANGULAR MOMENTUM W1 KG M2/S X10-24", "", "", "", ""] -atm_stashvar[30415] = ["ANGULAR MOMENTUM W2 KG M2/S X10-24", "", "", "", ""] -atm_stashvar[30416] = ["ANGULAR MOMENTUM W3 KG M2/S X10-24", "", "", "", ""] -atm_stashvar[30417] = ["PSTAR P GRID", "", "Pa", "surface_air_pressure", ""] -atm_stashvar[30418] = ["PSTAR UV GRID", "", "", "", ""] -atm_stashvar[30419] = ["ENERGY CORR P GRID IN COLUMN W/M2", "", "", "", ""] -atm_stashvar[30420] = ["column integral cvT per unit area", "", "", "", ""] -atm_stashvar[30421] = ["column integral gr per unit area", "", "", "", ""] -atm_stashvar[30422] = ["dry mass col int u*gz per unit area", "", "", "", ""] -atm_stashvar[30423] = ["dry mass col int v*gz per unit area", "", "", "", ""] -atm_stashvar[30424] = ["dry mass col int w*gz per unit area", "", "", "", ""] -atm_stashvar[30425] = ["dry mass col int u*T per unit area", "", "", "", ""] -atm_stashvar[30426] = ["dry mass col int v*T per unit area", "", "", "", ""] -atm_stashvar[30427] = ["dry mass col int w*T per unit area", "", "", "", ""] -atm_stashvar[30428] = ["dry mass col int u*q per unit area", "", "", "", ""] -atm_stashvar[30429] = ["dry mass col int v*q per unit area", "", "", "", ""] -atm_stashvar[30430] = ["dry mass col int w*q per unit area", "", "", "", ""] -atm_stashvar[30431] = ["dry mass col int u*v per unit area", "", "", "", ""] -atm_stashvar[30432] = ["dry mass col int u*w per unit area", "", "", "", ""] -atm_stashvar[30433] = ["dry mass col int v*w per unit area", "", "", "", ""] -atm_stashvar[30434] = ["dry mass col int u*KE per unit area", "", "", "", ""] -atm_stashvar[30435] = ["dry mass col int v*KE per unit area", "", "", "", ""] -atm_stashvar[30436] = ["dry mass col int w*KE per unit area", "", "", "", ""] -atm_stashvar[30437] = ["dry mass col int u per unit area", "", "", "", ""] -atm_stashvar[30438] = ["dry mass col int v per unit area", "", "", "", ""] -atm_stashvar[30439] = ["dry mass col int w per unit area", "", "", "", ""] -atm_stashvar[30440] = ["mountain x-surf. pressure drag N/m-2", "", "", "", ""] -atm_stashvar[30441] = ["mountain y-surf. pressure drag N/m-2", "", "", "", ""] -atm_stashvar[30442] = ["COLUMN SATURATION FRACTION", "", "", "", ""] -atm_stashvar[30451] = ["Pressure at Tropopause Level", "", "", "", ""] -atm_stashvar[30452] = ["Temperature at Tropopause Level", "", "", "", ""] -atm_stashvar[30453] = ["Height at Tropopause Level", "", "", "", ""] -atm_stashvar[30454] = ["ICAO HT OF TROP- NEED HT,TEMP,PRESS", "", "", "", ""] -atm_stashvar[30455] = ["VORTICITY 850", "", "", "", ""] -atm_stashvar[30456] = ["FILTERED VORTICITY 850", "", "", "", ""] -atm_stashvar[30457] = ["VORTICITY TC", "", "", "", ""] -atm_stashvar[30458] = ["FILTERED VORTICITY TC", "", "", "", ""] -atm_stashvar[30459] = ["MEAN VORTICITY of req. levels", "", "", "", ""] -atm_stashvar[30460] = ["FIL MEAN VORT of req. levels", "", "", "", ""] -atm_stashvar[30461] = ["TOTAL COLUMN Q (WATER VAPOUR PATH)", "", "kg m-2", "", ""] -atm_stashvar[30462] = ["TOTAL MOISTURE FLUX U RHO GRID", "", "", "", ""] -atm_stashvar[30463] = ["TOTAL MOISTURE FLUX V RHO GRID", "", "", "", ""] -atm_stashvar[30464] = ["ATMOSPHERIC CO2 BURDEN IN GtC", "", "", "", ""] -atm_stashvar[30465] = ["ATMOSPHERIC CO2 BURDEN IN kg(CO2)", "", "", "", ""] -atm_stashvar[30466] = ["CO2 CONCENTRATION (ppmv)", "", "", "", ""] -atm_stashvar[30467] = ["CO2 MASS MIXING RATIO (kg/kg)", "", "", "", ""] -atm_stashvar[30901] = ["THETA TOTAL INCR ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30902] = ["THETAVD TOTAL INCR ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[30903] = ["DRY RHO TOTAL INCR ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[31001] = ["OROGRAPHY HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31002] = ["U HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31003] = ["V HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31004] = ["W HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31005] = ["DENSITY HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31006] = ["POTENTIAL TEMP HORIZ BOUND VALUE", "", "", "", ""] -atm_stashvar[31007] = ["SPECIFIC HUMIDTY HORIZ BOUND VALUE", "", "", "", ""] -atm_stashvar[31008] = ["QCL HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31009] = ["QCF HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31010] = ["EXNER PRESSURE HORIZ BOUND VALUE", "", "", "", ""] -atm_stashvar[31011] = ["U_ADV HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31012] = ["V_ADV HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31013] = ["W_ADV HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31014] = ["CLD ICE (CRY) HORIZ. BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31015] = ["RAIN HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31016] = ["GRAUPEL HORIZONTAL BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31017] = ["TOTAL CLOUD FRACTION BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31018] = ["LIQUID CLOUD FRACTION BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31019] = ["FROZEN CLOUD FRACTION BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31020] = ["TOTAL AEROSOL (MURK) BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31023] = ["DUST DIV 1 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31024] = ["DUST DIV 2 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31025] = ["DUST DIV 3 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31026] = ["DUST DIV 4 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31027] = ["DUST DIV 5 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31028] = ["DUST DIV 6 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31029] = ["SO2 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31030] = ["DMS BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31031] = ["SO4_AITKEN BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31032] = ["SO4_ACCU BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31033] = ["SO4_DISS BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31035] = ["NH3 BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31036] = ["SOOT_NEW BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31037] = ["SOOT_AGD BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31038] = ["SOOT_CLD BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31039] = ["BMASS_NEW BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31040] = ["BMASS_AGD BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31041] = ["BMASS_CLD BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31042] = ["OCFF_NEW BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31043] = ["OCFF_AGD BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31044] = ["OCFF_CLD BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31045] = ["NITR_ACC BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31046] = ["NITR_DISS BOUNDARY VALUE", "", "", "", ""] -atm_stashvar[31257] = ["U HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31258] = ["V HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31259] = ["W HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31260] = ["DENSITY HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31261] = ["POTENTIAL TEMP HORIZ BOUND TENDENCY", "", "", "", ""] -atm_stashvar[31262] = ["SPECIFIC HUMIDTY HORIZ BOUND TEND", "", "", "", ""] -atm_stashvar[31263] = ["QCL HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31264] = ["QCF HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31265] = ["EXNER PRESSURE HORIZ BOUND TENDENCY", "", "", "", ""] -atm_stashvar[31266] = ["U_ADV HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31267] = ["V_ADV HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31268] = ["W_ADV HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31269] = ["CLD ICE (CRY) HORIZ. BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31270] = ["RAIN HORIZONTAL BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31271] = ["GRAUPEL HORIZONTAL BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31272] = ["TOTAL CLOUD FRACTN BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31273] = ["LIQUID CLOUD FRACN BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31274] = ["FROZEN CLOUD FRACN BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[31275] = ["TOTAL AEROSOL (MURK) BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31276] = ["DUST DIV 1 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31277] = ["DUST DIV 2 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31278] = ["DUST DIV 3 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31279] = ["DUST DIV 4 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31280] = ["DUST DIV 5 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31281] = ["DUST DIV 6 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31282] = ["SO2 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31283] = ["DMS BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31284] = ["SO4_AITKEN BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31285] = ["SO4_ACCU BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31286] = ["SO4_DISS BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31288] = ["NH3 BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31289] = ["SOOT_NEW BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31290] = ["SOOT_AGD BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31291] = ["SOOT_CLD BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31292] = ["BMASS_NEW BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31293] = ["BMASS_AGD BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31294] = ["BMASS_CLD BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31295] = ["OCFF_NEW BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31296] = ["OCFF_AGD BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31297] = ["OCFF_CLD BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31298] = ["NITR_ACC BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[31299] = ["NITR_DISS BOUNDARY TEND.", "", "", "", ""] -atm_stashvar[32001] = ["OROGRAPHY HORIZONTAL BV OUT retired", "", "", "", ""] -atm_stashvar[32002] = ["U HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32003] = ["V HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32004] = ["W HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32005] = ["DENSITY HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32006] = ["POTENTIAL TEMP HORIZ BV OUT(retired)", "", "", "", ""] -atm_stashvar[32007] = ["SPECIFIC HUMIDTY HORIZ BV OUT (retd)", "", "", "", ""] -atm_stashvar[32008] = ["QCL HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32009] = ["QCF HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32010] = ["EXNER PRESSURE HORIZ BV OUT(retired)", "", "", "", ""] -atm_stashvar[32011] = ["U_ADV HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32012] = ["V_ADV HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32013] = ["W_ADV HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32014] = ["CLOUD ICE HORIZONTAL BV OUT retired", "", "", "", ""] -atm_stashvar[32015] = ["RAIN HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32016] = ["GRAUPEL HORIZONTAL BV OUT (retired)", "", "", "", ""] -atm_stashvar[32017] = ["TOTAL CLOUD FRACTION BV OUT(retired)", "", "", "", ""] -atm_stashvar[32018] = ["LIQUID CLOUD FRACTION BV OUT", "", "", "", ""] -atm_stashvar[32019] = ["FROZEN CLOUD FRACTION BV OUT (retd)", "", "", "", ""] -atm_stashvar[32020] = ["TOTAL AEROSOL (MURK) BV OUT (retd)", "", "", "", ""] -atm_stashvar[32021] = ["ATM FREE TRACER BOUND VAL. OUT retd", "", "", "", ""] -atm_stashvar[32022] = ["UKCA TRACER BOUND VAL. OUT (retired)", "", "", "", ""] -atm_stashvar[32023] = ["DUST DIV 1 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32024] = ["DUST DIV 2 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32025] = ["DUST DIV 3 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32026] = ["DUST DIV 4 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32027] = ["DUST DIV 5 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32028] = ["DUST DIV 6 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32029] = ["SO2 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32030] = ["DMS BV OUT (retired)", "", "", "", ""] -atm_stashvar[32031] = ["SO4_AITKEN BV OUT (retired)", "", "", "", ""] -atm_stashvar[32032] = ["SO4_ACCU BV OUT (retired)", "", "", "", ""] -atm_stashvar[32033] = ["SO4_DISS BV OUT (retired)", "", "", "", ""] -atm_stashvar[32035] = ["NH3 BV OUT (retired)", "", "", "", ""] -atm_stashvar[32036] = ["SOOT_NEW BV OUT (retired)", "", "", "", ""] -atm_stashvar[32037] = ["SOOT_AGD BV OUT (retired)", "", "", "", ""] -atm_stashvar[32038] = ["SOOT_CLD BV OUT (retired)", "", "", "", ""] -atm_stashvar[32039] = ["BMASS_NEW BV OUT (retired)", "", "", "", ""] -atm_stashvar[32040] = ["BMASS_AGD BV OUT (retired)", "", "", "", ""] -atm_stashvar[32041] = ["BMASS_CLD BV OUT (retired)", "", "", "", ""] -atm_stashvar[32042] = ["OCFF_NEW BV OUT (retired)", "", "", "", ""] -atm_stashvar[32043] = ["OCFF_AGD BV OUT (retired)", "", "", "", ""] -atm_stashvar[32044] = ["OCFF_CLD BV OUT (retired)", "", "", "", ""] -atm_stashvar[32045] = ["NITR_ACC BV OUT (retired)", "", "", "", ""] -atm_stashvar[32046] = ["NITR_DISS BV OUT (retired)", "", "", "", ""] -atm_stashvar[33001] = ["ATM TRACER 1 AFTER TS", "", "", "", ""] -atm_stashvar[33002] = ["ATM TRACER 2 AFTER TS", "", "", "", ""] -atm_stashvar[33003] = ["ATM TRACER 3 AFTER TS", "", "", "", ""] -atm_stashvar[33004] = ["ATM TRACER 4 AFTER TS", "", "", "", ""] -atm_stashvar[33005] = ["ATM TRACER 5 AFTER TS", "", "", "", ""] -atm_stashvar[33006] = ["ATM TRACER 6 AFTER TS", "", "", "", ""] -atm_stashvar[33007] = ["ATM TRACER 7 AFTER TS", "", "", "", ""] -atm_stashvar[33008] = ["ATM TRACER 8 AFTER TS", "", "", "", ""] -atm_stashvar[33009] = ["ATM TRACER 9 AFTER TS", "", "", "", ""] -atm_stashvar[33010] = ["ATM TRACER 10 AFTER TS", "", "", "", ""] -atm_stashvar[33011] = ["ATM TRACER 11 AFTER TS", "", "", "", ""] -atm_stashvar[33012] = ["ATM TRACER 12 AFTER TS", "", "", "", ""] -atm_stashvar[33013] = ["ATM TRACER 13 AFTER TS", "", "", "", ""] -atm_stashvar[33014] = ["ATM TRACER 14 AFTER TS", "", "", "", ""] -atm_stashvar[33015] = ["ATM TRACER 15 AFTER TS", "", "", "", ""] -atm_stashvar[33016] = ["ATM TRACER 16 AFTER TS", "", "", "", ""] -atm_stashvar[33017] = ["ATM TRACER 17 AFTER TS", "", "", "", ""] -atm_stashvar[33018] = ["ATM TRACER 18 AFTER TS", "", "", "", ""] -atm_stashvar[33019] = ["ATM TRACER 19 AFTER TS", "", "", "", ""] -atm_stashvar[33020] = ["ATM TRACER 20 AFTER TS", "", "", "", ""] -atm_stashvar[33021] = ["ATM TRACER 21 AFTER TS", "", "", "", ""] -atm_stashvar[33022] = ["ATM TRACER 22 AFTER TS", "", "", "", ""] -atm_stashvar[33023] = ["ATM TRACER 23 AFTER TS", "", "", "", ""] -atm_stashvar[33024] = ["ATM TRACER 24 AFTER TS", "", "", "", ""] -atm_stashvar[33025] = ["ATM TRACER 25 AFTER TS", "", "", "", ""] -atm_stashvar[33026] = ["ATM TRACER 26 AFTER TS", "", "", "", ""] -atm_stashvar[33027] = ["ATM TRACER 27 AFTER TS", "", "", "", ""] -atm_stashvar[33028] = ["ATM TRACER 28 AFTER TS", "", "", "", ""] -atm_stashvar[33029] = ["ATM TRACER 29 AFTER TS", "", "", "", ""] -atm_stashvar[33030] = ["ATM TRACER 30 AFTER TS", "", "", "", ""] -atm_stashvar[33031] = ["ATM TRACER 31 AFTER TS", "", "", "", ""] -atm_stashvar[33032] = ["ATM TRACER 32 AFTER TS", "", "", "", ""] -atm_stashvar[33033] = ["ATM TRACER 33 AFTER TS", "", "", "", ""] -atm_stashvar[33034] = ["ATM TRACER 34 AFTER TS", "", "", "", ""] -atm_stashvar[33035] = ["ATM TRACER 35 AFTER TS", "", "", "", ""] -atm_stashvar[33036] = ["ATM TRACER 36 AFTER TS", "", "", "", ""] -atm_stashvar[33037] = ["ATM TRACER 37 AFTER TS", "", "", "", ""] -atm_stashvar[33038] = ["ATM TRACER 38 AFTER TS", "", "", "", ""] -atm_stashvar[33039] = ["ATM TRACER 39 AFTER TS", "", "", "", ""] -atm_stashvar[33040] = ["ATM TRACER 40 AFTER TS", "", "", "", ""] -atm_stashvar[33041] = ["ATM TRACER 41 AFTER TS", "", "", "", ""] -atm_stashvar[33042] = ["ATM TRACER 42 AFTER TS", "", "", "", ""] -atm_stashvar[33043] = ["ATM TRACER 43 AFTER TS", "", "", "", ""] -atm_stashvar[33044] = ["ATM TRACER 44 AFTER TS", "", "", "", ""] -atm_stashvar[33045] = ["ATM TRACER 45 AFTER TS", "", "", "", ""] -atm_stashvar[33046] = ["ATM TRACER 46 AFTER TS", "", "", "", ""] -atm_stashvar[33047] = ["ATM TRACER 47 AFTER TS", "", "", "", ""] -atm_stashvar[33048] = ["ATM TRACER 48 AFTER TS", "", "", "", ""] -atm_stashvar[33049] = ["ATM TRACER 49 AFTER TS", "", "", "", ""] -atm_stashvar[33050] = ["ATM TRACER 50 AFTER TS", "", "", "", ""] -atm_stashvar[33051] = ["ATM TRACER 51 AFTER TS", "", "", "", ""] -atm_stashvar[33052] = ["ATM TRACER 52 AFTER TS", "", "", "", ""] -atm_stashvar[33053] = ["ATM TRACER 53 AFTER TS", "", "", "", ""] -atm_stashvar[33054] = ["ATM TRACER 54 AFTER TS", "", "", "", ""] -atm_stashvar[33055] = ["ATM TRACER 55 AFTER TS", "", "", "", ""] -atm_stashvar[33056] = ["ATM TRACER 56 AFTER TS", "", "", "", ""] -atm_stashvar[33057] = ["ATM TRACER 57 AFTER TS", "", "", "", ""] -atm_stashvar[33058] = ["ATM TRACER 58 AFTER TS", "", "", "", ""] -atm_stashvar[33059] = ["ATM TRACER 59 AFTER TS", "", "", "", ""] -atm_stashvar[33060] = ["ATM TRACER 60 AFTER TS", "", "", "", ""] -atm_stashvar[33061] = ["ATM TRACER 61 AFTER TS", "", "", "", ""] -atm_stashvar[33062] = ["ATM TRACER 62 AFTER TS", "", "", "", ""] -atm_stashvar[33063] = ["ATM TRACER 63 AFTER TS", "", "", "", ""] -atm_stashvar[33064] = ["ATM TRACER 64 AFTER TS", "", "", "", ""] -atm_stashvar[33065] = ["ATM TRACER 65 AFTER TS", "", "", "", ""] -atm_stashvar[33066] = ["ATM TRACER 66 AFTER TS", "", "", "", ""] -atm_stashvar[33067] = ["ATM TRACER 67 AFTER TS", "", "", "", ""] -atm_stashvar[33068] = ["ATM TRACER 68 AFTER TS", "", "", "", ""] -atm_stashvar[33069] = ["ATM TRACER 69 AFTER TS", "", "", "", ""] -atm_stashvar[33070] = ["ATM TRACER 70 AFTER TS", "", "", "", ""] -atm_stashvar[33071] = ["ATM TRACER 71 AFTER TS", "", "", "", ""] -atm_stashvar[33072] = ["ATM TRACER 72 AFTER TS", "", "", "", ""] -atm_stashvar[33073] = ["ATM TRACER 73 AFTER TS", "", "", "", ""] -atm_stashvar[33074] = ["ATM TRACER 74 AFTER TS", "", "", "", ""] -atm_stashvar[33075] = ["ATM TRACER 75 AFTER TS", "", "", "", ""] -atm_stashvar[33076] = ["ATM TRACER 76 AFTER TS", "", "", "", ""] -atm_stashvar[33077] = ["ATM TRACER 77 AFTER TS", "", "", "", ""] -atm_stashvar[33078] = ["ATM TRACER 78 AFTER TS", "", "", "", ""] -atm_stashvar[33079] = ["ATM TRACER 79 AFTER TS", "", "", "", ""] -atm_stashvar[33080] = ["ATM TRACER 80 AFTER TS", "", "", "", ""] -atm_stashvar[33081] = ["ATM TRACER 81 AFTER TS", "", "", "", ""] -atm_stashvar[33082] = ["ATM TRACER 82 AFTER TS", "", "", "", ""] -atm_stashvar[33083] = ["ATM TRACER 83 AFTER TS", "", "", "", ""] -atm_stashvar[33084] = ["ATM TRACER 84 AFTER TS", "", "", "", ""] -atm_stashvar[33085] = ["ATM TRACER 85 AFTER TS", "", "", "", ""] -atm_stashvar[33086] = ["ATM TRACER 86 AFTER TS", "", "", "", ""] -atm_stashvar[33087] = ["ATM TRACER 87 AFTER TS", "", "", "", ""] -atm_stashvar[33088] = ["ATM TRACER 88 AFTER TS", "", "", "", ""] -atm_stashvar[33089] = ["ATM TRACER 89 AFTER TS", "", "", "", ""] -atm_stashvar[33090] = ["ATM TRACER 90 AFTER TS", "", "", "", ""] -atm_stashvar[33091] = ["ATM TRACER 91 AFTER TS", "", "", "", ""] -atm_stashvar[33092] = ["ATM TRACER 92 AFTER TS", "", "", "", ""] -atm_stashvar[33093] = ["ATM TRACER 93 AFTER TS", "", "", "", ""] -atm_stashvar[33094] = ["ATM TRACER 94 AFTER TS", "", "", "", ""] -atm_stashvar[33095] = ["ATM TRACER 95 AFTER TS", "", "", "", ""] -atm_stashvar[33096] = ["ATM TRACER 96 AFTER TS", "", "", "", ""] -atm_stashvar[33097] = ["ATM TRACER 97 AFTER TS", "", "", "", ""] -atm_stashvar[33098] = ["ATM TRACER 98 AFTER TS", "", "", "", ""] -atm_stashvar[33099] = ["ATM TRACER 99 AFTER TS", "", "", "", ""] -atm_stashvar[33100] = ["ATM TRACER100 AFTER TS", "", "", "", ""] -atm_stashvar[33101] = ["ATM TRACER101 AFTER TS", "", "", "", ""] -atm_stashvar[33102] = ["ATM TRACER102 AFTER TS", "", "", "", ""] -atm_stashvar[33103] = ["ATM TRACER103 AFTER TS", "", "", "", ""] -atm_stashvar[33104] = ["ATM TRACER104 AFTER TS", "", "", "", ""] -atm_stashvar[33105] = ["ATM TRACER105 AFTER TS", "", "", "", ""] -atm_stashvar[33106] = ["ATM TRACER106 AFTER TS", "", "", "", ""] -atm_stashvar[33107] = ["ATM TRACER107 AFTER TS", "", "", "", ""] -atm_stashvar[33108] = ["ATM TRACER108 AFTER TS", "", "", "", ""] -atm_stashvar[33109] = ["ATM TRACER109 AFTER TS", "", "", "", ""] -atm_stashvar[33110] = ["ATM TRACER110 AFTER TS", "", "", "", ""] -atm_stashvar[33111] = ["ATM TRACER111 AFTER TS", "", "", "", ""] -atm_stashvar[33112] = ["ATM TRACER112 AFTER TS", "", "", "", ""] -atm_stashvar[33113] = ["ATM TRACER113 AFTER TS", "", "", "", ""] -atm_stashvar[33114] = ["ATM TRACER114 AFTER TS", "", "", "", ""] -atm_stashvar[33115] = ["ATM TRACER115 AFTER TS", "", "", "", ""] -atm_stashvar[33116] = ["ATM TRACER116 AFTER TS", "", "", "", ""] -atm_stashvar[33117] = ["ATM TRACER117 AFTER TS", "", "", "", ""] -atm_stashvar[33118] = ["ATM TRACER118 AFTER TS", "", "", "", ""] -atm_stashvar[33119] = ["ATM TRACER119 AFTER TS", "", "", "", ""] -atm_stashvar[33120] = ["ATM TRACER120 AFTER TS", "", "", "", ""] -atm_stashvar[33121] = ["ATM TRACER121 AFTER TS", "", "", "", ""] -atm_stashvar[33122] = ["ATM TRACER122 AFTER TS", "", "", "", ""] -atm_stashvar[33123] = ["ATM TRACER123 AFTER TS", "", "", "", ""] -atm_stashvar[33124] = ["ATM TRACER124 AFTER TS", "", "", "", ""] -atm_stashvar[33125] = ["ATM TRACER125 AFTER TS", "", "", "", ""] -atm_stashvar[33126] = ["ATM TRACER126 AFTER TS", "", "", "", ""] -atm_stashvar[33127] = ["ATM TRACER127 AFTER TS", "", "", "", ""] -atm_stashvar[33128] = ["ATM TRACER128 AFTER TS", "", "", "", ""] -atm_stashvar[33129] = ["ATM TRACER129 AFTER TS", "", "", "", ""] -atm_stashvar[33130] = ["ATM TRACER130 AFTER TS", "", "", "", ""] -atm_stashvar[33131] = ["ATM TRACER131 AFTER TS", "", "", "", ""] -atm_stashvar[33132] = ["ATM TRACER132 AFTER TS", "", "", "", ""] -atm_stashvar[33133] = ["ATM TRACER133 AFTER TS", "", "", "", ""] -atm_stashvar[33134] = ["ATM TRACER134 AFTER TS", "", "", "", ""] -atm_stashvar[33135] = ["ATM TRACER135 AFTER TS", "", "", "", ""] -atm_stashvar[33136] = ["ATM TRACER136 AFTER TS", "", "", "", ""] -atm_stashvar[33137] = ["ATM TRACER137 AFTER TS", "", "", "", ""] -atm_stashvar[33138] = ["ATM TRACER138 AFTER TS", "", "", "", ""] -atm_stashvar[33139] = ["ATM TRACER139 AFTER TS", "", "", "", ""] -atm_stashvar[33140] = ["ATM TRACER140 AFTER TS", "", "", "", ""] -atm_stashvar[33141] = ["ATM TRACER141 AFTER TS", "", "", "", ""] -atm_stashvar[33142] = ["ATM TRACER142 AFTER TS", "", "", "", ""] -atm_stashvar[33143] = ["ATM TRACER143 AFTER TS", "", "", "", ""] -atm_stashvar[33144] = ["ATM TRACER144 AFTER TS", "", "", "", ""] -atm_stashvar[33145] = ["ATM TRACER145 AFTER TS", "", "", "", ""] -atm_stashvar[33146] = ["ATM TRACER146 AFTER TS", "", "", "", ""] -atm_stashvar[33147] = ["ATM TRACER147 AFTER TS", "", "", "", ""] -atm_stashvar[33148] = ["ATM TRACER148 AFTER TS", "", "", "", ""] -atm_stashvar[33149] = ["ATM TRACER149 AFTER TS", "", "", "", ""] -atm_stashvar[33150] = ["ATM TRACER150 AFTER TS", "", "", "", ""] -atm_stashvar[34001] = ["O3 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34002] = ["NO MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34003] = ["NO3 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34004] = ["NO2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34005] = ["N2O5 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34006] = ["HO2NO2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34007] = ["HONO2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34008] = ["H2O2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34009] = ["CH4 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34010] = ["CO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34011] = ["HCHO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34012] = ["MeOOH MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34013] = ["HONO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34014] = ["C2H6 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34015] = ["EtOOH MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34016] = ["MeCHO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34017] = ["PAN MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34018] = ["C3H8 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34019] = ["n-PrOOH MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34020] = ["i-PrOOH MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34021] = ["EtCHO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34022] = ["Me2CO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34023] = ["MeCOCH2OOH MASS MIXING RATIO AFT TS", "", "", "", ""] -atm_stashvar[34024] = ["PPAN MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34025] = ["MeONO2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34026] = ["O3S MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34027] = ["C5H8 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34028] = ["ISOOH MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34029] = ["ISON MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34030] = ["MACR MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34031] = ["MACROOH MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34032] = ["MPAN MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34033] = ["HACET MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34034] = ["MGLY MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34035] = ["NALD MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34036] = ["HCOOH MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34037] = ["MeCO3H MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34038] = ["MeCO2H MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34039] = ["MVK MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34040] = ["MVKOOH MASS MIXING RATIO AFTER T", "", "", "", ""] -atm_stashvar[34041] = ["Cl MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34042] = ["ClO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34043] = ["Cl2O2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34044] = ["OClO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34045] = ["Br MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34047] = ["BrCl MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34048] = ["BrONO2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34049] = ["N2O MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34051] = ["HOCl MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34052] = ["HBr MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34053] = ["HOBr MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34054] = ["ClONO2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34055] = ["CFCl3 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34056] = ["CF2Cl2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34057] = ["MeBr MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34058] = ["N MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34059] = ["O3P MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34060] = ["ORGNIT MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34069] = ["CH3OH MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34070] = ["H2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34071] = ["DMS MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34072] = ["SO2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34073] = ["H2SO4 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34074] = ["MSA MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34075] = ["DMSO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34076] = ["NH3 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34077] = ["CS2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34078] = ["COS MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34079] = ["H2S MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34080] = ["H MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34081] = ["OH MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34082] = ["HO2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34083] = ["MeOO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34084] = ["EtOO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34085] = ["MeCO3 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34086] = ["n-PrOO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34087] = ["i-PrOO MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34088] = ["EtCO3 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34089] = ["MeCOCH2OO MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34090] = ["MeOH MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34091] = ["MONOTERPENE MASS MIXING RATIO AFT TS", "", "", "", ""] -atm_stashvar[34092] = ["SEC_ORG MASS MIXING RATIO AFTER TS", "", "", "", ""] -atm_stashvar[34093] = ["C3H6 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34094] = ["SO3 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34095] = ["C4H9OOH MASS MIXING RATIO AFT TSTEP", "", "", "", ""] -atm_stashvar[34096] = ["MEK MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34097] = ["TOLUENE MASS MIXING RATIO AFT TSTEP", "", "", "", ""] -atm_stashvar[34098] = ["LUMPED N (as NO2) MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34099] = ["LUMPED Br (as BrO) MMR AFTER TSTEP", "", "", "", ""] -atm_stashvar[34100] = ["LUMPED Cl (as HCl) MMR AFTER TSTEP", "", "", "", ""] -atm_stashvar[34101] = ["NUCLEATION MODE (SOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34102] = ["NUCLEATION MODE (SOLUBLE) H2SO4 MMR", "", "", "", ""] -atm_stashvar[34103] = ["AITKEN MODE (SOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34104] = ["AITKEN MODE (SOLUBLE) H2SO4 MMR", "", "", "", ""] -atm_stashvar[34105] = ["AITKEN MODE (SOLUBLE) BC MMR", "", "", "", ""] -atm_stashvar[34106] = ["AITKEN MODE (SOLUBLE) OM MMR", "", "", "", ""] -atm_stashvar[34107] = ["ACCUMULATION MODE (SOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34108] = ["ACCUMULATION MODE (SOL) H2SO4 MMR", "", "", "", ""] -atm_stashvar[34109] = ["ACCUMULATION MODE (SOL) BC MMR", "", "", "", ""] -atm_stashvar[34110] = ["ACCUMULATION MODE (SOL) OM MMR", "", "", "", ""] -atm_stashvar[34111] = ["ACCUMULATION MODE (SOL) SEA SALT MMR", "", "", "", ""] -atm_stashvar[34112] = ["ACCUMULATION MODE (SOL) DUST MMR", "", "", "", ""] -atm_stashvar[34113] = ["COARSE MODE (SOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34114] = ["COARSE MODE (SOLUBLE) H2SO4 MMR", "", "", "", ""] -atm_stashvar[34115] = ["COARSE MODE (SOLUBLE) BC MMR", "", "", "", ""] -atm_stashvar[34116] = ["COARSE MODE (SOLUBLE) OM MMR", "", "", "", ""] -atm_stashvar[34117] = ["COARSE MODE (SOLUBLE) SEA SALT MMR", "", "", "", ""] -atm_stashvar[34118] = ["COARSE MODE (SOLUBLE) DUST MMR", "", "", "", ""] -atm_stashvar[34119] = ["AITKEN MODE (INSOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34120] = ["AITKEN MODE (INSOLUBLE) BC MMR", "", "", "", ""] -atm_stashvar[34121] = ["AITKEN MODE (INSOLUBLE) OM MMR", "", "", "", ""] -atm_stashvar[34122] = ["ACCUMULATION MODE (INSOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34123] = ["ACCUMULATION MODE (INSOLUBLE) DUST", "", "", "", ""] -atm_stashvar[34124] = ["COARSE MODE (INSOLUBLE) NUMBER", "", "", "", ""] -atm_stashvar[34125] = ["COARSE MODE (INSOLUBLE) DUST MMR", "", "", "", ""] -atm_stashvar[34126] = ["NUCLEATION MODE (SOLUBLE) OM MMR", "", "", "", ""] -atm_stashvar[34127] = ["AITKEN MODE (SOLUBLE) SEA SALT MMR", "", "", "", ""] -atm_stashvar[34128] = ["NUCLEATION MODE (SOLUBLE) OM2 MMR", "", "", "", ""] -atm_stashvar[34129] = ["AITKEN MODE (SOLUBLE) OM2 MMR", "", "", "", ""] -atm_stashvar[34130] = ["ACCUMULATION MODE (SOLUBLE) OM2 MMR", "", "", "", ""] -atm_stashvar[34131] = ["COARSE MODE (SOLUBLE) OM2 MMR", "", "", "", ""] -atm_stashvar[34132] = ["NUCLEATION MODE (SOLUBLE) NH4 MMR", "", "", "", ""] -atm_stashvar[34133] = ["AITKEN MODE (SOLUBLE) NH4 MMR", "", "", "", ""] -atm_stashvar[34134] = ["ACCUMULATION MODE (SOLUBLE) NH4 MMR", "", "", "", ""] -atm_stashvar[34135] = ["COARSE MODE (SOLUBLE) NH4 MMR", "", "", "", ""] -atm_stashvar[34136] = ["NUCLEATION MODE (SOLUBLE) NO3 MMR", "", "", "", ""] -atm_stashvar[34137] = ["AITKEN MODE (SOLUBLE) NO3 MMR", "", "", "", ""] -atm_stashvar[34138] = ["ACCUMULATION MODE (SOLUBLE) NO3 MMR", "", "", "", ""] -atm_stashvar[34139] = ["COARSE MODE (SOLUBLE) NO3 MMR", "", "", "", ""] -atm_stashvar[34149] = ["PASSIVE O3 MASS MIXING RATIO", "", "", "", ""] -atm_stashvar[34150] = ["AGE OF AIR IN SECONDS", "", "", "", ""] -atm_stashvar[34151] = ["UKCA NON-TRANSP SPECIES 151 RETIRED", "", "", "", ""] -atm_stashvar[34152] = ["UKCA NON-TRANSP SPECIES 152 RETIRED", "", "", "", ""] -atm_stashvar[34153] = ["UKCA NON-TRANSP SPECIES 153 RETIRED", "", "", "", ""] -atm_stashvar[34154] = ["UKCA NON-TRANSP SPECIES 154 RETIRED", "", "", "", ""] -atm_stashvar[34155] = ["UKCA NON-TRANSP SPECIES 155 RETIRED", "", "", "", ""] -atm_stashvar[34156] = ["UKCA NON-TRANSP SPECIES 156 RETIRED", "", "", "", ""] -atm_stashvar[34157] = ["UKCA NON-TRANSP SPECIES 157 RETIRED", "", "", "", ""] -atm_stashvar[34158] = ["UKCA NON-TRANSP SPECIES 158 RETIRED", "", "", "", ""] -atm_stashvar[34159] = ["UKCA NON-TRANSP SPECIES 159 RETIRED", "", "", "", ""] -atm_stashvar[34160] = ["UKCA NON-TRANSP SPECIES 160 RETIRED", "", "", "", ""] -atm_stashvar[34161] = ["UKCA NON-TRANSP SPECIES 161 RETIRED", "", "", "", ""] -atm_stashvar[34162] = ["UKCA NON-TRANSP SPECIES 162 RETIRED", "", "", "", ""] -atm_stashvar[34163] = ["UKCA NON-TRANSP SPECIES 163 RETIRED", "", "", "", ""] -atm_stashvar[34164] = ["UKCA NON-TRANSP SPECIES 164 RETIRED", "", "", "", ""] -atm_stashvar[34165] = ["UKCA NON-TRANSP SPECIES 165 RETIRED", "", "", "", ""] -atm_stashvar[34166] = ["UKCA NON-TRANSP SPECIES 166 RETIRED", "", "", "", ""] -atm_stashvar[34167] = ["UKCA NON-TRANSP SPECIES 167 RETIRED", "", "", "", ""] -atm_stashvar[34168] = ["UKCA NON-TRANSP SPECIES 168 RETIRED", "", "", "", ""] -atm_stashvar[34169] = ["UKCA NON-TRANSP SPECIES 169 RETIRED", "", "", "", ""] -atm_stashvar[34170] = ["UKCA NON-TRANSP SPECIES 170 RETIRED", "", "", "", ""] -atm_stashvar[34171] = ["UKCA NON-TRANSP SPECIES 171 RETIRED", "", "", "", ""] -atm_stashvar[34172] = ["UKCA NON-TRANSP SPECIES 172 RETIRED", "", "", "", ""] -atm_stashvar[34921] = ["DRY PARTICLE DIAMETER AITKEN-SOL", "", "", "", ""] -atm_stashvar[34922] = ["DRY PARTICLE DIAMETER ACCUMULATN-SOL", "", "", "", ""] -atm_stashvar[34923] = ["DRY PARTICLE DIAMETER COARSE-SOL", "", "", "", ""] -atm_stashvar[34924] = ["DRY PARTICLE DIAMETER AITKEN-INS", "", "", "", ""] -atm_stashvar[34925] = ["DRY PARTICLE DIAMETER ACCUMULATN-INS", "", "", "", ""] -atm_stashvar[34926] = ["DRY PARTICLE DIAMETER COARSE-INSOL", "", "", "", ""] -atm_stashvar[34927] = ["WET PARTICLE DIAMETER AITKEN-SOL", "", "", "", ""] -atm_stashvar[34928] = ["WET PARTICLE DIAMETER ACCUMULATN-SOL", "", "", "", ""] -atm_stashvar[34929] = ["WET PARTICLE DIAMETER COARSE-SOL", "", "", "", ""] -atm_stashvar[34930] = ["PTCL MASS DENSITY AITKEN-SOL (WET)", "", "", "", ""] -atm_stashvar[34931] = ["PTCL MASS DENSITY ACCUM.-SOL (WET)", "", "", "", ""] -atm_stashvar[34932] = ["PTCL MASS DENSITY COARSE-SOL (WET)", "", "", "", ""] -atm_stashvar[34933] = ["PTCL MASS DENSITY AITKEN-INS", "", "", "", ""] -atm_stashvar[34934] = ["PTCL MASS DENSITY ACCUM.-INS", "", "", "", ""] -atm_stashvar[34935] = ["PTCL MASS DENSITY COARSE-INS", "", "", "", ""] -atm_stashvar[34936] = ["H2SO4 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[34937] = ["BC PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[34938] = ["OM1 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[34939] = ["NO3 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[34940] = ["OM2 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[34941] = ["H2O PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[34942] = ["H2SO4 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34943] = ["BC PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34944] = ["OM1 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34945] = ["SS PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34946] = ["NO3 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34947] = ["DU PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34948] = ["OM2 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34949] = ["CL PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34950] = ["NA PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34951] = ["H2O PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[34952] = ["H2SO4 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34953] = ["BC PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34954] = ["OM1 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34955] = ["SSALT PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34956] = ["NO3 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34957] = ["DU PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34958] = ["OM2 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34959] = ["CL PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34960] = ["NA PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34961] = ["H2O PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[34962] = ["BC PARTIAL VOLUME CONC (AIT-INS)", "", "", "", ""] -atm_stashvar[34963] = ["OM1 PARTIAL VOLUME CONC (AIT-INS)", "", "", "", ""] -atm_stashvar[34964] = ["DU PARTIAL VOLUME CONC (ACC-INS)", "", "", "", ""] -atm_stashvar[34965] = ["DU PARTIAL VOLUME CONC (COR-INS)", "", "", "", ""] -atm_stashvar[34966] = ["Aerosol surface area dens (cm2/cm3)", "", "", "", ""] -atm_stashvar[34967] = ["Cloud Droplet No. Conc. ^-1/3 (m-1)", "", "", "", ""] -atm_stashvar[34968] = ["Cloud Droplet No. Conc. (m-3)", "", "", "", ""] -atm_stashvar[34969] = ["Stratospheric HO2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34970] = ["Stratospheric OH MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34971] = ["Stratospheric O(1D) MMR AFTER TSTEP", "", "", "", ""] -atm_stashvar[34972] = ["Stratospheric O(3P) MMR AFTER TSTEP", "", "", "", ""] -atm_stashvar[34973] = ["Self reaction of HO2 on aerosol (s-1)", "", "", "", ""] -atm_stashvar[34974] = ["Loss rate of N2O5 on aerosol (s-1)", "", "", "", ""] -atm_stashvar[34975] = ["HOC6H5CH3O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34976] = ["HOC5H8O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34977] = ["CH3COCH(O2)CH2OH MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34978] = ["CHOCH(OH)CO2CH3CHO MMR AFTER TSTEP", "", "", "", ""] -atm_stashvar[34979] = ["C6H5CH2O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34980] = ["CH3CHO2CH2OH MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34981] = ["CH2O2CH2OH MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34982] = ["CH3COCH(O2)CH3 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34983] = ["CH3COCH2O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34984] = ["CH3COC2O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34985] = ["C2H5COO2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34986] = ["i-C2H7O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34987] = ["s-C4H9O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34988] = ["n-C2H7O2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34989] = ["CH3COO2 MMR AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34990] = ["C2H5O2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34991] = ["CH3O2 MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34992] = ["HCl MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34993] = ["HO2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34994] = ["BrO MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34995] = ["OH MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34996] = ["NO2 MASS MIXING RATIO AFTER TIMESTEP", "", "", "", ""] -atm_stashvar[34997] = ["O(1D) MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[34998] = ["O(3P) MASS MIXING RATIO AFTER TSTEP", "", "", "", ""] -atm_stashvar[35001] = ["U COMPNT OF WIND AFTER SKEB2", "", "", "", ""] -atm_stashvar[35002] = ["V COMPNT OF WIND AFTER SKEB2", "", "", "", ""] -atm_stashvar[35003] = ["U COMPNT OF WIND INCR SKEB2", "", "", "", ""] -atm_stashvar[35004] = ["V COMPNT OF WIND INCR SKEB2", "", "", "", ""] -atm_stashvar[35005] = ["ROT U COMPNT OF WIND INCR SKEB2", "", "", "", ""] -atm_stashvar[35006] = ["ROT V COMPNT OF WIND INCR SKEB2", "", "", "", ""] -atm_stashvar[35007] = ["DIV U COMPNT OF WIND INCR SKEB2", "", "", "", ""] -atm_stashvar[35008] = ["DIV V COMPNT OF WIND INCR SKEB2", "", "", "", ""] -atm_stashvar[35009] = ["SKEB2 DISSIPATION FROM SMAG", "", "", "", ""] -atm_stashvar[35010] = ["SKEB2 DISSIPATION FROM CONVECTION", "", "", "", ""] -atm_stashvar[35011] = ["SKEB2 DISS FROM SKEB1-TYPE PATTERN", "", "", "", ""] -atm_stashvar[35012] = ["SKEB2 SMOOTHED MODULATING FIELD", "", "", "", ""] -atm_stashvar[35013] = ["SKEB2 STREAMFUNCTION FORC FIELD", "", "", "", ""] -atm_stashvar[35014] = ["SKEB2 INITIAL RANDOM PATTERN", "", "", "", ""] -atm_stashvar[35015] = ["MASS VERT INT OF STRM FORC FIELD", "", "", "", ""] -atm_stashvar[35016] = ["VERT INTEG NUMERICAL DISSP (W/M^2)", "", "", "", ""] -atm_stashvar[35017] = ["VERT INTEG CONVECTVE DISSP (W/M^2)", "", "", "", ""] -atm_stashvar[35018] = ["VERT INTEG SKEB1-TYPE DISS (W/M^2)", "", "", "", ""] -atm_stashvar[35019] = ["MASS VERT INT OF MODULATED STRMFUNC", "", "", "", ""] -atm_stashvar[35020] = ["V INT KE WIND INCR PRE SKEB2 (J/M^2)", "", "", "", ""] -atm_stashvar[35021] = ["V INT KE WIND INCR SKEB2 (J/M^2)", "", "", "", ""] -atm_stashvar[35022] = ["V INT KE WIND INCR POST SKEB2(J/M^2)", "", "", "", ""] -atm_stashvar[35023] = ["SPT FORCING PATTERN", "", "", "", ""] -atm_stashvar[35024] = ["THETA TENDENCY SPT INCREMENT", "", "", "", ""] -atm_stashvar[35025] = ["Q TENDENCY SPT INCREMENT", "", "", "", ""] -atm_stashvar[35026] = ["U TENDENCY SPT INCREMENT", "", "", "", ""] -atm_stashvar[35027] = ["V TENDENCY SPT INCREMENT", "", "", "", ""] -atm_stashvar[35028] = ["CFL criteria breached", "", "", "", ""] -atm_stashvar[35029] = ["T TENDENCY SPT INCREMENT", "", "", "", ""] -atm_stashvar[36001] = ["ATM TRACER 1 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36002] = ["ATM TRACER 2 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36003] = ["ATM TRACER 3 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36004] = ["ATM TRACER 4 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36005] = ["ATM TRACER 5 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36006] = ["ATM TRACER 6 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36007] = ["ATM TRACER 7 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36008] = ["ATM TRACER 8 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36009] = ["ATM TRACER 9 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36010] = ["ATM TRACER 10 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36011] = ["ATM TRACER 11 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36012] = ["ATM TRACER 12 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36013] = ["ATM TRACER 13 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36014] = ["ATM TRACER 14 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36015] = ["ATM TRACER 15 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36016] = ["ATM TRACER 16 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36017] = ["ATM TRACER 17 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36018] = ["ATM TRACER 18 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36019] = ["ATM TRACER 19 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36020] = ["ATM TRACER 20 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36021] = ["ATM TRACER 21 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36022] = ["ATM TRACER 22 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36023] = ["ATM TRACER 23 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36024] = ["ATM TRACER 24 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36025] = ["ATM TRACER 25 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36026] = ["ATM TRACER 26 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36027] = ["ATM TRACER 27 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36028] = ["ATM TRACER 28 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36029] = ["ATM TRACER 29 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36030] = ["ATM TRACER 30 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36031] = ["ATM TRACER 31 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36032] = ["ATM TRACER 32 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36033] = ["ATM TRACER 33 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36034] = ["ATM TRACER 34 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36035] = ["ATM TRACER 35 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36036] = ["ATM TRACER 36 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36037] = ["ATM TRACER 37 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36038] = ["ATM TRACER 38 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36039] = ["ATM TRACER 39 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36040] = ["ATM TRACER 40 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36041] = ["ATM TRACER 41 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36042] = ["ATM TRACER 42 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36043] = ["ATM TRACER 43 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36044] = ["ATM TRACER 44 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36045] = ["ATM TRACER 45 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36046] = ["ATM TRACER 46 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36047] = ["ATM TRACER 47 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36048] = ["ATM TRACER 48 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36049] = ["ATM TRACER 49 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36050] = ["ATM TRACER 50 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36051] = ["ATM TRACER 51 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36052] = ["ATM TRACER 52 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36053] = ["ATM TRACER 53 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36054] = ["ATM TRACER 54 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36055] = ["ATM TRACER 55 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36056] = ["ATM TRACER 56 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36057] = ["ATM TRACER 57 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36058] = ["ATM TRACER 58 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36059] = ["ATM TRACER 59 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36060] = ["ATM TRACER 60 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36061] = ["ATM TRACER 61 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36062] = ["ATM TRACER 62 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36063] = ["ATM TRACER 63 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36064] = ["ATM TRACER 64 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36065] = ["ATM TRACER 65 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36066] = ["ATM TRACER 66 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36067] = ["ATM TRACER 67 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36068] = ["ATM TRACER 68 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36069] = ["ATM TRACER 69 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36070] = ["ATM TRACER 70 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36071] = ["ATM TRACER 71 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36072] = ["ATM TRACER 72 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36073] = ["ATM TRACER 73 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36074] = ["ATM TRACER 74 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36075] = ["ATM TRACER 75 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36076] = ["ATM TRACER 76 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36077] = ["ATM TRACER 77 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36078] = ["ATM TRACER 78 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36079] = ["ATM TRACER 79 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36080] = ["ATM TRACER 80 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36081] = ["ATM TRACER 81 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36082] = ["ATM TRACER 82 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36083] = ["ATM TRACER 83 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36084] = ["ATM TRACER 84 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36085] = ["ATM TRACER 85 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36086] = ["ATM TRACER 86 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36087] = ["ATM TRACER 87 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36088] = ["ATM TRACER 88 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36089] = ["ATM TRACER 89 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36090] = ["ATM TRACER 90 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36091] = ["ATM TRACER 91 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36092] = ["ATM TRACER 92 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36093] = ["ATM TRACER 93 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36094] = ["ATM TRACER 94 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36095] = ["ATM TRACER 95 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36096] = ["ATM TRACER 96 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36097] = ["ATM TRACER 97 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36098] = ["ATM TRACER 98 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36099] = ["ATM TRACER 99 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36100] = ["ATM TRACER 100 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36101] = ["ATM TRACER 101 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36102] = ["ATM TRACER 102 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36103] = ["ATM TRACER 103 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36104] = ["ATM TRACER 104 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36105] = ["ATM TRACER 105 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36106] = ["ATM TRACER 106 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36107] = ["ATM TRACER 107 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36108] = ["ATM TRACER 108 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36109] = ["ATM TRACER 109 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36110] = ["ATM TRACER 110 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36111] = ["ATM TRACER 111 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36112] = ["ATM TRACER 112 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36113] = ["ATM TRACER 113 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36114] = ["ATM TRACER 114 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36115] = ["ATM TRACER 115 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36116] = ["ATM TRACER 116 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36117] = ["ATM TRACER 117 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36118] = ["ATM TRACER 118 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36119] = ["ATM TRACER 119 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36120] = ["ATM TRACER 120 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36121] = ["ATM TRACER 121 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36122] = ["ATM TRACER 122 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36123] = ["ATM TRACER 123 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36124] = ["ATM TRACER 124 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36125] = ["ATM TRACER 125 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36126] = ["ATM TRACER 126 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36127] = ["ATM TRACER 127 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36128] = ["ATM TRACER 128 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36129] = ["ATM TRACER 129 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36130] = ["ATM TRACER 130 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36131] = ["ATM TRACER 131 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36132] = ["ATM TRACER 132 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36133] = ["ATM TRACER 133 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36134] = ["ATM TRACER 134 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36135] = ["ATM TRACER 135 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36136] = ["ATM TRACER 136 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36137] = ["ATM TRACER 137 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36138] = ["ATM TRACER 138 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36139] = ["ATM TRACER 139 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36140] = ["ATM TRACER 140 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36141] = ["ATM TRACER 141 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36142] = ["ATM TRACER 142 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36143] = ["ATM TRACER 143 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36144] = ["ATM TRACER 144 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36145] = ["ATM TRACER 145 LATERAL BOUNDARY", "", "", "", ""] -atm_stashvar[36146] = ["ATM TRACER 146 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36147] = ["ATM TRACER 147 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36148] = ["ATM TRACER 148 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36149] = ["ATM TRACER 149 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36150] = ["ATM TRACER 150 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[36257] = ["ATM TRACER 1 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36258] = ["ATM TRACER 2 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36259] = ["ATM TRACER 3 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36260] = ["ATM TRACER 4 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36261] = ["ATM TRACER 5 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36262] = ["ATM TRACER 6 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36263] = ["ATM TRACER 7 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36264] = ["ATM TRACER 8 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36265] = ["ATM TRACER 9 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36266] = ["ATM TRACER 10 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36267] = ["ATM TRACER 11 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36268] = ["ATM TRACER 12 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36269] = ["ATM TRACER 13 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36270] = ["ATM TRACER 14 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36271] = ["ATM TRACER 15 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36272] = ["ATM TRACER 16 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36273] = ["ATM TRACER 17 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36274] = ["ATM TRACER 18 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36275] = ["ATM TRACER 19 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36276] = ["ATM TRACER 20 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36277] = ["ATM TRACER 21 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36278] = ["ATM TRACER 22 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36279] = ["ATM TRACER 23 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36280] = ["ATM TRACER 24 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36281] = ["ATM TRACER 25 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36282] = ["ATM TRACER 26 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36283] = ["ATM TRACER 27 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36284] = ["ATM TRACER 28 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36285] = ["ATM TRACER 29 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36286] = ["ATM TRACER 30 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36287] = ["ATM TRACER 31 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36288] = ["ATM TRACER 32 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36289] = ["ATM TRACER 33 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36290] = ["ATM TRACER 34 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36291] = ["ATM TRACER 35 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36292] = ["ATM TRACER 36 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36293] = ["ATM TRACER 37 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36294] = ["ATM TRACER 38 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36295] = ["ATM TRACER 39 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36296] = ["ATM TRACER 40 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36297] = ["ATM TRACER 41 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36298] = ["ATM TRACER 42 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36299] = ["ATM TRACER 43 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36300] = ["ATM TRACER 44 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36301] = ["ATM TRACER 45 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36302] = ["ATM TRACER 46 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36303] = ["ATM TRACER 47 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36304] = ["ATM TRACER 48 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36305] = ["ATM TRACER 49 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36306] = ["ATM TRACER 50 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36307] = ["ATM TRACER 51 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36308] = ["ATM TRACER 52 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36309] = ["ATM TRACER 53 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36310] = ["ATM TRACER 54 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36311] = ["ATM TRACER 55 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36312] = ["ATM TRACER 56 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36313] = ["ATM TRACER 57 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36314] = ["ATM TRACER 58 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36315] = ["ATM TRACER 59 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36316] = ["ATM TRACER 60 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36317] = ["ATM TRACER 61 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36318] = ["ATM TRACER 62 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36319] = ["ATM TRACER 63 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36320] = ["ATM TRACER 64 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36321] = ["ATM TRACER 65 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36322] = ["ATM TRACER 66 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36323] = ["ATM TRACER 67 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36324] = ["ATM TRACER 68 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36325] = ["ATM TRACER 69 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36326] = ["ATM TRACER 70 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36327] = ["ATM TRACER 71 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36328] = ["ATM TRACER 72 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36329] = ["ATM TRACER 73 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36330] = ["ATM TRACER 74 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36331] = ["ATM TRACER 75 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36332] = ["ATM TRACER 76 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36333] = ["ATM TRACER 77 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36334] = ["ATM TRACER 78 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36335] = ["ATM TRACER 79 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36336] = ["ATM TRACER 80 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36337] = ["ATM TRACER 81 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36338] = ["ATM TRACER 82 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36339] = ["ATM TRACER 83 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36340] = ["ATM TRACER 84 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36341] = ["ATM TRACER 85 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36342] = ["ATM TRACER 86 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36343] = ["ATM TRACER 87 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36344] = ["ATM TRACER 88 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36345] = ["ATM TRACER 89 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36346] = ["ATM TRACER 90 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36347] = ["ATM TRACER 91 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36348] = ["ATM TRACER 92 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36349] = ["ATM TRACER 93 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36350] = ["ATM TRACER 94 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36351] = ["ATM TRACER 95 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36352] = ["ATM TRACER 96 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36353] = ["ATM TRACER 97 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36354] = ["ATM TRACER 98 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36355] = ["ATM TRACER 99 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36356] = ["ATM TRACER 100 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36357] = ["ATM TRACER 101 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36358] = ["ATM TRACER 102 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36359] = ["ATM TRACER 103 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36360] = ["ATM TRACER 104 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36361] = ["ATM TRACER 105 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36362] = ["ATM TRACER 106 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36363] = ["ATM TRACER 107 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36364] = ["ATM TRACER 108 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36365] = ["ATM TRACER 109 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36366] = ["ATM TRACER 110 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36367] = ["ATM TRACER 111 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36368] = ["ATM TRACER 112 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36369] = ["ATM TRACER 113 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36370] = ["ATM TRACER 114 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36371] = ["ATM TRACER 115 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36372] = ["ATM TRACER 116 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36373] = ["ATM TRACER 117 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36374] = ["ATM TRACER 118 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36375] = ["ATM TRACER 119 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36376] = ["ATM TRACER 120 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36377] = ["ATM TRACER 121 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36378] = ["ATM TRACER 122 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36379] = ["ATM TRACER 123 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36380] = ["ATM TRACER 124 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36381] = ["ATM TRACER 125 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36382] = ["ATM TRACER 126 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36383] = ["ATM TRACER 127 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36384] = ["ATM TRACER 128 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36385] = ["ATM TRACER 129 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36386] = ["ATM TRACER 130 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36387] = ["ATM TRACER 131 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36388] = ["ATM TRACER 132 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36389] = ["ATM TRACER 133 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36390] = ["ATM TRACER 134 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36391] = ["ATM TRACER 135 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36392] = ["ATM TRACER 136 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36393] = ["ATM TRACER 137 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36394] = ["ATM TRACER 138 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36395] = ["ATM TRACER 139 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36396] = ["ATM TRACER 140 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36397] = ["ATM TRACER 141 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36398] = ["ATM TRACER 142 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36399] = ["ATM TRACER 143 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36400] = ["ATM TRACER 144 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36401] = ["ATM TRACER 145 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36402] = ["ATM TRACER 146 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36403] = ["ATM TRACER 147 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36404] = ["ATM TRACER 148 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36405] = ["ATM TRACER 149 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[36406] = ["ATM TRACER 150 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37001] = ["UKCA TRACER 1 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37002] = ["UKCA TRACER 2 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37003] = ["UKCA TRACER 3 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37004] = ["UKCA TRACER 4 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37005] = ["UKCA TRACER 5 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37006] = ["UKCA TRACER 6 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37007] = ["UKCA TRACER 7 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37008] = ["UKCA TRACER 8 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37009] = ["UKCA TRACER 9 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37010] = ["UKCA TRACER 10 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37011] = ["UKCA TRACER 11 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37012] = ["UKCA TRACER 12 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37013] = ["UKCA TRACER 13 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37014] = ["UKCA TRACER 14 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37015] = ["UKCA TRACER 15 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37016] = ["UKCA TRACER 16 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37017] = ["UKCA TRACER 17 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37018] = ["UKCA TRACER 18 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37019] = ["UKCA TRACER 19 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37020] = ["UKCA TRACER 20 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37021] = ["UKCA TRACER 21 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37022] = ["UKCA TRACER 22 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37023] = ["UKCA TRACER 23 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37024] = ["UKCA TRACER 24 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37025] = ["UKCA TRACER 25 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37026] = ["UKCA TRACER 26 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37027] = ["UKCA TRACER 27 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37028] = ["UKCA TRACER 28 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37029] = ["UKCA TRACER 29 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37030] = ["UKCA TRACER 30 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37031] = ["UKCA TRACER 31 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37032] = ["UKCA TRACER 32 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37033] = ["UKCA TRACER 33 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37034] = ["UKCA TRACER 34 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37035] = ["UKCA TRACER 35 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37036] = ["UKCA TRACER 36 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37037] = ["UKCA TRACER 37 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37038] = ["UKCA TRACER 38 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37039] = ["UKCA TRACER 39 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37040] = ["UKCA TRACER 40 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37041] = ["UKCA TRACER 41 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37042] = ["UKCA TRACER 42 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37043] = ["UKCA TRACER 43 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37044] = ["UKCA TRACER 44 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37045] = ["UKCA TRACER 45 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37046] = ["UKCA TRACER 46 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37047] = ["UKCA TRACER 47 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37048] = ["UKCA TRACER 48 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37049] = ["UKCA TRACER 49 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37050] = ["UKCA TRACER 50 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37051] = ["UKCA TRACER 51 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37052] = ["UKCA TRACER 52 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37053] = ["UKCA TRACER 53 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37054] = ["UKCA TRACER 54 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37055] = ["UKCA TRACER 55 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37056] = ["UKCA TRACER 56 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37057] = ["UKCA TRACER 57 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37058] = ["UKCA TRACER 58 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37059] = ["UKCA TRACER 59 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37060] = ["UKCA TRACER 60 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37061] = ["UKCA TRACER 61 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37062] = ["UKCA TRACER 62 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37063] = ["UKCA TRACER 63 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37064] = ["UKCA TRACER 64 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37065] = ["UKCA TRACER 65 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37066] = ["UKCA TRACER 66 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37067] = ["UKCA TRACER 67 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37068] = ["UKCA TRACER 68 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37069] = ["UKCA TRACER 69 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37070] = ["UKCA TRACER 70 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37071] = ["UKCA TRACER 71 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37072] = ["UKCA TRACER 72 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37073] = ["UKCA TRACER 73 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37074] = ["UKCA TRACER 74 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37075] = ["UKCA TRACER 75 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37076] = ["UKCA TRACER 76 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37077] = ["UKCA TRACER 77 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37078] = ["UKCA TRACER 78 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37079] = ["UKCA TRACER 79 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37080] = ["UKCA TRACER 80 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37081] = ["UKCA TRACER 81 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37082] = ["UKCA TRACER 82 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37083] = ["UKCA TRACER 83 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37084] = ["UKCA TRACER 84 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37085] = ["UKCA TRACER 85 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37086] = ["UKCA TRACER 86 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37087] = ["UKCA TRACER 87 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37088] = ["UKCA TRACER 88 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37089] = ["UKCA TRACER 89 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37090] = ["UKCA TRACER 90 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37091] = ["UKCA TRACER 91 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37092] = ["UKCA TRACER 92 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37093] = ["UKCA TRACER 93 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37094] = ["UKCA TRACER 94 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37095] = ["UKCA TRACER 95 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37096] = ["UKCA TRACER 96 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37097] = ["UKCA TRACER 97 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37098] = ["UKCA TRACER 98 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37099] = ["UKCA TRACER 99 LATERAL BOUNDARY VAL.", "", "", "", ""] -atm_stashvar[37100] = ["UKCA TRACER 100 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37101] = ["UKCA TRACER 101 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37102] = ["UKCA TRACER 102 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37103] = ["UKCA TRACER 103 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37104] = ["UKCA TRACER 104 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37105] = ["UKCA TRACER 105 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37106] = ["UKCA TRACER 106 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37107] = ["UKCA TRACER 107 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37108] = ["UKCA TRACER 108 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37109] = ["UKCA TRACER 109 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37110] = ["UKCA TRACER 110 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37111] = ["UKCA TRACER 111 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37112] = ["UKCA TRACER 112 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37113] = ["UKCA TRACER 113 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37114] = ["UKCA TRACER 114 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37115] = ["UKCA TRACER 115 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37116] = ["UKCA TRACER 116 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37117] = ["UKCA TRACER 117 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37118] = ["UKCA TRACER 118 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37119] = ["UKCA TRACER 119 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37120] = ["UKCA TRACER 120 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37121] = ["UKCA TRACER 121 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37122] = ["UKCA TRACER 122 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37123] = ["UKCA TRACER 123 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37124] = ["UKCA TRACER 124 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37125] = ["UKCA TRACER 125 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37126] = ["UKCA TRACER 126 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37127] = ["UKCA TRACER 127 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37128] = ["UKCA TRACER 128 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37129] = ["UKCA TRACER 129 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37130] = ["UKCA TRACER 130 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37131] = ["UKCA TRACER 131 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37132] = ["UKCA TRACER 132 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37133] = ["UKCA TRACER 133 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37134] = ["UKCA TRACER 134 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37135] = ["UKCA TRACER 135 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37136] = ["UKCA TRACER 136 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37137] = ["UKCA TRACER 137 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37138] = ["UKCA TRACER 138 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37139] = ["UKCA TRACER 139 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37140] = ["UKCA TRACER 140 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37141] = ["UKCA TRACER 141 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37142] = ["UKCA TRACER 142 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37143] = ["UKCA TRACER 143 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37144] = ["UKCA TRACER 144 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37145] = ["UKCA TRACER 145 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37146] = ["UKCA TRACER 146 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37147] = ["UKCA TRACER 147 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37148] = ["UKCA TRACER 148 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37149] = ["UKCA TRACER 149 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37150] = ["UKCA TRACER 150 LATERAL BOUNDARY VAL", "", "", "", ""] -atm_stashvar[37257] = ["UKCA TRACER 1 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37258] = ["UKCA TRACER 2 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37259] = ["UKCA TRACER 3 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37260] = ["UKCA TRACER 4 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37261] = ["UKCA TRACER 5 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37262] = ["UKCA TRACER 6 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37263] = ["UKCA TRACER 7 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37264] = ["UKCA TRACER 8 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37265] = ["UKCA TRACER 9 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37266] = ["UKCA TRACER 10 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37267] = ["UKCA TRACER 11 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37268] = ["UKCA TRACER 12 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37269] = ["UKCA TRACER 13 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37270] = ["UKCA TRACER 14 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37271] = ["UKCA TRACER 15 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37272] = ["UKCA TRACER 16 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37273] = ["UKCA TRACER 17 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37274] = ["UKCA TRACER 18 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37275] = ["UKCA TRACER 19 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37276] = ["UKCA TRACER 20 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37277] = ["UKCA TRACER 21 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37278] = ["UKCA TRACER 22 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37279] = ["UKCA TRACER 23 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37280] = ["UKCA TRACER 24 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37281] = ["UKCA TRACER 25 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37282] = ["UKCA TRACER 26 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37283] = ["UKCA TRACER 27 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37284] = ["UKCA TRACER 28 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37285] = ["UKCA TRACER 29 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37286] = ["UKCA TRACER 30 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37287] = ["UKCA TRACER 31 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37288] = ["UKCA TRACER 32 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37289] = ["UKCA TRACER 33 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37290] = ["UKCA TRACER 34 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37291] = ["UKCA TRACER 35 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37292] = ["UKCA TRACER 36 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37293] = ["UKCA TRACER 37 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37294] = ["UKCA TRACER 38 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37295] = ["UKCA TRACER 39 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37296] = ["UKCA TRACER 40 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37297] = ["UKCA TRACER 41 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37298] = ["UKCA TRACER 42 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37299] = ["UKCA TRACER 43 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37300] = ["UKCA TRACER 44 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37301] = ["UKCA TRACER 45 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37302] = ["UKCA TRACER 46 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37303] = ["UKCA TRACER 47 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37304] = ["UKCA TRACER 48 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37305] = ["UKCA TRACER 49 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37306] = ["UKCA TRACER 50 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37307] = ["UKCA TRACER 51 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37308] = ["UKCA TRACER 52 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37309] = ["UKCA TRACER 53 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37310] = ["UKCA TRACER 54 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37311] = ["UKCA TRACER 55 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37312] = ["UKCA TRACER 56 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37313] = ["UKCA TRACER 57 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37314] = ["UKCA TRACER 58 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37315] = ["UKCA TRACER 59 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37316] = ["UKCA TRACER 60 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37317] = ["UKCA TRACER 61 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37318] = ["UKCA TRACER 62 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37319] = ["UKCA TRACER 63 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37320] = ["UKCA TRACER 64 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37321] = ["UKCA TRACER 65 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37322] = ["UKCA TRACER 66 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37323] = ["UKCA TRACER 67 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37324] = ["UKCA TRACER 68 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37325] = ["UKCA TRACER 69 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37326] = ["UKCA TRACER 70 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37327] = ["UKCA TRACER 71 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37328] = ["UKCA TRACER 72 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37329] = ["UKCA TRACER 73 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37330] = ["UKCA TRACER 74 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37331] = ["UKCA TRACER 75 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37332] = ["UKCA TRACER 76 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37333] = ["UKCA TRACER 77 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37334] = ["UKCA TRACER 78 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37335] = ["UKCA TRACER 79 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37336] = ["UKCA TRACER 80 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37337] = ["UKCA TRACER 81 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37338] = ["UKCA TRACER 82 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37339] = ["UKCA TRACER 83 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37340] = ["UKCA TRACER 84 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37341] = ["UKCA TRACER 85 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37342] = ["UKCA TRACER 86 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37343] = ["UKCA TRACER 87 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37344] = ["UKCA TRACER 88 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37345] = ["UKCA TRACER 89 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37346] = ["UKCA TRACER 90 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37347] = ["UKCA TRACER 91 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37348] = ["UKCA TRACER 92 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37349] = ["UKCA TRACER 93 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37350] = ["UKCA TRACER 94 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37351] = ["UKCA TRACER 95 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37352] = ["UKCA TRACER 96 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37353] = ["UKCA TRACER 97 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37354] = ["UKCA TRACER 98 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37355] = ["UKCA TRACER 99 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37356] = ["UKCA TRACER 100 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37357] = ["UKCA TRACER 101 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37358] = ["UKCA TRACER 102 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37359] = ["UKCA TRACER 103 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37360] = ["UKCA TRACER 104 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37361] = ["UKCA TRACER 105 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37362] = ["UKCA TRACER 106 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37363] = ["UKCA TRACER 107 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37364] = ["UKCA TRACER 108 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37365] = ["UKCA TRACER 109 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37366] = ["UKCA TRACER 110 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37367] = ["UKCA TRACER 111 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37368] = ["UKCA TRACER 112 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37369] = ["UKCA TRACER 113 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37370] = ["UKCA TRACER 114 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37371] = ["UKCA TRACER 115 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37372] = ["UKCA TRACER 116 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37373] = ["UKCA TRACER 117 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37374] = ["UKCA TRACER 118 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37375] = ["UKCA TRACER 119 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37376] = ["UKCA TRACER 120 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37377] = ["UKCA TRACER 121 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37378] = ["UKCA TRACER 122 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37379] = ["UKCA TRACER 123 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37380] = ["UKCA TRACER 124 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37381] = ["UKCA TRACER 125 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37382] = ["UKCA TRACER 126 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37383] = ["UKCA TRACER 127 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37384] = ["UKCA TRACER 128 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37385] = ["UKCA TRACER 129 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37386] = ["UKCA TRACER 130 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37387] = ["UKCA TRACER 131 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37388] = ["UKCA TRACER 132 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37389] = ["UKCA TRACER 133 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37390] = ["UKCA TRACER 134 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37391] = ["UKCA TRACER 135 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37392] = ["UKCA TRACER 136 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37393] = ["UKCA TRACER 137 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37394] = ["UKCA TRACER 138 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37395] = ["UKCA TRACER 139 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37396] = ["UKCA TRACER 140 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37397] = ["UKCA TRACER 141 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37398] = ["UKCA TRACER 142 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37399] = ["UKCA TRACER 143 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37400] = ["UKCA TRACER 144 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37401] = ["UKCA TRACER 145 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37402] = ["UKCA TRACER 146 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37403] = ["UKCA TRACER 147 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37404] = ["UKCA TRACER 148 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37405] = ["UKCA TRACER 149 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[37406] = ["UKCA TRACER 150 BOUNDARY TENDENCY", "", "", "", ""] -atm_stashvar[38201] = ["PRIMARY H2SO4 TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38202] = ["PRIMARY H2SO4 TO ACCUMULATION (SOL)", "", "", "", ""] -atm_stashvar[38203] = ["PRIMARY H2SO4 TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38204] = ["PRIMARY SEA-SALT TO ACCUMULTN (SOL)", "", "", "", ""] -atm_stashvar[38205] = ["PRIMARY SEA-SALT TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38206] = ["PRIMARY BLACK CARBON TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38207] = ["PRIMARY BLACK CARBON TO AITKEN (INS)", "", "", "", ""] -atm_stashvar[38208] = ["PRIMARY OM TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38209] = ["PRIMARY OM TO AITKEN (INS)", "", "", "", ""] -atm_stashvar[38210] = ["PRIMARY DUST TO ACCUMULATION (SOL)", "", "", "", ""] -atm_stashvar[38211] = ["PRIMARY DUST TO ACCUMULATION (INS)", "", "", "", ""] -atm_stashvar[38212] = ["PRIMARY DUST TO COARSE (SOLUBLE)", "", "", "", ""] -atm_stashvar[38213] = ["PRIMARY DUST TO COARSE (INSOLUBLE)", "", "", "", ""] -atm_stashvar[38214] = ["DRY DEPOSITION H2SO4 NUCLN. (SOL)", "", "", "", ""] -atm_stashvar[38215] = ["DRY DEPOSITION H2SO4 AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38216] = ["DRY DEPOSITION H2SO4 ACCUMULTN (SOL)", "", "", "", ""] -atm_stashvar[38217] = ["DRY DEPOSITION H2SO4 COARSE (SOL)", "", "", "", ""] -atm_stashvar[38218] = ["DRY DEPOSITION SEA-SALT ACC (SOL)", "", "", "", ""] -atm_stashvar[38219] = ["DRY DEPOSITION SEA-SALT COARSE (SOL)", "", "", "", ""] -atm_stashvar[38220] = ["DRY DEPOSITION BLK CARB AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38221] = ["DRY DEPOSITION BLK CARB ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38222] = ["DRY DEPOSITION BLK CARB COARSE (SOL)", "", "", "", ""] -atm_stashvar[38223] = ["DRY DEPOSITION BLK CARB AITKEN (INS)", "", "", "", ""] -atm_stashvar[38224] = ["DRY DEPOSITION OM NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38225] = ["DRY DEPOSITION OM AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38226] = ["DRY DEPOSITION OM ACCUMULATION (SOL)", "", "", "", ""] -atm_stashvar[38227] = ["DRY DEPOSITION OM COARSE (SOL)", "", "", "", ""] -atm_stashvar[38228] = ["DRY DEPOSITION OM AITKEN (INS)", "", "", "", ""] -atm_stashvar[38229] = ["DRY DEPOSITION OM2 NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38230] = ["DRY DEPOSITION OM2 AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38231] = ["DRY DEPOSITION OM2 ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38232] = ["DRY DEPOSITION OM2 COARSE (SOL)", "", "", "", ""] -atm_stashvar[38233] = ["DRY DEPOSITION DUST ACCUMULATN (SOL)", "", "", "", ""] -atm_stashvar[38234] = ["DRY DEPOSITION DUST COARSE (SOL)", "", "", "", ""] -atm_stashvar[38235] = ["DRY DEPOSITION DUST ACCUMULATN (INS)", "", "", "", ""] -atm_stashvar[38236] = ["DRY DEPOSITION DUST COARSE (INS)", "", "", "", ""] -atm_stashvar[38237] = ["NUC SCAVENGING H2SO4 NUCLN. (SOL)", "", "", "", ""] -atm_stashvar[38238] = ["NUC SCAVENGING H2SO4 AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38239] = ["NUC SCAVENGING H2SO4 ACCUMULTN (SOL)", "", "", "", ""] -atm_stashvar[38240] = ["NUC SCAVENGING H2SO4 COARSE (SOL)", "", "", "", ""] -atm_stashvar[38241] = ["NUC SCAVENGING SEA-SALT ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38242] = ["NUC SCAVENGING SEA-SALT COARSE (SOL)", "", "", "", ""] -atm_stashvar[38243] = ["NUC SCAVENGING BLK CARB AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38244] = ["NUC SCAVENGING BLK CARB ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38245] = ["NUC SCAVENGING BLK CARB COARSE (SOL)", "", "", "", ""] -atm_stashvar[38246] = ["NUC SCAVENGING BLK CARB AITKEN (INS)", "", "", "", ""] -atm_stashvar[38247] = ["NUC SCAVENGING OM NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38248] = ["NUC SCAVENGING OM AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38249] = ["NUC SCAVENGING OM ACCUMULATION (SOL)", "", "", "", ""] -atm_stashvar[38250] = ["NUC SCAVENGING OM COARSE (SOL)", "", "", "", ""] -atm_stashvar[38251] = ["NUC SCAVENGING OM AITKEN (INS)", "", "", "", ""] -atm_stashvar[38252] = ["NUC SCAVENGING OM2 NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38253] = ["NUC SCAVENGING OM2 AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38254] = ["NUC SCAVENGING OM2 ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38255] = ["NUC SCAVENGING OM2 COARSE (SOL)", "", "", "", ""] -atm_stashvar[38257] = ["NUC SCAVENGING DUST ACCUMULTN. (SOL)", "", "", "", ""] -atm_stashvar[38258] = ["NUC SCAVENGING DUST COARSE (SOL)", "", "", "", ""] -atm_stashvar[38259] = ["NUC SCAVENGING DUST ACCUMULTN. (INS)", "", "", "", ""] -atm_stashvar[38260] = ["NUC SCAVENGING DUST COARSE (INS)", "", "", "", ""] -atm_stashvar[38261] = ["IMP SCAVENGING H2SO4 NUCLN. (SOL)", "", "", "", ""] -atm_stashvar[38262] = ["IMP SCAVENGING H2SO4 AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38263] = ["IMP SCAVENGING H2SO4 ACCUMULTN (SOL)", "", "", "", ""] -atm_stashvar[38264] = ["IMP SCAVENGING H2SO4 COARSE (SOL)", "", "", "", ""] -atm_stashvar[38265] = ["IMP SCAVENGING SEA-SALT ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38266] = ["IMP SCAVENGING SEA-SALT COARSE (SOL)", "", "", "", ""] -atm_stashvar[38267] = ["IMP SCAVENGING BLK CARB AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38268] = ["IMP SCAVENGING BLK CARB ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38269] = ["IMP SCAVENGING BLK CARB COARSE (SOL)", "", "", "", ""] -atm_stashvar[38270] = ["IMP SCAVENGING BLK CARB AITKEN (INS)", "", "", "", ""] -atm_stashvar[38271] = ["IMP SCAVENGING OM NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38272] = ["IMP SCAVENGING OM AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38273] = ["IMP SCAVENGING OM ACCUMULATION (SOL)", "", "", "", ""] -atm_stashvar[38274] = ["IMP SCAVENGING OM COARSE (SOL)", "", "", "", ""] -atm_stashvar[38275] = ["IMP SCAVENGING OM AITKEN (INS)", "", "", "", ""] -atm_stashvar[38276] = ["IMP SCAVENGING OM2 NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38277] = ["IMP SCAVENGING OM2 AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38278] = ["IMP SCAVENGING OM2 ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38279] = ["IMP SCAVENGING OM2 COARSE (SOL)", "", "", "", ""] -atm_stashvar[38280] = ["IMP SCAVENGING DUST ACCUMULTN. (SOL)", "", "", "", ""] -atm_stashvar[38281] = ["IMP SCAVENGING DUST COARSE (SOL)", "", "", "", ""] -atm_stashvar[38282] = ["IMP SCAVENGING DUST ACCUMULTN. (INS)", "", "", "", ""] -atm_stashvar[38283] = ["IMP SCAVENGING DUST COARSE (INS)", "", "", "", ""] -atm_stashvar[38284] = ["INCLOUD H2SO4 (H2O2) TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38285] = ["INCLOUD H2SO4 (H2O2) TO ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38286] = ["INCLOUD H2SO4 (H2O2) TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38287] = ["INCLOUD H2SO4 (O3) TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38288] = ["INCLOUD H2SO4 (O3) TO ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38289] = ["INCLOUD H2SO4 (O3) TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38290] = ["CLOUDPROC H2SO4 AITSOL --> ACCSOL", "", "", "", ""] -atm_stashvar[38291] = ["CLOUDPROC BC AITSOL --> ACCSOL", "", "", "", ""] -atm_stashvar[38292] = ["CLOUDPROC OM AITSOL --> ACCSOL", "", "", "", ""] -atm_stashvar[38293] = ["CLOUDPROC OM2 AITSOL --> ACCSOL", "", "", "", ""] -atm_stashvar[38294] = ["CONDENSATION H2SO4 TO NUCLN. (SOL)", "", "", "", ""] -atm_stashvar[38295] = ["CONDENSATION H2SO4 TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38296] = ["CONDENSATION H2SO4 TO ACCUM. (SOL)", "", "", "", ""] -atm_stashvar[38297] = ["CONDENSATION H2SO4 TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38298] = ["CONDENSATION H2SO4 TO AITKEN (INSOL)", "", "", "", ""] -atm_stashvar[38299] = ["CONDENSATION H2SO4 TO ACCUM. (INSOL)", "", "", "", ""] -atm_stashvar[38300] = ["CONDENSATION H2SO4 TO COARSE (INSOL)", "", "", "", ""] -atm_stashvar[38301] = ["CONDENSATION OM1 TO NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38302] = ["CONDENSATION OM1 TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38303] = ["CONDENSATION OM1 TO ACCUMULTN (SOL)", "", "", "", ""] -atm_stashvar[38304] = ["CONDENSATION OM1 TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38305] = ["CONDENSATION OM1 TO AITKEN (INSOL)", "", "", "", ""] -atm_stashvar[38306] = ["CONDENSATION OM1 TO ACCUM. (INSOL)", "", "", "", ""] -atm_stashvar[38307] = ["CONDENSATION OM1 TO COARSE (INSOL)", "", "", "", ""] -atm_stashvar[38308] = ["CONDENSATION OM2 TO NUCLEATION (SOL)", "", "", "", ""] -atm_stashvar[38309] = ["CONDENSATION OM2 TO AITKEN (SOL)", "", "", "", ""] -atm_stashvar[38310] = ["CONDENSATION OM2 TO ACCUMULTN (SOL)", "", "", "", ""] -atm_stashvar[38311] = ["CONDENSATION OM2 TO COARSE (SOL)", "", "", "", ""] -atm_stashvar[38312] = ["CONDENSATION OM2 TO AITKEN (INSOL)", "", "", "", ""] -atm_stashvar[38313] = ["CONDENSATION OM2 TO ACCUM. (INSOL)", "", "", "", ""] -atm_stashvar[38314] = ["CONDENSATION OM2 TO COARSE (INSOL)", "", "", "", ""] -atm_stashvar[38315] = ["HETOX ON DUST {SO2 -> SO4} (ACC-SOL)", "", "", "", ""] -atm_stashvar[38316] = ["HETOX ON DUST {SO2 -> SO4} (COR-SOL)", "", "", "", ""] -atm_stashvar[38317] = ["HETOX ON DUST {SO2 -> SO4} (ACC-INS)", "", "", "", ""] -atm_stashvar[38318] = ["HETOX ON DUST {SO2 -> SO4} (COR-INS)", "", "", "", ""] -atm_stashvar[38319] = ["NUCLEATION OF H2SO4 (TO NUC-SOL)", "", "", "", ""] -atm_stashvar[38320] = ["COAG H2SO4 NUCLTN-SOL TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38321] = ["COAG H2SO4 NUCLTN-SOL TO ACCUM.-SOL", "", "", "", ""] -atm_stashvar[38322] = ["COAG H2SO4 NUCLTN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38323] = ["COAG H2SO4 NUCLTN-SOL TO AITKEN-INS", "", "", "", ""] -atm_stashvar[38324] = ["COAG H2SO4 NUCLTN-SOL TO ACCUM.-INS", "", "", "", ""] -atm_stashvar[38325] = ["COAG H2SO4 NUCLTN-SOL TO COARSE-INS", "", "", "", ""] -atm_stashvar[38326] = ["COAG OM1 NUCLTN-SOL TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38327] = ["COAG OM1 NUCLTN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38328] = ["COAG OM1 NUCLTN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38329] = ["COAG OM1 NUCLTN-SOL TO AITKEN-INSOL", "", "", "", ""] -atm_stashvar[38330] = ["COAG OM1 NUCLTN-SOL TO ACCUM.-INSOL", "", "", "", ""] -atm_stashvar[38331] = ["COAG OM1 NUCLTN-SOL TO COARSE-INSOL", "", "", "", ""] -atm_stashvar[38332] = ["COAG OM2 NUCLTN-SOL TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38333] = ["COAG OM2 NUCLTN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38334] = ["COAG OM2 NUCLTN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38335] = ["COAG OM2 NUCLTN-SOL TO AITKEN-INSOL", "", "", "", ""] -atm_stashvar[38336] = ["COAG OM2 NUCLTN-SOL TO ACCUM.-INSOL", "", "", "", ""] -atm_stashvar[38337] = ["COAG OM2 NUCLTN-SOL TO COARSE-INSOL", "", "", "", ""] -atm_stashvar[38338] = ["COAG H2SO4 AITKEN-SOL TO ACCUM.-SOL", "", "", "", ""] -atm_stashvar[38339] = ["COAG H2SO4 AITKEN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38342] = ["COAG BC AITKEN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38343] = ["COAG BC AITKEN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38346] = ["COAG OM1 AITKEN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38347] = ["COAG OM1 AITKEN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38350] = ["COAG OM2 AITKEN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38351] = ["COAG OM2 AITKEN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38354] = ["COAG H2SO4 ACCUM.-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38356] = ["COAG BC ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38358] = ["COAG OM1 ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38360] = ["COAG SEA-SALT ACC-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38362] = ["COAG OM2 ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38364] = ["COAG DU ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38366] = ["COAG BC AITKEN-INS TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38367] = ["COAG OM1 AITKEN-INS TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38368] = ["COAG BC AITKEN-INS TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38369] = ["COAG OM1 AITKEN-INS TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38370] = ["COAG DU ACCUM.-INS TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38371] = ["AGEING H2SO4 AITKEN-INS TO AIT.-SOL", "", "", "", ""] -atm_stashvar[38372] = ["AGEING BC AITKEN-INS TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38373] = ["AGEING OM1 AITKEN-INS TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38374] = ["AGEING OM2 AITKEN-INS TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38375] = ["MERGE H2SO4 NUCLTN-SOL TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38376] = ["MERGE OM1 NUCLTN-SOL TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38377] = ["MERGE OM2 NUCLTN-SOL TO AITKEN-SOL", "", "", "", ""] -atm_stashvar[38378] = ["MERGE H2SO4 AITKEN-SOL TO ACCUM.-SOL", "", "", "", ""] -atm_stashvar[38379] = ["MERGE BC AITKEN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38380] = ["MERGE OM1 AITKEN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38381] = ["MERGE OM2 AITKEN-SOL TO ACCUMULN-SOL", "", "", "", ""] -atm_stashvar[38382] = ["MERGE H2SO4 ACCUM.-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38383] = ["MERGE SEA_SALT ACC-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38384] = ["MERGE BC ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38385] = ["MERGE OM1 ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38386] = ["MERGE DU ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38387] = ["MERGE OM2 ACCUMULN-SOL TO COARSE-SOL", "", "", "", ""] -atm_stashvar[38401] = ["DRY PARTICLE DIAMETER NUCLEATION-SOL", "", "", "", ""] -atm_stashvar[38402] = ["DRY PARTICLE DIAMETER AITKEN-SOL", "", "", "", ""] -atm_stashvar[38403] = ["DRY PARTICLE DIAMETER ACCUMULATN-SOL", "", "", "", ""] -atm_stashvar[38404] = ["DRY PARTICLE DIAMETER COARSE-SOL", "", "", "", ""] -atm_stashvar[38405] = ["DRY PARTICLE DIAMETER AITKEN-INS", "", "", "", ""] -atm_stashvar[38406] = ["DRY PARTICLE DIAMETER ACCUMULATN-INS", "", "", "", ""] -atm_stashvar[38407] = ["DRY PARTICLE DIAMETER COARSE-INS", "", "", "", ""] -atm_stashvar[38408] = ["WET PARTICLE DIAMETER NUCLEATION-SOL", "", "", "", ""] -atm_stashvar[38409] = ["WET PARTICLE DIAMETER AITKEN-SOL", "", "", "", ""] -atm_stashvar[38410] = ["WET PARTICLE DIAMETER ACCUMULATN-SOL", "", "", "", ""] -atm_stashvar[38411] = ["WET PARTICLE DIAMETER COARSE-SOL", "", "", "", ""] -atm_stashvar[38412] = ["WATER CONTENT FOR NUCLEATION-SOLUBLE", "", "", "", ""] -atm_stashvar[38413] = ["WATER CONTENT FOR AITKEN -SOLUBLE", "", "", "", ""] -atm_stashvar[38414] = ["WATER CONTENT FOR ACCUMULTN.-SOLUBLE", "", "", "", ""] -atm_stashvar[38415] = ["WATER CONTENT FOR COARSE -SOLUBLE", "", "", "", ""] -atm_stashvar[38416] = ["SURFACE AREA CONC NUCLN.-SOL (WET)", "", "", "", ""] -atm_stashvar[38417] = ["SURFACE AREA CONC AITKEN-SOL (WET)", "", "", "", ""] -atm_stashvar[38418] = ["SURFACE AREA CONC ACCUM.-SOL (WET)", "", "", "", ""] -atm_stashvar[38419] = ["SURFACE AREA CONC COARSE-SOL (WET)", "", "", "", ""] -atm_stashvar[38420] = ["SURFACE AREA CONC AITKEN-INS", "", "", "", ""] -atm_stashvar[38421] = ["SURFACE AREA CONC ACCUM.-INS", "", "", "", ""] -atm_stashvar[38422] = ["SURFACE AREA CONC COARSE-INS", "", "", "", ""] -atm_stashvar[38423] = ["VOLUME CONCENTRN. NUCLN.-SOL (WET)", "", "", "", ""] -atm_stashvar[38424] = ["VOLUME CONCENTRN. AITKEN-SOL (WET)", "", "", "", ""] -atm_stashvar[38425] = ["VOLUME CONCENTRN. ACCUM.-SOL (WET)", "", "", "", ""] -atm_stashvar[38426] = ["VOLUME CONCENTRN. COARSE-SOL (WET)", "", "", "", ""] -atm_stashvar[38427] = ["VOLUME CONCENTRN. AITKEN-INS", "", "", "", ""] -atm_stashvar[38428] = ["VOLUME CONCENTRN. ACCUM.-INS", "", "", "", ""] -atm_stashvar[38429] = ["VOLUME CONCENTRN. COARSE-INS", "", "", "", ""] -atm_stashvar[38430] = ["PTCL MASS DENSITY NUCLN.-SOL (WET)", "", "", "", ""] -atm_stashvar[38431] = ["PTCL MASS DENSITY AITKEN-SOL (WET)", "", "", "", ""] -atm_stashvar[38432] = ["PTCL MASS DENSITY ACCUM.-SOL (WET)", "", "", "", ""] -atm_stashvar[38433] = ["PTCL MASS DENSITY COARSE-SOL (WET)", "", "", "", ""] -atm_stashvar[38434] = ["PTCL MASS DENSITY AITKEN-INS", "", "", "", ""] -atm_stashvar[38435] = ["PTCL MASS DENSITY ACCUM.-INS", "", "", "", ""] -atm_stashvar[38436] = ["PTCL MASS DENSITY COARSE-INS", "", "", "", ""] -atm_stashvar[38437] = ["CN NUMBER CONCENTRATION", "", "", "", ""] -atm_stashvar[38438] = ["CCN NO. CONCENTRN. (ACC+COR)", "", "", "", ""] -atm_stashvar[38439] = ["CCN NO. CONCENTRN. (ACC+COR+AIT>25r)", "", "", "", ""] -atm_stashvar[38440] = ["CCN NO. CONCENTRN. (ACC+COR+AIT>35r)", "", "", "", ""] -atm_stashvar[38441] = ["CD NUMBER CONCENTRATION", "", "", "", ""] -atm_stashvar[38442] = ["H2SO4 PARTIAL VOLUME CONC (NUC-SOL)", "", "", "", ""] -atm_stashvar[38443] = ["OM1 PARTIAL VOLUME CONC (NUC-SOL)", "", "", "", ""] -atm_stashvar[38444] = ["OM2 PARTIAL VOLUME CONC (NUC-SOL)", "", "", "", ""] -atm_stashvar[38445] = ["H2O PARTIAL VOLUME CONC (NUC-SOL)", "", "", "", ""] -atm_stashvar[38446] = ["H2SO4 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[38447] = ["BC PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[38448] = ["OM1 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[38449] = ["OM2 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[38450] = ["H2O PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[38451] = ["H2SO4 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38452] = ["BC PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38453] = ["OM1 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38454] = ["SS PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38455] = ["DU PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38456] = ["OM2 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38457] = ["H2O PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38458] = ["H2SO4 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38459] = ["BC PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38460] = ["OM1 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38461] = ["SSALT PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38462] = ["DU PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38463] = ["OM2 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38464] = ["H2O PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38465] = ["BC PARTIAL VOLUME CONC (AIT-INS)", "", "", "", ""] -atm_stashvar[38466] = ["OM1 PARTIAL VOLUME CONC (AIT-INS)", "", "", "", ""] -atm_stashvar[38467] = ["DU PARTIAL VOLUME CONC (ACC-INS)", "", "", "", ""] -atm_stashvar[38468] = ["DU PARTIAL VOLUME CONC (COR-INS)", "", "", "", ""] -atm_stashvar[38469] = ["ACTIVE CLOUD DROP NO CONC (NUC-SOL)", "", "", "", ""] -atm_stashvar[38470] = ["ACTIVE CLOUD DROP NO CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[38471] = ["ACTIVE CLOUD DROP NO CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[38472] = ["ACTIVE CLOUD DROP NO CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[38473] = ["Maximum Supersaturation (percent)", "", "", "", ""] -atm_stashvar[38474] = ["Cloud base for aerosol activation", "", "", "", ""] -atm_stashvar[38475] = ["Sigmaw Updraught Velocity", "", "", "", ""] -atm_stashvar[38476] = ["CLOUD LIQUID FRACTION", "", "", "", ""] -atm_stashvar[38477] = ["TOTAL CDNC * CLOUD LIQ FRACTION", "", "", "", ""] -atm_stashvar[38478] = ["CLOUD FLAG", "", "", "", ""] -atm_stashvar[38479] = ["TOTAL CDNC * CLOUD FLAG (m^-3)", "", "", "", ""] -atm_stashvar[38480] = ["Max SuperSaturation*CLD FLAG (perc)", "", "", "", ""] -atm_stashvar[38481] = ["Charac updraft * CLD FLAG (m s^-1)", "", "", "", ""] -atm_stashvar[38482] = ["Sigmaw * CLOUD FLAG (m s^-1)", "", "", "", ""] -atm_stashvar[38483] = ["BL TKE * CLOUD FLAG (m^2 s^-2)", "", "", "", ""] -atm_stashvar[38484] = ["CCN at fixed Supersaturation (m^-3)", "", "", "", ""] -atm_stashvar[38485] = ["H2SO4 Nucleation-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38486] = ["H2SO4 Aitken-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38487] = ["H2SO4 accumulation-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38488] = ["H2SO4 coarse-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38489] = ["BC Aitken-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38490] = ["BC accumulation-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38491] = ["BC coarse-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38492] = ["BC Aitken-insol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38493] = ["OM Nucleation-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38494] = ["OM Aitken-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38495] = ["OM accumulation-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38496] = ["OM coarse-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38497] = ["OM Aitken-insol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38498] = ["Sea-salt accumln-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38499] = ["Sea-salt coarse-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38500] = ["Dust accumln-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38501] = ["Dust coarse-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38502] = ["Dust accumln-insol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38503] = ["Dust coarse-insol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38504] = ["Number Nucleation-sol mode (m^-3)", "", "kg m-3", "", ""] -atm_stashvar[38505] = ["Number Aitken-sol mode (m^-3)", "", "kg m-3", "", ""] -atm_stashvar[38506] = ["Number accumulation-sol mode (m^-3)", "", "kg m-3", "", ""] -atm_stashvar[38507] = ["Number coarse-sol mode (m^-3)", "", "kg m-3", "", ""] -atm_stashvar[38508] = ["Number Aitken-insol mode (m^-3)", "", "kg m-3", "", ""] -atm_stashvar[38509] = ["Number accumln-insol mode (m^-3)", "", "kg m-3", "", ""] -atm_stashvar[38510] = ["Number coarse-insol mode (m^-3)", "", "kg m-3", "", ""] -atm_stashvar[38511] = ["H2O Nucleation-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38512] = ["H2O Aitken-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38513] = ["H2O accumulation-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38514] = ["H2O coarse-sol mode (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38515] = ["Total aerosol water content (kgm^-3)", "", "kg m-3", "", ""] -atm_stashvar[38516] = ["H2SO4 load Nucleation-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38517] = ["H2SO4 load Aitken-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38518] = ["H2SO4 load accumulation-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38519] = ["H2SO4 load coarse-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38520] = ["Total aerosol H2SO4 load (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38521] = ["BC load Aitken-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38522] = ["BC load accumulation-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38523] = ["BC load coarse-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38524] = ["BC load Aitken-insol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38525] = ["Total aerosol BC load (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38526] = ["OM load Nucleation-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38527] = ["OM load Aitken-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38528] = ["OM load accumulation-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38529] = ["OM load coarse-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38530] = ["OM load Aitken-insol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38531] = ["Total aerosol OM load (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38532] = ["Dust load accumulation-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38533] = ["Dust load coarse-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38534] = ["Dust load accumultn-insol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38535] = ["Dust load coarse-insol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38536] = ["Total aerosol Dust load (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38537] = ["Sea-salt load accumltn-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38538] = ["Sea-salt load coarse-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38539] = ["Total aerosol Sea-salt load (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38540] = ["H2O load nucleation-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38541] = ["H2O load Aitken-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38542] = ["H2O load accumulation-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38543] = ["H2O load coarse-sol (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38544] = ["Total aerosol H2O load (kgm^-2)", "", "kg m-2", "", ""] -atm_stashvar[38545] = ["H2O mass mixing ratio (kg/kg)", "", "kg kg-1", "", ""] -atm_stashvar[38546] = ["MASS REMOVED BY MDT FIX NUCL-SOL", "", "", "", ""] -atm_stashvar[38547] = ["MASS REMOVED BY MDT FIX AITKEN-SOL", "", "", "", ""] -atm_stashvar[38548] = ["MASS REMOVED BY MDT FIX ACCUM-SOL", "", "", "", ""] -atm_stashvar[38549] = ["MASS REMOVED BY MDT FIX COARSE-SOL", "", "", "", ""] -atm_stashvar[38550] = ["MASS REMOVED BY MDT FIX AITKEN-INS", "", "", "", ""] -atm_stashvar[38551] = ["MASS REMOVED BY MDT FIX ACCUM-INS", "", "", "", ""] -atm_stashvar[38552] = ["MASS REMOVED BY MDT FIX COARSE-INS", "", "", "", ""] -atm_stashvar[38553] = ["FREQUENCY MDT FIX (%) NUCL-SOL", "", "", "", ""] -atm_stashvar[38554] = ["FREQUENCY MDT FIX (%) AITKEN-SOL", "", "", "", ""] -atm_stashvar[38555] = ["FREQUENCY MDT FIX (%) ACCUM-SOL", "", "", "", ""] -atm_stashvar[38556] = ["FREQUENCY MDT FIX (%) COARSE-SOL", "", "", "", ""] -atm_stashvar[38557] = ["FREQUENCY MDT FIX (%) AITKEN-INS", "", "", "", ""] -atm_stashvar[38558] = ["FREQUENCY MDT FIX (%) ACCUM-INS", "", "", "", ""] -atm_stashvar[38559] = ["FREQUENCY MDT FIX (%) COARSE-INS", "", "", "", ""] -atm_stashvar[38560] = ["PM10 concentration, wet (ug m-3)", "", "", "", ""] -atm_stashvar[38561] = ["PM2.5 concentration, wet (ug m-3)", "", "", "", ""] -atm_stashvar[38562] = ["PM10 concentration, dry (ug m-3)", "", "", "", ""] -atm_stashvar[38563] = ["PM2.5 concentration, dry (ug m-3)", "", "", "", ""] -atm_stashvar[38564] = ["H2SO4 contribution to PM10 (ug m-3)", "", "", "", ""] -atm_stashvar[38565] = ["H2SO4 contribution to PM2.5 (ug m-3)", "", "", "", ""] -atm_stashvar[38566] = ["BC contribution to PM10 (ug m-3)", "", "", "", ""] -atm_stashvar[38567] = ["BC contribution to PM2.5 (ug m-3)", "", "", "", ""] -atm_stashvar[38568] = ["OM contribution to PM10 (ug m-3)", "", "", "", ""] -atm_stashvar[38569] = ["OM contribution to PM2.5 (ug m-3)", "", "", "", ""] -atm_stashvar[38570] = ["Sea-salt contrib. to PM10 (ug m-3)", "", "", "", ""] -atm_stashvar[38571] = ["Sea-salt contrib. to PM2.5 (ug m-3)", "", "", "", ""] -atm_stashvar[38572] = ["Dust contribution to PM10 (ug m-3)", "", "", "", ""] -atm_stashvar[38573] = ["Dust contribution to PM2.5 (ug m-3)", "", "", "", ""] -atm_stashvar[38900] = ["Plume scvnging Nuc-sol H2SO4 (mol/s)", "", "", "", ""] -atm_stashvar[38901] = ["Plume scavenging Nuc-sol OM (mol/s)", "", "", "", ""] -atm_stashvar[38902] = ["Plume scavenging Nuc-sol OM2 (mol/s)", "", "", "", ""] -atm_stashvar[38903] = ["Plume scavenging Nuc-sol NO3 (mol/s)", "", "", "", ""] -atm_stashvar[38904] = ["Plume scavenging Nuc-sol NH4 (mol/s)", "", "", "", ""] -atm_stashvar[38905] = ["Plume scvnging Ait-sol H2SO4 (mol/s)", "", "", "", ""] -atm_stashvar[38906] = ["Plume scavenging Ait-sol BC (mol/s)", "", "", "", ""] -atm_stashvar[38907] = ["Plume scavenging Ait-sol OM (mol/s)", "", "", "", ""] -atm_stashvar[38908] = ["Plume scavenging Ait-sol OM2 (mol/s)", "", "", "", ""] -atm_stashvar[38909] = ["Plume scavenging Ait-sol NO3 (mol/s)", "", "", "", ""] -atm_stashvar[38910] = ["Plume scavenging Ait-sol NH4 (mol/s)", "", "", "", ""] -atm_stashvar[38911] = ["Plume scvnging acc-sol H2SO4 (mol/s)", "", "", "", ""] -atm_stashvar[38912] = ["Plume scavenging acc-sol BC (mol/s)", "", "", "", ""] -atm_stashvar[38913] = ["Plume scavenging acc-sol OM (mol/s)", "", "", "", ""] -atm_stashvar[38914] = ["Plume scavenging acc-sol Cl (mol/s)", "", "", "", ""] -atm_stashvar[38915] = ["Plume scavenging acc-sol Na (mol/s)", "", "", "", ""] -atm_stashvar[38916] = ["Plume scavenging acc-sol Dust(mol/s)", "", "", "", ""] -atm_stashvar[38917] = ["Plume scavenging acc-sol OM2 (mol/s)", "", "", "", ""] -atm_stashvar[38918] = ["Plume scavenging acc-sol NO3 (mol/s)", "", "", "", ""] -atm_stashvar[38919] = ["Plume scavenging acc-sol NH4 (mol/s)", "", "", "", ""] -atm_stashvar[38920] = ["Plume scvnging cor-sol H2SO4 (mol/s)", "", "", "", ""] -atm_stashvar[38921] = ["Plume scavenging cor-sol BC (mol/s)", "", "", "", ""] -atm_stashvar[38922] = ["Plume scavenging cor-sol OM (mol/s)", "", "", "", ""] -atm_stashvar[38923] = ["Plume scavenging cor-sol Cl (mol/s)", "", "", "", ""] -atm_stashvar[38924] = ["Plume scavenging cor-sol Na (mol/s)", "", "", "", ""] -atm_stashvar[38925] = ["Plume scavenging cor-sol Dust(mol/s)", "", "", "", ""] -atm_stashvar[38926] = ["Plume scavenging cor-sol OM2 (mol/s)", "", "", "", ""] -atm_stashvar[38927] = ["Plume scavenging cor-sol NO3 (mol/s)", "", "", "", ""] -atm_stashvar[38928] = ["Plume scavenging cor-sol NH4 (mol/s)", "", "", "", ""] -atm_stashvar[38929] = ["Plume scavenging Ait-ins BC (mol/s)", "", "", "", ""] -atm_stashvar[38930] = ["Plume scavenging Ait-ins OM (mol/s)", "", "", "", ""] -atm_stashvar[38931] = ["Plume scavenging acc-ins Dust(mol/s)", "", "", "", ""] -atm_stashvar[38932] = ["Plume scavenging cor-ins Dust(mol/s)", "", "", "", ""] -atm_stashvar[39001] = ["ANALYSIS TEMPERATURE ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[39002] = ["MODEL TEMPERATURE AFTER NUDGING", "", "", "", ""] -atm_stashvar[39003] = ["TEMPERATURE INCREMENT DUE TO NUDG", "", "", "", ""] -atm_stashvar[39004] = ["TEMPERATURE INCREMENT DUE TO OTHER", "", "", "", ""] -atm_stashvar[39005] = ["TEMPERATURE RELAXATION PARAMETER", "", "", "", ""] -atm_stashvar[39006] = ["ANALYSIS U WIND ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[39007] = ["U COMPNT OF WIND AFTER NUDGING", "", "", "", ""] -atm_stashvar[39008] = ["U WIND INCREMENT DUE TO NUDGING", "", "", "", ""] -atm_stashvar[39009] = ["U WIND INCREMENT DUE TO OTHER", "", "", "", ""] -atm_stashvar[39010] = ["U WIND RELAXATION PARAMETER", "", "", "", ""] -atm_stashvar[39011] = ["ANALYSIS V WIND ON MODEL LEVELS", "", "", "", ""] -atm_stashvar[39012] = ["V COMPNT OF WIND AFTER NUDGING", "", "", "", ""] -atm_stashvar[39013] = ["V WIND INCREMENT DUE TO NUDGING", "", "", "", ""] -atm_stashvar[39014] = ["V WIND INCREMENT DUE TO OTHER", "", "", "", ""] -atm_stashvar[39015] = ["V WIND RELAXATION PARAMETER", "", "", "", ""] -atm_stashvar[44001] = ["Karbou surface emissivity 23.8 GHz", "", "", "", ""] -atm_stashvar[44002] = ["Karbou surf emiss (stdev) 23.8 GHz", "", "", "", ""] -atm_stashvar[44003] = ["Karbou surface emissivity 31.4 GHz", "", "", "", ""] -atm_stashvar[44004] = ["Karbou surf emiss (stdev) 31.4 GHz", "", "", "", ""] -atm_stashvar[44005] = ["Karbou surface emissivity 50.0 GHz", "", "", "", ""] -atm_stashvar[44006] = ["Karbou surf emiss (stdev) 50.0 GHz", "", "", "", ""] -atm_stashvar[44007] = ["Karbou surface emissivity 89.0 GHz", "", "", "", ""] -atm_stashvar[44008] = ["Karbou surf emiss (stdev) 89.0 GHz", "", "", "", ""] -atm_stashvar[44009] = ["Karbou surface emissivity 150.0 GHz", "", "", "", ""] -atm_stashvar[44010] = ["Karbou surf emiss (stdev) 150.0 GHz", "", "", "", ""] -atm_stashvar[44011] = ["DISTANCE OFF-SHORE", "", "", "", ""] -atm_stashvar[44012] = ["MW Surface Emissivity", "", "", "", ""] -atm_stashvar[44013] = ["MW Surface Emissivity (stdev)", "", "", "", ""] -atm_stashvar[50001] = ["Ox PROD: HO2+NO", "", "", "", ""] -atm_stashvar[50002] = ["Ox PROD: MeOO+NO", "", "", "", ""] -atm_stashvar[50003] = ["Ox PROD: NO+RO2", "", "", "", ""] -atm_stashvar[50004] = ["Ox PROD: OH+INORGANIC ACID", "", "", "", ""] -atm_stashvar[50005] = ["Ox PROD: OH+ORGANIC NITRATE", "", "", "", ""] -atm_stashvar[50006] = ["Ox PROD: ORGANIC NITRATE PHOTOLYSIS", "", "", "", ""] -atm_stashvar[50007] = ["Ox PROD: OH + PAN-TYPE REACTIONS", "", "", "", ""] -atm_stashvar[50011] = ["Ox LOSS: O(1D)+H2O", "", "", "", ""] -atm_stashvar[50012] = ["Ox LOSS: MINOR LOSS REACTIONS", "", "", "", ""] -atm_stashvar[50013] = ["Ox LOSS: HO2+O3", "", "", "", ""] -atm_stashvar[50014] = ["Ox LOSS: OH+O3", "", "", "", ""] -atm_stashvar[50015] = ["Ox LOSS: O3+ALKENE", "", "", "", ""] -atm_stashvar[50016] = ["Ox LOSS: N2O5+H2O", "", "", "", ""] -atm_stashvar[50017] = ["Ox LOSS: NO3 CHEMICAL LOSS", "", "", "", ""] -atm_stashvar[50021] = ["Ox BUDGET: O3 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50022] = ["Ox BUDGET: NOy DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50031] = ["Ox BUDGET: NOy WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50041] = ["RXN FLUX: OH+CH4 (CH4 LIFETIME) TROP", "", "", "", ""] -atm_stashvar[50042] = ["RXN FLUX: NO3+C5H8->ISON", "", "", "", ""] -atm_stashvar[50043] = ["RXN FLUX: NO+ISO2->ISON", "", "", "", ""] -atm_stashvar[50044] = ["RXN FLUX: H2O2 PRODUCTION", "", "", "", ""] -atm_stashvar[50045] = ["RXN FLUX: ROOH PRODUCTION", "", "", "", ""] -atm_stashvar[50046] = ["RXN FLUX: HONO2 PRODUCTION (HNO3)", "", "", "", ""] -atm_stashvar[50051] = ["STE: O3", "", "", "", ""] -atm_stashvar[50052] = ["TENDENCY: O3 (TROP ONLY)", "", "", "", ""] -atm_stashvar[50053] = ["TROPOSPHERIC O3", "", "", "", ""] -atm_stashvar[50054] = ["TENDENCY: O3 (WHOLE ATMOS)", "", "", "", ""] -atm_stashvar[50061] = ["AIR MASS DIAGNOSTIC (TROP ONLY)", "", "", "", ""] -atm_stashvar[50062] = ["TROPOSPHERIC MASK", "", "", "", ""] -atm_stashvar[50063] = ["AIR MASS DIAGNOSTIC (WHOLE ATMOS)", "", "", "", ""] -atm_stashvar[50071] = ["CO BUDGET: CO LOSS VIA OH+CO", "", "", "", ""] -atm_stashvar[50072] = ["CO BUDGET: CO PROD VIA HCHO+OH/NO3", "", "", "", ""] -atm_stashvar[50073] = ["CO BUDGET: CO PROD VIA MGLY+OH/NO3", "", "", "", ""] -atm_stashvar[50074] = ["CO BUDGET: CO MISC PROD&O3+MACR/ISOP", "", "", "", ""] -atm_stashvar[50075] = ["CO BUDGET: CO PROD VIA HCHO PHOT RAD", "", "", "", ""] -atm_stashvar[50076] = ["CO BUDGET: CO PROD VIA HCHO PHOT MOL", "", "", "", ""] -atm_stashvar[50077] = ["CO BUDGET: CO PROD VIA MGLY PHOTOL", "", "", "", ""] -atm_stashvar[50078] = ["CO BUDGET: CO PROD VIA MISC PHOTOL", "", "", "", ""] -atm_stashvar[50079] = ["CO BUDGET: CO DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50081] = ["LIGHTNING NOx EMISSIONS 3D", "", "", "", ""] -atm_stashvar[50082] = ["LIGHTNING DIAGNOSTIC: TOT FLASHES 2D", "", "", "", ""] -atm_stashvar[50083] = ["LIGHTNING DIAG: CLD TO GRND FLSH 2D", "", "", "", ""] -atm_stashvar[50084] = ["LIGHTNING DIAG: CLD TO CLD FLSH 2D", "", "", "", ""] -atm_stashvar[50085] = ["LIGHTNING DIAG: TOTAL N PRODUCED 2D", "", "", "", ""] -atm_stashvar[50091] = ["STRATOSPHERIC OH PRODUCTION", "", "", "", ""] -atm_stashvar[50092] = ["STRATOSPHERIC OH LOSS", "", "", "", ""] -atm_stashvar[50101] = ["STRAT O3 PROD: O2+PHOTON->O(3P)+O(3P", "", "", "", ""] -atm_stashvar[50102] = ["STRAT O3 PROD: O2+PHOTON->O(3P)+O(1D", "", "", "", ""] -atm_stashvar[50103] = ["STRAT O3 PROD: HO2 + NO", "", "", "", ""] -atm_stashvar[50104] = ["STRAT O3 PROD: MeOO + NO", "", "", "", ""] -atm_stashvar[50111] = ["STRAT O3 LOSS: Cl2O2 + PHOTON", "", "", "", ""] -atm_stashvar[50112] = ["STRAT O3 LOSS: BrO + ClO", "", "", "", ""] -atm_stashvar[50113] = ["STRAT O3 LOSS: HO2 + O3", "", "", "", ""] -atm_stashvar[50114] = ["STRAT O3 LOSS: ClO + HO2", "", "", "", ""] -atm_stashvar[50115] = ["STRAT O3 LOSS: BrO + HO2", "", "", "", ""] -atm_stashvar[50116] = ["STRAT O3 LOSS: O(3P) + ClO", "", "", "", ""] -atm_stashvar[50117] = ["STRAT O3 LOSS: O(3P) + NO2", "", "", "", ""] -atm_stashvar[50118] = ["STRAT O3 LOSS: O(3P) + HO2", "", "", "", ""] -atm_stashvar[50119] = ["STRAT O3 LOSS: O3 + H", "", "", "", ""] -atm_stashvar[50120] = ["STRAT O3 LOSS: O(3P) + O3", "", "", "", ""] -atm_stashvar[50121] = ["STRAT O3 LOSS: NO3 + PHOTON", "", "", "", ""] -atm_stashvar[50122] = ["STRAT O3 LOSS: O(1D) + H2O", "", "", "", ""] -atm_stashvar[50123] = ["STRAT O3 LOSS: HO2 + NO3", "", "", "", ""] -atm_stashvar[50124] = ["STRAT O3 LOSS: OH + NO3", "", "", "", ""] -atm_stashvar[50125] = ["STRAT O3 LOSS: NO3 + HCHO", "", "", "", ""] -atm_stashvar[50131] = ["STRAT MISC: O3 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50132] = ["STRAT MISC: NOy DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50133] = ["STRAT MISC: NOy WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50140] = ["DMS + OH => SO2 + MeOO + HCHO", "", "", "", ""] -atm_stashvar[50141] = ["DMS + OH => 0.6SO2 + 0.4DMSO + MeOO", "", "", "", ""] -atm_stashvar[50142] = ["DMS + NO3 => SO2 + HONO2 + MeOO", "", "", "", ""] -atm_stashvar[50143] = ["DMSO + OH => 0.6SO2 + 0.4MSA", "", "", "", ""] -atm_stashvar[50144] = ["CS2 + OH => SO2 + COS", "", "", "", ""] -atm_stashvar[50145] = ["H2S + OH => SO2", "", "", "", ""] -atm_stashvar[50146] = ["COS + OH => SO2", "", "", "", ""] -atm_stashvar[50147] = ["Monoterp + OH => Sec_org", "", "", "", ""] -atm_stashvar[50148] = ["Monoterp + O3 => Sec_org", "", "", "", ""] -atm_stashvar[50149] = ["Monoterp + NO3 => Sec_org", "", "", "", ""] -atm_stashvar[50150] = ["SO2 + OH => HO2 + H2SO4", "", "", "", ""] -atm_stashvar[50151] = ["SO2 + H2O2 => NULL0", "", "", "", ""] -atm_stashvar[50152] = ["SO2 + O3 => NULL1", "", "", "", ""] -atm_stashvar[50153] = ["SO2 + O3 => NULL2", "", "", "", ""] -atm_stashvar[50154] = ["SO2 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50155] = ["SO2 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50156] = ["NO surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50157] = ["CH4 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50158] = ["CO surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50159] = ["HCHO surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50160] = ["C2H6 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50161] = ["C3H8 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50162] = ["Me2CO surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50163] = ["MeCHO surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50164] = ["C5H8 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50165] = ["C4H10 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50166] = ["C2H4 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50167] = ["C3H6 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50168] = ["TOLUENE surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50169] = ["oXYLENE surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50170] = ["CH3OH surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50171] = ["H2 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50172] = ["NO emiss from aircraft (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50173] = ["NO2 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50174] = ["HNO3 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50175] = ["H2O2 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50176] = ["CH4 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50177] = ["MeOOH DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50178] = ["EtOOH DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50179] = ["PAN DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50180] = ["i-PrOOH DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50181] = ["O3S DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50182] = ["ISOOH DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50183] = ["MVKOOH DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50184] = ["ORGNIT DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50185] = ["H2 DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50186] = ["s-BuOOH DRY DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50187] = ["NO3 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50188] = ["N2O5 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50189] = ["HO2NO2 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50190] = ["HONO2 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50191] = ["H2O2 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50192] = ["HCHO WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50193] = ["HO2 WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50194] = ["MeOO WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50195] = ["MeOOH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50196] = ["EtOOH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50197] = ["i-PrOOH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50198] = ["ISOOH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50199] = ["ISON WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50200] = ["MGLY WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50201] = ["MVKOOH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50202] = ["ORGNIT WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50203] = ["CH3OH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50204] = ["s-BuOOH WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50205] = ["GLY WET DEPOSITION (3D)", "", "", "", ""] -atm_stashvar[50206] = ["O3 as Offline oxidant (MMR)", "", "", "", ""] -atm_stashvar[50207] = ["OH as Offline oxidant (MMR)", "", "", "", ""] -atm_stashvar[50208] = ["NO3 as Offline oxidant (MMR)", "", "", "", ""] -atm_stashvar[50209] = ["HO2 as Offline oxidant (MMR)", "", "", "", ""] -atm_stashvar[50210] = ["H2O2 as Offline oxidant (MMR)", "", "", "", ""] -atm_stashvar[50211] = ["Monoterp surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50212] = ["NVOC surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50213] = ["NH3 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50214] = ["DMS surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50215] = ["SO2 surf emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50216] = ["SO2 high lev emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50217] = ["SO2 natural emissions (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50218] = ["Nitric Acid Trihydrate (kg/kg)", "", "", "", ""] -atm_stashvar[50219] = ["Ozone column in Dobson Units", "", "", "", ""] -atm_stashvar[50220] = ["Tropospheric CH4 burden in moles", "", "", "", ""] -atm_stashvar[50221] = ["Tropospheric O3 burden in moles", "", "", "", ""] -atm_stashvar[50222] = ["Tropospheric OH burden in moles", "", "", "", ""] -atm_stashvar[50223] = ["Stratospheric CH4 burden in moles", "", "", "", ""] -atm_stashvar[50224] = ["Pressure of PV-THETA tropopause (Pa)", "", "", "", ""] -atm_stashvar[50226] = ["Stratospheric CH4 loss rate (mol/s)", "", "", "", ""] -atm_stashvar[50227] = ["Total reactive nitrogen, NOy (VMR)", "", "", "", ""] -atm_stashvar[50228] = ["Photolysis rate JO1D (s-1)", "", "", "", ""] -atm_stashvar[50229] = ["Photolysis rate JNO2 (s-1)", "", "", "", ""] -atm_stashvar[50230] = ["Non-methane VOC (ug (C) m-3)", "", "", "", ""] -atm_stashvar[50231] = ["Atmospheric Burden of CH4 in moles", "", "", "", ""] -atm_stashvar[50232] = ["Atmospheric Burden of CO in moles", "", "", "", ""] -atm_stashvar[50233] = ["Atmospheric Burden of N2O in moles", "", "", "", ""] -atm_stashvar[50234] = ["Atmospheric Burden of CFC12 in moles", "", "", "", ""] -atm_stashvar[50235] = ["Atmospheric Burden of CFC11 in moles", "", "", "", ""] -atm_stashvar[50236] = ["Atmospheric Burden of CH3Br in moles", "", "", "", ""] -atm_stashvar[50237] = ["Atmospheric Burden of H2 in moles", "", "", "", ""] -atm_stashvar[50238] = ["H2O production from chemistry", "", "", "", ""] -atm_stashvar[50239] = ["H2O loss from chemistry", "", "", "", ""] -atm_stashvar[50240] = ["Specific humidity change from UKCA", "", "", "", ""] -atm_stashvar[50245] = ["Photolysis rate JO2 (s-1)", "", "", "", ""] -atm_stashvar[50246] = ["Photolysis rate JO3P (s-1)", "", "", "", ""] -atm_stashvar[50247] = ["RXN FLUX: CH4 OXIDATION", "", "", "", ""] -atm_stashvar[50248] = ["RXN FLUX: RC(O)O2+NO2 (PAN PROD)", "", "", "", ""] -atm_stashvar[50249] = ["RXN FLUX: RO2+HO2", "", "", "", ""] -atm_stashvar[50250] = ["RXN FLUX: RO2+NO3", "", "", "", ""] -atm_stashvar[50251] = ["RXN FLUX: RO2+RO2", "", "", "", ""] -atm_stashvar[50254] = ["Gross Chemical Prod: O(1D)", "", "", "", ""] -atm_stashvar[50255] = ["UKCA Theta Grid Cell Volume (m^3)", "", "", "", ""] -atm_stashvar[50256] = ["Aerosol surface area in PSC chem", "", "", "", ""] -atm_stashvar[50300] = ["C5H8 ems-flux chk (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50301] = ["Monoterp ems-flux chk (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50302] = ["MeOH ems-flux chk (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[50303] = ["Me2CO ems-flux chk (kg m-2 s-1)", "", "", "", ""] -atm_stashvar[51001] = ["O3 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51002] = ["NO MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51003] = ["NO3 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51004] = ["NO2 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51005] = ["N2O5 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51006] = ["HO2NO2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51007] = ["HONO2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51008] = ["H2O2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51009] = ["CH4 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51010] = ["CO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51011] = ["HCHO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51012] = ["MeOOH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51013] = ["HONO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51014] = ["C2H6 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51015] = ["EtOOH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51016] = ["MeCHO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51017] = ["PAN MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51018] = ["C3H8 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51019] = ["n-PrOOH MASS MIX RATIO ON PRESS LEV", "", "", "", ""] -atm_stashvar[51020] = ["i-PrOOH MASS MIX RATIO ON PRESS LEV", "", "", "", ""] -atm_stashvar[51021] = ["EtCHO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51022] = ["Me2CO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51023] = ["MeCOCH2OOH MASS MIX RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51024] = ["PPAN MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51025] = ["MeONO2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51026] = ["O3S MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51027] = ["C5H8 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51028] = ["ISOOH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51029] = ["ISON MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51030] = ["MACR MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51031] = ["MACROOH MASS MIX RATIO ON PRESS LEV", "", "", "", ""] -atm_stashvar[51032] = ["MPAN MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51033] = ["HACET MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51034] = ["MGLY MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51035] = ["NALD MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51036] = ["HCOOH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51037] = ["MeCO3H MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51038] = ["MeCO2H MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51039] = ["MVK MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51040] = ["MVKOOH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51041] = ["Cl MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51042] = ["ClO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51043] = ["Cl2O2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51044] = ["OClO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51045] = ["Br MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51047] = ["BrCl MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51048] = ["BrONO2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51049] = ["N2O MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51051] = ["HOCl MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51052] = ["HBr MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51053] = ["HOBr MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51054] = ["ClONO2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51055] = ["CFCl3 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51056] = ["CF2Cl2 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51057] = ["MeBr MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51058] = ["N MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51059] = ["O3P MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51060] = ["ORGNIT MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51069] = ["CH3OH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51070] = ["H2 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51071] = ["DMS MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51072] = ["SO2 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51073] = ["H2SO4 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51074] = ["MSA MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51075] = ["DMSO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51076] = ["NH3 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51077] = ["CS2 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51078] = ["COS MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51079] = ["H2S MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51080] = ["H MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51081] = ["OH MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51082] = ["HO2 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51083] = ["MeOO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51084] = ["EtOO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51085] = ["MeCO3 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51086] = ["n-PrOO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51087] = ["i-PrOO MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51088] = ["EtCO3 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51089] = ["MeCOCH2OO MASS MIX RATIO ON PR LEVS", "", "", "", ""] -atm_stashvar[51090] = ["MeOH MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51091] = ["MONOTERPENE MMR ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[51092] = ["SEC_ORG MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51093] = ["C3H6 MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51094] = ["SO3 MASS MIXING RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51095] = ["C4H9OOH MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51096] = ["MEK MASS MIX RATIO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51097] = ["TOLUENE MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51098] = ["LUMPED N (as NO2) MMR ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51099] = ["LUMPED Br (as BrO) MMR ON P LEVELS", "", "", "", ""] -atm_stashvar[51100] = ["LUMPED Cl (as HCl) MMR ON P LEVELS", "", "", "", ""] -atm_stashvar[51101] = ["NUCL MODE (SOL) NUMBER ON PRESS LEV", "", "", "", ""] -atm_stashvar[51102] = ["NUCL MODE (SOL) H2SO4 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51103] = ["AITK MODE (SOL) NUMBER ON PRESS LEV", "", "", "", ""] -atm_stashvar[51104] = ["AITK MODE (SOL) H2SO4 ON PRESS LEV", "", "", "", ""] -atm_stashvar[51105] = ["AITK MODE (SOL) BC ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51106] = ["AITK MODE (SOL) OM ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51107] = ["ACCUM MODE (SOL) NBR ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51108] = ["ACCUM MODE (SOL) H2SO4 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51109] = ["ACCUM MODE (SOL) BC ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51110] = ["ACCUM MODE (SOL) OM ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51111] = ["ACCUM MODE (SOL) SEASALT ON PR LEVS", "", "", "", ""] -atm_stashvar[51112] = ["ACCUM MODE (SOL) DUST ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51113] = ["COARSE MODE (SOL) NBR ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51114] = ["COARSE MODE (SOL) H2SO4 ON PRS LEVS", "", "", "", ""] -atm_stashvar[51115] = ["COARSE MODE (SOL) BC ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51116] = ["COARSE MODE (SOL) OM ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51117] = ["COARSE MODE (SOL) SEASALT ON PR LEV", "", "", "", ""] -atm_stashvar[51118] = ["COARSE MODE (SOL) DUST ON PRES LEVS", "", "", "", ""] -atm_stashvar[51119] = ["AITK MODE (INS) NBR ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51120] = ["AITK MODE (INS) BC ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51121] = ["AITK MODE (INS) OM ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51122] = ["ACCUM MODE (INS) NBR ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51123] = ["ACCUM MODE (INS) DUST ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51124] = ["COARSE MODE (INS) NBR ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51125] = ["COARSE MODE (INS) DUST ON PRESS LEV", "", "", "", ""] -atm_stashvar[51126] = ["NUCL MODE (SOL) OM ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51127] = ["AITK MODE (SOL) SEASALT ON PRS LEVS", "", "", "", ""] -atm_stashvar[51128] = ["NUCL MODE (SOL) OM2 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51129] = ["AITK MODE (SOL) OM2 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51130] = ["ACCUM MODE (SOL) OM2 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51131] = ["COARSE MODE (SOL) OM2 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51132] = ["NUCL MODE (SOL) NH4 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51133] = ["AITK MODE (SOL) NH4 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51134] = ["ACCUM MODE (SOL) NH4 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51135] = ["COARSE MODE (SOL) NH4 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51136] = ["NUCL MODE (SOL) NO3 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51137] = ["AITK MODE (SOL) NO3 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51138] = ["ACCUM MODE (SOL) NO3 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51139] = ["COARSE MODE (SOL) NO3 ON PRESS LEVS", "", "", "", ""] -atm_stashvar[51149] = ["PASSIVE O3 MMR ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[51150] = ["AGE OF AIR (SEC) ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[51151] = ["UKCA NON-TRANS SPEC 151 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51152] = ["UKCA NON-TRANS SPEC 152 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51153] = ["UKCA NON-TRANS SPEC 153 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51154] = ["UKCA NON-TRANS SPEC 154 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51155] = ["UKCA NON-TRANS SPEC 155 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51156] = ["UKCA NON-TRANS SPEC 156 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51157] = ["UKCA NON-TRANS SPEC 157 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51158] = ["UKCA NON-TRANS SPEC 158 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51159] = ["UKCA NON-TRANS SPEC 159 IN PLEV RETD", "", "", "", ""] -atm_stashvar[51160] = ["UKCA NON-TRANS SPEC 160 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51161] = ["UKCA NON-TRANS SPEC 161 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51162] = ["UKCA NON-TRANS SPEC 162 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51163] = ["UKCA NON-TRANS SPEC 163 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51164] = ["UKCA NON-TRANS SPEC 164 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51165] = ["UKCA NON-TRANS SPEC 165 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51166] = ["UKCA NON-TRANS SPEC 166 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51167] = ["UKCA NON-TRANS SPEC 167 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51168] = ["UKCA NON-TRANS SPEC 168 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51169] = ["UKCA NON-TRANS SPEC 169 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51170] = ["UKCA NON-TRANS SPEC 170 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51171] = ["UKCA NON-TRANS SPEC 171 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51172] = ["UKCA NON-TRANS SPEC 172 ON PLEV RETD", "", "", "", ""] -atm_stashvar[51921] = ["DRY PARTICLE DIAMETER AITKEN-SOL", "", "", "", ""] -atm_stashvar[51922] = ["DRY PARTICLE DIAMETER ACCUMULATN-SOL", "", "", "", ""] -atm_stashvar[51923] = ["DRY PARTICLE DIAMETER COARSE-SOL", "", "", "", ""] -atm_stashvar[51924] = ["DRY PARTICLE DIAMETER AITKEN-INS", "", "", "", ""] -atm_stashvar[51925] = ["DRY PARTICLE DIAMETER ACCUMULATN-INS", "", "", "", ""] -atm_stashvar[51926] = ["DRY PARTICLE DIAMETER COARSE-INSOL", "", "", "", ""] -atm_stashvar[51927] = ["WET PARTICLE DIAMETER AITKEN-SOL", "", "", "", ""] -atm_stashvar[51928] = ["WET PARTICLE DIAMETER ACCUMULATN-SOL", "", "", "", ""] -atm_stashvar[51929] = ["WET PARTICLE DIAMETER COARSE-SOL", "", "", "", ""] -atm_stashvar[51930] = ["PTCL MASS DENSITY AITKEN-SOL (WET)", "", "", "", ""] -atm_stashvar[51931] = ["PTCL MASS DENSITY ACCUM.-SOL (WET)", "", "", "", ""] -atm_stashvar[51932] = ["PTCL MASS DENSITY COARSE-SOL (WET)", "", "", "", ""] -atm_stashvar[51933] = ["PTCL MASS DENSITY AITKEN-INS", "", "", "", ""] -atm_stashvar[51934] = ["PTCL MASS DENSITY ACCUM.-INS", "", "", "", ""] -atm_stashvar[51935] = ["PTCL MASS DENSITY COARSE-INS", "", "", "", ""] -atm_stashvar[51936] = ["H2SO4 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[51937] = ["BC PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[51938] = ["OM1 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[51939] = ["NO3 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[51940] = ["OM2 PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[51941] = ["H2O PARTIAL VOLUME CONC (AIT-SOL)", "", "", "", ""] -atm_stashvar[51942] = ["H2SO4 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51943] = ["BC PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51944] = ["OM1 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51945] = ["SS PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51946] = ["NO3 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51947] = ["DU PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51948] = ["OM2 PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51949] = ["CL PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51950] = ["NA PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51951] = ["H2O PARTIAL VOLUME CONC (ACC-SOL)", "", "", "", ""] -atm_stashvar[51952] = ["H2SO4 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51953] = ["BC PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51954] = ["OM1 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51955] = ["SSALT PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51956] = ["NO3 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51957] = ["DU PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51958] = ["OM2 PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51959] = ["CL PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51960] = ["NA PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51961] = ["H2O PARTIAL VOLUME CONC (COR-SOL)", "", "", "", ""] -atm_stashvar[51962] = ["BC PARTIAL VOLUME CONC (AIT-INS)", "", "", "", ""] -atm_stashvar[51963] = ["OM1 PARTIAL VOLUME CONC (AIT-INS)", "", "", "", ""] -atm_stashvar[51964] = ["DU PARTIAL VOLUME CONC (ACC-INS)", "", "", "", ""] -atm_stashvar[51965] = ["DU PARTIAL VOLUME CONC (COR-INS)", "", "", "", ""] -atm_stashvar[51966] = ["Aero surf area (cm2/cm3) ON P LEVS", "", "", "", ""] -atm_stashvar[51967] = ["CDNC. ^-1/3 (m-1) ON P LEVELS", "", "", "", ""] -atm_stashvar[51968] = ["CDNC (m-3) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[51969] = ["Stratospheric HO2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51970] = ["Stratospheric OH MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51971] = ["Stratospheric O(1D) MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51972] = ["Stratospheric O(3P) MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51973] = ["HO2 loss on aerosol (s-1) ON P LEVS", "", "", "", ""] -atm_stashvar[51974] = ["N2O5 loss on aerosol (s-1) ON P LEVS", "", "", "", ""] -atm_stashvar[51975] = ["HOC6H5CH3O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51976] = ["HOC5H8O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51977] = ["CH3COCH(O2)CH2OH MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51978] = ["CHOCH(OH)CO2CH3CHO MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51979] = ["C6H5CH2O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51980] = ["CH3CHO2CH2OH MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51981] = ["CH2O2CH2OH MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51982] = ["CH3COCH(O2)CH3 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51983] = ["CH3COCH2O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51984] = ["CH3COC2O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51985] = ["C2H5COO2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51986] = ["i-C2H7O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51987] = ["s-C4H9O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51988] = ["n-C2H7O2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51989] = ["CH3COO2 MMR ON P LEVS", "", "", "", ""] -atm_stashvar[51990] = ["C2H5O2 MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51991] = ["CH3O2 MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51992] = ["HCl MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51993] = ["HO2 MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51994] = ["BrO MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51995] = ["OH MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51996] = ["NO2 MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51997] = ["O(1D) MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51998] = ["O(3P) MASS MIXING RATIO ON P LEVS", "", "", "", ""] -atm_stashvar[51999] = ["HEAVYSIDE FUNC FOR P LEVEL DIAGS", "", "", "", ""] -atm_stashvar[52001] = ["Ox PRD:HO2+NO ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52002] = ["Ox PRD:MeOO+NO ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52003] = ["Ox PRD:NO+RO2 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52004] = ["Ox PRD:OH+INORG ACID ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52005] = ["Ox PRD:OH+ORG NITR ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52006] = ["Ox PRD:ORG NITR PHOT ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52007] = ["Ox PRD:OH+PAN REACN ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52011] = ["Ox LOSS:O(1D)+H2O ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52012] = ["Ox LOSS:MINOR REACN ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52013] = ["Ox LOSS:HO2+O3 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52014] = ["Ox LOSS:OH+O3 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52015] = ["Ox LOSS:O3+ALK ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52016] = ["Ox LOSS:N2O5+H2O ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52017] = ["Ox LOSS:NO3 CHEM LOSS ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52021] = ["Ox BDGT:O3 DRY DEP(3D) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52022] = ["Ox BDGT:NOy DRY DEP(3D) ON PRESS LEV", "", "", "", ""] -atm_stashvar[52031] = ["Ox BDGT:NOy WET DEP(3D) ON PRESS LEV", "", "", "", ""] -atm_stashvar[52041] = ["FLUX:OH+CH4 (CH4 LIFETIME) ON PR LEV", "", "", "", ""] -atm_stashvar[52042] = ["FLUX:NO3+C5H8->ISON ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52043] = ["FLUX:NO+ISO2->ISON ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52044] = ["FLUX:H2O2 PROD ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52045] = ["FLUX:ROOH PROD ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52046] = ["FLUX:HONO2 PROD (HNO3) ON PRES LEVS", "", "", "", ""] -atm_stashvar[52051] = ["STE: O3 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52052] = ["TEND:O3 (TROP ONLY) ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52053] = ["TROPOSPHERIC O3 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52054] = ["TEND:O3 (WHOLE ATMOS) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52061] = ["AIR MASS DIAG(TROP) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52062] = ["TROPOSPHERIC MASK ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52063] = ["AIR MASS DIAG(WHOLE ATM) ON PRS LEV", "", "", "", ""] -atm_stashvar[52071] = ["CO BDG:LOSS OH+CO ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52072] = ["CO BDG:PROD HCHO+OH/NO3 ON PRS LEVS", "", "", "", ""] -atm_stashvar[52073] = ["CO BDG:PROD MGLY+OH/NO3 ON PRS LEVS", "", "", "", ""] -atm_stashvar[52074] = ["CO BDG: MISC PROD ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52075] = ["CO BDG:PROD HCHO PHOT RAD ON PR LEVS", "", "", "", ""] -atm_stashvar[52076] = ["CO BDG:PROD HCHO PHOT MOL ON PR LEVS", "", "", "", ""] -atm_stashvar[52077] = ["CO BDG:PROD MGLY PHOT ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52078] = ["CO BDG:PROD MISC PHOT ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52079] = ["CO BDG:CO DRY DEP(3D) ON PRESS LEVEL", "", "", "", ""] -atm_stashvar[52081] = ["LIT NOx EMISS 3D ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52091] = ["STRAT OH PROD ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52092] = ["STRAT OH LOSS ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52101] = ["STRO3 PRD:O2+PHOT O(3P) ON PRESS LEV", "", "", "", ""] -atm_stashvar[52102] = ["STRO3 PRD:O2+PHOT O(1D) ON PRESS LEV", "", "", "", ""] -atm_stashvar[52103] = ["STRO3 PRD: HO2+NO ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52104] = ["STRO3 PRD: MeOO+NO ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52111] = ["STRO3 LOSS:Cl2O2+PHOT ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52112] = ["STRO3 LOSS:BrO+ClO ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52113] = ["STRO3 LOSS:HO2+O3 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52114] = ["STRO3 LOSS:ClO+HO2 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52115] = ["STRO3 LOSS:BrO+HO2 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52116] = ["STRO3 LOSS:O3P+ClO ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52117] = ["STRO3 LOSS:O3P+NO2 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52118] = ["STRO3 LOSS:O3P+HO2 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52119] = ["STRO3 LOSS:O3+H ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52120] = ["STRO3 LOSS:O3P+O3 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52121] = ["STRO3 LOSS:NO3+PHOT ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52122] = ["STRO3 LOSS:O1D+H2O ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52123] = ["STRO3 LOSS: HO2+NO3 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52124] = ["STRO3 LOSS: OH+NO3 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52125] = ["STRO3 LOSS: NO3+HCHO ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52131] = ["STRAT MISC:O3 DRY DP(3D) ON PRS LEV", "", "", "", ""] -atm_stashvar[52132] = ["STRAT MISC:NOy DRY DP(3D) ON PRS LEV", "", "", "", ""] -atm_stashvar[52133] = ["STRAT MISC:NOy WET DP(3D) ON PRS LEV", "", "", "", ""] -atm_stashvar[52140] = ["DMS+OH=>SO2+MeOO+HCHO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52141] = ["DMS+OH=>SO2+DMSO+MeOO ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52142] = ["DMS+NO3=>SO2+HONO2+MeOO ON PRESS LEV", "", "", "", ""] -atm_stashvar[52143] = ["DMSO+OH=>SO2+MSA ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52144] = ["CS2+OH=>SO2+COS ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52145] = ["H2S + OH => SO2 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52146] = ["COS + OH => SO2 ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52147] = ["Monoterp+OH=>Sec_org ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52148] = ["Monoterp+O3=>Sec_org ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52149] = ["Monoterp+NO3=>Sec_org ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52150] = ["SO2+OH=>HO2+H2SO4 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52151] = ["SO2 + H2O2 => NULL0 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52152] = ["SO2 + O3 => NULL1 ON PRESS LEVELS", "", "", "", ""] -atm_stashvar[52153] = ["SO2 + O3 => NULL2 ON PRESSURE LEVEL", "", "", "", ""] -atm_stashvar[52154] = ["SO2 DRY DEP (3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52155] = ["SO2 WET DEP (3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52172] = ["NO aircrft ems(kg m-2 s-1) ON PR LEV", "", "", "", ""] -atm_stashvar[52173] = ["NO2 DRY DEP (3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52174] = ["HNO3 DRY DEP (3D) ON PRESSURE LEVEL", "", "", "", ""] -atm_stashvar[52175] = ["H2O2 DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52176] = ["CH4 DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52177] = ["MeOOH DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52178] = ["EtOOH DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52179] = ["PAN DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52180] = ["i-PrOOH DRY DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52181] = ["O3S DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52182] = ["ISOOH DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52183] = ["MVKOOH DRY DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52184] = ["ORGNIT DRY DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52185] = ["H2 DRY DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52186] = ["s-BuOOH DRY DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52187] = ["NO3 WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52188] = ["N2O5 WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52189] = ["HO2NO2 WET DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52190] = ["HONO2 WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52191] = ["H2O2 WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52192] = ["HCHO WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52193] = ["HO2 WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52194] = ["MeOO WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52195] = ["MeOOH WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52196] = ["EtOOH WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52197] = ["i-PrOOH WET DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52198] = ["ISOOH WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52199] = ["ISON WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52200] = ["MGLY WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52201] = ["MVKOOH WET DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52202] = ["ORGNIT WET DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52203] = ["CH3OH WET DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52204] = ["s-BuOOH WET DEP(3D) ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52205] = ["GLY WET DEP(3D) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52206] = ["O3 Offline oxid (MMR) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52207] = ["OH Offline oxid (MMR) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52208] = ["NO3 Offline oxid (MMR) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52209] = ["HO2 Offline oxid (MMR) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52210] = ["H2O2 Offl oxid (MMR) ON PRESS LEVS", "", "", "", ""] -atm_stashvar[52218] = ["NAT mass mixing ratio on press levs", "", "", "", ""] -atm_stashvar[52219] = ["O3 Column in Dobson Units on p levs", "", "", "", ""] -atm_stashvar[52227] = ["NOy (VMR) ON PRESSURE LEVELS", "", "", "", ""] -atm_stashvar[52228] = ["Photolysis rate JO1D on press levs", "", "", "", ""] -atm_stashvar[52229] = ["Photolysis rate JNO2 on press levs", "", "", "", ""] -atm_stashvar[52230] = ["Non-methane VOC (ug C m-3) on p levs", "", "", "", ""] -atm_stashvar[52245] = ["Photolysis rate JO2 on press levs", "", "", "", ""] -atm_stashvar[52246] = ["Photolysis rate JO3P on press levs", "", "", "", ""] -atm_stashvar[52247] = ["RXN FLUX: CH4 OXIDATION ON PLEVS", "", "", "", ""] -atm_stashvar[52248] = ["RXN: RC(O)O2+NO2 (PAN PROD) ON PLEV", "", "", "", ""] -atm_stashvar[52249] = ["RXN FLUX: RO2+HO2 ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52250] = ["RXN FLUX: RO2+NO3 ON PRESSURE LEVS", "", "", "", ""] -atm_stashvar[52251] = ["RXN FLUX: RO2+RO2 ON PRESSSURE LEVS", "", "", "", ""] -atm_stashvar[52254] = ["Gross Chem Prod : O(1D) On PLEVS", "", "", "", ""] -atm_stashvar[52256] = ["Aerosol surf area in PSC chem plevs", "", "", "", ""] -atm_stashvar[53181] = ["Temperature Inc: Idealised (K/step)", "", "", "", ""] -atm_stashvar[53182] = ["water vapour Inc: Ideal (kg/kg/step)", "", "", "", ""] -atm_stashvar[53185] = ["U wind Inc: Idealised (m/s/step)", "", "", "", ""] -atm_stashvar[53186] = ["V wind Inc: Idealised (m/s/step)", "", "", "", ""] -atm_stashvar[53190] = ["Pot. temp. Inc: Idealised (K/step)", "", "", "", ""] -atm_stashvar[53201] = ["Column vapour added: Ideal (kg/m2/s)", "", "", "", ""] -atm_stashvar[53202] = ["Potential temperature ref. prof (K)", "", "", "", ""] -atm_stashvar[53203] = ["Water vapour reference profile kg/kg", "", "", "", ""] -atm_stashvar[53204] = ["U wind reference profile (m/s)", "", "", "", ""] -atm_stashvar[53205] = ["V wind reference profile (m/s)", "", "", "", ""] -atm_stashvar[53206] = ["Col energy change due to dT (J/m2)", "", "", "", ""] -atm_stashvar[53207] = ["Col energy change due to dU (J/m2)", "", "", "", ""] -atm_stashvar[53208] = ["Col energy change due to dV (J/m2)", "", "", "", ""] -atm_stashvar[54101] = ["NUCLEATION MODE (SOL) NUMBER CLIM", "", "", "", ""] -atm_stashvar[54102] = ["NUCLEATION MODE (SOL) H2SO4 MMR CLIM", "", "", "", ""] -atm_stashvar[54103] = ["AITKEN MODE (SOL) NUMBER CLIM", "", "", "", ""] -atm_stashvar[54104] = ["AITKEN MODE (SOL) H2SO4 MMR CLIM", "", "", "", ""] -atm_stashvar[54105] = ["AITKEN MODE (SOL) BC MMR CLIM", "", "", "", ""] -atm_stashvar[54106] = ["AITKEN MODE (SOL) OM MMR CLIM", "", "", "", ""] -atm_stashvar[54107] = ["ACCUMULATION MODE (SOL) NUMBER CLIM", "", "", "", ""] -atm_stashvar[54108] = ["ACCUMULATION MODE(SOL)H2SO4 MMR CLIM", "", "", "", ""] -atm_stashvar[54109] = ["ACCUMULATION MODE (SOL) BC MMR CLIM", "", "", "", ""] -atm_stashvar[54110] = ["ACCUMULATION MODE (SOL) OM MMR CLIM", "", "", "", ""] -atm_stashvar[54111] = ["ACC MODE (SOL) SEA SALT MMR CLIM", "", "", "", ""] -atm_stashvar[54112] = ["ACCUMULATION MODE(SOL) DUST MMR CLIM", "", "", "", ""] -atm_stashvar[54113] = ["COARSE MODE (SOLUBLE) NUMBER CLIM", "", "", "", ""] -atm_stashvar[54114] = ["COARSE MODE (SOLUBLE) H2SO4 MMR CLIM", "", "", "", ""] -atm_stashvar[54115] = ["COARSE MODE (SOLUBLE) BC MMR CLIM", "", "", "", ""] -atm_stashvar[54116] = ["COARSE MODE (SOLUBLE) OM MMR CLIM", "", "", "", ""] -atm_stashvar[54117] = ["COARSE MODE (SOL) SEA SALT MMR CLIM", "", "", "", ""] -atm_stashvar[54118] = ["COARSE MODE (SOLUBLE) DUST MMR CLIM", "", "", "", ""] -atm_stashvar[54119] = ["AITKEN MODE (INSOLUBLE) NUMBER CLIM", "", "", "", ""] -atm_stashvar[54120] = ["AITKEN MODE (INSOLUBLE) BC MMR CLIM", "", "", "", ""] -atm_stashvar[54121] = ["AITKEN MODE (INSOLUBLE) OM MMR CLIM", "", "", "", ""] -atm_stashvar[54122] = ["ACCUMULATION MODE (INSOL)NUMBER CLIM", "", "", "", ""] -atm_stashvar[54123] = ["ACCUMULATION MODE (INSOL) DUST CLIM", "", "", "", ""] -atm_stashvar[54124] = ["COARSE MODE (INSOLUBLE) NUMBER CLIM", "", "", "", ""] -atm_stashvar[54125] = ["COARSE MODE (INSOL) DUST MMR CLIM", "", "", "", ""] -atm_stashvar[54126] = ["NUCLEATION MODE (SOL) OM MMR CLIM", "", "", "", ""] -atm_stashvar[54127] = ["AITKEN MODE (SOL) SEA SALT MMR CLIM", "", "", "", ""] -atm_stashvar[54128] = ["NUCLEATION MODE (SOL) OM2 MMR CLIM", "", "", "", ""] -atm_stashvar[54129] = ["AITKEN MODE (SOL) OM2 MMR CLIM", "", "", "", ""] -atm_stashvar[54130] = ["ACCUMULATION MODE (SOL) OM2 MMR CLIM", "", "", "", ""] -atm_stashvar[54131] = ["COARSE MODE (SOLUBLE) OM2 MMR CLIM", "", "", "", ""] -atm_stashvar[54132] = ["NUCLEATION MODE (SOL) NH4 MMR CLIM", "", "", "", ""] -atm_stashvar[54133] = ["AITKEN MODE (SOLUBLE) NH4 MMR CLIM", "", "", "", ""] -atm_stashvar[54134] = ["ACCUMULATION MODE (SOL) NH4 MMR CLIM", "", "", "", ""] -atm_stashvar[54135] = ["COARSE MODE (SOLUBLE) NH4 MMR CLIM", "", "", "", ""] -atm_stashvar[54136] = ["NUCLEATION MODE (SOL) NO3 MMR CLIM", "", "", "", ""] -atm_stashvar[54137] = ["AITKEN MODE (SOLUBLE) NO3 MMR CLIM", "", "", "", ""] -atm_stashvar[54138] = ["ACCUMULATION MODE (SOL) NO3 MMR CLIM", "", "", "", ""] -atm_stashvar[54139] = ["COARSE MODE (SOLUBLE) NO3 MMR CLIM", "", "", "", ""] -atm_stashvar[54476] = ["GC CLOUD LIQUID FRACTION", "", "", "", ""] -atm_stashvar[54477] = ["GC TOTAL CDNC * CLOUD LIQ FRACTION", "", "", "", ""] -atm_stashvar[54921] = ["DRY PARTICLE DIAMETER AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54922] = ["DRY PARTICLE DIAMETER ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54923] = ["DRY PARTICLE DIAMETER COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54924] = ["DRY PARTICLE DIAMETER AIT-INS CLIM", "", "", "", ""] -atm_stashvar[54925] = ["DRY PARTICLE DIAMETER ACC-INS CLIM", "", "", "", ""] -atm_stashvar[54926] = ["DRY PARTICLE DIAMETER COR-INS CLIM", "", "", "", ""] -atm_stashvar[54927] = ["WET PARTICLE DIAMETER AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54928] = ["WET PARTICLE DIAMETER ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54929] = ["WET PARTICLE DIAMETER COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54930] = ["PTCL MASS DENSITY AIT-SOL CLIM (WET)", "", "", "", ""] -atm_stashvar[54931] = ["PTCL MASS DENSITY ACC-SOL CLIM (WET)", "", "", "", ""] -atm_stashvar[54932] = ["PTCL MASS DENSITY COR-SOL CLIM (WET)", "", "", "", ""] -atm_stashvar[54933] = ["PTCL MASS DENSITY AIT-INS CLIM", "", "", "", ""] -atm_stashvar[54934] = ["PTCL MASS DENSITY ACC-INS CLIM", "", "", "", ""] -atm_stashvar[54935] = ["PTCL MASS DENSITY COR-INS CLIM", "", "", "", ""] -atm_stashvar[54936] = ["H2SO4 PARTIAL VOL CONC AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54937] = ["BC PARTIAL VOLUME CONC AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54938] = ["OM1 PARTIAL VOLUME CONC AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54939] = ["NO3 PARTIAL VOLUME CONC AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54940] = ["OM2 PARTIAL VOLUME CONC AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54941] = ["H2O PARTIAL VOLUME CONC AIT-SOL CLIM", "", "", "", ""] -atm_stashvar[54942] = ["H2SO4 PARTIAL VOL CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54943] = ["BC PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54944] = ["OM1 PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54945] = ["SS PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54946] = ["NO3 PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54947] = ["DU PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54948] = ["OM2 PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54949] = ["CL PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54950] = ["NA PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54951] = ["H2O PARTIAL VOLUME CONC ACC-SOL CLIM", "", "", "", ""] -atm_stashvar[54952] = ["H2SO4 PARTIAL VOL CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54953] = ["BC PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54954] = ["OM1 PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54955] = ["SS PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54956] = ["NO3 PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54957] = ["DU PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54958] = ["OM2 PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54959] = ["CL PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54960] = ["NA PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54961] = ["H2O PARTIAL VOLUME CONC COR-SOL CLIM", "", "", "", ""] -atm_stashvar[54962] = ["BC PARTIAL VOLUME CONC AIT-INS CLIM", "", "", "", ""] -atm_stashvar[54963] = ["OM1 PARTIAL VOLUME CONC AIT-INS CLIM", "", "", "", ""] -atm_stashvar[54964] = ["DU PARTIAL VOLUME CONC ACC-INS CLIM", "", "", "", ""] -atm_stashvar[54965] = ["DU PARTIAL VOLUME CONC COR-INS CLIM", "", "", "", ""] -atm_stashvar[54967] = ["CLOUD DROP. No. CONC. ^-1/3 m-1 CLIM", "", "", "", ""] -atm_stashvar[54968] = ["CLOUD DROP. No. CONC. (m-3) CLIM", "", "", "", ""] - -class StashVar: - - def __init__(self, code, model=1): - # Allow this to be 0 to support some ancillary files - if model in [0, 1]: - # Should this be trapped so that we can return None? - try: - var = atm_stashvar[code] - except KeyError: - var = ["UNKNOWN VARIABLE","", "", "", ""] - else: - raise Exception("Model type %d not supported at the moment" % model) - self.long_name = var[0] - # Should there be a dictionary somewhere so this returns a unique - # set of names? unique as an optional argument? - if var[1]: - self.name = var[1] - else: - self.name = "field%d" % code - self.units = var[2] - self.standard_name = var[3] - self.code = code - if var[4]: - self.uniquename = var[4] - else: - self.uniquename = self.name diff --git a/src/umfile_utils/stashvar_validate_stdnames.py b/src/umfile_utils/stashvar_validate_stdnames.py deleted file mode 100644 index 7b544478..00000000 --- a/src/umfile_utils/stashvar_validate_stdnames.py +++ /dev/null @@ -1,21 +0,0 @@ -# Check that the standard names set in stashvar are valid according to iris -# and highlight any that aren't set - -# import stashvar -import stashvar_cmip6 as stashvar -from iris._cube_coord_common import get_valid_standard_name -from iris.fileformats.um_cf_map import STASH_TO_CF - -for v, properties in stashvar.atm_stashvar.items(): - units = properties[2] - std_name = properties[3] - if std_name and not get_valid_standard_name(std_name): - print("Invalid", v, std_name) - item = v % 1000 - section = v // 1000 - key = 'm01s%2.2di%3.3d' % (section, item) - if key in STASH_TO_CF: - if STASH_TO_CF[key].standard_name and std_name and STASH_TO_CF[key].standard_name != std_name: - print("Name mismatch", v, std_name, STASH_TO_CF[key].standard_name) - if STASH_TO_CF[key].units and units and STASH_TO_CF[key].units != units: - print("Units mismatch", v, units, STASH_TO_CF[key].units) diff --git a/src/umfile_utils/subset_ancillary.py b/src/umfile_utils/subset_ancillary.py deleted file mode 100644 index d6556664..00000000 --- a/src/umfile_utils/subset_ancillary.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python -# Subset an ancillary file - -# New region is specified by the indices of the lower left corner (x0,y0) -# and the extents nx, ny. -# These are specified as arguments -x x0,nx -y y0,ny -# Note that (x0,y0) are 0 based indices - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * - -verbose = False -try: - optlist, args = getopt.getopt(sys.argv[1:], 'i:o:x:y:v') - for opt in optlist: - if opt[0] == '-i': - ifile = opt[1] - elif opt[0] == '-o': - ofile = opt[1] - elif opt[0] == '-v': - verbose = True - elif opt[0] == '-x': - x0 = int(opt[1].split(',')[0]) - nx = int(opt[1].split(',')[1]) - elif opt[0] == '-y': - y0 = int(opt[1].split(',')[0]) - ny = int(opt[1].split(',')[1]) -except getopt.error: - print "Usage: subset_ancillary -i ifile -o ofile -x x0,nx -y y0,ny" - sys.exit(2) - -# Section to take -if verbose: - print "Section", x0, y0, nx, ny - -f = umfile.UMFile(ifile) - -g = umfile.UMFile(ofile, "w") -g.copyheader(f) - -# Change the grid values in the output header to match the chosen origin and -# size -g.inthead[IC_XLen] = nx -g.inthead[IC_YLen] = ny -lat0 = f.realhead[RC_FirstLat] + f.realhead[RC_LatSpacing]*y0 -lon0 = f.realhead[RC_FirstLong] + f.realhead[RC_LongSpacing]*x0 -g.realhead[RC_FirstLat] = lat0 -g.realhead[RC_FirstLong] = lon0 -g.realhead[RC_PoleLong] = 180. # For SH regions - perhaps should be an option? - -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - npts = ilookup[LBNPT] - nrows = ilookup[LBROW] - lat0 = f.rlookup[k,BZY] + f.rlookup[k,BDY]*y0 - lon0 = f.rlookup[k,BZX] + f.rlookup[k,BDX]*x0 - - if verbose: - print "Field", k, ilookup[ITEM_CODE] - print "GRID SIZE", ilookup[LBROW], ilookup[LBNPT] - print "GRID origin", f.rlookup[k,BZY], f.rlookup[k,BZX] - print "GRID first pt", f.rlookup[k,BZY] + f.rlookup[k,BDY], f.rlookup[k,BZX] + f.rlookup[k,BDX] - print "NEWGRID origin", lat0, lon0 - print "NEWGRID first pt", lat0 + f.rlookup[k,BDY], lon0 + f.rlookup[k,BDX] - if lbegin == -99: - break - - # Set modified output grid for this field - g.ilookup[k,LBLREC] = nx*ny - g.ilookup[k,LBROW] = ny - g.ilookup[k,LBNPT] = nx - # Set polar lon to 180 for SH grid. - g.rlookup[k,BPLON] = 180. - g.rlookup[k,BZY] = lat0 - g.rlookup[k,BZX] = lon0 - - data = f.readfld(k) - - # Select the new region - if not (y0+ny <= nrows and x0+nx <= npts): - print "ERROR" - print "Input grid size", npts, nrows - print "Requested extent %d:%d, %d:%d" % (x0, x0+nx, y0, y0+ny) - raise Exception("Requested grid is not a subset of source grid.") - - newdata = data[y0:y0+ny,x0:x0+nx] - - g.writefld(newdata,k) - -g.close() diff --git a/src/umfile_utils/subset_dump.py b/src/umfile_utils/subset_dump.py deleted file mode 100644 index bf40263a..00000000 --- a/src/umfile_utils/subset_dump.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env python - -# Subset a UM dump file - -# Intended to get a TC model initial dump file from a full region reconfigured -# initial dump. - -# New region is specified by the indices of the lower left corner (x0,y0) -# and the extents nx, ny. -# These are specified as arguments -x x0,nx -y y0,ny -# Note that (x0,y0) are 0 based indices - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * - -verbose = False -stashmaster = None -try: - optlist, args = getopt.getopt(sys.argv[1:], 'i:o:x:y:v') - for opt in optlist: - if opt[0] == '-i': - ifile = opt[1] - elif opt[0] == '-o': - ofile = opt[1] - elif opt[0] == '-v': - verbose = True - elif opt[0] == '-x': - x0 = int(opt[1].split(',')[0]) - nx = int(opt[1].split(',')[1]) - elif opt[0] == '-y': - y0 = int(opt[1].split(',')[0]) - ny = int(opt[1].split(',')[1]) -except getopt.error: - print "Usage: subset_dump -i ifile -o ofile -x x0,nx -y y0,ny" - sys.exit(2) - -# Section to take -if verbose: - print "Section", x0, y0, nx, ny - -f = umfile.UMFile(ifile) - -g = umfile.UMFile(ofile, "w") -g.copyheader(f) - -# Change the grid values in the output header to match the chosen origin and -# size -g.inthead[IC_XLen] = nx -g.inthead[IC_YLen] = ny -lat0 = f.realhead[RC_FirstLat] + f.realhead[RC_LatSpacing]*y0 -lon0 = f.realhead[RC_FirstLong] + f.realhead[RC_LongSpacing]*x0 -g.realhead[RC_FirstLat] = lat0 -g.realhead[RC_FirstLong] = lon0 -g.realhead[RC_PoleLong] = 180. # For SH regions - perhaps should be an option? - -# Need to start by setting up the mask field because it's required by the -# fields packed to land points -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - if ilookup[ITEM_CODE] == 30: - data = f.readfld(k) - g.mask = np.array(data[y0:y0+ny,x0:x0+nx]) - g.nland = np.sum(g.mask!=0) - g.inthead[IC_NumLandPoints] = g.nland -if g.mask is None: - raise Exception("Land sea mask missing in input") - -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - npts = ilookup[LBNPT] - nrows = ilookup[LBROW] - lat0 = f.rlookup[k,BZY] + f.rlookup[k,BDY]*y0 - # For zonal mean fields BDX=360 which messes up this calculation. - # Instead don't set it and pick up the value from the previous field - if not f.rlookup[k,BDX]==360: - lon0 = f.rlookup[k,BZX] + f.rlookup[k,BDX]*x0 - - if verbose: - print k, ilookup[ITEM_CODE] - print "GRID SIZE", ilookup[LBROW], ilookup[LBNPT] - print "GRID origin", f.rlookup[k,BZY], f.rlookup[k,BZX] - print "GRID first pt", f.rlookup[k,BZY] + f.rlookup[k,BDY], f.rlookup[k,BZX] + f.rlookup[k,BDX] - print "NEWGRID origin", lat0, lon0 - print "NEWGRID first pt", lat0 + f.rlookup[k,BDY], lon0 + f.rlookup[k,BDX] - if lbegin == -99: - break - - # Check whether this variable is on the V grid - # If so, f.rlookup[k,BZY] + 0.5*f.rlookup[k,BDY] = f.realhead[RC_FirstLat] - # For U and P grids - # f.rlookup[k,BZY] + f.rlookup[k,BDY] = f.realhead[RC_FirstLat] - # 0.6 factor allows for roundoff - vgrid = f.realhead[RC_FirstLat] - f.rlookup[k,BZY] < 0.6*f.rlookup[k,BDY] - if vgrid: - nyout = ny-1 - else: - nyout = ny - - # Set modified output grid for this field - # Using min(nx,npts) handles the zonal mean fields with npts=1 - g.ilookup[k,LBLREC] = min(nx,npts)*nyout - # Land packed fields have npts = nrows = 0 - g.ilookup[k,LBROW] = min(nyout,nrows) - g.ilookup[k,LBNPT] = min(nx,npts) - g.rlookup[k,BZY] = lat0 - g.rlookup[k,BZX] = lon0 - - data = f.readfld(k) - - # Skip this test for fields packed as land - packing = [0, ilookup[LBPACK]%10, ilookup[LBPACK]//10 % 10, - ilookup[LBPACK]//100 % 10, ilookup[LBPACK]//1000 % 10, - ilookup[LBPACK]//10000] - if verbose: - print "Packing", packing - - # Select the new region - # if packing[2] != 2 and not (y0+ny <= nrows and x0+nx <= npts): - # print "ERROR: record %d field: %d" % (k, ilookup[ITEM_CODE]) - # print "Input grid size", npts, nrows - # print "Requested extent %d:%d, %d:%d" % (x0, x0+nx, y0, y0+ny) - # raise Exception("Requested grid is not a subset of source grid.") - - if npts==1: # Zonal mean - newdata = data[y0:y0+nyout] - else: - newdata = data[y0:y0+nyout,x0:x0+nx] - - g.writefld(newdata,k) - -g.close() diff --git a/src/umfile_utils/um2netcdf.py b/src/umfile_utils/um2netcdf.py deleted file mode 100644 index d700f0a2..00000000 --- a/src/umfile_utils/um2netcdf.py +++ /dev/null @@ -1,232 +0,0 @@ -#!/usr/bin/env python -# Convert UM monthly PP files to netcdf and concatenate -# Also works with daily files and optionally calculates the monthly average -# For min, max temperature, also need to match on cell_methods attribute -# Assume this starts with time0: - -# Climate diagnostics on pressure levels are normally masked and need to be -# corrected using the Heavyside function. -# nomask option turns this off (special case for runs where these were -# saved differently). - -from __future__ import print_function -import cdms2, cdtime, sys, getopt, datetime, argparse, netCDF4, os -from cdms2 import MV -import numpy as np -import stashvar - -def get_cell_methods(v): - if hasattr(v,'cell_methods'): - # Skip the time0: part - # Are cell_methods ever used for any other property? - return v.cell_methods.split()[1] - else: - return "" - -def findvar(vars, section, item): - for v in vars.values(): - if hasattr(v,'stash_section') and v.stash_section[0] == section and v.stash_item[0] == item: - return v - raise KeyError - -parser = argparse.ArgumentParser(description="Convert selected variables from UM fieldsfile to netCDF.") -parser.add_argument('-i', dest='ifile', required=True, help='Input UM file') -parser.add_argument('-o', dest='ofile', required=True, help='Output netCDF file (appended to if it already exists)"') -parser.add_argument('-s', dest='stashcode', required=True, help=' section,item (Stash code for variable)') -parser.add_argument('-v', dest='vname', help='Override default variable name in output file') -parser.add_argument('-m', dest='cell_methods', help='cell_methods (required if there are multiple instances of a variable with different cell methods, e.g. ave, min and max temp)') -parser.add_argument('-a', dest='average', action='store_true', - default=False, help="Calculate time average.") -parser.add_argument('-d', dest='forcedaily', action='store_true', - default=False, help="Force daily time values (work around cdms error)") -parser.add_argument('--nomask', dest='nomask', action='store_true', - default=False, help="Don't apply Heavyside function mask to pressure level fields.") -parser.add_argument('-k', dest='nckind', required=False, type=int, - default=4, help='specify kind of netCDF format for output file: 1 classic, 2 64-bit offset, 3 netCDF-4, 4 netCDF-4 classic model. Default 4', choices=[1,2,3,4]) -parser.add_argument('--deflate', dest='deflate_level', required=False, type=int, - default=1, help='Compression level for netCDF4 output from 0 (none) to 9 (max). Default 1') -args = parser.parse_args() - -mask = not args.nomask -stash_section = int(args.stashcode.split(',')[0]) -stash_item = int(args.stashcode.split(',')[1]) - -try: - d = cdms2.open(args.ifile) -except: - print("Error opening file", args.ifile) - usage() - sys.exit(1) - -var = None -print("Matching variables") -for vn in d.variables: - v = d.variables[vn] - # Need to check whether it really has a stash_item to skip coordinate variables - - # Note: need to match both item and section number - if hasattr(v,'stash_item') and v.stash_item[0] == stash_item and v.stash_section[0] == stash_section: - print(vn, get_cell_methods(v)) - # Need to cope with variables that have no cell methods so check - # cell_methods is None - if args.cell_methods == None or (args.cell_methods != None and get_cell_methods(v) == args.cell_methods): - # print("Cell match", vn, v.cell_methods) - if var: - # Multiple match - raise Exception("Multiple variables match") - else: - var = v - -if not var: - raise Exception("Variable not found %d %d" % ( stash_item, stash_section)) - -print(var) - -grid = var.getGrid() -time = var.getTime() -timevals = np.array(time[:]) -if args.forcedaily: - # Work around cdms error in times - for k in range(len(time)): - timevals[k] = round(timevals[k],1) - -item_code = var.stash_section[0]*1000 + var.stash_item[0] -umvar = stashvar.StashVar(item_code,var.stash_model[0]) -if not args.vname: - vname = umvar.name -print(vname, var[0,0,0,0]) - -hcrit = 0.5 # Critical value of Heavyside function for inclusion. - -# If output file exists then append to it, otherwise create a new file -# Different versions of netCDF4 module give different exceptions, so -# test for existence explicitly -exists = os.path.exists(args.ofile) -if exists: - f = netCDF4.Dataset(args.ofile, 'r+') - newv = f.variables[vname] - newtime = f.variables['time'] -else: - ncformats = {1:'NETCDF3_CLASSIC', 2:'NETCDF3_64BIT', - 3:'NETCDF4', 4:'NETCDF4_CLASSIC'} - f = netCDF4.Dataset(args.ofile,'w', format=ncformats[args.nckind]) - f.history = "Created by um2netcdf.py." - - f.createDimension('lat', len(grid.getLatitude()[:])) - newlat = f.createVariable('lat',np.float32,('lat',)) - newlat.standard_name = "latitude" - newlat.axis = "Y" - newlat.units = 'degrees_north' - newlat[:]= grid.getLatitude()[:] - f.createDimension('lon', len(grid.getLongitude()[:])) - newlon = f.createVariable('lon',np.float32,('lon',)) - newlon.standard_name = "longitude" - newlon.axis = "X" - newlon.units = 'degrees_east' - newlon[:]= grid.getLongitude()[:] - - lev = var.getLevel() - if len(lev) > 1: - f.createDimension('lev', len(lev)) - newlev = f.createVariable('lev', np.float32, ('lev')) - for attr in ('standard_name', 'units', 'positive', 'axis'): - if hasattr(lev,attr): - setattr(newlev, attr, getattr(lev,attr)) - newlev[:] = lev[:] - else: - newlev = None - - f.createDimension('time', None) - newtime = f.createVariable('time', np.float64, ('time',)) - newtime.standard_name = "time" - newtime.units = time.units # "days since " + `baseyear` + "-01-01 00:00" - newtime.calendar = time.calendar - newtime.axis = "T" - - if var.dtype == np.dtype('int32'): - vtype = np.int32 - missval = -2147483647 - else: - vtype = np.float32 - # UM missing value - missval = -2.**30 - - if newlev: - newv = f.createVariable(vname, vtype, ('time', 'lev', 'lat', 'lon'), fill_value=missval, zlib=True, complevel=args.deflate_level) - else: - newv = f.createVariable(vname, vtype, ('time', 'lat', 'lon'), fill_value=missval, zlib=True, complevel=args.deflate_level) - for attr in ("standard_name", "long_name", "units"): - if hasattr(umvar, attr): - setattr(newv,attr, getattr(umvar,attr)) - if hasattr(var,'cell_methods'): - # Change the time0 to time - newv.cell_methods = 'time: ' + var.cell_methods.split()[1] - newv.stash_section = var.stash_section[0] - newv.stash_item = var.stash_item[0] - newv.missing_value = missval - - try: - newv.units = var.units - except AttributeError: - pass - -f.history += "\n%s: Processed %s" % (datetime.datetime.today().strftime('%Y-%m-%d %H:%M'), args.ifile) - -# Get appropriate file position -# Uses 360 day calendar, all with same base time so must be 30 days on. -k = len(newtime) -# float needed here to get the later logical tests to work properly -avetime = float(MV.average(timevals[:])) # Works in either case -if k>0: - if args.average: - #if newtime[-1] != (avetime - 30): - # For Gregorian calendar relax this a bit - # Sometimes get differences slightly > 31 - if not 28 <= avetime - newtime[-1] <= 31.5: - raise Exception("Times not consecutive %f %f %f" % (newtime[-1], avetime, timevals[0])) - else: - if k > 1: - # Need a better test that works when k = 1. This is just a - # temporary workaround - # For monthly data - if 27 < newtime[-1] - newtime[-2] < 32: - if not 27 < timevals[0] - newtime[-1] < 32: - raise Exception("Monthly times not consecutive %f %f " % (newtime[-1], timevals[0])) - else: - if not np.allclose( newtime[-1] + (newtime[-1]-newtime[-2]), timevals[0] ): - raise Exception("Times not consecutive %f %f " % (newtime[-1], timevals[0])) - -if ( 30201 <= item_code <= 30288 or 30302 <= item_code <= 30303 ) and mask: - # P LEV/UV GRID with missing values treated as zero. - # Needs to be corrected by Heavyside fn - try: - heavyside = findvar(d.variables,30,301) - except KeyError: - raise Exception("Heavyside variable on UV grid required for pressure level masking of %d not found" % item_code) -if ( 30293 <= item_code <= 30298 ) and mask: - # P LEV/T GRID - try: - heavyside = findvar(d.variables,30,304) - except KeyError: - raise Exception("Heavyside variable on T grid required for pressure level masking of %d not found" % item_code) - -if args.average: - newtime[k] = avetime - if var.shape[1] > 1: - newv[k] = MV.average(var[:],axis=0).astype(np.float32) - else: - newv[k] = MV.average(var[:],axis=0)[0].astype(np.float32) -else: - for i in range(len(timevals)): - newtime[k+i] = timevals[i] - if var.shape[1] > 1: - # Multi-level - if (30201 <= item_code <= 30303) and mask: - newv[k+i] = np.where( np.greater(heavyside[i], hcrit), var[i]/heavyside[i], var.getMissing()) - else: - newv[k+i] = var[i] - else: - newv[k+i] = var[i] - - -f.close() diff --git a/src/umfile_utils/um2netcdf4.py b/src/umfile_utils/um2netcdf4.py deleted file mode 100644 index f2d5e987..00000000 --- a/src/umfile_utils/um2netcdf4.py +++ /dev/null @@ -1,377 +0,0 @@ -#!/usr/bin/env python -# -# A python script to convert the CMIP5 fields (atmospheric) from -# UM fieldsfiles to netcdf format. This script works for all the -# four types of fields (monthly, daily, 6-hourly, and 3-hourly). -# For min, max fields, also need to match on cell_methods attribute -# Assume these are "time0: min" and "time0: max". -# -# The input variable names are mapped to CMIP5 variable names before -# writing to netcdf files. Also, singleton dimensions are eliminated, -# coordinate names are mapped to the commonly used names, and the time -# dimension is written as 'unlimited'. This is helpful for creating -# timeseries for one or more variables and writing them to a netcdf -# file, e.g.: -# ncrcat -h -v tas multiple_input_files.nc single_output_file.nc -# -# Climate diagnostics on pressure levels are normally masked; -# nomask option turns this off (special case for runs where the -# heavyside function, used for masking, were not saved). -# -# Written by Martin Dix, Petteri Uotila, Harun Rashid and Peter Uhe. - -from __future__ import print_function -import os, sys, argparse, datetime -import numpy as np -import cdms2, cdtime, netCDF4 -from cdms2 import MV - -parser = argparse.ArgumentParser(description="Convert UM fieldsfile to netCDF.") -parser.add_argument('-i', dest='ifile', required=True, help='Input UM file') -parser.add_argument('-o', dest='ofile', required=True, help='Output netCDF file') -parser.add_argument('-k', dest='nckind', required=False, type=int, - default=3, help='specify kind of netCDF format for output file: 1 classic, 2 64-bit offset, 3 netCDF-4, 4 netCDF-4 classic model. Default 3', choices=[1,2,3,4]) -parser.add_argument('-d', dest='deflate_level', required=False, type=int, - default=1, help='Compression level for netCDF4 output from 0 (none) to 9 (max). Default 1') -parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', - default=False, help='verbose output') -parser.add_argument('--nomask', dest='nomask', action='store_true', - default=False, help="Don't apply Heaviside function mask to pressure level fields.\n Default is to apply masking if the Heaviside field is available in the input file.") -parser.add_argument('--cmip6', dest='cmip6', action='store_true', - default=False, help="Use a CMIP6 version of the name mapping table.") -parser.add_argument('--simple', dest='simple', action='store_true', - default=False, help="Use a simple names of form fld_s01i123.") -parser.add_argument('--nd_grid', dest='nd_grid', action='store_true', - default=False, help="Data on ND grid (affects dimension naming). Default is ENDGAME") -parser.add_argument('--hcrit', dest='hcrit', type=float, - default=0.5, help="Critical value of heavyside fn for pressure level masking (default=0.5)") - -args = parser.parse_args() - -mask = not args.nomask - -if args.verbose: - print("Using python version: "+sys.version.split()[0]) - -if args.cmip6: - import stashvar_cmip6 as stashvar -else: - import stashvar - - -# Rename dimension to commonly used names -renameDims = {} -# {'latitude0':'lat','longitude0':'lon','latitude1':'lat_1',\ -# 'longitude1':'lon_1','longitude2':'lon_2','z4_p_level':'lev','z9_p_level':'lev',\ -# 'z3_p_level':'lev','time0':'time','time1':'time_1',\ -# 'z6_hybrid_sigmap':'z0_hybrid_height','z5_hybrid_sigmap':'z0_hybrid_height'} - -# cdms seems to get this from bounds, but no variables depend on it and lack of units -# causes problems -excludeDims=['nv'] - -# a function to create dimensions in the netCDF file -def write_nc_dimension(dimension,fi,fo): - dobj = fi.dimensionobject(dimension) - dval = dobj.getData() - dimout = renameDims[dimension] if dimension in renameDims else dimension - renamed = False - # make the time dimension "unlimited" - # 3 hourly files have an instantaneous and mean time dimension - if dobj.isTime(): - dimlen = None - if dimension == 'time0': - # Most files have only a single dimension - dimout = 'time' - renamed = True - else: - dimlen = len(dval) - # see if we need to rename output netcdf dimension name - if dobj.isLatitude(): - # Work out the grid - if len(dval) == 180: - dimout = 'lat_river' - elif dval[0] == -90.: - dimout = 'lat_v' - else: - dimout = 'lat' - renamed = True - if dobj.isLongitude(): - # Work out the grid - if len(dval) == 360: - dimout = 'lon_river' - elif dval[0] == 0.: - dimout = 'lon_u' - elif len(dval) == 1: - # Zonal means. Longitude value is the second last grid value - print(dval) - dimout = 'lon_zmean' - else: - dimout = 'lon' - renamed = True - if dobj.isLevel(): - if dimension.endswith('p_level'): - dimout = 'z_p_level_%d' % len(dval) - renamed = True - elif dimension.endswith('soil'): - dimout = 'z_soil_level' - renamed = True - if args.verbose: - print("Creating dimension %s as %s, dimlen: %s" % (dimension,dimout,dimlen)) - fo.createDimension(dimout,dimlen) - if hasattr(dobj,'standard_name') and dobj.standard_name == 'time': - fo.createVariable(dimout,'d',(dimout,)) - else: - fo.createVariable(dimout,dval.dtype.char,(dimout,)) - for dattr in dobj.attributes: - setattr(fo.variables[dimout],dattr,getattr(dobj,dattr)) - if dimout == 'lat': - fo.variables[dimout].long_name = 'latitudes at T grid points' - elif dimout == 'lat_v': - fo.variables[dimout].long_name = 'latitudes at V grid points' - elif dimout == 'lon': - fo.variables[dimout].long_name = 'longitudes at T grid points' - if dimout == 'lon_u': - fo.variables[dimout].long_name = 'longitudes at U grid points' - fo.variables[dimout][:] = dval - # update dimension mapping - if dimension in renameDims or renamed: - renameDims[dimension] = dimout - -def findvar(vars, section, item): - for v in vars.values(): - if hasattr(v,'stash_section') and v.stash_section[0] == section and v.stash_item[0] == item: - return v - raise KeyError - -global heavyside_uv, heavyside_t -heavyside_uv = heavyside_t = None - -def apply_mask(var,heavyside): - # Mask variable by heavyside function - fVal = var.getMissing() - vorder = var.getOrder() - horder = heavyside.getOrder() - if vorder != horder: - print(vorder,'!= heavyside',horder,file=sys.stderr) - raise Exception('Unable to apply pressure level mask because of dimension order mismatch') - # Slice to match var - if var.shape == heavyside.shape: - var = MV.where(np.greater_equal(heavyside,args.hcrit),var/heavyside,fVal) - var.fill_value = var.missing_value = fVal - return var - else: - # Do they just differ in number of levels with the variable's - # levels being a subset? - zdim = vorder.find('z') - vshape = list(var.shape) - hshape = list(heavyside.shape) - # Compare shapes without the z dimension - vshape[zdim] = hshape[zdim] = 0 - if vshape == hshape: - # Convert to list so that index works later - vlevs = var.getLevel()[:].tolist() - hlevs = heavyside.getLevel()[:].tolist() - assert zdim==0 # Assume given a t slice - # Need to make a copy first - newvar = var[:] - if set(vlevs).issubset(set(hlevs)): - # Then we can do the match - for k in range(len(vlevs)): - kh = hlevs.index(vlevs[k]) - if args.verbose: - print("Matching levels", k, kh) - newvar[k] = MV.where(np.greater_equal(heavyside[kh],args.hcrit),newvar[k]/heavyside[kh],fVal) - newvar.fill_value = newvar.missing_value = fVal - return newvar - - print("Problem applying pressure level mask for variable %d" %(item_code),file=sys.stderr) - print(var.shape,'!= heavyside',heavyside.shape) - raise Exception('Unable to apply pressure level mask because of shape mismatch') - return var - -def heavyside_mask(var,item_code, t): - global heavyside_uv, heavyside_t - # Variable range here is correct at vn11.3 - if 30201 <= item_code <= 30288 or 30302 <= item_code <= 30303: - if not heavyside_uv: - # Set heavyside variable if doesn't exist - try: - heavyside_uv = findvar(fi.variables,30,301) - except KeyError: - raise Exception("Heavyside variable on UV grid required for pressure level masking of %d not found" % item_code) - return apply_mask(var[t],heavyside_uv[t]) - elif 30293 <= item_code <= 30298: - if not heavyside_t: - # set heavyside variable if doesn't exist - try: - heavyside_t = findvar(fi.variables,30,304) - except KeyError: - raise Exception("Heavyside variable on T grid required for pressure level masking of %d not found" % item_code) - return apply_mask(var[t],heavyside_t[t]) - else: - raise Exception("Unexpected item code %d in heavyside_mask function" % item_code) - -# Main program begins here. -# First, open the input UM file (fieldsfile) - -try: - fi = cdms2.open(args.ifile,'r') -except: - print("Error opening file", args.ifile, file=sys.stderr) - sys.exit(1) - -if os.path.exists(args.ofile): - os.unlink(args.ofile) - -# Create an output netCDF file -ncformats = {1:'NETCDF3_CLASSIC', 2:'NETCDF3_64BIT', - 3:'NETCDF4', 4:'NETCDF4_CLASSIC'} -fo = netCDF4.Dataset(args.ofile,'w',format=ncformats[args.nckind]) - -history = "%s converted to netCDF by %s on %s." % (os.path.abspath(args.ifile), os.getenv('USER'),datetime.datetime.now().strftime("%Y-%m-%d")) - -# global attributes -for attribute in fi.attributes: - if attribute in ('history'): - setattr(fo,attribute,history) - elif attribute not in ('input_file_format', 'input_uri', 'input_word_length','input_byte_ordering') : - setattr(fo,attribute,getattr(fi,attribute)) - -# variables to write -varnames = fi.listvariables() - -# collect list of dimensions associated with these variables -dims = set(fi.listdimension()) # set of all dim_names in the file -for dim in dims: - dobj = fi.dimensionobject(dim) - # Exclude unnecessary singleton dimensions - # Keep time, longitude (zonal means) and single pressure levels - # Negative level value used for 850 vorticity - if dobj.shape==(1,) and not (dobj.isTime() or dobj.isLongitude()): - if not dobj.isLevel() or dobj.long_name.endswith('(dummy level coordinate)') or dobj.getData()[0] < 0.: - excludeDims.append(dim) -dimns = list(dims.difference(excludeDims)) # exclude those in excludeDims -dimns.sort() - -print("Excluded dimensions", excludeDims) - -# create dimensions -for dimension in dimns: - write_nc_dimension(dimension,fi,fo) -if args.verbose: - print("Finished writing dimensions...") - -umvar_atts = ["name","long_name","standard_name","units"] - -# Create a list of variable names sorted by stash code -snames = [] -for varname in varnames: - vval = fi.variables[varname] - if hasattr(vval,'stash_item') and hasattr(vval,'stash_section'): - stash_section = vval.stash_section[0] - stash_item = vval.stash_item[0] - item_code = vval.stash_section[0]*1000 + vval.stash_item[0] - snames.append((item_code,varname)) -snames.sort() - -varnames_out=[] -# loop over all variables -# create variables but don't write data yet -if args.verbose: - print('creating variables...') -for tmpval, varname in snames: - vval = fi.variables[varname] - vdims = vval.listdimnames() - #remove excludDims: - for vdim in vdims: - if vdim in excludeDims: - vdims.remove(vdim) - # see if we need to rename variables netcdf dimensions - for vdidx, vdim in enumerate(vdims): - if vdim in renameDims: - vdims[vdidx] = renameDims[vdim] - if hasattr(vval,'stash_item') and hasattr(vval,'stash_section'): - stash_section = vval.stash_section[0] - stash_item = vval.stash_item[0] - item_code = vval.stash_section[0]*1000 + vval.stash_item[0] - umvar = stashvar.StashVar(item_code,vval.stash_model[0]) - vname = umvar.name - if args.simple: - vname = 'fld_s%2.2di%3.3d' % (stash_section, stash_item) - - if hasattr(vval,"cell_methods") and vval.cell_methods == "time0: max": - vname = vname+"_max" - if hasattr(vval,"cell_methods") and vval.cell_methods == "time0: min": - vname = vname+"_min" - - # write data - if vval.dtype in (np.int32, np.int64): - vtype = np.int32 - else: - vtype = np.float32 - basename = vname - suffix = 1 - while vname in fo.variables: - vname = '%s_%d' %(basename, suffix) - suffix += 1 - if args.verbose and vname != basename: - print("Using name %s because of duplication" % vname) - fo.createVariable(vname, vtype, tuple(vdims), - zlib=True, complevel=args.deflate_level, - fill_value=getattr(vval,'_FillValue')) - if args.verbose: - print(vname +"\t created from "+ varname) - varnames_out.append((varname,vname)) - - # variable attributes - for vattr in vval.listattributes(): - if getattr(vval,vattr) is None: - print("Could not write attribute %s for %s." % (vattr,vname)) - else: - if vattr not in ('_FillValue', 'stash_model', 'lookup_source'): - attval = getattr(vval,vattr) - if hasattr(attval,'dtype') and attval.dtype == np.int64: - attval = attval.astype(np.int32) - setattr(fo.variables[vname],vattr,attval) - - for vattr in umvar_atts: - if hasattr(umvar,vattr) and getattr(umvar,vattr) != '': - fo.variables[vname].setncattr(vattr,getattr(umvar,vattr)) - -# Loop over all variables writing data -# Assume same number of times for all variables -# Get number of times from first variable used -varname, vname_out = varnames_out[0] -vval = fi.variables[varname] -nt = vval.shape[0] - -if args.verbose: - print('writing data') -for t in range(nt): - for varname, vname_out in varnames_out: - vval = fi.variables[varname] - stash_section = vval.stash_section[0] - stash_item = vval.stash_item[0] - item_code = vval.stash_section[0]*1000 + vval.stash_item[0] - if 30201 <= item_code <= 30303 and item_code not in [30301, 30304] and mask: - # P LEV field with missing values treated as zero needs - # to be corrected by Heavyside fn. Exclude the Heavyside - # fields themselves (301 and 304). - vval = heavyside_mask(vval,item_code,t) - fo.variables[vname_out][t] = vval.getValue() - else: - sp = vval.shape - if len(sp) == 4 and sp[1] == 1 and len(fo.variables[vname_out].shape) == 3: - # A singleton level dimension was removed, so use - # explicit index so shapes match - fo.variables[vname_out][t] = vval[t,0].getValue() - else: - fo.variables[vname_out][t] = vval[t].getValue() - if args.verbose and t==0: - print('writing', varname, 'to',vname_out) - -if args.verbose: - print('finished') - -fo.close() diff --git a/src/umfile_utils/um2netcdf4_cmip6.py b/src/umfile_utils/um2netcdf4_cmip6.py deleted file mode 100644 index 311c88f5..00000000 --- a/src/umfile_utils/um2netcdf4_cmip6.py +++ /dev/null @@ -1,367 +0,0 @@ -#!/usr/bin/env python -# -# A python script to convert the CMIP6 fields (atmospheric) from -# UM fieldsfiles to netcdf format. This script works for all the -# four types of fields (monthly, daily, 6-hourly, and 3-hourly). -# For min, max fields, also need to match on cell_methods attribute -# Assume these are "time0: min" and "time0: max". -# -# Singleton dimensions are eliminated, -# coordinate names are mapped to the commonly used names, and the time -# dimension is written as 'unlimited'. This is helpful for creating -# timeseries for one or more variables and writing them to a netcdf -# file, e.g.: -# ncrcat -h -v tas multiple_input_files.nc single_output_file.nc -# -# Climate diagnostics on pressure levels are normally masked; -# nomask option turns this off (special case for runs where the -# heavyside function, used for masking, were not saved). -# -# Written by Martin Dix, Petteri Uotila, Harun Rashid and Peter Uhe. - -from __future__ import print_function -import os, sys, datetime -import numpy as np -import cdms2, cdtime, netCDF4 -from cdms2 import MV -import stashvar_cmip6 as stashvar - -def process(ifile, ofile, args): - - mask = not args.nomask - - if args.verbose: - print("Using python version: "+sys.version.split()[0]) - - # Rename dimension to commonly used names - renameDims = {} - # {'latitude0':'lat','longitude0':'lon','latitude1':'lat_1',\ - # 'longitude1':'lon_1','longitude2':'lon_2','z4_p_level':'lev','z9_p_level':'lev',\ - # 'z3_p_level':'lev','time0':'time','time1':'time_1',\ - # 'z6_hybrid_sigmap':'z0_hybrid_height','z5_hybrid_sigmap':'z0_hybrid_height'} - - # Not really clear what this is, but no variables depend on it and lack of units - # causes problems - excludeDims=['nv'] - - # a function to create dimensions in the netCDF file - def write_nc_dimension(dimension,fi,fo): - dobj = fi.dimensionobject(dimension) - dval = dobj.getData() - dimout = renameDims[dimension] if dimension in renameDims else dimension - renamed = False - # make the time dimension "unlimited" - # 3 hourly files have an instantaneous and mean time dimension - if dobj.isTime(): - dimlen = None - if dimension == 'time0': - # Most files have only a single dimension - dimout = 'time' - renamed = True - else: - dimlen = len(dval) - # see if we need to rename output netcdf dimension name - if dobj.isLatitude(): - # Work out the grid - if len(dval) == 180: - dimout = 'lat_river' - elif dval[0] == -90.: - dimout = 'lat_v' - else: - dimout = 'lat' - renamed = True - if dobj.isLongitude(): - # Work out the grid - if len(dval) == 360: - dimout = 'lon_river' - elif dval[0] == 0.: - dimout = 'lon_u' - else: - dimout = 'lon' - renamed = True - if dobj.isLevel(): - if dimension.endswith('p_level'): - dimout = 'z_p_level_%d' % len(dval) - renamed = True - elif dimension.endswith('soil'): - dimout = 'z_soil_level' - renamed = True - fo.createDimension(dimout,dimlen) - if hasattr(dobj,'standard_name') and dobj.standard_name == 'time': - fo.createVariable(dimout,'d',(dimout,)) - else: - fo.createVariable(dimout,dval.dtype.char,(dimout,)) - for dattr in dobj.attributes: - setattr(fo.variables[dimout],dattr,getattr(dobj,dattr)) - if dimout == 'lat': - fo.variables[dimout].long_name = 'latitudes at T grid points' - elif dimout == 'lat_v': - fo.variables[dimout].long_name = 'latitudes at V grid points' - elif dimout == 'lon': - fo.variables[dimout].long_name = 'longitudes at T grid points' - if dimout == 'lon_u': - fo.variables[dimout].long_name = 'longitudes at U grid points' - fo.variables[dimout][:] = dval - # update dimension mapping - if dimension in renameDims or renamed: - renameDims[dimension] = dimout - if args.verbose: - print("Wrote dimension %s as %s, dimlen: %s" % (dimension,dimout,dimlen)) - - def findvar(vars, section, item): - for v in vars.values(): - if hasattr(v,'stash_section') and v.stash_section[0] == section and v.stash_item[0] == item: - return v - raise KeyError - - global heavyside_uv, heavyside_t - heavyside_uv = heavyside_t = None - - def apply_mask(var,heavyside): - # Mask variable by heavyside function - fVal = var.getMissing() - vorder = var.getOrder() - horder = heavyside.getOrder() - if vorder != horder: - print(vorder,'!= heavyside',horder,file=sys.stderr) - raise Exception('Unable to apply pressure level mask because of dimension order mismatch') - # Slice to match var - if var.shape == heavyside.shape: - var = MV.where(np.greater_equal(heavyside,args.hcrit),var/heavyside,fVal) - var.fill_value = var.missing_value = fVal - return var - else: - # Do they just differ in number of levels with the variable's - # levels being a subset? - zdim = vorder.find('z') - vshape = list(var.shape) - hshape = list(heavyside.shape) - # Compare shapes without the z dimension - vshape[zdim] = hshape[zdim] = 0 - if vshape == hshape: - # Convert to list so that index works later - vlevs = var.getLevel()[:].tolist() - hlevs = heavyside.getLevel()[:].tolist() - assert zdim==0 # Assume given a t slice - # Need to make a copy first - newvar = var[:] - if set(vlevs).issubset(set(hlevs)): - # Then we can do the match - for k in range(len(vlevs)): - kh = hlevs.index(vlevs[k]) - if args.verbose: - print("Matching levels", k, kh) - newvar[k] = MV.where(np.greater_equal(heavyside[kh],args.hcrit),newvar[k]/heavyside[kh],fVal) - newvar.fill_value = newvar.missing_value = fVal - return newvar - - print("Problem applying pressure level mask for variable %d" %(item_code),file=sys.stderr) - print(var.shape,'!= heavyside',heavyside.shape) - raise Exception('Unable to apply pressure level mask because of shape mismatch') - return var - - def heavyside_mask(var,item_code, t): - global heavyside_uv, heavyside_t - # Variable range here is correct at vn11.3 - if 30201 <= item_code <= 30288 or 30302 <= item_code <= 30303: - if not heavyside_uv: - # Set heavyside variable if doesn't exist - try: - heavyside_uv = findvar(fi.variables,30,301) - except KeyError: - raise Exception("Heavyside variable on UV grid required for pressure level masking of %d not found" % item_code) - return apply_mask(var[t],heavyside_uv[t]) - elif 30293 <= item_code <= 30298: - if not heavyside_t: - # set heavyside variable if doesn't exist - try: - heavyside_t = findvar(fi.variables,30,304) - except KeyError: - raise Exception("Heavyside variable on T grid required for pressure level masking of %d not found" % item_code) - return apply_mask(var[t],heavyside_t[t]) - else: - raise Exception("Unexpected item code %d in heavyside_mask function" % item_code) - - # Main program begins here. - # First, open the input UM file (fieldsfile) - - try: - fi = cdms2.open(ifile,'r') - except: - print("Error opening file", ifile, file=sys.stderr) - sys.exit(1) - - if os.path.exists(ofile): - os.unlink(ofile) - - # Create an output netCDF file - ncformats = {1:'NETCDF3_CLASSIC', 2:'NETCDF3_64BIT', - 3:'NETCDF4', 4:'NETCDF4_CLASSIC'} - fo = netCDF4.Dataset(ofile,'w',format=ncformats[args.nckind]) - - history = "%s converted to netCDF by %s on %s." % (os.path.abspath(ifile), os.getenv('USER'),datetime.datetime.now().strftime("%Y-%m-%d")) - - # global attributes - for attribute in fi.attributes: - if attribute in ('history'): - setattr(fo,attribute,history) - elif attribute not in ('input_file_format', 'input_uri', 'input_word_length','input_byte_ordering') : - setattr(fo,attribute,getattr(fi,attribute)) - - # variables to write - varnames = fi.listvariables() - - # collect list of dimensions associated with these variables - dims = set(fi.listdimension()) # set of all dim_names in the file - for dim in dims: - dobj = fi.dimensionobject(dim) - # Exclude unnecessary singleton dimensions - # Keep time, longitude (zonal means) and single pressure levels - # Negative level value used for 850 vorticity - if dobj.shape==(1,) and not (dobj.isTime() or dobj.isLongitude()): - if not dobj.isLevel() or dobj.long_name.endswith('(dummy level coordinate)') or dobj.getData()[0] < 0.: - excludeDims.append(dim) - dimns = list(dims.difference(excludeDims)) # exclude those in excludeDims - dimns.sort() - - print("Excluded dimensions", excludeDims) - - # create dimensions - for dimension in dimns: - write_nc_dimension(dimension,fi,fo) - if args.verbose: - print("Finished writing dimensions...") - - umvar_atts = ["name","long_name","standard_name","units"] - - # Create a list of variable names sorted by stash code - snames = [] - for varname in varnames: - vval = fi.variables[varname] - if hasattr(vval,'stash_item') and hasattr(vval,'stash_section'): - stash_section = vval.stash_section[0] - stash_item = vval.stash_item[0] - item_code = vval.stash_section[0]*1000 + vval.stash_item[0] - snames.append((item_code,varname)) - snames.sort() - - varnames_out=[] - # loop over all variables - # create variables but don't write data yet - if args.verbose: - print('creating variables...') - for tmpval, varname in snames: - vval = fi.variables[varname] - vdims = vval.listdimnames() - #remove excludDims: - for vdim in vdims: - if vdim in excludeDims: - vdims.remove(vdim) - # see if we need to rename variables netcdf dimensions - for vdidx, vdim in enumerate(vdims): - if vdim in renameDims: - vdims[vdidx] = renameDims[vdim] - if hasattr(vval,'stash_item') and hasattr(vval,'stash_section'): - stash_section = vval.stash_section[0] - stash_item = vval.stash_item[0] - item_code = vval.stash_section[0]*1000 + vval.stash_item[0] - umvar = stashvar.StashVar(item_code,vval.stash_model[0]) - vname = umvar.name - vname = 'fld_s%2.2di%3.3d' % (stash_section, stash_item) - - if hasattr(vval,"cell_methods") and vval.cell_methods == "time0: max": - vname = vname+"_max" - if hasattr(vval,"cell_methods") and vval.cell_methods == "time0: min": - vname = vname+"_min" - - # write data - if vval.dtype in (np.int32, np.int64): - vtype = np.int32 - else: - vtype = np.float32 - basename = vname - suffix = 1 - while vname in fo.variables: - vname = '%s_%d' %(basename, suffix) - suffix += 1 - if args.verbose and vname != basename: - print("Using name %s because of duplication" % vname) - fo.createVariable(vname, vtype, tuple(vdims), - zlib=True, complevel=args.deflate_level, - fill_value=getattr(vval,'_FillValue')) - if args.verbose: - print(vname +"\t created from "+ varname) - varnames_out.append((varname,vname)) - - # variable attributes - for vattr in vval.listattributes(): - if getattr(vval,vattr) is None: - print("Could not write attribute %s for %s." % (vattr,vname)) - else: - if vattr not in ('_FillValue', 'stash_model', 'lookup_source'): - attval = getattr(vval,vattr) - if hasattr(attval,'dtype') and attval.dtype == np.int64: - attval = attval.astype(np.int32) - setattr(fo.variables[vname],vattr,attval) - - for vattr in umvar_atts: - if hasattr(umvar,vattr) and getattr(umvar,vattr) != '': - fo.variables[vname].setncattr(vattr,getattr(umvar,vattr)) - - # Loop over all variables writing data - # Assume same number of times for all variables - # Get number of times from first variable used - varname, vname_out = varnames_out[0] - vval = fi.variables[varname] - nt = vval.shape[0] - - if args.verbose: - print('writing data') - for t in range(nt): - for varname, vname_out in varnames_out: - vval = fi.variables[varname] - stash_section = vval.stash_section[0] - stash_item = vval.stash_item[0] - item_code = vval.stash_section[0]*1000 + vval.stash_item[0] - if 30201 <= item_code <= 30303 and item_code not in [30301, 30304] and mask: - # P LEV field with missing values treated as zero needs - # to be corrected by Heavyside fn. Exclude the Heavyside - # fields themselves (301 and 304). - vval = heavyside_mask(vval,item_code,t) - fo.variables[vname_out][t] = vval.getValue() - else: - sp = vval.shape - if len(sp) == 4 and sp[1] == 1 and len(fo.variables[vname_out].shape) == 3: - # A singleton level dimension was removed, so use - # explicit index so shapes match - fo.variables[vname_out][t] = vval[t,0].getValue() - else: - fo.variables[vname_out][t] = vval[t].getValue() - if args.verbose and t==0: - print('writing', varname, 'to',vname_out) - - if args.verbose: - print('finished') - - fo.close() - -if __name__ == '__main__': - import argparse - - parser = argparse.ArgumentParser(description="Convert UM fieldsfile to netCDF.") - parser.add_argument('-i', dest='ifile', required=True, help='Input UM file') - parser.add_argument('-o', dest='ofile', required=True, help='Output netCDF file') - parser.add_argument('-k', dest='nckind', required=False, type=int, - default=3, help='specify kind of netCDF format for output file: 1 classic, 2 64-bit offset, 3 netCDF-4, 4 netCDF-4 classic model. Default 3', choices=[1,2,3,4]) - parser.add_argument('-d', dest='deflate_level', required=False, type=int, - default=1, help='Compression level for netCDF4 output from 0 (none) to 9 (max). Default 1') - parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', - default=False, help='verbose output') - parser.add_argument('--nomask', dest='nomask', action='store_true', - default=False, help="Don't apply Heaviside function mask to pressure level fields.\n Default is to apply masking if the Heaviside field is available in the input file.") - parser.add_argument('--hcrit', dest='hcrit', type=float, - default=0.5, help="Critical value of heavyside fn for pressure level masking (default=0.5)") - - args = parser.parse_args() - process(args.ifile, args.ofile, args) - diff --git a/src/umfile_utils/um2netcdf4_dev.py b/src/umfile_utils/um2netcdf4_dev.py deleted file mode 100644 index d35b2186..00000000 --- a/src/umfile_utils/um2netcdf4_dev.py +++ /dev/null @@ -1,494 +0,0 @@ -#!/usr/bin/env python -# -# A python script to convert the CMIP6 fields (atmospheric) from -# UM fieldsfiles to netcdf format. This script works for all the -# four types of fields (monthly, daily, 6-hourly, and 3-hourly). -# For min, max fields, also need to match on cell_methods attribute -# Assume these are "time0: min" and "time0: max". -# -# The input variable names are mapped to CMIP6 variable names before -# writing to netcdf files. Also, singleton dimensions are eliminated, -# coordinate names are mapped to the commonly used names, and the time -# dimension is written as 'unlimited'. This is helpful for creating -# timeseries for one or more variables and writing them to a netcdf -# file, e.g.: -# ncrcat -h -v tas multiple_input_files.nc single_output_file.nc -# -# Climate diagnostics on pressure levels are normally masked; -# nomask option turns this off (special case for runs where the -# heavyside function, used for masking, were not saved). -# -# Written by Martin Dix, Petteri Uotila, Harun Rashid and Peter Uhe. - -from __future__ import print_function -import os, sys, argparse, datetime, collections -import numpy as np -import cdms2, cdtime, netCDF4 -from cdms2 import MV -import stashutils, stashvar_cmip6 as stashvar - -parser = argparse.ArgumentParser(description="Convert UM fieldsfile to netCDF.") -parser.add_argument('-i', dest='ifile', required=True, help='Input UM file') -parser.add_argument('-o', dest='ofile', required=True, help='Output netCDF file') -parser.add_argument('-k', dest='nckind', required=False, type=int, - default=3, help='specify kind of netCDF format for output file: 1 classic, 2 64-bit offset, 3 netCDF-4, 4 netCDF-4 classic model. Default 3', choices=[1,2,3,4]) -parser.add_argument('-d', dest='deflate_level', required=False, type=int, - default=1, help='Compression level for netCDF4 output from 0 (none) to 9 (max). Default 1') -parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', - default=False, help='verbose output') -parser.add_argument('--nomask', dest='nomask', action='store_true', - default=False, help="Don't apply Heaviside function mask to pressure level fields.\n Default is to apply masking if the Heaviside field is available in the input file.") -parser.add_argument('--simple', dest='simple', action='store_true', - default=False, help="Use a simple names of form fld_s01i123.") -# Using choices=('cm2', 'esm1.5') not available in python 2.7 -parser.add_argument('--model', dest='model', required=False, - default='cm2', help="Which model is being processed (affects dimension naming). Choices are cm2 (default) and esm1.5") -parser.add_argument('-S', dest='STASHmaster', required=False, - default=None, help="Path to alternate STASHmaster file.") - -args = parser.parse_args() - -if args.model not in ('cm2', 'esm1.5'): - parser.print_help() - raise Exception("Invalid model choice %s" % args.model) - -mask = not args.nomask - -if args.verbose: - print("Using python version: "+sys.version.split()[0]) - -def transform_dimensions(fi): - # First work out which dimensions to exclude - excludeDims=['nv'] - dims = set(fi.listdimension()) # set of all dim_names in the file - for dim in dims: - dobj = fi.dimensionobject(dim) - # Exclude unnecessary singleton dimensions - # Keep time, longitude (zonal means) and single pressure levels - # Negative level value used for 850 vorticity - if dobj.shape==(1,) and not (dobj.isTime() or dobj.isLongitude()): - if not dobj.isLevel() or dobj.long_name.endswith('(dummy level coordinate)') or dobj.getData()[0] <= 0.: - excludeDims.append(dim) - dimns = list(dims.difference(excludeDims)) # exclude those in excludeDims - dimns.sort() - - print("Excluded dimensions", excludeDims) - print("Remaining dimensions", dimns) - - # Before using variables to work out dimension names, need to - # check that these are consistent. - level_codes = stashutils.get_level_codes(args.STASHmaster) - dimdict = collections.defaultdict(list) - for vname in fi.listvariables(): - var = fi.variables[vname] - if hasattr(var,'stash_item'): - # Exclude dimension variables - for d in var.listdimnames(): - if d in dimns: - dimdict[d].append(vname) - for dname in dimdict: - if dname.startswith('z'): - vars = dimdict[dname] - # Do these all have the same level codes - for k, v in enumerate(vars): - var = fi.variables[v] - code = 1000*var.stash_section[0] + var.stash_item[0] - if k == 0: - first = level_codes[code] - else: - # Treatment of level first and last is a bit odd, so skip this - # as well as grid - if not ( level_codes[code][1] == first[1] and - level_codes[code][4:] == first[4:] ): - # ESM changes some variables from tiles to - # PFTs so skip check in this case - # Handled using dimension size below. - if not (args.model=='esm1.5' and first.levelt==5 and first.pseudt==9): - - print("*** Mismatch", dname, vars, level_codes[code], first) - raise Exception() - - renameDims = {} - for dim in dimns: - dobj = fi.dimensionobject(dim) - dval = dobj.getData() - renamed = False - long_name = None - if dobj.isTime(): - if dim == 'time0': - # Most files have only a single dimension - dimout = 'time' - renamed = True - # see if we need to rename output netcdf dimension name - elif dobj.isLatitude(): - # Work out the grid. ESM uses ND - # Assuming it's global here - if args.model == 'cm2': - if dval[0] == -90.: - dimout = 'lat_v' - else: - dimout = 'lat' - else: - if dval[0] == -90.: - dimout = 'lat' - else: - dimout = 'lat_v' - if dimout == 'lat': - long_name = 'latitudes at T grid points' - elif dimout == 'lat_v': - long_name = 'latitudes at V grid points' - renamed = True - elif dobj.isLongitude(): - # Work out the grid - if args.model == 'cm2': - if dval[0] == 0.: - dimout = 'lon_u' - else: - dimout = 'lon' - else: - # Assuming it's global here - if dval[0] == 0.: - dimout = 'lon' - else: - dimout = 'lon_u' - if dimout == 'lon': - long_name = 'longitudes at T grid points' - elif dimout == 'lon_u': - long_name = 'longitudes at U grid points' - renamed = True - elif dim.startswith('z'): - # Already checked that the dimensions are all used - # consistently, so can choose appropriate names from the - # level codes of the first variable that uses it - vname = dimdict[dim][0] - var = fi.variables[vname] - code = 1000*var.stash_section[0] + var.stash_item[0] - levelt = level_codes[code].levelt - nlev = len(dval) - if levelt == 1: - dimout = 'z_hybrid_height_rho' - elif levelt == 2: - dimout = 'z_hybrid_height_theta' - elif levelt == 3: - dimout = 'z_p_level_%d' % nlev - elif levelt == 5: - # Surface - pseudt = level_codes[code].pseudt - if pseudt == 1: - dimout = 'z_sw_band' - long_name = 'SW radiation spectral band' - elif pseudt == 2: - dimout = 'z_lw_band' - long_name = 'LW radiation spectral band' - elif pseudt == 4: - dimout = 'z_aod_band' - long_name = 'aerosol optical depth spectral band' - elif pseudt == 10: - dimout = 'z_icecat' - long_name = 'sea-ice category' - elif pseudt == 9: - # Vegetation - pseudl = level_codes[code].pseudl - if args.model=='esm1.5': - # Inconsistent, so use dim size - if nlev==13: - dimout = 'z_pft' - long_name = 'land surface vegetated tile index' - elif nlev==17: - dimout = 'z_tile' - long_name = 'land surface tile index' - else: - raise Exception("Unexpected dimension size for tile pseudo dimension %s" % nlev) - else: - if pseudl == 8: - dimout = 'z_pft' - long_name = 'land surface vegetated tile index' - elif pseudl == 9: - dimout = 'z_tile' - long_name = 'land surface tile index' - else: - raise Exception("Unexpected pseudt %d for var %d" % (pseudt, code)) - elif levelt == 6: - dimout = 'z_soil_level' - else: - raise Exception('Unexpected level type %d' % levelt) - renamed = True - if renamed: - renameDims[dim] = (dimout, long_name) - else: - renameDims[dim] = (dim, long_name) - - if args.verbose: - print("Renamed dimensions", renameDims) - return renameDims - -# a function to create dimensions in the netCDF file -def write_nc_dimension(dimension,renameDims,fi,fo): - dobj = fi.dimensionobject(dimension) - dval = dobj.getData() - dimout = renameDims[dimension][0] - # There may be several input dimensions that map to same output - # dimension. Check that the values match in this case - if dimout in fo.dimensions: - if not np.allclose(dval, fo.variables[dimout][:]): - print("Dimension %s renamed as %s already in use" % (dimension, dimout)) - print("Coordinate mismatch") - print(dval) - print(fo.variables[dimout][:]) - raise Exception() - else: - if args.verbose: - print("Dimension %s renamed as %s already in use" % (dimension, dimout)) - return - - if dobj.isTime(): - dimlen = None - else: - dimlen = len(dval) - if args.verbose: - print("Creating dimension %s as %s, dimlen: %s" % (dimension,dimout,dimlen)) - fo.createDimension(dimout,dimlen) - if hasattr(dobj,'standard_name') and dobj.standard_name == 'time': - fo.createVariable(dimout,'d',(dimout,)) - else: - fo.createVariable(dimout,dval.dtype.char,(dimout,)) - for dattr in dobj.attributes: - setattr(fo.variables[dimout],dattr,getattr(dobj,dattr)) - long_name = renameDims[dimension][1] - if long_name: - fo.variables[dimout].long_name = long_name - if dimout == 'z_soil_level': - fo.variables[dimout].units = "m" - # CDMS gets this wrong - fo.variables[dimout].positive = "down" - if fo.variables[dimout].units == "Pa": - # CDMS gives values with extra 1e-8 for some reason. - fo.variables[dimout][:] = np.round(dval,6) - else: - fo.variables[dimout][:] = dval - -def findvar(vars, section, item): - for v in vars.values(): - if hasattr(v,'stash_section') and v.stash_section[0] == section and v.stash_item[0] == item: - return v - raise KeyError - -global heavyside_uv, heavyside_t -heavyside_uv = heavyside_t = None - -def apply_mask(var,heavyside): - # Mask variable by heavyside function - fVal = var.getMissing() - vorder = var.getOrder() - horder = heavyside.getOrder() - if vorder != horder: - print(vorder,'!= heavyside',horder,file=sys.stderr) - raise Exception('Unable to apply pressure level mask because of dimension order mismatch') - # Slice to match var - if var.shape == heavyside.shape: - var = MV.where(np.greater(heavyside,hcrit),var/heavyside,fVal) - var.fill_value = var.missing_value = fVal - return var - else: - # Do they just differ in number of levels with the variable's - # levels being a subset? - zdim = vorder.find('z') - vshape = list(var.shape) - hshape = list(heavyside.shape) - # Compare shapes without the z dimension - vshape[zdim] = hshape[zdim] = 0 - if vshape == hshape: - # Convert to list so that index works later - vlevs = var.getLevel()[:].tolist() - hlevs = heavyside.getLevel()[:].tolist() - assert zdim==0 # Assume given a t slice - # Need to make a copy first - newvar = var[:] - if set(vlevs).issubset(set(hlevs)): - # Then we can do the match - for k in range(len(vlevs)): - kh = hlevs.index(vlevs[k]) - if args.verbose: - print("Matching levels", k, kh) - newvar[k] = MV.where(np.greater(heavyside[kh],hcrit),newvar[k]/heavyside[kh],fVal) - newvar.fill_value = newvar.missing_value = fVal - return newvar - - print("Problem applying pressure level mask for variable %d" %(item_code),file=sys.stderr) - print(var.shape,'!= heavyside',heavyside.shape) - raise Exception('Unable to apply pressure level mask because of shape mismatch') - return var - -def heavyside_mask(var,item_code, t): - global heavyside_uv, heavyside_t - # Variable range here is correct at vn11.3 - if 30201 <= item_code <= 30288 or 30302 <= item_code <= 30303: - if not heavyside_uv: - # Set heavyside variable if doesn't exist - try: - heavyside_uv = findvar(fi.variables,30,301) - except KeyError: - raise Exception("Heavyside variable on UV grid required for pressure level masking of %d not found" % item_code) - return apply_mask(var[t],heavyside_uv[t]) - elif 30293 <= item_code <= 30298: - if not heavyside_t: - # set heavyside variable if doesn't exist - try: - heavyside_t = findvar(fi.variables,30,304) - except KeyError: - raise Exception("Heavyside variable on T grid required for pressure level masking of %d not found" % item_code) - return apply_mask(var[t],heavyside_t[t]) - else: - raise Exception("Unexpected item code %d in heavyside_mask function" % item_code) - -# Main program begins here. -# First, open the input UM file (fieldsfile) - -try: - fi = cdms2.open(args.ifile,'r') -except: - print("Error opening file", args.ifile, file=sys.stderr) - sys.exit(1) - -if os.path.exists(args.ofile): - os.unlink(args.ofile) - -# Create an output netCDF file -ncformats = {1:'NETCDF3_CLASSIC', 2:'NETCDF3_64BIT', - 3:'NETCDF4', 4:'NETCDF4_CLASSIC'} -fo = netCDF4.Dataset(args.ofile,'w',format=ncformats[args.nckind]) - -history = "%s converted with um2netcdf4.py by %s on %s." % (os.path.abspath(args.ifile), os.getenv('USER'),datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - -# global attributes -for attribute in fi.attributes: - if attribute in ('history'): - setattr(fo,attribute,history) - elif attribute not in ('input_file_format', 'input_uri', 'input_word_length','input_byte_ordering') : - setattr(fo,attribute,getattr(fi,attribute)) - -# variables to write -varnames = fi.listvariables() - -renameDims = transform_dimensions(fi) - -# create dimensions -for dimension in sorted(renameDims): - write_nc_dimension(dimension,renameDims,fi,fo) -if args.verbose: - print("Finished writing dimensions...") - -umvar_atts = ["name","long_name","standard_name","units"] -hcrit = 0.5 # Critical value of Heavyside function for inclusion. - -# Create a list of variable names sorted by stash code -snames = [] -for varname in varnames: - vval = fi.variables[varname] - if hasattr(vval,'stash_item') and hasattr(vval,'stash_section'): - stash_section = vval.stash_section[0] - stash_item = vval.stash_item[0] - item_code = vval.stash_section[0]*1000 + vval.stash_item[0] - snames.append((item_code,varname)) -snames.sort() - -varnames_out=[] -# loop over all variables -# create variables but don't write data yet -if args.verbose: - print('creating variables...') -for tmpval, varname in snames: - vval = fi.variables[varname] - vdims = vval.listdimnames() - # remove excluded dims: - for vdim in vdims: - if vdim not in renameDims: - vdims.remove(vdim) - # see if we need to rename variables netcdf dimensions - for vdidx, vdim in enumerate(vdims): - if vdim in renameDims: - vdims[vdidx] = renameDims[vdim][0] - if hasattr(vval,'stash_item') and hasattr(vval,'stash_section'): - stash_section = vval.stash_section[0] - stash_item = vval.stash_item[0] - item_code = vval.stash_section[0]*1000 + vval.stash_item[0] - umvar = stashvar.StashVar(item_code,vval.stash_model[0]) - vname = umvar.name - if args.simple: - vname = 'fld_s%2.2di%3.3d' % (stash_section, stash_item) - - if hasattr(vval,"cell_methods") and vval.cell_methods == "time0: max": - vname = vname+"_max" - if hasattr(vval,"cell_methods") and vval.cell_methods == "time0: min": - vname = vname+"_min" - - # write data - if vval.dtype in (np.int32, np.int64): - vtype = np.int32 - else: - vtype = np.float32 - basename = vname - suffix = 1 - while vname in fo.variables: - vname = '%s_%d' %(basename, suffix) - suffix += 1 - if args.verbose and vname != basename: - print("Using name %s because of duplication" % vname) - fo.createVariable(vname, vtype, tuple(vdims), - zlib=True, complevel=args.deflate_level, - fill_value=getattr(vval,'_FillValue')) - if args.verbose: - print(vname +"\t created from "+ varname) - varnames_out.append((varname,vname)) - - # variable attributes - for vattr in vval.listattributes(): - if getattr(vval,vattr) is None: - print("Could not write attribute %s for %s." % (vattr,vname)) - else: - if vattr not in ('_FillValue', 'stash_model', 'lookup_source'): - attval = getattr(vval,vattr) - if hasattr(attval,'dtype') and attval.dtype == np.int64: - attval = attval.astype(np.int32) - setattr(fo.variables[vname],vattr,attval) - - for vattr in umvar_atts: - if hasattr(umvar,vattr) and getattr(umvar,vattr) != '': - fo.variables[vname].setncattr(vattr,getattr(umvar,vattr)) - -# Loop over all variables writing data -# Assume same number of times for all variables -# Get number of times from first variable used -varname, vname_out = varnames_out[0] -vval = fi.variables[varname] -nt = vval.shape[0] - -if args.verbose: - print('writing data') -for t in range(nt): - for varname, vname_out in varnames_out: - vval = fi.variables[varname] - stash_section = vval.stash_section[0] - stash_item = vval.stash_item[0] - item_code = vval.stash_section[0]*1000 + vval.stash_item[0] - if 30201 <= item_code <= 30303 and item_code not in [30301, 30304] and mask: - # P LEV field with missing values treated as zero needs - # to be corrected by Heavyside fn. Exclude the Heavyside - # fields themselves (301 and 304). - vval = heavyside_mask(vval,item_code,t) - fo.variables[vname_out][t] = vval.getValue() - else: - sp = vval.shape - if len(sp) == 4 and sp[1] == 1 and len(fo.variables[vname_out].shape) == 3: - # A singleton level dimension was removed, so use - # explicit index so shapes match - fo.variables[vname_out][t] = vval[t,0].getValue() - else: - fo.variables[vname_out][t] = vval[t].getValue() - if args.verbose and t==0: - print('writing', varname, 'to',vname_out) - -if args.verbose: - print('finished') - -fo.close() diff --git a/src/umfile_utils/um2netcdf_all.py b/src/umfile_utils/um2netcdf_all.py deleted file mode 100644 index 22614dca..00000000 --- a/src/umfile_utils/um2netcdf_all.py +++ /dev/null @@ -1,233 +0,0 @@ -#!/usr/bin/env python -# Convert UM monthly PP files to netcdf and concatenate -# Also works with daily files and optionally calculates the monthly average -# For min, max temperature, also need to match on cell_methods attribute -# Assume this starts with time0: - -# Climate diagnostics on pressure levels are normally masked and need to be -# corrected using the Heaviside function. -# nomask option turns this off (special case for runs where these were -# saved differently). - -# Use the -x option to optionally skip some variables. - -import cdms2, cdtime, sys, getopt, collections -from cdms2 import MV -import numpy as np -import stashvar - -class error(Exception): - pass - - -def process_file(ifile,suffix,average=False,forcedaily=False,mask=True,xlist=[]): - - try: - d = cdms2.open(ifile) - except: - print "Error opening file", ifile - usage() - sys.exit(1) - - hcrit = 0.5 # Critical value of Heavyside function for inclusion. - ofilelist = [] - - for vn in d.variables: - var = d.variables[vn] - # Need to check whether it really has a stash_item to skip coordinate variables - - # Note: need to match both item and section number - if not hasattr(var,'stash_item'): - continue - item_code = var.stash_section[0]*1000 + var.stash_item[0] - if item_code in xlist: - print "Skipping", item_code - continue - - grid = var.getGrid() - time = var.getTime() - timevals = np.array(time[:]) - if forcedaily: - # Work around cdms error in times - for k in range(len(time)): - timevals[k] = round(timevals[k],1) - - umvar = stashvar.StashVar(item_code,var.stash_model[0]) - vname = umvar.name - print vname, var[0,0,0,0] - - # Create filename from variable name and cell_methods, - # checking for name collisions - if suffix: - ofile = "%s_%s.nc" % (umvar.uniquename, suffix) - else: - ofile = "%s.nc" % umvar.uniquename - if ofile in ofilelist: - raise Exception("Duplicate file name %s" % ofile) - ofilelist.append(ofile) - - # If output file exists then append to it, otherwise create a new file - try: - file = cdms2.openDataset(ofile, 'r+') - newv = file.variables[vname] - newtime = newv.getTime() - except cdms2.error.CDMSError: - file = cdms2.createDataset(ofile) - # Stop it creating the bounds_latitude, bounds_longitude variables - cdms2.setAutoBounds("off") - - # By default get names like latitude0, longitude1 - # Need this awkwardness to get the variable/dimension name set correctly - # Is there a way to change the name cdms uses after - # newlat = newgrid.getLatitude() ???? - newlat = file.createAxis('lat', grid.getLatitude()[:]) - newlat.standard_name = "latitude" - newlat.axis = "Y" - newlat.units = 'degrees_north' - newlon = file.createAxis('lon', grid.getLongitude()[:]) - newlon.standard_name = "longitude" - newlon.axis = "X" - newlon.units = 'degrees_east' - - order = var.getOrder() - if order[1] == 'z': - lev = var.getLevel() - if len(lev) > 1: - newlev = file.createAxis('lev', lev[:]) - for attr in ('standard_name', 'units', 'positive', 'axis'): - if hasattr(lev,attr): - setattr(newlev, attr, getattr(lev,attr)) - else: - newlev = None - else: - # Pseudo-dimension - pdim = var.getAxis(1) - if len(pdim) > 1: - newlev = file.createAxis('pseudo', pdim[:]) - else: - newlev = None - - newtime = file.createAxis('time', None, cdms2.Unlimited) - newtime.standard_name = "time" - newtime.units = time.units # "days since " + `baseyear` + "-01-01 00:00" - newtime.setCalendar(time.getCalendar()) - newtime.axis = "T" - - if var.dtype == np.dtype('int32'): - vtype = cdms2.CdInt - missval = -2147483647 - else: - vtype = cdms2.CdFloat - missval = 1.e20 - - if newlev: - newv = file.createVariable(vname, vtype, (newtime, newlev, newlat, newlon)) - else: - newv = file.createVariable(vname, vtype, (newtime, newlat, newlon)) - for attr in ("standard_name", "long_name", "units"): - if hasattr(umvar, attr): - newv.setattribute(attr, getattr(umvar,attr)) - newv.missing_value = missval - newv.stash_section=var.stash_section[0] - newv.stash_item=var.stash_item[0] - newv._FillValue = missval - - try: - newv.units = var.units - except AttributeError: - pass - - # Get appropriate file position - # Uses 360 day calendar, all with same base time so must be 30 days on. - k = len(newtime) - # float needed here to get the later logical tests to work properly - avetime = float(MV.average(timevals[:])) # Works in either case - if k>0: - if average: - # if newtime[-1] != (avetime - 30): - # For Gregorian calendar relax this a bit - # Sometimes get differences slightly > 31 - if not 28 <= avetime - newtime[-1] <= 31.5: - raise error, "Times not consecutive %f %f %f" % (newtime[-1], avetime, timevals[0]) - else: - if k > 1: - # Need a better test that works when k = 1. This is just a - # temporary workaround - if not np.allclose( newtime[-1] + (newtime[-1]-newtime[-2]), timevals[0] ): - raise error, "Times not consecutive %f %f " % (newtime[-1], timevals[0]) - - if (30201 <= item_code <= 30303) and mask: - # P LEV/UV GRID with missing values treated as zero. - # Needs to be corrected by Heavyside fn - heavyside = d.variables['psag'] - # Check variable code as well as the name. - if heavyside.stash_item[0] != 301 or heavyside.stash_section[0] != 30: - raise error, "Heavyside variable code mismatch" - - if average: - newtime[k] = avetime - if var.shape[1] > 1: - # multiple levels - newv[k] = MV.average(var[:],axis=0).astype(np.float32) - else: - # single level - newv[k] = MV.average(var[:],axis=0)[0].astype(np.float32) - else: - for i in range(len(timevals)): - if var.shape[1] > 1: - # Multi-level - if (30201 <= item_code <= 30303) and mask: - newv[k+i] = np.where( np.greater(heavyside[i], hcrit), var[i]/heavyside[0], newv.getMissing()) - else: - newv[k+i] = var[i] - else: - newv[k+i] = var[i,0] - - newtime[k+i] = timevals[i] - - file.close() - -def usage(): - print "Usage: um2netcdf_all.py [-a] [-d] -i ifile -o suffix [--nomask]" - -def help(): - usage() - print " -i input_file (Met Office fieldsfile format)" - print " -o suffix (output file suffix, e.g. -o test means ts_test.nc) " - print " -a (calculate time average)" - print " -d Force daily time values (work around cdms error)" - -if __name__ == '__main__': - - # vname is the name to use in the output file - cell_methods = None - average = False - mask = True - ifile = None - suffix = None - forcedaily = False - xlist = [] - try: - opts, args = getopt.getopt(sys.argv[1:], 'adhi:o:x:',['nomask']) - for o, a in opts: - if o == '-a': - average = True - elif o == '-h': - help() - sys.exit(0) - elif o == '-d': - forcedaily = True - elif o == '-i': - ifile = a - elif o == '--nomask': - mask = False - elif o == '-o': - suffix = a - elif o == '-x': - for v in a.split(","): - xlist.append(int(v)) - except getopt.error: - usage() - sys.exit(1) - - process_file(ifile,suffix,average,forcedaily,mask,xlist) diff --git a/src/umfile_utils/um2netcdf_iris.py b/src/umfile_utils/um2netcdf_iris.py deleted file mode 100644 index 389201e1..00000000 --- a/src/umfile_utils/um2netcdf_iris.py +++ /dev/null @@ -1,400 +0,0 @@ -#!/usr/bin/env python - -import iris, numpy as np, datetime, sys -import stashvar_cmip6 as stashvar -from iris.coords import CellMethod -import cf_units, cftime, mule -from netCDF4 import default_fillvals -from iris.fileformats.pp import PPField - -# Override the PP file calendar function to use Proleptic Gregorian rather than Gregorian. -# This matters for control runs with model years < 1600. -@property -def pg_calendar(self): - """Return the calendar of the field.""" - # TODO #577 What calendar to return when ibtim.ic in [0, 3] - calendar = cf_units.CALENDAR_PROLEPTIC_GREGORIAN - if self.lbtim.ic == 2: - calendar = cf_units.CALENDAR_360_DAY - elif self.lbtim.ic == 4: - calendar = cf_units.CALENDAR_365_DAY - return calendar -PPField.calendar = pg_calendar - -def convert_proleptic(time): - # Convert units from hours to days and shift origin from 1970 to 0001 - newunits = cf_units.Unit("days since 0001-01-01 00:00", calendar='proleptic_gregorian') - # Need a copy because can't assign to time.points[i] - tvals = np.array(time.points) - if time.bounds is not None: - tbnds = np.array(time.bounds) - has_bnds = True - else: - has_bnds = False - for i in range(len(time.points)): - date = time.units.num2date(tvals[i]) - newdate = cftime.DatetimeProlepticGregorian(date.year, date.month, date.day, date.hour, date.minute, date.second) - tvals[i] = newunits.date2num(newdate) - if has_bnds: # Fields with instantaneous data don't have bounds - for j in range(2): - date = time.units.num2date(tbnds[i][j]) - newdate = cftime.DatetimeProlepticGregorian(date.year, date.month, date.day, date.hour, date.minute, date.second) - tbnds[i][j] = newunits.date2num(newdate) - time.points = tvals - if has_bnds: - time.bounds = tbnds - time.units = newunits - -def fix_latlon_coord(cube, grid_type, dlat, dlon): - def _add_coord_bounds(coord): - if len(coord.points) > 1: - if not coord.has_bounds(): - coord.guess_bounds() - else: - # For length 1, assume it's global. guess_bounds doesn't work in this case - if coord.name() == 'latitude': - if not coord.has_bounds(): - coord.bounds = np.array([[-90.,90.]]) - elif coord.name() == 'longitude': - if not coord.has_bounds(): - coord.bounds = np.array([[0.,360.]]) - - lat = cube.coord('latitude') - # Force to double for consistency with CMOR - lat.points = lat.points.astype(np.float64) - _add_coord_bounds(lat) - lon = cube.coord('longitude') - lon.points = lon.points.astype(np.float64) - _add_coord_bounds(lon) - - lat = cube.coord('latitude') - if len(lat.points) == 180: - lat.var_name = 'lat_river' - elif (lat.points[0] == -90 and grid_type == 'EG') or \ - (np.allclose(-90.+0.5*dlat, lat.points[0]) and grid_type == 'ND'): - lat.var_name = 'lat_v' - else: - lat.var_name = 'lat' - - lon = cube.coord('longitude') - if len(lon.points) == 360: - lon.var_name = 'lon_river' - elif (lon.points[0] == 0 and grid_type == 'EG') or \ - (np.allclose(0.5*dlon, lon.points[0]) and grid_type == 'ND'): - lon.var_name = 'lon_u' - else: - lon.var_name = 'lon' - -def fix_level_coord(cube, z_rho, z_theta): - # Rename model_level_number coordinates to better distinguish rho and theta levels - try: - c_lev = cube.coord('model_level_number') - c_height = cube.coord('level_height') - c_sigma = cube.coord('sigma') - except iris.exceptions.CoordinateNotFoundError: - c_lev = None - if c_lev: - d_rho = abs(c_height.points[0]-z_rho) - if d_rho.min() < 1e-6: - c_lev.var_name = 'model_rho_level_number' - c_height.var_name = 'rho_level_height' - c_sigma.var_name = 'sigma_rho' - else: - d_theta = abs(c_height.points[0]-z_theta) - if d_theta.min() < 1e-6: - c_lev.var_name = 'model_theta_level_number' - c_height.var_name = 'theta_level_height' - c_sigma.var_name = 'sigma_theta' - - -def cubewrite(cube, sman, compression, use64bit, verbose): - try: - plevs = cube.coord('pressure') - plevs.attributes['positive'] = 'down' - plevs.convert_units('Pa') - # Otherwise they're off by 1e-10 which looks odd in ncdump - plevs.points = np.round(plevs.points,5) - if plevs.points[0] < plevs.points[-1]: - # Flip to get pressure decreasing as in CMIP6 standard - cube = iris.util.reverse(cube, 'pressure') - except iris.exceptions.CoordinateNotFoundError: - pass - if not use64bit: - if cube.data.dtype == 'float64': - cube.data = cube.data.astype(np.float32) - elif cube.data.dtype == 'int64': - cube.data = cube.data.astype(np.int32) - - # Set the missing_value attribute. Use an array to force the type to match - # the data type - if cube.data.dtype.kind == 'f': - fill_value = 1.e20 - else: - # Use netCDF defaults - fill_value = default_fillvals['%s%1d' % (cube.data.dtype.kind, cube.data.dtype.itemsize)] - - cube.attributes['missing_value'] = np.array([fill_value], cube.data.dtype) - - # If reference date is before 1600 use proleptic gregorian - # calendar and change units from hours to days - try: - reftime = cube.coord('forecast_reference_time') - time = cube.coord('time') - refdate = reftime.units.num2date(reftime.points[0]) - assert time.units.origin == 'hours since 1970-01-01 00:00:00' - if time.units.calendar == 'proleptic_gregorian' and refdate.year < 1600: - convert_proleptic(time) - else: - if time.units.calendar == 'gregorian': - new_calendar = 'proleptic_gregorian' - else: - new_calendar = time.units.calendar - time.units = cf_units.Unit("days since 1970-01-01 00:00", calendar=new_calendar) - time.points = time.points/24. - if time.bounds is not None: - time.bounds = time.bounds/24. - cube.remove_coord('forecast_period') - cube.remove_coord('forecast_reference_time') - except iris.exceptions.CoordinateNotFoundError: - # Dump files don't have forecast_reference_time - pass - - # Check whether any of the coordinates is a pseudo-dimension - # with integer values and if so reset to int32 to prevent - # problems with possible later conversion to netCDF3 - for coord in cube.coords(): - if coord.points.dtype == np.int64: - coord.points = coord.points.astype(np.int32) - - try: - # If time is a dimension but not a coordinate dimension, coord_dims('time') returns an empty tuple - if tdim := cube.coord_dims('time'): - # For fields with a pseudo-level, time may not be the first dimension - if tdim != (0,): - tdim = tdim[0] - neworder = list(range(cube.ndim)) - neworder.remove(tdim) - neworder.insert(0,tdim) - if verbose > 1: - print("Incorrect dimension order", cube) - print("Transpose to", neworder) - cube.transpose(neworder) - sman.write(cube, zlib=True, complevel=compression, unlimited_dimensions=['time'], fill_value=fill_value) - else: - tmp = iris.util.new_axis(cube,cube.coord('time')) - sman.write(tmp, zlib=True, complevel=compression, unlimited_dimensions=['time'], fill_value=fill_value) - except iris.exceptions.CoordinateNotFoundError: - # No time dimension (probably ancillary file) - sman.write(cube, zlib=True, complevel=compression, fill_value=fill_value) - -def fix_cell_methods(mtuple): - # Input is tuple of cell methods - newm = [] - for m in mtuple: - newi = [] - for i in m.intervals: - # Skip the misleading hour intervals - if i.find('hour') == -1: - newi.append(i) - n = CellMethod(m.method, m.coord_names, tuple(newi), m.comments) - newm.append(n) - return tuple(newm) - -def apply_mask(c, heaviside, hcrit): - # Function must handle case where the cube is defined on only a subset of the levels of the heaviside function - # print("Apply mask", c.shape, heaviside.shape) - if c.shape == heaviside.shape: - # If the shapes match it's simple - # Temporarily turn off warnings from 0/0 - with np.errstate(divide='ignore',invalid='ignore'): - c.data = np.ma.masked_array(c.data/heaviside.data, heaviside.data <= hcrit).astype(np.float32) - else: - # Are the levels of c a subset of the levels of the heaviside variable? - c_p = c.coord('pressure') - h_p = heaviside.coord('pressure') - # print('Levels for masking', c_p.points, h_p.points) - if set(c_p.points).issubset(h_p.points): - # Match is possible - constraint = iris.Constraint(pressure=c_p.points) - h_tmp = heaviside.extract(constraint) - # Double check they're aactually the same after extraction - if not np.all(c_p.points == h_tmp.coord('pressure').points): - raise Exception('Unexpected mismatch in levels of extracted heaviside function') - with np.errstate(divide='ignore',invalid='ignore'): - c.data = np.ma.masked_array(c.data/h_tmp.data, h_tmp.data <= hcrit).astype(np.float32) - else: - raise Exception('Unable to match levels of heaviside function to variable %s' % c.name()) - -def process(infile, outfile, args): - - # Use mule to get the model levels to help with dimension naming - # mule 2020.01.1 doesn't handle pathlib Paths properly - ff = mule.load_umfile(str(infile)) - if isinstance(ff, mule.ancil.AncilFile): - raise Exception('Ancillary files are not supported') - if ff.fixed_length_header.grid_staggering == 6: - grid_type = 'EG' - elif ff.fixed_length_header.grid_staggering == 3: - grid_type = 'ND' - else: - raise Exception("Unable to determine grid staggering from header %d" % - ff.fixed_length_header.grid_staggering) - dlat = ff.real_constants.row_spacing - dlon = ff.real_constants.col_spacing - z_rho = ff.level_dependent_constants.zsea_at_rho - z_theta = ff.level_dependent_constants.zsea_at_theta - - if args.include_list and args.exclude_list: - raise Exception("Error: include list and exclude list are mutually exclusive") - cubes = iris.load(infile) - - # Sort the list by stashcode - def keyfunc(c): - return c.attributes['STASH'] - cubes.sort(key=keyfunc) - - # Check whether there are any pressure level fields that should be - # masked. Can use temperature to mask instantaneous fields, so really - # should check whether these are time means - need_heaviside_uv = need_heaviside_t = False - have_heaviside_uv = have_heaviside_t = False - for c in cubes: - stashcode = c.attributes['STASH'] - if ( stashcode.section == 30 and - ( 201 <= stashcode.item <= 288 or 302 <= stashcode.item <= 303 )): - need_heaviside_uv = True - if stashcode.section == 30 and stashcode.item == 301: - have_heaviside_uv = True - heaviside_uv = c - if ( stashcode.section == 30 and 293 <= stashcode.item <= 298): - need_heaviside_t = True - if stashcode.section == 30 and stashcode.item == 304: - have_heaviside_t = True - heaviside_t = c - - if not args.nomask and need_heaviside_uv and not have_heaviside_uv: - print("""Warning - heaviside_uv field needed for masking pressure level data is not present. - These fields will be skipped""") - if not args.nomask and need_heaviside_t and not have_heaviside_t: - print("""Warning - heaviside_t field needed for masking pressure level data is not present. - These fields will be skipped""") - - nc_formats = {1: 'NETCDF3_CLASSIC', 2: 'NETCDF3_64BIT', - 3: 'NETCDF4', 4: 'NETCDF4_CLASSIC'} - with iris.fileformats.netcdf.Saver(outfile, nc_formats[args.nckind]) as sman: - - # Add global attributes - if not args.nohist: - history = "File %s converted with um2netcdf_iris.py v2.1 at %s" % \ - (infile, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - sman.update_global_attributes({'history':history}) - sman.update_global_attributes({'Conventions':'CF-1.6'}) - - for c in cubes: - stashcode = c.attributes['STASH'] - itemcode = 1000*stashcode.section + stashcode.item - if args.include_list and itemcode not in args.include_list: - continue - if args.exclude_list and itemcode in args.exclude_list: - continue - umvar = stashvar.StashVar(itemcode) - if args.simple: - c.var_name = 'fld_s%2.2di%3.3d' % (stashcode.section, stashcode.item) - elif umvar.uniquename: - c.var_name = umvar.uniquename - # Could there be cases with both max and min? - if c.var_name: - if any([m.method == 'maximum' for m in c.cell_methods]): - c.var_name += "_max" - if any([m.method == 'minimum' for m in c.cell_methods]): - c.var_name += "_min" - # The iris name mapping seems wrong for these - perhaps assuming rotated grids? - if c.standard_name == 'x_wind': - c.standard_name = 'eastward_wind' - if c.standard_name == 'y_wind': - c.standard_name = 'northward_wind' - if c.standard_name and umvar.standard_name: - if c.standard_name != umvar.standard_name: - if args.verbose: - sys.stderr.write("Standard name mismatch %d %d %s %s\n" % \ - (stashcode.section, stashcode.item, c.standard_name, umvar.standard_name) ) - c.standard_name = umvar.standard_name - if c.units and umvar.units: - # Simple testing c.units == umvar.units doesn't - # catch format differences because Unit type - # works around them. repr isn't reliable either - ustr = '%s' % c.units - if ustr != umvar.units: - if args.verbose: - sys.stderr.write("Units mismatch %d %d %s %s\n" % \ - (stashcode.section, stashcode.item, c.units, umvar.units) ) - c.units = umvar.units - # Temporary work around for xconv - if c.long_name and len(c.long_name) > 110: - c.long_name = c.long_name[:110] - # If there's no standard_name or long_name from iris - # use one from STASH - if not c.standard_name: - if umvar.standard_name: - c.standard_name = umvar.standard_name - if not c.long_name: - if umvar.long_name: - c.long_name = umvar.long_name - - # Interval in cell methods isn't reliable so better to remove it. - c.cell_methods = fix_cell_methods(c.cell_methods) - try: - fix_latlon_coord(c, grid_type, dlat, dlon) - except iris.exceptions.CoordinateNotFoundError: - print('\nMissing lat/lon coordinates for variable (possible timeseries?)\n') - print(c) - raise Exception("Variable can not be processed") - fix_level_coord(c, z_rho, z_theta) - - if not args.nomask and stashcode.section == 30 and \ - (201 <= stashcode.item <= 288 or 302 <= stashcode.item <= 303): - # Pressure level data should be masked - if have_heaviside_uv: - apply_mask(c, heaviside_uv, args.hcrit) - else: - continue - if not args.nomask and stashcode.section == 30 and \ - (293 <= stashcode.item <= 298): - # Pressure level data should be masked - if have_heaviside_t: - apply_mask(c, heaviside_t, args.hcrit) - else: - continue - if args.verbose: - print(c.name(), itemcode) - cubewrite(c, sman, args.compression, args.use64bit, args.verbose) - -if __name__ == '__main__': - import sys, argparse - parser = argparse.ArgumentParser(description="Convert UM fieldsfile to netcdf") - parser.add_argument('-k', dest='nckind', required=False, type=int, - default=3, help='specify kind of netCDF format for output file: 1 classic, 2 64-bit offset, 3 netCDF-4, 4 netCDF-4 classic model. Default 3', choices=[1,2,3,4]) - parser.add_argument('-c', dest='compression', required=False, type=int, - default=4, help='compression level (0=none, 9=max). Default 4') - parser.add_argument('--64', dest='use64bit', action='store_true', - default=False, help='Use 64 bit netcdf for 64 bit input') - parser.add_argument('-v', '--verbose', dest='verbose', - action='count', default=0, help='verbose output (-vv for extra verbose)') - parser.add_argument('--include', dest='include_list', type=int, - nargs = '+', help = 'List of stash codes to include') - parser.add_argument('--exclude', dest='exclude_list', type=int, - nargs = '+', help = 'List of stash codes to exclude') - parser.add_argument('--nomask', dest='nomask', action='store_true', - default=False, help="Don't apply heaviside function mask to pressure level fields") - parser.add_argument('--nohist', dest='nohist', action='store_true', - default=False, help="Don't update history attribute") - parser.add_argument('--simple', dest='simple', action='store_true', - default=False, help="Use a simple names of form fld_s01i123.") - parser.add_argument('--hcrit', dest='hcrit', type=float, - default=0.5, help="Critical value of heavyside fn for pressure level masking (default=0.5)") - parser.add_argument('infile', help='Input file') - parser.add_argument('outfile', help='Output file') - - args = parser.parse_args() - - process(args.infile, args.outfile, args) diff --git a/src/umfile_utils/um2netcdf_iris_mon.py b/src/umfile_utils/um2netcdf_iris_mon.py deleted file mode 100644 index d8b93139..00000000 --- a/src/umfile_utils/um2netcdf_iris_mon.py +++ /dev/null @@ -1,218 +0,0 @@ -# This version excludes the monthly diurnal cycle variables -from __future__ import print_function -import iris, numpy as np, datetime, sys, re -import stashvar -from iris.coords import CellMethod -import cf_units, cftime - -iris.FUTURE.netcdf_no_unlimited = True - -def convert_proleptic(time): - # Convert from hour to days and shift origin from 1970 to 0001 - t0 = cftime.DatetimeProlepticGregorian(1,1,1) - # datetime gets handled like proleptic gregorian so simple difference works - # Need a copy because can't assign to time.points[i] - tvals = np.array(time.points) - tbnds = np.array(time.bounds) - for i in range(len(time.points)): - delta = time.units.num2date(tvals[i]) - t0 - tvals[i] = delta.days + delta.seconds/86400. - delta = time.units.num2date(tbnds[i][0]) - t0 - tbnds[i][0] = delta.days + delta.seconds/86400. - delta = time.units.num2date(tbnds[i][1]) - t0 - tbnds[i][1] = delta.days + delta.seconds/86400. - time.points = tvals - time.bounds = tbnds - time.units = cf_units.Unit("days since 0001-01-01 00:00", calendar='proleptic_gregorian') - -def cubewrite(cube,sman,compression): - try: - plevs = cube.coord('pressure') - if plevs.points[0] < plevs.points[-1]: - # Flip (assuming pressure is first index) - plevs.attributes['positive'] = 'down' - # Otherwise they're off by 1e-10 which looks odd in - # ncdump - plevs.points = np.round(plevs.points,5) - if cube.coord_dims('pressure') == (0,): - cube = cube[::-1] - except iris.exceptions.CoordinateNotFoundError: - pass - if cube.data.dtype == 'float64': - cube.data = cube.data.astype(np.float32) - - # If reference date is before 1600 use proleptic gregorian - # calendar and change units from hours to days - time = cube.coord('time') - reftime = cube.coord('forecast_reference_time') - refdate = reftime.units.num2date(reftime.points[0]) - if time.units.calendar=='gregorian': - assert time.units.origin == 'hours since 1970-01-01 00:00:00' - if refdate.year < 1600: - convert_proleptic(time) - else: - time.units = cf_units.Unit("days since 1970-01-01 00:00", calendar='proleptic_gregorian') - time.points = time.points/24. - time.bounds = time.bounds/24. - cube.remove_coord('forecast_period') - cube.remove_coord('forecast_reference_time') - - # Check whether any of the coordinates is a pseudo-dimension - # with integer values and if so reset to int32 to prevent - # problems with possible later conversion to netCDF3 - for coord in cube.coords(): - if coord.points.dtype == np.int64: - coord.points = coord.points.astype(np.int32) - - try: - if cube.coord_dims('time'): - sman.write(cube, zlib=True, complevel=compression, unlimited_dimensions=['time']) - else: - tmp = iris.util.new_axis(cube,cube.coord('time')) - sman.write(tmp, zlib=True, complevel=compression, unlimited_dimensions=['time']) - except iris.exceptions.CoordinateNotFoundError: - # No time dimension (probably ancillary file) - sman.write(cube, zlib=True, complevel=compression) - -def fix_cell_methods(mtuple): - # Input is tuple of cell methods - newm = [] - for m in mtuple: - newi = [] - for i in m.intervals: - # Skip the misleading hour intervals - if i.find('hour') == -1: - newi.append(i) - n = CellMethod(m.method, m.coord_names, tuple(newi), m.comments) - newm.append(n) - return tuple(newm) - -def bounds_callback(cube,field,filename): - # This skips the monthly diurnal cycle variables from the UM - m = cube.cell_methods[0] - if m.intervals == ('24 hour',): - raise iris.exceptions.IgnoreCubeException() - -def process(infile,outfile,verbose=False,nckind=3,compression=4,nomask=False,include_list=None,exclude_list=None): - - if include_list and exclude_list: - raise Exception("Error: include list and exclude list are mutually exclusive") - cubes = iris.load(infile,callback=bounds_callback) - - # Sort the list by stashcode - def keyfunc(c): - return c.attributes['STASH'] - cubes.sort(key=keyfunc) - - # Check whether there are any pressure level fields that should be - # masked. Can use temperature to mask instantaneous fields, so really - # should check whether these are time means - need_heaviside = False - have_heaviside = False - hcrit = 0.5 - for c in cubes: - stashcode = c.attributes['STASH'] - if stashcode.section == 30 and 201 <= stashcode.item <= 303: - need_heaviside = True - if stashcode.section == 30 and stashcode.item == 301: - have_heaviside = True - heaviside = c - - if not nomask and need_heaviside and not have_heaviside: - print("""Warning - heaviside field needed for masking pressure level data is not present. - These fields will be skipped""") - - nc_formats = {1: 'NETCDF3_CLASSIC', 2: 'NETCDF3_64BIT', - 3: 'NETCDF4', 4: 'NETCDF4_CLASSIC'} - with iris.fileformats.netcdf.Saver(outfile, nc_formats[nckind]) as sman: - - # Add global attributes - history = "File %s with converted with um2netcdf_iris_mon.py at %s" % (infile, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - sman.update_global_attributes({'history':history}) - sman.update_global_attributes({'Conventions':'CF-1.6'}) - - for c in cubes: - stashcode = c.attributes['STASH'] - itemcode = 1000*stashcode.section + stashcode.item - if include_list and itemcode not in include_list: - continue - if exclude_list and itemcode in exclude_list: - continue - umvar = stashvar.StashVar(itemcode) - if umvar.uniquename: - c.var_name = umvar.uniquename - # Could there be cases with both max and min? - if any([m.method == 'maximum' for m in c.cell_methods]): - c.var_name += "_max" - if any([m.method == 'minimum' for m in c.cell_methods]): - c.var_name += "_min" - # The iris name mapping seems wrong for these - perhaps assuming rotated grids? - if c.standard_name == 'x_wind': - c.standard_name = 'eastward_wind' - if c.standard_name == 'y_wind': - c.standard_name = 'northward_wind' - if c.standard_name and umvar.standard_name: - if c.standard_name != umvar.standard_name: - if verbose: - sys.stderr.write("Standard name mismatch %d %d %s %s\n" % (stashcode.section, stashcode.item, c.standard_name, umvar.standard_name) ) - c.standard_name = umvar.standard_name - if c.units and umvar.units: - # Simple testing c.units == umvar.units doesn't - # catch format differences becuase Unit type - # works around them. repr isn't reliable either - ustr = '%s' % c.units - if ustr != umvar.units: - if verbose: - sys.stderr.write("Units mismatch %d %d %s %s\n" % (stashcode.section, stashcode.item, c.units, umvar.units) ) - c.units = umvar.units - # Temporary work around for xconv - if c.long_name and len(c.long_name) > 110: - c.long_name = c.long_name[:110] - # If there's no standard_name or long_name from iris - # use one from STASH - if not c.standard_name: - if umvar.standard_name: - c.standard_name = umvar.standard_name - if not c.long_name: - if umvar.long_name: - c.long_name = umvar.long_name - - # Interval in cell methods isn't reliable so better to - # remove it. - c.cell_methods = fix_cell_methods(c.cell_methods) - - if stashcode.section == 30 and stashcode.item == 301: - continue - if not nomask and stashcode.section == 30 and 201 <= stashcode.item <= 303: - # Pressure level data should be masked - if have_heaviside: - # Temporarily turn off warnings from 0/0 - with np.errstate(divide='ignore',invalid='ignore'): - c.data = np.ma.masked_array(c.data/heaviside.data, heaviside.data <= hcrit).astype(np.float32) - else: - continue - if verbose: - print(c.name(), itemcode) - cubewrite(c,sman,compression) - -if __name__ == '__main__': - import sys, argparse - parser = argparse.ArgumentParser(description="Convert UM fieldsfile to netcdf") - parser.add_argument('-k', dest='kind', required=False, type=int, - default=3, help='specify kind of netCDF format for output file: 1 classic, 2 64-bit offset, 3 netCDF-4, 4 netCDF-4 classic model. Default 3', choices=[1,2,3,4]) - parser.add_argument('-c', dest='compression', required=False, type=int, - default=4, help='compression level (0=none, 9=max). Default 4') - parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', - default=False, help='verbose output') - parser.add_argument('--include', dest='include', type=int, - nargs = '+', help = 'List of stash codes to include') - parser.add_argument('--exclude', dest='exclude', type=int, - nargs = '+', help = 'List of stash codes to exclude') - parser.add_argument('--nomask', dest='nomask', action='store_true', - default=False, help="Don't apply heaviside function mask to pressure level fields") - parser.add_argument('infile', help='Input file') - parser.add_argument('outfile', help='Output file') - - args = parser.parse_args() - - process(args.infile,args.outfile,args.verbose,args.kind,args.compression,args.nomask,args.include,args.exclude) diff --git a/src/umfile_utils/um_complexity.py b/src/umfile_utils/um_complexity.py deleted file mode 100644 index 73d779da..00000000 --- a/src/umfile_utils/um_complexity.py +++ /dev/null @@ -1,28 +0,0 @@ -# Calculate CPMIP complexity from CM2 UM restart. -# Ignore fields 376-286 from JULES snow scheme -# Ignore CABLE fields > 833 -# Count tiled fields using 10751 land points - -# For ESM don't skip any fields and count land as 10865 - -import mule, sys - -ff = mule.DumpFile.from_file(sys.argv[1]) -esm = True - -tot = 0 -for fld in ff.fields: - if esm: - if fld.lbpack == 120: - tot += 10865 - else: - tot += 145*192 - else: - if 376 <= fld.lbuser4 <= 386 or 834 <= fld.lbuser4 <= 1000: - continue - if fld.lbpack == 120: - tot += 10751 - else: - tot += 144*192 - print(fld.lbuser4, fld.lbpack, tot) -print("TOT", tot) diff --git a/src/umfile_utils/um_copy_field.py b/src/umfile_utils/um_copy_field.py deleted file mode 100644 index d0152b63..00000000 --- a/src/umfile_utils/um_copy_field.py +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env python -# Copy one or more fields from one UM file to another -# Note that this only copies the data, not any of the header information -# (date etc). Minimal sanity checking. - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * - -vlist = [] -try: - optlist, args = getopt.getopt(sys.argv[1:], 'i:o:v:') - for opt in optlist: - if opt[0] == '-i': - ifile = opt[1] - elif opt[0] == '-o': - ofile = opt[1] - elif opt[0] == '-v': - # Allow comma separated lists - for v in opt[1].split(","): - vlist.append(int(v)) -except getopt.error: - print "Usage: um_copy_field.py -i ifile -o ofile -v var" - print " Copy fields from ifile to ofile" - print " Variables specified by STASH index = Section Number * 1000 + item number" - print " May use a list specififed as -v var1,var2,..." - sys.exit(2) - -f = umfile.UMFile(ifile, "r") -g = umfile.UMFile(ofile, "r+") - -# Find the indices of the desired fields in each file. -# This assumes that each is in normal stashcode order -# (as all files produced by model are) -findex = [] -gindex = [] -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - if ilookup[ITEM_CODE] in vlist: - findex.append(k) - -for k in range(g.fixhd[FH_LookupSize2]): - ilookup = g.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - if ilookup[ITEM_CODE] in vlist: - gindex.append(k) - -# print "Field lengths", len(findex), len(gindex) -if len(findex) != len(gindex): - raise Exception("Files have different number of target fields %d %d" % - (len(findex), len(gindex))) - -# Loop over all the fields -for k in range(len(findex)): - ilookup = f.ilookup[findex[k]] - olookup = g.ilookup[gindex[k]] - # print "Replacing", k, ilookup[ITEM_CODE] - # Check that sizes match. Checking LBLREC here catches fields packed - # to land points - if not ( ilookup[LBLREC] == olookup[LBLREC] and - ilookup[LBNPT] == olookup[LBNPT] and - ilookup[LBROW] == olookup[LBROW] ): - print "Input data shape", ilookup[LBLREC], ilookup[LBNPT], ilookup[LBROW] - print "Output data shape", olookup[LBLREC], olookup[LBNPT], olookup[LBROW] - raise Exception("Inconsistent grid sizes") - if not ilookup[ITEM_CODE] == olookup[ITEM_CODE]: - raise Exception("Inconsistent stash codes") - a = f.readfld(findex[k]) - g.writefld(a,gindex[k]) - -g.close() diff --git a/src/umfile_utils/um_fields_subset.py b/src/umfile_utils/um_fields_subset.py deleted file mode 100644 index 0fd714c0..00000000 --- a/src/umfile_utils/um_fields_subset.py +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env python -# Select a subset from a UM fieldsfile -# -p option will select only the prognostic fields required for an initial -# dump and will also check some header fields. - -# Output word size and endianness match input. - -# This doesn't change the "written" date in a dump header. - -# Martin Dix martin.dix@csiro.au - -# TODO: Specify ranges for variables. -# Give a warning if field to be excluded is not found? - -from __future__ import print_function -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * - -vlist = [] -xlist = [] -nfields = 9999999999 -prognostic = False -section = False -try: - optlist, args = getopt.getopt(sys.argv[1:], 'i:n:o:psv:x:') - for opt in optlist: - if opt[0] == '-i': - ifile = opt[1] - elif opt[0] == '-n': - nfields = int(opt[1]) - elif opt[0] == '-o': - ofile = opt[1] - elif opt[0] == '-p': - prognostic = True - elif opt[0] == '-s': - section = True - elif opt[0] == '-v': - # Allow comma separated lists - for v in opt[1].split(","): - vlist.append(int(v)) - elif opt[0] == '-x': - for v in opt[1].split(","): - xlist.append(int(v)) -except getopt.error: - print("Usage: um_fields_subset.py -i ifile -o ofile [-p] [-s] [-v var] [-x var]") - print(" -p include only prognostic (section 0,33,34) variables") - print(" -s means -x and -v specify section rather than variable indices") - print(" -v var1,var2,... to INCLUDE only these variables") - print(" -x var1,var2,... to EXCLUDE only these variables") - print(" Variables specified by STASH index = Section Number * 1000 + item number") - sys.exit(2) - -if vlist and xlist: - raise Exception("Error: -x and -v are mutually exclusive") - -if prognostic and (vlist or xlist): - raise Exception("Error: -p incompatible with explicit list of variables") - -def match(code,vlist,section): - if section: - return code//1000 in vlist - else: - return code in vlist - - -f = umfile.UMFile(ifile) - -g = umfile.UMFile(ofile, "w") -g.copyheader(f) -g.ilookup[:] = -99 # Used as missing value -g.rlookup[:] = np.frombuffer(np.array([-99],g.int).tobytes(),g.float) - -# Initial check for packed fields that require the land-sea mask -needmask=False -masksaved = False -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99 or k >= nfields: - break - # Format is Section Number * 1000 + item number - if ( prognostic and umfile.isprog(ilookup) or - vlist and match(ilookup[ITEM_CODE],vlist,section) or - xlist and not match(ilookup[ITEM_CODE],xlist,section) or - not prognostic and not vlist and not xlist ) : - packing = [0, ilookup[LBPACK]%10, ilookup[LBPACK]//10 % 10, - ilookup[LBPACK]//100 % 10, ilookup[LBPACK]//1000 % 10, - ilookup[LBPACK]//10000] - if packing[2]==2 and packing[3] in (1,2): - needmask=True - if ilookup[ITEM_CODE]==30: - masksaved = True - -if vlist and needmask and not masksaved: - print("Adding land sea mask to output fields because of packed data") - vlist.append(30) - -# Loop over all the fields, counting the number of prognostic fields -kout = 0 -nprog = 0 -ntracer = 0 -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - if ilookup[LBEGIN] == -99 or k >= nfields: - break - # Format is Section Number * 1000 + item number - - if ( prognostic and umfile.isprog(ilookup) or - vlist and match(ilookup[ITEM_CODE],vlist,section) or - xlist and not match(ilookup[ITEM_CODE],xlist,section) or - not prognostic and not vlist and not xlist ) : - - g.ilookup[kout,:] = ilookup[:] - g.rlookup[kout,:] = f.rlookup[k,:] - s = f.readfld(k,raw=True) - g.writefld(s, kout, raw=True) - # data = f.readfld(k) - # g.writefld(data, kout) - kout += 1 - if umfile.isprog(ilookup): - nprog += 1 - if umfile.istracer(ilookup): - # Should this also count UKCA fields as tracers? - ntracer += 1 - -# To get correct number of tracer fields need to divide by number of levels -ntracer /= f.inthead[IC_TracerLevs] - -# Set the header to be just large enough -g.fixhd[FH_LookupSize2] = kout -if g.fixhd[FH_NumProgFields] != nprog: - print("Resetting no of prognostic fields from %d to %d" % (g.fixhd[FH_NumProgFields], nprog)) - g.fixhd[FH_NumProgFields] = nprog -if g.inthead[IC_TracerVars] != ntracer: - print("Resetting no of tracer fields from %d to %d" % (g.inthead[IC_TracerVars], ntracer)) - g.inthead[IC_TracerVars] = ntracer -if ntracer > 0 and g.inthead[IC_TracerLevs] != g.inthead[IC_PLevels]: - print("Resetting no of tracer levels from %d to %d" % ( g.inthead[IC_TracerLevs], g.inthead[IC_PLevels])) - g.inthead[IC_TracerLevs] = g.inthead[IC_PLevels] - -g.close() diff --git a/src/umfile_utils/um_fieldsfile_dump.py b/src/umfile_utils/um_fieldsfile_dump.py deleted file mode 100644 index 67fbe368..00000000 --- a/src/umfile_utils/um_fieldsfile_dump.py +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env python -# Dump header information from a UM fields file - -# Martin Dix martin.dix@csiro.au - -# TODO -# Should get the field names from rcf_headaddress_mod.F90 - -from __future__ import print_function, division -import numpy as np -import argparse, sys -from um_fileheaders import * -import umfile -try: - import stashvar -except ModuleNotFoundError: - import stashvar_cmip6 as stashvar - -parser = argparse.ArgumentParser(description="Dump contents of a UM fieldsfile") -parser.add_argument('-H', dest='header_only', action='store_true', - default=False, help='show header only') -parser.add_argument('--noheader', dest='noheader', action='store_true', - default=False, help="Don't show file header") -parser.add_argument('-s', dest='short', action='store_true', - default=False, help='short list of fields') -parser.add_argument('-S', dest='summary', action='store_true', - default=False, help='summary similar to model list of expected fields') -parser.add_argument('--nodata', dest='nodata', action='store_true', - default=False, help='Skip data summary') -parser.add_argument('infile', help='Input file') - -args = parser.parse_args() - -f = umfile.UMFile(args.infile) - -if not f.fieldsfile: - print("Not a UM fieldsfile") - sys.exit(1) - -f.readheader() - -def getlevel(ilookup): - if ilookup[LBPLEV] > 0: - # Snow variables on tiles have this as 1000*tile_index + layer - # 1001, 2001, ... 1002, 2002, ... - # Model treats these as a single variable - # Reverse this to get something that increments - if ilookup[LBPLEV] > 1000: - lev = ilookup[LBPLEV] % 1000 - tile = ilookup[LBPLEV] // 1000 - return lev*1000 + tile - else: - return ilookup[LBPLEV] - else: - if ilookup[LBLEV] == 9999: - # Used for surface fields and 0th level of multi-level fields - return 0 - else: - return ilookup[LBLEV] - -if not (args.summary or args.noheader): - f.print_fixhead() - print("Integer constants", f.inthead) - print("REAL HEADER", f.realhead) - if hasattr(f,"levdep"): - print("Level dependent constants", f.levdep) - if hasattr(f,"rowdep"): - print("Row dependent constants", f.rowdep) - if hasattr(f,"coldep"): - print("Column dependent constants", f.coldep) - -lastvar = None -nl = 0 -nfld = 0 -if not args.header_only: - - for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lblrec = ilookup[LBLREC] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - var = stashvar.StashVar(ilookup[ITEM_CODE],ilookup[MODEL_CODE]) - if not (args.short or args.summary): - print("-------------------------------------------------------------") - if args.summary: - if not lastvar: - # To get started - lastvar = ilookup[ITEM_CODE] - lastlevel = getlevel(ilookup) - nl = 1 - else: - # Just check that level increases to handle the tiled snow - # variables. - # Pressure levels should decrease - # Check that the times match, - if ( lastvar == ilookup[ITEM_CODE] and - np.all(f.ilookup[k-1][:LBLREC] == ilookup[:LBLREC]) and - ( getlevel(ilookup) > lastlevel or - ilookup[LBVC] == 8 and getlevel(ilookup) < lastlevel)): - # Same variable as previous one - lastlevel += 1 - nl += 1 - else: - var = stashvar.StashVar(lastvar,ilookup[MODEL_CODE]) - # nfld starts from 1 to match list in model output - nfld += 1 - print(nfld, nl, lastvar, var.name, var.long_name) - lastvar = ilookup[ITEM_CODE] - lastlevel = getlevel(ilookup) - nl = 1 - else: - print(k, ilookup[ITEM_CODE], var.name, var.long_name) - - if ilookup[LBCODE] == f.missval_i: - # There are some files with variables codes in headers but much - # of the rest of the data missing - print("Header data missing") - continue - if args.summary or args.short: - continue - print(f.ilookup[k, :45]) - print(f.rlookup[k, 45:]) - npts = ilookup[LBNPT] - nrows = ilookup[LBROW] - - if args.nodata: - continue - try: - data = f.readfld(k) - - # Sample values - print("Range", data.min(), data.max()) - if len(data.shape)==2: - for j in [0, nrows//4, nrows//2, 3*nrows//4, -1]: - print("%12.6g %12.6g %12.6g %12.6g %12.6g" % (data[j,0], data[j,npts//4], data[j,npts//2], data[j,3*npts//4], data[j,-1])) - except umfile.packerr: - print("Can't handle packed data") - -if args.summary: - if lastvar: - # There's one left at the end - print(nfld+1, nl, lastvar, var.name, var.long_name) - else: - print("No data fields present") diff --git a/src/umfile_utils/um_fileheaders.py b/src/umfile_utils/um_fileheaders.py deleted file mode 100644 index d145a842..00000000 --- a/src/umfile_utils/um_fileheaders.py +++ /dev/null @@ -1,296 +0,0 @@ -# From rcf_headaddress_mod.F90 -# Also defined in UMDP F3 - -# Fixed length header constants - -# Values that are array indices have had one subtraced so they work properly -# with python arrays - -# Integers -FH_Version = 0 -FH_SubModel = 1 -FH_VertCoord = 2 -FH_HorizGrid = 3 -FH_Dataset = 4 -FH_RunId = 5 -FH_ExptNo = 6 -FH_CalendarType = 7 -FH_GridStagger = 8 -FH_AncilDataId = 9 -FH_ProjNo = 10 -FH_OcnBndyConds = 10 # ocean boundary condition -FH_ModelVersion = 11 -FH_OceanDynamics= 11 -FH_ObsFileType = 13 - -FH_DTYear = 20 -FH_DTMonth = 21 -FH_DTDay = 22 -FH_DTHour = 23 -FH_DTMinute = 24 -FH_DTSecond = 25 -FH_DTDayNo = 26 - -FH_VTYear = 27 -FH_VTMonth = 28 -FH_VTDay = 29 -FH_VTHour = 30 -FH_VTMinute = 31 -FH_VTSecond = 32 -FH_VTDayNo = 33 - -FH_CTYear = 34 -FH_CTMonth = 35 -FH_CTDay = 36 -FH_CTHour = 37 -FH_CTMinute = 38 -FH_CTSecond = 39 -FH_CTDayNo = 40 - -FH_IntCStart = 99 -FH_IntCSize = 100 -FH_RealCStart = 104 -FH_RealCSize = 105 -FH_LevDepCStart = 109 -FH_LevDepCSize1 = 110 -FH_LevDepCSize2 = 111 -FH_RowDepCStart = 114 -FH_RowDepCSize1 = 115 -FH_RowDepCSize2 = 116 -FH_ColDepCStart = 119 -FH_ColDepCSize1 = 120 -FH_ColDepCSize2 = 121 -FH_FldsOfCStart = 124 -FH_FldsOfCSize1 = 125 -FH_FldsOfCSize2 = 126 -FH_ExtraCStart = 129 -FH_ExtraCSize = 130 -FH_HistStart = 134 -FH_HistSize = 135 -FH_CompFldI1Start = 139 -FH_CompFldI1Size = 140 -FH_CompFldI2Start = 141 -FH_CompFldI2Size = 142 -FH_CompFldI3Start = 143 -FH_CompFldI3Size = 144 -FH_LookupStart = 149 -FH_LookupSize1 = 150 -FH_LookupSize2 = 151 -FH_NumProgFields = 152 -FH_DataStart = 159 -FH_DataSize = 160 -FH_MaxDataSize = 161 - -# These are flags values rather than indices so are unchanged -FH_Version_Value = 20 -FH_SubModel_Atmos = 1 -FH_SubModel_Ocean = 2 -FH_SubModel_Wave = 4 - -FH_VertCoord_Hybrid = 1 -FH_VertCoord_Sigma = 2 -FH_VertCoord_Pressure = 3 -FH_VertCoord_Depth = 4 -FH_VertCoord_CP = 5 -FH_VertCoord_Wave = 6 - -FH_HorizGrid_Global = 0 -FH_HorizGrid_NH = 1 -FH_HorizGrid_SH = 2 -FH_HorizGrid_LamNoWrap = 3 -FH_HorizGrid_LamWrap = 4 -FH_HorizGrid_Eq = 100 -FH_HorizGrid_LamNoWrapEq = 103 -FH_HorizGrid_LamWrapEq = 104 - -FH_GridStagger_A = 1 -FH_GridStagger_B = 2 -FH_GridStagger_C = 3 -FH_GridStagger_D = 4 -FH_GridStagger_E = 5 - -FH_Dataset_InstDump = 1 -FH_Dataset_MeanDump = 2 -FH_Dataset_FF = 3 -FH_Dataset_Ancil = 4 -FH_Dataset_Boundary = 5 -FH_Dataset_ACOBS = 6 -FH_Dataset_VAROBS = 7 -FH_Dataset_CX = 8 -FH_Dataset_COV = 9 -FH_Dataset_OBSTORE = 10 - -FH_ObsFileType_Atmos = 1 -FH_ObsFileType_Ocean = 2 -FH_ObsFileType_SST = 3 -FH_ObsFileType_Wave = 4 - -# Indices with one subtracted -IC_TorTheta = 0 #location in header -IC_TorTheta_T = 1 #value of above if T -IC_TorTheta_Theta = 2 #value of above if Theta -IC_XLen = 5 -IC_YLen = 6 -IC_PLevels = 7 -IC_WetLevels = 8 -IC_SoilTLevels = 9 -IC_NoCloudLevels = 10 # ATMOS only -IC_NoSeaPts = 10 # OCEAN only -IC_TracerLevs = 11 -IC_BLevels = 12 -IC_TracerVars = 13 -IC_HeightMethod = 16 #method for creating heights -IC_RiverRowLength= 18 #river-routing row-length -IC_RiverRows = 19 #river-routing rows -IC_MDI = 20 -IC_1stConstRho = 23 -IC_NumLandPoints = 24 -IC_NumOzoneLevs = 25 -IC_SoilMoistLevs = 27 -IC_NumObsTotal = 27 -IC_LenObCol = 28 -IC_LenCxCol = 29 # Varobs, not acobs -IC_ObsGroup = 30 # " -IC_ObsRelease = 31 # " -IC_NumMetaMax = 32 # " -IC_ConvectLevs = 33 -IC_NumItemMax = 33 # " -IC_NumObVarMax = 34 -IC_NumObPItemMax = 35 -IC_NumCxPItemMax = 36 -IC_NumCxSFVarMax = 37 -IC_NumCxUaVarMax = 38 -IC_NumMeta = 39 -IC_NumItem = 40 -IC_NumObVar = 41 -IC_NumObPItem = 42 -IC_NumCxPItem = 43 -IC_NumCxSfVar = 44 -IC_NumCxUaVar = 45 -IC_NumObLev = 46 -IC_NumCxLev = 47 -IC_NumVarBatches = 48 - -RC_LongSpacing = 0 -RC_LatSpacing = 1 -RC_FirstLat = 2 -RC_FirstLong = 3 -RC_PoleLat = 4 -RC_PoleLong = 5 -RC_SWLDEG = 6 # Ocean - lat of South wall -RC_WEDGEDEG = 7 # " = long of West bdy -RC_ModelTop = 15 -RC_PressureTop = 16 - -# Not sure what these are - -## CC_Meta_Latitude = 1 # Used in varobs -## CC_Meta_Longitude = 2 # " -## CC_Meta_Time = 3 # " -## CC_Meta_Type = 4 # " -## CC_Meta_Call = 5 # " -## CC_Meta_Level = 6 # " -## CC_Meta_RepPGE = 7 # " - -## CC_Item_Value = 1 # Used in varobs -## CC_Item_Error = 2 # " -## CC_Item_PGE = 3 # " - -## LDC_EtaTheta = 1 -## LDC_Pressure = 1 -## LDC_MLIndex = 1 -## LDC_EtaRho = 2 -## LDC_RHCrit = 3 -## SoilDepths = 4 -## LDC_ZseaTheta = 5 -## LDC_CkTheta = 6 -## LDC_ZseaRho = 7 -## LDC_CkRho = 8 - -# From clookadd.h -#!*L------------------ COMDECK LOOKADD ---------------------------------- -#!LL -#!LL Purpose : Contains information about the format -#!LL of the PP header - -# Validity time -LBYR =0 # Year -LBMON =1 # Month -LBDAT =2 # Day of month -LBHR =3 # Hour -LBMIN =4 # Minute -LBDAY =5 # Day number -LBSEC =5 # Seconds (if LBREL >= 3) - -# Data time -LBYRD =6 # Year -LBMOND =7 # Month -LBDATD =8 # Day of month -LBHRD =9 # Hour -LBMIND =10 # Minute -LBDAYD =11 # Day number -LBSECD =11 # Seconds (if LBREL >= 3) - -LBTIM =12 # Time indicator -LBFT =13 # Forcast period (hours) -LBLREC =14 # Length of data record -LBCODE =15 # Grid type code -LBHEM =16 # Hemisphere indicator -LBROW =17 # Number of rows in grid -LBNPT =18 # Number of points per row -LBEXT =19 # Length of extra data -LBPACK =20 # Packing method indicator -LBREL =21 # Header release number -LBFC =22 # Field code -LBCFC =23 # Second field code -LBPROC =24 # Processing code -LBVC =25 # Vertical coordinate type -LBRVC =26 # Coordinate type for reference level - -LBEXP =27 # Experiment number -LBEGIN =28 # Start record -LBNREC =29 # No of records-Direct access only -LBPROJ =30 # Met-O-8 projection number -LBTYP =31 # Met-O-8 field type -LBLEV =32 # Met-O-8 level code -LBRSVD1=33 # Reserved for future PP-package use -LBRSVD2=34 # Reserved for future PP-package use -LBRSVD3=35 # Reserved for future PP-package use -LBRSVD4=36 # Reserved for future PP-package use -LBSRCE =37 # =1111 to indicate following apply to UM -DATA_TYPE =38 # Indicator for real/int or timeseries -NADDR =39 # Start address in DATA_REAL or DATA_INT -LBUSER3=40 # Free for user-defined function -ITEM_CODE =41 #Stash code -LBPLEV =42 # Pseudo-level indicator (if defined) -LBUSER6=43 # Free for user-defined function -MODEL_CODE =44 # internal model identifier - -BULEV =45 # Upper level boundary -BHULEV =46 # Upper level boundary -BRSVD3 =47 # Reserved for future PP-package use -BRSVD4 =48 # Reserved for future PP-package use -BDATUM =49 # Datum value -BACC =50 # (Packed fields) Packing accuracy -BLEV =51 # Level -BRLEV =52 # Lower level boundary -BHLEV =53 # (Hybrid levels) A-level of value -BHRLEV =54 # Lower level boundary -BPLAT =55 # Real latitude of 'pseudo' N Pole -BPLON =56 # Real longitude of 'pseudo' N Pole -BGOR =57 # Grid orientation -BZY =58 # Zeroth latitude -BDY =59 # Latitude interval -BZX =60 # Zeroth longitude -BDX =61 # Longitude interval -BMDI =62 # Missing data indicator -BMKS =63 # M,K,S scaling factor - -## LBCC_LBYR = 1 # Year -## LBCC_LBMON = 2 # Month -## LBCC_LBDAT = 3 # Day of the month -## LBCC_LBHR = 4 # Hour -## LBCC_LBMIN = 5 # Minute -## LBCC_LBDAY = 6 # Day number -## LBCC_LBEGIN = 7 # Start record -## LBCC_NADDR = 8 # Start address of DATA diff --git a/src/umfile_utils/um_grid_flip.py b/src/umfile_utils/um_grid_flip.py deleted file mode 100644 index e74e4d16..00000000 --- a/src/umfile_utils/um_grid_flip.py +++ /dev/null @@ -1,23 +0,0 @@ -# Flip UM ancillary file NS. Note that this works in-place in the given file -# Martin Dix martin.dix@csiro.au - - -from um_fileheaders import * -import umfile, sys - -f = umfile.UMFile(sys.argv[1], 'r+') - -print(f.realhead) -f.realhead[RC_FirstLat] = -f.realhead[RC_FirstLat] - -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - rlookup = f.rlookup[k] - if ilookup[LBEGIN] == -99: - break - rlookup[BZY] *= -1 - rlookup[BDY] *= -1 - data = f.readfld(k) - f.writefld(data[::-1],k) - -f.close() diff --git a/src/umfile_utils/um_modify_field.py b/src/umfile_utils/um_modify_field.py deleted file mode 100644 index 9f82b37f..00000000 --- a/src/umfile_utils/um_modify_field.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python -# Modify specified fields in a UM file - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import argparse, sys -import umfile -from um_fileheaders import * - -parser = argparse.ArgumentParser(description="Modify field in UM file with offset and scale factor, new = a*old + b.") -parser.add_argument('-a', dest='scale', type=float, default=1, help='Scale factor (default 1)') -parser.add_argument('-b', dest='offset', type=float, default=0, help='Offset (default 0)') -parser.add_argument('-v', action='append', dest='varcode', type=int, required=True, help='Variable to be modified (specified by STASH index = section_number * 1000 + item_number. -v argument may be repeated to process multiple fields.') -parser.add_argument('file', help='File to be modified') - -args = parser.parse_args() - -if args.scale == 1 and args.offset == 0: - print("Nothing to be done, a=1, b=0") - sys.exit(0) - -f = umfile.UMFile(args.file, 'r+') - -changed = False -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - if ilookup[ITEM_CODE] == args.varcode: - a = f.readfld(k) - a[:] = a[:] * args.scale + args.offset - f.writefld(a,k) - changed = True - -if not changed: - print('Warning: no fields changed') - -f.close() diff --git a/src/umfile_utils/um_replace_field.py b/src/umfile_utils/um_replace_field.py deleted file mode 100644 index 768360ba..00000000 --- a/src/umfile_utils/um_replace_field.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python - -# Replace a field in a UM fieldsfile with values from a netcdf file -# Note that this modifies the file in place -# Works with single or multi-level (include pseudo-level) fields - -# Martin Dix martin.dix@csiro.au - -from __future__ import print_function -import numpy as np -import argparse, sys, iris, umfile -from um_fileheaders import * - -parser = argparse.ArgumentParser(description="Replace field in UM file with a field from a netCDF file.") -parser.add_argument('-v', dest='varcode', type=int, required=True, - help='Variable to be replaced (specified by STASH index = section_number * 1000 + item_number') -parser.add_argument('-n', dest='ncfile', required=True, help='Input netCDF file') -parser.add_argument('-V', dest='ncvarname', required=True, help='netCDF variable name') -parser.add_argument('target', help='UM File to change') - -args = parser.parse_args() - -cube = iris.load_cube(args.ncfile,iris.Constraint(cube_func=lambda c: c.var_name==args.ncvarname)) -cube = iris.util.squeeze(cube) - -# Expect that the cube doesn't have a time dimension after the squeeze -if 'time' in cube.coords(): - print("Unexpected time dimension in input variable") - print(cube) - sys.exit(1) - -if cube.ndim == 2: - multilevel = False -elif cube.ndim == 3: - multilevel = True - nlev = cube.shape[0] - -f = umfile.UMFile(args.target, "r+") - -if hasattr(cube.data, 'mask'): - # Set missing value to match the fieldsfile missing value - arr = cube.data.filled(f.missval_r) -else: - arr = cube.data - -# Loop over all the fields -replaced = False -ilev = 0 -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - if ilookup[ITEM_CODE] == args.varcode: - if multilevel: - print("Replacing field", k, ilookup[ITEM_CODE], 'level', ilev) - else: - print("Replacing field", k, ilookup[ITEM_CODE]) - # Packing - n3 = (ilookup[LBPACK] // 100) % 10 - # Don't check shape if data is packed to land or ocean points - if n3==0 and not (ilookup[LBROW], ilookup[LBNPT]) == arr.shape[-2:]: - print("\nError: array shape mismatch") - print("UM field shape", (ilookup[LBROW], ilookup[LBNPT])) - print("netcdf field shape", arr.shape) - sys.exit(1) - a = f.readfld(k) - if n3 == 0: - print("Initial sum", a.sum()) - else: - print("Initial sum", np.ma.masked_array(a,f.mask==0).sum()) - if multilevel: - a[:] = arr[ilev] - else: - a[:] = arr[:] - if n3 == 0: - print("Final sum", a.sum()) - else: - print("Final sum", np.ma.masked_array(a,f.mask==0).sum()) - f.writefld(a[:], k) - ilev += 1 - replaced = True - -if not replaced: - print("\nWarning: requested stash code %d not found in file %s" % (args.varcode, args.target)) - print("No replacement made.") - -f.close() diff --git a/src/umfile_utils/um_timeseries.py b/src/umfile_utils/um_timeseries.py deleted file mode 100644 index 341a22eb..00000000 --- a/src/umfile_utils/um_timeseries.py +++ /dev/null @@ -1,458 +0,0 @@ -#!/usr/bin/env python -# Convert a UM timeseries fields file to a netcdf file. -# In general a single file can contain variables on multiple usage -# domains, so should allow for this when generating the netcdf dimensions. -# Also in general could need multiple time dimensions, though these can't -# be unlimited. -# Here assume that everything is defined at the same times. -# This is checked for, - -# Rachel's files have two domains, surface and atmospheric. However, the -# atmospheric domain may have different coordinates for u, v and T grids. - -# Need to be sure it works for different file restarting frequencies - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import collections -import argparse, sys, time -import stashvar_cmip6 as stashvar -from um_fileheaders import * -import umfile -import netCDF4 -import cdtime -import warnings - -parser = argparse.ArgumentParser(description="Convert UM timeseries file to netCDF.") -parser.add_argument('-i', dest='ifile', required=True, help='Input UM file') -parser.add_argument('-o', dest='ofile', required=True, help='Output netCDF file') -parser.add_argument('-v', '--verbose', dest='verbose', - action='count', default=0, help='verbose output (-vv for extra verbose)') -parser.add_argument('--simple', dest='simple', action='store_true', - default=False, help="Use a simple names of form fld_s01i123.") -args = parser.parse_args() - - -f = umfile.UMFile(args.ifile) -d = netCDF4.Dataset(args.ofile,"w",format='NETCDF3_CLASSIC') - -if args.verbose > 1: - f.print_fixhead() - print("REAL HEADER", f.realhead) - -# Lat and lon are incorrect with ENDGAME -eg_grid = f.fixhd[FH_GridStagger] == 6 -dlon = f.realhead[RC_LongSpacing] -dlat = f.realhead[RC_LatSpacing] -lon0 = f.realhead[RC_FirstLong] -lat0 = f.realhead[RC_FirstLat] - -# Loop over all the loookup headers to set up the netcdf file. -# Check each variable is defined on the same times. -# Use cdtime for the calendar - -if f.fixhd[FH_CalendarType] == 1: - cdtime.DefaultCalendar = cdtime.GregorianCalendar - calendar = "proleptic_gregorian" -elif f.fixhd[FH_CalendarType] == 2: - cdtime.DefaultCalendar = cdtime.Calendar360 - calendar = "360_day" -else: - raise Exception("Unsupported calendar") - -vardict = {} -setgrid = False -setsurf = False -timeunits = None - -# Check whether file contains any timeseries data -timeseries = False -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - if ilookup[LBCODE] in (31320, 31323): - timeseries = True - break - -if not timeseries: - print("File contains no timeseries data") - sys.exit(1) - -if args.verbose: - print("Number of records", f.fixhd[FH_LookupSize2]) -var = None -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - rlookup = f.rlookup[k] - if ilookup[LBCODE] not in (31320, 31323): - # Not a time series - continue - lblrec = ilookup[LBLREC] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - lbnrec = ilookup[LBNREC] # Actual size - if lbegin == -99: - break - if args.verbose: - print(f"\n*** RECORD {k} ***") - # if var and var.code == ilookup[ITEM_CODE]: - # Then this is another level of the same variable - - # Perhaps should just pass the full lookup array? - # Should this return a unique list of names ??? - npts = ilookup[LBNPT] - nrows = ilookup[LBROW] - - if not timeunits: - # Should be hidden as a function somewhere - timeunits = "days since %4.4d-%2.2d-%2.2d %2.2d:%2.2d" % (ilookup[LBYR], - ilookup[LBMON], ilookup[LBDAT], ilookup[LBHR], ilookup[LBMIN]) - - # Different variables may be saved with different steps - # Really only need to do this the first time variable is seen. - end = cdtime.comptime(ilookup[LBYRD], ilookup[LBMOND], - ilookup[LBDATD], ilookup[LBHRD], ilookup[LBMIND]) - period = end.torelative(timeunits) - step = period.value/ilookup[LBROW] - if args.verbose: - print("TIME STEP (days)", step) - # Step will probably be some integer number of minutes - step = round(1440*step,4) - if args.verbose: - print("TIME STEP (mins)", step) - - # ilookup[LBCODE] is 31320 for Gregorian timeseries, 31323 for other calendar - # rlookup[51] is level, -1 for single or special levels - f.wordseek(lbegin) # Offset rather than absolute seek? - s = f.wordread(npts*nrows) - # Where is this format for grid point values defined? - # Added by routine extra_ts_info - s = f.wordread((npts+1)*6) - x = np.frombuffer(s,np.float64).byteswap().reshape(6,npts+1) - y = np.frombuffer(s,np.int64).byteswap() - - # Need to unpack the first part and then get point values from the - # last part. This will probably only work when they're separate points - # Regions will be different? - startlats = x[0,1:] - startlons = x[1,1:] - endlats = x[2,1:] - endlons = x[3,1:] - startlevs = x[4,1:] - endlevs = x[5,1:] - - # Check whether coordinates are set properly for the EG grid - # This should be half integer - if eg_grid: - jlat = (startlats[0] - lat0)/dlat - if not np.isclose(jlat-int(jlat), 0.5): - warnings.warn("Inconsistent lat/lon for EG grid - adjusting") - startlats += 0.5*dlat - endlats += 0.5*dlat - startlons += 0.5*dlon - endlons += 0.5*dlon - - # Check whether the level is non-zero. - # Might indicate tiling? - - # This might not be necessary. Levels seem to be saved as individuals even - # when specified with a range in the UMUI. - # Perhaps not when a box is specified? - if not np.allclose(startlats,endlats) or not np.allclose(startlons,endlons): - print("STARTLATS", startlats) - print("ENDLATS", endlats) - print("STARTLONS", startlons) - print("ENDLONS", endlons) - raise Exception("Conversion doesn't support timeseries with regions at the moment") - # If there are multiple usage domains with different sets of points - # this code probably won't work. - # Should perhaps make a list of points for each variable. - - # The notation here is a bit misleading because these aren't really grids. - # but rather collections of coordinates. - - # If it's on hybrid levels, set the real height - # Use rlookup[BLEV] to check whether it's on rho or theta. - # theta levels are in f.levdep[4], rho levels in f.levdep[6] - if ilookup[LBVC] == 65: - if abs(f.levdep[4]-rlookup[BLEV]).min() < 1e-2: - # Index by theta levels. Level 0 is 0 so start at 1 - startlevs = f.levdep[4][startlevs.astype(int)] - elif abs(f.levdep[6]-rlookup[BLEV]).min() < 1e-2: - # Index by rho levels. Level 0 is first model level so start at 0 - startlevs = f.levdep[6][startlevs.astype(int)-1] - else: - print("Warning - unexpected vertical levels", ilookup[ITEM_CODE]) - print(rlookup[BLEV], f.levdep[4], f.levdep[6]) - # Pseudo level data - if ilookup[LBPLEV] > 0: - startlevs = ilookup[LBPLEV] - - # Use index to accumulate total number of times for each variable - # This should use item_code because name might not be unique - # Use var.code - if not var or ilookup[ITEM_CODE] not in vardict: - var = stashvar.StashVar(ilookup[ITEM_CODE], ilookup[MODEL_CODE]) - # Initialising with .UniqueList(startlons) doesn't work - # because the uniqueness checking isn't added to init method. - # Need to use a combined lat/lon list because each individual - # list might have repeated values, e.g. points (30, 150) and (30,155). - var.gridlist = umfile.UniqueList() - # var.latlist = umfile.UniqueList() - var.levlist = umfile.UniqueList() - # Need tuple so can use set later - var.gridlist.append([tuple(x) for x in np.column_stack((startlats,startlons)).tolist()]) - var.levlist.append(startlevs) - var.count = ilookup[LBROW] - var.step = step - var.pseudo = ilookup[LBPLEV] > 0 - vardict[ilookup[ITEM_CODE]] = var - if args.verbose: - print("Creating var", ilookup[ITEM_CODE], len(var.gridlist)) - else: - vardict[ilookup[ITEM_CODE]].gridlist.append([tuple(x) for x in np.column_stack((startlats,startlons)).tolist()]) - vardict[ilookup[ITEM_CODE]].levlist.append(startlevs) - vardict[ilookup[ITEM_CODE]].count += ilookup[LBROW] - - # vardict[ITEM_CODE]. - - if args.verbose > 1: - # print "X", x - print(f"NPTS={len(startlats)}") - print("STARTLATS", startlats) - print("STARTLONS", startlons) - print("STARTLEVS", startlevs) - print("ENDLATS", endlats) - print("LBVC", ilookup[LBVC], ilookup[LBPLEV]) - print("ENDLONS", endlons) - print("ENDLEVS", endlevs) - - if args.verbose: - print("-----------------------------------------------------------") - print(var.name, var.long_name) - print(f.ilookup[k, :45]) - print(f.rlookup[k, 45:]) - # Expect lblrec = npts*nrows + npts*9 - print("Rec size", k, lbnrec, lblrec, npts*nrows + (npts+1)*6) - print("Start time", ilookup[:5]) - print("End time", ilookup[6:11]) - print("Level type", ilookup[LBVC]) - print("Forecast period", ilookup[LBFT]) - print("Rows", ilookup[LBROW]) - print("Data type", ilookup[DATA_TYPE]) - print("Level", ilookup[LBLEV]) - print("Pseudo level", ilookup[LBPLEV]) - - - -# # Update lists of point coordinates -# # in a dictionary? -# # vardict[var.code].count += ilookup[LBROW] ??? -# # Should also check that the grids match -# vtmp = vardict[var.code] -# vtmp.count += ilookup[LBROW] -# vardict[var.code] = vtmp - -# # var.step = step -# # var.lon = lon # So we can find the correct axes later -# # var.lat = lat -# # var.lev = lev -# print "Adding to dictionary", var.name #, var.lon.lev -# var.count = ilookup[LBROW] -# # vardict[var.code] = var - -# Global attributes -d.history = "%s Created by um_timeseries.py from file %s" % (time.strftime("%Y-%m-%d %H:%M"), args.ifile) - -# Distinct coordinates -# Convert lists to tuples so they're hashable. -ugrid = sorted(list(set([tuple(v.gridlist) for v in vardict.values()]))) -# ulat = sorted(list(set([tuple(v.latlist) for v in vardict.values()]))) -ulev = sorted(list(set([tuple(v.levlist) for v in vardict.values()]))) -if args.verbose: - print("Number of distinct coordinate sets", len(ugrid), len(ulev)) - print("Unique gridpts", ugrid) - - -for k in range(len(ulev)): - lev = ulev[k] - if args.verbose: - print("LEVLIST", k, lev) - if not (max(lev) == min(lev) == 1): - dname = "lev_%d" % k - d.createDimension(dname,len(lev)) - levsvar = d.createVariable("lev_%d"%k, "f", (dname,)) - # Need to get the appropriate level type and the proper values - # rather than just indices. - if abs(f.levdep[4]-lev[0]).min() < 1e-4: - levsvar.long_name = "Model theta levels" - levsvar.units = 'm' - elif abs(f.levdep[6]-lev[0]).min() < 1e-4: - levsvar.long_name = "Model rho levels" - levsvar.units = 'm' - else: - levsvar.long_name = "Model levels" - levsvar.axis='Z' - levsvar[:] = np.array(lev).astype(np.float32) - -# Length of ulon and ulat must be the same -for k in range(len(ugrid)): - grid = ugrid[k] - dname = "gridpts_%d" % k - vname = "lon_%d" % k - d.createDimension(dname,len(grid)) - lonsvar = d.createVariable(vname, "f", (dname,)) - lonsvar.long_name = "longitude" - lonsvar.units = "degrees_east" - lon = [p[1] for p in grid] - lonsvar[:] = np.array(lon).astype(np.float32) - vname = "lat_%d" % k - latsvar = d.createVariable(vname, "f", (dname,)) - latsvar.long_name = "latitude" - latsvar.units = "degrees_north" - lat = [p[0] for p in grid] - latsvar[:] = np.array(lat).astype(np.float32) - -# Assume a single time index per file. -# Check that each variable has the same time axis. - -# Variables on pseudo-levels are saved as separate records due to a UM limitation -# Correct the time count -for v in vardict.values(): - if v.pseudo: - v.count = v.count // len(v.levlist) - -# Make a list of the times -times = [v.count for v in vardict.values()] -tset = set(times) # To get unique times -tlist = list(tset) -tlist.sort() -steps = [v.step for v in vardict.values()] -stepset = set(steps) # To get unique times -steplist = list(stepset) -steplist.sort(reverse=True) - -# Check these have same lengths, otherwise there's some inconsistency -if len(steplist) != len(tlist): - raise Exception("Inconsistency in lengths of time and step lists %d, %d" % (len(tlist), len(steplist))) - -for k, nt in enumerate(tlist): - if len(tlist) > 1: - name = "time_%d" % k - else: - name = "time" - timedim = d.createDimension(name, nt) - timevar = d.createVariable(name, "f", (name,)) - timevar.units = timeunits - timevar.calendar = calendar - tval = cdtime.reltime(0,timeunits) - for t in range(nt): - timevar[t] = tval.value - tval = tval.add(steplist[k], cdtime.Minutes) - -# Create the variables -# Use of filevars here won't handle multiple use of the same variable -# with different profiles. -filevars = {} -dims = {} -for vcode in vardict: - var = vardict[vcode] - if args.simple: - vname = f'fld_s{var.code//1000:02d}i{var.code%1000:02d}' - else: - vname = var.name - # Match all the dimensions - if len(tlist) > 1: - timedim = "time_%d" % tlist.index(var.count) - else: - timedim = "time" - if min(var.levlist) == max(var.levlist) == 1: - levdim = None - else: - levdim = "lev_%d" % ulev.index(tuple(var.levlist)) - gridd = ugrid.index(tuple(var.gridlist)) - griddim = "gridpts_%d" % gridd - if vname in d.variables.keys(): - # Need to generalise this properly - vname = vname + "_2" - if levdim: - if args.verbose: - print("Creating %s with %s, %s, %s" % (vname, timedim, levdim, griddim)) - newvar = d.createVariable(vname, "f", (timedim, levdim, griddim)) - else: - if args.verbose: - print("Creating %s (%d) with %s, %s" % (vname, vcode, timedim, griddim)) - newvar = d.createVariable(vname, "f", (timedim, griddim)) - newvar.long_name = var.long_name - if var.units: - newvar.units = var.units - if var.standard_name: - newvar.standard_name = var.standard_name - newvar.longitude = "longitude_%d" % gridd - newvar.latitude = "latitude_%d" % gridd - section = var.code // 1000 - item = var.code % 1000 - newvar.um_stash_source = f'm01s{section:02d}i{item:03d}' - filevars[vcode] = newvar - # This is a transposed list because that's the order it's needed in later - dims[vcode] = (len(var.gridlist), len(var.levlist)) - -countvar = collections.defaultdict(int) -for i in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[i] - lblrec = ilookup[LBLREC] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - lbnrec = ilookup[LBNREC] # Actual size - item_code = ilookup[ITEM_CODE] - - if lbegin == -99: - break - var = stashvar.StashVar(item_code,ilookup[MODEL_CODE]) - - npts = ilookup[LBNPT] - nrows = ilookup[LBROW] - f.wordseek(lbegin) -# Need to apply this everywhere, also for reading lats and lons. -## if ilookup[LBPACK] == 0: -## s = f.wordread(npts*nrows) -## data = np.reshape( np.frombuffer(s, np.float64).byteswap(), [nrows, npts]) -## elif ilookup[LBPACK] == 2: -## s = f.wordread((npts*nrows)//2) -## data = np.reshape( np.frombuffer(s, np.float32).byteswap(), [nrows, npts]) -## else: -## raise "Unsupported packing type %d" % ilookup[LBPACK] - s = f.wordread(npts*nrows) - data = np.reshape(np.frombuffer(s, np.float64).byteswap(), [nrows, npts]) - if args.verbose: - print("DATA", data) - - start = countvar[item_code] - countvar[item_code] += ilookup[LBROW] - - # Shouldn't need to keep doing this - #var = stashvar.StashVar(ilookup[ITEM_CODE], ilookup[MODEL_CODE]) - #filevar = d.variables[var.name] - # Data ranges over levels first, then grid points -# print "SHAPES", data.shape, start, ilookup[LBROW] -# print "DATA", data[0] - - # When is shape[0] not 1 - multiple gridpoints? - for k in range(data.shape[0]): - tmp = data[k] - # Special handling of pseudo-levels - if vardict[item_code].pseudo: - nlev = filevars[item_code].shape[1] - tstart = start // nlev - lstart = start % nlev - filevars[item_code][tstart,lstart] = tmp.astype(np.float32)[0] - else: - tmp.shape = dims[item_code] - tmp = tmp.transpose() - if len(filevars[item_code].shape) == 3: - # Level dimension - filevars[item_code][start+k] = tmp.astype(np.float32) - else: - # tmp has a trivial level dimension - filevars[item_code][start+k] = tmp.astype(np.float32)[0] - - -d.close() diff --git a/src/umfile_utils/um_zero_field.py b/src/umfile_utils/um_zero_field.py deleted file mode 100644 index 72361aae..00000000 --- a/src/umfile_utils/um_zero_field.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python -# Zero specified fields in a UM file - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import argparse, sys -import umfile -from um_fileheaders import * - -parser = argparse.ArgumentParser(description="Set fields in UM file to zero") -parser.add_argument('-v', dest='var', type=int, default=None, - nargs = '+', help = 'List of stash codes to zero (default is all)') -parser.add_argument('file', help='File to process (overwritten)') - -args = parser.parse_args() - -f = umfile.UMFile(args.file, 'r+') - -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - break - if not args.var or ilookup[ITEM_CODE] in args.var: - print("Zeroing field", k, 'stash code', ilookup[ITEM_CODE]) - a = f.readfld(k) - a[:] = 0. - f.writefld(a,k) - -f.close() diff --git a/src/umfile_utils/umfile.py b/src/umfile_utils/umfile.py deleted file mode 100644 index 2b8f9a82..00000000 --- a/src/umfile_utils/umfile.py +++ /dev/null @@ -1,481 +0,0 @@ -from __future__ import print_function -from um_fileheaders import * -import numpy as np -from six.moves import builtins -import types - -class umfile_error(Exception): - pass - -class packerr(Exception): - pass - -class UMFile(): - # Should this inherit from io.something? - """ Extended version of file class that uses 8 byte words """ - - missval_i = -32768 - missval_r = -1073741824 - - def __init__(self, filename, mode=None): - if not mode: - mode = 'rb' - if not "b" in mode: - mode += "b" - self.fileobj = builtins.open(filename, mode) - if "r" in mode: - self.determine_file_type() - self.readheader() - self.readlookup() - self.sectorsize = self.getsectorsize() - self.mask = None - self.nland = None - - def close(self): - # Unless file was opened readonly, need to write the new header - # information before closing. - if not self.fileobj.mode == 'r': - self.writeheader() - self.writelookup() - self.fileobj.close() - - def wordseek(self,offset): - self.fileobj.seek(offset*self.wordsize) - - def wordread(self,size): - return self.fileobj.read(size*self.wordsize) - - def arraywrite(self,array): - # Could use tofile here, but no real advantage. - # Need to check whether the native format is big or little - # Here assuming little - if array.dtype.byteorder == self.byteorder: - return self.fileobj.write(array.tobytes()) - else: - return self.fileobj.write(array.byteswap().tobytes()) - - def determine_file_type(self): - # Get word length and byte order? - # Read first 16 bytes and try to interpret in various ways - self.fileobj.seek(0) - s = self.fileobj.read(16) - # For a UM fieldsfile, first word should be 20 and second 1, 2, or 4 - # For ancillary file first word -32768 - # Include = in the test to make output easier - self.fieldsfile = False - self.ppfile = False - for endian in ('=', '>', '<'): - h = np.fromstring(s,np.int64).newbyteorder(endian) - # print "testing 64 bit", h[:2] - if h[0] in [15, 20, -32768] and h[1] in (1, 2, 4): - self.byteorder = endian - self.wordsize = 8 - self.int = np.int64 - self.float = np.float64 - self.fieldsfile = True - return - h = np.fromstring(s,np.int32).newbyteorder(endian) - # print "testing 32 bit", h[:2] - if h[0] in [15, 20, -32768] and h[1] in (1, 2, 4): - self.byteorder = endian - self.wordsize = 4 - self.int = np.int32 - self.float = np.float32 - self.fieldsfile = True - return - if h[0] == 256: - self.byteorder = endian - self.wordsize = 4 - self.int = np.int32 - self.float = np.float32 - self.ppfile = True - return - raise umfile_error("Error - file type not determined") - - def readheader(self): - if not self.fieldsfile: - return - self.fileobj.seek(0) - # Fixed length header of length 256 - s = self.wordread(256) - self.fixhd = np.fromstring(s,self.int).newbyteorder(self.byteorder) - - # Integer constants - self.wordseek(self.fixhd[FH_IntCStart]-1) - nint = self.fixhd[FH_IntCSize] - s = self.wordread(nint) - self.inthead = np.fromstring(s,self.int).newbyteorder(self.byteorder) - - # Real constants - self.wordseek(self.fixhd[FH_RealCStart]-1) - nreal = self.fixhd[FH_RealCSize] - s = self.wordread(nreal) - self.realhead = np.fromstring(s,self.float).newbyteorder(self.byteorder) - - # Level dependent constants - if self.fixhd[FH_LevDepCStart] > 0: - self.wordseek(self.fixhd[FH_LevDepCStart]-1) - nlconst = self.fixhd[FH_LevDepCSize1]*self.fixhd[FH_LevDepCSize2] - s=self.wordread(nlconst) - self.levdep = np.fromstring(s,self.float).newbyteorder(self.byteorder) - self.levdep.shape=(self.fixhd[FH_LevDepCSize2],self.fixhd[FH_LevDepCSize1]) - - # Row dependent constants - if self.fixhd[FH_RowDepCStart] > 0: - self.wordseek(self.fixhd[FH_RowDepCStart]-1) - nlconst = self.fixhd[FH_RowDepCSize1]*self.fixhd[FH_RowDepCSize2] - s=self.wordread(nlconst) - self.rowdep = np.fromstring(s,self.float).newbyteorder(self.byteorder) - self.rowdep.shape=(self.fixhd[FH_RowDepCSize2],self.fixhd[FH_RowDepCSize1]) - - # Column dependent constants - if self.fixhd[FH_ColDepCStart] > 0: - self.wordseek(self.fixhd[FH_ColDepCStart]-1) - nlconst = self.fixhd[FH_ColDepCSize1]*self.fixhd[FH_ColDepCSize2] - s=self.wordread(nlconst) - # Should reshape this to a 2D array - self.coldep = np.fromstring(s,self.float).newbyteorder(self.byteorder) - self.coldep.shape=(self.fixhd[FH_ColDepCSize2],self.fixhd[FH_ColDepCSize1]) - - def getsectorsize(self): - # Calculate sectorsize as gcd of the data offsets. - # Assume it's not larger than default 2048 - sector = gcd(2048,self.fixhd[FH_DataStart] - 1) # Actual start off by 1. - for k in range(self.fixhd[FH_LookupSize2]): - if self.ilookup[k,LBEGIN] == -99: - break - sector = gcd(sector,self.ilookup[k,LBNREC]) - return sector - - def createheader(self, intsize, realsize, levdepdim1=0, levdepdim2=0): - # Create a standard header, given level dependent constants as arguments - # Lengths of other sections may be version dependent? - # Fixed length header of length 256 - self.fixhd = np.zeros(256,self.int) - - # Integer constants - self.inthead = np.zeros(intsize,self.int) - - # Real constants - self.realhead = np.zeros(realsize,self.float) - - # Level dependent constants - if levdepdim1 > 0 and levdepdim2 > 0: - self.levdep = np.zeros((levdepdim2,levdepdim1),self.float) - - def copyheader(self,f): - """Copy all the header properties from specified open file""" - - for attr in ["wordsize", "byteorder", "int", "float", "fieldsfile", - "ppfile"]: - setattr(self, attr, getattr(f,attr)) - - # Array attributes need to be copied. - for attr in ["fixhd", "realhead", "inthead"]: - setattr(self, attr, getattr(f,attr).copy()) - - # These ones need not exist - for attr in ["levdep", "rowdep", "coldep"]: - if hasattr(f, attr): - setattr(self, attr, getattr(f,attr).copy()) - - self.ilookup = f.ilookup.copy() - self.rlookup = f.rlookup.copy() - self.sectorsize = f.sectorsize - - def writeheader(self): - # Header must already be defined by copying or creating - # Fixed length header of length 256 - self.wordseek(0) - self.arraywrite(self.fixhd) - - # Integer constants - self.wordseek(self.fixhd[FH_IntCStart]-1) - self.arraywrite(self.inthead) - - # Real constants - self.wordseek(self.fixhd[FH_RealCStart]-1) - self.arraywrite(self.realhead) - - # Level dependent constants - if self.fixhd[FH_LevDepCStart] > 0: - self.wordseek(self.fixhd[FH_LevDepCStart]-1) - self.arraywrite(self.levdep) - - if self.fixhd[FH_RowDepCStart] > 0: - self.wordseek(self.fixhd[FH_RowDepCStart]-1) - self.arraywrite(self.rowdep) - - if self.fixhd[FH_ColDepCStart] > 0: - self.wordseek(self.fixhd[FH_ColDepCStart]-1) - self.arraywrite(self.coldep) - - - def readlookup(self): - lookdim1 = self.fixhd[FH_LookupSize1] - lookdim2 = self.fixhd[FH_LookupSize2] - # Read lookup - self.wordseek(self.fixhd[FH_LookupStart]-1) - s = self.wordread(lookdim1*lookdim2) - - # The lookup table has separate integer 1;45 and real 46-64 sections - # Simplest to have duplicate integer and real versions and just index - # into the appropriate parts - # Is it possible to make just make them views of the same data? - if lookdim1 != 64: - raise umfile_error("Unexpected lookup table dimension %d %d" % (lookdim1, lookdim2)) - - self.ilookup = np.reshape( np.fromstring(s, self.int).newbyteorder(self.byteorder), [lookdim2, lookdim1]) - self.rlookup = np.reshape( np.fromstring(s, self.float).newbyteorder(self.byteorder), [lookdim2, lookdim1]) - - def print_fixhead(self): - print("FIXED HEADER") - for i in range(256): - if i % 8 == 0: - print("%5d:" % i,end="") - if self.fixhd[i] == self.missval_i or self.fixhd[i] == self.missval_r: - # -32768 is integer missing value, -1073741824 is an FP NaN - print(" _",end="") - else: - print("%8d" % self.fixhd[i],end="") - if i % 8 == 7: - print() - - def getmask(self): - # Is it already defined - if self.mask != None: - return - # Get the land sea mask, code 30 - for k in range(self.fixhd[FH_LookupSize2]): - if self.ilookup[k,LBEGIN] == -99: - break - if self.ilookup[k,ITEM_CODE] == 30: - self.mask = self.readfld(k) - self.nland = np.sum(self.mask!=0) - return - raise packerr("Land sea mask required for packing/unpacking") - - def readfld(self, k, raw=False): - # Read field number k - ilookup = self.ilookup[k] - lbnrec = ilookup[LBNREC] # Size padded to record size - lblrec = ilookup[LBLREC] # Actual size w/o padding - lbegin = ilookup[LBEGIN] # lbegin is offset from start - - self.wordseek(lbegin) - s = self.wordread(lbnrec) - - if raw: - return s - - packing = [0, ilookup[LBPACK]%10, ilookup[LBPACK]//10 % 10, - ilookup[LBPACK]//100 % 10, ilookup[LBPACK]//1000 % 10, - ilookup[LBPACK]//10000] - if packing[1] == 0: - # IEEE at same precision as the file - nbytes = lblrec*self.wordsize - if ilookup[DATA_TYPE]==1: - dtype = self.float - else: - # Treat integer and logical together - dtype = self.int - elif packing[1] == 2: - # 32 bit IEEE - nbytes = lblrec*4 - if ilookup[DATA_TYPE]==1: - dtype = np.float32 - else: - dtype = np.int32 - else: - raise packerr("Packing with N1 = %d not supported" % packing[1]) - - if packing[2] == 0: - # No compression - npts = ilookup[LBNPT] - nrows = ilookup[LBROW] - # print "S", len(s), nbytes, len(np.fromstring(s[:nbytes], ftype)) - if nrows*npts == ilookup[LBLREC]: - # As expected - data = np.reshape( np.fromstring(s[:nbytes], dtype).newbyteorder(self.byteorder), [nrows, npts]) - else: - # There are some fields (accumulated runoff) that are packed to - # land points, but don't have packing set correctly - data = np.fromstring(s[:nbytes], dtype).newbyteorder(self.byteorder) - elif packing[2] == 2: - # Compressed using mask, nlon, nlat are the values from the land - # sea mask - if self.mask is None: - self.getmask() - nrows, npts = self.mask.shape - tmp = np.fromstring(s[:nbytes], dtype).newbyteorder(self.byteorder) - # Set output array to missing, forcing the missing value to the - # correct type. - data = np.zeros((nrows,npts), dtype) + np.array([self.missval_r], dtype) - if packing[3]==1: - # Use land mask (non-zero) values - # Should check the sizes match that expected - data.flat[self.mask.flat!=0] = tmp - else: - # Ocean values - data.flat[self.mask.flat==0] = tmp - else: - raise packerr("Packing with N2 = %d not supported - field code %d" % (packing[2],ilookup[ITEM_CODE])) - - return data - - def writefld(self, data, k, raw=False, overwrite=False): - # write the kth field - if overwrite: - filepos = self.ilookup[k,LBEGIN] - else: - if k==0: - filepos = self.fixhd[FH_DataStart] - 1 - else: - filepos = self.ilookup[k-1,LBEGIN] + self.ilookup[k-1,LBNREC] - self.wordseek(filepos) - - # If overwriting a field in an existing file don't change the header - if not overwrite: - self.ilookup[k,LBEGIN] = filepos - - # Need to set the output record size here - if self.fixhd[FH_Dataset] == 3: - # Fieldsfile, NADDR is relative to start of fixed length header - # (i.e. relative to start of file) - self.ilookup[k,NADDR] = filepos - else: - # Ancillary files behave like dumps? - # NADDR is relative to start of data. Note that this uses LBLREC - # so ignores the packing and the record padding. No relation to - # the actual disk address in LBEGIN. - if k == 0: - self.ilookup[k,NADDR] = 1 - else: - self.ilookup[k,NADDR] = self.ilookup[k-1,NADDR] + self.ilookup[k-1,LBLREC] - - - if raw: - # Data is just array of bytes - self.fileobj.write(data) - # Header is unchanged - return - else: - # Need to pack properly - packing = [0, self.ilookup[k,LBPACK]%10, self.ilookup[k,LBPACK]//10 % 10, - self.ilookup[k,LBPACK]//100 % 10, self.ilookup[k,LBPACK]//1000 % 10, - self.ilookup[k,LBPACK]//10000] - # First consider packing to land or sea points - if packing[2] == 0: - # No packing - packdata = data - elif packing[2] == 2: - if self.mask is None: - self.getmask() - # Need to restore the file pointer after the mask read - self.wordseek(filepos) - if packing[3]==1: - # Use land mask (non-zero) values - # Should check the sizes match that expected - packdata = data[self.mask!=0] - else: - # Ocean values - packdata = data[self.mask==0] - else: - raise packerr("Packing with N2 = %d not supported - field code %d" % (packing[2],self.ilookup[k,ITEM_CODE])) - - # Now write the data - # arraywrite could actually return the sizes? - lblrec = packdata.size - - self.arraywrite(packdata) - - if not overwrite: - # Make the sector size a variable? - self.ilookup[k,LBLREC] = lblrec - if packing[1] == 2 and self.wordsize == 8: - size = (lblrec+1)/2 - else: - size = lblrec - lbnrec = int(np.ceil(size/float(self.sectorsize))) * self.sectorsize - self.ilookup[k,LBNREC] = lbnrec - - def writelookup(self): - # lookdim1 = self.fixhd[FH_LookupSize1] - # lookdim2 = self.fixhd[FH_LookupSize2] - # For compatibility with the old version use the full size - lookdim2, lookdim1 = self.ilookup.shape - # Need to combine the ilookup and rlookup arrays to a single array - # Convert the float part to an integer array - lookup = np.fromstring(self.rlookup[:lookdim2,:].tobytes(),self.int).newbyteorder(self.byteorder) - # Now copy the true integer part on top - lookup.shape = (lookdim2, lookdim1) - lookup[:,:45] = self.ilookup[:,:45] - - self.wordseek(self.fixhd[FH_LookupStart]-1) - self.arraywrite(lookup) - - - -class Axis: - def __init__(self,name,values): - # Should check name is lat, lon or lev and that the values are - # appropriate for the axis type. - self.name = name - self.values = values - - def __eq__(self, a): - if self.name == a.name and len(self.values) == len(a.values): - return np.allclose(self.values, a.values) - else: - return False - -def gcd(a,b): - while a > 0: - c = b%a - b = a - a = c - return b - -class UniqueList(list): - # List without duplicates - def append(self,a): - if type(a) in [types.ListType,np.ndarray]: - for x in a: - if not x in self: - list.append(self,x) - else: - if not a in self: - list.append(self,a) - -class Grid: - def __init__(self, lon, lat, lev): - # Check that dimensions match - # Really only for timeseries? - if len(lat) == len(lon) == len(lev): - self.lon = lon - self.lat = lat - self.lev = lev - else: - raise umfile_error("Inconsistent grids") - - def __eq__(self, g): - if len(self.lon) == len(g.lon) and len(self.lat) == len(g.lat) and len(self.lev) == len(g.lev): - return np.allclose(self.lon, g.lon) and np.allclose(self.lat, g.lat) \ - and np.allclose(self.lev, g.lev) - else: - return False - -def isprog(ilookup): - # Check whether a STASH code corresponds to a prognostic variable. - # Section 33 is tracers, 34 is UKCA - # Also check whether variable is instantaneous, LBTIM < 10 - # No time processing ilookup[LBPROC] == 0 - # Not a time series LBCODE < 30000 - # Also 3100 - 3129 seem to be treated as prognostics - varcheck = ilookup[ITEM_CODE]//1000 in [0,33,34] or \ - 3100 <= ilookup[ITEM_CODE] <= 3129 - timecheck = ilookup[LBTIM] < 10 and ilookup[LBPROC] == 0 and ilookup[LBCODE] < 30000 - return varcheck and timecheck - -def istracer(ilookup): - return ilookup[ITEM_CODE]//1000 == 33 and ilookup[LBTIM] < 10 and ilookup[LBPROC] == 0 and ilookup[LBCODE] < 30000 diff --git a/src/umfile_utils/umv2netcdf.py b/src/umfile_utils/umv2netcdf.py deleted file mode 100644 index 92ebc55f..00000000 --- a/src/umfile_utils/umv2netcdf.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env python -# Convert UM fieldsfiles to netcdf -# This version works with rotated and/or variable grids -# Converts all fields in the file. - -# This is really designed for masks and orography. It doesn't handle -# vertical or time dimensions yet. - -# Martin Dix -# martin.dix@csiro.au - -import sys, getopt, datetime -import netCDF4 -import numpy as np -import umfile, stashvar -from um_fileheaders import * -from eqtoll import eqtoll - -if len(sys.argv)==3: - ifile = sys.argv[1] - ofile = sys.argv[2] -else: - print "Error - filename arguments expected" - print "Usage: umv2netcdf.py input_file output_file" - sys.exit(1) - -f = umfile.UMFile(ifile) -if not f.fieldsfile: - print "Input %s is not a UM fieldsfile" % ifile - sys.exit(1) - -# print "REAL HEADER", f.realhead -phi_pole = f.realhead[RC_PoleLat] -lambda_pole = f.realhead[RC_PoleLong] -dlon = f.realhead[RC_LongSpacing] -dlat = f.realhead[RC_LatSpacing] -lon0 = f.realhead[RC_FirstLong] -lat0 = f.realhead[RC_FirstLat] - -vargrid = False -if hasattr(f,"rowdep") and hasattr(f,"coldep"): - # Also need to check for missing values in real header? - print "Variable resolution grid" - vargrid = True - -nc_out = netCDF4.Dataset(ofile, "w", format="NETCDF3_CLASSIC") - -if vargrid: - nlon = f.coldep.shape[1] - nlat = f.rowdep.shape[1] -else: - nlon = f.inthead[IC_XLen] - nlat = f.inthead[IC_YLen] - -nc_out.createDimension('ix',nlon) -nc_out.createDimension('iy',nlat) - -lon = nc_out.createVariable('lon',np.float32,['iy', 'ix']) -lon.standard_name = 'longitude' -lon.units = 'degrees_east' - -lat = nc_out.createVariable('lat',np.float32,['iy', 'ix']) -lat.standard_name = 'latitude' -lat.units = 'degrees_north' - -# Mask file passed CF Checker 2.0.3 2012-03-29 -nc_out.Conventions = "CF-1.5" -nc_out.history = "%s: Created from %s using umv2netcdf.py" % (datetime.datetime.today().strftime('%Y-%m-%d %H:%M'), ifile) - -if not vargrid: - lonarray = lon0 + np.arange(nlon)*dlon - -# Should add a lon/lat bounds calculation here. -for j in range(nlat): - if vargrid: - phi, lam = eqtoll(f.rowdep[0,j],f.coldep[0],phi_pole,lambda_pole) - else: - phi, lam = eqtoll(lat0+j*dlat,lonarray,phi_pole,lambda_pole) - lon[j,:] = lam - lat[j,:] = phi - -# eqotll returns longitudes in range (0, 360) -# Some plotting packages many have problems with regions crossing zero meridian -# so shift these back to -180 to 180 range -if lon[0,0] > lon[0,-1]: - # region contains a 360 to 0 wrap around - lon[:] = np.where(lon[:] > 180., lon[:] - 360., lon[:]) - -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] - if lbegin == -99: - break - - data = f.readfld(k) - - var = stashvar.StashVar(ilookup[ITEM_CODE],ilookup[MODEL_CODE]) - newvar = nc_out.createVariable(var.name,np.float32,['iy','ix']) - if var.standard_name: - newvar.standard_name = var.standard_name - newvar.long_name = var.long_name - if var.units: - newvar.units = var.units - newvar.missing_value = -2.**30 - newvar[:] = data[:] - -nc_out.close() diff --git a/src/umfile_utils/umv2reg.py b/src/umfile_utils/umv2reg.py deleted file mode 100644 index 24ea685f..00000000 --- a/src/umfile_utils/umv2reg.py +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env python - -# Extract the regular grid part from a variable grid UM file - -# The regular region on the U and V grids is one point smaller than -# the P grid. - -# In a variable resolution dump file there's no information to tell -# whether a field is on the U, V or P grid. -# This can only come from reading the STASHmaster file, so must give suitable -# one as an argument. - -# Martin Dix martin.dix@csiro.au - -import numpy as np -import getopt, sys -import umfile -from um_fileheaders import * -import read_stashmaster - -def usage(): - print "Usage: umv2reg [-v] -i ifile -o ofile -s STASHmaster" - sys.exit(2) - -verbose = False -ifile = None -ofile = None -stashmaster = None -try: - optlist, args = getopt.getopt(sys.argv[1:], 'i:o:s:v') - for opt in optlist: - if opt[0] == '-i': - ifile = opt[1] - elif opt[0] == '-o': - ofile = opt[1] - elif opt[0] == '-s': - stashmaster = opt[1] - elif opt[0] == '-v': - verbose = True -except getopt.error: - usage() - -if not (ifile and ofile and stashmaster): - print "Missing arguments" - usage() - -stashd = read_stashmaster.read_stash(stashmaster) - -f = umfile.UMFile(ifile) - -phi_pole = f.realhead[RC_PoleLat] -lambda_pole = f.realhead[RC_PoleLong] -dlon = f.realhead[RC_LongSpacing] -dlat = f.realhead[RC_LatSpacing] -lon0 = f.realhead[RC_FirstLong] -lat0 = f.realhead[RC_FirstLat] - -# Variable grid file has dlon, dlat = missing value -if not dlon == dlat == lon0 == lat0 == f.missval_r: - raise Exception("Input file does not use variable grid") - -if not (hasattr(f,"rowdep") and hasattr(f,"coldep")): - raise Exception("Input file missing variable grid lat/lon") - -nlon = f.coldep.shape[1] -nlat = f.rowdep.shape[1] - -# Find the regular grid spacing -# Ancillary file may only have P grid values -# If U and V values are present they're half a grid point to N and E. -deltalon = f.coldep[0,1:] - f.coldep[0,:-1] -deltalat = f.rowdep[0,1:] - f.rowdep[0,:-1] - -dlon = deltalon.min() -dlat = deltalat.min() -# Find first and last grid indices with this spacing -indices = np.arange(nlon)[abs(deltalon-dlon) < 2e-5] -lon1 = indices[0] # Start of grid, first point s.t. lon(i+1) - lon(i) = dlon -lon2 = indices[-1] + 1 -nx = lon2 - lon1 + 1 - -indices = np.arange(nlat)[abs(deltalat-dlat) < 2e-5] -lat1 = indices[0] # Start of grid, first point s.t. lat(i+1) - lat(i) = dlat -lat2 = indices[-1] + 1 -ny = lat2 - lat1 + 1 - -# Recalculate the regular grid spacing using the full range for more accuracy -# (necessary for 32 bit files). -dlon = (f.coldep[0,lon2]-f.coldep[0,lon1]) / (lon2-lon1) -dlat = (f.rowdep[0,lat2]-f.rowdep[0,lat1]) / (lat2-lat1) -# Get sensibly rounded values -dlon = round(dlon.min(),6) -dlat = round(dlat.min(),6) -print "Grid spacing", dlon, dlat -print "Regular region", f.coldep[0,lon1], f.coldep[0,lon2], f.rowdep[0,lat1], f.rowdep[0,lat2] -print "Regular grid size", nx, ny -# If this is done correctly it should be symmetrical -if not (nlon-1-lon2 == lon1 and nlat-1-lat2 == lat1): - raise Exception("Regular resolution region is not symmetrical") - -g = umfile.UMFile(ofile, "w") -g.copyheader(f) - -# No row and column depedent constants in the regular grid file -g.fixhd[FH_RowDepCStart:FH_ColDepCSize2+1] = g.missval_i -# Change the grid values in the output header to match the chosen origin and -# size -g.inthead[IC_XLen] = nx -g.inthead[IC_YLen] = ny -g.realhead[RC_FirstLat] = f.rowdep[0,lat1] - dlat # This is "zeroth" point -g.realhead[RC_FirstLong] = f.coldep[0,lon1] - dlon -g.realhead[RC_LongSpacing] = dlon -g.realhead[RC_LatSpacing] = dlat - -# Start by trying to read the land-sea mask, field 30 -try: - f.getmask() - # Mask on the regular region - g.mask = f.mask[lat1:lat1+ny,lon1:lon1+ny] -except umfile.packerr: - pass - -# Loop over all the fields -kout = 0 -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - lbegin = ilookup[LBEGIN] # lbegin is offset from start - if lbegin == -99: - # End of data - break - if ilookup[LBCODE] == f.missval_i: - # There are some files with variables code in headers but much - # of the rest of the data missing - print "Header data missing", ilookup[ITEM_CODE] - continue - if verbose: - print k, ilookup[ITEM_CODE] - npts = ilookup[LBNPT] - nrows = ilookup[LBROW] - # Look at the STASHmaster grid value for this item code to check which - # grid it's on. There's no way to tell purely from the variable grid - # fieldsfile. - gridcode = stashd[ilookup[ITEM_CODE]]['grid'] - if gridcode in (1,2,3,21,22): - # theta points, including packed to land or ocean - # ozone grid also (same as theta?) - lon0 = g.realhead[RC_FirstLong] - lat0 = g.realhead[RC_FirstLat] - nxv = nx - nyv = ny - elif gridcode == 18: - # U - lon0 = f.coldep[1,lon1] - dlon - lat0 = g.realhead[RC_FirstLat] - nxv = nx-1 - nyv = ny - elif gridcode == 19: - # U - lon0 = g.realhead[RC_FirstLong] - lat0 = f.rowdep[1,lat1] - dlat - nxv = nx - nyv = ny-1 - else: - print "Skipping variable %d with grid %d" % (ilookup[ITEM_CODE], gridcode) - continue - - # Currently have a copy of the input header - # Set modified output grid for this field - g.ilookup[kout,LBCODE] = 101 # Standard rotated grid - - # Could set this in the writing routing from the array size? - g.ilookup[kout,LBROW] = nyv - g.ilookup[kout,LBNPT] = nxv - g.ilookup[kout,LBLREC] = nxv*nyv - g.rlookup[kout,BZY] = lat0 - g.rlookup[kout,BZX] = lon0 - g.rlookup[kout,BDY] = dlat - g.rlookup[kout,BDX] = dlon - - data = f.readfld(k) - newdata = data[lat1:lat1+nyv,lon1:lon1+nxv] - g.writefld(newdata,kout) - kout += 1 - -g.close() diff --git a/src/umfile_utils/valid_times.py b/src/umfile_utils/valid_times.py deleted file mode 100644 index e8e60437..00000000 --- a/src/umfile_utils/valid_times.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python - -# List of valid data times in a file - -from um_fileheaders import * -import umfile, sys, collections, datetime - -f = umfile.UMFile(sys.argv[1]) - -times=collections.defaultdict(int) - -for k in range(f.fixhd[FH_LookupSize2]): - ilookup = f.ilookup[k] - if ilookup[LBEGIN] == -99: - break - if ilookup[LBREL] >= 3: - # Second field introduced from vn 8.1 - t = datetime.datetime(ilookup[LBYR], ilookup[LBMON], - ilookup[LBDAT], ilookup[LBHR], - ilookup[LBMIN], ilookup[LBSEC]) - else: - t = datetime.datetime(ilookup[LBYR], ilookup[LBMON], - ilookup[LBDAT], ilookup[LBHR], - ilookup[LBMIN], 0) - times[t] += 1 - -print "Valid_times", -for t in sorted(times.keys()): - print t.strftime('%Y%m%d%H%M'), -print - -if len(set(times.values())) > 1: - print "Warning - not all times have same number of fields" diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index 028b2048..ef8e301d 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -1,72 +1,138 @@ -import pytest -import sys -from perturbIC import parse_args, create_random_generator, remove_timeseries, is_field_to_perturb, create_default_outname, create_perturbation, AdditionOperator -from unittest.mock import Mock, MagicMock +from copy import deepcopy +from unittest.mock import MagicMock, patch + +import mule # noqa: F401 import numpy as np -import numpy.random as rs +import pytest +from hypothesis import HealthCheck, given, settings +from hypothesis import strategies as st +from hypothesis.extra import numpy as stnp +from numpy.random import PCG64, Generator, choice, default_rng + +from umfile_utils.perturbIC import ( + TIMESERIES_LBCODES, + AdditionOperator, + create_default_outname, + create_perturbation, + create_random_generator, + is_field_to_perturb, + main, + parse_args, + remove_timeseries, + void_validation, +) +# Hypothesis settings to reuse in multiple tests +ARRAY_SHAPES = stnp.array_shapes(min_dims=2, max_dims=2, min_side=1, max_side=200) +ARRAY_DTYPES = stnp.floating_dtypes(sizes=(32, 64)) +ARRAY_ELEMENTS = st.floats(min_value=-1e10, max_value=1e10) # Set to avoid overflow +# Set max examples for hypothesis globally +settings.register_profile("default", max_examples=30) +settings.load_profile("default") @pytest.fixture -def mock_command_line(): - """ - This function create a callable command line input - - Outputs - list - Command line arguements - """ - return ["perturbIC.py", "-a", "0.4", "-s", "23452", - "~/example/path/to/the/file/restart_dump.astart"] +def create_mock_umfile(): + def _mock_umfile(): + """Factory function to create a mule UMfile mock object and initialize it with empty fields.""" + return MagicMock(fields=[]) + + return _mock_umfile + @pytest.fixture -def mock_perturbation(): - """ - This function create a callable perturbation dimensions - - Outputs - nlon - int - nlat - int - """ +def create_mock_field(): + """Factory function to create a mule field mock object.""" - nlon = 192 - nlat = 145 + def _create_field(lbcode=0): + return MagicMock( + lbcode=lbcode, + ) + return _create_field - return nlon, nlat -@pytest.fixture -def mock_metadata(): - """ - This function create a callable metadata +def test_parse_args_default_args(): + """Test with default arguments.""" + test_args = ["perturbIC", "test_input_file"] + with patch("sys.argv", test_args): + args = parse_args() + assert args.ifile == "test_input_file" + assert args.amplitude == 0.01 + assert args.seed is None + assert not args.validate + assert args.output_path is None - Outputs - list - Command line arguements - """ - # Mock fields with different lbuser4 values - field_theta = MagicMock() - field_not_theta = MagicMock() +def test_parse_args_all_arguments(): + """Test with all arguments provided.""" + test_args = ["perturbIC", "test_input_2", "-a", "0.5", "-s", "123", "--validate", "-o", "test_output_1"] + with patch("sys.argv", test_args): + args = parse_args() + assert args.ifile == "test_input_2" + assert args.amplitude == 0.5 + assert args.seed == 123 + assert args.validate + assert args.output_path == "test_output_1" - # Correctly set the lbuser4 attribute - field_theta.lbuser4 = 4 - field_not_theta.lbuser4 = 56 - stash_code = 4 - return field_theta, field_not_theta, stash_code +def test_create_random_generator_no_argument(): + """Test the random generator creation without a seed.""" + rng = create_random_generator() + assert isinstance(rng, Generator) + assert not np.all(rng.random(10) == Generator(PCG64(None)).random(10)) -def test_parse_args(monkeypatch, mock_command_line): - """ - This function tests the parse_args function with the fake commandline arguments - Inputs - fixture - A class of helpful methods for mock data - fixture - A list of command line arguements - Outputs - The results of assertion tests. - """ - monkeypatch.setattr(sys, "argv", mock_command_line) - args = parse_args() - assert args.amplitude == 0.4 - assert args.seed == 23452 - assert args.ifile == "~/example/path/to/the/file/restart_dump.astart" +@given(seed=st.integers(min_value=0)) +def test_create_random_generator_with_seed(seed): + """Test the random generator creation with a positive seed.""" + rng = create_random_generator(seed) + assert isinstance(rng, Generator) + assert np.all(rng.random(10) == Generator(PCG64(seed)).random(10)) + + +def test_create_random_generator_negative_seed(): + """Test that a negative seed raises a ValueError.""" + with pytest.raises(ValueError): + create_random_generator(-1) + + +@pytest.mark.parametrize( + # description of the arguments + "init_fields_lbcodes, result_fields_indeces, result_fields_length", + [ + # Case 1: UM file with mixed fields + ( + [1, 2, choice(TIMESERIES_LBCODES), 3, choice(TIMESERIES_LBCODES), choice(TIMESERIES_LBCODES), 4], + [0, 1, 3, 6], + 4, + ), + # Case 2: UM file with no timeseries fields + ( + [1, 2, 3, 4, 5], + [0, 1, 2, 3, 4], + 5, + ), + # Case 3: UM file with all timeseries fields + ([choice(TIMESERIES_LBCODES) for _ in range(8)], [], 0), + # Case 4: UM file with no fields + ([], [], 0), + ], + ids=[ + "mixed", + "no_timeseries", + "all_timeseries", + "no_fields", + ], +) +def test_remove_timeseries_( + init_fields_lbcodes, result_fields_indeces, result_fields_length, create_mock_umfile, create_mock_field +): + """Test remove_timeseries function when the UM file has no timeseries fields.""" + mock_umfile = create_mock_umfile() + mock_umfile.fields = [create_mock_field(lbcode) for lbcode in init_fields_lbcodes] + result = remove_timeseries(mock_umfile) + assert len(result.fields) == result_fields_length + assert result.fields == [mock_umfile.fields[ind] for ind in result_fields_indeces] + @pytest.mark.parametrize( # description of the arguments @@ -76,7 +142,7 @@ def test_parse_args(monkeypatch, mock_command_line): ([], "testfilename", "testfilename_perturbed"), # Case 2: Filename with suffix exists, returns filename with suffix appending 1 (["testfilename_perturbed"], "testfilename", "testfilename_perturbed1"), - # Case 3: Filename with suffix and a few numbered versions exist, returns + # Case 3: Filename with suffix and a few numbered versions exist, returns # filename with suffix and the first numbered version that doesn't exist ( ["testfilename_perturbed", "testfilename_perturbed1", "testfilename_perturbed2"], @@ -84,6 +150,11 @@ def test_parse_args(monkeypatch, mock_command_line): "testfilename_perturbed3", ), ], + ids=[ + "file_do_not_exist", + "file_exists", + "multiple_files_exist", + ], ) @patch("os.path.exists") def test_create_default_outname_suffix_not_passed(mock_exists, existing_files, filename, expected_output): @@ -96,6 +167,7 @@ def test_create_default_outname_suffix_not_passed(mock_exists, existing_files, f result = create_default_outname(filename) assert result == expected_output + @patch("os.path.exists") def test_create_default_outname_suffix_passed(mock_exists): """ @@ -109,99 +181,280 @@ def test_create_default_outname_suffix_passed(mock_exists): expected_output = "testfilenametestsuffix" assert result == expected_output -def test_remove_timeseries(): - - # Mock fields and their lbcode values - field1 = MagicMock() - field2 = MagicMock() - field3 = MagicMock() - field1.lbcode = 23 - field2.lbcode = 345 - field3.lbcode = 31320 - - # Mock the fields file - test_fields = MagicMock() - test_fields.fields = [field1, field2, field3] - - # Mock the copy method to return a new object (to simulate deep copy behavior) - copied_fields = MagicMock() - copied_fields.fields = test_fields.fields.copy() - test_fields.copy.return_value = copied_fields - # Run the function - out_fields = remove_timeseries(test_fields) - - # Assertions - assert len(out_fields.fields) == 2 - assert field1 in out_fields.fields - assert field2 in out_fields.fields - assert field3 not in out_fields.fields - - -def test_create_perturbation(monkeypatch, mock_command_line, mock_perturbation): +@given( + shape=ARRAY_SHAPES, + amplitude=st.floats(min_value=0, max_value=1e300), # max_value is set to avoid overflow +) +def test_create_perturbation(shape, amplitude): + """Test create_perturbation.""" + rng = default_rng() + perturbation = create_perturbation(amplitude, rng, shape) + # Test that the created perturbation has the correct shape. + assert perturbation.shape == shape + # Test that the created perturbation is in the correct range. + assert np.all(perturbation >= -amplitude) + assert np.all(perturbation <= amplitude) + # Test that nullify_poles is true and first and last row (north and south poles) are 0 + assert np.all(perturbation[0, :] == 0) + assert np.all(perturbation[-1, :] == 0) + + +def test_create_perturbation_preserve_poles(): + """Test create_perturbation with nullify_poles=False.""" + shape = (10, 20) + amplitude = 3.0 + rng = default_rng() + perturbation = create_perturbation(amplitude, rng, shape, nullify_poles=False) + # Test that the created perturbation has the correct shape. + assert perturbation.shape == shape + # Test that the created perturbation is in the correct range. + assert np.all(perturbation >= -amplitude) + assert np.all(perturbation <= amplitude) + # Test that nullify_poles is false and first and last row are not all 0 + assert not np.all(perturbation[0, :] == 0) + assert not np.all(perturbation[-1, :] == 0) + + +@given(seed=st.integers(min_value=0)) +def test_create_perturbation_deterministic(seed): + """Test if the perturbation is deterministic with a fixed random seed.""" + amplitude = 1.0 + shape = (13, 7) + rng1 = np.random.default_rng(seed) + perturbation1 = create_perturbation(amplitude, rng1, shape) + rng2 = np.random.default_rng(seed) + perturbation2 = create_perturbation(amplitude, rng2, shape) + # Test that the results are identical + np.testing.assert_array_equal(perturbation1, perturbation2) + + +@given(lbuser4=st.integers(), stash_to_perturb=st.integers()) +def test_is_field_to_perturb_hypothesis(lbuser4, stash_to_perturb): """ - This function tests the create_perturbation function with the fake commandline arguments - Inputs - fixture - A class of helpful methods for mock data - fixture - A list of command line arguements - Outputs - The results of assertion tests. + Hypothesis test to check the behavior of is_field_to_perturb with various + combinations of lbuser4 and stash_to_perturb. """ - - amplitude = 0.4 - seed = 123 - rs = create_random_generator(seed) - nlon, nlat = mock_perturbation - - perturb = create_perturbation(amplitude, rs, [nlat, nlon]) - assert perturb.shape == (nlat,nlon) - -def test_is_field_to_perturb(mock_metadata): - + # Create a mock mule.Field object + mock_field = MagicMock() + mock_field.lbuser4 = lbuser4 + + # Check if the function returns True when values match, and False otherwise + expected_result = lbuser4 == stash_to_perturb + assert is_field_to_perturb(mock_field, stash_to_perturb) == expected_result + + +def test_void_validation(capfd): + """Test that the void_validation function doesn't do anything but printing a message to stdout, for any input arguments.""" + args = [1, "test", None, False] + kwargs = {"a": 1, "b": "test", "c": None, "d": False} + init_args = deepcopy(args) + init_kwargs = deepcopy(kwargs) + result = void_validation(*args, **kwargs) + # Capture the output + captured = capfd.readouterr() + # Test output message to stdout + assert ( + captured.out.strip() == 'Skipping mule validation. To enable the validation, run using the "--validate" option.' + ) + # Test no output message to stderr + assert captured.err == "" + # Test no return value + assert result is None + # Test no side effects for input arguments + assert args == init_args + assert kwargs == init_kwargs + + +class TestAdditionOperator: + """Test the AdditionOperator class.""" + +<<<<<<< HEAD +@pytest.mark.parametrize( + # description of the arguments + "existing_files, filename, expected_output", + [ + # Case 1: Filename with suffix doesn't exist, return filename with suffix + ([], "testfilename", "testfilename_perturbed"), + # Case 2: Filename with suffix exists, returns filename with suffix appending 1 + (["testfilename_perturbed"], "testfilename", "testfilename_perturbed1"), + # Case 3: Filename with suffix and a few numbered versions exist, returns + # filename with suffix and the first numbered version that doesn't exist + ( + ["testfilename_perturbed", "testfilename_perturbed1", "testfilename_perturbed2"], + "testfilename", + "testfilename_perturbed3", + ), + ], +) +@patch("os.path.exists") +def test_create_default_outname_suffix_not_passed(mock_exists, existing_files, filename, expected_output): """ - Tests the item code conditional - - Inputs - fixture - A fake list of arrays and a fake index - Outputs - The results of assertion tests. + Test the function that creates the default output file name, without passing a suffix. + 3 cases tested with pytest.mark.parametrize. """ + # Mock os.path.exists to simulate the presence of specific files + mock_exists.side_effect = lambda f: f in existing_files + result = create_default_outname(filename) + assert result == expected_output - field_theta, field_not_theta, stash_code = mock_metadata - - # Assertions to verify the function's behavior - assert is_field_to_perturb(field_theta, stash_code) == True, "field_theta should match the stash_code" - assert is_field_to_perturb(field_not_theta, stash_code) == False, "field_not_theta should not match the stash_code" - - -def test_operator_initialization(): +@patch("os.path.exists") +def test_create_default_outname_suffix_passed(mock_exists): """ - Test the addition operator.. - - Outputs - The results of testing if the peturbation intialize worked - + Test the function that creates the default output file name, passing a custom suffix. """ + # Mock os.path.exists to simulate the presence of specific files + mock_exists.return_value = False + filename = "testfilename" + suffix = "testsuffix" + result = create_default_outname(filename, suffix) + expected_output = "testfilenametestsuffix" + assert result == expected_output +======= + @given(array=stnp.arrays(dtype=ARRAY_DTYPES, shape=ARRAY_SHAPES, elements=ARRAY_ELEMENTS)) + def test_addition_operator_init(self, array): + """Test the initialization of the AdditionOperator class.""" + operator = AdditionOperator(array) + assert operator.array.shape == array.shape + np.testing.assert_array_equal(operator.array, array) + + def test_addition_operator_new_field(self, create_mock_field): + """Test the new_field method of the AdditionOperator class.""" + array = np.array([1, 2, 3]) + operator = AdditionOperator(array) + source_field = create_mock_field() + # Mock the copy method to return the same source_field + source_field.copy.return_value = source_field + new_field = operator.new_field(source_field) # noqa: F841 + # Ensure that the copy method was called on the source_field + source_field.copy.assert_called_once() +>>>>>>> b71310c (Updated unit-testing) + + @given( + array=stnp.arrays( + dtype=st.shared(ARRAY_DTYPES, key="dtype"), + shape=st.shared(ARRAY_SHAPES, key="shape"), + elements=ARRAY_ELEMENTS, + ), + source_data=stnp.arrays( + dtype=st.shared(ARRAY_DTYPES, key="dtype"), + shape=st.shared(ARRAY_SHAPES, key="shape"), + elements=ARRAY_ELEMENTS, + ), + ) + @settings(suppress_health_check=[HealthCheck.function_scoped_fixture]) + def test_addition_operator_transform_valid_shapes(self, array, source_data, create_mock_field): + """Test the transform method of the AdditionOperator class, with valid shapes.""" + + operator = AdditionOperator(array) + source_field = create_mock_field() + source_field.get_data.return_value = source_data # Mock the get_data method to return source_data + new_field = create_mock_field() + result = operator.transform(source_field, new_field) + expected_result = source_data + array + np.testing.assert_array_equal(result, expected_result) + + def test_addition_operator_transform_incompatible_shapes(self, create_mock_field): + """Test the transform method of the AdditionOperator class, with incompatible shapes.""" + array = np.array([[1, 2, 3], [4, 5, 6]]) # Shape (2, 3) + array_shape = array.shape + operator = AdditionOperator(array) + source_field = create_mock_field() + source_data = np.array([[5, 6], [7, 8]]) # Shape (2, 2) + field_shape = source_data.shape + source_field.get_data.return_value = source_data + with pytest.raises(ValueError) as excmsg: + operator.transform(source_field, create_mock_field()) + assert ( + excmsg + == f"Array and field could not be broadcast together with shapes {array_shape} and {field_shape}." + ) + + +@patch("umfile_utils.perturbIC.parse_args") +@patch("umfile_utils.perturbIC.create_default_outname") +@patch("umfile_utils.perturbIC.create_random_generator") +@patch("umfile_utils.perturbIC.void_validation") +@patch("mule.DumpFile") +@patch("umfile_utils.perturbIC.remove_timeseries") +@patch("umfile_utils.perturbIC.is_field_to_perturb") +@patch("umfile_utils.perturbIC.create_perturbation") +@patch("umfile_utils.perturbIC.AdditionOperator") +def test_main( + mock_addition_operator, + mock_create_perturbation, + mock_is_field_to_perturb, + mock_remove_timeseries, + mock_dumpfile, + mock_void_validation, + mock_create_random_generator, + mock_create_default_outname, + mock_parse_args, + create_mock_umfile, + create_mock_field, +): + """Test the main function.""" + lbcode_to_perturb = 1234 + + # Mock the return value of parse_args + mock_args = MagicMock( + ifile="test_input_file", + amplitude=0.01, + seed=123, + validate=False, + output_path=None, + ) + mock_parse_args.return_value = mock_args + + # Mock the return value of mule.DumpFile.from_file + mock_ff = create_mock_umfile() + mock_ff.fields = [ + create_mock_field(lbcode=lbcode_to_perturb), + create_mock_field(lbcode=1), + create_mock_field(lbcode=2), + ] + test_data = np.array([[1, 2, 3], [4, 5, 6]]) + mock_ff.fields[0].get_data.return_value = test_data + mock_dumpfile.from_file.return_value = mock_ff + + # Mock the return value of remove_timeseries + mock_remove_timeseries.return_value = mock_ff + + # Mock is_field_to_perturb + mock_is_field_to_perturb.side_effect = lambda field, stash: field.lbcode == lbcode_to_perturb + + mock_ff.to_file.side_effect = lambda _: mock_dumpfile.validate() + + main() - # Mock the source field - source_field = MagicMock() - source_field.get_data.return_value = np.array([[1, 2], [3, 4]]) - - # Mock the new field - new_field = MagicMock() - - # Array to add - array_to_add = np.array([[10, 20], [30, 40]]) - - # Create the operator - operator = AdditionOperator(array_to_add) - - # Test transform method - result = operator.transform(source_field, new_field) - - # Expected output - expected = np.array([[11, 22], [33, 44]]) + # Assertions + mock_parse_args.assert_called_once() + mock_create_default_outname.assert_called_once_with(mock_args.ifile) + mock_create_random_generator.assert_called_once_with(mock_args.seed) + mock_void_validation.assert_called_once() + mock_dumpfile.from_file.assert_called_once_with(mock_args.ifile) + mock_remove_timeseries.assert_called_once_with(mock_ff) + mock_is_field_to_perturb.assert_called() + mock_create_perturbation.assert_called_once_with( + mock_args.amplitude, + mock_create_random_generator.return_value, + test_data.shape, + ) + mock_addition_operator.assert_called_once_with(mock_create_perturbation.return_value) + mock_ff.to_file.assert_called_once_with(mock_create_default_outname.return_value) + + # Case with validation enabled and output path provided + # Reset mock calls and mock_dumpfile.validate + mock_create_default_outname.reset_mock() + mock_void_validation.reset_mock() + mock_dumpfile.validate = MagicMock() + + # Set the validate flag to True and provide an output path + mock_args.validate = True + mock_args.output_path = "test_output_file" + main() # Assertions - np.testing.assert_array_equal(result, expected) - + mock_void_validation.assert_not_called() + mock_create_default_outname.assert_not_called() + From c47e568a91448c00b16c2e375636c754bdd1c76f Mon Sep 17 00:00:00 2001 From: Davide Marchegiani Date: Tue, 3 Dec 2024 08:10:53 +1100 Subject: [PATCH 134/138] Modified pyptoject.toml to include additional options for pytest runs. --- pyproject.toml | 3 ++- tests/perturbIC_test.py | 44 ----------------------------------------- 2 files changed, 2 insertions(+), 45 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 58659bdd..a59f7ece 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,4 +39,5 @@ tag_prefix = "" parentdir_prefix = "umfile-utils-" [tool.pytest.ini_options] -pythonpath = "src" \ No newline at end of file +pythonpath = "src" +addopts = "--cov=src --cov-report=term-missing" \ No newline at end of file diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index ef8e301d..cca6909d 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -268,49 +268,6 @@ def test_void_validation(capfd): class TestAdditionOperator: """Test the AdditionOperator class.""" - -<<<<<<< HEAD -@pytest.mark.parametrize( - # description of the arguments - "existing_files, filename, expected_output", - [ - # Case 1: Filename with suffix doesn't exist, return filename with suffix - ([], "testfilename", "testfilename_perturbed"), - # Case 2: Filename with suffix exists, returns filename with suffix appending 1 - (["testfilename_perturbed"], "testfilename", "testfilename_perturbed1"), - # Case 3: Filename with suffix and a few numbered versions exist, returns - # filename with suffix and the first numbered version that doesn't exist - ( - ["testfilename_perturbed", "testfilename_perturbed1", "testfilename_perturbed2"], - "testfilename", - "testfilename_perturbed3", - ), - ], -) -@patch("os.path.exists") -def test_create_default_outname_suffix_not_passed(mock_exists, existing_files, filename, expected_output): - """ - Test the function that creates the default output file name, without passing a suffix. - 3 cases tested with pytest.mark.parametrize. - """ - # Mock os.path.exists to simulate the presence of specific files - mock_exists.side_effect = lambda f: f in existing_files - result = create_default_outname(filename) - assert result == expected_output - -@patch("os.path.exists") -def test_create_default_outname_suffix_passed(mock_exists): - """ - Test the function that creates the default output file name, passing a custom suffix. - """ - # Mock os.path.exists to simulate the presence of specific files - mock_exists.return_value = False - filename = "testfilename" - suffix = "testsuffix" - result = create_default_outname(filename, suffix) - expected_output = "testfilenametestsuffix" - assert result == expected_output -======= @given(array=stnp.arrays(dtype=ARRAY_DTYPES, shape=ARRAY_SHAPES, elements=ARRAY_ELEMENTS)) def test_addition_operator_init(self, array): """Test the initialization of the AdditionOperator class.""" @@ -328,7 +285,6 @@ def test_addition_operator_new_field(self, create_mock_field): new_field = operator.new_field(source_field) # noqa: F841 # Ensure that the copy method was called on the source_field source_field.copy.assert_called_once() ->>>>>>> b71310c (Updated unit-testing) @given( array=stnp.arrays( From 633537f74cdf7fd3e4c89cd91d6f8c26e5e43ace Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Tue, 3 Dec 2024 09:39:58 +1100 Subject: [PATCH 135/138] Update perturbIC_test.py Update to unit tests Update perturbIC.py --- src/umfile_utils/perturbIC.py | 2 +- tests/perturbIC_test.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/umfile_utils/perturbIC.py b/src/umfile_utils/perturbIC.py index fc152a42..38de28da 100644 --- a/src/umfile_utils/perturbIC.py +++ b/src/umfile_utils/perturbIC.py @@ -11,7 +11,7 @@ def parse_args(): """ - Parse the command line arguments. + Parse the command line arguments. Parameters ---------- diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index cca6909d..40caecbb 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -38,7 +38,7 @@ def _mock_umfile(): return _mock_umfile - +#This section sets up the testing for the parse args @pytest.fixture def create_mock_field(): """Factory function to create a mule field mock object.""" @@ -134,6 +134,7 @@ def test_remove_timeseries_( assert result.fields == [mock_umfile.fields[ind] for ind in result_fields_indeces] +#This section tests the output file creation. @pytest.mark.parametrize( # description of the arguments "existing_files, filename, expected_output", From 370cab90382a9bd12ee5886f558d9e50cab54b1a Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Mon, 20 Jan 2025 14:50:06 +1100 Subject: [PATCH 136/138] Update perturbIC_test.py It was failing dues to hypothesis.errors.InvalidArgument: --- tests/perturbIC_test.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/perturbIC_test.py b/tests/perturbIC_test.py index 40caecbb..ed180792 100644 --- a/tests/perturbIC_test.py +++ b/tests/perturbIC_test.py @@ -25,7 +25,16 @@ # Hypothesis settings to reuse in multiple tests ARRAY_SHAPES = stnp.array_shapes(min_dims=2, max_dims=2, min_side=1, max_side=200) ARRAY_DTYPES = stnp.floating_dtypes(sizes=(32, 64)) -ARRAY_ELEMENTS = st.floats(min_value=-1e10, max_value=1e10) # Set to avoid overflow +# Set to avoid overflow +ARRAY_ELEMENTS = st.floats( + min_value=-1e10, + max_value=1e10, + allow_nan=False, # Disallow NaN + allow_infinity=False, # Disallow Infinity + allow_subnormal=False, # Disallow subnormal floats + width=32 # Ensure compatibility with float32 or float64 +) + # Set max examples for hypothesis globally settings.register_profile("default", max_examples=30) settings.load_profile("default") From 70d772fad470989d75ab56fe9a6e2c4ed5237f37 Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Fri, 24 Jan 2025 08:24:56 +1100 Subject: [PATCH 137/138] Update src/umfile_utils/perturbIC.py Co-authored-by: Davide Marchegiani --- src/umfile_utils/perturbIC.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/umfile_utils/perturbIC.py b/src/umfile_utils/perturbIC.py index 38de28da..21ce8bae 100644 --- a/src/umfile_utils/perturbIC.py +++ b/src/umfile_utils/perturbIC.py @@ -201,7 +201,7 @@ def main(): # Skip mule validation if the "--validate" option is provided if not args.validate: - mule.DumpFile.validate = void_validation + ff.validate = void_validation ff_raw = mule.DumpFile.from_file(args.ifile) From e8a0be2f78483a1b6fedc49bf9493747bd95977e Mon Sep 17 00:00:00 2001 From: Lindsey Oberhelman <120349369+leoberhelman@users.noreply.github.com> Date: Fri, 24 Jan 2025 08:31:07 +1100 Subject: [PATCH 138/138] Update perturbIC.py Update perturbIC.py --- .gitignore | 3 ++- .../__pycache__/__init__.cpython-311.pyc | Bin 340 -> 340 bytes .../__pycache__/_version.cpython-311.pyc | Bin 27168 -> 27168 bytes .../__pycache__/perturbIC.cpython-311.pyc | Bin 9660 -> 9660 bytes src/umfile_utils/perturbIC.py | 8 ++++---- ...umfile_utils~e4371c9 (Create umfile_utils) | 1 - 6 files changed, 6 insertions(+), 6 deletions(-) delete mode 100644 src/umfile_utils~e4371c9 (Create umfile_utils) diff --git a/.gitignore b/.gitignore index 927e73d8..5ee342de 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ **/__pycache__/ +*.pyc .hypothesis/ .*_cache/ .vscode/ @@ -8,4 +9,4 @@ *~ *.egg-info coverage_html -*.code-workspace \ No newline at end of file +*.code-workspace diff --git a/src/umfile_utils/__pycache__/__init__.cpython-311.pyc b/src/umfile_utils/__pycache__/__init__.cpython-311.pyc index 1f7559d39627fd93f51a72f4cb379e931ce8fa6c..393cd5c6f6fac8f455f9161ff332dc887e5450b5 100644 GIT binary patch delta 20 acmcb@bcKm~IWI340}$l6%-G27$p`>9AOz6> delta 20 acmcb@bcKm~IWI340}$-}KYb&&CnEqov<2J% diff --git a/src/umfile_utils/__pycache__/_version.cpython-311.pyc b/src/umfile_utils/__pycache__/_version.cpython-311.pyc index 1412c108908b431d21089f1feff023893970689f..b545e92d1dfa78852894aacf97885ebea97fa192 100644 GIT binary patch delta 22 ccmZ2*g>k_ZM(*Xjyj%=GkmE9ABe!T408w-XL;wH) delta 22 ccmZ2*g>k_ZM(*Xjyj%=Gu=oG;johMH09XhIPXGV_ diff --git a/src/umfile_utils/__pycache__/perturbIC.cpython-311.pyc b/src/umfile_utils/__pycache__/perturbIC.cpython-311.pyc index e8a679316a974f3b0396f49acc332cdafce7cf42..838fc4a65de740d8dd9953b7c1d5de3b71b3e669 100644 GIT binary patch delta 20 acmdnvy~mq-IWI340}xcZ&e+JkQ566`HwDiC delta 20 acmdnvy~mq-IWI340}$-}KYb(jMpXbsTn5Sj diff --git a/src/umfile_utils/perturbIC.py b/src/umfile_utils/perturbIC.py index 21ce8bae..589eccb5 100644 --- a/src/umfile_utils/perturbIC.py +++ b/src/umfile_utils/perturbIC.py @@ -199,15 +199,15 @@ def main(): # Create the random generator. random_generator = create_random_generator(args.seed) - # Skip mule validation if the "--validate" option is provided - if not args.validate: - ff.validate = void_validation ff_raw = mule.DumpFile.from_file(args.ifile) - # Remove the time series from the data to ensure mule will work ff = remove_timeseries(ff_raw) + # Skip mule validation if the "--validate" option is provided + if not args.validate: + ff.validate = void_validation() + # loop through the fields for ifield, field in enumerate(ff.fields): if is_field_to_perturb(field, STASH_THETA): diff --git a/src/umfile_utils~e4371c9 (Create umfile_utils) b/src/umfile_utils~e4371c9 (Create umfile_utils) deleted file mode 100644 index 8b137891..00000000 --- a/src/umfile_utils~e4371c9 (Create umfile_utils) +++ /dev/null @@ -1 +0,0 @@ -