From 5ba10a53075a04066850ced1bfb89b8fe9844056 Mon Sep 17 00:00:00 2001 From: FranziskaWinterstein <119339136+FranziskaWinterstein@users.noreply.github.com> Date: Wed, 29 Nov 2023 17:25:03 +0100 Subject: [PATCH 01/39] Fix parsing in diag validation (#3364) Co-authored-by: Axel Lauer Co-authored-by: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: valeriupredoi Co-authored-by: Valeriu Predoi Co-authored-by: Manuel Schlund --- esmvaltool/diag_scripts/validation.py | 68 ++++++++++++++------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/esmvaltool/diag_scripts/validation.py b/esmvaltool/diag_scripts/validation.py index d72cc5e1ad..52c8d1a561 100644 --- a/esmvaltool/diag_scripts/validation.py +++ b/esmvaltool/diag_scripts/validation.py @@ -29,27 +29,11 @@ def _get_provenance_record(cfg, plot_file, caption, loc): """Create a provenance record describing the diagnostic data and plot.""" - all_input_files = [ - k for k in cfg["input_data"].keys() if k.endswith(".nc") - ] - if "_vs_" in plot_file: - model_1 = plot_file.split("_vs_")[0].split("_")[-1] - if plot_file.endswith(".png"): - model_2 = plot_file.split("_vs_")[1].strip(".png") - elif plot_file.endswith(".nc"): - model_2 = plot_file.split("_vs_")[1].strip(".nc") - ancestor_1 = [ - k for k in all_input_files if model_1 in os.path.basename(k) - ][0] - ancestor_2 = [ - k for k in all_input_files if model_2 in os.path.basename(k) - ][0] - ancestor_files = [ancestor_1, ancestor_2] - else: - model = os.path.basename(plot_file).split("_")[0] - ancestor_files = [ - k for k in all_input_files if model in os.path.basename(k) - ] + ancestor_files = [] + for dataset in cfg['input_data'].values(): + if (dataset['alias'] in plot_file and + dataset['short_name'] in plot_file): + ancestor_files.append(dataset['filename']) record = { 'caption': caption, 'statistics': ['mean'], @@ -72,9 +56,9 @@ def _get_provenance_record(cfg, plot_file, caption, loc): def plot_contour(cube, cfg, plt_title, file_name): """Plot a contour with iris.quickplot (qplot).""" if len(cube.shape) == 2: - qplt.contourf(cube, cmap='RdYlBu_r', bbox_inches='tight') + qplt.contourf(cube, cmap='RdYlBu_r') else: - qplt.contourf(cube[0], cmap='RdYlBu_r', bbox_inches='tight') + qplt.contourf(cube[0], cmap='RdYlBu_r') plt.title(plt_title) plt.gca().coastlines() plt.tight_layout() @@ -138,7 +122,10 @@ def plot_latlon_cubes(cube_1, # plot each cube var = data_names.split('_')[0] if not obs_name: - cube_names = [data_names.split('_')[1], data_names.split('_')[3]] + cube_names = [ + data_names.replace(f'{var}_', '').split('_vs_')[i] for i in + range(2) + ] for cube, cube_name in zip(cubes, cube_names): if not season: plot_file_path = os.path.join( @@ -179,23 +166,40 @@ def plot_zonal_cubes(cube_1, cube_2, cfg, plot_data): # xcoordinate: latotude or longitude (str) data_names, xcoordinate, period = plot_data var = data_names.split('_')[0] - cube_names = [data_names.split('_')[1], data_names.split('_')[3]] + cube_names = data_names.replace(var + '_', '').split('_vs_') lat_points = cube_1.coord(xcoordinate).points plt.plot(lat_points, cube_1.data, label=cube_names[0]) plt.plot(lat_points, cube_2.data, label=cube_names[1]) + plt.title(f'Annual Climatology of {var}' if period == 'alltime' + else f'{period} of {var}') if xcoordinate == 'latitude': - plt.title(period + ' Zonal Mean for ' + var + ' ' + data_names) + axis = plt.gca() + axis.set_xticks([-60, -30, 0, 30, 60], + labels=['60\N{DEGREE SIGN} S', + '30\N{DEGREE SIGN} S', + '0\N{DEGREE SIGN}', + '30\N{DEGREE SIGN} N', + '60\N{DEGREE SIGN} N']) elif xcoordinate == 'longitude': - plt.title(period + ' Meridional Mean for ' + var + ' ' + data_names) + axis = plt.gca() + axis.set_xticks([0, 60, 120, 180, 240, 300, 360], + labels=['0\N{DEGREE SIGN} E', + '60\N{DEGREE SIGN} E', + '120\N{DEGREE SIGN} E', + '180\N{DEGREE SIGN} E', + '240\N{DEGREE SIGN} E', + '300\N{DEGREE SIGN} E', + '0\N{DEGREE SIGN} E']) plt.xlabel(xcoordinate + ' (deg)') - plt.ylabel(var) + plt.ylabel(f'{var} [{str(cube_1.units)}]') plt.tight_layout() plt.grid() plt.legend() + png_name = f'{xcoordinate}_{period}_{data_names}.png' if xcoordinate == 'latitude': - png_name = 'Zonal_Mean_' + xcoordinate + '_' + data_names + '.png' + png_name = 'Zonal_Mean_' + png_name elif xcoordinate == 'longitude': - png_name = 'Merid_Mean_' + xcoordinate + '_' + data_names + '.png' + png_name = 'Merid_Mean_' + png_name plot_file_path = os.path.join(cfg['plot_dir'], period, png_name) plt.savefig(plot_file_path) save_plotted_cubes( @@ -252,13 +256,13 @@ def coordinate_collapse(data_set, cfg): if 'mask_threshold' in cfg: thr = cfg['mask_threshold'] data_set.data = np.ma.masked_array(data_set.data, - mask=(mask_cube.data > thr)) + mask=mask_cube.data > thr) else: logger.warning('Could not find masking threshold') logger.warning('Please specify it if needed') logger.warning('Masking on 0-values = True (masked value)') data_set.data = np.ma.masked_array(data_set.data, - mask=(mask_cube.data == 0)) + mask=mask_cube.data == 0) # if zonal mean on LON if analysis_type == 'zonal_mean': From a64882083ecb07ab26adacf526b4b83593e37647 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Wed, 29 Nov 2023 11:38:54 -0500 Subject: [PATCH 02/39] [docs, minor] Update README.md (#3358) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 71403fbf90..694dab6a82 100644 --- a/README.md +++ b/README.md @@ -53,11 +53,11 @@ ESMValTool can run with the following types of [data as input](https://docs.esmv # Getting started -Please see [getting started](https://docs.esmvaltool.org/en/latest/quickstart/index.html) on readthedocs as well as [ESMValTool tutorial](https://tutorial.esmvaltool.org/index.html). The tutorial is a set of lessons that together teach skills needed to work with ESMValTool in climate-related domains. +Please see [getting started](https://docs.esmvaltool.org/en/latest/quickstart/index.html) on our instance of Read the Docs as well as [ESMValTool tutorial](https://tutorial.esmvaltool.org/index.html). The tutorial is a set of lessons that together teach skills needed to work with ESMValTool in climate-related domains. ## Getting help -The easiest way to get help if you cannot find the answer in the documentation on [readthedocs](https://docs.esmvaltool.org), is to open an [issue on GitHub](https://github.com/ESMValGroup/ESMValTool/issues). +The easiest way to get help, if you cannot find the answer in the documentation in our [docs](https://docs.esmvaltool.org), is to open an [issue on GitHub](https://github.com/ESMValGroup/ESMValTool/issues). ## Contributing From d8b9d24e399b047f3041de9ac26f818860095ca6 Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Thu, 30 Nov 2023 13:20:07 +0100 Subject: [PATCH 03/39] Correctly handle `~` when reading `plot_folder` option of monitoring diagnostic (#3449) --- esmvaltool/diag_scripts/monitor/monitor_base.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/esmvaltool/diag_scripts/monitor/monitor_base.py b/esmvaltool/diag_scripts/monitor/monitor_base.py index 135027f374..21dc159619 100644 --- a/esmvaltool/diag_scripts/monitor/monitor_base.py +++ b/esmvaltool/diag_scripts/monitor/monitor_base.py @@ -97,7 +97,9 @@ def __init__(self, config): ) plot_folder = plot_folder.replace('{plot_dir}', self.cfg[names.PLOT_DIR]) - self.plot_folder = os.path.abspath(plot_folder) + self.plot_folder = os.path.abspath( + os.path.expandvars(os.path.expanduser(plot_folder)) + ) self.plot_filename = config.get( 'plot_filename', '{plot_type}_{real_name}_{dataset}_{mip}_{exp}_{ensemble}') @@ -293,11 +295,7 @@ def get_plot_folder(self, var_info): 'real_name': self._real_name(var_info['variable_group']), **var_info } - folder = os.path.expandvars( - os.path.expanduser( - list(_replace_tags(self.plot_folder, info))[0] - ) - ) + folder = list(_replace_tags(self.plot_folder, info))[0] if self.plot_folder.startswith('/'): folder = '/' + folder if not os.path.isdir(folder): From 82e7f39c2bf52a2b42e7def1717ee19e3c286613 Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Thu, 30 Nov 2023 13:24:32 +0100 Subject: [PATCH 04/39] Add general model evaluation recipes (for Changelog: authors: @axel-lauer, @hb326, @Paulinebonnet111, @LisaBock, @schlunma) (#3421) Co-authored-by: Axel Lauer Co-authored-by: Pauline Bonnet Co-authored-by: Birgit Hassler <33543691+hb326@users.noreply.github.com> Co-authored-by: Birgit Hassler Co-authored-by: Paulinebonnet111 <123577048+Paulinebonnet111@users.noreply.github.com> --- .../api/esmvaltool.diag_scripts.monitor.rst | 1 + doc/sphinx/source/faq.rst | 12 +- .../annual_cycle_clt_southerocean_Amon.jpg | Bin 0 -> 76545 bytes .../map_swcre_MPI-ESM1-2-HR_Amon.jpg | Bin 0 -> 148718 bytes .../map_tas_MPI-ESM1-2-HR_Amon.jpg | Bin 0 -> 133214 bytes ...timeseries_rtnt_ambiguous_dataset_Amon.jpg | Bin 0 -> 93664 bytes .../variable_vs_lat_pr_Amon.jpg | Bin 0 -> 81310 bytes doc/sphinx/source/recipes/index.rst | 1 + .../recipes/recipe_model_evaluation.rst | 98 +++++++ doc/sphinx/source/recipes/recipe_monitor.rst | 19 +- .../recipe_model_evaluation_basics.yml | 260 ++++++++++++++++++ .../recipe_model_evaluation_clouds_clim.yml | 226 +++++++++++++++ .../recipe_model_evaluation_clouds_cycles.yml | 178 ++++++++++++ .../recipe_model_evaluation_precip_zonal.yml | 72 +++++ .../monitor/recipe_monitor_with_refs.yml | 2 +- esmvaltool/recipes/recipe_psyplot.yml | 6 +- esmvaltool/recipes/recipe_seaborn.yml | 6 +- 17 files changed, 861 insertions(+), 20 deletions(-) create mode 100644 doc/sphinx/source/recipes/figures/model_evaluation/annual_cycle_clt_southerocean_Amon.jpg create mode 100644 doc/sphinx/source/recipes/figures/model_evaluation/map_swcre_MPI-ESM1-2-HR_Amon.jpg create mode 100644 doc/sphinx/source/recipes/figures/model_evaluation/map_tas_MPI-ESM1-2-HR_Amon.jpg create mode 100644 doc/sphinx/source/recipes/figures/model_evaluation/timeseries_rtnt_ambiguous_dataset_Amon.jpg create mode 100644 doc/sphinx/source/recipes/figures/model_evaluation/variable_vs_lat_pr_Amon.jpg create mode 100644 doc/sphinx/source/recipes/recipe_model_evaluation.rst create mode 100644 esmvaltool/recipes/model_evaluation/recipe_model_evaluation_basics.yml create mode 100644 esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_clim.yml create mode 100644 esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_cycles.yml create mode 100644 esmvaltool/recipes/model_evaluation/recipe_model_evaluation_precip_zonal.yml diff --git a/doc/sphinx/source/api/esmvaltool.diag_scripts.monitor.rst b/doc/sphinx/source/api/esmvaltool.diag_scripts.monitor.rst index bb43997c43..3b1e3e6548 100644 --- a/doc/sphinx/source/api/esmvaltool.diag_scripts.monitor.rst +++ b/doc/sphinx/source/api/esmvaltool.diag_scripts.monitor.rst @@ -11,6 +11,7 @@ Examples -------- * :ref:`recipe_monitor` +* :ref:`recipe_model_evaluation` Diagnostic scripts diff --git a/doc/sphinx/source/faq.rst b/doc/sphinx/source/faq.rst index 15d69192ca..10c72bd2cb 100644 --- a/doc/sphinx/source/faq.rst +++ b/doc/sphinx/source/faq.rst @@ -113,9 +113,15 @@ a symbolic link to it so it gets picked up at every re-run iteration: Can ESMValTool plot arbitrary model output? =========================================== -Recipe :ref:`recipe_monitor` allows for the plotting of any preprocessed model. -The plotting parameters are set through a yaml configuration file, and the -type of plots to be generated are determined in the recipe. +:ref:`recipe_model_evaluation` provides a set of recipes that can be used for a +basic climate model evaluation with observational data. +This is especially useful to get an overview of the general performance of a +simulation. + +Furthermore, recipe :ref:`recipe_monitor` allows for the plotting of any +preprocessed model. +The plotting parameters are set through a yaml configuration file, and the type +of plots to be generated are determined in the recipe. Moreover, recipe :ref:`recipes_psyplot_diag` and the corresponding diagnostic :ref:`psyplot_diag.py ` provide a diff --git a/doc/sphinx/source/recipes/figures/model_evaluation/annual_cycle_clt_southerocean_Amon.jpg b/doc/sphinx/source/recipes/figures/model_evaluation/annual_cycle_clt_southerocean_Amon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e1e8a45310d196629b51fd8a78a952c1db878a9 GIT binary patch literal 76545 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 dSX#HG8pQ8F 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

h78&prq03!qLL~7_5#AI;B?%=+s4;~RO$x>J1 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

C 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

$u?Zh`nmi=_YIr&PYTKCDhCVz`ArDo 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 RJ6rv4?XCZ(uOa@K{SUUmA2R>| literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/recipes/figures/model_evaluation/variable_vs_lat_pr_Amon.jpg b/doc/sphinx/source/recipes/figures/model_evaluation/variable_vs_lat_pr_Amon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e252d79049adee4e1ce17dc93110afba85adc57 GIT binary patch literal 81310 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�WLPy%Y(<+5>_=zq*`!&C)Lyn{ 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/recipes/index.rst b/doc/sphinx/source/recipes/index.rst index c8e6b4a320..edcc48977a 100644 --- a/doc/sphinx/source/recipes/index.rst +++ b/doc/sphinx/source/recipes/index.rst @@ -21,6 +21,7 @@ large variety of input data. .. toctree:: :maxdepth: 1 + recipe_model_evaluation recipe_monitor recipe_psyplot recipe_seaborn diff --git a/doc/sphinx/source/recipes/recipe_model_evaluation.rst b/doc/sphinx/source/recipes/recipe_model_evaluation.rst new file mode 100644 index 0000000000..9e199815e0 --- /dev/null +++ b/doc/sphinx/source/recipes/recipe_model_evaluation.rst @@ -0,0 +1,98 @@ +.. _recipe_model_evaluation: + +General model evaluation +======================== + +Overview +-------- + +These recipes and diagnostics provide a basic climate model evaluation with +observational data. +This is especially useful to get an overview of the performance of a +simulation. +The diagnostics used here allow plotting arbitrary preprocessor output, i.e., +arbitrary variables from arbitrary datasets. + + +Available recipes and diagnostics +--------------------------------- + +Recipes are stored in `recipes/model_evaluation` + +* recipe_model_evaluation_basics.yml +* recipe_model_evaluation_clouds_clim.yml +* recipe_model_evaluation_clouds_cycles.yml +* recipe_model_evaluation_precip_zonal.yml + +Diagnostics are stored in `diag_scripts/monitor/` + +* :ref:`multi_datasets.py + `: + Monitoring diagnostic to show multiple datasets in one plot (incl. biases). + + +User settings +------------- + +It is recommended to use a vector graphic file type (e.g., SVG) for the output +format when running this recipe, i.e., run the recipe with the command line +option ``--output_file_type=svg`` or use ``output_file_type: svg`` in your +:ref:`esmvalcore:user configuration file`. +Note that map and profile plots are rasterized by default. +Use ``rasterize: false`` in the recipe to disable +this. + + +Recipe settings +~~~~~~~~~~~~~~~ + +A list of all possible configuration options that can be specified in the +recipe is given for each diagnostic individually (see links given for the +available diagnostics in the previous section). + + +Variables +--------- + +Any, but the variables' number of dimensions should match the ones expected by +each diagnostic (see links given for the available diagnostics in the previous +section). + + +Example plots +------------- + +.. _fig_1: +.. figure:: /recipes/figures/model_evaluation/map_tas_MPI-ESM1-2-HR_Amon.jpg + :align: center + :width: 14cm + +Global climatology of 2m near-surface air temperature. + +.. _fig_2: +.. figure:: /recipes/figures/model_evaluation/map_swcre_MPI-ESM1-2-HR_Amon.jpg + :align: center + :width: 14cm + +Global climatology of the shortwave cloud radiative effect (SWCRE). + +.. _fig_3: +.. figure:: /recipes/figures/model_evaluation/timeseries_rtnt_ambiguous_dataset_Amon.jpg + :align: center + :width: 14cm + +Time series of the global mean top-of-the-atmosphere net radiative flux. + +.. _fig_4: +.. figure:: /recipes/figures/model_evaluation/variable_vs_lat_pr_Amon.jpg + :align: center + :width: 14cm + +Zonal mean precipitation. + +.. _fig_5: +.. figure:: /recipes/figures/model_evaluation/annual_cycle_clt_southerocean_Amon.jpg + :align: center + :width: 14cm + +Annual cycle of Southern Ocean total cloud cover. diff --git a/doc/sphinx/source/recipes/recipe_monitor.rst b/doc/sphinx/source/recipes/recipe_monitor.rst index 9bdfd5d40b..ee3b9b44fa 100644 --- a/doc/sphinx/source/recipes/recipe_monitor.rst +++ b/doc/sphinx/source/recipes/recipe_monitor.rst @@ -18,19 +18,18 @@ Available recipes and diagnostics Recipes are stored in `recipes/monitor` - * recipe_monitor.yml - * recipe_monitor_with_refs.yml +* recipe_monitor.yml +* recipe_monitor_with_refs.yml Diagnostics are stored in `diag_scripts/monitor/` - * :ref:`monitor.py `: - Monitoring diagnostic to plot arbitrary preprocessor output. - * :ref:`compute_eofs.py `: - Monitoring diagnostic to plot EOF maps and associated PC timeseries. - * :ref:`multi_datasets.py - `: - Monitoring diagnostic to show multiple datasets in one plot (incl. - biases). +* :ref:`monitor.py `: + Monitoring diagnostic to plot arbitrary preprocessor output. +* :ref:`compute_eofs.py `: + Monitoring diagnostic to plot EOF maps and associated PC timeseries. +* :ref:`multi_datasets.py + `: + Monitoring diagnostic to show multiple datasets in one plot (incl. biases). User settings diff --git a/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_basics.yml b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_basics.yml new file mode 100644 index 0000000000..06f8ad3b12 --- /dev/null +++ b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_basics.yml @@ -0,0 +1,260 @@ +# ESMValTool +--- +documentation: + title: Basic Model Evaluation. + description: > + Show plots of several variables that can be used for basic model + evaluations ("sanity checks"). + authors: + - hassler_birgit + - lauer_axel + - bonnet_pauline + - schlund_manuel + maintainer: + - hassler_birgit + + +# Note: The following models are just examples +datasets: + - {project: CMIP6, dataset: MPI-ESM1-2-HR, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, dataset: MPI-ESM1-2-LR, exp: historical, ensemble: r1i1p1f1, grid: gn} + +# Note: for some observational datasets, we use preset time ranges due to +# their limited temporal availability +timerange_for_models: &time_period + timerange: '2003/2007' # can be specified, this is just an example + + +preprocessors: + + timeseries_regular: &pp_timeseries_regular + area_statistics: + operator: mean + + timeseries_regular_ann: + <<: *pp_timeseries_regular + annual_statistics: + operator: mean + + timeseries_regular_pr: + <<: *pp_timeseries_regular + convert_units: + units: mm day-1 + + full_climatology: &pp_full_climatology + climate_statistics: + period: full + regrid: + target_grid: 2x2 + scheme: + reference: esmf_regrid.schemes:ESMFAreaWeighted + + full_climatology_pr: + <<: *pp_full_climatology + convert_units: + units: mm day-1 + + zonal_mean: + custom_order: true # makes preprocessor much faster since input for extract_levels is smaller + climate_statistics: + period: full + extract_levels: + levels: {cmor_table: CMIP6, coordinate: plev19} + scheme: linear + coordinate: air_pressure + regrid: + scheme: + reference: esmf_regrid.schemes:ESMFAreaWeighted + target_grid: 2x2 + zonal_statistics: + operator: mean + + +diagnostics: + + # Climatologies - maps (full climatology) + + plot_maps_with_references_tas: + description: Plot climatology maps including reference datasets for tas. + variables: + tas: + <<: *time_period + mip: Amon + preprocessor: full_climatology + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: &plot_multi_dataset_default + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_{dataset}_{mip}' + script: monitor/multi_datasets.py + plots: + map: + common_cbar: true + + plot_maps_with_references_pr: + description: Plot climatology maps including reference datasets for pr. + variables: + pr: + <<: *time_period + mip: Amon + preprocessor: full_climatology_pr + additional_datasets: + - {project: OBS, dataset: GPCP-SG, type: atmos, version: 2.3, tier: 2, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + script: monitor/multi_datasets.py + plots: + map: + common_cbar: true + plot_kwargs: + default: + cmap: Blues + + # Climatologies (zonal means) + + plot_zonal_mean_profiles_with_references_ta: + description: Plot 2D zonal mean profiles including reference datasets. + variables: + ta: + <<: *time_period + mip: Amon + preprocessor: zonal_mean + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + script: monitor/multi_datasets.py + plots: + zonal_mean_profile: + common_cbar: true + + plot_zonal_mean_profiles_with_references_ua: + description: Plot 2D zonal mean profiles including reference datasets. + variables: + ua: + <<: *time_period + mip: Amon + preprocessor: zonal_mean + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + script: monitor/multi_datasets.py + plots: + zonal_mean_profile: + common_cbar: true + plot_kwargs: + default: + cmap: Blues + + plot_zonal_mean_profiles_with_references_hus: + description: Plot 2D zonal mean profiles including reference datasets. + variables: + hus: + <<: *time_period + mip: Amon + preprocessor: zonal_mean + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + script: monitor/multi_datasets.py + plots: + zonal_mean_profile: + common_cbar: true + plot_kwargs: + default: + cmap: Blues + + # Time series of global averages (monthly) + + plot_multiple_timeseries: + description: Plot time series including reference datasets. + variables: + tas: + <<: *time_period + mip: Amon + preprocessor: timeseries_regular + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + clt: + <<: *time_period + mip: Amon + preprocessor: timeseries_regular + additional_datasets: + - {project: OBS, dataset: ESACCI-CLOUD, type: sat, version: AVHRR-AMPM-fv3.0, tier: 2, reference_for_monitor_diags: true} + rsut: + <<: *time_period + mip: Amon + preprocessor: timeseries_regular + additional_datasets: + - {project: OBS, dataset: CERES-EBAF, type: sat, version: Ed4.1, tier: 2, reference_for_monitor_diags: true} + rlut: + <<: *time_period + mip: Amon + preprocessor: timeseries_regular + additional_datasets: + - {project: OBS, dataset: CERES-EBAF, type: sat, version: Ed4.1, tier: 2, reference_for_monitor_diags: true} + rtnt: + derive: true + force_derivation: true + mip: Amon + preprocessor: timeseries_regular_ann + timerange: '1995/2014' + prw: + <<: *time_period + mip: Amon + preprocessor: timeseries_regular + # timerange MUST NOT start before 2003 since the observations are not available before 2003 + additional_datasets: + - {project: OBS, dataset: ESACCI-WATERVAPOUR, type: sat, version: CDR2-L3S-05deg_fv3.1, tier: 3, timerange: '2003/2007', reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + group_variables_by: variable_group + script: monitor/multi_datasets.py + plots: + timeseries: + annual_mean_kwargs: false + plot_kwargs: + MPI-ESM1-2-HR: + color: C0 + MPI-ESM1-2-LR: + color: C1 + ERA5: + color: black + ESACCI-CLOUD: + color: black + CERES-EBAF: + color: black + ESACCI-WATERVAPOUR: + color: black + + plot_multiple_timeseries_pr: + description: Plot time series including reference datasets. + variables: + pr: + <<: *time_period + mip: Amon + preprocessor: timeseries_regular_pr + additional_datasets: + - {project: OBS, dataset: GPCP-SG, type: atmos, version: 2.3, tier: 2, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + script: monitor/multi_datasets.py + plots: + timeseries: + annual_mean_kwargs: false + plot_kwargs: + MPI-ESM1-2-HR: + color: C0 + MPI-ESM1-2-LR: + color: C1 + GPCP-SG: + color: black diff --git a/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_clim.yml b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_clim.yml new file mode 100644 index 0000000000..fd2d08781f --- /dev/null +++ b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_clim.yml @@ -0,0 +1,226 @@ +# ESMValTool +--- +documentation: + title: Model evaluation with focus on clouds. + description: > + Plot climatologies several cloud-related variables of multi-year + simulations. + authors: + - bonnet_pauline + - lauer_axel + - hassler_birgit + - schlund_manuel + maintainer: + - lauer_axel + + +# Note: the following models are just examples +datasets: + - {project: CMIP6, dataset: MPI-ESM1-2-HR, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, dataset: MPI-ESM1-2-LR, exp: historical, ensemble: r1i1p1f1, grid: gn} + +# Note: for some observational datasets, we use preset time ranges due to +# their limited temporal availability +timerange_for_models: &time_period + timerange: '2005/2014' # can be specified, this is just an example + + +preprocessors: + + full_climatology: &full_climatology_diag + climate_statistics: + period: full + regrid: + target_grid: 2x2 + scheme: + reference: esmf_regrid.schemes:ESMFAreaWeighted + + full_climatology_pr: + <<: *full_climatology_diag + convert_units: + units: mm day-1 + + zonal_mean: + custom_order: true # makes preprocessor much faster since input for extract_levels is smaller + climate_statistics: + period: full + extract_levels: + levels: {cmor_table: CMIP6, coordinate: plev19} + scheme: linear + coordinate: air_pressure + regrid: + scheme: + reference: esmf_regrid.schemes:ESMFAreaWeighted + target_grid: 2x2 + zonal_statistics: + operator: mean + + +diagnostics: + + plot_clt_maps: + description: Plot clt climatology maps including reference datasets. + variables: + clt: + <<: *time_period + mip: Amon + preprocessor: full_climatology + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, version: AVHRR-AMPM-fv3.0, tier: 2, reference_for_monitor_diags: true} + scripts: + plot: &plot_multi_dataset_default + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_{dataset}_{mip}' + plots: + map: + common_cbar: true + + plot_lwcre_maps: + description: Plot lwcre climatology maps including reference datasets. + variables: + lwcre: + <<: *time_period + mip: Amon + preprocessor: full_climatology + derive: true + additional_datasets: + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, timerange: '2001/2010', tier: 1, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + map: + common_cbar: true + + plot_swcre_maps: + description: Plot swcre climatology maps including reference datasets. + variables: + swcre: + <<: *time_period + mip: Amon + preprocessor: full_climatology + derive: true + additional_datasets: + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, tier: 1, timerange: '2001/2010', reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + map: + common_cbar: true + + plot_lwp_maps: + description: Plot lwp climatology maps including reference datasets. + variables: + lwp: + <<: *time_period + mip: Amon + preprocessor: full_climatology + derive: true + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + map: + common_cbar: true + fontsize: 6 + + plot_clivi_maps: + description: Plot clivi climatology maps including reference datasets. + variables: + clivi: + <<: *time_period + mip: Amon + preprocessor: full_climatology + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + map: + common_cbar: true + + plot_prw_maps: + description: Plot prw climatology maps including reference datasets. + variables: + prw: + <<: *time_period + mip: Amon + preprocessor: full_climatology + additional_datasets: + - {dataset: ESACCI-WATERVAPOUR, project: OBS, type: sat, version: CDR2-L3S-05deg_fv3.1, tier: 3, timerange: '2003/2017', reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + map: + common_cbar: true + + plot_pr_maps: + description: Plot prw climatology maps including reference datasets. + variables: + pr: + <<: *time_period + mip: Amon + preprocessor: full_climatology_pr + additional_datasets: + - {dataset: GPCP-SG, project: OBS, type: atmos, version: 2.3, tier: 2, + timerange: '2003/2017', reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + map: + common_cbar: true + + plot_clw_profiles: + description: Plot clw vertical profiles including reference datasets. + variables: + clw: + <<: *time_period + mip: Amon + preprocessor: zonal_mean + additional_datasets: + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, version: P1-R05-gridbox-average-noprecip, timerange: '2006/2017', tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + profile: + common_cbar: true + + plot_cli_profiles: + description: Plot cli vertical profiles including reference datasets. + variables: + cli: + <<: *time_period + mip: Amon + preprocessor: zonal_mean + additional_datasets: + - {dataset: CALIPSO-ICECLOUD, project: OBS, type: sat, version: 1-00, timerange: '2007/2015', tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + profile: + common_cbar: true + + plot_cl_profiles: + description: Plot cl vertical profiles including reference datasets. + variables: + cl: + <<: *time_period + mip: Amon + preprocessor: zonal_mean + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + profile: + common_cbar: true diff --git a/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_cycles.yml b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_cycles.yml new file mode 100644 index 0000000000..ed52fd7d3c --- /dev/null +++ b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_cycles.yml @@ -0,0 +1,178 @@ +# ESMValTool +--- +documentation: + title: Model evaluation with focus on clouds. + description: > + Plot annual cycles of several cloud-related variables of multi-year simulations. + authors: + - lauer_axel + - schlund_manuel + maintainer: + - lauer_axel + + +# Note: the following models are just examples +datasets: + - {project: CMIP6, dataset: MPI-ESM1-2-HR, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, dataset: MPI-ESM1-2-LR, exp: historical, ensemble: r1i1p1f1, grid: gn} + +# Note: for some observational datasets, we use preset time ranges due to +# their limited temporal availability +timerange_for_models: &time_period + timerange: '2000/2014' # can be specified, this is just an example + + +preprocessors: + + pp_global: &global_settings + area_statistics: + operator: mean + climate_statistics: + period: month + + pp_SEPacific: + <<: *global_settings + extract_region: + start_longitude: 265 + end_longitude: 275 + start_latitude: -25 + end_latitude: -5 + mask_landsea: + mask_out: land + + pp_SouthernOcean: + <<: *global_settings + extract_region: + start_longitude: 0 + end_longitude: 360 + start_latitude: -65 + end_latitude: -30 + mask_landsea: + mask_out: land + + pp_StormTracks: + <<: *global_settings + extract_region: + start_longitude: 0 + end_longitude: 360 + start_latitude: 45 + end_latitude: 60 + + +diagnostics: + + anncyc: + description: Plot annual cycles including reference datasets. + variables: + clt_global: &clt_settings + <<: *time_period + preprocessor: pp_global + short_name: clt + mip: Amon + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, version: AVHRR-AMPM-fv3.0, tier: 2} + clt_tropics: + <<: *clt_settings + clt_sepacific: + <<: *clt_settings + preprocessor: pp_SEPacific + clt_southerocean: + <<: *clt_settings + preprocessor: pp_SouthernOcean + clt_stormtracks: + <<: *clt_settings + preprocessor: pp_StormTracks + clivi_global: &clivi_settings + <<: *time_period + preprocessor: pp_global + short_name: clivi + mip: Amon + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, version: AVHRR-AMPM-fv3.0, tier: 2} + clivi_tropics: + <<: *clivi_settings + clivi_sepacific: + <<: *clivi_settings + preprocessor: pp_SEPacific + clivi_southerocean: + <<: *clivi_settings + preprocessor: pp_SouthernOcean + clivi_stormtracks: + <<: *clivi_settings + preprocessor: pp_StormTracks + lwp_global: &lwp_settings + <<: *time_period + preprocessor: pp_global + short_name: lwp + derive: true + mip: Amon + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, version: AVHRR-AMPM-fv3.0, tier: 2} + lwp_tropics: + <<: *lwp_settings + lwp_sepacific: + <<: *lwp_settings + preprocessor: pp_SEPacific + lwp_southerocean: + <<: *lwp_settings + preprocessor: pp_SouthernOcean + lwp_stormtracks: + <<: *lwp_settings + preprocessor: pp_StormTracks + swcre_global: &swcre_settings + <<: *time_period + preprocessor: pp_global + short_name: swcre + derive: true + mip: Amon + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, tier: 2} + swcre_tropics: + <<: *swcre_settings + swcre_sepacific: + <<: *swcre_settings + preprocessor: pp_SEPacific + swcre_southerocean: + <<: *swcre_settings + preprocessor: pp_SouthernOcean + swcre_stormtracks: + <<: *swcre_settings + preprocessor: pp_StormTracks + lwcre_global: &lwcre_settings + <<: *time_period + preprocessor: pp_global + short_name: lwcre + derive: true + mip: Amon + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, tier: 2} + lwcre_tropics: + <<: *lwcre_settings + lwcre_sepacific: + <<: *lwcre_settings + preprocessor: pp_SEPacific + lwcre_southerocean: + <<: *lwcre_settings + preprocessor: pp_SouthernOcean + lwcre_stormtracks: + <<: *lwcre_settings + preprocessor: pp_StormTracks + scripts: + allplots: + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_{mip}' + group_variables_by: variable_group + plots: + annual_cycle: + legend_kwargs: + loc: upper right + plot_kwargs: + MPI-ESM1-2-HR: + color: C0 + MPI-ESM1-2-LR: + color: C1 + ESACCI-CLOUD: + color: black + pyplot_kwargs: + title: '{short_name}' diff --git a/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_precip_zonal.yml b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_precip_zonal.yml new file mode 100644 index 0000000000..6bd1231046 --- /dev/null +++ b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_precip_zonal.yml @@ -0,0 +1,72 @@ +# ESMValTool +--- +documentation: + title: Model evaluation with focus on precipitation. + description: > + Plot zonal mean plots of precipitation. + authors: + - lauer_axel + - schlund_manuel + maintainer: + - lauer_axel + + +# Note: the following models are just examples +datasets: + - {project: CMIP6, dataset: MPI-ESM1-2-HR, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, dataset: MPI-ESM1-2-LR, exp: historical, ensemble: r1i1p1f1, grid: gn} + +# Note: for some observational datasets, we use preset time ranges due to +# their limited temporal availability +timerange_for_models: &time_period + timerange: '2000/2014' # can be specified, this is just an example + + +preprocessors: + + pp_zonal: + regrid: + target_grid: 2x2 + scheme: + reference: esmf_regrid.schemes:ESMFAreaWeighted + zonal_statistics: + operator: mean + climate_statistics: + operator: mean + period: full + convert_units: + units: mm day-1 + + +diagnostics: + + zonal: + description: Plot annual cycles including reference datasets. + variables: + pr: + <<: *time_period + preprocessor: pp_zonal + mip: Amon + additional_datasets: + - {dataset: ERA5, project: native6, type: reanaly, version: 'v1', tier: 3} + - {dataset: GPCP-SG, project: obs4MIPs, level: L3, version: v2.3, tier: 1} + scripts: + allplots: + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_{mip}' + group_variables_by: variable_group + plots: + variable_vs_lat: + legend_kwargs: + loc: upper right + plot_kwargs: + MPI-ESM1-2-HR: + color: C0 + MPI-ESM1-2-LR: + color: C1 + ERA5: + color: black + linestyle: dotted + GPCP-SG: + color: black diff --git a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml index e75cc763da..681277310c 100644 --- a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml +++ b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml @@ -1,7 +1,7 @@ # ESMValTool --- documentation: - title: Model Monitoring + title: Example recipe for model monitoring with reference datasets. description: | Show plots that include multiple datasets that can be used to monitor (ongoing) model simulations. diff --git a/esmvaltool/recipes/recipe_psyplot.yml b/esmvaltool/recipes/recipe_psyplot.yml index 4a07f4c558..c34ee203f0 100644 --- a/esmvaltool/recipes/recipe_psyplot.yml +++ b/esmvaltool/recipes/recipe_psyplot.yml @@ -2,13 +2,13 @@ # recipe_psyplot.yml --- documentation: - title: > - Create arbitrary Psyplot plots. + title: Example recipe for the Psyplot diagnostic. description: > This recipes showcases the use of the Psyplot diagnostic that provides a high-level interface to Psyplot for ESMValTool recipes. For each input - dataset, an individual plot is created. + dataset, an individual plot is created. With the Psyplot diagnostic, + arbitrary Psyplot plots can be created. authors: - schlund_manuel diff --git a/esmvaltool/recipes/recipe_seaborn.yml b/esmvaltool/recipes/recipe_seaborn.yml index faf0f07085..983efae0be 100644 --- a/esmvaltool/recipes/recipe_seaborn.yml +++ b/esmvaltool/recipes/recipe_seaborn.yml @@ -2,14 +2,14 @@ # recipe_seaborn.yml --- documentation: - title: > - Create arbitrary Seaborn plots. + title: Example recipe for the Seaborn diagnostic. description: > This recipe showcases the use of the Seaborn diagnostic that provides a high-level interface to Seaborn for ESMValTool recipes. For this, the input data is arranged into a single `pandas.DataFrame`, which is then used as - input for the Seaborn function defined by the option `seaborn_func`. + input for the Seaborn function defined by the option `seaborn_func`. With + the Seaborn diagnostic, arbitrary Seaborn plots can be created. authors: - schlund_manuel From baa2001f5cd1805d4a7168d418980b5c2fe0e504 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 1 Dec 2023 14:10:52 +0000 Subject: [PATCH 05/39] [Condalock] Update Linux condalock file (#3451) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 96 ++++++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 49 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 42d1ec03fc..b4ed02d1d9 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -10,7 +10,7 @@ https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_2.conda https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2#19410c3df09dfb12d1206132a1d357c5 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda#6185f640c43843e5ad6fd1c5372c3f80 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-2.6.32-he073ed8_16.conda#7ca122655873935e02c91279c5b03c8c https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.2.0-ha9c7c90_103.conda#db8cd1a871a07404d94f7dcc78c21a61 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.cond https://conda.anaconda.org/conda-forge/linux-64/aom-3.5.0-h27087fc_0.tar.bz2#a08150fd2298460cd1fcccf626305642 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.8.23-hd590300_0.conda#cc4f06f7eedb1523f3b83fd0fb3942ff https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.22.1-hd590300_0.conda#8430bd266c7b2cfbda403f7585d5ee86 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.23.0-hd590300_0.conda#d459949bc10f64dee1595c176c2e6291 https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/freexl-1.0.6-h166bdaf_1.tar.bz2#897e772a157faf3330d72dd291486f62 @@ -124,7 +124,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_0.con https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.23.3-hd1fb520_1.conda#78c10e8637a6f8d377f9989327d0267d https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h0d5128d_13.conda#e1d6139ff0500977a760567a4bec1ce9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda#b58e6816d137f3aabf77d341dd5d732b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda#3b6a9f225c3dbe0d24f4fedd4625c5bf https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c @@ -149,7 +149,7 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#00 https://conda.anaconda.org/conda-forge/linux-64/boost-cpp-1.78.0-h6582d0a_3.conda#d3c3c7698d0b878aab1b86db95407c8e https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/bwidget-1.9.14-ha770c72_1.tar.bz2#5746d6202ba2abad4a4707f2a2462795 -https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.11.2-hb4ffafa_0.conda#aa776e4716e54633d1279cf7599c3711 +https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.11.3-hb4ffafa_0.conda#f394ac64ab0e1fcb0152cc9c16df3d85 https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hc118613_108.conda#6fa90698000b05dfe8ce6515794fe71a https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-13.2.0-h76e1118_3.conda#4a04c8f0a51d525776f267112198684d @@ -161,16 +161,16 @@ https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.5.1-h1f77430_0.conda#1 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.1-hebfc3b9_0.conda#ddd09e8904fde46b85f41896621803e6 https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.56.2-h3905398_1.conda#0b01e6ff8002994bd4ddbffcdbec7856 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda#f36ddc11ca46958197a45effdd286e45 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.25-pthreads_h384dd9e_0.conda#637ee73ecb26ad42c38278a6619a20ca https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.18.1-h8fd135c_2.conda#bbf65f7688512872f063810623b755dc https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.37-h0054252_1.conda#f27960e8873abb5476e96ef33bdbdccd -https://conda.anaconda.org/conda-forge/linux-64/nss-3.94-h1d7d5a4_0.conda#7caef74bbfa730e014b20f0852068509 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.95-h1d7d5a4_0.conda#d3a8067adcc45a923f4b1987c91d69da https://conda.anaconda.org/conda-forge/linux-64/orc-1.9.0-h385abfd_1.conda#2cd5aac7ef1b4c6ac51bf521251a89b3 https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.1.3-h32600fe_0.conda#8287aeb8462e2d4b235eff788e75919d https://conda.anaconda.org/conda-forge/linux-64/python-3.11.6-hab00c5b_0_cpython.conda#b0dfbe2fcbfdb097d321bfd50ecddab1 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda#df56c636df4a98990462d66ac7be2330 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.2-h2c6b66d_0.conda#4f2892c672829693fd978d065db4e8be https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-h0c5db8f_5.conda#9464044754ea25557a9c93f0327d90a6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b @@ -195,7 +195,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/config-0.5.1-pyhd8ed1ab_0.tar.bz2#97275d4898af65967b1ad57923cef770 https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda#0d07dc29b1c1cc973f76b74beb44915f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.5-py311hb755f60_0.conda#25b42509a68f96e612534af3fe2cf033 +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.6-py311hb755f60_0.conda#88cc84238dda72e11285d9cfcbe43e51 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda#5e4f3466526c52bc9af2d2353a1460bd https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.7-pyhd8ed1ab_0.conda#12d8aae6994f342618443a8f05c652a0 @@ -204,7 +204,7 @@ https://conda.anaconda.org/conda-forge/noarch/dodgy-0.2.1-py_0.tar.bz2#62a69d073 https://conda.anaconda.org/conda-forge/noarch/ecmwf-api-client-1.6.3-pyhd8ed1ab_0.tar.bz2#15621abf59053e184114d3e1d4f9d01e https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-1.1.0-pyhd8ed1ab_0.conda#a2f2138597905eaa72e561d8efb42cf3 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.3-pyhd8ed1ab_0.conda#e6518222753f519e911e83136d2158d9 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_0.conda#f6c211fee3c98229652b60a9a42ef363 https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2#348e27e78a5e39090031448c72f66d5e https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 @@ -216,7 +216,7 @@ https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h6b639ba_2.co https://conda.anaconda.org/conda-forge/noarch/geographiclib-1.52-pyhd8ed1ab_0.tar.bz2#6880e7100ebae550a33ce26663316d85 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyhd8ed1ab_6.conda#2ed1fe4b9079da97c44cfe9c2e5078fd -https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.1.2-pyhd8ed1ab_0.tar.bz2#3c3de74912f11d2b590184f03c7cd09b @@ -224,7 +224,7 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1 https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.9.0-py311h459d7ec_1.conda#7cc99d87755a9e64586a6004c5f0f534 https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.3-pyhd8ed1ab_0.conda#69ea1d0fa7ab33b48c88394ad1dead65 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda#420f4e9be59d0dc9133a0f43f7bab3f3 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-h409715c_0.conda#50c873c9660ed116707ae15b663928d8 https://conda.anaconda.org/conda-forge/linux-64/libpq-15.3-hbcd7760_1.conda#8afb2a97d256ffde95b91a6283bc598c https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.1-hbf2b3c1_0.conda#4963f3f12db45a576f2b8fbe9a0b8569 @@ -235,7 +235,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.2-py311h38e4bf4_1.conda# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_1.conda#71120b5155a0c500826cf81536721a15 https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2#34fc335fc50eef0b5ea708f2b5f54e0c https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed -https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.6-py311h9547e67_0.conda#e826b71bf3dc8c91ee097663e2bcface +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.7-py311h9547e67_0.conda#3ac85c6c226e2a2e4b17864fc2ca88ff https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.4-py311h459d7ec_1.conda#3dc76316237c8f7e7231d61b76c62b7c https://conda.anaconda.org/conda-forge/noarch/munch-4.0.0-pyhd8ed1ab_0.conda#376b32e8f9d3eacbd625f37d39bd507d https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -250,11 +250,10 @@ https://conda.anaconda.org/conda-forge/noarch/pathspec-0.11.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.3.0-pyhd8ed1ab_0.conda#2390bd10bed1f3fdc7a537fb5a447d8d https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py311h459d7ec_1.conda#490d7fa8675afd1aa6f1b2332d156a45 -https://conda.anaconda.org/conda-forge/noarch/py-1.11.0-pyh6c4a22f_0.tar.bz2#b4613d7e7a493916d867842a6a148054 https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.9.1-pyhd8ed1ab_0.tar.bz2#0191dd7efe1a94262812770183b68892 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyflakes-2.5.0-pyhd8ed1ab_0.tar.bz2#1b3bef4313288ae8d35b1dfba4cd84a3 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.1-pyhd8ed1ab_0.conda#5bb8a4f4162594af97cee1434d39f500 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 @@ -264,7 +263,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7e https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda#c93346b446cd08c169d843ae5fc0da97 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.1-py311h34ded2d_2.conda#ea365280db99687905b4d76cf6a3568c -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.13.1-py311h46250e7_0.conda#b1924481122f7cb41cb001f5c96bf3f6 +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.13.2-py311h46250e7_0.conda#c5f5089dd1fe0000fecaf0d12eca50b9 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py311h459d7ec_2.conda#56bc3fe5180c0b23e05c7a5708153ac7 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df @@ -287,14 +286,14 @@ https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5 https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda#074d0ce7a6261ab8b497c3518796ef3e https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py311h459d7ec_1.conda#a700fcb5cedd3e72d0c75d095c7a6eda -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.13.0-pyhd8ed1ab_0.conda#8a9953c15e1e5a7c1baddbbf4511a567 -https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2023.11.14-pyhd8ed1ab_0.conda#dee8232c4bb962881f8e67588cd31670 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.0-pyhd8ed1ab_0.conda#886f4a84ddb49b943b1697ac314e85b3 +https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2023.11.29-pyhd8ed1ab_0.conda#b355907cec4e6a516f2909396add77c8 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.8.0-pyha770c72_0.conda#5b1be40a26d10a06f6d4f1f9e19fa0c7 https://conda.anaconda.org/conda-forge/linux-64/ujson-5.8.0-py311hb755f60_0.conda#91e67c62c48444e4efc08fb61835abe8 https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-py_0.tar.bz2#1447ead40f2a01733a9c8dfc32988375 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 https://conda.anaconda.org/conda-forge/noarch/webob-1.8.7-pyhd8ed1ab_0.tar.bz2#a8192f3585f341ea66c60c189580ac67 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.3-pyhd8ed1ab_0.conda#3fc026b9c87d091c4b34a6c997324ae8 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.16.0-py311h459d7ec_0.conda#6669b5529d206c1f880b642cdd17ae05 https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.1.9-pyhd8ed1ab_0.conda#70e533db62a710ae216fdaccc4a983c8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -325,8 +324,8 @@ https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.2-py311h459d7ec_1.c https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a https://conda.anaconda.org/conda-forge/noarch/fire-0.5.0-pyhd8ed1ab_0.conda#9fd22aae8d2f319e80f68b295ab91d64 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.45.0-py311h459d7ec_0.conda#316e188c8068e6d9c55d23bbead5d6c3 -https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.0-pyhd8ed1ab_0.conda#90faaa7eaeba3cc877074c0916efe30c +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.45.1-py311h459d7ec_0.conda#5b24692ece82f89e5cb9a469d9619731 +https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_0.conda#c75621ce68f6570fff9a6734cf21c9a7 https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.0-nompi_hb72d44e_103.conda#975973a4350ab45ff1981fe535a12af5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 @@ -335,13 +334,13 @@ https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/isort-5.12.0-pyhd8ed1ab_1.conda#07ed3421bad60867234c7a9282ea39d4 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda#4da50d410f553db77e62ab62ffaa1abc -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_0.conda#3f0915b1fb2252ab73686a533c5f9d3f https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda#d12374af44575413fbbd4a217d46ea33 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hfa28ad5_6.conda#ef06bee47510a7f5db3c2297a51d6ce2 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.12.0-h840a212_1.conda#03c225a73835f5aa68c13e62eb360406 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda#9f100edf65436e3eabc2a51fc00b2c37 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_1.tar.bz2#2f59daeb14581d41b1e2dda0895933b2 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc @@ -349,6 +348,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.2-py311h459d7ec_1.c https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py311h0b84326_0.conda#4b24acdc1fbbae9da03147e7d2cf8c8a https://conda.anaconda.org/conda-forge/noarch/pip-23.3.1-pyhd8ed1ab_0.conda#2400c0b86889f43aa52067161e1fb108 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.0.0-pyhd8ed1ab_0.conda#6bb4ee32cd435deaeac72776c001e7ac https://conda.anaconda.org/conda-forge/noarch/plotly-5.18.0-pyhd8ed1ab_0.conda#9f6a8664f1fe752f79473eeb9bf33a60 https://conda.anaconda.org/conda-forge/linux-64/postgresql-15.3-hd458b1d_1.conda#4a4b5dede4d2e075e9aa5a44a9fd9f20 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 @@ -357,7 +357,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.0.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.3-pyhd8ed1ab_0.conda#5bdca0aca30b0ee62bb84854e027eae0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.1-pyhd8ed1ab_0.conda#4dc77041fea14c63ecea50ce0eb92873 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.31.0-pyhd8ed1ab_0.conda#38c2b9b24e9a58725a233f1fa32c23e9 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.31.1-pyhd8ed1ab_0.conda#ae08039cf63eb82637b867aea3f04758 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-py_2.tar.bz2#a11f356d6f93b74b4a84e9501afd48b4 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.5-py311h459d7ec_0.conda#1101ec27377f8e45d8431a5f21d744f1 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 @@ -371,11 +371,11 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.1.3-h7f98852_0.tar https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hd590300_0.conda#12bf78e12f71405775e1c092902959d3 https://conda.anaconda.org/conda-forge/noarch/yamale-4.0.4-pyh6c4a22f_0.tar.bz2#cc9f59f147740d88679bf1bd94dbe588 https://conda.anaconda.org/conda-forge/noarch/yamllint-1.33.0-pyhd8ed1ab_0.conda#57d32eb2c4b76ef288f9dd789f8fe5af -https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.2-py311h459d7ec_1.conda#132637a291f818a0e99c8ca468e92eb8 +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.3-py311h459d7ec_0.conda#96f995652440b0a9266d66a691d9eff9 +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.1-py311h459d7ec_0.conda#a51ceb9a9219e3c11af56b2b77794839 https://conda.anaconda.org/conda-forge/linux-64/arpack-3.7.0-hdefa2d7_2.tar.bz2#8763fe86163198ef1778d1d8d22bb078 -https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.3-pyhd8ed1ab_0.conda#3ce482ec3066e6d809dbbb1d1679f215 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.13-heb0bb06_2.conda#c0866da05d5e7bb3a3f6b68bcbf7537b -https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.1-pyhd8ed1ab_0.conda#4b85ef7c94054bdbcb5c3e5861f9dcc3 +https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.2-pyhd8ed1ab_0.conda#e0bed31a605a8ec1768ac7367891bd00 https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.5-py311h63ff55d_0.conda#22584e5c97ed8f1a6b63a0ff43dba827 https://conda.anaconda.org/conda-forge/noarch/django-4.2.7-pyhd8ed1ab_0.conda#107fbbd296283091c717acd51a3a87fd https://conda.anaconda.org/conda-forge/noarch/flake8-5.0.4-pyhd8ed1ab_0.tar.bz2#8079ea7dec0a917dd0cb6c257f7ea9ea @@ -388,21 +388,22 @@ https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec07 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-7.3.0-hdb3a94d_0.conda#765bc76c0dfaf24ff9d8a2935b2510df https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-h8b5b2df_13.conda#29a96d50cb53638a5b4806b5ca6e4b1d https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.11.1-pyhd8ed1ab_0.conda#094ff9cf36957f95bb74cee42ab140b2 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.11.2-pyhd8ed1ab_0.conda#73884ca36d6d96cbce498cde99fab40f +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.5.0-py311h38be061_0.conda#cee83be29258275f75029125e186ab6d https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.1-h3845be2_3.conda#f38e5e47f62d6633166040192ad420a1 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0f3d0bb_105.conda#b5d412441b84305460e9df8a016a3392 https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.0.1-hca56755_27.conda#918a735059cab21b96fc13a8d04fbcd8 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py311h64a7726_0.conda#bf16a9f625126e378302f08e7ed67517 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.11.0-pyhd8ed1ab_0.conda#8f567c0a74aa44cf732f15773b4083b0 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.2-py311h64a7726_0.conda#fd2f142dcd680413b5ede5d0fb799205 https://conda.anaconda.org/conda-forge/linux-64/poppler-23.05.0-hd18248d_1.conda#09e0de1aa7330fe697eed76eaeef666d https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.2.0-pyhd8ed1ab_0.tar.bz2#d883564cf1e9ba190f6b285036c5f949 https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba +https://conda.anaconda.org/conda-forge/noarch/pylint-2.17.7-pyhd8ed1ab_0.conda#3cab6aee60038b3f621bce3e50f52bed https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311ha169711_0.conda#ad4b6e9be79a89959bb6d7d308027ff2 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda#06eb685a3a0b146347a58dda979485da -https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.1-pyhd8ed1ab_0.conda#0a4d7e888fae7b7d75243414b15d0c50 +https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.3-pyhd8ed1ab_0.conda#1dbdf019d740419852c4a7803fff49d9 https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.0.0-pyhd8ed1ab_1.conda#8bdcc0f401561213821bf67513abeeff https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.12.0-pyhd8ed1ab_0.conda#ac9fedc9a0c397f2318e82525491dd83 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.4.0-pyhd8ed1ab_0.conda#b8dc6f9db1b9670e564b68277a79ffeb +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b https://conda.anaconda.org/conda-forge/noarch/python-build-1.0.3-pyhd8ed1ab_0.conda#d9ccabf228cb98419ca3d5694b25e1a2 https://conda.anaconda.org/conda-forge/noarch/rdflib-7.0.0-pyhd8ed1ab_0.conda#44d14ef95495b3d4438f28998e0296a9 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b @@ -410,8 +411,9 @@ https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.2.2-pyhd8e https://conda.anaconda.org/conda-forge/linux-64/suitesparse-5.10.1-h9e50725_1.tar.bz2#a3a685b5f9aeb890ed874502fe56accf https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.13.2-hd532e3d_0.conda#6d97164f19dbd27575ef1899b02dc1e0 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.7-pyhd8ed1ab_0.conda#db990278c2c00b268eed778de44f6057 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.14-h7f98852_1.tar.bz2#45b68dc2fc7549c16044d533ceaf340e -https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.8.6-py311h459d7ec_1.conda#7d4b63a745f293029b5689b0b5d8aa15 +https://conda.anaconda.org/conda-forge/noarch/yapf-0.40.1-pyhd8ed1ab_0.conda#f269942e802d5e148632143d4c37acc9 https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.20.3-he9c0e7f_4.conda#7695770e1d722ce9029a2ea30c060a3d https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.6.1-pyhd8ed1ab_0.conda#454ed214cec806066097ae245a409171 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 @@ -427,7 +429,7 @@ https://conda.anaconda.org/conda-forge/noarch/imageio-2.31.5-pyh8c1a49c_0.conda# https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.20.0-pyhd8ed1ab_0.conda#1116d79def5268414fb0917520b2bbf1 https://conda.anaconda.org/conda-forge/linux-64/julia-1.8.5-h783901f_0.conda#98c05ba7ca9c15d22216f730499e167a -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.5.0-py311h38be061_0.conda#cee83be29258275f75029125e186ab6d +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.0-pyhd8ed1ab_0.conda#6bd3f1069cdebb44c7ae9efb900e312d https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.0-h5418a03_2.conda#30ddbe080c260fb36da8509e3fd6c45f https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h4f3791c_100.conda#405c5b3ad4ef53eb0d93043b54206dd7 @@ -436,19 +438,17 @@ https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.12.1-py311hb755f60_0 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.3-py311h320fe9a_0.conda#3ea3486e16d559dfcb539070ed330a1e https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-heaa33ce_1.conda#cde553e0e32389e26595db4eacf859eb https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.0-pyhd8ed1ab_0.conda#134b2b57b7865d2316a7cce1915a51ed -https://conda.anaconda.org/conda-forge/noarch/pylint-2.17.7-pyhd8ed1ab_0.conda#3cab6aee60038b3f621bce3e50f52bed +https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.3.0-pyhd8ed1ab_0.conda#7819533e674dbbc51468f3228b9b1bb6 https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 -https://conda.anaconda.org/conda-forge/noarch/pytest-html-3.2.0-pyhd8ed1ab_1.tar.bz2#d5c7a941dfbceaab4b172a56d7918eb0 +https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py311h1f0f07a_1.conda#86b71ff85f3e4c8a98b5bace6d9c4565 https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.1.1-pyhd8ed1ab_0.conda#29bf13210ee541c59166cea092b91080 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.3-py311h64a7726_1.conda#e4b4d3b764e2d029477d0db88248a8b5 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.4-py311h64a7726_0.conda#9ac5334f1b5ed072d3dbc342503d7868 https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.4-py_1.tar.bz2#a9e101e1601faf5e5a119ab2bd7617a4 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311h54d622a_1.conda#a894c65b48676c4973e9ee8b59bceb9e https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-py_0.tar.bz2#cb83a3d6ecf73f50117635192414426a https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h43474b4_0.conda#fd815765a86daf44db1e15c6f6edf5e6 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.6-pyhd8ed1ab_0.conda#fb1fc875719e217ed799a7aae11d3be4 -https://conda.anaconda.org/conda-forge/noarch/yapf-0.40.1-pyhd8ed1ab_0.conda#f269942e802d5e148632143d4c37acc9 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-hbc2ea52_17.conda#452c7b08c21eea2ef01f4fd364d6affc https://conda.anaconda.org/conda-forge/noarch/bokeh-3.3.1-pyhd8ed1ab_0.conda#682d698da77e896c5e986b334ce8f0a5 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b @@ -457,16 +457,17 @@ https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.30.2-h1f30a5c_0.conda# https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h20110ff_0.conda#11f5169aeff54ad7277476be8ba19ff7 https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.0-py311h281082f_2.conda#fde4fad3c517cc80f32995696f45198d https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.0-pyhd8ed1ab_0.conda#6bd3f1069cdebb44c7ae9efb900e312d https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-h98fae49_0.conda#620e754f4344f4c27259ff460a2b9c50 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py311h54ef318_0.conda#9f80753bc008bfc9b95f39d9ff9f1694 -https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.0-pyhd8ed1ab_2.tar.bz2#363b0816e411feb0df925d4f224f026a +https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.2-pyhd8ed1ab_0.conda#61ba076de6530d9301a0053b02f093d2 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h4d7c953_100.conda#c03492d0342e512e58aa2d6c5fdaaa91 https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.3-pyhd8ed1ab_0.tar.bz2#50ef6b29b1fb0768ca82c5aeb4fb2d96 https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.5.0-pyha770c72_0.conda#964e3d762e427661c59263435a14c492 -https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 +https://conda.anaconda.org/conda-forge/noarch/pylint-celery-0.3-py_1.tar.bz2#e29456a611a62d3f26105a2f9c68f759 +https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.5.3-pyhd8ed1ab_0.tar.bz2#00d8853fb1f87195722ea6a582cc9b56 +https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h1f0f07a_1.conda#cd36a89a048ad2bcc6d8b43f648fb1d0 https://conda.anaconda.org/conda-forge/linux-64/r-base-4.1.3-hfabd6f2_9.conda#0ab4cf54fbddc0cc9ff260c6f77f8c84 https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.8-py311h41e4db2_0.conda#b35deb26af1d7e0d98438c8ac5c6b7b2 @@ -479,7 +480,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.c https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.8.6-pyhd8ed1ab_0.conda#2e33e3bdf2b1a79989ad792ac22104d3 https://conda.anaconda.org/conda-forge/noarch/cmocean-3.0.3-pyhd8ed1ab_0.conda#eec7df83d725696d32c7bf99aff21d82 https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.8.2-pyhd8ed1ab_0.conda#cc344a296a41369bcb05f7216661cec8 -https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyh1a96a4e_2.tar.bz2#64068564a9c2932bf30e9b4ec567927d +https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a https://conda.anaconda.org/conda-forge/noarch/esmpy-8.4.2-pyhc1e730c_4.conda#ddcf387719b2e44df0cc4dd467643951 https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.4-py311hbac4ec9_0.conda#1d3445f5f7fa002a1c149c405376f012 https://conda.anaconda.org/conda-forge/linux-64/graphviz-8.1.0-h28d9a01_0.conda#33628e0e3de7afd2c8172f76439894cb @@ -489,11 +490,9 @@ https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-hf70af60_47.conda#ee27133164cb9f5e74681bdb8839688f https://conda.anaconda.org/conda-forge/linux-64/nco-5.1.6-hd62b316_0.conda#af7780f76ee37325d264327e21a478f5 +https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.3-pyhd8ed1ab_0.conda#f551d4d859a1d70c6abff8310a655481 https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.4.3-py311h38be061_1.tar.bz2#f0c9a1067c03e8f05e53ef0c5ad5fab3 https://conda.anaconda.org/conda-forge/linux-64/py-xgboost-1.7.6-cuda118_py311h0be3a32_6.conda#e9989e03af742084940a11c7c3c395a5 -https://conda.anaconda.org/conda-forge/noarch/pylint-celery-0.3-py_1.tar.bz2#e29456a611a62d3f26105a2f9c68f759 -https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.5.3-pyhd8ed1ab_0.tar.bz2#00d8853fb1f87195722ea6a582cc9b56 -https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r41hc72bb7e_1004.tar.bz2#831186670e5786df30f8ddeb5a623c5a https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.4.1-r41h06615bd_1.tar.bz2#9a00c3283f8fb4bce68deffe08fbe09d https://conda.anaconda.org/conda-forge/noarch/r-bigmemory.sri-0.1.6-r41hc72bb7e_0.tar.bz2#926471a5be30d287a25f2d10446d6066 @@ -566,7 +565,6 @@ https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.11.0-pyhd8ed1ab_0.conda#d59e0cb1ca993f8f910cfdf393232acf -https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.3-pyhd8ed1ab_0.conda#f551d4d859a1d70c6abff8310a655481 https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.4.1-py311h38be061_2.tar.bz2#4c9101d329f6bc09c2617a80e3eb9c89 https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.6.6-pyhd8ed1ab_0.conda#255f9eac03143526c8aed41d1d091c63 https://conda.anaconda.org/conda-forge/linux-64/pyarrow-12.0.1-py311h39c9aba_7_cpu.conda#d513ab8d10ec5f3ee45b419c836195ec @@ -604,7 +602,7 @@ https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.11.0-pyhd8ed1ab https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 https://conda.anaconda.org/conda-forge/noarch/psy-maps-1.4.2-pyhd8ed1ab_0.tar.bz2#3ed13103dfd46f71dc870d188bd0b276 https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.4.0-py311h38be061_3.conda#6f7871722c07922028043144e8873b37 -https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.5-pyhd8ed1ab_0.conda#a172245c7fdb6696f2ab357501e6d13e +https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhd8ed1ab_0.conda#3fd1a0b063c1fbbe4b7bd5a5a7601e84 https://conda.anaconda.org/conda-forge/linux-64/r-akima-0.6_2.3-r41h92ddd45_0.tar.bz2#bac0b7627ef744c98f4bc48885f52e72 https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.3-r41hc72bb7e_0.tar.bz2#af0891cc9b87e2954c9a3c66f144992d @@ -652,7 +650,7 @@ https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.0.2-r41hc72bb7e_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r41hc72bb7e_1.tar.bz2#2253f130c8dab435824d6ddb10a41c73 https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.6-pyhd8ed1ab_0.tar.bz2#4409dd7e06a62c3b2aa9e96782c49c6d https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.3-pyhd8ed1ab_0.conda#0dbaa7d08d3d79b2a1a4dd6a02cc4581 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.14.3-pyhd8ed1ab_1.conda#fbe2993dd48f14724b90bf12e92cc164 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.14.4-pyhd8ed1ab_0.conda#c79b8443908032263ffb40ee6215e9e4 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.7-pyhd8ed1ab_0.conda#aebfabcb60c33a89c1f9290cab49bc93 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.5-pyhd8ed1ab_0.conda#ebf08f5184d8eaa486697bc060031953 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.4-pyhd8ed1ab_0.conda#a9a89000dfd19656ad004b937eeb6828 From 1ed332753e06ee8f943c1d5b59d0a404d54b42f0 Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Tue, 5 Dec 2023 12:53:01 +0000 Subject: [PATCH 06/39] Adding download_dir to recipe filler. (#3447) Co-authored-by: Valeriu Predoi --- esmvaltool/utils/recipe_filler.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/esmvaltool/utils/recipe_filler.py b/esmvaltool/utils/recipe_filler.py index 91033a12c8..40f637c6d5 100755 --- a/esmvaltool/utils/recipe_filler.py +++ b/esmvaltool/utils/recipe_filler.py @@ -291,16 +291,31 @@ def read_config_user_file(config_file, folder_name, options=None): } +def _get_download_dir(yamlconf, cmip_era): + """Get the Download Directory from user config file.""" + if 'download_dir' in yamlconf: + return os.path.join(yamlconf['download_dir'], cmip_era) + return False + + def _get_site_rootpath(cmip_era): """Get site (drs) from config-user.yml.""" config_yml = get_args().config_file with open(config_yml, 'r') as yamf: yamlconf = yaml.safe_load(yamf) drs = yamlconf['drs'][cmip_era] - rootdir = yamlconf['rootpath'][cmip_era] + + download_dir = _get_download_dir(yamlconf, cmip_era) + rootdir = [yamlconf['rootpath'][cmip_era], ] + + if download_dir: + rootdir.append(download_dir) logger.debug("%s root directory %s", cmip_era, rootdir) if drs == 'default' and 'default' in yamlconf['rootpath']: - rootdir = yamlconf['rootpath']['default'] + rootdir = [yamlconf['rootpath']['default'], ] + if download_dir: + rootdir.append(download_dir) + logger.debug("Using drs default and " "default: %s data directory", rootdir) @@ -327,6 +342,7 @@ def _determine_basepath(cmip_era): rootpaths = _get_site_rootpath(cmip_era)[1] else: rootpaths = [_get_site_rootpath(cmip_era)[1]] + basepaths = [] for rootpath in rootpaths: if _get_input_dir(cmip_era) != os.path.sep: From 06d88128490bd6610162a70167d13f82fc621514 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Wed, 6 Dec 2023 10:07:45 +0100 Subject: [PATCH 07/39] Add note about not removing communities and grants from .zenodo.json (#3417) --- doc/sphinx/source/community/code_documentation.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/sphinx/source/community/code_documentation.rst b/doc/sphinx/source/community/code_documentation.rst index 82f8c3a8f7..1c211daf39 100644 --- a/doc/sphinx/source/community/code_documentation.rst +++ b/doc/sphinx/source/community/code_documentation.rst @@ -442,7 +442,10 @@ name to the list of authors in ``CITATION.cff`` and generate the entry for the :: pip install cffconvert - cffconvert --format zenodo --outfile .zenodo.json + cffconvert --infile CITATION.cff --format zenodo --outfile .zenodo.json + +Presently, this method unfortunately discards entries `communities` +and `grants` from that file; please restore them manually. Note that authors of recipes and/or diagnostics also need to be added to the file `esmvaltool/config-references.yml `__, From 91ea9b44b46d164064c0e3e12ea8b83c4115149a Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Thu, 7 Dec 2023 07:45:58 +0000 Subject: [PATCH 08/39] regenerate Anconda shield/badge not to have ESMValTool version hardcoded in image name (#3453) Co-authored-by: Bouwe Andela --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 694dab6a82..4fbe8aa84e 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![Codacy Badge](https://app.codacy.com/project/badge/Coverage/79bf6932c2e844eea15d0fb1ed7e415c)](https://www.codacy.com/gh/ESMValGroup/ESMValTool?utm_source=github.com&utm_medium=referral&utm_content=ESMValGroup/ESMValTool&utm_campaign=Badge_Coverage) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/79bf6932c2e844eea15d0fb1ed7e415c)](https://www.codacy.com/gh/ESMValGroup/ESMValTool?utm_source=github.com&utm_medium=referral&utm_content=ESMValGroup/ESMValTool&utm_campaign=Badge_Grade) [![Docker Build Status](https://img.shields.io/docker/cloud/build/esmvalgroup/esmvaltool.svg)](https://hub.docker.com/r/esmvalgroup/esmvaltool/) -[![Anaconda-Server Badge](https://img.shields.io/badge/Anaconda.org-2.9.0-blue.svg)](https://anaconda.org/conda-forge/esmvaltool) +[![Anaconda-Server Badge](https://img.shields.io/conda/vn/conda-forge/ESMValTool?color=blue&label=conda-forge&logo=conda-forge&logoColor=white)](https://anaconda.org/conda-forge/esmvaltool) ![stand with Ukraine](https://badgen.net/badge/stand%20with/UKRAINE/?color=0057B8&labelColor=FFD700) ![esmvaltoollogo](https://raw.githubusercontent.com/ESMValGroup/ESMValTool/main/doc/sphinx/source/figures/ESMValTool-logo-2.png) From aea6b2888aefc0659e3564acc1c0fc403bef3e36 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Thu, 7 Dec 2023 17:04:35 +0000 Subject: [PATCH 09/39] clean up a bit CircleCI configuration (#3450) --- .circleci/config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 47e87cf517..91cb7c17d3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -27,6 +27,7 @@ commands: name: Log versions command: | . /opt/conda/etc/profile.d/conda.sh + conda env export --name base > /logs/base_environment.yml conda activate esmvaltool esmvaltool version dpkg -l > /logs/versions.txt @@ -40,6 +41,7 @@ commands: command: | . /opt/conda/etc/profile.d/conda.sh conda activate esmvaltool + mamba --version pytest -n 4 --junitxml=test-reports/report.xml esmvaltool version esmvaltool -- --help @@ -265,7 +267,7 @@ jobs: # Install prerequisites mkdir /logs # Install ESMValTool in a new conda environment - mamba create -y --name esmvaltool -c conda-forge esmvaltool julia 'python=3.10' >> /logs/conda.txt 2>&1 + mamba create -y --name esmvaltool -c conda-forge esmvaltool julia 'python=3.11' >> /logs/conda.txt 2>&1 # Activate the environment set +x; conda activate esmvaltool; set -x # install the Julia dependencies From bcb202e06d5420f83ef76c1e2dec5a71e2869aec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 12:05:51 +0000 Subject: [PATCH 10/39] [Condalock] Update Linux condalock file (#3458) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 74 ++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index b4ed02d1d9..b0facf9382 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -53,7 +53,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#12 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_9.conda#61641e239f96eae2b8492dc7e755828c https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 -https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_3.conda#c714d905cdfa0e70200f68b80cc04764 @@ -75,7 +75,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318 https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h516909a_1000.tar.bz2#bb14fcb13341b81d5eb386423b9d2bac https://conda.anaconda.org/conda-forge/linux-64/make-4.3-hd18ef5c_1.tar.bz2#4049ebfd3190b580dffe76daed26155a https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.3.0-hcb278e6_0.conda#cc1213f464c357b647cc5dde5cfca881 -https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-h59595ed_1007.conda#40ccb8318df2500f83bd868dd8fcd201 +https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.1-h59595ed_2.conda#9ba5910c34210e7ad60736d172bbcd4c https://conda.anaconda.org/conda-forge/linux-64/nccl-2.19.4.1-h6103f9b_0.conda#2946f0e841f1f0be90c90bc67877d417 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 @@ -199,7 +199,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.6-py311hb755f60_0.con https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda#5e4f3466526c52bc9af2d2353a1460bd https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.7-pyhd8ed1ab_0.conda#12d8aae6994f342618443a8f05c652a0 -https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_2.conda#33f8066e53679dd4be2355fec849bf01 +https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe https://conda.anaconda.org/conda-forge/noarch/dodgy-0.2.1-py_0.tar.bz2#62a69d073f7446c90f417b0787122f5b https://conda.anaconda.org/conda-forge/noarch/ecmwf-api-client-1.6.3-pyhd8ed1ab_0.tar.bz2#15621abf59053e184114d3e1d4f9d01e https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d @@ -211,7 +211,7 @@ https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.0-py311h459d7ec_1.conda#23d0b2d02252b32ee14e5063ccfb41e2 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.10.0-pyhca7485f_0.conda#5b86cf1ceaaa9be2ec4627377e538db1 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.12.1-pyhca7485f_0.conda#b38946846cdf39f9bce93f75f571d913 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h6b639ba_2.conda#ee8220db21db8094998005990418fe5b https://conda.anaconda.org/conda-forge/noarch/geographiclib-1.52-pyhd8ed1ab_0.tar.bz2#6880e7100ebae550a33ce26663316d85 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe @@ -246,8 +246,9 @@ https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.25-pthreads_h https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/pathspec-0.11.2-pyhd8ed1ab_0.conda#e41debb259e68490e3ab81e46b639ab6 +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda#17064acba08d3686f1135b5ec1b32b12 https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.1.0-pyhd8ed1ab_0.conda#45a5065664da0d1dfa8f8cd2eaf05ab9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.3.0-pyhd8ed1ab_0.conda#2390bd10bed1f3fdc7a537fb5a447d8d https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py311h459d7ec_1.conda#490d7fa8675afd1aa6f1b2332d156a45 https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.9.1-pyhd8ed1ab_0.tar.bz2#0191dd7efe1a94262812770183b68892 @@ -262,7 +263,7 @@ https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.3-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda#c93346b446cd08c169d843ae5fc0da97 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.1-py311h34ded2d_2.conda#ea365280db99687905b4d76cf6a3568c +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.2-py311h34ded2d_0.conda#819aa640a0493d4b52faf938e94d129e https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.13.2-py311h46250e7_0.conda#c5f5089dd1fe0000fecaf0d12eca50b9 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py311h459d7ec_2.conda#56bc3fe5180c0b23e05c7a5708153ac7 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed @@ -276,8 +277,8 @@ https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.4.4-pyhd8ed1ab_0.conda#2e2f31b3b1c866c29636377e14f8c4c6 -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.10.0-h00ab1b0_2.conda#eb0d5c122f42714f86a7058d1ce7b2e6 -https://conda.anaconda.org/conda-forge/noarch/tblib-2.0.0-pyhd8ed1ab_0.conda#f5580336fe091d46f9a2ea97da044550 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.11.0-h00ab1b0_0.conda#fde515afbbe6e36eb4564965c20b1058 +https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f https://conda.anaconda.org/conda-forge/noarch/tenacity-8.2.3-pyhd8ed1ab_0.conda#1482e77f87c6a702a7e05ef22c9b197b https://conda.anaconda.org/conda-forge/noarch/termcolor-2.3.0-pyhd8ed1ab_0.conda#440d508f025b1692168caaf436504af3 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.2.0-pyha21a80b_0.conda#978d03388b62173b8e6f79162cf52b86 @@ -288,8 +289,8 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py311h459d7ec_1.conda#a700fcb5cedd3e72d0c75d095c7a6eda https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.0-pyhd8ed1ab_0.conda#886f4a84ddb49b943b1697ac314e85b3 https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2023.11.29-pyhd8ed1ab_0.conda#b355907cec4e6a516f2909396add77c8 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.8.0-pyha770c72_0.conda#5b1be40a26d10a06f6d4f1f9e19fa0c7 -https://conda.anaconda.org/conda-forge/linux-64/ujson-5.8.0-py311hb755f60_0.conda#91e67c62c48444e4efc08fb61835abe8 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.9.0-pyha770c72_0.conda#a92a6440c3fe7052d63244f3aba2a4a7 +https://conda.anaconda.org/conda-forge/linux-64/ujson-5.9.0-py311hb755f60_0.conda#36dda52dc99a4fb9cadd3b738ec24848 https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-py_0.tar.bz2#1447ead40f2a01733a9c8dfc32988375 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 https://conda.anaconda.org/conda-forge/noarch/webob-1.8.7-pyhd8ed1ab_0.tar.bz2#a8192f3585f341ea66c60c189580ac67 @@ -324,16 +325,17 @@ https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.2-py311h459d7ec_1.c https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a https://conda.anaconda.org/conda-forge/noarch/fire-0.5.0-pyhd8ed1ab_0.conda#9fd22aae8d2f319e80f68b295ab91d64 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.45.1-py311h459d7ec_0.conda#5b24692ece82f89e5cb9a469d9619731 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.46.0-py311h459d7ec_0.conda#a14114f70e23f7fd5ab9941fec45b095 https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_0.conda#c75621ce68f6570fff9a6734cf21c9a7 https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.0-nompi_hb72d44e_103.conda#975973a4350ab45ff1981fe535a12af5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.0-pyha770c72_0.conda#a941237cd06538837b25cd245fcd25d8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda#3d5fa25cf42f3f32a12b2d874ace8574 https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 https://conda.anaconda.org/conda-forge/noarch/isort-5.12.0-pyhd8ed1ab_1.conda#07ed3421bad60867234c7a9282ea39d4 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda#4da50d410f553db77e62ab62ffaa1abc +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.5.0-py311h38be061_0.conda#cee83be29258275f75029125e186ab6d https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_0.conda#3f0915b1fb2252ab73686a533c5f9d3f https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 @@ -348,7 +350,6 @@ https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.2-py311h459d7ec_1.c https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py311h0b84326_0.conda#4b24acdc1fbbae9da03147e7d2cf8c8a https://conda.anaconda.org/conda-forge/noarch/pip-23.3.1-pyhd8ed1ab_0.conda#2400c0b86889f43aa52067161e1fb108 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.0.0-pyhd8ed1ab_0.conda#6bb4ee32cd435deaeac72776c001e7ac https://conda.anaconda.org/conda-forge/noarch/plotly-5.18.0-pyhd8ed1ab_0.conda#9f6a8664f1fe752f79473eeb9bf33a60 https://conda.anaconda.org/conda-forge/linux-64/postgresql-15.3-hd458b1d_1.conda#4a4b5dede4d2e075e9aa5a44a9fd9f20 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 @@ -357,14 +358,15 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.0.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.3-pyhd8ed1ab_0.conda#5bdca0aca30b0ee62bb84854e027eae0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.1-pyhd8ed1ab_0.conda#4dc77041fea14c63ecea50ce0eb92873 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.31.1-pyhd8ed1ab_0.conda#ae08039cf63eb82637b867aea3f04758 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.32.0-pyhd8ed1ab_0.conda#a7b5a535cd614e384594530aee7e6061 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-py_2.tar.bz2#a11f356d6f93b74b4a84e9501afd48b4 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.5-py311h459d7ec_0.conda#1101ec27377f8e45d8431a5f21d744f1 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.1-pyhd8ed1ab_0.conda#03c97908b976498dcae97eb4e4f3149c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.8.0-hd8ed1ab_0.conda#384462e63262a527bda564fa2d9126c0 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.9.0-hd8ed1ab_0.conda#c16524c1b7227dc80b36b4fa6f77cc86 https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.1.0-pyhd8ed1ab_0.conda#f8ced8ee63830dec7ecc1be048d1470a +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.0-pyhd8ed1ab_0.conda#c119653cba436d8183c27bf6d190e587 https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.4-h8d71039_2.conda#6d5edbe22b07abae2ea0a9065ef6be12 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.1.3-h7f98852_0.tar.bz2#3cdb89236358326adfce12be820a8af3 @@ -375,9 +377,9 @@ https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.3-py311h459d7ec_0.conda https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.1-py311h459d7ec_0.conda#a51ceb9a9219e3c11af56b2b77794839 https://conda.anaconda.org/conda-forge/linux-64/arpack-3.7.0-hdefa2d7_2.tar.bz2#8763fe86163198ef1778d1d8d22bb078 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.13-heb0bb06_2.conda#c0866da05d5e7bb3a3f6b68bcbf7537b -https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.2-pyhd8ed1ab_0.conda#e0bed31a605a8ec1768ac7367891bd00 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.5-py311h63ff55d_0.conda#22584e5c97ed8f1a6b63a0ff43dba827 -https://conda.anaconda.org/conda-forge/noarch/django-4.2.7-pyhd8ed1ab_0.conda#107fbbd296283091c717acd51a3a87fd +https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.3-pyhd8ed1ab_0.conda#91fc4700dcce4a46d439900a132fe4e5 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.7-py311hcb13ee4_1.conda#ca6e04ac7262ecaec846e483d6fdc6c8 +https://conda.anaconda.org/conda-forge/noarch/django-5.0-pyhd8ed1ab_0.conda#9af5d8131de6eb7b0f2f167fba3bdff7 https://conda.anaconda.org/conda-forge/noarch/flake8-5.0.4-pyhd8ed1ab_0.tar.bz2#8079ea7dec0a917dd0cb6c257f7ea9ea https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/funcargparse-0.2.5-pyhd8ed1ab_0.tar.bz2#e557b70d736251fa0bbb7c4497852a92 @@ -387,9 +389,8 @@ https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.40-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-7.3.0-hdb3a94d_0.conda#765bc76c0dfaf24ff9d8a2935b2510df https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-h8b5b2df_13.conda#29a96d50cb53638a5b4806b5ca6e4b1d -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.0-hd8ed1ab_0.conda#12aff14f84c337be5e5636bf612f4140 https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.11.2-pyhd8ed1ab_0.conda#73884ca36d6d96cbce498cde99fab40f -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.5.0-py311h38be061_0.conda#cee83be29258275f75029125e186ab6d https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.1-h3845be2_3.conda#f38e5e47f62d6633166040192ad420a1 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0f3d0bb_105.conda#b5d412441b84305460e9df8a016a3392 https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.0.1-hca56755_27.conda#918a735059cab21b96fc13a8d04fbcd8 @@ -408,10 +409,9 @@ https://conda.anaconda.org/conda-forge/noarch/python-build-1.0.3-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/rdflib-7.0.0-pyhd8ed1ab_0.conda#44d14ef95495b3d4438f28998e0296a9 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.2.2-pyhd8ed1ab_0.conda#6626918380d99292df110f3c91b6e5ec -https://conda.anaconda.org/conda-forge/linux-64/suitesparse-5.10.1-h9e50725_1.tar.bz2#a3a685b5f9aeb890ed874502fe56accf +https://conda.anaconda.org/conda-forge/linux-64/suitesparse-5.10.1-h3ec001c_2.conda#9b37d27528c5f86ee09bf1fc6834da8e https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.13.2-hd532e3d_0.conda#6d97164f19dbd27575ef1899b02dc1e0 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.7-pyhd8ed1ab_0.conda#db990278c2c00b268eed778de44f6057 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.14-h7f98852_1.tar.bz2#45b68dc2fc7549c16044d533ceaf340e https://conda.anaconda.org/conda-forge/noarch/yapf-0.40.1-pyhd8ed1ab_0.conda#f269942e802d5e148632143d4c37acc9 https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.20.3-he9c0e7f_4.conda#7695770e1d722ce9029a2ea30c060a3d @@ -420,10 +420,10 @@ https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.con https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.11.0-pyhd8ed1ab_0.conda#3bf8f5c3fbab9e0cfffdf5914f021854 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.12.0-pyhd8ed1ab_0.conda#95eae0785aed72998493140dc0115382 https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.0-py_0.tar.bz2#6e166cd37cfeadefcfca1ffe00f222bb https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.32-pyhd8ed1ab_0.conda#3ef8e9bab1bfaf900bb0a5db8c0c742c +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.33-pyhd8ed1ab_0.conda#93c8f8ceb83827d88deeba796f07fba7 https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2023.8.12-py311h67b54e4_0.conda#363e5c2f2c67ff69d717aba54422b03d https://conda.anaconda.org/conda-forge/noarch/imageio-2.31.5-pyh8c1a49c_0.conda#6820ccf6a3a27df348f18c85dd89014a https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c @@ -435,8 +435,9 @@ https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.c https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h4f3791c_100.conda#405c5b3ad4ef53eb0d93043b54206dd7 https://conda.anaconda.org/conda-forge/linux-64/numba-0.58.1-py311h96b013e_0.conda#06a0313ff3d2ec956a25767ccaf7c9f6 https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.12.1-py311hb755f60_0.conda#38a2ff8ea433fe8792279b45e84b3730 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.3-py311h320fe9a_0.conda#3ea3486e16d559dfcb539070ed330a1e +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py311h320fe9a_0.conda#e44ccb61b6621bf3f8053ae66eba7397 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-heaa33ce_1.conda#cde553e0e32389e26595db4eacf859eb +https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.4-pyhd8ed1ab_0.conda#1184267eddebb57e47f8e1419c225595 https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.0-pyhd8ed1ab_0.conda#134b2b57b7865d2316a7cce1915a51ed https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.3.0-pyhd8ed1ab_0.conda#7819533e674dbbc51468f3228b9b1bb6 @@ -450,9 +451,9 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311h54d622a_1.co https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-py_0.tar.bz2#cb83a3d6ecf73f50117635192414426a https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h43474b4_0.conda#fd815765a86daf44db1e15c6f6edf5e6 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-hbc2ea52_17.conda#452c7b08c21eea2ef01f4fd364d6affc -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.3.1-pyhd8ed1ab_0.conda#682d698da77e896c5e986b334ce8f0a5 +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.3.2-pyhd8ed1ab_0.conda#c02a7e79365121bd3bcc25f1b65f48a9 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b -https://conda.anaconda.org/conda-forge/noarch/distributed-2023.11.0-pyhd8ed1ab_0.conda#a1ee8e3043eee1649f98704ea3e6feae +https://conda.anaconda.org/conda-forge/noarch/distributed-2023.12.0-pyhd8ed1ab_0.conda#22d620e1079e99c34578cb0c615d2789 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.30.2-h1f30a5c_0.conda#21ee8444a7f629924ea8cfe52a622cbd https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h20110ff_0.conda#11f5169aeff54ad7277476be8ba19ff7 https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.0-py311h281082f_2.conda#fde4fad3c517cc80f32995696f45198d @@ -462,19 +463,19 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py311h54ef https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.2-pyhd8ed1ab_0.conda#61ba076de6530d9301a0053b02f093d2 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h4d7c953_100.conda#c03492d0342e512e58aa2d6c5fdaaa91 -https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.3-pyhd8ed1ab_0.tar.bz2#50ef6b29b1fb0768ca82c5aeb4fb2d96 https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.5.0-pyha770c72_0.conda#964e3d762e427661c59263435a14c492 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.0-pyha770c72_0.conda#473a7cfca197da0a10cff3f6dded7d4b https://conda.anaconda.org/conda-forge/noarch/pylint-celery-0.3-py_1.tar.bz2#e29456a611a62d3f26105a2f9c68f759 https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.5.3-pyhd8ed1ab_0.tar.bz2#00d8853fb1f87195722ea6a582cc9b56 https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h1f0f07a_1.conda#cd36a89a048ad2bcc6d8b43f648fb1d0 https://conda.anaconda.org/conda-forge/linux-64/r-base-4.1.3-hfabd6f2_9.conda#0ab4cf54fbddc0cc9ff260c6f77f8c84 https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.8-py311h41e4db2_0.conda#b35deb26af1d7e0d98438c8ac5c6b7b2 -https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.3.2-py311hc009520_1.conda#6b92d3d0680eae9d1d9860a721f7fb51 +https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.3.2-py311hc009520_2.conda#9821f8e497a791858226f535e5e0be62 https://conda.anaconda.org/conda-forge/noarch/sparse-0.14.0-pyhd8ed1ab_0.conda#ee01b310177a0612554b9d20e537fdbe -https://conda.anaconda.org/conda-forge/noarch/tifffile-2023.9.26-pyhd8ed1ab_0.conda#d133bea7d8ac17552492a0629229eeb1 -https://conda.anaconda.org/conda-forge/noarch/xarray-2023.11.0-pyhd8ed1ab_0.conda#f445b20bac3db8f604a48592087b2d8f +https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.0-py311h1f0f07a_2.conda#8f1e772e5430ce48229740ec00a90b61 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2023.12.9-pyhd8ed1ab_0.conda#454bc0aff84f35fa53ba9e0369737a9b +https://conda.anaconda.org/conda-forge/noarch/xarray-2023.12.0-pyhd8ed1ab_0.conda#e9b31d3ab1b0dd5fd8c24419f6560b90 https://conda.anaconda.org/conda-forge/noarch/zarr-2.16.1-pyhd8ed1ab_0.conda#59ec835edbee50266b7bdbadab7ba335 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.8.6-pyhd8ed1ab_0.conda#2e33e3bdf2b1a79989ad792ac22104d3 @@ -558,13 +559,12 @@ https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r41hc72bb7e_1 https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.7-r41h133d619_0.conda#4af88071a607237aa73a3cbd51788a39 https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.22.0-py311h320fe9a_2.conda#e94b7f09b52628b89e66cdbd8c3029dd https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.0-pyhd8ed1ab_0.conda#082666331726b2438986cfe33ae9a8ee -https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.0-py311h1f0f07a_2.conda#8f1e772e5430ce48229740ec00a90b61 https://conda.anaconda.org/conda-forge/linux-64/cdo-2.2.0-he026af2_4.conda#6c00b0a21b3de8a149eee137e83465d3 https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_15-pl5321hf48ede7_0.conda#53c9f7169b61e615d5f41c8d70a72c00 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.11.0-pyhd8ed1ab_0.conda#d59e0cb1ca993f8f910cfdf393232acf +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.12.0-pyhd8ed1ab_0.conda#4d67c68fd0d130091ada039bc2d81b33 https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.4.1-py311h38be061_2.tar.bz2#4c9101d329f6bc09c2617a80e3eb9c89 https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.6.6-pyhd8ed1ab_0.conda#255f9eac03143526c8aed41d1d091c63 https://conda.anaconda.org/conda-forge/linux-64/pyarrow-12.0.1-py311h39c9aba_7_cpu.conda#d513ab8d10ec5f3ee45b419c836195ec @@ -598,7 +598,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r41h133d619_0.conda https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.0-hd8ed1ab_0.conda#ebd31a95a7008b7e164dad9dbbb5bb5a https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.2-pyhd8ed1ab_0.conda#8e765a0eca0ce1cfa889cd9af82a23a8 https://conda.anaconda.org/conda-forge/linux-64/xgboost-1.7.6-cuda118_py311h0be3a32_6.conda#f061993f8ed8ca90d2bb6a547a47109f -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.11.0-pyhd8ed1ab_0.conda#51bd005efab7e5c5c2af2570327bd213 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.12.0-pyhd8ed1ab_0.conda#460d7cac50322a39b61a833885a6a8d5 https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 https://conda.anaconda.org/conda-forge/noarch/psy-maps-1.4.2-pyhd8ed1ab_0.tar.bz2#3ed13103dfd46f71dc870d188bd0b276 https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.4.0-py311h38be061_3.conda#6f7871722c07922028043144e8873b37 @@ -621,8 +621,8 @@ https://conda.anaconda.org/conda-forge/noarch/r-scales-1.2.1-r41hc72bb7e_1.tar.b https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r41ha503ecb_3.conda#2bc51f0d44b98092ba57cf2f8671b490 https://conda.anaconda.org/conda-forge/linux-64/r-splancs-2.01_43-r41h8da6f51_1.tar.bz2#3a6aad0706541141d10e3b514467a080 https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.2-r41ha503ecb_0.conda#1f7610a1863648cab254a9f85bd29dcd -https://conda.anaconda.org/conda-forge/noarch/dask-2023.11.0-pyhd8ed1ab_0.conda#b77d7b91f78b3c50cceb19eb1611a6cf -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.11.0-pyhd8ed1ab_0.conda#e492b36cbea1c83d1663fa73a8abff9b +https://conda.anaconda.org/conda-forge/noarch/dask-2023.12.0-pyhd8ed1ab_0.conda#5cfc00e93b71fba459bede86419d0f01 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.12.0-pyhd8ed1ab_0.conda#364e28ab12477494e72839aaa588073d https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.0-r41hc72bb7e_1005.tar.bz2#800e1da5bf774be48934b8865dd78d33 https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r41hc72bb7e_1004.tar.bz2#71ebed7e976df735ff3443bb88bd154f https://conda.anaconda.org/conda-forge/noarch/r-httr-1.4.6-r41hc72bb7e_0.conda#53dbb769c96782db54bf2d414fc9b239 From 8795e6be27107447404d68ce6b7a6f295f109495 Mon Sep 17 00:00:00 2001 From: Romain Beucher Date: Mon, 11 Dec 2023 23:10:26 +1100 Subject: [PATCH 11/39] Add note for the NSDIC cmoriser (requires PROJ9.3) (#3457) --- doc/sphinx/source/input.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index ed47c96857..4ff7bbb100 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -393,7 +393,7 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | NOAAGlobalTemp | tasa (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| NSIDC-0116-[nh|sh] | usi, vsi (day) | 3 | Python | +| NSIDC-0116-[nh|sh] [#note4]_ | usi, vsi (day) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | OceanSODA-ETHZ | areacello (Ofx), co3os, dissicos, fgco2, phos, spco2, talkos (Omon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ @@ -433,6 +433,10 @@ A list of the datasets for which a CMORizers is available is provided in the fol can be found in the corresponding section of `recipe_check_obs.yml `__. +.. [#note4] The cmoriser requires PROJ>=9.3. Previous version of PROJ will return an error: + ``Internal Proj Error: proj_create: unhandled axis direction: UNKNOWN)`` + You can check the version of PROJ in your conda environment by running: + ``conda list PROJ``. .. _inputdata_native_datasets: From b3e73c9b03fe65b150815288d8dd48c475f5d50c Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Tue, 12 Dec 2023 13:23:22 +0000 Subject: [PATCH 12/39] [CircleCI] allow for medium (vs small, previously) resources for build documentation test (#3459) --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 91cb7c17d3..5be43d58c6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -234,7 +234,7 @@ jobs: # Test building documentation docker: - image: condaforge/mambaforge:latest - resource_class: small + resource_class: medium steps: - checkout - run: From defc2fe75046929c931ba953f061be7138f3b315 Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:27:58 +0100 Subject: [PATCH 13/39] Fixed plot paths in NCL provenance tracking (#3422) Co-authored-by: Klaus Zimmermann --- esmvaltool/diag_scripts/austral_jet/asr.ncl | 2 +- esmvaltool/diag_scripts/austral_jet/main.ncl | 2 +- .../diag_scripts/carbon_ec/carbon_beta.ncl | 6 +----- .../carbon_ec/carbon_co2_cycle.ncl | 6 +----- .../carbon_ec/carbon_constraint.ncl | 2 +- .../carbon_ec/carbon_gammaHist.ncl | 2 +- .../ch12_calc_IAV_for_stippandhatch.ncl | 3 +-- .../diag_scripts/mder/select_for_mder.ncl | 2 +- .../diag_scripts/perfmetrics/collect.ncl | 5 +++-- .../russell18jgr/russell18jgr-fig2.ncl | 2 +- .../russell18jgr/russell18jgr-fig3b-2.ncl | 2 +- .../russell18jgr/russell18jgr-fig3b.ncl | 2 +- .../russell18jgr/russell18jgr-fig4.ncl | 2 +- .../russell18jgr/russell18jgr-fig5.ncl | 2 +- .../russell18jgr/russell18jgr-fig5g.ncl | 2 +- .../russell18jgr/russell18jgr-fig6a.ncl | 2 +- .../russell18jgr/russell18jgr-fig6b.ncl | 2 +- .../russell18jgr/russell18jgr-fig7h.ncl | 2 +- .../russell18jgr/russell18jgr-fig7i.ncl | 2 +- .../russell18jgr/russell18jgr-fig9a.ncl | 2 +- .../russell18jgr/russell18jgr-fig9b.ncl | 2 +- .../russell18jgr/russell18jgr-fig9c.ncl | 2 +- .../russell18jgr/russell18jgr-polar.ncl | 2 +- .../tebaldi21esd/calc_IAV_hatching.ncl | 3 +-- .../diag_scripts/xco2_analysis/delta_T.ncl | 2 +- .../diag_scripts/xco2_analysis/global_maps.ncl | 4 ++-- esmvaltool/diag_scripts/xco2_analysis/main.ncl | 6 +++--- .../diag_scripts/xco2_analysis/panel_plots.ncl | 4 ++-- .../diag_scripts/xco2_analysis/sat_masks.ncl | 4 ++-- .../xco2_analysis/station_comparison.ncl | 6 +++--- esmvaltool/interface_scripts/logging.ncl | 18 +++++++++++++++++- 31 files changed, 56 insertions(+), 49 deletions(-) diff --git a/esmvaltool/diag_scripts/austral_jet/asr.ncl b/esmvaltool/diag_scripts/austral_jet/asr.ncl index c12b66f166..5d855ad393 100644 --- a/esmvaltool/diag_scripts/austral_jet/asr.ncl +++ b/esmvaltool/diag_scripts/austral_jet/asr.ncl @@ -289,7 +289,7 @@ begin work_dir = output@work_dir opt = diag_script_info log_info(opt@wdiag) - plot_path = "missing" + plot_path = "n/a" plot_type = "" ; Iterate over all datasets diff --git a/esmvaltool/diag_scripts/austral_jet/main.ncl b/esmvaltool/diag_scripts/austral_jet/main.ncl index 446133e1d5..c078830687 100644 --- a/esmvaltool/diag_scripts/austral_jet/main.ncl +++ b/esmvaltool/diag_scripts/austral_jet/main.ncl @@ -731,7 +731,7 @@ begin if (output) then work_dir := output@work_dir opt = diag_script_info - plot_path = "missing" + plot_path = "n/a" plot_type = "" ; Iterate over all desired diagnostics diff --git a/esmvaltool/diag_scripts/carbon_ec/carbon_beta.ncl b/esmvaltool/diag_scripts/carbon_ec/carbon_beta.ncl index eb43b10cd3..0d6319ea85 100644 --- a/esmvaltool/diag_scripts/carbon_ec/carbon_beta.ncl +++ b/esmvaltool/diag_scripts/carbon_ec/carbon_beta.ncl @@ -279,11 +279,7 @@ begin create_legend_lines(leg@annots, leg, plot_dir + \ DIAG_SCRIPT + "_legend", "markers") - if (file_type .ne. "png") then - plotname = plot_dir + plot_file + "." + file_type - else - plotname = plot_dir + plot_file + ".000001.png" - end if + plotname = plot_dir + plot_file + "." + file_type ; Call provenance logger log_provenance(ncdf_outfile, \ diff --git a/esmvaltool/diag_scripts/carbon_ec/carbon_co2_cycle.ncl b/esmvaltool/diag_scripts/carbon_ec/carbon_co2_cycle.ncl index 7876ffdb62..f37b7bc23a 100644 --- a/esmvaltool/diag_scripts/carbon_ec/carbon_co2_cycle.ncl +++ b/esmvaltool/diag_scripts/carbon_ec/carbon_co2_cycle.ncl @@ -492,11 +492,7 @@ begin ; Write NetCDF output ncdf_outfile = ncdf_write(CO2var, new_path) - if (file_type .ne. "png") then - plotname = plot_dir + plot_file + "." + file_type - else - plotname = plot_dir + plot_file + ".000001.png" - end if + plotname = plot_dir + plot_file + "." + file_type ; ----------------------------------------------------------- ; Call provenance logger diff --git a/esmvaltool/diag_scripts/carbon_ec/carbon_constraint.ncl b/esmvaltool/diag_scripts/carbon_ec/carbon_constraint.ncl index 94d5b8145c..61f1f5c5a3 100644 --- a/esmvaltool/diag_scripts/carbon_ec/carbon_constraint.ncl +++ b/esmvaltool/diag_scripts/carbon_ec/carbon_constraint.ncl @@ -331,7 +331,7 @@ begin ; Call provenance logger log_provenance(ncdf_outfile, \ - output_dir + "." + file_type, \ + output_dir + plot_file + "." + file_type, \ XStg + " vs " + YStg, \ (/"anomaly", "corr", "stddev"/), \ (/"trop", "global"/),\ diff --git a/esmvaltool/diag_scripts/carbon_ec/carbon_gammaHist.ncl b/esmvaltool/diag_scripts/carbon_ec/carbon_gammaHist.ncl index 1479620173..589b0d72e8 100644 --- a/esmvaltool/diag_scripts/carbon_ec/carbon_gammaHist.ncl +++ b/esmvaltool/diag_scripts/carbon_ec/carbon_gammaHist.ncl @@ -336,7 +336,7 @@ begin ; Call provenance logger log_provenance(ncdf_outfile, \ - output_dir + "." + file_type, \ + output_dir + plot_file + "." + file_type, \ XStg + " vs " + YStg, \ (/"anomaly", "corr", "stddev"/), \ (/"trop", "global"/),\ diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_IAV_for_stippandhatch.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_IAV_for_stippandhatch.ncl index df1ea2375a..e92d60ab43 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_IAV_for_stippandhatch.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_IAV_for_stippandhatch.ncl @@ -410,7 +410,6 @@ begin ; collect meta-data nc_file = ncdf_outfile - plot_file = work_dir + "/None" caption = "Inter-annual variability based on piControl runs." statistics = ("var") domains = ("global") @@ -418,7 +417,7 @@ begin authors = (/"lorenz_ruth"/) references = (/"collins13ipcc"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, "n/a", caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/mder/select_for_mder.ncl b/esmvaltool/diag_scripts/mder/select_for_mder.ncl index 8c9198a8f6..d07cda657f 100644 --- a/esmvaltool/diag_scripts/mder/select_for_mder.ncl +++ b/esmvaltool/diag_scripts/mder/select_for_mder.ncl @@ -97,7 +97,7 @@ begin AUTHORS = (/"wenzel_sabrina", "schlund_manuel"/) DOMAIN = diag_script_info@domain PLOT_TYPE = "" - PLOT_FILE = "missing" + PLOT_FILE = "n/a" REFERENCES = (/"wenzel16jclim"/) ; Get reference dataset(s) diff --git a/esmvaltool/diag_scripts/perfmetrics/collect.ncl b/esmvaltool/diag_scripts/perfmetrics/collect.ncl index 503a9c50d8..a2b14ab733 100644 --- a/esmvaltool/diag_scripts/perfmetrics/collect.ncl +++ b/esmvaltool/diag_scripts/perfmetrics/collect.ncl @@ -502,8 +502,9 @@ begin domains = (/"global"/) ; Call provenance logger - log_provenance(ncdf_outfile, plotpath, caption, statistics, domains, \ - plottype, authors, references, data_files) + log_provenance(ncdf_outfile, plotpath + "." + file_type, caption, \ + statistics, domains, plottype, authors, references, \ + data_files) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl index aa0db4d6a6..034d3a1287 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl @@ -158,7 +158,7 @@ begin ; Call provenance logger log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + output_type(), \ "Russell et al 2018 figure 2", \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl index c182468947..c912663321 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl @@ -274,7 +274,7 @@ begin delete(last_index) delete(out_var) log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + output_type(), \ "Russell et al 2018 figure 3b part 2", \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl index 0b6b9d155f..fd4cf3f43b 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl @@ -264,7 +264,7 @@ begin delete(last_index) delete(out_var) log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + output_type(), \ "Russell et al 2018 figure 3b", \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl index 10f94a62b2..4e62c7b552 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl @@ -368,7 +368,7 @@ begin delete(totaltransport) ; Call provenance logger log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + file_type, \ "Russell et al 2018 figure 4", \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl index bddd26791b..5a60ea03d9 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl @@ -169,7 +169,7 @@ begin delete(dataset) log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + output_type(), \ "Russell et al 2018 figure 5 -polar", \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl index 128fb25f43..67d8c53491 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl @@ -226,7 +226,7 @@ begin ; Call provenance logger log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + output_type(), \ "Russell et al 2018 figure 5g", \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl index 29bbe4ace7..206d2909cc 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl @@ -699,7 +699,7 @@ begin ncdf_outfile = ncdf_write(out_var, nc_filename) log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + output_type(), \ "Russell et al 2018 figure 6 part a", \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl index bbbf72c72d..2287b62adf 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl @@ -678,7 +678,7 @@ begin ncdf_outfile = ncdf_write(out_var, nc_filename) log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + output_type(), \ "Russell et al 2018 figure 6b", \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl index 4a698f455e..249712d29f 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl @@ -164,7 +164,7 @@ begin delete(var_lon_avg) delete(dataset) log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + output_type(), \ "Russell et al 2018 figure 7h", \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl index dd56bd4a41..7abcc9e7a9 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl @@ -202,7 +202,7 @@ begin end if log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + output_type(), \ "Russell et al 2018 figure 7i", \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl index 99cf97b2ce..8bef8cb204 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl @@ -317,7 +317,7 @@ begin ncdf_outfile = ncdf_write(outvar, nc_filename) log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + output_type(), \ "Russell et al 2018 figure 9a", \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl index bade43d9cf..8afd05425a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl @@ -335,7 +335,7 @@ begin ncdf_outfile = ncdf_write(outvar, nc_filename) log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + output_type(), \ "Russell et al 2018 figure 9b", \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl index e669bac579..0e5c828a6a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl @@ -331,7 +331,7 @@ begin ncdf_outfile = ncdf_write(outvar, nc_filename) log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + output_type(), \ "Russell et al 2018 figure 9c", \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl index e01771babf..b9c8f1faaa 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl @@ -232,7 +232,7 @@ begin ncdf_outfile = ncdf_write(dataset, nc_filename) delete(dataset) log_provenance(ncdf_outfile, \ - plotpath, \ + plotpath + "." + output_type(), \ "Russell et al 2018 polar plot " + var0, \ "mean", \ "sh", \ diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_IAV_hatching.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_IAV_hatching.ncl index 8484a00871..f8f0d83511 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_IAV_hatching.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_IAV_hatching.ncl @@ -399,7 +399,6 @@ begin ; collect meta-data nc_file = ncdf_outfile - plot_file = plot_dir + "/None" caption = "Inter-annual variability based on piControl runs." statistics = ("var") domains = ("global") @@ -407,7 +406,7 @@ begin authors = (/"lorenz_ruth"/) references = (/"collins13ipcc"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, "n/a", caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/xco2_analysis/delta_T.ncl b/esmvaltool/diag_scripts/xco2_analysis/delta_T.ncl index af7498d75b..f83f56cb31 100644 --- a/esmvaltool/diag_scripts/xco2_analysis/delta_T.ncl +++ b/esmvaltool/diag_scripts/xco2_analysis/delta_T.ncl @@ -332,7 +332,7 @@ begin ncdf_outfile = ncdf_write(delta_t_detr, outfile_netcdf_dtgr_detr) log_provenance(ncdf_outfile, \ - outfile_netcdf_dtgr_detr, \ + outfile_dtgr_detr + "." + file_type, \ "Sensitivity of interannual variability of " \ + var0 + " growth rate in the " + region + ", " + \ start_year + "-" + end_year + "to the interannual " \ diff --git a/esmvaltool/diag_scripts/xco2_analysis/global_maps.ncl b/esmvaltool/diag_scripts/xco2_analysis/global_maps.ncl index 9aa205db32..d1748425d4 100644 --- a/esmvaltool/diag_scripts/xco2_analysis/global_maps.ncl +++ b/esmvaltool/diag_scripts/xco2_analysis/global_maps.ncl @@ -472,7 +472,7 @@ begin ; Provenance log_provenance(ncdf_outfile, \ - outfile, \ + outfile + "." + file_type, \ "Maps of mean Seasonal Cycle Amplitude of " + var0 + " " \ + DATASETS(imod) + " for " + start_year + "-" \ + end_year + ". Top: SCA with observational sampling (left)" \ @@ -587,7 +587,7 @@ begin ; Provenance log_provenance(ncdf_outfile, \ - outfile_scap, \ + outfile_scap + "." + file_type, \ "Maps of mean Seasonal Cycle Amplitude of " \ + var0 + " for " + start_year + "-" \ + end_year + ". Similar to Gier et al 2020, Fig 5.", \ diff --git a/esmvaltool/diag_scripts/xco2_analysis/main.ncl b/esmvaltool/diag_scripts/xco2_analysis/main.ncl index 8f585e5f62..0739e52edb 100644 --- a/esmvaltool/diag_scripts/xco2_analysis/main.ncl +++ b/esmvaltool/diag_scripts/xco2_analysis/main.ncl @@ -438,7 +438,7 @@ begin ; Provenance log_provenance(ncdf_outfile, \ - outfile_ts_panels, \ + outfile_ts_panels + "." + file_type, \ "Timeseries, growth rate and seasonal cycle of " \ + var0 + " for " + region + ", " + start_year + "-" \ + end_year + ". Using masking: " + opt_mask \ @@ -550,7 +550,7 @@ begin ; Provenance log_provenance(ncdf_outfile, \ - outfile_grbp, \ + outfile_grbp + "." + file_type, \ "Growth Rate histogram of " \ + var0 + " for " + region + ", " + start_year + "-" \ + end_year + ". Using masking: " + opt_mask \ @@ -653,7 +653,7 @@ begin ; Provenance log_provenance(ncdf_outfile, \ - outfile_sabp, \ + outfile_sabp + "." + file_type, \ "Seasonal Cycle Amplitude histogram of " \ + var0 + " for " + region + ", " + start_year + "-" \ + end_year + ". Using masking: " + opt_mask, \ diff --git a/esmvaltool/diag_scripts/xco2_analysis/panel_plots.ncl b/esmvaltool/diag_scripts/xco2_analysis/panel_plots.ncl index bcd4c82002..08fe30ad0f 100644 --- a/esmvaltool/diag_scripts/xco2_analysis/panel_plots.ncl +++ b/esmvaltool/diag_scripts/xco2_analysis/panel_plots.ncl @@ -360,7 +360,7 @@ begin ; Provenance log_provenance(ncdf_outfile, \ - outfile_scaplot, \ + outfile_scaplot + "." + file_type, \ "Trend of Seasonal Cycle Amplitude with " \ + var0 + " for " + region + ", " + start_year + "-" \ + end_year + ". Using masking: " + opt_mask \ @@ -391,7 +391,7 @@ begin ; Provenance log_provenance(ncdf_outfile, \ - outfile_grplot, \ + outfile_grplot + "." + file_type, \ "Trend of Growth Rate with " \ + var0 + " for " + region + ", " + start_year + "-" \ + end_year + ". Using masking: " + opt_mask \ diff --git a/esmvaltool/diag_scripts/xco2_analysis/sat_masks.ncl b/esmvaltool/diag_scripts/xco2_analysis/sat_masks.ncl index c54df52d90..2bed5c74a6 100644 --- a/esmvaltool/diag_scripts/xco2_analysis/sat_masks.ncl +++ b/esmvaltool/diag_scripts/xco2_analysis/sat_masks.ncl @@ -258,7 +258,7 @@ begin ; Provenance log_provenance(ncdf_outfile, \ - outfile, \ + outfile + "." + file_type, \ var0 + "fractional data coverage " + start_year + "-" \ + end_year + ". Similar to Gier et al 2020, Fig 1.", \ (/"mean"/), \ @@ -377,7 +377,7 @@ begin delete(res) log_provenance(ncdf_outfile, \ - outfile_c3s, \ + outfile_c3s + "." + file_type, \ var0 + "fractional data coverage for different obs " \ + "periods. Similar to Gier et al 2020, Fig 8.", \ (/"mean"/), \ diff --git a/esmvaltool/diag_scripts/xco2_analysis/station_comparison.ncl b/esmvaltool/diag_scripts/xco2_analysis/station_comparison.ncl index 53734d94db..23155e36fa 100644 --- a/esmvaltool/diag_scripts/xco2_analysis/station_comparison.ncl +++ b/esmvaltool/diag_scripts/xco2_analysis/station_comparison.ncl @@ -285,7 +285,7 @@ begin ; Provenance log_provenance(ncdf_outfile, \ - outfile_stations_masked, \ + outfile_stations_masked + "." + file_type, \ "Time series of station " + station_array&station(istat) \ + ", dotted denoting areas masked like observations.", \ (/""/), \ @@ -334,7 +334,7 @@ begin ; Provenance log_provenance(ncdf_outfile, \ - outfile_stations_obs, \ + outfile_stations_obs + "." + file_type, \ "Time series of station " + station_array&station(istat) \ + ", for " + var0 + " and " + var1 + ".", \ (/"mean"/), \ @@ -501,7 +501,7 @@ begin ; Provenance log_provenance(ncdf_outfile, \ - outfile_map, \ + outfile_map + "." + file_type, \ "Time series for satellite, multi-model mean and station " \ + var0 + " and " + var1 \ + ". Similar to Gier et al, 2020 Fig. 2", \ diff --git a/esmvaltool/interface_scripts/logging.ncl b/esmvaltool/interface_scripts/logging.ncl index 3e1b10b0b2..4cb5ff1498 100644 --- a/esmvaltool/interface_scripts/logging.ncl +++ b/esmvaltool/interface_scripts/logging.ncl @@ -336,6 +336,12 @@ begin if (outfile .ne. "n/a") then suffix = get_file_suffix(outfile, 0) + if (ismissing(suffix)) then + error_msg("f", scriptname, funcname, "got invalid value for outfile " + \ + "(path to figure): '" + outfile + "'; expected path to a " + \ + "file or 'n/a'") + end if + ; For PNGs, additionally check for existence of files like ; "plot_file.000001.png", "plot_file.000002.png", etc. and save ; provenance record for each of them @@ -354,7 +360,10 @@ begin break end if end do - else + end if + + ; For all other cases, use outfile + if (.not. isvar("all_outfiles")) then all_outfiles = outfile end if @@ -362,6 +371,13 @@ begin original_entry = outstring do outfile_idx = 0, dimsizes(all_outfiles) - 1 file_to_add := all_outfiles(outfile_idx) + if (.not. fileexists(outfile)) then + error_msg("f", scriptname, funcname, "outfile (path to figure) '" + \ + file_to_add + "' does not exist (for PNGs, this " + \ + "function also searches for 'FILE.000001.png', " + \ + "'FILE.000002.png', etc.); if no plot file is available " + \ + "use 'n/a'") + end if new_entry = (/original_entry/) new_entry(0) = "? " + file_to_add outstring := array_append_record(outstring, new_entry, 0) From 8d8d4d9a51484e773d6b04fe7567d5c40eaa8709 Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Thu, 30 Nov 2023 13:20:07 +0100 Subject: [PATCH 14/39] Correctly handle `~` when reading `plot_folder` option of monitoring diagnostic (#3449) --- esmvaltool/diag_scripts/monitor/monitor_base.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/esmvaltool/diag_scripts/monitor/monitor_base.py b/esmvaltool/diag_scripts/monitor/monitor_base.py index 135027f374..21dc159619 100644 --- a/esmvaltool/diag_scripts/monitor/monitor_base.py +++ b/esmvaltool/diag_scripts/monitor/monitor_base.py @@ -97,7 +97,9 @@ def __init__(self, config): ) plot_folder = plot_folder.replace('{plot_dir}', self.cfg[names.PLOT_DIR]) - self.plot_folder = os.path.abspath(plot_folder) + self.plot_folder = os.path.abspath( + os.path.expandvars(os.path.expanduser(plot_folder)) + ) self.plot_filename = config.get( 'plot_filename', '{plot_type}_{real_name}_{dataset}_{mip}_{exp}_{ensemble}') @@ -293,11 +295,7 @@ def get_plot_folder(self, var_info): 'real_name': self._real_name(var_info['variable_group']), **var_info } - folder = os.path.expandvars( - os.path.expanduser( - list(_replace_tags(self.plot_folder, info))[0] - ) - ) + folder = list(_replace_tags(self.plot_folder, info))[0] if self.plot_folder.startswith('/'): folder = '/' + folder if not os.path.isdir(folder): From b1c622875bcbc7806c23855b7bb28de98d9f5740 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Thu, 14 Dec 2023 16:08:20 +0100 Subject: [PATCH 15/39] Fix obs4MIPs frequency in recipe_bock20jgr_fig_1-4.yml (#3473) --- esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_1-4.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_1-4.yml b/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_1-4.yml index 1ae9066ec3..07475e5d74 100644 --- a/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_1-4.yml +++ b/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_1-4.yml @@ -445,7 +445,11 @@ diagnostics: end_year: 1999 additional_datasets: *cmip3_tas additional_datasets: - - {dataset: GPCP-V2.3, project: obs4MIPs, tier: 1, mip: Amon} + - dataset: GPCP-V2.3 + project: obs4MIPs + tier: 1 + mip: Amon + frequency: mon scripts: model_bias: <<: *model_bias_settings From 4cbb24636a821c5a1dc7e5bff114625eaba6d8d7 Mon Sep 17 00:00:00 2001 From: Klaus Zimmermann Date: Thu, 14 Dec 2023 16:13:38 +0100 Subject: [PATCH 16/39] Fix erroneous file_type handling in certain NCL diagnostics (#3474) --- ...12_calc_zonal_cont_diff_mmm_stippandhatch.ncl | 7 ------- .../ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl | 7 ------- .../ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl | 12 ++---------- .../ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl | 6 ------ .../ipcc_ar5/ch12_snw_area_change_fig12-32.ncl | 7 ------- .../ipcc_ar5/ch12_ts_line_mean_spread.ncl | 7 ------- .../tebaldi21esd/calc_table_changes.ncl | 7 ------- .../tebaldi21esd/calc_table_warming_level.ncl | 7 ------- ...meseries_across_realization_stddev_runave.ncl | 7 ------- .../calc_timeseries_mean_spread_runave.ncl | 7 ------- .../calc_timeseries_mean_spread_ssp4.ncl | 7 ------- .../calc_timeseries_mean_spread_ssp5.ncl | 7 ------- .../diag_scripts/tebaldi21esd/plot_pattern.ncl | 7 ------- .../tebaldi21esd/plot_table_changes.ncl | 12 ++---------- .../tebaldi21esd/plot_table_warming_level.ncl | 12 ++---------- ...meseries_across_realization_stddev_runave.ncl | 16 ++++------------ .../tebaldi21esd/plot_timeseries_mean_spread.ncl | 12 ++---------- .../plot_timeseries_mean_spread_3scenarios.ncl | 12 ++---------- ...eries_mean_spread_constrained_projections.ncl | 12 ++---------- ...ot_timeseries_mean_spread_rightaxis_5scen.ncl | 12 ++---------- .../plot_timeseries_mean_spread_ssp4.ncl | 12 ++---------- .../plot_timeseries_mean_spread_ssp5.ncl | 12 ++---------- 22 files changed, 22 insertions(+), 185 deletions(-) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_zonal_cont_diff_mmm_stippandhatch.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_zonal_cont_diff_mmm_stippandhatch.ncl index 1952cff668..dbe89529b6 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_zonal_cont_diff_mmm_stippandhatch.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_zonal_cont_diff_mmm_stippandhatch.ncl @@ -78,13 +78,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl index 720840ff12..77f6441f59 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl @@ -51,13 +51,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl index 838888ae74..20a5e277ea 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl @@ -48,13 +48,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -251,11 +244,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -279,7 +271,7 @@ begin authors = (/"lorenz_ruth"/) references = (/"collins13ipcc"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl index e58ae142c7..261082f79f 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl @@ -48,12 +48,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_snw_area_change_fig12-32.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_snw_area_change_fig12-32.ncl index 51c0dcc787..4834f5ccf0 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_snw_area_change_fig12-32.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_snw_area_change_fig12-32.ncl @@ -66,13 +66,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_ts_line_mean_spread.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_ts_line_mean_spread.ncl index c47902d8bb..e488d3a07f 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_ts_line_mean_spread.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_ts_line_mean_spread.ncl @@ -47,13 +47,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_table_changes.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_table_changes.ncl index a2fc676d9b..0064e2da01 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_table_changes.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_table_changes.ncl @@ -53,13 +53,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_table_warming_level.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_table_warming_level.ncl index 01fb0b5c41..942a725275 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_table_warming_level.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_table_warming_level.ncl @@ -55,13 +55,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_across_realization_stddev_runave.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_across_realization_stddev_runave.ncl index 4e772935e7..5cf278a046 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_across_realization_stddev_runave.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_across_realization_stddev_runave.ncl @@ -56,13 +56,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_runave.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_runave.ncl index e3c92d5458..ceda4512fb 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_runave.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_runave.ncl @@ -55,13 +55,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp4.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp4.ncl index a64e5204ef..74baee5d88 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp4.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp4.ncl @@ -54,13 +54,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp5.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp5.ncl index 938158d37d..0ec3479508 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp5.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp5.ncl @@ -54,13 +54,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_pattern.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_pattern.ncl index 109975882b..cd5aeb93c6 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_pattern.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_pattern.ncl @@ -58,13 +58,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_table_changes.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_table_changes.ncl index 115d04b130..60b1e731be 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_table_changes.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_table_changes.ncl @@ -57,13 +57,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -159,13 +152,12 @@ begin gsn_table(wks, ncr4, x4, y4, text4, res4) draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; Collect meta-data netcdf_dir = diag_script_info@input_files(1) datapath = netcdf_dir + "/" + variable_info[0]@diagnostic + ".nc" nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type caption = "Table of global annual mean" + \ variable_info[0]@long_name + " anomalies (relative to " + \ diag_script_info@begin_ref_year + "-" + diag_script_info@end_ref_year + \ @@ -177,7 +169,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") end diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_table_warming_level.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_table_warming_level.ncl index 2d7da64ac5..4bd691b6ea 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_table_warming_level.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_table_warming_level.ncl @@ -55,13 +55,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -160,13 +153,12 @@ begin gsn_table(wks, ncr4, x4, y4, text4, res4) draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; Collect meta-data netcdf_dir = diag_script_info@input_files(1) datapath = netcdf_dir + "/" + variable_info[0]@diagnostic + ".nc" nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type caption = text4 statistics = ("mean") domains = ("global") @@ -174,7 +166,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_across_realization_stddev_runave.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_across_realization_stddev_runave.ncl index 04f3f90dab..c562115c2c 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_across_realization_stddev_runave.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_across_realization_stddev_runave.ncl @@ -57,13 +57,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -108,9 +101,9 @@ begin ; *********** PLOTTING ************ ; Create plot variables outfile = var0 + "_ts_line_" + syears(0) + "_" + eyears(nperiods - 1) - wks_type = file_type + wks_type = 0 wks_type@wkPaperSize = "A4" - wks = gsn_open_wks(wks_type, plot_dir + outfile) + wks = get_wks(wks_type, DIAG_SCRIPT, outfile) if(isatt(diag_script_info, "colormap")) then colormap = RGBtoCmap(diag_script_info@colormap) else @@ -229,18 +222,17 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type statistics = ("stddev") domains = ("global") plot_types = ("times") authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread.ncl index 8caaf9c62f..780de8a235 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread.ncl @@ -55,13 +55,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -265,11 +258,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -282,7 +274,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_3scenarios.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_3scenarios.ncl index c95da587a4..6311d01782 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_3scenarios.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_3scenarios.ncl @@ -55,13 +55,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -261,11 +254,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -278,7 +270,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_constrained_projections.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_constrained_projections.ncl index 938804358a..0254d53e03 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_constrained_projections.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_constrained_projections.ncl @@ -67,13 +67,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -334,11 +327,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -351,7 +343,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_rightaxis_5scen.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_rightaxis_5scen.ncl index 475f9cbf56..72990171bc 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_rightaxis_5scen.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_rightaxis_5scen.ncl @@ -58,13 +58,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -279,11 +272,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -296,7 +288,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp4.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp4.ncl index 4162ec01c4..be50e29bb2 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp4.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp4.ncl @@ -55,13 +55,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -268,11 +261,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -285,7 +277,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp5.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp5.ncl index edbf881e49..9570b09ae4 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp5.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp5.ncl @@ -55,13 +55,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -253,11 +246,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -270,7 +262,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") From ba04b92bc57056324c373e9eb899b9a3ca5e1133 Mon Sep 17 00:00:00 2001 From: Klaus Zimmermann Date: Thu, 14 Dec 2023 16:13:38 +0100 Subject: [PATCH 17/39] Fix erroneous file_type handling in certain NCL diagnostics (#3474) --- ...12_calc_zonal_cont_diff_mmm_stippandhatch.ncl | 7 ------- .../ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl | 7 ------- .../ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl | 12 ++---------- .../ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl | 6 ------ .../ipcc_ar5/ch12_snw_area_change_fig12-32.ncl | 7 ------- .../ipcc_ar5/ch12_ts_line_mean_spread.ncl | 7 ------- .../tebaldi21esd/calc_table_changes.ncl | 7 ------- .../tebaldi21esd/calc_table_warming_level.ncl | 7 ------- ...meseries_across_realization_stddev_runave.ncl | 7 ------- .../calc_timeseries_mean_spread_runave.ncl | 7 ------- .../calc_timeseries_mean_spread_ssp4.ncl | 7 ------- .../calc_timeseries_mean_spread_ssp5.ncl | 7 ------- .../diag_scripts/tebaldi21esd/plot_pattern.ncl | 7 ------- .../tebaldi21esd/plot_table_changes.ncl | 12 ++---------- .../tebaldi21esd/plot_table_warming_level.ncl | 12 ++---------- ...meseries_across_realization_stddev_runave.ncl | 16 ++++------------ .../tebaldi21esd/plot_timeseries_mean_spread.ncl | 12 ++---------- .../plot_timeseries_mean_spread_3scenarios.ncl | 12 ++---------- ...eries_mean_spread_constrained_projections.ncl | 12 ++---------- ...ot_timeseries_mean_spread_rightaxis_5scen.ncl | 12 ++---------- .../plot_timeseries_mean_spread_ssp4.ncl | 12 ++---------- .../plot_timeseries_mean_spread_ssp5.ncl | 12 ++---------- 22 files changed, 22 insertions(+), 185 deletions(-) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_zonal_cont_diff_mmm_stippandhatch.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_zonal_cont_diff_mmm_stippandhatch.ncl index 1952cff668..dbe89529b6 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_zonal_cont_diff_mmm_stippandhatch.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_zonal_cont_diff_mmm_stippandhatch.ncl @@ -78,13 +78,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl index 720840ff12..77f6441f59 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl @@ -51,13 +51,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl index 838888ae74..20a5e277ea 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl @@ -48,13 +48,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -251,11 +244,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -279,7 +271,7 @@ begin authors = (/"lorenz_ruth"/) references = (/"collins13ipcc"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl index e58ae142c7..261082f79f 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl @@ -48,12 +48,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_snw_area_change_fig12-32.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_snw_area_change_fig12-32.ncl index 51c0dcc787..4834f5ccf0 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_snw_area_change_fig12-32.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_snw_area_change_fig12-32.ncl @@ -66,13 +66,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_ts_line_mean_spread.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_ts_line_mean_spread.ncl index c47902d8bb..e488d3a07f 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_ts_line_mean_spread.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_ts_line_mean_spread.ncl @@ -47,13 +47,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_table_changes.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_table_changes.ncl index a2fc676d9b..0064e2da01 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_table_changes.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_table_changes.ncl @@ -53,13 +53,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_table_warming_level.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_table_warming_level.ncl index 01fb0b5c41..942a725275 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_table_warming_level.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_table_warming_level.ncl @@ -55,13 +55,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_across_realization_stddev_runave.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_across_realization_stddev_runave.ncl index 4e772935e7..5cf278a046 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_across_realization_stddev_runave.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_across_realization_stddev_runave.ncl @@ -56,13 +56,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_runave.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_runave.ncl index e3c92d5458..ceda4512fb 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_runave.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_runave.ncl @@ -55,13 +55,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp4.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp4.ncl index a64e5204ef..74baee5d88 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp4.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp4.ncl @@ -54,13 +54,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp5.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp5.ncl index 938158d37d..0ec3479508 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp5.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp5.ncl @@ -54,13 +54,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_pattern.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_pattern.ncl index 109975882b..cd5aeb93c6 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_pattern.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_pattern.ncl @@ -58,13 +58,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_table_changes.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_table_changes.ncl index 115d04b130..60b1e731be 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_table_changes.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_table_changes.ncl @@ -57,13 +57,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -159,13 +152,12 @@ begin gsn_table(wks, ncr4, x4, y4, text4, res4) draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; Collect meta-data netcdf_dir = diag_script_info@input_files(1) datapath = netcdf_dir + "/" + variable_info[0]@diagnostic + ".nc" nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type caption = "Table of global annual mean" + \ variable_info[0]@long_name + " anomalies (relative to " + \ diag_script_info@begin_ref_year + "-" + diag_script_info@end_ref_year + \ @@ -177,7 +169,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") end diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_table_warming_level.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_table_warming_level.ncl index 2d7da64ac5..4bd691b6ea 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_table_warming_level.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_table_warming_level.ncl @@ -55,13 +55,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -160,13 +153,12 @@ begin gsn_table(wks, ncr4, x4, y4, text4, res4) draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; Collect meta-data netcdf_dir = diag_script_info@input_files(1) datapath = netcdf_dir + "/" + variable_info[0]@diagnostic + ".nc" nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type caption = text4 statistics = ("mean") domains = ("global") @@ -174,7 +166,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_across_realization_stddev_runave.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_across_realization_stddev_runave.ncl index 04f3f90dab..c562115c2c 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_across_realization_stddev_runave.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_across_realization_stddev_runave.ncl @@ -57,13 +57,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -108,9 +101,9 @@ begin ; *********** PLOTTING ************ ; Create plot variables outfile = var0 + "_ts_line_" + syears(0) + "_" + eyears(nperiods - 1) - wks_type = file_type + wks_type = 0 wks_type@wkPaperSize = "A4" - wks = gsn_open_wks(wks_type, plot_dir + outfile) + wks = get_wks(wks_type, DIAG_SCRIPT, outfile) if(isatt(diag_script_info, "colormap")) then colormap = RGBtoCmap(diag_script_info@colormap) else @@ -229,18 +222,17 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type statistics = ("stddev") domains = ("global") plot_types = ("times") authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread.ncl index 8caaf9c62f..780de8a235 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread.ncl @@ -55,13 +55,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -265,11 +258,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -282,7 +274,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_3scenarios.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_3scenarios.ncl index c95da587a4..6311d01782 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_3scenarios.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_3scenarios.ncl @@ -55,13 +55,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -261,11 +254,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -278,7 +270,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_constrained_projections.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_constrained_projections.ncl index 938804358a..0254d53e03 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_constrained_projections.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_constrained_projections.ncl @@ -67,13 +67,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -334,11 +327,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -351,7 +343,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_rightaxis_5scen.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_rightaxis_5scen.ncl index 475f9cbf56..72990171bc 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_rightaxis_5scen.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_rightaxis_5scen.ncl @@ -58,13 +58,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -279,11 +272,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -296,7 +288,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp4.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp4.ncl index 4162ec01c4..be50e29bb2 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp4.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp4.ncl @@ -55,13 +55,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -268,11 +261,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -285,7 +277,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp5.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp5.ncl index edbf881e49..9570b09ae4 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp5.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp5.ncl @@ -55,13 +55,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -253,11 +246,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -270,7 +262,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") From 2b89bd6611092d5e5a29ef8c917a8c629564570e Mon Sep 17 00:00:00 2001 From: Klaus Zimmermann Date: Thu, 14 Dec 2023 16:32:42 +0100 Subject: [PATCH 18/39] Adapt to changed style scheme name in matplotlib (#3475) --- esmvaltool/recipes/recipe_landcover.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esmvaltool/recipes/recipe_landcover.yml b/esmvaltool/recipes/recipe_landcover.yml index d324c02dc9..75c892b37c 100644 --- a/esmvaltool/recipes/recipe_landcover.yml +++ b/esmvaltool/recipes/recipe_landcover.yml @@ -67,5 +67,5 @@ diagnostics: landcover: script: landcover/landcover.py comparison: variable - colorscheme: seaborn-darkgrid + colorscheme: seaborn-v0_8-darkgrid From 32962f06810c8f894081eababbfd2851b6624e6b Mon Sep 17 00:00:00 2001 From: Klaus Zimmermann Date: Thu, 14 Dec 2023 16:32:42 +0100 Subject: [PATCH 19/39] Adapt to changed style scheme name in matplotlib (#3475) --- esmvaltool/recipes/recipe_landcover.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esmvaltool/recipes/recipe_landcover.yml b/esmvaltool/recipes/recipe_landcover.yml index d324c02dc9..75c892b37c 100644 --- a/esmvaltool/recipes/recipe_landcover.yml +++ b/esmvaltool/recipes/recipe_landcover.yml @@ -67,5 +67,5 @@ diagnostics: landcover: script: landcover/landcover.py comparison: variable - colorscheme: seaborn-darkgrid + colorscheme: seaborn-v0_8-darkgrid From 5390262b0edbb9b1d5d15c66c7240ba7e281b5e2 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Thu, 14 Dec 2023 17:48:48 +0000 Subject: [PATCH 20/39] added obs and obs6 locations and access instructions for JASMIN in documentation (#2385) Co-authored-by: Klaus Zimmermann --- doc/sphinx/source/input.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index 4ff7bbb100..542dea1cb9 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -112,6 +112,13 @@ ESMValTool currently supports two ways to perform this reformatting (aka checks and fixes'). Details on this second method are given at the :ref:`end of this chapter `. +A collection of readily CMORized OBS and OBS6 datasets can be accessed directly on CEDA/JASMIN and DKRZ. At CEDA/JASMIN +OBS and OBS6 data is stored in the `esmeval` Group Workspace (GWS), and to be granted read (and execute) permissions to the +GWS, one must apply at https://accounts.jasmin.ac.uk/services/group_workspaces/esmeval/ ; after permission has been granted, the user +is encouraged to use the data locally, and not move it elsewhere, to minimize both data transfers and +stale disk usage; to note that Tier 3 data is subject to data protection restrictions; for further inquiries, +the GWS is adminstered by [Valeriu Predoi](mailto:valeriu.predoi@ncas.ac.uk). + Using a CMORizer script ----------------------- From b0e3e6c3b810c7fad7012bee100ed10a080d4b0c Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Fri, 15 Dec 2023 11:12:53 +0100 Subject: [PATCH 21/39] Fix NCL provenance tracking (#3477) --- esmvaltool/interface_scripts/logging.ncl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esmvaltool/interface_scripts/logging.ncl b/esmvaltool/interface_scripts/logging.ncl index 4cb5ff1498..6333479f96 100644 --- a/esmvaltool/interface_scripts/logging.ncl +++ b/esmvaltool/interface_scripts/logging.ncl @@ -371,7 +371,7 @@ begin original_entry = outstring do outfile_idx = 0, dimsizes(all_outfiles) - 1 file_to_add := all_outfiles(outfile_idx) - if (.not. fileexists(outfile)) then + if (.not. fileexists(file_to_add)) then error_msg("f", scriptname, funcname, "outfile (path to figure) '" + \ file_to_add + "' does not exist (for PNGs, this " + \ "function also searches for 'FILE.000001.png', " + \ From 54ec50daa2a13d197e5d1267d4ef4e4c9456b3d9 Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Fri, 15 Dec 2023 11:12:53 +0100 Subject: [PATCH 22/39] Fix NCL provenance tracking (#3477) --- esmvaltool/interface_scripts/logging.ncl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esmvaltool/interface_scripts/logging.ncl b/esmvaltool/interface_scripts/logging.ncl index 4cb5ff1498..6333479f96 100644 --- a/esmvaltool/interface_scripts/logging.ncl +++ b/esmvaltool/interface_scripts/logging.ncl @@ -371,7 +371,7 @@ begin original_entry = outstring do outfile_idx = 0, dimsizes(all_outfiles) - 1 file_to_add := all_outfiles(outfile_idx) - if (.not. fileexists(outfile)) then + if (.not. fileexists(file_to_add)) then error_msg("f", scriptname, funcname, "outfile (path to figure) '" + \ file_to_add + "' does not exist (for PNGs, this " + \ "function also searches for 'FILE.000001.png', " + \ From ab2aed766d04fb00990ee0bbf76c9e870efe129a Mon Sep 17 00:00:00 2001 From: Axel Lauer Date: Tue, 19 Dec 2023 09:23:12 +0100 Subject: [PATCH 23/39] Extension of CLARA-AVHRR, CLOUDSAT-L2 and ESACCI-CLOUD CMORizers (#3342) --- doc/sphinx/source/input.rst | 6 +- .../data/formatters/datasets/clara_avhrr.ncl | 59 ++++++++++++++++--- .../data/formatters/datasets/cloudsat_l2.ncl | 53 ++++++++++++----- .../data/formatters/datasets/esacci_cloud.ncl | 27 ++++++--- .../recipes/examples/recipe_check_obs.yml | 4 ++ 5 files changed, 113 insertions(+), 36 deletions(-) diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index 542dea1cb9..af431c5215 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -259,9 +259,9 @@ A list of the datasets for which a CMORizers is available is provided in the fol | CERES-SYN1deg | rlds, rldscs, rlus, rluscs, rlut, rlutcs, rsds, rsdscs, rsus, rsuscs, rsut, rsutcs (3hr) | 3 | NCL | | | rlds, rldscs, rlus, rlut, rlutcs, rsds, rsdt, rsus, rsut, rsutcs (Amon) | | | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| CLARA-AVHRR | clt, clivi, lwp (Amon) | 3 | NCL | +| CLARA-AVHRR | clt, clivi, clwvi, lwp (Amon) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| CLOUDSAT-L2 | clw, clivi, lwp (Amon) | 3 | NCL | +| CLOUDSAT-L2 | clw, clivi, clwvi, lwp (Amon) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | CowtanWay | tasa (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ @@ -288,7 +288,7 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ESACCI-AEROSOL | abs550aer, od550aer, od550aerStderr, od550lt1aer, od870aer, od870aerStderr (aero) | 2 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| ESACCI-CLOUD | clivi, clt, cltStderr, lwp, rlut, rlutcs, rsut, rsutcs, rsdt, rlus, rsus, rsuscs (Amon) | 2 | NCL | +| ESACCI-CLOUD | clivi, clt, cltStderr, clwvi, lwp, rlut, rlutcs, rsut, rsutcs, rsdt, rlus, rsus, rsuscs (Amon) | 2 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ESACCI-FIRE | burntArea (Lmon) | 2 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ diff --git a/esmvaltool/cmorizers/data/formatters/datasets/clara_avhrr.ncl b/esmvaltool/cmorizers/data/formatters/datasets/clara_avhrr.ncl index 05912b7b0e..b275332d48 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/clara_avhrr.ncl +++ b/esmvaltool/cmorizers/data/formatters/datasets/clara_avhrr.ncl @@ -34,6 +34,7 @@ ; 7) Untar all .tar files into a single directory. ; ; Modification history +; 20230818-lauer_axel: added output of clwvi (in addition to iwp, lwp) ; 20210506-lauer_axel: output of lwp instead of clwvi ; 20210323-lauer_axel: written. ; @@ -57,30 +58,31 @@ begin YEAR2 = 2018 ; Selected variable (standard name) - VAR = (/"clt", "clivi", "lwp"/) + VAR = (/"clt", "clivi", "lwp", "clwvi"/) ; Name in the raw data - NAME = (/"cfc", "iwp_allsky", "lwp_allsky"/) + NAME = (/"cfc", "iwp_allsky", "lwp_allsky", "iwp_allsky"/) ; Filename base - FNBASE = (/"CFCmm", "IWPmm", "LWPmm"/) + FNBASE = (/"CFCmm", "IWPmm", "LWPmm", "IWPmm"/) ; Conversion factor ; Remark: total cloud cover (CFC) is reported as "1" but is actually "%" ; IWP and LWP use scale_factor to convert to kg/m2 - ; CONV = (/1., 1., 1./) + ; CONV = (/1., 1., 1., 1./) ; MIP - MIP = (/"Amon", "Amon", "Amon"/) + MIP = (/"Amon", "Amon", "Amon", "Amon"/) ; Frequency - FREQ = (/"mon", "mon", "mon"/) + FREQ = (/"mon", "mon", "mon", "mon"/) ; CMOR table CMOR_TABLE = getenv("cmor_tables") + \ (/"/cmip5/Tables/CMIP5_Amon", \ "/cmip5/Tables/CMIP5_Amon", \ - "/custom/CMOR_lwp.dat"/) + "/custom/CMOR_lwp.dat", \ + "/cmip5/Tables/CMIP5_Amon"/) ; Type TYPE = "sat" @@ -159,17 +161,56 @@ begin output&lat = f->lat output!2 = "lon" output&lon = f->lon + fillval = xx@_FillValue end if output(ind(toint(yy * 100 + mm).eq.date), :, :) = (/xx/) delete(fname) delete(f) - + delete(xx) + + ; *** calculate clwvi (lwp + iwp) *** + + if (VAR(vv) .eq. "clwvi") then + fname = systemfunc("ls " + input_dir_path + "LWPmm" + \ + syear + smonth + "01*.nc") + + ; No files found + if (ismissing(fname)) then + log_info("Warning: input data incomplete for variable " + \ + VAR(vv) + " (" + syear + smonth + ")") + continue + end if + + ; Extract data + f = addfile(fname, "r") + val = f->lwp_allsky + if (isatt(val, "scale_factor")) then + scalefac = tofloat(val@scale_factor) + else + scalefac = 1.0 + end if + if (isatt(val, "add_offset")) then + offset = tofloat(val@add_offset) + else + offset = 0.0 + end if + xx = tofloat(val) * scalefac + offset + delete(val) + + idx = ind(toint(yy * 100 + mm).eq.date) + output(idx, :, :) = output(idx, :, :) + (/xx(0, :, :)/) + + delete(idx) + delete(xx) + delete(fname) + delete(f) + end if ; if VAR(vv) .eq. "clwvi" end do end do ; Set fill value - output = where(output.eq.xx@_FillValue, output@_FillValue, output) + output = where(output.eq.fillval, output@_FillValue, output) ; Format coordinates output!0 = "time" diff --git a/esmvaltool/cmorizers/data/formatters/datasets/cloudsat_l2.ncl b/esmvaltool/cmorizers/data/formatters/datasets/cloudsat_l2.ncl index f056ac4de6..d26ed74cd6 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/cloudsat_l2.ncl +++ b/esmvaltool/cmorizers/data/formatters/datasets/cloudsat_l2.ncl @@ -58,6 +58,7 @@ ; --end=2015 CLOUDSAT-L2 ; ; Modification history +; 20230904-lauer_axel: added output of clwvi (iwp + lwp) ; 20220809-lauer_axel: adapted CMORizer to new format introduced in ; ESMValTool v2.5.0 and added info message ; 20210924-lauer_axel: added processing of lwp and iwp @@ -100,12 +101,13 @@ begin end if ; output variable (standard name) - outvar = (/"clw", "lwp", "clivi"/) + outvar = (/"clw", "lwp", "clivi", "clwvi"/) ; input variables var = (/"LO_RO_liquid_water_content_2B_CWC_RO", \ "LO_RO_liquid_water_path_2B_CWC_RO", \ - "IO_RO_ice_water_path_2B_CWC_RO"/) + "IO_RO_ice_water_path_2B_CWC_RO", \ + "dummy"/) var_flag = "Precip_flag_2C_PRECIP_COLUMN" @@ -120,6 +122,7 @@ begin CMOR_TABLE = getenv("cmor_tables") + \ (/"/cmip5/Tables/CMIP5_" + mip, \ "/custom/CMOR_lwp.dat", \ + "/cmip5/Tables/CMIP5_" + mip, \ "/cmip5/Tables/CMIP5_" + mip/) ; Type @@ -168,26 +171,26 @@ begin grid = new((/nt, nz, ny, nx/), float) gridpts = new((/nt, nz, ny, nx/), integer) - grid2d = new((/nt, 2, ny, nx/), float) - gridpts2d = new((/nt, 2, ny, nx/), integer) + grid2d = new((/nt, 3, ny, nx/), float) + gridpts2d = new((/nt, 3, ny, nx/), integer) ; "grid-box average" (all points) grid_avg = new((/nt, nz, ny, nx/), float) gridpts_avg = new((/nt, nz, ny, nx/), integer) - grid2d_avg = new((/nt, 2, ny, nx/), float) - gridpts2d_avg = new((/nt, 2, ny, nx/), integer) + grid2d_avg = new((/nt, 3, ny, nx/), float) + gridpts2d_avg = new((/nt, 3, ny, nx/), integer) ; "in-cloud" (no precipitation) grid_noprecip = new((/nt, nz, ny, nx/), float) gridpts_noprecip = new((/nt, nz, ny, nx/), integer) - grid2d_noprecip = new((/nt, 2, ny, nx/), float) - gridpts2d_noprecip = new((/nt, 2, ny, nx/), integer) + grid2d_noprecip = new((/nt, 3, ny, nx/), float) + gridpts2d_noprecip = new((/nt, 3, ny, nx/), integer) ; "grid-box average" (no precipitation) grid_avg_noprecip = new((/nt, nz, ny, nx/), float) gridpts_avg_noprecip = new((/nt, nz, ny, nx/), integer) - grid2d_avg_noprecip = new((/nt, 2, ny, nx/), float) - gridpts2d_avg_noprecip = new((/nt, 2, ny, nx/), integer) + grid2d_avg_noprecip = new((/nt, 3, ny, nx/), float) + gridpts2d_avg_noprecip = new((/nt, 3, ny, nx/), integer) ; boundaries of vertical (height) bins @@ -491,23 +494,29 @@ begin delete(lon_ext) delete(hgt1d) - ; =================================== - ; 2-dim cloud liquid / ice water path - ; =================================== + ; ============================================================ + ; 2-dim cloud liquid / ice water path / total cloud water path + ; ============================================================ - do ivar = 1, 2 + do ivar = 1, 3 if (outvar(ivar) .eq. "lwp") then x = l1d ilev = 0 else if (outvar(ivar) .eq. "clivi") then x = i1d ilev = 1 + else if (outvar(ivar) .eq. "clwvi") then + ; clwvi is calculated from the *output* fields of lwp and iwp + ; to make sure it is the sum of the two (masking, etc.) + ; --> nothing to do here + continue else log_info("Warning: output variable unknown: " + outvar(ivar) + \ ", skipping variable " + outvar(ivar) + ".") continue end if end if + end if ; Find all elements that contain valid (x > 0) or missing (x = 0) ; values; invalid values (x < 0) are filtered out. @@ -746,11 +755,23 @@ begin ; save results to files - do ivar = 1, 2 + do ivar = 1, 3 if (outvar(ivar) .eq. "lwp") then ilev = 0 else if (outvar(ivar) .eq. "clivi") then ilev = 1 + else if (outvar(ivar) .eq. "clwvi") then + ; calculate clwvi (lwp+iwp) as sum of output fields for lwp and iwp + ilev = 2 + grid2d(:, ilev, :, :) = grid2d(:, 0, :, :) \ + + grid2d(:, 1, :, :) + grid2d_avg(:, ilev, :, :) = grid2d_avg(:, 0, :, :) \ + + grid2d_avg(:, 1, :, :) + grid2d_noprecip(:, ilev, :, :) = grid2d_noprecip(:, 0, :, :) \ + + grid2d_noprecip(:, 1, :, :) + grid2d_avg_noprecip(:, ilev, :, :) = grid2d_avg_noprecip(:, 0, :, :) \ + + grid2d_avg_noprecip(:, 1, :, :) + end if end if end if @@ -842,7 +863,7 @@ begin write_nc(fout, outvar(ivar), output, bounds, gAtt) delete(output) delete(gAtt) - end do ; loop over implemented 2-dim variables (lwp, iwp) + end do ; loop over implemented 2-dim variables (lwp, iwp, lwp+iwp) end do ; loop over years end diff --git a/esmvaltool/cmorizers/data/formatters/datasets/esacci_cloud.ncl b/esmvaltool/cmorizers/data/formatters/datasets/esacci_cloud.ncl index 10cf50a2a7..b19ae0b865 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/esacci_cloud.ncl +++ b/esmvaltool/cmorizers/data/formatters/datasets/esacci_cloud.ncl @@ -22,11 +22,12 @@ ; --reject="index.html*" ; https://public.satproj.klima.dwd.de/data/ESA_Cloud_CCI/ ; CLD_PRODUCTS/v3.0/L3C/AVHRR-PM/ - +; ; All files are expected in a single directory (no subdirectories ; with years). ; ; Modification history +; 20230818-lauer_axel: added output of clwvi (in addition to iwp, lwp) ; 20210428-lauer_axel: AVHRR-AM and AVHRR-PM data are now averaged during ; the overlapping time; TOA radiative fluxes are now ; also processed @@ -56,24 +57,25 @@ begin YEAR2 = get_year(end_year, 2016) ; Selected variable (standard name) - VAR = (/"clt", "cltStderr", "clivi", "lwp", "rlut", "rlutcs", \ + VAR = (/"clt", "cltStderr", "clivi", "lwp", "clwvi", "rlut", "rlutcs", \ "rsut", "rsutcs", "rsdt", "rlus", "rsus", "rsuscs"/) ; Name in the raw data - NAME = (/"cfc", "cfc_unc", "iwp_allsky", "lwp_allsky", "toa_lwup", \ - "toa_lwup_clr", "toa_swup", "toa_swup_clr", "toa_swdn", \ - "boa_lwup", "boa_swup", "boa_swup_clr"/) + NAME = (/"cfc", "cfc_unc", "iwp_allsky", "lwp_allsky", "iwp_allsky", \ + "toa_lwup", "toa_lwup_clr", "toa_swup", "toa_swup_clr", \ + "toa_swdn", "boa_lwup", "boa_swup", "boa_swup_clr"/) ; Conversion factor - CONV = (/100., 1., 0.001, 0.001, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0/) + CONV = (/100., 1., 0.001, 0.001, 0.001, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, \ + 1.0, 1.0/) ; MIP MIP = (/"Amon", "Amon", "Amon", "Amon", "Amon", "Amon", "Amon", "Amon", \ - "Amon", "Amon", "Amon", "Amon"/) + "Amon", "Amon", "Amon", "Amon", "Amon"/) ; Frequency FREQ = (/"mon", "mon", "mon", "mon", "mon", "mon", "mon", "mon", "mon", \ - "mon", "mon", "mon"/) + "mon", "mon", "mon", "mon"/) ; CMOR table CMOR_TABLE = getenv("cmor_tables") + \ @@ -88,6 +90,7 @@ begin "/cmip5/Tables/CMIP5_Amon", \ "/cmip5/Tables/CMIP5_Amon", \ "/cmip5/Tables/CMIP5_Amon", \ + "/cmip5/Tables/CMIP5_Amon", \ "/cmip5/Tables/CMIP5_Amon"/) ; Type @@ -151,6 +154,13 @@ begin ; Convert units xx_all(i, :, :, :) = xx * CONV(vv) + ; *** calculate clwvi (lwp + iwp) *** + if (VAR(vv) .eq. "clwvi") then + xx2 = f->lwp_allsky * 0.001 + xx_all(i, :, :, :) = xx_all(i, :, :, :) + xx2 + delete(xx2) + end if + if (firstime) then lat = f->lat lon = f->lon @@ -161,6 +171,7 @@ begin delete(fname) delete(xx) + xx = dim_avg_n(xx_all, 0) ; ignore missing values delete(xx_all) diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index 9a9e080b52..8998a5a157 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -167,6 +167,7 @@ diagnostics: clivi: clt: cltStderr: + clwvi: lwp: rlut: rlutcs: @@ -1083,6 +1084,8 @@ diagnostics: mip: Amon clivi: mip: Amon + clwvi: + mip: Amon lwp: mip: Amon additional_datasets: @@ -1096,6 +1099,7 @@ diagnostics: variables: clivi: clw: + clwvi: lwp: additional_datasets: - {dataset: CLOUDSAT-L2, project: OBS, tier: 3, type: sat, From a93f710bc477d0fb2cb916bf16931b51f3cdb5b9 Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Tue, 19 Dec 2023 09:33:33 +0100 Subject: [PATCH 24/39] Fix plots and provenance in Russell diagnostics (#3479) Co-authored-by: Axel Lauer --- .../russell18jgr/russell18jgr-fig2.ncl | 26 ++++++++++--------- .../russell18jgr/russell18jgr-fig3b-2.ncl | 23 +++++++++------- .../russell18jgr/russell18jgr-fig3b.ncl | 23 +++++++++------- .../russell18jgr/russell18jgr-fig4.ncl | 23 ++++++++-------- .../russell18jgr/russell18jgr-fig5.ncl | 23 ++++++++-------- .../russell18jgr/russell18jgr-fig5g.ncl | 26 ++++++++++--------- .../russell18jgr/russell18jgr-fig6a.ncl | 2 +- .../russell18jgr/russell18jgr-fig6b.ncl | 2 +- .../russell18jgr/russell18jgr-fig7h.ncl | 23 +++++++++------- .../russell18jgr/russell18jgr-fig7i.ncl | 24 +++++++++-------- .../russell18jgr/russell18jgr-fig9a.ncl | 4 ++- .../russell18jgr/russell18jgr-fig9b.ncl | 4 ++- .../russell18jgr/russell18jgr-fig9c.ncl | 4 ++- .../russell18jgr/russell18jgr-polar.ncl | 17 ++++++------ 14 files changed, 124 insertions(+), 100 deletions(-) diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl index 034d3a1287..db6426cc3a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl @@ -76,7 +76,7 @@ begin colors = project_style(input_file_info, diag_script_info, "colors") dashes = project_style(input_file_info, diag_script_info, "dashes") thicks = project_style(input_file_info, diag_script_info, "thicks") - plotpath = config_user_info@plot_dir + "/russell18jgr_fig2_" \ + plotpath = config_user_info@plot_dir + "russell18jgr_fig2_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -156,17 +156,6 @@ begin delete(var_lon_avg) delete(dataset) - ; Call provenance logger - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 2", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) - if (iii .ne. 0) then overlay(plot(0), plot(iii)) end if @@ -192,4 +181,17 @@ begin "lgLineDashSegLenF" : 0.11 end create draw(legend) + + frame(wks) + + ; Call provenance logger + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 2", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl index c912663321..add52a2b7a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl @@ -72,7 +72,7 @@ begin thicks = project_style(input_file_info, diag_script_info, "thicks") plotpath = config_user_info@plot_dir \ - + "/russell18jgr_fig3_Polar-Front-position_" \ + + "russell18jgr_fig3_Polar-Front-position_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -273,15 +273,6 @@ begin delete(e) delete(last_index) delete(out_var) - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 3b part 2", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - inputfile_paths(iii)) end do draw(plot(0)) @@ -301,4 +292,16 @@ begin end create draw(legend) + frame(wks) + + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 3b part 2", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + inputfile_paths) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl index fd4cf3f43b..41ee0c3194 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl @@ -69,7 +69,7 @@ begin dashes = project_style(input_file_info, diag_script_info, "dashes") thicks = project_style(input_file_info, diag_script_info, "thicks") - plotpath = config_user_info@plot_dir + "/Russell18jgr_fig3_Subantarctic" \ + plotpath = config_user_info@plot_dir + "Russell18jgr_fig3_Subantarctic" \ + "-Fronts_" + sprinti("%0.4i", min(toint(start_years_data))) \ + "-" + sprinti("%0.4i", max(toint(end_years_data))) @@ -263,15 +263,6 @@ begin delete(e) delete(last_index) delete(out_var) - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 3b", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - inputfile_paths(iii)) end do draw(plot(0)) @@ -291,4 +282,16 @@ begin end create draw(legend) + frame(wks) + + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 3b", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + inputfile_paths) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl index 4e62c7b552..b03b81959f 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl @@ -93,7 +93,7 @@ begin (/238, 91, 12/), (/209, 49, 7/), (/178, 0, 0/) /) colors_new = colors_new / 256.0 - plotpath = config_user_info@plot_dir + "/Russell18jgr-fig4_" \ + plotpath = config_user_info@plot_dir + "Russell18jgr-fig4_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -366,16 +366,6 @@ begin delete(var_final) delete(exact_lon) delete(totaltransport) - ; Call provenance logger - log_provenance(ncdf_outfile, \ - plotpath + "." + file_type, \ - "Russell et al 2018 figure 4", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - (/inputfile_paths(iii), volfile_paths(iii)/)) end do @@ -389,4 +379,15 @@ begin + "This is not an error, no response is needed by user for " \ + "plotting. ") end if + + ; Call provenance logger + log_provenance(ncdf_outfile, \ + plotpath + "." + file_type, \ + "Russell et al 2018 figure 4", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + inputfile_paths) end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl index 5a60ea03d9..62a5a6be1a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl @@ -59,7 +59,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig5_" + var0 + "_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig5_" + var0 + "_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -168,16 +168,6 @@ begin ncdf_outfile = ncdf_write(dataset, nc_filename) delete(dataset) - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 5 -polar", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) - end do ; Draw the panel @@ -185,4 +175,15 @@ begin pres@gsnPanelLabelBar = False outfile = panelling(wks, plots, nvert, nhori, pres) + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 5 -polar", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) + + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl index 67d8c53491..0b48c1e7ed 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl @@ -84,7 +84,7 @@ begin dashes = project_style(input_file_info, diag_script_info, "dashes") thicks = project_style(input_file_info, diag_script_info, "thicks") - plotpath = config_user_info@plot_dir + "/russell18jgr-fig5g_" + var0 + "_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig5g_" + var0 + "_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -224,17 +224,6 @@ begin overlay(plots(0), plots(iii)) end if - ; Call provenance logger - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 5g", \ - "mean", \ - "sh", \ - "times", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) - end do draw(plots(0)) @@ -261,4 +250,17 @@ begin "not an error, no responce is needed by user for plotting ") end if + frame(wks) + + ; Call provenance logger + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 5g", \ + "mean", \ + "sh", \ + "times", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl index 206d2909cc..bd672ed3cf 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl @@ -90,7 +90,7 @@ end begin - plotpath = config_user_info@plot_dir + "/Russell_figure-6a_" \ + plotpath = config_user_info@plot_dir + "Russell_figure-6a_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl index 2287b62adf..6b019625f0 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl @@ -92,7 +92,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig6b_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig6b_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl index 249712d29f..7700790e65 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl @@ -64,7 +64,7 @@ begin dashes = project_style(input_file_info, diag_script_info, "dashes") thicks = project_style(input_file_info, diag_script_info, "thicks") - plotpath = config_user_info@plot_dir + "/Russell_figure7h_" + var0 + "_" \ + plotpath = config_user_info@plot_dir + "Russell_figure7h_" + var0 + "_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -163,15 +163,6 @@ begin ncdf_outfile = ncdf_write(var_lon_avg, nc_filename) delete(var_lon_avg) delete(dataset) - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 7h", \ - "mean", \ - "sh", \ - "zonal", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) end do draw(plot(0)) @@ -192,4 +183,16 @@ begin end create draw(legend) + frame(wks) + + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 7h", \ + "mean", \ + "sh", \ + "zonal", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl index 7abcc9e7a9..86ce4bee70 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl @@ -61,7 +61,7 @@ begin var0 = variable_info[0]@short_name - plotpath = config_user_info@plot_dir + "/Russell_figure7i_" + var0 + "_" \ + plotpath = config_user_info@plot_dir + "Russell_figure7i_" + var0 + "_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -201,16 +201,6 @@ begin overlay(plot(0), plot(iii)) end if - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 7i", \ - "mean", \ - "sh", \ - "zonal", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) - end do draw(plot(0)) @@ -230,4 +220,16 @@ begin end create draw(legend) + frame(wks) + + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 7i", \ + "mean", \ + "sh", \ + "zonal", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl index 8bef8cb204..24ebe3f12e 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl @@ -103,7 +103,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig9a_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig9a_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -297,6 +297,8 @@ begin end create draw(legend) + frame(wks) + do idd = 0, dimsizes(lat_width) - 1 nc_filename = config_user_info@work_dir + "russell18jgr_fig9a_" \ + annots(idd) + "_" + (start_years_data(idd)) + "-" \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl index 8afd05425a..112cd846f5 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl @@ -94,7 +94,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig9b_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig9b_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -315,6 +315,8 @@ begin end create draw(legend) + frame(wks) + do idd = 0, dimsizes(lat_width) - 1 nc_filename = config_user_info@work_dir + "russell18jgr_fig9b_" \ + annots(idd) + "_" + (start_years_data(idd)) + "-" \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl index 0e5c828a6a..2fe0cc3e4a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl @@ -107,7 +107,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig9c_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig9c_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -312,6 +312,8 @@ begin end create draw(legend) + frame(wks) + do idd = 0, dimsizes(lat_width) - 1 nc_filename = config_user_info@work_dir + "russell18jgr_fig9c_" \ + annots(idd) + "_" + (start_years_data(idd)) + "-" \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl index b9c8f1faaa..106f161801 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl @@ -77,7 +77,7 @@ end begin - plotpath = config_user_info@plot_dir + "/Russell_polar-contour_" + var0 + \ + plotpath = config_user_info@plot_dir + "Russell_polar-contour_" + var0 + \ "_" + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -231,6 +231,13 @@ begin ncdf_outfile = ncdf_write(dataset, nc_filename) delete(dataset) + end do + + ; Draw the panel + pres = True + pres@gsnPanelLabelBar = False + outfile = panelling(wks, plots, nvert, nhori, pres) + log_provenance(ncdf_outfile, \ plotpath + "." + output_type(), \ "Russell et al 2018 polar plot " + var0, \ @@ -239,11 +246,5 @@ begin "geo", \ "russell_joellen", \ "russell18jgr", \ - inputfile_paths(iii)) - end do - - ; Draw the panel - pres = True - pres@gsnPanelLabelBar = False - outfile = panelling(wks, plots, nvert, nhori, pres) + inputfile_paths) end From cda8c8598f3628fd549626c9aacb21c535229ede Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Tue, 19 Dec 2023 09:33:33 +0100 Subject: [PATCH 25/39] Fix plots and provenance in Russell diagnostics (#3479) Co-authored-by: Axel Lauer --- .../russell18jgr/russell18jgr-fig2.ncl | 26 ++++++++++--------- .../russell18jgr/russell18jgr-fig3b-2.ncl | 23 +++++++++------- .../russell18jgr/russell18jgr-fig3b.ncl | 23 +++++++++------- .../russell18jgr/russell18jgr-fig4.ncl | 23 ++++++++-------- .../russell18jgr/russell18jgr-fig5.ncl | 23 ++++++++-------- .../russell18jgr/russell18jgr-fig5g.ncl | 26 ++++++++++--------- .../russell18jgr/russell18jgr-fig6a.ncl | 2 +- .../russell18jgr/russell18jgr-fig6b.ncl | 2 +- .../russell18jgr/russell18jgr-fig7h.ncl | 23 +++++++++------- .../russell18jgr/russell18jgr-fig7i.ncl | 24 +++++++++-------- .../russell18jgr/russell18jgr-fig9a.ncl | 4 ++- .../russell18jgr/russell18jgr-fig9b.ncl | 4 ++- .../russell18jgr/russell18jgr-fig9c.ncl | 4 ++- .../russell18jgr/russell18jgr-polar.ncl | 17 ++++++------ 14 files changed, 124 insertions(+), 100 deletions(-) diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl index 034d3a1287..db6426cc3a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl @@ -76,7 +76,7 @@ begin colors = project_style(input_file_info, diag_script_info, "colors") dashes = project_style(input_file_info, diag_script_info, "dashes") thicks = project_style(input_file_info, diag_script_info, "thicks") - plotpath = config_user_info@plot_dir + "/russell18jgr_fig2_" \ + plotpath = config_user_info@plot_dir + "russell18jgr_fig2_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -156,17 +156,6 @@ begin delete(var_lon_avg) delete(dataset) - ; Call provenance logger - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 2", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) - if (iii .ne. 0) then overlay(plot(0), plot(iii)) end if @@ -192,4 +181,17 @@ begin "lgLineDashSegLenF" : 0.11 end create draw(legend) + + frame(wks) + + ; Call provenance logger + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 2", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl index c912663321..add52a2b7a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl @@ -72,7 +72,7 @@ begin thicks = project_style(input_file_info, diag_script_info, "thicks") plotpath = config_user_info@plot_dir \ - + "/russell18jgr_fig3_Polar-Front-position_" \ + + "russell18jgr_fig3_Polar-Front-position_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -273,15 +273,6 @@ begin delete(e) delete(last_index) delete(out_var) - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 3b part 2", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - inputfile_paths(iii)) end do draw(plot(0)) @@ -301,4 +292,16 @@ begin end create draw(legend) + frame(wks) + + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 3b part 2", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + inputfile_paths) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl index fd4cf3f43b..41ee0c3194 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl @@ -69,7 +69,7 @@ begin dashes = project_style(input_file_info, diag_script_info, "dashes") thicks = project_style(input_file_info, diag_script_info, "thicks") - plotpath = config_user_info@plot_dir + "/Russell18jgr_fig3_Subantarctic" \ + plotpath = config_user_info@plot_dir + "Russell18jgr_fig3_Subantarctic" \ + "-Fronts_" + sprinti("%0.4i", min(toint(start_years_data))) \ + "-" + sprinti("%0.4i", max(toint(end_years_data))) @@ -263,15 +263,6 @@ begin delete(e) delete(last_index) delete(out_var) - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 3b", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - inputfile_paths(iii)) end do draw(plot(0)) @@ -291,4 +282,16 @@ begin end create draw(legend) + frame(wks) + + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 3b", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + inputfile_paths) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl index 4e62c7b552..b03b81959f 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl @@ -93,7 +93,7 @@ begin (/238, 91, 12/), (/209, 49, 7/), (/178, 0, 0/) /) colors_new = colors_new / 256.0 - plotpath = config_user_info@plot_dir + "/Russell18jgr-fig4_" \ + plotpath = config_user_info@plot_dir + "Russell18jgr-fig4_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -366,16 +366,6 @@ begin delete(var_final) delete(exact_lon) delete(totaltransport) - ; Call provenance logger - log_provenance(ncdf_outfile, \ - plotpath + "." + file_type, \ - "Russell et al 2018 figure 4", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - (/inputfile_paths(iii), volfile_paths(iii)/)) end do @@ -389,4 +379,15 @@ begin + "This is not an error, no response is needed by user for " \ + "plotting. ") end if + + ; Call provenance logger + log_provenance(ncdf_outfile, \ + plotpath + "." + file_type, \ + "Russell et al 2018 figure 4", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + inputfile_paths) end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl index 5a60ea03d9..62a5a6be1a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl @@ -59,7 +59,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig5_" + var0 + "_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig5_" + var0 + "_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -168,16 +168,6 @@ begin ncdf_outfile = ncdf_write(dataset, nc_filename) delete(dataset) - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 5 -polar", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) - end do ; Draw the panel @@ -185,4 +175,15 @@ begin pres@gsnPanelLabelBar = False outfile = panelling(wks, plots, nvert, nhori, pres) + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 5 -polar", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) + + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl index 67d8c53491..0b48c1e7ed 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl @@ -84,7 +84,7 @@ begin dashes = project_style(input_file_info, diag_script_info, "dashes") thicks = project_style(input_file_info, diag_script_info, "thicks") - plotpath = config_user_info@plot_dir + "/russell18jgr-fig5g_" + var0 + "_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig5g_" + var0 + "_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -224,17 +224,6 @@ begin overlay(plots(0), plots(iii)) end if - ; Call provenance logger - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 5g", \ - "mean", \ - "sh", \ - "times", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) - end do draw(plots(0)) @@ -261,4 +250,17 @@ begin "not an error, no responce is needed by user for plotting ") end if + frame(wks) + + ; Call provenance logger + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 5g", \ + "mean", \ + "sh", \ + "times", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl index 206d2909cc..bd672ed3cf 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl @@ -90,7 +90,7 @@ end begin - plotpath = config_user_info@plot_dir + "/Russell_figure-6a_" \ + plotpath = config_user_info@plot_dir + "Russell_figure-6a_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl index 2287b62adf..6b019625f0 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl @@ -92,7 +92,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig6b_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig6b_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl index 249712d29f..7700790e65 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl @@ -64,7 +64,7 @@ begin dashes = project_style(input_file_info, diag_script_info, "dashes") thicks = project_style(input_file_info, diag_script_info, "thicks") - plotpath = config_user_info@plot_dir + "/Russell_figure7h_" + var0 + "_" \ + plotpath = config_user_info@plot_dir + "Russell_figure7h_" + var0 + "_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -163,15 +163,6 @@ begin ncdf_outfile = ncdf_write(var_lon_avg, nc_filename) delete(var_lon_avg) delete(dataset) - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 7h", \ - "mean", \ - "sh", \ - "zonal", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) end do draw(plot(0)) @@ -192,4 +183,16 @@ begin end create draw(legend) + frame(wks) + + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 7h", \ + "mean", \ + "sh", \ + "zonal", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl index 7abcc9e7a9..86ce4bee70 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl @@ -61,7 +61,7 @@ begin var0 = variable_info[0]@short_name - plotpath = config_user_info@plot_dir + "/Russell_figure7i_" + var0 + "_" \ + plotpath = config_user_info@plot_dir + "Russell_figure7i_" + var0 + "_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -201,16 +201,6 @@ begin overlay(plot(0), plot(iii)) end if - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 7i", \ - "mean", \ - "sh", \ - "zonal", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) - end do draw(plot(0)) @@ -230,4 +220,16 @@ begin end create draw(legend) + frame(wks) + + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 7i", \ + "mean", \ + "sh", \ + "zonal", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl index 8bef8cb204..24ebe3f12e 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl @@ -103,7 +103,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig9a_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig9a_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -297,6 +297,8 @@ begin end create draw(legend) + frame(wks) + do idd = 0, dimsizes(lat_width) - 1 nc_filename = config_user_info@work_dir + "russell18jgr_fig9a_" \ + annots(idd) + "_" + (start_years_data(idd)) + "-" \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl index 8afd05425a..112cd846f5 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl @@ -94,7 +94,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig9b_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig9b_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -315,6 +315,8 @@ begin end create draw(legend) + frame(wks) + do idd = 0, dimsizes(lat_width) - 1 nc_filename = config_user_info@work_dir + "russell18jgr_fig9b_" \ + annots(idd) + "_" + (start_years_data(idd)) + "-" \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl index 0e5c828a6a..2fe0cc3e4a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl @@ -107,7 +107,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig9c_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig9c_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -312,6 +312,8 @@ begin end create draw(legend) + frame(wks) + do idd = 0, dimsizes(lat_width) - 1 nc_filename = config_user_info@work_dir + "russell18jgr_fig9c_" \ + annots(idd) + "_" + (start_years_data(idd)) + "-" \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl index b9c8f1faaa..106f161801 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl @@ -77,7 +77,7 @@ end begin - plotpath = config_user_info@plot_dir + "/Russell_polar-contour_" + var0 + \ + plotpath = config_user_info@plot_dir + "Russell_polar-contour_" + var0 + \ "_" + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -231,6 +231,13 @@ begin ncdf_outfile = ncdf_write(dataset, nc_filename) delete(dataset) + end do + + ; Draw the panel + pres = True + pres@gsnPanelLabelBar = False + outfile = panelling(wks, plots, nvert, nhori, pres) + log_provenance(ncdf_outfile, \ plotpath + "." + output_type(), \ "Russell et al 2018 polar plot " + var0, \ @@ -239,11 +246,5 @@ begin "geo", \ "russell_joellen", \ "russell18jgr", \ - inputfile_paths(iii)) - end do - - ; Draw the panel - pres = True - pres@gsnPanelLabelBar = False - outfile = panelling(wks, plots, nvert, nhori, pres) + inputfile_paths) end From 7d61dc1c62bc3cab71bfc928e0225fa6ae984c8f Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Thu, 7 Dec 2023 07:45:58 +0000 Subject: [PATCH 26/39] regenerate Anconda shield/badge not to have ESMValTool version hardcoded in image name (#3453) Co-authored-by: Bouwe Andela --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 71403fbf90..d170ee2f20 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![Codacy Badge](https://app.codacy.com/project/badge/Coverage/79bf6932c2e844eea15d0fb1ed7e415c)](https://www.codacy.com/gh/ESMValGroup/ESMValTool?utm_source=github.com&utm_medium=referral&utm_content=ESMValGroup/ESMValTool&utm_campaign=Badge_Coverage) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/79bf6932c2e844eea15d0fb1ed7e415c)](https://www.codacy.com/gh/ESMValGroup/ESMValTool?utm_source=github.com&utm_medium=referral&utm_content=ESMValGroup/ESMValTool&utm_campaign=Badge_Grade) [![Docker Build Status](https://img.shields.io/docker/cloud/build/esmvalgroup/esmvaltool.svg)](https://hub.docker.com/r/esmvalgroup/esmvaltool/) -[![Anaconda-Server Badge](https://img.shields.io/badge/Anaconda.org-2.9.0-blue.svg)](https://anaconda.org/conda-forge/esmvaltool) +[![Anaconda-Server Badge](https://img.shields.io/conda/vn/conda-forge/ESMValTool?color=blue&label=conda-forge&logo=conda-forge&logoColor=white)](https://anaconda.org/conda-forge/esmvaltool) ![stand with Ukraine](https://badgen.net/badge/stand%20with/UKRAINE/?color=0057B8&labelColor=FFD700) ![esmvaltoollogo](https://raw.githubusercontent.com/ESMValGroup/ESMValTool/main/doc/sphinx/source/figures/ESMValTool-logo-2.png) From 92564c56d8070e4ac3113eeaf990e19546437e21 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Tue, 19 Dec 2023 16:42:35 +0100 Subject: [PATCH 27/39] Add v2.10 release notes (#3485) Co-authored-by: Manuel Schlund <32543114+schlunma@users.noreply.github.com> --- CITATION.cff | 4 +- doc/sphinx/source/changelog.rst | 110 ++++++++++++++++++ .../source/recipes/broken_recipe_list.rst | 10 +- 3 files changed, 121 insertions(+), 3 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 147e3acd17..cca827c46d 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -388,11 +388,11 @@ authors: orcid: "https://orcid.org/0000-0003-3780-0784" cff-version: 1.2.0 -date-released: 2023-07-06 +date-released: 2023-12-19 doi: "10.5281/zenodo.3401363" license: "Apache-2.0" message: "If you use this software, please cite it using these metadata." repository-code: "https://github.com/ESMValGroup/ESMValTool/" title: ESMValTool -version: "v2.9.0" +version: "v2.10.0" ... diff --git a/doc/sphinx/source/changelog.rst b/doc/sphinx/source/changelog.rst index 52c3aa3086..e06be38aa0 100644 --- a/doc/sphinx/source/changelog.rst +++ b/doc/sphinx/source/changelog.rst @@ -3,6 +3,116 @@ Changelog ========= +v2.10.0 +------- +Highlights + +- Add a realistic IPCC example recipe that reproduces figure 9.3 from AR6. It + computes the mean sea-surface temperature anomaly between 1850-2100 over all + available CMIP6 models. See the :ref:`recipe documentation ` + or read the `blog post `__ + for more information. + +- Added more plot types to monitoring diagnostic: Hovmoeller Z vs. time, + Hovmoeller time vs latlon, variable vs. latitude are now available. See the + :ref:`recipe documentation ` for more information. + +- Add support for 4 new datasets: + + - NOAA-CIRES-20CR v3 reanalysis + - NASA MERRA reanalysis + - NOAA marine boundary layer data for CH4 + - MOBO-DIC2004-2019 + + See :ref:`supported_datasets` and :ref:`inputdata_observations` for more + information. + +- Many recipes now have up-to-date obs4MIPs dataset names so required data can + automatically be downloaded from ESGF. + +This release includes + +Bug fixes +~~~~~~~~~ + +- Update recipe shapeselect to work with shapely v2 (`#3283 `__) `Lukas `__ +- Correctly handle ``~`` when reading ``plot_folder`` option of monitoring diagnostic (`#3449 `__) `Manuel Schlund `__ +- Fixed provenance tracking for NCL multipanel PNGs (`#3332 `__) `Manuel Schlund `__ +- Fixed plot paths in NCL provenance tracking (`#3422 `__) `Manuel Schlund `__ +- Fix erroneous file_type handling in certain NCL diagnostics (`#3474 `__) `Klaus Zimmermann `__ +- Fix NCL provenance tracking (`#3477 `__) `Manuel Schlund `__ +- Fix plots and provenance in Russell diagnostics (`#3479 `__) `Manuel Schlund `__ + +Documentation +~~~~~~~~~~~~~ + +- Add merge instructions to release instructions (`#3292 `__) `Rémi Kazeroni `__ +- Update release schedule after release of v2.9.0 (`#3289 `__) `Rémi Kazeroni `__ +- Add list of failing recipes for v2.9.0 release (`#3294 `__) `Rémi Kazeroni `__ +- Update ``mamba`` version in readthedocs configuration docs builds (`#3310 `__) `Valeriu Predoi `__ +- Add Romain Beucher to citation file as contributor (`#3318 `__) `Valeriu Predoi `__ +- Removed recipe_carvalhais14nat from list of broken recipes (`#3319 `__) `Rémi Kazeroni `__ +- Add `OBS-maintainers `__ team to documentation on OBS data maintenance and CMORizer reviews (`#3335 `__) `Rémi Kazeroni `__ +- Add Pauline Bonnet to citation file (`#3347 `__) `Paulinebonnet111 `__ +- Ensure compatible zstandard and zstd in readthedocs builds (`#3362 `__) `Klaus Zimmermann `__ +- Fix documentation build (`#3397 `__) `Bouwe Andela `__ +- Minor updates to release tools (`#3216 `__) `Bouwe Andela `__ +- Enhance provenance documentation (`#3305 `__) `Alistair Sellar `__ +- Re-add communities and grants in zenodo file (`#3416 `__) `Valeriu Predoi `__ +- Update Anconda badge in README (`#3375 `__, `#3453 `__) `Valeriu Predoi `__ + +Diagnostics +~~~~~~~~~~~ + +- Slight refactoring of diagnostic script ``galytska23/select_variables_for_tigramite.py`` for generality and portability (`#3298 `__) `Valeriu Predoi `__ and `Evgenia Galytska `__ +- Allow custom variable grouping in diagnostic script ``monitor/multi_datasets.py`` (`#3343 `__) `Manuel Schlund `__ +- Extended monitor diagnostic with plot type variable vs. latitude (`#3340 `__) `ellensarauer `__ +- Add Hovmoeller Z vs. time plot to monitoring diagnostic (`#3345 `__) `cubeme `__ and `helgehr `__ +- Adding Hovmoeller time vs latlon plots to monitoring recipes (`#3341 `__) `Lukas `__ and `jeremykraftdlr `__ +- Implied heat transport new diagnostic (`#3177 `__) `Alejandro Bodas `__ +- Recipe changes for new statistics preprocessors (percentiles) (`#3351 `__) `Manuel Schlund `__ +- Add a realistic example recipe (`#3356 `__) `Peter9192 `__ and `Bouwe Andela `__ +- Support ``CenteredNorm`` in diagnostic monitor/multidatasets.py (`#3415 `__) `Manuel Schlund `__ +- Use new preprocessor statistics calling convention for recipe_easy_ipcc.yml (`#3418 `__) `Bouwe Andela `__ +- Adapt to changed style scheme name in matplotlib (`#3475 `__) `Klaus Zimmermann `__ +- Add version to dataset in python example recipe to avoid "Unknown file format" issue on JASMIN (`#3322 `__) `Emma Hogan `__ +- Add the dataset version in the heatwaves_coldwaves recipe to avoid the "Unknown file format" issue on JASMIN (`#3373 `__) `Emma Hogan `__ + +Observational and re-analysis dataset support +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Cmorizer for NOAA-CIRES-20CR v3 reanalysis (clt, clwvi, hus, prw, rlut, rlutcs, rsut, rsutcs) (`#3137 `__) `Lisa Bock `__ +- CMORizer for NASA MERRA reanalysis (`#3039 `__) `Axel Lauer `__ +- Download and formatting of NOAA marine boundary layer data for CH4 (NOAA-MBL-CH4) (`#3301 `__) `FranziskaWinterstein `__ +- Added CMORizer for MOBO-DIC2004-2019 (`#3297 `__) `Manuel Schlund `__ +- Update obs4MIPs dataset names in quantilebias recipe (`#3330 `__) `Romain Beucher `__ +- Update obs4MIPs dataset names in Schlund20esd recipe (`#3329 `__) `Romain Beucher `__ +- Update obs4MIPs dataset names in flatoipcc recipes (`#3328 `__) `Romain Beucher `__ +- Update obs4mips dataset names in clouds recipes (`#3326 `__) `Romain Beucher `__ +- Update Obs4MIPs dataset names in ECS recipes (`#3327 `__) `Romain Beucher `__ +- Update obs4mips dataset names in Bock et al recipes (`#3324 `__, `#3389 `__ and `#3473 `__) `Romain Beucher `__ and `Bouwe Andela `__ +- Update obs4mips dataset names in radiation budget recipe (`#3323 `__) `Romain Beucher `__ +- Update Obs4MIPs dataset names in perfmetrics CMIP5 recipe (`#3325 `__) `Romain Beucher `__ + +Automatic testing +~~~~~~~~~~~~~~~~~ + +- Made sklearn test backwards-compatible with sklearn < 1.3 (`#3285 `__) `Manuel Schlund `__ +- Update conda lock creation Github Action workflow and ship updated conda-lock file (`#3307 `__, `#3407 `__) `Valeriu Predoi `__ +- Compress all bash shell setters into one default option per GitHub Action workflow (`#3315 `__) `Valeriu Predoi `__ +- Remove deprecated option ``offline`` from CI configuration (`#3367 `__) `Manuel Schlund `__ + +Installation +~~~~~~~~~~~~ + +- Use ESMValCore v2.10.0 release candidates (`#3404 `__) `Klaus Zimmermann `__ + +Improvements +~~~~~~~~~~~~ + +- Merge v2.9.x into main (`#3286 `__) `Manuel Schlund `__ +- Allow NCL unit conversion `kg s-1` -> `GtC y-1` (`#3300 `__) `Manuel Schlund `__ + .. _changelog-v2-9-0: v2.9.0 diff --git a/doc/sphinx/source/recipes/broken_recipe_list.rst b/doc/sphinx/source/recipes/broken_recipe_list.rst index 18471b2382..e2c5b874d8 100644 --- a/doc/sphinx/source/recipes/broken_recipe_list.rst +++ b/doc/sphinx/source/recipes/broken_recipe_list.rst @@ -20,7 +20,15 @@ More details can be found in the :ref:`broken recipe policy - `ERA5_native6` - Derivation of custom variables `rlus` and `rsus` - `#1388 `_ + * - :ref:`recipe_julia.yml ` + - `example` + - fill values are not interpreted, resulting in an unusable plot + - `#2595 `_ * - :ref:`recipe_seaice_drift.yml ` - `sea_ice_drift_SCICEX` - - ``shapely`` issue + - ``shapely 2`` issue - `#3243 `_ + * - :ref:`recipe_pysplot.yml ` + - `plot_map` + - ``shapely 2`` issue + - `#3483 `_ From c8c06bdd48415fa0c76b3ec0b02d9b21d16252f1 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Tue, 19 Dec 2023 16:42:35 +0100 Subject: [PATCH 28/39] Add v2.10 release notes (#3485) Co-authored-by: Manuel Schlund <32543114+schlunma@users.noreply.github.com> --- CITATION.cff | 4 +- doc/sphinx/source/changelog.rst | 110 ++++++++++++++++++ .../source/recipes/broken_recipe_list.rst | 10 +- 3 files changed, 121 insertions(+), 3 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 147e3acd17..cca827c46d 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -388,11 +388,11 @@ authors: orcid: "https://orcid.org/0000-0003-3780-0784" cff-version: 1.2.0 -date-released: 2023-07-06 +date-released: 2023-12-19 doi: "10.5281/zenodo.3401363" license: "Apache-2.0" message: "If you use this software, please cite it using these metadata." repository-code: "https://github.com/ESMValGroup/ESMValTool/" title: ESMValTool -version: "v2.9.0" +version: "v2.10.0" ... diff --git a/doc/sphinx/source/changelog.rst b/doc/sphinx/source/changelog.rst index 52c3aa3086..e06be38aa0 100644 --- a/doc/sphinx/source/changelog.rst +++ b/doc/sphinx/source/changelog.rst @@ -3,6 +3,116 @@ Changelog ========= +v2.10.0 +------- +Highlights + +- Add a realistic IPCC example recipe that reproduces figure 9.3 from AR6. It + computes the mean sea-surface temperature anomaly between 1850-2100 over all + available CMIP6 models. See the :ref:`recipe documentation ` + or read the `blog post `__ + for more information. + +- Added more plot types to monitoring diagnostic: Hovmoeller Z vs. time, + Hovmoeller time vs latlon, variable vs. latitude are now available. See the + :ref:`recipe documentation ` for more information. + +- Add support for 4 new datasets: + + - NOAA-CIRES-20CR v3 reanalysis + - NASA MERRA reanalysis + - NOAA marine boundary layer data for CH4 + - MOBO-DIC2004-2019 + + See :ref:`supported_datasets` and :ref:`inputdata_observations` for more + information. + +- Many recipes now have up-to-date obs4MIPs dataset names so required data can + automatically be downloaded from ESGF. + +This release includes + +Bug fixes +~~~~~~~~~ + +- Update recipe shapeselect to work with shapely v2 (`#3283 `__) `Lukas `__ +- Correctly handle ``~`` when reading ``plot_folder`` option of monitoring diagnostic (`#3449 `__) `Manuel Schlund `__ +- Fixed provenance tracking for NCL multipanel PNGs (`#3332 `__) `Manuel Schlund `__ +- Fixed plot paths in NCL provenance tracking (`#3422 `__) `Manuel Schlund `__ +- Fix erroneous file_type handling in certain NCL diagnostics (`#3474 `__) `Klaus Zimmermann `__ +- Fix NCL provenance tracking (`#3477 `__) `Manuel Schlund `__ +- Fix plots and provenance in Russell diagnostics (`#3479 `__) `Manuel Schlund `__ + +Documentation +~~~~~~~~~~~~~ + +- Add merge instructions to release instructions (`#3292 `__) `Rémi Kazeroni `__ +- Update release schedule after release of v2.9.0 (`#3289 `__) `Rémi Kazeroni `__ +- Add list of failing recipes for v2.9.0 release (`#3294 `__) `Rémi Kazeroni `__ +- Update ``mamba`` version in readthedocs configuration docs builds (`#3310 `__) `Valeriu Predoi `__ +- Add Romain Beucher to citation file as contributor (`#3318 `__) `Valeriu Predoi `__ +- Removed recipe_carvalhais14nat from list of broken recipes (`#3319 `__) `Rémi Kazeroni `__ +- Add `OBS-maintainers `__ team to documentation on OBS data maintenance and CMORizer reviews (`#3335 `__) `Rémi Kazeroni `__ +- Add Pauline Bonnet to citation file (`#3347 `__) `Paulinebonnet111 `__ +- Ensure compatible zstandard and zstd in readthedocs builds (`#3362 `__) `Klaus Zimmermann `__ +- Fix documentation build (`#3397 `__) `Bouwe Andela `__ +- Minor updates to release tools (`#3216 `__) `Bouwe Andela `__ +- Enhance provenance documentation (`#3305 `__) `Alistair Sellar `__ +- Re-add communities and grants in zenodo file (`#3416 `__) `Valeriu Predoi `__ +- Update Anconda badge in README (`#3375 `__, `#3453 `__) `Valeriu Predoi `__ + +Diagnostics +~~~~~~~~~~~ + +- Slight refactoring of diagnostic script ``galytska23/select_variables_for_tigramite.py`` for generality and portability (`#3298 `__) `Valeriu Predoi `__ and `Evgenia Galytska `__ +- Allow custom variable grouping in diagnostic script ``monitor/multi_datasets.py`` (`#3343 `__) `Manuel Schlund `__ +- Extended monitor diagnostic with plot type variable vs. latitude (`#3340 `__) `ellensarauer `__ +- Add Hovmoeller Z vs. time plot to monitoring diagnostic (`#3345 `__) `cubeme `__ and `helgehr `__ +- Adding Hovmoeller time vs latlon plots to monitoring recipes (`#3341 `__) `Lukas `__ and `jeremykraftdlr `__ +- Implied heat transport new diagnostic (`#3177 `__) `Alejandro Bodas `__ +- Recipe changes for new statistics preprocessors (percentiles) (`#3351 `__) `Manuel Schlund `__ +- Add a realistic example recipe (`#3356 `__) `Peter9192 `__ and `Bouwe Andela `__ +- Support ``CenteredNorm`` in diagnostic monitor/multidatasets.py (`#3415 `__) `Manuel Schlund `__ +- Use new preprocessor statistics calling convention for recipe_easy_ipcc.yml (`#3418 `__) `Bouwe Andela `__ +- Adapt to changed style scheme name in matplotlib (`#3475 `__) `Klaus Zimmermann `__ +- Add version to dataset in python example recipe to avoid "Unknown file format" issue on JASMIN (`#3322 `__) `Emma Hogan `__ +- Add the dataset version in the heatwaves_coldwaves recipe to avoid the "Unknown file format" issue on JASMIN (`#3373 `__) `Emma Hogan `__ + +Observational and re-analysis dataset support +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Cmorizer for NOAA-CIRES-20CR v3 reanalysis (clt, clwvi, hus, prw, rlut, rlutcs, rsut, rsutcs) (`#3137 `__) `Lisa Bock `__ +- CMORizer for NASA MERRA reanalysis (`#3039 `__) `Axel Lauer `__ +- Download and formatting of NOAA marine boundary layer data for CH4 (NOAA-MBL-CH4) (`#3301 `__) `FranziskaWinterstein `__ +- Added CMORizer for MOBO-DIC2004-2019 (`#3297 `__) `Manuel Schlund `__ +- Update obs4MIPs dataset names in quantilebias recipe (`#3330 `__) `Romain Beucher `__ +- Update obs4MIPs dataset names in Schlund20esd recipe (`#3329 `__) `Romain Beucher `__ +- Update obs4MIPs dataset names in flatoipcc recipes (`#3328 `__) `Romain Beucher `__ +- Update obs4mips dataset names in clouds recipes (`#3326 `__) `Romain Beucher `__ +- Update Obs4MIPs dataset names in ECS recipes (`#3327 `__) `Romain Beucher `__ +- Update obs4mips dataset names in Bock et al recipes (`#3324 `__, `#3389 `__ and `#3473 `__) `Romain Beucher `__ and `Bouwe Andela `__ +- Update obs4mips dataset names in radiation budget recipe (`#3323 `__) `Romain Beucher `__ +- Update Obs4MIPs dataset names in perfmetrics CMIP5 recipe (`#3325 `__) `Romain Beucher `__ + +Automatic testing +~~~~~~~~~~~~~~~~~ + +- Made sklearn test backwards-compatible with sklearn < 1.3 (`#3285 `__) `Manuel Schlund `__ +- Update conda lock creation Github Action workflow and ship updated conda-lock file (`#3307 `__, `#3407 `__) `Valeriu Predoi `__ +- Compress all bash shell setters into one default option per GitHub Action workflow (`#3315 `__) `Valeriu Predoi `__ +- Remove deprecated option ``offline`` from CI configuration (`#3367 `__) `Manuel Schlund `__ + +Installation +~~~~~~~~~~~~ + +- Use ESMValCore v2.10.0 release candidates (`#3404 `__) `Klaus Zimmermann `__ + +Improvements +~~~~~~~~~~~~ + +- Merge v2.9.x into main (`#3286 `__) `Manuel Schlund `__ +- Allow NCL unit conversion `kg s-1` -> `GtC y-1` (`#3300 `__) `Manuel Schlund `__ + .. _changelog-v2-9-0: v2.9.0 diff --git a/doc/sphinx/source/recipes/broken_recipe_list.rst b/doc/sphinx/source/recipes/broken_recipe_list.rst index 18471b2382..e2c5b874d8 100644 --- a/doc/sphinx/source/recipes/broken_recipe_list.rst +++ b/doc/sphinx/source/recipes/broken_recipe_list.rst @@ -20,7 +20,15 @@ More details can be found in the :ref:`broken recipe policy - `ERA5_native6` - Derivation of custom variables `rlus` and `rsus` - `#1388 `_ + * - :ref:`recipe_julia.yml ` + - `example` + - fill values are not interpreted, resulting in an unusable plot + - `#2595 `_ * - :ref:`recipe_seaice_drift.yml ` - `sea_ice_drift_SCICEX` - - ``shapely`` issue + - ``shapely 2`` issue - `#3243 `_ + * - :ref:`recipe_pysplot.yml ` + - `plot_map` + - ``shapely 2`` issue + - `#3483 `_ From 10692548f67bdfa83e2d47170d133e70e128f0d1 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Tue, 19 Dec 2023 20:16:28 +0100 Subject: [PATCH 29/39] Use ESMValCore v2.10 (#3486) --- doc/sphinx/source/changelog.rst | 2 +- environment.yml | 4 ++-- environment_osx.yml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/sphinx/source/changelog.rst b/doc/sphinx/source/changelog.rst index e06be38aa0..068a94a45b 100644 --- a/doc/sphinx/source/changelog.rst +++ b/doc/sphinx/source/changelog.rst @@ -105,7 +105,7 @@ Automatic testing Installation ~~~~~~~~~~~~ -- Use ESMValCore v2.10.0 release candidates (`#3404 `__) `Klaus Zimmermann `__ +- Use ESMValCore v2.10 (`#3486 `__) `Bouwe Andela `__ Improvements ~~~~~~~~~~~~ diff --git a/environment.yml b/environment.yml index fb2e5adb14..6409a35e6a 100644 --- a/environment.yml +++ b/environment.yml @@ -4,7 +4,7 @@ channels: # The release candidate channel should only be activated # during the rc phase right before the next release of the # ESMValCore. - - conda-forge/label/esmvalcore_rc + # - conda-forge/label/esmvalcore_rc - conda-forge - nodefaults @@ -24,7 +24,7 @@ dependencies: - ecmwf-api-client - eofs - esmpy - - esmvalcore =2.10.0rc1 + - esmvalcore 2.10.* - fiona - fire - gdal diff --git a/environment_osx.yml b/environment_osx.yml index 0734dee2c6..7207ec9112 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -4,7 +4,7 @@ channels: # The release candidate channel should only be activated # during the rc phase right before the next release of the # ESMValCore. - - conda-forge/label/esmvalcore_rc + # - conda-forge/label/esmvalcore_rc - conda-forge - nodefaults @@ -24,7 +24,7 @@ dependencies: - ecmwf-api-client - eofs - esmpy - - esmvalcore =2.10.0rc1 + - esmvalcore 2.10.* - fiona - fire - gdal From e869d157579e91f6ecfc91a6258f49bd43c69cc6 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Tue, 19 Dec 2023 20:16:28 +0100 Subject: [PATCH 30/39] Use ESMValCore v2.10 (#3486) --- doc/sphinx/source/changelog.rst | 2 +- environment.yml | 4 ++-- environment_osx.yml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/sphinx/source/changelog.rst b/doc/sphinx/source/changelog.rst index e06be38aa0..068a94a45b 100644 --- a/doc/sphinx/source/changelog.rst +++ b/doc/sphinx/source/changelog.rst @@ -105,7 +105,7 @@ Automatic testing Installation ~~~~~~~~~~~~ -- Use ESMValCore v2.10.0 release candidates (`#3404 `__) `Klaus Zimmermann `__ +- Use ESMValCore v2.10 (`#3486 `__) `Bouwe Andela `__ Improvements ~~~~~~~~~~~~ diff --git a/environment.yml b/environment.yml index fb2e5adb14..6409a35e6a 100644 --- a/environment.yml +++ b/environment.yml @@ -4,7 +4,7 @@ channels: # The release candidate channel should only be activated # during the rc phase right before the next release of the # ESMValCore. - - conda-forge/label/esmvalcore_rc + # - conda-forge/label/esmvalcore_rc - conda-forge - nodefaults @@ -24,7 +24,7 @@ dependencies: - ecmwf-api-client - eofs - esmpy - - esmvalcore =2.10.0rc1 + - esmvalcore 2.10.* - fiona - fire - gdal diff --git a/environment_osx.yml b/environment_osx.yml index 0734dee2c6..7207ec9112 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -4,7 +4,7 @@ channels: # The release candidate channel should only be activated # during the rc phase right before the next release of the # ESMValCore. - - conda-forge/label/esmvalcore_rc + # - conda-forge/label/esmvalcore_rc - conda-forge - nodefaults @@ -24,7 +24,7 @@ dependencies: - ecmwf-api-client - eofs - esmpy - - esmvalcore =2.10.0rc1 + - esmvalcore 2.10.* - fiona - fire - gdal From 7e1ffaad0313629eaec39664ecf7df3b45e8d89c Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Wed, 20 Dec 2023 08:45:54 +0100 Subject: [PATCH 31/39] Update release date --- CITATION.cff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index cca827c46d..5c253e3bb5 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -388,7 +388,7 @@ authors: orcid: "https://orcid.org/0000-0003-3780-0784" cff-version: 1.2.0 -date-released: 2023-12-19 +date-released: 2023-12-20 doi: "10.5281/zenodo.3401363" license: "Apache-2.0" message: "If you use this software, please cite it using these metadata." From 7e60941dced9b16c41adb864651523a1df5e9da3 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Wed, 20 Dec 2023 10:31:50 +0100 Subject: [PATCH 32/39] Update dependencies (#3487) --- environment.yml | 10 +++++----- environment_osx.yml | 11 ++++++----- setup.py | 15 ++++++++------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/environment.yml b/environment.yml index 6409a35e6a..660cd7f11e 100644 --- a/environment.yml +++ b/environment.yml @@ -9,8 +9,6 @@ channels: - nodefaults dependencies: - - pip !=21.3 - - python >=3.9 - aiohttp - cartopy - cdo >=1.9.7 @@ -28,7 +26,7 @@ dependencies: - fiona - fire - gdal - - iris >=3.6.0 + - iris >=3.6.1 - iris-esmf-regrid >=0.7.0 - jinja2 - joblib @@ -40,9 +38,10 @@ dependencies: - netCDF4 - numba - numpy !=1.24.3 # severe masking bug - - packaging - openpyxl + - packaging - pandas + - pip !=21.3 - progressbar2 - prov - psyplot @@ -50,6 +49,7 @@ dependencies: - psy-reg - psy-simple - pyproj >=2.1 + - python >=3.9 - python-cdo - python-dateutil - pyyaml @@ -61,7 +61,7 @@ dependencies: - scipy - seaborn - seawater - - shapely + - shapely >=2 - xarray >=0.12.0 - xesmf >=0.7.1 - xgboost >1.6.1 # github.com/ESMValGroup/ESMValTool/issues/2779 diff --git a/environment_osx.yml b/environment_osx.yml index 7207ec9112..0d1f034e61 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -9,8 +9,6 @@ channels: - nodefaults dependencies: - - pip !=21.3 - - python >=3.9 - aiohttp - cartopy - cdo >=1.9.7 @@ -28,7 +26,7 @@ dependencies: - fiona - fire - gdal - - iris >=3.6.0 + - iris >=3.6.1 - iris-esmf-regrid >=0.7.0 - jinja2 - joblib @@ -38,10 +36,12 @@ dependencies: - natsort - nc-time-axis - netCDF4 + - numba - numpy !=1.24.3 # severe masking bug - - packaging - openpyxl + - packaging - pandas + - pip !=21.3 - progressbar2 - prov - psyplot @@ -49,6 +49,7 @@ dependencies: - psy-reg - psy-simple - pyproj>=2.1 + - python >=3.9 - python-cdo - python-dateutil - pyyaml @@ -60,7 +61,7 @@ dependencies: - scipy - seaborn - seawater - - shapely + - shapely >=2 - xarray >=0.12.0 - xesmf >=0.7.1 - xgboost >1.6.1 # github.com/ESMValGroup/ESMValTool/issues/2779 diff --git a/setup.py b/setup.py index bd584b7b3b..34ef66d80e 100755 --- a/setup.py +++ b/setup.py @@ -35,6 +35,7 @@ 'esmvalcore', 'esmf-regrid>=0.7.0', 'fiona', + 'fire', 'GDAL', 'jinja2', 'joblib', @@ -46,27 +47,27 @@ 'netCDF4', 'numba', 'numpy!=1.24.3', # severe masking bug - 'packaging', 'openpyxl', + 'packaging', 'pandas', - 'pyproj>=2.1', - 'pyyaml', 'progressbar2', 'psyplot', 'psy-maps', 'psy-reg', 'psy-simple', + 'pyproj>=2.1', + 'python-dateutil', + 'pyyaml', 'rasterio', + 'requests', 'ruamel.yaml', 'scikit-image', 'scikit-learn', 'scipy', - # See the following issue for info on the iris pin below: - # https://github.com/ESMValGroup/ESMValTool/issues/3239#issuecomment-1613298587 - 'scitools-iris>=3.4.0', + 'scitools-iris>=3.6.1', 'seaborn', 'seawater', - 'shapely', + 'shapely>=2', 'xarray>=0.12.0', 'xesmf>=0.7.1', 'xgboost>1.6.1', # github.com/ESMValGroup/ESMValTool/issues/2779 From 84706a06190febc43538846f2f5a1629f2b6321c Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Wed, 20 Dec 2023 14:17:22 +0100 Subject: [PATCH 33/39] Improve release tools (#3462) --- doc/sphinx/source/changelog.rst | 1456 ++++++++--------- doc/sphinx/source/community/maintainer.rst | 7 +- .../detailed_release_procedure.rst | 14 +- .../release_strategy/release_strategy.rst | 58 +- doc/sphinx/source/conf.py | 35 + doc/sphinx/source/utils.rst | 32 +- esmvaltool/utils/batch-jobs/generate.py | 56 +- .../utils/batch-jobs/parse_recipes_output.py | 197 +-- esmvaltool/utils/draft_release_notes.py | 25 +- 9 files changed, 978 insertions(+), 902 deletions(-) diff --git a/doc/sphinx/source/changelog.rst b/doc/sphinx/source/changelog.rst index 068a94a45b..d1180d3b8b 100644 --- a/doc/sphinx/source/changelog.rst +++ b/doc/sphinx/source/changelog.rst @@ -35,83 +35,83 @@ This release includes Bug fixes ~~~~~~~~~ -- Update recipe shapeselect to work with shapely v2 (`#3283 `__) `Lukas `__ -- Correctly handle ``~`` when reading ``plot_folder`` option of monitoring diagnostic (`#3449 `__) `Manuel Schlund `__ -- Fixed provenance tracking for NCL multipanel PNGs (`#3332 `__) `Manuel Schlund `__ -- Fixed plot paths in NCL provenance tracking (`#3422 `__) `Manuel Schlund `__ -- Fix erroneous file_type handling in certain NCL diagnostics (`#3474 `__) `Klaus Zimmermann `__ -- Fix NCL provenance tracking (`#3477 `__) `Manuel Schlund `__ -- Fix plots and provenance in Russell diagnostics (`#3479 `__) `Manuel Schlund `__ +- Update recipe shapeselect to work with shapely v2 (:pull:`3283`) :user:`lukruh` +- Correctly handle ``~`` when reading ``plot_folder`` option of monitoring diagnostic (:pull:`3449`) :user:`schlunma` +- Fixed provenance tracking for NCL multipanel PNGs (:pull:`3332`) :user:`schlunma` +- Fixed plot paths in NCL provenance tracking (:pull:`3422`) :user:`schlunma` +- Fix erroneous file_type handling in certain NCL diagnostics (:pull:`3474`) :user:`zklaus` +- Fix NCL provenance tracking (:pull:`3477`) :user:`schlunma` +- Fix plots and provenance in Russell diagnostics (:pull:`3479`) :user:`schlunma` Documentation ~~~~~~~~~~~~~ -- Add merge instructions to release instructions (`#3292 `__) `Rémi Kazeroni `__ -- Update release schedule after release of v2.9.0 (`#3289 `__) `Rémi Kazeroni `__ -- Add list of failing recipes for v2.9.0 release (`#3294 `__) `Rémi Kazeroni `__ -- Update ``mamba`` version in readthedocs configuration docs builds (`#3310 `__) `Valeriu Predoi `__ -- Add Romain Beucher to citation file as contributor (`#3318 `__) `Valeriu Predoi `__ -- Removed recipe_carvalhais14nat from list of broken recipes (`#3319 `__) `Rémi Kazeroni `__ -- Add `OBS-maintainers `__ team to documentation on OBS data maintenance and CMORizer reviews (`#3335 `__) `Rémi Kazeroni `__ -- Add Pauline Bonnet to citation file (`#3347 `__) `Paulinebonnet111 `__ -- Ensure compatible zstandard and zstd in readthedocs builds (`#3362 `__) `Klaus Zimmermann `__ -- Fix documentation build (`#3397 `__) `Bouwe Andela `__ -- Minor updates to release tools (`#3216 `__) `Bouwe Andela `__ -- Enhance provenance documentation (`#3305 `__) `Alistair Sellar `__ -- Re-add communities and grants in zenodo file (`#3416 `__) `Valeriu Predoi `__ -- Update Anconda badge in README (`#3375 `__, `#3453 `__) `Valeriu Predoi `__ +- Add merge instructions to release instructions (:pull:`3292`) :user:`remi-kazeroni` +- Update release schedule after release of v2.9.0 (:pull:`3289`) :user:`remi-kazeroni` +- Add list of failing recipes for v2.9.0 release (:pull:`3294`) :user:`remi-kazeroni` +- Update ``mamba`` version in readthedocs configuration docs builds (:pull:`3310`) :user:`valeriupredoi` +- Add Romain Beucher to citation file as contributor (:pull:`3318`) :user:`valeriupredoi` +- Removed recipe_carvalhais14nat from list of broken recipes (:pull:`3319`) :user:`remi-kazeroni` +- Add `OBS-maintainers `__ team to documentation on OBS data maintenance and CMORizer reviews (:pull:`3335`) :user:`remi-kazeroni` +- Add Pauline Bonnet to citation file (:pull:`3347`) :user:`Paulinebonnet111` +- Ensure compatible zstandard and zstd in readthedocs builds (:pull:`3362`) :user:`zklaus` +- Fix documentation build (:pull:`3397`) :user:`bouweandela` +- Minor updates to release tools (:pull:`3216`) :user:`bouweandela` +- Enhance provenance documentation (:pull:`3305`) :user:`alistairsellar` +- Re-add communities and grants in zenodo file (:pull:`3416`) :user:`valeriupredoi` +- Update Anconda badge in README (:pull:`3375`, :pull:`3453`) :user:`valeriupredoi` Diagnostics ~~~~~~~~~~~ -- Slight refactoring of diagnostic script ``galytska23/select_variables_for_tigramite.py`` for generality and portability (`#3298 `__) `Valeriu Predoi `__ and `Evgenia Galytska `__ -- Allow custom variable grouping in diagnostic script ``monitor/multi_datasets.py`` (`#3343 `__) `Manuel Schlund `__ -- Extended monitor diagnostic with plot type variable vs. latitude (`#3340 `__) `ellensarauer `__ -- Add Hovmoeller Z vs. time plot to monitoring diagnostic (`#3345 `__) `cubeme `__ and `helgehr `__ -- Adding Hovmoeller time vs latlon plots to monitoring recipes (`#3341 `__) `Lukas `__ and `jeremykraftdlr `__ -- Implied heat transport new diagnostic (`#3177 `__) `Alejandro Bodas `__ -- Recipe changes for new statistics preprocessors (percentiles) (`#3351 `__) `Manuel Schlund `__ -- Add a realistic example recipe (`#3356 `__) `Peter9192 `__ and `Bouwe Andela `__ -- Support ``CenteredNorm`` in diagnostic monitor/multidatasets.py (`#3415 `__) `Manuel Schlund `__ -- Use new preprocessor statistics calling convention for recipe_easy_ipcc.yml (`#3418 `__) `Bouwe Andela `__ -- Adapt to changed style scheme name in matplotlib (`#3475 `__) `Klaus Zimmermann `__ -- Add version to dataset in python example recipe to avoid "Unknown file format" issue on JASMIN (`#3322 `__) `Emma Hogan `__ -- Add the dataset version in the heatwaves_coldwaves recipe to avoid the "Unknown file format" issue on JASMIN (`#3373 `__) `Emma Hogan `__ +- Slight refactoring of diagnostic script ``galytska23/select_variables_for_tigramite.py`` for generality and portability (:pull:`3298`) :user:`valeriupredoi` and :user:`egalytska` +- Allow custom variable grouping in diagnostic script ``monitor/multi_datasets.py`` (:pull:`3343`) :user:`schlunma` +- Extended monitor diagnostic with plot type variable vs. latitude (:pull:`3340`) :user:`ellensarauer` +- Add Hovmoeller Z vs. time plot to monitoring diagnostic (:pull:`3345`) :user:`cubeme` and :user:`helgehr` +- Adding Hovmoeller time vs latlon plots to monitoring recipes (:pull:`3341`) :user:`lukruh` and :user:`jeremykraftdlr` +- Implied heat transport new diagnostic (:pull:`3177`) :user:`mo-abodas` +- Recipe changes for new statistics preprocessors (percentiles) (:pull:`3351`) :user:`schlunma` +- Add a realistic example recipe (:pull:`3356`) :user:`Peter9191` and :user:`bouweandela` +- Support ``CenteredNorm`` in diagnostic monitor/multidatasets.py (:pull:`3415`) :user:`schlunma` +- Use new preprocessor statistics calling convention for recipe_easy_ipcc.yml (:pull:`3418`) :user:`bouweandela` +- Adapt to changed style scheme name in matplotlib (:pull:`3475`) :user:`zklaus` +- Add version to dataset in python example recipe to avoid "Unknown file format" issue on JASMIN (:pull:`3322`) :user:`ehogan` +- Add the dataset version in the heatwaves_coldwaves recipe to avoid the "Unknown file format" issue on JASMIN (:pull:`3373`) :user:`ehogan` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Cmorizer for NOAA-CIRES-20CR v3 reanalysis (clt, clwvi, hus, prw, rlut, rlutcs, rsut, rsutcs) (`#3137 `__) `Lisa Bock `__ -- CMORizer for NASA MERRA reanalysis (`#3039 `__) `Axel Lauer `__ -- Download and formatting of NOAA marine boundary layer data for CH4 (NOAA-MBL-CH4) (`#3301 `__) `FranziskaWinterstein `__ -- Added CMORizer for MOBO-DIC2004-2019 (`#3297 `__) `Manuel Schlund `__ -- Update obs4MIPs dataset names in quantilebias recipe (`#3330 `__) `Romain Beucher `__ -- Update obs4MIPs dataset names in Schlund20esd recipe (`#3329 `__) `Romain Beucher `__ -- Update obs4MIPs dataset names in flatoipcc recipes (`#3328 `__) `Romain Beucher `__ -- Update obs4mips dataset names in clouds recipes (`#3326 `__) `Romain Beucher `__ -- Update Obs4MIPs dataset names in ECS recipes (`#3327 `__) `Romain Beucher `__ -- Update obs4mips dataset names in Bock et al recipes (`#3324 `__, `#3389 `__ and `#3473 `__) `Romain Beucher `__ and `Bouwe Andela `__ -- Update obs4mips dataset names in radiation budget recipe (`#3323 `__) `Romain Beucher `__ -- Update Obs4MIPs dataset names in perfmetrics CMIP5 recipe (`#3325 `__) `Romain Beucher `__ +- Cmorizer for NOAA-CIRES-20CR v3 reanalysis (clt, clwvi, hus, prw, rlut, rlutcs, rsut, rsutcs) (:pull:`3137`) :user:`LisaBock` +- CMORizer for NASA MERRA reanalysis (:pull:`3039`) :user:`axel-lauer` +- Download and formatting of NOAA marine boundary layer data for CH4 (NOAA-MBL-CH4) (:pull:`3301`) :user:`FranziskaWinterstein` +- Added CMORizer for MOBO-DIC2004-2019 (:pull:`3297`) :user:`schlunma` +- Update obs4MIPs dataset names in quantilebias recipe (:pull:`3330`) :user:`rbeucher` +- Update obs4MIPs dataset names in Schlund20esd recipe (:pull:`3329`) :user:`rbeucher` +- Update obs4MIPs dataset names in flatoipcc recipes (:pull:`3328`) :user:`rbeucher` +- Update obs4mips dataset names in clouds recipes (:pull:`3326`) :user:`rbeucher` +- Update Obs4MIPs dataset names in ECS recipes (:pull:`3327`) :user:`rbeucher` +- Update obs4mips dataset names in Bock et al recipes (:pull:`3324`, :pull:`3389` and :pull:`3473`) :user:`rbeucher` and :user:`bouweandela` +- Update obs4mips dataset names in radiation budget recipe (:pull:`3323`) :user:`rbeucher` +- Update Obs4MIPs dataset names in perfmetrics CMIP5 recipe (:pull:`3325`) :user:`rbeucher` Automatic testing ~~~~~~~~~~~~~~~~~ -- Made sklearn test backwards-compatible with sklearn < 1.3 (`#3285 `__) `Manuel Schlund `__ -- Update conda lock creation Github Action workflow and ship updated conda-lock file (`#3307 `__, `#3407 `__) `Valeriu Predoi `__ -- Compress all bash shell setters into one default option per GitHub Action workflow (`#3315 `__) `Valeriu Predoi `__ -- Remove deprecated option ``offline`` from CI configuration (`#3367 `__) `Manuel Schlund `__ +- Made sklearn test backwards-compatible with sklearn < 1.3 (:pull:`3285`) :user:`schlunma` +- Update conda lock creation Github Action workflow and ship updated conda-lock file (:pull:`3307`, :pull:`3407`) :user:`valeriupredoi` +- Compress all bash shell setters into one default option per GitHub Action workflow (:pull:`3315`) :user:`valeriupredoi` +- Remove deprecated option ``offline`` from CI configuration (:pull:`3367`) :user:`schlunma` Installation ~~~~~~~~~~~~ -- Use ESMValCore v2.10 (`#3486 `__) `Bouwe Andela `__ +- Use ESMValCore v2.10 (:pull:`3486`) :user:`bouweandela` Improvements ~~~~~~~~~~~~ -- Merge v2.9.x into main (`#3286 `__) `Manuel Schlund `__ -- Allow NCL unit conversion `kg s-1` -> `GtC y-1` (`#3300 `__) `Manuel Schlund `__ +- Merge v2.9.x into main (:pull:`3286`) :user:`schlunma` +- Allow NCL unit conversion `kg s-1` -> `GtC y-1` (:pull:`3300`) :user:`schlunma` .. _changelog-v2-9-0: @@ -156,70 +156,70 @@ This release includes Bug fixes ~~~~~~~~~ -- Fixed usage of ``work_dir`` in some CMORizer scripts (`#3192 `__) `Rémi Kazeroni `__ -- Realize data for scalar cube in `recipe_carvalhais14nat` to avert issue from dask latest (2023.6.0) (`#3265 `__) `Valeriu Predoi `__ -- Fix failing ``mlr`` diagnostic test by adding new scikit-learn default tag (`#3273 `__) `Rémi Kazeroni `__ -- Fix ordering of models in perfmetrics diagnostic script (`#3275 `__) `Lisa Bock `__ +- Fixed usage of ``work_dir`` in some CMORizer scripts (:pull:`3192`) :user:`remi-kazeroni` +- Realize data for scalar cube in `recipe_carvalhais14nat` to avert issue from dask latest (2023.6.0) (:pull:`3265`) :user:`valeriupredoi` +- Fix failing ``mlr`` diagnostic test by adding new scikit-learn default tag (:pull:`3273`) :user:`remi-kazeroni` +- Fix ordering of models in perfmetrics diagnostic script (:pull:`3275`) :user:`LisaBock` Documentation ~~~~~~~~~~~~~ -- Update release schedule after v2.8.0 (`#3138 `__) `Rémi Kazeroni `__ -- Added reference entry for Winterstein (`#3154 `__) `FranziskaWinterstein `__ -- Show logo on PyPI (`#3185 `__) `Valeriu Predoi `__ -- Add Release Managers for v2.9.0 and v2.10.0 (`#3184 `__) `Rémi Kazeroni `__ -- Fix readthedocs build with esmpy>=8.4.0 and missing ESMFMKFILE variable (`#3205 `__) `Valeriu Predoi `__ -- Add ESMValCore release v2.8.1 into the documentation (`#3235 `__) `Rémi Kazeroni `__ -- Modified links to the tutorial (`#3236 `__) `Rémi Kazeroni `__ -- Fix gitter badge in README (`#3258 `__) `Rémi Kazeroni `__ -- Add release notes for v2.9.0 (`#3266 `__) `Bouwe Andela `__ +- Update release schedule after v2.8.0 (:pull:`3138`) :user:`remi-kazeroni` +- Added reference entry for Winterstein (:pull:`3154`) :user:`FranziskaWinterstein` +- Show logo on PyPI (:pull:`3185`) :user:`valeriupredoi` +- Add Release Managers for v2.9.0 and v2.10.0 (:pull:`3184`) :user:`remi-kazeroni` +- Fix readthedocs build with esmpy>=8.4.0 and missing ESMFMKFILE variable (:pull:`3205`) :user:`valeriupredoi` +- Add ESMValCore release v2.8.1 into the documentation (:pull:`3235`) :user:`remi-kazeroni` +- Modified links to the tutorial (:pull:`3236`) :user:`remi-kazeroni` +- Fix gitter badge in README (:pull:`3258`) :user:`remi-kazeroni` +- Add release notes for v2.9.0 (:pull:`3266`) :user:`bouweandela` Diagnostics ~~~~~~~~~~~ -- New plot_type 1d_profile in monitor (`#3178 `__) `FranziskaWinterstein `__ -- Add Seaborn diagnostic (`#3155 `__) `Manuel Schlund `__ -- New recipe and diagnostic for Arctic-midlatitude research (`#3021 `__) `Evgenia Galytska `__ -- Generate climatology on the fly for AutoAssess soil moisture (`#3197 `__) `Alistair Sellar `__ -- Remove "fx_variables" from recipe_tebaldi21esd.yml (`#3211 `__) `Birgit Hassler `__ -- Remove "fx_variables" from ipccwg1ar5ch9 recipes (`#3215 `__) `katjaweigel `__ -- Remove "fx_variables" from recipe_wenzel14jgr.yml (`#3212 `__) `Birgit Hassler `__ -- Update obs4MIPs dataset to the current naming scheme in recipe_smpi.yml (`#2991 `__) `Bouwe Andela `__ -- Fixed pandas diagnostics for pandas>=2.0.0 (`#3209 `__) `Manuel Schlund `__ -- Update recipe_impact.yml to work with newer versions of `pandas` (`#3220 `__) `Bouwe Andela `__ -- Add variable long names to provenance record in monitoring diagnostics (`#3222 `__) `Brei Soliño `__ +- New plot_type 1d_profile in monitor (:pull:`3178`) :user:`FranziskaWinterstein` +- Add Seaborn diagnostic (:pull:`3155`) :user:`schlunma` +- New recipe and diagnostic for Arctic-midlatitude research (:pull:`3021`) :user:`egalytska` +- Generate climatology on the fly for AutoAssess soil moisture (:pull:`3197`) :user:`alistairsellar` +- Remove "fx_variables" from recipe_tebaldi21esd.yml (:pull:`3211`) :user:`hb326` +- Remove "fx_variables" from ipccwg1ar5ch9 recipes (:pull:`3215`) :user:`katjaweigel` +- Remove "fx_variables" from recipe_wenzel14jgr.yml (:pull:`3212`) :user:`hb326` +- Update obs4MIPs dataset to the current naming scheme in recipe_smpi.yml (:pull:`2991`) :user:`bouweandela` +- Fixed pandas diagnostics for pandas>=2.0.0 (:pull:`3209`) :user:`schlunma` +- Update recipe_impact.yml to work with newer versions of `pandas` (:pull:`3220`) :user:`bouweandela` +- Add variable long names to provenance record in monitoring diagnostics (:pull:`3222`) :user:`bsolino` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Add CMORizer for GPCP-SG (pr) (`#3150 `__) `FranziskaWinterstein `__ -- Extension of NASA MERRA2 CMORizer (cl, cli, clivi, clw, clwvi) (`#3167 `__) `Axel Lauer `__ +- Add CMORizer for GPCP-SG (pr) (:pull:`3150`) :user:`FranziskaWinterstein` +- Extension of NASA MERRA2 CMORizer (cl, cli, clivi, clw, clwvi) (:pull:`3167`) :user:`axel-lauer` Automatic testing ~~~~~~~~~~~~~~~~~ -- Add a CircleCI-testing-specific ``recipe_python_for_CI.yml`` to avoid calling geolocator/Nominatim over CI (`#3159 `__) `Valeriu Predoi `__ -- Check if Python minor version changed after Julia install in development installation test (`#3213 `__) `Valeriu Predoi `__ -- Fix tests using deprecated ``esmvalcore._config`` module that has been removed in ESMValCore v2.9 (`#3204 `__) `Valeriu Predoi `__ +- Add a CircleCI-testing-specific ``recipe_python_for_CI.yml`` to avoid calling geolocator/Nominatim over CI (:pull:`3159`) :user:`valeriupredoi` +- Check if Python minor version changed after Julia install in development installation test (:pull:`3213`) :user:`valeriupredoi` +- Fix tests using deprecated ``esmvalcore._config`` module that has been removed in ESMValCore v2.9 (:pull:`3204`) :user:`valeriupredoi` Installation ~~~~~~~~~~~~ -- Add support for Python=3.11 (`#3173 `__) `Valeriu Predoi `__ -- Drop python=3.8 support (`#3193 `__) `Valeriu Predoi `__ -- Repair generation of conda lock files (`#3148 `__) `Valeriu Predoi `__ -- Modernize lock creation script and repair lock generation (`#3174 `__) `Valeriu Predoi `__ -- Pin numpy !=1.24.3 due to severe masking bug (`#3182 `__) `Valeriu Predoi `__ -- Update xesmf to versions >= 0.4.0 (`#2728 `__) `Klaus Zimmermann `__ -- Update esmpy import for ESMF version 8.4.0 or larger (`#3188 `__) `Valeriu Predoi `__ -- Relax the pin on iris to allow the use of older versions for performance reasons (`#3270 `__) `Bouwe Andela `__ -- Use ESMValCore v2.9.0 (`#3274 `__) `Bouwe Andela `__ +- Add support for Python=3.11 (:pull:`3173`) :user:`valeriupredoi` +- Drop python=3.8 support (:pull:`3193`) :user:`valeriupredoi` +- Repair generation of conda lock files (:pull:`3148`) :user:`valeriupredoi` +- Modernize lock creation script and repair lock generation (:pull:`3174`) :user:`valeriupredoi` +- Pin numpy !=1.24.3 due to severe masking bug (:pull:`3182`) :user:`valeriupredoi` +- Update xesmf to versions >= 0.4.0 (:pull:`2728`) :user:`zklaus` +- Update esmpy import for ESMF version 8.4.0 or larger (:pull:`3188`) :user:`valeriupredoi` +- Relax the pin on iris to allow the use of older versions for performance reasons (:pull:`3270`) :user:`bouweandela` +- Use ESMValCore v2.9.0 (:pull:`3274`) :user:`bouweandela` Improvements ~~~~~~~~~~~~ -- Update pre-commit hooks (`#3189 `__) `Bouwe Andela `__ -- Add support for using a dask distributed scheduler (`#3151 `__) `Bouwe Andela `__ +- Update pre-commit hooks (:pull:`3189`) :user:`bouweandela` +- Add support for using a dask distributed scheduler (:pull:`3151`) :user:`bouweandela` .. _changelog-v2-8-0: @@ -262,22 +262,22 @@ Backwards incompatible changes Please read the descriptions of the linked pull requests for detailed upgrade instructions. - Deprecated features scheduled for removal in v2.8.0 or earlier have now been removed - (`#2941 `__) - `Manuel Schlund `__. + (:pull:`2941`) + :user:`schlunma`. Removed ``esmvaltool.iris_helpers.var_name_constraint`` (has been deprecated in v2.6.0; please use :class:`iris.NameConstraint` with the keyword argument ``var_name`` instead). Removed `write_netcdf` and `write_plots` from `recipe_filer.py`. - No files from the ``native6`` project will be found if a non-existent version of a dataset is specified (`#3041 `_) - `Rémi Kazeroni `__. + :user:`remi-kazeroni`. The tool now searches for exact ``version`` of ``native6`` datasets. Therefore, it is necessary to make sure that the version number in the directory tree matches with the version number in the recipe to find the files. - The conversion of precipitation units from monitoring diagnostic is now done at the preprocessor stage (`#3049 `_) - `Manuel Schlund `__. + :user:`schlunma`. To use the unit conversion for precipitation in the new version of this diagnostic, add it as a preprocessor for the precipitation dataset to the recipe. @@ -285,145 +285,145 @@ Please read the descriptions of the linked pull requests for detailed upgrade in Bug fixes ~~~~~~~~~ -- Fix for provenance records from `seaice_tsline.ncl` (`#2938 `__) `Axel Lauer `__ -- Fix in `validation.py` for resolving datasets with identical names by using distinct aliases (`#2955 `__) `FranziskaWinterstein `__ -- Bugfix: masking of non-significant differences in `zonal.ncl` (perfmetrics) (`#2957 `__) `Axel Lauer `__ -- Fix typo in `perfmetrics/main.ncl` to add tropopause (`#2966 `__) `FranziskaWinterstein `__ -- Fix .png bug in `wenzel16nat` diagnostics (`#2976 `__) `Axel Lauer `__ -- `Recipe_ocean_Landschuetzer2016`: Fix typo in filename to run model vs OBS diagnostics (`#2997 `__) `Tomas Torsvik `__ -- Fix read_cmor in NCL utilities (`#3007 `__) `Axel Lauer `__ -- Removed usages of deprecated features that cause diagnostic crashes (`#3009 `__) `Manuel Schlund `__ -- Replace removed `matplotlib.pyplot.savefig` option `additional_artists` (`#3075 `__) `Manuel Schlund `__ -- Added missing comma to `sommer17joss.bibtex` (`#3078 `__) `Manuel Schlund `__ -- Fix call of output_type in `aux_plotting.ncl` (`#3083 `__) `Lisa Bock `__ -- Remove colorbar from `bbox_extra_artists` (`#3087 `__) `Manuel Schlund `__ -- Fix `MPI-ESM1-2-HR` entries in `recipe_tebaldi21esd` (`#3093 `__) `Rémi Kazeroni `__ -- Fix bug in provenance writing of `perfmetrics` recipes v2.8.0 (`#3098 `__) `Axel Lauer `__ -- Fix `recipe_sea_surface_salinity` for v2.8 (`#3102 `__) `sloosvel `__ -- Fix variable `short_name` and metadata for ESACCI-LST CMORizer (`#3104 `__) `Rémi Kazeroni `__ -- Fix `recipe_carvalhais14`: replace outline patch with splines (`#3111 `__) `Valeriu Predoi `__ -- Replace deprecated function `cm.register_cmap` with `mpl.colormaps.register` for `recipe_ arctic_ocean` (`#3112 `__) `Tomas Torsvik `__ -- Fix `recipe_extract_shape.yml` (lacking caption for provenance) (`#3126 `__) `Valeriu Predoi `__ +- Fix for provenance records from `seaice_tsline.ncl` (:pull:`2938`) :user:`axel-lauer` +- Fix in `validation.py` for resolving datasets with identical names by using distinct aliases (:pull:`2955`) :user:`FranziskaWinterstein` +- Bugfix: masking of non-significant differences in `zonal.ncl` (perfmetrics) (:pull:`2957`) :user:`axel-lauer` +- Fix typo in `perfmetrics/main.ncl` to add tropopause (:pull:`2966`) :user:`FranziskaWinterstein` +- Fix .png bug in `wenzel16nat` diagnostics (:pull:`2976`) :user:`axel-lauer` +- `Recipe_ocean_Landschuetzer2016`: Fix typo in filename to run model vs OBS diagnostics (:pull:`2997`) :user:`TomasTorsvik` +- Fix read_cmor in NCL utilities (:pull:`3007`) :user:`axel-lauer` +- Removed usages of deprecated features that cause diagnostic crashes (:pull:`3009`) :user:`schlunma` +- Replace removed `matplotlib.pyplot.savefig` option `additional_artists` (:pull:`3075`) :user:`schlunma` +- Added missing comma to `sommer17joss.bibtex` (:pull:`3078`) :user:`schlunma` +- Fix call of output_type in `aux_plotting.ncl` (:pull:`3083`) :user:`LisaBock` +- Remove colorbar from `bbox_extra_artists` (:pull:`3087`) :user:`schlunma` +- Fix `MPI-ESM1-2-HR` entries in `recipe_tebaldi21esd` (:pull:`3093`) :user:`remi-kazeroni` +- Fix bug in provenance writing of `perfmetrics` recipes v2.8.0 (:pull:`3098`) :user:`axel-lauer` +- Fix `recipe_sea_surface_salinity` for v2.8 (:pull:`3102`) :user:`sloosvel` +- Fix variable `short_name` and metadata for ESACCI-LST CMORizer (:pull:`3104`) :user:`remi-kazeroni` +- Fix `recipe_carvalhais14`: replace outline patch with splines (:pull:`3111`) :user:`valeriupredoi` +- Replace deprecated function `cm.register_cmap` with `mpl.colormaps.register` for `recipe_ arctic_ocean` (:pull:`3112`) :user:`TomasTorsvik` +- Fix `recipe_extract_shape.yml` (lacking caption for provenance) (:pull:`3126`) :user:`valeriupredoi` Community ~~~~~~~~~ -- Update documentation on pre-installed versions on HPC clusters (`#2934 `__) `Rémi Kazeroni `__ +- Update documentation on pre-installed versions on HPC clusters (:pull:`2934`) :user:`remi-kazeroni` Deprecations ~~~~~~~~~~~~ -- Remove radiation recipes that have been superseded by :ref:`recipe_radiation_budget ` along with associated diagnostic scripts (`#3115 `_) `Alistair Sellar `__ +- Remove radiation recipes that have been superseded by :ref:`recipe_radiation_budget ` along with associated diagnostic scripts (`#3115 `_) :user:`alistairsellar` Documentation ~~~~~~~~~~~~~ -- Backward compatibility policy (`#2879 `__) `Alistair Sellar `__ -- Suppress installing and reinstalling dependencies with pip during readthedocs builds (`#2913 `__) `Valeriu Predoi `__ -- Update installation instructions (`#2939 `__) `Bouwe Andela `__ -- Update documentation for `recipe_extreme_index` (`#2951 `__) `katjaweigel `__ -- Update documentation and `recipe_check_obs` (ERA5) (`#2952 `__) `Axel Lauer `__ -- Updated ICON dataset entry in documentation (`#2954 `__) `Manuel Schlund `__ -- Add Franziska Winterstein as collaborator in CITATION file (`#3001 `__) `Valeriu Predoi `__ -- Update release schedule for v2.7.0 and v2.8.0 (`#3010 `__) `Rémi Kazeroni `__ -- Add ESMValCore Bugfix release v2.7.1 to the release overview table (`#3028 `__) `Valeriu Predoi `__ -- Detailed instructions for release procedure: running recipes and analyzing the output (`#3032 `__) `Valeriu Predoi `__ -- Link backward compatibility policy to top level of ESMValCore changelog (`#3052 `__) `Alistair Sellar `__ -- Update release instructions (`#3066 `__) `Rémi Kazeroni `__ -- Updated docs and tests regarding new `search_esgf` option (`#3069 `__) `Manuel Schlund `__ -- Update script to draft release notes (`#3070 `__) `Rémi Kazeroni `__ -- Synchronize documentation table of contents with ESMValCore (`#3073 `__) `Bouwe Andela `__ -- Update environment handling in release documentation (`#3096 `__) `Rémi Kazeroni `__ -- Clarify use (or not) of Jasmin climatology files by soil moisture & permafrost recipes (`#3103 `__) `Alistair Sellar `__ -- Add link to recipe portal in the gallery page (`#3113 `__) `Rémi Kazeroni `__ -- Improve stratosphere documentation (`#3114 `__) `Alistair Sellar `__ -- Added note to documentation that not all datasets used in `schlund20jgr` recipes are available on ESGF (`#3121 `__) `Manuel Schlund `__ -- Draft changelog for `v2.8.0` (`#3124 `__) `Rémi Kazeroni `__ -- Documenting broken recipes after recipe testing for releases (`#3129 `__) `Rémi Kazeroni `__ -- Increase ESMValTool version to 2.8.0 and update release dates (`#3136 `__) `Rémi Kazeroni `__ +- Backward compatibility policy (:pull:`2879`) :user:`alistairsellar` +- Suppress installing and reinstalling dependencies with pip during readthedocs builds (:pull:`2913`) :user:`valeriupredoi` +- Update installation instructions (:pull:`2939`) :user:`bouweandela` +- Update documentation for `recipe_extreme_index` (:pull:`2951`) :user:`katjaweigel` +- Update documentation and `recipe_check_obs` (ERA5) (:pull:`2952`) :user:`axel-lauer` +- Updated ICON dataset entry in documentation (:pull:`2954`) :user:`schlunma` +- Add Franziska Winterstein as collaborator in CITATION file (:pull:`3001`) :user:`valeriupredoi` +- Update release schedule for v2.7.0 and v2.8.0 (:pull:`3010`) :user:`remi-kazeroni` +- Add ESMValCore Bugfix release v2.7.1 to the release overview table (:pull:`3028`) :user:`valeriupredoi` +- Detailed instructions for release procedure: running recipes and analyzing the output (:pull:`3032`) :user:`valeriupredoi` +- Link backward compatibility policy to top level of ESMValCore changelog (:pull:`3052`) :user:`alistairsellar` +- Update release instructions (:pull:`3066`) :user:`remi-kazeroni` +- Updated docs and tests regarding new `search_esgf` option (:pull:`3069`) :user:`schlunma` +- Update script to draft release notes (:pull:`3070`) :user:`remi-kazeroni` +- Synchronize documentation table of contents with ESMValCore (:pull:`3073`) :user:`bouweandela` +- Update environment handling in release documentation (:pull:`3096`) :user:`remi-kazeroni` +- Clarify use (or not) of Jasmin climatology files by soil moisture & permafrost recipes (:pull:`3103`) :user:`alistairsellar` +- Add link to recipe portal in the gallery page (:pull:`3113`) :user:`remi-kazeroni` +- Improve stratosphere documentation (:pull:`3114`) :user:`alistairsellar` +- Added note to documentation that not all datasets used in `schlund20jgr` recipes are available on ESGF (:pull:`3121`) :user:`schlunma` +- Draft changelog for `v2.8.0` (:pull:`3124`) :user:`remi-kazeroni` +- Documenting broken recipes after recipe testing for releases (:pull:`3129`) :user:`remi-kazeroni` +- Increase ESMValTool version to 2.8.0 and update release dates (:pull:`3136`) :user:`remi-kazeroni` Diagnostics ~~~~~~~~~~~ -- Cloud diagnostics for Lauer et al. (2023) (`#2750 `__) `Axel Lauer `__ -- Splitting of `flato13ipcc.yml` into separate recipes and adding recipes for regional Figures (`#2156 `__) `katjaweigel `__ -- Adding IPCC AR6 Chapter 3 Figure 3.43 - Pattern Correlation (`#2772 `__) `Lisa Bock `__ -- Adding IPCC AR6 Chapter 3 Fig. 3.42 - Perfmetrics (`#2856 `__) `Lisa Bock `__ -- Comment missing datasets and remove deprecated argument in `recipe_climate_change_hotspot` (`#2920 `__) `sloosvel `__ -- Add plot type `annual_cycle` to multi-dataset monitoring diagnostic (`#2922 `__) `Manuel Schlund `__ -- Adding IPCC AR6 Chapter 3 Fig. 3.19 - Speed-Up Of Zonal Mean Wind (`#2984 `__) `Lisa Bock `__ -- Adding IPCC AR6 Chapter 3 Fig. 3.9 - Attribution (`#2986 `__) `Lisa Bock `__ -- Obs4mips CERES-EBAF: update version to latest available through esgf in `recipe_validation.yml` (`#3002 `__) `Valeriu Predoi `__ -- Improve flexibility of cloud diagnostics (`#3016 `__) `Axel Lauer `__ -- Let `recipe_impact.yml` write a CSV file that can directly be used in C4I portal (`#2258 `__) `Peter Kalverla `__ -- Fix version numbers of native6 datasets in recipes (`#3041`_) `Rémi Kazeroni `__ -- Removed automatic conversion of precipitation units from monitoring diagnostic (`#3049`_) `Manuel Schlund `__. -- Updated recipes for ESMValCore v2.8 (`#3064 `__) `Manuel Schlund `__ -- Fix `cos22esd` for release of 2.8 (`#3097 `__) `sloosvel `__ -- Diagnostic for `recipe_autoassess_stratosphere.yml`: remove unused feature incompatible with Matplotlib=3.7.1 (`#3089 `__) `Valeriu Predoi `__ -- Fix numpy deprecation in `hype` diagnostic (`#3101 `__) `Peter Kalverla `__ -- Remove superseded radiation recipes (`#3115`_) `Alistair Sellar `__ -- Removed `fx_variables` in `recipe_mpqb_xch4` and `recipe_lauer22jclim_fig8` (`#3117 `__) `Axel Lauer `__ -- Update Python example recipe (`#3119 `__) `Bouwe Andela `__ -- Updated figure settings to account for newer matplotlib version (`#3133 `__) `katjaweigel `__ +- Cloud diagnostics for Lauer et al. (2023) (:pull:`2750`) :user:`axel-lauer` +- Splitting of `flato13ipcc.yml` into separate recipes and adding recipes for regional Figures (:pull:`2156`) :user:`katjaweigel` +- Adding IPCC AR6 Chapter 3 Figure 3.43 - Pattern Correlation (:pull:`2772`) :user:`LisaBock` +- Adding IPCC AR6 Chapter 3 Fig. 3.42 - Perfmetrics (:pull:`2856`) :user:`LisaBock` +- Comment missing datasets and remove deprecated argument in `recipe_climate_change_hotspot` (:pull:`2920`) :user:`sloosvel` +- Add plot type `annual_cycle` to multi-dataset monitoring diagnostic (:pull:`2922`) :user:`schlunma` +- Adding IPCC AR6 Chapter 3 Fig. 3.19 - Speed-Up Of Zonal Mean Wind (:pull:`2984`) :user:`LisaBock` +- Adding IPCC AR6 Chapter 3 Fig. 3.9 - Attribution (:pull:`2986`) :user:`LisaBock` +- Obs4mips CERES-EBAF: update version to latest available through esgf in `recipe_validation.yml` (:pull:`3002`) :user:`valeriupredoi` +- Improve flexibility of cloud diagnostics (:pull:`3016`) :user:`axel-lauer` +- Let `recipe_impact.yml` write a CSV file that can directly be used in C4I portal (:pull:`2258`) :user:`Peter9192` +- Fix version numbers of native6 datasets in recipes (`#3041`_) :user:`remi-kazeroni` +- Removed automatic conversion of precipitation units from monitoring diagnostic (`#3049`_) :user:`schlunma`. +- Updated recipes for ESMValCore v2.8 (:pull:`3064`) :user:`schlunma` +- Fix `cos22esd` for release of 2.8 (:pull:`3097`) :user:`sloosvel` +- Diagnostic for `recipe_autoassess_stratosphere.yml`: remove unused feature incompatible with Matplotlib=3.7.1 (:pull:`3089`) :user:`valeriupredoi` +- Fix numpy deprecation in `hype` diagnostic (:pull:`3101`) :user:`Peter9192` +- Remove superseded radiation recipes (`#3115`_) :user:`alistairsellar` +- Removed `fx_variables` in `recipe_mpqb_xch4` and `recipe_lauer22jclim_fig8` (:pull:`3117`) :user:`axel-lauer` +- Update Python example recipe (:pull:`3119`) :user:`bouweandela` +- Updated figure settings to account for newer matplotlib version (:pull:`3133`) :user:`katjaweigel` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Earth System Data Cube (ESDC) cmorizer (`#2799 `__) `Brei Soliño `__ -- Added CMORizer for Landschützer2020 (spco2) (`#2908 `__) `Manuel Schlund `__ -- Added CMORizer for MOBO-DIC_MPIM (dissic) (`#2909 `__) `Manuel Schlund `__ -- Added CMORizer for OceanSODA-ETHZ (areacello, co3os, dissicos, fgco2, phos, spco2, talkos) (`#2915 `__) `Manuel Schlund `__ -- Extension of ERA-Interim CMORizer (cl, cli, clw, lwp, rlut, rlutcs, rsut, rsutcs) (`#2923 `__) `Axel Lauer `__ -- Add JRA-25 cmorizer (clt, hus, prw, rlut, rlutcs, rsut, rsutcs) (`#2927 `__) `Lisa Bock `__ -- New CMORizers for datasets from the NCEP family (NCEP-DOE-R2, NCEP-NCAR-R1, NOAA-CIRES-20CR) (`#2931 `__) `Birgit Hassler `__ -- Updates to the recipes that use the NCEP reanalysis dataset (`#2932 `__) `Birgit Hassler `__ -- MERRA2 cmorizer convert vertical level coordinate units from hPa to Pa (`#3003 `__) `Valeriu Predoi `__ -- MERRA2 cmorizer set UNLIMITED time coordinate (`#3006 `__) `Valeriu Predoi `__ -- Added CMORizers for TCOM-CH4 (CH4) and TCOM-N2O (N2O) (`#3014 `__) `Manuel Schlund `__ -- Update HadISST cmorizer to include recent years (`#3027 `__) `Rémi Kazeroni `__ +- Earth System Data Cube (ESDC) cmorizer (:pull:`2799`) :user:`bsolino` +- Added CMORizer for Landschützer2020 (spco2) (:pull:`2908`) :user:`schlunma` +- Added CMORizer for MOBO-DIC_MPIM (dissic) (:pull:`2909`) :user:`schlunma` +- Added CMORizer for OceanSODA-ETHZ (areacello, co3os, dissicos, fgco2, phos, spco2, talkos) (:pull:`2915`) :user:`schlunma` +- Extension of ERA-Interim CMORizer (cl, cli, clw, lwp, rlut, rlutcs, rsut, rsutcs) (:pull:`2923`) :user:`axel-lauer` +- Add JRA-25 cmorizer (clt, hus, prw, rlut, rlutcs, rsut, rsutcs) (:pull:`2927`) :user:`LisaBock` +- New CMORizers for datasets from the NCEP family (NCEP-DOE-R2, NCEP-NCAR-R1, NOAA-CIRES-20CR) (:pull:`2931`) :user:`hb326` +- Updates to the recipes that use the NCEP reanalysis dataset (:pull:`2932`) :user:`hb326` +- MERRA2 cmorizer convert vertical level coordinate units from hPa to Pa (:pull:`3003`) :user:`valeriupredoi` +- MERRA2 cmorizer set UNLIMITED time coordinate (:pull:`3006`) :user:`valeriupredoi` +- Added CMORizers for TCOM-CH4 (CH4) and TCOM-N2O (N2O) (:pull:`3014`) :user:`schlunma` +- Update HadISST cmorizer to include recent years (:pull:`3027`) :user:`remi-kazeroni` Automatic testing ~~~~~~~~~~~~~~~~~ -- Add DKRZ/Levante batch scripts for release recipe running (`#2883 `__) `Valeriu Predoi `__ -- Remove `pytest-flake8` and call the use of `flake8` straight (`#2904 `__) `Valeriu Predoi `__ -- Unpin `flake8` (`#2937 `__) `Valeriu Predoi `__ -- Fix failing tests that use deprecated feature of `sklearn` (`#2961 `__) `Manuel Schlund `__ -- Fix recipe loading tests for esmvalcore before and after version 2.8 (`#3020 `__) `Valeriu Predoi `__ -- Update recipe load test for v2.8 (`#3040 `__) `Bouwe Andela `__ -- Test running recipes with the development version of ESMValCore (`#3072 `__) `Bouwe Andela `__ -- Fix `test_naming.py` so it doesn't let through directories that need be ignored (`#3082 `__) `Valeriu Predoi `__ -- Conda environment files for interim use of `esmvalcore=2.8.0rc1` (`#3090 `__) `Valeriu Predoi `__ -- Move `flake8` check to a step separate from installation on CircleCI (`#3105 `__) `Bouwe Andela `__ -- Recreate conda lock file to harpoon esmvalcore=2.8.0rc1 (`#3108 `__) `Valeriu Predoi `__ -- Update batch script generation to run all recipes in one command (`#3130 `__) `Rémi Kazeroni `__ +- Add DKRZ/Levante batch scripts for release recipe running (:pull:`2883`) :user:`valeriupredoi` +- Remove `pytest-flake8` and call the use of `flake8` straight (:pull:`2904`) :user:`valeriupredoi` +- Unpin `flake8` (:pull:`2937`) :user:`valeriupredoi` +- Fix failing tests that use deprecated feature of `sklearn` (:pull:`2961`) :user:`schlunma` +- Fix recipe loading tests for esmvalcore before and after version 2.8 (:pull:`3020`) :user:`valeriupredoi` +- Update recipe load test for v2.8 (:pull:`3040`) :user:`bouweandela` +- Test running recipes with the development version of ESMValCore (:pull:`3072`) :user:`bouweandela` +- Fix `test_naming.py` so it doesn't let through directories that need be ignored (:pull:`3082`) :user:`valeriupredoi` +- Conda environment files for interim use of `esmvalcore=2.8.0rc1` (:pull:`3090`) :user:`valeriupredoi` +- Move `flake8` check to a step separate from installation on CircleCI (:pull:`3105`) :user:`bouweandela` +- Recreate conda lock file to harpoon esmvalcore=2.8.0rc1 (:pull:`3108`) :user:`valeriupredoi` +- Update batch script generation to run all recipes in one command (:pull:`3130`) :user:`remi-kazeroni` Installation ~~~~~~~~~~~~ -- Merge release branch `release_270stable` in main so we pick up unsquashed commits and set the correct version 2.7.0 for main (and up version in CITATION.cff) (`#2896 `__) `Valeriu Predoi `__ -- Unpin `NetCDF4` (`#2929 `__) `Valeriu Predoi `__ -- Unpin `cf-units` (`#2930 `__) `Bouwe Andela `__ -- Set the version number on the development branches to one minor version more than the last release (`#2964 `__) `Bouwe Andela `__ -- Pin `shapely<2.0.0` for linux64 (`#2970 `__) `Valeriu Predoi `__ -- Unpin `matplotlib` (`#3068 `__) `Valeriu Predoi `__ -- Add `packaging` as direct dependency to ESMValTool (`#3099 `__) `Valeriu Predoi `__ -- Re-pin sphinx to latest (6.1.3) and add nbsphinx to the environment (`#3118 `__) `Valeriu Predoi `__ -- Conda environment files for esmvalcore=2.8.0rc2 (`#3120 `__) `Rémi Kazeroni `__ -- Remove rc (release candidates) conda channel and re-pin esmvalcore to new stable 2.8 (`#3131 `__) `Valeriu Predoi `__ +- Merge release branch `release_270stable` in main so we pick up unsquashed commits and set the correct version 2.7.0 for main (and up version in CITATION.cff) (:pull:`2896`) :user:`valeriupredoi` +- Unpin `NetCDF4` (:pull:`2929`) :user:`valeriupredoi` +- Unpin `cf-units` (:pull:`2930`) :user:`bouweandela` +- Set the version number on the development branches to one minor version more than the last release (:pull:`2964`) :user:`bouweandela` +- Pin `shapely<2.0.0` for linux64 (:pull:`2970`) :user:`valeriupredoi` +- Unpin `matplotlib` (:pull:`3068`) :user:`valeriupredoi` +- Add `packaging` as direct dependency to ESMValTool (:pull:`3099`) :user:`valeriupredoi` +- Re-pin sphinx to latest (6.1.3) and add nbsphinx to the environment (:pull:`3118`) :user:`valeriupredoi` +- Conda environment files for esmvalcore=2.8.0rc2 (:pull:`3120`) :user:`remi-kazeroni` +- Remove rc (release candidates) conda channel and re-pin esmvalcore to new stable 2.8 (:pull:`3131`) :user:`valeriupredoi` Improvements ~~~~~~~~~~~~ -- Read `config-user.yml` using `esmvalcore.config` module (`#2736 `__) `Bouwe Andela `__ -- Make results of recipes `schlund20jgr_*.yml` deterministic (`#2900 `__) `Manuel Schlund `__ -- `Recipe_gier2020bg.yml`: add sorting to SA barplot (`#2905 `__) `Bettina Gier `__ -- Add the outline of a climatological tropopause to the zonalmean_profile plots (`#2947 `__) `FranziskaWinterstein `__ -- Update data finder imports (`#2958 `__) `Bouwe Andela `__ -- Add support for the upcoming ESMValCore v2.8 release to the recipe filler tool (`#2995 `__) `Bouwe Andela `__ -- Updated monitoring diagnostics with netCDF output and additional logging (`#3029 `__) `Manuel Schlund `__ -- Use aliases in perfmetrics (`#3058 `__) `FranziskaWinterstein `__ +- Read `config-user.yml` using `esmvalcore.config` module (:pull:`2736`) :user:`bouweandela` +- Make results of recipes `schlund20jgr_*.yml` deterministic (:pull:`2900`) :user:`schlunma` +- `Recipe_gier2020bg.yml`: add sorting to SA barplot (:pull:`2905`) :user:`bettina-gier` +- Add the outline of a climatological tropopause to the zonalmean_profile plots (:pull:`2947`) :user:`FranziskaWinterstein` +- Update data finder imports (:pull:`2958`) :user:`bouweandela` +- Add support for the upcoming ESMValCore v2.8 release to the recipe filler tool (:pull:`2995`) :user:`bouweandela` +- Updated monitoring diagnostics with netCDF output and additional logging (:pull:`3029`) :user:`schlunma` +- Use aliases in perfmetrics (:pull:`3058`) :user:`FranziskaWinterstein` .. _changelog-v2-7-0: @@ -441,81 +441,81 @@ Highlights Backwards incompatible changes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Remove installation of R dependencies from the help message (`#2761 `__) `Rémi Kazeroni `__ +- Remove installation of R dependencies from the help message (:pull:`2761`) :user:`remi-kazeroni` Bug fixes ~~~~~~~~~ -- Fix misplaced provenance records from IPCC AR5 Ch.12 diags (`#2758 `__) `Axel Lauer `__ -- Fix `esmvaltool.utils.testing.regression.compare` module to run with Python<3.10 too (`#2778 `__) `Valeriu Predoi `__ -- Fixed small bug that could lead to wrong pr units in `monitor/multi_datasets.py` (`#2788 `__) `Manuel Schlund `__ -- Pin `xgboost>1.6.1` so we avert documentation failing to build with `1.6.1` (`#2780 `__) `Valeriu Predoi `__ -- Pin `matplotlib-base<3.6.0` to avoid conflict from `mapgenerator` that fails doc builds (`#2830 `__) `Valeriu Predoi `__ -- Fixed wrong latitudes in NDP CMORizer (`#2832 `__) `Manuel Schlund `__ -- Fix indexer in Autoassess supermeans module use a tuple of `(slice(), idx, idx)` (`#2838 `__) `Valeriu Predoi `__ -- Replace xarray ufuncs with bogstandard numpy in weighting/climwip/calibrate_sigmas.py (`#2848 `__) `Valeriu Predoi `__ -- Fix units MERRA2 CMORizer (`#2850 `__) `Axel Lauer `__ -- Fix bug when using log-scale y-axis for ocean transects. (`#2862 `__) `Tomas Torsvik `__ +- Fix misplaced provenance records from IPCC AR5 Ch.12 diags (:pull:`2758`) :user:`axel-lauer` +- Fix `esmvaltool.utils.testing.regression.compare` module to run with Python<3.10 too (:pull:`2778`) :user:`valeriupredoi` +- Fixed small bug that could lead to wrong pr units in `monitor/multi_datasets.py` (:pull:`2788`) :user:`schlunma` +- Pin `xgboost>1.6.1` so we avert documentation failing to build with `1.6.1` (:pull:`2780`) :user:`valeriupredoi` +- Pin `matplotlib-base<3.6.0` to avoid conflict from `mapgenerator` that fails doc builds (:pull:`2830`) :user:`valeriupredoi` +- Fixed wrong latitudes in NDP CMORizer (:pull:`2832`) :user:`schlunma` +- Fix indexer in Autoassess supermeans module use a tuple of `(slice(), idx, idx)` (:pull:`2838`) :user:`valeriupredoi` +- Replace xarray ufuncs with bogstandard numpy in weighting/climwip/calibrate_sigmas.py (:pull:`2848`) :user:`valeriupredoi` +- Fix units MERRA2 CMORizer (:pull:`2850`) :user:`axel-lauer` +- Fix bug when using log-scale y-axis for ocean transects. (:pull:`2862`) :user:`TomasTorsvik` Community ~~~~~~~~~ -- Add MO-paths to config file (`#2784 `__) `mo-tgeddes `__ +- Add MO-paths to config file (:pull:`2784`) `mo-tgeddes `__ Deprecations ~~~~~~~~~~~~ -- Recipe `recipe_esacci_oc.yml` replace with new regrid scheme `nearest_extrapolate` (`#2841 `__) `Valeriu Predoi `__ +- Recipe `recipe_esacci_oc.yml` replace with new regrid scheme `nearest_extrapolate` (:pull:`2841`) :user:`valeriupredoi` Documentation ~~~~~~~~~~~~~ -- Update release schedule for v2.7 (`#2747 `__) `Bouwe Andela `__ -- Add Met Office installation method (`#2751 `__) `mo-tgeddes `__ -- Add release dates for 2023 (`#2769 `__) `Rémi Kazeroni `__ -- Made `maintainer` entry mandatory for published recipes (`#2703 `__) `Manuel Schlund `__ -- Use command with current command line opts for `cffconvert` in documentation (`#2791 `__) `Valeriu Predoi `__ -- Update CMORizer documentation with command options (`#2795 `__) `Rémi Kazeroni `__ -- Fixed broken link for monthly meetings (`#2806 `__) `Rémi Kazeroni `__ -- Update MO obs4MIPs paths in the user configuration file (`#2813 `__) `mo-tgeddes `__ -- Fix Windows incompatible file names in documentation of recipe_climate_change_hotspot.yml (`#2823 `__) `Lee de Mora `__ -- Update documentation for the Landschuetzer 2016 recipe. (`#2801 `__) `Tomas Torsvik `__ -- Fixed anaconda badge in README (`#2866 `__) `Valeriu Predoi `__ -- Update release strategy notes (`#2734 `__) `sloosvel `__ -- Add documentation on how to handle CMORizers for multiple dataset versions (`#2730 `__) `Rémi Kazeroni `__ -- Extending documentation: recipe maintainer + broken recipe policy (`#2719 `__) `Axel Lauer `__ +- Update release schedule for v2.7 (:pull:`2747`) :user:`bouweandela` +- Add Met Office installation method (:pull:`2751`) `mo-tgeddes `__ +- Add release dates for 2023 (:pull:`2769`) :user:`remi-kazeroni` +- Made `maintainer` entry mandatory for published recipes (:pull:`2703`) :user:`schlunma` +- Use command with current command line opts for `cffconvert` in documentation (:pull:`2791`) :user:`valeriupredoi` +- Update CMORizer documentation with command options (:pull:`2795`) :user:`remi-kazeroni` +- Fixed broken link for monthly meetings (:pull:`2806`) :user:`remi-kazeroni` +- Update MO obs4MIPs paths in the user configuration file (:pull:`2813`) `mo-tgeddes `__ +- Fix Windows incompatible file names in documentation of recipe_climate_change_hotspot.yml (:pull:`2823`) :user:`ledm` +- Update documentation for the Landschuetzer 2016 recipe. (:pull:`2801`) :user:`TomasTorsvik` +- Fixed anaconda badge in README (:pull:`2866`) :user:`valeriupredoi` +- Update release strategy notes (:pull:`2734`) :user:`sloosvel` +- Add documentation on how to handle CMORizers for multiple dataset versions (:pull:`2730`) :user:`remi-kazeroni` +- Extending documentation: recipe maintainer + broken recipe policy (:pull:`2719`) :user:`axel-lauer` Diagnostics ~~~~~~~~~~~ -- Recipe and diagnostics for : Tebaldi et al.,ESD, 2021 (`#2052 `__) `debe-kevin `__ -- Figures for IPCC AR6 WG1 Chapter 3 (Atmosphere) (`#2533 `__) `Lisa Bock `__ +- Recipe and diagnostics for : Tebaldi et al.,ESD, 2021 (:pull:`2052`) `debe-kevin `__ +- Figures for IPCC AR6 WG1 Chapter 3 (Atmosphere) (:pull:`2533`) :user:`LisaBock` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Update CERES-EBAF to Ed4.1 (`#2752 `__) `Axel Lauer `__ -- New CMORizer for CALIPSO-ICECLOUD (`#2753 `__) `Axel Lauer `__ -- New CMORizer for CLOUDSAT-L2 (`#2754 `__) `Axel Lauer `__ -- Update MERRA2 cmorizer with extra 2D and 3D variables (`#2774 `__) `Valeriu Predoi `__ +- Update CERES-EBAF to Ed4.1 (:pull:`2752`) :user:`axel-lauer` +- New CMORizer for CALIPSO-ICECLOUD (:pull:`2753`) :user:`axel-lauer` +- New CMORizer for CLOUDSAT-L2 (:pull:`2754`) :user:`axel-lauer` +- Update MERRA2 cmorizer with extra 2D and 3D variables (:pull:`2774`) :user:`valeriupredoi` Automatic testing ~~~~~~~~~~~~~~~~~ -- Pin `netcdf4 != 1.6.1` since that is spitting large numbers of SegFaults (`#2796 `__) `Valeriu Predoi `__ +- Pin `netcdf4 != 1.6.1` since that is spitting large numbers of SegFaults (:pull:`2796`) :user:`valeriupredoi` Installation ~~~~~~~~~~~~ -- Increase esmvalcore version to 2.7.0 in environment files (`#2860 `__) `Valeriu Predoi `__ -- Add iris-esmf-regrid as a dependency (`#2880 `__) `Klaus Zimmermann `__ +- Increase esmvalcore version to 2.7.0 in environment files (:pull:`2860`) :user:`valeriupredoi` +- Add iris-esmf-regrid as a dependency (:pull:`2880`) :user:`zklaus` Improvements ~~~~~~~~~~~~ -- Fix tebaldi21esd (`#2749 `__) `Axel Lauer `__ -- Added option to show basic statistics in plots of `monitor/multi_datasets.py` (`#2790 `__) `Manuel Schlund `__ -- Remove retracted datasets from `recipe_climate_change_hotspot` (`#2854 `__) `sloosvel `__ +- Fix tebaldi21esd (:pull:`2749`) :user:`axel-lauer` +- Added option to show basic statistics in plots of `monitor/multi_datasets.py` (:pull:`2790`) :user:`schlunma` +- Remove retracted datasets from `recipe_climate_change_hotspot` (:pull:`2854`) :user:`sloosvel` .. _changelog-v2-6-0: @@ -541,83 +541,83 @@ This release includes Bug fixes ~~~~~~~~~ -- Fix dtype for Marrmot recipe results (`#2646 `__) `SarahAlidoost `__ -- Adapt test_fix_coords to new version of cf-units (`#2707 `__) `Klaus Zimmermann `__ -- Fix nested axes in `recipe_martin18_grl` and `recipe_li17natcc` (`#2712 `__) `Lukas `__ -- Update common_climdex_preprocessing_for_plots.R (`#2727 `__) `Enrico Arnone `__ +- Fix dtype for Marrmot recipe results (:pull:`2646`) :user:`SarahAlidoost` +- Adapt test_fix_coords to new version of cf-units (:pull:`2707`) :user:`zklaus` +- Fix nested axes in `recipe_martin18_grl` and `recipe_li17natcc` (:pull:`2712`) :user:`lukruh` +- Update common_climdex_preprocessing_for_plots.R (:pull:`2727`) :user:`earnone` Community ~~~~~~~~~ -- Collecting github user names for config-references (`#2677 `__) `Lukas `__ +- Collecting github user names for config-references (:pull:`2677`) :user:`lukruh` Deprecations ~~~~~~~~~~~~ -- Deprecate the function `esmvaltool.diag_scripts.shared.var_name_constraint`. This function is scheduled for removal in v2.8.0. Please use :class:`iris.NameConstraint` with the keyword argument var_name instead: this is an exact replacement. (`#2655 `__) `Manuel Schlund `__ +- Deprecate the function `esmvaltool.diag_scripts.shared.var_name_constraint`. This function is scheduled for removal in v2.8.0. Please use :class:`iris.NameConstraint` with the keyword argument var_name instead: this is an exact replacement. (:pull:`2655`) :user:`schlunma` Documentation ~~~~~~~~~~~~~ -- Documentation Improvements (`#2580 `__) `stacristo `__ -- Fixed broken label in the documentation (`#2616 `__) `Rémi Kazeroni `__ -- Add readthedocs configuration file (`#2627 `__) `Bouwe Andela `__ -- Update the command for building the documentation (`#2622 `__) `Bouwe Andela `__ -- Added DKRZ-Levante to `config-user-example.yml` (`#2632 `__) `Rémi Kazeroni `__ -- Improved documentation on native dataset support (`#2635 `__) `Manuel Schlund `__ -- Add documentation on building and uploading Docker images (`#2662 `__) `Bouwe Andela `__ -- Remove support for Mistral in `config-user-example.yml` (`#2667 `__) `Rémi Kazeroni `__ -- Add note to clarify that CORDEX support is work in progress (`#2682 `__) `Bouwe Andela `__ -- Restore accidentally deleted text from input data docs (`#2683 `__) `Bouwe Andela `__ -- Add running settings note in `recipe_wenzel16nat.yml` documentation (`#2692 `__) `sloosvel `__ -- Add a note on transferring permissions to the release manager (`#2688 `__) `Bouwe Andela `__ -- Update documentation on ESMValTool module at DKRZ (`#2696 `__) `Rémi Kazeroni `__ -- Add note on how to run recipe_wenzel14jgr.yml (`#2717 `__) `sloosvel `__ -- Added conda forge feedstock repo link in README (`#2555 `__) `Valeriu Predoi `__ +- Documentation Improvements (:pull:`2580`) :user:`stacristo` +- Fixed broken label in the documentation (:pull:`2616`) :user:`remi-kazeroni` +- Add readthedocs configuration file (:pull:`2627`) :user:`bouweandela` +- Update the command for building the documentation (:pull:`2622`) :user:`bouweandela` +- Added DKRZ-Levante to `config-user-example.yml` (:pull:`2632`) :user:`remi-kazeroni` +- Improved documentation on native dataset support (:pull:`2635`) :user:`schlunma` +- Add documentation on building and uploading Docker images (:pull:`2662`) :user:`bouweandela` +- Remove support for Mistral in `config-user-example.yml` (:pull:`2667`) :user:`remi-kazeroni` +- Add note to clarify that CORDEX support is work in progress (:pull:`2682`) :user:`bouweandela` +- Restore accidentally deleted text from input data docs (:pull:`2683`) :user:`bouweandela` +- Add running settings note in `recipe_wenzel16nat.yml` documentation (:pull:`2692`) :user:`sloosvel` +- Add a note on transferring permissions to the release manager (:pull:`2688`) :user:`bouweandela` +- Update documentation on ESMValTool module at DKRZ (:pull:`2696`) :user:`remi-kazeroni` +- Add note on how to run recipe_wenzel14jgr.yml (:pull:`2717`) :user:`sloosvel` +- Added conda forge feedstock repo link in README (:pull:`2555`) :user:`valeriupredoi` Diagnostics ~~~~~~~~~~~ -- Compute bias instead of correlation in `compare_salinity.py` (`#2642 `__) `sloosvel `__ -- Update monitor diagnostics (`#2608 `__) `Manuel Schlund `__ -- Add new Psyplot diagnostic (`#2653 `__) `Manuel Schlund `__ -- Reduce memory usage of lisflood recipe (`#2634 `__) `Stefan Verhoeven `__ -- Provenance in ocean diagnostics (`#2651 `__) `Tomas Lovato `__ -- Extend monitor diagnostics with multi-dataset plots (`#2657 `__) `Manuel Schlund `__ -- Recipe and diagnostics to plot climate change hotspots: Cos et al., ESD 2022 (`#2614 `__) `Pep Cos `__ -- Update plots of consecutive dry days recipe (`#2671 `__) `Bouwe Andela `__ -- Fix the format of ids in Hype forcing files (`#2679 `__) `SarahAlidoost `__ -- WFlow diagnostic script: remove manual rechunking (`#2680 `__) `Peter Kalverla `__ +- Compute bias instead of correlation in `compare_salinity.py` (:pull:`2642`) :user:`sloosvel` +- Update monitor diagnostics (:pull:`2608`) :user:`schlunma` +- Add new Psyplot diagnostic (:pull:`2653`) :user:`schlunma` +- Reduce memory usage of lisflood recipe (:pull:`2634`) :user:`sverhoeven` +- Provenance in ocean diagnostics (:pull:`2651`) :user:`tomaslovato` +- Extend monitor diagnostics with multi-dataset plots (:pull:`2657`) :user:`schlunma` +- Recipe and diagnostics to plot climate change hotspots: Cos et al., ESD 2022 (:pull:`2614`) :user:`pepcos` +- Update plots of consecutive dry days recipe (:pull:`2671`) :user:`bouweandela` +- Fix the format of ids in Hype forcing files (:pull:`2679`) :user:`SarahAlidoost` +- WFlow diagnostic script: remove manual rechunking (:pull:`2680`) :user:`Peter9192` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Extending the HadCRUT5 cmorizer (`#2509 `__) `Lisa Bock `__ -- Cmorize Kadow2020 dataset (`#2513 `__) `Lisa Bock `__ -- Cmorize NOAAGlobalTemp dataset (`#2515 `__) `Lisa Bock `__ -- Add option to CMORize ts as tos in ESACCI data (`#2731 `__) `sloosvel `__ +- Extending the HadCRUT5 cmorizer (:pull:`2509`) :user:`LisaBock` +- Cmorize Kadow2020 dataset (:pull:`2513`) :user:`LisaBock` +- Cmorize NOAAGlobalTemp dataset (:pull:`2515`) :user:`LisaBock` +- Add option to CMORize ts as tos in ESACCI data (:pull:`2731`) :user:`sloosvel` Automatic testing ~~~~~~~~~~~~~~~~~ -- Add a tool for comparing recipe runs to previous runs (`#2613 `__) `Bouwe Andela `__ -- Ignore NCL interface files when comparing recipe runs (`#2673 `__) `Bouwe Andela `__ -- Add a short version of recipe deangelis15nat for testing (`#2685 `__) `katjaweigel `__ -- Expanded recipe output comparison tool to better handle absolute paths in output (`#2709 `__) `Manuel Schlund `__ -- Update development infrastructure (`#2663 `__) `Bouwe Andela `__ +- Add a tool for comparing recipe runs to previous runs (:pull:`2613`) :user:`bouweandela` +- Ignore NCL interface files when comparing recipe runs (:pull:`2673`) :user:`bouweandela` +- Add a short version of recipe deangelis15nat for testing (:pull:`2685`) :user:`katjaweigel` +- Expanded recipe output comparison tool to better handle absolute paths in output (:pull:`2709`) :user:`schlunma` +- Update development infrastructure (:pull:`2663`) :user:`bouweandela` Installation ~~~~~~~~~~~~ -- Removed `package/meta.yaml` and all references to it (`#2612 `__) `Manuel Schlund `__ +- Removed `package/meta.yaml` and all references to it (:pull:`2612`) :user:`schlunma` Improvements ~~~~~~~~~~~~ -- Improved handling of weights in MLR diagnostics (`#2625 `__) `Manuel Schlund `__ -- Fixed order of variables in perfemetrics plot of Anav13jclim recipe (`#2706 `__) `Manuel Schlund `__ -- Added input file sorting to many diagnostic to make output exactly reproducible (`#2710 `__) `Manuel Schlund `__ -- Removed 'ancestors' attributes before saving netcdf files in emergent constraints diagnostics (`#2713 `__) `Manuel Schlund `__ +- Improved handling of weights in MLR diagnostics (:pull:`2625`) :user:`schlunma` +- Fixed order of variables in perfemetrics plot of Anav13jclim recipe (:pull:`2706`) :user:`schlunma` +- Added input file sorting to many diagnostic to make output exactly reproducible (:pull:`2710`) :user:`schlunma` +- Removed 'ancestors' attributes before saving netcdf files in emergent constraints diagnostics (:pull:`2713`) :user:`schlunma` .. _changelog-v2-5-0: @@ -643,115 +643,115 @@ This release includes Backwards incompatible changes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Streamline observations download (`#1657 `__) `Javier Vegas-Regidor `__. This change removes the ``cmorize_obs`` command which has previously been used to CMORize observations and other datasets. The new command ``esmvaltool data`` provides many new features apart from the CMORization (``esmvaltool data format``), for example, automatic downloading of observational datasets (``esmvaltool data download``). More details on this can be found :ref:`here` and :ref:`here`. -- Dropped Python 3.7 (`#2585 `__) `Manuel Schlund `__. ESMValTool v2.5.0 dropped support for Python 3.7. From now on Python >=3.8 is required to install ESMValTool. The main reason for this is that conda-forge dropped support for Python 3.7 for OSX and arm64 (more details are given `here `__). +- Streamline observations download (:pull:`1657`) `Javier Vegas-Regidor `__. This change removes the ``cmorize_obs`` command which has previously been used to CMORize observations and other datasets. The new command ``esmvaltool data`` provides many new features apart from the CMORization (``esmvaltool data format``), for example, automatic downloading of observational datasets (``esmvaltool data download``). More details on this can be found :ref:`here` and :ref:`here`. +- Dropped Python 3.7 (:pull:`2585`) :user:`schlunma`. ESMValTool v2.5.0 dropped support for Python 3.7. From now on Python >=3.8 is required to install ESMValTool. The main reason for this is that conda-forge dropped support for Python 3.7 for OSX and arm64 (more details are given `here `__). Bug fixes ~~~~~~~~~ -- Remove the use of `esmvalgroup` channel from the conda install Github Action workflow (`#2420 `__) `Valeriu Predoi `__ -- Ignore .pymon-journal file in test discovery (`#2491 `__) `Klaus Zimmermann `__ -- Relocate pytest-monitor outputted database `.pymon` so `.pymon-journal` file should not be looked for by `pytest` (`#2501 `__) `Valeriu Predoi `__ -- Re-establish Python 3.7 compatibility (`#2506 `__) `Klaus Zimmermann `__ -- Update intersphinx mapping (`#2531 `__) `Klaus Zimmermann `__ -- Fixed `KeyError` in `recipe_ocean_bgc.yml` (`#2540 `__) `Manuel Schlund `__ -- Corrected ESACCI-SEA-SURFACE-SALINITY from OBS to OBS6 (`#2542 `__) `Axel Lauer `__ -- Fixed `recipe_kcs.yml` (`#2541 `__) `Manuel Schlund `__ -- Fix MDER diagnostic regression_stepwise (`#2545 `__) `Axel Lauer `__ -- Fix for recipe_wenzel16nat (`#2547 `__) `Axel Lauer `__ -- Fixed `recipe_carvalhais14nat` and removed deprecated use of np.float (`#2558 `__) `Manuel Schlund `__ -- Fix `recipe_wenzel14jgr` (`#2577 `__) `Rémi Kazeroni `__ -- Fixed various recipes by removing faulty or non-available datasets (`#2563 `__) `Manuel Schlund `__ -- Remove missing CMIP5 data from 2 recipes (`#2579 `__) `Rémi Kazeroni `__ -- Fix `recipe_seaice` (`#2578 `__) `Rémi Kazeroni `__ -- Fix `recipe_climwip_brunner20esd` (`#2581 `__) `Rémi Kazeroni `__ +- Remove the use of `esmvalgroup` channel from the conda install Github Action workflow (:pull:`2420`) :user:`valeriupredoi` +- Ignore .pymon-journal file in test discovery (:pull:`2491`) :user:`zklaus` +- Relocate pytest-monitor outputted database `.pymon` so `.pymon-journal` file should not be looked for by `pytest` (:pull:`2501`) :user:`valeriupredoi` +- Re-establish Python 3.7 compatibility (:pull:`2506`) :user:`zklaus` +- Update intersphinx mapping (:pull:`2531`) :user:`zklaus` +- Fixed `KeyError` in `recipe_ocean_bgc.yml` (:pull:`2540`) :user:`schlunma` +- Corrected ESACCI-SEA-SURFACE-SALINITY from OBS to OBS6 (:pull:`2542`) :user:`axel-lauer` +- Fixed `recipe_kcs.yml` (:pull:`2541`) :user:`schlunma` +- Fix MDER diagnostic regression_stepwise (:pull:`2545`) :user:`axel-lauer` +- Fix for recipe_wenzel16nat (:pull:`2547`) :user:`axel-lauer` +- Fixed `recipe_carvalhais14nat` and removed deprecated use of np.float (:pull:`2558`) :user:`schlunma` +- Fix `recipe_wenzel14jgr` (:pull:`2577`) :user:`remi-kazeroni` +- Fixed various recipes by removing faulty or non-available datasets (:pull:`2563`) :user:`schlunma` +- Remove missing CMIP5 data from 2 recipes (:pull:`2579`) :user:`remi-kazeroni` +- Fix `recipe_seaice` (:pull:`2578`) :user:`remi-kazeroni` +- Fix `recipe_climwip_brunner20esd` (:pull:`2581`) :user:`remi-kazeroni` Deprecations ~~~~~~~~~~~~ -- Remove `--use-feature=2020-resolver` command line option for obsolete pip 2020 solver (`#2493 `__) `Valeriu Predoi `__ -- Renamed vertical regridding schemes in affected recipes (`#2487 `__) `Manuel Schlund `__ +- Remove `--use-feature=2020-resolver` command line option for obsolete pip 2020 solver (:pull:`2493`) :user:`valeriupredoi` +- Renamed vertical regridding schemes in affected recipes (:pull:`2487`) :user:`schlunma` Documentation ~~~~~~~~~~~~~ -- Update release manager for v2.5 (`#2429 `__) `Axel Lauer `__ -- Mention ENES Climate Analytics service (`#2438 `__) `Bouwe Andela `__ -- Add recipe overview page (`#2439 `__) `Bouwe Andela `__ -- Fix pointer to Tutorial lesson on preprocessor from 05 to 06 (`#2473 `__) `Valeriu Predoi `__ -- Removed obsolete option `synda-download` from documentation (`#2485 `__) `Manuel Schlund `__ -- Update CMUG XCH4 docu figure (`#2502 `__) `Axel Lauer `__ -- Add Python=3.10 to package info, update Circle CI auto install and documentation for Python=3.10 (`#2503 `__) `Manuel Schlund `__ -- Unify user configuration file (`#2507 `__) `Manuel Schlund `__ -- Synchronized `config-user.yml` with version from ESMValCore (`#2516 `__) `Manuel Schlund `__ -- CITATION.cff fix and automatic validation of your citation metadata (`#2517 `__) `Abel Siqueira `__ -- Add backwards incompatible changes at the top of the release notes draft (`#2431 `__) `Bouwe Andela `__ -- Fixed intersphinx mapping of `scipy` (`#2523 `__) `Manuel Schlund `__ -- Add authors to citation cff (`#2525 `__) `SarahAlidoost `__ -- Update documentation on running a recipe (`#2432 `__) `Bouwe Andela `__ -- Fix recipe `hydrology/recipe_wflow.yml` (`#2549 `__) `Rémi Kazeroni `__ -- Update `draft_release_notes.py` for new release (`#2553 `__) `Manuel Schlund `__ -- Added stand with Ukraine badge (`#2565 `__) `Valeriu Predoi `__ -- Updated CREM docu (recipe_williams09climdyn.yml) (`#2567 `__) `Axel Lauer `__ -- First draft for v2.5.0 changelog (`#2554 `__) `Manuel Schlund `__ -- Replace nonfunctional Github Actions badge with cool one in README (`#2582 `__) `Valeriu Predoi `__ -- Updated changelog (`#2589 `__) `Manuel Schlund `__ -- Updated release strategy with current release and upcoming release (`#2597 `__) `Manuel Schlund `__ -- Increased ESMValTool version to 2.5.0 (`#2600 `__) `Manuel Schlund `__ +- Update release manager for v2.5 (:pull:`2429`) :user:`axel-lauer` +- Mention ENES Climate Analytics service (:pull:`2438`) :user:`bouweandela` +- Add recipe overview page (:pull:`2439`) :user:`bouweandela` +- Fix pointer to Tutorial lesson on preprocessor from 05 to 06 (:pull:`2473`) :user:`valeriupredoi` +- Removed obsolete option `synda-download` from documentation (:pull:`2485`) :user:`schlunma` +- Update CMUG XCH4 docu figure (:pull:`2502`) :user:`axel-lauer` +- Add Python=3.10 to package info, update Circle CI auto install and documentation for Python=3.10 (:pull:`2503`) :user:`schlunma` +- Unify user configuration file (:pull:`2507`) :user:`schlunma` +- Synchronized `config-user.yml` with version from ESMValCore (:pull:`2516`) :user:`schlunma` +- CITATION.cff fix and automatic validation of your citation metadata (:pull:`2517`) :user:`abelsiqueira` +- Add backwards incompatible changes at the top of the release notes draft (:pull:`2431`) :user:`bouweandela` +- Fixed intersphinx mapping of `scipy` (:pull:`2523`) :user:`schlunma` +- Add authors to citation cff (:pull:`2525`) :user:`SarahAlidoost` +- Update documentation on running a recipe (:pull:`2432`) :user:`bouweandela` +- Fix recipe `hydrology/recipe_wflow.yml` (:pull:`2549`) :user:`remi-kazeroni` +- Update `draft_release_notes.py` for new release (:pull:`2553`) :user:`schlunma` +- Added stand with Ukraine badge (:pull:`2565`) :user:`valeriupredoi` +- Updated CREM docu (recipe_williams09climdyn.yml) (:pull:`2567`) :user:`axel-lauer` +- First draft for v2.5.0 changelog (:pull:`2554`) :user:`schlunma` +- Replace nonfunctional Github Actions badge with cool one in README (:pull:`2582`) :user:`valeriupredoi` +- Updated changelog (:pull:`2589`) :user:`schlunma` +- Updated release strategy with current release and upcoming release (:pull:`2597`) :user:`schlunma` +- Increased ESMValTool version to 2.5.0 (:pull:`2600`) :user:`schlunma` Diagnostics ~~~~~~~~~~~ -- AutoAssess: Add new diagnostic for radiation budget (`#2282 `__) `Jon Lillis `__ -- CMUG Sea Surface Salinity dataset and diagnostic (`#1832 `__) `Javier Vegas-Regidor `__ -- Recipe with new diagnostics for ESA-CMUG H2O (`#1834 `__) `katjaweigel `__ -- Cleaned Schlund et al. (2020) recipe and fixed small bugs in corresponding diagnostic (`#2484 `__) `Manuel Schlund `__ -- Add ESA CCI LST cmorizer and diagnostic (`#1897 `__) `morobking `__ -- XCH4 ESA CMUG diagnostics (subset of the MPQB diagnostics) (`#1960 `__) `Birgit Hassler `__ -- Add support for ESACCI Ocean Color (Chlorophyll) observations (`#2055 `__) `ulrikaw-cloud `__ -- Updated `recipe_zmnam.yml` with hemisphere selection (`#2230 `__) `fserva `__ -- Add recipe and diagnostic scripts to compute figures of D9.4 of ISENES3 (`#2441 `__) `sloosvel `__ -- Save resampled climates from KCS diagnostic local_resampling.py (`#2221 `__) `Emma Daniels `__ -- Use years from KCS recipe (`#2223 `__) `Emma Daniels `__ -- Recipe to plot generic output from the preprocessor (`#2184 `__) `Javier Vegas-Regidor `__ -- Fixed provenance tracking for emergent constraint diagnostics (`#2573 `__) `Manuel Schlund `__ +- AutoAssess: Add new diagnostic for radiation budget (:pull:`2282`) :user:`Jon-Lillis` +- CMUG Sea Surface Salinity dataset and diagnostic (:pull:`1832`) `Javier Vegas-Regidor `__ +- Recipe with new diagnostics for ESA-CMUG H2O (:pull:`1834`) :user:`katjaweigel` +- Cleaned Schlund et al. (2020) recipe and fixed small bugs in corresponding diagnostic (:pull:`2484`) :user:`schlunma` +- Add ESA CCI LST cmorizer and diagnostic (:pull:`1897`) :user:`morobking` +- XCH4 ESA CMUG diagnostics (subset of the MPQB diagnostics) (:pull:`1960`) :user:`hb326` +- Add support for ESACCI Ocean Color (Chlorophyll) observations (:pull:`2055`) `ulrikaw-cloud `__ +- Updated `recipe_zmnam.yml` with hemisphere selection (:pull:`2230`) :user:`fserva` +- Add recipe and diagnostic scripts to compute figures of D9.4 of ISENES3 (:pull:`2441`) :user:`sloosvel` +- Save resampled climates from KCS diagnostic local_resampling.py (:pull:`2221`) :user:`Emmadd` +- Use years from KCS recipe (:pull:`2223`) :user:`Emmadd` +- Recipe to plot generic output from the preprocessor (:pull:`2184`) `Javier Vegas-Regidor `__ +- Fixed provenance tracking for emergent constraint diagnostics (:pull:`2573`) :user:`schlunma` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Ensure dummy data for cmorize_obs_woa test are written to the correct directory (`#2451 `__) `Emma Hogan `__ +- Ensure dummy data for cmorize_obs_woa test are written to the correct directory (:pull:`2451`) :user:`ehogan` - Add ESA CCI LST cmorizer and diagnostic (see previous section `Diagnostics`) Automatic testing ~~~~~~~~~~~~~~~~~ -- Run a nightly Github Actions workflow to monitor tests memory per test (configurable for other metrics too) and lists the slowest 100 tests (`#2449 `__) `Valeriu Predoi `__ -- Fix individual pytest runs broken due to missing explicit imports from `iris` and adding a couple missing package markers (`#2455 `__) `Valeriu Predoi `__ -- Add Python=3.10 to Github Actions and switch to Python=3.10 for the Github Action that builds the PyPi package (`#2488 `__) `Valeriu Predoi `__ -- Switch all github actions from miniconda to mambaforge (`#2498 `__) `Klaus Zimmermann `__ -- Pin `flake8<4` to have actual FLAKE8 error printed if tests fail and not garbage (`#2492 `__) `Valeriu Predoi `__ -- Implementing conda lock (`#2193 `__) `Valeriu Predoi `__ -- [Docker] Update Docker container builds with correct installations of Julia (`#2530 `__) `Valeriu Predoi `__ +- Run a nightly Github Actions workflow to monitor tests memory per test (configurable for other metrics too) and lists the slowest 100 tests (:pull:`2449`) :user:`valeriupredoi` +- Fix individual pytest runs broken due to missing explicit imports from `iris` and adding a couple missing package markers (:pull:`2455`) :user:`valeriupredoi` +- Add Python=3.10 to Github Actions and switch to Python=3.10 for the Github Action that builds the PyPi package (:pull:`2488`) :user:`valeriupredoi` +- Switch all github actions from miniconda to mambaforge (:pull:`2498`) :user:`zklaus` +- Pin `flake8<4` to have actual FLAKE8 error printed if tests fail and not garbage (:pull:`2492`) :user:`valeriupredoi` +- Implementing conda lock (:pull:`2193`) :user:`valeriupredoi` +- [Docker] Update Docker container builds with correct installations of Julia (:pull:`2530`) :user:`valeriupredoi` - Update Linux condalock file (various pull requests) github-actions[bot] Installation ~~~~~~~~~~~~ -- Comment out release candidate channel in environment.yml (`#2417 `__) `Klaus Zimmermann `__ -- Comment out rc channel in osx environment file (`#2421 `__) `Valeriu Predoi `__ -- Add `python-cdo` as conda-forge dependency in environment files to ensure `cdo` gets used from conda-forge and not pip (`#2469 `__) `Valeriu Predoi `__ -- Install rasterio from conda-forge and avoid issues from python=3.10 (`#2479 `__) `Valeriu Predoi `__ -- Updated dependencies with new ESMValCore version (`#2599 `__) `Manuel Schlund `__ +- Comment out release candidate channel in environment.yml (:pull:`2417`) :user:`zklaus` +- Comment out rc channel in osx environment file (:pull:`2421`) :user:`valeriupredoi` +- Add `python-cdo` as conda-forge dependency in environment files to ensure `cdo` gets used from conda-forge and not pip (:pull:`2469`) :user:`valeriupredoi` +- Install rasterio from conda-forge and avoid issues from python=3.10 (:pull:`2479`) :user:`valeriupredoi` +- Updated dependencies with new ESMValCore version (:pull:`2599`) :user:`schlunma` Improvements ~~~~~~~~~~~~ -- Remove use of OBS and use CMIP instead in `examples/recipe_ncl.yml` (`#2494 `__) `Valeriu Predoi `__ -- Expanded `recipe_preprocessor_test.yml` to account for new `multi_model_statistics` features (`#2519 `__) `Manuel Schlund `__ -- Updated piControl periods for recipes that use KACE-1-0-G (`#2537 `__) `Manuel Schlund `__ -- Reduced time range in `recipe_globwat.yml` (`#2548 `__) `Manuel Schlund `__ -- Removed models with missing data from recipe_williams09climdyn.yml (`#2566 `__) `Axel Lauer `__ -- Restored original versions of `recipe_schlund20esd.yml` and `recipe_meehl20sciadv.yml` (`#2583 `__) `Manuel Schlund `__ +- Remove use of OBS and use CMIP instead in `examples/recipe_ncl.yml` (:pull:`2494`) :user:`valeriupredoi` +- Expanded `recipe_preprocessor_test.yml` to account for new `multi_model_statistics` features (:pull:`2519`) :user:`schlunma` +- Updated piControl periods for recipes that use KACE-1-0-G (:pull:`2537`) :user:`schlunma` +- Reduced time range in `recipe_globwat.yml` (:pull:`2548`) :user:`schlunma` +- Removed models with missing data from recipe_williams09climdyn.yml (:pull:`2566`) :user:`axel-lauer` +- Restored original versions of `recipe_schlund20esd.yml` and `recipe_meehl20sciadv.yml` (:pull:`2583`) :user:`schlunma` .. _changelog-v2-4-0: @@ -778,119 +778,119 @@ This release includes Bug fixes ~~~~~~~~~ -- Fixed `recipe_meehl20sciadv.yml` for ESMValCore 2.3 (`#2253 `__) `Manuel Schlund `__ -- Fix provenance of NCL figures created using the log_provenance function (`#2279 `__) `Bouwe Andela `__ -- Fix bug in ClimWIP brunner19 recipe when plotting (`#2226 `__) `Lukas Brunner `__ -- Pin docutils <0.17 to fix sphinx build with rtd theme (`#2312 `__) `Klaus Zimmermann `__ -- Fix example recipes (`#2338 `__) `Valeriu Predoi `__ -- Do not add bounds to plev (plev19) in era interim cmorizer (`#2328 `__) `Valeriu Predoi `__ -- Fix problem with pip 21.3 that prevents installation from source (`#2344 `__) `Klaus Zimmermann `__ -- Add title to recipe embedded in test_diagnostic_run.py (`#2353 `__) `Klaus Zimmermann `__ -- Fix capitalization of obs4MIPs (`#2368 `__) `Bouwe Andela `__ -- Specify that areacella is needed for area statistics in the Python example recipe (`#2371 `__) `Bouwe Andela `__ -- Enabling variable `obs550lt1aer` in recipes (`#2388 `__) `Rémi Kazeroni `__ -- Update a diagnostic to new Iris version (`#2390 `__) `katjaweigel `__ -- Fixed bug in provenance tracking of ecs_scatter.ncl (`#2391 `__) `Manuel Schlund `__ -- Fix provenance issue in pv_capacity_factor.R (`#2392 `__) `katjaweigel `__ -- Remove obsolete write_plots option from R diagnostics (`#2395 `__) `Klaus Zimmermann `__ -- Fix arctic ocean diagnostic (`#2397 `__) `Klaus Zimmermann `__ -- Fix sea ice drift recipe and script (`#2404 `__) `sloosvel `__ -- Adapt diagnostic script to new version of iris (`#2403 `__) `Klaus Zimmermann `__ -- Fix ocean multimap (`#2406 `__) `Klaus Zimmermann `__ -- Fix diagnostic that uses `xarray`: `dtype` correctly set and harmonize `xarray` and `matplotlib` (`#2409 `__) `Klaus Zimmermann `__ -- Deactivate provenance logging for plots in thermodyn toolbox (`#2414 `__) `Klaus Zimmermann `__ +- Fixed `recipe_meehl20sciadv.yml` for ESMValCore 2.3 (:pull:`2253`) :user:`schlunma` +- Fix provenance of NCL figures created using the log_provenance function (:pull:`2279`) :user:`bouweandela` +- Fix bug in ClimWIP brunner19 recipe when plotting (:pull:`2226`) :user:`lukasbrunner` +- Pin docutils <0.17 to fix sphinx build with rtd theme (:pull:`2312`) :user:`zklaus` +- Fix example recipes (:pull:`2338`) :user:`valeriupredoi` +- Do not add bounds to plev (plev19) in era interim cmorizer (:pull:`2328`) :user:`valeriupredoi` +- Fix problem with pip 21.3 that prevents installation from source (:pull:`2344`) :user:`zklaus` +- Add title to recipe embedded in test_diagnostic_run.py (:pull:`2353`) :user:`zklaus` +- Fix capitalization of obs4MIPs (:pull:`2368`) :user:`bouweandela` +- Specify that areacella is needed for area statistics in the Python example recipe (:pull:`2371`) :user:`bouweandela` +- Enabling variable `obs550lt1aer` in recipes (:pull:`2388`) :user:`remi-kazeroni` +- Update a diagnostic to new Iris version (:pull:`2390`) :user:`katjaweigel` +- Fixed bug in provenance tracking of ecs_scatter.ncl (:pull:`2391`) :user:`schlunma` +- Fix provenance issue in pv_capacity_factor.R (:pull:`2392`) :user:`katjaweigel` +- Remove obsolete write_plots option from R diagnostics (:pull:`2395`) :user:`zklaus` +- Fix arctic ocean diagnostic (:pull:`2397`) :user:`zklaus` +- Fix sea ice drift recipe and script (:pull:`2404`) :user:`sloosvel` +- Adapt diagnostic script to new version of iris (:pull:`2403`) :user:`zklaus` +- Fix ocean multimap (:pull:`2406`) :user:`zklaus` +- Fix diagnostic that uses `xarray`: `dtype` correctly set and harmonize `xarray` and `matplotlib` (:pull:`2409`) :user:`zklaus` +- Deactivate provenance logging for plots in thermodyn toolbox (:pull:`2414`) :user:`zklaus` Deprecations ~~~~~~~~~~~~ -- Removed write_plots and write_netcdf from some NCL diagnostics (`#2293 `__) `Manuel Schlund `__ -- Fixed provenance logging of all python diagnostics by removing 'plot_file' entry (`#2296 `__) `Manuel Schlund `__ -- Do not deprecate classes Variable, Variables and Datasets on a specific version (`#2286 `__) `Manuel Schlund `__ -- Remove obsolete write_netcdf option from ncl diagnostic scripts (`#2387 `__) `Klaus Zimmermann `__ -- Remove write plots from ocean diagnostics (`#2393 `__) `Valeriu Predoi `__ -- More removals of instances of `write_plots` from Python diagnostics (appears to be the final removal from Py diags) (`#2394 `__) `Valeriu Predoi `__ +- Removed write_plots and write_netcdf from some NCL diagnostics (:pull:`2293`) :user:`schlunma` +- Fixed provenance logging of all python diagnostics by removing 'plot_file' entry (:pull:`2296`) :user:`schlunma` +- Do not deprecate classes Variable, Variables and Datasets on a specific version (:pull:`2286`) :user:`schlunma` +- Remove obsolete write_netcdf option from ncl diagnostic scripts (:pull:`2387`) :user:`zklaus` +- Remove write plots from ocean diagnostics (:pull:`2393`) :user:`valeriupredoi` +- More removals of instances of `write_plots` from Python diagnostics (appears to be the final removal from Py diags) (:pull:`2394`) :user:`valeriupredoi` Documentation ~~~~~~~~~~~~~ -- List Manuel Schlund as release manager for v2.5 (`#2268 `__) `Bouwe Andela `__ -- GlobWat fix download links and gdal command (`#2334 `__) `Banafsheh Abdollahi `__ -- Add titles to recipes authored by `predoi_valeriu` (`#2333 `__) `Valeriu Predoi `__ -- Added titles to recipes maintained by lauer_axel (`#2332 `__) `Axel Lauer `__ -- Update the documentation of the GRACE CMORizer (`#2349 `__) `Rémi Kazeroni `__ -- Add titles in BSC recipes (`#2351 `__) `sloosvel `__ -- Update esmvalcore dependency to 2.4.0rc1 (`#2348 `__) `Klaus Zimmermann `__ -- Add titles to recipes maintained by Peter Kalverla (`#2356 `__) `Peter Kalverla `__ -- Adding titles to the recipes with maintainer hb326 (`#2358 `__) `Birgit Hassler `__ -- Add title for zmnam as for #2354 (`#2363 `__) `fserva `__ -- Added recipe titles the the ocean recipes. (`#2364 `__) `Lee de Mora `__ -- Update recipe_thermodyn_diagtool.yml - add title (`#2365 `__) `ValerioLembo `__ -- Fix provenance of figures of several R diagnostics (`#2300 `__) `Bouwe Andela `__ -- Adding titles to Mattia's recipes (`#2367 `__) `Rémi Kazeroni `__ -- Adding titles to wenzel recipes (`#2366 `__) `Birgit Hassler `__ -- Fix formatting of some recipe titles merged from PR 2364 (`#2372 `__) `Klaus Zimmermann `__ -- Adding titles to Bjoern's recipes (`#2369 `__) `Rémi Kazeroni `__ -- Add titles to ocean recipes (maintainer Lovato) (`#2375 `__) `Tomas Lovato `__ -- Add titles for three c3s-magic recipes (`#2378 `__) `Klaus Zimmermann `__ -- Add title for recipe maintained by Ruth Lorenz (`#2379 `__) `Klaus Zimmermann `__ -- Fix toymodel recipe (`#2381 `__) `Javier Vegas-Regidor `__ -- Added titles for recipes of maintainer `schlund_manuel` (`#2377 `__) `Manuel Schlund `__ -- Write_plots and titles for deangelis15nat, li17natcc, martin18grl, pv_capacity_factor (`#2382 `__) `katjaweigel `__ -- Add titles for some recipes (`#2383 `__) `Klaus Zimmermann `__ -- Adding titles for recipes by von Hardenberg and Arnone (`#2384 `__) `Klaus Zimmermann `__ -- Last two missing titles (`#2386 `__) `Valeriu Predoi `__ -- Update documentation on downloading data (`#2370 `__) `Bouwe Andela `__ -- Fix installation instructions for Julia (`#2335 `__) `Klaus Zimmermann `__ -- Fix provenance of Julia example diagnostic (`#2289 `__) `Bouwe Andela `__ -- Added notes on use of mamba in the installation documentation chapter (`#2236 `__) `Valeriu Predoi `__ -- Update version number for 2.4.0 release (`#2410 `__) `Klaus Zimmermann `__ -- Update release schedule for 2.4.0 (`#2412 `__) `Klaus Zimmermann `__ -- Update changelog for 2.4.0 release (`#2411 `__) `Klaus Zimmermann `__ +- List Manuel Schlund as release manager for v2.5 (:pull:`2268`) :user:`bouweandela` +- GlobWat fix download links and gdal command (:pull:`2334`) :user:`babdollahi` +- Add titles to recipes authored by `predoi_valeriu` (:pull:`2333`) :user:`valeriupredoi` +- Added titles to recipes maintained by lauer_axel (:pull:`2332`) :user:`axel-lauer` +- Update the documentation of the GRACE CMORizer (:pull:`2349`) :user:`remi-kazeroni` +- Add titles in BSC recipes (:pull:`2351`) :user:`sloosvel` +- Update esmvalcore dependency to 2.4.0rc1 (:pull:`2348`) :user:`zklaus` +- Add titles to recipes maintained by Peter Kalverla (:pull:`2356`) :user:`Peter9192` +- Adding titles to the recipes with maintainer hb326 (:pull:`2358`) :user:`hb326` +- Add title for zmnam as for #2354 (:pull:`2363`) :user:`fserva` +- Added recipe titles the the ocean recipes. (:pull:`2364`) :user:`ledm` +- Update recipe_thermodyn_diagtool.yml - add title (:pull:`2365`) :user:`ValerioLembo` +- Fix provenance of figures of several R diagnostics (:pull:`2300`) :user:`bouweandela` +- Adding titles to Mattia's recipes (:pull:`2367`) :user:`remi-kazeroni` +- Adding titles to wenzel recipes (:pull:`2366`) :user:`hb326` +- Fix formatting of some recipe titles merged from PR 2364 (:pull:`2372`) :user:`zklaus` +- Adding titles to Bjoern's recipes (:pull:`2369`) :user:`remi-kazeroni` +- Add titles to ocean recipes (maintainer Lovato) (:pull:`2375`) :user:`tomaslovato` +- Add titles for three c3s-magic recipes (:pull:`2378`) :user:`zklaus` +- Add title for recipe maintained by Ruth Lorenz (:pull:`2379`) :user:`zklaus` +- Fix toymodel recipe (:pull:`2381`) `Javier Vegas-Regidor `__ +- Added titles for recipes of maintainer `schlund_manuel` (:pull:`2377`) :user:`schlunma` +- Write_plots and titles for deangelis15nat, li17natcc, martin18grl, pv_capacity_factor (:pull:`2382`) :user:`katjaweigel` +- Add titles for some recipes (:pull:`2383`) :user:`zklaus` +- Adding titles for recipes by von Hardenberg and Arnone (:pull:`2384`) :user:`zklaus` +- Last two missing titles (:pull:`2386`) :user:`valeriupredoi` +- Update documentation on downloading data (:pull:`2370`) :user:`bouweandela` +- Fix installation instructions for Julia (:pull:`2335`) :user:`zklaus` +- Fix provenance of Julia example diagnostic (:pull:`2289`) :user:`bouweandela` +- Added notes on use of mamba in the installation documentation chapter (:pull:`2236`) :user:`valeriupredoi` +- Update version number for 2.4.0 release (:pull:`2410`) :user:`zklaus` +- Update release schedule for 2.4.0 (:pull:`2412`) :user:`zklaus` +- Update changelog for 2.4.0 release (:pull:`2411`) :user:`zklaus` Diagnostics ~~~~~~~~~~~ -- Add all available CMIP5 and CMIP6 models to recipe_impact.yml (`#2251 `__) `Bouwe Andela `__ -- Add Fig. 6, 7 and 9 of Bock20jgr (`#2252 `__) `Lisa Bock `__ -- Generalize `recipe_validation*` diagnostic to work with identical control and experiment dataset names (`#2284 `__) `Valeriu Predoi `__ -- Add missing preprocessor to recipe_gier2020bg and adapt to available data (`#2399 `__) `Bettina Gier `__ -- Removed custom version of `AtmosphereSigmaFactory` in diagnostics (`#2405 `__) `Manuel Schlund `__ +- Add all available CMIP5 and CMIP6 models to recipe_impact.yml (:pull:`2251`) :user:`bouweandela` +- Add Fig. 6, 7 and 9 of Bock20jgr (:pull:`2252`) :user:`LisaBock` +- Generalize `recipe_validation*` diagnostic to work with identical control and experiment dataset names (:pull:`2284`) :user:`valeriupredoi` +- Add missing preprocessor to recipe_gier2020bg and adapt to available data (:pull:`2399`) :user:`bettina-gier` +- Removed custom version of `AtmosphereSigmaFactory` in diagnostics (:pull:`2405`) :user:`schlunma` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Replace recipe_era5.yml with recipe_daily_era5.yml (`#2182 `__) `SarahAlidoost `__ -- Update WOA cmorizer for WOA18 and WOA13v2 (`#1812 `__) `Lisa Bock `__ -- GLODAP v2.2016 ocean data cmorizer (`#2185 `__) `Tomas Lovato `__ -- Updated GCP CMORizer (`#2295 `__) `Manuel Schlund `__ +- Replace recipe_era5.yml with recipe_daily_era5.yml (:pull:`2182`) :user:`SarahAlidoost` +- Update WOA cmorizer for WOA18 and WOA13v2 (:pull:`1812`) :user:`LisaBock` +- GLODAP v2.2016 ocean data cmorizer (:pull:`2185`) :user:`tomaslovato` +- Updated GCP CMORizer (:pull:`2295`) :user:`schlunma` Automatic testing ~~~~~~~~~~~~~~~~~ -- Add a cylc suite to run all recipes (`#2219 `__) `Bouwe Andela `__ -- Retire test with Python 3.6 from full development Github Actions test (`#2229 `__) `Valeriu Predoi `__ -- Remove Python 3.6 tests from GitHub Actions (`#2264 `__) `Valeriu Predoi `__ -- Unpin upper bound for iris (previously was at <3.0.4) (`#2266 `__) `Valeriu Predoi `__ -- Pin latest esmvalcore to allow use of the bugfix release 2.3.1 always (`#2269 `__) `Valeriu Predoi `__ -- Add apt update so Julia gets found and installed by Docker (`#2290 `__) `Valeriu Predoi `__ -- Use mamba for environment update and creation in the Docker container build on DockerHub (`#2297 `__) `Valeriu Predoi `__ -- Docker container experimental - run a full env solve with mamba instead of a conda update (`#2306 `__) `Valeriu Predoi `__ -- Full use of mamba in Github Actions source install test and use generic Python 3.7 (removing the very specific 3.7.10) (`#2287 `__) `Valeriu Predoi `__ -- Replace use of conda with mamba for conda_install test on Circle CI (`#2237 `__) `Valeriu Predoi `__ -- Update circleci configuration (`#2357 `__) `Klaus Zimmermann `__ +- Add a cylc suite to run all recipes (:pull:`2219`) :user:`bouweandela` +- Retire test with Python 3.6 from full development Github Actions test (:pull:`2229`) :user:`valeriupredoi` +- Remove Python 3.6 tests from GitHub Actions (:pull:`2264`) :user:`valeriupredoi` +- Unpin upper bound for iris (previously was at <3.0.4) (:pull:`2266`) :user:`valeriupredoi` +- Pin latest esmvalcore to allow use of the bugfix release 2.3.1 always (:pull:`2269`) :user:`valeriupredoi` +- Add apt update so Julia gets found and installed by Docker (:pull:`2290`) :user:`valeriupredoi` +- Use mamba for environment update and creation in the Docker container build on DockerHub (:pull:`2297`) :user:`valeriupredoi` +- Docker container experimental - run a full env solve with mamba instead of a conda update (:pull:`2306`) :user:`valeriupredoi` +- Full use of mamba in Github Actions source install test and use generic Python 3.7 (removing the very specific 3.7.10) (:pull:`2287`) :user:`valeriupredoi` +- Replace use of conda with mamba for conda_install test on Circle CI (:pull:`2237`) :user:`valeriupredoi` +- Update circleci configuration (:pull:`2357`) :user:`zklaus` Installation ~~~~~~~~~~~~ -- Remove `mpich` from conda dependencies list (`#2343 `__) `Valeriu Predoi `__ +- Remove `mpich` from conda dependencies list (:pull:`2343`) :user:`valeriupredoi` Improvements ~~~~~~~~~~~~ -- Add script for extracting a list of input files from the provenance (`#2278 `__) `Bouwe Andela `__ -- Update github actions (`#2360 `__) `Klaus Zimmermann `__ -- Removed 'write_plots' from all NCL diagnostics (`#2331 `__) `Axel Lauer `__ -- Update and modernize `config-user-example.yml` (`#2374 `__) `Valeriu Predoi `__ +- Add script for extracting a list of input files from the provenance (:pull:`2278`) :user:`bouweandela` +- Update github actions (:pull:`2360`) :user:`zklaus` +- Removed 'write_plots' from all NCL diagnostics (:pull:`2331`) :user:`axel-lauer` +- Update and modernize `config-user-example.yml` (:pull:`2374`) :user:`valeriupredoi` .. _changelog-v2-3-0: @@ -903,91 +903,91 @@ This release includes Bug fixes ~~~~~~~~~ -- Indent block to pick up and raise exception if cmorizer data not found (TierX dir is not there) (`#1877 `__) `Valeriu Predoi `__ -- Skip recipe filler tests until we have a new release since GA tests are failing (`#2089 `__) `Valeriu Predoi `__ -- Fixed broken link to contributions in README (`#2102 `__) `Manuel Schlund `__ -- Fix recipe filler for the case the variable doesn't contain short_name (`#2104 `__) `Valeriu Predoi `__ -- Add fix for iris longitude bug to ClimWIP (`#2107 `__) `Lukas Brunner `__ -- Update for outdated link to reference Déandreis et al. (2014). (`#2076 `__) `katjaweigel `__ -- Fixed recipes for ESMValCore 2.3.0 (`#2203 `__) `Manuel Schlund `__ -- Fix the WFDE5 cmorizer (`#2211 `__) `Rémi Kazeroni `__ -- Fix broken CMORizer log message if no Tier directory exists (`#2207 `__) `jmrgonza `__ -- Fix bug in ClimWIP basic test recipe when plotting (`#2225 `__) `Lukas Brunner `__ -- Fix bug in ClimWIP advanced test recipe when plotting (`#2227 `__) `Lukas Brunner `__ -- Adjust time range for the `WDFE5` dataset in the `recipe_check_obs.yml` (`#2232 `__) `Rémi Kazeroni `__ -- Fix plot and provenance of recipe_consecdrydays (`#2244 `__) `Bouwe Andela `__ +- Indent block to pick up and raise exception if cmorizer data not found (TierX dir is not there) (:pull:`1877`) :user:`valeriupredoi` +- Skip recipe filler tests until we have a new release since GA tests are failing (:pull:`2089`) :user:`valeriupredoi` +- Fixed broken link to contributions in README (:pull:`2102`) :user:`schlunma` +- Fix recipe filler for the case the variable doesn't contain short_name (:pull:`2104`) :user:`valeriupredoi` +- Add fix for iris longitude bug to ClimWIP (:pull:`2107`) :user:`lukasbrunner` +- Update for outdated link to reference Déandreis et al. (2014). (:pull:`2076`) :user:`katjaweigel` +- Fixed recipes for ESMValCore 2.3.0 (:pull:`2203`) :user:`schlunma` +- Fix the WFDE5 cmorizer (:pull:`2211`) :user:`remi-kazeroni` +- Fix broken CMORizer log message if no Tier directory exists (:pull:`2207`) :user:`jmrgonza` +- Fix bug in ClimWIP basic test recipe when plotting (:pull:`2225`) :user:`lukasbrunner` +- Fix bug in ClimWIP advanced test recipe when plotting (:pull:`2227`) :user:`lukasbrunner` +- Adjust time range for the `WDFE5` dataset in the `recipe_check_obs.yml` (:pull:`2232`) :user:`remi-kazeroni` +- Fix plot and provenance of recipe_consecdrydays (:pull:`2244`) :user:`bouweandela` Documentation ~~~~~~~~~~~~~ -- Improving the README.md file with a more appealing look and bit more info (`#2065 `__) `Valeriu Predoi `__ -- Update plot title martin18grl (`#2080 `__) `katjaweigel `__ -- Update contribution guidelines (`#2031 `__) `Bouwe Andela `__ -- Update links in pull request template to point to latest documentation (`#2083 `__) `Bouwe Andela `__ -- Update release schedule (`#2081 `__) `Bouwe Andela `__ -- Updates to contribution guidelines (`#2092 `__) `Bouwe Andela `__ -- Update documentation for ERA5 with new variables (`#2111 `__) `Lukas Brunner `__ -- Add OSX installation instructions to docs (`#2115 `__) `Barbara Vreede `__ -- Instructions to use pre-installed versions on HPC clusters (`#2197 `__) `Rémi Kazeroni `__ -- Add functional Autoassess diagnostics: land surface metrics: permafrost, soil moisture, surface radiation (`#2170 `__) `Valeriu Predoi `__ -- Add citation info in `recipe_eady_growth_rate.yml` (`#2188 `__) `sloosvel `__ -- Update version number to 2.3.0 (`#2213 `__) `Klaus Zimmermann `__ -- Update release schedule for 2.3.0 (`#2247 `__) `Klaus Zimmermann `__ -- Changelog update to v2.3.0 (`#2214 `__) `Klaus Zimmermann `__ +- Improving the README.md file with a more appealing look and bit more info (:pull:`2065`) :user:`valeriupredoi` +- Update plot title martin18grl (:pull:`2080`) :user:`katjaweigel` +- Update contribution guidelines (:pull:`2031`) :user:`bouweandela` +- Update links in pull request template to point to latest documentation (:pull:`2083`) :user:`bouweandela` +- Update release schedule (:pull:`2081`) :user:`bouweandela` +- Updates to contribution guidelines (:pull:`2092`) :user:`bouweandela` +- Update documentation for ERA5 with new variables (:pull:`2111`) :user:`lukasbrunner` +- Add OSX installation instructions to docs (:pull:`2115`) :user:`bvreede` +- Instructions to use pre-installed versions on HPC clusters (:pull:`2197`) :user:`remi-kazeroni` +- Add functional Autoassess diagnostics: land surface metrics: permafrost, soil moisture, surface radiation (:pull:`2170`) :user:`valeriupredoi` +- Add citation info in `recipe_eady_growth_rate.yml` (:pull:`2188`) :user:`sloosvel` +- Update version number to 2.3.0 (:pull:`2213`) :user:`zklaus` +- Update release schedule for 2.3.0 (:pull:`2247`) :user:`zklaus` +- Changelog update to v2.3.0 (:pull:`2214`) :user:`zklaus` Diagnostics ~~~~~~~~~~~ -- Added figures 8 and 10 to recipe_bock20jgr.yml (`#2074 `__) `Manuel Schlund `__ -- Add hydrological forcing comparison recipe (`#2013 `__) `Stef Smeets `__ -- Added recipe for Meehl et al., Sci. Adv. (2020) (`#2094 `__) `Manuel Schlund `__ -- Add GlobWat recipe and diagnostic (`#1808 `__) `Banafsheh Abdollahi `__ -- Add ClimWIP recipe to reproduce Brunner et al. 2019 (`#2109 `__) `Lukas Brunner `__ -- Update Climwip recipe to reproduce brunner2020esd (`#1859 `__) `Ruth Lorenz `__ -- Update recipe_thermodyn_diagtool.yml: code improvements and more user options (`#1391 `__) `ValerioLembo `__ -- Remove model AWI-CM-1-1-MR from recipe_impact.yml (`#2238 `__) `Bouwe Andela `__ -- PV capacity factor for ESMValTool GMD paper (`#2153 `__) `katjaweigel `__ +- Added figures 8 and 10 to recipe_bock20jgr.yml (:pull:`2074`) :user:`schlunma` +- Add hydrological forcing comparison recipe (:pull:`2013`) :user:`stefsmeets` +- Added recipe for Meehl et al., Sci. Adv. (2020) (:pull:`2094`) :user:`schlunma` +- Add GlobWat recipe and diagnostic (:pull:`1808`) :user:`babdollahi` +- Add ClimWIP recipe to reproduce Brunner et al. 2019 (:pull:`2109`) :user:`lukasbrunner` +- Update Climwip recipe to reproduce brunner2020esd (:pull:`1859`) :user:`ruthlorenz` +- Update recipe_thermodyn_diagtool.yml: code improvements and more user options (:pull:`1391`) :user:`ValerioLembo` +- Remove model AWI-CM-1-1-MR from recipe_impact.yml (:pull:`2238`) :user:`bouweandela` +- PV capacity factor for ESMValTool GMD paper (:pull:`2153`) :user:`katjaweigel` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Cmorize wfde5 (`#1991 `__) `mwjury `__ -- Make cmorizer utils funcs public in utilities.py and add some numpy style docstrings (`#2206 `__) `Valeriu Predoi `__ -- CMORizer for CLARA-AVHRR cloud data (`#2101 `__) `Axel Lauer `__ -- Update of ESACCI-CLOUD CMORizer (`#2144 `__) `Axel Lauer `__ +- Cmorize wfde5 (:pull:`1991`) :user:`mwjury` +- Make cmorizer utils funcs public in utilities.py and add some numpy style docstrings (:pull:`2206`) :user:`valeriupredoi` +- CMORizer for CLARA-AVHRR cloud data (:pull:`2101`) :user:`axel-lauer` +- Update of ESACCI-CLOUD CMORizer (:pull:`2144`) :user:`axel-lauer` Automatic testing ~~~~~~~~~~~~~~~~~ -- Force latest Python in empty environment in conda install CI test (`#2069 `__) `Valeriu Predoi `__ -- Removed imports from private sklearn modules and improved test coverage of custom_sklearn.py (`#2078 `__) `Manuel Schlund `__ -- Move private _(global)_stock_cube from esmvacore.preprocessor._regrid to cmorizer (`#2087 `__) `Valeriu Predoi `__ -- Try mamba install esmvaltool (`#2125 `__) `Valeriu Predoi `__ -- Reinstate OSX Github Action tests (`#2110 `__) `Valeriu Predoi `__ -- Pin mpich to avoid default install of 3.4.1 and 3.4.2 with external_0 builds (`#2220 `__) `Valeriu Predoi `__ -- Include test sources in distribution (`#2234 `__) `Klaus Zimmermann `__ -- Pin `iris<3.0.4` to ensure we still (sort of) support Python 3.6 (`#2246 `__) `Valeriu Predoi `__ +- Force latest Python in empty environment in conda install CI test (:pull:`2069`) :user:`valeriupredoi` +- Removed imports from private sklearn modules and improved test coverage of custom_sklearn.py (:pull:`2078`) :user:`schlunma` +- Move private _(global)_stock_cube from esmvacore.preprocessor._regrid to cmorizer (:pull:`2087`) :user:`valeriupredoi` +- Try mamba install esmvaltool (:pull:`2125`) :user:`valeriupredoi` +- Reinstate OSX Github Action tests (:pull:`2110`) :user:`valeriupredoi` +- Pin mpich to avoid default install of 3.4.1 and 3.4.2 with external_0 builds (:pull:`2220`) :user:`valeriupredoi` +- Include test sources in distribution (:pull:`2234`) :user:`zklaus` +- Pin `iris<3.0.4` to ensure we still (sort of) support Python 3.6 (:pull:`2246`) :user:`valeriupredoi` Installation ~~~~~~~~~~~~ -- Fix conda build by skipping documentation test (`#2058 `__) `Javier Vegas-Regidor `__ -- Update pin on esmvalcore pick up esmvalcore=2.3.0 (`#2200 `__) `Valeriu Predoi `__ -- Pin Python to 3.9 for development installation (`#2208 `__) `Bouwe Andela `__ +- Fix conda build by skipping documentation test (:pull:`2058`) `Javier Vegas-Regidor `__ +- Update pin on esmvalcore pick up esmvalcore=2.3.0 (:pull:`2200`) :user:`valeriupredoi` +- Pin Python to 3.9 for development installation (:pull:`2208`) :user:`bouweandela` Improvements ~~~~~~~~~~~~ -- Add EUCP and IS-ENES3 projects to config-references (`#2066 `__) `Peter Kalverla `__ -- Fix flake8 tests on CircleCI (`#2070 `__) `Bouwe Andela `__ -- Added recipe filler. (`#1707 `__) `Lee de Mora `__ -- Update use of fx vars to new syntax (`#2145 `__) `sloosvel `__ -- Add recipe for climate impact research (`#2072 `__) `Peter Kalverla `__ -- Update references "master" to "main" (`#2172 `__) `Axel Lauer `__ -- Force git to ignore VSCode workspace files (`#2186 `__) `Javier Vegas-Regidor `__ -- Update to new ESMValTool logo (`#2168 `__) `Axel Lauer `__ -- Python cmorizers for CDR1 and CDR2 ESACCI H2O (TCWV=prw) data. (`#2152 `__) `katjaweigel `__ -- Remove obsolete conda package (closes #2100) (`#2103 `__) `Klaus Zimmermann `__ +- Add EUCP and IS-ENES3 projects to config-references (:pull:`2066`) :user:`Peter9192` +- Fix flake8 tests on CircleCI (:pull:`2070`) :user:`bouweandela` +- Added recipe filler. (:pull:`1707`) :user:`ledm` +- Update use of fx vars to new syntax (:pull:`2145`) :user:`sloosvel` +- Add recipe for climate impact research (:pull:`2072`) :user:`Peter9192` +- Update references "master" to "main" (:pull:`2172`) :user:`axel-lauer` +- Force git to ignore VSCode workspace files (:pull:`2186`) `Javier Vegas-Regidor `__ +- Update to new ESMValTool logo (:pull:`2168`) :user:`axel-lauer` +- Python cmorizers for CDR1 and CDR2 ESACCI H2O (TCWV=prw) data. (:pull:`2152`) :user:`katjaweigel` +- Remove obsolete conda package (closes #2100) (:pull:`2103`) :user:`zklaus` .. _changelog-v2-2-0: @@ -1008,110 +1008,110 @@ This release includes Bug fixes ~~~~~~~~~ -- Bugfix: time weights in time_operations (`#1956 `__) `Axel Lauer `__ -- Fix issues with bibtex references (`#1955 `__) `Stef Smeets `__ -- Fix ImportError for `configure_logging` (`#1976 `__) `Stef Smeets `__ -- Add required functional parameters for extract time in recipe_er5.yml (`#1978 `__) `Valeriu Predoi `__ -- Revert "Fix ImportError for `configure_logging`" (`#1992 `__) `Bouwe Andela `__ -- Fix import of esmvalcore _logging module in cmorize_obs.py (`#2020 `__) `Valeriu Predoi `__ -- Fix logging import in cmorize_obs again since last merge was nulled by pre-commit hooks (`#2022 `__) `Valeriu Predoi `__ -- Refactor the functions in derive_evspsblpot due to new iris (`#2023 `__) `SarahAlidoost `__ -- Avoid importing private ESMValCore functions in CMORizer (`#2027 `__) `Bouwe Andela `__ -- Fix extract_seasons in validation recipe (`#2054 `__) `Javier Vegas-Regidor `__ +- Bugfix: time weights in time_operations (:pull:`1956`) :user:`axel-lauer` +- Fix issues with bibtex references (:pull:`1955`) :user:`stefsmeets` +- Fix ImportError for `configure_logging` (:pull:`1976`) :user:`stefsmeets` +- Add required functional parameters for extract time in recipe_er5.yml (:pull:`1978`) :user:`valeriupredoi` +- Revert "Fix ImportError for `configure_logging`" (:pull:`1992`) :user:`bouweandela` +- Fix import of esmvalcore _logging module in cmorize_obs.py (:pull:`2020`) :user:`valeriupredoi` +- Fix logging import in cmorize_obs again since last merge was nulled by pre-commit hooks (:pull:`2022`) :user:`valeriupredoi` +- Refactor the functions in derive_evspsblpot due to new iris (:pull:`2023`) :user:`SarahAlidoost` +- Avoid importing private ESMValCore functions in CMORizer (:pull:`2027`) :user:`bouweandela` +- Fix extract_seasons in validation recipe (:pull:`2054`) `Javier Vegas-Regidor `__ Deprecations ~~~~~~~~~~~~ -- Deprecate classes Variable, Variables and Datasets (`#1944 `__) `Manuel Schlund `__ -- Python 3.9: remove pynio as dependency and replace with rasterio and pin Matplotlib>3.3.1 and pin cartopy>=0.18 (`#1997 `__) `Valeriu Predoi `__ -- Removed write_plots and write_netcdf in some python diagnostics (`#2036 `__) `Manuel Schlund `__ +- Deprecate classes Variable, Variables and Datasets (:pull:`1944`) :user:`schlunma` +- Python 3.9: remove pynio as dependency and replace with rasterio and pin Matplotlib>3.3.1 and pin cartopy>=0.18 (:pull:`1997`) :user:`valeriupredoi` +- Removed write_plots and write_netcdf in some python diagnostics (:pull:`2036`) :user:`schlunma` Documentation ~~~~~~~~~~~~~ -- Update instructions on making a release (`#1867 `__) `Bouwe Andela `__ -- Update review.rst (`#1917 `__) `Axel Lauer `__ -- Add guidance on how to review a pull request (`#1872 `__) `Bouwe Andela `__ -- Adding tutorial links to documentation (`#1927 `__) `Birgit Hassler `__ -- Added bibtex file for schlund20jgr (`#1928 `__) `Manuel Schlund `__ -- Documentation contact added the actual email for the mailing list (`#1938 `__) `Valeriu Predoi `__ -- Make CircleCI badge specific to main branch (`#1831 `__) `Bouwe Andela `__ -- Documentation on how to move code from a private repository to a public repository (`#1920 `__) `Birgit Hassler `__ -- Refine pull request review guidelines (`#1924 `__) `Stef Smeets `__ -- Update release schedule (`#1948 `__) `Klaus Zimmermann `__ -- Improve contact info and move to more prominent location (`#1950 `__) `Bouwe Andela `__ -- Add some maintainers to some recipes that are missing them (`#1970 `__) `Valeriu Predoi `__ -- Update core team info (`#1973 `__) `Axel Lauer `__ -- Combine installation from source instructions and add common issues (`#1971 `__) `Bouwe Andela `__ -- Update iris documentation URL for sphinx (`#2003 `__) `Bouwe Andela `__ -- Fix iris documentation link(s) with new iris3 location on readthedocs (`#2012 `__) `Valeriu Predoi `__ -- Document how to run tests for installation verification (`#1847 `__) `Valeriu Predoi `__ -- List Remi Kazeroni as a code owner and sole merger of CMORizers (`#2017 `__) `Bouwe Andela `__ -- Install documentation: mention that we build conda package with python>=3.7 (`#2030 `__) `Valeriu Predoi `__ -- Recipe and documentation update for ERA5-Land. (`#1906 `__) `katjaweigel `__ -- Update changelog and changelog tool for v2.2.0 (`#2043 `__) `Javier Vegas-Regidor `__ -- Final update to the changelog for v2.2.0 (`#2056 `__) `Javier Vegas-Regidor `__ +- Update instructions on making a release (:pull:`1867`) :user:`bouweandela` +- Update review.rst (:pull:`1917`) :user:`axel-lauer` +- Add guidance on how to review a pull request (:pull:`1872`) :user:`bouweandela` +- Adding tutorial links to documentation (:pull:`1927`) :user:`hb326` +- Added bibtex file for schlund20jgr (:pull:`1928`) :user:`schlunma` +- Documentation contact added the actual email for the mailing list (:pull:`1938`) :user:`valeriupredoi` +- Make CircleCI badge specific to main branch (:pull:`1831`) :user:`bouweandela` +- Documentation on how to move code from a private repository to a public repository (:pull:`1920`) :user:`hb326` +- Refine pull request review guidelines (:pull:`1924`) :user:`stefsmeets` +- Update release schedule (:pull:`1948`) :user:`zklaus` +- Improve contact info and move to more prominent location (:pull:`1950`) :user:`bouweandela` +- Add some maintainers to some recipes that are missing them (:pull:`1970`) :user:`valeriupredoi` +- Update core team info (:pull:`1973`) :user:`axel-lauer` +- Combine installation from source instructions and add common issues (:pull:`1971`) :user:`bouweandela` +- Update iris documentation URL for sphinx (:pull:`2003`) :user:`bouweandela` +- Fix iris documentation link(s) with new iris3 location on readthedocs (:pull:`2012`) :user:`valeriupredoi` +- Document how to run tests for installation verification (:pull:`1847`) :user:`valeriupredoi` +- List Remi Kazeroni as a code owner and sole merger of CMORizers (:pull:`2017`) :user:`bouweandela` +- Install documentation: mention that we build conda package with python>=3.7 (:pull:`2030`) :user:`valeriupredoi` +- Recipe and documentation update for ERA5-Land. (:pull:`1906`) :user:`katjaweigel` +- Update changelog and changelog tool for v2.2.0 (:pull:`2043`) `Javier Vegas-Regidor `__ +- Final update to the changelog for v2.2.0 (:pull:`2056`) `Javier Vegas-Regidor `__ Diagnostics ~~~~~~~~~~~ -- Add mapplot diagnostic to ClimWIP (`#1864 `__) `Lukas Brunner `__ -- Add the option to weight variable groups in ClimWIP (`#1856 `__) `Lukas Brunner `__ -- Implementation of ensemble member recognition to the ClimWIP diagnostic (`#1852 `__) `Lukas Brunner `__ -- Restructure ClimWIP (`#1919 `__) `Lukas Brunner `__ -- Diagnostic for recipe_eyring13jgr.yml Fig. 12 (`#1922 `__) `Lisa Bock `__ -- Added changes in shared functions necessary for schlund20esd (`#1967 `__) `Manuel Schlund `__ -- Adding recipe and diagnostics for Gier et al 2020 (`#1914 `__) `Bettina Gier `__ -- Added recipe, diagnostics and documentation for Schlund et al., ESD (2020) (`#2015 `__) `Manuel Schlund `__ -- Add PRIMAVERA Eady Growth Rate diagnostic (`#1285 `__) `sloosvel `__ -- Implement shape parameter calibration for ClimWIP (`#1905 `__) `Lukas Brunner `__ +- Add mapplot diagnostic to ClimWIP (:pull:`1864`) :user:`lukasbrunner` +- Add the option to weight variable groups in ClimWIP (:pull:`1856`) :user:`lukasbrunner` +- Implementation of ensemble member recognition to the ClimWIP diagnostic (:pull:`1852`) :user:`lukasbrunner` +- Restructure ClimWIP (:pull:`1919`) :user:`lukasbrunner` +- Diagnostic for recipe_eyring13jgr.yml Fig. 12 (:pull:`1922`) :user:`LisaBock` +- Added changes in shared functions necessary for schlund20esd (:pull:`1967`) :user:`schlunma` +- Adding recipe and diagnostics for Gier et al 2020 (:pull:`1914`) :user:`bettina-gier` +- Added recipe, diagnostics and documentation for Schlund et al., ESD (2020) (:pull:`2015`) :user:`schlunma` +- Add PRIMAVERA Eady Growth Rate diagnostic (:pull:`1285`) :user:`sloosvel` +- Implement shape parameter calibration for ClimWIP (:pull:`1905`) :user:`lukasbrunner` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Extended ESRL cmorizer (`#1937 `__) `Bettina Gier `__ -- Cmorizer for GRACE data (`#1694 `__) `bascrezee `__ -- Cmorizer for latest ESACCI-SST data (`#1895 `__) `Valeriu Predoi `__ -- Fix longitude in ESRL cmorizer (`#1988 `__) `Bettina Gier `__ -- Selectively turn off fixing bounds for coordinates during cmorization with utilities.py (`#2014 `__) `Valeriu Predoi `__ -- Cmorize hadcrut5 (`#1977 `__) `mwjury `__ -- Cmorize gpcc masking (`#1995 `__) `mwjury `__ -- Cmorize_utils_save_1mon_Amon (`#1990 `__) `mwjury `__ -- Cmorize gpcc fix (`#1982 `__) `mwjury `__ -- Fix flake8 raised by develop test in cmorize_obs_gpcc.py (`#2038 `__) `Valeriu Predoi `__ +- Extended ESRL cmorizer (:pull:`1937`) :user:`bettina-gier` +- Cmorizer for GRACE data (:pull:`1694`) :user:`bascrezee` +- Cmorizer for latest ESACCI-SST data (:pull:`1895`) :user:`valeriupredoi` +- Fix longitude in ESRL cmorizer (:pull:`1988`) :user:`bettina-gier` +- Selectively turn off fixing bounds for coordinates during cmorization with utilities.py (:pull:`2014`) :user:`valeriupredoi` +- Cmorize hadcrut5 (:pull:`1977`) :user:`mwjury` +- Cmorize gpcc masking (:pull:`1995`) :user:`mwjury` +- Cmorize_utils_save_1mon_Amon (:pull:`1990`) :user:`mwjury` +- Cmorize gpcc fix (:pull:`1982`) :user:`mwjury` +- Fix flake8 raised by develop test in cmorize_obs_gpcc.py (:pull:`2038`) :user:`valeriupredoi` Automatic testing ~~~~~~~~~~~~~~~~~ -- Switched miniconda conda setup hooks for Github Actions workflows (`#1913 `__) `Valeriu Predoi `__ -- Fix style issue (`#1929 `__) `Bouwe Andela `__ -- Fix mlr test with solution that works for CentOS too (`#1936 `__) `Valeriu Predoi `__ -- Temporary deactivation Github Actions on OSX (`#1939 `__) `Valeriu Predoi `__ -- Fix conda installation test on CircleCI (`#1952 `__) `Bouwe Andela `__ -- Github Actions: change time for cron job that installs from conda (`#1969 `__) `Valeriu Predoi `__ -- CI upload relevant artifacts for test job (`#1999 `__) `Valeriu Predoi `__ -- Github Actions test that runs with the latest ESMValCore main (`#1989 `__) `Valeriu Predoi `__ -- Introduce python 39 in Github Actions tests (`#2029 `__) `Valeriu Predoi `__ -- Remove test for conda package installation on Python 3.6 (`#2033 `__) `Valeriu Predoi `__ -- Update codacy coverage reporter to fix coverage (`#2039 `__) `Bouwe Andela `__ +- Switched miniconda conda setup hooks for Github Actions workflows (:pull:`1913`) :user:`valeriupredoi` +- Fix style issue (:pull:`1929`) :user:`bouweandela` +- Fix mlr test with solution that works for CentOS too (:pull:`1936`) :user:`valeriupredoi` +- Temporary deactivation Github Actions on OSX (:pull:`1939`) :user:`valeriupredoi` +- Fix conda installation test on CircleCI (:pull:`1952`) :user:`bouweandela` +- Github Actions: change time for cron job that installs from conda (:pull:`1969`) :user:`valeriupredoi` +- CI upload relevant artifacts for test job (:pull:`1999`) :user:`valeriupredoi` +- Github Actions test that runs with the latest ESMValCore main (:pull:`1989`) :user:`valeriupredoi` +- Introduce python 39 in Github Actions tests (:pull:`2029`) :user:`valeriupredoi` +- Remove test for conda package installation on Python 3.6 (:pull:`2033`) :user:`valeriupredoi` +- Update codacy coverage reporter to fix coverage (:pull:`2039`) :user:`bouweandela` Installation ~~~~~~~~~~~~ -- Simplify installation of R development dependencies (`#1930 `__) `Bouwe Andela `__ -- Fix docker build (`#1934 `__) `Bouwe Andela `__ -- Use new conda environment for installing ESMValTool in Docker containers (`#1993 `__) `Bouwe Andela `__ -- Fix conda build (`#2026 `__) `Bouwe Andela `__ +- Simplify installation of R development dependencies (:pull:`1930`) :user:`bouweandela` +- Fix docker build (:pull:`1934`) :user:`bouweandela` +- Use new conda environment for installing ESMValTool in Docker containers (:pull:`1993`) :user:`bouweandela` +- Fix conda build (:pull:`2026`) :user:`bouweandela` Improvements ~~~~~~~~~~~~ -- Allow multiple references for a cmorizer script (`#1953 `__) `SarahAlidoost `__ -- Add GRACE to the recipe check_obs (`#1963 `__) `Rémi Kazeroni `__ -- Align ESMValTool to ESMValCore=2.2.0 (adopt iris3, fix environment for new Core release) (`#1874 `__) `Stef Smeets `__ -- Make it possible to use write_plots and write_netcdf from recipe instead of config-user.yml (`#2018 `__) `Bouwe Andela `__ -- Revise lisflood and hype recipes (`#2035 `__) `SarahAlidoost `__ -- Set version to 2.2.0 (`#2042 `__) `Javier Vegas-Regidor `__ +- Allow multiple references for a cmorizer script (:pull:`1953`) :user:`SarahAlidoost` +- Add GRACE to the recipe check_obs (:pull:`1963`) :user:`remi-kazeroni` +- Align ESMValTool to ESMValCore=2.2.0 (adopt iris3, fix environment for new Core release) (:pull:`1874`) :user:`stefsmeets` +- Make it possible to use write_plots and write_netcdf from recipe instead of config-user.yml (:pull:`2018`) :user:`bouweandela` +- Revise lisflood and hype recipes (:pull:`2035`) :user:`SarahAlidoost` +- Set version to 2.2.0 (:pull:`2042`) `Javier Vegas-Regidor `__ .. _changelog-v2-1-1: @@ -1123,14 +1123,14 @@ This release includes Improvements ~~~~~~~~~~~~ -- Fix the conda build on CircleCI (`#1883 `__) `Bouwe Andela `__ -- Pin matplotlib to <3.3 and add compilers (`#1898 `__) `Bouwe Andela `__ -- Pin esmvaltool subpackages to the same version and build as the esmvaltool conda package (`#1899 `__) `Bouwe Andela `__ +- Fix the conda build on CircleCI (:pull:`1883`) :user:`bouweandela` +- Pin matplotlib to <3.3 and add compilers (:pull:`1898`) :user:`bouweandela` +- Pin esmvaltool subpackages to the same version and build as the esmvaltool conda package (:pull:`1899`) :user:`bouweandela` Documentation ~~~~~~~~~~~~~ -- Release notes v2.1.1 (`#1932 `__) `Valeriu Predoi `__ +- Release notes v2.1.1 (:pull:`1932`) :user:`valeriupredoi` .. _changelog-v2-1-0: @@ -1142,51 +1142,51 @@ This release includes Diagnostics ~~~~~~~~~~~ -- Add extra steps to diagnostic to make output of hydrology/recipe_lisflood.yml usable by the LISFLOOD model (`#1737 `__) `Jaro Camphuijsen `__ -- Recipe to reproduce the 2014 KNMI Climate Scenarios (kcs). (`#1667 `__) `Peter Kalverla `__ -- Implement the climwip weighting scheme in a recipe and diagnostic (`#1648 `__) `Jaro Camphuijsen `__ -- Remove unreviewed autoassess recipes (`#1840 `__) `Valeriu Predoi `__ -- Changes in shared scripts for Schlund et al., JGR: Biogeosciences, 2020 (`#1845 `__) `Manuel Schlund `__ -- Updated derivation test recipe (`#1790 `__) `Manuel Schlund `__ -- Support for multiple model occurrence in perf main (`#1649 `__) `Bettina Gier `__ -- Add recipe and diagnostics for Schlund et al., JGR: Biogeosciences, 2020 (`#1860 `__) `Manuel Schlund `__ -- Adjust recipe_extract_shape.yml to recent changes in the example diagnostic.py (`#1880 `__) `Bouwe Andela `__ +- Add extra steps to diagnostic to make output of hydrology/recipe_lisflood.yml usable by the LISFLOOD model (:pull:`1737`) :user:`JaroCamphuijsen` +- Recipe to reproduce the 2014 KNMI Climate Scenarios (kcs). (:pull:`1667`) :user:`Peter9192` +- Implement the climwip weighting scheme in a recipe and diagnostic (:pull:`1648`) :user:`JaroCamphuijsen` +- Remove unreviewed autoassess recipes (:pull:`1840`) :user:`valeriupredoi` +- Changes in shared scripts for Schlund et al., JGR: Biogeosciences, 2020 (:pull:`1845`) :user:`schlunma` +- Updated derivation test recipe (:pull:`1790`) :user:`schlunma` +- Support for multiple model occurrence in perf main (:pull:`1649`) :user:`bettina-gier` +- Add recipe and diagnostics for Schlund et al., JGR: Biogeosciences, 2020 (:pull:`1860`) :user:`schlunma` +- Adjust recipe_extract_shape.yml to recent changes in the example diagnostic.py (:pull:`1880`) :user:`bouweandela` Documentation ~~~~~~~~~~~~~ -- Add pip installation instructions (`#1783 `__) `Bouwe Andela `__ -- Add installation instruction for R and Julia dependencies tot pip install (`#1787 `__) `Bouwe Andela `__ -- Avoid autodocsumm 0.2.0 and update documentation build dependencies (`#1794 `__) `Bouwe Andela `__ -- Add more information on working on cluster attached to ESGF node (`#1821 `__) `Bouwe Andela `__ -- Add release strategy to community documentation (`#1809 `__) `Klaus Zimmermann `__ -- Update esmvaltool run command everywhere in documentation (`#1820 `__) `Bouwe Andela `__ -- Add more info on documenting a recipe (`#1795 `__) `Bouwe Andela `__ -- Improve the Python example diagnostic and documentation (`#1827 `__) `Bouwe Andela `__ -- Improve description of how to use draft_release_notes.py (`#1848 `__) `Bouwe Andela `__ -- Update changelog for release 2.1 (`#1886 `__) `Valeriu Predoi `__ +- Add pip installation instructions (:pull:`1783`) :user:`bouweandela` +- Add installation instruction for R and Julia dependencies tot pip install (:pull:`1787`) :user:`bouweandela` +- Avoid autodocsumm 0.2.0 and update documentation build dependencies (:pull:`1794`) :user:`bouweandela` +- Add more information on working on cluster attached to ESGF node (:pull:`1821`) :user:`bouweandela` +- Add release strategy to community documentation (:pull:`1809`) :user:`zklaus` +- Update esmvaltool run command everywhere in documentation (:pull:`1820`) :user:`bouweandela` +- Add more info on documenting a recipe (:pull:`1795`) :user:`bouweandela` +- Improve the Python example diagnostic and documentation (:pull:`1827`) :user:`bouweandela` +- Improve description of how to use draft_release_notes.py (:pull:`1848`) :user:`bouweandela` +- Update changelog for release 2.1 (:pull:`1886`) :user:`valeriupredoi` Improvements ~~~~~~~~~~~~ -- Fix R installation in WSL (`#1789 `__) `Javier Vegas-Regidor `__ -- Add pre-commit for linting/formatting (`#1796 `__) `Stef Smeets `__ -- Speed up tests on CircleCI and use pytest to run them (`#1804 `__) `Bouwe Andela `__ -- Move pre-commit excludes to top-level and correct order of lintr and styler (`#1805 `__) `Stef Smeets `__ -- Remove isort setup to fix formatting conflict with yapf (`#1815 `__) `Stef Smeets `__ -- GitHub Actions (`#1806 `__) `Valeriu Predoi `__ -- Fix yapf-isort import formatting conflict (`#1822 `__) `Stef Smeets `__ -- Replace vmprof with vprof as the default profiler (`#1829 `__) `Bouwe Andela `__ -- Update ESMValCore v2.1.0 requirement (`#1839 `__) `Javier Vegas-Regidor `__ -- Pin iris to version 2 (`#1881 `__) `Bouwe Andela `__ -- Pin eccodes to not use eccodes=2.19.0 for cdo to work fine (`#1869 `__) `Valeriu Predoi `__ -- Increase version to 2.1.0 and add release notes (`#1868 `__) `Valeriu Predoi `__ -- Github Actions Build Packages and Deploy tests (conda and PyPi) (`#1858 `__) `Valeriu Predoi `__ +- Fix R installation in WSL (:pull:`1789`) `Javier Vegas-Regidor `__ +- Add pre-commit for linting/formatting (:pull:`1796`) :user:`stefsmeets` +- Speed up tests on CircleCI and use pytest to run them (:pull:`1804`) :user:`bouweandela` +- Move pre-commit excludes to top-level and correct order of lintr and styler (:pull:`1805`) :user:`stefsmeets` +- Remove isort setup to fix formatting conflict with yapf (:pull:`1815`) :user:`stefsmeets` +- GitHub Actions (:pull:`1806`) :user:`valeriupredoi` +- Fix yapf-isort import formatting conflict (:pull:`1822`) :user:`stefsmeets` +- Replace vmprof with vprof as the default profiler (:pull:`1829`) :user:`bouweandela` +- Update ESMValCore v2.1.0 requirement (:pull:`1839`) `Javier Vegas-Regidor `__ +- Pin iris to version 2 (:pull:`1881`) :user:`bouweandela` +- Pin eccodes to not use eccodes=2.19.0 for cdo to work fine (:pull:`1869`) :user:`valeriupredoi` +- Increase version to 2.1.0 and add release notes (:pull:`1868`) :user:`valeriupredoi` +- Github Actions Build Packages and Deploy tests (conda and PyPi) (:pull:`1858`) :user:`valeriupredoi` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Added CMORizer for Scripps-CO2-KUM (`#1857 `__) `Manuel Schlund `__ +- Added CMORizer for Scripps-CO2-KUM (:pull:`1857`) :user:`schlunma` .. _changelog-v2-0-0: @@ -1198,106 +1198,106 @@ This release includes Bug fixes ~~~~~~~~~ -- Fix pep8-naming errors and fix zmnam diagnostic (`#1702 `__) `Bouwe Andela `__ -- Fix keyword argument in cmorize_obs (`#1721 `__) `Mattia Righi `__ -- Fixed JMA-TRANSCOM CMORizer (`#1735 `__) `Manuel Schlund `__ -- Fix bug in extract_doi_value (`#1734 `__) `bascrezee `__ -- Fix small errors in the arctic_ocean diagnostic (`#1722 `__) `Nikolay Koldunov `__ -- Flatten ancestor lists for diag_spei.R and diag_spi.R. (`#1745 `__) `katjaweigel `__ -- Fix for recipe_ocean_ice_extent.yml (`#1744 `__) `Mattia Righi `__ -- Fix recipe_combined_indices.yml provenance (`#1746 `__) `Javier Vegas-Regidor `__ -- Fix provenance in recipe_multimodel_products (`#1747 `__) `Javier Vegas-Regidor `__ -- Exclude FGOALS-g2 due to ESMValCore issue #728 (`#1749 `__) `Mattia Righi `__ -- Fix recipe_modes_of_variability (`#1753 `__) `Javier Vegas-Regidor `__ -- Flatten lists for ancestors for hyint to prevent nested lists. (`#1752 `__) `katjaweigel `__ -- Fix bug in cmorize_obs_eppley_vgpm_modis.py (#1729) (`#1759 `__) `Tomas Lovato `__ -- Correct mip for clltkisccp in example derive preprocessor recipe (`#1768 `__) `Bouwe Andela `__ -- Update date conversion in recipe_hype.yml (`#1769 `__) `Bouwe Andela `__ -- Fix recipe_correlation.yml (`#1767 `__) `Bouwe Andela `__ -- Add attribute positive: down to plev coordinate in ERA-Interim CMORizer (`#1771 `__) `Bouwe Andela `__ -- Fix sispeed in recipe_preprocessor_derive_test (`#1772 `__) `Javier Vegas-Regidor `__ -- Fix extreme events and extreme index ancestors (`#1774 `__) `katjaweigel `__ -- Correct date in output filenames of ERA5 CMORizer recipe (`#1773 `__) `Bouwe Andela `__ -- Exclude WOA from multi-model stats in recipe_ocean_bgc (`#1778 `__) `Mattia Righi `__ +- Fix pep8-naming errors and fix zmnam diagnostic (:pull:`1702`) :user:`bouweandela` +- Fix keyword argument in cmorize_obs (:pull:`1721`) :user:`mattiarighi` +- Fixed JMA-TRANSCOM CMORizer (:pull:`1735`) :user:`schlunma` +- Fix bug in extract_doi_value (:pull:`1734`) :user:`bascrezee` +- Fix small errors in the arctic_ocean diagnostic (:pull:`1722`) :user:`koldunovn` +- Flatten ancestor lists for diag_spei.R and diag_spi.R. (:pull:`1745`) :user:`katjaweigel` +- Fix for recipe_ocean_ice_extent.yml (:pull:`1744`) :user:`mattiarighi` +- Fix recipe_combined_indices.yml provenance (:pull:`1746`) `Javier Vegas-Regidor `__ +- Fix provenance in recipe_multimodel_products (:pull:`1747`) `Javier Vegas-Regidor `__ +- Exclude FGOALS-g2 due to ESMValCore issue #728 (:pull:`1749`) :user:`mattiarighi` +- Fix recipe_modes_of_variability (:pull:`1753`) `Javier Vegas-Regidor `__ +- Flatten lists for ancestors for hyint to prevent nested lists. (:pull:`1752`) :user:`katjaweigel` +- Fix bug in cmorize_obs_eppley_vgpm_modis.py (#1729) (:pull:`1759`) :user:`tomaslovato` +- Correct mip for clltkisccp in example derive preprocessor recipe (:pull:`1768`) :user:`bouweandela` +- Update date conversion in recipe_hype.yml (:pull:`1769`) :user:`bouweandela` +- Fix recipe_correlation.yml (:pull:`1767`) :user:`bouweandela` +- Add attribute positive: down to plev coordinate in ERA-Interim CMORizer (:pull:`1771`) :user:`bouweandela` +- Fix sispeed in recipe_preprocessor_derive_test (:pull:`1772`) `Javier Vegas-Regidor `__ +- Fix extreme events and extreme index ancestors (:pull:`1774`) :user:`katjaweigel` +- Correct date in output filenames of ERA5 CMORizer recipe (:pull:`1773`) :user:`bouweandela` +- Exclude WOA from multi-model stats in recipe_ocean_bgc (:pull:`1778`) :user:`mattiarighi` Diagnostics ~~~~~~~~~~~ -- Enhancement of the hyint recipe to include etccdi indices (`#1133 `__) `Enrico Arnone `__ -- Add lazy regridding for wflow diagnostic (`#1630 `__) `Bouwe Andela `__ -- Miles default domains to include lat=0 (`#1626 `__) `Jost von Hardenberg `__ -- Miles: selection of reference dataset based on experiment (`#1632 `__) `Jost von Hardenberg `__ -- New recipe/diagnostic: recipe_li17natcc.yml for Axels GMD Paper (`#1567 `__) `katjaweigel `__ -- New recipe/diagnostics: recipe_deangelis_for_gmdpart4.yml for Axels GMD Paper (`#1576 `__) `katjaweigel `__ -- EWaterCycle: Add recipe to prepare input for LISFLOOD (`#1298 `__) `Stefan Verhoeven `__ -- Use area weighted regridding in wflow diagnostic (`#1643 `__) `Bouwe Andela `__ -- Workaround for permetrics recipe until Iris3 (`#1674 `__) `Mattia Righi `__ -- C3S_511_MPQB_bas-features (`#1465 `__) `bascrezee `__ -- Additional Land perfmetrics (`#1641 `__) `Bettina Gier `__ -- Necessary diagnostic from eyring06jgr for the release of version2 (`#1686 `__) `Birgit Hassler `__ -- Drought characteristics based on Martin2018 and SPI for gmd paper (`#1689 `__) `katjaweigel `__ -- Additional features and bugfixes for recipe anav13clim (`#1723 `__) `Bettina Gier `__ -- Gmd laueretal2020 revisions (`#1725 `__) `Axel Lauer `__ -- Wenzel16nature (`#1692 `__) `zechlau `__ -- Add mask albedolandcover (`#1673 `__) `bascrezee `__ -- IPCC AR5 fig. 9.3 (seasonality) (`#1726 `__) `Axel Lauer `__ -- Added additional emergent constraints on ECS (`#1585 `__) `Manuel Schlund `__ -- A diagnostic to evaluate the turnover times of land ecosystem carbon (`#1395 `__) `koir-su `__ -- Removed multi_model_statistics step in recipe_oceans_example.yml as a workaround (`#1779 `__) `Valeriu Predoi `__ +- Enhancement of the hyint recipe to include etccdi indices (:pull:`1133`) :user:`earnone` +- Add lazy regridding for wflow diagnostic (:pull:`1630`) :user:`bouweandela` +- Miles default domains to include lat=0 (:pull:`1626`) :user:`jhardenberg` +- Miles: selection of reference dataset based on experiment (:pull:`1632`) :user:`jhardenberg` +- New recipe/diagnostic: recipe_li17natcc.yml for Axels GMD Paper (:pull:`1567`) :user:`katjaweigel` +- New recipe/diagnostics: recipe_deangelis_for_gmdpart4.yml for Axels GMD Paper (:pull:`1576`) :user:`katjaweigel` +- EWaterCycle: Add recipe to prepare input for LISFLOOD (:pull:`1298`) :user:`sverhoeven` +- Use area weighted regridding in wflow diagnostic (:pull:`1643`) :user:`bouweandela` +- Workaround for permetrics recipe until Iris3 (:pull:`1674`) :user:`mattiarighi` +- C3S_511_MPQB_bas-features (:pull:`1465`) :user:`bascrezee` +- Additional Land perfmetrics (:pull:`1641`) :user:`bettina-gier` +- Necessary diagnostic from eyring06jgr for the release of version2 (:pull:`1686`) :user:`hb326` +- Drought characteristics based on Martin2018 and SPI for gmd paper (:pull:`1689`) :user:`katjaweigel` +- Additional features and bugfixes for recipe anav13clim (:pull:`1723`) :user:`bettina-gier` +- Gmd laueretal2020 revisions (:pull:`1725`) :user:`axel-lauer` +- Wenzel16nature (:pull:`1692`) :user:`zechlau` +- Add mask albedolandcover (:pull:`1673`) :user:`bascrezee` +- IPCC AR5 fig. 9.3 (seasonality) (:pull:`1726`) :user:`axel-lauer` +- Added additional emergent constraints on ECS (:pull:`1585`) :user:`schlunma` +- A diagnostic to evaluate the turnover times of land ecosystem carbon (:pull:`1395`) `koir-su `__ +- Removed multi_model_statistics step in recipe_oceans_example.yml as a workaround (:pull:`1779`) :user:`valeriupredoi` Documentation ~~~~~~~~~~~~~ -- Extend getting started instructions to obtain config-user.yml (`#1642 `__) `Peter Kalverla `__ -- Extend information about native6 support on RTD (`#1652 `__) `Peter Kalverla `__ -- Update citation of ESMValTool paper in the doc (`#1664 `__) `Mattia Righi `__ -- Updated references to documentation (now docs.esmvaltool.org) (`#1679 `__) `Axel Lauer `__ -- Replace dead link with ESGF link. (`#1681 `__) `Mattia Righi `__ -- Add all European grants to Zenodo (`#1682 `__) `Bouwe Andela `__ -- Update Sphinx to v3 or later (`#1685 `__) `Bouwe Andela `__ -- Small fix to number of models in ensclus documentation (`#1691 `__) `Jost von Hardenberg `__ -- Move draft_release_notes.py from ESMValCore to here and update (`#1701 `__) `Bouwe Andela `__ -- Improve the installation instructions (`#1634 `__) `Valeriu Predoi `__ -- Improve description of how to implement provenance in diagnostic (`#1750 `__) `SarahAlidoost `__ -- Update command line interface documentation and add links to ESMValCore configuration documentation (`#1776 `__) `Bouwe Andela `__ -- Documentation on how to find shapefiles for hydrology recipes (`#1777 `__) `Jaro Camphuijsen `__ +- Extend getting started instructions to obtain config-user.yml (:pull:`1642`) :user:`Peter9192` +- Extend information about native6 support on RTD (:pull:`1652`) :user:`Peter9192` +- Update citation of ESMValTool paper in the doc (:pull:`1664`) :user:`mattiarighi` +- Updated references to documentation (now docs.esmvaltool.org) (:pull:`1679`) :user:`axel-lauer` +- Replace dead link with ESGF link. (:pull:`1681`) :user:`mattiarighi` +- Add all European grants to Zenodo (:pull:`1682`) :user:`bouweandela` +- Update Sphinx to v3 or later (:pull:`1685`) :user:`bouweandela` +- Small fix to number of models in ensclus documentation (:pull:`1691`) :user:`jhardenberg` +- Move draft_release_notes.py from ESMValCore to here and update (:pull:`1701`) :user:`bouweandela` +- Improve the installation instructions (:pull:`1634`) :user:`valeriupredoi` +- Improve description of how to implement provenance in diagnostic (:pull:`1750`) :user:`SarahAlidoost` +- Update command line interface documentation and add links to ESMValCore configuration documentation (:pull:`1776`) :user:`bouweandela` +- Documentation on how to find shapefiles for hydrology recipes (:pull:`1777`) :user:`JaroCamphuijsen` Improvements ~~~~~~~~~~~~ -- Pin flake8<3.8.0 (`#1635 `__) `Valeriu Predoi `__ -- Update conda package path in more places (`#1636 `__) `Bouwe Andela `__ -- Remove curly brackets around issue number in pull request template (`#1637 `__) `Bouwe Andela `__ -- Fix style issue in test (`#1639 `__) `Bouwe Andela `__ -- Update Codacy badges (`#1662 `__) `Bouwe Andela `__ -- Support extra installation methods in R (`#1360 `__) `Javier Vegas-Regidor `__ -- Add ncdf4.helpers package as a dependency again (`#1678 `__) `Bouwe Andela `__ -- Speed up conda installation (`#1677 `__) `Bouwe Andela `__ -- Update CMORizers and recipes for ESMValCore v2.0.0 (`#1699 `__) `SarahAlidoost `__ -- Update setup.py for PyPI package (`#1700 `__) `Bouwe Andela `__ -- Cleanup recipe headers before the release (`#1740 `__) `Mattia Righi `__ -- Add colortables as esmvaltool subcommand (`#1666 `__) `Javier Vegas-Regidor `__ -- Increase version to v2.0.0 (`#1756 `__) `Bouwe Andela `__ -- Update job script (`#1757 `__) `Mattia Righi `__ -- Read authors and description from .zenodo.json (`#1758 `__) `Bouwe Andela `__ -- Update docker recipe to install from source (`#1651 `__) `Javier Vegas-Regidor `__ +- Pin flake8<3.8.0 (:pull:`1635`) :user:`valeriupredoi` +- Update conda package path in more places (:pull:`1636`) :user:`bouweandela` +- Remove curly brackets around issue number in pull request template (:pull:`1637`) :user:`bouweandela` +- Fix style issue in test (:pull:`1639`) :user:`bouweandela` +- Update Codacy badges (:pull:`1662`) :user:`bouweandela` +- Support extra installation methods in R (:pull:`1360`) `Javier Vegas-Regidor `__ +- Add ncdf4.helpers package as a dependency again (:pull:`1678`) :user:`bouweandela` +- Speed up conda installation (:pull:`1677`) :user:`bouweandela` +- Update CMORizers and recipes for ESMValCore v2.0.0 (:pull:`1699`) :user:`SarahAlidoost` +- Update setup.py for PyPI package (:pull:`1700`) :user:`bouweandela` +- Cleanup recipe headers before the release (:pull:`1740`) :user:`mattiarighi` +- Add colortables as esmvaltool subcommand (:pull:`1666`) `Javier Vegas-Regidor `__ +- Increase version to v2.0.0 (:pull:`1756`) :user:`bouweandela` +- Update job script (:pull:`1757`) :user:`mattiarighi` +- Read authors and description from .zenodo.json (:pull:`1758`) :user:`bouweandela` +- Update docker recipe to install from source (:pull:`1651`) `Javier Vegas-Regidor `__ Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Cmorize aphro ma (`#1555 `__) `mwjury `__ -- Respectable testing for cmorizers/obs/utilities.py and cmorizers/obs/cmorize_obs.py (`#1517 `__) `Valeriu Predoi `__ -- Fix start year in recipe_check_obs (`#1638 `__) `Mattia Righi `__ -- Cmorizer for the PERSIANN-CDR precipitation data (`#1633 `__) `Birgit Hassler `__ -- Cmorize eobs (`#1554 `__) `mwjury `__ -- Update download cds satellite lai fapar (`#1654 `__) `bascrezee `__ -- Added monthly mean vars (ta, va, zg) to era5 cmorizer via recipe (`#1644 `__) `Evgenia Galytska `__ -- Make format time check more flexible (`#1661 `__) `Mattia Righi `__ -- Exclude od550lt1aer from recipe_check_obs.yml (`#1720 `__) `Mattia Righi `__ -- PERSIANN-CDR cmorizer update: adding the capability to save monthly mean files (`#1728 `__) `Birgit Hassler `__ -- Add standard_name attribute to lon and lat in cmorize_obs_esacci_oc.py (`#1760 `__) `Tomas Lovato `__ -- Allow for incomplete months on daily frequency in cmorizer ncl utilities (`#1754 `__) `Mattia Righi `__ -- Fix AURA-TES cmorizer (`#1766 `__) `Mattia Righi `__ +- Cmorize aphro ma (:pull:`1555`) :user:`mwjury` +- Respectable testing for cmorizers/obs/utilities.py and cmorizers/obs/cmorize_obs.py (:pull:`1517`) :user:`valeriupredoi` +- Fix start year in recipe_check_obs (:pull:`1638`) :user:`mattiarighi` +- Cmorizer for the PERSIANN-CDR precipitation data (:pull:`1633`) :user:`hb326` +- Cmorize eobs (:pull:`1554`) :user:`mwjury` +- Update download cds satellite lai fapar (:pull:`1654`) :user:`bascrezee` +- Added monthly mean vars (ta, va, zg) to era5 cmorizer via recipe (:pull:`1644`) :user:`egalytska` +- Make format time check more flexible (:pull:`1661`) :user:`mattiarighi` +- Exclude od550lt1aer from recipe_check_obs.yml (:pull:`1720`) :user:`mattiarighi` +- PERSIANN-CDR cmorizer update: adding the capability to save monthly mean files (:pull:`1728`) :user:`hb326` +- Add standard_name attribute to lon and lat in cmorize_obs_esacci_oc.py (:pull:`1760`) :user:`tomaslovato` +- Allow for incomplete months on daily frequency in cmorizer ncl utilities (:pull:`1754`) :user:`mattiarighi` +- Fix AURA-TES cmorizer (:pull:`1766`) :user:`mattiarighi` .. _changelog-v2-0-0b4: @@ -1309,43 +1309,43 @@ This release includes Bug fixes ~~~~~~~~~ -- Fix HALOE plev coordinate (`#1590 `__) `Mattia Righi `__ -- Fix tro3 units in HALOE (`#1591 `__) `Mattia Righi `__ +- Fix HALOE plev coordinate (:pull:`1590`) :user:`mattiarighi` +- Fix tro3 units in HALOE (:pull:`1591`) :user:`mattiarighi` Diagnostics ~~~~~~~~~~~ -- Applicate sea ice negative feedback (`#1299 `__) `Javier Vegas-Regidor `__ -- Add Russell18jgr ocean diagnostics (`#1592 `__) `Bouwe Andela `__ -- Refactor marrmot recipe and diagnostic to use ERA5 daily data made by new cmorizer (`#1600 `__) `SarahAlidoost `__ -- In recipe_wflow, use daily ERA5 data from the new cmorizer. (`#1599 `__) `Peter Kalverla `__ -- In wflow diagnostic, calculate PET after(!) interpolation and lapse rate correction (`#1618 `__) `Jerom Aerts `__ -- Fixed wenz14jgr (`#1562 `__) `zechlau `__ -- Update portrait_plot.ncl (`#1625 `__) `Bettina Gier `__ +- Applicate sea ice negative feedback (:pull:`1299`) `Javier Vegas-Regidor `__ +- Add Russell18jgr ocean diagnostics (:pull:`1592`) :user:`bouweandela` +- Refactor marrmot recipe and diagnostic to use ERA5 daily data made by new cmorizer (:pull:`1600`) :user:`SarahAlidoost` +- In recipe_wflow, use daily ERA5 data from the new cmorizer. (:pull:`1599`) :user:`Peter9192` +- In wflow diagnostic, calculate PET after(!) interpolation and lapse rate correction (:pull:`1618`) :user:`jeromaerts` +- Fixed wenz14jgr (:pull:`1562`) :user:`zechlau` +- Update portrait_plot.ncl (:pull:`1625`) :user:`bettina-gier` Documentation ~~~~~~~~~~~~~ -- Restructure documentation (`#1587 `__) `Bouwe Andela `__ -- Add more links to documentation (`#1595 `__) `Bouwe Andela `__ -- Update links in readme (`#1598 `__) `Bouwe Andela `__ -- Minor improvements to installation documentation (`#1608 `__) `Bouwe Andela `__ -- Add info for new mailing list to documentation. (`#1607 `__) `Björn Brötz `__ -- Update making a release documentation (`#1627 `__) `Bouwe Andela `__ +- Restructure documentation (:pull:`1587`) :user:`bouweandela` +- Add more links to documentation (:pull:`1595`) :user:`bouweandela` +- Update links in readme (:pull:`1598`) :user:`bouweandela` +- Minor improvements to installation documentation (:pull:`1608`) :user:`bouweandela` +- Add info for new mailing list to documentation. (:pull:`1607`) :user:`bjoernbroetz` +- Update making a release documentation (:pull:`1627`) :user:`bouweandela` Improvements ~~~~~~~~~~~~ -- Avoid broken pytest-html plugin (`#1583 `__) `Bouwe Andela `__ -- Remove reference section in config-references.yml (`#1545 `__) `SarahAlidoost `__ -- Various improvements to development infrastructure (`#1570 `__) `Bouwe Andela `__ -- Install scikit-learn from conda, remove libunwind as a direct dependency (`#1611 `__) `Valeriu Predoi `__ -- Create conda subpackages and enable tests (`#1624 `__) `Bouwe Andela `__ +- Avoid broken pytest-html plugin (:pull:`1583`) :user:`bouweandela` +- Remove reference section in config-references.yml (:pull:`1545`) :user:`SarahAlidoost` +- Various improvements to development infrastructure (:pull:`1570`) :user:`bouweandela` +- Install scikit-learn from conda, remove libunwind as a direct dependency (:pull:`1611`) :user:`valeriupredoi` +- Create conda subpackages and enable tests (:pull:`1624`) :user:`bouweandela` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Cmorizer for HALOE (`#1581 `__) `Mattia Righi `__ -- Add CMORizer for CT2019 (`#1604 `__) `Manuel Schlund `__ +- Cmorizer for HALOE (:pull:`1581`) :user:`mattiarighi` +- Add CMORizer for CT2019 (:pull:`1604`) :user:`schlunma` For older releases, see the release notes on https://github.com/ESMValGroup/ESMValTool/releases. diff --git a/doc/sphinx/source/community/maintainer.rst b/doc/sphinx/source/community/maintainer.rst index 5bec2e825e..7e73748be9 100644 --- a/doc/sphinx/source/community/maintainer.rst +++ b/doc/sphinx/source/community/maintainer.rst @@ -8,7 +8,7 @@ the interface of library functions may change when updating to new versions. Thi withdrawal of datasets used by a recipe can result in an existing recipe to stop working. Such "broken" recipes might require some work to fix such problems and make the recipe fully functional again. -A first **contact point** for the technical lead development team (`@ESMValGroup/technical-lead-development-team`_) in such cases is the recipe "maintainer". The recipe +A first **contact point** for the technical lead development team (:team:`technical-lead-development-team`) in such cases is the recipe "maintainer". The recipe maintainer is then asked to check the affected recipe and if possible, fix the problems or work with the technical lead development team to find a solution. Ideally, a recipe maintainer is able to tell whether the results of a fixed recipe are scientifically valid and look as expected. Being a recipe maintainer consists of the following tasks: @@ -22,10 +22,7 @@ recipe are scientifically valid and look as expected. Being a recipe maintainer * informing the core development team when no longer available as maintainer Ideally, a recipe maintainer is named when contributing a new recipe to the ESMValTool. Recipe maintainers are asked to inform -the core development team (`@ESMValGroup/esmvaltool-coreteam`_) when they are no longer able to act as maintainer or when they would like to step down from this duty +the core development team (:team:`esmvaltool-coreteam`) when they are no longer able to act as maintainer or when they would like to step down from this duty for any reason. The core development team will then try to find a successor. If no recipe maintainer can be found, the :ref:`policy on unmaintained broken (non-working) recipes` might apply eventually leading to retirement of the affected recipe. - -.. _`@ESMValGroup/technical-lead-development-team`: https://github.com/orgs/ESMValGroup/teams/technical-lead-development-team -.. _`@ESMValGroup/esmvaltool-coreteam`: https://github.com/orgs/ESMValGroup/teams/esmvaltool-coreteam diff --git a/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst b/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst index 3f710eaa21..a73643f454 100644 --- a/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst +++ b/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst @@ -136,8 +136,8 @@ Recipe output can be copied by doing from the VM: .. code-block:: bash - nohup rsync -rlt /path_to_testing/esmvaltool_output/* /shared/esmvaltool/v2.x.x/ - + nohup rsync --exclude preproc/ -rlt /path_to_testing/esmvaltool_output/* /shared/esmvaltool/v2.x.x/ + By copying the debug.html and index.html files into /shared/esmvaltool/v2.x.x/, the output becomes available online, see for `example `_. @@ -151,13 +151,13 @@ Link the overview webpage to the release issue. This makes it much easier to ask for feedback from recipe developers and analyse failures. Results produced with the final ESMValCore release candidate should be put in a VM directory -named after the version number, e.g. ``v2.x.x``. +named after the version number, e.g. ``v2.x.x``. Once the release process is over, test results produced with previous release candidates can be deleted to save space on the VM. .. note:: If you wrote recipe runs output to Levante's `/scratch` partition, be aware that - the data will be removed after two weeks, so you will have to quickly move the + the data will be removed after two weeks, so you will have to quickly move the output data to the VM, using the ``nohup`` command above. Running the comparison @@ -189,15 +189,15 @@ The steps to running the compare tool on the VM are the following: - prerequisite - install `imagehash`: `pip install imagehash` - reference run (v2.7.0; previous stable release): `export reference_dir=/work/bd0854/b382109/v270` (contains `preproc/` dirs too, 122 recipes) - current run (v2.8.0): `export current_dir=path_to_current_run` -- run the :ref:`comparison script` with: +- run the :ref:`comparison script` with: .. code-block:: bash nohup python ESMValTool/esmvaltool/utils/testing/regression/compare.py --reference $reference_dir --current $current_dir > compare_v280_output.txt Copy the comparison txt file to the release issue. -Some of the recipes will appear as having identical output to the one from previous release. -However, others will need human inspection. +Some of the recipes will appear as having identical output to the one from previous release. +However, others will need human inspection. Ask the recipe maintainers (`@ESMValGroup/esmvaltool-recipe-maintainers`_) and ESMValTool Development Team (`@ESMValGroup/esmvaltool-developmentteam`_) to provide assistance in checking the results. Here are some guidelines on how to perform the human inspection: diff --git a/doc/sphinx/source/community/release_strategy/release_strategy.rst b/doc/sphinx/source/community/release_strategy/release_strategy.rst index 9bd8d71e2d..b358fdb7f3 100644 --- a/doc/sphinx/source/community/release_strategy/release_strategy.rst +++ b/doc/sphinx/source/community/release_strategy/release_strategy.rst @@ -54,34 +54,40 @@ With the following release schedule, we strive to have three releases per year a Upcoming releases ^^^^^^^^^^^^^^^^^ -- 2.10.0 (Release Manager: `Klaus Zimmermann`_) +- 2.11.0 (Release Manager: TBD) -+------------+--------------------------+ -| 2023-10-02 |ESMValCore feature freeze | -+------------+--------------------------+ -| 2023-10-09 |ESMValCore release | -+------------+--------------------------+ -| 2023-10-16 |ESMValTool feature freeze | -+------------+--------------------------+ -| 2023-10-23 |ESMValTool release | -+------------+--------------------------+ +Planned for February or March 2024 Past releases ^^^^^^^^^^^^^ +- 2.10.0 (Release Manager: `Klaus Zimmermann`_) + ++------------+------------+----------------------------------------+-------------------------------------+ +| Planned | Done | Event | Changelog | ++============+============+========================================+=====================================+ +| 2023-10-02 | | ESMValCore `Feature Freeze`_ | | ++------------+------------+----------------------------------------+-------------------------------------+ +| 2023-10-09 | 2023-12-19 | :esmvalcore-release:`v2.10.0` released | :ref:`esmvalcore:changelog-v2-10-0` | ++------------+------------+----------------------------------------+-------------------------------------+ +| 2023-10-16 | | ESMValTool `Feature Freeze`_ | | ++------------+------------+----------------------------------------+-------------------------------------+ +| 2023-10-16 | 2023-12-20 | :release:`v2.10.0` released | :ref:`changelog-v2-10-0` | ++------------+------------+----------------------------------------+-------------------------------------+ + - 2.9.0 (Release Manager: `Bouwe Andela`_) -+------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ -| Planned | Done | Event | Changelog | -+============+============+=============================================================================================+====================================+ -| 2023-06-05 | | ESMValCore Feature Freeze | | -+------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ -| 2023-06-12 | 2023-07-04 | `ESMValCore Release 2.9.0 `_ | :ref:`esmvalcore:changelog-v2-9-0` | -+------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ -| 2023-06-19 | | ESMValTool Feature Freeze | | -+------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ -| 2023-06-26 | 2023-07-06 | `ESMValTool Release 2.9.0 `_ | :ref:`changelog-v2-9-0` | -+------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ ++------------+------------+---------------------------------------+-------------------------------------+ +| Planned | Done | Event | Changelog | ++============+============+=======================================+=====================================+ +| 2023-06-05 | | ESMValCore `Feature Freeze`_ | | ++------------+------------+---------------------------------------+-------------------------------------+ +| 2023-06-12 | 2023-07-04 | :esmvalcore-release:`v2.9.0` released | :ref:`esmvalcore:changelog-v2-9-0` | ++------------+------------+---------------------------------------+-------------------------------------+ +| 2023-06-19 | | ESMValTool `Feature Freeze`_ | | ++------------+------------+---------------------------------------+-------------------------------------+ +| 2023-06-26 | 2023-07-06 | :release:`v2.9.0` released | :ref:`changelog-v2-9-0` | ++------------+------------+---------------------------------------+-------------------------------------+ - 2.8.1 (Bugfix, Release Manager: `Valeriu Predoi`_) @@ -287,6 +293,8 @@ These are the detailed steps to take to make a release. - If a bug is discovered that needs to be fixed before the release, a pull request can be made to the main branch to fix the bug. The person making the pull request can then ask the release manager to cherry-pick that commit into the release branch. - Update the :ref:`list of broken recipes ` with new recipes that could not be run successfully during the testing. Open a separate GitHub issue for each failing recipe and assign the next milestone. + Open an overview issue, see :issue:`3484` for an example, and review past overview issues. + Take action to ensure that the broken recipe policy is followed. #. ESMValCore release @@ -339,7 +347,7 @@ Glossary Feature freeze ~~~~~~~~~~~~~~ -The date on which no new features may be submitted for the upcoming release. +The date on which no new features may be submitted for the upcoming release. After this date, only critical bug fixes can still be included to the :ref:`release_branch`. Development work can continue in the main branch. If you are unsure whether new developments could interfere with the release, check with the :ref:`release_manager`. @@ -411,7 +419,7 @@ All tests should pass before making a release (branch). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The version number is automatically generated from the information provided by -git using [setuptools-scm](https://pypi.org/project/setuptools-scm/), but a +git using `setuptools-scm `__, but a static version number is stored in ``CITATION.cff``. Make sure to update the version number and release date in ``CITATION.cff``. See https://semver.org for more information on choosing a version number. @@ -464,8 +472,8 @@ and create the new release from the release branch (i.e. not from ``main``). The release tag always starts with the letter ``v`` followed by the version number, e.g. ``v2.1.0``. -6. Mark the release in the main branch -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +6. Merge the release branch back into the main branch +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When the (pre-)release is tagged, it is time to merge the release branch back into `main`. We do this for two reasons, namely, one, to mark the point up to which commits in `main` diff --git a/doc/sphinx/source/conf.py b/doc/sphinx/source/conf.py index 5ef08c3b06..600eaa8253 100644 --- a/doc/sphinx/source/conf.py +++ b/doc/sphinx/source/conf.py @@ -63,6 +63,7 @@ extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.doctest', + 'sphinx.ext.extlinks', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', @@ -441,6 +442,40 @@ 'sklearn': ('https://scikit-learn.org/stable', None), } +# -- Extlinks extension ------------------------------------------------------- +# See https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html + +extlinks = { + "discussion": ( + "https://github.com/ESMValGroup/ESMValTool/discussions/%s", + "Discussion #%s", + ), + "issue": ( + "https://github.com/ESMValGroup/ESMValTool/issues/%s", + "Issue #%s", + ), + "pull": ( + "https://github.com/ESMValGroup/ESMValTool/pull/%s", + "Pull request #%s", + ), + "release": ( + "https://github.com/ESMValGroup/ESMValTool/releases/tag/%s", + "ESMValTool %s", + ), + "esmvalcore-release": ( + "https://github.com/ESMValGroup/ESMValCore/releases/tag/%s", + "ESMValCore %s", + ), + "team": ( + "https://github.com/orgs/ESMValGroup/teams/%s", + "@ESMValGroup/%s", + ), + "user": ( + "https://github.com/%s", + "@%s", + ), +} + # -- Custom Document processing ---------------------------------------------- import gensidebar diff --git a/doc/sphinx/source/utils.rst b/doc/sphinx/source/utils.rst index e5e7b00553..03e2793dca 100644 --- a/doc/sphinx/source/utils.rst +++ b/doc/sphinx/source/utils.rst @@ -118,11 +118,11 @@ Running multiple recipes It is possible to run more than one recipe in one go. This can for example be achieved by using ``rose`` and/or ``cylc``, tools -that may be available at your local HPC cluster. +that may be available at your local HPC cluster. In the case in which neither ``rose`` nor ``cylc`` are available at your HPC cluster, it is possible to automatically generate job submission scripts, as well as a summary of the -job outputs using the scripts available in +job outputs using the scripts available in `esmvaltool/utils/batch-jobs `__. Using cylc @@ -218,7 +218,7 @@ a copy of `u-bd684` is always located in ``/home/users/valeriu/roses/u-bd684`` o Using the scripts in `utils/batch-jobs` --------------------------------------- -In `utils/batch-jobs `_, +In `utils/batch-jobs `_, you can find a script to generate slurm submission scripts for all available recipes in ESMValTool, as well as a script to parse the job outputs. @@ -227,15 +227,15 @@ as well as a script to parse the job outputs. Using `generate.py` ................... -The script `generate.py `_, +The script `generate.py `_, is a simple python script that creates slurm submission scripts, and if configured, submits them to the HPC cluster. It has been tested in `DKRZ's Levante cluster `_. The following parameters have to be set in the script in order to make it run: * ``env``, *str*: Name of the conda environment in which `esmvaltool` is installed. -* ``mail``, *bool*: Whether or not to recieve mail notifications when a submitted job fails or finishes successfully. Default is ``False``. -* ``submit``, *bool*: Wheter or not to automatically submit the job after creating the launch script. Default value is ``False``. +* ``mail``, *bool*: Whether or not to receive mail notifications when a submitted job fails or finishes successfully. Default is ``False``. +* ``submit``, *bool*: Whether or not to automatically submit the job after creating the launch script. Default value is ``False``. * ``account``, *str*: Name of the DKRZ account in which the job will be billed. * ``outputs``, *str*: Name of the directory in which the job outputs (.out and .err files) are going to be saved. The outputs will be saved in `/home/user/`. * ``conda_path``, *str*: Full path to the `mambaforge/etc/profile.d/conda.sh` executable. @@ -247,10 +247,10 @@ Optionally, the following parameters can be edited: * ``memory``, *str*: Amount of memory requested for each run. Default is ``64G`` to allow to run 4 recipes on the same node in parallel. * ``time``, *str*: Time limit. Default is ``04:00:00`` to increase the job priority. Jobs can run for up to 8 hours and 12 hours on the compute and interactive partitions, respectively. * ``default_max_parallel_tasks``, *int*: Default is ``8`` which works for most recipes. For other cases, an entry needs to be made to the ``MAX_PARALLEL_TASKS`` dictionary (see below). - + The script will generate a submission script for all recipes using by default the ``interactive`` queue and with a time limit of 4h. In case a recipe may require of additional resources, they can be defined in the ``SPECIAL_RECIPES`` dictionary. The recipe name has to be given as a ``key`` in which the -values are another dictionary. +values are another dictionary. The latter are used to specify the ``partition`` in which to submit the recipe, the new ``time`` limit and other ``memory`` requirements given by the slurm flags ``--mem``, ``--constraint`` or ``--ntasks``. In general, an entry in ``SPECIAL_RECIPES`` should be set as: @@ -284,17 +284,15 @@ Using `parse_recipes_outputs` You can run this script (simply as a standalone Python script) after all recipes have been run, to gather a bird's eye view of the run status for each recipe; running the script provides you with a Markdown-formatted list of recipes that succeeded, recipes that failed due to a diagnostic error, and recipes that failed due to missing data (the two most common causes for -recipe run failure). You should add a ``SLURM_OUT_DIR`` e.g. ``SLURM_OUT_DIR = "/home/b/b382109/output_v270"`` - this is the -physical location of your SLURM output, after all recipes have finished running and a ``GLOB_PATTERN``, a glob pattern, -which is reccommended to be set to the ``*.out`` extension, so that the script finds all the ``.out`` files. - -To keep the script execution fast, it is recommended to use ``log_level: info`` in your config-user.yml file so that SLURM -output files are rather small. This script also requires a list of recipes stored in a ``all_recipes.txt`` file, which can -be obtained by running: +recipe run failure). You should provide the location of the output log files from SLURM (``*.out`` and ``*.err``) to the +script as well as a list of all available recipes. To generate the list, run the command: .. code-block:: bash - for recipe in $(esmvaltool recipes list | grep '\.yml$'); do echo "$recipe"; done > all_recipes.txt + for recipe in $(esmvaltool recipes list | grep '\.yml$'); do echo $(basename "$recipe"); done > all_recipes.txt + +To keep the script execution fast, it is recommended to use ``log_level: info`` in your config-user.yml file so that SLURM +output files are rather small. .. _overview_page: @@ -323,7 +321,7 @@ Comparing recipe runs A command-line tool is available for comparing one or more recipe runs to known good previous run(s). This tool uses `xarray `_ to compare NetCDF -files and difference hasing provided by +files and difference hashing provided by `imagehash `_ to compare PNG images. All other file types are compared byte for byte. diff --git a/esmvaltool/utils/batch-jobs/generate.py b/esmvaltool/utils/batch-jobs/generate.py index fc9deb8339..960ddd3e86 100644 --- a/esmvaltool/utils/batch-jobs/generate.py +++ b/esmvaltool/utils/batch-jobs/generate.py @@ -84,10 +84,6 @@ 'time': '#SBATCH --time=08:00:00 \n', 'memory': '#SBATCH --constraint=512G \n', }, - 'recipe_daily_era5': { - 'partition': '#SBATCH --partition=compute \n', - 'memory': '#SBATCH --constraint=512G \n', - }, 'recipe_eady_growth_rate': { 'partition': '#SBATCH --partition=compute \n', }, @@ -190,6 +186,9 @@ 'recipe_thermodyn_diagtool': { 'partition': '#SBATCH --partition=compute \n', }, + 'recipe_wflow': { + 'partition': '#SBATCH --partition=compute \n', + }, 'recipe_wenzel16jclim': { 'partition': '#SBATCH --partition=compute \n', }, @@ -207,6 +206,9 @@ 'recipe_bock20jgr_fig_1-4': 1, 'recipe_bock20jgr_fig_6-7': 1, 'recipe_bock20jgr_fig_8-10': 1, + 'recipe_daily_era5': 1, + 'recipe_easy_ipcc': 1, + 'recipe_climate_change_hotspot': 1, 'recipe_flato13ipcc_figure_96': 1, 'recipe_flato13ipcc_figures_938_941_cmip3': 1, 'recipe_ipccwg1ar6ch3_fig_3_9': 1, @@ -214,25 +216,55 @@ 'recipe_ipccwg1ar6ch3_fig_3_43': 1, 'recipe_check_obs': 1, 'recipe_collins13ipcc': 1, - 'recipe_lauer22jclim_fig3-4_zonal': 3, - 'recipe_lauer22jclim_fig5_lifrac': 3, + 'recipe_lauer22jclim_fig3-4_zonal': 1, + 'recipe_lauer22jclim_fig5_lifrac': 1, 'recipe_smpi': 1, 'recipe_smpi_4cds': 1, 'recipe_wenzel14jgr': 1, } +DISTRIBUTED_RECIPES = [ + 'recipe_easy_ipcc', + 'recipe_daily_era5', + 'recipe_marrmot', + 'recipe_pcrglobwb', +] + +DEFAULT_DASK_FILE = f""" +cluster: + type: dask_jobqueue.SLURMCluster + queue: compute + account: {account} + cores: 128 + memory: 256GiB + processes: 32 + interface: ib0 + local_directory: /scratch/{os.getlogin()[0]}/{os.getlogin()}/dask-tmp + n_workers: 32 + walltime: '8:00:00' +""" + def generate_submit(): """Generate and submit scripts.""" + print("It is recommended that you run the following recipes with the " + "configuration in dask.yml in ~/.esmvaltool/dask.yml:") + for recipe in DISTRIBUTED_RECIPES: + print(f"- {recipe}.yml") + Path('dask.yml').write_text(DEFAULT_DASK_FILE, encoding='utf-8') + home = os.path.expanduser('~') # Fill the list with the names of the recipes to be excluded # This includes recipes containing missing datasets - exclude = ['recipe_schlund20jgr_gpp_abs_rcp85', - 'recipe_schlund20jgr_gpp_change_1pct', - 'recipe_schlund20jgr_gpp_change_rcp85'] + exclude = [ + 'recipe_schlund20jgr_gpp_abs_rcp85', + 'recipe_schlund20jgr_gpp_change_1pct', + 'recipe_schlund20jgr_gpp_change_rcp85' + ] dir_recipes = Path('/'.join((esmvaltool.__path__[0], 'recipes'))) for recipe in Path(dir_recipes).rglob('*.yml'): + recipe = recipe.relative_to(dir_recipes) filename = f'launch_{recipe.stem}.sh' if recipe.stem in exclude: continue @@ -241,11 +273,9 @@ def generate_submit(): file.write('\n') file.write(f'#SBATCH --job-name={recipe.stem}.%J\n') file.write( - f'#SBATCH --output={home}/{outputs}/{recipe.stem}.%J.out\n' - ) + f'#SBATCH --output={home}/{outputs}/{recipe.stem}.%J.out\n') file.write( - f'#SBATCH --error={home}/{outputs}/{recipe.stem}.%J.err\n' - ) + f'#SBATCH --error={home}/{outputs}/{recipe.stem}.%J.err\n') file.write(f'#SBATCH --account={account}\n') if not SPECIAL_RECIPES.get(recipe.stem, None): # continue diff --git a/esmvaltool/utils/batch-jobs/parse_recipes_output.py b/esmvaltool/utils/batch-jobs/parse_recipes_output.py index 9df80c6cc0..7daf202924 100644 --- a/esmvaltool/utils/batch-jobs/parse_recipes_output.py +++ b/esmvaltool/utils/batch-jobs/parse_recipes_output.py @@ -1,121 +1,126 @@ -""" -Parse recipes run output. +"""Parse recipes run output. -Parse typical batch job output files like .out and .err -to identify recipes that have succeeded or failed; display -results in a convenient Markdown format, to be added to -a GitHub issue or any other such documentation. +Parse typical batch job output files like .out and .err to identify +recipes that have succeeded or failed; display results in a convenient +Markdown format, to be added to a GitHub issue or any other such +documentation. """ import datetime -import glob import os +import re +from pathlib import Path +from typing import Iterator -# User change needed -# directory where SLURM output files (.out and .err) are -# written to, e.g. on Levante for user b382109 -# SLURM_OUT_DIR = "/home/b/b382109/output_v270" -SLURM_OUT_DIR = "" -# SLURM output file pattern (extension); usually all SLURM -# output is held in .out, unless there are internal/system errors -# so this is what you need most if the times -GLOB_PATTERN = "*.out*" +import fire -def parse_slurm_output(dirname, pattern): - """ - Parse the out dir from SLURM. +def parse_slurm_output(dirname: str, pattern: str) -> Iterator[Path]: + """Parse the out dir from SLURM. - Perform a glob on dirname/pattern where dirname - is the directory where SLURM output is stored, and - pattern is the out file pattern, like .out. Returns - all the files in dirname that have pattern extension. + Perform a glob on dirname/pattern where dirname is the directory + where SLURM output is stored, and pattern is the out file pattern, + like .out. Returns all the files in dirname that have pattern + extension. """ - pat = os.path.join(dirname, pattern) - files = glob.glob(pat) + return Path(dirname).expanduser().glob(pattern) - return files +def parse_output_file(slurm_out_dir: str) -> dict[str, list[str]]: + """Parse .out and .err files in a given dir. -def parse_output_file(): + Returns a tuple of lists of sorted .out files for each of these + criteria: recipes that ran successfulltm recipes that failed with + diagnostic errors, recipes that failed due to missing data. """ - Parse .out files in a given dir. + categories = [ + 'success', + 'diagnostic error', + 'missing data', + 'out of memory', + 'out of time', + 'unknown', + ] + results: dict[str, list[str]] = {k: [] for k in categories} - Returns a tuple of lists of sorted .out files for each - of these criteria: recipes that ran successfulltm recipes - that failed with diagnostic errors, recipes that failed - due to missing data. - """ - files = parse_slurm_output(SLURM_OUT_DIR, GLOB_PATTERN) - success_rec = [] - diag_fail_rec = [] - missing_data = [] - for fil in files: - with open(fil, "r", encoding='utf-8') as outfile: + files = parse_slurm_output(slurm_out_dir, '*.out') + for file in files: + recipe = str(Path(file.stem).with_suffix('.yml')) + with open(file, "r", encoding='utf-8') as outfile: lines = outfile.readlines() for line in lines: if "Run was successful\n" in line: - success_rec.append(fil) + results['success'].append(recipe) + break elif "esmvalcore._task.DiagnosticError" in line: - diag_fail_rec.append(fil) + results['diagnostic error'].append(recipe) + break elif "ERROR Missing data for preprocessor" in line: - missing_data.append(fil) - - # typical list elem - # /home/b/b382109/output_v270/recipe_zmnam.2378956.out - ok_recipe_outs = [os.path.basename(ofile) for ofile in success_rec] - ok_recipe_outs = [f.split(".")[0] + ".yml" for f in ok_recipe_outs] - df_recipe_outs = [os.path.basename(ofile) for ofile in diag_fail_rec] - df_recipe_outs = [f.split(".")[0] + ".yml" for f in df_recipe_outs] - md_recipe_outs = [os.path.basename(ofile) for ofile in missing_data] - md_recipe_outs = [f.split(".")[0] + ".yml" for f in md_recipe_outs] - - return (sorted(set(ok_recipe_outs)), - sorted(set(df_recipe_outs)), - sorted(set(md_recipe_outs))) - - -def display_in_md(): - """Print out recipes in Markdown list.""" + results['missing data'].append(recipe) + break + else: + if not file.with_suffix('.err').exists(): + results['unknown'].append(recipe) + else: + err = file.with_suffix('.err').read_text(encoding='utf-8') + if "killed by the cgroup out-of-memory" in err: + results['out of memory'].append(recipe) + elif "step tasks have been OOM Killed" in err: + results['out of memory'].append(recipe) + elif re.match(".* CANCELLED AT .* DUE TO TIME LIMIT", err): + results['out of time'].append(recipe) + else: + results['unknown'].append(recipe) + + results = {k: sorted(v) for k, v in results.items()} + + return results + + +def display_in_md( + slurm_out_dir: str = '.', + all_recipes_file: str = 'all_recipes.txt', +) -> None: + """Print out recipes in Markdown list. + + Parameters + ---------- + slurm_out_dir: + Directory where SLURM output files (.out and .err) are written to. + + all_recipes_file: + Text file containing a list of all recipes. + """ todaynow = datetime.datetime.now() print(f"## Recipe running session {todaynow}\n") - with open("all_recipes.txt", "r", encoding='utf-8') as allrecs: - all_recs = [ - os.path.basename(rec.strip()) for rec in allrecs.readlines() + with open(all_recipes_file, "r", encoding='utf-8') as file: + all_recipes = [ + os.path.basename(line.strip()) for line in file.readlines() ] - - # parse different types of recipe outcomes - recipe_list, failed, missing_dat = parse_output_file() - print("### Successfully ran recipes\n\n") - print(f"{len(recipe_list)} out of {len(all_recs)}\n") - for rec in recipe_list: - print("- " + rec) - - # surely failed with diagnostic error - print("\n### Recipes that failed with DiagnosticError\n") - print(f"{len(failed)} out of {len(all_recs)}\n") - for rec in failed: - print("- " + rec) - - # missing data - print("\n### Recipes that failed of Missing Data\n") - print(f"{len(missing_dat)} out of {len(all_recs)}\n") - for rec in missing_dat: - print("- " + rec) - - # look at other fails or still running - bad_recs = [ - rec for rec in all_recs - if rec not in recipe_list and rec not in failed - and rec not in missing_dat - ] - bad_recs = sorted(bad_recs) - print( - "\n### Recipes that failed of other reasons or are still running\n" - ) - print(f"{len(bad_recs)} out of {len(all_recs)} so far\n") - for rec in bad_recs: - print("- " + rec) + n_recipes = len(all_recipes) + + results = parse_output_file(slurm_out_dir) + results["no run"] = sorted( + set(all_recipes) - set(recipe for v in results.values() + for recipe in v)) + prefix = "Recipes that" + err_prefix = f"{prefix} failed because" + messages = { + "success": f"{prefix} ran successfully", + "diagnostic error": f"{err_prefix} the diagnostic script failed", + "missing data": f"{err_prefix} of missing data", + "out of time": f"{err_prefix} the run took too long", + "out of memory": f"{err_prefix} they used too much memory", + "unknown": f"{prefix} failed of other reasons or are still running", + "no run": f"{prefix} never ran", + } + for type_, msg in messages.items(): + result = results[type_] + if result: + print(f"### {msg} ({len(result)} out of {n_recipes})") + for recipe in result: + print(f"- {recipe}") + print() if __name__ == '__main__': - display_in_md() + fire.Fire(display_in_md) diff --git a/esmvaltool/utils/draft_release_notes.py b/esmvaltool/utils/draft_release_notes.py index 13bcb4324c..a11b03a9ae 100644 --- a/esmvaltool/utils/draft_release_notes.py +++ b/esmvaltool/utils/draft_release_notes.py @@ -41,11 +41,11 @@ 'esmvaltool': "ESMValGroup/ESMValTool", } +TIMEZONE = ZoneInfo("CET") + PREVIOUS_RELEASE = { - 'esmvalcore': - datetime.datetime(2023, 7, 4, 11, tzinfo=ZoneInfo("CET")), - 'esmvaltool': - datetime.datetime(2022, 10, 28, 18, tzinfo=ZoneInfo("CET")), + 'esmvalcore': datetime.datetime(2023, 6, 6, 0, tzinfo=TIMEZONE), + 'esmvaltool': datetime.datetime(2023, 6, 20, 0, tzinfo=TIMEZONE), } LABELS = { @@ -130,11 +130,17 @@ def draft_notes_since(project, previous_release_date=None, labels=None): print(f"Note: Unmerged PRs or PRs that have been merged before " f"{previous_release_date} are not shown\n") for pull in pulls: - if pull.updated_at < previous_release_date: + if pull.updated_at.astimezone(TIMEZONE) < previous_release_date: break - if not pull.merged or pull.merged_at < previous_release_date: + if (not pull.merged or + pull.merged_at.astimezone(TIMEZONE) < previous_release_date): continue - print(pull.updated_at, pull.merged_at, pull.number, pull.title) + print( + pull.updated_at.astimezone(TIMEZONE), + pull.merged_at.astimezone(TIMEZONE), + pull.number, + pull.title, + ) pr_labels = {label.name for label in pull.labels} if 'automatedPR' in pr_labels: continue @@ -205,12 +211,9 @@ def _list_labelless_pulls(labelless_pulls): def _compose_note(pull): user = pull.user - username = user.login if user.name is None else user.name title = pull.title title = title[0].upper() + title[1:] - return (f"- {title} (`#{pull.number} " - f"<{pull.html_url}>`__) " - f"`{username} `__") + return f"- {title} (:pull:`{pull.number}`) by :user:`{user.login}`" def main(): From ce887aa93325f50131bf1209baf4093a05f227d3 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Wed, 20 Dec 2023 16:10:04 +0100 Subject: [PATCH 34/39] Move code into function in batch job generation script (#3491) --- esmvaltool/utils/batch-jobs/generate.py | 30 ++++++++++++------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/esmvaltool/utils/batch-jobs/generate.py b/esmvaltool/utils/batch-jobs/generate.py index 960ddd3e86..afba37906f 100644 --- a/esmvaltool/utils/batch-jobs/generate.py +++ b/esmvaltool/utils/batch-jobs/generate.py @@ -24,6 +24,7 @@ """ import os import subprocess +import textwrap from pathlib import Path import esmvaltool @@ -230,28 +231,27 @@ 'recipe_pcrglobwb', ] -DEFAULT_DASK_FILE = f""" -cluster: - type: dask_jobqueue.SLURMCluster - queue: compute - account: {account} - cores: 128 - memory: 256GiB - processes: 32 - interface: ib0 - local_directory: /scratch/{os.getlogin()[0]}/{os.getlogin()}/dask-tmp - n_workers: 32 - walltime: '8:00:00' -""" - def generate_submit(): """Generate and submit scripts.""" print("It is recommended that you run the following recipes with the " "configuration in dask.yml in ~/.esmvaltool/dask.yml:") + default_dask_config_file = textwrap.dedent(f""" + cluster: + type: dask_jobqueue.SLURMCluster + queue: compute + account: {account} + cores: 128 + memory: 256GiB + processes: 32 + interface: ib0 + local_directory: /scratch/{os.getlogin()[0]}/{os.getlogin()}/dask-tmp + n_workers: 32 + walltime: '8:00:00' + """) for recipe in DISTRIBUTED_RECIPES: print(f"- {recipe}.yml") - Path('dask.yml').write_text(DEFAULT_DASK_FILE, encoding='utf-8') + Path('dask.yml').write_text(default_dask_config_file, encoding='utf-8') home = os.path.expanduser('~') # Fill the list with the names of the recipes to be excluded From 679912f7cb75af1cae46cc57cb36a29c55504f7f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 12:06:27 +0200 Subject: [PATCH 35/39] [Condalock] Update Linux condalock file (#3492) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 66 ++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index b0facf9382..36de51bd52 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 05ccb0eb21a22bcda85523e4fc91a3c5d43c69b2fc56e17f5c81159b2e906d6b +# input_hash: 9ebadc06c6267b4960d64d1b5af80ef1cf3716c4c49f5d7f45b0bfd2e4d7f8f3 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/_py-xgboost-mutex-2.0-gpu_0.tar.bz2#7702188077361f43a4d61e64c694f850 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.cond https://conda.anaconda.org/conda-forge/linux-64/aom-3.5.0-h27087fc_0.tar.bz2#a08150fd2298460cd1fcccf626305642 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.8.23-hd590300_0.conda#cc4f06f7eedb1523f3b83fd0fb3942ff https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.23.0-hd590300_0.conda#d459949bc10f64dee1595c176c2e6291 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.24.0-hd590300_0.conda#f5842b88e9cbfa177abfaeacd457a45d https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/freexl-1.0.6-h166bdaf_1.tar.bz2#897e772a157faf3330d72dd291486f62 @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172b https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_3.conda#c714d905cdfa0e70200f68b80cc04764 -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libnuma-2.0.16-h0b41bf4_1.conda#28bfe2cb11357ccc5be21101a6b7ce86 @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.0-h59595ed_4.conda#9cfbafab420f42b572f3c032ad59da85 +https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h59595ed_0.conda#fd486bffbf0d6841cf1456a8f2e3a995 https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.0.7-h0b41bf4_0.conda#49e8329110001f04923fe7e864990b0c https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.0-h93469e0_0.conda#580a52a05f5be28ce00764149017c6d4 https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h862ab75_1.conda#0013fcee7acb3cfc801c5929824feb3c @@ -128,7 +128,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxgboost-1.7.6-cuda118_hd3b444d_6.conda#78509401d0879ef5aac72b8d1e104493 +https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.0.3-cuda118_hd3b444d_0.conda#cd2836b10eb0a5dec0ee63e0a2b80609 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h0d562d8_0.conda#558ab736404275d7df61c473c1af35aa https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h9458935_0.conda#4c28f3210b30250037a4a627eeee9e0f @@ -166,7 +166,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.25-pthread https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.18.1-h8fd135c_2.conda#bbf65f7688512872f063810623b755dc https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.37-h0054252_1.conda#f27960e8873abb5476e96ef33bdbdccd -https://conda.anaconda.org/conda-forge/linux-64/nss-3.95-h1d7d5a4_0.conda#d3a8067adcc45a923f4b1987c91d69da +https://conda.anaconda.org/conda-forge/linux-64/nss-3.96-h1d7d5a4_0.conda#1c8f8b8eb041ecd54053fc4b6ad57957 https://conda.anaconda.org/conda-forge/linux-64/orc-1.9.0-h385abfd_1.conda#2cd5aac7ef1b4c6ac51bf521251a89b3 https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.1.3-h32600fe_0.conda#8287aeb8462e2d4b235eff788e75919d https://conda.anaconda.org/conda-forge/linux-64/python-3.11.6-hab00c5b_0_cpython.conda#b0dfbe2fcbfdb097d321bfd50ecddab1 @@ -195,10 +195,10 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/config-0.5.1-pyhd8ed1ab_0.tar.bz2#97275d4898af65967b1ad57923cef770 https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda#0d07dc29b1c1cc973f76b74beb44915f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.6-py311hb755f60_0.conda#88cc84238dda72e11285d9cfcbe43e51 +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.7-py311hb755f60_0.conda#97b12677eec6c2fd23c7867db1c7a87d https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda#5e4f3466526c52bc9af2d2353a1460bd -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.7-pyhd8ed1ab_0.conda#12d8aae6994f342618443a8f05c652a0 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe https://conda.anaconda.org/conda-forge/noarch/dodgy-0.2.1-py_0.tar.bz2#62a69d073f7446c90f417b0787122f5b https://conda.anaconda.org/conda-forge/noarch/ecmwf-api-client-1.6.3-pyhd8ed1ab_0.tar.bz2#15621abf59053e184114d3e1d4f9d01e @@ -210,8 +210,8 @@ https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar. https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.0-py311h459d7ec_1.conda#23d0b2d02252b32ee14e5063ccfb41e2 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.12.1-pyhca7485f_0.conda#b38946846cdf39f9bce93f75f571d913 +https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h459d7ec_0.conda#b267e553a337e1878512621e374845c5 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.12.2-pyhca7485f_0.conda#bf40f2a8835b78b1f91083d306b493d2 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h6b639ba_2.conda#ee8220db21db8094998005990418fe5b https://conda.anaconda.org/conda-forge/noarch/geographiclib-1.52-pyhd8ed1ab_0.tar.bz2#6880e7100ebae550a33ce26663316d85 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe @@ -221,7 +221,7 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.1.2-pyhd8ed1ab_0.tar.bz2#3c3de74912f11d2b590184f03c7cd09b https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f -https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.9.0-py311h459d7ec_1.conda#7cc99d87755a9e64586a6004c5f0f534 +https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.10.0-py311h459d7ec_0.conda#d39020c78fd00ed774ff9c876e8aba07 https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.3-pyhd8ed1ab_0.conda#69ea1d0fa7ab33b48c88394ad1dead65 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc @@ -250,7 +250,7 @@ https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.1.0-pyhd8ed1ab_0.conda#45a5065664da0d1dfa8f8cd2eaf05ab9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.3.0-pyhd8ed1ab_0.conda#2390bd10bed1f3fdc7a537fb5a447d8d -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py311h459d7ec_1.conda#490d7fa8675afd1aa6f1b2332d156a45 +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.7-py311h459d7ec_0.conda#b4f2d78860bf9c8887b528c10995b427 https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.9.1-pyhd8ed1ab_0.tar.bz2#0191dd7efe1a94262812770183b68892 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyflakes-2.5.0-pyhd8ed1ab_0.tar.bz2#1b3bef4313288ae8d35b1dfba4cd84a3 @@ -264,7 +264,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7e https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda#c93346b446cd08c169d843ae5fc0da97 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.2-py311h34ded2d_0.conda#819aa640a0493d4b52faf938e94d129e -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.13.2-py311h46250e7_0.conda#c5f5089dd1fe0000fecaf0d12eca50b9 +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.15.2-py311h46250e7_0.conda#1ec6376840c74c230f42e71092851fb6 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py311h459d7ec_2.conda#56bc3fe5180c0b23e05c7a5708153ac7 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df @@ -310,7 +310,7 @@ https://conda.anaconda.org/conda-forge/noarch/asgiref-3.7.2-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/linux-64/astroid-2.15.8-py311h38be061_0.conda#46d70fcb74472aab178991f0231ee3c6 https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.0-hf8751d9_2.conda#deb12196f0c64c441bb3d083d06d0cf8 https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.8.14-h2e270ba_2.conda#58bbee5fd6cf2d4fffbead1bc33a5d3b -https://conda.anaconda.org/conda-forge/noarch/babel-2.13.1-pyhd8ed1ab_0.conda#3ccff479c246692468f604df9c85ef26 +https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad @@ -319,23 +319,23 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.cond https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.2.0-hd9d235c_0.conda#8c57a9adbafd87f5eff842abde599cb4 https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.3.2-py311h459d7ec_0.conda#7b3145fed7adc7c63a0e08f6f29f5480 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.3.3-py311h459d7ec_0.conda#9db2c1316e96068c0189beaeb716f3fe https://conda.anaconda.org/conda-forge/linux-64/curl-8.1.2-h409715c_0.conda#9f88cfb15b7d08b25880b138f91e0eb4 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.2-py311h459d7ec_1.conda#afe341dbe834ae76d2c23157ff00e633 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a https://conda.anaconda.org/conda-forge/noarch/fire-0.5.0-pyhd8ed1ab_0.conda#9fd22aae8d2f319e80f68b295ab91d64 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.46.0-py311h459d7ec_0.conda#a14114f70e23f7fd5ab9941fec45b095 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.47.0-py311h459d7ec_0.conda#f7ec87c448f714f53519fe9c87ba1747 https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_0.conda#c75621ce68f6570fff9a6734cf21c9a7 https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.0-nompi_hb72d44e_103.conda#975973a4350ab45ff1981fe535a12af5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.0-pyha770c72_0.conda#a941237cd06538837b25cd245fcd25d8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda#3d5fa25cf42f3f32a12b2d874ace8574 https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 -https://conda.anaconda.org/conda-forge/noarch/isort-5.12.0-pyhd8ed1ab_1.conda#07ed3421bad60867234c7a9282ea39d4 +https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda#4da50d410f553db77e62ab62ffaa1abc -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.5.0-py311h38be061_0.conda#cee83be29258275f75029125e186ab6d +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.5.1-py311h38be061_0.conda#1c704ad46ebe0a4cc29445b565bd954d https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_0.conda#3f0915b1fb2252ab73686a533c5f9d3f https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 @@ -349,7 +349,7 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2 https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.2-py311h459d7ec_1.conda#5c809fb753f06a04c2f114394404769e https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py311h0b84326_0.conda#4b24acdc1fbbae9da03147e7d2cf8c8a -https://conda.anaconda.org/conda-forge/noarch/pip-23.3.1-pyhd8ed1ab_0.conda#2400c0b86889f43aa52067161e1fb108 +https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 https://conda.anaconda.org/conda-forge/noarch/plotly-5.18.0-pyhd8ed1ab_0.conda#9f6a8664f1fe752f79473eeb9bf33a60 https://conda.anaconda.org/conda-forge/linux-64/postgresql-15.3-hd458b1d_1.conda#4a4b5dede4d2e075e9aa5a44a9fd9f20 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 @@ -396,7 +396,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0f3d0bb_1 https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.0.1-hca56755_27.conda#918a735059cab21b96fc13a8d04fbcd8 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.2-py311h64a7726_0.conda#fd2f142dcd680413b5ede5d0fb799205 https://conda.anaconda.org/conda-forge/linux-64/poppler-23.05.0-hd18248d_1.conda#09e0de1aa7330fe697eed76eaeef666d -https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.2.0-pyhd8ed1ab_0.tar.bz2#d883564cf1e9ba190f6b285036c5f949 +https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.3.0-pyhd8ed1ab_0.conda#159684d27a0d1b5ff03d7c4b052278ee https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba https://conda.anaconda.org/conda-forge/noarch/pylint-2.17.7-pyhd8ed1ab_0.conda#3cab6aee60038b3f621bce3e50f52bed https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311ha169711_0.conda#ad4b6e9be79a89959bb6d7d308027ff2 @@ -420,12 +420,12 @@ https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.con https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.12.0-pyhd8ed1ab_0.conda#95eae0785aed72998493140dc0115382 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.12.1-pyhd8ed1ab_0.conda#bf6ad72d882bc3f04e6a0fb50fd2cce8 https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.0-py_0.tar.bz2#6e166cd37cfeadefcfca1ffe00f222bb https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe https://conda.anaconda.org/conda-forge/noarch/identify-2.5.33-pyhd8ed1ab_0.conda#93c8f8ceb83827d88deeba796f07fba7 https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2023.8.12-py311h67b54e4_0.conda#363e5c2f2c67ff69d717aba54422b03d -https://conda.anaconda.org/conda-forge/noarch/imageio-2.31.5-pyh8c1a49c_0.conda#6820ccf6a3a27df348f18c85dd89014a +https://conda.anaconda.org/conda-forge/noarch/imageio-2.33.1-pyh8c1a49c_0.conda#1c34d58ac469a34e7e96832861368bce https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.20.0-pyhd8ed1ab_0.conda#1116d79def5268414fb0917520b2bbf1 https://conda.anaconda.org/conda-forge/linux-64/julia-1.8.5-h783901f_0.conda#98c05ba7ca9c15d22216f730499e167a @@ -453,7 +453,7 @@ https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h43474b4_0.c https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-hbc2ea52_17.conda#452c7b08c21eea2ef01f4fd364d6affc https://conda.anaconda.org/conda-forge/noarch/bokeh-3.3.2-pyhd8ed1ab_0.conda#c02a7e79365121bd3bcc25f1b65f48a9 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b -https://conda.anaconda.org/conda-forge/noarch/distributed-2023.12.0-pyhd8ed1ab_0.conda#22d620e1079e99c34578cb0c615d2789 +https://conda.anaconda.org/conda-forge/noarch/distributed-2023.12.1-pyhd8ed1ab_0.conda#6b31b9b627f238a0068926d5650ae128 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.30.2-h1f30a5c_0.conda#21ee8444a7f629924ea8cfe52a622cbd https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h20110ff_0.conda#11f5169aeff54ad7277476be8ba19ff7 https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.0-py311h281082f_2.conda#fde4fad3c517cc80f32995696f45198d @@ -473,12 +473,12 @@ https://conda.anaconda.org/conda-forge/linux-64/r-base-4.1.3-hfabd6f2_9.conda#0a https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.8-py311h41e4db2_0.conda#b35deb26af1d7e0d98438c8ac5c6b7b2 https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.3.2-py311hc009520_2.conda#9821f8e497a791858226f535e5e0be62 https://conda.anaconda.org/conda-forge/noarch/sparse-0.14.0-pyhd8ed1ab_0.conda#ee01b310177a0612554b9d20e537fdbe -https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.0-py311h1f0f07a_2.conda#8f1e772e5430ce48229740ec00a90b61 +https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.1-py311h1f0f07a_0.conda#11ea602c16ad004033edf648ce054f9e https://conda.anaconda.org/conda-forge/noarch/tifffile-2023.12.9-pyhd8ed1ab_0.conda#454bc0aff84f35fa53ba9e0369737a9b https://conda.anaconda.org/conda-forge/noarch/xarray-2023.12.0-pyhd8ed1ab_0.conda#e9b31d3ab1b0dd5fd8c24419f6560b90 https://conda.anaconda.org/conda-forge/noarch/zarr-2.16.1-pyhd8ed1ab_0.conda#59ec835edbee50266b7bdbadab7ba335 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.8.6-pyhd8ed1ab_0.conda#2e33e3bdf2b1a79989ad792ac22104d3 +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.8.7-pyhd8ed1ab_0.conda#d475dc2fac9652bcd55cec9c387fc139 https://conda.anaconda.org/conda-forge/noarch/cmocean-3.0.3-pyhd8ed1ab_0.conda#eec7df83d725696d32c7bf99aff21d82 https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.8.2-pyhd8ed1ab_0.conda#cc344a296a41369bcb05f7216661cec8 https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a @@ -493,7 +493,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-hf70af60_47.conda#ee27 https://conda.anaconda.org/conda-forge/linux-64/nco-5.1.6-hd62b316_0.conda#af7780f76ee37325d264327e21a478f5 https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.3-pyhd8ed1ab_0.conda#f551d4d859a1d70c6abff8310a655481 https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.4.3-py311h38be061_1.tar.bz2#f0c9a1067c03e8f05e53ef0c5ad5fab3 -https://conda.anaconda.org/conda-forge/linux-64/py-xgboost-1.7.6-cuda118_py311h0be3a32_6.conda#e9989e03af742084940a11c7c3c395a5 +https://conda.anaconda.org/conda-forge/linux-64/py-xgboost-2.0.3-cuda118_py311h0be3a32_0.conda#7a06b457cb9be1e68faca26333625d34 https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r41hc72bb7e_1004.tar.bz2#831186670e5786df30f8ddeb5a623c5a https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.4.1-r41h06615bd_1.tar.bz2#9a00c3283f8fb4bce68deffe08fbe09d https://conda.anaconda.org/conda-forge/noarch/r-bigmemory.sri-0.1.6-r41hc72bb7e_0.tar.bz2#926471a5be30d287a25f2d10446d6066 @@ -502,7 +502,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-cli-3.6.1-r41h38f115c_0.conda# https://conda.anaconda.org/conda-forge/noarch/r-codetools-0.2_19-r41hc72bb7e_0.conda#401ac0ee6310d69deac481b2d2148458 https://conda.anaconda.org/conda-forge/linux-64/r-colorspace-2.1_0-r41h133d619_0.conda#b6f5d77e5e0334a8adda752364bc760e https://conda.anaconda.org/conda-forge/linux-64/r-contfrac-1.1_12-r41h06615bd_1003.tar.bz2#c9cbc66278bea99ce3ce9f8be9e8c0ad -https://conda.anaconda.org/conda-forge/noarch/r-cpp11-0.4.3-r41hc72bb7e_0.tar.bz2#2362e0b8e003b884686fe27cf18c9a81 +https://conda.anaconda.org/conda-forge/noarch/r-cpp11-0.4.7-r41hc72bb7e_0.conda#a81541ceb9c2c3d40695e746b2777961 https://conda.anaconda.org/conda-forge/noarch/r-crayon-1.5.2-r41hc72bb7e_1.tar.bz2#8cf94f6451aaadf3aa1119b29115b0c7 https://conda.anaconda.org/conda-forge/linux-64/r-curl-4.3.3-r41hf9611b0_2.conda#c4047e3aa1b795a4cb5adbb5c59b3972 https://conda.anaconda.org/conda-forge/linux-64/r-desolve-1.35-r41hb20cf53_0.conda#e475d0dbe391fa76fbf742ebee6ad449 @@ -564,7 +564,7 @@ https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_15-pl5321hf48e https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.12.0-pyhd8ed1ab_0.conda#4d67c68fd0d130091ada039bc2d81b33 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.13.0-pyhd8ed1ab_0.conda#786c2ed88ac4483944ed9013dcba399c https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.4.1-py311h38be061_2.tar.bz2#4c9101d329f6bc09c2617a80e3eb9c89 https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.6.6-pyhd8ed1ab_0.conda#255f9eac03143526c8aed41d1d091c63 https://conda.anaconda.org/conda-forge/linux-64/pyarrow-12.0.1-py311h39c9aba_7_cpu.conda#d513ab8d10ec5f3ee45b419c836195ec @@ -597,8 +597,8 @@ https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.4-r41h1ad5fc0_1.conda https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r41h133d619_0.conda#1d432d2eba171727afd03507faa5e2f6 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.0-hd8ed1ab_0.conda#ebd31a95a7008b7e164dad9dbbb5bb5a https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.2-pyhd8ed1ab_0.conda#8e765a0eca0ce1cfa889cd9af82a23a8 -https://conda.anaconda.org/conda-forge/linux-64/xgboost-1.7.6-cuda118_py311h0be3a32_6.conda#f061993f8ed8ca90d2bb6a547a47109f -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.12.0-pyhd8ed1ab_0.conda#460d7cac50322a39b61a833885a6a8d5 +https://conda.anaconda.org/conda-forge/linux-64/xgboost-2.0.3-cuda118_py311h0be3a32_0.conda#f3ef3a16aa577a4daf0f8aec6306d1ab +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.13.0-pyhd8ed1ab_0.conda#13647ddfc84fd614fa12119a317de280 https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 https://conda.anaconda.org/conda-forge/noarch/psy-maps-1.4.2-pyhd8ed1ab_0.tar.bz2#3ed13103dfd46f71dc870d188bd0b276 https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.4.0-py311h38be061_3.conda#6f7871722c07922028043144e8873b37 @@ -621,8 +621,8 @@ https://conda.anaconda.org/conda-forge/noarch/r-scales-1.2.1-r41hc72bb7e_1.tar.b https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r41ha503ecb_3.conda#2bc51f0d44b98092ba57cf2f8671b490 https://conda.anaconda.org/conda-forge/linux-64/r-splancs-2.01_43-r41h8da6f51_1.tar.bz2#3a6aad0706541141d10e3b514467a080 https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.2-r41ha503ecb_0.conda#1f7610a1863648cab254a9f85bd29dcd -https://conda.anaconda.org/conda-forge/noarch/dask-2023.12.0-pyhd8ed1ab_0.conda#5cfc00e93b71fba459bede86419d0f01 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.12.0-pyhd8ed1ab_0.conda#364e28ab12477494e72839aaa588073d +https://conda.anaconda.org/conda-forge/noarch/dask-2023.12.1-pyhd8ed1ab_0.conda#9a6e8eb1d188bc246883ea11f4fe6a4d +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.13.0-pyhd8ed1ab_0.conda#e52eed0a3dac67432a02b8b5b23c8d76 https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.0-r41hc72bb7e_1005.tar.bz2#800e1da5bf774be48934b8865dd78d33 https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r41hc72bb7e_1004.tar.bz2#71ebed7e976df735ff3443bb88bd154f https://conda.anaconda.org/conda-forge/noarch/r-httr-1.4.6-r41hc72bb7e_0.conda#53dbb769c96782db54bf2d414fc9b239 @@ -635,7 +635,7 @@ https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r41hc72bb7e_1.tar https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.9.0-pyhd8ed1ab_0.conda#570f2c6e387fd6dac5356a5152f91b3f https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.2-r41hc72bb7e_0.conda#9922b863cd10035cbb75e3c2edae64a7 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r41h133d619_1.conda#3ae9b78fb1d8a44deed24a27cce33ebf -https://conda.anaconda.org/conda-forge/label/esmvalcore_rc/noarch/esmvalcore-2.10.0rc1-pyh39db41b_0.conda#b973ee8c35712a7d21830ed06bdbc42d +https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.10.0-pyhd8ed1ab_0.conda#18bc5ed0e0583cb0b212927795debea7 https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.4.2-r41hc72bb7e_0.conda#c2b04f4ff351d84bf51fd5a77b5c9b6c https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r41hc72bb7e_2.tar.bz2#f67eae0562ffc808b82f1590776c25f5 https://conda.anaconda.org/conda-forge/noarch/r-styler-1.10.1-r41hc72bb7e_0.conda#c12b81cff8bb8745ffbe7aeb9dfd795f From 3969eea5129f50e13755a36922ee5bc4b3eff122 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 31 Dec 2023 11:28:31 +0200 Subject: [PATCH 36/39] [Condalock] Update Linux condalock file (#3494) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 36de51bd52..c9dc8c9ea8 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -18,7 +18,7 @@ https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.2.0-ha https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_3.conda#937eaed008f6bf2191c5fe76f87755e9 https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda#d8d7293c5b37f39b2ac32940621c6592 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda#8dee24b8be2d9ff81e7bd4d7d97ff1b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-imake-1.0.7-0.tar.bz2#23acfc5a339a6a34cc2241f64e4111be https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_3.conda#7124cbb46b13d395bdde68f2d215c989 @@ -45,7 +45,7 @@ https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.t https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf https://conda.anaconda.org/conda-forge/linux-64/json-c-0.16-hc379101_0.tar.bz2#0e2bca6857cb73acec30387fef7c3142 -https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-h7f98852_2.tar.bz2#8e787b08fe19986d99d034b839df2961 +https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libabseil-20230125.3-cxx17_h59595ed_0.conda#d1db1b8be7c3a8983dcbbbfe4f0765de @@ -69,6 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2#ede4266dc02e875fe1ea77b25dd43747 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.1-hd590300_0.conda#82bf6f63eb15ef719b556b63feec3a77 +https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 @@ -88,7 +89,7 @@ https://conda.anaconda.org/conda-forge/linux-64/rdma-core-28.9-h59595ed_1.conda# https://conda.anaconda.org/conda-forge/linux-64/re2-2023.03.02-h8c504da_0.conda#206f8fa808748f6e90599c3368a1114e https://conda.anaconda.org/conda-forge/linux-64/sed-4.8-he412f7d_0.tar.bz2#7362f0042e95681f5d371c46c83ebd08 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 -https://conda.anaconda.org/conda-forge/linux-64/tzcode-2023c-h0b41bf4_0.conda#0c0533894f21c3d35697cb8378d390e2 +https://conda.anaconda.org/conda-forge/linux-64/tzcode-2023d-h3f72095_0.conda#1c63518899838477ebd497e3e3327f81 https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.7-hcb278e6_1.conda#2c46deb08ba9b10e90d0a6401ad65deb https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -134,7 +135,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#a https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h9458935_0.conda#4c28f3210b30250037a4a627eeee9e0f https://conda.anaconda.org/conda-forge/linux-64/openlibm-0.8.1-hd590300_1.conda#6eba22eb06d69e53d0ca01eef42bc675 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b -https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-4_hd590300_perl5.conda#3e785bff761095eb7f8676f4694bd1b1 +https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda#f2cfec9406850991f4e3d960cc9e3321 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.46-h06160fa_0.conda#413d96a0b655c8f8aacc36473a2dbb04 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -149,7 +150,7 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#00 https://conda.anaconda.org/conda-forge/linux-64/boost-cpp-1.78.0-h6582d0a_3.conda#d3c3c7698d0b878aab1b86db95407c8e https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/bwidget-1.9.14-ha770c72_1.tar.bz2#5746d6202ba2abad4a4707f2a2462795 -https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.11.3-hb4ffafa_0.conda#f394ac64ab0e1fcb0152cc9c16df3d85 +https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.12.0-hb4ffafa_0.conda#1a9b16afb84d734a1bb2d196c308d477 https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hc118613_108.conda#6fa90698000b05dfe8ce6515794fe71a https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-13.2.0-h76e1118_3.conda#4a04c8f0a51d525776f267112198684d @@ -258,13 +259,13 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.0-pyhd8ed1ab_0.conda#e4dbdb3585c0266b4710467fe7b75cf4 -https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.3-pyhd8ed1ab_0.conda#2590495f608a63625e165915fb4e2e34 +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.1-pyhd8ed1ab_0.conda#4d3ceee3af4b0f9a1f48f57176bf8625 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.4-pyhd8ed1ab_0.conda#c79cacf8a06a51552fc651652f170208 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda#c93346b446cd08c169d843ae5fc0da97 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.2-py311h34ded2d_0.conda#819aa640a0493d4b52faf938e94d129e -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.15.2-py311h46250e7_0.conda#1ec6376840c74c230f42e71092851fb6 +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.16.2-py311h46250e7_0.conda#79a19e53eae4bc42b7469feb46d90bd4 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py311h459d7ec_2.conda#56bc3fe5180c0b23e05c7a5708153ac7 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df @@ -319,7 +320,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.cond https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.2.0-hd9d235c_0.conda#8c57a9adbafd87f5eff842abde599cb4 https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.3.3-py311h459d7ec_0.conda#9db2c1316e96068c0189beaeb716f3fe +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.4.0-py311h459d7ec_0.conda#bbaf0376ed2f153a90f167ad908da3d0 https://conda.anaconda.org/conda-forge/linux-64/curl-8.1.2-h409715c_0.conda#9f88cfb15b7d08b25880b138f91e0eb4 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.2-py311h459d7ec_1.conda#afe341dbe834ae76d2c23157ff00e633 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 @@ -329,13 +330,13 @@ https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.47.0-py311h459d7ec_0 https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_0.conda#c75621ce68f6570fff9a6734cf21c9a7 https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.0-nompi_hb72d44e_103.conda#975973a4350ab45ff1981fe535a12af5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.0-pyha770c72_0.conda#a941237cd06538837b25cd245fcd25d8 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda#3d5fa25cf42f3f32a12b2d874ace8574 https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda#4da50d410f553db77e62ab62ffaa1abc -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.5.1-py311h38be061_0.conda#1c704ad46ebe0a4cc29445b565bd954d +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.6.0-py311h38be061_0.conda#20290b0ac04a80c0d84d833fff1c0fd7 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_0.conda#3f0915b1fb2252ab73686a533c5f9d3f https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 @@ -389,14 +390,14 @@ https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.40-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-7.3.0-hdb3a94d_0.conda#765bc76c0dfaf24ff9d8a2935b2510df https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-h8b5b2df_13.conda#29a96d50cb53638a5b4806b5ca6e4b1d -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.0-hd8ed1ab_0.conda#12aff14f84c337be5e5636bf612f4140 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.11.2-pyhd8ed1ab_0.conda#73884ca36d6d96cbce498cde99fab40f +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.1-h3845be2_3.conda#f38e5e47f62d6633166040192ad420a1 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0f3d0bb_105.conda#b5d412441b84305460e9df8a016a3392 https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.0.1-hca56755_27.conda#918a735059cab21b96fc13a8d04fbcd8 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.2-py311h64a7726_0.conda#fd2f142dcd680413b5ede5d0fb799205 https://conda.anaconda.org/conda-forge/linux-64/poppler-23.05.0-hd18248d_1.conda#09e0de1aa7330fe697eed76eaeef666d -https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.3.0-pyhd8ed1ab_0.conda#159684d27a0d1b5ff03d7c4b052278ee +https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.3.2-pyhd8ed1ab_0.conda#d55cd7adfc98beaef0c717c61fa3d294 https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba https://conda.anaconda.org/conda-forge/noarch/pylint-2.17.7-pyhd8ed1ab_0.conda#3cab6aee60038b3f621bce3e50f52bed https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311ha169711_0.conda#ad4b6e9be79a89959bb6d7d308027ff2 @@ -437,7 +438,7 @@ https://conda.anaconda.org/conda-forge/linux-64/numba-0.58.1-py311h96b013e_0.con https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.12.1-py311hb755f60_0.conda#38a2ff8ea433fe8792279b45e84b3730 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py311h320fe9a_0.conda#e44ccb61b6621bf3f8053ae66eba7397 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-heaa33ce_1.conda#cde553e0e32389e26595db4eacf859eb -https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.4-pyhd8ed1ab_0.conda#1184267eddebb57e47f8e1419c225595 +https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.5-pyhd8ed1ab_0.conda#f266f66ba1dcae0dbcc771a491acbea4 https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.0-pyhd8ed1ab_0.conda#134b2b57b7865d2316a7cce1915a51ed https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.3.0-pyhd8ed1ab_0.conda#7819533e674dbbc51468f3228b9b1bb6 @@ -564,7 +565,7 @@ https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_15-pl5321hf48e https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.13.0-pyhd8ed1ab_0.conda#786c2ed88ac4483944ed9013dcba399c +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.13.1-pyhd8ed1ab_0.conda#165cac4486f9e8542f0b8de32822f328 https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.4.1-py311h38be061_2.tar.bz2#4c9101d329f6bc09c2617a80e3eb9c89 https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.6.6-pyhd8ed1ab_0.conda#255f9eac03143526c8aed41d1d091c63 https://conda.anaconda.org/conda-forge/linux-64/pyarrow-12.0.1-py311h39c9aba_7_cpu.conda#d513ab8d10ec5f3ee45b419c836195ec @@ -598,7 +599,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r41h133d619_0.conda https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.0-hd8ed1ab_0.conda#ebd31a95a7008b7e164dad9dbbb5bb5a https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.2-pyhd8ed1ab_0.conda#8e765a0eca0ce1cfa889cd9af82a23a8 https://conda.anaconda.org/conda-forge/linux-64/xgboost-2.0.3-cuda118_py311h0be3a32_0.conda#f3ef3a16aa577a4daf0f8aec6306d1ab -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.13.0-pyhd8ed1ab_0.conda#13647ddfc84fd614fa12119a317de280 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.13.1-pyhd8ed1ab_0.conda#b97a845d8ee2502842873e7e9d59eb97 https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 https://conda.anaconda.org/conda-forge/noarch/psy-maps-1.4.2-pyhd8ed1ab_0.tar.bz2#3ed13103dfd46f71dc870d188bd0b276 https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.4.0-py311h38be061_3.conda#6f7871722c07922028043144e8873b37 @@ -622,7 +623,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r41ha5 https://conda.anaconda.org/conda-forge/linux-64/r-splancs-2.01_43-r41h8da6f51_1.tar.bz2#3a6aad0706541141d10e3b514467a080 https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.2-r41ha503ecb_0.conda#1f7610a1863648cab254a9f85bd29dcd https://conda.anaconda.org/conda-forge/noarch/dask-2023.12.1-pyhd8ed1ab_0.conda#9a6e8eb1d188bc246883ea11f4fe6a4d -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.13.0-pyhd8ed1ab_0.conda#e52eed0a3dac67432a02b8b5b23c8d76 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.13.1-pyhd8ed1ab_0.conda#ee7bb8530ad5bda21f34ec6b16d218fc https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.0-r41hc72bb7e_1005.tar.bz2#800e1da5bf774be48934b8865dd78d33 https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r41hc72bb7e_1004.tar.bz2#71ebed7e976df735ff3443bb88bd154f https://conda.anaconda.org/conda-forge/noarch/r-httr-1.4.6-r41hc72bb7e_0.conda#53dbb769c96782db54bf2d414fc9b239 From f761c5d8f306d297cf66c37bdfadbe8144d8c5be Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 12:05:21 +0200 Subject: [PATCH 37/39] [Condalock] Update Linux condalock file (#3495) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index c9dc8c9ea8..ab3276d2ca 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -180,7 +180,7 @@ https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481c9de49f040272556e2cedf42816 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b -https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h9599702_1.conda#a8820ce2dbe6f7d54f6540d9a3a0028a https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-hbe98c3e_0.conda#067641478d8f706b80a5a434a22b82be https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py311h38be061_8.conda#5384590f14dfe6ccd02811236afc9f8e @@ -356,7 +356,7 @@ https://conda.anaconda.org/conda-forge/linux-64/postgresql-15.3-hd458b1d_1.conda https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda#7e23a61a7fbaedfef6eb0e1ac775c8e5 https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.0.0-pyhd8ed1ab_0.conda#21de50391d584eb7f4441b9de1ad773f -https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.3-pyhd8ed1ab_0.conda#5bdca0aca30b0ee62bb84854e027eae0 +https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.4-pyhd8ed1ab_0.conda#a9d145de8c5f064b5fa68fb34725d9f4 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.1-pyhd8ed1ab_0.conda#4dc77041fea14c63ecea50ce0eb92873 https://conda.anaconda.org/conda-forge/noarch/referencing-0.32.0-pyhd8ed1ab_0.conda#a7b5a535cd614e384594530aee7e6061 From 94d0c6ceaf24a449a14eee830687d8c8b4fc1a14 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 12 Jan 2024 13:32:59 +0000 Subject: [PATCH 38/39] [Condalock] Update Linux condalock file (#3497) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 50 ++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index ab3276d2ca..d5f53fbe29 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.cond https://conda.anaconda.org/conda-forge/linux-64/aom-3.5.0-h27087fc_0.tar.bz2#a08150fd2298460cd1fcccf626305642 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.8.23-hd590300_0.conda#cc4f06f7eedb1523f3b83fd0fb3942ff https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.24.0-hd590300_0.conda#f5842b88e9cbfa177abfaeacd457a45d +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.25.0-hd590300_0.conda#89e40af02dd3a0846c0c1131c5126706 https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/freexl-1.0.6-h166bdaf_1.tar.bz2#897e772a157faf3330d72dd291486f62 @@ -82,7 +82,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7db https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.4-hd590300_0.conda#412ba6938c3e2abaca8b1129ea82e238 https://conda.anaconda.org/conda-forge/linux-64/p7zip-16.02-h9c3ff4c_1001.tar.bz2#941066943c0cac69d5aa52189451aa5f -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.42.2-h59595ed_0.conda#700edd63ccd5fc66b70b1c028cea9a68 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.0-h59595ed_0.conda#6b4b43013628634b6cfdee6b74fd696b https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h36c2ea0_1008.tar.bz2#fbef41ff6a4c8140c30057466a1cdd47 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/rdma-core-28.9-h59595ed_1.conda#aeffb7c06b5f65e55e6c637408dc4100 @@ -176,7 +176,7 @@ https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-h0c5db8f_5.conda#94 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_0.conda#ae5f4ad87126c55ba3f690ef07f81d64 -https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda#06006184e203b61d3525f90de394471e +https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481c9de49f040272556e2cedf42816 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b @@ -205,7 +205,7 @@ https://conda.anaconda.org/conda-forge/noarch/dodgy-0.2.1-py_0.tar.bz2#62a69d073 https://conda.anaconda.org/conda-forge/noarch/ecmwf-api-client-1.6.3-pyhd8ed1ab_0.tar.bz2#15621abf59053e184114d3e1d4f9d01e https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-1.1.0-pyhd8ed1ab_0.conda#a2f2138597905eaa72e561d8efb42cf3 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_0.conda#f6c211fee3c98229652b60a9a42ef363 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2#348e27e78a5e39090031448c72f66d5e https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 @@ -232,7 +232,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.1-hbf2b3c1_0.conda#4 https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.41.1-py311ha6695c7_0.conda#60fa8c1f3fb0d99dd10a9af2aff9c400 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/lxml-4.9.3-py311h1a07684_1.conda#aab51e50d994e58efdfa5382139b0468 -https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.2-py311h38e4bf4_1.conda#f8e0b648d77bbe44d1fe8af8cc56a590 +https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.3-py311h38e4bf4_0.conda#3910c815fc788621f88b2bdc0fa9f0a6 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_1.conda#71120b5155a0c500826cf81536721a15 https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2#34fc335fc50eef0b5ea708f2b5f54e0c https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed @@ -269,7 +269,7 @@ https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.16.2-py311h46250e7_0.c https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py311h459d7ec_2.conda#56bc3fe5180c0b23e05c7a5708153ac7 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df -https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.2-py311h459d7ec_0.conda#d6478cbce002db6303f0d749860f3e22 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 @@ -281,15 +281,15 @@ https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.4.4-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.11.0-h00ab1b0_0.conda#fde515afbbe6e36eb4564965c20b1058 https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f https://conda.anaconda.org/conda-forge/noarch/tenacity-8.2.3-pyhd8ed1ab_0.conda#1482e77f87c6a702a7e05ef22c9b197b -https://conda.anaconda.org/conda-forge/noarch/termcolor-2.3.0-pyhd8ed1ab_0.conda#440d508f025b1692168caaf436504af3 +https://conda.anaconda.org/conda-forge/noarch/termcolor-2.4.0-pyhd8ed1ab_0.conda#a5033708ad9283907c3b1bc1f90d0d0d https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.2.0-pyha21a80b_0.conda#978d03388b62173b8e6f79162cf52b86 https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda#074d0ce7a6261ab8b497c3518796ef3e https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py311h459d7ec_1.conda#a700fcb5cedd3e72d0c75d095c7a6eda -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.0-pyhd8ed1ab_0.conda#886f4a84ddb49b943b1697ac314e85b3 -https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2023.11.29-pyhd8ed1ab_0.conda#b355907cec4e6a516f2909396add77c8 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.1-pyhd8ed1ab_0.conda#1c6acfdc7ecbfe09954c4216da99c146 +https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.1.8-pyhd8ed1ab_0.conda#b120d43603f9b021d252fb7754b35557 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.9.0-pyha770c72_0.conda#a92a6440c3fe7052d63244f3aba2a4a7 https://conda.anaconda.org/conda-forge/linux-64/ujson-5.9.0-py311hb755f60_0.conda#36dda52dc99a4fb9cadd3b738ec24848 https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-py_0.tar.bz2#1447ead40f2a01733a9c8dfc32988375 @@ -336,7 +336,7 @@ https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda#4da50d410f553db77e62ab62ffaa1abc -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.6.0-py311h38be061_0.conda#20290b0ac04a80c0d84d833fff1c0fd7 +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.1-py311h38be061_0.conda#175a430872841f7c351879f4c4c85b9e https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_0.conda#3f0915b1fb2252ab73686a533c5f9d3f https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 @@ -359,7 +359,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.0.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.4-pyhd8ed1ab_0.conda#a9d145de8c5f064b5fa68fb34725d9f4 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.1-pyhd8ed1ab_0.conda#4dc77041fea14c63ecea50ce0eb92873 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.32.0-pyhd8ed1ab_0.conda#a7b5a535cd614e384594530aee7e6061 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.32.1-pyhd8ed1ab_0.conda#753a592b4e99d7d2cde6a8fd0797f414 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-py_2.tar.bz2#a11f356d6f93b74b4a84e9501afd48b4 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.5-py311h459d7ec_0.conda#1101ec27377f8e45d8431a5f21d744f1 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 @@ -380,13 +380,13 @@ https://conda.anaconda.org/conda-forge/linux-64/arpack-3.7.0-hdefa2d7_2.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.13-heb0bb06_2.conda#c0866da05d5e7bb3a3f6b68bcbf7537b https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.3-pyhd8ed1ab_0.conda#91fc4700dcce4a46d439900a132fe4e5 https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.7-py311hcb13ee4_1.conda#ca6e04ac7262ecaec846e483d6fdc6c8 -https://conda.anaconda.org/conda-forge/noarch/django-5.0-pyhd8ed1ab_0.conda#9af5d8131de6eb7b0f2f167fba3bdff7 +https://conda.anaconda.org/conda-forge/noarch/django-5.0.1-pyhd8ed1ab_0.conda#1e9684296d2b6082dc5c436af3713ad1 https://conda.anaconda.org/conda-forge/noarch/flake8-5.0.4-pyhd8ed1ab_0.tar.bz2#8079ea7dec0a917dd0cb6c257f7ea9ea https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/funcargparse-0.2.5-pyhd8ed1ab_0.tar.bz2#e557b70d736251fa0bbb7c4497852a92 https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.1-h22adcc9_11.conda#514167b60f598eaed3f7a60e1dceb9ee https://conda.anaconda.org/conda-forge/linux-64/git-2.42.0-pl5321h86e50cf_0.conda#96ad24c67e0056d171385859c43218a2 -https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.40-pyhd8ed1ab_0.conda#6bf74c3b7c13079a91d4bd3da51cefcf +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.41-pyhd8ed1ab_0.conda#84874a90c312088f7b5e63402fc44a58 https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-7.3.0-hdb3a94d_0.conda#765bc76c0dfaf24ff9d8a2935b2510df https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-h8b5b2df_13.conda#29a96d50cb53638a5b4806b5ca6e4b1d @@ -395,7 +395,7 @@ https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12. https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.1-h3845be2_3.conda#f38e5e47f62d6633166040192ad420a1 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0f3d0bb_105.conda#b5d412441b84305460e9df8a016a3392 https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.0.1-hca56755_27.conda#918a735059cab21b96fc13a8d04fbcd8 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.2-py311h64a7726_0.conda#fd2f142dcd680413b5ede5d0fb799205 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.3-py311h64a7726_0.conda#231eef4f33640338f64ef9ab690ba08d https://conda.anaconda.org/conda-forge/linux-64/poppler-23.05.0-hd18248d_1.conda#09e0de1aa7330fe697eed76eaeef666d https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.3.2-pyhd8ed1ab_0.conda#d55cd7adfc98beaef0c717c61fa3d294 https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba @@ -422,7 +422,7 @@ https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.ta https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.12.1-pyhd8ed1ab_0.conda#bf6ad72d882bc3f04e6a0fb50fd2cce8 -https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.0-py_0.tar.bz2#6e166cd37cfeadefcfca1ffe00f222bb +https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhca7485f_0.conda#3639cf1ff1d1368fead4d4f5d671d09a https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe https://conda.anaconda.org/conda-forge/noarch/identify-2.5.33-pyhd8ed1ab_0.conda#93c8f8ceb83827d88deeba796f07fba7 https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2023.8.12-py311h67b54e4_0.conda#363e5c2f2c67ff69d717aba54422b03d @@ -438,7 +438,7 @@ https://conda.anaconda.org/conda-forge/linux-64/numba-0.58.1-py311h96b013e_0.con https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.12.1-py311hb755f60_0.conda#38a2ff8ea433fe8792279b45e84b3730 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py311h320fe9a_0.conda#e44ccb61b6621bf3f8053ae66eba7397 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-heaa33ce_1.conda#cde553e0e32389e26595db4eacf859eb -https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.5-pyhd8ed1ab_0.conda#f266f66ba1dcae0dbcc771a491acbea4 +https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.0-pyhd8ed1ab_0.conda#134b2b57b7865d2316a7cce1915a51ed https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.3.0-pyhd8ed1ab_0.conda#7819533e674dbbc51468f3228b9b1bb6 @@ -452,7 +452,7 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311h54d622a_1.co https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-py_0.tar.bz2#cb83a3d6ecf73f50117635192414426a https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h43474b4_0.conda#fd815765a86daf44db1e15c6f6edf5e6 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-hbc2ea52_17.conda#452c7b08c21eea2ef01f4fd364d6affc -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.3.2-pyhd8ed1ab_0.conda#c02a7e79365121bd3bcc25f1b65f48a9 +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.3.3-pyhd8ed1ab_0.conda#e6b7ca7e29811c2f72f93e8188171caa https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b https://conda.anaconda.org/conda-forge/noarch/distributed-2023.12.1-pyhd8ed1ab_0.conda#6b31b9b627f238a0068926d5650ae128 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.30.2-h1f30a5c_0.conda#21ee8444a7f629924ea8cfe52a622cbd @@ -473,7 +473,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h1f0f https://conda.anaconda.org/conda-forge/linux-64/r-base-4.1.3-hfabd6f2_9.conda#0ab4cf54fbddc0cc9ff260c6f77f8c84 https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.8-py311h41e4db2_0.conda#b35deb26af1d7e0d98438c8ac5c6b7b2 https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.3.2-py311hc009520_2.conda#9821f8e497a791858226f535e5e0be62 -https://conda.anaconda.org/conda-forge/noarch/sparse-0.14.0-pyhd8ed1ab_0.conda#ee01b310177a0612554b9d20e537fdbe +https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.1-pyhd8ed1ab_0.conda#84a76fbe19aae30e13fa99265421ea5d https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.1-py311h1f0f07a_0.conda#11ea602c16ad004033edf648ce054f9e https://conda.anaconda.org/conda-forge/noarch/tifffile-2023.12.9-pyhd8ed1ab_0.conda#454bc0aff84f35fa53ba9e0369737a9b https://conda.anaconda.org/conda-forge/noarch/xarray-2023.12.0-pyhd8ed1ab_0.conda#e9b31d3ab1b0dd5fd8c24419f6560b90 @@ -559,17 +559,17 @@ https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.39-r41ha503ecb_0.conda# https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r41hc72bb7e_1.tar.bz2#921c0ef7104d8df0ab506f1bb81a062c https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.7-r41h133d619_0.conda#4af88071a607237aa73a3cbd51788a39 https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.22.0-py311h320fe9a_2.conda#e94b7f09b52628b89e66cdbd8c3029dd -https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.0-pyhd8ed1ab_0.conda#082666331726b2438986cfe33ae9a8ee +https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.1-pyhd8ed1ab_0.conda#c1c0e175f993a4677c3163b26652b96c https://conda.anaconda.org/conda-forge/linux-64/cdo-2.2.0-he026af2_4.conda#6c00b0a21b3de8a149eee137e83465d3 https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_15-pl5321hf48ede7_0.conda#53c9f7169b61e615d5f41c8d70a72c00 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.13.1-pyhd8ed1ab_0.conda#165cac4486f9e8542f0b8de32822f328 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.14.0-pyhd8ed1ab_0.conda#bf099b894a9fd1dc65c881940a2f4e69 https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.4.1-py311h38be061_2.tar.bz2#4c9101d329f6bc09c2617a80e3eb9c89 https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.6.6-pyhd8ed1ab_0.conda#255f9eac03143526c8aed41d1d091c63 https://conda.anaconda.org/conda-forge/linux-64/pyarrow-12.0.1-py311h39c9aba_7_cpu.conda#d513ab8d10ec5f3ee45b419c836195ec -https://conda.anaconda.org/conda-forge/linux-64/pydot-1.4.2-py311h38be061_4.conda#5c223cb0d9c05552bf9d1586a92720b2 +https://conda.anaconda.org/conda-forge/linux-64/pydot-2.0.0-py311h38be061_0.conda#cdfd23a54a18f3c8d5320d7717f4ed52 https://conda.anaconda.org/conda-forge/linux-64/r-askpass-1.1-r41h06615bd_3.tar.bz2#c8ec8683302ad9a2345cb31ab28e6c6b https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.1-r41h7525677_1.tar.bz2#6a956b57b027b49b7a9ca48031a8bbd6 https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.2.0-r41h57805ef_0.conda#dc314ad76563387e70e0117c5398a15a @@ -596,10 +596,10 @@ https://conda.anaconda.org/conda-forge/linux-64/r-spam-2.9_1-r41hb20cf53_1.conda https://conda.anaconda.org/conda-forge/linux-64/r-timechange-0.2.0-r41h38f115c_0.conda#04a4229419d779a1e27395d70d493571 https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.4-r41h1ad5fc0_1.conda#82c1446591783493d65273a158e8ce28 https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r41h133d619_0.conda#1d432d2eba171727afd03507faa5e2f6 -https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.0-hd8ed1ab_0.conda#ebd31a95a7008b7e164dad9dbbb5bb5a +https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.1-hd8ed1ab_0.conda#8d9b6f5e94b7840210b2b9ed235068c7 https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.2-pyhd8ed1ab_0.conda#8e765a0eca0ce1cfa889cd9af82a23a8 https://conda.anaconda.org/conda-forge/linux-64/xgboost-2.0.3-cuda118_py311h0be3a32_0.conda#f3ef3a16aa577a4daf0f8aec6306d1ab -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.13.1-pyhd8ed1ab_0.conda#b97a845d8ee2502842873e7e9d59eb97 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.14.0-pyhd8ed1ab_0.conda#fe3613d8ff5d0553ae7097ffcd364fdd https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 https://conda.anaconda.org/conda-forge/noarch/psy-maps-1.4.2-pyhd8ed1ab_0.tar.bz2#3ed13103dfd46f71dc870d188bd0b276 https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.4.0-py311h38be061_3.conda#6f7871722c07922028043144e8873b37 @@ -623,7 +623,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r41ha5 https://conda.anaconda.org/conda-forge/linux-64/r-splancs-2.01_43-r41h8da6f51_1.tar.bz2#3a6aad0706541141d10e3b514467a080 https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.2-r41ha503ecb_0.conda#1f7610a1863648cab254a9f85bd29dcd https://conda.anaconda.org/conda-forge/noarch/dask-2023.12.1-pyhd8ed1ab_0.conda#9a6e8eb1d188bc246883ea11f4fe6a4d -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.13.1-pyhd8ed1ab_0.conda#ee7bb8530ad5bda21f34ec6b16d218fc +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.14.0-pyhd8ed1ab_0.conda#c48d304428e46ec8d597fd483256e74f https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.0-r41hc72bb7e_1005.tar.bz2#800e1da5bf774be48934b8865dd78d33 https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r41hc72bb7e_1004.tar.bz2#71ebed7e976df735ff3443bb88bd154f https://conda.anaconda.org/conda-forge/noarch/r-httr-1.4.6-r41hc72bb7e_0.conda#53dbb769c96782db54bf2d414fc9b239 @@ -651,7 +651,7 @@ https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.0.2-r41hc72bb7e_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r41hc72bb7e_1.tar.bz2#2253f130c8dab435824d6ddb10a41c73 https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.6-pyhd8ed1ab_0.tar.bz2#4409dd7e06a62c3b2aa9e96782c49c6d https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.3-pyhd8ed1ab_0.conda#0dbaa7d08d3d79b2a1a4dd6a02cc4581 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.14.4-pyhd8ed1ab_0.conda#c79b8443908032263ffb40ee6215e9e4 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.1-pyhd8ed1ab_0.conda#0fabe529030c483e4d9eb885667ce47f https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.7-pyhd8ed1ab_0.conda#aebfabcb60c33a89c1f9290cab49bc93 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.5-pyhd8ed1ab_0.conda#ebf08f5184d8eaa486697bc060031953 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.4-pyhd8ed1ab_0.conda#a9a89000dfd19656ad004b937eeb6828 From 9a8f66d6e6e87c217a409c00d8f435fa24a62196 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Thu, 18 Jan 2024 17:02:15 +0100 Subject: [PATCH 39/39] Fix a typo in the references file (#3499) --- esmvaltool/config-references.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esmvaltool/config-references.yml b/esmvaltool/config-references.yml index 16725c3764..285ace740e 100644 --- a/esmvaltool/config-references.yml +++ b/esmvaltool/config-references.yml @@ -361,7 +361,7 @@ authors: malinina_elizaveta: name: Malinina, Elizaveta institute: CCCma, Canada - orchid: https://orcid.org/0000-0002-4102-2877 + orcid: https://orcid.org/0000-0002-4102-2877 github: malininae maloney_eric: name: Maloney, Eric