diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/2-1-0.json b/au.org.access-nri/model/output/file-metadata/2-1-0/2-1-0.json new file mode 100644 index 0000000..ed32c50 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/2-1-0.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ACCESS ESM1.6 Model Output Data Specification", + "description": "The metadata associated with a file containing or referencing climate model data", + "type": "object", + "required": [ "global", "variables" ], + "properties": { + "global": { + "$ref": "global.json" + }, + "variables": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "variable.json" + } + } + } + } +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global.json new file mode 100644 index 0000000..83eeda5 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global.json @@ -0,0 +1,79 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global.json", + "title": "ACCESS Global Attributes", + "description": "File-level metadata for ACCESS ESM1.6 data", + "type": "object", + "required": [ + "base_configuration", + "contact", + "Conventions", + "date_created", + "data_specification", + "experiment_repo", + "experiment_uuid", + "frequency", + "license", + "model_version", + "model", + "realm", + "run_id", + "title" + ], + "properties": { + "title": { + "$ref": "global/title.json" + }, + "Conventions": { + "$ref": "global/Conventions.json" + }, + "base_configuration": { + "$ref": "global/base_configuration.json" + }, + "contact": { + "$ref": "global/contact.json" + }, + "data_specification": { + "$ref": "global/data_specification.json" + }, + "date_created": { + "$ref": "global/date_created.json" + }, + "date_metadata_modified": { + "$ref": "global/date_metadata_modified.json" + }, + "date_modified": { + "$ref": "global/date_modified.json" + }, + "experiment_repo": { + "$ref": "global/experiment_repo.json" + }, + "experiment_uuid": { + "$ref": "global/experiment_uuid.json" + }, + "frequency": { + "$ref": "global/frequency.json" + }, + "grid": { + "$ref": "global/grid.json" + }, + "license": { + "$ref": "global/license.json" + }, + "model": { + "$ref": "global/model.json" + }, + "model_version": { + "$ref": "global/model_version.json" + }, + "realm": { + "$ref": "global/realm.json" + }, + "run_id": { + "$ref": "global/run_id.json" + }, + "variable_id": { + "$ref": "global/variable_id.json" + } + } +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/Conventions.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/Conventions.json new file mode 100644 index 0000000..4b29b77 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/Conventions.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/Conventions.json", + "title": "Conventions", + "description": "Convention(s) used with their versions, as a comma separated list", + "examples": [ "CF-1.11,ACDD-1.3" ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/base_configuration.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/base_configuration.json new file mode 100644 index 0000000..2e307ec --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/base_configuration.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/base_configuration.json", + "title": "base_configuration", + "description": "Configuration modified for experiment, see configs repo: https://github.com/ACCESS-NRI/access-esm1.6-configs", + "examples": [ "release-preindustrial+concentrations-2.0" ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/contact.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/contact.json new file mode 100644 index 0000000..bd3f229 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/contact.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/contact.json", + "title": "contact", + "description": "Email address or other contact details for who to contact regarding this data.", + "examples": [ "access.nri@anu.edu.au", "John Smith (john.smith@email.com)" ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/data_specification.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/data_specification.json new file mode 100644 index 0000000..458d921 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/data_specification.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/data_specification.json", + "title": "data_specification", + "description": "Version of this data specification used to generate the data", + "examples": [ "ACCESS Output Data Specification v2-1-0 XX.XXXX/zenodo.XXXXX" ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/date_created.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/date_created.json new file mode 100644 index 0000000..399599b --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/date_created.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/date_created.json", + "title": "date_created", + "description": "Date and time the file was created. Follow ISO 8601, i.e. 'YYYY-MM-DDTHH:MM:SSZ'", + "$comment": "", + "examples": [ "2025-10-07T11:10:00Z" ], + "type": "string", + "pattern": "^\\d{4}-(1[012]|0[1-9])-(3[01]|[12][0-9]|0[1-9])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]Z$" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/date_metadata_modified.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/date_metadata_modified.json new file mode 100644 index 0000000..20b8255 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/date_metadata_modified.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/date_metadata_modified.json", + "title": "date_metadata_modified", + "description": "Date and time the metadata for this file was last modified. Note that this applied just to the metadata, not the data. Follow ISO 8601, i.e. 'YYYY-MM-DDTHH:MM:SSZ'", + "$comment": "", + "examples": [ "2025-10-07T11:10:00Z" ], + "type": "string", + "pattern": "^\\d{4}-(1[012]|0[1-9])-(3[01]|[12][0-9]|0[1-9])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]Z$" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/date_modified.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/date_modified.json new file mode 100644 index 0000000..68afc46 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/date_modified.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/date_modified.json", + "title": "date_modified", + "description": "Date and time the data for this file was last modified. Note that this applied just to the data, not the metadata. Follow ISO 8601, i.e. 'YYYY-MM-DDTHH:MM:SSZ'", + "$comment": "", + "examples": [ "2025-10-07T11:10:00Z" ], + "type": "string", + "pattern": "^\\d{4}-(1[012]|0[1-9])-(3[01]|[12][0-9]|0[1-9])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]Z$" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/experiment_repo.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/experiment_repo.json new file mode 100644 index 0000000..91c2acb --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/experiment_repo.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/experiment_repo.json", + "title": "experiment_repo", + "description": "Git repository URL that describes the experiment", + "examples": [ + "https://github.com/ACCESS-Community-Hub/access-esm1.6-dev-experiments" + ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/experiment_uuid.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/experiment_uuid.json new file mode 100644 index 0000000..0ef48f9 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/experiment_uuid.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/experiment_uuid.json", + "title": "experiment_uuid", + "description": "The experiment UUID generated by Payu. Note: this may be the same as id.", + "examples": [ "698E600B-BECF-4CBA-994F-A663A22FCDDF" ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/frequency.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/frequency.json new file mode 100644 index 0000000..85780d2 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/frequency.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/frequency.json", + "title": "frequency", + "description": "Sampling frequency of the data", + "examples": [ "12hr", "1day", "1yr" ], + "type": "string", + "oneOf": [ + { + "pattern": "^fx$" + }, + { + "pattern": "^subhr$" + }, + { + "pattern": "^\\d+min$" + }, + { + "pattern": "^\\d+hr$" + }, + { + "pattern": "^\\d+day$" + }, + { + "pattern": "^\\d+mon$" + }, + { + "pattern": "^\\d+yr$" + }, + { + "pattern": "^\\d+dec$" + } + ] +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/grid.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/grid.json new file mode 100644 index 0000000..0c6da87 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/grid.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/grid.json", + "title": "grid", + "description": "Brief description of output grid characteristics or reference to grid specification. Should be included if the grid is not defined by the dimensions in the file.", + "examples": [], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/license.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/license.json new file mode 100644 index 0000000..772b0b5 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/license.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/license.json", + "title": "license", + "description": "Information on the license for the data to ensure all users have access to the terms of use. Use SPDX license identifiers where possible. The default license for ACCESS-NRI is CC-BY-4.0, users should change as needed.", + "examples": [ "CC-BY-4.0" ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/model.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/model.json new file mode 100644 index 0000000..5f76674 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/model.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/model.json", + "title": "model", + "description": "Name of the model used to create the data", + "examples": [ "ACCESS-ESM1.6" ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/model_version.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/model_version.json new file mode 100644 index 0000000..e56a33b --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/model_version.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/model_version.json", + "title": "model_version", + "description": "Version of the model used to create the data. Please note here if the model has been modified from an official release, ideally with links to the changes.", + "$comment": "", + "examples": [ + "2025.06.001", + "2025.06.001 (modified by John Smith, [link to repo/paper describing modifications])" + ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/realm.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/realm.json new file mode 100644 index 0000000..989a8d1 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/realm.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/realm.json", + "title": "realm", + "description": "Realm where the data variable is defined", + "examples": [ "atmos", "landIce" ], + "type": "string", + "enum": [ + "aerosol", + "atmos", + "atmosChem", + "land", + "landIce", + "none", + "ocean", + "ocnBgchem", + "seaIce", + "unknown" + ] +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/run_id.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/run_id.json new file mode 100644 index 0000000..156ef63 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/run_id.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/run_id.json", + "title": "run_id", + "description": "Git hash for the commit associated with the experiment run", + "examples": [ "3a38fe4", "3a38fe435e156700ab649c4921e99f7c68a168bc" ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/title.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/title.json new file mode 100644 index 0000000..e53ddaa --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/title.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/title.json", + "title": "title", + "description": "Name of the dataset. Typically following the Payu naming scheme detailed here - https://payu.readthedocs.io/en/stable/usage.html#experiment-names", + "examples": [ "my_expt-perturb-416af8c6" ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/global/variable_id.json b/au.org.access-nri/model/output/file-metadata/2-1-0/global/variable_id.json new file mode 100644 index 0000000..cf3cbaf --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/global/variable_id.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "global/variable_id.json", + "title": "variable_id", + "description": "A list of short variable names, separated by commas, for the data variable/s that appear in this file (e.g. tas for surface temperature but not time/latitude/longitude). These names should match the netCDF variable names.", + "examples": [ "tas", "huss", "uas,vas" ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/variable.json b/au.org.access-nri/model/output/file-metadata/2-1-0/variable.json new file mode 100644 index 0000000..f1de758 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/variable.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "variable.json", + "title": "Output variable", + "description": "A coordinate or data output variable", + "type": "object", + "properties": { + "cell_methods": { + "$ref": "variable/cell_methods.json" + }, + "long_name": { + "$ref": "variable/long_name.json" + }, + "standard_name": { + "$ref": "variable/standard_name.json" + }, + "units": { + "$ref": "variable/units.json" + } + } +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/variable/cell_methods.json b/au.org.access-nri/model/output/file-metadata/2-1-0/variable/cell_methods.json new file mode 100644 index 0000000..c2d8078 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/variable/cell_methods.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "variable/cell_methods.json", + "title": "cell_methods", + "description": "A string comprising a list of space-separated pairs, \"name:method\", which indicate that for axis \"name\" the values representing the fields have been determined by \"method\".", + "examples": [ + "time: point", + "time: mean (interval: 1 hour)", + "time: maximum (interval: 1D) time: mean (interval: 1M)" + ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/variable/long_name.json b/au.org.access-nri/model/output/file-metadata/2-1-0/variable/long_name.json new file mode 100644 index 0000000..b07ce4e --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/variable/long_name.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "variable/long_name.json", + "title": "long_name", + "description": "A long descriptive name which may, for example, be used for labelling plots.", + "examples": [ + "Near-Surface Air Temperature", + "latitude", + "Potential Evapotranspiration" + ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/variable/standard_name.json b/au.org.access-nri/model/output/file-metadata/2-1-0/variable/standard_name.json new file mode 100644 index 0000000..aacee36 --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/variable/standard_name.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "variable/standard_name.json", + "title": "standard_name", + "description": "Where possible use the CF standard_name of the variable, otherwise use a unique short phrase separated by underscores to describe the variable.", + "examples": [ + "air_pressure_at_sea_level", + "latitude", + "water_potential_evaporation_flux" + ], + "type": "string" +} diff --git a/au.org.access-nri/model/output/file-metadata/2-1-0/variable/units.json b/au.org.access-nri/model/output/file-metadata/2-1-0/variable/units.json new file mode 100644 index 0000000..68f64ef --- /dev/null +++ b/au.org.access-nri/model/output/file-metadata/2-1-0/variable/units.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "variable/units.json", + "title": "units", + "description": "The units of measurement for the variable", + "examples": [ "K", "m-2 s-1" ], + "type": "string" +} diff --git a/tests/2-1-0/test.json b/tests/2-1-0/test.json new file mode 100644 index 0000000..7191d75 --- /dev/null +++ b/tests/2-1-0/test.json @@ -0,0 +1,51 @@ +{ + "target": "../../au.org.access-nri/model/output/file-metadata/2-1-0/2-1-0.json", + "tests": [ + { + "description": "Full ESM1.6", + "valid": true, + "data": { + "global": { + "base_configuration": "release-preindustrial+concentrations-2.0", + "contact": "data.access.nri@anu.edu.au", + "Conventions": "CF-1.11", + "date_created": "2025-12-03T11:22:00Z", + "data_specification": "ACCESS Output Data Specification v0.1 XX.XXXX/zenodo.XXXXX", + "experiment_repo": "x", + "experiment_uuid": "F6B536FA-766D-4609-B767-754C9424440A", + "id": "F6B536FA-766D-4609-B767-754C9424440A", + "frequency": "1hr", + "grid": "grid goes here", + "license": "CC-BY-4.0", + "model_version": "2025.06.001", + "model": "ACCESS-ESM1.6", + "naming_authority": "au.org.access-nri", + "realm": "atmos", + "run_id": "00b0e8d102733a0e36093a96b273ed2853ac2006", + "title": "this is a title", + "variable_id": "tas" + }, + "variables": { + "tas": { + "units": "K", + "long_name": "Near-surface Air Temperature", + "standard_name": "air_temperature", + "cell_methods": "time: point (interval: 1H) time: mean (interval: 1M)", + "_FillValue": -2147483647 + }, + "lat": { + "_FillValue": 1.0e+20, + "standard_name": "latitude", + "units": "degrees_north", + "long_name": "latitude" + } + } + } + }, + { + "description": "Empty", + "valid": false, + "data": {} + } + ] +}