From dfa98e59b8240c51c50de276f89765c5dd898cbd Mon Sep 17 00:00:00 2001 From: Klaus Zimmermann Date: Wed, 29 May 2024 13:48:13 +0200 Subject: [PATCH 01/17] Add AERONET cmorizer (#3227) Co-authored-by: Alistair Sellar <16133375+alistairsellar@users.noreply.github.com> Co-authored-by: Birgit Hassler <33543691+hb326@users.noreply.github.com> Co-authored-by: Joakim Low Co-authored-by: Valeriu Predoi --- doc/sphinx/source/input.rst | 2 + environment.yml | 1 + environment_osx.yml | 1 + .../cmorizers/data/cmor_config/AERONET.yml | 28 ++ esmvaltool/cmorizers/data/datasets.yml | 7 + .../data/downloaders/datasets/aeronet.py | 38 ++ .../data/formatters/datasets/aeronet.py | 410 ++++++++++++++++++ esmvaltool/cmorizers/data/utilities.py | 2 +- .../recipes/examples/recipe_check_obs.yml | 11 +- esmvaltool/references/aeronetv3.bibtex | 6 + setup.py | 3 +- 11 files changed, 505 insertions(+), 4 deletions(-) create mode 100644 esmvaltool/cmorizers/data/cmor_config/AERONET.yml create mode 100644 esmvaltool/cmorizers/data/downloaders/datasets/aeronet.py create mode 100755 esmvaltool/cmorizers/data/formatters/datasets/aeronet.py create mode 100644 esmvaltool/references/aeronetv3.bibtex diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index 481cd066a7..c6bc77d614 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -232,6 +232,8 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | Dataset | Variables (MIP) | Tier | Script language | +==============================+======================================================================================================+======+=================+ +| AERONET | od440aer, od550aer, od870aer (AERmon) | 3 | Python | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | AGCD | pr (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ANU Climate | pr, tas, tasmin, tasmax (Amon) | 3 | Python | diff --git a/environment.yml b/environment.yml index ad4666aadd..547aaecec1 100644 --- a/environment.yml +++ b/environment.yml @@ -25,6 +25,7 @@ dependencies: - esmvalcore 2.10.* - fiona - fire + - fsspec - gdal - iris >=3.6.1 - iris-esmf-regrid >=0.7.0 diff --git a/environment_osx.yml b/environment_osx.yml index 290adb6b1c..809cb09346 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -24,6 +24,7 @@ dependencies: - esmpy !=8.1.0,<8.6.0 # https://github.com/SciTools-incubator/iris-esmf-regrid/pull/342#issuecomment-2092921514 - esmvalcore 2.10.* - fiona + - fsspec - fire - gdal - iris >=3.6.1 diff --git a/esmvaltool/cmorizers/data/cmor_config/AERONET.yml b/esmvaltool/cmorizers/data/cmor_config/AERONET.yml new file mode 100644 index 0000000000..33ae35879d --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/AERONET.yml @@ -0,0 +1,28 @@ +--- +# Filename +filename: 'AOD_Level20_Monthly_V3.tar.gz' + +# Common global attributes for Cmorizer output +attributes: + dataset_id: AERONET + version: 20230610 + tier: 3 + modeling_realm: atmos + project_id: OBS6 + source: 'https://aeronet.gsfc.nasa.gov/new_web/download_all_v3_aod.html' + reference: 'aeronetv3' + comment: + 'Notice to users: this data has recommended guidelines for use and publication, + please refer to https://aeronet.gsfc.nasa.gov/new_web/data_usage.html.' + +# Variables to cmorize +variables: + od440aer: + mip: AERmon + wavelength: 440 + od550aer: + mip: AERmon + wavelength: 551 + od870aer: + mip: AERmon + wavelength: 870 diff --git a/esmvaltool/cmorizers/data/datasets.yml b/esmvaltool/cmorizers/data/datasets.yml index 47632da653..1d1e90aaaf 100644 --- a/esmvaltool/cmorizers/data/datasets.yml +++ b/esmvaltool/cmorizers/data/datasets.yml @@ -1,6 +1,13 @@ # Dataset information --- datasets: + AERONET: + tier: 3 + source: "https://aeronet.gsfc.nasa.gov/" + last_access: 2023-06-13 + info: | + Aerosol Optical Depth information from a worldwide network of stations. + AGCD: tier: 2 source: "http://dx.doi.org/10.25914/6009600786063" diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/aeronet.py b/esmvaltool/cmorizers/data/downloaders/datasets/aeronet.py new file mode 100644 index 0000000000..668a688bb6 --- /dev/null +++ b/esmvaltool/cmorizers/data/downloaders/datasets/aeronet.py @@ -0,0 +1,38 @@ +"""Script to download Aeronet from its webpage.""" +import logging + +from esmvaltool.cmorizers.data.downloaders.wget import WGetDownloader + +logger = logging.getLogger(__name__) + + +def download_dataset(config, dataset, dataset_info, start_date, end_date, + overwrite): + """Download dataset. + + Parameters + ---------- + config : dict + ESMValTool's user configuration + dataset : str + Name of the dataset + dataset_info : dict + Dataset information from the datasets.yml file + start_date : datetime + Start of the interval to download + end_date : datetime + End of the interval to download + overwrite : bool + Overwrite already downloaded files + """ + downloader = WGetDownloader( + config=config, + dataset=dataset, + dataset_info=dataset_info, + overwrite=overwrite, + ) + filename = "AOD_Level20_Monthly_V3.tar.gz" + downloader.download_file( + f"https://aeronet.gsfc.nasa.gov/data_push/V3/AOD/{filename}", + wget_options=[], + ) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/aeronet.py b/esmvaltool/cmorizers/data/formatters/datasets/aeronet.py new file mode 100755 index 0000000000..215c67d7a8 --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/aeronet.py @@ -0,0 +1,410 @@ +"""ESMValTool CMORizer for Aeronet data. + +Tier + Tier 3: restricted dataset. + +Source + https://aeronet.gsfc.nasa.gov/ + +Last access + 20230613 + +Download and processing instructions + Download the following file: + https://aeronet.gsfc.nasa.gov/data_push/V3/AOD/AOD_Level20_Monthly_V3.tar.gz +""" + +import logging +import os.path +import re +from datetime import datetime +from typing import NamedTuple + +import cf_units +import dask.array as da +import iris +import iris.coords +import iris.cube +import numpy as np +import pandas as pd +from fsspec.implementations.tar import TarFileSystem +from pys2index import S2PointIndex + +from esmvaltool.cmorizers.data import utilities as utils + +logger = logging.getLogger(__name__) + +AERONET_HEADER = "AERONET Version 3;" +LEVEL_HEADER = "Version 3: AOD Level 2.0" +LEVEL_DESCRIPTION = ( + "The following data are automatically cloud cleared and quality assured " + "with pre-field and post-field calibration applied.") +UNITS_HEADER = ( + "UNITS can be found at,,, https://aeronet.gsfc.nasa.gov/new_web/units.html" +) +DATA_QUALITY_LEVEL = "lev20" + +CONTACT_PATTERN = re.compile( + "Contact: PI=(?P[^;]*); PI Email=(?P.*)") + + +def compress_column(data_frame, name): + """Assert all values in DataFrame column are equal, and return value.""" + compressed = data_frame.pop(name).unique() + if len(compressed) != 1: + raise ValueError( + f"Data frame column '{name}' must only contain" + f" one unique value, found {len(compressed)}" + ) + return compressed[0] + + +class AeronetStation(NamedTuple): + """AERONET station data.""" + + station_name: str + latitude: float + longitude: float + elevation: float + contacts: str + data_frame: pd.DataFrame + + +class AeronetStations(NamedTuple): + """AERONET station data lists.""" + + station_name: list[str] + latitude: list[float] + longitude: list[float] + elevation: list[float] + contacts: list[str] + data_frame: list[pd.DataFrame] + + +def parse_contact(contact): + """Parse and reformat contact information in AERONET file.""" + match = CONTACT_PATTERN.fullmatch(contact) + if match is None: + raise RuntimeError(f"Could not parse contact line {contact}") + names = match.group("names").replace("_", " ").split(" and ") + emails = match.group("emails").split("_and_") + mailboxes = ", ".join([ + f'"{name}" <{email}>' for name, email in zip(names, emails) + ]) + return mailboxes + + +def load_file(filesystem, path_like): + """Load AERONET data from fsspec filesystem instance.""" + with filesystem.open(path_like, mode="rt", encoding="iso-8859-1") as file: + aeronet_header = file.readline().strip() + if aeronet_header != AERONET_HEADER: + raise ValueError( + f"File header identifier is '{aeronet_header}'," + f" expected '{AERONET_HEADER}'" + ) + station_name = file.readline().strip() + level_header = file.readline().strip() + if level_header != LEVEL_HEADER: + raise ValueError( + f"File level string is '{level_header}'," + f" expected '{LEVEL_HEADER}'" + ) + level_description = file.readline().strip() + if level_description != LEVEL_DESCRIPTION: + raise ValueError( + f"File data description string is" + f" '{level_description}', expected '{LEVEL_DESCRIPTION}'" + ) + contact_string = file.readline().strip() + units_header = file.readline().strip() + if units_header != UNITS_HEADER: + raise ValueError( + f"File units info string is '{units_header}'," + f" expected '{UNITS_HEADER}'" + ) + data_frame = pd.read_csv( + file, + index_col=0, + na_values=-999.0, + date_format="%Y-%b", + parse_dates=[0], + usecols=lambda x: "AOD_Empty" not in x, + ) + contacts = parse_contact(contact_string) + elevation = compress_column(data_frame, "Elevation(meters)") + latitude = compress_column(data_frame, "Latitude(degrees)") + longitude = compress_column(data_frame, "Longitude(degrees)") + data_quality_level = compress_column(data_frame, "Data_Quality_Level") + if data_quality_level != DATA_QUALITY_LEVEL: + raise ValueError( + f"File data quality level is '{data_quality_level}'," + f" expected '{DATA_QUALITY_LEVEL}'" + ) + station = AeronetStation( + station_name, + latitude, + longitude, + elevation, + contacts, + data_frame, + ) + return station + + +def sort_data_columns(columns): + """Sort AOD station data columns.""" + data_columns = [c for c in columns if "NUM_" not in c] + if len(columns) != 3 * len(data_columns): + raise ValueError( + "Station data contains unexpected number of columns." + ) + aod_columns = [c for c in data_columns if c.startswith("AOD_")] + precipitable_water_columns = [ + c for c in data_columns if c == "Precipitable_Water(cm)" + ] + angstrom_exponent_columns = [ + c for c in data_columns if "_Angstrom_Exponent" in c + ] + if len(data_columns) != (len(aod_columns) + + len(precipitable_water_columns) + + len(angstrom_exponent_columns)): + raise ValueError( + "Station data contains unexpected number of columns." + ) + return (aod_columns, precipitable_water_columns, angstrom_exponent_columns) + + +def merge_stations(stations): + """Collect and merge station data into AeronetStations instance.""" + columns = {} + for name, dtype in ( + ("station_name", str), + ("latitude", np.float64), + ("longitude", np.float64), + ("elevation", np.float64), + ("contacts", str), + ("data_frame", object), + ): + columns[name] = np.array( + [getattr(station, name) for station in stations], + dtype=dtype, + ) + return AeronetStations(**columns) + + +def assemble_cube(stations, idx, wavelengths=None): + """Assemble Iris cube with station data. + + Parameters + ---------- + stations : AeronetStations + Station data + idx : int + Unique ids of all stations + wavelengths : list, optional + Wavelengths to include in data. + + Returns + ------- + Iris cube + Iris cube with station data. + + Raises + ------ + ValueError + If station data has inconsistent variable names. + """ + min_time = np.array([df.index.min() for df in stations.data_frame]).min() + max_time = np.array([df.index.max() for df in stations.data_frame]).max() + date_index = pd.date_range(min_time, max_time, freq="MS") + data_frames = [df.reindex(index=date_index) for df in stations.data_frame] + all_data_columns = np.unique( + np.array([df.columns for df in data_frames], dtype=str), + axis=0, + ) + if len(all_data_columns) != 1: + raise ValueError( + "Station data frames has different sets of column names." + ) + aod_columns, _, _ = sort_data_columns(all_data_columns[0]) + if wavelengths is None: + wavelengths = sorted([int(c[4:-2]) for c in aod_columns]) + + aod = da.stack([ + da.stack([df[f"AOD_{wl}nm"].values for wl in wavelengths], axis=-1) + for df in data_frames + ], axis=-1)[..., idx] + num_days = da.stack([ + da.stack([ + df[f"NUM_DAYS[AOD_{wl}nm]"].values.astype(np.float32) + for wl in wavelengths + ], axis=-1) for df in data_frames + ], axis=-1)[..., idx] + num_points = da.stack([ + da.stack([ + df[f"NUM_POINTS[AOD_{wl}nm]"].values.astype(np.float32) + for wl in wavelengths + ], axis=-1) for df in data_frames + ], axis=-1)[..., idx] + + wavelength_points = da.array(wavelengths, dtype=np.float64) + wavelength_coord = iris.coords.DimCoord( + points=wavelength_points, + standard_name="radiation_wavelength", + long_name="Wavelength", + var_name="wl", + units="nm", + ) + times = date_index.to_pydatetime() + time_points = np.array( + [datetime(year=t.year, month=t.month, day=15) for t in times]) + time_bounds_lower = times + time_bounds_upper = np.array([ + datetime(year=t.year + (t.month == 12), + month=t.month + 1 - (t.month == 12) * 12, + day=1) for t in times + ]) + time_bounds = np.stack([time_bounds_lower, time_bounds_upper], axis=-1) + time_units = cf_units.Unit("days since 1850-01-01", calendar="standard") + time_coord = iris.coords.DimCoord( + points=time_units.date2num(time_points), + standard_name="time", + long_name="time", + var_name="time", + units=time_units, + bounds=time_units.date2num(time_bounds), + ) + index_coord = iris.coords.DimCoord( + points=da.arange(aod.shape[-1]), + standard_name=None, + long_name="Station index (arbitrary)", + var_name="station_index", + units="1", + ) + name_coord = iris.coords.AuxCoord( + points=stations.station_name[idx], + standard_name="platform_name", + long_name="Aeronet Station Name", + var_name="station_name", + ) + elevation_coord = iris.coords.AuxCoord( + points=stations.elevation[idx], + standard_name="height_above_mean_sea_level", + long_name="Elevation", + var_name="elev", + units="m", + ) + latitude_coord = iris.coords.AuxCoord( + points=stations.latitude[idx], + standard_name="latitude", + long_name="Latitude", + var_name="lat", + units="degrees_north", + ) + longitude_coord = iris.coords.AuxCoord( + points=stations.longitude[idx], + standard_name="longitude", + long_name="Longitude", + var_name="lon", + units="degrees_east", + ) + num_days_ancillary = iris.coords.AncillaryVariable( + data=da.ma.masked_array(num_days, da.isnan(num_days), + fill_value=1.e20), + standard_name=None, + long_name="Number of days", + var_name="num_days", + units="1", + ) + num_points_ancillary = iris.coords.AncillaryVariable( + data=da.ma.masked_array(num_days, + da.isnan(num_points), + fill_value=1.e20), + standard_name="number_of_observations", + long_name="Number of observations", + var_name="num_points", + units="1", + ) + cube = iris.cube.Cube( + data=da.ma.masked_array(aod, da.isnan(aod), fill_value=1.e20), + standard_name=( + "atmosphere_optical_thickness_due_to_ambient_aerosol_particles"), + long_name="Aerosol Optical Thickness", + var_name="aod", + units="1", + dim_coords_and_dims=[ + (time_coord, 0), + (wavelength_coord, 1), + (index_coord, 2), + ], + aux_coords_and_dims=[ + (latitude_coord, 2), + (longitude_coord, 2), + (elevation_coord, 2), + (name_coord, 2), + ], + ancillary_variables_and_dims=[ + (num_days_ancillary, (0, 1, 2)), + (num_points_ancillary, (0, 1, 2)), + ], + ) + return cube + + +def build_cube(filesystem, paths, wavelengths=None): + """Build station data cube.""" + individual_stations = [ + load_file(filesystem, file_path) for file_path in paths + ] + stations = merge_stations(individual_stations) + latlon_points = np.stack([stations.latitude, stations.longitude], axis=-1) + index = S2PointIndex(latlon_points) + cell_ids = index.get_cell_ids() + idx = np.argsort(cell_ids) + cube = assemble_cube(stations, idx, wavelengths) + return cube + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Cmorization func call.""" + raw_filename = cfg['filename'] + + tar_file_system = TarFileSystem(f"{in_dir}/{raw_filename}") + paths = tar_file_system.glob("AOD/AOD20/MONTHLY/*.lev20") + versions = np.unique( + np.array([os.path.basename(p).split("_")[1] for p in paths], + dtype=str)) + if len(versions) != 1: + raise ValueError( + "All station datasets in tar file must have same version." + ) + version = versions[0] + wavelengths = sorted( + [var["wavelength"] for var in cfg['variables'].values()]) + cube = build_cube(tar_file_system, paths, wavelengths) + + attrs = cfg['attributes'].copy() + attrs['version'] = version + attrs['source'] = attrs['source'] + + # Run the cmorization + for (short_name, var) in cfg['variables'].items(): + logger.info("CMORizing variable '%s'", short_name) + + idx = wavelengths.index(var["wavelength"]) + sub_cube = cube[:, idx] + + attrs['mip'] = var['mip'] + # attrs['reference'] = var['reference'] + # Fix metadata + utils.set_global_atts(sub_cube, attrs) + + # Save variable + utils.save_variable( + sub_cube, + short_name, + out_dir, + attrs, + unlimited_dimensions=['time'], + ) diff --git a/esmvaltool/cmorizers/data/utilities.py b/esmvaltool/cmorizers/data/utilities.py index e31add6652..3620cee30e 100644 --- a/esmvaltool/cmorizers/data/utilities.py +++ b/esmvaltool/cmorizers/data/utilities.py @@ -495,7 +495,7 @@ def fix_dtype(cube): cube.dtype) cube.data = cube.core_data().astype(np.float32, casting='same_kind') for coord in cube.coords(): - if coord.dtype != np.float64: + if coord.dtype.kind != "U" and coord.dtype != np.float64: logger.info( "Converting data type of coordinate points of '%s' from '%s' " "to 'float64'", coord.name(), coord.dtype) diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index f92478bd9a..94e3aa1a42 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -27,7 +27,6 @@ diagnostics: type: ground, version: v2-0-1} scripts: null - BerkeleyEarth: description: BerkeleyEarth check variables: @@ -433,7 +432,7 @@ diagnostics: pr: additional_datasets: - {dataset: GPCP-SG, project: OBS, mip: Amon, tier: 2, type: atmos, - version: 2.3, start_year: 1979, end_year: 2022} + version: 2.3, start_year: 1979, end_year: 2022} scripts: null HadCRUT3: @@ -906,6 +905,14 @@ diagnostics: ### TIER 3 ################################################################## + AERONET: + description: Aeronet check + variables: + od440aer: + additional_datasets: + - {dataset: AERONET, project: OBS6, mip: AERmon, tier: 3, type: atmos, version: 20231021} + scripts: null + ANUClimate: description: ANUClimate check variables: diff --git a/esmvaltool/references/aeronetv3.bibtex b/esmvaltool/references/aeronetv3.bibtex new file mode 100644 index 0000000000..ac05ed0f31 --- /dev/null +++ b/esmvaltool/references/aeronetv3.bibtex @@ -0,0 +1,6 @@ +@misc{aeronetv3, + author = {}, + title = {}, + url = {https://aeronet.gsfc.nasa.gov/new_web/download_all_v3_aod.html}, + year = 2023 +} diff --git a/setup.py b/setup.py index cd278e50b1..84bd2a7c82 100755 --- a/setup.py +++ b/setup.py @@ -36,6 +36,7 @@ 'esmf-regrid>=0.7.0', 'fiona', 'fire', + 'fsspec', 'GDAL', 'jinja2', 'joblib', @@ -56,7 +57,7 @@ 'psy-reg', 'psy-simple', 'pyproj>=2.1', - # 'pys2index', # issues installing from PyPI (wheel doesn't build) + 'pys2index', 'python-dateutil', 'pyyaml', 'rasterio', From c04baad047d5914c6b65d1fab5909b6473f16282 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Thu, 30 May 2024 14:01:55 +0100 Subject: [PATCH 02/17] Fix `flake8==7` linting issues (#3634) --- .github/workflows/test-development.yml | 1 - .../diag_scripts/autoassess/stratosphere/strat_metrics_1.py | 4 ++-- tests/unit/test_lint.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test-development.yml b/.github/workflows/test-development.yml index 7ff8c93680..c75cd23cb8 100644 --- a/.github/workflows/test-development.yml +++ b/.github/workflows/test-development.yml @@ -12,7 +12,6 @@ on: push: branches: - main - - fix_recipe_filler_bkwds_incompatibility schedule: - cron: '0 0 * * *' diff --git a/esmvaltool/diag_scripts/autoassess/stratosphere/strat_metrics_1.py b/esmvaltool/diag_scripts/autoassess/stratosphere/strat_metrics_1.py index 91a2defcb5..4690741d39 100644 --- a/esmvaltool/diag_scripts/autoassess/stratosphere/strat_metrics_1.py +++ b/esmvaltool/diag_scripts/autoassess/stratosphere/strat_metrics_1.py @@ -276,8 +276,8 @@ def pnj_strength(cube, winter=True): """ # Extract regions of interest notrop = iris.Constraint(air_pressure=lambda p: p < 8000.) - nh_cons = iris.Constraint(latitude=lambda l: l > 0) - sh_cons = iris.Constraint(latitude=lambda l: l < 0) + nh_cons = iris.Constraint(latitude=lambda lat: lat > 0) + sh_cons = iris.Constraint(latitude=lambda lat: lat < 0) nh_tmp = cube.extract(notrop & nh_cons) sh_tmp = cube.extract(notrop & sh_cons) diff --git a/tests/unit/test_lint.py b/tests/unit/test_lint.py index ea49d6b069..5951a8f32a 100644 --- a/tests/unit/test_lint.py +++ b/tests/unit/test_lint.py @@ -67,5 +67,5 @@ def test_r_lint(monkeypatch): """)) print(ex.output) - assert False,\ + assert False, \ 'Your R code does not follow our formatting standards.' From 35b5c450dd22ffb1d84c9328168fe003faac2b81 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 31 May 2024 12:56:53 +0100 Subject: [PATCH 03/17] [Condalock] Update Linux condalock file (#3639) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 120 ++++++++++++++++++++++---------------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index f37c2e310d..f78d6a4b53 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: be61247fa188c644bffb3a402ab7a5b10c4294187450b4a075a088bde1255a2e +# input_hash: cfdd58f90c9dd54d431a8c5464e9bf2bd6e77d0043fa90f589789f5ed9b738a5 @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 @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed3 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-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-2.6.32-he073ed8_17.conda#d731b543793afc0433c4fd593e693fce -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda#10569984e7db886e4f1abc2b47ad79a1 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_1.conda#33b7851c39c25da14f6a233a8ccbeeca https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.85.0-ha770c72_1.conda#012455a6eddcbf487ef0ddd1715f0b80 https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.2.0-hceb6213_107.conda#2cc37ba482c6321237ce72329e1aaea2 https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.2.0-hceb6213_107.conda#2b409e9645fb3d69115d04496d1219cc @@ -26,11 +26,11 @@ https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda#abf3fec87c2563697defa759dec3d639 https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.12-he073ed8_17.conda#595db67e32b276298ff3d94d07d47fbf https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha885e6a_0.conda#800a4c872b5bc06fa83888d112fe6c4f +https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_1.conda#e901545940ebdc5c40017fab53642b3c https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.0-hac33072_0.conda#93a3bf248e5bc729807db198a9c89f07 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.17-h4ab18f5_0.conda#97d60c6b52391872febd35fab0a30159 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.19-h4ab18f5_0.conda#c6dedd5eab2236f4abb59ade9fb7fd44 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.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 @@ -40,7 +40,7 @@ https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda#985f2f453fb72408d6b6f1be0f324033 https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-he1b5a44_1004.tar.bz2#cddaf2c63ea4a5901cf09524c490ecdc -https://conda.anaconda.org/conda-forge/linux-64/ghostscript-10.03.0-h59595ed_0.conda#cb3c1aca441b476684b240ce43f767fd +https://conda.anaconda.org/conda-forge/linux-64/ghostscript-10.03.1-h59595ed_0.conda#be973b4541601270b77232bc46249a3a https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-h59595ed_1.conda#e358c7c5f6824c272b5034b3816438a7 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c @@ -74,7 +74,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar 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.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 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/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 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 https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 @@ -84,7 +84,7 @@ https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-h59595ed_1007.conda# https://conda.anaconda.org/conda-forge/linux-64/nccl-2.21.5.1-h6103f9b_0.conda#05381b62b2faed9609fb68b27cd575aa https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 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.3.0-hd590300_0.conda#c0f3abb4a16477208bbd43a39bd56f18 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda#12ea6d0d4ed54530eaed18e4835c1f7c 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.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h36c2ea0_1008.tar.bz2#fbef41ff6a4c8140c30057466a1cdd47 @@ -109,10 +109,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161 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.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.12-h2ba76a8_0.conda#da9257187c044a2a8f52507fea68a4c3 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-h36a0aea_4.conda#ce9d15eeabc21f9936410382e20c2908 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-h36a0aea_0.conda#2555c5ffa3a60fde5a940c5c9f4327cc -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h36a0aea_4.conda#bd99b76853edcc6fae6a901900bba995 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.14-h88a6e22_1.conda#7ed63b0e816dd1635903506ef5d2c079 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-h83b837d_6.conda#3e572eacd0ce99a59e1bb9c260ad5b20 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-h83b837d_2.conda#f40c698b4ea90f7fedd187c6639c818b +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h83b837d_6.conda#7995cb937bdac5913c8904fed6b3729d https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda#53fb86322bdb89496d7579fe3f02fd61 https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.2.0-h9eb54c0_7.conda#57f0fcb5d432d5f98be5705e2bf65352 https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.0-hed5481d_0.conda#a9ea19c48e11754899299f8123070f4e @@ -145,14 +145,14 @@ https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#829 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/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.13-he19d79f_0.conda#51db7e9c0cd527aea7691e7405df33bf +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.15-he19d79f_0.conda#4c7cc3fa1d2c5a63f9e2b1e2980a1672 https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.13.0-hd2e6256_0.conda#18f9348f064632785d54dbd1db9344bb https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.8-h96d4d28_0.conda#417d99cf69a0e6f40251815ca7622273 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.8-h21d4f22_5.conda#f9dd6e8a46f55f49eae5380d3b922b71 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/bwidget-1.9.14-ha770c72_1.tar.bz2#5746d6202ba2abad4a4707f2a2462795 @@ -164,7 +164,7 @@ https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-13.2.0-h7 https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.2.0-h2a599c4_7.conda#2ac5f82e4fd21f968b370e54bb839a4e https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-h3e53b52_1004.conda#c21dc684e0e8efa507aba61a030f65e7 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.2-h2aa1ff5_1.conda#3bf887827d1968275978361a6e405e4f +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.7.2-h65212e3_2.conda#01180180962748088e2b8c6c46f5a587 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda#72724f6a78ecb15559396966226d5838 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.10.0-default_h5622ce7_1001.conda#fc2d5b79c2d3f8568fbab31db7ae02f3 @@ -176,7 +176,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#6 https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.5-h0ab5242_0.conda#557396140c71eba588e96d597e0c61aa https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda#949c4a82290ee58b3c970cef4bcfd4ad -https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.0-h17fec99_1.conda#d2e0ffa6c3452f0a723a0ef1b96fd1cb +https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.1-h17fec99_1.conda#3bf65f0d8e7322a1cfe8b670fa35ec81 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.3-h2c6b66d_0.conda#be7d70f2db41b674733667bdd69bd000 @@ -189,8 +189,8 @@ https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8e 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-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 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.4.2-h161de36_10.conda#a7a334cb2d24e31a9bf0e7e3d01b14cb -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-h63f54a0_13.conda#dd5266145d7b778c9e9a0508a503e564 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-ha47c788_12.conda#8420d8e495a1468f593128e5fbf6748a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-h29d6fba_17.conda#c20a29ff47043ba1ec24f45dc68930bf https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py311h38be061_8.conda#5384590f14dfe6ccd02811236afc9f8e https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 @@ -199,7 +199,7 @@ https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#eb https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f -https://conda.anaconda.org/conda-forge/noarch/codespell-2.2.6-pyhd8ed1ab_0.conda#a206349b7bb7475ae580f987cb425bdd +https://conda.anaconda.org/conda-forge/noarch/codespell-2.3.0-pyhd8ed1ab_0.conda#6e67fa19bedafa7eb7d6ea91de53e03d https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 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 @@ -234,7 +234,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.10.0-py311h459d7ec_0.conda#d39020c78fd00ed774ff9c876e8aba07 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.4.0-h2c329e2_0.conda#80030debaa84cfc31755d53742df3ca6 @@ -276,7 +276,7 @@ https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.1-py311h5ecf98a_0.c https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py311h459d7ec_0.conda#7865c897d89a39abc0056d89e37bd9e9 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-69.5.1-pyhd8ed1ab_0.conda#7462280d81f639363e6e63c81276bd9e +https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 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 @@ -296,7 +296,7 @@ https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda# https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py311h459d7ec_0.conda#cc7727006191b8f3630936b339a76cd0 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.5.17-pyhd8ed1ab_0.conda#af83a15fac578ddf2a621ad195986c37 +https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.5.22-pyhd8ed1ab_0.conda#a887538e7f6697ed52a487dbaa0ebff5 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py311h4332511_0.conda#442a260df22ffad7f666c7e3f119b5ab https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-py_0.tar.bz2#1447ead40f2a01733a9c8dfc32988375 @@ -317,8 +317,8 @@ https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/asgiref-3.8.1-pyhd8ed1ab_0.conda#b5c2e1034ccc76fb14031637924880eb 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.20-h5f1c8d9_0.conda#418775183961dc1ee1c326a473118f98 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-hcc7299c_2.conda#7003778c651fa3ba815cfdf065d769af +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.22-h96bc93b_2.conda#de2b7c9aa9b279cca5542134b7a2b86a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-h759edc4_4.conda#8ced661d9dcece8698922fd8a73b6511 https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.11.1-h91d86a7_1.conda#2dbab1d281b7e1da05eee544cbdc8af6 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.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 @@ -329,17 +329,17 @@ 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.4.0-hbdc6101_1.conda#0ba5a427a51923dcdfe1121115ac8293 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.5.1-py311h331c9d8_0.conda#9f35e13e3b9e05e153b78f42662061f6 -https://conda.anaconda.org/conda-forge/linux-64/curl-8.7.1-hca28451_0.conda#d2dd5466be2ce818f8097847341da63d +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py311h331c9d8_0.conda#543dd05fd661e4e9c9deb3b37093d6a2 +https://conda.anaconda.org/conda-forge/linux-64/curl-8.8.0-he654da7_0.conda#042341d8b9ba4ee7f2722b81fae9f0ad https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.conda#13d385f635d7fbe9acc93600f67a6cb4 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.6.0-pyhd8ed1ab_0.conda#e9ed10aa8fa1dd6782940b95c942a6ae -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py311h459d7ec_0.conda#17e1997cc17c571d5ad27bd0159f616c +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.52.4-py311h331c9d8_0.conda#0a5e7e2aca2a4217b2036e0d661dcfb0 https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358c17429c97883b2cb9ab5f64bc161b https://conda.anaconda.org/conda-forge/linux-64/git-2.45.1-pl5321hef9f9f3_0.conda#b6b6729ba1bfc1f095e0336df6a705b5 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.3-nompi_h4f84152_101.conda#7e98860d08eea82c8057abd78864fcb4 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_102.conda#d8cb3688b92e891e1e5f613517a50ca8 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 @@ -352,7 +352,7 @@ https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar. https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 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.23.0-h9be4e54_1.conda#1042d8401bb268553f98e60120cdeb40 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.24.0-h2736e30_0.conda#34aeee3fa7fca5dc21fad3ac6f4f0ab2 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 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 @@ -388,7 +388,7 @@ https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py311h459d7ec_0.conda#fff0f2058e9d86c8bf5848ee93917a8d https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.5-py311h459d7ec_0.conda#0175d2636cc41dc019b51462c13ce225 https://conda.anaconda.org/conda-forge/linux-64/arpack-3.8.0-nompi_h0baa96a_101.tar.bz2#bad10a5b54a3aa9680c3ac1436b7e35d -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.8-h10bd90f_3.conda#f651b434355a203d2a3d0e4c4c329d9b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.9-h594631b_3.conda#47490db1dcddfb1c355251fc427746a6 https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.6.0-hf1915f5_1.conda#fd11ea65ceb397f9587b1d88a4329d73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.5.0-h94269e2_4.conda#f364272cb4c2f4ce2341067107b82865 https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.3-pyhd8ed1ab_0.conda#91fc4700dcce4a46d439900a132fe4e5 @@ -397,7 +397,7 @@ https://conda.anaconda.org/conda-forge/noarch/django-5.0.6-pyhd8ed1ab_0.conda#84 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-h928be8b_17.conda#4b2ca09b53e91b760cebcb397e386e87 +https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-h928be8b_0.conda#c0f2468661b7cae54a7a1ff11926e372 https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda#0b2154c1818111e17381b1df5b4b0176 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-8.5.0-hfac3d4d_0.conda#f5126317dd0ce0ba26945e411ecc6960 @@ -406,9 +406,9 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_ 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.3-hee9dde6_1.conda#c5b7b29e2b66107553d0366538257a51 https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_0.conda#a284ff318fbdb0dd83928275b4b6087c -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.23.0-hc7a4891_1.conda#ee99fb9107ffb579b58ee92a5fb14b06 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.24.0-h3d9a0c8_0.conda#a731371833a7b1ab3a87be0fe7e6235a https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h6f065fc_5.conda#f2e2bdd5fd10493a525503b2f40c59eb +https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h5539517_6.conda#1ee26233875c04444bdb2e5a838b5634 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/linux-64/poppler-24.04.0-hb6cd0d7_0.conda#d19eed746748f1d44b575662f2bcfe95 https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.4.2-pyhd8ed1ab_0.conda#aca82be28a1c676a3e0365e83892f412 @@ -422,13 +422,13 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.co 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.2.1-pyhd8ed1ab_0.conda#d657cde3b3943fcedf6038138eea84de 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/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 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-h5a4f163_3.conda#f363554b9084fb9d5e3366fbbc0d18e0 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f 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.26.8-h02fd9b4_10.conda#289d899cba63e36d6768988aac83fcd4 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.9-he3a8b3b_0.conda#fbe6a256dd70a505730e7c461cd37a35 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.10.0-h00ab1b0_1.conda#1e63d3866554a4d2e3d1cba5f21a2841 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h18e1886_1.conda#f1beb063aad4446eb146d8b88420a4ea https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc @@ -438,12 +438,12 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.1-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 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.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.1.1-py311hbe88301_6.conda#35b650abe6c0b4a08ba949ab58e5f9f4 +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.1.1-py311h60053b1_7.conda#a356a5387f463a9b3d7aca7d8696e77a https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda#bcf6a6f4c6889ca083e8d33afbafb8d5 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.22.0-pyhd8ed1ab_0.conda#b9661a4b1200d6bc7d8a4cdafdc91468 https://conda.anaconda.org/conda-forge/linux-64/julia-1.10.2-h5490d3b_0.conda#3ea0a02338d58ea113655bb22a524f58 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.1-pyhd8ed1ab_0.conda#c03972cfce69ad913d520c652e5ed908 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.1-pyhd8ed1ab_0.conda#4dff4abb5728f7662ecaaa8bee3a0260 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_hacb5139_103.conda#50f05f98d084805642d24dff910e11e8 @@ -460,12 +460,12 @@ https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py311h92ebd52_0. 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.2.0-pyhd8ed1ab_1.conda#f351ee57bb9c3e4b2f4952980461ba1d -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h517d4fd_1.conda#a86b8bea39e292a23b2cf9a750f49ea1 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py311h517d4fd_0.conda#764b0e055f59dbd7d114d32b8c6e55e6 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.4-py311h0bed3d6_1.conda#6fb2f733ef405b4bfb4a6a362703457e 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-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.267-h51dfee4_8.conda#188857656abd6d1a4dcc471c619b0de5 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-hba8bd5f_3.conda#720494d9f06b4aff1270cffb7acc7920 https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.1-pyhd8ed1ab_0.conda#0f8e0831bbf38d83973438ce9af9af9a https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.0.3-pyhd8ed1ab_0.conda#46b7eb9d2f3ca144f3195dc6aa7bdf93 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa @@ -486,21 +486,21 @@ https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.5.3-pyhd8ed1ab_0.t 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.3.3-hf0d99cb_1.conda#f8ee712096aa7cedd3eb8d19ade82374 -https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.2-py311he08f58d_1.conda#fd4a80e35c05513590b33c83fc81dcc7 -https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.2-pyhd8ed1ab_0.conda#76d59fb1768f242150cd3f28fc8b9f7b +https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.0-py311he08f58d_1.conda#d55e4dde3b30272090f33ddd367c580b +https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyhd8ed1ab_0.conda#846d12530687ba836791dd54db1f45c5 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py311h18e1886_0.conda#82c29bf38b3fb66da09736106609b5fe -https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.5.10-pyhd8ed1ab_0.conda#125438a8b679e4c08ee8f244177216c9 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.5.22-pyhd8ed1ab_0.conda#3930cabe8ca8c8594026fa8768cae75c https://conda.anaconda.org/conda-forge/noarch/xarray-2024.5.0-pyhd8ed1ab_0.conda#e839fd0ae78a368c930f0b1feafa6736 -https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.1-pyhd8ed1ab_0.conda#0f0db4b713b96c1a78cb92f7ead0a6a5 +https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.2-pyhd8ed1ab_0.conda#02f53038910b6fbc9d36bd5f663318e8 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.0-pyhd8ed1ab_0.conda#f7433e3bd2749b934ddf81451a45967d -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.0-pyhd8ed1ab_0.conda#33070a578d45591f242a254f78f86f10 +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.1-pyhd8ed1ab_0.conda#9b1ddfcc35856fbd69e193b945b7d7f2 https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.8.5-pyhd8ed1ab_0.conda#abfb434fb6654f83d740428863ec85a8 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/graphviz-9.0.0-h78e8752_1.conda#a3f4cd4a512ec5db35ffbf25ba11f537 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-16.1.0-hefa796f_1_cpu.conda#9b96a5f974932e802cdeda54733b4c53 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-16.1.0-hcb6531f_6_cpu.conda#0df3fc2a8d63b1cc49973c5a679ec438 https://conda.anaconda.org/conda-forge/linux-64/magics-4.15.4-h3aff5e6_0.conda#16b7a695334cb5a322045b8cb1eeb2d4 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 @@ -509,7 +509,7 @@ https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.0-py311h38be061_1.conda#e172dce6d5f3dbf0c8dfc537c8146be3 https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.0.3-cuda120_pyh3ef1b53_4.conda#101b6519015db5451632163bc6fed36a https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r43hc72bb7e_1005.conda#dd7719a32c342948c6fbafb13bd2ee03 -https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.4.1-r43h57805ef_2.conda#83adc11bcf92f4d3a565cd9c744c088f +https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.5.0-r43hb1dbf0f_0.conda#9f3376d466dc88a5a8f2b8cf3e052772 https://conda.anaconda.org/conda-forge/noarch/r-bigmemory.sri-0.1.8-r43hc72bb7e_0.conda#be78955142329022e2927b57b11e98fa https://conda.anaconda.org/conda-forge/linux-64/r-cli-3.6.2-r43ha503ecb_0.conda#7a325f68b1354c1a5261688b5e54d008 https://conda.anaconda.org/conda-forge/noarch/r-codetools-0.2_20-r43hc72bb7e_0.conda#6fd216ce15e662d68b5fa1c7e6c1a75d @@ -569,19 +569,19 @@ https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r43hc72bb7e_2 https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r43h57805ef_0.conda#41db1ee9d0073339e681379b92e7dfb6 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.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 -https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.23.0-h27f064a_0.conda#8a4a8fd1af3cfbdcb54ea7282965d91a +https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.23.0-hfa691db_2.conda#f9cd15d6c7deeeb5b60d65fac59b18bc https://conda.anaconda.org/conda-forge/linux-64/cdo-2.4.0-hd11aaf1_1.conda#a2dafc919de74991852d6449d24b0227 -https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_32-pl5321h0df52c9_0.conda#dc93a026fc95122e8c340fe6fc90970f +https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_33-pl5321h0df52c9_0.conda#62331cc714b179bcd87bb64d1e3e8811 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-16.1.0-hac33072_1_cpu.conda#fcdd73184457b7055f7ca16ffc6d6711 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-16.1.0-hac33072_6_cpu.conda#38b1161e2f8c72095f64ea35ee1294c5 https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.8.5-h77540a9_7.conda#5937eafdfa5713c78a21cbb33a84539e -https://conda.anaconda.org/conda-forge/linux-64/libparquet-16.1.0-h6a7eafb_1_cpu.conda#cb6a5bc92eac2f308c8fb6a2b1ff057c +https://conda.anaconda.org/conda-forge/linux-64/libparquet-16.1.0-h6a7eafb_6_cpu.conda#87f676c6cb33f8e1956948ee216fa3a1 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.16.4-pyhd8ed1ab_0.conda#43d9cd74e3950ab09cbddf36f1706b9f https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.5.0-py311h38be061_1.conda#0c795bac4990aec7adabb34caa9d3873 https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.7.0-pyhd8ed1ab_0.conda#7ad60b498674a9bff3ba8f3fb335e4f0 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-16.1.0-py311h8e2c35d_0_cpu.conda#c50b8f4436f4fc7b599122d14225322b +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-16.1.0-py311h8e2c35d_1_cpu.conda#b5c23417af8dab0136a260dbfb3c7380 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-bigmemory-4.6.4-r43ha503ecb_0.conda#8737c1d2787e754db2e88ef1610c737a https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.3.1-r43h57805ef_0.conda#b3e470863d9e21349b1a6c075b681901 @@ -591,7 +591,7 @@ https://conda.anaconda.org/conda-forge/noarch/r-desc-1.4.3-r43hc72bb7e_0.conda#3 https://conda.anaconda.org/conda-forge/linux-64/r-ellipsis-0.3.2-r43h57805ef_2.conda#10c5892991072cfa3a61489d2ac6ad66 https://conda.anaconda.org/conda-forge/noarch/r-elliptic-1.4_0-r43hc72bb7e_4.conda#16e4352829cf433be8884e27e1b8e4a1 https://conda.anaconda.org/conda-forge/noarch/r-foreach-1.5.2-r43hc72bb7e_2.conda#cf8d448c534caecc11d3999a041d4769 -https://conda.anaconda.org/conda-forge/noarch/r-highr-0.10-r43hc72bb7e_1.conda#323965ffc1eb89aab3f39096b3104869 +https://conda.anaconda.org/conda-forge/noarch/r-highr-0.11-r43hc72bb7e_0.conda#ecd3b95a01caa7bdcf63714427b5b88c https://conda.anaconda.org/conda-forge/noarch/r-lifecycle-1.0.4-r43hc72bb7e_0.conda#291d2fb68ea1b181644b40d6743ae000 https://conda.anaconda.org/conda-forge/linux-64/r-mapproj-1.2.11-r43h57805ef_1.conda#cb9973326cda79323ab1127d0006c3fd https://conda.anaconda.org/conda-forge/linux-64/r-matrix-1.6_5-r43h316c678_0.conda#8146ef1b3c54e1a484822085d39357b0 @@ -614,7 +614,7 @@ https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a7 https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.5-pyhd8ed1ab_0.conda#0f74ff434e03fa89315ec45ec1bc4284 https://conda.anaconda.org/conda-forge/noarch/xgboost-2.0.3-cuda120_pyh68bd8d9_4.conda#aaaadc3a408067943ebc10299393a7c3 https://conda.anaconda.org/conda-forge/linux-64/gdal-3.8.5-py311hf92cf48_7.conda#99b21fe537bd3afa6fc28949cc2d9ba5 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-16.1.0-hac33072_1_cpu.conda#855feea87f42887b22accedd41fa0755 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-16.1.0-hac33072_6_cpu.conda#2e9430df8ffd645a5bc7edffb252c3de https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_0.conda#391934bd1a79990c23df1d1809ddc821 https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-h41fde0b_52.conda#95107b6217e5c62d59103490428b4dc4 https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 @@ -627,7 +627,7 @@ https://conda.anaconda.org/conda-forge/noarch/r-doparallel-1.0.17-r43hc72bb7e_2. https://conda.anaconda.org/conda-forge/linux-64/r-e1071-1.7_14-r43ha503ecb_0.conda#99f29679579f01d7ffdf0a6d47495eb2 https://conda.anaconda.org/conda-forge/noarch/r-gtable-0.3.5-r43hc72bb7e_0.conda#4afa6b3bc18ef585bac26420528ed1de https://conda.anaconda.org/conda-forge/noarch/r-hypergeo-1.2_13-r43hc72bb7e_1004.conda#960f0770e69b4d8e154e9b751763b672 -https://conda.anaconda.org/conda-forge/noarch/r-knitr-1.46-r43hc72bb7e_0.conda#517abcb87956ea9273b774c49089875c +https://conda.anaconda.org/conda-forge/noarch/r-knitr-1.47-r43hc72bb7e_0.conda#0310660d998a5933bb4545a312ed7385 https://conda.anaconda.org/conda-forge/linux-64/r-lmoments-1.3_1-r43h7ce84a7_5.conda#24bcd1ee177f4e977657f5560fdf6616 https://conda.anaconda.org/conda-forge/linux-64/r-lubridate-1.9.3-r43h57805ef_0.conda#48f220862d7b0ac7d1397f8c6601fb70 https://conda.anaconda.org/conda-forge/linux-64/r-mgcv-1.9_1-r43h316c678_0.conda#c73d9ed0dc98182d712cbea33a3e5d59 @@ -637,9 +637,9 @@ https://conda.anaconda.org/conda-forge/linux-64/r-s2-1.1.6-r43h5eac2b3_0.conda#8 https://conda.anaconda.org/conda-forge/noarch/r-scales-1.3.0-r43hc72bb7e_0.conda#508360956e18c2b0cc18968cdb786c78 https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r43ha503ecb_3.conda#e9e632dc89a5235a6a44b42f23b497d8 https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.5-r43ha503ecb_0.conda#e398bd0451e6350a876a8561f8e90682 -https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py311h375a7ea_0.conda#edc4a14a8bef2be9fbe6906ce75c0939 -https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.6-py311h4c8953a_1.conda#896652a042ee508365292b99e6cea677 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-16.1.0-h7e0c224_1_cpu.conda#0f04b3b2867e724c72e20a29f2f76169 +https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py311h0535db5_1.conda#6c91f2b0148aaed5e94b238cb48650b3 +https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.6-py311h4c8953a_2.conda#f22ecd1ff6e17bc87a4156e9164b6957 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-16.1.0-h7e0c224_6_cpu.conda#81fea801c4bb126509e784cbd2ca4d17 https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.4-hd8ed1ab_0.conda#c9d64b8a7ee8e6bdbf0e7d8aa7f39601 https://conda.anaconda.org/conda-forge/linux-64/r-classint-0.4_10-r43h61816a4_0.conda#3cd17c77cac1801072c599c7cddff7f2 https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.1-r43hc72bb7e_0.conda#5287430003206a614ae64a91c8490e3c @@ -649,10 +649,10 @@ https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.4-r43hc72bb7e_1.c https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r43hc72bb7e_1.conda#7cff01456566a69381d3907d520c10b2 https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r43h57805ef_0.conda#713053b11419075641f09df086ef58d9 https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r43hc72bb7e_2.conda#fa01685a9c07191e186357c001b19ece -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-16.1.0-py311h781c19f_0.conda#bd1348ebc8a3f45a18f5e3f01483a628 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-16.1.0-py311h781c19f_1.conda#533878c8d2d380c75356cdcabc89f89b https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r43hc72bb7e_0.conda#5b6f07861439a584c942ec0c3967660f https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r43hc72bb7e_0.conda#d2b855cb2d8c0c5c870fe61d0f7e0d0c -https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_16-r43hce28180_1.conda#0864946e6a6921524db2cef2f72e1975 +https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_16-r43hce28180_2.conda#075f0502c30e1623158f697d419d83f1 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r43h57805ef_2.conda#afa7d3f21fbc5a2fbaa48cb9bacb7bce https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.1-pyhd8ed1ab_1.conda#00a6a9a6c58075008515a106625047cf https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda @@ -670,7 +670,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_5-r43h57805ef_0.con https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r43hc72bb7e_2.conda#13f4b1126272c8f195fc6ef38cc19d31 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.4-pyhd8ed1ab_0.conda#9dc80eaeff56fb67dbf4f871b81bc13a -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda#ce99859070b0e17ccc63234ca58f3ed8 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.3-pyhd8ed1ab_0.conda#55e445f4fcb07f2471fb0e1102d36488 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 From c507d798e5b2b27544272d214a059f1b2fd71473 Mon Sep 17 00:00:00 2001 From: Lukas Date: Fri, 31 May 2024 15:49:49 +0200 Subject: [PATCH 04/17] Update CRU CMORizer (#3381) Co-authored-by: Romain Beucher Co-authored-by: Felicity Chun <32269066+flicj191@users.noreply.github.com> Co-authored-by: Bettina Gier --- doc/sphinx/source/input.rst | 2 +- esmvaltool/cmorizers/data/cmor_config/CRU.yml | 29 ++++++-- esmvaltool/cmorizers/data/datasets.yml | 15 +++-- .../data/downloaders/datasets/cru.py | 23 +++++-- .../cmorizers/data/formatters/datasets/cru.py | 67 ++++++++++++++----- .../recipes/examples/recipe_check_obs.yml | 32 +++++++-- esmvaltool/references/cru.bibtex | 27 ++++---- 7 files changed, 146 insertions(+), 49 deletions(-) diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index c6bc77d614..20a417cfc6 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -271,7 +271,7 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | CowtanWay | tasa (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| CRU | tas, pr (Amon) | 2 | Python | +| CRU | tas, tasmin, tasmax, pr, clt (Amon), evspsblpot (Emon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | CT2019 | co2s (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ diff --git a/esmvaltool/cmorizers/data/cmor_config/CRU.yml b/esmvaltool/cmorizers/data/cmor_config/CRU.yml index 92eb5df07d..e57cc4e945 100644 --- a/esmvaltool/cmorizers/data/cmor_config/CRU.yml +++ b/esmvaltool/cmorizers/data/cmor_config/CRU.yml @@ -1,15 +1,20 @@ --- # Filename (will be extended by variable name) -filename: 'cru_ts4.02.1901.2017.{raw_name}.dat.nc' +# filename: 'cru_ts4.02.1901.2017.{raw_name}.dat.nc' +filename: 'cru_ts4.07.1901.2022.{raw_name}.dat.nc' # Common global attributes for Cmorizer output attributes: dataset_id: CRU - version: 'TS4.02' + # version: TS4.02 + version: 'TS4.07' tier: 2 modeling_realm: reanaly - project_id: OBS - source: 'https://crudata.uea.ac.uk/cru/data/hrg/cru_ts_4.02/cruts.1811131722.v4.02/' + # project_id: OBS # v4.02 + project_id: OBS6 + # source: 'https://crudata.uea.ac.uk/cru/data/hrg/cru_ts_4.02/cruts.1811131722.v4.02/' + # source: 'https://crudata.uea.ac.uk/cru/data/hrg/cru_ts_4.06/cruts.2205201912.v4.06/' + source: 'https://crudata.uea.ac.uk/cru/data/hrg/cru_ts_4.07/cruts.2304141047.v4.07/' reference: 'cru' comment: '' @@ -19,7 +24,23 @@ variables: mip: Amon raw: tmp raw_units: celsius + tasmin: + mip: Amon + raw: tmn + raw_units: celsius + tasmax: + mip: Amon + raw: tmx + raw_units: celsius pr: mip: Amon raw: pre raw_units: kg m-2 month-1 + evspsblpot: + mip: Emon + raw: pet + raw_units: kg m-2 day-1 + clt: + mip: Amon + raw: cld + raw_units: percent diff --git a/esmvaltool/cmorizers/data/datasets.yml b/esmvaltool/cmorizers/data/datasets.yml index 1d1e90aaaf..759dc6177e 100644 --- a/esmvaltool/cmorizers/data/datasets.yml +++ b/esmvaltool/cmorizers/data/datasets.yml @@ -281,12 +281,19 @@ datasets: CRU: tier: 2 - source: https://crudata.uea.ac.uk/cru/data/hrg/cru_ts_4.02/cruts.1811131722.v4.02/ - last_access: 2019-05-16 + source: https://crudata.uea.ac.uk/cru/data/hrg/cru_ts_4.07/cruts.2304141047.v4.07/ + last_access: 2023-11-06 info: | - Download the following files: - {raw_name}/cru_ts4.02.1901.2017.{raw_name}.dat.nc.gz + Files can be downloaded using the download script (latest version only) + or manually: + {raw_name}/cru_ts4.07.1901.2022.{raw_name}.dat.nc.gz where {raw_name} is the name of the desired variable(s). + Previous versions can be downloaded from the corresponding folders in + https://crudata.uea.ac.uk/cru/data/hrg/. ESMValTools formatter can be used + for older versions with minor adjustments of + ``esmvaltool/cmorizers/data/cmor_config/CRU.yml`` + Exact time coordinates and number of stations are not available version + TS4.02. CT2019: tier: 2 diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/cru.py b/esmvaltool/cmorizers/data/downloaders/datasets/cru.py index 7f2b3010cb..8fbce3e9a3 100644 --- a/esmvaltool/cmorizers/data/downloaders/datasets/cru.py +++ b/esmvaltool/cmorizers/data/downloaders/datasets/cru.py @@ -7,8 +7,9 @@ logger = logging.getLogger(__name__) -def download_dataset(config, dataset, dataset_info, start_date, end_date, - overwrite): +def download_dataset( + config, dataset, dataset_info, start_date, end_date, overwrite +): """Download dataset. Parameters @@ -32,10 +33,18 @@ def download_dataset(config, dataset, dataset_info, start_date, end_date, dataset_info=dataset_info, overwrite=overwrite, ) - for var in ['tmp', 'pre']: + for var in ['tmp', 'pre', 'pet', 'tmn', 'tmx', 'cld']: downloader.download_file( - 'https://crudata.uea.ac.uk/cru/data/hrg/cru_ts_4.02/' - f'cruts.1811131722.v4.02/{var}/' - f'cru_ts4.02.1901.2017.{var}.dat.nc.gz', - wget_options=[]) + "https://crudata.uea.ac.uk/cru/data/hrg/cru_ts_4.07/" + f"cruts.2304141047.v4.07/{var}/" + f"cru_ts4.07.1901.2022.{var}.dat.nc.gz", + wget_options=[], + ) + # for var in ['tmp', 'pre']: # v TS4.02 + # downloader.download_file( + # "https://crudata.uea.ac.uk/cru/data/hrg/cru_ts_4.02/" + # f"cruts.1811131722.v4.02/{var}/" + # f"cru_ts4.02.1901.2017.{var}.dat.nc.gz", + # wget_options=[], + # ) unpack_files_in_folder(downloader.local_folder) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/cru.py b/esmvaltool/cmorizers/data/formatters/datasets/cru.py index ab69aacb4b..03d1ac77f4 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/cru.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/cru.py @@ -4,21 +4,29 @@ Tier 2: other freely-available dataset. Source - https://crudata.uea.ac.uk/cru/data/hrg/cru_ts_4.02/cruts.1811131722.v4.02/ + TS4.02: https://crudata.uea.ac.uk/cru/data/hrg/cru_ts_4.02/cruts.1811131722.v4.02/ # noqa: E501 + TS4.06: https://crudata.uea.ac.uk/cru/data/hrg/cru_ts_4.06/cruts.2205201912.v4.06/ # noqa: E501 + TS4.07: https://crudata.uea.ac.uk/cru/data/hrg/cru_ts_4.07/cruts.2304141047.v4.07/ # noqa: E501 Last access - 20190516 + TS4.02: 20190516 + TS4.06: 20231012 + TS4.07: 20231012 Download and processing instructions Download the following files: - {raw_name}/cru_ts4.02.1901.2017.{raw_name}.dat.nc.gz - where {raw_name} is the name of the desired variable(s). + ``{raw_name}/cru_ts4.{X}.1901.{end_year}.{raw_name}.dat.nc.gz`` + where ``{raw_name}`` is the name of the desired variable(s) or run + ``esmvaltool data download CRU`` for the latest version """ import logging import os +import cftime import iris +import numpy as np +from cf_units import Unit from iris import NameConstraint from esmvaltool.cmorizers.data import utilities as utils @@ -26,26 +34,53 @@ logger = logging.getLogger(__name__) +def _center_timecoord(cube): + """Set time coordinates to exact center of each month. + + CRU timepoints are not in the center of the month and added bounds + by utils.fix_coords are incorrect. #1981 + """ + time = cube.coord("time") + times = time.units.num2date(time.points) + + # get bounds + starts = [cftime.DatetimeNoLeap(c.year, c.month, 1) for c in times] + ends = [ + cftime.DatetimeNoLeap(c.year, c.month + 1, 1) + if c.month < 12 else cftime.DatetimeNoLeap(c.year + 1, 1, 1) + for c in times + ] + time.bounds = time.units.date2num(np.stack([starts, ends], -1)) + time.points = [np.mean((t1, t2)) for t1, t2 in time.bounds] + + def _extract_variable(short_name, var, cfg, filepath, out_dir): """Extract variable.""" - raw_var = var.get('raw', short_name) + raw_var = var.get("raw", short_name) + version = cfg["attributes"]["version"] cube = iris.load_cube(filepath, NameConstraint(var_name=raw_var)) # Fix units - if 'raw_units' in var: - cube.units = var['raw_units'] - cmor_info = cfg['cmor_table'].get_variable(var['mip'], short_name) + if "raw_units" in var: + cube.units = var["raw_units"] + cmor_info = cfg["cmor_table"].get_variable(var["mip"], short_name) cube.convert_units(cmor_info.units) - utils.convert_timeunits(cube, 1950) + if version in ["TS4.02"]: + utils.convert_timeunits(cube, 1950) + else: + cube.coord("time").convert_units( + Unit("days since 1950-1-1 00:00:00", calendar="gregorian")) # Fix coordinates utils.fix_coords(cube) - if 'height2m' in cmor_info.dimensions: + if "height2m" in cmor_info.dimensions: utils.add_height2m(cube) + if version not in ["TS4.02"]: + _center_timecoord(cube) # Fix metadata - attrs = cfg['attributes'] - attrs['mip'] = var['mip'] + attrs = cfg["attributes"] + attrs["mip"] = var["mip"] utils.fix_var_metadata(cube, cmor_info) utils.set_global_atts(cube, attrs) @@ -54,17 +89,17 @@ def _extract_variable(short_name, var, cfg, filepath, out_dir): short_name, out_dir, attrs, - unlimited_dimensions=['time']) + unlimited_dimensions=["time"]) def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): """Cmorization func call.""" - raw_filepath = os.path.join(in_dir, cfg['filename']) + raw_filepath = os.path.join(in_dir, cfg["filename"]) # Run the cmorization - for (short_name, var) in cfg['variables'].items(): + for short_name, var in cfg["variables"].items(): logger.info("CMORizing variable '%s'", short_name) - raw_var = var.get('raw', short_name) + raw_var = var.get("raw", short_name) filepath = raw_filepath.format(raw_name=raw_var) if filepath is None: continue diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index 94e3aa1a42..bfc6639bc9 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -64,11 +64,33 @@ diagnostics: CRU: description: CRU check variables: - tas: - pr: - additional_datasets: - - {dataset: CRU, project: OBS, mip: Amon, tier: 2, - type: reanaly, version: TS4.02, start_year: 1901, end_year: 2017} + tas: # check older versions + mip: Amon + additional_datasets: + - {dataset: CRU, project: OBS, tier: 2, type: reanaly, + version: TS4.02, start_year: 1901, end_year: 2017} + - {dataset: CRU, project: OBS6, tier: 2, type: reanaly, + version: TS4.07, start_year: 1901, end_year: 2021} + pr: # check older versions + mip: Amon + additional_datasets: + - {dataset: CRU, project: OBS, tier: 2, type: reanaly, + version: TS4.02, start_year: 1901, end_year: 2017} + - {dataset: CRU, project: OBS6, tier: 2, type: reanaly, + version: TS4.07, start_year: 1901, end_year: 2021} + tasmin: + mip: Amon + tasmax: + mip: Amon + clt: + mip: Amon + evspsblpot: + mip: Emon + additional_datasets: # newest version for all variables + - {dataset: CRU, project: OBS6, tier: 2, + type: reanaly, version: TS4.07, start_year: 1901, end_year: 2022} + + scripts: null diff --git a/esmvaltool/references/cru.bibtex b/esmvaltool/references/cru.bibtex index 0598abcc00..7de9c36f5e 100644 --- a/esmvaltool/references/cru.bibtex +++ b/esmvaltool/references/cru.bibtex @@ -1,13 +1,16 @@ @article{cru, - doi = {10.1002/joc.3711}, - url = {https://doi.org/10.1002%2Fjoc.3711}, - year = 2013, - month = {may}, - publisher = {Wiley}, - volume = {34}, - number = {3}, - pages = {623--642}, - author = {I. Harris and P.D. Jones and T.J. Osborn and D.H. Lister}, - title = {Updated high-resolution grids of monthly climatic observations - the {CRU} {TS}3.10 Dataset}, - journal = {International Journal of Climatology} -} + title = {Version 4 of the {{CRU TS}} Monthly High-Resolution Gridded Multivariate Climate Dataset}, + author = {Harris, Ian and Osborn, Timothy J. and Jones, Phil and Lister, David}, + date = {2020-04-03}, + year = 2020, + month = {april}, + journaltitle = {Sci Data}, + volume = {7}, + number = {1}, + pages = {109}, + publisher = {{Nature Publishing Group}}, + issn = {2052-4463}, + doi = {10.1038/s41597-020-0453-3}, + url = {https://www.nature.com/articles/s41597-020-0453-3}, + urldate = {2023-10-12}, +} \ No newline at end of file From 7b1a1ca18b2b6cd5f746647ca2bfde84f3585212 Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Mon, 3 Jun 2024 15:19:00 +0200 Subject: [PATCH 05/17] Updated esmf-related pins (#3643) --- environment.yml | 4 ++-- environment_osx.yml | 4 ++-- setup.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/environment.yml b/environment.yml index 547aaecec1..c3d746f34f 100644 --- a/environment.yml +++ b/environment.yml @@ -21,14 +21,14 @@ dependencies: - distributed - ecmwf-api-client - eofs - - esmpy !=8.1.0,<8.6.0 # https://github.com/SciTools-incubator/iris-esmf-regrid/pull/342#issuecomment-2092921514 + - esmpy >=8.6.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 - esmvalcore 2.10.* - fiona - fire - fsspec - gdal - iris >=3.6.1 - - iris-esmf-regrid >=0.7.0 + - iris-esmf-regrid >=0.10.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 - jinja2 - joblib - lime diff --git a/environment_osx.yml b/environment_osx.yml index 809cb09346..92eb9fed93 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -21,14 +21,14 @@ dependencies: - distributed - ecmwf-api-client - eofs - - esmpy !=8.1.0,<8.6.0 # https://github.com/SciTools-incubator/iris-esmf-regrid/pull/342#issuecomment-2092921514 + - esmpy >=8.6.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 - esmvalcore 2.10.* - fiona - fsspec - fire - gdal - iris >=3.6.1 - - iris-esmf-regrid >=0.7.0 + - iris-esmf-regrid >=0.10.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 - jinja2 - joblib - lime diff --git a/setup.py b/setup.py index 84bd2a7c82..5cb030b8a4 100755 --- a/setup.py +++ b/setup.py @@ -33,7 +33,7 @@ 'eofs', 'ESMPy', # not on PyPI 'esmvalcore', - 'esmf-regrid>=0.7.0', + 'esmf-regrid>=0.10.0', # iris-esmf-regrid #342 'fiona', 'fire', 'fsspec', From 75bc55c9e04d2860ca87e6875a3c3da3e3b68cc5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 15:34:42 +0100 Subject: [PATCH 06/17] [Condalock] Update Linux condalock file (#3641) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index f78d6a4b53..80d92e8f63 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -335,7 +335,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.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.6.0-pyhd8ed1ab_0.conda#e9ed10aa8fa1dd6782940b95c942a6ae -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.52.4-py311h331c9d8_0.conda#0a5e7e2aca2a4217b2036e0d661dcfb0 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py311h331c9d8_0.conda#2daef6c4ce74840c8d7a431498be83e9 https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358c17429c97883b2cb9ab5f64bc161b https://conda.anaconda.org/conda-forge/linux-64/git-2.45.1-pl5321hef9f9f3_0.conda#b6b6729ba1bfc1f095e0336df6a705b5 https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 @@ -434,7 +434,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h18e1886_1.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.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.1-pyhd8ed1ab_0.conda#d4f60ccc5421472d2583efd9ce39d8b1 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.2-pyhd8ed1ab_0.conda#1a57a819915e1c169b74933720b138f2 https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 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.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 @@ -461,7 +461,6 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.con 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.2.0-pyhd8ed1ab_1.conda#f351ee57bb9c3e4b2f4952980461ba1d https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py311h517d4fd_0.conda#764b0e055f59dbd7d114d32b8c6e55e6 -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.4-py311h0bed3d6_1.conda#6fb2f733ef405b4bfb4a6a362703457e 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-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 @@ -469,7 +468,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-hba8bd5f_3. https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.1-pyhd8ed1ab_0.conda#0f8e0831bbf38d83973438ce9af9af9a https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.0.3-pyhd8ed1ab_0.conda#46b7eb9d2f3ca144f3195dc6aa7bdf93 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.5.1-pyhd8ed1ab_0.conda#d6b959de6c4ed39dd0a09fbe74d37ca4 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.5.2-pyhd8ed1ab_0.conda#2fa6807bd19e5cdc77fe1b6a42c86228 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h9e768e6_3.conda#c330e87e698bae8e7381c0315cf25dd0 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c @@ -487,6 +486,7 @@ https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9a 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.3.3-hf0d99cb_1.conda#f8ee712096aa7cedd3eb8d19ade82374 https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.0-py311he08f58d_1.conda#d55e4dde3b30272090f33ddd367c580b +https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyhd8ed1ab_0.conda#846d12530687ba836791dd54db1f45c5 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py311h18e1886_0.conda#82c29bf38b3fb66da09736106609b5fe https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.5.22-pyhd8ed1ab_0.conda#3930cabe8ca8c8594026fa8768cae75c @@ -601,7 +601,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-nlme-3.1_164-r43h61816a4_0.con https://conda.anaconda.org/conda-forge/linux-64/r-plyr-1.8.9-r43ha503ecb_0.conda#47bf330a88b5a59bc6e110624f1b8e7a https://conda.anaconda.org/conda-forge/linux-64/r-processx-3.8.4-r43h57805ef_0.conda#660d4e9ff8beef35dbda645484d17a25 https://conda.anaconda.org/conda-forge/noarch/r-r.oo-1.26.0-r43hc72bb7e_0.conda#e467767d55b77c81b3167f00f2ecac65 -https://conda.anaconda.org/conda-forge/linux-64/r-rcpparmadillo-0.12.8.3.0-r43h58a4165_0.conda#f042a0f5d50798bf710b44a2d3e202de +https://conda.anaconda.org/conda-forge/linux-64/r-rcpparmadillo-0.12.8.4.0-r43h58a4165_0.conda#57e177923b3c89382db34962ff5320e2 https://conda.anaconda.org/conda-forge/noarch/r-rex-1.2.1-r43hc72bb7e_2.conda#0a2c2b272177122311ca46834b8ca6ab https://conda.anaconda.org/conda-forge/linux-64/r-sp-2.1_4-r43hb1dbf0f_0.conda#01d55e9a8ae9cb6d222b0154316346a4 https://conda.anaconda.org/conda-forge/linux-64/r-spam-2.10_0-r43h9f9f741_0.conda#b1f50ff35422ee8bc5e3d6c0565b3e62 @@ -654,15 +654,15 @@ https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r43hc72bb7e_ https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r43hc72bb7e_0.conda#d2b855cb2d8c0c5c870fe61d0f7e0d0c https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_16-r43hce28180_2.conda#075f0502c30e1623158f697d419d83f1 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r43h57805ef_2.conda#afa7d3f21fbc5a2fbaa48cb9bacb7bce -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.1-pyhd8ed1ab_1.conda#00a6a9a6c58075008515a106625047cf +https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.2-pyhd8ed1ab_0.conda#34db694d2afc672094f1a74af51cb44e https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r43hc72bb7e_0.conda#efb6b27dba202d74e5f182faae28794a https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r43hc72bb7e_3.conda#d1f849bc6b24f93c392f4177f65578b4 -https://conda.anaconda.org/conda-forge/noarch/dask-2024.5.1-pyhd8ed1ab_0.conda#2b7c338ca2077c3131871523fa38d4ed +https://conda.anaconda.org/conda-forge/noarch/dask-2024.5.2-pyhd8ed1ab_0.conda#6bb2c18b838161e550a30de0fdff6993 https://conda.anaconda.org/conda-forge/noarch/r-styler-1.10.3-r43hc72bb7e_0.conda#de41a01071ff652806dd79cd7ddaf239 https://conda.anaconda.org/conda-forge/linux-64/r-tlmoments-0.7.5.3-r43ha503ecb_1.conda#cc23eacc44f680ecc36222de5a1c6694 https://conda.anaconda.org/conda-forge/noarch/r-viridis-0.6.5-r43hc72bb7e_0.conda#327e96357f5ba37795f2e292e29091c7 -https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.9.0-pyhd8ed1ab_0.conda#570f2c6e387fd6dac5356a5152f91b3f +https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.10.0-pyhd8ed1ab_0.conda#a5ccce1a87da81d6c690cd11ae0687a2 https://conda.anaconda.org/conda-forge/linux-64/r-fields-15.2-r43h61816a4_0.conda#9e320d2aa158a698f8ba09b3176607ea https://conda.anaconda.org/conda-forge/noarch/r-spei-1.8.1-r43hc72bb7e_1.conda#3be1d0c7f8edcd4e7e8a64596020b90f https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.10.0-pyhd8ed1ab_0.conda#18bc5ed0e0583cb0b212927795debea7 From ae00a53aac62cbbf2b21c425b92ae7eed7cafffb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 13:01:42 +0100 Subject: [PATCH 07/17] [Condalock] Update Linux condalock file (#3650) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 236 ++++++++++++++++++++++---------------------- 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 80d92e8f63..c7670dd5cd 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -1,18 +1,18 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: cfdd58f90c9dd54d431a8c5464e9bf2bd6e77d0043fa90f589789f5ed9b738a5 +# input_hash: 6b13b0874631d4e45248b978f87b5b87d49cf73206e43bd1989bedfb09b60743 @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 https://conda.anaconda.org/conda-forge/noarch/_r-mutex-1.0.1-anacondar_1.tar.bz2#19f9db5f4f1b7f5ef5f6d67207f25f38 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_3.conda#670f0e1593b8c1d84f57ad5fe5256799 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-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-2.6.32-he073ed8_17.conda#d731b543793afc0433c4fd593e693fce -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_1.conda#33b7851c39c25da14f6a233a8ccbeeca +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_3.conda#7c1062eaa78dec4ea8a9a988dbda6045 https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.85.0-ha770c72_1.conda#012455a6eddcbf487ef0ddd1715f0b80 https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.2.0-hceb6213_107.conda#2cc37ba482c6321237ce72329e1aaea2 https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.2.0-hceb6213_107.conda#2b409e9645fb3d69115d04496d1219cc @@ -26,18 +26,17 @@ https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda#abf3fec87c2563697defa759dec3d639 https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.12-he073ed8_17.conda#595db67e32b276298ff3d94d07d47fbf https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_1.conda#e901545940ebdc5c40017fab53642b3c +https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_3.conda#2b0c0d451353cde73295d799ea8886b1 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.0-hac33072_0.conda#93a3bf248e5bc729807db198a9c89f07 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.19-h4ab18f5_0.conda#c6dedd5eab2236f4abb59ade9fb7fd44 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.15-hd590300_0.conda#ad8955a300fd09e97e76c38638ac7157 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.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f 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/fmt-10.2.1-h00ab1b0_0.conda#35ef8bc24bd34074ebae3c943d551728 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda#985f2f453fb72408d6b6f1be0f324033 https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-he1b5a44_1004.tar.bz2#cddaf2c63ea4a5901cf09524c490ecdc https://conda.anaconda.org/conda-forge/linux-64/ghostscript-10.03.1-h59595ed_0.conda#be973b4541601270b77232bc46249a3a @@ -56,25 +55,26 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda#dd197c968bf9760bba0031888d431ede https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 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.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d 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.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d 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/libgettextpo-0.22.5-h59595ed_2.conda#172bcc51059416e7ce99e7b528cede83 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf -https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d 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-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 +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/libnl-3.9.0-hd590300_0.conda#d27c451db4f1d3c983c78167d2fdabc2 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libopenlibm4-0.8.1-hd590300_1.conda#e6af610e01d04927a5060c95ce4e0875 https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.2.0-h6ddb7a1_7.conda#ecba88d2296bf40186a9dc65bdf7b621 https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d +https://conda.anaconda.org/conda-forge/linux-64/libtool-2.4.7-h27087fc_0.conda#f204c8ba400ec475452737094fb81d52 https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2#a730b2badd586580c5752cc73842e068 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.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda#049b7df8bae5e184d1de42cdf64855f8 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-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 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 https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 @@ -84,14 +84,14 @@ https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-h59595ed_1007.conda# https://conda.anaconda.org/conda-forge/linux-64/nccl-2.21.5.1-h6103f9b_0.conda#05381b62b2faed9609fb68b27cd575aa https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 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.3.0-h4ab18f5_3.conda#12ea6d0d4ed54530eaed18e4835c1f7c +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c 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.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 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/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 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.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-hdb0a2a9_1.conda#78b8b85bdf1f42b8a2b3cb577d8742d1 https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.1.0-hac33072_0.conda#2a08edb7cd75e56623f2712292a97325 https://conda.anaconda.org/conda-forge/linux-64/tzcode-2024a-h3f72095_0.conda#32146e34aaec3745a08b6f49af3f41b0 https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 @@ -109,14 +109,14 @@ https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161 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.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.14-h88a6e22_1.conda#7ed63b0e816dd1635903506ef5d2c079 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-h83b837d_6.conda#3e572eacd0ce99a59e1bb9c260ad5b20 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-h83b837d_2.conda#f40c698b4ea90f7fedd187c6639c818b -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h83b837d_6.conda#7995cb937bdac5913c8904fed6b3729d +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.11-heb1d5e4_0.conda#98784bb35b316e2ba8698f4a75326e9a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-hce8ee76_3.conda#b19224a5179ecb512c4aac9f8a6d57a7 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.15-hce8ee76_3.conda#0c4f0205a1ae4ca6c89af922ec54271c +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-hce8ee76_3.conda#9aa734a17b9b0b793c7696435fe7789a https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda#53fb86322bdb89496d7579fe3f02fd61 https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.2.0-h9eb54c0_7.conda#57f0fcb5d432d5f98be5705e2bf65352 https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.0-hed5481d_0.conda#a9ea19c48e11754899299f8123070f4e -https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.0.4-hd2f8ffe_4.conda#cb911b3e0d863ca9caafd767525f7cac https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f @@ -131,70 +131,70 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.con https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 -https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h8917695_15.conda#20c3c14bc491f30daecaa6f73e2223ae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b +https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hb58d41b_14.conda#264f9a3a4ea52c8f4d3e8ae1213a3335 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 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-2.0.3-cuda118_h09a87be_4.conda#bfaf927bc7665d327ff5b8e5b8dbf2df -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda#5d801a4906adc712d480afc362623b59 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 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_1.conda#8083b20f566639c22f78bcd6ca35b276 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.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 +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-7_hd590300_perl5.conda#f2cfec9406850991f4e3d960cc9e3321 +https://conda.anaconda.org/conda-forge/linux-64/rdma-core-51.1-he02047a_0.conda#d3729d689f9febadb17462936a90e2e9 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.15-he19d79f_0.conda#4c7cc3fa1d2c5a63f9e2b1e2980a1672 -https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.13.0-hd2e6256_0.conda#18f9348f064632785d54dbd1db9344bb +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.12-h06160fa_0.conda#bf1899cfd6dea061a220fa7e96a1f4bd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.8-h21d4f22_5.conda#f9dd6e8a46f55f49eae5380d3b922b71 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.7-hbfbeace_6.conda#d6382461de9a91a2665e964f92d8da0a +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba 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.14.4-hb4ffafa_1.conda#84eb54e92644c328e087e1c725773317 -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/c-blosc2-2.12.0-hb4ffafa_0.conda#1a9b16afb84d734a1bb2d196c308d477 +https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda#ee3e687b78b778db7b304e5b00a4dca6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda#219ba82e95d7614cf7140d2a4afc0926 https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-13.2.0-h738fc78_7.conda#0a9c20316a67fbfee9d5778ed0aff24d https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.2.0-h2a599c4_7.conda#2ac5f82e4fd21f968b370e54bb839a4e -https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-h3e53b52_1004.conda#c21dc684e0e8efa507aba61a030f65e7 +https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-hebf79cf_1003.conda#23bb57b64a629bc3b33379beece7f0d7 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 -https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.7.2-h65212e3_2.conda#01180180962748088e2b8c6c46f5a587 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda#72724f6a78ecb15559396966226d5838 +https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.7.1-hca3a8ce_0.conda#6af97ac284ffaf76d8f63cc1f9d64f7a https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.10.0-default_h5622ce7_1001.conda#fc2d5b79c2d3f8568fbab31db7ae02f3 -https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.10.2-hcae5a98_0.conda#901db891e1e21afd8524cd636a8c8e3b +https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda#a4d48c40dd5c60edbab7fd69c9a88967 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.27-pthreads_h384dd9e_0.conda#025629e15edccee84df4713ce69192e5 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.19.0-hb90f79a_1.conda#8cdb7d41faa0260875ba92414c487e2d -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 -https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.5-h0ab5242_0.conda#557396140c71eba588e96d597e0c61aa +https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.6-h9d307f2_0.conda#857b62ff5fc3b6282189798bf06aa2ca https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda#949c4a82290ee58b3c970cef4bcfd4ad -https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.1-h17fec99_1.conda#3bf65f0d8e7322a1cfe8b670fa35ec81 +https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.0-h1e5e2c1_0.conda#53e8f030579d34e1a36a735d527c021f https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.3-h2c6b66d_0.conda#be7d70f2db41b674733667bdd69bd000 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 +https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.16.3-hf0b6e87_3.conda#1e28da846782f91a696af3952a2472f9 https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-h0c5db8f_5.conda#9464044754ea25557a9c93f0327d90a6 +https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-ha691c75_8.conda#3f9bc6137b240642504a6c9b07a10c25 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.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec 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.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-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 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.4.2-ha47c788_12.conda#8420d8e495a1468f593128e5fbf6748a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-h29d6fba_17.conda#c20a29ff47043ba1ec24f45dc68930bf +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h01f5eca_8.conda#afb85fc0f01032d115c57c961950e7d8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-hdb68c23_10.conda#cb6065938167da2d2f078c2f08473b84 https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py311h38be061_8.conda#5384590f14dfe6ccd02811236afc9f8e https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.6.2-pyhd8ed1ab_0.conda#8821ec1c8fcdc9e1d291d7b9f6e9968a https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca @@ -221,10 +221,8 @@ https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h743c826_0.conda#12e6988845706b2cfbc3bc35c9a61a95 https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h459d7ec_0.conda#b267e553a337e1878512621e374845c5 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.5.0-pyhff2d567_0.conda#d73e9932511ef7670b2cc0ebd9dfbd30 -https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.0-pyhd8ed1ab_0.tar.bz2#6b1f32359fc5d2ab7b491d0029bfffeb -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.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 @@ -232,12 +230,13 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda#ff7ca04134ee8dde1d7cf491a78ef7c7 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.10.0-py311h459d7ec_0.conda#d39020c78fd00ed774ff9c876e8aba07 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 +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.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e -https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.4.0-h2c329e2_0.conda#80030debaa84cfc31755d53742df3ca6 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-hdffd6e0_0.conda#a8661c87c873d8c8f90479318ebf0a17 https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.42.0-py311ha6695c7_1.conda#d6e13a53b4f0cc38f4a348f47bfd5b97 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-5.2.2-py311hc0a218f_0.conda#5a9c71f5cbdf3c5b1ad2504e13792629 @@ -247,6 +246,7 @@ https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2# 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.8-py311h52f7536_0.conda#f33f59b8130753174992f409a41e112e https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py311h459d7ec_0.conda#4288ea5cbe686d1b18fc3efb36c009a5 +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 https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhd8ed1ab_0.conda#70959cd1db3cf77b2a27a0836cfd08a7 @@ -294,10 +294,10 @@ https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f 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.5-pyha770c72_0.conda#e5dde5caf905e9d95895e05f94967e14 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py311h459d7ec_0.conda#cc7727006191b8f3630936b339a76cd0 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py311h331c9d8_0.conda#e29e451c96bf8e81a5760b7565c6ed2c https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.5.22-pyhd8ed1ab_0.conda#a887538e7f6697ed52a487dbaa0ebff5 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py311h4332511_0.conda#442a260df22ffad7f666c7e3f119b5ab 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 @@ -309,24 +309,24 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hd590300_1.conda#ae92aab42726eb29d16488924f7312cb -https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.4.0-pyhd8ed1ab_0.conda#93dffc47dadbe36a1a644f3f50d4979d +https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.6.0-pyhd8ed1ab_0.conda#de631703d59e40af41c56c4b4e2928ab https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h75354e8_4.conda#03cc8d9838ad9dd0060ab532e81ccb21 https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a +https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/asgiref-3.8.1-pyhd8ed1ab_0.conda#b5c2e1034ccc76fb14031637924880eb 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.22-h96bc93b_2.conda#de2b7c9aa9b279cca5542134b7a2b86a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-h759edc4_4.conda#8ced661d9dcece8698922fd8a73b6511 -https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.11.1-h91d86a7_1.conda#2dbab1d281b7e1da05eee544cbdc8af6 +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/linux-64/aws-c-auth-0.7.17-he0b1f16_2.conda#ea6d998135d5f8932cffc91381104690 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.3-h50844eb_4.conda#e72fdd8942f266ea79c70ec085661d6c 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.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 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 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 -https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.4.0-hbdc6101_1.conda#0ba5a427a51923dcdfe1121115ac8293 +https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.3.0-hbdc6101_0.conda#797554b8b7603011e8677884381fbcc5 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.5.3-py311h331c9d8_0.conda#543dd05fd661e4e9c9deb3b37093d6a2 @@ -336,10 +336,11 @@ https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.co 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.6.0-pyhd8ed1ab_0.conda#e9ed10aa8fa1dd6782940b95c942a6ae https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py311h331c9d8_0.conda#2daef6c4ce74840c8d7a431498be83e9 +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h6c15284_3.conda#06f97c8b69157d91993af0c4f2e16bdc https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358c17429c97883b2cb9ab5f64bc161b -https://conda.anaconda.org/conda-forge/linux-64/git-2.45.1-pl5321hef9f9f3_0.conda#b6b6729ba1bfc1f095e0336df6a705b5 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.3-nompi_hdf9ad27_102.conda#d8cb3688b92e891e1e5f613517a50ca8 +https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 @@ -350,23 +351,23 @@ https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.2-py311h38be061 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f 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-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 -https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 +https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-he9388d3_8.conda#f3abc6e6ab60fa404c23094f5a03ec9b 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.24.0-h2736e30_0.conda#34aeee3fa7fca5dc21fad3ac6f4f0ab2 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.22.0-h9be4e54_1.conda#4b4e36a91e7dabf7345b82d85767a7c3 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 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 +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 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.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda#6c520a9d36c9d7270988c7a6c360d6d4 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py311h8aef010_1.conda#4d66ee2081a7cd444ff6f30d95873eef https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/noarch/plotly-5.22.0-pyhd8ed1ab_0.conda#5b409a5f738e7d76c2b426eddb7e9956 https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.3-h8e811e2_0.conda#e4d52462da124ed3792472f95a36fc2a -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a +https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece 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.1.0-pyhd8ed1ab_0.conda#03736d8ced74deece64e54be348ddd3e -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda#e4418e8bdbaa8eea28e047531e6763c8 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.2-pyhd8ed1ab_0.conda#89703b4f38bd1c0353881f085bc8fdaa https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.0.3-py311h08a0b41_0.conda#8bef21c0a0160e7369fc2f494acf85d0 @@ -375,7 +376,7 @@ https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-py_2.tar.bz2#a11f35 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py311h459d7ec_0.conda#4dccc0bc3bb4d6e5c30bccbd053c4f90 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda#e74cd796e70a4261f86699ee0a3a7a24 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 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.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 @@ -383,38 +384,37 @@ https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-hac6953d_0.conda# 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-h4ab18f5_1.conda#4d6c9925cdcda27e9d022e40eb3eac05 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-5.0.0-pyhca7485f_0.conda#53c70f2dd94c690afd8606de7e952fe7 +https://conda.anaconda.org/conda-forge/noarch/yamale-5.2.1-pyhca7485f_0.conda#c089f90a086b6214c5606368d0d3bad0 https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_0.conda#a1240b99a7ccd953879dc63111823986 https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py311h459d7ec_0.conda#fff0f2058e9d86c8bf5848ee93917a8d https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.5-py311h459d7ec_0.conda#0175d2636cc41dc019b51462c13ce225 -https://conda.anaconda.org/conda-forge/linux-64/arpack-3.8.0-nompi_h0baa96a_101.tar.bz2#bad10a5b54a3aa9680c3ac1436b7e35d -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.9-h594631b_3.conda#47490db1dcddfb1c355251fc427746a6 -https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.6.0-hf1915f5_1.conda#fd11ea65ceb397f9587b1d88a4329d73 -https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.5.0-h94269e2_4.conda#f364272cb4c2f4ce2341067107b82865 +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.5.7-hb7bd14b_1.conda#82bd3d7da86d969c62ff541bab19526a https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.3-pyhd8ed1ab_0.conda#91fc4700dcce4a46d439900a132fe4e5 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-42.0.7-py311h4a61cc7_0.conda#251f3a7b306a8b212d42d585b3d06f36 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-42.0.8-py311h4a61cc7_0.conda#962bcc96f59a31b62c43ac2b306812af https://conda.anaconda.org/conda-forge/noarch/django-5.0.6-pyhd8ed1ab_0.conda#8451875d7b41dbab4d282f02719f3d6d 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.3-h928be8b_0.conda#c0f2468661b7cae54a7a1ff11926e372 +https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.1-hee599c5_13.conda#8c55dacddd589be64b2bd6a5d4264be6 +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.43-pyhd8ed1ab_0.conda#0b2154c1818111e17381b1df5b4b0176 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-8.5.0-hfac3d4d_0.conda#f5126317dd0ce0ba26945e411ecc6960 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-hf1a501a_15.conda#d2e16a32f41d67c7d280da11b2846328 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 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.3-hee9dde6_1.conda#c5b7b29e2b66107553d0366538257a51 https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_0.conda#a284ff318fbdb0dd83928275b4b6087c -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.24.0-h3d9a0c8_0.conda#a731371833a7b1ab3a87be0fe7e6235a -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h5539517_6.conda#1ee26233875c04444bdb2e5a838b5634 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.22.0-hc7a4891_1.conda#7811f043944e010e54640918ea82cecd +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c +https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h090f1da_1.conda#9a2d6acaa8ce6d53a150248e7b11165e https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d -https://conda.anaconda.org/conda-forge/linux-64/poppler-24.04.0-hb6cd0d7_0.conda#d19eed746748f1d44b575662f2bcfe95 +https://conda.anaconda.org/conda-forge/linux-64/poppler-23.08.0-hf2349cb_2.conda#fb75401ae7e2e3f354dff72e9da95cae https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.4.2-pyhd8ed1ab_0.conda#aca82be28a1c676a3e0365e83892f412 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-py311hb3a3e68_6.conda#bce79adf84cd7cd9b9b14e43d6d52daf +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h1facc83_4.conda#75d504c6787edc377ebdba087a26a61b https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 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.1.1-pyhd8ed1ab_0.conda#52b91ecba854d55b28ad916a8b10da24 @@ -428,8 +428,7 @@ https://conda.anaconda.org/conda-forge/linux-64/suitesparse-5.10.1-h5a4f163_3.co https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f 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.26.9-he3a8b3b_0.conda#fbe6a256dd70a505730e7c461cd37a35 -https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.10.0-h00ab1b0_1.conda#1e63d3866554a4d2e3d1cba5f21a2841 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.6-hf567797_4.conda#ffb662b31aef333e68a00dd17fda2027 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h18e1886_1.conda#f1beb063aad4446eb146d8b88420a4ea 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 @@ -438,21 +437,22 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.2-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 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.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.1.1-py311h60053b1_7.conda#a356a5387f463a9b3d7aca7d8696e77a +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2023.9.18-py311h9b38416_0.conda#67bed2bd92ffa76b20506d83427706ae https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda#bcf6a6f4c6889ca083e8d33afbafb8d5 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 +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.22.0-pyhd8ed1ab_0.conda#b9661a4b1200d6bc7d8a4cdafdc91468 -https://conda.anaconda.org/conda-forge/linux-64/julia-1.10.2-h5490d3b_0.conda#3ea0a02338d58ea113655bb22a524f58 +https://conda.anaconda.org/conda-forge/linux-64/julia-1.9.3-h06b7c97_0.conda#6214d0563598ae0cc9b954344b9f9c10 https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.2-h6238fc3_5.conda#2fef4283b2bb45a66f8b81099d36721e https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.1-pyhd8ed1ab_0.conda#4dff4abb5728f7662ecaaa8bee3a0260 -https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_hacb5139_103.conda#50f05f98d084805642d24dff910e11e8 +https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h228c76a_104.conda#91bc3ac73308181d55a09d9e4aeb4496 https://conda.anaconda.org/conda-forge/linux-64/numba-0.59.1-py311h96b013e_0.conda#cd581f19ea0c298ec6ef612fdf7d041c https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.12.1-py311h4332511_1.conda#887aa6096851eab5c34fe95ed1641591 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.52.2-ha41ecd1_0.conda#a658eeabf188c3040da36b0763de2bfd +https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda#1a66c10f6a0da3dbd2f3a68127e7f6a0 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.1-pyhd8ed1ab_0.conda#d15917f33140f8d2ac9ca44db7ec8a25 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed 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-24.0.0-pyhd8ed1ab_0.conda#b50aec2c744a5c493c09cce9e2e7533e https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 @@ -461,30 +461,32 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.con 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.2.0-pyhd8ed1ab_1.conda#f351ee57bb9c3e4b2f4952980461ba1d https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py311h517d4fd_0.conda#764b0e055f59dbd7d114d32b8c6e55e6 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py311h0bed3d6_1.conda#6fb2f733ef405b4bfb4a6a362703457e +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311he06c224_0.conda#c90e2469d7512f3bba893533a82d7a02 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-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-hba8bd5f_3.conda#720494d9f06b4aff1270cffb7acc7920 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.267-hbf3e495_6.conda#a6caf5a0d9ca940d95f21d40afe8f857 https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.1-pyhd8ed1ab_0.conda#0f8e0831bbf38d83973438ce9af9af9a https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.0.3-pyhd8ed1ab_0.conda#46b7eb9d2f3ca144f3195dc6aa7bdf93 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa https://conda.anaconda.org/conda-forge/noarch/distributed-2024.5.2-pyhd8ed1ab_0.conda#2fa6807bd19e5cdc77fe1b6a42c86228 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h9e768e6_3.conda#c330e87e698bae8e7381c0315cf25dd0 -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h4869a97_1.conda#308799e5ffa83b7b520a9c2c8c0319c1 +https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.2-py311h815a124_5.conda#84a14fd830b72b09ef886a23de557a16 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.0-hadf69e7_1.conda#0e2b5bd9533043b41f9482ae9e2c16b5 +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda#03bd1ddcc942867a19528877143b9852 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311ha4ca890_2.conda#0848e2084cbb57014f232f48568561af https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311h74118c1_101.conda#153b3a81c6f11e87b87461247c3cf061 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311h74118c1_102.conda#5f98c1d56c5853270c7876bb1000a631 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.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f 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.3.3-hf0d99cb_1.conda#f8ee712096aa7cedd3eb8d19ade82374 +https://conda.anaconda.org/conda-forge/linux-64/r-base-4.3.1-h639d9d3_5.conda#f320a6b4aba89a080d757a365138b642 +https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.9-py311h40fbdff_0.conda#dcee6ba4d1ac6af18827d0941b6a1b42 https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.0-py311he08f58d_1.conda#d55e4dde3b30272090f33ddd367c580b https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyhd8ed1ab_0.conda#846d12530687ba836791dd54db1f45c5 @@ -498,12 +500,14 @@ https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.8.5-pyhd8ed1ab_0.conda#abfb434fb6654f83d740428863ec85a8 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/graphviz-9.0.0-h78e8752_1.conda#a3f4cd4a512ec5db35ffbf25ba11f537 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-16.1.0-hcb6531f_6_cpu.conda#0df3fc2a8d63b1cc49973c5a679ec438 -https://conda.anaconda.org/conda-forge/linux-64/magics-4.15.4-h3aff5e6_0.conda#16b7a695334cb5a322045b8cb1eeb2d4 +https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.1-pyhc1e730c_0.conda#25a9661177fd68bfdb4314fd658e5c3b +https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py311hbac4ec9_0.conda#786d3808394b1bdfd3f41f2e2c67279e +https://conda.anaconda.org/conda-forge/linux-64/graphviz-8.1.0-h28d9a01_0.conda#33628e0e3de7afd2c8172f76439894cb +https://conda.anaconda.org/conda-forge/linux-64/libarrow-15.0.2-h176673d_2_cpu.conda#c130ba0c765437749dbc37fa9de85ce5 +https://conda.anaconda.org/conda-forge/linux-64/magics-4.14.2-haee2765_1.conda#0c46d548472ee1b043c65d4ab4ad6a83 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc 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-he3b17a9_50.conda#a37fcb5a2da31cfebe6734b0fda20bd5 https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.4-he646072_0.conda#ccf011f3b8edd84d938edd0848ab56d4 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.5.0-py311h38be061_1.conda#e172dce6d5f3dbf0c8dfc537c8146be3 @@ -517,12 +521,12 @@ https://conda.anaconda.org/conda-forge/linux-64/r-colorspace-2.1_0-r43h57805ef_1 https://conda.anaconda.org/conda-forge/linux-64/r-contfrac-1.1_12-r43h57805ef_1004.conda#b4dca65264e43e9a3ef2e2f39f687349 https://conda.anaconda.org/conda-forge/noarch/r-cpp11-0.4.7-r43hc72bb7e_0.conda#c9ec548d90ba0c4de83a14dab499d015 https://conda.anaconda.org/conda-forge/noarch/r-crayon-1.5.2-r43hc72bb7e_2.conda#f13cc355add93ff41ef3d7aeefee247a -https://conda.anaconda.org/conda-forge/noarch/r-dbi-1.2.2-r43hc72bb7e_0.conda#138a15a75d10f2d69cf5c2003695c8aa +https://conda.anaconda.org/conda-forge/noarch/r-dbi-1.2.3-r43hc72bb7e_0.conda#b5c79fe477c107fba33e9700d1d7e2a1 https://conda.anaconda.org/conda-forge/linux-64/r-desolve-1.40-r43hd9ac46e_0.conda#a85bc66bb89726a8fb5310f2def5d8ac https://conda.anaconda.org/conda-forge/linux-64/r-digest-0.6.35-r43ha503ecb_0.conda#d28a7db9b060ceaf683f0b036780b962 https://conda.anaconda.org/conda-forge/noarch/r-docopt-0.7.1-r43hc72bb7e_3.conda#d1a51c4e48b1184be5bb47ff13298472 https://conda.anaconda.org/conda-forge/linux-64/r-dotcall64-1.1_1-r43h61816a4_0.conda#54040b9373933275c211ccbb1d5de023 -https://conda.anaconda.org/conda-forge/noarch/r-evaluate-0.23-r43hc72bb7e_0.conda#eb2b6777e078c6db2f553ee052c742f3 +https://conda.anaconda.org/conda-forge/noarch/r-evaluate-0.24.0-r43hc72bb7e_0.conda#1c3aa7ca297fae40ea8d6a8fe78317f0 https://conda.anaconda.org/conda-forge/linux-64/r-fansi-1.0.6-r43h57805ef_0.conda#c94b12c76504df3548707218409b678f https://conda.anaconda.org/conda-forge/linux-64/r-farver-2.1.2-r43ha18555a_0.conda#b56c791245428e7b08601e3bca812b0a https://conda.anaconda.org/conda-forge/noarch/r-functional-0.6-r43ha770c72_1004.conda#2a0d8d39d328f570af24f6a2d10a47ed @@ -555,7 +559,7 @@ https://conda.anaconda.org/conda-forge/noarch/r-r6-2.5.1-r43hc72bb7e_2.conda#79f https://conda.anaconda.org/conda-forge/noarch/r-rcolorbrewer-1.1_3-r43h785f33e_2.conda#d998f26d6a55b83dab1c25b583e1463a https://conda.anaconda.org/conda-forge/linux-64/r-rcpp-1.0.12-r43h7df8631_0.conda#a8aac8be0868617b28f27484ea548d6c https://conda.anaconda.org/conda-forge/noarch/r-remotes-2.5.0-r43hc72bb7e_0.conda#a3f5e53761f368633e54c76917940eb6 -https://conda.anaconda.org/conda-forge/linux-64/r-rlang-1.1.3-r43ha503ecb_0.conda#0d71deb3b174a2876004ddcb6a4c7cfc +https://conda.anaconda.org/conda-forge/linux-64/r-rlang-1.1.4-r43ha18555a_0.conda#74c4cb6644843dccabc350cba4b56ec6 https://conda.anaconda.org/conda-forge/noarch/r-rpmg-2.2_7-r43hc72bb7e_0.conda#9fceb6466208ae034b8847cdd27bf6db https://conda.anaconda.org/conda-forge/noarch/r-rprojroot-2.0.4-r43hc72bb7e_0.conda#279a906f3d37ee80ee94950754eb9ded https://conda.anaconda.org/conda-forge/noarch/r-snow-0.4_4-r43hc72bb7e_2.conda#ceedb5263134a3100813b84c32747c78 @@ -567,21 +571,20 @@ https://conda.anaconda.org/conda-forge/noarch/r-withr-3.0.0-r43hc72bb7e_0.conda# https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.44-r43ha18555a_0.conda#8fbbfbc83f3f8572c8d5bb066a1eb8a4 https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r43hc72bb7e_2.conda#a973f1f52947adda7b4cd1ea3c2f9941 https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r43h57805ef_0.conda#41db1ee9d0073339e681379b92e7dfb6 -https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.22.0-py311h320fe9a_2.conda#e94b7f09b52628b89e66cdbd8c3029dd +https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.23.2-py311hd037940_0.conda#a27a1dc2d447c48b3a38125c70d2dc89 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 -https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.23.0-hfa691db_2.conda#f9cd15d6c7deeeb5b60d65fac59b18bc -https://conda.anaconda.org/conda-forge/linux-64/cdo-2.4.0-hd11aaf1_1.conda#a2dafc919de74991852d6449d24b0227 -https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_33-pl5321h0df52c9_0.conda#62331cc714b179bcd87bb64d1e3e8811 +https://conda.anaconda.org/conda-forge/linux-64/cdo-2.3.0-h24bcfa3_0.conda#238311a432a8e49943d3348e279af714 +https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_19-pl5321h7e74ff9_0.conda#a4a0ce7caba20cae61aac9aeacbd76c2 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-16.1.0-hac33072_6_cpu.conda#38b1161e2f8c72095f64ea35ee1294c5 -https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.8.5-h77540a9_7.conda#5937eafdfa5713c78a21cbb33a84539e -https://conda.anaconda.org/conda-forge/linux-64/libparquet-16.1.0-h6a7eafb_6_cpu.conda#87f676c6cb33f8e1956948ee216fa3a1 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-15.0.2-hac33072_2_cpu.conda#12951edff85582aedcd2db0b79393102 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-15.0.2-hd42f311_2_cpu.conda#dcc3a1e12157bbbbae96029d9d34fd0e +https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-15.0.2-hd4ab825_2_cpu.conda#a4aa5cd69e0d1959f7c965437e7ac93d +https://conda.anaconda.org/conda-forge/linux-64/libparquet-15.0.2-h6a7eafb_2_cpu.conda#b06caaa4ef20db071dc832323701e5e3 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.16.4-pyhd8ed1ab_0.conda#43d9cd74e3950ab09cbddf36f1706b9f https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.5.0-py311h38be061_1.conda#0c795bac4990aec7adabb34caa9d3873 -https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.7.0-pyhd8ed1ab_0.conda#7ad60b498674a9bff3ba8f3fb335e4f0 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-16.1.0-py311h8e2c35d_1_cpu.conda#b5c23417af8dab0136a260dbfb3c7380 +https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.7.1-pyhd8ed1ab_0.conda#447d61cb83a9c3a3916fba1bc3cff0bf 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-bigmemory-4.6.4-r43ha503ecb_0.conda#8737c1d2787e754db2e88ef1610c737a https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.3.1-r43h57805ef_0.conda#b3e470863d9e21349b1a6c075b681901 @@ -597,7 +600,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-mapproj-1.2.11-r43h57805ef_1.c https://conda.anaconda.org/conda-forge/linux-64/r-matrix-1.6_5-r43h316c678_0.conda#8146ef1b3c54e1a484822085d39357b0 https://conda.anaconda.org/conda-forge/noarch/r-munsell-0.5.1-r43hc72bb7e_0.conda#2f189c59532c130f4b83e4a50626c08b https://conda.anaconda.org/conda-forge/noarch/r-ncdf4.helpers-0.3_6-r43hc72bb7e_2.conda#23938872f695db31c28a0207c51c0f09 -https://conda.anaconda.org/conda-forge/linux-64/r-nlme-3.1_164-r43h61816a4_0.conda#7f44f44332abf00df114c685b1d6054c +https://conda.anaconda.org/conda-forge/linux-64/r-nlme-3.1_165-r43hbcb9c34_0.conda#261b441154346a173a7efd53925729dc https://conda.anaconda.org/conda-forge/linux-64/r-plyr-1.8.9-r43ha503ecb_0.conda#47bf330a88b5a59bc6e110624f1b8e7a https://conda.anaconda.org/conda-forge/linux-64/r-processx-3.8.4-r43h57805ef_0.conda#660d4e9ff8beef35dbda645484d17a25 https://conda.anaconda.org/conda-forge/noarch/r-r.oo-1.26.0-r43hc72bb7e_0.conda#e467767d55b77c81b3167f00f2ecac65 @@ -613,10 +616,9 @@ https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r43h57805ef_1.conda https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.5-pyhd8ed1ab_0.conda#0f74ff434e03fa89315ec45ec1bc4284 https://conda.anaconda.org/conda-forge/noarch/xgboost-2.0.3-cuda120_pyh68bd8d9_4.conda#aaaadc3a408067943ebc10299393a7c3 -https://conda.anaconda.org/conda-forge/linux-64/gdal-3.8.5-py311hf92cf48_7.conda#99b21fe537bd3afa6fc28949cc2d9ba5 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-16.1.0-hac33072_6_cpu.conda#2e9430df8ffd645a5bc7edffb252c3de +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-15.0.2-hac33072_2_cpu.conda#48c711b4e07664ec7b245a9664be60a1 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-15.0.2-h9241762_2_cpu.conda#97e46f0f20157e19487ca3e65100247a https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_0.conda#391934bd1a79990c23df1d1809ddc821 -https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-h41fde0b_52.conda#95107b6217e5c62d59103490428b4dc4 https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 https://conda.anaconda.org/conda-forge/linux-64/psy-maps-1.5.0-py311h38be061_1.conda#d7901c26884613539e958c10e9973413 https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.4.0-py311h38be061_3.conda#6f7871722c07922028043144e8873b37 @@ -637,9 +639,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-s2-1.1.6-r43h5eac2b3_0.conda#8 https://conda.anaconda.org/conda-forge/noarch/r-scales-1.3.0-r43hc72bb7e_0.conda#508360956e18c2b0cc18968cdb786c78 https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r43ha503ecb_3.conda#e9e632dc89a5235a6a44b42f23b497d8 https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.5-r43ha503ecb_0.conda#e398bd0451e6350a876a8561f8e90682 -https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py311h0535db5_1.conda#6c91f2b0148aaed5e94b238cb48650b3 -https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.6-py311h4c8953a_2.conda#f22ecd1ff6e17bc87a4156e9164b6957 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-16.1.0-h7e0c224_6_cpu.conda#81fea801c4bb126509e784cbd2ca4d17 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-15.0.2-h9241762_2_cpu.conda#c18bbb60ed10774dbf9ea86484728a74 https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.4-hd8ed1ab_0.conda#c9d64b8a7ee8e6bdbf0e7d8aa7f39601 https://conda.anaconda.org/conda-forge/linux-64/r-classint-0.4_10-r43h61816a4_0.conda#3cd17c77cac1801072c599c7cddff7f2 https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.1-r43hc72bb7e_0.conda#5287430003206a614ae64a91c8490e3c @@ -649,10 +649,10 @@ https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.4-r43hc72bb7e_1.c https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r43hc72bb7e_1.conda#7cff01456566a69381d3907d520c10b2 https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r43h57805ef_0.conda#713053b11419075641f09df086ef58d9 https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r43hc72bb7e_2.conda#fa01685a9c07191e186357c001b19ece -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-16.1.0-py311h781c19f_1.conda#533878c8d2d380c75356cdcabc89f89b +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-15.0.2-py311h78dcc79_2_cpu.conda#6f20003320c613f2505cf248bfce48f6 https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r43hc72bb7e_0.conda#5b6f07861439a584c942ec0c3967660f https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r43hc72bb7e_0.conda#d2b855cb2d8c0c5c870fe61d0f7e0d0c -https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_16-r43hce28180_2.conda#075f0502c30e1623158f697d419d83f1 +https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_14-r43h85a8d9e_1.conda#a2ea960cebc252c3e10c5fb9fb4dfefc https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r43h57805ef_2.conda#afa7d3f21fbc5a2fbaa48cb9bacb7bce https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.2-pyhd8ed1ab_0.conda#34db694d2afc672094f1a74af51cb44e https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda From 7719d3092327eb6b5e8eba832c533038f28c684d Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Tue, 11 Jun 2024 16:39:10 +0200 Subject: [PATCH 08/17] Use `iris.FUTURE.save_split_attrs = True` to remove iris warning in many diagnostics (#3651) --- esmvaltool/diag_scripts/shared/_base.py | 2 ++ esmvaltool/diag_scripts/shared/io.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/esmvaltool/diag_scripts/shared/_base.py b/esmvaltool/diag_scripts/shared/_base.py index b5fc072875..1789909130 100644 --- a/esmvaltool/diag_scripts/shared/_base.py +++ b/esmvaltool/diag_scripts/shared/_base.py @@ -16,6 +16,8 @@ logger = logging.getLogger(__name__) +iris.FUTURE.save_split_attrs = True + def get_plot_filename(basename, cfg): """Get a valid path for saving a diagnostic plot. diff --git a/esmvaltool/diag_scripts/shared/io.py b/esmvaltool/diag_scripts/shared/io.py index 4889f5b1c1..f3e709bd48 100644 --- a/esmvaltool/diag_scripts/shared/io.py +++ b/esmvaltool/diag_scripts/shared/io.py @@ -22,6 +22,8 @@ 'short_name', ] +iris.FUTURE.save_split_attrs = True + def _has_necessary_attributes(metadata, only_var_attrs=False, From 3c112a4d996e771e8e163a6586985487d9cb9738 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Wed, 12 Jun 2024 17:45:50 +0200 Subject: [PATCH 09/17] Avoid concatenation error in recipe_pcrglobwb.yml (#3645) --- esmvaltool/diag_scripts/hydrology/pcrglobwb.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esmvaltool/diag_scripts/hydrology/pcrglobwb.py b/esmvaltool/diag_scripts/hydrology/pcrglobwb.py index 9209f9e127..932e62cd24 100644 --- a/esmvaltool/diag_scripts/hydrology/pcrglobwb.py +++ b/esmvaltool/diag_scripts/hydrology/pcrglobwb.py @@ -4,6 +4,7 @@ import dask.array as da import iris +from esmvalcore.preprocessor import concatenate from esmvaltool.diag_scripts.shared import (ProvenanceLogger, get_diagnostic_filename, @@ -83,8 +84,7 @@ def add_spinup_year(cube, cube_climatology): coord_climatology.guess_bounds() # Create CubeList and concatenate - cube_list = iris.cube.CubeList([cube, cube_climatology]) - new_cube = iris.cube.CubeList(cube_list).concatenate_cube() + new_cube = concatenate([cube, cube_climatology]) return new_cube From e7c5cd5ace443e727b0bc208c763c8ddc3ec1451 Mon Sep 17 00:00:00 2001 From: Greg Munday <100290135+mo-gregmunday@users.noreply.github.com> Date: Thu, 20 Jun 2024 09:43:58 +0100 Subject: [PATCH 10/17] CMIP6 climate patterns (#2785) Co-authored-by: Jon Lillis Co-authored-by: Emma Hogan --- .zenodo.json | 5 + CITATION.cff | 5 + .../figures/climate_patterns/patterns.png | Bin 0 -> 184589 bytes doc/sphinx/source/recipes/index.rst | 1 + .../recipes/recipe_climate_patterns.rst | 107 +++ esmvaltool/config-references.yml | 5 + .../climate_patterns/climate_patterns.py | 658 ++++++++++++++++++ .../diag_scripts/climate_patterns/plotting.py | 128 ++++ .../climate_patterns/sub_functions.py | 267 +++++++ .../recipes/recipe_climate_patterns.yml | 249 +++++++ .../references/huntingford2000climdyn.bibtex | 14 + esmvaltool/references/mathison2024gmd.bibtex | 10 + 12 files changed, 1449 insertions(+) create mode 100644 doc/sphinx/source/recipes/figures/climate_patterns/patterns.png create mode 100644 doc/sphinx/source/recipes/recipe_climate_patterns.rst create mode 100644 esmvaltool/diag_scripts/climate_patterns/climate_patterns.py create mode 100644 esmvaltool/diag_scripts/climate_patterns/plotting.py create mode 100644 esmvaltool/diag_scripts/climate_patterns/sub_functions.py create mode 100644 esmvaltool/recipes/recipe_climate_patterns.yml create mode 100644 esmvaltool/references/huntingford2000climdyn.bibtex create mode 100644 esmvaltool/references/mathison2024gmd.bibtex diff --git a/.zenodo.json b/.zenodo.json index c6a731981f..89a81326cb 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -380,6 +380,11 @@ "affiliation": "DLR, Germany", "name": "Bonnet, Pauline", "orcid": "0000-0003-3780-0784" + }, + { + "affiliation": "MetOffice, UK", + "name": "Munday, Gregory", + "orcid": "0000-0003-4750-9923" } ], "description": "ESMValTool: A community diagnostic and performance metrics tool for routine evaluation of Earth system models in CMIP.", diff --git a/CITATION.cff b/CITATION.cff index cd621538b7..7ed624d1d7 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -391,6 +391,11 @@ authors: family-names: Bonnet given-names: Pauline orcid: "https://orcid.org/0000-0003-3780-0784" + - + affiliation: "MetOffice, UK" + family-names: Munday + given-names: Gregory + orcid: "https://orcid.org/0000-0003-4750-9923" cff-version: 1.2.0 date-released: 2023-12-20 diff --git a/doc/sphinx/source/recipes/figures/climate_patterns/patterns.png b/doc/sphinx/source/recipes/figures/climate_patterns/patterns.png new file mode 100644 index 0000000000000000000000000000000000000000..396fd788302f32393bb3fc4e29ef6ee4812d3b5c GIT binary patch literal 184589 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

H)5r+ngrV+ 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 5: + axis[x_pos, y_pos].set_xlabel("Time") + + # January patterns + plt.subplot(3, 3, j + 1) + qplt.pcolormesh(cube[0]) + + plt.tight_layout() + plt.savefig(os.path.join(plot_path, "Patterns"), dpi=300) + plt.close() + + fig.tight_layout() + fig.savefig(os.path.join(plot_path, "Patterns Timeseries"), dpi=300) + + +def plot_timeseries(cubelist, plot_path, title, save_name): + """Plot timeseries and maps of climatologies, anomalies and patterns. + + Parameters + ---------- + cubelist : cubelist + input cubelist for plotting per variable + plot_path : path + path to plot_dir + title: str + title for the figure + save_name: str + name for the saved figure + + Returns + ------- + None + """ + fig, axs = plt.subplots(3, 3, figsize=(14, 12), sharex=True) + fig.suptitle(f"{title}", fontsize=18, y=0.98) + + for j, cube in enumerate(cubelist): + # determining plot positions + x_pos, y_pos = subplot_positions(j) + yrs = (1850 + np.arange(cube.shape[0])).astype("float") + months = np.arange(1, 13) + + # anomaly timeseries + avg_cube = area_statistics(cube, 'mean').data + if save_name == "Climatologies": + axs[x_pos, y_pos].plot(months, avg_cube) + else: + axs[x_pos, y_pos].plot(yrs, avg_cube) + axs[x_pos, + y_pos].set_ylabel(cube.long_name + " / " + str(cube.units)) + if j > 5: + axs[x_pos, y_pos].set_xlabel("Time") + + fig.tight_layout() + fig.savefig(os.path.join(plot_path, f"{save_name}"), dpi=300) diff --git a/esmvaltool/diag_scripts/climate_patterns/sub_functions.py b/esmvaltool/diag_scripts/climate_patterns/sub_functions.py new file mode 100644 index 0000000000..4b3fe00141 --- /dev/null +++ b/esmvaltool/diag_scripts/climate_patterns/sub_functions.py @@ -0,0 +1,267 @@ +# (C) Crown Copyright 2022-2024, Met Office. +"""Script containing relevant sub-functions for driving scripts. + +Author +------ +Gregory Munday (Met Office, UK) +""" + +import logging +import multiprocessing as mp +import os +from functools import partial +from pathlib import Path + +import iris +import iris.analysis.cartography +import iris.coord_categorisation +import dask as da + +logger = logging.getLogger(Path(__file__).stem) + + +def load_cube(filename): + """Load cube, remove any dimensions of length: 1. + + Parameters + ---------- + filename : path + path to load cube file + + Returns + ------- + cube : cube + a cube + """ + logger.debug("Loading %s", filename) + cube = iris.load_cube(filename) + cube = iris.util.squeeze(cube) + + return cube + + +def ocean_fraction_calc(sftlf): + """Calculate gridded land and ocean fractions. + + Parameters + ---------- + sftlf: cube + land-fraction cube from piControl experiment + + Returns + ------- + ocean_frac: cube + ocean_fraction cube for area-weights + land_frac: cube + land_fraction cube for area-weights + """ + sftlf.coord("latitude").coord_system = iris.coord_systems.GeogCS( + 6371229.0 + ) + sftlf.coord("longitude").coord_system = iris.coord_systems.GeogCS( + 6371229.0 + ) + sftof = 100 - sftlf + + ocean_frac = sftof / 100 + land_frac = sftlf / 100 + + return ocean_frac, land_frac + + +def area_avg_landsea(cube, + ocean_frac, + land_frac, + land=True, + return_cube=False): + """Calculate the global mean of a variable in a cube. + + Parameters + ---------- + cube : cube + input cube + ocean_frac : cube + ocean fraction cube, found from sftlf + land_frac : cube + land fraction cube, sftlf + land : bool + option to weight be land or ocean + return_cube : bool + option to return a cube or array + + Returns + ------- + cube2 : cube + cube with collapsed lat-lons, global mean over time + cube2.data : arr + array with collapsed lat-lons, global mean over time + """ + if not cube.coord("latitude").has_bounds(): + cube.coord("latitude").guess_bounds() + if not cube.coord("longitude").has_bounds(): + cube.coord("longitude").guess_bounds() + + global_weights = iris.analysis.cartography.area_weights( + cube, + normalize=False + ) + + if land is False: + ocean_frac.data = da.array.ma.masked_less(ocean_frac.core_data(), 0.01) + weights = iris.analysis.cartography.area_weights( + ocean_frac, + normalize=False + ) + ocean_area = ( + ocean_frac.collapsed( + ["latitude", "longitude"], iris.analysis.SUM, weights=weights + ) + / 1e12 + ) + cube2 = cube * global_weights * ocean_frac + + cube2 = ( + cube2.collapsed(["latitude", "longitude"], iris.analysis.SUM) + / 1e12 + / ocean_area + ) + + if land: + land_frac.data = da.array.ma.masked_less(land_frac.core_data(), 0.01) + weights = iris.analysis.cartography.area_weights( + land_frac, + normalize=False + ) + land_area = ( + land_frac.collapsed( + ["latitude", "longitude"], iris.analysis.SUM, weights=weights + ) + / 1e12 + ) + + # Iris is too strict so we need to use core_data in this calculation + cube2 = cube * global_weights * land_frac.core_data() + cube2 = ( + cube2.collapsed(["latitude", "longitude"], iris.analysis.SUM) + / 1e12 + / land_area + ) + + if return_cube: + return cube2 + + return cube2.data + + +def make_model_dirs(cfg, model): + """Create directories for each input model for saving. + + Parameters + ---------- + cfg: dict + Dictionary passed in by ESMValTool preprocessors + model : str + model name + + Returns + ------- + model_work_dir : path + path to specific model directory in work_dir + model_plot_dir : path + path to specific plot directory in plot_dir + """ + work_path = cfg["work_dir"] + plot_path = cfg["plot_dir"] + model_work_dir = os.path.join(work_path, model) + model_plot_dir = os.path.join(plot_path, model) + + if not os.path.exists(model_work_dir): + os.mkdir(model_work_dir) + if not os.path.exists(model_plot_dir): + os.mkdir(model_plot_dir) + + return model_work_dir, model_plot_dir + + +def rename_variables(cube, has_orig_vars=True, new_extension=""): + """Rename variables and a coord to fit in JULES framework. + + Parameters + ---------- + cube : cube + input cube + has_orig_vars : bool + if True, rename to new var names with correct extension + new_extension : str + extension to add to variable names + + Returns + ------- + cube : cube + cube with renamed variables + """ + original_var_names = ["tas", "range_tl1", "huss", "pr", + "sfcWind", "ps", "rsds", "rlds"] + new_var_names = ["tl1", "range_tl1", "ql1", "precip", + "wind", "pstar", "swdown", "lwdown"] + long_var_names = [ + "Air Temperature", + "Diurnal Range", + "Specific Humidity", + "Precipitation", + "Wind Speed", + "Surface Pressure", + "Surface Downwelling Shortwave Radiation", + "Surface Downwelling Longwave Radiation" + ] + for orig_var, new_var, long_var in zip( + original_var_names, new_var_names, long_var_names + ): + if has_orig_vars: + if cube.var_name == orig_var: + cube.var_name = f"{new_var}{new_extension}" + cube.coord("month_number").rename("imogen_drive") + return cube + else: + if cube.var_name == f"{new_var}_anom": + cube.rename(long_var) + cube.var_name = f"{new_var}_patt" + return cube + if cube.var_name == f"{new_var}_patt": + cube.rename(long_var) + cube.var_name = orig_var + cube.coord("imogen_drive").rename("month_number") + return cube + + return None + + +def parallelise(function, processes=None): + """Parallelise any function, by George Ford, Met Office. + + Parameters + ---------- + function : function + function to be parallelised + processes : int + number of threads to be used in parallelisation + + Returns + ------- + result : any + results of parallelised elements + """ + if processes is None: + processes = max(1, mp.cpu_count() - 1) + if processes <= 0: + processes = 1 + + def easy_parallise(func, sequence, cfg): + with mp.Pool(processes=processes) as pool: + config_wrapper = partial(func, cfg=cfg) + result = pool.map_async(config_wrapper, sequence).get() + pool.close() + pool.join() + return result + + return partial(easy_parallise, function) diff --git a/esmvaltool/recipes/recipe_climate_patterns.yml b/esmvaltool/recipes/recipe_climate_patterns.yml new file mode 100644 index 0000000000..08e0c51779 --- /dev/null +++ b/esmvaltool/recipes/recipe_climate_patterns.yml @@ -0,0 +1,249 @@ +# ESMValTool +# recipe_climate_patterns.yml +--- +documentation: + description: Generating climate patterns from CMIP6 models. + title: Generating Climate Patterns + + authors: + - munday_gregory + + maintainer: + - munday_gregory + + references: + - mathison2024gmd + - huntingford2000climdyn + +preprocessors: + global_mean_monthly: + monthly_statistics: + operator: mean + + regrid: + target_grid: {start_longitude: -180, end_longitude: 176.25, step_longitude: 3.75, + start_latitude: -55, end_latitude: 82.5, step_latitude: 2.5} + scheme: linear + + downscale_sftlf: + regrid: + target_grid: {start_longitude: -180, end_longitude: 176.25, step_longitude: 3.75, + start_latitude: -55, end_latitude: 82.5, step_latitude: 2.5} + scheme: linear + +monthly_global_settings: &monthly_global_settings + mip: Amon + project: CMIP6 + preprocessor: global_mean_monthly + +monthly_global_settings_day: &monthly_global_settings_day + mip: day + project: CMIP6 + preprocessor: global_mean_monthly + + +CMIP6_landfrac: &cmip6_landfrac + - {dataset: ACCESS-CM2, exp: piControl, ensemble: r1i1p1f1, grid: gn, institute: CSIRO-ARCCSS} + - {dataset: ACCESS-ESM1-5, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: AWI-CM-1-1-MR, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-CSM2-MR, exp: hist-resIPO,ensemble: r1i1p1f1, grid: gn} + - {dataset: CanESM5, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: CanESM5-CanOE, exp: piControl, ensemble: r1i1p2f1, grid: gn} + - {dataset: CanESM5-1, exp: piControl, ensemble: r1i1p1f1, grid: gn, institute: CCCma} + # - {dataset: CAS-ESM2-0, exp: piControl, ensemble: r1i1p1f1, grid: gn} # Global only + - {dataset: CMCC-ESM2, exp: piControl, ensemble: r1i1p1f1, grid: gn} + # - {dataset: CMCC-CM2-SR5, exp: piControl, ensemble: r1i1p1f1, grid: gn} # No tasmin/tasmax + - {dataset: CNRM-CM6-1, exp: piControl, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-CM6-1-HR, exp: piControl, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, exp: piControl, ensemble: r1i1p1f2, grid: gr} + # - {dataset: E3SM-1-0, exp: piControl, ensemble: r1i1p1f1, grid: gr} # Tasmax == tasmin + - {dataset: EC-Earth3, exp: piControl, ensemble: r1i1p1f1, grid: gr} + # - {dataset: EC-Earth3-CC, exp: piControl, ensemble: r1i1p1f1, grid: gr} # Global only + - {dataset: EC-Earth3-Veg, exp: piControl, ensemble: r1i1p1f1, grid: gr} + # - {dataset: FGOALS-f3-L, exp: historical, ensemble: r1i1p1f1, grid: gr} # No tasmin/tasmax + - {dataset: FGOALS-g3, exp: piControl, ensemble: r1i1p1f1, grid: gn} + # - {dataset: FIO-ESM-2-0, exp: piControl, ensemble: r1i1p1f1, grid: gn} # Global only + - {dataset: GFDL-CM4, exp: piControl, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GFDL-ESM4, exp: ssp370, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-H, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: GISS-E2-1-G, exp: piControl, ensemble: r1i1p5f1, grid: gn} + - {dataset: GISS-E2-2-G, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-MM, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: INM-CM4-8, exp: piControl, ensemble: r1i1p1f1, grid: gr1} + - {dataset: INM-CM5-0, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1} + - {dataset: IPSL-CM6A-LR, exp: piControl, ensemble: r1i1p1f1, grid: gr} + # - {dataset: KACE-1-0-G, exp: piControl, ensemble: r1i1p1f1, grid: gr} # Global only, weird tasmin/tasmax + # - {dataset: KIOST-ESM, exp: piControl, ensemble: r1i1p1f1, grid: gr} # Global only + - {dataset: MIROC6, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, exp: piControl, ensemble: r1i1p1f2, grid: gn} + - {dataset: MIROC-ES2H, exp: piControl, ensemble: r1i1p4f2, grid: gn} + - {dataset: MPI-ESM1-2-HR, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-LR, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, exp: piControl, ensemble: r1i1p1f1, grid: gn} + # - {dataset: NorESM2-LM, exp: piControl, ensemble: r1i1p1f1, grid: gn} # Global only, tasmax == tasmin + - {dataset: NorESM2-MM, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: TaiESM1, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: UKESM1-0-LL, exp: piControl, ensemble: r1i1p1f2, grid: gn} + +CMIP6_no_tasmax: &cmip6_no_tasmax + # - {dataset: E3SM-1-0, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2099} # bad tasmin/tasmax + # - {dataset: NorESM2-LM, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} # bad tasmin/tasmax + - {dataset: NorESM2-MM, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: TaiESM1, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + +CMIP6_DAY: &cmip6_day + # - {dataset: E3SM-1-0, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2099} # bad tasmin/tasmax + # - {dataset: NorESM2-LM, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} # bad tasmin/tasmax + - {dataset: NorESM2-MM, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: TaiESM1, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + +CMIP6_FULL: &cmip6_full + - {dataset: ACCESS-CM2, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100, institute: CSIRO-ARCCSS} + - {dataset: ACCESS-ESM1-5, exp: [historical, ssp585], ensemble: r3i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: AWI-CM-1-1-MR, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: BCC-CSM2-MR, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: CanESM5, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: CanESM5-1, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100, institute: CCCma} # optional extra + - {dataset: CanESM5-CanOE, exp: [historical, ssp585], ensemble: r1i1p2f1, grid: gn, start_year: 1850, end_year: 2100} + # - {dataset: CAS-ESM2-0, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} # Global only + - {dataset: CMCC-ESM2, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + # - {dataset: CMCC-CM2-SR5, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} # No tasmin/tasmax + - {dataset: CNRM-CM6-1, exp: [historical, ssp585], ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 2100} + - {dataset: CNRM-CM6-1-HR, exp: [historical, ssp585], ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 2100} + - {dataset: CNRM-ESM2-1, exp: [historical, ssp585], ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 2100} + - {dataset: EC-Earth3, exp: [historical, ssp585], ensemble: r11i1p1f1, grid: gr, start_year: 1850, end_year: 2100} + # - {dataset: EC-Earth3-CC, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2100} # Global only + - {dataset: EC-Earth3-Veg, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2100} + # - {dataset: FGOALS-f3-L, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2100} # No tasmin/tasmax + - {dataset: FGOALS-g3, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + # - {dataset: FIO-ESM-2-0, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} # Global only + - {dataset: GFDL-CM4, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 2100} + - {dataset: GFDL-ESM4, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 2100} + - {dataset: GISS-E2-1-H, exp: [historical, ssp585], ensemble: r3i1p1f2, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: GISS-E2-1-G, exp: [historical, ssp585], ensemble: r1i1p5f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: GISS-E2-2-G, exp: [historical, ssp585], ensemble: r1i1p3f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: HadGEM3-GC31-LL, exp: [historical, ssp585], ensemble: r1i1p1f3, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: HadGEM3-GC31-MM, exp: [historical, ssp585], ensemble: r1i1p1f3, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: INM-CM4-8, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 2100} + - {dataset: INM-CM5-0, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 2100} + - {dataset: IPSL-CM6A-LR, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2100} + # - {dataset: KACE-1-0-G, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2100} # bad tasmin/tasmax + # - {dataset: KIOST-ESM, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2100} # optional extra + - {dataset: MIROC6, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: MIROC-ES2L, exp: [historical, ssp585], ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: MIROC-ES2H, exp: [historical, ssp585], ensemble: r1i1p4f2, grid: gn, start_year: 1850, end_year: 2100} # optional extra + - {dataset: MPI-ESM1-2-HR, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: MPI-ESM1-2-LR, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: MRI-ESM2-0, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: UKESM1-0-LL, exp: [historical, ssp585], ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 2100} + +diagnostics: + monthly_timeseries: + description: Mean monthly variables + + variables: + + # sftlf: + # short_name: sftlf + # mip: fx + # project: CMIP6 + # preprocessor: downscale_sftlf + # additional_datasets: *cmip6_landfrac + + tasmax_585: + short_name: tasmax + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + tasmin_585: + short_name: tasmin + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + tas_585: + short_name: tas + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + huss_585: + short_name: huss + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + pr_585: + short_name: pr + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + sfcWind_585: + short_name: sfcWind + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + ps_585: + short_name: ps + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + rsds_585: + short_name: rsds + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + rlds_585: + short_name: rlds + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + tasmax_585_day: + short_name: tasmax + <<: *monthly_global_settings_day + additional_datasets: *cmip6_day + + tasmin_585_day: + short_name: tasmin + <<: *monthly_global_settings_day + additional_datasets: *cmip6_day + + tas_585_no_tasmax: + short_name: tas + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + huss_585_no_tasmax: + short_name: huss + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + pr_585_no_tasmax: + short_name: pr + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + sfcWind_585_no_tasmax: + short_name: sfcWind + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + ps_585_no_tasmax: + short_name: ps + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + rsds_585_no_tasmax: + short_name: rsds + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + rlds_585_no_tasmax: + short_name: rlds + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + scripts: + climate_patterns_script: + script: climate_patterns/climate_patterns.py + jules_mode: false # options: true, false + parallelise: false # options: true, false + area: global # options global, land. If land, uncomment landfrac recipe settings diff --git a/esmvaltool/references/huntingford2000climdyn.bibtex b/esmvaltool/references/huntingford2000climdyn.bibtex new file mode 100644 index 0000000000..69bc072d49 --- /dev/null +++ b/esmvaltool/references/huntingford2000climdyn.bibtex @@ -0,0 +1,14 @@ +@article{huntingford2000, + title = {An analogue model to derive additional climate change scenarios from existing {GCM} simulations}, + volume = {16}, + issn = {1432-0894}, + url = {https://doi.org/10.1007/s003820000067}, + doi = {10.1007/s003820000067}, + abstract = {Changes in land surface driving variables, predicted by GCM transient climate change experiments, are confirmed to exhibit linearity in the global mean land temperature anomaly, ΔTl. The associated constants of proportionality retain spatial and seasonal characteristics of the GCM output, whilst ΔTlis related to radiative forcing anomalies. The resultant analogue model is shown to be robust between GCM runs and as such provides a computationally efficient technique of extending existing GCM experiments to a large range of climate change scenarios. As an example impacts study, the analogue model is used to drive a terrestrial ecosystem model, and predicted changes in terrestrial carbon are found to be similar to those when using GCM anomalies directly.}, + number = {8}, + journal = {Climate Dynamics}, + author = {Huntingford, C. and Cox, P. M.}, + month = aug, + year = {2000}, + pages = {575--586}, +} diff --git a/esmvaltool/references/mathison2024gmd.bibtex b/esmvaltool/references/mathison2024gmd.bibtex new file mode 100644 index 0000000000..a6090db6c7 --- /dev/null +++ b/esmvaltool/references/mathison2024gmd.bibtex @@ -0,0 +1,10 @@ +@Article{mathison2024, + AUTHOR = {Mathison, C. T. and Burke, E. and Kovacs, E. and Munday, G. and Huntingford, C. and Jones, C. and Smith, C. and Steinert, N. and Wiltshire, A. and Gohar, L. and Varney, R.}, + TITLE = {A rapid application emissions-to-impacts tool for scenario assessment: Probabilistic Regional Impacts from Model patterns and Emissions (PRIME)}, + JOURNAL = {EGUsphere}, + VOLUME = {2024}, + YEAR = {2024}, + PAGES = {1--28}, + URL = {https://egusphere.copernicus.org/preprints/2024/egusphere-2023-2932/}, + DOI = {10.5194/egusphere-2023-2932} +} From 304d38b8e1bdf5106714a436c74cec39dc6dd6ee Mon Sep 17 00:00:00 2001 From: Ed <146008263+mo-gill@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:07:12 +0100 Subject: [PATCH 11/17] Improve the formatting of the recipe documentation template (#3652) --- doc/sphinx/source/recipes/recipe_seaborn.rst | 4 ++-- doc/sphinx/source/recipes/recipe_template.rst.template | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/sphinx/source/recipes/recipe_seaborn.rst b/doc/sphinx/source/recipes/recipe_seaborn.rst index 3c8fa64357..4eb3c6571c 100644 --- a/doc/sphinx/source/recipes/recipe_seaborn.rst +++ b/doc/sphinx/source/recipes/recipe_seaborn.rst @@ -16,11 +16,11 @@ Available recipes and diagnostics Recipes are stored in recipes/ - * recipe_seaborn.yml +* recipe_seaborn.yml Diagnostics are stored in diag_scripts/ - * :ref:`seaborn_diag.py ` +* :ref:`seaborn_diag.py ` Variables diff --git a/doc/sphinx/source/recipes/recipe_template.rst.template b/doc/sphinx/source/recipes/recipe_template.rst.template index 55e28ddf7e..6c248ed5d7 100644 --- a/doc/sphinx/source/recipes/recipe_template.rst.template +++ b/doc/sphinx/source/recipes/recipe_template.rst.template @@ -14,11 +14,11 @@ Available recipes and diagnostics Recipes are stored in esmvaltool/recipes/ - * recipe_.yml +* recipe_.yml Diagnostics are stored in esmvaltool/diag_scripts// - * : one line scription +* : one line scription User settings in recipe From 967589c5eda541694e7090770a141632995a4ecf Mon Sep 17 00:00:00 2001 From: Lisa Bock Date: Fri, 21 Jun 2024 14:39:27 +0200 Subject: [PATCH 12/17] Fix recipe_check_obs to be aligned with DKRZ (#3673) --- .../recipes/examples/recipe_check_obs.yml | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index bfc6639bc9..10504a3692 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -23,7 +23,7 @@ diagnostics: variables: pr: additional_datasets: - - {project: OBS6, dataset: AGCD, mip: Amon, tier: 3, + - {project: OBS6, dataset: AGCD, mip: Amon, tier: 2, type: ground, version: v2-0-1} scripts: null @@ -539,7 +539,7 @@ diagnostics: rsutcs: additional_datasets: - {dataset: JRA-25, project: OBS6, mip: Amon, tier: 2, - type: reanaly, version: 1, start_year: 1979, end_year: 2013} + type: reanaly, version: 1, start_year: 1979, end_year: 2007} scripts: null Kadow2020: @@ -932,7 +932,7 @@ diagnostics: variables: od440aer: additional_datasets: - - {dataset: AERONET, project: OBS6, mip: AERmon, tier: 3, type: atmos, version: 20231021} + - {dataset: AERONET, project: OBS6, mip: AERmon, tier: 3, type: atmos, version: 20240406} scripts: null ANUClimate: @@ -1481,10 +1481,10 @@ diagnostics: short_name: rlns mip: E1hr frequency: 1hr - rlus_E1hr: - short_name: rlus - mip: E1hr - frequency: 1hr + #rlus_E1hr: + # short_name: rlus + # mip: E1hr + # frequency: 1hr rsds_E1hr: short_name: rsds mip: E1hr @@ -1495,10 +1495,10 @@ diagnostics: short_name: rsns mip: E1hr frequency: 1hr - rsus_E1hr: - short_name: rsus - mip: E1hr - frequency: 1hr + #rsus_E1hr: + # short_name: rsus + # mip: E1hr + # frequency: 1hr rss_E1hr: short_name: rss mip: E1hr @@ -1565,9 +1565,9 @@ diagnostics: rlns_Amon: short_name: rlns mip: Amon - rlus_Amon: - short_name: rlus - mip: Amon + #rlus_Amon: + # short_name: rlus + # mip: Amon rsds_Amon: short_name: rsds mip: Amon @@ -1577,9 +1577,9 @@ diagnostics: rsns_Amon: short_name: rsns mip: Amon - rsus_Amon: - short_name: rsus - mip: Amon + #rsus_Amon: + # short_name: rsus + # mip: Amon rss_Amon: short_name: rss mip: Amon From ba18b0498e22f8cf1391d35dcee13c8e9792094c Mon Sep 17 00:00:00 2001 From: Lisa Bock Date: Mon, 24 Jun 2024 07:50:58 +0200 Subject: [PATCH 13/17] Fix recipe_bock20jgr_fig_8-10.yml (#3665) --- esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_8-10.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_8-10.yml b/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_8-10.yml index a01020e709..bc277209d7 100644 --- a/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_8-10.yml +++ b/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_8-10.yml @@ -434,6 +434,8 @@ diagnostics: exp: historical ensemble: r1i1p1 mip: Amon + modeling_realm: atmos + frequency: mon additional_datasets: *cmip5_all fig_9_cmip6: @@ -446,6 +448,8 @@ diagnostics: exp: historical ensemble: r1i1p1f1 mip: Amon + modeling_realm: atmos + frequency: mon grid: gr additional_datasets: *cmip6_all From a9ba8e59d507a77e5ea707387801c028160ec5c1 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Mon, 24 Jun 2024 09:37:19 +0200 Subject: [PATCH 14/17] Add introduction material on the main documentation page (#3628) --- doc/sphinx/source/index.rst | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/doc/sphinx/source/index.rst b/doc/sphinx/source/index.rst index 9975172bc4..ac9b177fa9 100644 --- a/doc/sphinx/source/index.rst +++ b/doc/sphinx/source/index.rst @@ -6,6 +6,26 @@ Welcome to ESMValTool's documentation! ====================================== +To get a first impression of what ESMValTool and ESMValCore can do for you, +have a look at our blog posts +`Analysis-ready climate data with ESMValCore `_ +and +`ESMValTool: Recipes for solid climate science `_. + +A tutorial is available on https://tutorial.esmvaltool.org. + +A series of video lectures has been created by `ACCESS-NRI `_. +While these are tailored for ACCESS users, they are still very informative. + +.. raw:: html + + + +| +For more detailed information, the documentation is available below. + +Get in touch! Contact information is available :ref:`here `. + .. include:: _sidebar.rst.inc Indices and tables @@ -13,4 +33,3 @@ Indices and tables * :ref:`genindex` * :ref:`search` - From 6f3e3b5b44b588624ad1a2091e901f7cbb05e3a5 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Mon, 24 Jun 2024 10:23:23 +0200 Subject: [PATCH 15/17] Avoid warning in documentation build (#3675) --- doc/sphinx/source/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/sphinx/source/index.rst b/doc/sphinx/source/index.rst index ac9b177fa9..136c2eba08 100644 --- a/doc/sphinx/source/index.rst +++ b/doc/sphinx/source/index.rst @@ -22,6 +22,7 @@ While these are tailored for ACCESS users, they are still very informative. | + For more detailed information, the documentation is available below. Get in touch! Contact information is available :ref:`here `. From b946c9b5b8f17cc9477f5b033c227dfbc6536ada Mon Sep 17 00:00:00 2001 From: Emma Hogan Date: Mon, 24 Jun 2024 17:24:54 +0100 Subject: [PATCH 16/17] Use `importlib` as the import mode for `pytest` (#3672) --- .../aerosols/aod_aeronet_assess.py | 2 +- .../climate_patterns/climate_patterns.py | 16 ++++++++-------- esmvaltool/diag_scripts/ensclus/ens_anom.py | 11 +++++++++-- .../diag_scripts/ensclus/ens_eof_kmeans.py | 4 ++-- esmvaltool/diag_scripts/ensclus/ens_plots.py | 4 ++-- esmvaltool/diag_scripts/ensclus/ensclus.py | 17 +++++++++++------ esmvaltool/diag_scripts/examples/correlate.py | 2 +- .../iht_toa/single_model_diagnostics.py | 2 +- esmvaltool/diag_scripts/mpqb/mpqb_lineplot.py | 2 +- .../diag_scripts/mpqb/mpqb_lineplot_anncyc.py | 2 +- .../mpqb/mpqb_lineplot_growthrate.py | 2 +- .../weighting/climwip/calibrate_sigmas.py | 16 ++++++++-------- .../diag_scripts/weighting/climwip/main.py | 18 ++++++++++-------- .../diag_scripts/weighting/plot_utilities.py | 3 ++- .../weighting/weighted_temperature_graph.py | 5 ++++- .../weighting/weighted_temperature_map.py | 5 ++++- esmvaltool/diag_scripts/zmnam/zmnam.py | 9 ++++++--- setup.cfg | 1 + 18 files changed, 73 insertions(+), 48 deletions(-) diff --git a/esmvaltool/diag_scripts/aerosols/aod_aeronet_assess.py b/esmvaltool/diag_scripts/aerosols/aod_aeronet_assess.py index 27ab6b2714..3866e3c51a 100644 --- a/esmvaltool/diag_scripts/aerosols/aod_aeronet_assess.py +++ b/esmvaltool/diag_scripts/aerosols/aod_aeronet_assess.py @@ -11,10 +11,10 @@ import matplotlib.pyplot as plt import numpy as np import scipy -from aero_utils import add_bounds, extract_pt from matplotlib import colors, gridspec from numpy import ma +from esmvaltool.diag_scripts.aerosols.aero_utils import add_bounds, extract_pt from esmvaltool.diag_scripts.shared import group_metadata, run_diagnostic from esmvaltool.diag_scripts.shared._base import get_plot_filename diff --git a/esmvaltool/diag_scripts/climate_patterns/climate_patterns.py b/esmvaltool/diag_scripts/climate_patterns/climate_patterns.py index 7fdb98a293..bc265cda00 100644 --- a/esmvaltool/diag_scripts/climate_patterns/climate_patterns.py +++ b/esmvaltool/diag_scripts/climate_patterns/climate_patterns.py @@ -28,24 +28,24 @@ """ import logging -from pathlib import Path import os +from pathlib import Path import iris import iris.coord_categorisation import iris.cube import numpy as np import sklearn.linear_model - -import sub_functions as sf -from plotting import ( - plot_timeseries, - plot_patterns -) from esmvalcore.preprocessor import ( area_statistics, + climate_statistics, extract_time, - climate_statistics +) + +import esmvaltool.diag_scripts.climate_patterns.sub_functions as sf +from esmvaltool.diag_scripts.climate_patterns.plotting import ( + plot_patterns, + plot_timeseries, ) from esmvaltool.diag_scripts.shared import run_diagnostic diff --git a/esmvaltool/diag_scripts/ensclus/ens_anom.py b/esmvaltool/diag_scripts/ensclus/ens_anom.py index a3b664d11a..ef9c303786 100644 --- a/esmvaltool/diag_scripts/ensclus/ens_anom.py +++ b/esmvaltool/diag_scripts/ensclus/ens_anom.py @@ -1,12 +1,19 @@ """Computation of ensemble anomalies based on a desired value.""" import os + import numpy as np from scipy import stats # User-defined packages -from read_netcdf import read_iris, save_n_2d_fields -from sel_season_area import sel_area, sel_season +from esmvaltool.diag_scripts.ensclus.read_netcdf import ( + read_iris, + save_n_2d_fields, +) +from esmvaltool.diag_scripts.ensclus.sel_season_area import ( + sel_area, + sel_season, +) def ens_anom(filenames, dir_output, name_outputs, varname, numens, season, diff --git a/esmvaltool/diag_scripts/ensclus/ens_eof_kmeans.py b/esmvaltool/diag_scripts/ensclus/ens_eof_kmeans.py index 2be17195b0..940af71278 100644 --- a/esmvaltool/diag_scripts/ensclus/ens_eof_kmeans.py +++ b/esmvaltool/diag_scripts/ensclus/ens_eof_kmeans.py @@ -10,8 +10,8 @@ from sklearn.cluster import KMeans # User-defined libraries -from eof_tool import eof_computation -from read_netcdf import read_n_2d_fields +from esmvaltool.diag_scripts.ensclus.eof_tool import eof_computation +from esmvaltool.diag_scripts.ensclus.read_netcdf import read_n_2d_fields def ens_eof_kmeans(dir_output, name_outputs, numens, numpcs, perc, numclus): diff --git a/esmvaltool/diag_scripts/ensclus/ens_plots.py b/esmvaltool/diag_scripts/ensclus/ens_plots.py index 55ad420b08..1b06acd671 100644 --- a/esmvaltool/diag_scripts/ensclus/ens_plots.py +++ b/esmvaltool/diag_scripts/ensclus/ens_plots.py @@ -3,12 +3,12 @@ import math import os +import cartopy.crs as ccrs import matplotlib.pyplot as plt import numpy as np -import cartopy.crs as ccrs # User-defined libraries -from read_netcdf import read_n_2d_fields +from esmvaltool.diag_scripts.ensclus.read_netcdf import read_n_2d_fields def ens_plots(dir_output, dir_plot, name_outputs, numclus, diff --git a/esmvaltool/diag_scripts/ensclus/ensclus.py b/esmvaltool/diag_scripts/ensclus/ensclus.py index a669a9a02d..df06ea411c 100644 --- a/esmvaltool/diag_scripts/ensclus/ensclus.py +++ b/esmvaltool/diag_scripts/ensclus/ensclus.py @@ -13,16 +13,21 @@ 20170710-mavilia_irene: routines written. """ -import os import logging +import os + import numpy as np -from esmvaltool.diag_scripts.shared import group_metadata, run_diagnostic -from esmvaltool.diag_scripts.shared import ProvenanceLogger, sorted_metadata # Import user diagnostic routines -from ens_anom import ens_anom -from ens_eof_kmeans import ens_eof_kmeans -from ens_plots import ens_plots +from esmvaltool.diag_scripts.ensclus.ens_anom import ens_anom +from esmvaltool.diag_scripts.ensclus.ens_eof_kmeans import ens_eof_kmeans +from esmvaltool.diag_scripts.ensclus.ens_plots import ens_plots +from esmvaltool.diag_scripts.shared import ( + ProvenanceLogger, + group_metadata, + run_diagnostic, + sorted_metadata, +) logger = logging.getLogger(os.path.basename(__file__)) diff --git a/esmvaltool/diag_scripts/examples/correlate.py b/esmvaltool/diag_scripts/examples/correlate.py index 171a24a51f..052f3d2bdc 100644 --- a/esmvaltool/diag_scripts/examples/correlate.py +++ b/esmvaltool/diag_scripts/examples/correlate.py @@ -6,7 +6,7 @@ from iris.analysis import MEAN from iris.analysis.stats import pearsonr -from diagnostic import plot_diagnostic +from esmvaltool.diag_scripts.examples.diagnostic import plot_diagnostic from esmvaltool.diag_scripts.shared import group_metadata, run_diagnostic logger = logging.getLogger(os.path.basename(__file__)) diff --git a/esmvaltool/diag_scripts/iht_toa/single_model_diagnostics.py b/esmvaltool/diag_scripts/iht_toa/single_model_diagnostics.py index fc917a8aa5..e56240c67a 100644 --- a/esmvaltool/diag_scripts/iht_toa/single_model_diagnostics.py +++ b/esmvaltool/diag_scripts/iht_toa/single_model_diagnostics.py @@ -16,8 +16,8 @@ import numpy as np from iris import NameConstraint from matplotlib import gridspec, rcParams -from poisson_solver import SphericalPoisson +from esmvaltool.diag_scripts.iht_toa.poisson_solver import SphericalPoisson from esmvaltool.diag_scripts.shared import ( group_metadata, run_diagnostic, diff --git a/esmvaltool/diag_scripts/mpqb/mpqb_lineplot.py b/esmvaltool/diag_scripts/mpqb/mpqb_lineplot.py index fe4cf2deb0..b08a2cd012 100644 --- a/esmvaltool/diag_scripts/mpqb/mpqb_lineplot.py +++ b/esmvaltool/diag_scripts/mpqb/mpqb_lineplot.py @@ -7,9 +7,9 @@ import iris import matplotlib.dates as mdates import matplotlib.pyplot as plt -from mpqb_utils import get_mpqb_cfg import esmvaltool.diag_scripts.shared.iris_helpers as ih +from esmvaltool.diag_scripts.mpqb.mpqb_utils import get_mpqb_cfg from esmvaltool.diag_scripts.shared import group_metadata, run_diagnostic from esmvaltool.diag_scripts.shared._base import ( ProvenanceLogger, diff --git a/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_anncyc.py b/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_anncyc.py index e2a5a662b2..d087499d60 100644 --- a/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_anncyc.py +++ b/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_anncyc.py @@ -6,8 +6,8 @@ import iris import matplotlib.pyplot as plt -from mpqb_utils import get_mpqb_cfg +from esmvaltool.diag_scripts.mpqb.mpqb_utils import get_mpqb_cfg from esmvaltool.diag_scripts.shared import group_metadata, run_diagnostic from esmvaltool.diag_scripts.shared._base import ( ProvenanceLogger, diff --git a/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_growthrate.py b/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_growthrate.py index a6ec136966..90662be72b 100644 --- a/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_growthrate.py +++ b/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_growthrate.py @@ -8,9 +8,9 @@ import matplotlib.dates as mdates import matplotlib.pyplot as plt import numpy as np -from mpqb_utils import get_mpqb_cfg import esmvaltool.diag_scripts.shared.iris_helpers as ih +from esmvaltool.diag_scripts.mpqb.mpqb_utils import get_mpqb_cfg from esmvaltool.diag_scripts.shared import group_metadata, run_diagnostic from esmvaltool.diag_scripts.shared._base import ( ProvenanceLogger, diff --git a/esmvaltool/diag_scripts/weighting/climwip/calibrate_sigmas.py b/esmvaltool/diag_scripts/weighting/climwip/calibrate_sigmas.py index 0998346b22..1d85e1f95a 100644 --- a/esmvaltool/diag_scripts/weighting/climwip/calibrate_sigmas.py +++ b/esmvaltool/diag_scripts/weighting/climwip/calibrate_sigmas.py @@ -6,7 +6,13 @@ import matplotlib.pyplot as plt import numpy as np import xarray as xr -from core_functions import ( +from scipy.optimize import brute + +from esmvaltool.diag_scripts.shared import ( + get_diagnostic_filename, + get_plot_filename, +) +from esmvaltool.diag_scripts.weighting.climwip.core_functions import ( area_weighted_mean, calculate_model_distances, calculate_weights, @@ -14,17 +20,11 @@ compute_overall_mean, weighted_quantile, ) -from io_functions import ( +from esmvaltool.diag_scripts.weighting.climwip.io_functions import ( read_metadata, read_model_data, read_model_data_ancestor, ) -from scipy.optimize import brute - -from esmvaltool.diag_scripts.shared import ( - get_diagnostic_filename, - get_plot_filename, -) logger = logging.getLogger(os.path.basename(__file__)) diff --git a/esmvaltool/diag_scripts/weighting/climwip/main.py b/esmvaltool/diag_scripts/weighting/climwip/main.py index 6b22399547..f46db62090 100644 --- a/esmvaltool/diag_scripts/weighting/climwip/main.py +++ b/esmvaltool/diag_scripts/weighting/climwip/main.py @@ -10,15 +10,22 @@ import numpy as np import seaborn as sns import xarray as xr -from calibrate_sigmas import calibrate_performance_sigma -from core_functions import ( + +from esmvaltool.diag_scripts.shared import ( + get_diagnostic_filename, + get_plot_filename, + run_diagnostic, +) +from esmvaltool.diag_scripts.weighting.climwip.calibrate_sigmas import ( + calibrate_performance_sigma, ) +from esmvaltool.diag_scripts.weighting.climwip.core_functions import ( area_weighted_mean, calculate_model_distances, calculate_weights, combine_ensemble_members, compute_overall_mean, ) -from io_functions import ( +from esmvaltool.diag_scripts.weighting.climwip.io_functions import ( log_provenance, read_metadata, read_model_data, @@ -27,11 +34,6 @@ read_observation_data_ancestor, ) -from esmvaltool.diag_scripts.shared import ( - get_diagnostic_filename, - get_plot_filename, - run_diagnostic, -) logger = logging.getLogger(os.path.basename(__file__)) diff --git a/esmvaltool/diag_scripts/weighting/plot_utilities.py b/esmvaltool/diag_scripts/weighting/plot_utilities.py index 706dfd64c9..a071a3c7f0 100644 --- a/esmvaltool/diag_scripts/weighting/plot_utilities.py +++ b/esmvaltool/diag_scripts/weighting/plot_utilities.py @@ -3,7 +3,8 @@ import xarray as xr -from climwip.core_functions import weighted_quantile +from esmvaltool.diag_scripts.weighting.climwip.core_functions import ( + weighted_quantile, ) def read_weights(filename: str) -> dict: diff --git a/esmvaltool/diag_scripts/weighting/weighted_temperature_graph.py b/esmvaltool/diag_scripts/weighting/weighted_temperature_graph.py index 5b871283d7..f5f1086e1e 100644 --- a/esmvaltool/diag_scripts/weighting/weighted_temperature_graph.py +++ b/esmvaltool/diag_scripts/weighting/weighted_temperature_graph.py @@ -10,13 +10,16 @@ import matplotlib.pyplot as plt import numpy as np import xarray as xr -from climwip.io_functions import log_provenance, read_model_data from esmvaltool.diag_scripts.shared import ( get_diagnostic_filename, get_plot_filename, run_diagnostic, ) +from esmvaltool.diag_scripts.weighting.climwip.io_functions import ( + log_provenance, + read_model_data, +) from esmvaltool.diag_scripts.weighting.plot_utilities import ( calculate_percentiles, read_metadata, diff --git a/esmvaltool/diag_scripts/weighting/weighted_temperature_map.py b/esmvaltool/diag_scripts/weighting/weighted_temperature_map.py index 7a161d2535..667a382d94 100644 --- a/esmvaltool/diag_scripts/weighting/weighted_temperature_map.py +++ b/esmvaltool/diag_scripts/weighting/weighted_temperature_map.py @@ -11,13 +11,16 @@ import matplotlib.pyplot as plt import numpy as np from cartopy.mpl.ticker import LatitudeFormatter, LongitudeFormatter -from climwip.io_functions import log_provenance, read_model_data from esmvaltool.diag_scripts.shared import ( get_diagnostic_filename, get_plot_filename, run_diagnostic, ) +from esmvaltool.diag_scripts.weighting.climwip.io_functions import ( + log_provenance, + read_model_data, +) from esmvaltool.diag_scripts.weighting.plot_utilities import ( calculate_percentiles, read_metadata, diff --git a/esmvaltool/diag_scripts/zmnam/zmnam.py b/esmvaltool/diag_scripts/zmnam/zmnam.py index d86ee48458..c0450c117a 100644 --- a/esmvaltool/diag_scripts/zmnam/zmnam.py +++ b/esmvaltool/diag_scripts/zmnam/zmnam.py @@ -20,9 +20,12 @@ from esmvaltool.diag_scripts.shared import ProvenanceLogger, run_diagnostic # Import zmnam diagnostic routines -from zmnam_calc import zmnam_calc -from zmnam_plot import zmnam_plot -from zmnam_preproc import (zmnam_preproc, zmnam_preproc_clean) +from esmvaltool.diag_scripts.zmnam.zmnam_calc import zmnam_calc +from esmvaltool.diag_scripts.zmnam.zmnam_plot import zmnam_plot +from esmvaltool.diag_scripts.zmnam.zmnam_preproc import ( + zmnam_preproc, + zmnam_preproc_clean, +) logger = logging.getLogger(__name__) diff --git a/setup.cfg b/setup.cfg index c738c5d716..e28f8079a0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,6 @@ [tool:pytest] addopts = + --import-mode=importlib --doctest-modules --ignore=doc/sphinx/source/conf.py --cov=esmvaltool From 0c323e4a4ecc5304f075a97168f10294b0da41a9 Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:37:20 +0200 Subject: [PATCH 17/17] Prevent overlapping time axis tick labels in monitoring recipe (#3682) --- .../diag_scripts/monitor/multi_datasets.py | 90 ++++++++++--------- .../monitor/recipe_monitor_with_refs.yml | 6 +- 2 files changed, 54 insertions(+), 42 deletions(-) diff --git a/esmvaltool/diag_scripts/monitor/multi_datasets.py b/esmvaltool/diag_scripts/monitor/multi_datasets.py index a760a312f6..c87fd26cac 100644 --- a/esmvaltool/diag_scripts/monitor/multi_datasets.py +++ b/esmvaltool/diag_scripts/monitor/multi_datasets.py @@ -138,12 +138,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the datasets plotted in the - corresponding plot, e.g., ``{short_name}``, ``{exp}``. Facets like - ``{project}`` that vary between the different datasets will be transformed - to something like ``ambiguous_project``. Examples: ``title: 'Awesome Plot - of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. time_format: str, optional (default: None) :func:`~datetime.datetime.strftime` format string that is used to format the time axis using :class:`matplotlib.dates.DateFormatter`. If ``None``, @@ -171,12 +171,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the datasets plotted in the - corresponding plot, e.g., ``{short_name}``, ``{exp}``. Facets like - ``{project}`` that vary between the different datasets will be transformed - to something like ``ambiguous_project``. Examples: ``title: 'Awesome Plot - of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. Configuration options for plot type ``map`` ------------------------------------------- @@ -247,10 +247,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the corresponding dataset, e.g., - ``{project}``, ``{short_name}``, ``{exp}``. Examples: ``title: 'Awesome - Plot of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. rasterize: bool, optional (default: True) If ``True``, use rasterization_ for map plots to produce smaller files. This is only relevant for vector graphics (e.g., ``output_file_type: @@ -326,10 +328,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the corresponding dataset, e.g., - ``{project}``, ``{short_name}``, ``{exp}``. Examples: ``title: 'Awesome - Plot of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. rasterize: bool, optional (default: True) If ``True``, use rasterization_ for profile plots to produce smaller files. This is only relevant for vector graphics (e.g., ``output_file_type: @@ -378,12 +382,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the datasets plotted in the - corresponding plot, e.g., ``{short_name}``, ``{exp}``. Facets like - ``{project}`` that vary between the different datasets will be transformed - to something like ``ambiguous_project``. Examples: ``title: 'Awesome Plot - of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. show_y_minor_ticklabels: bool, optional (default: False) Show tick labels for the minor ticks on the Y axis. @@ -409,12 +413,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the datasets plotted in the - corresponding plot, e.g., ``{short_name}``, ``{exp}``. Facets like - ``{project}`` that vary between the different datasets will be transformed - to something like ``ambiguous_project``. Examples: ``title: 'Awesome Plot - of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. Configuration options for plot type ``hovmoeller_z_vs_time`` ------------------------------------------------------------ @@ -476,10 +480,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the corresponding dataset, e.g., - ``{project}``, ``{short_name}``, ``{exp}``. Examples: ``title: 'Awesome - Plot of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. rasterize: bool, optional (default: True) If ``True``, use rasterization_ for profile plots to produce smaller files. This is only relevant for vector graphics (e.g., ``output_file_type: @@ -559,10 +565,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the corresponding dataset, e.g., - ``{project}``, ``{short_name}``, ``{exp}``. Examples: ``title: 'Awesome - Plot of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. rasterize: bool, optional (default: True) If ``True``, use rasterization_ for profile plots to produce smaller files. This is only relevant for vector graphics (e.g., ``output_file_type: @@ -1791,6 +1799,8 @@ def _process_pyplot_kwargs(self, plot_type, dataset): ) if arg is None: getattr(plt, func)() + elif isinstance(arg, dict): + getattr(plt, func)(**arg) else: getattr(plt, func)(arg) diff --git a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml index 681277310c..48c5153287 100644 --- a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml +++ b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml @@ -225,7 +225,7 @@ diagnostics: ta: preprocessor: global_mean_extract_levels mip: Amon - timerange: '2000/2004' + timerange: '2000/2005' scripts: plot: <<: *plot_multi_dataset_default @@ -238,6 +238,8 @@ diagnostics: log_y: false pyplot_kwargs: ylim: [0, 20000] + xticks: + rotation: 25 plot_time_vs_lat_with_references: description: Plot Hovmoeller time vs. latitude including reference datasets. @@ -245,7 +247,7 @@ diagnostics: tas: mip: Amon preprocessor: zonal_mean_2d - timerange: '2000/2004' + timerange: '2000/2005' scripts: plot: <<: *plot_multi_dataset_default