diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..4f54a08 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,34 @@ +name: CI + +on: + pull_request: + push: + branches: + - main + workflow_dispatch: + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.10", "3.11", "3.12", "3.13"] + script-dir: ["splitnc"] + + steps: + - name: Install netcdf-bin + run: sudo apt-get install -y netcdf-bin + + - uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: pip + + - name: Install dependencies + run: cd ${{ matrix.script-dir }}; pip install .[test] + + - name: Run tests + run: cd ${{ matrix.script-dir }}; python -m pytest diff --git a/splitnc/README.md b/splitnc/README.md new file mode 100644 index 0000000..71cf3e9 --- /dev/null +++ b/splitnc/README.md @@ -0,0 +1,112 @@ +# splitnc +This script splits multi-field netCDF files into single-field files. +It is designed to work on ESM1.6's atmosphere and ice files. + +## Automatic Field Identification +By default `splitnc` will attempt to identify the fields for a multi-field netCDF files by looking for variables that no other variables depend on. +A variable that no others depend on is likely to be a field. +E.g. many variables depend on `time`, but none depend on `sea_surface_temperature`. + +Alternatively the fields to separate to individual files can be specified as a comma separated list with the `--field-vars` command line option. +`--field-vars` interprets each item as regex, e.g. one could use `--field-vars fld_.+` to match all variable names that start with the string `fld_`. + +## "Ancillary" Variables + +Some variables with no dependents should not be separated into individual files, these variables must be manually identified with the `--shared-vars` command line option. +These variables will then be present in every output file. +Regex is also supported for this option. + +If there are ancillary fields that should only be present in only some of the output field files then multiple invocations of `splitnc` using `--field-vars` and `--shared-vars` will be required. + +Example of these variables are the `latitude_longitude` found in atmosphere files or the `uarea`, `tmask`, `tarea`, `VGRDb`, `VGRDi`, `VGRDs` variables from ice files. + +## Config File + +The `-c`/`--command-line-file` option can be used to supply a filepath to a file that contains command line options. +If this option is used, all other options supplied on the command line will be ignored. +Newline characters in the file will be treated as whitespace, i.e. newlines can be used as well as spaces to separate command line arguments. + +For example to replicate this command line, +``` +python splitnc.py --verbose --overwrite --output-dir /output/directory --shared-vars latitude_longitude --rename-regex "(?P.+)_\d+" /input/directory/*.nc +``` +the following file could be used; +``` +--verbose +--overwrite +--output-dir /output/directory +--shared-vars latitude_longitude +--rename-regex "(?P.+)_\d+" +/input/directory/*.nc +``` + +## Command Line Options + +```quote +usage: splitnc [-h] [--field-vars FIELD_VAR1,FIELD_VAR2,...] [--shared-vars SHARED_VAR1,SHARED_VAR2,...] + [--output-name-pattern OUTPUT_NAME_PATTERN] [--rename-regex REGEX] [--output-dir OUTPUT_DIR] [--overwrite] [-v] + [-c COMMAND_LINE_FILE] + [filepaths ...] + +Splits a multi-field netCDF file into separate one-field files + +positional arguments: + filepaths One or more filepaths to process + +options: + -h, --help show this help message and exit + --field-vars FIELD_VAR1,FIELD_VAR2,... + Specify the names of the field variables to split into separate files - dimensions, bounds, and + coordinates of these fields will be included in each file. Disables automatic field variable + identification. Regex patterns can be used here. + --shared-vars SHARED_VAR1,SHARED_VAR2,... + Specify the names of variables that should be shared across files that cannot be automatically + identified, as a comma separated list. Regex patterns can be used here. + --excluded-vars EXCLUDED_VAR1,EXCLUDED_VAR2,... + Specify the names of variables that should be excluded from files. This option can be used with + automatic identification of field variables. Regex patterns can be used here. + --rename-regex REGEX Look for duplicated coordinate names that match the given regex and rename them to the first + "newname" capture group in the regex. E.g. "(?P.*)_\d+" will match "time_0" and rename + it to "time". + --output-dir OUTPUT_DIR + Output directory for the processed files. If not given output files will be placed in the same + directory as the original file. + --overwrite Overwrite existing files + --dont-update-history + Disable automatic update of history attribute + -v, --verbose + -c COMMAND_LINE_FILE, --command-line-file COMMAND_LINE_FILE + A file containing a list of command-line arguments. Newlines in this file will be ignored. If + supplied all other command line arguments will be ignored. +``` + +## Example Usage + +`splitnc` just needs the `xarray` and `netCDF4` python modules. +On Gadi use load any module with `xarray`, such as `conda/analysis3`. +Alternatively create a new python environment and install `xarray` and `netCDF4`. + +### Atmosphere +To use this script for split multi-field atmosphere files from ACCESS-ESM1.6: +```bash +python split-nc.py --shared-vars latitude_longitude --rename-regex "(?P.+)_\\d+" $INPUT_DIR/*.nc +``` + +`splitnc` will automatically determine which variables are fields by looking at which variables depend on other variables. +Variables with nothing depending on them are deemed to be fields. +Alternatively one could use `--field-vars fld_.+` to match the variable names in these files. + +The `--rename-regex` option with the supplied regex will rename variables like +`time_0` or `pseudo_level_0` are renamed to `time` or `pseudo_level`. + +The `--shared-vars` option will ensure that the variable `latitude_longitude` is +included in all files even though none of the field variable depend on it. + +### Ice +To use this script for split multi-field ice files from ACCESS-ESM1.6: +```bash +python split-nc.py --shared-vars uarea,tmask,tarea --excluded-vars VGRD. $INPUT_DIR/*.nc +``` + +In comparison to the atmosphere files, ice files have different shared-vars and there are no duplicated variables that require renaming. +The variables `VGRDb`, `VGRDi`, and `VGRDs` are not required and can thus be excluded from the output. diff --git a/splitnc/pyproject.toml b/splitnc/pyproject.toml new file mode 100644 index 0000000..7abbc0c --- /dev/null +++ b/splitnc/pyproject.toml @@ -0,0 +1,33 @@ +[project] +name = "splitnc" +version = "v0.1" +authors = [ + {name = "Joshua Torrance", email="joshua.torrance@anu.edu.au"}, +] +maintainers = [ + {name = "Joshua Torrance", email="joshua.torrance@anu.edu.au"}, +] +description = "Split multi-field ESM1.6 files into single-field files" +readme = "README.md" +requires-python = ">=3.9" +dependencies = [ + "netcdf4", + "xarray", +] + +[project.optional-dependencies] + test = [ + "pytest", + "netCDF4", + "xarray>2025.1.2", + ] + +[build-system] +build-backend = "setuptools.build_meta" +requires = [ + "setuptools", +] + +[tool.pytest.ini_options] + testpaths = "test" + pythonpath = "." diff --git a/splitnc/splitnc.py b/splitnc/splitnc.py new file mode 100644 index 0000000..e039dda --- /dev/null +++ b/splitnc/splitnc.py @@ -0,0 +1,503 @@ +import argparse +from collections import Counter +from datetime import datetime, timezone +from glob import glob +import logging +from pathlib import Path +from platform import python_version +import re +import sys + +import xarray as xr + + +def determine_field_vars(ds): + """ + Attempt to determine which variables in the xarray dataset are fields + + If a variable is not depended on by any other variables it is likely to be a + field. E.g. + F(x, y, z), x, y, z + F depends on x, y, and z so x, y, and z are not fields + Nothing depends on F, so F is likely to be a field + + Need to check dimensions, bounds, and coordinates + """ + reference_counts = Counter() + + for varname in ds.variables: + # Any dims that are not variables will be ignored + reference_counts.update(ds[varname].dims) + + try: + reference_counts.update(ds[varname].encoding["coordinates"].split()) + except KeyError: + pass + + try: + reference_counts.update([ds[varname].attrs["bounds"]]) + except KeyError: + pass + + return sorted( + [varname for varname in ds.variables if reference_counts[varname] == 0] + ) + + +def get_dependent_vars(ds, varname, curr_vars=None): + """ + Get a list of variables that the given variable depends on. + + Check dimensions, bounds, and coordinates + + Recurse on each NEW dependent to get other dependents. + + By only recursing on new dependents infinite recursion in the case of + circular dependencies is avoided. + """ + logging.debug(f"Determining dependent variables for {varname}") + if curr_vars is None: + curr_vars = set() + + # Get any dims that are also variables + new_vars = {d for d in ds[varname].dims if d in ds.variables} + + # Get any coords + if ( + "coordinates" in ds[varname].encoding + and ds[varname].encoding["coordinates"] is not None + ): + new_vars.update(ds[varname].encoding["coordinates"].split()) + + # Add bounds if the variable has them + if "bounds" in ds[varname].attrs: + bounds = ds[varname].attrs["bounds"] + new_vars.update([bounds]) + + # Get the set of vars that are actually new (to avoid infinite recursion) + diff_vars = new_vars.difference(curr_vars) + + all_vars = curr_vars | new_vars + + # Recurse on each new var + additional_vars = set() + for new_v in diff_vars: + additional_vars |= get_dependent_vars(ds, new_v, all_vars) + + return diff_vars | additional_vars + + +def get_vars_in_order(ds, varname): + """ + Get the variables in order + + - Start with the field for this dataset, + - Followed by the dimensions of the field + - each dim followed by their bounds if they exist + - Finish with anything remaining in alphabetical order + """ + # Order the variables + vars_to_order = list(ds.variables) + + # Start with the field + vars_in_order = [varname] + vars_to_order.remove(varname) + + # Then the field's dimension and their bnds in order + for dim_name in ds[varname].dims: + if dim_name not in vars_to_order: + continue + + vars_in_order.append(dim_name) + vars_to_order.remove(dim_name) + if "bounds" in ds[dim_name].attrs: + dim_bnd_name = ds[dim_name].attrs["bounds"] + if dim_bnd_name in vars_to_order: + vars_in_order.append(dim_bnd_name) + vars_to_order.remove(dim_bnd_name) + + # Then the remaining variables in alphabetical order + vars_in_order += sorted(vars_to_order) + + return vars_in_order + + +def rename_variable(ds, oldname, newname): + """ + Rename a variable, xarray handles most of the rename. + + If the variable has a bounds variable, also rename the matching portion of + the bound's name. I.e. latitude -> lat therefore latitude_bnds -> lat_bnds + """ + logging.debug(f"Renaming {oldname} to {newname}") + ds_new = ds.rename({oldname: newname}) + + for v in ds.variables: + # Update cell_methods + try: + old_cell_methods = ds_new[v].attrs['cell_methods'] + if old_cell_methods and oldname in old_cell_methods: + new_cell_methods = old_cell_methods.replace(oldname, newname) + logging.debug(f"Renaming {oldname} to {newname} in {v}'s cell_methods - {old_cell_methods} to {new_cell_methods}") + ds_new[v].attrs['cell_methods'] = new_cell_methods + except KeyError: + # Do nothing if there's no cell_methods + pass + + # Update coordinates + try: + old_coords = ds_new[v].encoding['coordinates'] + if old_coords and oldname in old_coords: + new_coords = old_coords.replace(oldname, newname) + logging.debug(f"Renaming {oldname} to {newname} in {v}'s coordinates - {old_coords} to {new_coords}") + ds_new[v].encoding['coordinates'] = new_coords + except KeyError: + # Do nothing if there's no coords + pass + + # Update bounds + try: + old_bnd_name = ds_new[newname].attrs["bounds"] + new_bnd_name = old_bnd_name.replace(oldname, newname) + + logging.debug(f"Renaming {old_bnd_name} to {new_bnd_name}") + ds_new = rename_variable(ds_new, old_bnd_name, new_bnd_name) + + # Update the attr on the original variable + logging.debug(f'Updating "bounds" attr on {newname} to {new_bnd_name}') + ds_new[newname].attrs["bounds"] = new_bnd_name + except KeyError: + # This variable doesn't have bounds + pass + + return ds_new + + +def match_regex_list(regex_list, string_list): + """ + Return strings in the given list that match the supplied regex + """ + compiled_regex = [re.compile(regex) for regex in regex_list] + return [s for s in string_list if any(r.fullmatch(s) for r in compiled_regex)] + + +def build_rename_dict(ds, rename_regex): + """ + Use the supplied regex to build a dictionary of {"oldname": "newname"} to + pass to xarray's rename. + + "newname" should be supplied as a named capture group in the regex. + + E.g. to rename "time_0", "time_1" or "height_0" to "time" or "height", one + could use the regex "(?P.+)_\\d+". + """ + logging.debug("Building rename dict") + rename_dict = {} + for coord in ds.coords: + m = re.fullmatch(rename_regex, str(coord)) + + if m: + try: + newname = m["newname"] + except IndexError as e: + logging.error( + f"{coord} matched regex for renaming, {rename_regex}, " + 'but no "newname" capture group found' + ) + raise e + + logging.debug(f"{coord} will be renamed to {newname}") + + rename_dict[coord] = newname + + return rename_dict + + +def build_history(): + time_stamp = datetime.now(timezone.utc).isoformat(timespec='seconds') + python_exe = f"python{python_version()}" + + # The list of files given on the commandline is not needed in the history + args = " ".join(sys.argv) + + return f"{time_stamp} : splitnc (https://github.com/ACCESS-NRI/esm1.6-scripts) : {python_exe} {args}" + + +def update_history_attr(ds, new_history): + if "history" in ds.attrs: + old_history = ds.attrs["history"] + "\n" + else: + old_history = "" + + ds.attrs["history"] = old_history + new_history + + +def process_file( + filepath, + field_vars=None, + shared_vars=None, + excluded_vars=None, + rename_regex=None, + output_dir=None, + overwrite=False, + update_history=True, +): + logging.debug(f"Processing {filepath}") + filepath = Path(filepath) + + # Use cftime to suppress warnings + decoder = xr.coders.CFDatetimeCoder(use_cftime=True) + with xr.open_dataset(filepath, decode_times=decoder) as ds: + # Resolve any regex in the excluded_vars list + if excluded_vars: + excluded_vars = match_regex_list(excluded_vars, ds.variables) + else: + excluded_vars = [] + logging.debug(f"List of defined excluded variables is: {excluded_vars}") + + # Resolve any regex in the shared_vars list + if shared_vars: + shared_vars = match_regex_list(shared_vars, ds.variables) + + # shared_vars should not be in excluded vars + shared_vars = [v for v in shared_vars if v not in excluded_vars] + else: + shared_vars = [] + logging.debug(f"List of defined shared variables is: {shared_vars}") + + # Determine the field vars + if field_vars is None or len(field_vars) == 0: + logging.debug("Automatically determining field variables") + + field_vars = determine_field_vars(ds) + else: + # There may be regex to process + field_vars = match_regex_list(field_vars, ds.variables) + + # Shared and excluded vars shouldn't be field_vars + logging.debug("Removing shared variables from list of field variables") + field_vars = [v for v in field_vars if v not in shared_vars and v not in excluded_vars] + logging.debug(f"List of field vars is: {field_vars}") + + # Build the mapping dict for renaming, e.g. {"time_0: "time"} + if rename_regex: + rename_dict = build_rename_dict(ds, rename_regex) + else: + rename_dict = {} + logging.debug(f"Rename dict is {rename_dict}") + + for v in field_vars: + # Get the list of vars to keep for this field + logging.debug(f"Determining dependent variables for field variable {v}") + dependent_vars = get_dependent_vars(ds, v) + full_var_list = [v] + list(dependent_vars) + shared_vars + + # Drop any vars not in the list + drop_vars_list = [v for v in ds.variables if v not in full_var_list] + ds_v = ds.drop_vars(drop_vars_list) + + # Rename anything in the rename dict + if rename_dict: + for old_name, new_name in rename_dict.items(): + if ( + old_name in ds_v.variables + or old_name in ds_v.dims + or old_name in ds_v.coords + ): + ds_v = rename_variable(ds_v, old_name, new_name) + + # Coordinates shouldn't have _FillValues + for coord in list(ds_v.coords): + if coord in ds_v.variables: + logging.debug(f'Setting "_FillValue" to None for {coord}') + ds_v[coord].encoding["_FillValue"] = None + + # Bounds shouldn't have coordinates or _FillValues + bnds_set = { + ds_v[bnd_v].attrs["bounds"] + for bnd_v in ds_v.variables + if "bounds" in ds_v[bnd_v].attrs + } + logging.debug(f"Bounds variables are {bnds_set}") + for bnd in bnds_set: + logging.debug( + f'Setting "coordinates" and "_FillValue" to None for {bnd}' + ) + ds_v[bnd].encoding["coordinates"] = None + ds_v[bnd].encoding["_FillValue"] = None + + # Order the variables + vars_in_order = get_vars_in_order(ds_v, v) + logging.debug(f"Ordering variable as {vars_in_order}") + ds_v = ds_v[vars_in_order] + + # Update the history attribute + if update_history: + new_history = build_history() + logging.debug(f"Updating history attribute with: {new_history}") + update_history_attr(ds_v, new_history) + + if output_dir: + output_dir = Path(output_dir) + else: + output_dir = filepath.parent + + output_filename = output_dir / f"{v}_{filepath.name}" + logging.debug(f"Output filepath is {output_filename}") + + if not overwrite and output_filename.exists(): + logging.error(f"Output file already exists - {output_filename}") + logging.error("Use --overwrite to overwrite existing files") + + raise FileExistsError(f"{output_filename} already exists") + + logging.debug("Creating parent directory and writing to output file") + output_filename.parent.mkdir(parents=True, exist_ok=True) + ds_v.to_netcdf(output_filename) + + +#### Main +def arg_parse(cmdline_args=None): + parser = argparse.ArgumentParser( + prog="splitnc", + description="Splits a multi-field netCDF file into separate one-field files", + ) + + # Create a custom type for comma separated strings as lists + def comma_separated_string_type(s): + return s.split(",") + + # Open the named file and parse it as a command line split it around the + # whitespaces (including newlines) + def command_line_file(filepath): + with open(filepath, "r") as f: + file_str = f.read() + + return file_str.split() + + # Filepath wildcards won't be expanded if supplied via a command line file + # I.e. *.nc won't be expanded by the shell to [file1.nc, file2.nc] + def globbable_string_list(string_list): + return glob(string_list) + + # Let filepaths be optional (i.e. nargs=* instead of +) so that it isn't + # required and --cmd-line-file can be used on it's own + parser.add_argument( + "filepaths", + nargs="*", + default=[], + type=globbable_string_list, + help="One or more filepaths to process", + ) + parser.add_argument( + "--field-vars", + type=comma_separated_string_type, + default=[], + metavar="FIELD_VAR1,FIELD_VAR2,...", + help="Specify the names of the field variables to split into separate " + "files - dimensions, bounds, and coordinates of these fields will " + "be included in each file. Disables automatic field variable " + "identification. Regex patterns can be used here.", + ) + parser.add_argument( + "--shared-vars", + type=comma_separated_string_type, + default=[], + metavar="SHARED_VAR1,SHARED_VAR2,...", + help="Specify the names of variables that should be shared across " + "files that cannot be automatically identified, as a comma " + "separated list. Regex patterns can be used here.", + ) + parser.add_argument( + "--excluded-vars", + type=comma_separated_string_type, + default=[], + metavar="EXCLUDED_VAR1,EXCLUDED_VAR2,...", + help="Specify the names of variables that should be excluded from " + "files. This option can be used with automatic identification of field " + "variables. Regex patterns can be used here.", + ) + parser.add_argument( + "--rename-regex", + metavar="REGEX", + help="Look for duplicated coordinate names that match the given regex " + 'and rename them to the first "newname" capture group in the ' + 'regex. E.g. "(?P.*)_\\d+" will match "time_0" and ' + 'rename it to "time".', + ) + parser.add_argument( + "--output-dir", + help="Output directory for the processed files. If not given output " + "files will be placed in the same directory as the original file.", + ) + parser.add_argument( + "--overwrite", action="store_true", help="Overwrite existing files" + ) + parser.add_argument( + "--dont-update-history", + action="store_true", + help="Disable automatic update of history attribute" + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + ) + parser.add_argument( + "-c", + "--command-line-file", + type=command_line_file, + help="A file containing a list of command-line arguments. Newlines in " + "this file will be ignored. If supplied all other command line " + "arguments will be ignored.", + ) + + args = parser.parse_args(args=cmdline_args) + + # File paths may need flattened since glob was used + args.filepaths = [ + filepath for glob_list in args.filepaths for filepath in glob_list + ] + + # If the command line yaml was supplied use the contents instead of argv + if args.command_line_file: + return arg_parse(args.command_line_file) + else: + return args + + +def setup_logging(verbose=False): + logging.basicConfig( + level=logging.DEBUG if verbose else logging.WARNING, + format="{asctime} - {levelname} - {message}", + style="{", + datefmt="%Y-%m-%d %H:%M", + ) + + +def main(): + args = arg_parse() + + setup_logging(args.verbose) + + logging.debug(f"Command line args are: {args}") + + if len(args.filepaths) == 0: + logging.error("No files to process.") + raise ValueError("No files to process.") + + for f in args.filepaths: + process_file( + f, + field_vars=args.field_vars, + shared_vars=args.shared_vars, + excluded_vars=args.excluded_vars, + rename_regex=args.rename_regex, + output_dir=args.output_dir, + overwrite=args.overwrite, + update_history=not args.dont_update_history, + ) + + +if __name__ == "__main__": + main() diff --git a/splitnc/test/common.py b/splitnc/test/common.py new file mode 100644 index 0000000..4cd6d1d --- /dev/null +++ b/splitnc/test/common.py @@ -0,0 +1,27 @@ +import os +from pathlib import Path +import pytest +import shlex +import subprocess + + +def runcmd(cmd, wd=None, env=None): + """ + Run a command, print stderr to stdout and optionally run in working directory + """ + cwd = Path.cwd() if wd is None else wd + local_env = os.environ.copy() + if env is not None: + local_env.update(env) + subprocess.run( + shlex.split(cmd), stderr=subprocess.STDOUT, cwd=cwd, env=local_env, check=True + ) + + +def make_nc(tmp_path, cdl_file, filename="test.nc"): + filepath = f"{tmp_path}/{filename}" + cmd = f"ncgen -o {filepath} {cdl_file}" + + runcmd(cmd) + + return filepath diff --git a/splitnc/test/data/aiihca.pa-234501_mon.cdl b/splitnc/test/data/aiihca.pa-234501_mon.cdl new file mode 100644 index 0000000..b6ec437 --- /dev/null +++ b/splitnc/test/data/aiihca.pa-234501_mon.cdl @@ -0,0 +1,2008 @@ +netcdf aiihca.pa-234501_mon { +dimensions: + time = UNLIMITED ; // (1 currently) + lat = 145 ; + lon = 192 ; + bnds = 2 ; + model_rho_level_number = 38 ; + pseudo_level = 6 ; + pseudo_level_0 = 17 ; + lon_u = 192 ; + lat_v = 144 ; + pseudo_level_2 = 13 ; + time_0 = 1 ; + soil_model_level_number = 6 ; + pressure = 19 ; + model_theta_level_number = 38 ; +variables: + float fld_s00i023(time, lat, lon) ; + fld_s00i023:_FillValue = 1.e+20f ; + fld_s00i023:standard_name = "surface_snow_amount" ; + fld_s00i023:long_name = "SNOW AMOUNT OVER LAND AFT TSTP KG/M2" ; + fld_s00i023:units = "kg m-2" ; + fld_s00i023:um_stash_source = "m01s00i023" ; + fld_s00i023:missing_value = 1.e+20f ; + fld_s00i023:cell_methods = "time: mean" ; + fld_s00i023:grid_mapping = "latitude_longitude" ; + int latitude_longitude ; + latitude_longitude:grid_mapping_name = "latitude_longitude" ; + latitude_longitude:longitude_of_prime_meridian = 0. ; + latitude_longitude:earth_radius = 6371229. ; + double time(time) ; + time:axis = "T" ; + time:bounds = "time_bnds" ; + time:units = "days since 0001-01-01 00:00" ; + time:standard_name = "time" ; + time:calendar = "proleptic_gregorian" ; + double time_bnds(time, bnds) ; + double lat(lat) ; + lat:axis = "Y" ; + lat:bounds = "lat_bnds" ; + lat:units = "degrees_north" ; + lat:standard_name = "latitude" ; + double lat_bnds(lat, bnds) ; + double lon(lon) ; + lon:axis = "X" ; + lon:bounds = "lon_bnds" ; + lon:units = "degrees_east" ; + lon:standard_name = "longitude" ; + double lon_bnds(lon, bnds) ; + float fld_s00i024(time, lat, lon) ; + fld_s00i024:_FillValue = 1.e+20f ; + fld_s00i024:standard_name = "surface_temperature" ; + fld_s00i024:long_name = "SURFACE TEMPERATURE AFTER TIMESTEP" ; + fld_s00i024:units = "K" ; + fld_s00i024:um_stash_source = "m01s00i024" ; + fld_s00i024:missing_value = 1.e+20f ; + fld_s00i024:cell_methods = "time: mean" ; + fld_s00i024:grid_mapping = "latitude_longitude" ; + int fld_s00i030(time, lat, lon) ; + fld_s00i030:_FillValue = -2147483647 ; + fld_s00i030:standard_name = "land_binary_mask" ; + fld_s00i030:long_name = "LAND MASK (No halo) (LAND=TRUE)" ; + fld_s00i030:units = "1" ; + fld_s00i030:um_stash_source = "m01s00i030" ; + fld_s00i030:missing_value = -2147483647 ; + fld_s00i030:cell_methods = "time: mean" ; + fld_s00i030:grid_mapping = "latitude_longitude" ; + float fld_s00i031(time, lat, lon) ; + fld_s00i031:_FillValue = 1.e+20f ; + fld_s00i031:standard_name = "sea_ice_area_fraction" ; + fld_s00i031:long_name = "FRAC OF SEA ICE IN SEA AFTER TSTEP" ; + fld_s00i031:units = "1" ; + fld_s00i031:um_stash_source = "m01s00i031" ; + fld_s00i031:missing_value = 1.e+20f ; + fld_s00i031:cell_methods = "time: mean" ; + fld_s00i031:grid_mapping = "latitude_longitude" ; + float fld_s00i032(time, lat, lon) ; + fld_s00i032:_FillValue = 1.e+20f ; + fld_s00i032:standard_name = "sea_ice_thickness" ; + fld_s00i032:long_name = "SEA ICE DEPTH (MEAN OVER ICE) M" ; + fld_s00i032:units = "m" ; + fld_s00i032:um_stash_source = "m01s00i032" ; + fld_s00i032:missing_value = 1.e+20f ; + fld_s00i032:cell_methods = "time: mean" ; + fld_s00i032:grid_mapping = "latitude_longitude" ; + float fld_s00i033(time, lat, lon) ; + fld_s00i033:_FillValue = 1.e+20f ; + fld_s00i033:standard_name = "surface_altitude" ; + fld_s00i033:long_name = "OROGRAPHY (/STRAT LOWER BC)" ; + fld_s00i033:units = "m" ; + fld_s00i033:um_stash_source = "m01s00i033" ; + fld_s00i033:missing_value = 1.e+20f ; + fld_s00i033:cell_methods = "time: mean" ; + fld_s00i033:grid_mapping = "latitude_longitude" ; + float fld_s00i407(time, model_rho_level_number, lat, lon) ; + fld_s00i407:_FillValue = 1.e+20f ; + fld_s00i407:standard_name = "air_pressure" ; + fld_s00i407:long_name = "PRESSURE AT RHO LEVELS AFTER TS" ; + fld_s00i407:units = "Pa" ; + fld_s00i407:um_stash_source = "m01s00i407" ; + fld_s00i407:missing_value = 1.e+20f ; + fld_s00i407:cell_methods = "time: mean" ; + fld_s00i407:grid_mapping = "latitude_longitude" ; + fld_s00i407:coordinates = "rho_level_height sigma_rho surface_altitude" ; + int model_rho_level_number(model_rho_level_number) ; + model_rho_level_number:axis = "Z" ; + model_rho_level_number:units = "1" ; + model_rho_level_number:standard_name = "model_level_number" ; + model_rho_level_number:positive = "up" ; + double rho_level_height(model_rho_level_number) ; + rho_level_height:bounds = "rho_level_height_bnds" ; + rho_level_height:units = "m" ; + rho_level_height:long_name = "level_height" ; + rho_level_height:positive = "up" ; + rho_level_height:standard_name = "atmosphere_hybrid_height_coordinate" ; + rho_level_height:axis = "Z" ; + rho_level_height:formula_terms = "a: rho_level_height b: sigma_rho orog: surface_altitude" ; + double rho_level_height_bnds(model_rho_level_number, bnds) ; + double sigma_rho(model_rho_level_number) ; + sigma_rho:bounds = "sigma_rho_bnds" ; + sigma_rho:units = "1" ; + sigma_rho:long_name = "sigma" ; + double sigma_rho_bnds(model_rho_level_number, bnds) ; + double surface_altitude(lat, lon) ; + surface_altitude:units = "m" ; + surface_altitude:standard_name = "surface_altitude" ; + surface_altitude:um_stash_source = "m01s00i033" ; + surface_altitude:source = "Data from Met Office Unified Model" ; + surface_altitude:um_version = "7.3" ; + float fld_s00i409(time, lat, lon) ; + fld_s00i409:_FillValue = 1.e+20f ; + fld_s00i409:standard_name = "surface_air_pressure" ; + fld_s00i409:long_name = "SURFACE PRESSURE AFTER TIMESTEP" ; + fld_s00i409:units = "Pa" ; + fld_s00i409:um_stash_source = "m01s00i409" ; + fld_s00i409:missing_value = 1.e+20f ; + fld_s00i409:cell_methods = "time: mean" ; + fld_s00i409:grid_mapping = "latitude_longitude" ; + float fld_s00i507(time, lat, lon) ; + fld_s00i507:_FillValue = 1.e+20f ; + fld_s00i507:standard_name = "surface_temperature_where_open_sea" ; + fld_s00i507:long_name = "OPEN SEA SURFACE TEMP AFTER TIMESTEP" ; + fld_s00i507:units = "K" ; + fld_s00i507:um_stash_source = "m01s00i507" ; + fld_s00i507:missing_value = 1.e+20f ; + fld_s00i507:cell_methods = "time: mean" ; + fld_s00i507:grid_mapping = "latitude_longitude" ; + float fld_s00i508(time, lat, lon) ; + fld_s00i508:_FillValue = 1.e+20f ; + fld_s00i508:standard_name = "surface_temperature" ; + fld_s00i508:long_name = "SEA-ICE SURFACE TEMP AFTER TIMESTEP" ; + fld_s00i508:units = "K" ; + fld_s00i508:um_stash_source = "m01s00i508" ; + fld_s00i508:missing_value = 1.e+20f ; + fld_s00i508:cell_methods = "time: mean" ; + fld_s00i508:grid_mapping = "latitude_longitude" ; + float fld_s00i509(time, lat, lon) ; + fld_s00i509:_FillValue = 1.e+20f ; + fld_s00i509:long_name = "product_of_sea_ice_albedo_and_sunlit_binary_mask" ; + fld_s00i509:units = "1" ; + fld_s00i509:um_stash_source = "m01s00i509" ; + fld_s00i509:missing_value = 1.e+20f ; + fld_s00i509:cell_methods = "time: mean" ; + fld_s00i509:grid_mapping = "latitude_longitude" ; + float fld_s01i201(time, lat, lon) ; + fld_s01i201:_FillValue = 1.e+20f ; + fld_s01i201:standard_name = "surface_net_downward_shortwave_flux" ; + fld_s01i201:long_name = "NET DOWN SURFACE SW FLUX: SW TS ONLY" ; + fld_s01i201:units = "W m-2" ; + fld_s01i201:um_stash_source = "m01s01i201" ; + fld_s01i201:missing_value = 1.e+20f ; + fld_s01i201:cell_methods = "time: mean" ; + fld_s01i201:grid_mapping = "latitude_longitude" ; + float fld_s01i207(time, lat, lon) ; + fld_s01i207:_FillValue = 1.e+20f ; + fld_s01i207:standard_name = "toa_incoming_shortwave_flux" ; + fld_s01i207:long_name = "INCOMING SW RAD FLUX (TOA): ALL TSS" ; + fld_s01i207:units = "W m-2" ; + fld_s01i207:um_stash_source = "m01s01i207" ; + fld_s01i207:missing_value = 1.e+20f ; + fld_s01i207:cell_methods = "time: mean" ; + fld_s01i207:grid_mapping = "latitude_longitude" ; + float fld_s01i208(time, lat, lon) ; + fld_s01i208:_FillValue = 1.e+20f ; + fld_s01i208:standard_name = "toa_outgoing_shortwave_flux" ; + fld_s01i208:long_name = "OUTGOING SW RAD FLUX (TOA)" ; + fld_s01i208:units = "W m-2" ; + fld_s01i208:um_stash_source = "m01s01i208" ; + fld_s01i208:missing_value = 1.e+20f ; + fld_s01i208:cell_methods = "time: mean" ; + fld_s01i208:grid_mapping = "latitude_longitude" ; + float fld_s01i209(time, lat, lon) ; + fld_s01i209:_FillValue = 1.e+20f ; + fld_s01i209:standard_name = "toa_outgoing_shortwave_flux_assuming_clear_sky" ; + fld_s01i209:long_name = "CLEAR-SKY (II) UPWARD SW FLUX (TOA)" ; + fld_s01i209:units = "W m-2" ; + fld_s01i209:um_stash_source = "m01s01i209" ; + fld_s01i209:missing_value = 1.e+20f ; + fld_s01i209:cell_methods = "time: mean" ; + fld_s01i209:grid_mapping = "latitude_longitude" ; + float fld_s01i210(time, lat, lon) ; + fld_s01i210:_FillValue = 1.e+20f ; + fld_s01i210:standard_name = "surface_downwelling_shortwave_flux_in_air_assuming_clear_sky" ; + fld_s01i210:long_name = "CLEAR-SKY (II) DOWN SURFACE SW FLUX" ; + fld_s01i210:units = "W m-2" ; + fld_s01i210:um_stash_source = "m01s01i210" ; + fld_s01i210:missing_value = 1.e+20f ; + fld_s01i210:cell_methods = "time: mean" ; + fld_s01i210:grid_mapping = "latitude_longitude" ; + float fld_s01i211(time, lat, lon) ; + fld_s01i211:_FillValue = 1.e+20f ; + fld_s01i211:standard_name = "surface_upwelling_shortwave_flux_in_air_assuming_clear_sky" ; + fld_s01i211:long_name = "CLEAR-SKY (II) UP SURFACE SW FLUX" ; + fld_s01i211:units = "W m-2" ; + fld_s01i211:um_stash_source = "m01s01i211" ; + fld_s01i211:missing_value = 1.e+20f ; + fld_s01i211:cell_methods = "time: mean" ; + fld_s01i211:grid_mapping = "latitude_longitude" ; + float fld_s01i235(time, lat, lon) ; + fld_s01i235:_FillValue = 1.e+20f ; + fld_s01i235:standard_name = "surface_downwelling_shortwave_flux_in_air" ; + fld_s01i235:long_name = "TOTAL DOWNWARD SURFACE SW FLUX" ; + fld_s01i235:units = "W m-2" ; + fld_s01i235:um_stash_source = "m01s01i235" ; + fld_s01i235:missing_value = 1.e+20f ; + fld_s01i235:cell_methods = "time: mean" ; + fld_s01i235:grid_mapping = "latitude_longitude" ; + float fld_s02i201(time, lat, lon) ; + fld_s02i201:_FillValue = 1.e+20f ; + fld_s02i201:standard_name = "surface_net_downward_longwave_flux" ; + fld_s02i201:long_name = "NET DOWN SURFACE LW RAD FLUX" ; + fld_s02i201:units = "W m-2" ; + fld_s02i201:um_stash_source = "m01s02i201" ; + fld_s02i201:missing_value = 1.e+20f ; + fld_s02i201:cell_methods = "time: mean" ; + fld_s02i201:grid_mapping = "latitude_longitude" ; + float fld_s02i203(time, lat, lon) ; + fld_s02i203:_FillValue = 1.e+20f ; + fld_s02i203:standard_name = "surface_net_downward_longwave_flux" ; + fld_s02i203:long_name = "NET DN LW RAD FLUX:OPEN SEA:SEA MEAN" ; + fld_s02i203:units = "W m-2" ; + fld_s02i203:um_stash_source = "m01s02i203" ; + fld_s02i203:missing_value = 1.e+20f ; + fld_s02i203:cell_methods = "time: mean" ; + fld_s02i203:grid_mapping = "latitude_longitude" ; + float fld_s02i204(time, lat, lon) ; + fld_s02i204:_FillValue = 1.e+20f ; + fld_s02i204:standard_name = "cloud_area_fraction" ; + fld_s02i204:long_name = "TOTAL CLOUD AMOUNT IN LW RADIATION" ; + fld_s02i204:units = "1" ; + fld_s02i204:um_stash_source = "m01s02i204" ; + fld_s02i204:missing_value = 1.e+20f ; + fld_s02i204:cell_methods = "time: mean" ; + fld_s02i204:grid_mapping = "latitude_longitude" ; + float fld_s02i205(time, lat, lon) ; + fld_s02i205:_FillValue = 1.e+20f ; + fld_s02i205:standard_name = "toa_outgoing_longwave_flux" ; + fld_s02i205:long_name = "OUTGOING LW RAD FLUX (TOA)" ; + fld_s02i205:units = "W m-2" ; + fld_s02i205:um_stash_source = "m01s02i205" ; + fld_s02i205:missing_value = 1.e+20f ; + fld_s02i205:cell_methods = "time: mean" ; + fld_s02i205:grid_mapping = "latitude_longitude" ; + float fld_s02i206(time, lat, lon) ; + fld_s02i206:_FillValue = 1.e+20f ; + fld_s02i206:standard_name = "toa_outgoing_longwave_flux_assuming_clear_sky" ; + fld_s02i206:long_name = "CLEAR-SKY (II) UPWARD LW FLUX (TOA)" ; + fld_s02i206:units = "W m-2" ; + fld_s02i206:um_stash_source = "m01s02i206" ; + fld_s02i206:missing_value = 1.e+20f ; + fld_s02i206:cell_methods = "time: mean" ; + fld_s02i206:grid_mapping = "latitude_longitude" ; + float fld_s02i207(time, lat, lon) ; + fld_s02i207:_FillValue = 1.e+20f ; + fld_s02i207:standard_name = "surface_downwelling_longwave_flux_in_air" ; + fld_s02i207:long_name = "DOWNWARD LW RAD FLUX: SURFACE" ; + fld_s02i207:units = "W m-2" ; + fld_s02i207:um_stash_source = "m01s02i207" ; + fld_s02i207:missing_value = 1.e+20f ; + fld_s02i207:cell_methods = "time: mean" ; + fld_s02i207:grid_mapping = "latitude_longitude" ; + float fld_s02i208(time, lat, lon) ; + fld_s02i208:_FillValue = 1.e+20f ; + fld_s02i208:standard_name = "surface_downwelling_longwave_flux_in_air_assuming_clear_sky" ; + fld_s02i208:long_name = "CLEAR-SKY (II) DOWN SURFACE LW FLUX" ; + fld_s02i208:units = "W m-2" ; + fld_s02i208:um_stash_source = "m01s02i208" ; + fld_s02i208:missing_value = 1.e+20f ; + fld_s02i208:cell_methods = "time: mean" ; + fld_s02i208:grid_mapping = "latitude_longitude" ; + float fld_s02i284(time, pseudo_level, lat, lon) ; + fld_s02i284:_FillValue = 1.e+20f ; + fld_s02i284:long_name = "atmosphere_optical_thickness_due_to_sulphate_ambient_aerosol" ; + fld_s02i284:units = "1" ; + fld_s02i284:um_stash_source = "m01s02i284" ; + fld_s02i284:missing_value = 1.e+20f ; + fld_s02i284:cell_methods = "time: mean" ; + fld_s02i284:grid_mapping = "latitude_longitude" ; + int pseudo_level(pseudo_level) ; + pseudo_level:units = "1" ; + pseudo_level:long_name = "pseudo_level" ; + float fld_s02i285(time, pseudo_level, lat, lon) ; + fld_s02i285:_FillValue = 1.e+20f ; + fld_s02i285:standard_name = "atmosphere_optical_thickness_due_to_dust_ambient_aerosol" ; + fld_s02i285:long_name = "MINERAL DUST OPTICAL DEPTH IN RADN." ; + fld_s02i285:units = "1" ; + fld_s02i285:um_stash_source = "m01s02i285" ; + fld_s02i285:missing_value = 1.e+20f ; + fld_s02i285:cell_methods = "time: mean" ; + fld_s02i285:grid_mapping = "latitude_longitude" ; + float fld_s02i286(time, pseudo_level, lat, lon) ; + fld_s02i286:_FillValue = 1.e+20f ; + fld_s02i286:standard_name = "atmosphere_optical_thickness_due_to_seasalt_ambient_aerosol" ; + fld_s02i286:long_name = "SEA SALT OPTICAL DEPTH IN RADIATION" ; + fld_s02i286:units = "1" ; + fld_s02i286:um_stash_source = "m01s02i286" ; + fld_s02i286:missing_value = 1.e+20f ; + fld_s02i286:cell_methods = "time: mean" ; + fld_s02i286:grid_mapping = "latitude_longitude" ; + float fld_s02i287(time, pseudo_level, lat, lon) ; + fld_s02i287:_FillValue = 1.e+20f ; + fld_s02i287:standard_name = "atmosphere_optical_thickness_due_to_black_carbon_ambient_aerosol" ; + fld_s02i287:long_name = "SOOT OPTICAL DEPTH IN RADIATION" ; + fld_s02i287:units = "1" ; + fld_s02i287:um_stash_source = "m01s02i287" ; + fld_s02i287:missing_value = 1.e+20f ; + fld_s02i287:cell_methods = "time: mean" ; + fld_s02i287:grid_mapping = "latitude_longitude" ; + float fld_s02i288(time, pseudo_level, lat, lon) ; + fld_s02i288:_FillValue = 1.e+20f ; + fld_s02i288:long_name = "atmosphere_optical_thickness_due_to_biomass_burning_ambient_aerosol" ; + fld_s02i288:units = "1" ; + fld_s02i288:um_stash_source = "m01s02i288" ; + fld_s02i288:missing_value = 1.e+20f ; + fld_s02i288:cell_methods = "time: mean" ; + fld_s02i288:grid_mapping = "latitude_longitude" ; + float fld_s02i289(time, pseudo_level, lat, lon) ; + fld_s02i289:_FillValue = 1.e+20f ; + fld_s02i289:long_name = "atmosphere_optical_thickness_due_to_biogenic_aerosol" ; + fld_s02i289:units = "1" ; + fld_s02i289:um_stash_source = "m01s02i289" ; + fld_s02i289:missing_value = 1.e+20f ; + fld_s02i289:cell_methods = "time: mean" ; + fld_s02i289:grid_mapping = "latitude_longitude" ; + float fld_s02i295(time, pseudo_level, lat, lon) ; + fld_s02i295:_FillValue = 1.e+20f ; + fld_s02i295:long_name = "atmosphere_optical_thickness_due_to_fossil_fuel_organic_carbon_ambient_aerosol" ; + fld_s02i295:units = "1" ; + fld_s02i295:um_stash_source = "m01s02i295" ; + fld_s02i295:missing_value = 1.e+20f ; + fld_s02i295:cell_methods = "time: mean" ; + fld_s02i295:grid_mapping = "latitude_longitude" ; + float fld_s03i049(time, lat, lon) ; + fld_s03i049:_FillValue = 1.e+20f ; + fld_s03i049:long_name = "SEA-ICE TEMPERATURE AFTER B. LAYER" ; + fld_s03i049:um_stash_source = "m01s03i049" ; + fld_s03i049:missing_value = 1.e+20f ; + fld_s03i049:cell_methods = "time: mean" ; + fld_s03i049:grid_mapping = "latitude_longitude" ; + float fld_s03i100(time, lat, lon) ; + fld_s03i100:_FillValue = 1.e+20f ; + fld_s03i100:long_name = "FLUX OF TRACER 1 IN BL" ; + fld_s03i100:um_stash_source = "m01s03i100" ; + fld_s03i100:missing_value = 1.e+20f ; + fld_s03i100:cell_methods = "time: mean" ; + fld_s03i100:grid_mapping = "latitude_longitude" ; + float fld_s03i101(time, lat, lon) ; + fld_s03i101:_FillValue = 1.e+20f ; + fld_s03i101:long_name = "FLUX OF TRACER 2 IN BL" ; + fld_s03i101:um_stash_source = "m01s03i101" ; + fld_s03i101:missing_value = 1.e+20f ; + fld_s03i101:cell_methods = "time: mean" ; + fld_s03i101:grid_mapping = "latitude_longitude" ; + float fld_s03i173(time, pseudo_level_0, lat, lon) ; + fld_s03i173:_FillValue = 1.e+20f ; + fld_s03i173:long_name = "soil (heterotrophic) respiration on tiles" ; + fld_s03i173:um_stash_source = "m01s03i173" ; + fld_s03i173:missing_value = 1.e+20f ; + fld_s03i173:cell_methods = "time: mean" ; + fld_s03i173:grid_mapping = "latitude_longitude" ; + int pseudo_level_0(pseudo_level_0) ; + pseudo_level_0:units = "1" ; + pseudo_level_0:long_name = "pseudo_level" ; + float fld_s03i174(time, pseudo_level_0, lat, lon) ; + fld_s03i174:_FillValue = 1.e+20f ; + fld_s03i174:long_name = "TRANSPIRATION FROM CABLE (ON TILES)" ; + fld_s03i174:um_stash_source = "m01s03i174" ; + fld_s03i174:missing_value = 1.e+20f ; + fld_s03i174:cell_methods = "time: mean" ; + fld_s03i174:grid_mapping = "latitude_longitude" ; + float fld_s03i201(time, lat, lon) ; + fld_s03i201:_FillValue = 1.e+20f ; + fld_s03i201:standard_name = "downward_heat_flux_in_sea_ice" ; + fld_s03i201:long_name = "HT FLUX THROUGH SEAICE:SEA MEAN W/M2" ; + fld_s03i201:units = "W m-2" ; + fld_s03i201:um_stash_source = "m01s03i201" ; + fld_s03i201:missing_value = 1.e+20f ; + fld_s03i201:cell_methods = "time: mean" ; + fld_s03i201:grid_mapping = "latitude_longitude" ; + float fld_s03i209(time, lat, lon_u) ; + fld_s03i209:_FillValue = 1.e+20f ; + fld_s03i209:standard_name = "eastward_wind" ; + fld_s03i209:long_name = "10 METRE WIND U-COMP" ; + fld_s03i209:units = "m s-1" ; + fld_s03i209:um_stash_source = "m01s03i209" ; + fld_s03i209:missing_value = 1.e+20f ; + fld_s03i209:cell_methods = "time: mean" ; + fld_s03i209:grid_mapping = "latitude_longitude" ; + fld_s03i209:coordinates = "height" ; + double lon_u(lon_u) ; + lon_u:axis = "X" ; + lon_u:bounds = "lon_u_bnds" ; + lon_u:units = "degrees_east" ; + lon_u:standard_name = "longitude" ; + double lon_u_bnds(lon_u, bnds) ; + double height ; + height:units = "m" ; + height:standard_name = "height" ; + height:positive = "up" ; + float fld_s03i210(time, lat_v, lon) ; + fld_s03i210:_FillValue = 1.e+20f ; + fld_s03i210:standard_name = "northward_wind" ; + fld_s03i210:long_name = "10 METRE WIND V-COMP" ; + fld_s03i210:units = "m s-1" ; + fld_s03i210:um_stash_source = "m01s03i210" ; + fld_s03i210:missing_value = 1.e+20f ; + fld_s03i210:cell_methods = "time: mean" ; + fld_s03i210:grid_mapping = "latitude_longitude" ; + fld_s03i210:coordinates = "height" ; + double lat_v(lat_v) ; + lat_v:axis = "Y" ; + lat_v:bounds = "lat_v_bnds" ; + lat_v:units = "degrees_north" ; + lat_v:standard_name = "latitude" ; + double lat_v_bnds(lat_v, bnds) ; + float fld_s03i217(time, lat, lon) ; + fld_s03i217:_FillValue = 1.e+20f ; + fld_s03i217:standard_name = "surface_upward_sensible_heat_flux" ; + fld_s03i217:long_name = "SURFACE SENSIBLE HEAT FLUX W/M2" ; + fld_s03i217:units = "W m-2" ; + fld_s03i217:um_stash_source = "m01s03i217" ; + fld_s03i217:missing_value = 1.e+20f ; + fld_s03i217:cell_methods = "time: mean" ; + fld_s03i217:grid_mapping = "latitude_longitude" ; + float fld_s03i223(time, lat, lon) ; + fld_s03i223:_FillValue = 1.e+20f ; + fld_s03i223:standard_name = "water_evaporation_flux" ; + fld_s03i223:long_name = "SURFACE TOTAL MOISTURE FLUX KG/M2/S" ; + fld_s03i223:units = "kg m-2 s-1" ; + fld_s03i223:um_stash_source = "m01s03i223" ; + fld_s03i223:missing_value = 1.e+20f ; + fld_s03i223:cell_methods = "time: mean" ; + fld_s03i223:grid_mapping = "latitude_longitude" ; + float fld_s03i225(time, lat_v, lon_u) ; + fld_s03i225:_FillValue = 1.e+20f ; + fld_s03i225:standard_name = "eastward_wind" ; + fld_s03i225:long_name = "10 METRE WIND U-COMP B GRID" ; + fld_s03i225:units = "m s-1" ; + fld_s03i225:um_stash_source = "m01s03i225" ; + fld_s03i225:missing_value = 1.e+20f ; + fld_s03i225:cell_methods = "time: mean" ; + fld_s03i225:grid_mapping = "latitude_longitude" ; + fld_s03i225:coordinates = "height" ; + float fld_s03i226(time, lat_v, lon_u) ; + fld_s03i226:_FillValue = 1.e+20f ; + fld_s03i226:standard_name = "northward_wind" ; + fld_s03i226:long_name = "10 METRE WIND V-COMP B GRID" ; + fld_s03i226:units = "m s-1" ; + fld_s03i226:um_stash_source = "m01s03i226" ; + fld_s03i226:missing_value = 1.e+20f ; + fld_s03i226:cell_methods = "time: mean" ; + fld_s03i226:grid_mapping = "latitude_longitude" ; + fld_s03i226:coordinates = "height" ; + float fld_s03i227(time, lat_v, lon_u) ; + fld_s03i227:_FillValue = 1.e+20f ; + fld_s03i227:standard_name = "wind_speed" ; + fld_s03i227:long_name = "10 METRE WIND SPEED ON B GRID" ; + fld_s03i227:units = "m s-1" ; + fld_s03i227:um_stash_source = "m01s03i227" ; + fld_s03i227:missing_value = 1.e+20f ; + fld_s03i227:cell_methods = "time: mean" ; + fld_s03i227:grid_mapping = "latitude_longitude" ; + fld_s03i227:coordinates = "height" ; + float fld_s03i230(time, lat, lon) ; + fld_s03i230:_FillValue = 1.e+20f ; + fld_s03i230:standard_name = "wind_speed" ; + fld_s03i230:long_name = "10 METRE WIND SPEED ON C GRID" ; + fld_s03i230:units = "m s-1" ; + fld_s03i230:um_stash_source = "m01s03i230" ; + fld_s03i230:missing_value = 1.e+20f ; + fld_s03i230:cell_methods = "time: mean" ; + fld_s03i230:grid_mapping = "latitude_longitude" ; + fld_s03i230:coordinates = "height" ; + float fld_s03i234(time, lat, lon) ; + fld_s03i234:_FillValue = 1.e+20f ; + fld_s03i234:standard_name = "surface_upward_latent_heat_flux" ; + fld_s03i234:long_name = "SURFACE LATENT HEAT FLUX W/M2" ; + fld_s03i234:units = "W m-2" ; + fld_s03i234:um_stash_source = "m01s03i234" ; + fld_s03i234:missing_value = 1.e+20f ; + fld_s03i234:cell_methods = "time: mean" ; + fld_s03i234:grid_mapping = "latitude_longitude" ; + float fld_s03i236(time, lat, lon) ; + fld_s03i236:_FillValue = 1.e+20f ; + fld_s03i236:standard_name = "air_temperature" ; + fld_s03i236:long_name = "TEMPERATURE AT 1.5M" ; + fld_s03i236:units = "K" ; + fld_s03i236:um_stash_source = "m01s03i236" ; + fld_s03i236:missing_value = 1.e+20f ; + fld_s03i236:cell_methods = "time: mean" ; + fld_s03i236:grid_mapping = "latitude_longitude" ; + fld_s03i236:coordinates = "height_0" ; + double height_0 ; + height_0:units = "m" ; + height_0:standard_name = "height" ; + height_0:positive = "up" ; + float fld_s03i237(time, lat, lon) ; + fld_s03i237:_FillValue = 1.e+20f ; + fld_s03i237:standard_name = "specific_humidity" ; + fld_s03i237:long_name = "SPECIFIC HUMIDITY AT 1.5M" ; + fld_s03i237:units = "1" ; + fld_s03i237:um_stash_source = "m01s03i237" ; + fld_s03i237:missing_value = 1.e+20f ; + fld_s03i237:cell_methods = "time: mean" ; + fld_s03i237:grid_mapping = "latitude_longitude" ; + fld_s03i237:coordinates = "height_0" ; + float fld_s03i245(time, lat, lon) ; + fld_s03i245:_FillValue = 1.e+20f ; + fld_s03i245:standard_name = "relative_humidity" ; + fld_s03i245:long_name = "RELATIVE HUMIDITY AT 1.5M" ; + fld_s03i245:units = "%" ; + fld_s03i245:um_stash_source = "m01s03i245" ; + fld_s03i245:missing_value = 1.e+20f ; + fld_s03i245:cell_methods = "time: mean" ; + fld_s03i245:grid_mapping = "latitude_longitude" ; + fld_s03i245:coordinates = "height_0" ; + float fld_s03i256(time, lat, lon) ; + fld_s03i256:_FillValue = 1.e+20f ; + fld_s03i256:long_name = "Heat flux through sea ice" ; + fld_s03i256:units = "W/m^2" ; + fld_s03i256:um_stash_source = "m01s03i256" ; + fld_s03i256:missing_value = 1.e+20f ; + fld_s03i256:cell_methods = "time: mean" ; + fld_s03i256:grid_mapping = "latitude_longitude" ; + fld_s03i256:coordinates = "pseudo_level_1" ; + int pseudo_level_1 ; + pseudo_level_1:units = "1" ; + pseudo_level_1:long_name = "pseudo_level" ; + float fld_s03i257(time, lat, lon) ; + fld_s03i257:_FillValue = 1.e+20f ; + fld_s03i257:long_name = "Heat flux in sea ice surface melt" ; + fld_s03i257:units = "W m-2" ; + fld_s03i257:um_stash_source = "m01s03i257" ; + fld_s03i257:missing_value = 1.e+20f ; + fld_s03i257:cell_methods = "time: mean" ; + fld_s03i257:grid_mapping = "latitude_longitude" ; + fld_s03i257:coordinates = "pseudo_level_1" ; + float fld_s03i258(time, lat, lon) ; + fld_s03i258:_FillValue = 1.e+20f ; + fld_s03i258:standard_name = "surface_snow_melt_heat_flux" ; + fld_s03i258:long_name = "SURFACE SNOWMELT HEAT FLUX W/M2" ; + fld_s03i258:units = "W m-2" ; + fld_s03i258:um_stash_source = "m01s03i258" ; + fld_s03i258:missing_value = 1.e+20f ; + fld_s03i258:cell_methods = "time: mean" ; + fld_s03i258:grid_mapping = "latitude_longitude" ; + float fld_s03i261(time, lat, lon) ; + fld_s03i261:_FillValue = 1.e+20f ; + fld_s03i261:standard_name = "gross_primary_productivity_of_biomass_expressed_as_carbon" ; + fld_s03i261:long_name = "GROSS PRIMARY PRODUCTIVITY KG C/M2/S" ; + fld_s03i261:units = "kg m-2 s-1" ; + fld_s03i261:um_stash_source = "m01s03i261" ; + fld_s03i261:missing_value = 1.e+20f ; + fld_s03i261:cell_methods = "time: mean" ; + fld_s03i261:grid_mapping = "latitude_longitude" ; + float fld_s03i262(time, lat, lon) ; + fld_s03i262:_FillValue = 1.e+20f ; + fld_s03i262:standard_name = "net_primary_productivity_of_biomass_expressed_as_carbon" ; + fld_s03i262:long_name = "NET PRIMARY PRODUCTIVITY KG C/M2/S" ; + fld_s03i262:units = "kg m-2 s-1" ; + fld_s03i262:um_stash_source = "m01s03i262" ; + fld_s03i262:missing_value = 1.e+20f ; + fld_s03i262:cell_methods = "time: mean" ; + fld_s03i262:grid_mapping = "latitude_longitude" ; + float fld_s03i263(time, lat, lon) ; + fld_s03i263:_FillValue = 1.e+20f ; + fld_s03i263:standard_name = "plant_respiration_carbon_flux" ; + fld_s03i263:long_name = "PLANT RESPIRATION KG/M2/S" ; + fld_s03i263:units = "kg m-2 s-1" ; + fld_s03i263:um_stash_source = "m01s03i263" ; + fld_s03i263:missing_value = 1.e+20f ; + fld_s03i263:cell_methods = "time: mean" ; + fld_s03i263:grid_mapping = "latitude_longitude" ; + float fld_s03i287(time, pseudo_level_0, lat, lon) ; + fld_s03i287:_FillValue = 1.e+20f ; + fld_s03i287:standard_name = "water_evaporation_flux_from_canopy" ; + fld_s03i287:long_name = "CANOPY EVAPORATION ON TILES" ; + fld_s03i287:units = "kg m-2 s-1" ; + fld_s03i287:um_stash_source = "m01s03i287" ; + fld_s03i287:missing_value = 1.e+20f ; + fld_s03i287:cell_methods = "time: mean" ; + fld_s03i287:grid_mapping = "latitude_longitude" ; + float fld_s03i288(time, pseudo_level_0, lat, lon) ; + fld_s03i288:_FillValue = 1.e+20f ; + fld_s03i288:standard_name = "water_evaporation_flux" ; + fld_s03i288:long_name = "TRANSPIRATION+SOIL EVP ON TILES" ; + fld_s03i288:units = "kg m-2 s-1" ; + fld_s03i288:um_stash_source = "m01s03i288" ; + fld_s03i288:missing_value = 1.e+20f ; + fld_s03i288:cell_methods = "time: mean" ; + fld_s03i288:grid_mapping = "latitude_longitude" ; + float fld_s03i289(time, pseudo_level_2, lat, lon) ; + fld_s03i289:_FillValue = 1.e+20f ; + fld_s03i289:standard_name = "gross_primary_productivity_of_biomass_expressed_as_carbon" ; + fld_s03i289:long_name = "GROSS PRIMARY PRODUCTIVITY ON PFTS" ; + fld_s03i289:units = "kg m-2 s-1" ; + fld_s03i289:um_stash_source = "m01s03i289" ; + fld_s03i289:missing_value = 1.e+20f ; + fld_s03i289:cell_methods = "time: mean" ; + fld_s03i289:grid_mapping = "latitude_longitude" ; + int pseudo_level_2(pseudo_level_2) ; + pseudo_level_2:units = "1" ; + pseudo_level_2:long_name = "pseudo_level" ; + float fld_s03i291(time, pseudo_level_2, lat, lon) ; + fld_s03i291:_FillValue = 1.e+20f ; + fld_s03i291:standard_name = "net_primary_productivity_of_biomass_expressed_as_carbon" ; + fld_s03i291:long_name = "NET PRIMARY PRODUCTIVITY ON PFTS" ; + fld_s03i291:units = "kg m-2 s-1" ; + fld_s03i291:um_stash_source = "m01s03i291" ; + fld_s03i291:missing_value = 1.e+20f ; + fld_s03i291:cell_methods = "time: mean" ; + fld_s03i291:grid_mapping = "latitude_longitude" ; + float fld_s03i292(time, pseudo_level_2, lat, lon) ; + fld_s03i292:_FillValue = 1.e+20f ; + fld_s03i292:long_name = "PLANT RESPIRATION ON PFTS KG C/M2/S" ; + fld_s03i292:units = "kg m-2 s-1" ; + fld_s03i292:um_stash_source = "m01s03i292" ; + fld_s03i292:missing_value = 1.e+20f ; + fld_s03i292:cell_methods = "time: mean" ; + fld_s03i292:grid_mapping = "latitude_longitude" ; + float fld_s03i293(time, lat, lon) ; + fld_s03i293:_FillValue = 1.e+20f ; + fld_s03i293:standard_name = "soil_respiration_carbon_flux" ; + fld_s03i293:long_name = "SOIL RESPIRATION KG C/M2/S" ; + fld_s03i293:units = "kg m-2 s-1" ; + fld_s03i293:um_stash_source = "m01s03i293" ; + fld_s03i293:missing_value = 1.e+20f ; + fld_s03i293:cell_methods = "time: mean" ; + fld_s03i293:grid_mapping = "latitude_longitude" ; + float fld_s03i296(time, lat, lon) ; + fld_s03i296:_FillValue = 1.e+20f ; + fld_s03i296:standard_name = "water_evaporation_flux_from_soil" ; + fld_s03i296:long_name = "Evaporation from soil surface" ; + fld_s03i296:units = "kg m-2 s-1" ; + fld_s03i296:um_stash_source = "m01s03i296" ; + fld_s03i296:missing_value = 1.e+20f ; + fld_s03i296:cell_methods = "time: mean" ; + fld_s03i296:grid_mapping = "latitude_longitude" ; + float fld_s03i297(time, lat, lon) ; + fld_s03i297:_FillValue = 1.e+20f ; + fld_s03i297:standard_name = "water_evaporation_flux_from_canopy" ; + fld_s03i297:long_name = "Evaporation from canopy" ; + fld_s03i297:units = "kg m-2 s-1" ; + fld_s03i297:um_stash_source = "m01s03i297" ; + fld_s03i297:missing_value = 1.e+20f ; + fld_s03i297:cell_methods = "time: mean" ; + fld_s03i297:grid_mapping = "latitude_longitude" ; + float fld_s03i298(time, lat, lon) ; + fld_s03i298:_FillValue = 1.e+20f ; + fld_s03i298:standard_name = "surface_snow_and_ice_sublimation_flux" ; + fld_s03i298:long_name = "SUBLIM. SURFACE (GBM) : RATE KG/M2/S" ; + fld_s03i298:units = "kg m-2 s-1" ; + fld_s03i298:um_stash_source = "m01s03i298" ; + fld_s03i298:missing_value = 1.e+20f ; + fld_s03i298:cell_methods = "time: mean" ; + fld_s03i298:grid_mapping = "latitude_longitude" ; + float fld_s03i314(time, pseudo_level_0, lat, lon) ; + fld_s03i314:_FillValue = 1.e+20f ; + fld_s03i314:long_name = "SURFACE NET RADIATION ON TILES" ; + fld_s03i314:units = "W m-2" ; + fld_s03i314:um_stash_source = "m01s03i314" ; + fld_s03i314:missing_value = 1.e+20f ; + fld_s03i314:cell_methods = "time: mean" ; + fld_s03i314:grid_mapping = "latitude_longitude" ; + float fld_s03i317(time, pseudo_level_0, lat, lon) ; + fld_s03i317:_FillValue = 1.e+20f ; + fld_s03i317:long_name = "SURFACE TILE FRACTIONS" ; + fld_s03i317:units = "1" ; + fld_s03i317:um_stash_source = "m01s03i317" ; + fld_s03i317:missing_value = 1.e+20f ; + fld_s03i317:cell_methods = "time: mean" ; + fld_s03i317:grid_mapping = "latitude_longitude" ; + float fld_s03i318(time, pseudo_level_2, lat, lon) ; + fld_s03i318:_FillValue = 1.e+20f ; + fld_s03i318:long_name = "LEAF AREA INDICES ON PFTS" ; + fld_s03i318:units = "1" ; + fld_s03i318:um_stash_source = "m01s03i318" ; + fld_s03i318:missing_value = 1.e+20f ; + fld_s03i318:cell_methods = "time: mean" ; + fld_s03i318:grid_mapping = "latitude_longitude" ; + float fld_s03i319(time, pseudo_level_2, lat, lon) ; + fld_s03i319:_FillValue = 1.e+20f ; + fld_s03i319:long_name = "CANOPY HEIGHT ON PFTS" ; + fld_s03i319:units = "m" ; + fld_s03i319:um_stash_source = "m01s03i319" ; + fld_s03i319:missing_value = 1.e+20f ; + fld_s03i319:cell_methods = "time: mean" ; + fld_s03i319:grid_mapping = "latitude_longitude" ; + float fld_s03i321(time, pseudo_level_0, lat, lon) ; + fld_s03i321:_FillValue = 1.e+20f ; + fld_s03i321:long_name = "Canopy water on tiles" ; + fld_s03i321:units = "kg m-2" ; + fld_s03i321:um_stash_source = "m01s03i321" ; + fld_s03i321:missing_value = 1.e+20f ; + fld_s03i321:cell_methods = "time: mean" ; + fld_s03i321:grid_mapping = "latitude_longitude" ; + float fld_s03i325(time, pseudo_level_0, lat, lon) ; + fld_s03i325:_FillValue = 1.e+20f ; + fld_s03i325:long_name = "LEAF TURNOVER RATE ON PFTS" ; + fld_s03i325:um_stash_source = "m01s03i325" ; + fld_s03i325:missing_value = 1.e+20f ; + fld_s03i325:cell_methods = "time: mean" ; + fld_s03i325:grid_mapping = "latitude_longitude" ; + float fld_s03i331(time, pseudo_level_0, lat, lon) ; + fld_s03i331:_FillValue = 1.e+20f ; + fld_s03i331:long_name = "Sublimation moisture flux on tiles" ; + fld_s03i331:units = "kg m-2 s-1" ; + fld_s03i331:um_stash_source = "m01s03i331" ; + fld_s03i331:missing_value = 1.e+20f ; + fld_s03i331:cell_methods = "time: mean" ; + fld_s03i331:grid_mapping = "latitude_longitude" ; + float fld_s03i332(time, lat, lon) ; + fld_s03i332:_FillValue = 1.e+20f ; + fld_s03i332:standard_name = "toa_outgoing_longwave_flux" ; + fld_s03i332:long_name = "TOA OUTGOING LW RAD AFTER B.LAYER" ; + fld_s03i332:units = "W m-2" ; + fld_s03i332:um_stash_source = "m01s03i332" ; + fld_s03i332:missing_value = 1.e+20f ; + fld_s03i332:cell_methods = "time: mean" ; + fld_s03i332:grid_mapping = "latitude_longitude" ; + float fld_s03i353(time, lat, lon) ; + fld_s03i353:_FillValue = 1.e+20f ; + fld_s03i353:long_name = "Sublimation of sea ice meaned over sea portion of grid box" ; + fld_s03i353:units = "kg m-2 s-1" ; + fld_s03i353:um_stash_source = "m01s03i353" ; + fld_s03i353:missing_value = 1.e+20f ; + fld_s03i353:cell_methods = "time: mean" ; + fld_s03i353:grid_mapping = "latitude_longitude" ; + float fld_s03i395(time, lat, lon) ; + fld_s03i395:_FillValue = 1.e+20f ; + fld_s03i395:standard_name = "land_area_fraction" ; + fld_s03i395:long_name = "FRACTION OF LAND" ; + fld_s03i395:units = "1" ; + fld_s03i395:um_stash_source = "m01s03i395" ; + fld_s03i395:missing_value = 1.e+20f ; + fld_s03i395:cell_methods = "time: mean" ; + fld_s03i395:grid_mapping = "latitude_longitude" ; + float fld_s03i460(time, lat, lon_u) ; + fld_s03i460:_FillValue = 1.e+20f ; + fld_s03i460:standard_name = "surface_downward_eastward_stress" ; + fld_s03i460:long_name = "X-COMP SURFACE BL STRESS" ; + fld_s03i460:units = "Pa" ; + fld_s03i460:um_stash_source = "m01s03i460" ; + fld_s03i460:missing_value = 1.e+20f ; + fld_s03i460:cell_methods = "time: mean" ; + fld_s03i460:grid_mapping = "latitude_longitude" ; + float fld_s03i461(time, lat_v, lon) ; + fld_s03i461:_FillValue = 1.e+20f ; + fld_s03i461:standard_name = "surface_downward_northward_stress" ; + fld_s03i461:long_name = "Y-COMP SURFACE BL STRESS" ; + fld_s03i461:units = "Pa" ; + fld_s03i461:um_stash_source = "m01s03i461" ; + fld_s03i461:missing_value = 1.e+20f ; + fld_s03i461:cell_methods = "time: mean" ; + fld_s03i461:grid_mapping = "latitude_longitude" ; + float fld_s03i801(time, pseudo_level_0, lat, lon) ; + fld_s03i801:_FillValue = 1.e+20f ; + fld_s03i801:standard_name = "soil_temperature" ; + fld_s03i801:long_name = "CABLE SOIL TEMPERATURE ON TILES LAYER 1" ; + fld_s03i801:units = "K" ; + fld_s03i801:um_stash_source = "m01s03i801" ; + fld_s03i801:missing_value = 1.e+20f ; + fld_s03i801:cell_methods = "time: mean" ; + fld_s03i801:grid_mapping = "latitude_longitude" ; + float fld_s03i802(time, pseudo_level_0, lat, lon) ; + fld_s03i802:_FillValue = 1.e+20f ; + fld_s03i802:standard_name = "soil_temperature" ; + fld_s03i802:long_name = "CABLE SOIL TEMPERATURE ON TILES LAYER 2" ; + fld_s03i802:units = "K" ; + fld_s03i802:um_stash_source = "m01s03i802" ; + fld_s03i802:missing_value = 1.e+20f ; + fld_s03i802:cell_methods = "time: mean" ; + fld_s03i802:grid_mapping = "latitude_longitude" ; + float fld_s03i803(time, pseudo_level_0, lat, lon) ; + fld_s03i803:_FillValue = 1.e+20f ; + fld_s03i803:standard_name = "soil_temperature" ; + fld_s03i803:long_name = "CABLE SOIL TEMPERATURE ON TILES LAYER 3" ; + fld_s03i803:units = "K" ; + fld_s03i803:um_stash_source = "m01s03i803" ; + fld_s03i803:missing_value = 1.e+20f ; + fld_s03i803:cell_methods = "time: mean" ; + fld_s03i803:grid_mapping = "latitude_longitude" ; + float fld_s03i804(time, pseudo_level_0, lat, lon) ; + fld_s03i804:_FillValue = 1.e+20f ; + fld_s03i804:standard_name = "soil_temperature" ; + fld_s03i804:long_name = "CABLE SOIL TEMPERATURE ON TILES LAYER 4" ; + fld_s03i804:units = "K" ; + fld_s03i804:um_stash_source = "m01s03i804" ; + fld_s03i804:missing_value = 1.e+20f ; + fld_s03i804:cell_methods = "time: mean" ; + fld_s03i804:grid_mapping = "latitude_longitude" ; + float fld_s03i805(time, pseudo_level_0, lat, lon) ; + fld_s03i805:_FillValue = 1.e+20f ; + fld_s03i805:standard_name = "soil_temperature" ; + fld_s03i805:long_name = "CABLE SOIL TEMPERATURE ON TILES LAYER 5" ; + fld_s03i805:units = "K" ; + fld_s03i805:um_stash_source = "m01s03i805" ; + fld_s03i805:missing_value = 1.e+20f ; + fld_s03i805:cell_methods = "time: mean" ; + fld_s03i805:grid_mapping = "latitude_longitude" ; + float fld_s03i806(time, pseudo_level_0, lat, lon) ; + fld_s03i806:_FillValue = 1.e+20f ; + fld_s03i806:standard_name = "soil_temperature" ; + fld_s03i806:long_name = "CABLE SOIL TEMPERATURE ON TILES LAYER 6" ; + fld_s03i806:units = "K" ; + fld_s03i806:um_stash_source = "m01s03i806" ; + fld_s03i806:missing_value = 1.e+20f ; + fld_s03i806:cell_methods = "time: mean" ; + fld_s03i806:grid_mapping = "latitude_longitude" ; + float fld_s03i807(time, pseudo_level_0, lat, lon) ; + fld_s03i807:_FillValue = 1.e+20f ; + fld_s03i807:standard_name = "moisture_content_of_soil_layer" ; + fld_s03i807:long_name = "CABLE SOIL MOISTURE ON TILES LAYER 1" ; + fld_s03i807:units = "kg m-2" ; + fld_s03i807:um_stash_source = "m01s03i807" ; + fld_s03i807:missing_value = 1.e+20f ; + fld_s03i807:cell_methods = "time: mean" ; + fld_s03i807:grid_mapping = "latitude_longitude" ; + float fld_s03i808(time, pseudo_level_0, lat, lon) ; + fld_s03i808:_FillValue = 1.e+20f ; + fld_s03i808:standard_name = "moisture_content_of_soil_layer" ; + fld_s03i808:long_name = "CABLE SOIL MOISTURE ON TILES LAYER 2" ; + fld_s03i808:units = "kg m-2" ; + fld_s03i808:um_stash_source = "m01s03i808" ; + fld_s03i808:missing_value = 1.e+20f ; + fld_s03i808:cell_methods = "time: mean" ; + fld_s03i808:grid_mapping = "latitude_longitude" ; + float fld_s03i809(time, pseudo_level_0, lat, lon) ; + fld_s03i809:_FillValue = 1.e+20f ; + fld_s03i809:standard_name = "moisture_content_of_soil_layer" ; + fld_s03i809:long_name = "CABLE SOIL MOISTURE ON TILES LAYER 3" ; + fld_s03i809:units = "kg m-2" ; + fld_s03i809:um_stash_source = "m01s03i809" ; + fld_s03i809:missing_value = 1.e+20f ; + fld_s03i809:cell_methods = "time: mean" ; + fld_s03i809:grid_mapping = "latitude_longitude" ; + float fld_s03i810(time, pseudo_level_0, lat, lon) ; + fld_s03i810:_FillValue = 1.e+20f ; + fld_s03i810:standard_name = "moisture_content_of_soil_layer" ; + fld_s03i810:long_name = "CABLE SOIL MOISTURE ON TILES LAYER 4" ; + fld_s03i810:units = "kg m-2" ; + fld_s03i810:um_stash_source = "m01s03i810" ; + fld_s03i810:missing_value = 1.e+20f ; + fld_s03i810:cell_methods = "time: mean" ; + fld_s03i810:grid_mapping = "latitude_longitude" ; + float fld_s03i811(time, pseudo_level_0, lat, lon) ; + fld_s03i811:_FillValue = 1.e+20f ; + fld_s03i811:standard_name = "moisture_content_of_soil_layer" ; + fld_s03i811:long_name = "CABLE SOIL MOISTURE ON TILES LAYER 5" ; + fld_s03i811:units = "kg m-2" ; + fld_s03i811:um_stash_source = "m01s03i811" ; + fld_s03i811:missing_value = 1.e+20f ; + fld_s03i811:cell_methods = "time: mean" ; + fld_s03i811:grid_mapping = "latitude_longitude" ; + float fld_s03i812(time, pseudo_level_0, lat, lon) ; + fld_s03i812:_FillValue = 1.e+20f ; + fld_s03i812:standard_name = "moisture_content_of_soil_layer" ; + fld_s03i812:long_name = "CABLE SOIL MOISTURE ON TILES LAYER 6" ; + fld_s03i812:units = "kg m-2" ; + fld_s03i812:um_stash_source = "m01s03i812" ; + fld_s03i812:missing_value = 1.e+20f ; + fld_s03i812:cell_methods = "time: mean" ; + fld_s03i812:grid_mapping = "latitude_longitude" ; + float fld_s03i813(time, pseudo_level_0, lat, lon) ; + fld_s03i813:_FillValue = 1.e+20f ; + fld_s03i813:standard_name = "mass_fraction_of_frozen_water_in_soil_moisture" ; + fld_s03i813:long_name = "CABLE FROZEN SOIL MOIST FRAC ON TILES LAYER 1" ; + fld_s03i813:units = "1" ; + fld_s03i813:um_stash_source = "m01s03i813" ; + fld_s03i813:missing_value = 1.e+20f ; + fld_s03i813:cell_methods = "time: mean" ; + fld_s03i813:grid_mapping = "latitude_longitude" ; + float fld_s03i814(time, pseudo_level_0, lat, lon) ; + fld_s03i814:_FillValue = 1.e+20f ; + fld_s03i814:standard_name = "mass_fraction_of_frozen_water_in_soil_moisture" ; + fld_s03i814:long_name = "CABLE FROZEN SOIL MOIST FRAC ON TILES LAYER 2" ; + fld_s03i814:units = "1" ; + fld_s03i814:um_stash_source = "m01s03i814" ; + fld_s03i814:missing_value = 1.e+20f ; + fld_s03i814:cell_methods = "time: mean" ; + fld_s03i814:grid_mapping = "latitude_longitude" ; + float fld_s03i815(time, pseudo_level_0, lat, lon) ; + fld_s03i815:_FillValue = 1.e+20f ; + fld_s03i815:standard_name = "mass_fraction_of_frozen_water_in_soil_moisture" ; + fld_s03i815:long_name = "CABLE FROZEN SOIL MOIST FRAC ON TILES LAYER 3" ; + fld_s03i815:units = "1" ; + fld_s03i815:um_stash_source = "m01s03i815" ; + fld_s03i815:missing_value = 1.e+20f ; + fld_s03i815:cell_methods = "time: mean" ; + fld_s03i815:grid_mapping = "latitude_longitude" ; + float fld_s03i816(time, pseudo_level_0, lat, lon) ; + fld_s03i816:_FillValue = 1.e+20f ; + fld_s03i816:standard_name = "mass_fraction_of_frozen_water_in_soil_moisture" ; + fld_s03i816:long_name = "CABLE FROZEN SOIL MOIST FRAC ON TILES LAYER 4" ; + fld_s03i816:units = "1" ; + fld_s03i816:um_stash_source = "m01s03i816" ; + fld_s03i816:missing_value = 1.e+20f ; + fld_s03i816:cell_methods = "time: mean" ; + fld_s03i816:grid_mapping = "latitude_longitude" ; + float fld_s03i817(time, pseudo_level_0, lat, lon) ; + fld_s03i817:_FillValue = 1.e+20f ; + fld_s03i817:standard_name = "mass_fraction_of_frozen_water_in_soil_moisture" ; + fld_s03i817:long_name = "CABLE FROZEN SOIL MOIST FRAC ON TILES LAYER 5" ; + fld_s03i817:units = "1" ; + fld_s03i817:um_stash_source = "m01s03i817" ; + fld_s03i817:missing_value = 1.e+20f ; + fld_s03i817:cell_methods = "time: mean" ; + fld_s03i817:grid_mapping = "latitude_longitude" ; + float fld_s03i818(time, pseudo_level_0, lat, lon) ; + fld_s03i818:_FillValue = 1.e+20f ; + fld_s03i818:standard_name = "mass_fraction_of_frozen_water_in_soil_moisture" ; + fld_s03i818:long_name = "CABLE FROZEN SOIL MOIST FRAC ON TILES LAYER 6" ; + fld_s03i818:units = "1" ; + fld_s03i818:um_stash_source = "m01s03i818" ; + fld_s03i818:missing_value = 1.e+20f ; + fld_s03i818:cell_methods = "time: mean" ; + fld_s03i818:grid_mapping = "latitude_longitude" ; + float fld_s03i819(time, pseudo_level_0, lat, lon) ; + fld_s03i819:_FillValue = 1.e+20f ; + fld_s03i819:standard_name = "surface_snow_thickness" ; + fld_s03i819:long_name = "CABLE SNOW DEPTH ON TILES LAYER 1" ; + fld_s03i819:units = "m" ; + fld_s03i819:um_stash_source = "m01s03i819" ; + fld_s03i819:missing_value = 1.e+20f ; + fld_s03i819:cell_methods = "time: mean" ; + fld_s03i819:grid_mapping = "latitude_longitude" ; + float fld_s03i820(time, pseudo_level_0, lat, lon) ; + fld_s03i820:_FillValue = 1.e+20f ; + fld_s03i820:standard_name = "surface_snow_thickness" ; + fld_s03i820:long_name = "CABLE SNOW DEPTH ON TILES LAYER 2" ; + fld_s03i820:units = "m" ; + fld_s03i820:um_stash_source = "m01s03i820" ; + fld_s03i820:missing_value = 1.e+20f ; + fld_s03i820:cell_methods = "time: mean" ; + fld_s03i820:grid_mapping = "latitude_longitude" ; + float fld_s03i821(time, pseudo_level_0, lat, lon) ; + fld_s03i821:_FillValue = 1.e+20f ; + fld_s03i821:standard_name = "surface_snow_thickness" ; + fld_s03i821:long_name = "CABLE SNOW DEPTH ON TILES LAYER 3" ; + fld_s03i821:units = "m" ; + fld_s03i821:um_stash_source = "m01s03i821" ; + fld_s03i821:missing_value = 1.e+20f ; + fld_s03i821:cell_methods = "time: mean" ; + fld_s03i821:grid_mapping = "latitude_longitude" ; + float fld_s03i822(time, pseudo_level_0, lat, lon) ; + fld_s03i822:_FillValue = 1.e+20f ; + fld_s03i822:standard_name = "surface_snow_amount" ; + fld_s03i822:long_name = "CABLE SNOW MASS ON TILES LAYER 1" ; + fld_s03i822:units = "kg m-2" ; + fld_s03i822:um_stash_source = "m01s03i822" ; + fld_s03i822:missing_value = 1.e+20f ; + fld_s03i822:cell_methods = "time: mean" ; + fld_s03i822:grid_mapping = "latitude_longitude" ; + float fld_s03i823(time, pseudo_level_0, lat, lon) ; + fld_s03i823:_FillValue = 1.e+20f ; + fld_s03i823:standard_name = "surface_snow_amount" ; + fld_s03i823:long_name = "CABLE SNOW MASS ON TILES LAYER 2" ; + fld_s03i823:units = "kg m-2" ; + fld_s03i823:um_stash_source = "m01s03i823" ; + fld_s03i823:missing_value = 1.e+20f ; + fld_s03i823:cell_methods = "time: mean" ; + fld_s03i823:grid_mapping = "latitude_longitude" ; + float fld_s03i824(time, pseudo_level_0, lat, lon) ; + fld_s03i824:_FillValue = 1.e+20f ; + fld_s03i824:standard_name = "surface_snow_amount" ; + fld_s03i824:long_name = "CABLE SNOW MASS ON TILES LAYER 3" ; + fld_s03i824:units = "kg m-2" ; + fld_s03i824:um_stash_source = "m01s03i824" ; + fld_s03i824:missing_value = 1.e+20f ; + fld_s03i824:cell_methods = "time: mean" ; + fld_s03i824:grid_mapping = "latitude_longitude" ; + float fld_s03i825(time, pseudo_level_0, lat, lon) ; + fld_s03i825:_FillValue = 1.e+20f ; + fld_s03i825:standard_name = "temperature_in_surface_snow" ; + fld_s03i825:long_name = "CABLE SNOW TEMPERATURE ON TILES LAYER 1" ; + fld_s03i825:units = "K" ; + fld_s03i825:um_stash_source = "m01s03i825" ; + fld_s03i825:missing_value = 1.e+20f ; + fld_s03i825:cell_methods = "time: mean" ; + fld_s03i825:grid_mapping = "latitude_longitude" ; + float fld_s03i826(time, pseudo_level_0, lat, lon) ; + fld_s03i826:_FillValue = 1.e+20f ; + fld_s03i826:standard_name = "temperature_in_surface_snow" ; + fld_s03i826:long_name = "CABLE SNOW TEMPERATURE ON TILES LAYER 2" ; + fld_s03i826:units = "K" ; + fld_s03i826:um_stash_source = "m01s03i826" ; + fld_s03i826:missing_value = 1.e+20f ; + fld_s03i826:cell_methods = "time: mean" ; + fld_s03i826:grid_mapping = "latitude_longitude" ; + float fld_s03i827(time, pseudo_level_0, lat, lon) ; + fld_s03i827:_FillValue = 1.e+20f ; + fld_s03i827:standard_name = "temperature_in_surface_snow" ; + fld_s03i827:long_name = "CABLE SNOW TEMPERATURE ON TILES LAYER 3" ; + fld_s03i827:units = "K" ; + fld_s03i827:um_stash_source = "m01s03i827" ; + fld_s03i827:missing_value = 1.e+20f ; + fld_s03i827:cell_methods = "time: mean" ; + fld_s03i827:grid_mapping = "latitude_longitude" ; + float fld_s03i828(time, pseudo_level_0, lat, lon) ; + fld_s03i828:_FillValue = 1.e+20f ; + fld_s03i828:standard_name = "snow_density" ; + fld_s03i828:long_name = "CABLE SNOW DENSITY ON TILES LAYER 1" ; + fld_s03i828:units = "kg m-3" ; + fld_s03i828:um_stash_source = "m01s03i828" ; + fld_s03i828:missing_value = 1.e+20f ; + fld_s03i828:cell_methods = "time: mean" ; + fld_s03i828:grid_mapping = "latitude_longitude" ; + float fld_s03i829(time, pseudo_level_0, lat, lon) ; + fld_s03i829:_FillValue = 1.e+20f ; + fld_s03i829:standard_name = "snow_density" ; + fld_s03i829:long_name = "CABLE SNOW DENSITY ON TILES LAYER 2" ; + fld_s03i829:units = "kg m-3" ; + fld_s03i829:um_stash_source = "m01s03i829" ; + fld_s03i829:missing_value = 1.e+20f ; + fld_s03i829:cell_methods = "time: mean" ; + fld_s03i829:grid_mapping = "latitude_longitude" ; + float fld_s03i830(time, pseudo_level_0, lat, lon) ; + fld_s03i830:_FillValue = 1.e+20f ; + fld_s03i830:standard_name = "snow_density" ; + fld_s03i830:long_name = "CABLE SNOW DENSITY ON TILES LAYER 3" ; + fld_s03i830:units = "kg m-3" ; + fld_s03i830:um_stash_source = "m01s03i830" ; + fld_s03i830:missing_value = 1.e+20f ; + fld_s03i830:cell_methods = "time: mean" ; + fld_s03i830:grid_mapping = "latitude_longitude" ; + float fld_s03i831(time, pseudo_level_0, lat, lon) ; + fld_s03i831:_FillValue = 1.e+20f ; + fld_s03i831:standard_name = "snow_density" ; + fld_s03i831:long_name = "CABLE MEAN SNOW DENSITY ON TILES" ; + fld_s03i831:units = "kg m-3" ; + fld_s03i831:um_stash_source = "m01s03i831" ; + fld_s03i831:missing_value = 1.e+20f ; + fld_s03i831:cell_methods = "time: mean" ; + fld_s03i831:grid_mapping = "latitude_longitude" ; + float fld_s03i832(time, pseudo_level_0, lat, lon) ; + fld_s03i832:_FillValue = 1.e+20f ; + fld_s03i832:standard_name = "age_of_surface_snow" ; + fld_s03i832:long_name = "CABLE SNOW AGE ON TILES" ; + fld_s03i832:units = "day" ; + fld_s03i832:um_stash_source = "m01s03i832" ; + fld_s03i832:missing_value = 1.e+20f ; + fld_s03i832:cell_methods = "time: mean" ; + fld_s03i832:grid_mapping = "latitude_longitude" ; + float fld_s03i835(time, pseudo_level_0, lat, lon) ; + fld_s03i835:_FillValue = 1.e+20f ; + fld_s03i835:long_name = "PREVIOUS YEAR SURF FRACTIONS (TILES)" ; + fld_s03i835:um_stash_source = "m01s03i835" ; + fld_s03i835:missing_value = 1.e+20f ; + fld_s03i835:cell_methods = "time: mean" ; + fld_s03i835:grid_mapping = "latitude_longitude" ; + float fld_s03i851(time_0, pseudo_level_0, lat, lon) ; + fld_s03i851:_FillValue = 1.e+20f ; + fld_s03i851:long_name = "CARBON POOL LABILE ON TILES" ; + fld_s03i851:um_stash_source = "m01s03i851" ; + fld_s03i851:missing_value = 1.e+20f ; + fld_s03i851:grid_mapping = "latitude_longitude" ; + double time_0(time_0) ; + time_0:axis = "T" ; + time_0:units = "days since 0001-01-01 00:00" ; + time_0:standard_name = "time" ; + time_0:calendar = "proleptic_gregorian" ; + float fld_s03i852(time_0, pseudo_level_0, lat, lon) ; + fld_s03i852:_FillValue = 1.e+20f ; + fld_s03i852:long_name = "CARBON POOL PLANT - LEAF ON TILES " ; + fld_s03i852:um_stash_source = "m01s03i852" ; + fld_s03i852:missing_value = 1.e+20f ; + fld_s03i852:grid_mapping = "latitude_longitude" ; + float fld_s03i853(time_0, pseudo_level_0, lat, lon) ; + fld_s03i853:_FillValue = 1.e+20f ; + fld_s03i853:long_name = "CARBON POOL PLANT - WOOD ON TILES" ; + fld_s03i853:um_stash_source = "m01s03i853" ; + fld_s03i853:missing_value = 1.e+20f ; + fld_s03i853:grid_mapping = "latitude_longitude" ; + float fld_s03i854(time_0, pseudo_level_0, lat, lon) ; + fld_s03i854:_FillValue = 1.e+20f ; + fld_s03i854:long_name = "CARBON POOL PLANT - ROOT ON TILES" ; + fld_s03i854:um_stash_source = "m01s03i854" ; + fld_s03i854:missing_value = 1.e+20f ; + fld_s03i854:grid_mapping = "latitude_longitude" ; + float fld_s03i855(time_0, pseudo_level_0, lat, lon) ; + fld_s03i855:_FillValue = 1.e+20f ; + fld_s03i855:long_name = "CARBON POOL LITTER - METB ON TILES" ; + fld_s03i855:um_stash_source = "m01s03i855" ; + fld_s03i855:missing_value = 1.e+20f ; + fld_s03i855:grid_mapping = "latitude_longitude" ; + float fld_s03i856(time_0, pseudo_level_0, lat, lon) ; + fld_s03i856:_FillValue = 1.e+20f ; + fld_s03i856:long_name = "CARBON POOL LITTER - STR ON TILES" ; + fld_s03i856:um_stash_source = "m01s03i856" ; + fld_s03i856:missing_value = 1.e+20f ; + fld_s03i856:grid_mapping = "latitude_longitude" ; + float fld_s03i857(time_0, pseudo_level_0, lat, lon) ; + fld_s03i857:_FillValue = 1.e+20f ; + fld_s03i857:long_name = "CARBON POOL LITTER - CWD ON TILES" ; + fld_s03i857:um_stash_source = "m01s03i857" ; + fld_s03i857:missing_value = 1.e+20f ; + fld_s03i857:grid_mapping = "latitude_longitude" ; + float fld_s03i858(time_0, pseudo_level_0, lat, lon) ; + fld_s03i858:_FillValue = 1.e+20f ; + fld_s03i858:long_name = "CARBON POOL SOIL - MIC ON TILES" ; + fld_s03i858:um_stash_source = "m01s03i858" ; + fld_s03i858:missing_value = 1.e+20f ; + fld_s03i858:grid_mapping = "latitude_longitude" ; + float fld_s03i859(time_0, pseudo_level_0, lat, lon) ; + fld_s03i859:_FillValue = 1.e+20f ; + fld_s03i859:long_name = "CARBON POOL SOIL - SLOW ON TILES" ; + fld_s03i859:um_stash_source = "m01s03i859" ; + fld_s03i859:missing_value = 1.e+20f ; + fld_s03i859:grid_mapping = "latitude_longitude" ; + float fld_s03i860(time_0, pseudo_level_0, lat, lon) ; + fld_s03i860:_FillValue = 1.e+20f ; + fld_s03i860:long_name = "CARBON POOL SOIL - PASS ON TILES" ; + fld_s03i860:um_stash_source = "m01s03i860" ; + fld_s03i860:missing_value = 1.e+20f ; + fld_s03i860:grid_mapping = "latitude_longitude" ; + float fld_s03i861(time_0, pseudo_level_0, lat, lon) ; + fld_s03i861:_FillValue = 1.e+20f ; + fld_s03i861:long_name = "NITROGEN POOL PLANT - LEAF ON TILES" ; + fld_s03i861:um_stash_source = "m01s03i861" ; + fld_s03i861:missing_value = 1.e+20f ; + fld_s03i861:grid_mapping = "latitude_longitude" ; + float fld_s03i862(time_0, pseudo_level_0, lat, lon) ; + fld_s03i862:_FillValue = 1.e+20f ; + fld_s03i862:long_name = "NITROGEN POOL PLANT - WOOD ON TILES" ; + fld_s03i862:um_stash_source = "m01s03i862" ; + fld_s03i862:missing_value = 1.e+20f ; + fld_s03i862:grid_mapping = "latitude_longitude" ; + float fld_s03i863(time_0, pseudo_level_0, lat, lon) ; + fld_s03i863:_FillValue = 1.e+20f ; + fld_s03i863:long_name = "NITROGEN POOL PLANT - ROOT ON TILES" ; + fld_s03i863:um_stash_source = "m01s03i863" ; + fld_s03i863:missing_value = 1.e+20f ; + fld_s03i863:grid_mapping = "latitude_longitude" ; + float fld_s03i864(time_0, pseudo_level_0, lat, lon) ; + fld_s03i864:_FillValue = 1.e+20f ; + fld_s03i864:long_name = "NITROGEN POOL LITTER - METB ON TILES" ; + fld_s03i864:um_stash_source = "m01s03i864" ; + fld_s03i864:missing_value = 1.e+20f ; + fld_s03i864:grid_mapping = "latitude_longitude" ; + float fld_s03i865(time_0, pseudo_level_0, lat, lon) ; + fld_s03i865:_FillValue = 1.e+20f ; + fld_s03i865:long_name = "NITROGEN POOL LITTER - STR ON TILES" ; + fld_s03i865:um_stash_source = "m01s03i865" ; + fld_s03i865:missing_value = 1.e+20f ; + fld_s03i865:grid_mapping = "latitude_longitude" ; + float fld_s03i866(time_0, pseudo_level_0, lat, lon) ; + fld_s03i866:_FillValue = 1.e+20f ; + fld_s03i866:long_name = "NITROGEN POOL LITTER - CWD ON TILES" ; + fld_s03i866:um_stash_source = "m01s03i866" ; + fld_s03i866:missing_value = 1.e+20f ; + fld_s03i866:grid_mapping = "latitude_longitude" ; + float fld_s03i867(time_0, pseudo_level_0, lat, lon) ; + fld_s03i867:_FillValue = 1.e+20f ; + fld_s03i867:long_name = "NITROGEN POOL SOIL - MIC ON TILE" ; + fld_s03i867:um_stash_source = "m01s03i867" ; + fld_s03i867:missing_value = 1.e+20f ; + fld_s03i867:grid_mapping = "latitude_longitude" ; + float fld_s03i868(time_0, pseudo_level_0, lat, lon) ; + fld_s03i868:_FillValue = 1.e+20f ; + fld_s03i868:long_name = "NITROGEN POOL SOIL - SLOW ON TILES" ; + fld_s03i868:um_stash_source = "m01s03i868" ; + fld_s03i868:missing_value = 1.e+20f ; + fld_s03i868:grid_mapping = "latitude_longitude" ; + float fld_s03i869(time_0, pseudo_level_0, lat, lon) ; + fld_s03i869:_FillValue = 1.e+20f ; + fld_s03i869:long_name = "NITROGEN POOL SOIL - PASS ON TILES" ; + fld_s03i869:um_stash_source = "m01s03i869" ; + fld_s03i869:missing_value = 1.e+20f ; + fld_s03i869:grid_mapping = "latitude_longitude" ; + float fld_s03i870(time_0, pseudo_level_0, lat, lon) ; + fld_s03i870:_FillValue = 1.e+20f ; + fld_s03i870:long_name = "NITROGEN POOL SOIL MINIMUM (TILES)" ; + fld_s03i870:um_stash_source = "m01s03i870" ; + fld_s03i870:missing_value = 1.e+20f ; + fld_s03i870:grid_mapping = "latitude_longitude" ; + float fld_s03i871(time_0, pseudo_level_0, lat, lon) ; + fld_s03i871:_FillValue = 1.e+20f ; + fld_s03i871:long_name = "PHOSPHORUS POOL PLANT - LEAF (TILES)" ; + fld_s03i871:um_stash_source = "m01s03i871" ; + fld_s03i871:missing_value = 1.e+20f ; + fld_s03i871:grid_mapping = "latitude_longitude" ; + float fld_s03i872(time_0, pseudo_level_0, lat, lon) ; + fld_s03i872:_FillValue = 1.e+20f ; + fld_s03i872:long_name = "PHOSPHORUS POOL PLANT - WOOD (TILES)" ; + fld_s03i872:um_stash_source = "m01s03i872" ; + fld_s03i872:missing_value = 1.e+20f ; + fld_s03i872:grid_mapping = "latitude_longitude" ; + float fld_s03i873(time_0, pseudo_level_0, lat, lon) ; + fld_s03i873:_FillValue = 1.e+20f ; + fld_s03i873:long_name = "PHOSPHORUS POOL PLANT - ROOT (TILES)" ; + fld_s03i873:um_stash_source = "m01s03i873" ; + fld_s03i873:missing_value = 1.e+20f ; + fld_s03i873:grid_mapping = "latitude_longitude" ; + float fld_s03i874(time_0, pseudo_level_0, lat, lon) ; + fld_s03i874:_FillValue = 1.e+20f ; + fld_s03i874:long_name = "PHOSPHORUS POOL LITTER- METB (TILES)" ; + fld_s03i874:um_stash_source = "m01s03i874" ; + fld_s03i874:missing_value = 1.e+20f ; + fld_s03i874:grid_mapping = "latitude_longitude" ; + float fld_s03i875(time_0, pseudo_level_0, lat, lon) ; + fld_s03i875:_FillValue = 1.e+20f ; + fld_s03i875:long_name = "PHOSPHORUS POOL LITTER - STR (TILES)" ; + fld_s03i875:um_stash_source = "m01s03i875" ; + fld_s03i875:missing_value = 1.e+20f ; + fld_s03i875:grid_mapping = "latitude_longitude" ; + float fld_s03i876(time_0, pseudo_level_0, lat, lon) ; + fld_s03i876:_FillValue = 1.e+20f ; + fld_s03i876:long_name = "PHOSPHORUS POOL LITTER - CWD (TILES)" ; + fld_s03i876:um_stash_source = "m01s03i876" ; + fld_s03i876:missing_value = 1.e+20f ; + fld_s03i876:grid_mapping = "latitude_longitude" ; + float fld_s03i877(time_0, pseudo_level_0, lat, lon) ; + fld_s03i877:_FillValue = 1.e+20f ; + fld_s03i877:long_name = "PHOSPHORUS POOL SOIL - MIC (TILES)" ; + fld_s03i877:um_stash_source = "m01s03i877" ; + fld_s03i877:missing_value = 1.e+20f ; + fld_s03i877:grid_mapping = "latitude_longitude" ; + float fld_s03i878(time_0, pseudo_level_0, lat, lon) ; + fld_s03i878:_FillValue = 1.e+20f ; + fld_s03i878:long_name = "PHOSPHORUS POOL SOIL - SLOW (TILES)" ; + fld_s03i878:um_stash_source = "m01s03i878" ; + fld_s03i878:missing_value = 1.e+20f ; + fld_s03i878:grid_mapping = "latitude_longitude" ; + float fld_s03i879(time_0, pseudo_level_0, lat, lon) ; + fld_s03i879:_FillValue = 1.e+20f ; + fld_s03i879:long_name = "PHOSPHORUS POOL SOIL - PASS (TILES)" ; + fld_s03i879:um_stash_source = "m01s03i879" ; + fld_s03i879:missing_value = 1.e+20f ; + fld_s03i879:grid_mapping = "latitude_longitude" ; + float fld_s03i880(time_0, pseudo_level_0, lat, lon) ; + fld_s03i880:_FillValue = 1.e+20f ; + fld_s03i880:long_name = "PHOSPHORUS POOL SOIL LABILE (TILES)" ; + fld_s03i880:um_stash_source = "m01s03i880" ; + fld_s03i880:missing_value = 1.e+20f ; + fld_s03i880:grid_mapping = "latitude_longitude" ; + float fld_s03i881(time_0, pseudo_level_0, lat, lon) ; + fld_s03i881:_FillValue = 1.e+20f ; + fld_s03i881:long_name = "PHOSPHORUS POOL SOIL SORB ON TILES" ; + fld_s03i881:um_stash_source = "m01s03i881" ; + fld_s03i881:missing_value = 1.e+20f ; + fld_s03i881:grid_mapping = "latitude_longitude" ; + float fld_s03i882(time_0, pseudo_level_0, lat, lon) ; + fld_s03i882:_FillValue = 1.e+20f ; + fld_s03i882:long_name = "PHOSPHORUS POOL SOIL OCC ON TILES" ; + fld_s03i882:um_stash_source = "m01s03i882" ; + fld_s03i882:missing_value = 1.e+20f ; + fld_s03i882:grid_mapping = "latitude_longitude" ; + float fld_s03i884(time, pseudo_level_0, lat, lon) ; + fld_s03i884:_FillValue = 1.e+20f ; + fld_s03i884:long_name = "NITROGEN DEPOSITION" ; + fld_s03i884:um_stash_source = "m01s03i884" ; + fld_s03i884:missing_value = 1.e+20f ; + fld_s03i884:cell_methods = "time: mean" ; + fld_s03i884:grid_mapping = "latitude_longitude" ; + float fld_s03i885(time, pseudo_level_0, lat, lon) ; + fld_s03i885:_FillValue = 1.e+20f ; + fld_s03i885:long_name = "NITROGEN FIXATION" ; + fld_s03i885:um_stash_source = "m01s03i885" ; + fld_s03i885:missing_value = 1.e+20f ; + fld_s03i885:cell_methods = "time: mean" ; + fld_s03i885:grid_mapping = "latitude_longitude" ; + float fld_s03i893(time, pseudo_level_0, lat, lon) ; + fld_s03i893:_FillValue = 1.e+20f ; + fld_s03i893:long_name = "LEAF AREA INDEX (CASA-CNP GLAI)" ; + fld_s03i893:um_stash_source = "m01s03i893" ; + fld_s03i893:missing_value = 1.e+20f ; + fld_s03i893:cell_methods = "time: mean" ; + fld_s03i893:grid_mapping = "latitude_longitude" ; + float fld_s03i895(time, pseudo_level_0, lat, lon) ; + fld_s03i895:_FillValue = 1.e+20f ; + fld_s03i895:long_name = "WOOD FLUX CARBON (CASA-CNP)" ; + fld_s03i895:um_stash_source = "m01s03i895" ; + fld_s03i895:missing_value = 1.e+20f ; + fld_s03i895:cell_methods = "time: mean" ; + fld_s03i895:grid_mapping = "latitude_longitude" ; + float fld_s03i896(time, pseudo_level_0, lat, lon) ; + fld_s03i896:_FillValue = 1.e+20f ; + fld_s03i896:long_name = "WOOD FLUX NITROGEN (CASA-CNP)" ; + fld_s03i896:um_stash_source = "m01s03i896" ; + fld_s03i896:missing_value = 1.e+20f ; + fld_s03i896:cell_methods = "time: mean" ; + fld_s03i896:grid_mapping = "latitude_longitude" ; + float fld_s03i897(time, pseudo_level_0, lat, lon) ; + fld_s03i897:_FillValue = 1.e+20f ; + fld_s03i897:long_name = "WOOD FLUX PHOSPHOR (CASA-CNP)" ; + fld_s03i897:um_stash_source = "m01s03i897" ; + fld_s03i897:missing_value = 1.e+20f ; + fld_s03i897:cell_methods = "time: mean" ; + fld_s03i897:grid_mapping = "latitude_longitude" ; + float fld_s03i898(time_0, pseudo_level_0, lat, lon) ; + fld_s03i898:_FillValue = 1.e+20f ; + fld_s03i898:long_name = "WOOD HARVEST CARBON1(CASA-CNP)" ; + fld_s03i898:um_stash_source = "m01s03i898" ; + fld_s03i898:missing_value = 1.e+20f ; + fld_s03i898:grid_mapping = "latitude_longitude" ; + float fld_s03i899(time_0, pseudo_level_0, lat, lon) ; + fld_s03i899:_FillValue = 1.e+20f ; + fld_s03i899:long_name = "WOOD HARVEST CARBON2(CASA-CNP)" ; + fld_s03i899:um_stash_source = "m01s03i899" ; + fld_s03i899:missing_value = 1.e+20f ; + fld_s03i899:grid_mapping = "latitude_longitude" ; + float fld_s03i900(time_0, pseudo_level_0, lat, lon) ; + fld_s03i900:_FillValue = 1.e+20f ; + fld_s03i900:long_name = "WOOD HARVEST CARBON3(CASA-CNP)" ; + fld_s03i900:um_stash_source = "m01s03i900" ; + fld_s03i900:missing_value = 1.e+20f ; + fld_s03i900:grid_mapping = "latitude_longitude" ; + float fld_s03i901(time_0, pseudo_level_0, lat, lon) ; + fld_s03i901:_FillValue = 1.e+20f ; + fld_s03i901:long_name = "WOOD HARVEST NITROG1(CASA-CNP)" ; + fld_s03i901:um_stash_source = "m01s03i901" ; + fld_s03i901:missing_value = 1.e+20f ; + fld_s03i901:grid_mapping = "latitude_longitude" ; + float fld_s03i902(time_0, pseudo_level_0, lat, lon) ; + fld_s03i902:_FillValue = 1.e+20f ; + fld_s03i902:long_name = "WOOD HARVEST NITROG2(CASA-CNP)" ; + fld_s03i902:um_stash_source = "m01s03i902" ; + fld_s03i902:missing_value = 1.e+20f ; + fld_s03i902:grid_mapping = "latitude_longitude" ; + float fld_s03i903(time_0, pseudo_level_0, lat, lon) ; + fld_s03i903:_FillValue = 1.e+20f ; + fld_s03i903:long_name = "WOOD HARVEST NITROG3(CASA-CNP)" ; + fld_s03i903:um_stash_source = "m01s03i903" ; + fld_s03i903:missing_value = 1.e+20f ; + fld_s03i903:grid_mapping = "latitude_longitude" ; + float fld_s03i904(time_0, pseudo_level_0, lat, lon) ; + fld_s03i904:_FillValue = 1.e+20f ; + fld_s03i904:long_name = "WOOD HARVEST PHOSPH1(CASA-CNP)" ; + fld_s03i904:um_stash_source = "m01s03i904" ; + fld_s03i904:missing_value = 1.e+20f ; + fld_s03i904:grid_mapping = "latitude_longitude" ; + float fld_s03i905(time_0, pseudo_level_0, lat, lon) ; + fld_s03i905:_FillValue = 1.e+20f ; + fld_s03i905:long_name = "WOOD HARVEST PHOSPH2(CASA-CNP)" ; + fld_s03i905:um_stash_source = "m01s03i905" ; + fld_s03i905:missing_value = 1.e+20f ; + fld_s03i905:grid_mapping = "latitude_longitude" ; + float fld_s03i906(time_0, pseudo_level_0, lat, lon) ; + fld_s03i906:_FillValue = 1.e+20f ; + fld_s03i906:long_name = "WOOD HARVEST PHOSPH3(CASA-CNP)" ; + fld_s03i906:um_stash_source = "m01s03i906" ; + fld_s03i906:missing_value = 1.e+20f ; + fld_s03i906:grid_mapping = "latitude_longitude" ; + float fld_s03i907(time, pseudo_level_0, lat, lon) ; + fld_s03i907:_FillValue = 1.e+20f ; + fld_s03i907:long_name = "WOOD RESPIRA CARBON1(CASA-CNP)" ; + fld_s03i907:um_stash_source = "m01s03i907" ; + fld_s03i907:missing_value = 1.e+20f ; + fld_s03i907:cell_methods = "time: mean" ; + fld_s03i907:grid_mapping = "latitude_longitude" ; + float fld_s03i908(time, pseudo_level_0, lat, lon) ; + fld_s03i908:_FillValue = 1.e+20f ; + fld_s03i908:long_name = "WOOD RESPIRA CARBON2(CASA-CNP)" ; + fld_s03i908:um_stash_source = "m01s03i908" ; + fld_s03i908:missing_value = 1.e+20f ; + fld_s03i908:cell_methods = "time: mean" ; + fld_s03i908:grid_mapping = "latitude_longitude" ; + float fld_s03i909(time, pseudo_level_0, lat, lon) ; + fld_s03i909:_FillValue = 1.e+20f ; + fld_s03i909:long_name = "WOOD RESPIRA CARBON3(CASA-CNP)" ; + fld_s03i909:um_stash_source = "m01s03i909" ; + fld_s03i909:missing_value = 1.e+20f ; + fld_s03i909:cell_methods = "time: mean" ; + fld_s03i909:grid_mapping = "latitude_longitude" ; + float fld_s03i910(time, pseudo_level_0, lat, lon) ; + fld_s03i910:_FillValue = 1.e+20f ; + fld_s03i910:long_name = "WOOD RESPIRA NITROG1(CASA-CNP)" ; + fld_s03i910:um_stash_source = "m01s03i910" ; + fld_s03i910:missing_value = 1.e+20f ; + fld_s03i910:cell_methods = "time: mean" ; + fld_s03i910:grid_mapping = "latitude_longitude" ; + float fld_s03i911(time, pseudo_level_0, lat, lon) ; + fld_s03i911:_FillValue = 1.e+20f ; + fld_s03i911:long_name = "WOOD RESPIRA NITROG2(CASA-CNP)" ; + fld_s03i911:um_stash_source = "m01s03i911" ; + fld_s03i911:missing_value = 1.e+20f ; + fld_s03i911:cell_methods = "time: mean" ; + fld_s03i911:grid_mapping = "latitude_longitude" ; + float fld_s03i912(time, pseudo_level_0, lat, lon) ; + fld_s03i912:_FillValue = 1.e+20f ; + fld_s03i912:long_name = "WOOD RESPIRA NITROG3(CASA-CNP)" ; + fld_s03i912:um_stash_source = "m01s03i912" ; + fld_s03i912:missing_value = 1.e+20f ; + fld_s03i912:cell_methods = "time: mean" ; + fld_s03i912:grid_mapping = "latitude_longitude" ; + float fld_s03i913(time, pseudo_level_0, lat, lon) ; + fld_s03i913:_FillValue = 1.e+20f ; + fld_s03i913:long_name = "WOOD RESPIRA PHOSPH1(CASA-CNP)" ; + fld_s03i913:um_stash_source = "m01s03i913" ; + fld_s03i913:missing_value = 1.e+20f ; + fld_s03i913:cell_methods = "time: mean" ; + fld_s03i913:grid_mapping = "latitude_longitude" ; + float fld_s03i914(time, pseudo_level_0, lat, lon) ; + fld_s03i914:_FillValue = 1.e+20f ; + fld_s03i914:long_name = "WOOD RESPIRA PHOSPH2(CASA-CNP)" ; + fld_s03i914:um_stash_source = "m01s03i914" ; + fld_s03i914:missing_value = 1.e+20f ; + fld_s03i914:cell_methods = "time: mean" ; + fld_s03i914:grid_mapping = "latitude_longitude" ; + float fld_s03i915(time, pseudo_level_0, lat, lon) ; + fld_s03i915:_FillValue = 1.e+20f ; + fld_s03i915:long_name = "WOOD RESPIRA PHOSPH3(CASA-CNP)" ; + fld_s03i915:um_stash_source = "m01s03i915" ; + fld_s03i915:missing_value = 1.e+20f ; + fld_s03i915:cell_methods = "time: mean" ; + fld_s03i915:grid_mapping = "latitude_longitude" ; + float fld_s03i916(time, pseudo_level_0, lat, lon) ; + fld_s03i916:_FillValue = 1.e+20f ; + fld_s03i916:long_name = "THIN RATIO FOR FOREST (CASA-CNP)" ; + fld_s03i916:um_stash_source = "m01s03i916" ; + fld_s03i916:missing_value = 1.e+20f ; + fld_s03i916:cell_methods = "time: mean" ; + fld_s03i916:grid_mapping = "latitude_longitude" ; + float fld_s03i917(time, pseudo_level_0, lat, lon) ; + fld_s03i917:_FillValue = 1.e+20f ; + fld_s03i917:long_name = "NITROGEN NET RELEASE (CASA-CNP)" ; + fld_s03i917:um_stash_source = "m01s03i917" ; + fld_s03i917:missing_value = 1.e+20f ; + fld_s03i917:cell_methods = "time: mean" ; + fld_s03i917:grid_mapping = "latitude_longitude" ; + float fld_s03i918(time, pseudo_level_0, lat, lon) ; + fld_s03i918:_FillValue = 1.e+20f ; + fld_s03i918:long_name = "NITROGEN LEACHING (CASA-CNP)" ; + fld_s03i918:um_stash_source = "m01s03i918" ; + fld_s03i918:missing_value = 1.e+20f ; + fld_s03i918:cell_methods = "time: mean" ; + fld_s03i918:grid_mapping = "latitude_longitude" ; + float fld_s03i919(time, pseudo_level_0, lat, lon) ; + fld_s03i919:_FillValue = 1.e+20f ; + fld_s03i919:long_name = "NITROGEN UPTAKE (CASA-CNP)" ; + fld_s03i919:um_stash_source = "m01s03i919" ; + fld_s03i919:missing_value = 1.e+20f ; + fld_s03i919:cell_methods = "time: mean" ; + fld_s03i919:grid_mapping = "latitude_longitude" ; + float fld_s03i920(time, pseudo_level_0, lat, lon) ; + fld_s03i920:_FillValue = 1.e+20f ; + fld_s03i920:long_name = "NITROGEN LOSS (CASA-CNP)" ; + fld_s03i920:um_stash_source = "m01s03i920" ; + fld_s03i920:missing_value = 1.e+20f ; + fld_s03i920:cell_methods = "time: mean" ; + fld_s03i920:grid_mapping = "latitude_longitude" ; + float fld_s04i203(time, lat, lon) ; + fld_s04i203:_FillValue = 1.e+20f ; + fld_s04i203:standard_name = "stratiform_rainfall_flux" ; + fld_s04i203:long_name = "LARGE SCALE RAINFALL RATE KG/M2/S" ; + fld_s04i203:units = "kg m-2 s-1" ; + fld_s04i203:um_stash_source = "m01s04i203" ; + fld_s04i203:missing_value = 1.e+20f ; + fld_s04i203:cell_methods = "time: mean" ; + fld_s04i203:grid_mapping = "latitude_longitude" ; + float fld_s04i204(time, lat, lon) ; + fld_s04i204:_FillValue = 1.e+20f ; + fld_s04i204:standard_name = "stratiform_snowfall_flux" ; + fld_s04i204:long_name = "LARGE SCALE SNOWFALL RATE KG/M2/S" ; + fld_s04i204:units = "kg m-2 s-1" ; + fld_s04i204:um_stash_source = "m01s04i204" ; + fld_s04i204:missing_value = 1.e+20f ; + fld_s04i204:cell_methods = "time: mean" ; + fld_s04i204:grid_mapping = "latitude_longitude" ; + float fld_s05i205(time, lat, lon) ; + fld_s05i205:_FillValue = 1.e+20f ; + fld_s05i205:standard_name = "convective_rainfall_flux" ; + fld_s05i205:long_name = "CONVECTIVE RAINFALL RATE KG/M2/S" ; + fld_s05i205:units = "kg m-2 s-1" ; + fld_s05i205:um_stash_source = "m01s05i205" ; + fld_s05i205:missing_value = 1.e+20f ; + fld_s05i205:cell_methods = "time: mean" ; + fld_s05i205:grid_mapping = "latitude_longitude" ; + float fld_s05i206(time, lat, lon) ; + fld_s05i206:_FillValue = 1.e+20f ; + fld_s05i206:standard_name = "convective_snowfall_flux" ; + fld_s05i206:long_name = "CONVECTIVE SNOWFALL RATE KG/M2/S" ; + fld_s05i206:units = "kg m-2 s-1" ; + fld_s05i206:um_stash_source = "m01s05i206" ; + fld_s05i206:missing_value = 1.e+20f ; + fld_s05i206:cell_methods = "time: mean" ; + fld_s05i206:grid_mapping = "latitude_longitude" ; + float fld_s05i208(time, lat, lon) ; + fld_s05i208:_FillValue = 1.e+20f ; + fld_s05i208:standard_name = "air_pressure_at_convective_cloud_top" ; + fld_s05i208:long_name = "PRESSURE AT CONVECTIVE CLOUD TOP" ; + fld_s05i208:units = "Pa" ; + fld_s05i208:um_stash_source = "m01s05i208" ; + fld_s05i208:missing_value = 1.e+20f ; + fld_s05i208:cell_methods = "time: mean" ; + fld_s05i208:grid_mapping = "latitude_longitude" ; + float fld_s05i214(time, lat, lon) ; + fld_s05i214:_FillValue = 1.e+20f ; + fld_s05i214:standard_name = "rainfall_flux" ; + fld_s05i214:long_name = "TOTAL RAINFALL RATE: LS+CONV KG/M2/S" ; + fld_s05i214:units = "kg m-2 s-1" ; + fld_s05i214:um_stash_source = "m01s05i214" ; + fld_s05i214:missing_value = 1.e+20f ; + fld_s05i214:cell_methods = "time: mean" ; + fld_s05i214:grid_mapping = "latitude_longitude" ; + float fld_s05i215(time, lat, lon) ; + fld_s05i215:_FillValue = 1.e+20f ; + fld_s05i215:standard_name = "snowfall_flux" ; + fld_s05i215:long_name = "TOTAL SNOWFALL RATE: LS+CONV KG/M2/S" ; + fld_s05i215:units = "kg m-2 s-1" ; + fld_s05i215:um_stash_source = "m01s05i215" ; + fld_s05i215:missing_value = 1.e+20f ; + fld_s05i215:cell_methods = "time: mean" ; + fld_s05i215:grid_mapping = "latitude_longitude" ; + float fld_s05i216(time, lat, lon) ; + fld_s05i216:_FillValue = 1.e+20f ; + fld_s05i216:standard_name = "precipitation_flux" ; + fld_s05i216:long_name = "TOTAL PRECIPITATION RATE KG/M2/S" ; + fld_s05i216:units = "kg m-2 s-1" ; + fld_s05i216:um_stash_source = "m01s05i216" ; + fld_s05i216:missing_value = 1.e+20f ; + fld_s05i216:cell_methods = "time: mean" ; + fld_s05i216:grid_mapping = "latitude_longitude" ; + float fld_s05i222(time, lat, lon) ; + fld_s05i222:_FillValue = 1.e+20f ; + fld_s05i222:standard_name = "air_pressure_at_convective_cloud_base" ; + fld_s05i222:long_name = "PRESSURE AT LOWEST CONV CLOUD BASE" ; + fld_s05i222:units = "Pa" ; + fld_s05i222:um_stash_source = "m01s05i222" ; + fld_s05i222:missing_value = 1.e+20f ; + fld_s05i222:cell_methods = "time: mean" ; + fld_s05i222:grid_mapping = "latitude_longitude" ; + float fld_s05i270(time, lat, lon) ; + fld_s05i270:_FillValue = 1.e+20f ; + fld_s05i270:long_name = "shallow convection indicator" ; + fld_s05i270:units = "1" ; + fld_s05i270:um_stash_source = "m01s05i270" ; + fld_s05i270:missing_value = 1.e+20f ; + fld_s05i270:cell_methods = "time: mean" ; + fld_s05i270:grid_mapping = "latitude_longitude" ; + float fld_s05i284(time, lat, lon) ; + fld_s05i284:_FillValue = 1.e+20f ; + fld_s05i284:long_name = "Dust wet deposition flux due to convective precipitation division 4" ; + fld_s05i284:units = "kg m-2 s-1" ; + fld_s05i284:um_stash_source = "m01s05i284" ; + fld_s05i284:missing_value = 1.e+20f ; + fld_s05i284:cell_methods = "time: mean" ; + fld_s05i284:grid_mapping = "latitude_longitude" ; + float fld_s08i023(time, lat, lon) ; + fld_s08i023:_FillValue = 1.e+20f ; + fld_s08i023:standard_name = "surface_snow_amount" ; + fld_s08i023:long_name = "SNOW MASS AFTER HYDROLOGY KG/M2" ; + fld_s08i023:units = "kg m-2" ; + fld_s08i023:um_stash_source = "m01s08i023" ; + fld_s08i023:missing_value = 1.e+20f ; + fld_s08i023:cell_methods = "time: mean" ; + fld_s08i023:grid_mapping = "latitude_longitude" ; + float fld_s08i202(time, lat, lon) ; + fld_s08i202:_FillValue = 1.e+20f ; + fld_s08i202:long_name = "surface_snow_melt_flux_where_land" ; + fld_s08i202:units = "W m-2" ; + fld_s08i202:um_stash_source = "m01s08i202" ; + fld_s08i202:missing_value = 1.e+20f ; + fld_s08i202:cell_methods = "time: mean" ; + fld_s08i202:grid_mapping = "latitude_longitude" ; + float fld_s08i208(time, lat, lon) ; + fld_s08i208:_FillValue = 1.e+20f ; + fld_s08i208:standard_name = "mass_content_of_water_in_soil" ; + fld_s08i208:long_name = "SOIL MOISTURE CONTENT" ; + fld_s08i208:units = "kg m-2" ; + fld_s08i208:um_stash_source = "m01s08i208" ; + fld_s08i208:missing_value = 1.e+20f ; + fld_s08i208:cell_methods = "time: mean" ; + fld_s08i208:grid_mapping = "latitude_longitude" ; + float fld_s08i223(time, soil_model_level_number, lat, lon) ; + fld_s08i223:_FillValue = 1.e+20f ; + fld_s08i223:standard_name = "mass_content_of_water_in_soil_layer" ; + fld_s08i223:long_name = "SOIL MOISTURE CONTENT IN A LAYER" ; + fld_s08i223:units = "kg m-2" ; + fld_s08i223:um_stash_source = "m01s08i223" ; + fld_s08i223:missing_value = 1.e+20f ; + fld_s08i223:cell_methods = "time: mean" ; + fld_s08i223:grid_mapping = "latitude_longitude" ; + int soil_model_level_number(soil_model_level_number) ; + soil_model_level_number:axis = "Z" ; + soil_model_level_number:units = "1" ; + soil_model_level_number:long_name = "soil_model_level_number" ; + soil_model_level_number:positive = "down" ; + float fld_s08i225(time, soil_model_level_number, lat, lon) ; + fld_s08i225:_FillValue = 1.e+20f ; + fld_s08i225:standard_name = "soil_temperature" ; + fld_s08i225:long_name = "DEEP SOIL TEMP. AFTER HYDROLOGY DEGK" ; + fld_s08i225:units = "K" ; + fld_s08i225:um_stash_source = "m01s08i225" ; + fld_s08i225:missing_value = 1.e+20f ; + fld_s08i225:cell_methods = "time: mean" ; + fld_s08i225:grid_mapping = "latitude_longitude" ; + float fld_s08i229(time, soil_model_level_number, lat, lon) ; + fld_s08i229:_FillValue = 1.e+20f ; + fld_s08i229:standard_name = "mass_fraction_of_unfrozen_water_in_soil_moisture" ; + fld_s08i229:long_name = "UNFROZEN SOIL MOISTURE FRACTION" ; + fld_s08i229:units = "1" ; + fld_s08i229:um_stash_source = "m01s08i229" ; + fld_s08i229:missing_value = 1.e+20f ; + fld_s08i229:cell_methods = "time: mean" ; + fld_s08i229:grid_mapping = "latitude_longitude" ; + float fld_s08i230(time, soil_model_level_number, lat, lon) ; + fld_s08i230:_FillValue = 1.e+20f ; + fld_s08i230:standard_name = "mass_fraction_of_frozen_water_in_soil_moisture" ; + fld_s08i230:long_name = "FROZEN SOIL MOISTURE FRACTION" ; + fld_s08i230:units = "1" ; + fld_s08i230:um_stash_source = "m01s08i230" ; + fld_s08i230:missing_value = 1.e+20f ; + fld_s08i230:cell_methods = "time: mean" ; + fld_s08i230:grid_mapping = "latitude_longitude" ; + float fld_s08i231(time, lat, lon) ; + fld_s08i231:_FillValue = 1.e+20f ; + fld_s08i231:standard_name = "surface_snow_melt_flux" ; + fld_s08i231:long_name = "surface_snow_melt_flux_where_land" ; + fld_s08i231:units = "kg m-2 s-1" ; + fld_s08i231:um_stash_source = "m01s08i231" ; + fld_s08i231:missing_value = 1.e+20f ; + fld_s08i231:cell_methods = "time: mean" ; + fld_s08i231:grid_mapping = "latitude_longitude" ; + float fld_s08i233(time, lat, lon) ; + fld_s08i233:_FillValue = 1.e+20f ; + fld_s08i233:standard_name = "canopy_throughfall_flux" ; + fld_s08i233:long_name = "CANOPY THROUGHFALL RATE KG/M2/S" ; + fld_s08i233:units = "kg m-2 s-1" ; + fld_s08i233:um_stash_source = "m01s08i233" ; + fld_s08i233:missing_value = 1.e+20f ; + fld_s08i233:cell_methods = "time: mean" ; + fld_s08i233:grid_mapping = "latitude_longitude" ; + float fld_s08i234(time, lat, lon) ; + fld_s08i234:_FillValue = 1.e+20f ; + fld_s08i234:standard_name = "surface_runoff_flux" ; + fld_s08i234:long_name = "SURFACE RUNOFF RATE KG/M2/S" ; + fld_s08i234:units = "kg m-2 s-1" ; + fld_s08i234:um_stash_source = "m01s08i234" ; + fld_s08i234:missing_value = 1.e+20f ; + fld_s08i234:cell_methods = "time: mean" ; + fld_s08i234:grid_mapping = "latitude_longitude" ; + float fld_s08i235(time, lat, lon) ; + fld_s08i235:_FillValue = 1.e+20f ; + fld_s08i235:standard_name = "subsurface_runoff_flux" ; + fld_s08i235:long_name = "SUB-SURFACE RUNOFF RATE KG/M2/S" ; + fld_s08i235:units = "kg m-2 s-1" ; + fld_s08i235:um_stash_source = "m01s08i235" ; + fld_s08i235:missing_value = 1.e+20f ; + fld_s08i235:cell_methods = "time: mean" ; + fld_s08i235:grid_mapping = "latitude_longitude" ; + float fld_s08i236(time, pseudo_level_0, lat, lon) ; + fld_s08i236:_FillValue = 1.e+20f ; + fld_s08i236:long_name = "SNOW AMOUNT ON TILES KG/M2" ; + fld_s08i236:units = "kg m-2" ; + fld_s08i236:um_stash_source = "m01s08i236" ; + fld_s08i236:missing_value = 1.e+20f ; + fld_s08i236:cell_methods = "time: mean" ; + fld_s08i236:grid_mapping = "latitude_longitude" ; + float fld_s08i237(time, pseudo_level_0, lat, lon) ; + fld_s08i237:_FillValue = 1.e+20f ; + fld_s08i237:standard_name = "surface_snow_melt_flux" ; + fld_s08i237:long_name = "SNOW MELT RATE ON TILES KG/M2/S" ; + fld_s08i237:units = "kg m-2 s-1" ; + fld_s08i237:um_stash_source = "m01s08i237" ; + fld_s08i237:missing_value = 1.e+20f ; + fld_s08i237:cell_methods = "time: mean" ; + fld_s08i237:grid_mapping = "latitude_longitude" ; + float fld_s16i222(time, lat, lon) ; + fld_s16i222:_FillValue = 1.e+20f ; + fld_s16i222:standard_name = "air_pressure_at_sea_level" ; + fld_s16i222:long_name = "PRESSURE AT MEAN SEA LEVEL" ; + fld_s16i222:units = "Pa" ; + fld_s16i222:um_stash_source = "m01s16i222" ; + fld_s16i222:missing_value = 1.e+20f ; + fld_s16i222:cell_methods = "time: mean" ; + fld_s16i222:grid_mapping = "latitude_longitude" ; + float fld_s17i205(time, lat, lon) ; + fld_s17i205:_FillValue = 1.e+20f ; + fld_s17i205:long_name = "DIMETHYL SULPHIDE EMISSIONS" ; + fld_s17i205:um_stash_source = "m01s17i205" ; + fld_s17i205:missing_value = 1.e+20f ; + fld_s17i205:cell_methods = "time: mean" ; + fld_s17i205:grid_mapping = "latitude_longitude" ; + float fld_s30i201(time, pressure, lat_v, lon_u) ; + fld_s30i201:_FillValue = 1.e+20f ; + fld_s30i201:standard_name = "eastward_wind" ; + fld_s30i201:long_name = "U COMPNT OF WIND ON P LEV/UV GRID" ; + fld_s30i201:units = "m s-1" ; + fld_s30i201:um_stash_source = "m01s30i201" ; + fld_s30i201:missing_value = 1.e+20f ; + fld_s30i201:cell_methods = "time: mean" ; + fld_s30i201:grid_mapping = "latitude_longitude" ; + double pressure(pressure) ; + pressure:axis = "Z" ; + pressure:units = "Pa" ; + pressure:long_name = "pressure" ; + pressure:positive = "down" ; + float fld_s30i202(time, pressure, lat_v, lon_u) ; + fld_s30i202:_FillValue = 1.e+20f ; + fld_s30i202:standard_name = "northward_wind" ; + fld_s30i202:long_name = "V COMPNT OF WIND ON P LEV/UV GRID" ; + fld_s30i202:units = "m s-1" ; + fld_s30i202:um_stash_source = "m01s30i202" ; + fld_s30i202:missing_value = 1.e+20f ; + fld_s30i202:cell_methods = "time: mean" ; + fld_s30i202:grid_mapping = "latitude_longitude" ; + float fld_s30i203(time, pressure, lat_v, lon_u) ; + fld_s30i203:_FillValue = 1.e+20f ; + fld_s30i203:standard_name = "upward_air_velocity" ; + fld_s30i203:long_name = "W COMPNT OF WIND ON P LEV/UV GRID" ; + fld_s30i203:units = "m s-1" ; + fld_s30i203:um_stash_source = "m01s30i203" ; + fld_s30i203:missing_value = 1.e+20f ; + fld_s30i203:cell_methods = "time: mean" ; + fld_s30i203:grid_mapping = "latitude_longitude" ; + float fld_s30i204(time, pressure, lat_v, lon_u) ; + fld_s30i204:_FillValue = 1.e+20f ; + fld_s30i204:standard_name = "air_temperature" ; + fld_s30i204:long_name = "TEMPERATURE ON P LEV/UV GRID" ; + fld_s30i204:units = "K" ; + fld_s30i204:um_stash_source = "m01s30i204" ; + fld_s30i204:missing_value = 1.e+20f ; + fld_s30i204:cell_methods = "time: mean" ; + fld_s30i204:grid_mapping = "latitude_longitude" ; + float fld_s30i205(time, pressure, lat_v, lon_u) ; + fld_s30i205:_FillValue = 1.e+20f ; + fld_s30i205:standard_name = "specific_humidity" ; + fld_s30i205:long_name = "SPECIFIC HUMIDITY ON P LEV/UV GRID" ; + fld_s30i205:units = "1" ; + fld_s30i205:um_stash_source = "m01s30i205" ; + fld_s30i205:missing_value = 1.e+20f ; + fld_s30i205:cell_methods = "time: mean" ; + fld_s30i205:grid_mapping = "latitude_longitude" ; + float fld_s30i206(time, pressure, lat_v, lon_u) ; + fld_s30i206:_FillValue = 1.e+20f ; + fld_s30i206:standard_name = "relative_humidity" ; + fld_s30i206:long_name = "RELATIVE HUMIDITY ON P LEV/UV GRID" ; + fld_s30i206:units = "%" ; + fld_s30i206:um_stash_source = "m01s30i206" ; + fld_s30i206:missing_value = 1.e+20f ; + fld_s30i206:cell_methods = "time: mean" ; + fld_s30i206:grid_mapping = "latitude_longitude" ; + float fld_s30i207(time, pressure, lat_v, lon_u) ; + fld_s30i207:_FillValue = 1.e+20f ; + fld_s30i207:standard_name = "geopotential_height" ; + fld_s30i207:long_name = "GEOPOTENTIAL HEIGHT ON P LEV/UV GRID" ; + fld_s30i207:units = "m" ; + fld_s30i207:um_stash_source = "m01s30i207" ; + fld_s30i207:missing_value = 1.e+20f ; + fld_s30i207:cell_methods = "time: mean" ; + fld_s30i207:grid_mapping = "latitude_longitude" ; + float fld_s30i208(time, pressure, lat_v, lon_u) ; + fld_s30i208:_FillValue = 1.e+20f ; + fld_s30i208:standard_name = "lagrangian_tendency_of_air_pressure" ; + fld_s30i208:long_name = "OMEGA ON P LEV/UV GRID" ; + fld_s30i208:units = "Pa s-1" ; + fld_s30i208:um_stash_source = "m01s30i208" ; + fld_s30i208:missing_value = 1.e+20f ; + fld_s30i208:cell_methods = "time: mean" ; + fld_s30i208:grid_mapping = "latitude_longitude" ; + float fld_s30i215(time, pressure, lat_v, lon_u) ; + fld_s30i215:_FillValue = 1.e+20f ; + fld_s30i215:standard_name = "product_of_eastward_wind_and_specific_humidity" ; + fld_s30i215:long_name = "UQ ON P LEV/UV GRID" ; + fld_s30i215:units = "m s-1" ; + fld_s30i215:um_stash_source = "m01s30i215" ; + fld_s30i215:missing_value = 1.e+20f ; + fld_s30i215:cell_methods = "time: mean" ; + fld_s30i215:grid_mapping = "latitude_longitude" ; + float fld_s30i225(time, pressure, lat_v, lon_u) ; + fld_s30i225:_FillValue = 1.e+20f ; + fld_s30i225:standard_name = "product_of_northward_wind_and_specific_humidity" ; + fld_s30i225:long_name = "VQ ON P LEV/UV GRID" ; + fld_s30i225:units = "m s-1" ; + fld_s30i225:um_stash_source = "m01s30i225" ; + fld_s30i225:missing_value = 1.e+20f ; + fld_s30i225:cell_methods = "time: mean" ; + fld_s30i225:grid_mapping = "latitude_longitude" ; + float fld_s30i301(time, pressure, lat_v, lon_u) ; + fld_s30i301:_FillValue = 1.e+20f ; + fld_s30i301:long_name = "Heavyside function on pressure levels" ; + fld_s30i301:units = "1" ; + fld_s30i301:um_stash_source = "m01s30i301" ; + fld_s30i301:missing_value = 1.e+20f ; + fld_s30i301:cell_methods = "time: mean" ; + fld_s30i301:grid_mapping = "latitude_longitude" ; + float fld_s30i403(time, lat, lon) ; + fld_s30i403:_FillValue = 1.e+20f ; + fld_s30i403:long_name = "TOTAL COLUMN DRY MASS RHO GRID" ; + fld_s30i403:units = "kg m-2" ; + fld_s30i403:um_stash_source = "m01s30i403" ; + fld_s30i403:missing_value = 1.e+20f ; + fld_s30i403:cell_methods = "time: mean" ; + fld_s30i403:grid_mapping = "latitude_longitude" ; + float fld_s30i404(time, lat, lon) ; + fld_s30i404:_FillValue = 1.e+20f ; + fld_s30i404:standard_name = "atmosphere_mass_per_unit_area" ; + fld_s30i404:long_name = "TOTAL COLUMN WET MASS RHO GRID" ; + fld_s30i404:units = "kg m-2" ; + fld_s30i404:um_stash_source = "m01s30i404" ; + fld_s30i404:missing_value = 1.e+20f ; + fld_s30i404:cell_methods = "time: mean" ; + fld_s30i404:grid_mapping = "latitude_longitude" ; + float fld_s30i405(time, lat, lon) ; + fld_s30i405:_FillValue = 1.e+20f ; + fld_s30i405:standard_name = "atmosphere_cloud_liquid_water_content" ; + fld_s30i405:long_name = "TOTAL COLUMN QCL RHO GRID" ; + fld_s30i405:units = "kg m-2" ; + fld_s30i405:um_stash_source = "m01s30i405" ; + fld_s30i405:missing_value = 1.e+20f ; + fld_s30i405:cell_methods = "time: mean" ; + fld_s30i405:grid_mapping = "latitude_longitude" ; + float fld_s30i406(time, lat, lon) ; + fld_s30i406:_FillValue = 1.e+20f ; + fld_s30i406:standard_name = "atmosphere_cloud_ice_content" ; + fld_s30i406:long_name = "TOTAL COLUMN QCF RHO GRID" ; + fld_s30i406:units = "kg m-2" ; + fld_s30i406:um_stash_source = "m01s30i406" ; + fld_s30i406:missing_value = 1.e+20f ; + fld_s30i406:cell_methods = "time: mean" ; + fld_s30i406:grid_mapping = "latitude_longitude" ; + float fld_s30i428(time, lat, lon) ; + fld_s30i428:_FillValue = 1.e+20f ; + fld_s30i428:long_name = "dry mass col int u*q per unit area" ; + fld_s30i428:um_stash_source = "m01s30i428" ; + fld_s30i428:missing_value = 1.e+20f ; + fld_s30i428:cell_methods = "time: mean" ; + fld_s30i428:grid_mapping = "latitude_longitude" ; + float fld_s30i429(time, lat, lon) ; + fld_s30i429:_FillValue = 1.e+20f ; + fld_s30i429:long_name = "dry mass col int v*q per unit area" ; + fld_s30i429:um_stash_source = "m01s30i429" ; + fld_s30i429:missing_value = 1.e+20f ; + fld_s30i429:cell_methods = "time: mean" ; + fld_s30i429:grid_mapping = "latitude_longitude" ; + float fld_s30i453(time, lat, lon) ; + fld_s30i453:_FillValue = 1.e+20f ; + fld_s30i453:standard_name = "tropopause_altitude" ; + fld_s30i453:long_name = "Height at Tropopause Level" ; + fld_s30i453:units = "m" ; + fld_s30i453:um_stash_source = "m01s30i453" ; + fld_s30i453:missing_value = 1.e+20f ; + fld_s30i453:cell_methods = "time: mean" ; + fld_s30i453:grid_mapping = "latitude_longitude" ; + float fld_s33i001(time, model_theta_level_number, lat, lon) ; + fld_s33i001:_FillValue = 1.e+20f ; + fld_s33i001:standard_name = "mole_fraction_of_ozone_in_air" ; + fld_s33i001:long_name = "ATM TRACER 1 AFTER TS" ; + fld_s33i001:units = "mole mole-1" ; + fld_s33i001:um_stash_source = "m01s33i001" ; + fld_s33i001:missing_value = 1.e+20f ; + fld_s33i001:cell_methods = "time: mean" ; + fld_s33i001:grid_mapping = "latitude_longitude" ; + fld_s33i001:coordinates = "sigma_theta surface_altitude theta_level_height" ; + int model_theta_level_number(model_theta_level_number) ; + model_theta_level_number:axis = "Z" ; + model_theta_level_number:units = "1" ; + model_theta_level_number:standard_name = "model_level_number" ; + model_theta_level_number:positive = "up" ; + double theta_level_height(model_theta_level_number) ; + theta_level_height:bounds = "theta_level_height_bnds" ; + theta_level_height:units = "m" ; + theta_level_height:long_name = "level_height" ; + theta_level_height:positive = "up" ; + theta_level_height:standard_name = "atmosphere_hybrid_height_coordinate" ; + theta_level_height:axis = "Z" ; + theta_level_height:formula_terms = "a: theta_level_height b: sigma_theta orog: surface_altitude" ; + double theta_level_height_bnds(model_theta_level_number, bnds) ; + double sigma_theta(model_theta_level_number) ; + sigma_theta:bounds = "sigma_theta_bnds" ; + sigma_theta:units = "1" ; + sigma_theta:long_name = "sigma" ; + double sigma_theta_bnds(model_theta_level_number, bnds) ; + float fld_s33i002(time, model_theta_level_number, lat, lon) ; + fld_s33i002:_FillValue = 1.e+20f ; + fld_s33i002:long_name = "ATM TRACER 2 AFTER TS" ; + fld_s33i002:um_stash_source = "m01s33i002" ; + fld_s33i002:missing_value = 1.e+20f ; + fld_s33i002:cell_methods = "time: mean" ; + fld_s33i002:grid_mapping = "latitude_longitude" ; + fld_s33i002:coordinates = "sigma_theta surface_altitude theta_level_height" ; + +// global attributes: + :history = "File /scratch/p66/jxs599/access-esm/archive/Nov25-NewNitrogen-Nov25-NewNitrogen-6a5acd30/output200/atmosphere/aiihca.pai5jan converted with /g/data/vk83/apps/base_conda/envs/payu-1.2.0/lib/python3.10/site-packages/um2nc/um2netcdf.py 1.1.0 at 2025-12-04 20:03:16" ; + :Conventions = "CF-1.6" ; + :source = "Data from Met Office Unified Model" ; + :um_version = "7.3" ; +data: + + time = 856143.5 ; + + time_bnds = + 856128, 856159 ; + + lat = -90, -88.75, -87.5, -86.25, -85, -83.75, -82.5, -81.25, -80, -78.75, + -77.5, -76.25, -75, -73.75, -72.5, -71.25, -70, -68.75, -67.5, -66.25, + -65, -63.75, -62.5, -61.25, -60, -58.75, -57.5, -56.25, -55, -53.75, + -52.5, -51.25, -50, -48.75, -47.5, -46.25, -45, -43.75, -42.5, -41.25, + -40, -38.75, -37.5, -36.25, -35, -33.75, -32.5, -31.25, -30, -28.75, + -27.5, -26.25, -25, -23.75, -22.5, -21.25, -20, -18.75, -17.5, -16.25, + -15, -13.75, -12.5, -11.25, -10, -8.75, -7.5, -6.25, -5, -3.75, -2.5, + -1.25, 0, 1.25, 2.5, 3.75, 5, 6.25, 7.5, 8.75, 10, 11.25, 12.5, 13.75, + 15, 16.25, 17.5, 18.75, 20, 21.25, 22.5, 23.75, 25, 26.25, 27.5, 28.75, + 30, 31.25, 32.5, 33.75, 35, 36.25, 37.5, 38.75, 40, 41.25, 42.5, 43.75, + 45, 46.25, 47.5, 48.75, 50, 51.25, 52.5, 53.75, 55, 56.25, 57.5, 58.75, + 60, 61.25, 62.5, 63.75, 65, 66.25, 67.5, 68.75, 70, 71.25, 72.5, 73.75, + 75, 76.25, 77.5, 78.75, 80, 81.25, 82.5, 83.75, 85, 86.25, 87.5, 88.75, 90 ; + + lon = 0, 1.875, 3.75, 5.625, 7.5, 9.375, 11.25, 13.125, 15, 16.875, 18.75, + 20.625, 22.5, 24.375, 26.25, 28.125, 30, 31.875, 33.75, 35.625, 37.5, + 39.375, 41.25, 43.125, 45, 46.875, 48.75, 50.625, 52.5, 54.375, 56.25, + 58.125, 60, 61.875, 63.75, 65.625, 67.5, 69.375, 71.25, 73.125, 75, + 76.875, 78.75, 80.625, 82.5, 84.375, 86.25, 88.125, 90, 91.875, 93.75, + 95.625, 97.5, 99.375, 101.25, 103.125, 105, 106.875, 108.75, 110.625, + 112.5, 114.375, 116.25, 118.125, 120, 121.875, 123.75, 125.625, 127.5, + 129.375, 131.25, 133.125, 135, 136.875, 138.75, 140.625, 142.5, 144.375, + 146.25, 148.125, 150, 151.875, 153.75, 155.625, 157.5, 159.375, 161.25, + 163.125, 165, 166.875, 168.75, 170.625, 172.5, 174.375, 176.25, 178.125, + 180, 181.875, 183.75, 185.625, 187.5, 189.375, 191.25, 193.125, 195, + 196.875, 198.75, 200.625, 202.5, 204.375, 206.25, 208.125, 210, 211.875, + 213.75, 215.625, 217.5, 219.375, 221.25, 223.125, 225, 226.875, 228.75, + 230.625, 232.5, 234.375, 236.25, 238.125, 240, 241.875, 243.75, 245.625, + 247.5, 249.375, 251.25, 253.125, 255, 256.875, 258.75, 260.625, 262.5, + 264.375, 266.25, 268.125, 270, 271.875, 273.75, 275.625, 277.5, 279.375, + 281.25, 283.125, 285, 286.875, 288.75, 290.625, 292.5, 294.375, 296.25, + 298.125, 300, 301.875, 303.75, 305.625, 307.5, 309.375, 311.25, 313.125, + 315, 316.875, 318.75, 320.625, 322.5, 324.375, 326.25, 328.125, 330, + 331.875, 333.75, 335.625, 337.5, 339.375, 341.25, 343.125, 345, 346.875, + 348.75, 350.625, 352.5, 354.375, 356.25, 358.125 ; + + model_rho_level_number = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38 ; + + pseudo_level = 1, 2, 3, 4, 5, 6 ; + + pseudo_level_0 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ; + + lon_u = 0.9375, 2.8125, 4.6875, 6.5625, 8.4375, 10.3125, 12.1875, 14.0625, + 15.9375, 17.8125, 19.6875, 21.5625, 23.4375, 25.3125, 27.1875, 29.0625, + 30.9375, 32.8125, 34.6875, 36.5625, 38.4375, 40.3125, 42.1875, 44.0625, + 45.9375, 47.8125, 49.6875, 51.5625, 53.4375, 55.3125, 57.1875, 59.0625, + 60.9375, 62.8125, 64.6875, 66.5625, 68.4375, 70.3125, 72.1875, 74.0625, + 75.9375, 77.8125, 79.6875, 81.5625, 83.4375, 85.3125, 87.1875, 89.0625, + 90.9375, 92.8125, 94.6875, 96.5625, 98.4375, 100.3125, 102.1875, + 104.0625, 105.9375, 107.8125, 109.6875, 111.5625, 113.4375, 115.3125, + 117.1875, 119.0625, 120.9375, 122.8125, 124.6875, 126.5625, 128.4375, + 130.3125, 132.1875, 134.0625, 135.9375, 137.8125, 139.6875, 141.5625, + 143.4375, 145.3125, 147.1875, 149.0625, 150.9375, 152.8125, 154.6875, + 156.5625, 158.4375, 160.3125, 162.1875, 164.0625, 165.9375, 167.8125, + 169.6875, 171.5625, 173.4375, 175.3125, 177.1875, 179.0625, 180.9375, + 182.8125, 184.6875, 186.5625, 188.4375, 190.3125, 192.1875, 194.0625, + 195.9375, 197.8125, 199.6875, 201.5625, 203.4375, 205.3125, 207.1875, + 209.0625, 210.9375, 212.8125, 214.6875, 216.5625, 218.4375, 220.3125, + 222.1875, 224.0625, 225.9375, 227.8125, 229.6875, 231.5625, 233.4375, + 235.3125, 237.1875, 239.0625, 240.9375, 242.8125, 244.6875, 246.5625, + 248.4375, 250.3125, 252.1875, 254.0625, 255.9375, 257.8125, 259.6875, + 261.5625, 263.4375, 265.3125, 267.1875, 269.0625, 270.9375, 272.8125, + 274.6875, 276.5625, 278.4375, 280.3125, 282.1875, 284.0625, 285.9375, + 287.8125, 289.6875, 291.5625, 293.4375, 295.3125, 297.1875, 299.0625, + 300.9375, 302.8125, 304.6875, 306.5625, 308.4375, 310.3125, 312.1875, + 314.0625, 315.9375, 317.8125, 319.6875, 321.5625, 323.4375, 325.3125, + 327.1875, 329.0625, 330.9375, 332.8125, 334.6875, 336.5625, 338.4375, + 340.3125, 342.1875, 344.0625, 345.9375, 347.8125, 349.6875, 351.5625, + 353.4375, 355.3125, 357.1875, 359.0625 ; + + lat_v = -89.375, -88.125, -86.875, -85.625, -84.375, -83.125, -81.875, + -80.625, -79.375, -78.125, -76.875, -75.625, -74.375, -73.125, -71.875, + -70.625, -69.375, -68.125, -66.875, -65.625, -64.375, -63.125, -61.875, + -60.625, -59.375, -58.125, -56.875, -55.625, -54.375, -53.125, -51.875, + -50.625, -49.375, -48.125, -46.875, -45.625, -44.375, -43.125, -41.875, + -40.625, -39.375, -38.125, -36.875, -35.625, -34.375, -33.125, -31.875, + -30.625, -29.375, -28.125, -26.875, -25.625, -24.375, -23.125, -21.875, + -20.625, -19.375, -18.125, -16.875, -15.625, -14.375, -13.125, -11.875, + -10.625, -9.375, -8.125, -6.875, -5.625, -4.375, -3.125, -1.875, -0.625, + 0.625, 1.875, 3.125, 4.375, 5.625, 6.875, 8.125, 9.375, 10.625, 11.875, + 13.125, 14.375, 15.625, 16.875, 18.125, 19.375, 20.625, 21.875, 23.125, + 24.375, 25.625, 26.875, 28.125, 29.375, 30.625, 31.875, 33.125, 34.375, + 35.625, 36.875, 38.125, 39.375, 40.625, 41.875, 43.125, 44.375, 45.625, + 46.875, 48.125, 49.375, 50.625, 51.875, 53.125, 54.375, 55.625, 56.875, + 58.125, 59.375, 60.625, 61.875, 63.125, 64.375, 65.625, 66.875, 68.125, + 69.375, 70.625, 71.875, 73.125, 74.375, 75.625, 76.875, 78.125, 79.375, + 80.625, 81.875, 83.125, 84.375, 85.625, 86.875, 88.125, 89.375 ; + + pseudo_level_2 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ; + + time_0 = 856159 ; + + soil_model_level_number = 1, 2, 3, 4, 5, 6 ; + + pressure = 100000, 92500, 85000, 70000, 60000, 50000, 40000, 30000, 25000, + 20000, 15000, 10000, 7000, 5000, 3000, 2000, 1000, 500, 100 ; + + model_theta_level_number = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38 ; +} diff --git a/splitnc/test/data/aiihca.pe-234501_dai.cdl b/splitnc/test/data/aiihca.pe-234501_dai.cdl new file mode 100644 index 0000000..fd887fd --- /dev/null +++ b/splitnc/test/data/aiihca.pe-234501_dai.cdl @@ -0,0 +1,406 @@ +netcdf aiihca.pe-234501_dai { +dimensions: + time = UNLIMITED ; // (31 currently) + lat = 145 ; + lon = 192 ; + bnds = 2 ; + lat_v = 144 ; + lon_u = 192 ; + soil_model_level_number = 6 ; + pressure = 19 ; +variables: + float fld_s00i023(time, lat, lon) ; + fld_s00i023:_FillValue = 1.e+20f ; + fld_s00i023:standard_name = "surface_snow_amount" ; + fld_s00i023:long_name = "SNOW AMOUNT OVER LAND AFT TSTP KG/M2" ; + fld_s00i023:units = "kg m-2" ; + fld_s00i023:um_stash_source = "m01s00i023" ; + fld_s00i023:missing_value = 1.e+20f ; + fld_s00i023:cell_methods = "time: mean" ; + fld_s00i023:grid_mapping = "latitude_longitude" ; + int latitude_longitude ; + latitude_longitude:grid_mapping_name = "latitude_longitude" ; + latitude_longitude:longitude_of_prime_meridian = 0. ; + latitude_longitude:earth_radius = 6371229. ; + double time(time) ; + time:axis = "T" ; + time:bounds = "time_bnds" ; + time:units = "days since 0001-01-01 00:00" ; + time:standard_name = "time" ; + time:calendar = "proleptic_gregorian" ; + double time_bnds(time, bnds) ; + double lat(lat) ; + lat:axis = "Y" ; + lat:bounds = "lat_bnds" ; + lat:units = "degrees_north" ; + lat:standard_name = "latitude" ; + double lat_bnds(lat, bnds) ; + double lon(lon) ; + lon:axis = "X" ; + lon:bounds = "lon_bnds" ; + lon:units = "degrees_east" ; + lon:standard_name = "longitude" ; + double lon_bnds(lon, bnds) ; + float fld_s00i024(time, lat, lon) ; + fld_s00i024:_FillValue = 1.e+20f ; + fld_s00i024:standard_name = "surface_temperature" ; + fld_s00i024:long_name = "SURFACE TEMPERATURE AFTER TIMESTEP" ; + fld_s00i024:units = "K" ; + fld_s00i024:um_stash_source = "m01s00i024" ; + fld_s00i024:missing_value = 1.e+20f ; + fld_s00i024:cell_methods = "time: mean" ; + fld_s00i024:grid_mapping = "latitude_longitude" ; + float fld_s00i033(time, lat, lon) ; + fld_s00i033:_FillValue = 1.e+20f ; + fld_s00i033:standard_name = "surface_altitude" ; + fld_s00i033:long_name = "OROGRAPHY (/STRAT LOWER BC)" ; + fld_s00i033:units = "m" ; + fld_s00i033:um_stash_source = "m01s00i033" ; + fld_s00i033:missing_value = 1.e+20f ; + fld_s00i033:cell_methods = "time: mean" ; + fld_s00i033:grid_mapping = "latitude_longitude" ; + float fld_s02i206(time, lat, lon) ; + fld_s02i206:_FillValue = 1.e+20f ; + fld_s02i206:standard_name = "toa_outgoing_longwave_flux_assuming_clear_sky" ; + fld_s02i206:long_name = "CLEAR-SKY (II) UPWARD LW FLUX (TOA)" ; + fld_s02i206:units = "W m-2" ; + fld_s02i206:um_stash_source = "m01s02i206" ; + fld_s02i206:missing_value = 1.e+20f ; + fld_s02i206:cell_methods = "time: mean" ; + fld_s02i206:grid_mapping = "latitude_longitude" ; + float fld_s02i208(time, lat, lon) ; + fld_s02i208:_FillValue = 1.e+20f ; + fld_s02i208:standard_name = "surface_downwelling_longwave_flux_in_air_assuming_clear_sky" ; + fld_s02i208:long_name = "CLEAR-SKY (II) DOWN SURFACE LW FLUX" ; + fld_s02i208:units = "W m-2" ; + fld_s02i208:um_stash_source = "m01s02i208" ; + fld_s02i208:missing_value = 1.e+20f ; + fld_s02i208:cell_methods = "time: mean" ; + fld_s02i208:grid_mapping = "latitude_longitude" ; + float fld_s03i217(time, lat, lon) ; + fld_s03i217:_FillValue = 1.e+20f ; + fld_s03i217:standard_name = "surface_upward_sensible_heat_flux" ; + fld_s03i217:long_name = "SURFACE SENSIBLE HEAT FLUX W/M2" ; + fld_s03i217:units = "W m-2" ; + fld_s03i217:um_stash_source = "m01s03i217" ; + fld_s03i217:missing_value = 1.e+20f ; + fld_s03i217:cell_methods = "time: mean" ; + fld_s03i217:grid_mapping = "latitude_longitude" ; + float fld_s03i223(time, lat, lon) ; + fld_s03i223:_FillValue = 1.e+20f ; + fld_s03i223:standard_name = "water_evaporation_flux" ; + fld_s03i223:long_name = "SURFACE TOTAL MOISTURE FLUX KG/M2/S" ; + fld_s03i223:units = "kg m-2 s-1" ; + fld_s03i223:um_stash_source = "m01s03i223" ; + fld_s03i223:missing_value = 1.e+20f ; + fld_s03i223:cell_methods = "time: mean" ; + fld_s03i223:grid_mapping = "latitude_longitude" ; + float fld_s03i225(time, lat_v, lon_u) ; + fld_s03i225:_FillValue = 1.e+20f ; + fld_s03i225:standard_name = "eastward_wind" ; + fld_s03i225:long_name = "10 METRE WIND U-COMP B GRID" ; + fld_s03i225:units = "m s-1" ; + fld_s03i225:um_stash_source = "m01s03i225" ; + fld_s03i225:missing_value = 1.e+20f ; + fld_s03i225:cell_methods = "time: mean" ; + fld_s03i225:grid_mapping = "latitude_longitude" ; + fld_s03i225:coordinates = "height" ; + double lat_v(lat_v) ; + lat_v:axis = "Y" ; + lat_v:bounds = "lat_v_bnds" ; + lat_v:units = "degrees_north" ; + lat_v:standard_name = "latitude" ; + double lat_v_bnds(lat_v, bnds) ; + double lon_u(lon_u) ; + lon_u:axis = "X" ; + lon_u:bounds = "lon_u_bnds" ; + lon_u:units = "degrees_east" ; + lon_u:standard_name = "longitude" ; + double lon_u_bnds(lon_u, bnds) ; + double height ; + height:units = "m" ; + height:standard_name = "height" ; + height:positive = "up" ; + float fld_s03i226(time, lat_v, lon_u) ; + fld_s03i226:_FillValue = 1.e+20f ; + fld_s03i226:standard_name = "northward_wind" ; + fld_s03i226:long_name = "10 METRE WIND V-COMP B GRID" ; + fld_s03i226:units = "m s-1" ; + fld_s03i226:um_stash_source = "m01s03i226" ; + fld_s03i226:missing_value = 1.e+20f ; + fld_s03i226:cell_methods = "time: mean" ; + fld_s03i226:grid_mapping = "latitude_longitude" ; + fld_s03i226:coordinates = "height" ; + float fld_s03i227(time, lat_v, lon_u) ; + fld_s03i227:_FillValue = 1.e+20f ; + fld_s03i227:standard_name = "wind_speed" ; + fld_s03i227:long_name = "10 METRE WIND SPEED ON B GRID" ; + fld_s03i227:units = "m s-1" ; + fld_s03i227:um_stash_source = "m01s03i227" ; + fld_s03i227:missing_value = 1.e+20f ; + fld_s03i227:cell_methods = "time: mean" ; + fld_s03i227:grid_mapping = "latitude_longitude" ; + fld_s03i227:coordinates = "height" ; + float fld_s03i227_max(time, lat_v, lon_u) ; + fld_s03i227_max:_FillValue = 1.e+20f ; + fld_s03i227_max:standard_name = "wind_speed" ; + fld_s03i227_max:long_name = "10 METRE WIND SPEED ON B GRID" ; + fld_s03i227_max:units = "m s-1" ; + fld_s03i227_max:um_stash_source = "m01s03i227" ; + fld_s03i227_max:missing_value = 1.e+20f ; + fld_s03i227_max:cell_methods = "time: maximum" ; + fld_s03i227_max:grid_mapping = "latitude_longitude" ; + fld_s03i227_max:coordinates = "height" ; + float fld_s03i230(time, lat, lon) ; + fld_s03i230:_FillValue = 1.e+20f ; + fld_s03i230:standard_name = "wind_speed" ; + fld_s03i230:long_name = "10 METRE WIND SPEED ON C GRID" ; + fld_s03i230:units = "m s-1" ; + fld_s03i230:um_stash_source = "m01s03i230" ; + fld_s03i230:missing_value = 1.e+20f ; + fld_s03i230:cell_methods = "time: mean" ; + fld_s03i230:grid_mapping = "latitude_longitude" ; + fld_s03i230:coordinates = "height" ; + float fld_s03i234(time, lat, lon) ; + fld_s03i234:_FillValue = 1.e+20f ; + fld_s03i234:standard_name = "surface_upward_latent_heat_flux" ; + fld_s03i234:long_name = "SURFACE LATENT HEAT FLUX W/M2" ; + fld_s03i234:units = "W m-2" ; + fld_s03i234:um_stash_source = "m01s03i234" ; + fld_s03i234:missing_value = 1.e+20f ; + fld_s03i234:cell_methods = "time: mean" ; + fld_s03i234:grid_mapping = "latitude_longitude" ; + float fld_s03i236(time, lat, lon) ; + fld_s03i236:_FillValue = 1.e+20f ; + fld_s03i236:standard_name = "air_temperature" ; + fld_s03i236:long_name = "TEMPERATURE AT 1.5M" ; + fld_s03i236:units = "K" ; + fld_s03i236:um_stash_source = "m01s03i236" ; + fld_s03i236:missing_value = 1.e+20f ; + fld_s03i236:cell_methods = "time: mean" ; + fld_s03i236:grid_mapping = "latitude_longitude" ; + fld_s03i236:coordinates = "height_0" ; + double height_0 ; + height_0:units = "m" ; + height_0:standard_name = "height" ; + height_0:positive = "up" ; + float fld_s03i236_min(time, lat, lon) ; + fld_s03i236_min:_FillValue = 1.e+20f ; + fld_s03i236_min:standard_name = "air_temperature" ; + fld_s03i236_min:long_name = "TEMPERATURE AT 1.5M" ; + fld_s03i236_min:units = "K" ; + fld_s03i236_min:um_stash_source = "m01s03i236" ; + fld_s03i236_min:missing_value = 1.e+20f ; + fld_s03i236_min:cell_methods = "time: minimum" ; + fld_s03i236_min:grid_mapping = "latitude_longitude" ; + fld_s03i236_min:coordinates = "height_0" ; + float fld_s03i236_max(time, lat, lon) ; + fld_s03i236_max:_FillValue = 1.e+20f ; + fld_s03i236_max:standard_name = "air_temperature" ; + fld_s03i236_max:long_name = "TEMPERATURE AT 1.5M" ; + fld_s03i236_max:units = "K" ; + fld_s03i236_max:um_stash_source = "m01s03i236" ; + fld_s03i236_max:missing_value = 1.e+20f ; + fld_s03i236_max:cell_methods = "time: maximum" ; + fld_s03i236_max:grid_mapping = "latitude_longitude" ; + fld_s03i236_max:coordinates = "height_0" ; + float fld_s03i237(time, lat, lon) ; + fld_s03i237:_FillValue = 1.e+20f ; + fld_s03i237:standard_name = "specific_humidity" ; + fld_s03i237:long_name = "SPECIFIC HUMIDITY AT 1.5M" ; + fld_s03i237:units = "1" ; + fld_s03i237:um_stash_source = "m01s03i237" ; + fld_s03i237:missing_value = 1.e+20f ; + fld_s03i237:cell_methods = "time: mean" ; + fld_s03i237:grid_mapping = "latitude_longitude" ; + fld_s03i237:coordinates = "height_0" ; + float fld_s03i245(time, lat, lon) ; + fld_s03i245:_FillValue = 1.e+20f ; + fld_s03i245:standard_name = "relative_humidity" ; + fld_s03i245:long_name = "RELATIVE HUMIDITY AT 1.5M" ; + fld_s03i245:units = "%" ; + fld_s03i245:um_stash_source = "m01s03i245" ; + fld_s03i245:missing_value = 1.e+20f ; + fld_s03i245:cell_methods = "time: mean" ; + fld_s03i245:grid_mapping = "latitude_longitude" ; + fld_s03i245:coordinates = "height_0" ; + float fld_s03i245_min(time, lat, lon) ; + fld_s03i245_min:_FillValue = 1.e+20f ; + fld_s03i245_min:standard_name = "relative_humidity" ; + fld_s03i245_min:long_name = "RELATIVE HUMIDITY AT 1.5M" ; + fld_s03i245_min:units = "%" ; + fld_s03i245_min:um_stash_source = "m01s03i245" ; + fld_s03i245_min:missing_value = 1.e+20f ; + fld_s03i245_min:cell_methods = "time: minimum" ; + fld_s03i245_min:grid_mapping = "latitude_longitude" ; + fld_s03i245_min:coordinates = "height_0" ; + float fld_s03i245_max(time, lat, lon) ; + fld_s03i245_max:_FillValue = 1.e+20f ; + fld_s03i245_max:standard_name = "relative_humidity" ; + fld_s03i245_max:long_name = "RELATIVE HUMIDITY AT 1.5M" ; + fld_s03i245_max:units = "%" ; + fld_s03i245_max:um_stash_source = "m01s03i245" ; + fld_s03i245_max:missing_value = 1.e+20f ; + fld_s03i245_max:cell_methods = "time: maximum" ; + fld_s03i245_max:grid_mapping = "latitude_longitude" ; + fld_s03i245_max:coordinates = "height_0" ; + float fld_s05i214(time, lat, lon) ; + fld_s05i214:_FillValue = 1.e+20f ; + fld_s05i214:standard_name = "rainfall_flux" ; + fld_s05i214:long_name = "TOTAL RAINFALL RATE: LS+CONV KG/M2/S" ; + fld_s05i214:units = "kg m-2 s-1" ; + fld_s05i214:um_stash_source = "m01s05i214" ; + fld_s05i214:missing_value = 1.e+20f ; + fld_s05i214:cell_methods = "time: mean" ; + fld_s05i214:grid_mapping = "latitude_longitude" ; + float fld_s05i216(time, lat, lon) ; + fld_s05i216:_FillValue = 1.e+20f ; + fld_s05i216:standard_name = "precipitation_flux" ; + fld_s05i216:long_name = "TOTAL PRECIPITATION RATE KG/M2/S" ; + fld_s05i216:units = "kg m-2 s-1" ; + fld_s05i216:um_stash_source = "m01s05i216" ; + fld_s05i216:missing_value = 1.e+20f ; + fld_s05i216:cell_methods = "time: mean" ; + fld_s05i216:grid_mapping = "latitude_longitude" ; + float fld_s08i209(time, lat, lon) ; + fld_s08i209:_FillValue = 1.e+20f ; + fld_s08i209:standard_name = "canopy_water_amount" ; + fld_s08i209:long_name = "CANOPY WATER CONTENT" ; + fld_s08i209:units = "kg m-2" ; + fld_s08i209:um_stash_source = "m01s08i209" ; + fld_s08i209:missing_value = 1.e+20f ; + fld_s08i209:cell_methods = "time: mean" ; + fld_s08i209:grid_mapping = "latitude_longitude" ; + float fld_s08i223(time, soil_model_level_number, lat, lon) ; + fld_s08i223:_FillValue = 1.e+20f ; + fld_s08i223:standard_name = "mass_content_of_water_in_soil_layer" ; + fld_s08i223:long_name = "SOIL MOISTURE CONTENT IN A LAYER" ; + fld_s08i223:units = "kg m-2" ; + fld_s08i223:um_stash_source = "m01s08i223" ; + fld_s08i223:missing_value = 1.e+20f ; + fld_s08i223:cell_methods = "time: mean" ; + fld_s08i223:grid_mapping = "latitude_longitude" ; + int soil_model_level_number(soil_model_level_number) ; + soil_model_level_number:axis = "Z" ; + soil_model_level_number:units = "1" ; + soil_model_level_number:long_name = "soil_model_level_number" ; + soil_model_level_number:positive = "down" ; + float fld_s08i225(time, soil_model_level_number, lat, lon) ; + fld_s08i225:_FillValue = 1.e+20f ; + fld_s08i225:standard_name = "soil_temperature" ; + fld_s08i225:long_name = "DEEP SOIL TEMP. AFTER HYDROLOGY DEGK" ; + fld_s08i225:units = "K" ; + fld_s08i225:um_stash_source = "m01s08i225" ; + fld_s08i225:missing_value = 1.e+20f ; + fld_s08i225:cell_methods = "time: mean" ; + fld_s08i225:grid_mapping = "latitude_longitude" ; + float fld_s08i234(time, lat, lon) ; + fld_s08i234:_FillValue = 1.e+20f ; + fld_s08i234:standard_name = "surface_runoff_flux" ; + fld_s08i234:long_name = "SURFACE RUNOFF RATE KG/M2/S" ; + fld_s08i234:units = "kg m-2 s-1" ; + fld_s08i234:um_stash_source = "m01s08i234" ; + fld_s08i234:missing_value = 1.e+20f ; + fld_s08i234:cell_methods = "time: mean" ; + fld_s08i234:grid_mapping = "latitude_longitude" ; + float fld_s08i235(time, lat, lon) ; + fld_s08i235:_FillValue = 1.e+20f ; + fld_s08i235:standard_name = "subsurface_runoff_flux" ; + fld_s08i235:long_name = "SUB-SURFACE RUNOFF RATE KG/M2/S" ; + fld_s08i235:units = "kg m-2 s-1" ; + fld_s08i235:um_stash_source = "m01s08i235" ; + fld_s08i235:missing_value = 1.e+20f ; + fld_s08i235:cell_methods = "time: mean" ; + fld_s08i235:grid_mapping = "latitude_longitude" ; + float fld_s16i222(time, lat, lon) ; + fld_s16i222:_FillValue = 1.e+20f ; + fld_s16i222:standard_name = "air_pressure_at_sea_level" ; + fld_s16i222:long_name = "PRESSURE AT MEAN SEA LEVEL" ; + fld_s16i222:units = "Pa" ; + fld_s16i222:um_stash_source = "m01s16i222" ; + fld_s16i222:missing_value = 1.e+20f ; + fld_s16i222:cell_methods = "time: mean" ; + fld_s16i222:grid_mapping = "latitude_longitude" ; + float fld_s30i201(time, pressure, lat_v, lon_u) ; + fld_s30i201:_FillValue = 1.e+20f ; + fld_s30i201:standard_name = "eastward_wind" ; + fld_s30i201:long_name = "U COMPNT OF WIND ON P LEV/UV GRID" ; + fld_s30i201:units = "m s-1" ; + fld_s30i201:um_stash_source = "m01s30i201" ; + fld_s30i201:missing_value = 1.e+20f ; + fld_s30i201:cell_methods = "time: mean" ; + fld_s30i201:grid_mapping = "latitude_longitude" ; + double pressure(pressure) ; + pressure:axis = "Z" ; + pressure:units = "Pa" ; + pressure:long_name = "pressure" ; + pressure:positive = "down" ; + float fld_s30i202(time, pressure, lat_v, lon_u) ; + fld_s30i202:_FillValue = 1.e+20f ; + fld_s30i202:standard_name = "northward_wind" ; + fld_s30i202:long_name = "V COMPNT OF WIND ON P LEV/UV GRID" ; + fld_s30i202:units = "m s-1" ; + fld_s30i202:um_stash_source = "m01s30i202" ; + fld_s30i202:missing_value = 1.e+20f ; + fld_s30i202:cell_methods = "time: mean" ; + fld_s30i202:grid_mapping = "latitude_longitude" ; + float fld_s30i204(time, pressure, lat_v, lon_u) ; + fld_s30i204:_FillValue = 1.e+20f ; + fld_s30i204:standard_name = "air_temperature" ; + fld_s30i204:long_name = "TEMPERATURE ON P LEV/UV GRID" ; + fld_s30i204:units = "K" ; + fld_s30i204:um_stash_source = "m01s30i204" ; + fld_s30i204:missing_value = 1.e+20f ; + fld_s30i204:cell_methods = "time: mean" ; + fld_s30i204:grid_mapping = "latitude_longitude" ; + float fld_s30i205(time, pressure, lat_v, lon_u) ; + fld_s30i205:_FillValue = 1.e+20f ; + fld_s30i205:standard_name = "specific_humidity" ; + fld_s30i205:long_name = "SPECIFIC HUMIDITY ON P LEV/UV GRID" ; + fld_s30i205:units = "1" ; + fld_s30i205:um_stash_source = "m01s30i205" ; + fld_s30i205:missing_value = 1.e+20f ; + fld_s30i205:cell_methods = "time: mean" ; + fld_s30i205:grid_mapping = "latitude_longitude" ; + float fld_s30i206(time, pressure, lat_v, lon_u) ; + fld_s30i206:_FillValue = 1.e+20f ; + fld_s30i206:standard_name = "relative_humidity" ; + fld_s30i206:long_name = "RELATIVE HUMIDITY ON P LEV/UV GRID" ; + fld_s30i206:units = "%" ; + fld_s30i206:um_stash_source = "m01s30i206" ; + fld_s30i206:missing_value = 1.e+20f ; + fld_s30i206:cell_methods = "time: mean" ; + fld_s30i206:grid_mapping = "latitude_longitude" ; + float fld_s30i207(time, pressure, lat_v, lon_u) ; + fld_s30i207:_FillValue = 1.e+20f ; + fld_s30i207:standard_name = "geopotential_height" ; + fld_s30i207:long_name = "GEOPOTENTIAL HEIGHT ON P LEV/UV GRID" ; + fld_s30i207:units = "m" ; + fld_s30i207:um_stash_source = "m01s30i207" ; + fld_s30i207:missing_value = 1.e+20f ; + fld_s30i207:cell_methods = "time: mean" ; + fld_s30i207:grid_mapping = "latitude_longitude" ; + float fld_s30i208(time, pressure, lat_v, lon_u) ; + fld_s30i208:_FillValue = 1.e+20f ; + fld_s30i208:standard_name = "lagrangian_tendency_of_air_pressure" ; + fld_s30i208:long_name = "OMEGA ON P LEV/UV GRID" ; + fld_s30i208:units = "Pa s-1" ; + fld_s30i208:um_stash_source = "m01s30i208" ; + fld_s30i208:missing_value = 1.e+20f ; + fld_s30i208:cell_methods = "time: mean" ; + fld_s30i208:grid_mapping = "latitude_longitude" ; + float fld_s30i301(time, pressure, lat_v, lon_u) ; + fld_s30i301:_FillValue = 1.e+20f ; + fld_s30i301:long_name = "Heavyside function on pressure levels" ; + fld_s30i301:units = "1" ; + fld_s30i301:um_stash_source = "m01s30i301" ; + fld_s30i301:missing_value = 1.e+20f ; + fld_s30i301:cell_methods = "time: mean" ; + fld_s30i301:grid_mapping = "latitude_longitude" ; + +// global attributes: + :history = "File /scratch/p66/jxs599/access-esm/archive/Nov25-NewNitrogen-Nov25-NewNitrogen-6a5acd30/output200/atmosphere/aiihca.pei5jan converted with /g/data/vk83/apps/base_conda/envs/payu-1.2.0/lib/python3.10/site-packages/um2nc/um2netcdf.py 1.1.0 at 2025-12-04 20:05:24" ; + :Conventions = "CF-1.6" ; + :source = "Data from Met Office Unified Model" ; + :um_version = "7.3" ; +} diff --git a/splitnc/test/data/iceh-1daily-mean_2345-01.cdl b/splitnc/test/data/iceh-1daily-mean_2345-01.cdl new file mode 100644 index 0000000..cf90e08 --- /dev/null +++ b/splitnc/test/data/iceh-1daily-mean_2345-01.cdl @@ -0,0 +1,326 @@ +netcdf iceh-1daily-mean_2345-01 { +dimensions: + d2 = 2 ; + ni = 360 ; + nj = 300 ; + nc = 5 ; + nkice = 1 ; + nksnow = 1 ; + nkbio = 2 ; + time = UNLIMITED ; // (31 currently) + nvertices = 4 ; +variables: + float time(time) ; + time:long_name = "model time" ; + time:units = "days since 0001-01-01 00:00:00" ; + time:calendar = "proleptic_gregorian" ; + time:bounds = "time_bounds" ; + float time_bounds(time, d2) ; + time_bounds:long_name = "boundaries for time-averaging interval" ; + time_bounds:units = "days since 0001-01-01 00:00:00" ; + float TLON(nj, ni) ; + TLON:long_name = "T grid center longitude" ; + TLON:units = "degrees_east" ; + TLON:missing_value = 1.e+30f ; + TLON:_FillValue = 1.e+30f ; + float TLAT(nj, ni) ; + TLAT:long_name = "T grid center latitude" ; + TLAT:units = "degrees_north" ; + TLAT:missing_value = 1.e+30f ; + TLAT:_FillValue = 1.e+30f ; + float ULON(nj, ni) ; + ULON:long_name = "U grid center longitude" ; + ULON:units = "degrees_east" ; + ULON:missing_value = 1.e+30f ; + ULON:_FillValue = 1.e+30f ; + float ULAT(nj, ni) ; + ULAT:long_name = "U grid center latitude" ; + ULAT:units = "degrees_north" ; + ULAT:missing_value = 1.e+30f ; + ULAT:_FillValue = 1.e+30f ; + ULAT:comment = "Latitude of NE corner of T grid cell" ; + float NCAT(nc) ; + NCAT:long_name = "category maximum thickness" ; + NCAT:units = "m" ; + float VGRDi(nkice) ; + VGRDi:long_name = "vertical ice levels" ; + VGRDi:units = "1" ; + float VGRDs(nksnow) ; + VGRDs:long_name = "vertical snow levels" ; + VGRDs:units = "1" ; + float VGRDb(nkbio) ; + VGRDb:long_name = "vertical ice-bio levels" ; + VGRDb:units = "1" ; + float tmask(nj, ni) ; + tmask:long_name = "ocean grid mask" ; + tmask:coordinates = "TLON TLAT" ; + tmask:comment = "0 = land, 1 = ocean" ; + tmask:missing_value = 1.e+30f ; + tmask:_FillValue = 1.e+30f ; + float tarea(nj, ni) ; + tarea:long_name = "area of T grid cells" ; + tarea:units = "m^2" ; + tarea:coordinates = "TLON TLAT" ; + tarea:missing_value = 1.e+30f ; + tarea:_FillValue = 1.e+30f ; + float uarea(nj, ni) ; + uarea:long_name = "area of U grid cells" ; + uarea:units = "m^2" ; + uarea:coordinates = "ULON ULAT" ; + uarea:missing_value = 1.e+30f ; + uarea:_FillValue = 1.e+30f ; + float aice(time, nj, ni) ; + aice:units = "1" ; + aice:long_name = "ice area (aggregate)" ; + aice:coordinates = "TLON TLAT time" ; + aice:cell_measures = "area: tarea" ; + aice:missing_value = 1.e+30f ; + aice:_FillValue = 1.e+30f ; + aice:cell_methods = "time: mean" ; + aice:time_rep = "averaged" ; + float dvsdtt(time, nj, ni) ; + dvsdtt:units = "cm/day" ; + dvsdtt:long_name = "snow volume tendency thermo" ; + dvsdtt:coordinates = "TLON TLAT time" ; + dvsdtt:cell_measures = "area: tarea" ; + dvsdtt:missing_value = 1.e+30f ; + dvsdtt:_FillValue = 1.e+30f ; + dvsdtt:cell_methods = "time: mean" ; + dvsdtt:time_rep = "averaged" ; + float dvsdtd(time, nj, ni) ; + dvsdtd:units = "cm/day" ; + dvsdtd:long_name = "snow volume tendency dynamics" ; + dvsdtd:coordinates = "TLON TLAT time" ; + dvsdtd:cell_measures = "area: tarea" ; + dvsdtd:missing_value = 1.e+30f ; + dvsdtd:_FillValue = 1.e+30f ; + dvsdtd:cell_methods = "time: mean" ; + dvsdtd:time_rep = "averaged" ; + float siconc(time, nj, ni) ; + siconc:units = "%" ; + siconc:long_name = "Sea-Ice Area Percentage (Ocean Grid)" ; + siconc:coordinates = "TLON TLAT time" ; + siconc:cell_measures = "area: tarea" ; + siconc:missing_value = 1.e+30f ; + siconc:_FillValue = 1.e+30f ; + siconc:cell_methods = "area: mean where sea time: mean" ; + siconc:time_rep = "averaged" ; + float sitimefrac(time, nj, ni) ; + sitimefrac:units = "1" ; + sitimefrac:long_name = "fraction of time-avg interval that ice is present" ; + sitimefrac:coordinates = "TLON TLAT time" ; + sitimefrac:cell_measures = "area: tarea" ; + sitimefrac:comment = "ice extent flag" ; + sitimefrac:missing_value = 1.e+30f ; + sitimefrac:_FillValue = 1.e+30f ; + sitimefrac:cell_methods = "area: mean where sea time: mean" ; + sitimefrac:time_rep = "averaged" ; + float sithick(time, nj, ni) ; + sithick:units = "m" ; + sithick:long_name = "Sea-Ice Thickness" ; + sithick:coordinates = "TLON TLAT time" ; + sithick:cell_measures = "area: tarea" ; + sithick:comment = "area weighted average of volume divided by ice area" ; + sithick:missing_value = 1.e+30f ; + sithick:_FillValue = 1.e+30f ; + sithick:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sithick:time_rep = "averaged" ; + float siage(time, nj, ni) ; + siage:units = "s" ; + siage:long_name = "Age of Sea Ice" ; + siage:coordinates = "TLON TLAT time" ; + siage:cell_measures = "area: tarea" ; + siage:comment = "area weighted average of age of sea ice" ; + siage:missing_value = 1.e+30f ; + siage:_FillValue = 1.e+30f ; + siage:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siage:time_rep = "averaged" ; + float sifb(time, nj, ni) ; + sifb:units = "m" ; + sifb:long_name = "Sea-Ice Freeboard" ; + sifb:coordinates = "TLON TLAT time" ; + sifb:cell_measures = "area: tarea" ; + sifb:comment = "area weighted average of height of sea ice above ocean surface" ; + sifb:missing_value = 1.e+30f ; + sifb:_FillValue = 1.e+30f ; + sifb:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sifb:time_rep = "averaged" ; + float sitempbot(time, nj, ni) ; + sitempbot:units = "K" ; + sitempbot:long_name = "Temperature at Ice-Ocean Interface" ; + sitempbot:coordinates = "TLON TLAT time" ; + sitempbot:cell_measures = "area: tarea" ; + sitempbot:comment = "area weighted average of ice-ocean interface temperature" ; + sitempbot:missing_value = 1.e+30f ; + sitempbot:_FillValue = 1.e+30f ; + sitempbot:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sitempbot:time_rep = "averaged" ; + float siu(time, nj, ni) ; + siu:units = "m/s" ; + siu:long_name = "X-Component of Sea-Ice Velocity" ; + siu:coordinates = "ULON ULAT time" ; + siu:cell_measures = "area: uarea" ; + siu:comment = "area weighted average" ; + siu:missing_value = 1.e+30f ; + siu:_FillValue = 1.e+30f ; + siu:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siu:time_rep = "averaged" ; + float siv(time, nj, ni) ; + siv:units = "m/s" ; + siv:long_name = "Y-Component of Sea-Ice Velocity" ; + siv:coordinates = "ULON ULAT time" ; + siv:cell_measures = "area: uarea" ; + siv:comment = "area weighted average" ; + siv:missing_value = 1.e+30f ; + siv:_FillValue = 1.e+30f ; + siv:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siv:time_rep = "averaged" ; + float siforcetiltx(time, nj, ni) ; + siforcetiltx:units = "N m^-2" ; + siforcetiltx:long_name = "Sea-Surface Tilt Term in Force Balance (X-Component)" ; + siforcetiltx:coordinates = "ULON ULAT time" ; + siforcetiltx:cell_measures = "area: uarea" ; + siforcetiltx:comment = "area weighted average" ; + siforcetiltx:missing_value = 1.e+30f ; + siforcetiltx:_FillValue = 1.e+30f ; + siforcetiltx:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siforcetiltx:time_rep = "averaged" ; + float siforcetilty(time, nj, ni) ; + siforcetilty:units = "N m^-2" ; + siforcetilty:long_name = "Sea-Surface Tilt Term in Force Balance (Y-Component)" ; + siforcetilty:coordinates = "ULON ULAT time" ; + siforcetilty:cell_measures = "area: uarea" ; + siforcetilty:comment = "area weighted average" ; + siforcetilty:missing_value = 1.e+30f ; + siforcetilty:_FillValue = 1.e+30f ; + siforcetilty:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siforcetilty:time_rep = "averaged" ; + float siforcecoriolx(time, nj, ni) ; + siforcecoriolx:units = "N m^-2" ; + siforcecoriolx:long_name = "Coriolis Force Term in Force Balance (X-Component)" ; + siforcecoriolx:coordinates = "ULON ULAT time" ; + siforcecoriolx:cell_measures = "area: uarea" ; + siforcecoriolx:comment = "area weighted average" ; + siforcecoriolx:missing_value = 1.e+30f ; + siforcecoriolx:_FillValue = 1.e+30f ; + siforcecoriolx:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siforcecoriolx:time_rep = "averaged" ; + float siforcecorioly(time, nj, ni) ; + siforcecorioly:units = "N m^-2" ; + siforcecorioly:long_name = "Coriolis Force Term in Force Balance (Y-Component)" ; + siforcecorioly:coordinates = "ULON ULAT time" ; + siforcecorioly:cell_measures = "area: uarea" ; + siforcecorioly:comment = "area weighted average" ; + siforcecorioly:missing_value = 1.e+30f ; + siforcecorioly:_FillValue = 1.e+30f ; + siforcecorioly:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siforcecorioly:time_rep = "averaged" ; + float siforceintstrx(time, nj, ni) ; + siforceintstrx:units = "N m^-2" ; + siforceintstrx:long_name = "Internal Stress Term in Force Balance (X-Component)" ; + siforceintstrx:coordinates = "ULON ULAT time" ; + siforceintstrx:cell_measures = "area: uarea" ; + siforceintstrx:comment = "area weighted average" ; + siforceintstrx:missing_value = 1.e+30f ; + siforceintstrx:_FillValue = 1.e+30f ; + siforceintstrx:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siforceintstrx:time_rep = "averaged" ; + float siforceintstry(time, nj, ni) ; + siforceintstry:units = "N m^-2" ; + siforceintstry:long_name = "Internal Stress Term in Force Balance (Y-Component)" ; + siforceintstry:coordinates = "ULON ULAT time" ; + siforceintstry:cell_measures = "area: uarea" ; + siforceintstry:comment = "area weighted average" ; + siforceintstry:missing_value = 1.e+30f ; + siforceintstry:_FillValue = 1.e+30f ; + siforceintstry:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siforceintstry:time_rep = "averaged" ; + float sispeed(time, nj, ni) ; + sispeed:units = "m/s" ; + sispeed:long_name = "Sea-Ice Speed" ; + sispeed:coordinates = "ULON ULAT time" ; + sispeed:cell_measures = "area: uarea" ; + sispeed:comment = "area weighted average" ; + sispeed:missing_value = 1.e+30f ; + sispeed:_FillValue = 1.e+30f ; + sispeed:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sispeed:time_rep = "averaged" ; + float sihc(time, nj, ni) ; + sihc:units = "J m^-2" ; + sihc:long_name = "Sea-Ice Heat Content" ; + sihc:coordinates = "TLON TLAT time" ; + sihc:cell_measures = "area: tarea" ; + sihc:comment = "per unit grid cell area" ; + sihc:missing_value = 1.e+30f ; + sihc:_FillValue = 1.e+30f ; + sihc:cell_methods = "area: mean where sea time: mean" ; + sihc:time_rep = "averaged" ; + float sisnhc(time, nj, ni) ; + sisnhc:units = "J m^-2" ; + sisnhc:long_name = "Snow Heat Content" ; + sisnhc:coordinates = "TLON TLAT time" ; + sisnhc:cell_measures = "area: tarea" ; + sisnhc:comment = "per unit grid cell area" ; + sisnhc:missing_value = 1.e+30f ; + sisnhc:_FillValue = 1.e+30f ; + sisnhc:cell_methods = "area: mean where sea time: mean" ; + sisnhc:time_rep = "averaged" ; + float siflsensbot(time, nj, ni) ; + siflsensbot:units = "W m^-2" ; + siflsensbot:long_name = "Net Upward Sensible Heat Flux under Sea Ice" ; + siflsensbot:coordinates = "TLON TLAT time" ; + siflsensbot:cell_measures = "area: tarea" ; + siflsensbot:comment = "area weighted average, positive downward, per sea ice area" ; + siflsensbot:missing_value = 1.e+30f ; + siflsensbot:_FillValue = 1.e+30f ; + siflsensbot:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siflsensbot:time_rep = "averaged" ; + float siflcondtop(time, nj, ni) ; + siflcondtop:units = "W m^-2" ; + siflcondtop:long_name = "Net Conductive Heat Flux in Sea Ice at the Surface" ; + siflcondtop:coordinates = "TLON TLAT time" ; + siflcondtop:cell_measures = "area: tarea" ; + siflcondtop:comment = "area weighted average, positive downward, per sea ice area" ; + siflcondtop:missing_value = 1.e+30f ; + siflcondtop:_FillValue = 1.e+30f ; + siflcondtop:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siflcondtop:time_rep = "averaged" ; + float siflcondbot(time, nj, ni) ; + siflcondbot:units = "W m^-2" ; + siflcondbot:long_name = "Net Conductive Heat Flux in Sea Ice at the Base" ; + siflcondbot:coordinates = "TLON TLAT time" ; + siflcondbot:cell_measures = "area: tarea" ; + siflcondbot:comment = "area weighted average, positive downward, per sea ice area" ; + siflcondbot:missing_value = 1.e+30f ; + siflcondbot:_FillValue = 1.e+30f ; + siflcondbot:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siflcondbot:time_rep = "averaged" ; + float sisaltmass(time, nj, ni) ; + sisaltmass:units = "kg m^-2" ; + sisaltmass:long_name = "Mass of Salt in Sea Ice" ; + sisaltmass:coordinates = "TLON TLAT time" ; + sisaltmass:cell_measures = "area: tarea" ; + sisaltmass:comment = "per unit grid cell area" ; + sisaltmass:missing_value = 1.e+30f ; + sisaltmass:_FillValue = 1.e+30f ; + sisaltmass:cell_methods = "area: mean where sea time: mean" ; + sisaltmass:time_rep = "averaged" ; + float siitdconc(time, nc, nj, ni) ; + siitdconc:units = "%" ; + siitdconc:long_name = "Sea-Ice Area Percentage in Ice Thickness Categories" ; + siitdconc:coordinates = "TLON TLAT NCAT time" ; + siitdconc:cell_measures = "area: tarea" ; + siitdconc:missing_value = 1.e+30f ; + siitdconc:_FillValue = 1.e+30f ; + siitdconc:cell_methods = "time: mean" ; + siitdconc:time_rep = "averaged" ; + +// global attributes: + :title = "sea ice model output for CICE" ; + :contents = "Diagnostic and Prognostic Variables" ; + :source = "Los Alamos Sea Ice Model (CICE) Version 5" ; + :comment = "This year has 365 days" ; + :comment2 = "File started on model date 23450102" ; + :history = "This dataset was created on 2025-12-04 at 19:02:58.4" ; + :io_flavor = "io_netcdf" ; +} diff --git a/splitnc/test/data/iceh-1monthly-mean_2345-01.cdl b/splitnc/test/data/iceh-1monthly-mean_2345-01.cdl new file mode 100644 index 0000000..087a740 --- /dev/null +++ b/splitnc/test/data/iceh-1monthly-mean_2345-01.cdl @@ -0,0 +1,604 @@ +netcdf iceh-1monthly-mean_2345-01 { +dimensions: + d2 = 2 ; + ni = 360 ; + nj = 300 ; + nc = 5 ; + nkice = 1 ; + nksnow = 1 ; + nkbio = 2 ; + time = UNLIMITED ; // (1 currently) + nvertices = 4 ; +variables: + float time(time) ; + time:long_name = "model time" ; + time:units = "days since 0001-01-01 00:00:00" ; + time:calendar = "proleptic_gregorian" ; + time:bounds = "time_bounds" ; + float time_bounds(time, d2) ; + time_bounds:long_name = "boundaries for time-averaging interval" ; + time_bounds:units = "days since 0001-01-01 00:00:00" ; + float TLON(nj, ni) ; + TLON:long_name = "T grid center longitude" ; + TLON:units = "degrees_east" ; + TLON:missing_value = 1.e+30f ; + TLON:_FillValue = 1.e+30f ; + float TLAT(nj, ni) ; + TLAT:long_name = "T grid center latitude" ; + TLAT:units = "degrees_north" ; + TLAT:missing_value = 1.e+30f ; + TLAT:_FillValue = 1.e+30f ; + float ULON(nj, ni) ; + ULON:long_name = "U grid center longitude" ; + ULON:units = "degrees_east" ; + ULON:missing_value = 1.e+30f ; + ULON:_FillValue = 1.e+30f ; + float ULAT(nj, ni) ; + ULAT:long_name = "U grid center latitude" ; + ULAT:units = "degrees_north" ; + ULAT:missing_value = 1.e+30f ; + ULAT:_FillValue = 1.e+30f ; + ULAT:comment = "Latitude of NE corner of T grid cell" ; + float NCAT(nc) ; + NCAT:long_name = "category maximum thickness" ; + NCAT:units = "m" ; + float VGRDi(nkice) ; + VGRDi:long_name = "vertical ice levels" ; + VGRDi:units = "1" ; + float VGRDs(nksnow) ; + VGRDs:long_name = "vertical snow levels" ; + VGRDs:units = "1" ; + float VGRDb(nkbio) ; + VGRDb:long_name = "vertical ice-bio levels" ; + VGRDb:units = "1" ; + float tmask(nj, ni) ; + tmask:long_name = "ocean grid mask" ; + tmask:coordinates = "TLON TLAT" ; + tmask:comment = "0 = land, 1 = ocean" ; + tmask:missing_value = 1.e+30f ; + tmask:_FillValue = 1.e+30f ; + float tarea(nj, ni) ; + tarea:long_name = "area of T grid cells" ; + tarea:units = "m^2" ; + tarea:coordinates = "TLON TLAT" ; + tarea:missing_value = 1.e+30f ; + tarea:_FillValue = 1.e+30f ; + float uarea(nj, ni) ; + uarea:long_name = "area of U grid cells" ; + uarea:units = "m^2" ; + uarea:coordinates = "ULON ULAT" ; + uarea:missing_value = 1.e+30f ; + uarea:_FillValue = 1.e+30f ; + float aice(time, nj, ni) ; + aice:units = "1" ; + aice:long_name = "ice area (aggregate)" ; + aice:coordinates = "TLON TLAT time" ; + aice:cell_measures = "area: tarea" ; + aice:missing_value = 1.e+30f ; + aice:_FillValue = 1.e+30f ; + aice:cell_methods = "time: mean" ; + aice:time_rep = "averaged" ; + float dvsdtt(time, nj, ni) ; + dvsdtt:units = "cm/day" ; + dvsdtt:long_name = "snow volume tendency thermo" ; + dvsdtt:coordinates = "TLON TLAT time" ; + dvsdtt:cell_measures = "area: tarea" ; + dvsdtt:missing_value = 1.e+30f ; + dvsdtt:_FillValue = 1.e+30f ; + dvsdtt:cell_methods = "time: mean" ; + dvsdtt:time_rep = "averaged" ; + float dvsdtd(time, nj, ni) ; + dvsdtd:units = "cm/day" ; + dvsdtd:long_name = "snow volume tendency dynamics" ; + dvsdtd:coordinates = "TLON TLAT time" ; + dvsdtd:cell_measures = "area: tarea" ; + dvsdtd:missing_value = 1.e+30f ; + dvsdtd:_FillValue = 1.e+30f ; + dvsdtd:cell_methods = "time: mean" ; + dvsdtd:time_rep = "averaged" ; + float siconc(time, nj, ni) ; + siconc:units = "%" ; + siconc:long_name = "Sea-Ice Area Percentage (Ocean Grid)" ; + siconc:coordinates = "TLON TLAT time" ; + siconc:cell_measures = "area: tarea" ; + siconc:missing_value = 1.e+30f ; + siconc:_FillValue = 1.e+30f ; + siconc:cell_methods = "area: mean where sea time: mean" ; + siconc:time_rep = "averaged" ; + float sitimefrac(time, nj, ni) ; + sitimefrac:units = "1" ; + sitimefrac:long_name = "fraction of time-avg interval that ice is present" ; + sitimefrac:coordinates = "TLON TLAT time" ; + sitimefrac:cell_measures = "area: tarea" ; + sitimefrac:comment = "ice extent flag" ; + sitimefrac:missing_value = 1.e+30f ; + sitimefrac:_FillValue = 1.e+30f ; + sitimefrac:cell_methods = "area: mean where sea time: mean" ; + sitimefrac:time_rep = "averaged" ; + float sivol(time, nj, ni) ; + sivol:units = "m" ; + sivol:long_name = "Sea-Ice Volume per Area" ; + sivol:coordinates = "TLON TLAT time" ; + sivol:cell_measures = "area: tarea" ; + sivol:comment = "ice volume per unit grid cell area" ; + sivol:missing_value = 1.e+30f ; + sivol:_FillValue = 1.e+30f ; + sivol:cell_methods = "area: mean where sea time: mean" ; + sivol:time_rep = "averaged" ; + float sithick(time, nj, ni) ; + sithick:units = "m" ; + sithick:long_name = "Sea-Ice Thickness" ; + sithick:coordinates = "TLON TLAT time" ; + sithick:cell_measures = "area: tarea" ; + sithick:comment = "area weighted average of volume divided by ice area" ; + sithick:missing_value = 1.e+30f ; + sithick:_FillValue = 1.e+30f ; + sithick:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sithick:time_rep = "averaged" ; + float simass(time, nj, ni) ; + simass:units = "kg m^-2" ; + simass:long_name = "Sea-Ice Mass" ; + simass:coordinates = "TLON TLAT time" ; + simass:cell_measures = "area: tarea" ; + simass:comment = "ice mass per unit grid cell area" ; + simass:missing_value = 1.e+30f ; + simass:_FillValue = 1.e+30f ; + simass:cell_methods = "area: mean where sea time: mean" ; + simass:time_rep = "averaged" ; + float siage(time, nj, ni) ; + siage:units = "s" ; + siage:long_name = "Age of Sea Ice" ; + siage:coordinates = "TLON TLAT time" ; + siage:cell_measures = "area: tarea" ; + siage:comment = "area weighted average of age of sea ice" ; + siage:missing_value = 1.e+30f ; + siage:_FillValue = 1.e+30f ; + siage:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siage:time_rep = "averaged" ; + float sifb(time, nj, ni) ; + sifb:units = "m" ; + sifb:long_name = "Sea-Ice Freeboard" ; + sifb:coordinates = "TLON TLAT time" ; + sifb:cell_measures = "area: tarea" ; + sifb:comment = "area weighted average of height of sea ice above ocean surface" ; + sifb:missing_value = 1.e+30f ; + sifb:_FillValue = 1.e+30f ; + sifb:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sifb:time_rep = "averaged" ; + float sisnmass(time, nj, ni) ; + sisnmass:units = "kg m^-2" ; + sisnmass:long_name = "Snow Mass per Area" ; + sisnmass:coordinates = "TLON TLAT time" ; + sisnmass:cell_measures = "area: tarea" ; + sisnmass:comment = "snow mass per unit grid cell area" ; + sisnmass:missing_value = 1.e+30f ; + sisnmass:_FillValue = 1.e+30f ; + sisnmass:cell_methods = "area: mean where sea time: mean" ; + sisnmass:time_rep = "averaged" ; + float sitempbot(time, nj, ni) ; + sitempbot:units = "K" ; + sitempbot:long_name = "Temperature at Ice-Ocean Interface" ; + sitempbot:coordinates = "TLON TLAT time" ; + sitempbot:cell_measures = "area: tarea" ; + sitempbot:comment = "area weighted average of ice-ocean interface temperature" ; + sitempbot:missing_value = 1.e+30f ; + sitempbot:_FillValue = 1.e+30f ; + sitempbot:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sitempbot:time_rep = "averaged" ; + float siu(time, nj, ni) ; + siu:units = "m/s" ; + siu:long_name = "X-Component of Sea-Ice Velocity" ; + siu:coordinates = "ULON ULAT time" ; + siu:cell_measures = "area: uarea" ; + siu:comment = "area weighted average" ; + siu:missing_value = 1.e+30f ; + siu:_FillValue = 1.e+30f ; + siu:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siu:time_rep = "averaged" ; + float siv(time, nj, ni) ; + siv:units = "m/s" ; + siv:long_name = "Y-Component of Sea-Ice Velocity" ; + siv:coordinates = "ULON ULAT time" ; + siv:cell_measures = "area: uarea" ; + siv:comment = "area weighted average" ; + siv:missing_value = 1.e+30f ; + siv:_FillValue = 1.e+30f ; + siv:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siv:time_rep = "averaged" ; + float sidmasstranx(time, nj, ni) ; + sidmasstranx:units = "kg/s" ; + sidmasstranx:long_name = "X-Component of Sea-Ice Mass Transport" ; + sidmasstranx:coordinates = "ULON ULAT time" ; + sidmasstranx:cell_measures = "area: uarea" ; + sidmasstranx:comment = "includes sea-ice and snow transport" ; + sidmasstranx:missing_value = 1.e+30f ; + sidmasstranx:_FillValue = 1.e+30f ; + sidmasstranx:cell_methods = "area: mean where sea time: mean" ; + sidmasstranx:time_rep = "averaged" ; + float sidmasstrany(time, nj, ni) ; + sidmasstrany:units = "kg/s" ; + sidmasstrany:long_name = "Y-Component of Sea-Ice Mass Transport" ; + sidmasstrany:coordinates = "ULON ULAT time" ; + sidmasstrany:cell_measures = "area: uarea" ; + sidmasstrany:comment = "includes sea-ice and snow transport" ; + sidmasstrany:missing_value = 1.e+30f ; + sidmasstrany:_FillValue = 1.e+30f ; + sidmasstrany:cell_methods = "area: mean where sea time: mean" ; + sidmasstrany:time_rep = "averaged" ; + float sistrxdtop(time, nj, ni) ; + sistrxdtop:units = "N m^-2" ; + sistrxdtop:long_name = "X-Component of Atmospheric Stress on Sea Ice" ; + sistrxdtop:coordinates = "ULON ULAT time" ; + sistrxdtop:cell_measures = "area: uarea" ; + sistrxdtop:comment = "area weighted average" ; + sistrxdtop:missing_value = 1.e+30f ; + sistrxdtop:_FillValue = 1.e+30f ; + sistrxdtop:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sistrxdtop:time_rep = "averaged" ; + float sistrydtop(time, nj, ni) ; + sistrydtop:units = "N m^-2" ; + sistrydtop:long_name = "Y-Component of Atmospheric Stress on Sea Ice" ; + sistrydtop:coordinates = "ULON ULAT time" ; + sistrydtop:cell_measures = "area: uarea" ; + sistrydtop:comment = "area weighted average" ; + sistrydtop:missing_value = 1.e+30f ; + sistrydtop:_FillValue = 1.e+30f ; + sistrydtop:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sistrydtop:time_rep = "averaged" ; + float sistrxubot(time, nj, ni) ; + sistrxubot:units = "N m^-2" ; + sistrxubot:long_name = "X-Component of Ocean Stress on Sea Ice" ; + sistrxubot:coordinates = "ULON ULAT time" ; + sistrxubot:cell_measures = "area: uarea" ; + sistrxubot:comment = "area weighted average" ; + sistrxubot:missing_value = 1.e+30f ; + sistrxubot:_FillValue = 1.e+30f ; + sistrxubot:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sistrxubot:time_rep = "averaged" ; + float sistryubot(time, nj, ni) ; + sistryubot:units = "N m^-2" ; + sistryubot:long_name = "Y-Component of Ocean Stress on Sea Ice" ; + sistryubot:coordinates = "ULON ULAT time" ; + sistryubot:cell_measures = "area: uarea" ; + sistryubot:comment = "area weighted average" ; + sistryubot:missing_value = 1.e+30f ; + sistryubot:_FillValue = 1.e+30f ; + sistryubot:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sistryubot:time_rep = "averaged" ; + float siforcetiltx(time, nj, ni) ; + siforcetiltx:units = "N m^-2" ; + siforcetiltx:long_name = "Sea-Surface Tilt Term in Force Balance (X-Component)" ; + siforcetiltx:coordinates = "ULON ULAT time" ; + siforcetiltx:cell_measures = "area: uarea" ; + siforcetiltx:comment = "area weighted average" ; + siforcetiltx:missing_value = 1.e+30f ; + siforcetiltx:_FillValue = 1.e+30f ; + siforcetiltx:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siforcetiltx:time_rep = "averaged" ; + float siforcetilty(time, nj, ni) ; + siforcetilty:units = "N m^-2" ; + siforcetilty:long_name = "Sea-Surface Tilt Term in Force Balance (Y-Component)" ; + siforcetilty:coordinates = "ULON ULAT time" ; + siforcetilty:cell_measures = "area: uarea" ; + siforcetilty:comment = "area weighted average" ; + siforcetilty:missing_value = 1.e+30f ; + siforcetilty:_FillValue = 1.e+30f ; + siforcetilty:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siforcetilty:time_rep = "averaged" ; + float siforcecoriolx(time, nj, ni) ; + siforcecoriolx:units = "N m^-2" ; + siforcecoriolx:long_name = "Coriolis Force Term in Force Balance (X-Component)" ; + siforcecoriolx:coordinates = "ULON ULAT time" ; + siforcecoriolx:cell_measures = "area: uarea" ; + siforcecoriolx:comment = "area weighted average" ; + siforcecoriolx:missing_value = 1.e+30f ; + siforcecoriolx:_FillValue = 1.e+30f ; + siforcecoriolx:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siforcecoriolx:time_rep = "averaged" ; + float siforcecorioly(time, nj, ni) ; + siforcecorioly:units = "N m^-2" ; + siforcecorioly:long_name = "Coriolis Force Term in Force Balance (Y-Component)" ; + siforcecorioly:coordinates = "ULON ULAT time" ; + siforcecorioly:cell_measures = "area: uarea" ; + siforcecorioly:comment = "area weighted average" ; + siforcecorioly:missing_value = 1.e+30f ; + siforcecorioly:_FillValue = 1.e+30f ; + siforcecorioly:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siforcecorioly:time_rep = "averaged" ; + float siforceintstrx(time, nj, ni) ; + siforceintstrx:units = "N m^-2" ; + siforceintstrx:long_name = "Internal Stress Term in Force Balance (X-Component)" ; + siforceintstrx:coordinates = "ULON ULAT time" ; + siforceintstrx:cell_measures = "area: uarea" ; + siforceintstrx:comment = "area weighted average" ; + siforceintstrx:missing_value = 1.e+30f ; + siforceintstrx:_FillValue = 1.e+30f ; + siforceintstrx:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siforceintstrx:time_rep = "averaged" ; + float siforceintstry(time, nj, ni) ; + siforceintstry:units = "N m^-2" ; + siforceintstry:long_name = "Internal Stress Term in Force Balance (Y-Component)" ; + siforceintstry:coordinates = "ULON ULAT time" ; + siforceintstry:cell_measures = "area: uarea" ; + siforceintstry:comment = "area weighted average" ; + siforceintstry:missing_value = 1.e+30f ; + siforceintstry:_FillValue = 1.e+30f ; + siforceintstry:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siforceintstry:time_rep = "averaged" ; + float sicompstren(time, nj, ni) ; + sicompstren:units = "N/m" ; + sicompstren:long_name = "Compressive Sea Ice Strength" ; + sicompstren:coordinates = "ULON ULAT time" ; + sicompstren:cell_measures = "area: uarea" ; + sicompstren:comment = "area weighted average" ; + sicompstren:missing_value = 1.e+30f ; + sicompstren:_FillValue = 1.e+30f ; + sicompstren:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sicompstren:time_rep = "averaged" ; + float sidivvel(time, nj, ni) ; + sidivvel:units = "1/s" ; + sidivvel:long_name = "Divergence of the Sea-Ice Velocity Field" ; + sidivvel:coordinates = "ULON ULAT time" ; + sidivvel:cell_measures = "area: uarea" ; + sidivvel:comment = "area weighted average" ; + sidivvel:missing_value = 1.e+30f ; + sidivvel:_FillValue = 1.e+30f ; + sidivvel:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sidivvel:time_rep = "averaged" ; + float sispeed(time, nj, ni) ; + sispeed:units = "m/s" ; + sispeed:long_name = "Sea-Ice Speed" ; + sispeed:coordinates = "ULON ULAT time" ; + sispeed:cell_measures = "area: uarea" ; + sispeed:comment = "area weighted average" ; + sispeed:missing_value = 1.e+30f ; + sispeed:_FillValue = 1.e+30f ; + sispeed:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + sispeed:time_rep = "averaged" ; + float sihc(time, nj, ni) ; + sihc:units = "J m^-2" ; + sihc:long_name = "Sea-Ice Heat Content" ; + sihc:coordinates = "TLON TLAT time" ; + sihc:cell_measures = "area: tarea" ; + sihc:comment = "per unit grid cell area" ; + sihc:missing_value = 1.e+30f ; + sihc:_FillValue = 1.e+30f ; + sihc:cell_methods = "area: mean where sea time: mean" ; + sihc:time_rep = "averaged" ; + float sisnhc(time, nj, ni) ; + sisnhc:units = "J m^-2" ; + sisnhc:long_name = "Snow Heat Content" ; + sisnhc:coordinates = "TLON TLAT time" ; + sisnhc:cell_measures = "area: tarea" ; + sisnhc:comment = "per unit grid cell area" ; + sisnhc:missing_value = 1.e+30f ; + sisnhc:_FillValue = 1.e+30f ; + sisnhc:cell_methods = "area: mean where sea time: mean" ; + sisnhc:time_rep = "averaged" ; + float sidconcth(time, nj, ni) ; + sidconcth:units = "1/s" ; + sidconcth:long_name = "Sea-Ice Area Fraction Tendency Due to Thermodynamics" ; + sidconcth:coordinates = "TLON TLAT time" ; + sidconcth:cell_measures = "area: tarea" ; + sidconcth:missing_value = 1.e+30f ; + sidconcth:_FillValue = 1.e+30f ; + sidconcth:cell_methods = "area: mean where sea time: mean" ; + sidconcth:time_rep = "averaged" ; + float sidconcdyn(time, nj, ni) ; + sidconcdyn:units = "1/s" ; + sidconcdyn:long_name = "Sea-Ice Area Fraction Tendency Due to Dynamics" ; + sidconcdyn:coordinates = "TLON TLAT time" ; + sidconcdyn:cell_measures = "area: tarea" ; + sidconcdyn:missing_value = 1.e+30f ; + sidconcdyn:_FillValue = 1.e+30f ; + sidconcdyn:cell_methods = "area: mean where sea time: mean" ; + sidconcdyn:time_rep = "averaged" ; + float sidmassth(time, nj, ni) ; + sidmassth:units = "kg m^-2 s^-1" ; + sidmassth:long_name = "Sea-Ice Mass Change from Thermodynamics" ; + sidmassth:coordinates = "TLON TLAT time" ; + sidmassth:cell_measures = "area: tarea" ; + sidmassth:comment = "per unit grid cell area" ; + sidmassth:missing_value = 1.e+30f ; + sidmassth:_FillValue = 1.e+30f ; + sidmassth:cell_methods = "area: mean where sea time: mean" ; + sidmassth:time_rep = "averaged" ; + float sidmassdyn(time, nj, ni) ; + sidmassdyn:units = "kg m^-2 s^-1" ; + sidmassdyn:long_name = "Sea-Ice Mass Change from Dynamics" ; + sidmassdyn:coordinates = "TLON TLAT time" ; + sidmassdyn:cell_measures = "area: tarea" ; + sidmassdyn:comment = "per unit grid cell area" ; + sidmassdyn:missing_value = 1.e+30f ; + sidmassdyn:_FillValue = 1.e+30f ; + sidmassdyn:cell_methods = "area: mean where sea time: mean" ; + sidmassdyn:time_rep = "averaged" ; + float sidmassgrowthwat(time, nj, ni) ; + sidmassgrowthwat:units = "kg m^-2 s^-1" ; + sidmassgrowthwat:long_name = "Sea-Ice Mass Change Through Growth in Supercooled Open Water (Frazil)" ; + sidmassgrowthwat:coordinates = "TLON TLAT time" ; + sidmassgrowthwat:cell_measures = "area: tarea" ; + sidmassgrowthwat:comment = "per unit grid cell area" ; + sidmassgrowthwat:missing_value = 1.e+30f ; + sidmassgrowthwat:_FillValue = 1.e+30f ; + sidmassgrowthwat:cell_methods = "area: mean where sea time: mean" ; + sidmassgrowthwat:time_rep = "averaged" ; + float sidmassgrowthbot(time, nj, ni) ; + sidmassgrowthbot:units = "kg m^-2 s^-1" ; + sidmassgrowthbot:long_name = "Sea-Ice Mass Change Through Basal Growth" ; + sidmassgrowthbot:coordinates = "TLON TLAT time" ; + sidmassgrowthbot:cell_measures = "area: tarea" ; + sidmassgrowthbot:comment = "per unit grid cell area" ; + sidmassgrowthbot:missing_value = 1.e+30f ; + sidmassgrowthbot:_FillValue = 1.e+30f ; + sidmassgrowthbot:cell_methods = "area: mean where sea time: mean" ; + sidmassgrowthbot:time_rep = "averaged" ; + float sidmassgrowthsi(time, nj, ni) ; + sidmassgrowthsi:units = "kg m^-2 s^-1" ; + sidmassgrowthsi:long_name = "Sea-Ice Mass Change Through Snow-to-Ice Conversion" ; + sidmassgrowthsi:coordinates = "TLON TLAT time" ; + sidmassgrowthsi:cell_measures = "area: tarea" ; + sidmassgrowthsi:comment = "per unit grid cell area" ; + sidmassgrowthsi:missing_value = 1.e+30f ; + sidmassgrowthsi:_FillValue = 1.e+30f ; + sidmassgrowthsi:cell_methods = "area: mean where sea time: mean" ; + sidmassgrowthsi:time_rep = "averaged" ; + float sidmassevapsubl(time, nj, ni) ; + sidmassevapsubl:units = "kg m^-2 s^-1" ; + sidmassevapsubl:long_name = "Sea-Ice Mass Change Through Evaporation and Sublimation" ; + sidmassevapsubl:coordinates = "TLON TLAT time" ; + sidmassevapsubl:cell_measures = "area: tarea" ; + sidmassevapsubl:comment = "per unit grid cell area" ; + sidmassevapsubl:missing_value = 1.e+30f ; + sidmassevapsubl:_FillValue = 1.e+30f ; + sidmassevapsubl:cell_methods = "area: mean where sea time: mean" ; + sidmassevapsubl:time_rep = "averaged" ; + float sisndmasssubl(time, nj, ni) ; + sisndmasssubl:units = "kg m^-2 s^-1" ; + sisndmasssubl:long_name = "Snow Mass Rate of Change Through Evaporation or Sublimation" ; + sisndmasssubl:coordinates = "TLON TLAT time" ; + sisndmasssubl:cell_measures = "area: tarea" ; + sisndmasssubl:comment = "per unit grid cell area" ; + sisndmasssubl:missing_value = 1.e+30f ; + sisndmasssubl:_FillValue = 1.e+30f ; + sisndmasssubl:cell_methods = "area: mean where sea time: mean" ; + sisndmasssubl:time_rep = "averaged" ; + float sidmassmelttop(time, nj, ni) ; + sidmassmelttop:units = "kg m^-2 s^-1" ; + sidmassmelttop:long_name = "Sea-Ice Mass Change Through Surface Melting" ; + sidmassmelttop:coordinates = "TLON TLAT time" ; + sidmassmelttop:cell_measures = "area: tarea" ; + sidmassmelttop:comment = "per unit grid cell area" ; + sidmassmelttop:missing_value = 1.e+30f ; + sidmassmelttop:_FillValue = 1.e+30f ; + sidmassmelttop:cell_methods = "area: mean where sea time: mean" ; + sidmassmelttop:time_rep = "averaged" ; + float sidmassmeltbot(time, nj, ni) ; + sidmassmeltbot:units = "kg m^-2 s^-1" ; + sidmassmeltbot:long_name = "Sea-Ice Mass Change Through Bottom Melting" ; + sidmassmeltbot:coordinates = "TLON TLAT time" ; + sidmassmeltbot:cell_measures = "area: tarea" ; + sidmassmeltbot:comment = "per unit grid cell area" ; + sidmassmeltbot:missing_value = 1.e+30f ; + sidmassmeltbot:_FillValue = 1.e+30f ; + sidmassmeltbot:cell_methods = "area: mean where sea time: mean" ; + sidmassmeltbot:time_rep = "averaged" ; + float sidmassmeltlat(time, nj, ni) ; + sidmassmeltlat:units = "kg m^-2 s^-1" ; + sidmassmeltlat:long_name = "Sea-Ice Mass Change Through Lateral Melting" ; + sidmassmeltlat:coordinates = "TLON TLAT time" ; + sidmassmeltlat:cell_measures = "area: tarea" ; + sidmassmeltlat:comment = "per unit grid cell area" ; + sidmassmeltlat:missing_value = 1.e+30f ; + sidmassmeltlat:_FillValue = 1.e+30f ; + sidmassmeltlat:cell_methods = "area: mean where sea time: mean" ; + sidmassmeltlat:time_rep = "averaged" ; + float sisndmasssnf(time, nj, ni) ; + sisndmasssnf:units = "kg m^-2 s^-1" ; + sisndmasssnf:long_name = "Snow Mass Change Through Snowfall" ; + sisndmasssnf:coordinates = "TLON TLAT time" ; + sisndmasssnf:cell_measures = "area: tarea" ; + sisndmasssnf:comment = "Always positive or zero, per unit grid cell area" ; + sisndmasssnf:missing_value = 1.e+30f ; + sisndmasssnf:_FillValue = 1.e+30f ; + sisndmasssnf:cell_methods = "area: mean where sea time: mean" ; + sisndmasssnf:time_rep = "averaged" ; + float sisndmassmelt(time, nj, ni) ; + sisndmassmelt:units = "kg m^-2 s^-1" ; + sisndmassmelt:long_name = "Snow Mass Rate of Change Through Melt" ; + sisndmassmelt:coordinates = "TLON TLAT time" ; + sisndmassmelt:cell_measures = "area: tarea" ; + sisndmassmelt:comment = "Always negative or zero, per unit grid cell area" ; + sisndmassmelt:missing_value = 1.e+30f ; + sisndmassmelt:_FillValue = 1.e+30f ; + sisndmassmelt:cell_methods = "area: mean where sea time: mean" ; + sisndmassmelt:time_rep = "averaged" ; + float sisndmasssi(time, nj, ni) ; + sisndmasssi:units = "kg m^-2 s^-1" ; + sisndmasssi:long_name = "Snow Mass Rate of Change Through Snow-to-Ice Conversion" ; + sisndmasssi:coordinates = "TLON TLAT time" ; + sisndmasssi:cell_measures = "area: tarea" ; + sisndmasssi:comment = "Always negative or zero, per unit grid cell area" ; + sisndmasssi:missing_value = 1.e+30f ; + sisndmasssi:_FillValue = 1.e+30f ; + sisndmasssi:cell_methods = "area: mean where sea time: mean" ; + sisndmasssi:time_rep = "averaged" ; + float sisndmassdyn(time, nj, ni) ; + sisndmassdyn:units = "kg m-2 s-1" ; + sisndmassdyn:long_name = "Snow Mass Rate of Change Through Advection by Sea-Ice Dynamics" ; + sisndmassdyn:coordinates = "TLON TLAT time" ; + sisndmassdyn:cell_measures = "area: tarea" ; + sisndmassdyn:comment = "per unit grid cell area" ; + sisndmassdyn:missing_value = 1.e+30f ; + sisndmassdyn:_FillValue = 1.e+30f ; + sisndmassdyn:cell_methods = "area: mean where sea time: mean" ; + sisndmassdyn:time_rep = "averaged" ; + float siflsensbot(time, nj, ni) ; + siflsensbot:units = "W m^-2" ; + siflsensbot:long_name = "Net Upward Sensible Heat Flux under Sea Ice" ; + siflsensbot:coordinates = "TLON TLAT time" ; + siflsensbot:cell_measures = "area: tarea" ; + siflsensbot:comment = "area weighted average, positive downward, per sea ice area" ; + siflsensbot:missing_value = 1.e+30f ; + siflsensbot:_FillValue = 1.e+30f ; + siflsensbot:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siflsensbot:time_rep = "averaged" ; + float siflcondtop(time, nj, ni) ; + siflcondtop:units = "W m^-2" ; + siflcondtop:long_name = "Net Conductive Heat Flux in Sea Ice at the Surface" ; + siflcondtop:coordinates = "TLON TLAT time" ; + siflcondtop:cell_measures = "area: tarea" ; + siflcondtop:comment = "area weighted average, positive downward, per sea ice area" ; + siflcondtop:missing_value = 1.e+30f ; + siflcondtop:_FillValue = 1.e+30f ; + siflcondtop:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siflcondtop:time_rep = "averaged" ; + float siflcondbot(time, nj, ni) ; + siflcondbot:units = "W m^-2" ; + siflcondbot:long_name = "Net Conductive Heat Flux in Sea Ice at the Base" ; + siflcondbot:coordinates = "TLON TLAT time" ; + siflcondbot:cell_measures = "area: tarea" ; + siflcondbot:comment = "area weighted average, positive downward, per sea ice area" ; + siflcondbot:missing_value = 1.e+30f ; + siflcondbot:_FillValue = 1.e+30f ; + siflcondbot:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siflcondbot:time_rep = "averaged" ; + float siflfwbot(time, nj, ni) ; + siflfwbot:units = "kg m^-2 s^-1" ; + siflfwbot:long_name = "Freshwater Flux from Sea Ice" ; + siflfwbot:coordinates = "TLON TLAT time" ; + siflfwbot:cell_measures = "area: tarea" ; + siflfwbot:comment = "area weighted average, positive downward, per unit grid cell area" ; + siflfwbot:missing_value = 1.e+30f ; + siflfwbot:_FillValue = 1.e+30f ; + siflfwbot:cell_methods = "area: time: mean where sea_ice (mask=siconc)" ; + siflfwbot:time_rep = "averaged" ; + float sisaltmass(time, nj, ni) ; + sisaltmass:units = "kg m^-2" ; + sisaltmass:long_name = "Mass of Salt in Sea Ice" ; + sisaltmass:coordinates = "TLON TLAT time" ; + sisaltmass:cell_measures = "area: tarea" ; + sisaltmass:comment = "per unit grid cell area" ; + sisaltmass:missing_value = 1.e+30f ; + sisaltmass:_FillValue = 1.e+30f ; + sisaltmass:cell_methods = "area: mean where sea time: mean" ; + sisaltmass:time_rep = "averaged" ; + float siitdconc(time, nc, nj, ni) ; + siitdconc:units = "%" ; + siitdconc:long_name = "Sea-Ice Area Percentage in Ice Thickness Categories" ; + siitdconc:coordinates = "TLON TLAT NCAT time" ; + siitdconc:cell_measures = "area: tarea" ; + siitdconc:missing_value = 1.e+30f ; + siitdconc:_FillValue = 1.e+30f ; + siitdconc:cell_methods = "time: mean" ; + siitdconc:time_rep = "averaged" ; + +// global attributes: + :title = "sea ice model output for CICE" ; + :contents = "Diagnostic and Prognostic Variables" ; + :source = "Los Alamos Sea Ice Model (CICE) Version 5" ; + :comment = "This year has 365 days" ; + :comment2 = "File started on model date 23450201" ; + :history = "This dataset was created on 2025-12-04 at 19:07:59.0" ; + :io_flavor = "io_netcdf" ; +} diff --git a/splitnc/test/data/simple.cdl b/splitnc/test/data/simple.cdl new file mode 100644 index 0000000..b19f9a4 --- /dev/null +++ b/splitnc/test/data/simple.cdl @@ -0,0 +1,36 @@ +netcdf iceh-1daily-mean_2345-01 { +dimensions: + time = UNLIMITED ; // (31 currently) + lat = 145 ; + lon = 192 ; + bnds = 2 ; +variables: + float time(time) ; + time:long_name = "model time" ; + time:units = "days since 0001-01-01 00:00:00" ; + time:calendar = "proleptic_gregorian" ; + time:bounds = "time_bounds" ; + float time_bounds(time, bnds) ; + time_bounds:long_name = "boundaries for time-averaging interval" ; + time_bounds:units = "days since 0001-01-01 00:00:00" ; + double lat(lat) ; + lat:axis = "Y" ; + lat:bounds = "lat_bnds" ; + lat:units = "degrees_north" ; + lat:standard_name = "latitude" ; + double lat_bnds(lat, bnds) ; + double lon(lon) ; + lon:axis = "X" ; + lon:bounds = "lon_bnds" ; + lon:units = "degrees_east" ; + lon:standard_name = "longitude" ; + double lon_bnds(lon, bnds) ; + float field(time, lat, lon) ; + field:units = "1" ; + field:long_name = "some field" ; + field:coordinates = "secondary_field" ; + field:_FillValue = 1.e+30f ; + float secondary_field(lat, lon) ; + secondary_field:long_name = "some secondary field" ; + secondary_field:units = "1" ; +} diff --git a/splitnc/test/data/simple_cellmethod_rename.cdl b/splitnc/test/data/simple_cellmethod_rename.cdl new file mode 100644 index 0000000..c802a72 --- /dev/null +++ b/splitnc/test/data/simple_cellmethod_rename.cdl @@ -0,0 +1,37 @@ +netcdf iceh-1daily-mean_2345-01 { +dimensions: + time_0 = UNLIMITED ; // (31 currently) + lat = 145 ; + lon = 192 ; + bnds = 2 ; +variables: + float time_0(time_0) ; + time_0:long_name = "model time" ; + time_0:units = "days since 0001-01-01 00:00:00" ; + time_0:calendar = "proleptic_gregorian" ; + time_0:bounds = "time_0_bounds" ; + float time_0_bounds(time_0, bnds) ; + time_0_bounds:long_name = "boundaries for time-averaging interval" ; + time_0_bounds:units = "days since 0001-01-01 00:00:00" ; + double lat(lat) ; + lat:axis = "Y" ; + lat:bounds = "lat_bnds" ; + lat:units = "degrees_north" ; + lat:standard_name = "latitude" ; + double lat_bnds(lat, bnds) ; + double lon(lon) ; + lon:axis = "X" ; + lon:bounds = "lon_bnds" ; + lon:units = "degrees_east" ; + lon:standard_name = "longitude" ; + double lon_bnds(lon, bnds) ; + float field(time_0, lat, lon) ; + field:units = "1" ; + field:long_name = "some field" ; + field:coordinates = "secondary_field" ; + field:_FillValue = 1.e+30f ; + field:cell_methods = "time_0: mean" ; + float secondary_field(lat, lon) ; + secondary_field:long_name = "some secondary field" ; + secondary_field:units = "1" ; +} diff --git a/splitnc/test/data/simple_circular.cdl b/splitnc/test/data/simple_circular.cdl new file mode 100644 index 0000000..b4a7264 --- /dev/null +++ b/splitnc/test/data/simple_circular.cdl @@ -0,0 +1,37 @@ +netcdf iceh-1daily-mean_2345-01 { +dimensions: + time = UNLIMITED ; // (31 currently) + lat = 145 ; + lon = 192 ; + bnds = 2 ; +variables: + float time(time) ; + time:long_name = "model time" ; + time:units = "days since 0001-01-01 00:00:00" ; + time:calendar = "proleptic_gregorian" ; + time:bounds = "time_bounds" ; + float time_bounds(time, bnds) ; + time_bounds:long_name = "boundaries for time-averaging interval" ; + time_bounds:units = "days since 0001-01-01 00:00:00" ; + double lat(lat) ; + lat:axis = "Y" ; + lat:bounds = "lat_bnds" ; + lat:units = "degrees_north" ; + lat:standard_name = "latitude" ; + double lat_bnds(lat, bnds) ; + double lon(lon) ; + lon:axis = "X" ; + lon:bounds = "lon_bnds" ; + lon:units = "degrees_east" ; + lon:standard_name = "longitude" ; + double lon_bnds(lon, bnds) ; + float field(time, lat, lon) ; + field:units = "1" ; + field:long_name = "some field" ; + field:coordinates = "secondary_field" ; + field:_FillValue = 1.e+30f ; + float secondary_field(lat, lon) ; + secondary_field:long_name = "some secondary field that for some reason depends on field" ; + secondary_field:coordinates = "field" ; + secondary_field:units = "1" ; +} diff --git a/splitnc/test/data/simple_coords_extra_space.cdl b/splitnc/test/data/simple_coords_extra_space.cdl new file mode 100644 index 0000000..fa09925 --- /dev/null +++ b/splitnc/test/data/simple_coords_extra_space.cdl @@ -0,0 +1,39 @@ +netcdf iceh-1daily-mean_2345-01 { +dimensions: + time = UNLIMITED ; // (31 currently) + lat = 145 ; + lon = 192 ; + bnds = 2 ; +variables: + float time(time) ; + time:long_name = "model time" ; + time:units = "days since 0001-01-01 00:00:00" ; + time:calendar = "proleptic_gregorian" ; + time:bounds = "time_bounds" ; + float time_bounds(time, bnds) ; + time_bounds:long_name = "boundaries for time-averaging interval" ; + time_bounds:units = "days since 0001-01-01 00:00:00" ; + double lat(lat) ; + lat:axis = "Y" ; + lat:bounds = "lat_bnds" ; + lat:units = "degrees_north" ; + lat:standard_name = "latitude" ; + double lat_bnds(lat, bnds) ; + double lon(lon) ; + lon:axis = "X" ; + lon:bounds = "lon_bnds" ; + lon:units = "degrees_east" ; + lon:standard_name = "longitude" ; + double lon_bnds(lon, bnds) ; + float field(time, lat, lon) ; + field:units = "1" ; + field:long_name = "some field [note the trailing space in the coords below]" ; + field:coordinates = "secondary_field tertiary_field " ; + field:_FillValue = 1.e+30f ; + float secondary_field(lat, lon) ; + secondary_field:long_name = "some secondary field" ; + secondary_field:units = "1" ; + float tertiary_field(lat, lon) ; + tertiary_field:long_name = "some other secondary field" ; + tertiary_field:units = "1" ; +} diff --git a/splitnc/test/test_splitnc.py b/splitnc/test/test_splitnc.py new file mode 100644 index 0000000..2cc0584 --- /dev/null +++ b/splitnc/test/test_splitnc.py @@ -0,0 +1,250 @@ +import pytest +import re + +import xarray as xr + +from common import runcmd, make_nc +from splitnc import determine_field_vars + + +@pytest.mark.parametrize( + "cdl_file,cmd_options,rename_regex,excluded_vars,field_regex,num_nc_files", + [ + ( + # Test a monthly atmosphere file + "aiihca.pa-234501_mon.cdl", + "--shared-vars latitude_longitude --rename-regex {rename_regex}", + r"(?P.+)_\d+", + None, + "fld_.+", + 217, + ), + ( + # Test a daily atmosphere file + "aiihca.pe-234501_dai.cdl", + "--shared-vars latitude_longitude --rename-regex {rename_regex}", + r"(?P.+)_\d+", + None, + "fld_.+", + 36, + ), + ( + # Test a monthly ice file + "iceh-1monthly-mean_2345-01.cdl", + "--shared-vars uarea,tmask,tarea --excluded-vars VGRDb,VGRDi,VGRDs", + None, + ["VGRDb", "VGRDi", "VGRDs"], + "(ai|dv|si).+", + 53, + ), + ( + # Test a daily ice file (use a regex for exluded-vars here) + "iceh-1daily-mean_2345-01.cdl", + "--shared-vars uarea,tmask,tarea --excluded-vars VGRD.", + None, + ["VGRD."], + "(ai|dv|si).+", + 25, + ), + ( + # Test a monthly atmosphere file with a regex for shared-vars + # Previously when shared-var regex were resolved after field-var, this failed + "aiihca.pa-234501_mon.cdl", + "--shared-vars latitude_lon.+ --rename-regex {rename_regex}", + r"(?P.+)_\d+", + None, + "fld_.+", + 217, + ), + ( + # Test a monthly atmosphere file with a single field with coords that need renaming + # Previously when the renaming would miss the cell_methods & coordinates + "aiihca.pa-234501_mon.cdl", + "--field-vars fld_s03i257 --shared-vars latitude_longitude --rename-regex {rename_regex}", + r"(?P.+)_\d+", + None, + "fld_.+", + 1, + ), + ( + # Test a simple file with time_0 (including a cell_method) + # Previously when the renaming would miss the cell_methods & coordinates + "simple_cellmethod_rename.cdl", + "--shared-vars secondary_field --rename-regex {rename_regex}", + r"(?P.+)_\d+", + None, + "field", + 1, + ), + ( + # Test a daily atmosphere file with a subset of fields + # Previously fld_s03i236 would trigger a TypeError during renaming + # due to da.encoding['coordinates']==None + # Error doesn't trigger with just one field - some detail means + # coords!=None in that case + "aiihca.pe-234501_dai.cdl", + "--field-vars fld_s03i23.* --shared-vars latitude_longitude --rename-regex {rename_regex}", + r"(?P.+)_\d+", + None, + "fld_s03i23.+", + 6, + ), + ( + # Test a simple file with a trailing space in the coords + "simple_coords_extra_space.cdl", + "", + None, + None, + "field", + 1, + ), + ], +) +@pytest.mark.parametrize("use_cmdline_file", [True, False]) +def test_splitnc(tmp_path, cdl_file, cmd_options, rename_regex, excluded_vars, + field_regex, num_nc_files, use_cmdline_file): + """ + Test running splitnc from the command line + """ + # Create a file to test on + ncfile = make_nc(tmp_path, f"test/data/{cdl_file}") + + output_dir = tmp_path / "single_field" + + # Are we using a cmdlinefile? + if use_cmdline_file: + cmd_options = cmd_options.format(rename_regex=rename_regex) + \ + f" --output-dir {output_dir} {ncfile}" + + cmdline_file_path = tmp_path / "cmdline_file" + with open(cmdline_file_path, 'w') as f: + f.write(cmd_options) + + cmd = f"python splitnc.py --command-line-file {cmdline_file_path}" + else: + # Need to mess about with quotes around the regex + rename_regex = f"'{rename_regex}'" + cmd_options = cmd_options.format(rename_regex=rename_regex) + \ + f" --output-dir {output_dir} {ncfile}" + + cmd = f"python splitnc.py {cmd_options}" + + # Attempt to split the file + runcmd(cmd) + + # Check the output files + output_files = list(output_dir.glob("*.nc")) + for output_file in output_files: + ds = xr.open_dataset( + output_file, decode_times=xr.coders.CFDatetimeCoder(use_cftime=True) + ) + + # Only one variable in each single-field file should match the field_regex + count = 0 + for v in ds.variables: + if re.match(field_regex, v): + count += 1 + + assert count == 1 + + # Check none of the variables/coordinates/dims/bounds/cell_methods in + # the file match the rename regex + # Also check none of the vars match excluded_vars + for v in ds.variables: + if excluded_vars: + # check excluded_vars don't match v + for exc_v in excluded_vars: + assert not re.match(exc_v, v), \ + f"{v} - variable should have been excluded" + + if rename_regex: + # variable name + assert not re.match(rename_regex, v), \ + f"{v} - variable hasn't been renamed" + + # dimensions + assert all([not re.match(rename_regex, d) for d in ds[v].dims]), \ + f"{v} - dimension hasn't been renamed, {ds[v].dims}" + + # coords from .coords (typically dims + other coords) + assert all([not re.match(rename_regex, c) for c in ds[v].coords]), \ + f"{v} - coords hasn't been renamed, {list(ds[v].coords)}" + + # coords from attr (typically just other coords) + try: + coords = ds[v].encoding['coordinates'].split() + assert all([not re.match(rename_regex, c) for c in coords]), \ + f"{v} - coordinate attr hasn't been renamed, {coords}" + except KeyError: + # There will be a KeyError if there are no 'coordinates' + pass + + # bounds + try: + bnds = ds[v].attrs['bounds'] + assert not re.match(rename_regex, bnds), \ + "{v} - bounds attr hasn't been renamed, {bnds}" + except KeyError: + # There will be a KeyError if there are no 'bounds' + pass + + # cell_methods + try: + cell_methods = ds[v].attrs['cell_methods'] + assert not re.match(rename_regex, cell_methods), \ + f"{v} - cell_methods hasn't been renamed, {cell_methods}" + except KeyError: + # There will be a KeyError if there are no 'cell_methods' + pass + + assert len(output_files) == num_nc_files + + +@pytest.mark.parametrize( + "cdl_file,field_regex", + [ + ( + # Test a simple cdl + "simple.cdl", + "field", + ), + ( + # Test a simple cdl that has co-dependent fields - i.e. none will be detected + "simple_circular.cdl", + "none", + ), + ( + # Test a monthly atmosphere file - will also pick up latitude_longitude + "aiihca.pa-234501_mon.cdl", + "fld_.+|latitude_longitude", + ), + ( + # Test a daily atmosphere file - will also pick up latitude_longitude + "aiihca.pe-234501_dai.cdl", + "fld_.+|latitude_longitude", + ), + ( + # Test a monthly ice file - will also pick up some extra fields + "iceh-1monthly-mean_2345-01.cdl", + "(ai|dv|si|tarea|tmask|uarea|VGRD).*", + ), + ( + # Test a daily ice file - will also pick up some extra fields + "iceh-1daily-mean_2345-01.cdl", + "(ai|dv|si|tarea|tmask|uarea|VGRD).*", + ), + ], +) +def test_determine_field_vars(tmp_path, cdl_file, field_regex): + """ + Test the functionality for the automatic determinations of field vars + """ + # Create a file to test on + ncfile = make_nc(tmp_path, f"test/data/{cdl_file}") + + decoder = xr.coders.CFDatetimeCoder(use_cftime=True) + with xr.open_dataset(ncfile, decode_times=decoder) as ds: + field_list = determine_field_vars(ds) + + # Check all the discovered fields match the regex + assert all([re.match(field_regex, v) for v in field_list])