diff --git a/.zenodo.json b/.zenodo.json index c6a731981f..dd1d1315ea 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -171,6 +171,11 @@ "name": "Hagemann, Stefan", "orcid": "0000-0001-5444-2945" }, + { + "affiliation": "University of Canterbury, New Zealand", + "name": "Hardacre, Catherine", + "orcid": "0000-0001-9093-4656" + }, { "affiliation": "ISAC-CNR, Italy", "name": "von Hardenberg, Jost", @@ -380,15 +385,20 @@ "affiliation": "DLR, Germany", "name": "Bonnet, Pauline", "orcid": "0000-0003-3780-0784" + }, + { + "affiliation": "ACCESS-NRI, Australia", + "name": "Chun, Felicity", + "orcid": "0009-0007-0845-0953" } ], "description": "ESMValTool: A community diagnostic and performance metrics tool for routine evaluation of Earth system models in CMIP.", "license": { "id": "Apache-2.0" }, - "publication_date": "2023-07-06", + "publication_date": "2023-12-20", "title": "ESMValTool", - "version": "v2.9.0", + "version": "v2.10.0", "communities": [ { "identifier": "is-enes3" diff --git a/CITATION.cff b/CITATION.cff index cd621538b7..b903a4287c 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -391,6 +391,11 @@ authors: family-names: Bonnet given-names: Pauline orcid: "https://orcid.org/0000-0003-3780-0784" + - + affiliation: "ACCESS-NRI, Australia" + family-names: Chun + given-names: Felicity + orcid: "https://orcid.org/0009-0007-0845-0953" cff-version: 1.2.0 date-released: 2023-12-20 diff --git a/doc/sphinx/source/recipes/figures/seaice_extents_sh/map_difference.png b/doc/sphinx/source/recipes/figures/seaice_extents_sh/map_difference.png new file mode 100644 index 0000000000..fbd840196f Binary files /dev/null and b/doc/sphinx/source/recipes/figures/seaice_extents_sh/map_difference.png differ diff --git a/doc/sphinx/source/recipes/figures/seaice_extents_sh/min_trend.png b/doc/sphinx/source/recipes/figures/seaice_extents_sh/min_trend.png new file mode 100644 index 0000000000..1f4fb60ae5 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/seaice_extents_sh/min_trend.png differ diff --git a/doc/sphinx/source/recipes/index.rst b/doc/sphinx/source/recipes/index.rst index 0f0ce7667d..e8b0f5072b 100644 --- a/doc/sphinx/source/recipes/index.rst +++ b/doc/sphinx/source/recipes/index.rst @@ -146,6 +146,7 @@ Other recipe_rainfarm recipe_seaice recipe_seaice_drift + recipe_seaice_extents_sh recipe_seaice_feedback recipe_shapeselect recipes_testing diff --git a/doc/sphinx/source/recipes/recipe_seaice_extents_sh.rst b/doc/sphinx/source/recipes/recipe_seaice_extents_sh.rst new file mode 100644 index 0000000000..e4ade3e849 --- /dev/null +++ b/doc/sphinx/source/recipes/recipe_seaice_extents_sh.rst @@ -0,0 +1,72 @@ +.. _recipes_seaice_extents_sh: + +Sea Ice area and extents +======================== + +Overview +-------- + +This recipe plots sea ice concentration from CICE (sea ice model) output +around the southern polar region and compares it to the NSIDC CDR +(National Snow and Ice Data Centre, Climate Data Record) dataset. + + +Available recipes and diagnostics +--------------------------------- + +Recipes are stored in esmvaltool/recipes/ + + * recipe_seaice_extents_sh.yml + +Diagnostics are stored in esmvaltool/diag_scripts/seaice_area_extents/ + + * seaicearea_trends.py: plot minima and maxima sea ice area trends + * seaice_mapextents.py: plot sea ice extent and differences to Observations + + +User settings in recipe +----------------------- + +#. Script seaice_mapextents.py + + *Required settings for script* + + * `months`: months by month number which the mean are to be plotted + + +Variables +--------- + +* siconc (seaIce, monthly, longitude latitude time) +* areacello (fx) + + +Observations and reformat scripts +--------------------------------- + +*Note: (1) obs4MIPs data can be used directly without any preprocessing; +(2) see headers of reformat scripts for non-obs4MIPs data for download +instructions.* + +* NSIDC CDR sh (siconc - esmvaltool/cmorizers/data/formatters/datasets/nsidc_g02202_sh.py) + + +References +---------- + +* COSIMA(Consortium for Ocean-Sea Ice Modelling in Australia) recipe: https://cosima-recipes.readthedocs.io/en/latest/DocumentedExamples/SeaIce_Obs_Model_Compare.html + +Example plots +------------- + +.. _trends: +.. figure:: /recipes/figures/seaice_extents_sh/min_trend.png + :align: center + + Minima trends of sea ice area with observation data. ACCESS OM model data years from 0, added 1652 years to model years for comparability. + +.. _map extents: +.. figure:: /recipes/figures/seaice_extents_sh/map_difference.png + :align: center + + Difference and extents of models with observations for selected months. \ No newline at end of file diff --git a/esmvaltool/diag_scripts/seaice_area_extents/seaice_mapextents.py b/esmvaltool/diag_scripts/seaice_area_extents/seaice_mapextents.py index 8a8c5e5e4d..1a5a78a2c9 100755 --- a/esmvaltool/diag_scripts/seaice_area_extents/seaice_mapextents.py +++ b/esmvaltool/diag_scripts/seaice_area_extents/seaice_mapextents.py @@ -16,7 +16,11 @@ import numpy as np import pandas as pd -from esmvaltool.diag_scripts.shared import run_diagnostic, save_figure +from esmvaltool.diag_scripts.shared import ( + run_diagnostic, + save_figure, + save_data +) from esmvaltool.diag_scripts.shared._base import get_plot_filename @@ -47,7 +51,7 @@ def model_regrid_diff(mod_si, obs_si, cdr, mon, latmax): return diff_ds, mod_regrid -def map_diff(mod_si_ls, obs_si, months): +def map_diff(mod_si_ls, obs_si, months, cfg, prov): """Create figure mapping extents for models and months.""" # get lat max for regridding latmax = obs_si.lat.max().values.item() @@ -66,7 +70,12 @@ def map_diff(mod_si_ls, obs_si, months): diff_ds, mod_regrid = model_regrid_diff(mod_si, obs_si, cdr, mon, latmax) - + # save plot data + save_data(mod_label + calendar.month_abbr[mon] + '_mean', + prov, cfg, mod_regrid.to_iris()) + save_data(mod_label + calendar.month_abbr[mon] + '_obs_diff', + prov, cfg, diff_ds.to_iris()) + axes = plt.subplot(len(months), 3, i + j * 3, projection=proj) diffmap = axes.contourf( @@ -124,10 +133,13 @@ def main(cfg): mod_si_dict[data_name] = xr.open_dataset(filepath) logger.info("creating map differences") - mapfig = map_diff(mod_si_dict, obs_si, cfg['months']) + provenance_record = get_provenance_record(inputs_df['filename'].to_list()) + + mapfig = map_diff(mod_si_dict, obs_si, cfg['months'], + cfg, provenance_record) # Save output output_path = get_plot_filename('map_difference', cfg) - provenance_record = get_provenance_record(inputs_df['filename'].to_list()) + save_figure(output_path, provenance_record, cfg, figure=mapfig) @@ -137,6 +149,7 @@ def get_provenance_record(ancestor_files): 'ancestors': ancestor_files, 'authors': [ 'chun_felicity', + 'steketee_anton' ], 'caption': '', 'domains': ['shpolar'], diff --git a/esmvaltool/diag_scripts/seaice_area_extents/seaicearea_trends.py b/esmvaltool/diag_scripts/seaice_area_extents/seaicearea_trends.py index d9726b032c..6405d393d7 100755 --- a/esmvaltool/diag_scripts/seaice_area_extents/seaicearea_trends.py +++ b/esmvaltool/diag_scripts/seaice_area_extents/seaicearea_trends.py @@ -12,7 +12,9 @@ import pandas as pd import xarray as xr -from esmvaltool.diag_scripts.shared import run_diagnostic, save_figure +from esmvaltool.diag_scripts.shared import ( + run_diagnostic, save_figure, save_data +) from esmvaltool.diag_scripts.shared._base import get_plot_filename @@ -62,7 +64,7 @@ def min_and_max_year(yeardata): return annual_min_max_ds -def plot_trend(model_min_max, obs_a, minmax): +def plot_trend(model_min_max, obs_a, minmax, prov, cfg): """ function to plot min or max trend @@ -78,6 +80,9 @@ def plot_trend(model_min_max, obs_a, minmax): # add note for years change for mod_label, model_min_max_dt in model_min_max.items(): model_min_max_dt[minmax].plot(label=mod_label) + # save data + save_data(mod_label + minmax, prov, cfg, + model_min_max_dt[minmax].to_iris()) if minmax == 'max': obs_a.cdr_area.groupby('time.year').max().plot(label='Obs CDR') @@ -138,7 +143,8 @@ def main(cfg): provenance = get_provenance_record(inputfiles_df['filename'].to_list()) for trend_type in ['min', 'max']: - fig = plot_trend(min_max, sea_ice_area_obs(obs_si), trend_type) + fig = plot_trend(min_max, sea_ice_area_obs(obs_si), trend_type, + provenance, cfg) # Save output save_figure(get_plot_filename(f'{trend_type}_trend', cfg), provenance, cfg, figure=fig) @@ -150,11 +156,12 @@ def get_provenance_record(ancestor_files): 'ancestors': ancestor_files, 'authors': [ 'chun_felicity', + 'steketee_anton' ], 'caption': 'added 1652 years to model years for comparability', 'domains': ['shpolar'], 'plot_types': ['times'], - 'references': [], + 'references': ['access_nri'], 'statistics': ['mean'], } return record