diff --git a/.zenodo.json b/.zenodo.json index eefa7abca2..4eadf98a61 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -66,11 +66,6 @@ "affiliation": "University of Bremen, Germany", "name": "Adeniyi, Kemisola" }, - { - "affiliation": "University of Bremen, Germany", - "name": "Castellani, Giulia", - "orcid": "0000-0001-6151-015X" - }, { "affiliation": "ISAC-CNR, Italy", "name": "Arnone, Enrico", @@ -175,6 +170,10 @@ "affiliation": "University of Bremen, Germany", "name": "Gier, Bettina" }, + { + "affiliation": "University of Bremen, Germany", + "name": "Castellani, Giulia" + }, { "affiliation": "Met Office, UK", "name": "Gillett, Ed" @@ -193,10 +192,6 @@ "name": "Hagemann, Stefan", "orcid": "0000-0001-5444-2945" }, - { - "affiliation": "Met Office, UK", - "name": "Hall, Sophie" - }, { "affiliation": "University of Canterbury, New Zealand", "name": "Hardacre, Catherine", @@ -345,9 +340,9 @@ "orcid": "0000-0003-4637-5337" }, { - "affiliation": "Met Office, UK", - "name": "Storkey, Dave", - "orcid": "0000-0001-8000-5335" + "affiliation": "ECCC, Canada", + "name": "Stevens, Robin", + "orcid": "0000-0002-8737-6988" }, { "affiliation": "URead, UK", @@ -367,14 +362,14 @@ "name": "Weigel, Katja", "orcid": "0000-0001-6133-7801" }, - { - "affiliation": "DLR, Germany", - "name": "Sarauer, Ellen" - }, { "affiliation": "University of Bremen, Germany", "name": "Schulze, Kirsten" }, + { + "affiliation": "DLR, Germany", + "name": "Sarauer, Ellen" + }, { "affiliation": "University of Reading, UK", "name": "Roberts, Charles", @@ -462,9 +457,9 @@ "license": { "id": "Apache-2.0" }, - "publication_date": "2025-03-05", + "publication_date": "2025-10-20", "title": "ESMValTool", - "version": "v2.12.0", + "version": "v2.13.0", "communities": [ { "identifier": "enes-ri" diff --git a/CITATION.cff b/CITATION.cff index 4d0a8b2ec4..8add21a248 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -344,6 +344,11 @@ authors: family-names: Stacke given-names: Tobias orcid: "https://orcid.org/0000-0003-4637-5337" + - + affiliation: "ECCC, Canada" + family-names: Stevens + given-names: Robin + orcid: "https://orcid.org/0000-0002-8737-6988" - affiliation: "URead, UK" family-names: Swaminathan diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index 23b791149c..6f14d46c30 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -400,6 +400,8 @@ A list of the datasets for which a CMORizers is available is provided in the fol +----------------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | JRA-25 | cl, clt, clwvi, hus, prw, rlut, rlutcs, rsut, rsutcs, ta, tas, tcw, wap (Amon) | 2 | Python | +----------------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +| JRA-3Q | tasmax, tasmin (day) | 2 | Python | ++----------------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | JRA-55 | cli, clivi, clw, clwvi, clt, prw, rlus, rlut, rlutcs, rsus, rsuscs, rsut, rsutcs, ta, tas, wap (Amon)| 2 | Python | +----------------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | Kadow2020 | tasa (Amon) | 2 | Python | diff --git a/esmvaltool/cmorizers/data/cmor_config/JRA-3Q.yml b/esmvaltool/cmorizers/data/cmor_config/JRA-3Q.yml new file mode 100644 index 0000000000..ff10c8fa1e --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/JRA-3Q.yml @@ -0,0 +1,27 @@ +--- +# Common global attributes for Cmorizer output +attributes: + dataset_id: JRA3Q + version: 'v1' + tier: 2 + modeling_realm: reanaly + project_id: CMOR6 + source: 'https://rda.ucar.edu/datasets/ds628.1/' + reference: 'jra_3q' + comment: | + '' + +# Variables to cmorize +variables: + + tasmax: + raw_short_name: tmpmax2m-hgt-fc-gauss + mip: day + freq: 1hr + file: jra3q.minmax_surf.0_0_0.tmpmax2m-hgt-fc-gauss.????????00_????????23.nc + + tasmin: + raw_short_name: tmpmin2m-hgt-fc-gauss + mip: day + freq: 1hr + file: jra3q.minmax_surf.0_0_0.tmpmin2m-hgt-fc-gauss.????????00_????????23.nc diff --git a/esmvaltool/cmorizers/data/datasets.yml b/esmvaltool/cmorizers/data/datasets.yml index 488a3ac452..14a9e713f1 100644 --- a/esmvaltool/cmorizers/data/datasets.yml +++ b/esmvaltool/cmorizers/data/datasets.yml @@ -966,6 +966,16 @@ datasets: anl_chipsi/fcst_phy2m.yyyymm.nc anl_p/anl_p.yyyymm.nc + JRA-3Q: + tier: 2 + source: https://gdex.ucar.edu/datasets/d640000/ + last_access: 2025-10-14 + info: | + For convenience, the direct download links have the following form, where DD refers to the last day of the month: + https://osdf-data.gdex.ucar.edu/ncar/gdex/d640000/minmax_surf/[YYYYMM]/jra3q.minmax_surf.0_0_0.tmpmax2m-hgt-fc-gauss.[YYYYMM]0100_[YYYYMMDD]23.nc + https://osdf-data.gdex.ucar.edu/ncar/gdex/d640000/minmax_surf/[YYYYMM]/jra3q.minmax_surf.0_0_0.tmpmin2m-hgt-fc-gauss.[YYYYMM]0100_[YYYYMMDD]23.nc + + JRA-55: tier: 2 source: https://rda.ucar.edu/datasets/ds628.1/ diff --git a/esmvaltool/cmorizers/data/formatters/datasets/jra_3q.py b/esmvaltool/cmorizers/data/formatters/datasets/jra_3q.py new file mode 100644 index 0000000000..9fe54f569c --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/jra_3q.py @@ -0,0 +1,76 @@ +""" +ESMValTool CMORizer for JRA-3Q data. + +Tier + Tier 2: other freely-available dataset. + +Source + Research Data Archive (RDA): + https://rda.ucar.edu/datasets/d640000/ + + +Last access + 20251014 + + + +""" + +import copy +import logging +import os + +import iris +from esmvalcore.preprocessor import daily_statistics +from iris import NameConstraint + +from esmvaltool.cmorizers.data import utilities as utils + +logger = logging.getLogger(__name__) + + +def _extract_variable(short_name, var, filename, cfg, in_dir, out_dir): + cmor_info = cfg["cmor_table"].get_variable(var["mip"], short_name) + attrs = copy.deepcopy(cfg["attributes"]) + attrs["mip"] = var["mip"] + ver = attrs["version"] + freq = var["freq"] + raw_var = var.get("raw_short_name", short_name) + + # load data + filepath = os.path.join(in_dir, ver, freq, raw_var, filename) + cubes = iris.load(filepath, NameConstraint(var_name=raw_var)) + + for cube in cubes: + # JRA3Q has hourly max/min temperature data, but we want daily max/min + if short_name == "tasmax": + cube = daily_statistics(cube, "max") + elif short_name == "tasmin": + cube = daily_statistics(cube, "min") + + # Fix metadata + + utils.fix_var_metadata(cube, cmor_info) + utils.set_global_atts(cube, attrs) + + utils.fix_dim_coordnames(cube) + utils.fix_coords(cube) + if "height2m" in cmor_info.dimensions: + utils.add_height2m(cube) + utils.set_global_atts(cube, attrs) + + # Save variable + utils.save_variable( + cube, short_name, out_dir, attrs, unlimited_dimensions=["time"] + ) + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Cmorization func call.""" + # Run the cmorization + for short_name, var in cfg["variables"].items(): + filename = var["file"] + logger.info( + "CMORizing variable '%s' from file '%s'", short_name, filename + ) + _extract_variable(short_name, var, filename, cfg, in_dir, out_dir) diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index f3d30a33c4..10d0e7ef75 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -744,6 +744,16 @@ diagnostics: type: reanaly, version: 1, start_year: 1979, end_year: 2007} scripts: null + JRA-3Q: + description: JRA-3Q check + variables: + tasmax: + tasmin: + additional_datasets: + - {dataset: JRA-3Q, project: OBS6, mip: day, tier: 2, + type: reanaly, version: 1, start_year: 1948, end_year: 2024} + scripts: null + JRA-55: description: JRA-55 check variables: diff --git a/esmvaltool/references/jra_3q.bibtex b/esmvaltool/references/jra_3q.bibtex new file mode 100644 index 0000000000..1a4367ada8 --- /dev/null +++ b/esmvaltool/references/jra_3q.bibtex @@ -0,0 +1,10 @@ +@article{Yuki KOSAKA20242024-004, + title={The JRA-3Q Reanalysis}, + author={Yuki KOSAKA and Shinya KOBAYASHI and Yayoi HARADA and Chiaki KOBAYASHI and Hiroaki NAOE and Koichi YOSHIMOTO and Masashi HARADA and Naochika GOTO and Jotaro CHIBA and Kengo MIYAOKA and Ryohei SEKIGUCHI and Makoto DEUSHI and Hirotaka KAMAHORI and Tosiyuki NAKAEGAWA and Taichu Y. TANAKA and Takayuki TOKUHIRO and Yoshiaki SATO and Yasuhiro MATSUSHITA and Kazutoshi ONOGI}, + journal={Journal of the Meteorological Society of Japan. Ser. II}, + volume={102}, + number={1}, + pages={49-109}, + year={2024}, + doi={10.2151/jmsj.2024-004} +}