diff --git a/.github/workflows/citation_file_validator.yml b/.github/workflows/citation_file_validator.yml index 43a4d5c444..e957d40f86 100644 --- a/.github/workflows/citation_file_validator.yml +++ b/.github/workflows/citation_file_validator.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out a copy of the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Check whether the citation metadata from CITATION.cff is valid uses: citation-file-format/cffconvert-github-action@2.0.0 diff --git a/.github/workflows/create-condalock-file.yml b/.github/workflows/create-condalock-file.yml index 9aefad7498..a88f919c17 100644 --- a/.github/workflows/create-condalock-file.yml +++ b/.github/workflows/create-condalock-file.yml @@ -20,10 +20,10 @@ jobs: name: Create conda lock file for latest Python runs-on: 'ubuntu-latest' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: auto-update-conda: true activate-environment: esmvaltool-fromlock @@ -35,7 +35,7 @@ jobs: run: | conda update -n base -c conda-forge conda conda --version - # setup-miniconda@v2 installs an old conda and mamba + # setup-miniconda@v3 installs an old conda and mamba # forcing a modern mamba updates both mamba and conda conda install -c conda-forge "mamba>=1.4.8" conda config --show-sources diff --git a/.github/workflows/install-from-conda.yml b/.github/workflows/install-from-conda.yml index 55897e7fe4..862fd0aad6 100644 --- a/.github/workflows/install-from-conda.yml +++ b/.github/workflows/install-from-conda.yml @@ -23,7 +23,7 @@ jobs: python-version: ["3.9", "3.10", "3.11"] name: Linux Python ${{ matrix.python-version }} steps: - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: python-version: ${{ matrix.python-version }} miniforge-version: "latest" @@ -44,7 +44,7 @@ jobs: esmvaltool version 2>&1 | tee conda_install_linux_artifacts_python_${{ matrix.python-version }}/version.txt - name: Upload artifacts if: ${{ always() }} # upload artifacts even if fail - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: Conda_Install_Linux_python_${{ matrix.python-version }} path: conda_install_linux_artifacts_python_${{ matrix.python-version }} @@ -61,7 +61,7 @@ jobs: # name: OSX Python ${{ matrix.python-version }} # steps: # - uses: actions/checkout@v2 -# - uses: conda-incubator/setup-miniconda@v2 +# - uses: conda-incubator/setup-miniconda@v3 # with: # python-version: ${{ matrix.python-version }} # miniconda-version: "latest" @@ -82,7 +82,7 @@ jobs: # - run: esmvaltool version 2>&1 | tee conda_install_osx_artifacts_python_${{ matrix.python-version }}/version.txt # - name: Upload artifacts # if: ${{ always() }} # upload artifacts even if fail -# uses: actions/upload-artifact@v2 +# uses: actions/upload-artifact@v4 # with: # name: Conda_Install_OSX_python_${{ matrix.python-version }} # path: conda_install_osx_artifacts_python_${{ matrix.python-version }} diff --git a/.github/workflows/install-from-condalock-file.yml b/.github/workflows/install-from-condalock-file.yml index a209c06f32..ef19a4cb15 100644 --- a/.github/workflows/install-from-condalock-file.yml +++ b/.github/workflows/install-from-condalock-file.yml @@ -34,10 +34,10 @@ jobs: fail-fast: false name: Linux Python ${{ matrix.python-version }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: activate-environment: esmvaltool-fromlock python-version: ${{ matrix.python-version }} @@ -57,7 +57,7 @@ jobs: - run: pytest -n 2 -m "not installation" - name: Upload artifacts if: ${{ always() }} # upload artifacts even if fail - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: Source_Install_Linux_python_${{ matrix.python-version }} path: source_install_linux_artifacts_python_${{ matrix.python-version }} diff --git a/.github/workflows/install-from-source.yml b/.github/workflows/install-from-source.yml index 2e24b8f049..6e9c1de19a 100644 --- a/.github/workflows/install-from-source.yml +++ b/.github/workflows/install-from-source.yml @@ -23,10 +23,10 @@ jobs: fail-fast: false name: Linux Python ${{ matrix.python-version }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: activate-environment: esmvaltool environment-file: environment.yml @@ -47,7 +47,7 @@ jobs: esmvaltool version 2>&1 | tee source_install_linux_artifacts_python_${{ matrix.python-version }}/version.txt - name: Upload artifacts if: ${{ always() }} # upload artifacts even if fail - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: Source_Install_Linux_python_${{ matrix.python-version }} path: source_install_linux_artifacts_python_${{ matrix.python-version }} @@ -64,7 +64,7 @@ jobs: # name: OSX Python ${{ matrix.python-version }} # steps: # - uses: actions/checkout@v2 -# - uses: conda-incubator/setup-miniconda@v2 +# - uses: conda-incubator/setup-miniconda@v3 # with: # activate-environment: esmvaltool # environment-file: environment.yml @@ -79,7 +79,7 @@ jobs: # - run: esmvaltool version 2>&1 | tee source_install_osx_artifacts_python_${{ matrix.python-version }}/version.txt # - name: Upload artifacts # if: ${{ always() }} # upload artifacts even if fail -# uses: actions/upload-artifact@v2 +# uses: actions/upload-artifact@v4 # with: # name: Source_Install_OSX_python_${{ matrix.python-version }} # path: source_install_osx_artifacts_python_${{ matrix.python-version }} diff --git a/.github/workflows/pypi-build-and-deploy.yml b/.github/workflows/pypi-build-and-deploy.yml index f1ed214e12..4dff1e4d69 100644 --- a/.github/workflows/pypi-build-and-deploy.yml +++ b/.github/workflows/pypi-build-and-deploy.yml @@ -14,7 +14,7 @@ jobs: name: Build and publish ESMValTool on PyPi runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Python 3.11 diff --git a/.github/workflows/run-tests-monitor.yml b/.github/workflows/run-tests-monitor.yml index 1efe54a66a..52cc282235 100644 --- a/.github/workflows/run-tests-monitor.yml +++ b/.github/workflows/run-tests-monitor.yml @@ -26,10 +26,10 @@ jobs: python-version: ["3.9", "3.10", "3.11"] name: Linux Python ${{ matrix.python-version }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: activate-environment: esmvaltool environment-file: environment.yml @@ -42,6 +42,8 @@ jobs: run: | mamba --version 2>&1 | tee test_linux_artifacts_python_${{ matrix.python-version }}/conda_version.txt python -V 2>&1 | tee test_linux_artifacts_python_${{ matrix.python-version }}/python_version.txt + - name: Inspect environment + run: conda list - name: Install pytest-monitor run: pip install pytest-monitor - name: Install ESMValTool @@ -56,7 +58,7 @@ jobs: run: python tests/parse_pymon.py - name: Upload artifacts if: ${{ always() }} # upload artifacts even if fail - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: Test_Linux_python_${{ matrix.python-version }} path: test_linux_artifacts_python_${{ matrix.python-version }} @@ -66,14 +68,16 @@ jobs: strategy: matrix: python-version: ["3.9", "3.10", "3.11"] + architecture: ["x64"] # need to force Intel, arm64 builds have issues fail-fast: false name: OSX Python ${{ matrix.python-version }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: + architecture: ${{ matrix.architecture }} activate-environment: esmvaltool environment-file: environment_osx.yml python-version: ${{ matrix.python-version }} @@ -87,6 +91,10 @@ jobs: run: | mamba --version 2>&1 | tee test_osx_artifacts_python_${{ matrix.python-version }}/conda_version.txt python -V 2>&1 | tee test_osx_artifacts_python_${{ matrix.python-version }}/python_version.txt + - name: Inspect environment + run: conda list + - name: Install git + run: mamba install -c conda-forge git - name: Install pytest-monitor run: pip install pytest-monitor - name: Install ESMValTool @@ -101,7 +109,7 @@ jobs: run: python tests/parse_pymon.py - name: Upload artifacts if: ${{ always() }} # upload artifacts even if fail - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: Test_OSX_python_${{ matrix.python-version }} path: test_osx_artifacts_python_${{ matrix.python-version }} diff --git a/.github/workflows/test-development.yml b/.github/workflows/test-development.yml index cab6489548..7ff8c93680 100644 --- a/.github/workflows/test-development.yml +++ b/.github/workflows/test-development.yml @@ -30,10 +30,10 @@ jobs: python-version: ["3.9", "3.10", "3.11"] name: Linux Python ${{ matrix.python-version }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: activate-environment: esmvaltool environment-file: environment.yml @@ -62,7 +62,7 @@ jobs: run: pytest -n 2 -m "not installation" 2>&1 | tee develop_test_linux_artifacts_python_${{ matrix.python-version }}/test_report.txt - name: Upload artifacts if: ${{ always() }} # upload artifacts even if fail - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: Develop_Test_Linux_python_${{ matrix.python-version }} path: develop_test_linux_artifacts_python_${{ matrix.python-version }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9eec648279..49f1a14003 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,7 +6,6 @@ on: push: branches: - main - - fix_recipe_filler_bkwds_incompatibility schedule: - cron: '0 0 * * *' @@ -24,10 +23,10 @@ jobs: python-version: ["3.9", "3.10", "3.11"] name: Linux Python ${{ matrix.python-version }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: activate-environment: esmvaltool environment-file: environment.yml @@ -42,6 +41,8 @@ jobs: python -V 2>&1 | tee test_linux_artifacts_python_${{ matrix.python-version }}/python_version.txt # this is how to export variables to the GITHUB var environment echo "pver0=$(python -V)" >> $GITHUB_ENV + - name: Inspect environment + run: conda list - name: Install ESMValTool run: pip install -e .[develop] 2>&1 | tee test_linux_artifacts_python_${{ matrix.python-version }}/install.txt - name: Install Julia dependencies @@ -54,13 +55,15 @@ jobs: echo "Python minor version changed after Julia install" python -V exit 1 + - name: Inspect environment + run: conda list - name: Run flake8 run: flake8 - name: Run tests run: pytest -n 2 -m "not installation" 2>&1 | tee test_linux_artifacts_python_${{ matrix.python-version }}/test_report.txt - name: Upload artifacts if: ${{ always() }} # upload artifacts even if fail - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: Test_Linux_python_${{ matrix.python-version }} path: test_linux_artifacts_python_${{ matrix.python-version }} @@ -70,14 +73,16 @@ jobs: strategy: matrix: python-version: ["3.9", "3.10", "3.11"] + architecture: ["x64"] # need to force Intel, arm64 builds have issues fail-fast: false name: OSX Python ${{ matrix.python-version }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: + architecture: ${{ matrix.architecture }} activate-environment: esmvaltool environment-file: environment_osx.yml python-version: ${{ matrix.python-version }} @@ -91,15 +96,25 @@ jobs: run: | mamba --version 2>&1 | tee test_osx_artifacts_python_${{ matrix.python-version }}/conda_version.txt python -V 2>&1 | tee test_osx_artifacts_python_${{ matrix.python-version }}/python_version.txt + - name: Inspect environment + run: conda list + - name: Determine if git + run: | + which git + git --version + - name: Install git + run: mamba install -c conda-forge git - name: Install ESMValTool run: pip install -e .[develop] 2>&1 | tee test_osx_artifacts_python_${{ matrix.python-version }}/install.txt + - name: Inspect environment + run: conda list - name: Run flake8 run: flake8 - name: Run tests run: pytest -n 2 -m "not installation" 2>&1 | tee test_osx_artifacts_python_${{ matrix.python-version }}/test_report.txt - name: Upload artifacts if: ${{ always() }} # upload artifacts even if fail - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: Test_OSX_python_${{ matrix.python-version }} path: test_osx_artifacts_python_${{ matrix.python-version }} diff --git a/CITATION.cff b/CITATION.cff index 5c253e3bb5..cd621538b7 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -175,6 +175,11 @@ authors: family-names: Hagemann given-names: Stefan orcid: "https://orcid.org/0000-0001-5444-2945" + - + affiliation: "University of Canterbury, New Zealand" + family-names: Hardacre + given-names: Catherine + orcid: "https://orcid.org/0000-0001-9093-4656" - affiliation: "ISAC-CNR, Italy" name-particle: von diff --git a/README.md b/README.md index 4fbe8aa84e..b196f7fbb8 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,7 @@ [![Chat on Matrix](https://matrix.to/img/matrix-badge.svg)](https://matrix.to/#/#ESMValGroup_Lobby:gitter.im) [![CircleCI](https://circleci.com/gh/ESMValGroup/ESMValTool/tree/main.svg?style=svg)](https://circleci.com/gh/ESMValGroup/ESMValTool/tree/main) [![Test in Full Development Mode](https://github.com/ESMValGroup/ESMValTool/actions/workflows/test-development.yml/badge.svg)](https://github.com/ESMValGroup/ESMValTool/actions/workflows/test-development.yml) -[![Codacy Badge](https://app.codacy.com/project/badge/Coverage/79bf6932c2e844eea15d0fb1ed7e415c)](https://www.codacy.com/gh/ESMValGroup/ESMValTool?utm_source=github.com&utm_medium=referral&utm_content=ESMValGroup/ESMValTool&utm_campaign=Badge_Coverage) -[![Codacy Badge](https://app.codacy.com/project/badge/Grade/79bf6932c2e844eea15d0fb1ed7e415c)](https://www.codacy.com/gh/ESMValGroup/ESMValTool?utm_source=github.com&utm_medium=referral&utm_content=ESMValGroup/ESMValTool&utm_campaign=Badge_Grade) +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/79bf6932c2e844eea15d0fb1ed7e415c)](https://app.codacy.com/gh/ESMValGroup/ESMValTool/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) [![Docker Build Status](https://img.shields.io/docker/cloud/build/esmvalgroup/esmvaltool.svg)](https://hub.docker.com/r/esmvalgroup/esmvaltool/) [![Anaconda-Server Badge](https://img.shields.io/conda/vn/conda-forge/ESMValTool?color=blue&label=conda-forge&logo=conda-forge&logoColor=white)](https://anaconda.org/conda-forge/esmvaltool) ![stand with Ukraine](https://badgen.net/badge/stand%20with/UKRAINE/?color=0057B8&labelColor=FFD700) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index b3ef76dd7a..f37c2e310d 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: e484ece0f2a2f8e9f3009df8b9de1be258c70868b9df17114bb859f15f903ccf +# input_hash: be61247fa188c644bffb3a402ab7a5b10c4294187450b4a075a088bde1255a2e @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 @@ -10,88 +10,91 @@ https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_3.conda https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda#6185f640c43843e5ad6fd1c5372c3f80 +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-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.2.0-ha9c7c90_105.conda#3bc29a967fee57e193ce51f51c598bca -https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.2.0-ha9c7c90_105.conda#66383205c2e1bdf013df52fa9e3e6763 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a -https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.1.12.2-ha770c72_0.conda#4f04ceee8d953367da7de726af233303 +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/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 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.2-ha770c72_0.conda#8c924f0b7f3e064b1c954a08e7c32fba https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda#d8d7293c5b37f39b2ac32940621c6592 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/linux-64/xorg-imake-1.0.7-0.tar.bz2#23acfc5a339a6a34cc2241f64e4111be https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda#d211c42b9ce49aee3734fdc828731689 +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-hf600244_0.conda#33084421a8c0af6aef1b439707f7662a +https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha885e6a_0.conda#800a4c872b5bc06fa83888d112fe6c4f 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-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b -https://conda.anaconda.org/conda-forge/linux-64/aom-3.5.0-h27087fc_0.tar.bz2#a08150fd2298460cd1fcccf626305642 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.8.23-hd590300_0.conda#cc4f06f7eedb1523f3b83fd0fb3942ff +https://conda.anaconda.org/conda-forge/linux-64/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/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda#f6afff0e9ee08d2f1b897881a4f38cdb +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/freexl-1.0.6-h166bdaf_1.tar.bz2#897e772a157faf3330d72dd291486f62 +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.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 +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.02.1-h59595ed_0.conda#3750ef83be92ff8de6e44da80d509847 -https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda#96f3b11872ef6fad973eac856cd2624f -https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-h59595ed_0.conda#0e33ef437202db431aa5a928248cf2e8 -https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 -https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 +https://conda.anaconda.org/conda-forge/linux-64/ghostscript-10.03.0-h59595ed_0.conda#cb3c1aca441b476684b240ce43f767fd +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 +https://conda.anaconda.org/conda-forge/linux-64/gtest-1.14.0-h00ab1b0_1.conda#d362a81b815334cc921b9362782881f3 +https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf -https://conda.anaconda.org/conda-forge/linux-64/json-c-0.16-hc379101_0.tar.bz2#0e2bca6857cb73acec30387fef7c3142 +https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h7ab15ed_0.conda#9961b1f100c3b6852bd97c9233d06979 https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libabseil-20230125.3-cxx17_h59595ed_0.conda#d1db1b8be7c3a8983dcbbbfe4f0765de -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_9.conda#61641e239f96eae2b8492dc7e755828c +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_h59595ed_0.conda#682bdbe046a68f749769b492f3625c5c +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa +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.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 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.1-h59595ed_0.conda#476fb82aba5358a08d52ec44e286ce33 +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/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace +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-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 +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/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libnuma-2.0.16-h0b41bf4_1.conda#28bfe2cb11357ccc5be21101a6b7ce86 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-h7e041cc_5.conda#3f686300a92604d1bdff9a29dd4a6639 +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.3.1-hd590300_0.conda#82bf6f63eb15ef719b556b63feec3a77 +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/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-h516909a_1000.tar.bz2#bb14fcb13341b81d5eb386423b9d2bac +https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 https://conda.anaconda.org/conda-forge/linux-64/make-4.3-hd18ef5c_1.tar.bz2#4049ebfd3190b580dffe76daed26155a https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.5.1-h59595ed_0.conda#a7b444a6e008b804b35521895e3440e2 https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-h59595ed_1007.conda#40ccb8318df2500f83bd868dd8fcd201 -https://conda.anaconda.org/conda-forge/linux-64/nccl-2.20.5.1-h6103f9b_0.conda#bedb0b33c5e3e6fbd4dce4f6f07fea72 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 +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.1.5-hd590300_0.conda#a6057a9b8f0bba4ab6ee3347a9b26b94 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda#c0f3abb4a16477208bbd43a39bd56f18 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/rdma-core-28.9-h59595ed_1.conda#aeffb7c06b5f65e55e6c637408dc4100 -https://conda.anaconda.org/conda-forge/linux-64/re2-2023.03.02-h8c504da_0.conda#206f8fa808748f6e90599c3368a1114e +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.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 +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.7-h59595ed_1.conda#c5edf07141147789784f89d5b4e4a9ad +https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 @@ -106,86 +109,91 @@ 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.0-h93469e0_0.conda#580a52a05f5be28ce00764149017c6d4 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h862ab75_1.conda#0013fcee7acb3cfc801c5929824feb3c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.11-h862ab75_1.conda#6fbc9bd49434eb36d3a59c5020f4af95 -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.16-h862ab75_1.conda#f883d61afbc95c50f7b3f62546da4235 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.1-h59595ed_0.conda#ee90e7ac57321f8782f8438bf647b75b -https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.2.0-h338b0a0_5.conda#a6be13181cb66a78544b1d5f7bac97d0 -https://conda.anaconda.org/conda-forge/linux-64/glog-0.6.0-h6f12383_0.tar.bz2#b31f3565cb84435407594e548a2fb7b2 -https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 -https://conda.anaconda.org/conda-forge/linux-64/libavif-0.11.1-h8182462_2.conda#41c399ed4c439e37b844c24ab5621b5a -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_9.conda#081aa22f4581c08e4372b0b6c2f8478e -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_9.conda#1f0a03af852a9659ed2bf08f2f1704fd +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/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/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 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 -https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1016.conda#4d0907546d556ef7f14b1dcfa0e217ce +https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda#b63d9b6da3653179a278077f0de20014 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd +https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1018.conda#3eb5f16bcc8a02892199aa63555c731f https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda#73301c133ded2bf71906aa2104edae8b -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_0.conda#9b13d5ee90fc9f09d54fd403247342b4 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a 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.23.3-hd1fb520_1.conda#78c10e8637a6f8d377f9989327d0267d -https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h0d5128d_13.conda#e1d6139ff0500977a760567a4bec1ce9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 +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/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_hd3b444d_1.conda#5a03d2c691df2f689f919b5a3693af0b -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h0d562d8_0.conda#558ab736404275d7df61c473c1af35aa +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/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b -https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h9458935_0.conda#4c28f3210b30250037a4a627eeee9e0f +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.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda#f2cfec9406850991f4e3d960cc9e3321 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.46-h06160fa_0.conda#413d96a0b655c8f8aacc36473a2dbb04 +https://conda.anaconda.org/conda-forge/linux-64/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/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/ucx-1.14.1-h64cca9d_5.conda#39aa3b356d10d7e5add0c540945a0944 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/zeromq-4.3.5-h59595ed_1.conda#7fc9d3288d2420bb3637647621018000 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.28-h3870b5a_0.conda#b775667301ab249f94ad2bea91fc4223 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 -https://conda.anaconda.org/conda-forge/linux-64/boost-cpp-1.78.0-h6582d0a_3.conda#d3c3c7698d0b878aab1b86db95407c8e -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b +https://conda.anaconda.org/conda-forge/linux-64/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/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 -https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.13.2-hb4ffafa_0.conda#976aaf1afd331ed7346d649da5c5c1ee +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/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-13.2.0-h76e1118_5.conda#4685e2c6393800ce0d88d3876ceb7416 -https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.2.0-h338b0a0_5.conda#88d0ccab114eb0e837725bd48cdddae5 -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.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 -https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.6.2-h039dbb9_1.conda#29cf970521d30d113f3425b84cb250f6 -https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.5.1-h1f77430_0.conda#16802fd0c80290248ea79a570bd83b95 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.1-hebfc3b9_0.conda#ddd09e8904fde46b85f41896621803e6 -https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.56.2-h3905398_1.conda#0b01e6ff8002994bd4ddbffcdbec7856 -https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda#f36ddc11ca46958197a45effdd286e45 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.26-pthreads_h384dd9e_0.conda#4510b0d48d80db41d0614726a5683070 -https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.18.1-h8fd135c_2.conda#bbf65f7688512872f063810623b755dc -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d -https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.37-h0054252_1.conda#f27960e8873abb5476e96ef33bdbdccd -https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda#54b56c2fdf973656b748e0378900ec13 -https://conda.anaconda.org/conda-forge/linux-64/orc-1.9.0-h385abfd_1.conda#2cd5aac7ef1b4c6ac51bf521251a89b3 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.6-hab00c5b_0_cpython.conda#b0dfbe2fcbfdb097d321bfd50ecddab1 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed +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/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/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 +https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.10.2-hcae5a98_0.conda#901db891e1e21afd8524cd636a8c8e3b +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/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/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/tktable-2.10-h0c5db8f_5.conda#9464044754ea25557a9c93f0327d90a6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b +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-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b +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.3.1-h9599702_1.conda#a8820ce2dbe6f7d54f6540d9a3a0028a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-hbe98c3e_0.conda#067641478d8f706b80a5a434a22b82be +https://conda.anaconda.org/conda-forge/linux-64/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/backports.zoneinfo-0.2.1-py311h38be061_8.conda#5384590f14dfe6ccd02811236afc9f8e -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py311ha362b79_9.conda#ced5340f5dc6cff43a80deac8d0e398f +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/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 @@ -196,66 +204,66 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/config-0.5.1-pyhd8ed1ab_0.tar.bz2#97275d4898af65967b1ad57923cef770 https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda#0d07dc29b1c1cc973f76b74beb44915f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.9-py311hb755f60_0.conda#c49924051b8336f6031eb3d019619cba +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py311hb755f60_0.conda#f3a8a500a2e743ff92f418f0eaf9bf71 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda#78745f157d56877a2c6e7b386f66f3e2 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 -https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe +https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda#e8cd5d629f65bdf0f3bb312cde14659e https://conda.anaconda.org/conda-forge/noarch/dodgy-0.2.1-py_0.tar.bz2#62a69d073f7446c90f417b0787122f5b https://conda.anaconda.org/conda-forge/noarch/ecmwf-api-client-1.6.3-pyhd8ed1ab_0.tar.bz2#15621abf59053e184114d3e1d4f9d01e https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-1.1.0-pyhd8ed1ab_0.conda#a2f2138597905eaa72e561d8efb42cf3 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 +https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2#348e27e78a5e39090031448c72f66d5e -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d +https://conda.anaconda.org/conda-forge/linux-64/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.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 -https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h6b639ba_2.conda#ee8220db21db8094998005990418fe5b +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/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.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 +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 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.1.2-pyhd8ed1ab_0.tar.bz2#3c3de74912f11d2b590184f03c7cd09b +https://conda.anaconda.org/conda-forge/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/noarch/lazy_loader-0.3-pyhd8ed1ab_0.conda#69ea1d0fa7ab33b48c88394ad1dead65 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-h409715c_0.conda#50c873c9660ed116707ae15b663928d8 -https://conda.anaconda.org/conda-forge/linux-64/libpq-15.3-hbcd7760_1.conda#8afb2a97d256ffde95b91a6283bc598c -https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.1-hbf2b3c1_0.conda#4963f3f12db45a576f2b8fbe9a0b8569 +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/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/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-4.9.3-py311h1a07684_1.conda#aab51e50d994e58efdfa5382139b0468 +https://conda.anaconda.org/conda-forge/linux-64/lxml-5.2.2-py311hc0a218f_0.conda#5a9c71f5cbdf3c5b1ad2504e13792629 https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.3-py311h38e4bf4_0.conda#3910c815fc788621f88b2bdc0fa9f0a6 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2#34fc335fc50eef0b5ea708f2b5f54e0c https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed -https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.7-py311h9547e67_0.conda#3ac85c6c226e2a2e4b17864fc2ca88ff +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 -https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda#425fce3b531bed6ec3c74fab3e5f0a1c -https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.26-pthreads_h3d04fff_0.conda#7f76d98a5d8bb155d1150d817691f320 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea +https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda#d335fd5704b46f4efb89a6774e81aef0 +https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.27-pthreads_h3d04fff_0.conda#15e92dc6a755173a10d993b92d700e70 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda#17064acba08d3686f1135b5ec1b32b12 https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda#a0bc3eec34b0fab84be6b2da94e98e20 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py311h459d7ec_0.conda#9bc62d25dcf64eec484974a3123c9d57 https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.9.1-pyhd8ed1ab_0.tar.bz2#0191dd7efe1a94262812770183b68892 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pyflakes-2.5.0-pyhd8ed1ab_0.tar.bz2#1b3bef4313288ae8d35b1dfba4cd84a3 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e +https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 @@ -264,12 +272,11 @@ https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.2-py311h34ded2d_0.conda#819aa640a0493d4b52faf938e94d129e -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.0-py311h46250e7_0.conda#688a1190531dc4e8c00e25d0d1de4135 +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.1-py311h5ecf98a_0.conda#9ce82e95681cb5c5e4bd872ed0a7aceb 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.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda#7462280d81f639363e6e63c81276bd9e 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 @@ -277,384 +284,396 @@ https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 -https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.4.4-pyhd8ed1ab_0.conda#2e2f31b3b1c866c29636377e14f8c4c6 -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.11.0-h00ab1b0_1.conda#4531d2927578e7e254ff3bcf6457518c +https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.5.0-pyhd8ed1ab_0.conda#4dd428bd295ba44babd13050f2bcc622 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h297d8ca_1.conda#3ff978d8994f591818a506640c6a7071 https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f -https://conda.anaconda.org/conda-forge/noarch/tenacity-8.2.3-pyhd8ed1ab_0.conda#1482e77f87c6a702a7e05ef22c9b197b +https://conda.anaconda.org/conda-forge/noarch/tenacity-8.3.0-pyhd8ed1ab_0.conda#216cfa8e32bcd1447646768351df6059 https://conda.anaconda.org/conda-forge/noarch/termcolor-2.4.0-pyhd8ed1ab_0.conda#a5033708ad9283907c3b1bc1f90d0d0d -https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.3.0-pyhc1e730c_0.conda#698d2d2b621640bddb9191f132967c9f +https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.4-pyha770c72_0.conda#37c47ea93ef00dd80d880fc4ba21256a +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/noarch/traitlets-5.14.1-pyhd8ed1ab_0.conda#1c6acfdc7ecbfe09954c4216da99c146 -https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.3-pyhd8ed1ab_0.conda#8ea774e1b108dc9a1a8358a483b4cc6d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda#16ae769069b380646c47142d719ef466 -https://conda.anaconda.org/conda-forge/linux-64/ujson-5.9.0-py311hb755f60_0.conda#36dda52dc99a4fb9cadd3b738ec24848 +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/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 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 https://conda.anaconda.org/conda-forge/noarch/webob-1.8.7-pyhd8ed1ab_0.tar.bz2#a8192f3585f341ea66c60c189580ac67 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.16.0-py311h459d7ec_0.conda#6669b5529d206c1f880b642cdd17ae05 https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.1.9-pyhd8ed1ab_0.conda#70e533db62a710ae216fdaccc4a983c8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec 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-2023.10.1-pyhd8ed1ab_0.conda#1e0d85c0e2fef9539218da185b285f54 +https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.4.0-pyhd8ed1ab_0.conda#93dffc47dadbe36a1a644f3f50d4979d +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/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.7.2-pyhd8ed1ab_0.conda#596932155bf88bb6837141550cb721b0 +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.0-hf8751d9_2.conda#deb12196f0c64c441bb3d083d06d0cf8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.8.14-h2e270ba_2.conda#58bbee5fd6cf2d4fffbead1bc33a5d3b +https://conda.anaconda.org/conda-forge/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/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 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.16.0-hbbf8b49_1016.conda#c1dd96500b9b1a75e9e511931f415cbc +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.2.0-hd9d235c_0.conda#8c57a9adbafd87f5eff842abde599cb4 +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.4.3-py311h459d7ec_1.conda#4fb7f674bf6839da62317a7c6e725c55 -https://conda.anaconda.org/conda-forge/linux-64/curl-8.1.2-h409715c_0.conda#9f88cfb15b7d08b25880b138f91e0eb4 +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/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.5.0-pyhd8ed1ab_0.conda#9fd22aae8d2f319e80f68b295ab91d64 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py311h459d7ec_0.conda#d66c9e36ab104f94e35b015c86c2fcb4 +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/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.0-nompi_hb72d44e_103.conda#975973a4350ab45ff1981fe535a12af5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda#b050a4bb0e90ebd6e7fa4093d6346867 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.3-pyhd8ed1ab_0.conda#b865eadcceebf641fa833ee086756e8b +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_101.conda#7e98860d08eea82c8057abd78864fcb4 +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 https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 -https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda#4da50d410f553db77e62ab62ffaa1abc -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.1-py311h38be061_0.conda#175a430872841f7c351879f4c4c85b9e +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 +https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.2-py311h38be061_0.conda#f85e78497dfed6f6a4b865191f42de2e 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-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 -https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hfa28ad5_6.conda#ef06bee47510a7f5db3c2297a51d6ce2 +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.12.0-h840a212_1.conda#03c225a73835f5aa68c13e62eb360406 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 +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/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/linux-64/openpyxl-3.1.2-py311h459d7ec_1.conda#5c809fb753f06a04c2f114394404769e -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py311h0b84326_0.conda#4b24acdc1fbbae9da03147e7d2cf8c8a +https://conda.anaconda.org/conda-forge/noarch/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/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/noarch/plotly-5.19.0-pyhd8ed1ab_0.conda#669cd7065794633b9e64e6a9612ec700 -https://conda.anaconda.org/conda-forge/linux-64/postgresql-15.3-hd458b1d_1.conda#4a4b5dede4d2e075e9aa5a44a9fd9f20 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 +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/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda#7e23a61a7fbaedfef6eb0e1ac775c8e5 -https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.0.0-pyhd8ed1ab_0.conda#21de50391d584eb7f4441b9de1ad773f -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff +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/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/noarch/referencing-0.33.0-pyhd8ed1ab_0.conda#bc415a1c6cf049166215d6b596e0fcbe +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.0.3-py311h08a0b41_0.conda#8bef21c0a0160e7369fc2f494acf85d0 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-py_2.tar.bz2#a11f356d6f93b74b4a84e9501afd48b4 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py311h459d7ec_0.conda#4dccc0bc3bb4d6e5c30bccbd053c4f90 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.2-pyhd8ed1ab_0.conda#2b8dfb969f984497f3f98409a9545776 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda#091683b9150d2ebaa62fd7e2c86433da +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/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.25.1-pyhd8ed1ab_0.conda#8797a4e26be36880a603aba29c785352 -https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.4-h8d71039_2.conda#6d5edbe22b07abae2ea0a9065ef6be12 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 +https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-hac6953d_0.conda#63b80ca78d29380fe69e69412dcbe4ac https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.1.3-h7f98852_0.tar.bz2#3cdb89236358326adfce12be820a8af3 +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-4.0.4-pyh6c4a22f_0.tar.bz2#cc9f59f147740d88679bf1bd94dbe588 +https://conda.anaconda.org/conda-forge/noarch/yamale-5.0.0-pyhca7485f_0.conda#53c70f2dd94c690afd8606de7e952fe7 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.3-py311h459d7ec_0.conda#5b22b9390448faccbc41769389b514a9 -https://conda.anaconda.org/conda-forge/linux-64/arpack-3.7.0-hdefa2d7_2.tar.bz2#8763fe86163198ef1778d1d8d22bb078 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.13-heb0bb06_2.conda#c0866da05d5e7bb3a3f6b68bcbf7537b +https://conda.anaconda.org/conda-forge/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/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 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-42.0.2-py311hcb13ee4_0.conda#c61fd9e9fcfa599ea5a8b1de42b147a8 -https://conda.anaconda.org/conda-forge/noarch/django-5.0.3-pyhd8ed1ab_0.conda#5242811441d7edca3fa3026693bd9cd8 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-42.0.7-py311h4a61cc7_0.conda#251f3a7b306a8b212d42d585b3d06f36 +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.1-h22adcc9_11.conda#514167b60f598eaed3f7a60e1dceb9ee -https://conda.anaconda.org/conda-forge/linux-64/git-2.42.0-pl5321h86e50cf_0.conda#96ad24c67e0056d171385859c43218a2 -https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.42-pyhd8ed1ab_0.conda#6bc8e496351bafd761c0922c3ebd989a +https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.1-h928be8b_17.conda#4b2ca09b53e91b760cebcb397e386e87 +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-7.3.0-hdb3a94d_0.conda#765bc76c0dfaf24ff9d8a2935b2510df -https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-h8b5b2df_13.conda#29a96d50cb53638a5b4806b5ca6e4b1d -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda#d11132727a247f2c1998779a2af743a1 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda#f5126317dd0ce0ba26945e411ecc6960 +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.1-h3845be2_3.conda#f38e5e47f62d6633166040192ad420a1 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0f3d0bb_105.conda#b5d412441b84305460e9df8a016a3392 -https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.0.1-hca56755_27.conda#918a735059cab21b96fc13a8d04fbcd8 +https://conda.anaconda.org/conda-forge/linux-64/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/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/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d -https://conda.anaconda.org/conda-forge/linux-64/poppler-23.05.0-hd18248d_1.conda#09e0de1aa7330fe697eed76eaeef666d +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 https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba https://conda.anaconda.org/conda-forge/noarch/pylint-2.17.7-pyhd8ed1ab_0.conda#3cab6aee60038b3f621bce3e50f52bed -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311ha169711_0.conda#ad4b6e9be79a89959bb6d7d308027ff2 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda#06eb685a3a0b146347a58dda979485da +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hb3a3e68_6.conda#bce79adf84cd7cd9b9b14e43d6d52daf +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 -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.12.0-pyhd8ed1ab_0.conda#ac9fedc9a0c397f2318e82525491dd83 +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e 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.1.1-pyhd8ed1ab_0.conda#6b82ada068f6c7e51cf623f4cb6c4034 +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/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/tiledb-2.13.2-hd532e3d_0.conda#6d97164f19dbd27575ef1899b02dc1e0 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.14-h7f98852_1.tar.bz2#45b68dc2fc7549c16044d533ceaf340e https://conda.anaconda.org/conda-forge/noarch/yapf-0.40.1-pyhd8ed1ab_0.conda#f269942e802d5e148632143d4c37acc9 -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.20.3-he9c0e7f_4.conda#7695770e1d722ce9029a2ea30c060a3d -https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.6.1-pyhd8ed1ab_0.conda#454ed214cec806066097ae245a409171 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 +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/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 https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.1-pyhd8ed1ab_0.conda#72ac49d50b7af2159a8f4128bc1f856d +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/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.35-pyhd8ed1ab_0.conda#9472bfd206a2b7bb8143835e37667054 -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2023.8.12-py311h67b54e4_0.conda#363e5c2f2c67ff69d717aba54422b03d -https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.0-pyh4b66e23_0.conda#b8853659d596f967c661f544dd89ede7 -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.21.1-pyhd8ed1ab_0.conda#8a3a3d01629da20befa340919e3dd2c4 -https://conda.anaconda.org/conda-forge/linux-64/julia-1.8.5-h783901f_0.conda#98c05ba7ca9c15d22216f730499e167a -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.0-pyhd8ed1ab_0.conda#6bd3f1069cdebb44c7ae9efb900e312d -https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.0-h5418a03_2.conda#30ddbe080c260fb36da8509e3fd6c45f +https://conda.anaconda.org/conda-forge/noarch/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/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/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 -https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h4f3791c_100.conda#405c5b3ad4ef53eb0d93043b54206dd7 -https://conda.anaconda.org/conda-forge/linux-64/numba-0.59.0-py311h96b013e_1.conda#488276429185c4fa1266e6a4a24a61af -https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.12.1-py311hb755f60_0.conda#38a2ff8ea433fe8792279b45e84b3730 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.1-py311h320fe9a_0.conda#aac8d7137fedc2fd5f8320bf50e4204c -https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-heaa33ce_1.conda#cde553e0e32389e26595db4eacf859eb +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/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/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/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 +https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py311h92ebd52_0.conda#ee757dff4cdb96bb972200c85b37f9e8 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_0.conda#f9a382d30405f6c874edf866eb814e7c -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py311h64a7726_2.conda#24ca5107ab75c5521067b8ba505dfae5 +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/noarch/seawater-3.3.4-py_1.tar.bz2#a9e101e1601faf5e5a119ab2bd7617a4 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311h54d622a_1.conda#a894c65b48676c4973e9ee8b59bceb9e +https://conda.anaconda.org/conda-forge/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-h43474b4_0.conda#fd815765a86daf44db1e15c6f6edf5e6 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-hbc2ea52_17.conda#452c7b08c21eea2ef01f4fd364d6affc -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.3.4-pyhd8ed1ab_0.conda#6cc92bba68b7bb5a3b180e96508f9480 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.2.1-pyhd8ed1ab_0.conda#2d4fb4e7199019512298f728b9f6a8b0 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.30.2-h1f30a5c_0.conda#21ee8444a7f629924ea8cfe52a622cbd -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h20110ff_0.conda#11f5169aeff54ad7277476be8ba19ff7 -https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.0-py311h281082f_2.conda#fde4fad3c517cc80f32995696f45198d -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-h98fae49_0.conda#620e754f4344f4c27259ff460a2b9c50 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py311h54ef318_0.conda#014c115be880802d2372ac6ed665f526 +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/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/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/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/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.9.2-pyhd8ed1ab_0.conda#61ba076de6530d9301a0053b02f093d2 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h4d7c953_100.conda#c03492d0342e512e58aa2d6c5fdaaa91 +https://conda.anaconda.org/conda-forge/noarch/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/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.2-pyha770c72_0.conda#61534ee57ffdf26d7b1b514d33daccc4 +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.1.3-hfabd6f2_9.conda#0ab4cf54fbddc0cc9ff260c6f77f8c84 -https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.8-py311h41e4db2_0.conda#b35deb26af1d7e0d98438c8ac5c6b7b2 -https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.1.post1-py311hc009520_0.conda#8c27600e1ee43ba6ceff93c6c0e09446 -https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.1-pyhd8ed1ab_1.conda#780a42534f1429b802b5d1f51880b619 -https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.1-py311h1f0f07a_0.conda#11ea602c16ad004033edf648ce054f9e -https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.2.12-pyhd8ed1ab_0.conda#d5c8bef52be4e70c48b1400eec3eecc8 -https://conda.anaconda.org/conda-forge/noarch/xarray-2024.2.0-pyhd8ed1ab_0.conda#8e25aab3323476d4fd0b5f6bad05d403 -https://conda.anaconda.org/conda-forge/noarch/zarr-2.17.1-pyhd8ed1ab_0.conda#8c67aa8327cbab135ea576568df3190c -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c +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/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/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/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/cmocean-3.1.3-pyhd8ed1ab_0.conda#671543f081d6be0b6b3e99b586386b44 +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/fiona-1.9.4-py311hbac4ec9_0.conda#1d3445f5f7fa002a1c149c405376f012 -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-12.0.1-h657c46f_7_cpu.conda#4de6e12428b7018f1f8a1e8dda555243 -https://conda.anaconda.org/conda-forge/linux-64/magics-4.14.2-hd3d5bb6_0.conda#3c571b994b6ce2b4d2c7b98be77a8ebe -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda#e78da91cf428faaf05701ce8cc8f2f9b +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/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 -https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-hf70af60_47.conda#ee27133164cb9f5e74681bdb8839688f -https://conda.anaconda.org/conda-forge/linux-64/nco-5.1.6-hd62b316_0.conda#af7780f76ee37325d264327e21a478f5 +https://conda.anaconda.org/conda-forge/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.4.3-py311h38be061_1.tar.bz2#f0c9a1067c03e8f05e53ef0c5ad5fab3 -https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.0.3-cuda118_pyhedeaf28_1.conda#f56da7b20ce1701d239cb82a4f91109f -https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r41hc72bb7e_1004.tar.bz2#831186670e5786df30f8ddeb5a623c5a -https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.4.1-r41h06615bd_1.tar.bz2#9a00c3283f8fb4bce68deffe08fbe09d -https://conda.anaconda.org/conda-forge/noarch/r-bigmemory.sri-0.1.6-r41hc72bb7e_0.tar.bz2#926471a5be30d287a25f2d10446d6066 -https://conda.anaconda.org/conda-forge/linux-64/r-brio-1.1.3-r41h06615bd_1.tar.bz2#3ba226bad01c3ebed18c4f7b022bf26d -https://conda.anaconda.org/conda-forge/linux-64/r-cli-3.6.1-r41h38f115c_0.conda#16ab92c7ff005c9ac48527b054831e45 -https://conda.anaconda.org/conda-forge/noarch/r-codetools-0.2_19-r41hc72bb7e_0.conda#401ac0ee6310d69deac481b2d2148458 -https://conda.anaconda.org/conda-forge/linux-64/r-colorspace-2.1_0-r41h133d619_0.conda#b6f5d77e5e0334a8adda752364bc760e -https://conda.anaconda.org/conda-forge/linux-64/r-contfrac-1.1_12-r41h06615bd_1003.tar.bz2#c9cbc66278bea99ce3ce9f8be9e8c0ad -https://conda.anaconda.org/conda-forge/noarch/r-cpp11-0.4.7-r41hc72bb7e_0.conda#a81541ceb9c2c3d40695e746b2777961 -https://conda.anaconda.org/conda-forge/noarch/r-crayon-1.5.2-r41hc72bb7e_1.tar.bz2#8cf94f6451aaadf3aa1119b29115b0c7 -https://conda.anaconda.org/conda-forge/linux-64/r-curl-4.3.3-r41hf9611b0_2.conda#c4047e3aa1b795a4cb5adbb5c59b3972 -https://conda.anaconda.org/conda-forge/linux-64/r-desolve-1.35-r41hb20cf53_0.conda#e475d0dbe391fa76fbf742ebee6ad449 -https://conda.anaconda.org/conda-forge/linux-64/r-digest-0.6.31-r41h38f115c_0.conda#eecdd9b7292e968428497bbeb9e68dfe -https://conda.anaconda.org/conda-forge/noarch/r-docopt-0.7.1-r41hc72bb7e_2.tar.bz2#38883e8f3f07ec1c63834a4401098b39 -https://conda.anaconda.org/conda-forge/linux-64/r-dotcall64-1.0_2-r41hac0b197_1.conda#1ae51773e2544dcde64619a03395be84 -https://conda.anaconda.org/conda-forge/noarch/r-evaluate-0.21-r41hc72bb7e_0.conda#c45a9a35d32b9d0f08298e3324ef15fe -https://conda.anaconda.org/conda-forge/linux-64/r-fansi-1.0.4-r41h133d619_0.conda#bdd2dca12682e87ebaee34af4250c718 -https://conda.anaconda.org/conda-forge/linux-64/r-farver-2.1.1-r41h7525677_1.tar.bz2#6c02f6ce0271b25d7936eeca4d06581c -https://conda.anaconda.org/conda-forge/linux-64/r-fs-1.6.2-r41ha503ecb_0.conda#7a1fbec6fb01e6384ec10eab4362cec2 -https://conda.anaconda.org/conda-forge/noarch/r-functional-0.6-r41ha770c72_1003.tar.bz2#b48ece4d136bc4af37b9320d40e9a37c -https://conda.anaconda.org/conda-forge/noarch/r-generics-0.1.3-r41hc72bb7e_1.tar.bz2#91a23d57270d474ab35b970ab153bdf4 -https://conda.anaconda.org/conda-forge/noarch/r-geomapdata-2.0_0-r41hc72bb7e_1.tar.bz2#2336d6504ec4e0f75c60e6176676eb49 -https://conda.anaconda.org/conda-forge/linux-64/r-git2r-0.31.0-r41hb760b46_0.conda#2912060dbb6b86babf9346e73d4feca2 -https://conda.anaconda.org/conda-forge/linux-64/r-glue-1.6.2-r41h06615bd_1.tar.bz2#7f4726fddb7ddc6354f299eeee77217d -https://conda.anaconda.org/conda-forge/linux-64/r-goftest-1.2_3-r41h06615bd_1.tar.bz2#ec4f56c61753d07694a08190a372d078 -https://conda.anaconda.org/conda-forge/linux-64/r-isoband-0.2.7-r41h38f115c_1.conda#2e385f2fb8a78b41ae7bf1854af45242 -https://conda.anaconda.org/conda-forge/noarch/r-iterators-1.0.14-r41hc72bb7e_1.tar.bz2#774088f2c449de9b334b0fc3f8a427a5 -https://conda.anaconda.org/conda-forge/linux-64/r-jsonlite-1.8.5-r41h57805ef_0.conda#6d41262a7460dd158346bc91673c23d7 -https://conda.anaconda.org/conda-forge/noarch/r-labeling-0.4.2-r41hc72bb7e_2.tar.bz2#83807ad3d6daa0c5e88ad3f4e8df4758 -https://conda.anaconda.org/conda-forge/linux-64/r-lattice-0.21_8-r41h133d619_0.conda#daab654f089ad0595f81b6e3ead9d22a -https://conda.anaconda.org/conda-forge/linux-64/r-lazyeval-0.2.2-r41h06615bd_3.tar.bz2#6eb0969ca6d2304194b7f9fad926b325 -https://conda.anaconda.org/conda-forge/linux-64/r-lmom-2.9-r41h8da6f51_1.tar.bz2#3b56e155cfc9611b7e1f0cba68ae795b -https://conda.anaconda.org/conda-forge/noarch/r-logging-0.10_108-r41ha770c72_3.tar.bz2#d0a6a38b084ec13c87eb72124e08b54c -https://conda.anaconda.org/conda-forge/linux-64/r-magrittr-2.0.3-r41h06615bd_1.tar.bz2#02e0e78aaffe86ff8d8824b9c6744f05 -https://conda.anaconda.org/conda-forge/linux-64/r-maps-3.4.1-r41h06615bd_1.conda#594a80fe9ed00caf16654ea76444751e -https://conda.anaconda.org/conda-forge/linux-64/r-mass-7.3_58.3-r41h133d619_0.conda#bc1c1fdac18d5799439626c6b6c1591a -https://conda.anaconda.org/conda-forge/linux-64/r-mba-0.1_0-r41h7525677_0.conda#3be8fba4c63dda03bf34ab17e44a0fab -https://conda.anaconda.org/conda-forge/linux-64/r-mime-0.12-r41h06615bd_1.tar.bz2#9482f375317377b6362deeb045759756 -https://conda.anaconda.org/conda-forge/noarch/r-nbclust-3.0.1-r41hc72bb7e_1.tar.bz2#84a70bc1ed3e58e7a6560a0e7dd99355 -https://conda.anaconda.org/conda-forge/linux-64/r-ncdf4-1.21-r41h0cc7714_3.conda#a0ad99afb73e0ef73bffe6195318df2e -https://conda.anaconda.org/conda-forge/linux-64/r-pcict-0.5_4.4-r41h133d619_0.conda#9c317abaabdf337e1790f1472343825d -https://conda.anaconda.org/conda-forge/noarch/r-pkgconfig-2.0.3-r41hc72bb7e_2.tar.bz2#fceb80e453285589b08efe53174ebe22 -https://conda.anaconda.org/conda-forge/noarch/r-praise-1.0.0-r41hc72bb7e_1006.tar.bz2#28ee09a92c8cb8ccb88205d6b768d3cc -https://conda.anaconda.org/conda-forge/linux-64/r-ps-1.7.5-r41h133d619_0.conda#b1f20d8306209420aac424ac6bd0889f -https://conda.anaconda.org/conda-forge/noarch/r-r.methodss3-1.8.2-r41hc72bb7e_1.tar.bz2#5cff1b8f457c863cc1025bb2b6396678 -https://conda.anaconda.org/conda-forge/noarch/r-r6-2.5.1-r41hc72bb7e_1.tar.bz2#04cf390ece28f6df5c096f78409a9b41 -https://conda.anaconda.org/conda-forge/noarch/r-rcolorbrewer-1.1_3-r41h785f33e_1.tar.bz2#cf94059b05cc67854cb7e704ea751d7f -https://conda.anaconda.org/conda-forge/linux-64/r-rcpp-1.0.10-r41h38f115c_0.conda#2ad2bd8a50f80e4f7420d7d6c83ea3d5 -https://conda.anaconda.org/conda-forge/noarch/r-remotes-2.4.2-r41hc72bb7e_1.tar.bz2#fee357b9269ee696fffdc18109ae8836 -https://conda.anaconda.org/conda-forge/linux-64/r-rlang-1.1.1-r41ha503ecb_0.conda#ce23a8ab960e759dab1e5b00f7967a72 -https://conda.anaconda.org/conda-forge/noarch/r-rpmg-2.2_3-r41hc72bb7e_2.tar.bz2#e13db79c37c068d0117708bccbe2ed9d -https://conda.anaconda.org/conda-forge/noarch/r-rstudioapi-0.14-r41hc72bb7e_1.tar.bz2#3a6725acc73d5a6c3b7d9dd3131b58d8 -https://conda.anaconda.org/conda-forge/noarch/r-snow-0.4_4-r41hc72bb7e_1.tar.bz2#aea71b97f7046d9ab359ec9a0e494a6d -https://conda.anaconda.org/conda-forge/linux-64/r-stringdist-0.9.10-r41h06615bd_0.tar.bz2#db0b1d297278d5ae2787ad6a3e7eadbb -https://conda.anaconda.org/conda-forge/linux-64/r-sys-3.4.2-r41h57805ef_0.conda#903dacb1ef1b8b381fd0fafc3f16b645 -https://conda.anaconda.org/conda-forge/linux-64/r-udunits2-0.13.2.1-r41h133d619_1.conda#77677c475c2422d56dad703fcd6c7401 -https://conda.anaconda.org/conda-forge/linux-64/r-utf8-1.2.3-r41h133d619_0.conda#a990f02e71f6cf7033e4d9b6db5839dc -https://conda.anaconda.org/conda-forge/linux-64/r-uuid-1.1_0-r41h06615bd_1.tar.bz2#a8758fdf001eba9f46350e9ab37471da -https://conda.anaconda.org/conda-forge/noarch/r-viridislite-0.4.1-r41hc72bb7e_1.tar.bz2#9fee3e06b7121f47a946b700ffedddc5 -https://conda.anaconda.org/conda-forge/noarch/r-withr-2.5.0-r41hc72bb7e_1.tar.bz2#23c0e5a3dc9258b9a06928097560adba -https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.39-r41ha503ecb_0.conda#555ee06849209b9471946da6f09bb98b -https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r41hc72bb7e_1.tar.bz2#921c0ef7104d8df0ab506f1bb81a062c -https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.7-r41h133d619_0.conda#4af88071a607237aa73a3cbd51788a39 +https://conda.anaconda.org/conda-forge/linux-64/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/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 +https://conda.anaconda.org/conda-forge/linux-64/r-colorspace-2.1_0-r43h57805ef_1.conda#22117ffc4b380dba0732166eec62d8cb +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/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/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 +https://conda.anaconda.org/conda-forge/noarch/r-generics-0.1.3-r43hc72bb7e_2.conda#bf424d7238a8a02bd3970346112de34f +https://conda.anaconda.org/conda-forge/noarch/r-geomapdata-2.0_2-r43hc72bb7e_0.conda#a865cc1e66d1370e8545baa03d2901fe +https://conda.anaconda.org/conda-forge/linux-64/r-git2r-0.33.0-r43hbae1c7c_0.conda#74577e5aad177b12c066b268a7cd864b +https://conda.anaconda.org/conda-forge/linux-64/r-glue-1.7.0-r43h57805ef_0.conda#20e2cb7c0d27bccf8fe21ec5c3897751 +https://conda.anaconda.org/conda-forge/linux-64/r-goftest-1.2_3-r43h57805ef_2.conda#14d5dcb272fd5df57248893446a4948f +https://conda.anaconda.org/conda-forge/linux-64/r-isoband-0.2.7-r43ha503ecb_2.conda#6db3b5f97166c8b0fd8c995fbe32c89d +https://conda.anaconda.org/conda-forge/noarch/r-iterators-1.0.14-r43hc72bb7e_2.conda#5f0c56c25fafdfde7acaf0f332f24195 +https://conda.anaconda.org/conda-forge/linux-64/r-jsonlite-1.8.8-r43h57805ef_0.conda#fb01953d78a87de6211b1ebccafed273 +https://conda.anaconda.org/conda-forge/linux-64/r-kernsmooth-2.23_24-r43hc2011d3_0.conda#9fbf29bd0ded7844a2a493a6190ef9d9 +https://conda.anaconda.org/conda-forge/noarch/r-labeling-0.4.3-r43hc72bb7e_0.conda#8d5f7d07433437c48c1c497ec8c77aec +https://conda.anaconda.org/conda-forge/linux-64/r-lattice-0.22_6-r43h57805ef_0.conda#748c702a5c6c89f9794d148bdcbbdfbc +https://conda.anaconda.org/conda-forge/linux-64/r-lazyeval-0.2.2-r43h57805ef_4.conda#412e7e2defa8af842c9f4d7844d7b949 +https://conda.anaconda.org/conda-forge/linux-64/r-lmom-3.0-r43h61816a4_0.conda#e2ee8254c7baa313122de7a08330c296 +https://conda.anaconda.org/conda-forge/noarch/r-logging-0.10_108-r43ha770c72_4.conda#e32f157d485d2fbd076abf006156d757 +https://conda.anaconda.org/conda-forge/linux-64/r-magrittr-2.0.3-r43h57805ef_2.conda#7b04cb810f47eb12efc2e9be5f8ca1f1 +https://conda.anaconda.org/conda-forge/linux-64/r-maps-3.4.2-r43h57805ef_0.conda#a8a9f2a4fc6692046eebb1d89860b94a +https://conda.anaconda.org/conda-forge/linux-64/r-mass-7.3_60-r43h57805ef_1.conda#be049620c8ceefdb69a24db0c1919c85 +https://conda.anaconda.org/conda-forge/linux-64/r-mba-0.1_0-r43ha503ecb_1.conda#71752b2b57c41eb2e03653bea2a44d94 +https://conda.anaconda.org/conda-forge/noarch/r-nbclust-3.0.1-r43hc72bb7e_2.conda#1a7497d490b8f19d192c26040b6b35e5 +https://conda.anaconda.org/conda-forge/linux-64/r-ncdf4-1.22-r43h5647f33_0.conda#8ff19fc3195d7742c704a957c55cc87a +https://conda.anaconda.org/conda-forge/linux-64/r-pcict-0.5_4.4-r43h57805ef_1.conda#238a8a2e93424fa8cb9942925fc515a2 +https://conda.anaconda.org/conda-forge/noarch/r-pkgconfig-2.0.3-r43hc72bb7e_3.conda#8978eef741fffaa48be070693a17f42f +https://conda.anaconda.org/conda-forge/linux-64/r-proxy-0.4_27-r43h57805ef_2.conda#742133e20563c7321e9d0cbd7e7102c7 +https://conda.anaconda.org/conda-forge/linux-64/r-ps-1.7.6-r43h57805ef_0.conda#48f9e73215aa6de4545ec3ec36e5e534 +https://conda.anaconda.org/conda-forge/noarch/r-r.methodss3-1.8.2-r43hc72bb7e_2.conda#e6976d24b97b9cdcb9a74ac55495f404 +https://conda.anaconda.org/conda-forge/noarch/r-r6-2.5.1-r43hc72bb7e_2.conda#79f167972554dc6b65aa099cd85c22a1 +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/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 +https://conda.anaconda.org/conda-forge/linux-64/r-udunits2-0.13.2.1-r43h57805ef_3.conda#f80ce6fa5f07c33a4fac0bcfc151b161 +https://conda.anaconda.org/conda-forge/linux-64/r-utf8-1.2.4-r43h57805ef_0.conda#d228498392dce22d3fe6266554498493 +https://conda.anaconda.org/conda-forge/linux-64/r-uuid-1.2_0-r43h57805ef_0.conda#88a02431c8ab8be38eed2b01f9d44ab4 +https://conda.anaconda.org/conda-forge/noarch/r-viridislite-0.4.2-r43hc72bb7e_1.conda#307f6c8262afed91d2999568e2268ed6 +https://conda.anaconda.org/conda-forge/noarch/r-withr-3.0.0-r43hc72bb7e_0.conda#7380a50d9daae38b40777f7630b8c3ba +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/noarch/seaborn-base-0.13.2-pyhd8ed1ab_0.conda#0918a9201e824211cdf444dbf8d55752 -https://conda.anaconda.org/conda-forge/linux-64/cdo-2.2.0-he026af2_4.conda#6c00b0a21b3de8a149eee137e83465d3 -https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_15-pl5321hf48ede7_0.conda#53c9f7169b61e615d5f41c8d70a72c00 -https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 +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/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/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/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/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.2-pyhd8ed1ab_0.conda#5ab3248dd05c543dc631276455ef6a54 -https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.4.1-py311h38be061_2.tar.bz2#4c9101d329f6bc09c2617a80e3eb9c89 +https://conda.anaconda.org/conda-forge/noarch/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-12.0.1-py311h39c9aba_7_cpu.conda#d513ab8d10ec5f3ee45b419c836195ec +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/pydot-2.0.0-py311h38be061_0.conda#cdfd23a54a18f3c8d5320d7717f4ed52 -https://conda.anaconda.org/conda-forge/linux-64/r-askpass-1.1-r41h06615bd_3.tar.bz2#c8ec8683302ad9a2345cb31ab28e6c6b -https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.1-r41h7525677_1.tar.bz2#6a956b57b027b49b7a9ca48031a8bbd6 -https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.2.0-r41h57805ef_0.conda#dc314ad76563387e70e0117c5398a15a -https://conda.anaconda.org/conda-forge/linux-64/r-climdex.pcic-1.1_11-r41h7525677_1.tar.bz2#06d19f02c04ff718b0c80c00b199976e -https://conda.anaconda.org/conda-forge/linux-64/r-diffobj-0.3.5-r41h06615bd_1.tar.bz2#5483435b5f12567c120966137ebb715f -https://conda.anaconda.org/conda-forge/linux-64/r-ellipsis-0.3.2-r41h06615bd_1.tar.bz2#2a63108f4bd95bacd3a9d60af4e7b933 -https://conda.anaconda.org/conda-forge/noarch/r-elliptic-1.4_0-r41hc72bb7e_3.tar.bz2#620fac0a4d3fdcb3b7f9620a121ca0e4 -https://conda.anaconda.org/conda-forge/noarch/r-foreach-1.5.2-r41hc72bb7e_1.tar.bz2#4ac59bcf363990abb478e9d358ea76ff -https://conda.anaconda.org/conda-forge/noarch/r-highr-0.10-r41hc72bb7e_0.conda#c5680c2ac76bcecf2c4c3d598fdea3a8 -https://conda.anaconda.org/conda-forge/noarch/r-lifecycle-1.0.3-r41hc72bb7e_1.tar.bz2#bed96e636722252c2a37c392c5994f9d -https://conda.anaconda.org/conda-forge/linux-64/r-mapproj-1.2.11-r41h133d619_0.conda#ac4d7a80cc1f6e67ed8eefcf6cccf21e -https://conda.anaconda.org/conda-forge/linux-64/r-matrix-1.5_4.1-r41h316c678_0.conda#ecc26aeb7a438e74438c60f4d6404f32 -https://conda.anaconda.org/conda-forge/noarch/r-munsell-0.5.0-r41hc72bb7e_1005.tar.bz2#102b2cf348101fd85afda3b26460b0f3 -https://conda.anaconda.org/conda-forge/noarch/r-ncdf4.helpers-0.3_6-r41hc72bb7e_1.tar.bz2#403ae973d19d3e2f2a4051aca3f12fc3 -https://conda.anaconda.org/conda-forge/linux-64/r-nlme-3.1_162-r41hac0b197_0.conda#76d797cfdad767d5bffaf053efad7f5d -https://conda.anaconda.org/conda-forge/linux-64/r-plyr-1.8.8-r41h7525677_0.tar.bz2#318c3b974ef18cc5c8e46069fd9cb27c -https://conda.anaconda.org/conda-forge/linux-64/r-processx-3.8.1-r41h133d619_0.conda#ce603fd804af2eee220329ab86be0c14 -https://conda.anaconda.org/conda-forge/noarch/r-r.oo-1.25.0-r41hc72bb7e_1.tar.bz2#080778ce659a006984a7a0dbdde9a57a -https://conda.anaconda.org/conda-forge/linux-64/r-rcpparmadillo-0.12.4.0.0-r41h08d816e_0.conda#fd288213a986ef5852160f49086b639b -https://conda.anaconda.org/conda-forge/noarch/r-rex-1.2.1-r41hc72bb7e_1.tar.bz2#e1af0f0eb2278c1a3330c2907eca8f44 -https://conda.anaconda.org/conda-forge/noarch/r-rprojroot-2.0.3-r41hc72bb7e_1.tar.bz2#9f5f482d79c7854068a01945f400a3bf -https://conda.anaconda.org/conda-forge/linux-64/r-sp-1.6_1-r41h57805ef_0.conda#b7943adfe3494b4c4dc8e3b58fc6602d -https://conda.anaconda.org/conda-forge/linux-64/r-spam-2.9_1-r41hb20cf53_1.conda#9eab4a6bfff4bddeee5ed946c47830fa -https://conda.anaconda.org/conda-forge/linux-64/r-timechange-0.2.0-r41h38f115c_0.conda#04a4229419d779a1e27395d70d493571 -https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.4-r41h1ad5fc0_1.conda#82c1446591783493d65273a158e8ce28 -https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r41h133d619_0.conda#1d432d2eba171727afd03507faa5e2f6 -https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_0.conda#fd31ebf5867914de597f9961c478e482 -https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.4-pyhd8ed1ab_1.conda#9fff981af43f3226bac0c91e9bf67f2e -https://conda.anaconda.org/conda-forge/noarch/xgboost-2.0.3-cuda118_pyh5ebfdf7_1.conda#9ca04fca5cb67e6f2e51d0eb0277cf67 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.2-pyhd8ed1ab_0.conda#7a0bfebd69213722427cb61b077b4187 +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 +https://conda.anaconda.org/conda-forge/linux-64/r-class-7.3_22-r43h57805ef_1.conda#edcd749bf55569ea5c2f419c10e6ee59 +https://conda.anaconda.org/conda-forge/linux-64/r-climdex.pcic-1.1_11-r43ha503ecb_2.conda#59f6775bc30ccc52a2ec7aa8f353dd9b +https://conda.anaconda.org/conda-forge/noarch/r-desc-1.4.3-r43hc72bb7e_0.conda#3bd51d5d0cc81f943e93eabb982b318b +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-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 +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-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/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 +https://conda.anaconda.org/conda-forge/linux-64/r-timechange-0.3.0-r43ha503ecb_0.conda#9502bf10997943c1f3d6abeced14b792 +https://conda.anaconda.org/conda-forge/linux-64/r-units-0.8_5-r43ha503ecb_0.conda#001680df8c5745b7dc3b799a9e1ac2b0 +https://conda.anaconda.org/conda-forge/linux-64/r-wk-0.9.1-r43ha503ecb_0.conda#4a0dad8564d2b623e91d9d9f38e5abb5 +https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.6-r43hbfba7a4_1.conda#545f26a602ff99102e7fd70f425ead32 +https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r43h57805ef_1.conda#5e4c7ad3824c359f05601463ec7ba9c5 +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_1_cpu.conda#855feea87f42887b22accedd41fa0755 +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/noarch/psy-maps-1.4.2-pyhd8ed1ab_0.tar.bz2#3ed13103dfd46f71dc870d188bd0b276 +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 -https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhd8ed1ab_0.conda#3fd1a0b063c1fbbe4b7bd5a5a7601e84 -https://conda.anaconda.org/conda-forge/linux-64/r-akima-0.6_2.3-r41h92ddd45_0.tar.bz2#bac0b7627ef744c98f4bc48885f52e72 -https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.3-r41hc72bb7e_0.tar.bz2#af0891cc9b87e2954c9a3c66f144992d -https://conda.anaconda.org/conda-forge/noarch/r-desc-1.4.2-r41hc72bb7e_1.tar.bz2#35a5cf7ea666e2c13cb6b4a03282e2a3 -https://conda.anaconda.org/conda-forge/noarch/r-doparallel-1.0.17-r41hc72bb7e_1.tar.bz2#a7d2c685223b6538ecac271ecbb2c199 -https://conda.anaconda.org/conda-forge/noarch/r-gtable-0.3.3-r41hc72bb7e_0.conda#f18da5771f11c05df08eed41095d56a5 -https://conda.anaconda.org/conda-forge/noarch/r-hypergeo-1.2_13-r41hc72bb7e_1003.tar.bz2#e0f2b02808243f63bc8c0d8dc2054f37 -https://conda.anaconda.org/conda-forge/noarch/r-knitr-1.43-r41hc72bb7e_0.conda#9a1b185e1cf8286af819f0def11fbafa -https://conda.anaconda.org/conda-forge/linux-64/r-lmoments-1.3_1-r41h37cf8d7_4.tar.bz2#30a0f4289a2570c3b4eccb5c62e0466e -https://conda.anaconda.org/conda-forge/linux-64/r-lubridate-1.9.2-r41h133d619_1.conda#995c8749407f4276d91833c54ea527e7 -https://conda.anaconda.org/conda-forge/linux-64/r-mgcv-1.8_42-r41he1ae0d6_0.conda#41523ce65336ebc723d7aa4e80cd8d27 -https://conda.anaconda.org/conda-forge/linux-64/r-openssl-2.0.6-r41habfbb5e_0.conda#d10bafe86b53c0b74659616a2db7528e -https://conda.anaconda.org/conda-forge/noarch/r-r.utils-2.12.2-r41hc72bb7e_0.tar.bz2#302c316e29b7f426fa2de6f1f21dec75 -https://conda.anaconda.org/conda-forge/linux-64/r-reshape-0.8.9-r41hc72bb7e_1.tar.bz2#acdda9b65715d9b2d7f928145605d283 -https://conda.anaconda.org/conda-forge/noarch/r-scales-1.2.1-r41hc72bb7e_1.tar.bz2#2a557fcc9f60e56e788a6d1293bc8701 -https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r41ha503ecb_3.conda#2bc51f0d44b98092ba57cf2f8671b490 -https://conda.anaconda.org/conda-forge/linux-64/r-splancs-2.01_43-r41h8da6f51_1.tar.bz2#3a6aad0706541141d10e3b514467a080 -https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.2-r41ha503ecb_0.conda#1f7610a1863648cab254a9f85bd29dcd -https://conda.anaconda.org/conda-forge/noarch/dask-2024.2.1-pyhd8ed1ab_0.conda#598ebedff52b1a548bb5f0de0e50802c -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.2-pyhd8ed1ab_0.conda#e14e35cc4a5c90694bb41c5317b576a8 -https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.0-r41hc72bb7e_1005.tar.bz2#800e1da5bf774be48934b8865dd78d33 -https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r41hc72bb7e_1004.tar.bz2#71ebed7e976df735ff3443bb88bd154f -https://conda.anaconda.org/conda-forge/noarch/r-httr-1.4.6-r41hc72bb7e_0.conda#53dbb769c96782db54bf2d414fc9b239 -https://conda.anaconda.org/conda-forge/noarch/r-lmomco-2.4.9-r41hc72bb7e_0.conda#6549671297485ce34797eb4d59fa3657 -https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.4-r41hc72bb7e_0.conda#8e3493535d013080457c90ce0d81714f -https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r41hc72bb7e_0.conda#fb91965be4ce5aaf59db0452582f5cea -https://conda.anaconda.org/conda-forge/noarch/r-pkgload-1.3.2-r41hc72bb7e_0.tar.bz2#e23a1a8420ab52056d86a6f9691d23fa -https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.1-r41h133d619_0.conda#d7404238cac0da3c97dc08503d116a2f -https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r41hc72bb7e_1.tar.bz2#aef451160d655cc630d8038d934dced3 +https://conda.anaconda.org/conda-forge/linux-64/r-akima-0.6_3.4-r43h61816a4_2.conda#3864b228566ce025f29d1ef672139c07 +https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.6-r43hc72bb7e_0.conda#5f01d28492d5ca80b54fdba4510a653f +https://conda.anaconda.org/conda-forge/noarch/r-doparallel-1.0.17-r43hc72bb7e_2.conda#5eb327ee913c177e3c02278e5103f9a1 +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/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 +https://conda.anaconda.org/conda-forge/noarch/r-r.utils-2.12.3-r43hc72bb7e_0.conda#5ea010c037dd64b6d6a4de2c06059231 +https://conda.anaconda.org/conda-forge/linux-64/r-reshape-0.8.9-r43hc72bb7e_2.conda#e24945cba9c156cf4e7154b3857f416d +https://conda.anaconda.org/conda-forge/linux-64/r-s2-1.1.6-r43h5eac2b3_0.conda#8295dd173068e7ca92a742ebcc72d75a +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/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 +https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r43hc72bb7e_1005.conda#15f718c5ad9c479dc80f1812cc787c27 +https://conda.anaconda.org/conda-forge/noarch/r-lmomco-2.5.1-r43hc72bb7e_0.conda#3eff921d171972770deabc2cfff9fcd2 +https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.4-r43hc72bb7e_1.conda#72783cf9e09eeb47114fc506de126613 +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/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-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 +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/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/r-climprojdiags-0.3.2-r41hc72bb7e_0.conda#9922b863cd10035cbb75e3c2edae64a7 -https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r41h133d619_1.conda#3ae9b78fb1d8a44deed24a27cce33ebf +https://conda.anaconda.org/conda-forge/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 -https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.4.2-r41hc72bb7e_0.conda#c2b04f4ff351d84bf51fd5a77b5c9b6c -https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r41hc72bb7e_2.tar.bz2#f67eae0562ffc808b82f1590776c25f5 -https://conda.anaconda.org/conda-forge/noarch/r-styler-1.10.1-r41hc72bb7e_0.conda#c12b81cff8bb8745ffbe7aeb9dfd795f -https://conda.anaconda.org/conda-forge/linux-64/r-tlmoments-0.7.5.3-r41h38f115c_0.conda#d6992015dff73f17ee76a9380b367b9f -https://conda.anaconda.org/conda-forge/noarch/r-viridis-0.6.3-r41hc72bb7e_0.conda#8502ff3a06bb92a4bba056127965f9d9 -https://conda.anaconda.org/conda-forge/noarch/r-waldo-0.5.1-r41hc72bb7e_0.conda#70a78bfe3a730e73308eb0858a78476f -https://conda.anaconda.org/conda-forge/linux-64/r-fields-14.1-r41hac0b197_1.conda#3178d2a57796f6462ea7457ba4b6447c -https://conda.anaconda.org/conda-forge/noarch/r-spei-1.8.1-r41hc72bb7e_0.conda#c928901be40f7694f1237570a148416c -https://conda.anaconda.org/conda-forge/linux-64/r-testthat-3.1.8-r41ha503ecb_0.conda#d0c8f9f62ce32fad40fa9ec17dd21ee0 -https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_0-r41h06615bd_1.tar.bz2#dabe8f942d619075cbd13c1481c8b538 -https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.0.2-r41hc72bb7e_0.tar.bz2#769c2305486b74fd61d85bfef2296f27 -https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r41hc72bb7e_1.tar.bz2#2253f130c8dab435824d6ddb10a41c73 +https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_5-r43h57805ef_0.conda#dc942c6f2062894f7baf00fc6b907a79 +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.3-pyhd8ed1ab_0.conda#0dbaa7d08d3d79b2a1a4dd6a02cc4581 +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/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 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.2.6-pyhd8ed1ab_0.conda#bbfd1120d1824d2d073bc65935f0e4c0 +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/config-user-example.yml b/config-user-example.yml index ab9c8f3b4d..c102928db9 100644 --- a/config-user-example.yml +++ b/config-user-example.yml @@ -237,13 +237,38 @@ drs: # CMIP5: /project/champ/data/cmip5/output1 # CMIP6: /project/champ/data/CMIP6 # CORDEX: /project/champ/data/cordex/output -# OBS: /data/users/esmval/ESMValTool/temporary/obs/ -# obs4MIPs: /data/users/esmval/ESMValTool/temporary/obs/ +# OBS: /data/users/esmval/ESMValTool/obs +# OBS6: /data/users/esmval/ESMValTool/obs +# obs4MIPs: /data/users/esmval/ESMValTool/obs # ana4mips: /project/champ/data/ana4MIPs +# native6: /data/users/esmval/ESMValTool/rawobs +# RAWOBS: /data/users/esmval/ESMValTool/rawobs #drs: # CMIP5: BADC # CMIP6: BADC # CORDEX: BADC # OBS: default +# OBS6: default # obs4MIPs: default # ana4mips: BADC +# native6: default + +# Site-specific entries: NCI +# Uncomment the lines below to locate data at NCI. +#rootpath: +# CMIP6: [/g/data/oi10/replicas/CMIP6, /g/data/fs38/publications/CMIP6, /g/data/xp65/public/apps/esmvaltool/replicas/CMIP6] +# CMIP5: [/g/data/r87/DRSv3/CMIP5, /g/data/al33/replicas/CMIP5/combined, /g/data/rr3/publications/CMIP5/output1, /g/data/xp65/public/apps/esmvaltool/replicas/cmip5/output1] +# CMIP3: /g/data/r87/DRSv3/CMIP3 +# OBS: /g/data/ct11/access-nri/replicas/esmvaltool/obsdata-v2 +# OBS6: /g/data/ct11/access-nri/replicas/esmvaltool/obsdata-v2 +# obs4MIPs: /g/data/ct11/access-nri/replicas/esmvaltool/obsdata-v2 +# ana4mips: /g/data/ct11/access-nri/replicas/esmvaltool/obsdata-v2 +# native6: /g/data/xp65/public/apps/esmvaltool/native6 +# +#drs: +# CMIP6: NCI +# CMIP5: NCI +# CMIP3: NCI +# CORDEX: ESGF +# obs4MIPs: default +# ana4mips: default diff --git a/doc/sphinx/source/community/release_strategy/release_strategy.rst b/doc/sphinx/source/community/release_strategy/release_strategy.rst index b358fdb7f3..cae1c43807 100644 --- a/doc/sphinx/source/community/release_strategy/release_strategy.rst +++ b/doc/sphinx/source/community/release_strategy/release_strategy.rst @@ -54,9 +54,19 @@ With the following release schedule, we strive to have three releases per year a Upcoming releases ^^^^^^^^^^^^^^^^^ -- 2.11.0 (Release Manager: TBD) +- 2.11.0 (Release Manager: Met Office: `Emma Hogan`_, `Chris Billows`_, `Ed Gillett`_) -Planned for February or March 2024 ++------------+------------+----------------------------------------+-------------------------------------+ +| Planned | Done | Event | Changelog | ++============+============+========================================+=====================================+ +| 2024-04-22 | | ESMValCore `Feature Freeze`_ | | ++------------+------------+----------------------------------------+-------------------------------------+ +| 2023-05-03 | | ESMValCore released | | ++------------+------------+----------------------------------------+-------------------------------------+ +| 2023-05-06 | | ESMValTool `Feature Freeze`_ | | ++------------+------------+----------------------------------------+-------------------------------------+ +| 2023-05-17 | | ESMValTool released | | ++------------+------------+----------------------------------------+-------------------------------------+ Past releases ^^^^^^^^^^^^^ @@ -647,3 +657,6 @@ Changelog .. _Manuel Schlund: https://github.com/schlunma .. _Javier Vegas-Regidor: https://github.com/jvegasbsc .. _Klaus Zimmermann: https://github.com/zklaus +.. _Emma Hogan: https://github.com/ehogan +.. _Chris Billows: https://github.com/chrisbillowsMO +.. _Ed Gillett: https://github.com/mo-gill diff --git a/doc/sphinx/source/develop/dataset.rst b/doc/sphinx/source/develop/dataset.rst index 4a87a2dd93..f3c168a17c 100644 --- a/doc/sphinx/source/develop/dataset.rst +++ b/doc/sphinx/source/develop/dataset.rst @@ -74,7 +74,7 @@ The folder ``RAWOBS`` needs the subdirectories ``Tier1``, ``Tier2`` and ``Tier3``. The different tiers describe the different levels of restrictions for downloading (e.g. providing contact information, licence agreements) and using the observations. The unformatted (raw) observations -should then be stored then in the appropriate of these three folders. +should then be stored in the appropriate of these three folders. For each additional dataset, an entry needs to be made to the file `datasets.yml diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index a72bce73aa..c6bc77d614 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -232,8 +232,12 @@ 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 | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | APHRO-MA | pr, tas (day), pr, tas (Amon) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | AURA-TES | tro3 (Amon) | 3 | NCL | diff --git a/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_DJF.png b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_DJF.png new file mode 100644 index 0000000000..ccf5c4b1c8 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_DJF.png differ diff --git a/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_JJA.png b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_JJA.png new file mode 100644 index 0000000000..38b09c52f9 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_JJA.png differ diff --git a/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_MAM.png b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_MAM.png new file mode 100644 index 0000000000..5e7ca417a1 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_MAM.png differ diff --git a/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_SON.png b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_SON.png new file mode 100644 index 0000000000..ffb666eea2 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_SON.png differ diff --git a/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_scatter.png b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_scatter.png new file mode 100644 index 0000000000..67c64a3fa7 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1988_2008_scatter.png differ diff --git a/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_DJF.png b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_DJF.png new file mode 100644 index 0000000000..f653410e07 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_DJF.png differ diff --git a/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_JJA.png b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_JJA.png new file mode 100644 index 0000000000..6474acc856 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_JJA.png differ diff --git a/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_MAM.png b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_MAM.png new file mode 100644 index 0000000000..2e2fda4cca Binary files /dev/null and b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_MAM.png differ diff --git a/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_SON.png b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_SON.png new file mode 100644 index 0000000000..ce4d3fac08 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_SON.png differ diff --git a/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_scatter.png b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_scatter.png new file mode 100644 index 0000000000..9226bca81a Binary files /dev/null and b/doc/sphinx/source/recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_scatter.png differ diff --git a/doc/sphinx/source/recipes/index.rst b/doc/sphinx/source/recipes/index.rst index edcc48977a..0f0ce7667d 100644 --- a/doc/sphinx/source/recipes/index.rst +++ b/doc/sphinx/source/recipes/index.rst @@ -62,6 +62,7 @@ Atmosphere recipe_thermodyn_diagtool recipe_validation recipe_radiation_budget + recipe_aod_aeronet_assess Climate metrics ^^^^^^^^^^^^^^^ diff --git a/doc/sphinx/source/recipes/recipe_aod_aeronet_assess.rst b/doc/sphinx/source/recipes/recipe_aod_aeronet_assess.rst new file mode 100644 index 0000000000..fec1bed761 --- /dev/null +++ b/doc/sphinx/source/recipes/recipe_aod_aeronet_assess.rst @@ -0,0 +1,161 @@ +.. _recipe_aod_aeronet_assess: + +AOD AeroNET Assess +================== + +Overview +-------- + +This diagnostic evaluates model aerosol optical depth (AOD) against ground +based observations from the AeroNET measurement network. Monthly mean AOD +data is downloaded from the AeroNET website and formatted (CMORized) using the +AERONET downloader and formatter within ESMValTool. + +Multiannual seasonal means are calculated from the model output and compared +with a multiannual seasonal mean climatology generated from AeroNET +observational data. At each AeroNET station the data are screened for validity +according to the following default criteria: + + * 1. Monthly means must be generated from at least one AOD observation in that + month. + + * 2. Seasonal means for DJF, MAM, JJA and SON must be calculated from three + monthly means, i.e. a monthly mean from December January and Feburary. + + * 3. For a given year to be valid, there must be a seasonal mean for each climate + season i.e. DJF, MAM, JJA and SON. + + * 4. For a multiannual seasonal means there must be at least five seasonaal means + over the time range of interest. + +NOTE: The code is designed to be flexible and the default criteria can be +changed according to the user's requirements (see the user settings below). + +The evaluation is visualised by plotting model output as 2D filled contours and +overlaying AeroNET observations at model grid cells co-located with the AeroNET +measurement stations. Statistical data (root mean square error) is generated +using AeroNET observations at model grid cells co-located with the AeroNET +measurement stations. + +Available recipes and diagnostics +--------------------------------- + +Recipes are stored in esmvaltool/recipes/ + + * recipe_aod_aeronet_assess.yml + +Diagnostics are stored in esmvaltool/diag_scripts/aerosols/ + + * aod_aeronet_assess.py: Plot the AOD evaluation. + * aero_utils.py: Utility functions commonly used by aerosol assessment routines. + + +User settings in recipe +----------------------- + +#. Script aod_aeronet_assess.py + + *Required settings for script* + + * wavel: The wavelength of interest for the evaluation, currently set up for 440nm + * min_days_per_mon: The minimum number of days used to calculate the AOD monthly mean + * min_mon_per_seas: The minimum number of seasons used to calculate each + seasonal mean. This must be between 1 and 3. + * min_seas_per_year: The minimum number of seasonal means in each year. This + must be between 1 and 4. + * min_seas_per_clim: The minimum number of seasonal means used to calculate + the multiannual seasonal mean. This must be btween 1 and the number of years + of available AeroNET data. + + *Optional settings for script* + + * None + + *Required settings for variables* + + * None + + *Optional settings for variables* + + * None + + *Required settings for preprocessor* + + * None + + *Optional settings for preprocessor* + + * None + + *Color tables* + + * brewer_Spectral_11 + + +Variables +--------- + +* od440aer (atmos, monthly mean, longitude latitude time) + + +Observations and reformat scripts +--------------------------------- + +* Note: (1) obs4MIPs data can be used directly without any preprocessing; (2) + see headers of reformat scripts for non-obs4MIPs data for download + instructions. + +* The AeroNET data is downloaded from the AeroNET website using the downloader: + + .. code-block:: yaml + + $ esmvaltool data download AERONET. + +* The AeroNET data is formatteed (CMORized) using the formatter: + + .. code-block:: yaml + + $ esmvaltool data format AERONET. + + + +References +---------- +* Holben B.N., T.F.Eck, I.Slutsker, D.Tanre, J.P.Buis, A.Setzer, E.Vermote, J.A.Reagan, Y.Kaufman, T.Nakajima, F.Lavenu, I.Jankowiak, and A.Smirnov, 1998: AERONET - A federated instrument network and data archive for aerosol characterization, Rem. Sens. Environ., 66, 1-16. + +* Holben, B.N., D.Tanre, A.Smirnov, T.F.Eck, I.Slutsker, N.Abuhassan, W.W.Newcomb, J.Schafer, B.Chatenet, F.Lavenue, Y.J.Kaufman, J.Vande Castle, A.Setzer, B.Markham, D.Clark, R.Frouin, R.Halthore, A.Karnieli, N.T.O'Neill, C.Pietras, R.T.Pinker, K.Voss, and G.Zibordi, 2001: An emerging ground-based aerosol climatology: Aerosol Optical Depth from AERONET, J. Geophys. Res., 106, 12 067-12 097. + +* Mulcahy, J. P., Johnson, C., Jones, C. G., Povey, A. C., Scott, C. E., Sellar, A., Turnock, S. T., Woodhouse, M. T., Abraham, N. L., Andrews, M. B., Bellouin, N., Browse, J., Carslaw, K. S., Dalvi, M., Folberth, G. A., Glover, M., Grosvenor, D. P., Hardacre, C., Hill, R., Johnson, B., Jones, A., Kipling, Z., Mann, G., Mollard, J., O’Connor, F. M., Palmiéri, J., Reddington, C., Rumbold, S. T., Richardson, M., Schitgens, N. A. J., Stier, P., Stringer, M., Tang, Y., Walton, J., Woodward, S., and Yool. A.: Description and evaluation of aerosol in UKESM1 and HadGEM3-GC3.1 CMIP6 historical simulations, Geosci. Model Dev., 13, 6383–6423, 2020 + +Example plots +------------- + +.. _fig_aod_aeronet_assess_1: +.. figure:: /recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_DJF.png + :align: center + + Evaluation of AOD at 440 nm from UKESM1 historical ensemble member r1i1p1f2 against the AeroNET climatology from ground-based observations for Dec-Jan-Feb. The multiannual seasonal mean is calculated for the model data for the period 1994-2014. The model output is overlaid with the observational climatology. + +.. _fig_aod_aeronet_assess_2: +.. figure:: /recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_MAM.png + :align: center + + Evaluation of AOD at 440 nm from UKESM1 historical ensemble member r1i1p1f2 against the AeroNET climatology from ground-based observations for Mar_Apr_May. The multiannual seasonal mean is calculated for the model data for the period 1994-2014. The model output is overlaid with the observational climatology. + +.. _fig_aod_aeronet_assess_3: +.. figure:: /recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_JJA.png + :align: center + + Evaluation of AOD at 440 nm from UKESM1 historical ensemble member r1i1p1f2 against the AeroNET climatology from ground-based observations for Jun-Jul-Aug. The multiannual seasonal mean is calculated for the model data for the period 1994-2014. The model output is overlaid with the observational climatology. + +.. _fig_aod_aeronet_assess_4: +.. figure:: /recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_SON.png + :align: center + + Evaluation of AOD at 440 nm from UKESM1 historical ensemble member r1i1p1f2 against the AeroNET climatology from ground-based observations for Sep-Oct-Nov. The multiannual seasonal mean is calculated for the model data for the period 1994-2014. The model output is overlaid with the observational climatology. + +.. _fig_aod_aeronet_assess_5: +.. figure:: /recipes/figures/aod_aeronet_assess/UKESM1-0-LL_CMIP_AERmon_historical_od440aer_gn_1994_2014_scatter.png + :align: center + + Evaluation of AOD at 440 nm from UKESM1 historical ensemble member r1i1p1f2 against the AeroNET climatology from ground-based observations for Dec-Jan-Feb, Mar_Apr_May, Jun-Jul-Aug and Sep-Oct-Nov. The multiannual seasonal mean is calculated for the model data for the period 1994-2014. diff --git a/environment.yml b/environment.yml index 1a1c960942..547aaecec1 100644 --- a/environment.yml +++ b/environment.yml @@ -11,7 +11,7 @@ channels: dependencies: - aiohttp - cartopy - - cdo >=1.9.7 + - cdo >=2.3.0 - cdsapi - cf-units - cftime @@ -21,10 +21,11 @@ dependencies: - distributed - ecmwf-api-client - eofs - - esmpy + - esmpy !=8.1.0,<8.6.0 # https://github.com/SciTools-incubator/iris-esmf-regrid/pull/342#issuecomment-2092921514 - esmvalcore 2.10.* - fiona - fire + - fsspec - gdal - iris >=3.6.1 - iris-esmf-regrid >=0.7.0 @@ -40,7 +41,7 @@ dependencies: - numpy !=1.24.3 # severe masking bug - openpyxl - packaging - - pandas + - pandas !=2.2.0,!=2.2.1,!=2.2.2 # github.com/ESMValGroup/ESMValCore/pull/2305 - pip !=21.3 - progressbar2 - prov @@ -49,6 +50,7 @@ dependencies: - psy-reg - psy-simple - pyproj >=2.1 + - pys2index # only from conda-forge - python >=3.9 - python-cdo - python-dateutil @@ -67,7 +69,7 @@ dependencies: - xgboost >1.6.1 # github.com/ESMValGroup/ESMValTool/issues/2779 - xlsxwriter - zarr - # Python packages needed for testing + # Python packages needed for unit testing - flake8 - pytest >=3.9,!=6.0.0rc1,!=6.0.0 - pytest-cov @@ -84,6 +86,7 @@ dependencies: # Python packages needed for development - codespell - docformatter + - imagehash - isort - pre-commit - prospector @@ -102,7 +105,7 @@ dependencies: - cdo - r-base >=3.5 - r-abind - - r-akima <=0.6-2.3 # see https://github.com/ESMValGroup/ESMValTool/issues/2695 + - r-akima - r-climdex.pcic - r-climprojdiags - r-docopt diff --git a/environment_osx.yml b/environment_osx.yml index 6d14f65227..809cb09346 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -11,7 +11,7 @@ channels: dependencies: - aiohttp - cartopy - - cdo >=1.9.7 + - cdo >=2.3.0 - cdsapi - cf-units - cftime @@ -21,9 +21,10 @@ dependencies: - distributed - ecmwf-api-client - eofs - - esmpy + - 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 @@ -40,7 +41,7 @@ dependencies: - numpy !=1.24.3 # severe masking bug - openpyxl - packaging - - pandas + - pandas !=2.2.0,!=2.2.1,!=2.2.2 # github.com/ESMValGroup/ESMValCore/pull/2305 - pip !=21.3 - progressbar2 - prov @@ -48,7 +49,8 @@ dependencies: - psy-maps - psy-reg - psy-simple - - pyproj>=2.1 + - pyproj >=2.1 + - pys2index # only from conda-forge - python >=3.9 - python-cdo - python-dateutil @@ -67,7 +69,7 @@ dependencies: - xgboost >1.6.1 # github.com/ESMValGroup/ESMValTool/issues/2779 - xlsxwriter - zarr - # Python packages needed for testing + # Python packages needed for unit testing - flake8 - pytest >=3.9,!=6.0.0rc1,!=6.0.0 - pytest-cov @@ -84,6 +86,7 @@ dependencies: # Python packages needed for development - codespell - docformatter + - imagehash - isort - pre-commit - prospector 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/cmor_config/ANUClimate.yml b/esmvaltool/cmorizers/data/cmor_config/ANUClimate.yml new file mode 100644 index 0000000000..3b5ce35b31 --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/ANUClimate.yml @@ -0,0 +1,32 @@ +--- +filename: 'ANUClimate_{version}_{raw}_{freq}_.*.nc' #yyyymm + +attributes: + project_id: OBS6 + dataset_id: ANUClimate + version: 'v2-0' + tier: 3 + modeling_realm: reanaly + # resolution: '0.01 degree' + source: 'https://dx.doi.org/10.25914/60a10aa56dd1b' + reference: 'anuclimate2' + comment: 'hosted on NCI' + +variables: + pr: + mip: Amon + freq: monthly # daily available + raw: rain + + tasmax: + mip: Amon + freq: monthly + raw: tmax + tasmin: + mip: Amon + freq: monthly + raw: tmin + tas: + mip: Amon + freq: monthly + raw: tavg diff --git a/esmvaltool/cmorizers/data/datasets.yml b/esmvaltool/cmorizers/data/datasets.yml index 757fce7d67..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" @@ -19,6 +26,17 @@ datasets: Data from NCI (National Computing Infrastructure Australia https://nci.org.au/), requires an NCI account and access to Gadi(Supercomputer in Canberra) and the project found in catalogue record. Access can be requested through NCI. NCI is an ESGF node (https://esgf.nci.org.au/projects/esgf-nci/) + + ANUClimate: + tier: 3 + source: "https://dx.doi.org/10.25914/60a10aa56dd1b" + last_access: 2023-11-21 + info: | + Data from NCI project requiring an NCI account and access to GADI + + ANUClimate 2.0 consists of gridded daily and monthly climate variables across the terrestrial landmass of Australia + from at least 1970 to the present. Rainfall grids are generated from 1900 to the present. The underpinning spatial + models have been developed at the Fenner School of Environment and Society of the Australian National University. APHRO-MA: tier: 3 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/formatters/datasets/anuclimate.py b/esmvaltool/cmorizers/data/formatters/datasets/anuclimate.py new file mode 100644 index 0000000000..0077bd17a4 --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/anuclimate.py @@ -0,0 +1,125 @@ +"""ESMValTool CMORizer for ANU Climate data. + +Tier + Tier 3: restricted dataset. + +Source + https://dx.doi.org/10.25914/60a10aa56dd1b + +Last access + 20231121 + +Download and processing instructions + Data from NCI project requiring an NCI account and access to GADI + Processing is done on GADI + +""" +import logging +import os +import re +import calendar + +import iris + +from esmvaltool.cmorizers.data import utilities as utils + +logger = logging.getLogger(__name__) + + +def _get_filepaths(in_dir, basename): + """Find correct name of file (extend basename with timestamp).""" + regex = re.compile(basename) + return_files = [] + # Search sub folders of raw data directory + for root, _dir, files in os.walk(in_dir, followlinks=True): + + for filename in files: + if regex.match(filename): + + return_files.append(os.path.join(root, filename)) + + return return_files + + +def fix_data_var(cube, var): + """Convert units in cube for the variable.""" + # get month, year from cube + tcoord = cube.coord('time') + tdate = tcoord.units.num2date(tcoord.points[0]) + no_ofdays = calendar.monthrange(tdate.year, tdate.month)[1] + + if var == 'pr': + + cube = cube / (no_ofdays * 86400) # days in month + cube.units = 'kg m-2 s-1' + + elif var in ['tas', 'tasmin', 'tasmax']: # other variables in v1 + cube = cube + 273.15 + cube.units = 'K' + utils.add_height2m(cube) + + else: + logger.info("Variable %s not converted", var) + + return cube, tdate.year + + +def _extract_variable(cmor_info, attrs, filepaths, out_dir): + """Extract variable.""" + var = cmor_info.short_name + logger.info("Var is %s", var) + cbls_2 = iris.cube.CubeList() + cbls_1 = iris.cube.CubeList() + for filepath in filepaths: + cubes = iris.load(filepath) + + cube, year = fix_data_var(cubes[0], var) + + utils.fix_var_metadata(cube, cmor_info) + + utils.set_global_atts(cube, attrs) + + if year < 2000: # split for cube save + cbls_1.append(cube) + else: + cbls_2.append(cube) + + for cbls in [cbls_1, cbls_2]: + iris.util.equalise_attributes(cbls) + cubesave = cbls.concatenate_cube() + utils.fix_coords(cubesave) + + logger.info("Saving file") + utils.save_variable(cubesave, + var, + out_dir, + attrs, + unlimited_dimensions=['time']) + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Cmorization func call.""" + glob_attrs = cfg['attributes'] + cmor_table = cfg['cmor_table'] + + ver = cfg['attributes']['version'] + logger.info(cfg, cfg_user) + + # Run the cmorization, multiple variables + for (var, var_info) in cfg['variables'].items(): + + glob_attrs['mip'] = var_info['mip'] + + raw_filename = cfg['filename'].format(version=ver, + raw=var_info['raw'], + freq=var_info['freq']) + filepaths = _get_filepaths(in_dir, raw_filename) + + if len(filepaths) == 0: + logger.info("no files for %s pattern: %s", var, raw_filename) + logger.info("directory: %s", in_dir) + else: + logger.info("Found files, count %s", len(filepaths)) + + cmor_info = cmor_table.get_variable(var_info['mip'], var) + _extract_variable(cmor_info, glob_attrs, filepaths, out_dir) 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/config-references.yml b/esmvaltool/config-references.yml index 285ace740e..b5f43bc911 100644 --- a/esmvaltool/config-references.yml +++ b/esmvaltool/config-references.yml @@ -252,6 +252,10 @@ authors: name: Hansson, Ulf institute: SMHI, Sweden orcid: + hardacre_catherine: + name: Hardacre, Catherine + institute: University of Canterbury, New Zealand + orcid: https://orcid.org/0000-0001-9093-4656 hassler_birgit: name: Hassler, Birgit institute: DLR, Germany diff --git a/esmvaltool/diag_scripts/aerosols/aero_utils.py b/esmvaltool/diag_scripts/aerosols/aero_utils.py new file mode 100644 index 0000000000..623a85f2aa --- /dev/null +++ b/esmvaltool/diag_scripts/aerosols/aero_utils.py @@ -0,0 +1,193 @@ +"""Part of the ESMValTool Aerosol diagnostics. + +This module contains utility functions commonly used by aerosol +assessment routines. +""" + +import iris +import numpy as np + + +class AeroAnsError(Exception): + + """Exception class for errors raised when model data is checked in the + extract_pt module. + """ + + +def add_bounds(cube): + """Add bounds to a cube's latitude and longitude coordinates. + + Parameters + ---------- + cube : Iris cube + Iris cube with latitude and longitude coordinates. + + Returns + ------- + cube : Iris cube. + Iris cube with bounds added to the latitude and longitude coordinates. + """ + + if not cube.coord('latitude').has_bounds(): + cube.coord('latitude').guess_bounds() + if not cube.coord('longitude').has_bounds(): + cube.coord('longitude').guess_bounds() + + return cube + + +def extract_pt(icube, pt_lat, pt_lon, height=None, level=None, nearest=False): + """Extracts given location(s) (3-D) from a cube. + + Method + ------ + Uses Iris module Analysis.Interpolate to extract values, + initially based on horizontal coordinates, and then based on + height, if specified. + + If height ('altitude') is requested, checks if cube heights + include orography, i.e. HybridHeights have been derived. + + Parameters + ---------- + icube : Iris cube + pt_lat, pt_lon : Float or list/array of floats. Latitude and longitude + coordinates of desired points. + args: + height : Float or list/array of floats. Altitude (above geoid) of + point. Initialized to None. + level : Integer . Model level or pseudo level or tile number. + Initialized to None, meaning that all available levels in + the cube are used. + nearest : Boolean. Specify whether to use 'nearest neighbour', instead + of 'linear' method while extracting data. Default is False. + + Returns + ------- + data_out : List + List of single point values, corresponding to each point specified. + + Raises + ------ + AeroAnsError : If the number of latitude and longitude points are + mismatched. OR if both and level and height are passed as args. + OR if the cube contains a time coordinate. OR if a pseudo level + coordinate is requested, but not present in the cube. OR if the numbers + of latitude/longitude and height points are mismatched. OR if height + is requested but the cube does not contain an altitude coordinate. + """ + + # Check that input data is a (single) cube + if not isinstance(icube, iris.cube.Cube): + raise AeroAnsError('Extract_pt:First argument must be a single cube') + + # Check if the cube contains a time dimension, which is + # currently unsupported. + if icube.coords()[0].name() == 'time': + raise AeroAnsError( + 'Extract_pt:Cannot handle time dimension at present') + + # Check that equal number of lat/lon pairs are passed in point coordinates. + # Convert arguments to lists for easier processing if necessary. + pt_lat1 = [] + pt_lon1 = [] + + if not isinstance(pt_lat, list): + pt_lat1.append(pt_lat) + pt_lon1.append(pt_lon) + + else: + for n_lat in np.arange(len(pt_lat)): + pt_lat1.append(pt_lat[n_lat]) + pt_lon1.append(pt_lon[n_lat]) + + if len(pt_lat1) != len(pt_lon1): + raise AeroAnsError('Extract_pt:Mismatch in number of lat/long values') + + # Check that both level and height haven't been requested. + if level is not None and height is not None: + raise AeroAnsError('Extract_pt: Both Level and Height requested') + + # Check that the cube has a level coordinate if level has been requested. + if level is not None and not icube.coord( + 'model_level_number') and not icube.coord('pseudo_level'): + raise AeroAnsError('Extract_pt:Level requested, but not found in cube') + + # Check that the number of height points is equal to the number of + # lat/lon pairs. Convert the argument to a list for easier + # processing if necessary. + if height is not None: + pt_hgt = [] + +# if isinstance(height, list): +# pt_hgt.extend(height) +# else: +# pt_hgt.append(height) + pt_hgt.extend(height) if \ + isinstance(height, list) else \ + pt_hgt.append(height) + + if len(pt_lat1) != len(pt_hgt): + raise AeroAnsError( + 'Extract_pt:Mismatch in number of points for lat/long/height') + + # Check that heights have been merged with orography. + if not icube.coords('altitude'): + raise AeroAnsError( + 'Extract_pt:Height requested but input data does not contain \ + "Altitude" coordinate') + + # Store the min and max altitudes from cube data so that user + # cannot request points located below/ above that. + # Will extract =min/max if beyond limits. + hgt_min = icube.coord('altitude').points.min() + hgt_max = icube.coord('altitude').points.max() + + # ---------- Finished checks -- begin processing ------------------------- + + # If level specified, extract slice first + if level is not None: + + try: + icube = icube.extract( + iris.Constraint(model_level_number=level)) + + except Exception: + print('Model level number not available. Use pseudo level') + + else: + icube = icube.extract( + iris.Constraint(pseudo_level=level)) + + # Extract values for specified points lat/lon + # NOTE: Does not seem to handle multiple points if 3-D + data_out = [] + + # Set lat/lon coordinates for model grid cell interpolation + for n_lat1 in np.arange(len(pt_lat1)): + latlon_coords = [('latitude', pt_lat1[n_lat1]), + ('longitude', pt_lon1[n_lat1])] + + if nearest: + tcube = icube.interpolate(latlon_coords, iris.analysis.Nearest()) + else: + tcube = icube.interpolate(latlon_coords, iris.analysis.Linear()) + + # If height specified, interpolate to requested height + if height is not None: + + # Set vertical coordinates for model grid cell interpolation + point = max(pt_hgt[n_lat1], hgt_min) + point = min(pt_hgt[n_lat1], hgt_max) + hgt_coords = [('altitude', point)] + + if nearest: + tcube = tcube.interpolate(hgt_coords, iris.analysis.Nearest()) + else: + tcube = tcube.interpolate(hgt_coords, iris.analysis.Linear()) + + # Append processed data point + data_out.append(tcube.data) + + return data_out diff --git a/esmvaltool/diag_scripts/aerosols/aod_aeronet_assess.py b/esmvaltool/diag_scripts/aerosols/aod_aeronet_assess.py new file mode 100644 index 0000000000..27ab6b2714 --- /dev/null +++ b/esmvaltool/diag_scripts/aerosols/aod_aeronet_assess.py @@ -0,0 +1,448 @@ +"""Implement the AOD climatology metric from ground-based + AeroNet observations. +""" +import logging +import os + +import iris +import iris.plot as iplt +import matplotlib.cm as mpl_cm +import matplotlib.lines as mlines +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.shared import group_metadata, run_diagnostic +from esmvaltool.diag_scripts.shared._base import get_plot_filename + +logger = logging.getLogger(os.path.basename(__file__)) +fontsizedict = {"title": 25, "axis": 20, "legend": 18, "ticklabel": 18} + + +def get_provenance_record(filenames): + """Return a provenance record describing the metric. + + Parameters + ---------- + filenames : List of strings + The filenames containing the data used to create the metric. + + Returns + ------- + dictionary + The provenance record describing the metric. + """ + record = { + "ancestors": filenames, + } + + return record + + +def plot_aod_mod_obs(md_data, obs_data, aeronet_obs_cube, plot_dict): + """Plot AOD contour overlaid with Aeronet climatology. + + Parameters + ---------- + md_data : Iris cube + Model AOD as a cube with latitude and longitude coordinates. + obs_data : List. + Observations of AOD from each AeroNET station. + aeronet_obs_cube : Iris cube. + Holds information about Aeronet measurement stations including + station names, station latitude and station longitude. + plot_dict : Dictionary. + Holds plotting settings. + """ + # Plot model data + cf_plot = iplt.contourf(md_data, + plot_dict["Levels"], + colors=plot_dict["Colours"], + extend="max") + + # Latitude and longitude of stations. + anet_aod_lats = aeronet_obs_cube.coord("latitude").points + anet_aod_lons = ((aeronet_obs_cube.coord("longitude").points + 180) % 360 - + 180) + + # Loop over stations + for istn, stn_data in enumerate(obs_data): + if ma.is_masked(stn_data): + continue + + # Find position of the observed AOD on the colorscale. + # np.searchsorted returns index at which inserting new value will + # maintain a sorted array. We use the color to the left of index. + cid = np.searchsorted(plot_dict["Levels"], stn_data) + cid = max(0, cid - 1) # filter out zero and max when seeking 'left' + cid = min(len(plot_dict["Colours"]) - 1, cid) + pcol = plot_dict["Colours"][cid] + + # Overlay contourf with observations + plt.plot( + anet_aod_lons[istn], + anet_aod_lats[istn], + color=pcol, + marker="o", + markeredgecolor="k", + markeredgewidth=2, + markersize=9, + ) + + # Decorate the plot + plt.title(plot_dict["Title"], size=24) + colbar = plt.colorbar(cf_plot, orientation="horizontal") + colbar.set_ticks(plot_dict["Levels"]) + colbar.set_ticklabels(plot_dict["tick_labels"]) + plt.gca().coastlines(color="#525252") + + # Statistics on plot + plt.figtext( + 0.12, + 0.27, + (f'''Global mean AOD={plot_dict["Mean_aod"]:.3f}; RMSE=''' + f'''{plot_dict["RMS_aod"]:.3f}; Stn mean: md=''' + f'''{plot_dict["Stn_mn_md"]:.3f}; obs=''' + f'''{plot_dict["Stn_mn_obs"]:.3f}'''), + size=16, + ) + + +def aod_analyse(model_data, aeronet_obs_cube, clim_seas, wavel): + """Evaluates AOD vs Aeronet, generates plots and returns evaluation + metrics. + + Parameters + ---------- + model_data : Iris Cube. + Contains model output of AOD with coordinates; time, latitude and + longitude. + aeronet_obs_cube : Iris Cube. + Contains information about Aeronet measurement stations including + station names, station latitude and station longitude. + clim_seas : List. + Strings to denote climate seasons ["DJF", "MAM", "JJA", "SON"] + wavel : String. + AOD wavelength, default = 440nm - translates to pseudo-level. + + Returns + ------- + figures : List. + Contains figure instances for the seasonal contour plots overlaid with + observations of AOD from AeroNET. + fig_scatter : Figure object. + The scatter plot comparing modelled and observed AOD at 440nm. + """ + # Convert wave length nm -> um + wv_mi = str(float(wavel) / 1000.0) + + # Get model run id + if "parent_source_id" in model_data.attributes: + model_id = model_data.attributes["parent_source_id"] + else: + model_id = "Multi-Model-Mean" + + # Add bounds for lat and lon if not present + model_data = add_bounds(model_data) + + # Co-locate model grid points with measurement sites --func from aero_utils + anet_aod_lats = aeronet_obs_cube.coord("latitude").points.tolist() + anet_aod_lons = aeronet_obs_cube.coord("longitude").points.tolist() + aod_at_anet = extract_pt(model_data, anet_aod_lats, anet_aod_lons) + + # Set up seasonal contour plots + figures = [] + + clevs = [0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 2.0] + clabs = [ + "0.0", "", "0.1", "", "0.2", "", "0.3", "", "0.4", "", "0.5", "2.0" + ] + cmapr = mpl_cm.get_cmap("brewer_Spectral_11") + cmap = colors.ListedColormap(cmapr(range(cmapr.N))[-1::-1]) + colours = cmap.colors + + # Set up the figure for scatter plotting + fig_scatter = plt.figure(figsize=(10, 10)) + gs_scatter = gridspec.GridSpec(ncols=1, nrows=1) + ax_scatter = fig_scatter.add_subplot(gs_scatter[0, 0]) + col_scatter = ["#081d58", "#41ab5d", "#fe9929", "#7f0000"] + leg_scatter = [] + + # Loop over seasons + for season in aeronet_obs_cube.slices_over("clim_season"): + + # Match Aeronet obs season with model season number + model_sn = [c.lower() for c in clim_seas + ].index(season.coord("clim_season").points[0]) + model_season = model_data[model_sn] + + logger.info('Analysing AOD for %s: %s', {model_id}, + {clim_seas[model_sn]}) + + # Generate statistics required - area-weighted mean + grid_areas = iris.analysis.cartography.area_weights(model_season) + global_mean = model_season.collapsed( + ["latitude", "longitude"], + iris.analysis.MEAN, + weights=grid_areas, + ) + + # Extract model and obs data for season number (model_sn) + seas_anet_obs = season.data + seas_anet_md = np.array([x[model_sn] for x in aod_at_anet]) + + # Match model data with valid obs data + valid_indices = ma.where(seas_anet_obs) + valid_obs = seas_anet_obs[valid_indices] + valid_md = seas_anet_md[valid_indices] + + # Model - obs statistics (diff, model mean and RMS, r2) + diff = valid_md - valid_obs + stn_mn_obs = np.mean(valid_obs) + stn_mn_md = np.mean(valid_md) + rms_aod = np.sqrt(np.mean(diff**2)) + linreg = scipy.stats.linregress(valid_obs, valid_md) + + # Plot scatter of co-located model and obs data + ax_scatter.scatter(valid_obs, valid_md, color=col_scatter[model_sn]) + + # Legend + label = f"{clim_seas[model_sn]} = {linreg.rvalue**2:.2f}" + leg_scatter.append( + mlines.Line2D( + [0], + [0], + marker="o", + color="w", + label=label, + markersize=15, + markerfacecolor=col_scatter[model_sn], + )) + + # Plot contours overlaid with obs for this run and season + fig_cf = plt.figure(figsize=(11, 8), dpi=300) + + n_stn = str(len(valid_obs)) + title = ("\nTotal Aerosol Optical Depth at " + wv_mi + " microns" + + "\n" + model_id + ", " + clim_seas[model_sn] + + ", N stations=" + n_stn) + + # Plot dictionary + plot_dict = { + "Mean_aod": global_mean.data, + "Stn_mn_obs": stn_mn_obs, + "Stn_mn_md": stn_mn_md, + "RMS_aod": rms_aod, + "Levels": clevs, + "Colours": colours, + "tick_labels": clabs, + "Title": title, + "Season": clim_seas[model_sn], + } + plot_aod_mod_obs(model_season, seas_anet_obs, aeronet_obs_cube, + plot_dict) + + figures.append(fig_cf) + + # Decorate the scatter plot + line = mlines.Line2D([0, 1], [0, 1], color="#696969") + transform = ax_scatter.transAxes + line.set_transform(transform) + ax_scatter.add_line(line) + + ax_scatter.set( + xlim=(0, 1), + xticks=np.linspace(0.0, 1.0, num=6), + ylim=(0, 1), + yticks=np.linspace(0.0, 1.0, num=6), + ) + ax_scatter.set_xlabel("AeroNET AOD", fontsize=fontsizedict["axis"]) + ax_scatter.set_ylabel(model_id + " AOD", fontsize=fontsizedict["axis"]) + + ax_scatter.tick_params(axis="both", + which="major", + labelsize=fontsizedict["ticklabel"]) + + ax_scatter.set_title( + "Model vs obs: Total Aerosol Optical Depth \n at " + wv_mi + + " microns", + fontsize=fontsizedict["title"], + ) + + ax_scatter.legend( + handles=leg_scatter, + loc="lower right", + title="Seasonal R2", + title_fontsize=fontsizedict["legend"], + fontsize=fontsizedict["legend"], + ) + + return figures, fig_scatter + + +def preprocess_aod_obs_dataset(obs_dataset): + """Calculate a multiannual seasonal mean AOD climatology. + + Observational AOD timeseries data from AeroNET are used to generate a + multiannual seasonal mean climatology for each AeroNET station. The + user sets thresholds (or uses the default settings) to specify the + amount of valid data required for the climatology. At this stage + ESMValTool preprocessors are unsuitable for pre-processing the AeroNET + AOD observations because of the bespoke nature and application of the + filtering thresholds. + + Parameters + ---------- + obs_dataset : ESMValTool dictionary. Holds meta data for the observational + AOD dataset. + + Returns + ------- + multiannual_seaonal_mean : Iris cube. Preprocessed observational + AOD climatology. + """ + obs_cube = iris.load_cube(obs_dataset[0]["filename"]) + + # Set up thresholds for generating the multi annual seasonal mean + min_days_per_mon = 1 + min_mon_per_seas = 3 + min_seas_per_year = 4 + min_seas_per_clim = 5 + + # Add the clim_season and season_year coordinates. + iris.coord_categorisation.add_year(obs_cube, 'time', name='year') + + iris.coord_categorisation.add_season(obs_cube, 'time', name='clim_season') + + iris.coord_categorisation.add_season_year(obs_cube, + 'time', + name='season_year') + + # Copy obs cube and mask all months with fewer + # "Number of days" than given threshold. + num_days_var = obs_cube.ancillary_variable("Number of days") + masked_months_obs_cube = obs_cube.copy(data=ma.masked_where( + num_days_var.data < min_days_per_mon, obs_cube.data)) + + # Aggregate (mean) by season. + # The number of unmasked months per season is counted, + # and where there are fewer unmasked months than the + # given threshold, the computed mean is masked. + annual_seasonal_mean = masked_months_obs_cube.aggregated_by( + ['clim_season', 'season_year'], + iris.analysis.MEAN, + ) + annual_seasonal_count = masked_months_obs_cube.aggregated_by( + ['clim_season', 'season_year'], + iris.analysis.COUNT, + function=lambda values: ~ma.getmask(values), + ) + annual_seasonal_mean.data = ma.masked_where( + annual_seasonal_count.data < min_mon_per_seas, + annual_seasonal_mean.data, + ) + + # Aggregate (mean) by multi-annual season. + # The number of unmasked seasons per multi-annual season + # is counted, and where there are fewer unmasked seasons + # than the given threshold, the computed multi-annual + # season is masked. + multi_annual_seasonal_mean = annual_seasonal_mean.aggregated_by( + 'clim_season', + iris.analysis.MEAN, + ) + clim_season_agg_count = annual_seasonal_mean.aggregated_by( + 'clim_season', + iris.analysis.COUNT, + function=lambda values: ~ma.getmask(values), + ) + multi_annual_seasonal_mean.data = ma.masked_where( + clim_season_agg_count.data < min_seas_per_clim, + multi_annual_seasonal_mean.data, + ) + year_agg_count = multi_annual_seasonal_mean.aggregated_by( + 'year', + iris.analysis.COUNT, + function=lambda values: ~ma.getmask(values), + ) + + counter = range(len( + multi_annual_seasonal_mean.coord('clim_season').points)) + for iseas in counter: + multi_annual_seasonal_mean.data[iseas, :] = ma.masked_where( + year_agg_count.data[0, :] < min_seas_per_year, + multi_annual_seasonal_mean.data[iseas, :], + ) + + return multi_annual_seasonal_mean + + +def main(config): + """Produce the AOD climatology metric from ground-based AeroNet + observations. + + Parameters + ---------- + wavel : String. + User defined. Default is "440". + config : dict + The ESMValTool configuration. + """ + input_data = config["input_data"] + datasets = group_metadata(input_data.values(), "dataset") + + # Default wavelength + wavel = "440" + + # Produce climatology for observational dataset + obs_dataset = datasets.pop(config["observational_dataset"]) + obs_cube = preprocess_aod_obs_dataset(obs_dataset) + + for model_dataset, group in datasets.items(): + # 'model_dataset' is the name of the model dataset. + # 'group' is a list of dictionaries containing metadata. + logger.info("Processing data for %s", model_dataset) + logger.info(group) + + for attributes in group: + logger.info(attributes["filename"]) + + input_file = attributes["filename"] + provenance_record = get_provenance_record(input_file) + logger.info(provenance_record) + cube = iris.load_cube(input_file) + + # Set up for analysis and plotting + seasons = ["DJF", "MAM", "JJA", "SON"] + + plot_file_prefix = (model_dataset + "_" + attributes["activity"] + + "_" + attributes["mip"] + "_" + + attributes["exp"] + "_" + + attributes["short_name"] + "_" + + str(attributes["start_year"]) + "_" + + str(attributes["end_year"]) + "_") + + # Analysis and plotting for model-obs comparison + figures, fig_scatter = aod_analyse(cube, + obs_cube, + seasons, + wavel=wavel) + + # Save the scatter plot + output_file = plot_file_prefix + "scatter" + output_path = get_plot_filename(output_file, config) + fig_scatter.savefig(output_path) + + # Save the contour plots + for ifig, seas_fig in enumerate(figures): + output_file = plot_file_prefix + seasons[ifig] + output_path = get_plot_filename(output_file, config) + seas_fig.savefig(output_path) + + +if __name__ == "__main__": + with run_diagnostic() as CONFIG: + main(CONFIG) diff --git a/esmvaltool/diag_scripts/austral_jet/main.ncl b/esmvaltool/diag_scripts/austral_jet/main.ncl index c078830687..1b7604d4f5 100644 --- a/esmvaltool/diag_scripts/austral_jet/main.ncl +++ b/esmvaltool/diag_scripts/austral_jet/main.ncl @@ -342,14 +342,22 @@ begin lat_range = f->lat_bnds end if else - if (isatt(f, "plev") .and. \ + f_var = f->$var0$ + if (isatt(f, "plev") .and. \ ; ESMValCore < 2.11.0 isatt(f, "lat_range_0") .and. \ isatt(f, "lat_range_1")) then lev = f@plev lat_range = (/f@lat_range_0, f@lat_range_1/) + else if (isatt(f_var, "plev") .and. \ ; ESMValCore >= 2.11.0 + isatt(f_var, "lat_range_0") .and. \ + isatt(f_var, "lat_range_1")) then + lev = f_var@plev + lat_range = (/f_var@lat_range_0, f_var@lat_range_1/) else error_msg("f", DIAG_SCRIPT, "", "cannot read plev and latrange") end if + end if + delete(f_var) end if log_info("Retrieved pressure level " + lev + " and latitude range " + \ lat_range(0) + " to " + lat_range(1) + " from preprocessed data") diff --git a/esmvaltool/diag_scripts/emergent_constraints/__init__.py b/esmvaltool/diag_scripts/emergent_constraints/__init__.py index 1949719acb..545a07d9b5 100644 --- a/esmvaltool/diag_scripts/emergent_constraints/__init__.py +++ b/esmvaltool/diag_scripts/emergent_constraints/__init__.py @@ -297,12 +297,16 @@ def _get_data_frame(var_type, cubes, label_all_data, group_by=None): def _metadata_to_dict(metadata): """Convert :class:`iris.cube.CubeMetadata` to :obj:`dict`.""" - new_dict = {} - for (key, val) in metadata._asdict().items(): - if isinstance(val, dict): - new_dict.update(val) - else: - new_dict[key] = val + new_dict = dict(metadata.attributes) + other_keys = [ + 'standard_name', + 'long_name', + 'var_name', + 'units', + 'cell_methods', + ] + for key in other_keys: + new_dict[key] = getattr(metadata, key) return new_dict diff --git a/esmvaltool/diag_scripts/hyint/hyint_etccdi_preproc.R b/esmvaltool/diag_scripts/hyint/hyint_etccdi_preproc.R index bb14906453..36c09f952d 100644 --- a/esmvaltool/diag_scripts/hyint/hyint_etccdi_preproc.R +++ b/esmvaltool/diag_scripts/hyint/hyint_etccdi_preproc.R @@ -29,7 +29,7 @@ hyint_etccdi_preproc <- sfile_tmp0 <- cdo("delvar", args = "time_bnds", input = sfile) gridf <- tempfile() cdo("griddes", input = hyint_file, stdout = gridf) - sfile_tmp1 <- cdo("remapcon2", + sfile_tmp1 <- cdo("remapscon2", args = gridf, input = sfile_tmp0 ) diff --git a/esmvaltool/diag_scripts/hyint/hyint_functions.R b/esmvaltool/diag_scripts/hyint/hyint_functions.R index 5cc2b9d07e..a1595c2a72 100644 --- a/esmvaltool/diag_scripts/hyint/hyint_functions.R +++ b/esmvaltool/diag_scripts/hyint/hyint_functions.R @@ -626,7 +626,7 @@ create_landseamask <- ## Regridding the topographic map to chosen grid cdo( - "remapcon2", + "remapscon2", args = paste0("'", regrid, "'"), input = ftopo, output = regridded_topo @@ -827,7 +827,7 @@ ncdf_opener_universal <- # nolint rotate = "full", interp2grid = F, grid = "r144x73", - remap_method = "remapcon2", + remap_method = "remapscon2", exportlonlat = TRUE, verbose = F) { # load package @@ -1090,7 +1090,7 @@ ncdf_opener <- function(namefile, rotate = "full", interp2grid = F, grid = "r144x73", - remap_method = "remapcon2", + remap_method = "remapscon2", exportlonlat = T) { field <- ncdf_opener_universal( @@ -1123,7 +1123,7 @@ ncdf_opener_time <- # nolint rotate = "full", interp2grid = F, grid = "r144x73", - remap_method = "remapcon2") { + remap_method = "remapscon2") { # function to open netcdf files. It uses ncdf4 library # time selection of month and years needed automatically rotate matrix # to place greenwich at the center (flag "rotate") diff --git a/esmvaltool/diag_scripts/hyint/hyint_preproc.R b/esmvaltool/diag_scripts/hyint/hyint_preproc.R index ec0807cf70..c8350a061d 100644 --- a/esmvaltool/diag_scripts/hyint/hyint_preproc.R +++ b/esmvaltool/diag_scripts/hyint/hyint_preproc.R @@ -22,7 +22,7 @@ hyint_preproc <- function(work_dir, } else { gridf <- rgrid } - tempf <- cdo("remapcon2", args = gridf, input = climofile) + tempf <- cdo("remapscon2", args = gridf, input = climofile) unlink(gridf) } else { tempf <- cdo("addc", args = "0", input = climofile) diff --git a/esmvaltool/diag_scripts/miles/basis_functions.R b/esmvaltool/diag_scripts/miles/basis_functions.R index 2eb65b0789..adab0c0d6a 100644 --- a/esmvaltool/diag_scripts/miles/basis_functions.R +++ b/esmvaltool/diag_scripts/miles/basis_functions.R @@ -336,7 +336,7 @@ ncdf_opener_universal <- # nolint interp2grid = FALSE, fillmiss = FALSE, grid = "r144x73", - remap_method = "remapcon2", + remap_method = "remapscon2", exportlonlat = TRUE, verbose = TRUE) { # load package @@ -645,7 +645,7 @@ ncdf_opener <- function(namefile, interp2grid = FALSE, fillmiss = FALSE, grid = "r144x73", - remap_method = "remapcon2", + remap_method = "remapscon2", exportlonlat = TRUE, verbose = FALSE) { field <- ncdf_opener_universal( diff --git a/esmvaltool/diag_scripts/monitor/multi_datasets.py b/esmvaltool/diag_scripts/monitor/multi_datasets.py index 9d1834651e..a760a312f6 100644 --- a/esmvaltool/diag_scripts/monitor/multi_datasets.py +++ b/esmvaltool/diag_scripts/monitor/multi_datasets.py @@ -2059,7 +2059,7 @@ def create_map_plot(self, datasets): ) caption = ( f"Map plot of {dataset['long_name']} of dataset " - f"{dataset['dataset']} (project {dataset['project']})." + f"{dataset['alias']}." ) else: (plot_path, netcdf_paths) = ( @@ -2067,9 +2067,8 @@ def create_map_plot(self, datasets): ) caption = ( f"Map plot of {dataset['long_name']} of dataset " - f"{dataset['dataset']} (project {dataset['project']}) " - f"including bias relative to {ref_dataset['dataset']} " - f"(project {ref_dataset['project']})." + f"{dataset['alias']} including bias relative to " + f"{ref_dataset['alias']}." ) ancestors.append(ref_dataset['filename']) @@ -2134,7 +2133,7 @@ def create_zonal_mean_profile_plot(self, datasets): ) caption = ( f"Zonal mean profile of {dataset['long_name']} of dataset " - f"{dataset['dataset']} (project {dataset['project']})." + f"{dataset['alias']}." ) else: (plot_path, netcdf_paths) = ( @@ -2143,9 +2142,8 @@ def create_zonal_mean_profile_plot(self, datasets): ) caption = ( f"Zonal mean profile of {dataset['long_name']} of dataset " - f"{dataset['dataset']} (project {dataset['project']}) " - f"including bias relative to {ref_dataset['dataset']} " - f"(project {ref_dataset['project']})." + f"{dataset['alias']} including bias relative to " + f"{ref_dataset['alias']}." ) ancestors.append(ref_dataset['filename']) @@ -2386,8 +2384,7 @@ def create_hovmoeller_z_vs_time_plot(self, datasets): plot_func, dataset)) caption = ( f"Hovmoeller Z vs. time plot of {dataset['long_name']} " - f"of dataset " - f"{dataset['dataset']} (project {dataset['project']})." + f"of dataset {dataset['alias']}." ) else: (plot_path, @@ -2395,10 +2392,8 @@ def create_hovmoeller_z_vs_time_plot(self, datasets): plot_func, dataset, ref_dataset)) caption = ( f"Hovmoeller Z vs. time plot of {dataset['long_name']} " - f"of dataset " - f"{dataset['dataset']} (project {dataset['project']}) " - f"including bias relative to {ref_dataset['dataset']} " - f"(project {ref_dataset['project']})." + f"of dataset {dataset['alias']} including bias relative " + f"to {ref_dataset['alias']}." ) ancestors.append(ref_dataset['filename']) @@ -2464,7 +2459,7 @@ def create_hovmoeller_time_vs_lat_or_lon_plot(self, datasets): ) caption = ( f"Hovmoeller plot of {dataset['long_name']} of dataset " - f"{dataset['dataset']} (project {dataset['project']})." + f"{dataset['alias']}." ) else: (plot_path, netcdf_paths) = ( @@ -2473,9 +2468,8 @@ def create_hovmoeller_time_vs_lat_or_lon_plot(self, datasets): ) caption = ( f"Hovmoeller plot of {dataset['long_name']} of dataset " - f"{dataset['dataset']} (project {dataset['project']}) " - f"including bias relative to {ref_dataset['dataset']} " - f"(project {ref_dataset['project']})." + f"{dataset['alias']} including bias relative to " + f"{ref_dataset['alias']}." ) ancestors.append(ref_dataset['filename']) diff --git a/esmvaltool/diag_scripts/quantilebias/quantilebias_functions.R b/esmvaltool/diag_scripts/quantilebias/quantilebias_functions.R index 8d520cf545..cbd9e72acf 100644 --- a/esmvaltool/diag_scripts/quantilebias/quantilebias_functions.R +++ b/esmvaltool/diag_scripts/quantilebias/quantilebias_functions.R @@ -62,7 +62,7 @@ ncdf_opener_universal <- # nolint rotate = "full", interp2grid = F, grid = "r144x73", - remap_method = "remapcon2", + remap_method = "remapscon2", exportlonlat = TRUE, verbose = F) { # load package @@ -326,7 +326,7 @@ ncdf_opener <- function(namefile, rotate = "full", interp2grid = F, grid = "r144x73", - remap_method = "remapcon2", + remap_method = "remapscon2", exportlonlat = T) { field <- ncdf_opener_universal( diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index 0fd39be94f..fc5c6ba1e2 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: @@ -437,7 +436,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: @@ -910,6 +909,25 @@ 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: + pr: + tasmax: + tasmin: + tas: + additional_datasets: + - {dataset: ANUClimate, project: OBS6, mip: Amon, tier: 3, type: reanaly} + scripts: null + APHRO-MA: description: APHRO-MA check variables: diff --git a/esmvaltool/recipes/recipe_aod_aeronet_assess.yml b/esmvaltool/recipes/recipe_aod_aeronet_assess.yml new file mode 100644 index 0000000000..0fc82ec864 --- /dev/null +++ b/esmvaltool/recipes/recipe_aod_aeronet_assess.yml @@ -0,0 +1,65 @@ +# ESMValTool +# recipe_aod_aeronet_assess.yml +--- +documentation: + description: | + Recipe to plot seasonal maps of global aerosol optical depth (AOD) at 440nm. + + title: Recipe that runs an AOD diagnostic + + authors: + - hogan_emma + - lillis_jon + - hardacre_catherine + + maintainer: + - hogan_emma + - lillis_jon + - hardacre_catherine + + projects: + - esmval + +preprocessors: + ma_season_mean: + regrid: + target_grid: 2.5x2.5 + scheme: nearest + climate_statistics: + operator: mean + period: season + seasons: ['DJF', 'MAM', 'JJA', 'SON'] + multi_model_statistics: + span: overlap + statistics: [mean] + +diagnostics: + od440aer_climatologies: + description: Visualise spatial multi-annual seasonal means AOD at 440nm. + variables: + + od440aer: &var_od440aer + mip: AERmon + short_name: od440aer + start_year: 1994 + end_year: 2014 + additional_datasets: + - {dataset: AERONET, project: OBS6, mip: AERmon, tier: 3, type: atmos, version: 20231021} + + od440aer_season: + <<: *var_od440aer + preprocessor: ma_season_mean + additional_datasets: + - {dataset: UKESM1-0-LL, project: CMIP6, mip: AERmon, exp: historical, ensemble: r1i1p1f2, grid: gn} + - {dataset: HadGEM3-GC31-LL, project: CMIP6, mip: AERmon, exp: historical, ensemble: r1i1p1f3, grid: gn} + - {dataset: EC-Earth3-AerChem, project: CMIP6, mip: AERmon, exp: historical, ensemble: r1i1p1f1, grid: gn} +# - {dataset: NorESM2-LM, project: CMIP6, mip: AERmon, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {dataset: GFDL-ESM4, project: CMIP6, mip: AERmon, exp: historical, ensemble: r1i1p1f1, grid: gr1} + - {dataset: MPI-ESM-1-2-HAM, project: CMIP6, mip: AERmon, exp: historical, ensemble: r1i1p1f1, grid: gn} + + scripts: + aeronet: + script: aerosols/aod_aeronet_assess.py + observational_dataset: AERONET + quickplot: + plot_type: plot diff --git a/esmvaltool/recipes/recipe_ocean_quadmap.yml b/esmvaltool/recipes/recipe_ocean_quadmap.yml index 4afc2c7bb5..2f20a50015 100644 --- a/esmvaltool/recipes/recipe_ocean_quadmap.yml +++ b/esmvaltool/recipes/recipe_ocean_quadmap.yml @@ -54,12 +54,10 @@ diagnostics: preprocessor: prep_quad_map mip: Omon additional_datasets: -# filename: tos_ATSR_L3_ARC-v1.1.1_199701-201112.nc -# download from: https://datashare.is.ed.ac.uk/handle/10283/536 - - {dataset: ATSR, project: obs4MIPs, level: L3, version: ARC-v1.1.1, start_year: 2001, end_year: 2003, tier: 1} + - {dataset: ARC-SST-1-1, project: obs4MIPs, level: L3, start_year: 2001, end_year: 2003, tier: 1} scripts: Global_Ocean_map: &Global_Ocean_map script: ocean/diagnostic_maps_quad.py control_model: {dataset: HadGEM2-CC, project: CMIP5, mip: Omon, exp: historical, ensemble: r1i1p1} exper_model: {dataset: HadGEM2-ES, project: CMIP5, mip: Omon, exp: historical, ensemble: r1i1p1} - observational_dataset: {dataset: ATSR, project: obs4MIPs,} + observational_dataset: {dataset: ARC-SST-1-1, project: obs4MIPs,} 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/esmvaltool/references/anuclimate2.bibtex b/esmvaltool/references/anuclimate2.bibtex new file mode 100644 index 0000000000..0c183cd181 --- /dev/null +++ b/esmvaltool/references/anuclimate2.bibtex @@ -0,0 +1,11 @@ +@misc{https://doi.org/10.25914/60a10aa56dd1b, + doi = {10.25914/60A10AA56DD1B}, + url = {https://pid.nci.org.au/doi/f2576_7854_4065_1457}, + author = {Hutchinson, Michael and Xu, Tingbao and Kesteven, Jennifer and Marang, Ian and Evans, Bradley}, + keywords = {Climatology (excl. Climate Change Processes)}, + language = {en}, + title = {ANUClimate 2.0}, + publisher = {NCI Australia}, + year = {2021}, + copyright = {Creative Commons Attribution Share Alike 4.0 International} +} diff --git a/setup.py b/setup.py index 16a76cec75..84bd2a7c82 100755 --- a/setup.py +++ b/setup.py @@ -31,11 +31,12 @@ 'distributed', 'ecmwf-api-client', 'eofs', - 'ESMPy', + 'ESMPy', # not on PyPI 'esmvalcore', 'esmf-regrid>=0.7.0', 'fiona', 'fire', + 'fsspec', 'GDAL', 'jinja2', 'joblib', @@ -49,13 +50,14 @@ 'numpy!=1.24.3', # severe masking bug 'openpyxl', 'packaging', - 'pandas', + 'pandas!=2.2.0,!=2.2.1,!=2.2.2', # ESMValCore PR2305 'progressbar2', 'psyplot', 'psy-maps', 'psy-reg', 'psy-simple', 'pyproj>=2.1', + 'pys2index', 'python-dateutil', 'pyyaml', 'rasterio', @@ -74,8 +76,8 @@ 'xlsxwriter', 'zarr', ], - # Test dependencies - # Execute `pip install .[test]` once and the use `pytest` to run tests + # Test dependencies (unit tests) + # Execute `pip install .[test]` once and then use `pytest` to run tests 'test': [ 'flake8', 'pytest>=3.9,!=6.0.0rc1,!=6.0.0', @@ -98,6 +100,7 @@ 'develop': [ 'codespell', 'docformatter', + 'imagehash', 'isort', 'pre-commit', 'prospector[with_pyroma]!=1.1.6.3,!=1.1.6.4',