Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

on-the-fly cmoriser for ACCESS native data #2430

Open
wants to merge 68 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
b774a36
branch for access live cmoriser
Mar 28, 2024
5acf65c
update simple version for live cmoriser
May 14, 2024
e7277a0
fix issue with multi-model-statistics
May 15, 2024
a0a05bc
comments added, ready for pull request
May 21, 2024
a32a48f
add packages in environment.yml
May 21, 2024
efcea11
change file name
May 21, 2024
9c0c9b8
reformat
May 22, 2024
f98406d
change class name to CapWords convention
May 22, 2024
2b5f8d5
Update environment.yml
rhaegar325 May 22, 2024
8043643
Update access_esm.py
rhaegar325 May 22, 2024
a86e1d9
reformat
May 22, 2024
c8bc262
reformat
May 22, 2024
f389559
summary line and description
May 22, 2024
7815a07
reformat
May 22, 2024
6db0088
reformat
May 22, 2024
4018368
reformat
May 22, 2024
0e864b6
reformat
May 22, 2024
200e2d6
update documentation
May 24, 2024
803c544
update documentation
May 24, 2024
fbfefdc
update documentation
May 24, 2024
88047fc
update documentation
May 24, 2024
0cd3498
Update find_data.rst
rbeucher May 24, 2024
7cd6cf8
update config-developer.yml
May 24, 2024
7c91b6c
restore some changes
May 24, 2024
b446f6f
add test for cmoriser
May 31, 2024
9a0104f
reformat test_access_esm.py
May 31, 2024
64054ba
reformat test_access_esm.py
May 31, 2024
b8c6057
reformat test_access_esm.py
May 31, 2024
869c481
reformat esmvalcore/_task.py
May 31, 2024
6885d9a
add access test data
May 31, 2024
8cc0f3b
change datapath
May 31, 2024
c803837
fix _fix
May 31, 2024
d2d1da3
test for access cmoriser
Jun 3, 2024
013d5f0
test for access cmoriser
Jun 3, 2024
b116bfc
test for access cmoriser
Jun 3, 2024
c371ba0
test for access cmoriser
Jun 4, 2024
84fe2ed
Merge branch 'main' into access-live-cmoriser
rbeucher Jun 4, 2024
6d80f5f
test for access cmoriser
Jun 4, 2024
a566cfd
test for access cmoriser
Jun 4, 2024
b666121
test for access cmoriser
Jun 4, 2024
f7fb9d7
test for access cmoriser
Jun 4, 2024
97acf57
add author name
Jun 4, 2024
645a203
Merge branch 'main' into access-live-cmoriser
rhaegar325 Jun 4, 2024
5f587df
clean code
Jun 6, 2024
f10b23c
Merge branch 'main' into access-live-cmoriser
rhaegar325 Jun 7, 2024
fb3ef3f
slitely change the import line
Jun 7, 2024
fdaf89d
use extra_facets
Jun 13, 2024
857b9d1
follow chnage request
Jun 13, 2024
1753b8d
follow chnage request
Jun 13, 2024
b0e1400
follow chnage request
Jun 13, 2024
7a06b34
follow chnage request
Jun 13, 2024
7f2ffeb
follow chnage request
Jun 13, 2024
24ef703
follow chnage request
Jun 13, 2024
c5c7393
change test file
Jun 13, 2024
4569cf5
fix height value
Jun 13, 2024
cadd99e
change docs
Jun 13, 2024
42ec653
change docs
Jun 13, 2024
7422346
add modeling_realm to extra_facet
Jun 14, 2024
41c6530
add modeling_realm to extra_facet
Jun 14, 2024
c92373d
add modeling_realm to extra_facet
Jun 14, 2024
fe5e4d6
fix output_file
Jun 19, 2024
fecb98b
fix output_file
Jun 19, 2024
8f744ff
add more variables to live-cmoriser
Jun 18, 2024
1456249
add more variables to live-cmoriser
Jun 18, 2024
bd3769e
add more available variables for cmoriser
rhaegar325 Jun 20, 2024
e160394
add more available variables for cmoriser
rhaegar325 Jun 20, 2024
573b4f1
add test
rhaegar325 Jun 20, 2024
f7081ba
add test
rhaegar325 Jun 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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-05-08
doi: "10.5281/zenodo.3387139"
Expand Down
69 changes: 69 additions & 0 deletions doc/quickstart/find_data.rst
Original file line number Diff line number Diff line change
Expand Up @@ -564,6 +564,75 @@ 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``.

This is an example of the directory file structure in `config_developer.yml`.

.. code-block:: yaml

ACCESS:
cmor_strict: false
input_dir:
default:
- '{institute}/{sub_dataset}/{exp}/{modeling_realm}/netCDF'
input_file:
default: '{sub_dataset}.{special_attr}-*.nc'
output_file: '{institute}_{sub_dataset}_{special_attr}_{short_name}'
cmor_type: 'CMIP6'
cmor_default_table_prefix: 'CMIP6_'

.. 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 to match their local file structure.


Thus, example dataset entries could look like this:

.. code-block:: yaml

dataset:
rhaegar325 marked this conversation as resolved.
Show resolved Hide resolved
- {project: ACCESS, institute: ACCESS-ESM1-5, mip: Amon, dataset:ACCESS_ESM, sub_dataset: HI-CN-05,
exp: history, modeling_realm: atm, special_attr: pa, start_year: 1986, end_year: 1986}


`dataset` and `sub_dataset` are not redundant, `dataset` is for ESMValCore to search for CMORizer,
which is always `ACCESS_ESM`, `sub_dataset` is dataset under root `ACCESS-ESM1-5`.

`special_attr` is a special attribute in the filename `ACCESS-ESM` raw data, it's related to frquency
of raw data.

`modeling_realm` is a realm attribute, it include `atm`, `ice` and `oce`.

Similar to any other fix, the ACCESS-ESM fix allows the use of :ref:`extra
facets<extra_facets>`.
By default, the file :download:`emac-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` Default realm of this variable
and `oce`
==================== ====================================== =================================

.. _data-retrieval:

Expand Down
Empty file.
84 changes: 84 additions & 0 deletions esmvalcore/cmor/_fixes/access/access_esm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
"""On-the-fly CMORizer for ACCESS-ESM.

Note
----
This is the first version of ACCESS-ESM CMORizer in for ESMValCore
Currently, only two variables (`tas`,`pr`) is fully supported.
"""
import logging

from iris.cube import CubeList

from esmvalcore.cmor._fixes.native_datasets import NativeDatasetFix

logger = logging.getLogger(__name__)


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

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 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]

def get_cube_from_multivar(self, cubes):
"""Get cube before calculate from multiple variables."""
rawname_list = self.extra_facets.get('raw_name',
self.vardef.short_name)
calculate = self.extra_facets.get('calculate', self.vardef.short_name)
var = []
for rawname in rawname_list:
var.append(self.get_cube(cubes, rawname))
return eval(calculate)

Check notice on line 39 in esmvalcore/cmor/_fixes/access/access_esm.py

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

esmvalcore/cmor/_fixes/access/access_esm.py#L39

Use of eval (eval-used)

Check warning on line 39 in esmvalcore/cmor/_fixes/access/access_esm.py

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

esmvalcore/cmor/_fixes/access/access_esm.py#L39

Use of possibly insecure function - consider using safer ast.literal_eval.

def fix_metadata(self, cubes):
"""Fix metadata.

Fix name of coordinate(height), long name and variable name of
variable(tas).

Parameters
----------
cubes : iris.cube.CubeList
Input cubes.

Returns
-------
iris.cube.CubeList
"""
if isinstance(
self.extra_facets.get('raw_name', self.vardef.short_name),
list):
cube = self.get_cube_from_multivar(cubes)
else:
cube = self.get_cube(cubes)

# Fix scalar coordinates
self.fix_scalar_coords(cube)

# Fix metadata of variable
self.fix_var_metadata(cube)

# Fix metadata coordinates
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)
self.fix_height_value(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])
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:
- '{institute}/{sub_dataset}/{exp}/{modeling_realm}/netCDF'
input_file:
default: '{sub_dataset}.{special_attr}-*.nc'
output_file: '{institute}_{sub_dataset}_{special_attr}_{short_name}'
cmor_type: 'CMIP6'
cmor_default_table_prefix: 'CMIP6_'
70 changes: 70 additions & 0 deletions esmvalcore/config/extra_facets/access-mappings.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# 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
calculate: var[0]-var[1]+var[2]-var[3]
Copy link
Member

@bouweandela bouweandela Jun 20, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recommend using a more readable format here, e.g.
fld_s02i207 - fld_s02i201 + fld_s03i332 - fld_s02i205. Instead of using eval (which leaves a lot of room for user mistakes and potential security issues), you could just write a regular expression to parse the string to get out the variables and operators, which you then apply.


rlds:
raw_name: fld_s02i207
modeling_realm: atm

rsus:
raw_name:
- fld_s01i235
- fld_s01i201
modeling_realm: atm
calculate: var[0]-var[1]

Empty file.
Loading