Skip to content

Commit

Permalink
on-the-fly cmoriser for ACCESS native data (#2430)
Browse files Browse the repository at this point in the history
Co-authored-by: Yousong Zeng <Yousong>
Co-authored-by: Romain Beucher <[email protected]>
Co-authored-by: Manuel Schlund <[email protected]>
  • Loading branch information
3 people authored Jul 9, 2024
1 parent 495176a commit 6b4e3fb
Show file tree
Hide file tree
Showing 11 changed files with 715 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .zenodo.json
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,11 @@
{
"affiliation": "DLR, Germany",
"name": "Cammarano, Diego"
},
{
"affiliation": "ACCESS-NRI, Australia",
"name": "Yousong, Zeng",
"orcid": "0000-0002-8385-5367"
}
],
"description": "ESMValCore: A community tool for pre-processing data from Earth system models in CMIP and running analysis scripts.",
Expand Down
5 changes: 5 additions & 0 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,11 @@ authors:
family-names: Cammarano
given-names: Diego

affiliation: "ACCESS-NRI, Australia"
family-names: Yousong
given-names: Zeng
orcid: "https://orcid.org/0000-0002-8385-5367"

cff-version: 1.2.0
date-released: 2024-07-03
doi: "10.5281/zenodo.3387139"
Expand Down
58 changes: 58 additions & 0 deletions doc/quickstart/find_data.rst
Original file line number Diff line number Diff line change
Expand Up @@ -564,6 +564,64 @@ explained in :ref:`extra_facets`, and which content is :download:`available here
</../esmvalcore/config/extra_facets/ipslcm-mappings.yml>`. These multi-variable
files must also undergo some data selection.

.. _read_access-esm:

ACCESS-ESM
^^^^^^^^^^

ESMValTool can read native `ACCESS-ESM <https://research.csiro.au/access/about/esm1-5/>`__
model output.

.. warning::

This is the first version of ACCESS-ESM CMORizer for ESMValCore. Currently,
Supported variables: ``pr``, ``ps``, ``psl``, ``rlds``, ``tas``, ``ta``, ``va``,
``ua``, ``zg``, ``hus``, ``clt``, ``rsus``, ``rlus``.

The default naming conventions for input directories and files for ACCESS output are

* input directories: ``{institute}/{sub_dataset}/{exp}/{modeling_realm}/netCDF``
* input files: ``{sub_dataset}.{special_attr}-*.nc``

.. hint::

We only provide one default `input_dir` since this is how ACCESS-ESM native data was
stored on NCI. Users can modify this path in the :ref:`config-developer` to match their local file structure.


Thus, example dataset entries could look like this:

.. code-block:: yaml
dataset:
- {project: ACCESS, mip: Amon, dataset:ACCESS_ESM1_5, sub_dataset: HI-CN-05,
exp: history, modeling_realm: atm, special_attr: pa, start_year: 1986, end_year: 1986}
Similar to any other fix, the ACCESS-ESM fix allows the use of :ref:`extra
facets<extra_facets>`.
By default, the file :download:`access-mappings.yml
</../esmvalcore/config/extra_facets/access-mappings.yml>` is used for that
purpose.
For some variables, extra facets are necessary; otherwise ESMValCore cannot
read them properly.
Supported keys for extra facets are:

==================== ====================================== =================================
Key Description Default value if not specified
==================== ====================================== =================================
``raw_name`` Variable name of the variable in the CMOR variable name of the
raw input file corresponding variable
``modeling_realm`` Realm attribute include `atm`, `ice` No default (needs to be
and `oce` specified in extra facets or
recipe if default DRS is used)
```special_attr`` A special attribute in the filename No default
`ACCESS-ESM` raw data, it's related to
frquency of raw data
``sub_dataset`` Part of the ACCESS-ESM raw dataset No default
root, need to specify if you want to
use the cmoriser
==================== ====================================== =================================

.. _data-retrieval:

Expand Down
Empty file.
29 changes: 29 additions & 0 deletions esmvalcore/cmor/_fixes/access/_base_fix.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""Fix base classes for ACCESS-ESM on-the-fly CMORizer."""

import logging

from iris.cube import CubeList

from esmvalcore.cmor._fixes.native_datasets import NativeDatasetFix

logger = logging.getLogger(__name__)


class AccessFix(NativeDatasetFix):
"""Fixes functions."""

def fix_coord_system(self, cube):
"""Delete coord_system to make CubeList able to merge."""
for dim in cube.dim_coords:
if dim.coord_system is not None:
cube.coord(dim.standard_name).coord_system = None

def get_cubes_from_multivar(self, cubes):
"""Get cube before calculate from multiple variables."""
name_list = self.extra_facets.get('raw_name',
self.vardef.short_name)

data_list = []
for name in name_list:
data_list.append(self.get_cube(cubes, name))
return CubeList(data_list)
127 changes: 127 additions & 0 deletions esmvalcore/cmor/_fixes/access/access_esm1_5.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
"""On-the-fly CMORizer for ACCESS-ESM."""
import logging

from iris.cube import CubeList

from ._base_fix import AccessFix

logger = logging.getLogger(__name__)


class AllVars(AccessFix):
"""Fixes for all variables."""

def fix_metadata(self, cubes):
"""Fix metadata.
Parameters
----------
cubes : iris.cube.CubeList
Input cubes.
Returns
-------
iris.cube.CubeList
"""
if len(cubes) == 1:
cube = cubes[0]
else:
cube = self.get_cube(cubes)

# Fix coordinates
self.fix_scalar_coords(cube)
self.fix_var_metadata(cube)
self.fix_lon_metadata(cube)
self.fix_lat_metadata(cube)

# Fix coordinate 'height'
if 'height_0' in [var.var_name for var in cube.coords()]:
self.fix_height_metadata(cube)
# Fix coordinate 'pressure'
if 'pressure' in [var.var_name for var in cube.coords()]:
self.fix_plev_metadata(cube, coord='pressure')

# Fix coord system
self.fix_coord_system(cube)

return CubeList([cube])


class Rlus(AccessFix):
"""Fixes for Rlus."""

def fix_rlus_data(self, cubes):
"""Fix rlus data."""
return cubes[0] - cubes[1] + cubes[2] - cubes[3]

def fix_metadata(self, cubes):
"""Fix metadata.
Parameters
----------
cubes : iris.cube.CubeList
Input cubes.
Returns
-------
iris.cube.CubeList
"""
cubes = self.get_cubes_from_multivar(cubes)

cube = self.fix_rlus_data(cubes)

return CubeList([cube])


class Rsus(AccessFix):
"""Fixes for Rsus."""

def fix_rsus_data(self, cubes):
"""Fix rsus data."""
return cubes[0] - cubes[1]

def fix_metadata(self, cubes):
"""Fix metadata.
Parameters
----------
cubes : iris.cube.CubeList
Input cubes.
Returns
-------
iris.cube.CubeList
"""
cubes = self.get_cubes_from_multivar(cubes)

cube = self.fix_rsus_data(cubes)

return CubeList([cube])


class Tas(AccessFix):
"""Fixes for Rsus."""

def fix_metadata(self, cubes):
"""Fix metadata.
Parameters
----------
cubes : iris.cube.CubeList
Input cubes.
Returns
-------
iris.cube.CubeList
"""
cube = self.get_cube(cubes)

self.fix_height_metadata(cube)
self.fix_height_value(cube)

return CubeList([cube])

def fix_height_value(self, cube):
"""Fix height value to make it comparable to other dataset."""
if cube.coord('height').points[0] != 2:
cube.coord('height').points = [2]
11 changes: 11 additions & 0 deletions esmvalcore/config-developer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -194,3 +194,14 @@ CESM:
output_file: '{project}_{dataset}_{case}_{gcomp}_{scomp}_{type}_{mip}_{short_name}'
cmor_type: 'CMIP6'
cmor_default_table_prefix: 'CMIP6_'

ACCESS:
cmor_strict: false
input_dir:
default:
- '{dataset}/{sub_dataset}/{exp}/{modeling_realm}/netCDF'
input_file:
default: '{sub_dataset}.{special_attr}-*.nc'
output_file: '{project}_{dataset}_{mip}_{exp}_{institute}_{sub_dataset}_{special_attr}_{short_name}'
cmor_type: 'CMIP6'
cmor_default_table_prefix: 'CMIP6_'
68 changes: 68 additions & 0 deletions esmvalcore/config/extra_facets/access-mappings.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Extra facets for native ACCESS model output

# A complete list of supported keys is given in the documentation (see
# ESMValCore/doc/quickstart/find_data.rst).
---

ACCESS_ESM:

'*':

tas:
raw_name: fld_s03i236
modeling_realm: atm

pr:
raw_name: fld_s05i216
modeling_realm: atm

ps:
raw_name: fld_s00i409
modeling_realm: atm

clt:
raw_name: fld_s02i204
modeling_realm: atm

psl:
raw_name: fld_s16i222
modeling_realm: atm

hus:
raw_name: fld_s30i205
modeling_realm: atm

zg:
raw_name: fld_s30i207
modeling_realm: atm

va:
raw_name: fld_s30i202
modeling_realm: atm

ua:
raw_name: fld_s30i201
modeling_realm: atm

ta:
raw_name: fld_s30i204
modeling_realm: atm

rlus:
raw_name:
- fld_s02i207
- fld_s02i201
- fld_s03i332
- fld_s02i205
modeling_realm: atm

rlds:
raw_name: fld_s02i207
modeling_realm: atm

rsus:
raw_name:
- fld_s01i235
- fld_s01i201
modeling_realm: atm

Empty file.
Loading

0 comments on commit 6b4e3fb

Please sign in to comment.