diff --git a/.circleci/config.yml b/.circleci/config.yml index 82492e724f..ffb051468a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -90,8 +90,9 @@ commands: # Install . /opt/conda/etc/profile.d/conda.sh mkdir /logs - mamba env create >> /logs/conda.txt 2>&1 + mamba env create conda activate esmvaltool + mamba list >> /logs/conda.txt pip install << parameters.flags >> ".[<>]"> /logs/install.txt 2>&1 esmvaltool install Julia > /logs/install_julia.txt 2>&1 if [[ "<>" != *'--editable'* ]] @@ -201,8 +202,9 @@ jobs: # https://docs.esmvaltool.org/en/latest/quickstart/installation.html#install-from-source . /opt/conda/etc/profile.d/conda.sh mkdir /logs - mamba env create >> /logs/conda.txt 2>&1 + mamba env create conda activate esmvaltool + mamba list >> /logs/conda.txt pip install --editable .[develop] esmvaltool install Julia > /logs/install_julia.txt 2>&1 git clone https://github.com/ESMValGroup/ESMValCore $HOME/ESMValCore diff --git a/.github/workflows/check-rtw.yml b/.github/workflows/check-rtw.yml index 611601dfd7..b5c6a0f32e 100644 --- a/.github/workflows/check-rtw.yml +++ b/.github/workflows/check-rtw.yml @@ -6,10 +6,11 @@ on: # Triggers the workflow on push events push: paths: -# - esmvaltool/utils/recipe_test_workflow/** + - esmvaltool/utils/recipe_test_workflow/** - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: + # Schedule this workflow to run at 04:00 every 10 days + schedule: + - cron: '0 4 */10 * *' # Common variables are defined here env: @@ -33,19 +34,13 @@ jobs: steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job # can access it - - uses: actions/checkout@v4 - - uses: conda-incubator/setup-miniconda@v3 - with: - miniforge-version: "latest" - miniforge-variant: Miniforge3 - use-mamba: true - conda-remove-defaults: "true" - - - name: Install Cylc and Rose - run: conda install cylc-flow>=8.2 cylc-rose metomi-rose + - name: Checkout repository + uses: actions/checkout@v4 - - name: Check current environment - run: conda list + - name: Setup Cylc + uses: cylc/setup-cylc@v1 + with: + cylc_rose: true - name: Validate Cylc workflow run: | diff --git a/.github/workflows/cron_esmvalbot_test.yml b/.github/workflows/cron_esmvalbot_test.yml new file mode 100644 index 0000000000..23d4c390e2 --- /dev/null +++ b/.github/workflows/cron_esmvalbot_test.yml @@ -0,0 +1,50 @@ +name: Run Esmvalbot Test + +on: + # push: + # branches: + # - cron_esmvalbot_test + # scheduled once every 2 weeks + schedule: + - cron: '0 4 */14 * *' + +# Required shell entrypoint to have properly configured bash shell +defaults: + run: + shell: bash -l {0} + +jobs: + run-esmvalbot: + runs-on: 'ubuntu-latest' + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Create empty commit on branch + run: | + git config user.name 'Valeriu Predoi' + git config user.email 'valeriu.predoi@gmail.com' + git commit --allow-empty -m "empty commit" + # Automated PR where we run "@esmvalbot please run examples/recipe_python.yml" + # as comment in the PR + # see https://github.com/marketplace/actions/create-pull-request + - name: Create Auto PR + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: empty message + # defaults are GH bot: # ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> + committer: Valeriu Predoi + author: Valeriu Predoi + signoff: false + branch: run-esmvalbot + delete-branch: true + title: '[EsmvalbotTest] Periodic reminder to run an esmvalbot test' + body: 'Automatic PR; please DO NOT merge! This is for testing Esmvalbot only. @valeriupredoi @bouweandela @schlunma please run an ESMValBot test here; if the bot runs fine, please close the auto PR, if it has issues, please open a Github issue and tag @valeriupredoi. Many thanks :beers:' + labels: | + testing + esmvalbot + automatedPR + assignees: valeriupredoi + reviewers: valeriupredoi + draft: true diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 974ac2ee78..3b66ab14aa 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -13,8 +13,16 @@ build: # DO NOT use mambaforge-*; that is currently sunsetted python: "miniconda-latest" jobs: - post_create_environment: - - conda run -n ${CONDA_DEFAULT_ENV} pip install . --no-deps + post_checkout: + # The ESMValTool repository is shallow i.e., has a .git/shallow, + # therefore complete the repository with a full history in order + # to allow setuptools-scm to correctly auto-discover the version. + - git fetch --unshallow + - git fetch --all + pre_install: + - git stash + post_install: + - git stash pop # Declare the requirements required to build your docs conda: @@ -26,6 +34,11 @@ sphinx: configuration: doc/sphinx/source/conf.py fail_on_warning: true +python: + install: + - method: pip + path: . + # If using Sphinx, optionally build your docs in additional formats such as PDF formats: - pdf diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..17c90fb2a6 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,14 @@ +# Security Policy + +## Supported Versions + +Only the [latest version][latest] of ESMValTool is currently being supported +with security updates. + +## Reporting a Vulnerability + +If you find a vulnerability, please contact the +[ESMValTool Tech Lead Team][TLT]. + +[latest]: https://github.com/ESMValGroup/ESMValTool/releases +[TLT]: mailto:esmvaltool_tech_lead_team@listserv.dfn.de diff --git a/conda-linux-64.lock b/conda-linux-64.lock index a3ad9b680c..c475b3c9a2 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -1,48 +1,53 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: fafc256cb40a5d6ebcbc180cb08e91d1bd9ca77a04c258188faad5c05c60f1b9 +# input_hash: f5c4487c952927f123c46e72b510f59759905df49bd2ea87696869038fe11a8f @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/_py-xgboost-mutex-2.0-gpu_0.tar.bz2#7702188077361f43a4d61e64c694f850 https://conda.anaconda.org/conda-forge/noarch/_r-mutex-1.0.1-anacondar_1.tar.bz2#19f9db5f4f1b7f5ef5f6d67207f25f38 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda#720523eb0d6a9b0f6120c16b2aa4e7de https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_3.conda#670f0e1593b8c1d84f57ad5fe5256799 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c -https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.5-ha770c72_0.conda#2889e6b9c666c3a564ab90cedc5832fd +https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.6.2-ha770c72_0.conda#4ded4ab71d9fd3764d796a23ca3e722b 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.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.2.0-h41c2201_101.conda#fb126e22f5350c15fec6ddbd062f4871 +https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.2.0-h41c2201_101.conda#60b9a16fd147f7184b5a964aa08f3b0f -https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda#0ea96f90a10838f58412aa84fdd9df09 +https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda#460eba7851277ec1fd80a1a24080787a 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.43-h4bf12b8_2.conda#cf0c5521ac2a20dfa6c662a4009eeef6 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab +https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.28-hb9d3cd8_0.conda#1b53af320b24547ce0fb8196d2604542 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.3-heb4867d_0.conda#09a6c610d002e54e18353c06ef61a253 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda#2ecf2f1c7e4e21fcfe6423a51a992d84 +https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-hf23e847_1.conda#b1aa0faa95017bca11369bd080487ec4 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda#33405d2a66b1411db9f7242c8b97c9e7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda#04b34b9a40cdc48cfdab261ab176ff74 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e -https://conda.anaconda.org/conda-forge/linux-64/tzcode-2024b-hb9d3cd8_0.conda#db124840386e1f842f93372897d1b857 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda#19608a9656912805b2b9a2f6bd257b04 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda#77cbc488235ebbaab2b6e912d3934bae +https://conda.anaconda.org/conda-forge/linux-64/tzcode-2025a-hb9d3cd8_0.conda#e18bdeebf29176790089b654cfedaaec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda#bc4cd53a083b6720d61a1519a1900878 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda#7c21106b851ec72c037b162c216d8f05 https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hfd43aa1_1.conda#f301eb944d297fc879c441fffe461d8a https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-h756ea98_1.conda#5e08c385a1b8a79b52012b74653bbb99 https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h756ea98_3.conda#bfe6623096906d2502c78ccdbfc3bc7a @@ -62,6 +67,7 @@ https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda#8247f80f3dc464d9322e85007e307fe8 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 @@ -69,42 +75,45 @@ https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-he02047a_3.c https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.6.3-hb9d3cd8_1.conda#cc4687e1814ed459f3bd6d8e05251ab2 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2#e728e874159b042d92b90238a3cb0dc2 https://conda.anaconda.org/conda-forge/linux-64/libopenlibm4-0.8.1-hd590300_1.conda#e6af610e01d04927a5060c95ce4e0875 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda#85cbdaacad93808395ac295b5667d25b https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.2.0-h2a3dede_1.conda#160623b9425f5c04941586da43bd1a9c https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda#b6f02b52a174e612e89548f4663ce56a -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_0.conda#84bd1c9a82b455e7a2f390375fb38f90 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 -https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2#ede4266dc02e875fe1ea77b25dd43747 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 +https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.5.1-h5888daf_1.conda#9fc429740cfb418a3b3ca107ba7b5e7d https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-hd0bcaf9_1007.conda#28eb714416de4eb83e2cbc47e99a1b45 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/nspr-4.36-h5888daf_0.conda#de9cd5bca9e4918527b9b72b6e2e1409 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda#1bee70681f504ea424fb07cdb090c001 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 +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.5.5-h3931f03_0.conda#334dba9982ab9f5d62033c61698a8683 https://conda.anaconda.org/conda-forge/linux-64/sed-4.8-he412f7d_0.tar.bz2#7362f0042e95681f5d371c46c83ebd08 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.3.0-h5888daf_0.conda#355898d24394b2af353eb96358db9fdd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-imake-1.0.10-h5888daf_0.conda#040f0ca9f518151897759ad09ea98b2d https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 +https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.6.3-hbcc6ac9_1.conda#f529917bab7862aaad6867bf2ea47a99 +https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.6.3-hb9d3cd8_1.conda#de3f31a6eed01bc2b8c7dcad07ad9034 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-h5888daf_2.conda#e0409515c467b87176b070bff5d9442e https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.2-h5888daf_0.conda#135fd3c66bccad3d2254f50f9809e86a +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.3-h7955e40_0.conda#01cf93c645fa03d44ffe603f51f3d27f https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#346722a0be40f6edc53f12640d301338 https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h2af50b2_12.conda#700f1883f5a0a28c30fd98c43d4d946f https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -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/bwidget-1.10.1-ha770c72_0.conda#bfe52ddc809cff2e046781928d195400 https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 https://conda.anaconda.org/conda-forge/linux-64/fmt-11.0.2-h434a139_0.conda#995f7e13598497691c1dc476d889bc04 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb @@ -116,13 +125,14 @@ https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.c https://conda.anaconda.org/conda-forge/linux-64/gtest-1.14.0-h434a139_2.conda#89971b339bb4dfbf3759f1f2528d81b1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 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-20240116.2-cxx17_he02047a_1.conda#c48fc56ec03229f294176923c3265c05 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-he8f35ee_3.conda#4fab9799da9571266d05ca5503330655 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/libde265-1.0.15-h00ab1b0_0.conda#407fee7a5d7ab2dca12c9ca7f62310ad -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/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-he02047a_3.conda#9aba7960731e6b4547b3a52f812ed801 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda#0a7f4cd238267c88e5d69f7826a407eb https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d @@ -130,369 +140,367 @@ https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.cond https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda#62857b389e42b36b686331bec0922050 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.28-pthreads_h3e26593_1.conda#9d5c316d93ee4c5effd9afda8e8af823 +https://conda.anaconda.org/conda-forge/linux-64/libsuitesparseconfig-7.8.3-ss783_h83006af.conda#1dbec7fae0400c4f83cd400a01d187d6 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.20.0-h0e7cc3e_1.conda#d0ed81c4591775b70384f4cc78e05cd1 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/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba 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/mbedtls-3.5.1-h59595ed_0.conda#a7b444a6e008b804b35521895e3440e2 -https://conda.anaconda.org/conda-forge/linux-64/nccl-2.23.4.1-h03a54cd_2.conda#a08604ac3f9c3dbd128bb24e089dee5f -https://conda.anaconda.org/conda-forge/linux-64/nss-3.106-hdf54f9c_0.conda#efe735c7dc47dddbb14b3433d11c6feb +https://conda.anaconda.org/conda-forge/linux-64/nccl-2.24.3.1-h03a54cd_0.conda#7aca64af9bbbf8e681ac68d839973162 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.107-hdf54f9c_0.conda#294b7009fe9010b35c25bb683f663bc3 https://conda.anaconda.org/conda-forge/linux-64/openlibm-0.8.1-hd590300_1.conda#6eba22eb06d69e53d0ca01eef42bc675 https://conda.anaconda.org/conda-forge/linux-64/p7zip-16.02-h9c3ff4c_1001.tar.bz2#941066943c0cac69d5aa52189451aa5f https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 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/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda#7fd2fd79436d9b473812f14e86746844 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_0.conda#2b3a22991c20ed6ea2ed65d3407a91f4 https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-h8bc8fbc_6.conda#dff3627fec2c0584ded391205295abf0 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2#e7f6ed84d4623d52ee581325c1587a6b -https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda#05a8ea5f446de33006171a7afe6ae857 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda#0b666058a179b744a622d0a4a0c56353 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.5-he73a12e_0.conda#4c3e9fab69804ec6077697922d70c6e2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 https://conda.anaconda.org/conda-forge/linux-64/xorg-makedepend-1.0.9-h59595ed_0.conda#71c756cfcc6649ed7614eb07712bfce0 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.6.3-hbcc6ac9_1.conda#62aae173382a8aae284726353c6a6a24 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda#8c4061f499edec6b8ac7000f6d586829 +https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.4-pyhd8ed1ab_1.conda#296b403617bafa89df4971567af79013 +https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a +https://conda.anaconda.org/conda-forge/linux-64/astroid-3.3.8-py312h7900ff3_0.conda#9b0b26c5846fdbe76a146e1f8715a1ac +https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#356927ace43302bf6f5926e2a58dae6a https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h235a6dd_1.conda#c05358e3a231195f7f0b3f592078bb0c https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.9-h5e77a74_0.conda#d7714013c40363f45850a25113e2cb05 +https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py312h7900ff3_9.conda#6df4f61b215587c40ec93810734778ca https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f -https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.15.1-hc57e6cf_0.conda#5f84961d86d0ef78851cb34f9d5e31fe +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf +https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.15.2-h68e2383_0.conda#e7b11b508252ddc35c4b51dedef17b01 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 +https://conda.anaconda.org/conda-forge/noarch/codespell-2.3.0-pyhd8ed1ab_1.conda#840293a20343a601ca2738d359e403eb +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 +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_1.conda#c5f4eec949e6514ca49e606b1fb7c043 +https://conda.anaconda.org/conda-forge/linux-64/crc32c-2.7.1-py312h66e93f0_0.conda#85a6111a6fb1b1e569e68484df606963 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 +https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py312h8fd2918_3.conda#21e433caf1bb1e4c95832f8bb731d64c +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.9-pyhd8ed1ab_1.conda#5e11310fca410e9f31381157079dee55 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc +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_1.conda#375691f2607aa31feaf360c58f342b43 +https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda#3366592d3c219f2731721f11bc93755c +https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda#71bf9646cbfabf3022c8da4b6b4da737 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda#ee3e687b78b778db7b304e5b00a4dca6 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda#d692e9ba6f92dc51484bf3477e36ce7c +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.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee +https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h66e93f0_0.conda#f98e36c96b2c66d9043187179ddb04f4 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda#e041ad4c43ab5e10c74587f95378ebc7 +https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.0-pyhd8ed1ab_1.conda#8b9328ab4aafb8fde493ab32c5eba731 https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.2.0-hc73f493_1.conda#131a59b3bb1dbbfc63ec0f21eb0e8c65 https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.2.0-h2c03514_1.conda#41664acd4c99ef4d192e12950ff68ca6 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.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda#2aa5ff7fa34a81b9196532c84c10d865 +https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda#7fe569c10905402ed47024fc481bb371 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda#566e75c90c1d0c8c459eb0ad9833dc7a +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +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_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 +https://conda.anaconda.org/conda-forge/noarch/isodate-0.7.2-pyhd8ed1ab_1.conda#14c42a6334f38c412449f5a5e4043a5a +https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda#7ac5f795c15f288984e32add616cdc59 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda#6713467dc95509683bfa3aca08524e8a +https://conda.anaconda.org/conda-forge/noarch/legacy-cgi-2.6.1-pyh5b84bb0_3.conda#f258b7f54b5d9ddd02441f10c4dca2ac +https://conda.anaconda.org/conda-forge/linux-64/libamd-3.3.3-ss783_h889e182.conda#3f5acd96dfc9ff4c3b02c38120d7dc8b https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-he8f35ee_3.conda#1091193789bb830127ed067a9e01ac57 https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h1909e37_2.conda#21e468ed3786ebcb2124b123aa2484b7 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda#8ea26d42ca88ec5258802715fe1ee10b -https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.8.4-hd24f944_0.conda#94887b4deb460378a34e1533beaacfd5 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda#13e8e54035ddd2b91875ba399f0f7c04 -https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.0-hdb8da77_2.conda#9c4554fafc94db681543804037e65de2 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a +https://conda.anaconda.org/conda-forge/linux-64/libbtf-2.3.2-ss783_h2377355.conda#c60157e1d22e52ccc5aabc7b2f61c94d +https://conda.anaconda.org/conda-forge/linux-64/libcamd-3.3.3-ss783_h2377355.conda#0178bc68cbcdb89d02b46594acace3d6 +https://conda.anaconda.org/conda-forge/linux-64/libccolamd-3.3.4-ss783_h2377355.conda#69a12c4c23969027c00a5ccca335df74 +https://conda.anaconda.org/conda-forge/linux-64/libcolamd-3.3.4-ss783_h2377355.conda#15fbaba693872fecc4f557922e41859d +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 +https://conda.anaconda.org/conda-forge/linux-64/libcxsparse-4.4.1-ss783_h2377355.conda#1728fa3e6b6e0852e06418cba06e2596 +https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.8.4-hd24f944_1.conda#81d00656b41bc42266a999f613dd0fc9 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_1.conda#37d1af619d999ee8f1f73cf5a06f4e2f +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hdb8da77_0.conda#32b23f3487beae7e81495fbc1099ae9e https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hf539b9f_1021.conda#e8c7620cc49de0c6a2349b6dd6e39beb +https://conda.anaconda.org/conda-forge/linux-64/libldl-3.3.2-ss783_h2377355.conda#22292db3a270520d9a63ac2625931603 https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-hd5b35b9_1.conda#06def97690ef90781a91b786cb48a0a9 +https://conda.anaconda.org/conda-forge/linux-64/librbio-4.3.4-ss783_h2377355.conda#02b58b64883d9d888252c6a485e003e6 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-hc670b87_16.conda#3d9f3a2e5d7213c34997e4464d2f938c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h6565414_0.conda#80eaf80d84668fa5620ac9ec1b4bf56f -https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.2-cuda118_h09a87be_0.conda#d59c3f95f80071f24ebce434494ead0a -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.4-hb346dea_2.conda#69b90b70c434b916abf5a1d5ee5d55fb -https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 -https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 -https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.28-pthreads_h3d04fff_1.conda#fdaa89df7b34f5c904f8f1348e5a62a5 -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda#0515111a9cdf69f83278f7c197db9807 -https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 -https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.14.1-hed91bc2_1.conda#909188c8979846bac8e586908cf1ca6a -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.0-h9eae976_1.conda#53abf1ef70b9ae213b22caa5350f97a9 -https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-h988505b_2.conda#9dda9667feba914e0e80b95b82f7402b -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda#a7a49a8b85122b49214798321e2e96b4 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hb9d3cd8_2.conda#d8602724ac0d276c380b97e9eb0f814b -https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_0.conda#ae5f4ad87126c55ba3f690ef07f81d64 -https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.3-pyhd8ed1ab_0.conda#ec763b0a58960558ca0ad7255a51a237 -https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda#7d78a232029458d0077ede6cda30ed0c -https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481c9de49f040272556e2cedf42816 -https://conda.anaconda.org/conda-forge/linux-64/astroid-3.3.5-py312h7900ff3_0.conda#e1ed4d572a4a16b97368ab00fd646487 -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-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.30-hec5e740_0.conda#bc1b9f70ea7fa533aefa6a8b6fbe8da7 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.5-h0009854_0.conda#d393d0a6c9b993771fbc67a998fccf6c -https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py312h7900ff3_9.conda#6df4f61b215587c40ec93810734778ca -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf -https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda#fceaedf1cdbcb02df9699a0d9b005292 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 -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.4.0-pyhd8ed1ab_0.conda#a374efa97290b8799046df7c5ca17164 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda#c88ca2bb7099167912e3b26463fff079 -https://conda.anaconda.org/conda-forge/noarch/codespell-2.3.0-pyhd8ed1ab_0.conda#6e67fa19bedafa7eb7d6ea91de53e03d -https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 -https://conda.anaconda.org/conda-forge/noarch/config-0.5.1-pyhd8ed1ab_0.tar.bz2#97275d4898af65967b1ad57923cef770 -https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda#0d07dc29b1c1cc973f76b74beb44915f -https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py312h8fd2918_3.conda#21e433caf1bb1e4c95832f8bb731d64c -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.9-pyhd8ed1ab_0.conda#27faec84454995f6774786c7e5833cd6 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda#fe521c1608280cc2803ebd26dc252212 -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-2.0.0-pyhd8ed1ab_0.conda#cdcdbe90dfab4075fc1f3c4cf2e4b4e5 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -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.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 -https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -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.5.0-py312h66e93f0_0.conda#f98e36c96b2c66d9043187179ddb04f4 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.10.0-pyhff2d567_0.conda#816dbc4679a64e4417cd1385d661bb31 -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/gettext-0.22.5-he02047a_3.conda#c7f243bbaea97cd6ea1edd693270100e -https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyhd81877a_7.conda#74fbff91ca7c1b9a36b15903f2242f86 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 -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/isodate-0.7.2-pyhd8ed1ab_0.conda#d68d25aca67d1a06bf6f5b43aea9430d -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.7-py312h68727a3_0.conda#444266743652a4f1538145e9362f6d3b -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/noarch/legacy-cgi-2.6.1-pyh5b84bb0_3.conda#f258b7f54b5d9ddd02441f10c4dca2ac -https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda#5dbd1b0fc0d01ec5e0e1fbe667281a11 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 -https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda#30ee3a29c84cf7b842a8c5828c4b7c13 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f -https://conda.anaconda.org/conda-forge/linux-64/libheif-1.18.2-gpl_hffcb242_100.conda#76ac2c07b62d45c192940f010eea11fa -https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_he43201b_1000.conda#36247217c4e1018085bd9db41eb3526a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda#4dc03a53fc69371a6158d0ed37214cd3 -https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.4.0-h2c329e2_0.conda#80030debaa84cfc31755d53742df3ca6 -https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 +https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.3-cuda118_h09a87be_0.conda#4aeecb7576dd57f1f45e9725383f8f36 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h8d12d68_1.conda#1a21e49e190d1ffe58531a81b6e400e1 https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py312h374181b_1.conda#ed6ead7e9ab9469629c6cfb363b5c6e2 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.3-py312hb3f7f12_1.conda#b99d90ef4e77acdab74828f79705a919 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_0.conda#a755704ea0e2503f8c227d84829a8e81 -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/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b +https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda#827064ddfe0de2917fb29f1da4f8f533 +https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h05a5f5f_3.conda#eec77634ccdb2ba6c231290c399b1dae +https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py312h68727a3_0.conda#5c9b020a3f86799cdc6115e55df06146 -https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_1.conda#e397d9b841c37fc3180b73275ce7e990 +https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda#5b5e3267d915a107eca793d52e1b780a 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.4.2-pyhd8ed1ab_1.conda#1d4c088869f206413c59acdd309908b7 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.2-h669347b_0.conda#1e6c10f7d749a490612404efeb179eb8 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db +https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda#29097e7ea634a45cc5386b95cac6568f +https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyh29332c3_1.conda#0aa03903d33997f3886be58abc890aef +https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 +https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.28-pthreads_h3d04fff_1.conda#fdaa89df7b34f5c904f8f1348e5a62a5 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa 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.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.0-py312h66e93f0_2.conda#2c6c0c68f310bc33972e7c83264d7786 -https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda#0524eb91d3d78d76d671c6e3cd7cee82 -https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_0.conda#72453e39709f38d0494d096bb5f678b7 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_0.conda#0cf7fef6aa123df28adb21a590065e3d -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda#035c17fbf099f50ff60bf2eb303b0a83 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab -https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_0.conda#986287f89929b2d629bd6ef6497dc307 +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda#617f15191456cc6a13db418a275435e5 +https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h66e93f0_0.conda#55d5742a696d7da1c1262e99b6217ceb +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.1-py312h66e93f0_0.conda#add2c79595fa8a9b6d653d7e4e2cf05f +https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_1.conda#e895db5e6cee923018cbb1656c8ca7fa +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_1.conda#4731450b2c059fc567696242bcb7fc05 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda#c0def296b2f6d2dd7b030c2a7f66bb1f https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda#549e5930e768548a89c23f595dac5a95 -https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.21.0-py312h12e396e_0.conda#37f4ad7cb4214c799f32e5f411c6c69f +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py312h12e396e_0.conda#bfb49da0cc9098597d527def04d66f8b https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py312h66e93f0_1.conda#532c3e5d0280be4fea52396ec1fa7d5d -https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed +https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 +https://conda.anaconda.org/conda-forge/noarch/semver-3.0.3-pyhd8ed1ab_0.conda#6f0d1772b767a39d70631dce48421f3d 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-75.3.0-pyhd8ed1ab_0.conda#2ce9825396daf72baabaade36cee16da +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.3-py312h66e93f0_1.conda#c8d1a609d5f3358d715c2273011d9f4d -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e 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/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f -https://conda.anaconda.org/conda-forge/noarch/tenacity-9.0.0-pyhd8ed1ab_0.conda#42af51ad3b654ece73572628ad2882ae -https://conda.anaconda.org/conda-forge/noarch/termcolor-2.5.0-pyhd8ed1ab_0.conda#29a5d22565b850099cd9959862d1b154 +https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.14.1-hed91bc2_1.conda#909188c8979846bac8e586908cf1ca6a +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb +https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_1.conda#60ce69f73f3e75b21f1c27b1b471320c +https://conda.anaconda.org/conda-forge/noarch/tenacity-9.0.0-pyhd8ed1ab_1.conda#a09f66fe95a54a92172e56a4a97ba271 +https://conda.anaconda.org/conda-forge/noarch/termcolor-2.5.0-pyhd8ed1ab_1.conda#1ce02d60767af357e864ce61895268d2 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.2-pyhd8ed1ab_0.conda#e977934e00b355ff55ed154904044727 -https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda#0062a5f3347733f67b0f33ca48cc21dd -https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_0.conda#34feccdd4177f2d3d53c73fc44fd9a37 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h66e93f0_1.conda#af648b62462794649066366af4ecd5b0 -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.10.21.16-pyhd8ed1ab_0.conda#501f6d3288160a31d99a2f1321e77393 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_1.conda#1d9ab4fc875c52db83f9c9b40af4e2c8 +https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda#e417822cb989e80a0d2b1b576fdd1657 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2025.1.15.22-pyhd8ed1ab_0.conda#246846b15ba47e8684a7c88ce1de3e82 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py312h2ec8cdc_1.conda#96226f62dddc63226472b7477d783967 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda#588486a61153f94c7c13816f7069e440 -https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-pyhd8ed1ab_1.conda#6042b782b893029aa40335782584a092 -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.0-pyhd8ed1ab_0.conda#f9751d7c71df27b2d29f5cab3378982e -https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.2.0-pyhd8ed1ab_0.conda#a1f7264726115a2f8eac9773b1f27eba -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.2.1-hb9d3cd8_1.conda#f35a9a2da717ade815ffa70c0e8bdfbd -https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.9.0-pyhd8ed1ab_0.conda#156c91e778c1d4d57b709f8c5333fd06 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda#617f5d608ff8c28ad546e5d9671cbb95 +https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-pyhd8ed1ab_2.conda#a7bafc627d25a939bb68206bd7abd483 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda#669e63af87710f8d52fdec9d4d63b404 +https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-h988505b_2.conda#9dda9667feba914e0e80b95b82f7402b +https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.2.0-pyhd8ed1ab_1.conda#c57589177253e911e293345226c7eca1 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda#279b0de5f6ba95457190a1c459a64e31 +https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.1.0-pyhd8ed1ab_0.conda#fdf07e281a9e5e10fc75b2dd444136e9 https://conda.anaconda.org/conda-forge/noarch/yapf-0.32.0-pyhd8ed1ab_0.tar.bz2#177cba0b4bdfacad5c5fbb0ed31504c4 -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_6.conda#113506c8d2d558e733f5c38f6bf08c50 -https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda#fee389bf8a4843bd7a2248ce11b7f188 -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a -https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 -https://conda.anaconda.org/conda-forge/linux-64/arpack-3.9.1-nompi_h77f6705_101.conda#ff39030debb47f6b53b45bada38e0903 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.5-hbaf354b_4.conda#2cefeb144de7712995d1b52cc6a3864c +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 +https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda#e52c2ef711ccf31bb7f70ca87d144b9e +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda#74ac5069774cdbc53910ec4d631a3999 +https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda#1a3981115a398535dbe3f6d5faae3d36 +https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.30-hec5e740_0.conda#bc1b9f70ea7fa533aefa6a8b6fbe8da7 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.5-h0009854_0.conda#d393d0a6c9b993771fbc67a998fccf6c https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.13.0-h935415a_0.conda#debd1677c2fea41eb2233a260f48a298 -https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_0.conda#6d4e9ecca8d88977147e109fc7053184 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyhd8ed1ab_0.conda#461bcfab8e65c166e297222ae919a2d4 +https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda#d48f7e9fdec44baf6d1da416fe402b04 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 +https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.2-h3394656_1.conda#b34c2833a1f56db610aeb27f206d800d https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.4.1-hf8ad068_0.conda#1b7a01fd02d11efe0eb5a676842a7b7d -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.6.4-py312h178313f_0.conda#a32fbd2322865ac80c7db74c553f5306 +https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-pyhd8ed1ab_1.conda#82bea35e4dac4678ba623cf10e95e375 +https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda#55c7804f428719241a90b152016085a1 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py312h178313f_0.conda#df113f58bdfc79c98f5e07b6bd3eb4c2 https://conda.anaconda.org/conda-forge/linux-64/curl-8.9.1-h18eb788_0.conda#2e7dedf73dfbfcee662e2a0f6175e4bb -https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.0-py312h66e93f0_1.conda#a921e2fe122e7f38417b9b17c7a13343 -https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.1-py312h66e93f0_0.conda#6198b134b1c08173f33653896974d477 +https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.15-pyhd8ed1ab_1.conda#eaef2e94d5bd76f758545d172c1fda67 +https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_1.conda#af53e838cab8872e7e014a8336aaaffb https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a +https://conda.anaconda.org/conda-forge/noarch/donfig-0.8.1.post1-pyhd8ed1ab_1.conda#c56a7fa5597ad78b62e1f5d21f7f8b8f https://conda.anaconda.org/conda-forge/noarch/fire-0.7.0-pyhd8ed1ab_0.conda#c8eefdf1e822c56a6034602e67bc92a5 -https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_0.conda#a25e5df6b26be3c2d64be307c1ef0b37 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py312h178313f_1.conda#bbbf5fa5cab622c33907bc8d7eeea9f7 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358c17429c97883b2cb9ab5f64bc161b +https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_1.conda#c43926857c0c7ba1a29c8c4a221a5e78 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py312h178313f_1.conda#bc18c46eda4c2b29431981998507e723 +https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda#ecb5d11305b8ba1801543002e69d2f2f +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f +https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda#40182a8d62a61d147ec7d3e4c5c36ac2 +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-he02047a_3.conda#c7f243bbaea97cd6ea1edd693270100e https://conda.anaconda.org/conda-forge/linux-64/git-2.46.0-pl5321hb5640b7_0.conda#825d146359bc8b85083d92259d0a0e1b -https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 -https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda#76b32dcf243444aea9c6b804bcfa40b8 +https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda#7c14f3706e099f8fcd47af2d494616cc +https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.1-pyha770c72_0.conda#b9f5330c0853ccabc39a9878c6f1a2ab -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda#c808991d29b9838fb4d96ce8267ec9ec -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.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/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_1.conda#ef7dc847f19fe4859d5aaa33385bf509 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 -https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.7-hadbb8c3_0.conda#4a099677417658748239616b6ca96bb6 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda#30ee3a29c84cf7b842a8c5828c4b7c13 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a +https://conda.anaconda.org/conda-forge/linux-64/libheif-1.19.5-gpl_hc21c24c_100.conda#3b57852666eaacc13414ac811dde3f8a +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 +https://conda.anaconda.org/conda-forge/linux-64/libspex-3.2.1-ss783_h5a7e440.conda#16f6f74255e7dead91a9809386ad531c +https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.5.0-hae8dbeb_0.conda#bb895ca27e7e33ab7a7c2c63529ce1e0 +https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b -https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py312he28fd5a_2.conda#3acf38086326f49afed094df4ba7c9d9 -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.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f -https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda#dcd0ed5147d8876b0848a552b416ce76 +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.0-pyhd8ed1ab_0.conda#d10024c163a52eeecbb166fdeaef8b12 +https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_2.conda#cc2da171723d50bc1a7f8a53a8d0319f +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py312h710cb58_1.conda#69a8838436435f59d72ddcb8dfd24a28 +https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.2-h669347b_0.conda#1e6c10f7d749a490612404efeb179eb8 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda#385f46a4df6f97892503a841121a9acf -https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda#5dd546fe99b44fda83963d15f84263b7 -https://conda.anaconda.org/conda-forge/noarch/plotly-5.24.1-pyhd8ed1ab_0.conda#81bb643d6c3ab4cbeaf724e9d68d0a6a -https://conda.anaconda.org/conda-forge/linux-64/poppler-24.08.0-h47131b8_1.conda#0854b9ff0cc10a1f6f67b0f352b8e75a +https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f +https://conda.anaconda.org/conda-forge/noarch/plotly-5.24.1-pyhd8ed1ab_1.conda#71ac632876630091c81c50a05ec5e030 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 -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.2.0-pyh7850678_0.conda#5003da197661e40a2509e9c4651f1eea -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a -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.9.0-pyhff2d567_0.conda#ae8d4e318695c0d3e3464ed95cc8b385 +https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda#a36aa6e0119331d3280f4bba043314c7 +https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda#d4582021af437c931d7d77ec39007845 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/noarch/python-utils-3.9.1-pyhff2d567_1.conda#24ed1dc544b101075fa7462be5c3a5c5 https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda#746ce19f0829ec3e19c93007b1a224d3 -https://conda.anaconda.org/conda-forge/noarch/rdflib-7.1.1-pyh0610db2_0.conda#325219de79481bcf5b6446d327e3d492 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 -https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.3.1-pyhd8ed1ab_0.conda#f921ea6a1138cc7edee77de8ed12b226 +https://conda.anaconda.org/conda-forge/noarch/rdflib-7.1.3-pyhd8ed1ab_0.conda#72ec20859c97d33c82edcc8bdb70d536 +https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda +https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.1-pyhd8ed1ab_0.conda#dbb48421efd666ea133c6d5e67291766 +https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.3.2-pyhd8ed1ab_1.conda#cc0f2fcfec5e6b67a20cb24f8b9f3c93 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-pyhd8ed1ab_3.conda#1f7482562f2082f1b2abf8a3e2a41b63 -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py312h66e93f0_1.conda#28ed869ade5601ee374934a31c9d628e -https://conda.anaconda.org/conda-forge/linux-64/tbb-2022.0.0-hceb3a55_0.conda#79f0161f3ca73804315ca980f65d9c60 +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.10-py312h66e93f0_0.conda#5260b7fb19694ee5bc4ed0ee7a2a769f https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.0-pyhd8ed1ab_0.conda#196a9e6ab4e036ceafa516ea036619b0 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda#dae21509d62aa7bf676279ced3edcb3f -https://conda.anaconda.org/conda-forge/noarch/webob-1.8.9-pyhd8ed1ab_0.conda#ff98f23ad74d2a3256debcd9df65d37d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hb9d3cd8_1.conda#f35bec7fface97f67f44ca952fc740b7 -https://conda.anaconda.org/conda-forge/noarch/yamale-5.2.1-pyhca7485f_0.conda#c089f90a086b6214c5606368d0d3bad0 -https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_0.conda#a1240b99a7ccd953879dc63111823986 -https://conda.anaconda.org/conda-forge/linux-64/yarl-1.16.0-py312h66e93f0_0.conda#c3f4a6b56026c22319bf31514662b283 -https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.10-py312h178313f_0.conda#d2f9e490ab2eae3e661b281346618a82 -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.2-h6c0439f_6.conda#4e472c316d08af60faeb71f86d7563e1 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda#9efbfdc37242619130ea42b1cc4ed861 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_1.conda#c7b1961b139c21381764de4704b6bbfb +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.1-pyhd8ed1ab_0.conda#de06336c9833cffd2a4bd6f27c4cf8ea +https://conda.anaconda.org/conda-forge/noarch/webob-1.8.9-pyhd8ed1ab_1.conda#293718ddac83a0fbc0f2193ff77d1e1c +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.2.1-hb9d3cd8_1.conda#f35a9a2da717ade815ffa70c0e8bdfbd +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/noarch/yamale-5.3.0-pyhd8ed1ab_0.conda#d4b5f3a50decd28cd747f4b5f7aea33f +https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_1.conda#fe91647002aab05979fee9392d745f96 +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h66e93f0_0.conda#91df2efaa08730416bec2a4502309275 +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.11-py312h178313f_0.conda#8219afa093757bbe07b9825eb1973ed9 +https://conda.anaconda.org/conda-forge/linux-64/arpack-3.9.1-nompi_hf03ea27_102.conda#e09af397232ef1070e0b6cbf4c64aacb +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.5-hbaf354b_4.conda#2cefeb144de7712995d1b52cc6a3864c https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hd126650_2.conda#36df3cf05459de5d0a41c77c4329634b https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.7.0-h10ac4d7_1.conda#ab6d507ad16dbe2157920451d662e4a1 -https://conda.anaconda.org/conda-forge/noarch/cattrs-24.1.2-pyhd8ed1ab_0.conda#ac582de2324988b79870b50c89c91c75 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d -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.3.0-py312h68727a3_2.conda#ff28f374b31937c048107521c814791e -https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.3-py312hda17c39_0.conda#2abada8c216dd6e32514535a3fa245d4 -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/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d +https://conda.anaconda.org/conda-forge/noarch/cattrs-24.1.2-pyhd8ed1ab_1.conda#53eca64665361194ca4bbaf87c0ded99 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-44.0.0-py312hda17c39_0.conda#50052304026b6f33fdd34563ee4b47b8 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.1.0-pyhd8ed1ab_0.conda#0abebcf57fa0d8f2f0d92f49c47d3f06 +https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-pyhd8ed1ab_1.conda#4f282d2b2904441afca6367764fa718e +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/funcargparse-0.2.5-pyhd8ed1ab_0.tar.bz2#e557b70d736251fa0bbb7c4497852a92 https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-hf7fa9e8_2.conda#1d6bdc6b2c62c8cc90c67b50142d7b7f -https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda#0b2154c1818111e17381b1df5b4b0176 -https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-hf1a501a_15.conda#d2e16a32f41d67c7d280da11b2846328 -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py312h6d9a048_4.conda#a810fadedc4edc06b4282d1222467837 -https://conda.anaconda.org/conda-forge/noarch/imageio-2.36.0-pyh12aca89_1.conda#36349844ff73fcd0140ee7f30745f0bf +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.44-pyhff2d567_0.conda#140a4e944f7488467872e562a2a52789 +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-10.2.0-h4bba637_0.conda#9e38e86167e8b1ea0094747d12944ce4 +https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-h51d0b48_17.conda#21ce981dc10b2d7ec8da29872b6fa96c https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.1-hd8ed1ab_0.conda#d6c936d009aa63e5f82d216c95cdcaee -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_0.conda#720745920222587ef942acfbc578b584 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_0.conda#a14218cfb29662b4a19ceb04e93e298e +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hf8d3e68_2.conda#ffe68c611ae0ccfda4e7a605195e22b3 -https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_1.conda#4809b9f4c6ce106d443c3f90b8e10db2 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.28.0-h26d7fe4_0.conda#2c51703b4d775f8943c08a361788131b +https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda#d10d9393680734a8febc4b362a4c94f2 +https://conda.anaconda.org/conda-forge/linux-64/libcholmod-5.3.0-ss783_h3fa60b6.conda#c832eba46245682fabd96afb3f561601 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d +https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda#392cae2a58fbcb9db8c2147c6d6d1620 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.2-h04577a9_0.conda#52dd46162c6fb2765b49e6fd06adf8d5 https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h15fa968_9.conda#4957a903bd6a68cc2e53e47476f9c6f4 +https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py312he28fd5a_2.conda#3acf38086326f49afed094df4ba7c9d9 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda#d3894405f05b2c0f351d5de3ae26fa9c +https://conda.anaconda.org/conda-forge/linux-64/poppler-24.08.0-h47131b8_1.conda#0854b9ff0cc10a1f6f67b0f352b8e75a +https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_1.conda#e557abf678a0bf100fe7cf9d2b4f4a72 +https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_3.conda#556a52a96313364aa79990ed1337b9a5 +https://conda.anaconda.org/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda#5842a1fa3b9b4f9fe7069b9ca5ed068d +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h9211aeb_9.conda#173afeb0d112c854fd1a9fcac4b5cce3 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 +https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.5-pyhd8ed1ab_1.conda#b92ee0cf3b26087455244248b1a04e0a +https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.1.1-pyhd8ed1ab_1.conda#c4b7295798eff80144dc4ca4551efa80 +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.2.post1-pyhff2d567_1.conda#0903621fe8a9f37286596529528f4f74 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hb9d3cd8_1.conda#f35bec7fface97f67f44ca952fc740b7 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.2-h6c0439f_6.conda#4e472c316d08af60faeb71f86d7563e1 +https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.12.0-hd2e3451_0.conda#61f1c193452f0daa582f39634627ea33 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d +https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyhecae5ae_1.conda#04151bb8e351c6209caad045e4b1f4bd +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda#f5fbba0394ee45e9a64a73c2a994126a +https://conda.anaconda.org/conda-forge/noarch/eofs-2.0.0-pyhff2d567_0.conda#a3cce45423d73c3d4420b71351e71fef +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.6-pyhd8ed1ab_0.conda#d751c3b4a973ed15b57be90d68c716d1 +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py312h6d9a048_4.conda#a810fadedc4edc06b4282d1222467837 +https://conda.anaconda.org/conda-forge/noarch/imageio-2.36.1-pyh12aca89_1.conda#84d5a2f075c861a8f98afd2842f7eb6e +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.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 +https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_2.conda#bb0230917e2473c77d615104dbe8a49d +https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.9.2-h353785f_1.conda#c363d0b330b4b21b4c1b10e0981d3a99 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.28.0-h26d7fe4_0.conda#2c51703b4d775f8943c08a361788131b +https://conda.anaconda.org/conda-forge/linux-64/libklu-2.3.5-ss783_hfbdfdfc.conda#9ef3af7a987541ae75e8d3765c6f31a2 +https://conda.anaconda.org/conda-forge/linux-64/libspqr-4.3.4-ss783_hae1ff0d.conda#04b223bbfa980f40315c3699a0e0ad33 +https://conda.anaconda.org/conda-forge/linux-64/libumfpack-6.3.5-ss783_hd4f9ce1.conda#7196f225e50e2582ea887e12146ddb5f 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_h22f9119_108.conda#0967d692b1dd33e7d809cfa355090e4b https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda#e064ca33edf91ac117236c4b5dee207a -https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.13.1-py312hf9745cd_0.conda#33c27209bfd7af6766211facd24839ce +https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.15.0-py312hf9745cd_0.conda#639af8e91d06907903b8686cc7d6a509 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py312hfb8ada1_0.conda#d0745ae74c2b26571b692ddde112eebb -https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda#7df02e445367703cd87a574046e3a6f0 -https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 -https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_0.conda#6f9eb38d0a87898cf5a7c91adaccd691 -https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba -https://conda.anaconda.org/conda-forge/noarch/pylint-3.3.1-pyhd8ed1ab_0.conda#2a3426f75e2172c932131f4e3d51bcf4 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h9211aeb_9.conda#173afeb0d112c854fd1a9fcac4b5cce3 +https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.0-h861ebed_0.conda#8779ee58be1c8b35e7af464a73674957 +https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d +https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d +https://conda.anaconda.org/conda-forge/linux-64/postgresql-17.2-h1122569_0.conda#848402b976b31bfecb3e476ea85cb285 +https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.8.2-pyhd8ed1ab_1.conda#7bfe485a0e86e9e4b7111357765c73dc +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-25.0.0-pyhd8ed1ab_0.conda#195fbabc5cc805f2cc10cb881a19cf8b https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py312hfb10629_0.conda#325cc5f0e0dc36562f3de2a4dbded572 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_0.conda#cb8a11b6d209e3d85e5094bdbd9ebd9c -https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.5-pyhd8ed1ab_0.conda#ecd5e850bcd3eca02143e7df030ee50f -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.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 -https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.2.post1-pyhff2d567_0.conda#bd5ae3c630d5eed353badb091fd3e603 -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.7.0-py312hc0a28a1_2.conda#8300d634adec4a6aed35a87e90e9cb07 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda#b43233a9e2f62fb94affe5607ea79473 +https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_1.conda#010e50e74c467db278f1398a74106a04 +https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py312hc0a28a1_3.conda#81bbcb20ea4a53b05a8cf51f31496038 +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.8.0-py312hc0a28a1_0.conda#3f62987017ad18e9e7dadce9899de9ef +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.1-py312h180e4f1_0.conda#355bcf0f629159c9bd10a406cd8b6c3a https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h6cab151_1.conda#5be02e05e1adaa42826cc6800ce399bc -https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_1.conda#5abeaa41ec50d4d1421a8bc8fbc93054 -https://conda.anaconda.org/conda-forge/linux-64/suitesparse-7.8.3-hb42a789_0.conda#216922e19843f5662a2b260f905640cb -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 +https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda#9aa358575bbd4be126eaa5e0039f835c +https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-heeae502_5.conda#2977d5268a6050196c42f03fd2a70020 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.16-hb9d3cd8_0.conda#7c0a9bf62d573409d12ad14b362a96e5 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.379-h5a9005d_9.conda#5dc18b385893b7991a3bbeb135ad7c3e -https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.12.0-hd2e3451_0.conda#61f1c193452f0daa582f39634627ea33 -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.6.1-pyhd8ed1ab_0.conda#e88d74bb7b9b89d4c9764286ceb94cc9 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.11.0-pyhd8ed1ab_0.conda#75c96f0655908f596a57be60251b78d4 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.38.3-h8bb6dbc_1.conda#73265d4acc551063cc5c5beab37f33c5 -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda#1483ba046164be27df7f6eddbcec3a12 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.2-pyhd8ed1ab_0.conda#636950f839e065401e2031624a414f0b -https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 -https://conda.anaconda.org/conda-forge/linux-64/julia-1.10.4-hf18f99d_1.conda#cc0ef9c191bab16211970a29b6787d69 -https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_1.conda#ec6f70b8a5242936567d4f886726a372 -https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.9.2-h353785f_1.conda#c363d0b330b4b21b4c1b10e0981d3a99 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.28.0-ha262f82_0.conda#9e7960f0b9ab3895ef73d92477c47dae -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda#83f045969988f5c7a65f3950b95a8b35 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_2.conda#2380c9ba933ffaac9ad16d8eac8e3318 -https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h22f9119_106.conda#5b911bfe75855326bae6857451268e59 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h21d6d8e_102.conda#9049ba34261ce7106220711d313fcf61 -https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d -https://conda.anaconda.org/conda-forge/linux-64/postgresql-17.0-h1122569_4.conda#028ea131f116f13bb2a4a382b5863a04 -https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.8.2-pyhd8ed1ab_0.conda#84377261c09c02182d76fbe79e69c9bf -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d -https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h32f4cee_16.conda#feee98a221344be7a447b80b410df867 -https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.2-py312h7a48858_1.conda#6b5f4c68483bd0c22bca9094dafc606b -https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 -https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyh267e887_1.conda#40d80cd9fa4cc759c6dba19ea96642db -https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda#97dc960f3d9911964d73c2cf240baea5 -https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 -https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.9.20-pyhd8ed1ab_0.conda#6de55c7859ed314159eaf2b7b4f19cc7 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 -https://conda.anaconda.org/conda-forge/noarch/xarray-2024.10.0-pyhd8ed1ab_0.conda#53e365732dfa053c4d19fc6b927392c4 -https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_0.conda#41abde21508578e02e3fd492e82a05cd https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.11.0-h325d260_1.conda#11d926d1f4a75a1b03d1c053ca20424b -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312hf9745cd_2.conda#cc3ecff140731b46b970a7c4787b1823 -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.10.0-pyhd8ed1ab_0.conda#9437cfe346eab83b011b4def99f0e879 -https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.11.0-pyhd8ed1ab_0.conda#497f3535cbb69cd2f02158e2e18ee0bb +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.6.2-pyhd8ed1ab_1.conda#976ff24762f1f991b08f7a7a41875086 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 +https://conda.anaconda.org/conda-forge/noarch/distributed-2025.1.0-pyhd8ed1ab_0.conda#5ec97e707606eaa891eedb406eba507b +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-h8bb6dbc_1.conda#87c13b15a9f3ec25cd3c9d8f2e33fe0b 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/gdal-3.9.2-py312h1299960_7.conda#9cf27e3f9d97ea13f250db9253a25dc8 -https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda#953e31ea00d46beb7e64a79fc291ec44 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h8ee276e_7.conda#28a9681054948a7d7e96a7b8fe9b604e +https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_1.conda#d733874844f9808ed46a93362f89bc2d https://conda.anaconda.org/conda-forge/linux-64/libgdal-fits-3.9.2-h2db6552_7.conda#524e64f1aa0ebc87230109e684f392f4 https://conda.anaconda.org/conda-forge/linux-64/libgdal-grib-3.9.2-hc3b29a1_7.conda#56a7436a66a1a4636001ce4b621a3a33 https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf4-3.9.2-hd5ecb85_7.conda#9c8431dc0b83d5fe9c12a2c0b6861a72 @@ -502,18 +510,47 @@ https://conda.anaconda.org/conda-forge/linux-64/libgdal-pdf-3.9.2-h600f43f_7.con https://conda.anaconda.org/conda-forge/linux-64/libgdal-pg-3.9.2-h5e77dd0_7.conda#e86b26f53ae868565e95fde5b10753d3 https://conda.anaconda.org/conda-forge/linux-64/libgdal-postgisraster-3.9.2-h5e77dd0_7.conda#3392965ffc4e8b7c66a532750ce0e91f https://conda.anaconda.org/conda-forge/linux-64/libgdal-xls-3.9.2-h03c987c_7.conda#165f12373452e8d17889e9c877431acf -https://conda.anaconda.org/conda-forge/linux-64/magics-4.15.4-h24e9adf_1.conda#9731bb0d2a3917cab718fd7c90dea857 -https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda#5971cc64048943605f352f7f8612de6c -https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py312h7900ff3_1.conda#f110e71421e5c86e50232cc027c6d85c -https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.2-cuda118_pyh40095f8_0.conda#aa5881b02bd9555a7b06c709aa33bd20 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.28.0-ha262f82_0.conda#9e7960f0b9ab3895ef73d92477c47dae +https://conda.anaconda.org/conda-forge/linux-64/libparu-1.0.0-ss783_h8814b27.conda#707eb61a0c3b223702ac326c04546b50 +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-h49af25d_2.conda#b9846db0abffb09847e2cb0fec4b4db6 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py312hd3ec401_0.conda#c27a17a8c54c0d35cf83bbc0de8f7f77 +https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_1.conda#1efb1227abaf20324ceb7ac9c06bb86d +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h21d6d8e_101.conda#0cabc6745882859ec7be35433c7b8f24 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d 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.6.1-pyhd8ed1ab_0.conda#d1023ccf92d8235cd4808ef53e274a5e +https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.6.1-pyhd8ed1ab_1.conda#8f854db1ce53e64891f718db849adbb0 https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b +https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h32f4cee_16.conda#feee98a221344be7a447b80b410df867 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.6.1-py312h7a48858_0.conda#102727f71df02a51e9e173f2e6f87d57 +https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_1.conda#3917cd49c30278aad07536ee77084eb0 +https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.5-pyh72ffeb9_0.conda#e640762c293807bbd75c003e18d8ff0c +https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda#97dc960f3d9911964d73c2cf240baea5 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.12.12-pyhd8ed1ab_0.conda#59d646aa704b6024cb965be43493ed45 +https://conda.anaconda.org/conda-forge/noarch/xarray-2025.1.1-pyhd8ed1ab_0.conda#81db80ba986122da460800a67bf8ac7f +https://conda.anaconda.org/conda-forge/noarch/zarr-3.0.1-pyhd8ed1ab_0.conda#66820cb25ad3c48f9ee46a48289b3454 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.10.0-pyhd8ed1ab_2.conda#ed15dcf944706ae6ea54968dfa4a06a5 +https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyhd8ed1ab_1.conda#a8dc13f40343dd9706cab9b9cbc49099 +https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_1.conda#dd71e4ec2fbffe38c0359976505f816e +https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_0.conda#a201de7d36907f2355426e019168d337 +https://conda.anaconda.org/conda-forge/noarch/esmpy-8.4.2-pyhc1e730c_4.conda#ddcf387719b2e44df0cc4dd467643951 +https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda#953e31ea00d46beb7e64a79fc291ec44 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-17.0.0-h8d2e343_13_cpu.conda#dc379f362829d5df5ce6722565110029 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-kea-3.9.2-h1df15e4_7.conda#c693e703649051ee9db0fabd4fcd0483 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-netcdf-3.9.2-hf2d2f32_7.conda#4015ef020928219acc0b5c9edbce8d30 +https://conda.anaconda.org/conda-forge/linux-64/magics-4.15.4-h24e9adf_1.conda#9731bb0d2a3917cab718fd7c90dea857 +https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.3-pyhd8ed1ab_1.conda#b7ad70c100bced5b6bc2d479c473d2a7 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_1.conda#9a2be7d0089f5934b550933ca0d9fe85 +https://conda.anaconda.org/conda-forge/linux-64/nco-5.3.1-hf7c1f58_0.conda#3f7887fed8b12d3e29dd15eb82cbc5b0 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda#b3e783e8e8ed7577cf0b6dee37d1fbac +https://conda.anaconda.org/conda-forge/noarch/prospector-1.13.3-pyhd8ed1ab_1.conda#0d6d32575a276ff0a1e612220d435b4a +https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py312h7900ff3_1.conda#f110e71421e5c86e50232cc027c6d85c +https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.3-cuda118_pyh0cc23a4_0.conda#44e85f4f035efbdb185400a3c35d11c8 +https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d -https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py312hc0a28a1_3.conda#81bbcb20ea4a53b05a8cf51f31496038 https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r42hc72bb7e_1005.conda#f2744985b083b1bbffd4df19437cf1e8 https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.5.0-r42hb1dbf0f_0.conda#d879e1fbd80113312364a5db3682c789 https://conda.anaconda.org/conda-forge/noarch/r-bigmemory.sri-0.1.8-r42hc72bb7e_0.conda#383f36b5a0b7dd7c467aa1b6b5fe7307 @@ -570,30 +607,28 @@ https://conda.anaconda.org/conda-forge/noarch/r-withr-3.0.0-r42hc72bb7e_0.conda# https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.45-r42ha18555a_0.conda#9e13c392bfcee4a261e4b513d6d862e7 https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r42hc72bb7e_2.conda#2f3614450b54f222c1eff786ec2a45ec https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r42h57805ef_0.conda#97f60a93ca12f4fdd5f44049dcee4345 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py312hf9745cd_3.conda#3612f99c589d51c363c8b90c0bcf3a18 -https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 +https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_1.conda#584e6aab3a5cffde537c575ad6a673ff +https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.25.0-py312hf9745cd_1.conda#7494c06b01edc857a4f7910946c408ab +https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda#fd96da444e81f9e6fcaac38590f3dd42 +https://conda.anaconda.org/conda-forge/linux-64/suitesparse-7.8.3-ss783_h36e971b.conda#64c7f927c297e2e3b94c4330e3d9db18 https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.26.0-h86fa3b2_0.conda#061175d9d4c046a1cf8bffe95a359fab https://conda.anaconda.org/conda-forge/linux-64/cdo-2.4.1-h9fe33b1_1.conda#a326dab3d2a1a8e32c2a6f792fac3161 -https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.14.1-pyhd8ed1ab_0.conda#1870fe8c9bd8967429e227be28ab94d2 -https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc -https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_0.conda#a201de7d36907f2355426e019168d337 -https://conda.anaconda.org/conda-forge/noarch/esmpy-8.4.2-pyhc1e730c_4.conda#ddcf387719b2e44df0cc4dd467643951 -https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_39-imagemagick_hcfc5581_1.conda#1144fe07cf76921ec664b868453027d3 -https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_2.conda#5d8984ceb5fdf85110ca7108114ecc18 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-17.0.0-h8d2e343_13_cpu.conda#dc379f362829d5df5ce6722565110029 -https://conda.anaconda.org/conda-forge/linux-64/libgdal-kea-3.9.2-h1df15e4_7.conda#c693e703649051ee9db0fabd4fcd0483 -https://conda.anaconda.org/conda-forge/linux-64/libgdal-netcdf-3.9.2-hf2d2f32_7.conda#4015ef020928219acc0b5c9edbce8d30 +https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.15.0-pyhd8ed1ab_0.conda#211303621409d703235598be8c378b3c +https://conda.anaconda.org/conda-forge/noarch/datapi-0.1.2-pyhd8ed1ab_0.conda#9f2f0d8106777cdcd4f2eac665065091 +https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhd8ed1ab_5.conda#6779887899e0b0b6fb316253eb0f5c64 +https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_43-imagemagick_hf2058d9_2.conda#d656f8b4405fb5f1821f3ebba98e5e10 +https://conda.anaconda.org/conda-forge/noarch/iris-3.11.0-pyha770c72_0.conda#a5e36260789ce92074c3736533ecdd61 +https://conda.anaconda.org/conda-forge/linux-64/julia-1.10.4-hf18f99d_1.conda#cc0ef9c191bab16211970a29b6787d69 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-17.0.0-h5888daf_13_cpu.conda#b654d072b8d5da807495e49b28a0b884 https://conda.anaconda.org/conda-forge/linux-64/libgdal-tiledb-3.9.2-h4a3bace_2.conda#c3fac34ecba2fcf9d5d31a03b975d5a1 -https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 -https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.2-pyhd8ed1ab_0.conda#9b6cf42ef472b332970282ec87d2e5d4 -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc -https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.8-hf7c1f58_0.conda#6cd18a9c6b8269b0cd101ba9cc3d02ab -https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed -https://conda.anaconda.org/conda-forge/noarch/prospector-1.12.1-pyhd8ed1ab_0.conda#8621ba9cf057da26d371b87cd2264259 +https://conda.anaconda.org/conda-forge/linux-64/libparquet-17.0.0-h39682fd_13_cpu.conda#49c60a8dc089d8127b9368e9eb6c1a77 +https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_2.conda#7807e1b976aaab2b457002abffdf5e1c +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.5-pyhd8ed1ab_1.conda#dd50a122c5b9782b1e9b2695473bfd95 https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.5.1-py312h7900ff3_0.conda#683ec8787a523de54b02c885e2c2aefa -https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.2-py312h7900ff3_0.conda#a972ba77217a2cac592c41dd3cc56dfd -https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 +https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.9.0-pyhd8ed1ab_1.conda#53912b9ade4f2ea4dd1d5d6d3de7df70 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-17.0.0-py312h01725c0_2_cpu.conda#add603bfa43d9bf3f06783f780e1a817 +https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.4-py312h7900ff3_0.conda#331fc9a56a16f02592f193c8109e4543 https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.4-r42ha503ecb_0.conda#12b6fa8fe80a6494a948c6ea2f34340d https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.3.1-r42h57805ef_0.conda#9febce7369c72d991e2399d7d28f3390 https://conda.anaconda.org/conda-forge/linux-64/r-climdex.pcic-1.1_11-r42ha503ecb_2.conda#cff1d95fe315f109a1f01a7ef112fdd6 @@ -618,22 +653,17 @@ https://conda.anaconda.org/conda-forge/linux-64/r-spam-2.10_0-r42h9f9f741_0.cond https://conda.anaconda.org/conda-forge/linux-64/r-timechange-0.3.0-r42ha503ecb_0.conda#3d62906e9c1fecf61370a3ad6e808e5e https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.6-r42hbfba7a4_1.conda#5c3d7a89a2d5e1c0885f92d1aa6fde30 https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r42h57805ef_1.conda#5367d265c0c9c151dea85f1ccb515ec1 -https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b -https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e -https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.2-cuda118_pyh256f914_0.conda#2dcf3e60ef65fd4cb95048f2491f6a89 -https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.5.2-pyhd8ed1ab_0.conda#e7005effa79f1493a51404873d6eb5a0 -https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhd8ed1ab_4.conda#f481c17430f801e68ee3b57cc30ecd2e -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-17.0.0-h5888daf_13_cpu.conda#b654d072b8d5da807495e49b28a0b884 +https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda#62afb877ca2c2b4b6f9ecb37320085b6 +https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c +https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.3-cuda118_pyh256f914_0.conda#cfb6634184cb3d62af351ce8e5be72c3 +https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.5-pyhd8ed1ab_1.conda#b53d59d2abbc0b383d8a1bc0f06ed2d6 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-17.0.0-h5888daf_13_cpu.conda#cd2c36e8865b158b82f61c6aac28b7e1 https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.9.2-ha770c72_7.conda#63779711c7afd4fcf9cea67538baa67a -https://conda.anaconda.org/conda-forge/linux-64/libparquet-17.0.0-h39682fd_13_cpu.conda#49c60a8dc089d8127b9368e9eb6c1a77 -https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.5-hd8ed1ab_1.conda#593a8fd80968f14f8a7b3a685ddc455e https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 https://conda.anaconda.org/conda-forge/linux-64/psy-maps-1.5.0-py312h7900ff3_1.conda#080bc8f34a9cb0ab81ae0369fd43b7ab https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.5.0-py312h7900ff3_1.conda#ea719cfcc2e5b815b137b7082ece8aeb -https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.8.0-pyhd8ed1ab_0.conda#fba377622e74ee0bbeb8ccae9fa593d3 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-17.0.0-py312h01725c0_2_cpu.conda#add603bfa43d9bf3f06783f780e1a817 -https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhd8ed1ab_0.conda#3fd1a0b063c1fbbe4b7bd5a5a7601e84 +https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhff2d567_1.conda#61f71e3d4df9dbe55340c129f96cb8ee https://conda.anaconda.org/conda-forge/linux-64/r-akima-0.6_3.4-r42h61816a4_2.conda#8536251313f441c4d70ff11ad976d294 https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.6-r42hc72bb7e_0.conda#4fb1765d6dc531936db81af3f6be316a https://conda.anaconda.org/conda-forge/noarch/r-doparallel-1.0.17-r42hc72bb7e_2.conda#1cddfbaade4416f0234670391bb31ba2 @@ -649,11 +679,9 @@ https://conda.anaconda.org/conda-forge/noarch/r-scales-1.3.0-r42hc72bb7e_0.conda https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r42h7525677_2.tar.bz2#1521b8a303852af0496245e368d3c61c https://conda.anaconda.org/conda-forge/linux-64/r-splancs-2.01_45-r42hbcb9c34_0.conda#bcd96dc088f54514a54d57e6b8ed51b6 https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.5-r42ha503ecb_0.conda#5689030c60302fb5bb7a48b54c11dbe8 -https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c -https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.4-pyhd8ed1ab_0.conda#67a29b663023b8c0e3d8a73013ea3e23 https://conda.anaconda.org/conda-forge/linux-64/fiona-1.10.1-py312h5aa26c2_1.conda#4a30f4277a1894928a7057d0e14c1c95 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-17.0.0-h5888daf_13_cpu.conda#cd2c36e8865b158b82f61c6aac28b7e1 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_1.conda#37cec2cf68f4c09563d8bc833791096b +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-17.0.0-hf54134d_13_cpu.conda#46f41533959eee8826c09e55976b8c06 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.5-hd8ed1ab_1.conda#82ffc2974cd09b45182f018b5af731c8 https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-h7cb714c_54.conda#7363202c15302898deb49e82ca3e5f58 https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.1-r42hc72bb7e_0.conda#6bd41a85dc43541400311eca03d4e2d4 https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r42hc72bb7e_1005.conda#da116b29105a8d48571975a185e9bb94 @@ -663,31 +691,28 @@ https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r42hc72bb7e_1.conda https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r42h57805ef_0.conda#7985dada48799b7814ca069794d0b1a3 https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r42hc72bb7e_2.conda#34daac4e8faee056f15abdee858fc721 https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.11-py312hd177ed6_1.conda#246c5f31c607ecfe1ece1e8cc6ecc9c5 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-17.0.0-hf54134d_13_cpu.conda#46f41533959eee8826c09e55976b8c06 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.4-hd8ed1ab_1.conda#ab83e3b9ca2b111d8f332e9dc8b2170f +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-17.0.0-py312h9cebb41_2.conda#5f7d505626cb057e1320bbd46dd02ef2 https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r42hc72bb7e_0.conda#f34d40a3f0f9160fdd2bccaae8e185d1 https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r42hc72bb7e_0.conda#ef49cc606b94a9d5f30b9c48f5f68848 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.conda#b1278a5148c9e52679bb72112770cdc3 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-17.0.0-py312h9cebb41_2.conda#5f7d505626cb057e1320bbd46dd02ef2 +https://conda.anaconda.org/conda-forge/noarch/dask-2025.1.0-pyhd8ed1ab_0.conda#a5f91379331b61157c203ca69da6331b https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.17-pyhd8ed1ab_0.conda#4f75a3a76e9f693fc33be59485f46fcf +https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab_1.conda#86286b197e33e3b034416c18ba0f574c https://conda.anaconda.org/conda-forge/noarch/r-styler-1.10.3-r42hc72bb7e_0.conda#1b2b8fa85a9d0556773abac4763d8ef9 https://conda.anaconda.org/conda-forge/linux-64/r-tlmoments-0.7.5.3-r42ha503ecb_1.conda#6aa1414e06dfffc39d3b5ca78b60b377 https://conda.anaconda.org/conda-forge/noarch/r-viridis-0.6.5-r42hc72bb7e_0.conda#959f69b6dfd4b620a15489975fa27670 -https://conda.anaconda.org/conda-forge/noarch/dask-2024.11.0-pyhd8ed1ab_0.conda#9a25bf7e2a910e85209218896f2adeb9 +https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.11.1-pyhd8ed1ab_0.conda#54cad67b1fb303d452019c45e4fea1bc https://conda.anaconda.org/conda-forge/linux-64/r-fields-15.2-r42h61816a4_0.conda#d84fe2f9e893e92089370b195e2263a0 https://conda.anaconda.org/conda-forge/noarch/r-spei-1.8.1-r42hc72bb7e_1.conda#7fe060235dac0fc0b3d387f98e79d128 -https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab_1.conda#86286b197e33e3b034416c18ba0f574c https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_0-r42h57805ef_2.conda#020534c6abdee4f1253c221e926a5341 -https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.11.0-pyhd8ed1ab_0.conda#ae2c9a927475f5519d0164c542cde378 https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r42hc72bb7e_2.conda#8079a86a913155fe2589ec0b76dc9f5e https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.14-pyhd8ed1ab_0.conda#351a11ac1215eb4f6c5b82e30070277a -https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.5-pyhd8ed1ab_0.conda#b808b8a0494c5cca76200c73e260a060 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.0-pyhd8ed1ab_0.conda#344261b0e77f5d2faaffb4eac225eeb7 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 -https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda#05706dd5a145a9c91861495cd435409a -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e +https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.6-pyhd8ed1ab_0.conda#2e4c30e09d50d025836279d80140d0a4 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda#837aaf71ddf3b27acae0e7e9015eebc6 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda#1a3281a0dc355c02b5506d87db2d78ac +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 diff --git a/doc/sphinx/source/recipes/figures/bock24acp/boxplot_ssp585_south_oc.png b/doc/sphinx/source/recipes/figures/bock24acp/boxplot_ssp585_south_oc.png new file mode 100644 index 0000000000..65f242fac2 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/bock24acp/boxplot_ssp585_south_oc.png differ diff --git a/doc/sphinx/source/recipes/figures/bock24acp/map_netcre.png b/doc/sphinx/source/recipes/figures/bock24acp/map_netcre.png new file mode 100644 index 0000000000..d34e1e963a Binary files /dev/null and b/doc/sphinx/source/recipes/figures/bock24acp/map_netcre.png differ diff --git a/doc/sphinx/source/recipes/figures/bock24acp/zonal_diff_clt_ssp585.png b/doc/sphinx/source/recipes/figures/bock24acp/zonal_diff_clt_ssp585.png new file mode 100644 index 0000000000..683ac90956 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/bock24acp/zonal_diff_clt_ssp585.png differ diff --git a/doc/sphinx/source/recipes/index.rst b/doc/sphinx/source/recipes/index.rst index 94777d7744..33fbb13126 100644 --- a/doc/sphinx/source/recipes/index.rst +++ b/doc/sphinx/source/recipes/index.rst @@ -95,6 +95,7 @@ Future projections recipe_tcr recipe_tebaldi21esd recipe_climate_change_hotspot + recipe_bock24acp IPCC ^^^^ diff --git a/doc/sphinx/source/recipes/recipe_bock24acp.rst b/doc/sphinx/source/recipes/recipe_bock24acp.rst new file mode 100644 index 0000000000..bc1d4d3717 --- /dev/null +++ b/doc/sphinx/source/recipes/recipe_bock24acp.rst @@ -0,0 +1,143 @@ +.. _recipes_bock24acp: + +Cloud properties and their projected changes in CMIP models with low to high climate sensitivity +================================================================================================ + +Overview +-------- + +The recipes recipe_bock24acp_*.yml reproduce figures (Fig. 3, 4, 6 and 7) from the publication `Bock and Lauer, 2024`_ investigating cloud properties and their projected changes in CMIP models with low to high climate sensitivity. + +.. _`Bock and Lauer, 2024`: https://doi.org/10.5194/acp-24-1587-2024 + +Available recipes and diagnostics +--------------------------------- + +Recipes are stored in recipes/clouds + + * recipe_bock24acp_fig3-4_maps.yml + * recipe_bock24acp_fig6_zonal.yml + * recipe_bock24acp_fig7_boxplots.yml + +Diagnostics are stored in diag_scripts/ + + Fig. 3 and 4: + + * clouds/clouds_ecs_groups_maps.py: Geographical maps of the multi-year annual means for group means of historical CMIP simulations from all three ECS groups. + + Fig. 6: + + * clouds/clouds_ecs_groups_zonal.py: Zonally averaged group means. + + Fig. 7: + + * clouds/clouds_ecs_groups_boxplots.py: Boxplots of relative changes for all groups. + + +User settings in recipe +----------------------- + +#. Script clouds_ecs_groups_maps.py + + *Required settings (scripts)* + + reference: if true, a reference dataset is given within 'variable_group' equal 'OBS' + + *Optional settings (scripts)* + + plot_each_model: one figure for each single model + + +#. Script clouds/clouds_ecs_groups_zonal.py + + *Required settings (scripts)* + + group_by: list of 'variable_group's to have the order + plot_type: 'zonal' and 'height' plots are available + + *Optional settings (scripts)* + + filename_attach: attachment to the output files + + +#. Script clouds/clouds_ecs_groups_boxplots.py + + *Required settings (scripts)* + + exclude_datasets: list of datasets which are not used for the statistics, default is ['MultiModelMean', 'MultiModelP5', 'MultiModelP95'] + group_by: list of 'variable_group's to have the order + plot_type: 'zonal' and 'height' plots are available + + *Optional settings (scripts)* + + filename_attach: attachment to the output files + title: set title of figure + y_range: set range of the y-axes + + +Variables +--------- + +* clt (atmos, monthly, longitude latitude time) +* clivi (atmos, monthly, longitude latitude time) +* clwvi (atmos, monthly, longitude latitude time) +* rlut (atmos, monthly, longitude latitude time) +* rsut (atmos, monthly, longitude latitude time) +* rlutcs (atmos, monthly, longitude latitude time) +* rsutcs (atmos, monthly, longitude latitude time) +* tas (atmos, monthly, longitude latitude time) + + +Observations and reformat scripts +--------------------------------- + +* CERES-EBAF (Ed4.2) - TOA radiation fluxes (used for calculation of + the cloud radiative effects) + + *Reformat script:* cmorizers/data/formatters/datasets/ceres_ebaf.py + + +References +---------- + +* Bock, L. and Lauer, A.: Cloud properties and their projected changes in CMIP + models with low to high climate sensitivity, Atmos. Chem. Phys., 24, 1587–1605, + https://doi.org/10.5194/acp-24-1587-2024, 2024. + + +Example plots +------------- + +.. _fig_bock24acp_1: +.. figure:: /recipes/figures/bock24acp/map_netcre.png + :align: center + + Geographical map of the multi-year annual mean net cloud radiative effect from + (a) CERES–EBAF Ed4.2 (OBS) and (b–d) group means of historical CMIP simulations + from all three ECS groups (Fig. 4). + +.. _fig_bock24acp_2: +.. figure:: /recipes/figures/bock24acp/zonal_diff_clt_ssp585.png + :align: center + + The upper panel show the zonally averaged group means of total cloud + fraction from historical simulations (solid lines) + and RCP8.5/SSP5-8.5 scenarios (dashed lines) for the three different ECS groups. + Lower panels show the corresponding relative differences of all zonally + averaged group means between the RCP8.5/SSP5-8.5 scenarios and the corresponding + historical simulations. Shading indicates the 5 % and 95 % quantiles of the single + model results (Fig. 6a). + +.. _fig_bock24acp_3: +.. figure:: /recipes/figures/bock24acp/boxplot_ssp585_south_oc.png + :align: center + + Relative change (calculated as the difference between the scenario value and the + historical value divided by the historical value) of total cloud fraction (clt), + ice water path (iwp), liquid water path (lwp), and net cloud radiative effect + (netcre) per degree of warming averaged over the Southern Ocean (30–65°S). In the + box plot, each box indicates the range from the first + quartile to the third quartile, the vertical line shows the median, and the + whiskers the minimum and maximum values, excluding the outliers. Outliers are + defined as being outside 1.5 times the interquartile range (Fig. 7b). + diff --git a/doc/sphinx/source/utils/RTW/user_guide/quick_start.rst b/doc/sphinx/source/utils/RTW/user_guide/quick_start.rst index f15082ae84..6574aa24ee 100644 --- a/doc/sphinx/source/utils/RTW/user_guide/quick_start.rst +++ b/doc/sphinx/source/utils/RTW/user_guide/quick_start.rst @@ -38,5 +38,17 @@ Quick Start Guide export CYLC_VERSION=8 cylc vip -O jasmin -* Browse the logs using `Cylc Review`_, a web service for browsing logs via an - HTTP interface. + * on DKRZ: + + * add the following line to your ``~/.bashrc`` file to ensure the Cylc and + Rose executables can be found:: + + export PATH=/work/bd0854/metomi/bin:$PATH + + * run the RTW on DKRZ:: + + cd ESMValTool/esmvaltool/utils/recipe_test_workflow + cylc vip -O dkrz + +* Optionally browse the logs using `Cylc Review`_, + a web service for browsing logs via an HTTP interface. diff --git a/doc/sphinx/source/utils/RTW/user_guide/workflow.rst b/doc/sphinx/source/utils/RTW/user_guide/workflow.rst index 5871df7b78..f571e1e148 100644 --- a/doc/sphinx/source/utils/RTW/user_guide/workflow.rst +++ b/doc/sphinx/source/utils/RTW/user_guide/workflow.rst @@ -25,9 +25,7 @@ The |RTW| performs the following steps: GitHub, or gets the latest container image from DockerHub and converts to a singularity image, depending on ``SITE`` :Runs on: - Localhost (if cloning), or ``COMPUTE`` (if getting container), which - depends on the ``SITE``; on JASMIN, the ``get_esmval`` jobs will run on - LOTUS + Localhost, or ``COMPUTE`` on JASMIN :Executes: The ``clone_latest_esmval.sh`` script (if cloning), or a ``singularity build`` command (if getting container) from the |Rose| app @@ -48,8 +46,7 @@ The |RTW| performs the following steps: :Description: Runs the requested recipes using |ESMValTool| :Runs on: - ``COMPUTE``, which depends on the ``SITE``; at the Met Office, the - ``process`` jobs will run on SPICE + ``COMPUTE``, which depends on the ``SITE`` :Executes: The |ESMValTool| command line script from the |Rose| app :Details: @@ -60,8 +57,7 @@ The |RTW| performs the following steps: :Description: Compares the output from the ``process`` job with |KGOs| :Runs on: - ``COMPUTE``, which depends on the ``SITE``; at the Met Office, the - ``compare`` jobs will run on SPICE + ``COMPUTE``, which depends on the ``SITE`` :Executes: The :ref:`compare.py ` script from |ESMValTool| from the |Rose| app diff --git a/esmvaltool/config-references.yml b/esmvaltool/config-references.yml index 6eda568bac..701b16e5b3 100644 --- a/esmvaltool/config-references.yml +++ b/esmvaltool/config-references.yml @@ -228,6 +228,11 @@ authors: name: Galytska, Evgenia institute: IUP, Bremen orcid: https://orcid.org/0000-0001-6575-1559 + garcia_perdomo_karen: + name: Garcia Perdomo, Karen + institute: CCCma, ECCC, Canada + orcid: https://orcid.org/0009-0004-2333-3358 + github: Karen-A-Garcia gettelman_andrew: name: Gettelman, Andrew institute: NCAR, USA @@ -237,6 +242,11 @@ authors: institute: University of Bremen, Germany orcid: https://orcid.org/0000-0002-2928-8664 github: bettina-gier + gillett_nathan: + name: Gillett, Nathan + institute: CCCma, ECCC, Canada + orcid: https://orcid.org/0000-0002-2957-0002 + github: npgillett gonzalez-reviriego_nube: name: Gonzalez-Reviriego, Nube institute: BSC, Spain @@ -374,7 +384,7 @@ authors: orcid: malinina_elizaveta: name: Malinina, Elizaveta - institute: CCCma, Canada + institute: CCCma, ECCC, Canada orcid: https://orcid.org/0000-0002-4102-2877 github: malininae maloney_eric: @@ -405,6 +415,11 @@ authors: name: Mello, Felipe institute: INPE, Brazil orcid: https://orcid.org/0000-0002-8832-2869 + menelaou_konstantinos: + name: Menelaou, Konstantinos + institute: CCCma, ECCC, Canada + orcid: https://orcid.org/0000-0002-9676-7657 + github: konmenelaou mohr_christianwilhelm: name: Mohr, Christian Wilhelm institute: Cicero, Norway @@ -514,6 +529,11 @@ authors: name: Sterl, Andreas institute: KNMI, Netherlands orcid: https://orcid.org/0000-0003-3457-0434 + stevens_robin: + name: Stevens, Robin + institute: CCCma, ECCC, Canada + orcid: https://orcid.org/0000-0002-8737-6988 + github: Row-Bean swaminathan_ranjini: name: Swaminathan, Ranjini institute: University of Reading, UK @@ -555,6 +575,11 @@ authors: institute: University of Bremen and DLR, Germany orcid: https://orcid.org/0000-0001-6133-7801 github: katjaweigel + webb_kristi: + name: Webb, Kristi + institute: CCCma, ECCC, Canada + orcid: https://orcid.org/0000-0002-8610-0672 + github: k-a-webb wenzel_sabrina: name: Wenzel, Sabrina institute: DLR, Germany @@ -712,7 +737,7 @@ authors: orcid: reader_cathy: name: Reader, Cathy - institute: + institute: CCCma, ECCC, Canada orcid: github: mcreader97 rumbold_heather: diff --git a/esmvaltool/diag_scripts/arctic_ocean/__init__.py b/esmvaltool/diag_scripts/arctic_ocean/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/esmvaltool/diag_scripts/climate_patterns/__init__.py b/esmvaltool/diag_scripts/climate_patterns/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_boxplots.py b/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_boxplots.py new file mode 100644 index 0000000000..2f24436fcc --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_boxplots.py @@ -0,0 +1,227 @@ +"""Python diagnostic for plotting boxplots.""" +import logging +from pathlib import Path + +import iris +import matplotlib.pyplot as plt +import pandas as pd +import seaborn as sns + +from esmvaltool.diag_scripts.shared import ( + ProvenanceLogger, + get_diagnostic_filename, + get_plot_filename, + group_metadata, + run_diagnostic, + select_metadata, +) + +logger = logging.getLogger(Path(__file__).stem) + +VAR_NAMES = { + 'cl': 'cloud_fraction', + 'cli': 'ice_water_content', + 'clw': 'liquid_water_content', +} +PALETTE = { + 'high ECS': 'royalblue', + 'med ECS': 'green', + 'low ECS': 'orange', +} + + +def get_provenance_record(ancestor_files): + """Create a provenance record describing the diagnostic data and plot.""" + caption = ("Relative change per degree of warming averaged over the" + "chosen region.") + + record = { + 'caption': caption, + 'statistics': ['mean'], + 'domains': ['global'], + 'plot_types': ['zonal'], + 'authors': [ + 'bock_lisa', + ], + 'references': [ + 'bock24acp', + ], + 'ancestors': ancestor_files, + } + return record + + +def read_data(filename): + """Compute an example diagnostic.""" + logger.debug("Loading %s", filename) + cube = iris.load_cube(filename) + + if cube.var_name == 'cli': + cube.convert_units('g/kg') + elif cube.var_name == 'clw': + cube.convert_units('g/kg') + + cube = iris.util.squeeze(cube) + return cube + + +def compute_diff(filename1, filename2): + """Compute difference between two cubes.""" + logger.debug("Loading %s", filename1) + cube1 = iris.load_cube(filename1) + cube2 = iris.load_cube(filename2) + + if cube1.var_name == 'cli': + cube1.convert_units('g/kg') + cube2.convert_units('g/kg') + elif cube1.var_name == 'clw': + cube1.convert_units('g/kg') + cube2.convert_units('g/kg') + + cube = cube2 - cube1 + cube.metadata = cube1.metadata + return cube + + +def compute_diff_temp(input_data, group, var, dataset): + """Compute relative change per temperture change.""" + dataset_name = dataset['dataset'] + var = dataset['short_name'] + + input_file_1 = dataset['filename'] + + var_data_2 = select_metadata(input_data, + short_name=var, + dataset=dataset_name, + variable_group=var + "_" + group[1]) + if not var_data_2: + raise ValueError( + f"No '{var}' data for '{dataset_name}' in '{group[1]}' available") + + input_file_2 = var_data_2[0]['filename'] + + tas_data_1 = select_metadata(input_data, + short_name='tas', + dataset=dataset_name, + variable_group='tas_' + group[0]) + tas_data_2 = select_metadata(input_data, + short_name='tas', + dataset=dataset_name, + variable_group='tas_' + group[1]) + if not tas_data_1: + raise ValueError( + f"No 'tas' data for '{dataset_name}' in '{group[0]}' available") + if not tas_data_2: + raise ValueError( + f"No 'tas' data for '{dataset_name}' in '{group[1]}' available") + input_file_tas_1 = tas_data_1[0]['filename'] + input_file_tas_2 = tas_data_2[0]['filename'] + + cube = read_data(input_file_1) + + cube_diff = compute_diff(input_file_1, input_file_2) + cube_tas_diff = compute_diff(input_file_tas_1, input_file_tas_2) + + cube_diff = (100. * (cube_diff / iris.analysis.maths.abs(cube)) / + cube_tas_diff) + + return cube_diff + + +def create_data_frame(input_data, cfg): + """Create data frame.""" + data_frame = pd.DataFrame(columns=['Variable', 'Group', 'Dataset', 'Data']) + + ifile = 0 + + all_vars = group_metadata(input_data, 'short_name') + groups = group_metadata(input_data, 'variable_group', sort='dataset') + + for var in all_vars: + if var != 'tas': + logger.info("Processing variable %s", var) + + if var == 'clivi': + varname = 'iwp' + else: + varname = var + + for group_names in cfg['group_by']: + logger.info("Processing group %s of variable %s", + group_names[0], var) + + for dataset in groups[var + "_" + group_names[0]]: + dataset_name = dataset['dataset'] + + if dataset_name not in cfg['exclude_datasets']: + cube_diff = compute_diff_temp(input_data, group_names, + var, dataset) + + group_name = group_names[0].split('_')[1] + " ECS" + + data_frame.loc[ifile] = [ + varname, group_name, dataset_name, cube_diff.data + ] + ifile = ifile + 1 + + data_frame['Data'] = data_frame['Data'].astype(str).astype(float) + + return data_frame + + +def plot_boxplot(data_frame, input_data, cfg): + """Create boxplot.""" + sns.set_style('darkgrid') + sns.set(font_scale=2) + sns.boxplot(data=data_frame, + x='Variable', + y='Data', + hue='Group', + palette=PALETTE) + plt.ylabel('Relative change (%/K)') + if 'y_range' in cfg: + plt.ylim(cfg.get('y_range')) + plt.title(cfg['title']) + + provenance_record = get_provenance_record( + ancestor_files=[d['filename'] for d in input_data]) + + # Save plot + plot_path = get_plot_filename('boxplot' + '_' + cfg['filename_attach'], + cfg) + plt.savefig(plot_path) + logger.info("Wrote %s", plot_path) + plt.close() + + with ProvenanceLogger(cfg) as provenance_logger: + provenance_logger.log(plot_path, provenance_record) + + +def main(cfg): + """Run diagnostic.""" + cfg.setdefault('exclude_datasets', + ['MultiModelMean', 'MultiModelP5', 'MultiModelP95']) + cfg.setdefault('title', 'Test') + + plt.figure(constrained_layout=True, figsize=(12, 8)) + + # Get input data + input_data = list(cfg['input_data'].values()) + + # Create data frame + data_frame = create_data_frame(input_data, cfg) + + # Create plot + plot_boxplot(data_frame, input_data, cfg) + + # Save file + basename = "boxplot_region_" + cfg['filename_attach'] + csv_path = get_diagnostic_filename(basename, cfg).replace('.nc', '.csv') + data_frame.to_csv(csv_path) + logger.info("Wrote %s", csv_path) + + +if __name__ == '__main__': + + with run_diagnostic() as config: + main(config) diff --git a/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_maps.py b/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_maps.py new file mode 100644 index 0000000000..fe9a0946e5 --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_maps.py @@ -0,0 +1,516 @@ +"""Python diagnostic for plotting geographical maps.""" +import logging +import secrets +from copy import deepcopy +from pathlib import Path + +import cartopy.crs as ccrs +import iris +import iris.plot as iplt +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +from iris.analysis.stats import pearsonr + +from esmvaltool.diag_scripts.shared import ( + extract_variables, + get_diagnostic_filename, + get_plot_filename, + group_metadata, + run_diagnostic, + save_data, + save_figure, +) + +logger = logging.getLogger(Path(__file__).stem) + +VAR_NAMES = { + 'clt': 'total_cloud_fraction', + 'lwp': 'liquid_water_path', + 'clivi': 'ice_water_path', + 'netcre': 'net_cre', + 'swcre': 'sw_cre', + 'lwcre': 'lw_cre', +} +PANEL = {'ECS_high': 222, 'ECS_med': 223, 'ECS_low': 224, 'OBS': 221} +PANEL_woOBS = { + 'ECS_high': 131, + 'ECS_med': 132, + 'ECS_low': 133, +} +PANEL_LABELS = { + 'ECS_high': 'b)', + 'ECS_med': 'c)', + 'ECS_low': 'd)', + 'OBS': 'a)' +} +PANEL_LABELS_woOBS = { + 'ECS_high': 'a)', + 'ECS_med': 'b)', + 'ECS_low': 'c)', +} +PANDAS_PRINT_OPTIONS = ['display.max_rows', None, 'display.max_colwidth', -1] + + +def get_provenance_record(attributes, ancestor_files): + """Create a provenance record describing the diagnostic data and plot.""" + caption = f"Climatology of {attributes['short_name']}." + + record = { + 'caption': caption, + 'statistics': ['mean'], + 'domains': ['global'], + 'plot_types': ['map'], + 'authors': [ + 'bock_lisa', + ], + 'references': [ + 'bock24acp', + ], + 'ancestors': ancestor_files, + } + return record + + +def area_weighted_mean(cube): + """Calculate area weighted mean over the globe.""" + logger.debug("Computing field mean") + grid_areas = iris.analysis.cartography.area_weights(cube) + mean = cube.collapsed(['longitude', 'latitude'], + iris.analysis.MEAN, + weights=grid_areas) + return mean + + +def calculate_bias(model_cube, obs_cube): + """Calculate area weighted mean over the globe.""" + logger.debug("Computing bias") + diff = model_cube - obs_cube + bias = area_weighted_mean(diff) + bias.attributes = model_cube.attributes + return bias + + +def calculate_rmsd(model_cube, obs_cube): + """Calculate global RMSD.""" + logger.debug("Computing RMSD") + diff = model_cube - obs_cube + rmsd = area_weighted_mean(diff**2)**0.5 + rmsd.attributes = model_cube.attributes + return rmsd + + +def calculate_corr(model_cube, obs_cube): + """Calculate pattern correlation.""" + logger.debug("Computing Correlation") + grid_areas = iris.analysis.cartography.area_weights(model_cube) + corr = pearsonr(model_cube, obs_cube, weights=grid_areas) + return corr + + +def compute_diagnostic(filename): + """Load cube.""" + logger.debug("Loading %s", filename) + cube = iris.load_cube(filename) + + cube = iris.util.squeeze(cube) + return cube + + +def plot_model(cube, attributes, cfg): + """Plot each model.""" + levels = [10, 20, 30, 40, 50, 60, 70, 80, 90] + if attributes['short_name'] == 'clt': + levels = [10, 20, 30, 40, 50, 60, 70, 80, 90] + cmap = 'viridis' + elif attributes['short_name'] == 'clivi': + levels = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + cmap = 'viridis' + elif attributes['short_name'] == 'lwp': + levels = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + cmap = 'viridis' + elif attributes['short_name'] == 'netcre': + levels = [-50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50] + cmap = 'bwr' + elif attributes['short_name'] == 'lwcre': + levels = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] + cmap = 'Reds' + elif attributes['short_name'] == 'swcre': + levels = [-90, -80, -70, -60, -50, -40, -30, -20, -10, 0] + cmap = 'Blues_r' + else: # default + cmap = 'viridis' + plt.axes(projection=ccrs.Robinson()) + iplt.contourf(cube, levels=levels, cmap=cmap, extend='both') + plt.gca().coastlines() + colorbar = plt.colorbar(orientation='horizontal') + colorbar.set_label(cube.var_name + '/' + cube.units.origin) + if attributes['short_name'] == 'clt': + ticks = [10, 20, 30, 40, 50, 60, 70, 80, 90] + elif attributes['short_name'] == 'clivi': + ticks = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + elif attributes['short_name'] == 'lwp': + ticks = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + elif attributes['short_name'] == 'netcre': + ticks = [-50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50] + elif attributes['short_name'] == 'lwcre': + ticks = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] + elif attributes['short_name'] == 'swcre': + ticks = [-90, -80, -70, -60, -50, -40, -30, -20, -10, 0] + else: + ticks = levels + colorbar.set_ticks(ticks) + colorbar.set_ticklabels([str(tick) for tick in ticks]) + + # Appearance + dataset_name = attributes['dataset'] + exp_name = attributes['exp'] + title = f'{VAR_NAMES.get(cube.var_name, cube.var_name)} for {dataset_name}' + filename = (f'{VAR_NAMES.get(cube.var_name, cube.var_name)}_' + f'{exp_name}_{dataset_name}') + + plt.title(title) + plot_path = get_plot_filename(filename, cfg) + plt.savefig(plot_path, bbox_inches='tight', orientation='landscape') + logger.info("Wrote %s", plot_path) + plt.close() + + +def read_data(groups, cfg): + """Collect cubes.""" + logger.debug("Read data") + cubes = iris.cube.CubeList() + cubes_out = iris.cube.CubeList() + + for group_name in groups: + logger.info("Processing variable %s", group_name) + + for attributes in groups[group_name]: + logger.info("Processing dataset %s", attributes['dataset']) + input_file = attributes['filename'] + cube = compute_diagnostic(input_file) + cube.attributes['variable_group'] = group_name + cube.attributes['dataset'] = attributes['dataset'] + + cubes.append(cube) + + if (attributes['dataset'] == 'MultiModelMean' + or group_name == 'OBS'): + cubes_out.append(cube) + else: + if cfg['plot_each_model']: + plot_model(cube, attributes, cfg) + + return cubes, cubes_out + + +def plot_diagnostic(cubes, attributes, input_data, cfg): + """Create diagnostic data and plot it.""" + if cfg['reference']: + fig = plt.figure(figsize=(14, 9)) + title = attributes['long_name'] + fig.suptitle(title, fontsize=22) + plt.subplots_adjust(left=0.05, + bottom=0.15, + right=0.95, + top=0.90, + wspace=0.2, + hspace=0.05) + else: + fig = plt.figure(figsize=(10, 3)) + title = attributes['long_name'] + fig.suptitle(title, fontsize=16) + plt.subplots_adjust(left=0.02, + bottom=0.10, + right=0.98, + top=0.95, + wspace=0.01, + hspace=0.01) + + cmap = 'bwr' + if attributes['short_name'] == 'clt': + levels = [10, 20, 30, 40, 50, 60, 70, 80, 90] + cmap = 'viridis' + elif attributes['short_name'] == 'clivi': + levels = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + cmap = 'viridis' + elif attributes['short_name'] == 'lwp': + levels = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + cmap = 'viridis' + elif attributes['short_name'] == 'netcre': + levels = [-50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50] + cmap = 'bwr' + elif attributes['short_name'] == 'lwcre': + levels = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] + cmap = 'Reds' + elif attributes['short_name'] == 'swcre': + levels = [-90, -80, -70, -60, -50, -40, -30, -20, -10, 0] + cmap = 'Blues_r' + elif attributes['short_name'] == 'clt_diff': + levels = list(np.arange(-30, 31, 2.5)) + elif attributes['short_name'] == 'clivi_diff': + levels = list(np.arange(-0.1, 0.105, 0.01)) + elif attributes['short_name'] == 'lwp_diff': + levels = list(np.arange(-0.1, 0.105, 0.01)) + elif attributes['short_name'] in [ + 'netcre_diff', 'lwcre_diff', 'swcre_diff' + ]: + levels = list(np.arange(-30, 31, 2.5)) + else: + levels = list(np.linspace(min(cubes), max(cubes), 10)) + + for cube in cubes: + logger.info("Plotting %s %s of group %s", cube.attributes['dataset'], + attributes['short_name'], + cube.attributes['variable_group']) + mean = area_weighted_mean(cube) + + legend = cube.attributes['variable_group'] + + if cfg['reference']: + ipanel = PANEL.get(legend, None) + else: + ipanel = PANEL_woOBS.get(legend, None) + + plt.subplot(ipanel, projection=ccrs.Robinson()) + + im = iplt.contourf(cube, levels=levels, cmap=cmap, extend='both') + + plt.gca().coastlines() + + if cfg['reference']: + plt.title(legend, fontsize=18) + ipanel_label = PANEL_LABELS.get(legend, None) + plt.title(ipanel_label, fontsize=22, loc='left') + fsize = 14 + else: + plt.title(legend, fontsize=9) + ipanel_label = PANEL_LABELS_woOBS.get(legend, None) + plt.title(ipanel_label, fontsize=12, loc='left') + fsize = 8 + if attributes['short_name'] in ['clt', 'netcre']: + plt.title(f'mean = {mean.data:.1f} ', + fontsize=fsize, + loc='right') + elif attributes['short_name'] in ['clivi', 'lwp']: + plt.title(f'mean = {mean.data:.3f} ', + fontsize=fsize, + loc='right') + elif attributes['short_name'] in ['clivi_diff', 'lwp_diff']: + plt.title(f'bias = {mean.data:.3f} ', + fontsize=fsize, + loc='right') + elif attributes['short_name'] in ['clt_diff', 'netcre_diff']: + plt.title(f'bias = {mean.data:.1f} ', + fontsize=fsize, + loc='right') + else: + plt.title(f'{mean.data:.1f} ', fontsize=fsize, loc='right') + + if cfg['reference']: + cbar_ax = fig.add_axes([0.2, 0.08, 0.6, 0.03]) + colorbar = fig.colorbar(im, cax=cbar_ax, orientation='horizontal') + else: + cbar_ax = fig.add_axes([0.2, 0.18, 0.6, 0.03]) + colorbar = fig.colorbar(im, cax=cbar_ax, orientation='horizontal') + + if cubes[0].var_name == "clivi": + colorbar.set_label('iwp / ' + cubes[0].units.origin) + else: + colorbar.set_label(cubes[0].var_name + ' / ' + cubes[0].units.origin) + if attributes['short_name'] == 'clt': + ticks = [10, 20, 30, 40, 50, 60, 70, 80, 90] + elif attributes['short_name'] == 'clivi': + ticks = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + elif attributes['short_name'] == 'lwp': + ticks = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + elif attributes['short_name'] == 'netcre': + ticks = [-50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50] + elif attributes['short_name'] == 'lwcre': + ticks = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] + elif attributes['short_name'] == 'swcre': + ticks = [-90, -80, -70, -60, -50, -40, -30, -20, -10, 0] + + elif attributes['short_name'] == 'clt_diff': + ticks = list(np.arange(-30, 31, 5)) + elif attributes['short_name'] == 'clivi_diff': + ticks = [ + -0.1, -0.08, -0.06, -0.04, -0.02, 0., 0.02, 0.04, 0.06, 0.08, 0.1 + ] + elif attributes['short_name'] == 'lwp_diff': + ticks = [ + -0.1, -0.08, -0.06, -0.04, -0.02, 0., 0.02, 0.04, 0.06, 0.08, 0.1 + ] + elif attributes['short_name'] in [ + 'netcre_diff', 'lwcre_diff', 'swcre_diff' + ]: + ticks = list(np.arange(-30, 31, 5)) + else: + ticks = levels + + colorbar.set_ticks(ticks) + colorbar.set_ticklabels([str(tick) for tick in ticks]) + + # Save the data and the plot + provenance_record = get_provenance_record( + attributes, ancestor_files=[d['filename'] for d in input_data]) + basename = 'map_' + attributes['short_name'] + + save_data(basename, provenance_record, cfg, cubes) + save_figure(basename, provenance_record, cfg) + + +def get_dataframe(cubes, cube_obs): + """Create dataframe.""" + df = pd.DataFrame(columns=['Dataset', 'Group', 'Statistic', 'Value']) + idf = 0 + + for cube in cubes: + dataset = cube.attributes['dataset'] + group = cube.attributes['variable_group'] + logger.info("Computing statistics of dataset %s", dataset) + + mean = area_weighted_mean(cube) + bias = calculate_bias(cube, cube_obs) + rmsd = calculate_rmsd(cube, cube_obs) + corr = calculate_corr(cube, cube_obs) + + df.loc[idf] = [dataset, group, 'Mean', mean.data] + idf = idf + 1 + df.loc[idf] = [dataset, group, 'Bias', bias.data] + idf = idf + 1 + df.loc[idf] = [dataset, group, 'RMSD', rmsd.data] + idf = idf + 1 + df.loc[idf] = [dataset, group, 'Corr', corr.data] + idf = idf + 1 + + return df + + +def write_statistics(df, attributes, cfg): + """Write statistics in csv file.""" + df['Value'] = df['Value'].astype(str).astype(float) + + basename = "statistic_all_" + attributes['short_name'] + csv_path = get_diagnostic_filename(basename, cfg).replace('.nc', '.csv') + df.to_csv(csv_path) + logger.info("Wrote %s", csv_path) + + stat = df.groupby(['Statistic', 'Group'])['Value'].describe() + basename = "statistic_" + attributes['short_name'] + csv_path = get_diagnostic_filename(basename, cfg).replace('.nc', '.csv') + stat.to_csv(csv_path) + logger.info("Wrote %s", csv_path) + + +def bootstrapping(cubes, cube_obs, all_groups, attributes, cfg): + """Calculate bootstrapping.""" + logger.info("Bootstrapping") + + for group in all_groups: + if group != 'OBS': + logger.info("Processing group %s", group) + cubes_part = {} + datasets = [] + for cube in cubes: + if cube.attributes['variable_group'] == group: + dataset = cube.attributes['dataset'] + cubes_part[dataset] = cube + datasets.append(dataset) + + nsample = 1000 + sample_stat = pd.DataFrame( + columns=['Mean', 'Bias', 'RMSD', 'Corr']) + + ncubes = len(cubes_part) + array = list(np.arange(0, ncubes)) + for iboot in range(0, nsample): + cube = cubes_part[datasets[0]].copy() + ires = [secrets.choice(array) for _ in range(len(array))] + for i, icube in enumerate(ires): + if i == 0: + cube = cubes_part[datasets[icube]].copy() + else: + cube += cubes_part[datasets[icube]] + cube.data = cube.data / ncubes + sample_stat.loc[iboot] = [ + area_weighted_mean(cube).data, + calculate_bias(cube, cube_obs).data, + calculate_rmsd(cube, cube_obs).data, + calculate_corr(cube, cube_obs).data + ] + + sample_stat = sample_stat.astype(float) + stat = sample_stat.describe() + basename = f"bootstrapping_{attributes['short_name']}_{group}" + csv_path = (get_diagnostic_filename(basename, + cfg).replace('.nc', '.csv')) + stat.to_csv(csv_path) + logger.info("Wrote %s", csv_path) + + +def main(cfg): + """Run diagnostic.""" + cfg = deepcopy(cfg) + cfg.setdefault('plot_each_model', False) + cfg.setdefault('plot_bias', False) + + input_data = list(cfg['input_data'].values()) + + groups = group_metadata(input_data, 'variable_group', sort='dataset') + attributes = next(iter(extract_variables(cfg).values())) + all_groups = list(group_metadata(input_data, 'variable_group')) + + # Read data + cubes, cubes_out = read_data(groups, cfg) + + # Plotting climatologies + plot_diagnostic(cubes_out, attributes, input_data, cfg) + + if cfg['reference']: + # Compute bias plots + cube_obs = cubes_out.extract_cube( + iris.Constraint(cube_func=lambda cube: cube.attributes[ + 'variable_group'] == 'OBS')) + + # Bootstrapping + bootstrapping(cubes, cube_obs, all_groups, attributes, cfg) + + # Compute statistics + df = get_dataframe(cubes, cube_obs) + + # write statistics + write_statistics(df, attributes, cfg) + + # compute bias + cubes_diff = iris.cube.CubeList() + attributes['short_name'] = attributes['short_name'] + "_diff" + + if cfg['plot_bias']: + for cube in cubes_out: + if (cube.attributes['variable_group'] != 'OBS' + or cube.attributes['dataset'] != 'MultiModelMean'): + logger.info("Processing %s of group %s", + cube.attributes['dataset'], + cube.attributes['variable_group']) + bias = calculate_bias(cube, cube_obs) + rmsd = calculate_rmsd(cube, cube_obs) + corr = calculate_corr(cube, cube_obs) + cube_diff = cube - cube_obs + cube_diff.attributes = cube.attributes + cube_diff.var_name = cube.var_name + cube_diff.attributes['short_name'] = attributes[ + 'short_name'] + cubes_diff.append(cube_diff) + logger.info('%s : bias = %f, rmsd = %f, corr = %f', + cube.attributes['variable_group'], bias.data, + rmsd.data, corr.data) + + # Plotting biases + plot_diagnostic(cubes_diff, attributes, input_data, cfg) + + +if __name__ == '__main__': + + with run_diagnostic() as config: + main(config) diff --git a/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_zonal.py b/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_zonal.py new file mode 100644 index 0000000000..7bb71eb54f --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_zonal.py @@ -0,0 +1,486 @@ +"""Python diagnostic for plotting zonal averages.""" +import logging +from copy import deepcopy +from pathlib import Path + +import iris +import iris.quickplot as qplt +import matplotlib.pyplot as plt +import numpy as np + +from esmvaltool.diag_scripts.shared import ( + group_metadata, + run_diagnostic, + save_data, + save_figure, + select_metadata, +) + +logger = logging.getLogger(Path(__file__).stem) + +VAR_NAMES = { + 'clt': 'total_cloud_fraction', + 'clivi': 'ice_water_path', + 'lwp': 'liquid_water_path', + 'swcre': 'shortwave_cloud_radiative_effect', + 'lwcre': 'longwave_cloud_radiative_effect', + 'netcre': 'net_cloud_radiative_effect', +} +LINE_LEGEND = { + 'ECS_high_hist': 'ECS_high', + 'ECS_med_hist': 'ECS_med', + 'ECS_low_hist': 'ECS_low', +} +LINE_COLOR = { + 'ECS_high_hist': 'royalblue', + 'ECS_high_scen': 'royalblue', + 'ECS_med_hist': 'green', + 'ECS_med_scen': 'green', + 'ECS_low_hist': 'orange', + 'ECS_low_scen': 'orange', + 'CMIP6': 'firebrick', + 'CMIP5': 'royalblue', + 'CMIP3': 'darkcyan', + 'OBS': 'black' +} +LINE_DASH = { + 'ECS_high_hist': 'solid', + 'ECS_high_scen': 'dashed', + 'ECS_med_hist': 'solid', + 'ECS_med_scen': 'dashed', + 'ECS_low_hist': 'solid', + 'ECS_low_scen': 'dashed', + 'CMIP6': 'solid', + 'CMIP5': 'solid', + 'CMIP3': 'solid', + 'OBS': 'solid' +} + + +def get_provenance_record(short_name, ancestor_files): + """Create a provenance record describing the diagnostic data and plot.""" + caption = (f"Zonally averaged group means of {short_name} in the upper" + "panel and the corresponding relative differences in lower" + "panel.") + + record = { + 'caption': caption, + 'statistics': ['mean'], + 'domains': ['global'], + 'plot_types': ['zonal'], + 'authors': [ + 'bock_lisa', + ], + 'references': [ + 'bock24acp', + ], + 'ancestors': ancestor_files, + } + return record + + +def _get_multi_model_mean(cubes, var): + """Compute multi-model mean.""" + logger.debug("Calculating multi-model mean") + datasets = [] + mmm = [] + for (dataset_name, cube) in cubes.items(): + datasets.append(dataset_name) + mmm.append(cube.data) + mmm = np.ma.array(mmm) + dataset_0 = list(cubes.keys())[0] + mmm_cube = cubes[dataset_0].copy(data=np.ma.mean(mmm, axis=0)) + attributes = { + 'dataset': 'MultiModelMean', + 'short_name': var, + 'datasets': '|'.join(datasets), + } + mmm_cube.attributes = attributes + return mmm_cube + + +def _get_multi_model_quantile(cubes, var, quantile): + """Compute multi-model quantile.""" + logger.debug("Calculating multi-model %s quantile", quantile) + datasets = [] + mmq = [] + for (dataset_name, cube) in cubes.items(): + datasets.append(dataset_name) + mmq.append(cube.data) + mmq = np.ma.array(mmq) + dataset_0 = list(cubes.keys())[0] + mmq_cube = cubes[dataset_0].copy(data=np.quantile(mmq, quantile, axis=0)) + attributes = { + 'dataset': 'MultiModel' + str(quantile), + 'short_name': var, + 'datasets': '|'.join(datasets), + } + mmq_cube.attributes = attributes + return mmq_cube + + +def compute_diagnostic(filename): + """Compute an example diagnostic.""" + logger.debug("Loading %s", filename) + cube = iris.load_cube(filename) + + if cube.var_name == 'cli': + cube.convert_units('g/kg') + elif cube.var_name == 'clw': + cube.convert_units('g/kg') + + logger.debug("Reading %s", filename) + cube = iris.util.squeeze(cube) + return cube + + +def compute_diff(filename1, filename2): + """Compute difference between two cubes.""" + logger.debug("Loading %s", filename1) + cube1 = iris.load_cube(filename1) + cube2 = iris.load_cube(filename2) + + if cube1.var_name == 'cli': + cube1.convert_units('g/kg') + cube2.convert_units('g/kg') + elif cube1.var_name == 'clw': + cube1.convert_units('g/kg') + cube2.convert_units('g/kg') + + cube = cube2 - cube1 + cube.metadata = cube1.metadata + cube = iris.util.squeeze(cube) + return cube + + +def compute_diff_temp(input_data, group, dataset, plot_type): + """Compute relative change per temperture change.""" + dataset_name = dataset['dataset'] + var = dataset['short_name'] + + input_file_1 = dataset['filename'] + + var_data_2 = select_metadata(input_data, + short_name=var, + dataset=dataset_name, + variable_group=group[1]) + if not var_data_2: + raise ValueError( + f"No '{var}' data for '{dataset_name}' in '{group[1]}' available") + + input_file_2 = var_data_2[0]['filename'] + + if plot_type == 'zonal': + ta_data_1 = select_metadata(input_data, + short_name='tas', + dataset=dataset_name, + variable_group='tas_' + group[0]) + ta_data_2 = select_metadata(input_data, + short_name='tas', + dataset=dataset_name, + variable_group='tas_' + group[1]) + elif plot_type == 'height': + ta_data_1 = select_metadata(input_data, + short_name='ta', + dataset=dataset_name, + variable_group='ta_' + group[0]) + ta_data_2 = select_metadata(input_data, + short_name='ta', + dataset=dataset_name, + variable_group='ta_' + group[1]) + else: + raise ValueError(f"The plot_type '{var}' is not implemented.") + + if not ta_data_1: + raise ValueError(f"No temperature data for '{dataset_name}' " + f"in '{group[0]}' available") + if not ta_data_2: + raise ValueError(f"No temperature data for '{dataset_name}' " + f"in '{group[1]}' available") + input_file_ta_1 = ta_data_1[0]['filename'] + input_file_ta_2 = ta_data_2[0]['filename'] + + cube = compute_diagnostic(input_file_1) + if var in ['lwp', 'clivi', 'clw', 'cli']: + cube.data[cube.data < 0.001] = np.nan + elif var in ['cl']: + cube.data[cube.data < 0.1] = np.nan + elif var in ['netcre', 'swcre', 'lwcre']: + cube.data[abs(cube.data) < 1.] = np.nan + + cube_diff = compute_diff(input_file_1, input_file_2) + cube_ta_diff = compute_diff(input_file_ta_1, input_file_ta_2) + + cube_ta_diff.data[cube_ta_diff.data < 1.] = np.nan + + cube_diff = (100. * (cube_diff / iris.analysis.maths.abs(cube)) / + cube_ta_diff) + + cube_diff.metadata = cube.metadata + + if plot_type == 'zonal': + logger.debug("Computing zonal mean") + cube_diff = cube_diff.collapsed('longitude', iris.analysis.MEAN) + elif plot_type == 'height': + logger.debug("Computing field mean") + grid_areas = iris.analysis.cartography.area_weights(cube_diff) + cube_diff = cube_diff.collapsed(['longitude', 'latitude'], + iris.analysis.MEAN, + weights=grid_areas) + else: + raise ValueError(f"Plot type {plot_type} is not implemented.") + + cube_diff.units = '%/K' + + return cube_diff + + +def plot_diagnostic(cube, legend, plot_type): + """Create diagnostic data and plot it.""" + cube_label = legend + line_color = LINE_COLOR.get(legend, legend) + line_dash = LINE_DASH.get(legend, legend) + + plt.subplot(211) + + if plot_type == 'height': + cube.coord('air_pressure').convert_units('hPa') + y_axis = cube.coord('air_pressure') + qplt.plot(cube, + y_axis, + label=cube_label, + color=line_color, + linestyle=line_dash) + else: + lat = cube.coord('latitude') + qplt.plot(lat, + cube, + label=cube_label, + color=line_color, + linestyle=line_dash) + + logger.info("Plotting %s", legend) + + +def plot_diagnostic_diff(cube, legend, plot_type): + """Create diagnostic data and plot it.""" + cube_label = LINE_LEGEND.get(legend, legend) + line_color = LINE_COLOR.get(legend, legend) + line_dash = LINE_DASH.get(legend, legend) + + plt.subplot(212) + + if cube.var_name == 'pr': + cube.units = cube.units / 'kg m-3' + cube.data = cube.core_data() / 1000. + cube.convert_units('mm day-1') + elif cube.var_name == 'cli': + cube.convert_units('g/kg') + elif cube.var_name == 'clw': + cube.convert_units('g/kg') + + if plot_type == 'height': + cube.coord('air_pressure').convert_units('hPa') + y_axis = cube.coord('air_pressure') + qplt.plot(cube, + y_axis, + label=cube_label, + color=line_color, + linestyle=line_dash) + else: + lat = cube.coord('latitude') + qplt.plot(lat, + cube, + label=cube_label, + color=line_color, + linestyle=line_dash) + + logger.info("Plotting %s", legend) + + +def plot_errorband(cube1, cube2, legend, plot_type): + """Create diagnostic data and plot it.""" + line_color = LINE_COLOR.get(legend, legend) + line_dash = LINE_DASH.get(legend, legend) + + plt.subplot(211) + + if cube1.var_name == 'pr': + cube1.units = cube1.units / 'kg m-3' + cube1.data = cube1.core_data() / 1000. + cube1.convert_units('mm day-1') + cube2.units = cube2.units / 'kg m-3' + cube2.data = cube2.core_data() / 1000. + cube2.convert_units('mm day-1') + elif cube1.var_name == 'cli': + cube1.convert_units('g/kg') + cube2.convert_units('g/kg') + elif cube1.var_name == 'clw': + cube1.convert_units('g/kg') + cube2.convert_units('g/kg') + + if plot_type == 'height': + cube1.coord('air_pressure').convert_units('hPa') + cube2.coord('air_pressure').convert_units('hPa') + y_axis = cube1.coord('air_pressure').points + plt.fill_betweenx(y_axis, + cube1.data, + cube2.data, + color=line_color, + linestyle=line_dash, + alpha=.1) + else: + lat = cube1.coord('latitude').points + plt.fill_between(lat, + cube1.data, + cube2.data, + color=line_color, + linestyle=line_dash, + alpha=.1) + logger.info("Plotting %s", legend) + + +def main(cfg): + """Run diagnostic.""" + cfg = deepcopy(cfg) + cfg.setdefault('filename_attach', 'base') + + plot_type = cfg['plot_type'] + + input_data = list(cfg['input_data'].values()) + + groups = group_metadata(input_data, 'variable_group', sort='dataset') + + plt.figure(figsize=(8, 12)) + + for group_name in groups: + if ('tas_' not in group_name) and ('ta_' not in group_name): + logger.info("Processing variable %s", group_name) + + dataset_names = [] + cubes = {} + + for dataset in groups[group_name]: + + dataset_name = dataset['dataset'] + var = dataset['short_name'] + + if dataset_name not in [ + 'MultiModelMean', 'MultiModelP5', 'MultiModelP95' + ]: + + logger.info("Loop dataset %s", dataset_name) + + input_file = dataset['filename'] + cube = compute_diagnostic(input_file) + logger.debug("Computing zonal mean") + if plot_type == 'zonal': + cube = cube.collapsed('longitude', iris.analysis.MEAN) + elif plot_type == 'height': + grid_areas = ( + iris.analysis.cartography.area_weights(cube)) + cube = cube.collapsed(['longitude', 'latitude'], + iris.analysis.MEAN, + weights=grid_areas) + else: + raise ValueError( + f"Plot type {plot_type} is not implemented.") + + cubes[dataset_name] = cube + + cube_mmm = _get_multi_model_mean(cubes, var) + + plot_diagnostic(cube_mmm, group_name, plot_type) + + cube_p5 = _get_multi_model_quantile(cubes, var, 0.05) + cube_p95 = _get_multi_model_quantile(cubes, var, 0.95) + + plot_errorband(cube_p5, cube_p95, group_name, plot_type) + + if plot_type == 'height': + plt.ylim(1000., 100.) + plt.yscale('log') + plt.yticks([1000., 800., 600., 400., 300., 200., 100.], + [1000, 800, 600, 400, 300, 200, 100]) + + long_name = input_data[0]['long_name'] + if plot_type == 'height': + title = 'Vertical mean of ' + long_name + elif plot_type == 'zonal': + if long_name == 'Total Cloud Cover Percentage': + title = 'Zonal mean of Total Cloud Fraction' + else: + title = 'Zonal mean of ' + long_name + else: + title = long_name + + plt.title(title) + plt.legend(ncol=1) + plt.grid(True) + + for group_name in cfg['group_by']: + + logger.info("Processing group %s", group_name[0]) + + dataset_names = [] + cubes_diff = {} + + for dataset in groups[group_name[0]]: + dataset_name = dataset['dataset'] + var = dataset['short_name'] + + if dataset_name not in [ + 'MultiModelMean', 'MultiModelP5', 'MultiModelP95' + ]: + logger.info("Loop dataset %s", dataset_name) + dataset_names.append(dataset_name) + + cube_diff = compute_diff_temp(input_data, group_name, dataset, + plot_type) + + cubes_diff[dataset_name] = cube_diff + + cube_mmm = _get_multi_model_mean(cubes_diff, var) + + plot_diagnostic_diff(cube_mmm, group_name[0], plot_type) + + if plot_type == 'height': + plt.xlim(0., 1.) + plt.ylim(1000., 100.) + plt.yscale('log') + plt.yticks([1000., 800., 600., 400., 300., 200., 100.], + [1000, 800, 600, 400, 300, 200, 100]) + plt.axvline(x=0, ymin=0., ymax=1., color='black', linewidth=3) + title = 'Difference of vertical mean of ' + long_name + elif plot_type == 'zonal': + plt.axhline(y=0, xmin=-90., xmax=90., color='black', linewidth=3) + title = 'Difference of zonal mean of ' + long_name + else: + title = long_name + + plt.title(title) + plt.legend(ncol=1) + plt.grid(True) + + short_name = input_data[0]['short_name'] + provenance_record = get_provenance_record( + short_name, ancestor_files=[d['filename'] for d in input_data]) + + if plot_type == 'height': + basename = ('level_diff_' + short_name + '_' + + cfg['filename_attach']) + else: + basename = ('zonal_diff_' + short_name + '_' + + cfg['filename_attach']) + + # Save the data used for the plot + save_data(basename, provenance_record, cfg, cube_mmm) + + # And save the plot + save_figure(basename, provenance_record, cfg) + + +if __name__ == '__main__': + + with run_diagnostic() as config: + main(config) diff --git a/esmvaltool/diag_scripts/ensclus/__init__.py b/esmvaltool/diag_scripts/ensclus/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/esmvaltool/diag_scripts/monitor/multi_datasets.py b/esmvaltool/diag_scripts/monitor/multi_datasets.py index 41f238a64e..a5b3afca2d 100644 --- a/esmvaltool/diag_scripts/monitor/multi_datasets.py +++ b/esmvaltool/diag_scripts/monitor/multi_datasets.py @@ -84,6 +84,12 @@ group_variables_by: str, optional (default: 'short_name') Facet which is used to create variable groups. For each variable group, an individual plot is created. +matplotlib_rc_params: dict, optional (default: {}) + Optional :class:`matplotlib.RcParams` used to customize matplotlib plots. + Options given here will be passed to :func:`matplotlib.rc_context` and used + for all plots produced with this diagnostic. Note: fontsizes specified here + might be overwritten by the plot-type-specific option ``fontsize`` (see + below). plots: dict, optional Plot types plotted by this diagnostic (see list above). Dictionary keys must be ``timeseries``, ``annual_cycle``, ``map``, ``zonal_mean_profile``, @@ -206,9 +212,11 @@ (top right panel). Thus, the use of the ``plot_kwargs`` ``vmin`` and ``vmax`` or ``levels`` is highly recommend when using this ``common_cbar: true``. This option has no effect if no reference dataset is given. -fontsize: int, optional (default: 10) +fontsize: int, optional (default: None) Fontsize used for ticks, labels and titles. For the latter, use the given - fontsize plus 2. Does not affect suptitles. + fontsize plus 2. Does not affect suptitles. If not given, use default + matplotlib values. For a more fine-grained definition of fontsizes, use the + option ``matplotlib_rc_params`` (see above). gridline_kwargs: dict, optional Optional keyword arguments for grid lines. By default, ``color: lightgrey, alpha: 0.5`` are used. Use ``gridline_kwargs: false`` to not show grid @@ -296,9 +304,11 @@ (top right panel). Thus, the use of the ``plot_kwargs`` ``vmin`` and ``vmax`` or ``levels`` is highly recommend when using this ``common_cbar: true``. This option has no effect if no reference dataset is given. -fontsize: int, optional (default: 10) +fontsize: int, optional (default: None) Fontsize used for ticks, labels and titles. For the latter, use the given - fontsize plus 2. Does not affect suptitles. + fontsize plus 2. Does not affect suptitles. If not given, use default + matplotlib values. For a more fine-grained definition of fontsizes, use the + option ``matplotlib_rc_params`` (see above). log_y: bool, optional (default: True) Use logarithmic Y-axis. plot_func: str, optional (default: 'contourf') @@ -448,9 +458,11 @@ (top right panel). Thus, the use of the ``plot_kwargs`` ``vmin`` and ``vmax`` or ``levels`` is highly recommend when using this ``common_cbar: true``. This option has no effect if no reference dataset is given. -fontsize: int, optional (default: 10) +fontsize: int, optional (default: None) Fontsize used for ticks, labels and titles. For the latter, use the given - fontsize plus 2. Does not affect suptitles. + fontsize plus 2. Does not affect suptitles. If not given, use default + matplotlib values. For a more fine-grained definition of fontsizes, use the + option ``matplotlib_rc_params`` (see above). log_y: bool, optional (default: True) Use logarithmic Y-axis. plot_func: str, optional (default: 'contourf') @@ -535,9 +547,11 @@ (top right panel). Thus, the use of the ``plot_kwargs`` ``vmin`` and ``vmax`` or ``levels`` is highly recommend when using this ``common_cbar: true``. This option has no effect if no reference dataset is given. -fontsize: int, optional (default: 10) +fontsize: int, optional (default: None) Fontsize used for ticks, labels and titles. For the latter, use the given - fontsize plus 2. Does not affect suptitles. + fontsize plus 2. Does not affect suptitles. If not given, use default + matplotlib values. For a more fine-grained definition of fontsizes, use the + option ``matplotlib_rc_params`` (see above). plot_func: str, optional (default: 'contourf') Plot function used to plot the profiles. Must be a function of :mod:`iris.plot` that supports plotting of 2D cubes with coordinates @@ -654,6 +668,7 @@ def __init__(self, config): self.cfg.setdefault('facet_used_for_labels', 'dataset') self.cfg.setdefault('figure_kwargs', {'constrained_layout': True}) self.cfg.setdefault('group_variables_by', 'short_name') + self.cfg.setdefault('matplotlib_rc_params', {}) self.cfg.setdefault('savefig_kwargs', { 'bbox_inches': 'tight', 'dpi': 300, @@ -729,7 +744,7 @@ def __init__(self, config): ) self.plots[plot_type].setdefault('cbar_kwargs_bias', {}) self.plots[plot_type].setdefault('common_cbar', False) - self.plots[plot_type].setdefault('fontsize', 10) + self.plots[plot_type].setdefault('fontsize', None) self.plots[plot_type].setdefault('gridline_kwargs', {}) self.plots[plot_type].setdefault('plot_func', 'contourf') self.plots[plot_type].setdefault('plot_kwargs', {}) @@ -763,7 +778,7 @@ def __init__(self, config): ) self.plots[plot_type].setdefault('cbar_kwargs_bias', {}) self.plots[plot_type].setdefault('common_cbar', False) - self.plots[plot_type].setdefault('fontsize', 10) + self.plots[plot_type].setdefault('fontsize', None) self.plots[plot_type].setdefault('log_y', True) self.plots[plot_type].setdefault('plot_func', 'contourf') self.plots[plot_type].setdefault('plot_kwargs', {}) @@ -809,7 +824,7 @@ def __init__(self, config): {'orientation': 'vertical'}) self.plots[plot_type].setdefault('cbar_kwargs_bias', {}) self.plots[plot_type].setdefault('common_cbar', False) - self.plots[plot_type].setdefault('fontsize', 10) + self.plots[plot_type].setdefault('fontsize', None) self.plots[plot_type].setdefault('log_y', True) self.plots[plot_type].setdefault('plot_func', 'contourf') self.plots[plot_type].setdefault('plot_kwargs', {}) @@ -838,7 +853,7 @@ def __init__(self, config): ) self.plots[plot_type].setdefault('cbar_kwargs_bias', {}) self.plots[plot_type].setdefault('common_cbar', False) - self.plots[plot_type].setdefault('fontsize', 10) + self.plots[plot_type].setdefault('fontsize', None) self.plots[plot_type].setdefault('plot_func', 'contourf') self.plots[plot_type].setdefault('plot_kwargs', {}) self.plots[plot_type].setdefault('plot_kwargs_bias', {}) @@ -873,7 +888,9 @@ def __init__(self, config): def _add_colorbar(self, plot_type, plot_left, plot_right, axes_left, axes_right, dataset_left, dataset_right): """Add colorbar(s) for plots.""" - fontsize = self.plots[plot_type]['fontsize'] + fontsize = ( + self.plots[plot_type]['fontsize'] or mpl.rcParams['axes.labelsize'] + ) cbar_kwargs = self._get_cbar_kwargs(plot_type) cbar_label_left = self._get_cbar_label(plot_type, dataset_left) cbar_label_right = self._get_cbar_label(plot_type, dataset_right) @@ -1007,13 +1024,15 @@ def _add_stats(self, plot_type, axes, dim_coords, dataset, def _get_custom_mpl_rc_params(self, plot_type): """Get custom matplotlib rcParams.""" + custom_rc_params = {} fontsize = self.plots[plot_type]['fontsize'] - custom_rc_params = { - 'axes.titlesize': fontsize + 2.0, - 'axes.labelsize': fontsize, - 'xtick.labelsize': fontsize, - 'ytick.labelsize': fontsize, - } + if fontsize is not None: + custom_rc_params.update({ + 'axes.titlesize': fontsize + 2.0, + 'axes.labelsize': fontsize, + 'xtick.labelsize': fontsize, + 'ytick.labelsize': fontsize, + }) return custom_rc_params def _get_label(self, dataset): @@ -1171,7 +1190,10 @@ def _plot_map_with_ref(self, plot_func, dataset, ref_dataset): projection = self._get_map_projection() plot_kwargs = self._get_plot_kwargs(plot_type, dataset) gridline_kwargs = self._get_gridline_kwargs(plot_type) - fontsize = self.plots[plot_type]['fontsize'] + fontsize = ( + self.plots[plot_type]['fontsize'] or + mpl.rcParams['axes.labelsize'] + ) # Plot dataset (top left) axes_data = fig.add_subplot(gridspec[0:2, 0:2], @@ -1319,7 +1341,10 @@ def _plot_map_without_ref(self, plot_func, dataset): self._add_stats(plot_type, axes, dim_coords_dat, dataset) # Setup colorbar - fontsize = self.plots[plot_type]['fontsize'] + fontsize = ( + self.plots[plot_type]['fontsize'] or + mpl.rcParams['axes.labelsize'] + ) colorbar = fig.colorbar(plot_map, ax=axes, **self._get_cbar_kwargs(plot_type)) colorbar.set_label(self._get_cbar_label(plot_type, dataset), @@ -1363,7 +1388,10 @@ def _plot_zonal_mean_profile_with_ref(self, plot_func, dataset, # Options used for all subplots plot_kwargs = self._get_plot_kwargs(plot_type, dataset) - fontsize = self.plots[plot_type]['fontsize'] + fontsize = ( + self.plots[plot_type]['fontsize'] or + mpl.rcParams['axes.labelsize'] + ) # Plot dataset (top left) axes_data = fig.add_subplot(gridspec[0:2, 0:2]) @@ -1472,7 +1500,10 @@ def _plot_zonal_mean_profile_without_ref(self, plot_func, dataset): self._add_stats(plot_type, axes, dim_coords_dat, dataset) # Setup colorbar - fontsize = self.plots[plot_type]['fontsize'] + fontsize = ( + self.plots[plot_type]['fontsize'] or + mpl.rcParams['axes.labelsize'] + ) colorbar = fig.colorbar(plot_zonal_mean_profile, ax=axes, **self._get_cbar_kwargs(plot_type)) colorbar.set_label(self._get_cbar_label(plot_type, dataset), @@ -1529,7 +1560,10 @@ def _plot_hovmoeller_z_vs_time_without_ref(self, plot_func, dataset): self._add_stats(plot_type, axes, dim_coords_dat, dataset) # Setup colorbar - fontsize = self.plots[plot_type]['fontsize'] + fontsize = ( + self.plots[plot_type]['fontsize'] or + mpl.rcParams['axes.labelsize'] + ) colorbar = fig.colorbar(plot_hovmoeller, ax=axes, **self._get_cbar_kwargs(plot_type)) @@ -1592,7 +1626,10 @@ def _plot_hovmoeller_z_vs_time_with_ref(self, plot_func, dataset, # Options used for all subplots plot_kwargs = self._get_plot_kwargs(plot_type, dataset) - fontsize = self.plots[plot_type]['fontsize'] + fontsize = ( + self.plots[plot_type]['fontsize'] or + mpl.rcParams['axes.labelsize'] + ) # Plot dataset (top left) axes_data = fig.add_subplot(gridspec[0:2, 0:2]) @@ -1710,7 +1747,10 @@ def _plot_hovmoeller_time_vs_lat_or_lon_with_ref(self, plot_func, dataset, # Options used for all subplots plot_kwargs = self._get_plot_kwargs(plot_type, dataset) - fontsize = self.plots[plot_type]['fontsize'] + fontsize = ( + self.plots[plot_type]['fontsize'] or + mpl.rcParams['axes.labelsize'] + ) # Plot dataset (top left) axes_data = fig.add_subplot(gridspec[0:2, 0:2]) @@ -1837,7 +1877,10 @@ def _plot_hovmoeller_time_vs_lat_or_lon_without_ref(self, plot_func, plot_hovmoeller = plot_func(cube, **plot_kwargs) # Setup colorbar - fontsize = self.plots[plot_type]['fontsize'] + fontsize = ( + self.plots[plot_type]['fontsize'] or + mpl.rcParams['axes.labelsize'] + ) colorbar = fig.colorbar(plot_hovmoeller, ax=axes, **self._get_cbar_kwargs(plot_type)) colorbar.set_label(self._get_cbar_label(plot_type, dataset), @@ -2592,16 +2635,17 @@ def create_hovmoeller_time_vs_lat_or_lon_plot(self, datasets): def compute(self): """Plot preprocessed data.""" - for (var_key, datasets) in self.grouped_input_data.items(): - logger.info("Processing variable %s", var_key) - self.create_timeseries_plot(datasets) - self.create_annual_cycle_plot(datasets) - self.create_map_plot(datasets) - self.create_zonal_mean_profile_plot(datasets) - self.create_1d_profile_plot(datasets) - self.create_variable_vs_lat_plot(datasets) - self.create_hovmoeller_z_vs_time_plot(datasets) - self.create_hovmoeller_time_vs_lat_or_lon_plot(datasets) + with mpl.rc_context(self.cfg['matplotlib_rc_params']): + for (var_key, datasets) in self.grouped_input_data.items(): + logger.info("Processing variable %s", var_key) + self.create_timeseries_plot(datasets) + self.create_annual_cycle_plot(datasets) + self.create_map_plot(datasets) + self.create_zonal_mean_profile_plot(datasets) + self.create_1d_profile_plot(datasets) + self.create_variable_vs_lat_plot(datasets) + self.create_hovmoeller_z_vs_time_plot(datasets) + self.create_hovmoeller_time_vs_lat_or_lon_plot(datasets) def main(): diff --git a/esmvaltool/diag_scripts/zmnam/__init__.py b/esmvaltool/diag_scripts/zmnam/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/esmvaltool/recipes/clouds/recipe_bock24acp_fig3-4_maps.yml b/esmvaltool/recipes/clouds/recipe_bock24acp_fig3-4_maps.yml new file mode 100644 index 0000000000..88076fafed --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_bock24acp_fig3-4_maps.yml @@ -0,0 +1,218 @@ +# ESMValTool +# recipe_bock24acp_fig3-4_maps.yml +# Note: The variables LWP and IWP are commented out at the moment as a different +# standard name for this variables in CMIP5 and CMIP6 gives an error. Iris +# is working on a solution for this problem. +--- +documentation: + title: Cloud properties regarding ECS (geographical maps). + + description: | + Geographical maps of cloud properties, models are grouped in + three groups regarding their ECS. + + authors: + - bock_lisa + + maintainer: + - bock_lisa + + references: + - bock24acp + + projects: + - cmug + - esm2025 + + +YEARS: &years_hist + start_year: 1985 + end_year: 2004 + +YEARS_scen: &years_scen + start_year: 2081 + end_year: 2100 + + +DATASETS_ECS_HIGH: &datasets_ecs_high + # CMIP6 + - {dataset: CanESM5, grid: gn} + - {dataset: CESM2, grid: gn, ensemble: r4i1p1f1} + - {dataset: CESM2-WACCM, grid: gn, institute: NCAR} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2} + - {dataset: HadGEM3-GC31-LL, grid: gn, ensemble: r1i1p1f3} + - {dataset: HadGEM3-GC31-MM, grid: gn, ensemble: r1i1p1f3} + - {dataset: IPSL-CM6A-LR} + - {dataset: KACE-1-0-G} + - {dataset: NESM3, grid: gn} + - {dataset: TaiESM1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + # CMIP5 + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1, project: CMIP5} + - {dataset: HadGEM2-ES, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MIROC-ESM, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_MED: &datasets_ecs_med + # CMIP6 + - {dataset: BCC-CSM2-MR, grid: gn} + - {dataset: CMCC-CM2-SR5, grid: gn} + - {dataset: CMCC-ESM2, grid: gn} + - {dataset: FGOALS-f3-L} + - {dataset: FGOALS-g3, grid: gn} + - {dataset: GISS-E2-1-H, grid: gn} + - {dataset: MPI-ESM1-2-HR, grid: gn} + - {dataset: MPI-ESM1-2-LR, grid: gn} + - {dataset: MRI-ESM2-0, grid: gn} + # CMIP5 + - {dataset: ACCESS1-0, ensemble: r1i1p1, project: CMIP5} + - {dataset: ACCESS1-3, ensemble: r1i1p1, project: CMIP5} + - {dataset: BNU-ESM, ensemble: r1i1p1, project: CMIP5} + - {dataset: CanESM2, ensemble: r1i1p1, project: CMIP5} + - {dataset: CCSM4, ensemble: r1i1p1, project: CMIP5} + - {dataset: FGOALS-g2, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-CM3, ensemble: r1i1p1, project: CMIP5} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_LOW: &datasets_ecs_low + # CMIP6 + - {dataset: CAMS-CSM1-0, grid: gn} + - {dataset: GISS-E2-1-G, grid: gn} + - {dataset: MIROC6, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: NorESM2-LM, grid: gn, institute: NCC} + - {dataset: NorESM2-MM, grid: gn, institute: NCC} + # CMIP5 + - {dataset: bcc-csm1-1, ensemble: r1i1p1, project: CMIP5} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1, project: CMIP5} + - {dataset: GISS-E2-H, ensemble: r1i1p1, project: CMIP5} + - {dataset: GISS-E2-R, ensemble: r1i1p1, project: CMIP5} + - {dataset: inmcm4, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MIROC5, ensemble: r1i1p1, project: CMIP5} + - {dataset: MRI-CGCM3, ensemble: r1i1p1, project: CMIP5} + - {dataset: NorESM1-M, ensemble: r1i1p1, project: CMIP5} + + +preprocessors: + + lat_lon_mmm: + custom_order: true + regrid: + target_grid: 2x2 + scheme: linear + multi_model_statistics: + span: full + statistics: [mean] + climate_statistics: + operator: mean + + lat_lon: + regrid: + target_grid: 2x2 + scheme: linear + climate_statistics: + operator: mean + + +diagnostics: + + # Figure 3abc + clt_lat_lon: &lat_lon_diag + description: comparison of geographical maps + variables: + ECS_high: &var_clt + short_name: clt + preprocessor: lat_lon_mmm + mip: Amon + project: CMIP6 + exp: historical + ensemble: r1i1p1f1 + grid: gr + <<: *years_hist + additional_datasets: *datasets_ecs_high + ECS_med: + <<: *var_clt + additional_datasets: *datasets_ecs_med + ECS_low: + <<: *var_clt + additional_datasets: *datasets_ecs_low + scripts: + lat_lon: + script: clouds/clouds_ecs_groups_maps.py + group_by: variable_group + plot_each_model: false + reference: false + + + # Figure 3def + # lwp_lat_lon: + # <<: *lat_lon_diag + # variables: + # ECS_high: + # <<: *var_clt + # short_name: lwp + # derive: true + # additional_datasets: *datasets_ecs_high + # ECS_med: + # <<: *var_clt + # short_name: lwp + # derive: true + # additional_datasets: *datasets_ecs_med + # ECS_low: + # <<: *var_clt + # short_name: lwp + # derive: true + # additional_datasets: *datasets_ecs_low + + + # Figure 3ghi + # iwp_lat_lon: + # <<: *lat_lon_diag + # variables: + # ECS_high: + # <<: *var_clt + # short_name: clivi + # additional_datasets: *datasets_ecs_high + # ECS_med: + # <<: *var_clt + # short_name: clivi + # additional_datasets: *datasets_ecs_med + # ECS_low: + # <<: *var_clt + # short_name: clivi + # additional_datasets: *datasets_ecs_low + + + # Figure 4 + netcre_lat_lon: &lat_lon_cre + description: comparison of geographical maps + variables: + ECS_high: &var_cre + <<: *var_clt + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + ECS_med: + <<: *var_cre + additional_datasets: *datasets_ecs_med + ECS_low: + <<: *var_cre + additional_datasets: *datasets_ecs_low + OBS: + <<: *var_cre + preprocessor: lat_lon + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.2, + tier: 2, start_year: 2001, end_year: 2022} + scripts: + lat_lon: + script: clouds/clouds_ecs_groups_maps.py + group_by: variable_group + plot_each_model: false + reference: true diff --git a/esmvaltool/recipes/clouds/recipe_bock24acp_fig6_zonal.yml b/esmvaltool/recipes/clouds/recipe_bock24acp_fig6_zonal.yml new file mode 100644 index 0000000000..69426ffb54 --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_bock24acp_fig6_zonal.yml @@ -0,0 +1,566 @@ +# ESMValTool +# recipe_bock24acp_fig6_zonal.yml +--- +documentation: + title: Cloud properties regarding ECS (zonal plots). + + description: | + Zonal plots of cloud properties and their projected changes, + models are grouped in three groups regarding their ECS. + + authors: + - bock_lisa + + maintainer: + - lauer_axel + + references: + - bock24acp + + project: + - cmug + - esm2025 + + +YEARS_hist: &years_hist + start_year: 1985 + end_year: 2004 + +YEARS_scen: &years_scen + start_year: 2081 + end_year: 2100 + + +DATASETS_ECS_HIGH: &datasets_ecs_high + # CMIP6 + - {dataset: CanESM5, grid: gn} + - {dataset: CESM2, grid: gn, ensemble: r4i1p1f1} + - {dataset: CESM2-WACCM, grid: gn, institute: NCAR} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2} + - {dataset: HadGEM3-GC31-LL, grid: gn, ensemble: r1i1p1f3} + - {dataset: HadGEM3-GC31-MM, grid: gn, ensemble: r1i1p1f3} + - {dataset: IPSL-CM6A-LR} + - {dataset: KACE-1-0-G} + - {dataset: NESM3, grid: gn} + - {dataset: TaiESM1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + # CMIP5 + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1, project: CMIP5} + - {dataset: HadGEM2-ES, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MIROC-ESM, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_HIGH_scenario: &datasets_ecs_high_scenario + # CMIP6 + - {dataset: CanESM5, grid: gn, exp: ssp585} + - {dataset: CESM2, grid: gn, ensemble: r4i1p1f1, exp: ssp585} + - {dataset: CESM2-WACCM, grid: gn, institute: NCAR, exp: ssp585} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: HadGEM3-GC31-LL, grid: gn, ensemble: r1i1p1f3, exp: ssp585} + - {dataset: HadGEM3-GC31-MM, grid: gn, ensemble: r1i1p1f3, exp: ssp585} + - {dataset: IPSL-CM6A-LR, exp: ssp585} + - {dataset: KACE-1-0-G, exp: ssp585} + - {dataset: NESM3, grid: gn, exp: ssp585} + - {dataset: TaiESM1, grid: gn, exp: ssp585} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn, exp: ssp585} + # CMIP5 + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: HadGEM2-ES, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MIROC-ESM, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + +DATASETS_ECS_MED: &datasets_ecs_med + # CMIP6 + - {dataset: BCC-CSM2-MR, grid: gn} + - {dataset: CMCC-CM2-SR5, grid: gn} + - {dataset: CMCC-ESM2, grid: gn} + - {dataset: FGOALS-f3-L} + - {dataset: FGOALS-g3, grid: gn} + - {dataset: GISS-E2-1-H, grid: gn} + - {dataset: MPI-ESM1-2-HR, grid: gn} + - {dataset: MPI-ESM1-2-LR, grid: gn} + - {dataset: MRI-ESM2-0, grid: gn} + # CMIP5 + - {dataset: ACCESS1-0, ensemble: r1i1p1, project: CMIP5} + - {dataset: ACCESS1-3, ensemble: r1i1p1, project: CMIP5} + - {dataset: BNU-ESM, ensemble: r1i1p1, project: CMIP5} + - {dataset: CanESM2, ensemble: r1i1p1, project: CMIP5} + - {dataset: CCSM4, ensemble: r1i1p1, project: CMIP5} + - {dataset: FGOALS-g2, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-CM3, ensemble: r1i1p1, project: CMIP5} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_MED_scenario: &datasets_ecs_med_scenario + # CMIP6 + - {dataset: BCC-CSM2-MR, grid: gn, exp: ssp585} + - {dataset: CMCC-CM2-SR5, grid: gn, exp: ssp585} + - {dataset: CMCC-ESM2, grid: gn, exp: ssp585} + - {dataset: FGOALS-f3-L, exp: ssp585} + - {dataset: FGOALS-g3, grid: gn, exp: ssp585} + - {dataset: GISS-E2-1-H, grid: gn, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: MPI-ESM1-2-HR, grid: gn, exp: ssp585} + - {dataset: MPI-ESM1-2-LR, grid: gn, exp: ssp585} + - {dataset: MRI-ESM2-0, grid: gn, exp: ssp585} + # CMIP5 + - {dataset: ACCESS1-0, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: ACCESS1-3, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: BNU-ESM, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: CanESM2, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: CCSM4, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: FGOALS-g2, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GFDL-CM3, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + +DATASETS_ECS_LOW: &datasets_ecs_low + # CMIP6 + - {dataset: CAMS-CSM1-0, grid: gn} + - {dataset: GISS-E2-1-G, grid: gn} + - {dataset: MIROC6, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: NorESM2-LM, grid: gn, institute: NCC} + - {dataset: NorESM2-MM, grid: gn, institute: NCC} + # CMIP5 + - {dataset: bcc-csm1-1, ensemble: r1i1p1, project: CMIP5} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1, project: CMIP5} + - {dataset: GISS-E2-H, ensemble: r1i1p1, project: CMIP5} + - {dataset: GISS-E2-R, ensemble: r1i1p1, project: CMIP5} + - {dataset: inmcm4, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MIROC5, ensemble: r1i1p1, project: CMIP5} + - {dataset: MRI-CGCM3, ensemble: r1i1p1, project: CMIP5} + - {dataset: NorESM1-M, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_LOW_scenario: &datasets_ecs_low_scenario + # CMIP6 + - {dataset: CAMS-CSM1-0, grid: gn, exp: ssp585, end_year: 2099} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: MIROC6, grid: gn, exp: ssp585} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn, exp: ssp585} + - {dataset: NorESM2-LM, grid: gn, institute: NCC, exp: ssp585} + - {dataset: NorESM2-MM, grid: gn, institute: NCC, exp: ssp585} + # CMIP5 + - {dataset: bcc-csm1-1, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GISS-E2-H, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GISS-E2-R, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: inmcm4, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MIROC5, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MRI-CGCM3, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: NorESM1-M, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + + +preprocessors: + + zonal: + regrid: + target_grid: 2x2 + scheme: linear + climate_statistics: + operator: mean + + +diagnostics: + + # Figure 6a + clt_zonal: &zonal_diag + description: comparison of zonal mean + variables: + ECS_high_hist: &var_clt + short_name: clt + preprocessor: zonal + mip: Amon + project: CMIP6 + exp: historical + ensemble: r1i1p1f1 + grid: gr + <<: *years_hist + additional_datasets: *datasets_ecs_high + ECS_med_hist: + <<: *var_clt + additional_datasets: *datasets_ecs_med + ECS_low_hist: + <<: *var_clt + additional_datasets: *datasets_ecs_low + ECS_high_scen: + <<: *var_clt + <<: *years_scen + additional_datasets: *datasets_ecs_high_scenario + ECS_med_scen: + <<: *var_clt + <<: *years_scen + additional_datasets: *datasets_ecs_med_scenario + ECS_low_scen: + <<: *var_clt + <<: *years_scen + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: &var_tas + <<: *var_clt + short_name: tas + tas_ECS_med_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + scripts: + zonal_diff: + script: clouds/clouds_ecs_groups_zonal.py + group_by: [['ECS_low_hist', 'ECS_low_scen'], + ['ECS_med_hist', 'ECS_med_scen'], + ['ECS_high_hist', 'ECS_high_scen']] + plot_type: zonal + filename_attach: 'ssp585' + + + # Figure 6b + lwp_zonal: + <<: *zonal_diag + variables: + ECS_high_hist: + <<: *var_clt + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high + ECS_med_hist: + <<: *var_clt + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med + ECS_low_hist: + <<: *var_clt + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low + ECS_high_scen: + <<: *var_clt + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high_scenario + ECS_med_scen: + <<: *var_clt + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med_scenario + ECS_low_scen: + <<: *var_clt + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: + <<: *var_tas + tas_ECS_med_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + + + # Figure 6c + iwp_zonal: + <<: *zonal_diag + variables: + ECS_high_hist: + <<: *var_clt + short_name: clivi + additional_datasets: *datasets_ecs_high + ECS_med_hist: + <<: *var_clt + short_name: clivi + additional_datasets: *datasets_ecs_med + ECS_low_hist: + <<: *var_clt + short_name: clivi + additional_datasets: *datasets_ecs_low + ECS_high_scen: + <<: *var_clt + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_high_scenario + ECS_med_scen: + <<: *var_clt + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_med_scenario + ECS_low_scen: + <<: *var_clt + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: + <<: *var_tas + tas_ECS_med_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + + + # Figure 6d + netcre_zonal: + <<: *zonal_diag + variables: + ECS_high_hist: + <<: *var_clt + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + ECS_med_hist: + <<: *var_clt + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med + ECS_low_hist: + <<: *var_clt + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low + ECS_high_scen: + <<: *var_clt + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high_scenario + ECS_med_scen: + <<: *var_clt + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + ECS_low_scen: + <<: *var_clt + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: + <<: *var_tas + tas_ECS_med_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + OBS: + <<: *var_clt + short_name: netcre + derive: true + preprocessor: zonal + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.2, + tier: 2, start_year: 2001, end_year: 2022} + + + # Figure 6e + swcre_zonal: + <<: *zonal_diag + variables: + ECS_high_hist: + <<: *var_clt + short_name: swcre + derive: true + additional_datasets: *datasets_ecs_high + ECS_med_hist: + <<: *var_clt + short_name: swcre + derive: true + additional_datasets: *datasets_ecs_med + ECS_low_hist: + <<: *var_clt + short_name: swcre + derive: true + additional_datasets: *datasets_ecs_low + ECS_high_scen: + <<: *var_clt + <<: *years_scen + short_name: swcre + derive: true + additional_datasets: *datasets_ecs_high_scenario + ECS_med_scen: + <<: *var_clt + <<: *years_scen + short_name: swcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + ECS_low_scen: + <<: *var_clt + <<: *years_scen + short_name: swcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: + <<: *var_tas + tas_ECS_med_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + OBS: + <<: *var_clt + short_name: swcre + derive: true + preprocessor: zonal + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.2, + tier: 2, start_year: 2001, end_year: 2022} + + + # Figure 6f + lwcre_zonal: + <<: *zonal_diag + variables: + ECS_high_hist: + <<: *var_clt + short_name: lwcre + derive: true + additional_datasets: *datasets_ecs_high + ECS_med_hist: + <<: *var_clt + short_name: lwcre + derive: true + additional_datasets: *datasets_ecs_med + ECS_low_hist: + <<: *var_clt + short_name: lwcre + derive: true + additional_datasets: *datasets_ecs_low + ECS_high_scen: + <<: *var_clt + <<: *years_scen + short_name: lwcre + derive: true + additional_datasets: *datasets_ecs_high_scenario + ECS_med_scen: + <<: *var_clt + <<: *years_scen + short_name: lwcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + ECS_low_scen: + <<: *var_clt + <<: *years_scen + short_name: lwcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: + <<: *var_tas + tas_ECS_med_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + OBS: + <<: *var_clt + short_name: lwcre + derive: true + preprocessor: zonal + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.2, + tier: 2, start_year: 2001, end_year: 2022} diff --git a/esmvaltool/recipes/clouds/recipe_bock24acp_fig7_boxplots.yml b/esmvaltool/recipes/clouds/recipe_bock24acp_fig7_boxplots.yml new file mode 100644 index 0000000000..ef4b507be2 --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_bock24acp_fig7_boxplots.yml @@ -0,0 +1,1004 @@ +# ESMValTool +# recipe_bock24acp_fig7_boxplots.yml +--- +documentation: + title: Cloud properties regarding ECS (boxplots). + + description: | + Boxplots fo projected changes of cloud properties + for different regions. + + authors: + - bock_lisa + + maintainer: + - bock_lisa + + references: + - bock24acp + + project: + - cmug + - esm2025 + + +YEARS_hist: &years_hist + start_year: 1985 + end_year: 2004 + +YEARS_scen: &years_scen + start_year: 2081 + end_year: 2100 + +VARIABLE_SETTINGS: &var_settings + short_name: clt + mip: Amon + project: CMIP6 + exp: historical + ensemble: r1i1p1f1 + grid: gr + <<: *years_hist + +BOXPLOT_SETTINGS: &boxplot_settings + script: clouds/clouds_ecs_groups_boxplots.py + group_by: [['ECS_low_hist', 'ECS_low_scen'], + ['ECS_med_hist', 'ECS_med_scen'], + ['ECS_high_hist', 'ECS_high_scen']] + y_range: [-25., 22.] + + +DATASETS_ECS_HIGH: &datasets_ecs_high + # CMIP6 + - {dataset: CanESM5, grid: gn} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2} + - {dataset: HadGEM3-GC31-LL, grid: gn, ensemble: r1i1p1f3} + - {dataset: HadGEM3-GC31-MM, grid: gn, ensemble: r1i1p1f3} + - {dataset: IPSL-CM6A-LR} + - {dataset: KACE-1-0-G} + - {dataset: NESM3, grid: gn} + - {dataset: TaiESM1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + # CMIP5 + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1, project: CMIP5} + - {dataset: HadGEM2-ES, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MIROC-ESM, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_HIGH_scenario: &datasets_ecs_high_scenario + # CMIP6 + - {dataset: CanESM5, grid: gn, exp: ssp585} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: HadGEM3-GC31-LL, grid: gn, ensemble: r1i1p1f3, exp: ssp585} + - {dataset: HadGEM3-GC31-MM, grid: gn, ensemble: r1i1p1f3, exp: ssp585} + - {dataset: IPSL-CM6A-LR, exp: ssp585} + - {dataset: KACE-1-0-G, exp: ssp585} + - {dataset: NESM3, grid: gn, exp: ssp585} + - {dataset: TaiESM1, grid: gn, exp: ssp585} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn, exp: ssp585} + # CMIP5 + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: HadGEM2-ES, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MIROC-ESM, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + +DATASETS_ECS_MED: &datasets_ecs_med + # CMIP6 + - {dataset: BCC-CSM2-MR, grid: gn} + - {dataset: CMCC-CM2-SR5, grid: gn} + - {dataset: CMCC-ESM2, grid: gn} + - {dataset: FGOALS-f3-L} + - {dataset: FGOALS-g3, grid: gn} + - {dataset: GISS-E2-1-H, grid: gn} + - {dataset: MPI-ESM1-2-HR, grid: gn} + - {dataset: MPI-ESM1-2-LR, grid: gn} + - {dataset: MRI-ESM2-0, grid: gn} + # CMIP5 + - {dataset: ACCESS1-0, ensemble: r1i1p1, project: CMIP5} + - {dataset: ACCESS1-3, ensemble: r1i1p1, project: CMIP5} + - {dataset: BNU-ESM, ensemble: r1i1p1, project: CMIP5} + - {dataset: CanESM2, ensemble: r1i1p1, project: CMIP5} + - {dataset: CCSM4, ensemble: r1i1p1, project: CMIP5} + - {dataset: FGOALS-g2, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-CM3, ensemble: r1i1p1, project: CMIP5} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_MED_scenario: &datasets_ecs_med_scenario + # CMIP6 + - {dataset: BCC-CSM2-MR, grid: gn, exp: ssp585} + - {dataset: CMCC-CM2-SR5, grid: gn, exp: ssp585} + - {dataset: CMCC-ESM2, grid: gn, exp: ssp585} + - {dataset: FGOALS-f3-L, exp: ssp585} + - {dataset: FGOALS-g3, grid: gn, exp: ssp585} + - {dataset: GISS-E2-1-H, grid: gn, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: MPI-ESM1-2-HR, grid: gn, exp: ssp585} + - {dataset: MPI-ESM1-2-LR, grid: gn, exp: ssp585} + - {dataset: MRI-ESM2-0, grid: gn, exp: ssp585} + # CMIP5 + - {dataset: ACCESS1-0, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: ACCESS1-3, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: BNU-ESM, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: CanESM2, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: CCSM4, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: FGOALS-g2, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GFDL-CM3, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + +DATASETS_ECS_LOW: &datasets_ecs_low + # CMIP6 + - {dataset: CAMS-CSM1-0, grid: gn} + - {dataset: GISS-E2-1-G, grid: gn} + - {dataset: MIROC6, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: NorESM2-LM, grid: gn, institute: NCC} + - {dataset: NorESM2-MM, grid: gn, institute: NCC} + # CMIP5 + - {dataset: bcc-csm1-1, ensemble: r1i1p1, project: CMIP5} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1, project: CMIP5} + - {dataset: GISS-E2-H, ensemble: r1i1p1, project: CMIP5} + - {dataset: GISS-E2-R, ensemble: r1i1p1, project: CMIP5} + - {dataset: inmcm4, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MIROC5, ensemble: r1i1p1, project: CMIP5} + - {dataset: MRI-CGCM3, ensemble: r1i1p1, project: CMIP5} + - {dataset: NorESM1-M, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_LOW_scenario: &datasets_ecs_low_scenario + # CMIP6 + - {dataset: CAMS-CSM1-0, grid: gn, exp: ssp585, end_year: 2099} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: MIROC6, grid: gn, exp: ssp585} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn, exp: ssp585} + - {dataset: NorESM2-LM, grid: gn, institute: NCC, exp: ssp585} + - {dataset: NorESM2-MM, grid: gn, institute: NCC, exp: ssp585} + # CMIP5 + - {dataset: bcc-csm1-1, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GISS-E2-H, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GISS-E2-R, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: inmcm4, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MIROC5, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MRI-CGCM3, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: NorESM1-M, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + + +preprocessors: + + tropical_ocean: + custom_order: true + extract_region: + start_latitude: -30. + end_latitude: 30. + start_longitude: 0. + end_longitude: 360. + mask_landsea: &mask_land + mask_out: land + area_statistics: &area_mean + operator: mean + climate_statistics: &clim_mean + operator: mean + + southern_ocean: + custom_order: true + extract_region: + start_latitude: -65. + end_latitude: -30. + start_longitude: 0. + end_longitude: 360. + mask_landsea: *mask_land + area_statistics: *area_mean + climate_statistics: *clim_mean + + pacific_itcz: + custom_order: true + extract_region: + start_latitude: 0. + end_latitude: 12. + start_longitude: 135. + end_longitude: 275. + mask_landsea: *mask_land + area_statistics: *area_mean + climate_statistics: *clim_mean + + stratocumulus: + custom_order: true + extract_shape: + shapefile: shapefiles/sc_regions.shp + crop: true + decomposed: false + ids: + sc: + - SEP + - NEP + - SEA + mask_landsea: *mask_land + area_statistics: *area_mean + climate_statistics: *clim_mean + + arctic: + custom_order: true + extract_region: + start_latitude: 70. + end_latitude: 90. + start_longitude: 0. + end_longitude: 360. + mask_landsea: *mask_land + area_statistics: *area_mean + climate_statistics: *clim_mean + + +diagnostics: + + # Figure 7c + diag_tropical_ocean: + description: compare field means + variables: + clt_ECS_high_hist: &var_clt_1 + <<: *var_settings + preprocessor: tropical_ocean + additional_datasets: *datasets_ecs_high + clt_ECS_med_hist: + <<: *var_clt_1 + additional_datasets: *datasets_ecs_med + clt_ECS_low_hist: + <<: *var_clt_1 + additional_datasets: *datasets_ecs_low + clt_ECS_high_scen: + <<: *var_clt_1 + <<: *years_scen + additional_datasets: *datasets_ecs_high_scenario + clt_ECS_med_scen: + <<: *var_clt_1 + <<: *years_scen + additional_datasets: *datasets_ecs_med_scenario + clt_ECS_low_scen: + <<: *var_clt_1 + <<: *years_scen + additional_datasets: *datasets_ecs_low_scenario + clivi_ECS_high_hist: + <<: *var_clt_1 + short_name: clivi + additional_datasets: *datasets_ecs_high + clivi_ECS_med_hist: + <<: *var_clt_1 + short_name: clivi + additional_datasets: *datasets_ecs_med + clivi_ECS_low_hist: + <<: *var_clt_1 + short_name: clivi + additional_datasets: *datasets_ecs_low + clivi_ECS_high_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: clivi + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + clivi_ECS_med_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_med_scenario + clivi_ECS_low_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_low_scenario + lwp_ECS_high_hist: + <<: *var_clt_1 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high + lwp_ECS_med_hist: + <<: *var_clt_1 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med + lwp_ECS_low_hist: + <<: *var_clt_1 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low + lwp_ECS_high_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: lwp + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + lwp_ECS_med_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med_scenario + lwp_ECS_low_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low_scenario + netcre_ECS_high_hist: + <<: *var_clt_1 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + netcre_ECS_med_hist: + <<: *var_clt_1 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med + netcre_ECS_low_hist: + <<: *var_clt_1 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low + netcre_ECS_high_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: netcre + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + netcre_ECS_med_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + netcre_ECS_low_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: &var_tas_1 + <<: *var_clt_1 + short_name: tas + tas_ECS_med_hist: + <<: *var_tas_1 + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas_1 + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas_1 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas_1 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas_1 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + scripts: + barplot: + <<: *boxplot_settings + filename_attach: 'ssp585_tropoc' + title: 'Tropical Ocean' + + + # Figure 7b + diag_southern_ocean: + description: compare field means + variables: + clt_ECS_high_hist: &var_clt_2 + <<: *var_settings + preprocessor: southern_ocean + additional_datasets: *datasets_ecs_high + clt_ECS_med_hist: + <<: *var_clt_2 + additional_datasets: *datasets_ecs_med + clt_ECS_low_hist: + <<: *var_clt_2 + additional_datasets: *datasets_ecs_low + clt_ECS_high_scen: + <<: *var_clt_2 + <<: *years_scen + additional_datasets: *datasets_ecs_high_scenario + clt_ECS_med_scen: + <<: *var_clt_2 + <<: *years_scen + additional_datasets: *datasets_ecs_med_scenario + clt_ECS_low_scen: + <<: *var_clt_2 + <<: *years_scen + additional_datasets: *datasets_ecs_low_scenario + clivi_ECS_high_hist: + <<: *var_clt_2 + short_name: clivi + additional_datasets: *datasets_ecs_high + clivi_ECS_med_hist: + <<: *var_clt_2 + short_name: clivi + additional_datasets: *datasets_ecs_med + clivi_ECS_low_hist: + <<: *var_clt_2 + short_name: clivi + additional_datasets: *datasets_ecs_low + clivi_ECS_high_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: clivi + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + clivi_ECS_med_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_med_scenario + clivi_ECS_low_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_low_scenario + lwp_ECS_high_hist: + <<: *var_clt_2 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high + lwp_ECS_med_hist: + <<: *var_clt_2 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med + lwp_ECS_low_hist: + <<: *var_clt_2 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low + lwp_ECS_high_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: lwp + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + lwp_ECS_med_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med_scenario + lwp_ECS_low_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low_scenario + netcre_ECS_high_hist: + <<: *var_clt_2 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + netcre_ECS_med_hist: + <<: *var_clt_2 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med + netcre_ECS_low_hist: + <<: *var_clt_2 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low + netcre_ECS_high_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: netcre + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + netcre_ECS_med_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + netcre_ECS_low_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: &var_tas_2 + <<: *var_clt_2 + short_name: tas + tas_ECS_med_hist: + <<: *var_tas_2 + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas_2 + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas_2 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas_2 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas_2 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + scripts: + barplot: + <<: *boxplot_settings + filename_attach: 'ssp585_south_oc' + title: 'Southern Ocean' + + + # Figure 7d + diag_pacific_itcz: + description: compare field means + variables: + clt_ECS_high_hist: &var_clt_3 + <<: *var_settings + preprocessor: pacific_itcz + additional_datasets: *datasets_ecs_high + clt_ECS_med_hist: + <<: *var_clt_3 + additional_datasets: *datasets_ecs_med + clt_ECS_low_hist: + <<: *var_clt_3 + additional_datasets: *datasets_ecs_low + clt_ECS_high_scen: + <<: *var_clt_3 + <<: *years_scen + additional_datasets: *datasets_ecs_high_scenario + clt_ECS_med_scen: + <<: *var_clt_3 + <<: *years_scen + additional_datasets: *datasets_ecs_med_scenario + clt_ECS_low_scen: + <<: *var_clt_3 + <<: *years_scen + additional_datasets: *datasets_ecs_low_scenario + clivi_ECS_high_hist: + <<: *var_clt_3 + short_name: clivi + additional_datasets: *datasets_ecs_high + clivi_ECS_med_hist: + <<: *var_clt_3 + short_name: clivi + additional_datasets: *datasets_ecs_med + clivi_ECS_low_hist: + <<: *var_clt_3 + short_name: clivi + additional_datasets: *datasets_ecs_low + clivi_ECS_high_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: clivi + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + clivi_ECS_med_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_med_scenario + clivi_ECS_low_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_low_scenario + lwp_ECS_high_hist: + <<: *var_clt_3 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high + lwp_ECS_med_hist: + <<: *var_clt_3 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med + lwp_ECS_low_hist: + <<: *var_clt_3 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low + lwp_ECS_high_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: lwp + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + lwp_ECS_med_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med_scenario + lwp_ECS_low_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low_scenario + netcre_ECS_high_hist: + <<: *var_clt_3 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + netcre_ECS_med_hist: + <<: *var_clt_3 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med + netcre_ECS_low_hist: + <<: *var_clt_3 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low + netcre_ECS_high_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: netcre + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + netcre_ECS_med_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + netcre_ECS_low_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: &var_tas_3 + <<: *var_clt_3 + short_name: tas + tas_ECS_med_hist: + <<: *var_tas_3 + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas_3 + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas_3 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas_3 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas_3 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + scripts: + barplot: + <<: *boxplot_settings + filename_attach: 'ssp585_paitcz' + title: 'Pacific ITCZ' + + + # Figure 7e + diag_stratocumulus: + description: compare field means + variables: + clt_ECS_high_hist: &var_clt_str + <<: *var_settings + preprocessor: stratocumulus + additional_datasets: *datasets_ecs_high + clt_ECS_med_hist: + <<: *var_clt_str + additional_datasets: *datasets_ecs_med + clt_ECS_low_hist: + <<: *var_clt_str + additional_datasets: *datasets_ecs_low + clt_ECS_high_scen: + <<: *var_clt_str + <<: *years_scen + additional_datasets: *datasets_ecs_high_scenario + clt_ECS_med_scen: + <<: *var_clt_str + <<: *years_scen + additional_datasets: *datasets_ecs_med_scenario + clt_ECS_low_scen: + <<: *var_clt_str + <<: *years_scen + additional_datasets: *datasets_ecs_low_scenario + clivi_ECS_high_hist: + <<: *var_clt_str + short_name: clivi + additional_datasets: *datasets_ecs_high + clivi_ECS_med_hist: + <<: *var_clt_str + short_name: clivi + additional_datasets: *datasets_ecs_med + clivi_ECS_low_hist: + <<: *var_clt_str + short_name: clivi + additional_datasets: *datasets_ecs_low + clivi_ECS_high_scen: + <<: *var_clt_str + <<: *years_scen + short_name: clivi + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + clivi_ECS_med_scen: + <<: *var_clt_str + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_med_scenario + clivi_ECS_low_scen: + <<: *var_clt_str + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_low_scenario + lwp_ECS_high_hist: + <<: *var_clt_str + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high + lwp_ECS_med_hist: + <<: *var_clt_str + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med + lwp_ECS_low_hist: + <<: *var_clt_str + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low + lwp_ECS_high_scen: + <<: *var_clt_str + <<: *years_scen + short_name: lwp + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + lwp_ECS_med_scen: + <<: *var_clt_str + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med_scenario + lwp_ECS_low_scen: + <<: *var_clt_str + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low_scenario + netcre_ECS_high_hist: + <<: *var_clt_str + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + netcre_ECS_med_hist: + <<: *var_clt_str + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med + netcre_ECS_low_hist: + <<: *var_clt_str + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low + netcre_ECS_high_scen: + <<: *var_clt_str + <<: *years_scen + short_name: netcre + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + netcre_ECS_med_scen: + <<: *var_clt_str + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + netcre_ECS_low_scen: + <<: *var_clt_str + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: &var_tas_str + <<: *var_clt_str + short_name: tas + tas_ECS_med_hist: + <<: *var_tas_str + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas_str + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas_str + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas_str + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas_str + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + scripts: + barplot: + <<: *boxplot_settings + filename_attach: 'ssp585_stratocumulus' + title: 'Stratocumulus region' + + + # Figure 7a + diag_arctic: + description: compare field means + variables: + clt_ECS_high_hist: &var_clt_5 + <<: *var_settings + preprocessor: arctic + additional_datasets: *datasets_ecs_high + clt_ECS_med_hist: + <<: *var_clt_5 + additional_datasets: *datasets_ecs_med + clt_ECS_low_hist: + <<: *var_clt_5 + additional_datasets: *datasets_ecs_low + clt_ECS_high_scen: + <<: *var_clt_5 + <<: *years_scen + additional_datasets: *datasets_ecs_high_scenario + clt_ECS_med_scen: + <<: *var_clt_5 + <<: *years_scen + additional_datasets: *datasets_ecs_med_scenario + clt_ECS_low_scen: + <<: *var_clt_5 + <<: *years_scen + additional_datasets: *datasets_ecs_low_scenario + clivi_ECS_high_hist: + <<: *var_clt_5 + short_name: clivi + additional_datasets: *datasets_ecs_high + clivi_ECS_med_hist: + <<: *var_clt_5 + short_name: clivi + additional_datasets: *datasets_ecs_med + clivi_ECS_low_hist: + <<: *var_clt_5 + short_name: clivi + additional_datasets: *datasets_ecs_low + clivi_ECS_high_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: clivi + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + clivi_ECS_med_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_med_scenario + clivi_ECS_low_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_low_scenario + lwp_ECS_high_hist: + <<: *var_clt_5 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high + lwp_ECS_med_hist: + <<: *var_clt_5 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med + lwp_ECS_low_hist: + <<: *var_clt_5 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low + lwp_ECS_high_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: lwp + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + lwp_ECS_med_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med_scenario + lwp_ECS_low_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low_scenario + netcre_ECS_high_hist: + <<: *var_clt_5 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + netcre_ECS_med_hist: + <<: *var_clt_5 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med + netcre_ECS_low_hist: + <<: *var_clt_5 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low + netcre_ECS_high_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: netcre + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + netcre_ECS_med_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + netcre_ECS_low_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: &var_tas_5 + <<: *var_clt_5 + short_name: tas + tas_ECS_med_hist: + <<: *var_tas_5 + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas_5 + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas_5 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas_5 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas_5 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + scripts: + barplot: + <<: *boxplot_settings + filename_attach: 'ssp585_pol' + title: 'Arctic' diff --git a/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_a.yml b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_a.yml index 55c53147ec..35954b47a1 100644 --- a/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_a.yml +++ b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_a.yml @@ -313,7 +313,7 @@ diagnostics: pr: <<: *perf_var preprocessor: ppNOLEV1 - reference_dataset: GPCP-SG + reference_dataset: GPCP-V2.3 alternative_dataset: GHCN additional_datasets: - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} @@ -344,7 +344,7 @@ diagnostics: - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} - {<<: *cmip6, dataset: MCM-UA-1-0} - - {dataset: GPCP-SG, project: obs4MIPs, level: L3, version: v2.3, tier: 1} + - {dataset: GPCP-V2.3, project: obs4MIPs, level: L3, tier: 1} - {dataset: GHCN, project: OBS, type: ground, version: 1, tier: 2} @@ -462,7 +462,7 @@ diagnostics: - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} - - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-8, + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, tier: 1, start_year: 2001, end_year: 2015} @@ -503,7 +503,7 @@ diagnostics: - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} - - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-8, + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, tier: 1, start_year: 2001, end_year: 2015} @@ -547,7 +547,7 @@ diagnostics: - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} - {<<: *cmip6, dataset: MCM-UA-1-0} - - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-8, + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, tier: 1, start_year: 2001, end_year: 2015} @@ -620,7 +620,7 @@ diagnostics: - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} - - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-8, + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, tier: 1, start_year: 2001, end_year: 2015} diff --git a/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_43.yml b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_43.yml index fd7a60efe8..767662167c 100644 --- a/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_43.yml +++ b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_43.yml @@ -231,7 +231,7 @@ diagnostics: variables: pr: <<: *var_settings - reference_dataset: GPCP-SG + reference_dataset: GPCP-V2.2 alternative_dataset: GHCN additional_datasets: - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} @@ -260,7 +260,7 @@ diagnostics: - {<<: *cmip6, dataset: GISS-E2-1-G-CC} - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} - {<<: *cmip6, dataset: MCM-UA-1-0} - - {dataset: GPCP-SG, project: obs4mips, level: L3, version: v2.2, tier: 1} + - {dataset: GPCP-V2.2, project: obs4mips, level: L3, tier: 1} - {dataset: GHCN, project: OBS, type: ground, version: 1, tier: 2} @@ -333,7 +333,7 @@ diagnostics: - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} - {<<: *cmip6, dataset: MCM-UA-1-0} - - {dataset: CERES-EBAF, project: obs4mips, level: L3B, version: Ed2-8, + - {dataset: CERES-EBAF, project: obs4mips, level: L3B, tier: 1, start_year: 2001, end_year: 2015} @@ -367,7 +367,7 @@ diagnostics: - {<<: *cmip6, dataset: GISS-E2-1-G-CC} - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} - - {dataset: CERES-EBAF, project: obs4mips, level: L3B, version: Ed2-8, + - {dataset: CERES-EBAF, project: obs4mips, level: L3B, tier: 1, start_year: 2001, end_year: 2015} @@ -401,7 +401,7 @@ diagnostics: - {<<: *cmip6, dataset: GISS-E2-1-G-CC} - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} - - {dataset: CERES-EBAF, project: obs4mips, level: L3B, version: Ed2-8, + - {dataset: CERES-EBAF, project: obs4mips, level: L3B, tier: 1, start_year: 2001, end_year: 2015} @@ -434,7 +434,7 @@ diagnostics: - {<<: *cmip6, dataset: GISS-E2-1-G-CC} - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} - - {dataset: CERES-EBAF, project: obs4mips, level: L3B, version: Ed2-8, + - {dataset: CERES-EBAF, project: obs4mips, level: L3B, tier: 1, start_year: 2001, end_year: 2015} diff --git a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml index 4277313428..f5eea141dc 100644 --- a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml +++ b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml @@ -165,6 +165,7 @@ diagnostics: plots: map: common_cbar: true + fontsize: 10 plot_kwargs_bias: levels: [-10.0, -7.5, -5.0, -2.5, 0.0, 2.5, 5.0, 7.5, 10.0] @@ -182,6 +183,7 @@ diagnostics: plots: zonal_mean_profile: common_cbar: true + fontsize: 10 plot_kwargs_bias: levels: [-10.0, -7.5, -5.0, -2.5, 0.0, 2.5, 5.0, 7.5, 10.0] @@ -230,6 +232,11 @@ diagnostics: plot: <<: *plot_multi_dataset_default script: monitor/multi_datasets.py + matplotlib_rc_params: + axes.labelsize: small + axes.titlesize: small + xtick.labelsize: x-small + ytick.labelsize: x-small plots: hovmoeller_z_vs_time: plot_func: contourf @@ -255,5 +262,6 @@ diagnostics: plots: hovmoeller_time_vs_lat_or_lon: common_cbar: true + fontsize: 10 show_x_minor_ticks: false time_format: '%Y' diff --git a/esmvaltool/recipes/recipe_wenzel16jclim.yml b/esmvaltool/recipes/recipe_wenzel16jclim.yml index 6caed04a93..ea7a583a3e 100644 --- a/esmvaltool/recipes/recipe_wenzel16jclim.yml +++ b/esmvaltool/recipes/recipe_wenzel16jclim.yml @@ -303,7 +303,7 @@ diagnostics: end_year: 2005 derive: true additional_datasets: - - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-7, tier: 1, start_year: 2001} + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, tier: 1, start_year: 2001} additional_datasets: *datasets scripts: asr_sh: &asr_sh diff --git a/esmvaltool/references/bock24acp.bibtex b/esmvaltool/references/bock24acp.bibtex new file mode 100644 index 0000000000..303b019050 --- /dev/null +++ b/esmvaltool/references/bock24acp.bibtex @@ -0,0 +1,12 @@ +@article{https://doi.org/10.5194/acp-24-1587-2024, +author = {Bock, L. and Lauer, A.}, +title = {Cloud properties and their projected changes in CMIP models with low to high climate sensitivity}, +journal = {Atmospheric Chemistry and Physics}, +volume = {24}, +number = {3}, +pages = {1587--1605}, +doi = {10.5194/acp-24-1587-2024}, +url = {https://doi.org/10.5194/acp-24-1587-2024}, +year = {2024} +} + diff --git a/esmvaltool/utils/recipe_test_workflow/app/get_esmval/opt/rose-app-dkrz.conf b/esmvaltool/utils/recipe_test_workflow/app/get_esmval/opt/rose-app-dkrz.conf new file mode 100644 index 0000000000..7656f549bc --- /dev/null +++ b/esmvaltool/utils/recipe_test_workflow/app/get_esmval/opt/rose-app-dkrz.conf @@ -0,0 +1,8 @@ +[command] +default=singularity-env singularity build ${CONTAINER_PATH} ${DOCKER_SOURCE} + +[env] +DOCKER_SOURCE=docker://esmvalgroup/esmvaltool:${ENV_NAME} + +[file:${CONTAINER_DIR}] +mode=mkdir diff --git a/esmvaltool/utils/recipe_test_workflow/app/install_env_file/opt/rose-app-dkrz.conf b/esmvaltool/utils/recipe_test_workflow/app/install_env_file/opt/rose-app-dkrz.conf new file mode 100644 index 0000000000..8b7e9dd4f3 --- /dev/null +++ b/esmvaltool/utils/recipe_test_workflow/app/install_env_file/opt/rose-app-dkrz.conf @@ -0,0 +1,12 @@ +# Copy the site specific environment files to the 'share/bin' directory in the +# installed Cylc workflow (this directory is automatically added to the +# ${PATH} by Cylc). + +[command] +default=BASH_XTRACEFD=1 # Send the output from 'set -x' to 'stdout' rather than 'stderr'. + =set -euxo pipefail + =cp ${ENV_FILE_SITE_PATH} ${SHARE_BIN_DIR}/${ENV_FILE} + =cp ${SINGULARITY_ENV_FILE_SITE_PATH} ${SHARE_BIN_DIR}/${SINGULARITY_ENV_FILE} + +[file:${SHARE_BIN_DIR}] +mode=mkdir diff --git a/esmvaltool/utils/recipe_test_workflow/flow.cylc b/esmvaltool/utils/recipe_test_workflow/flow.cylc index 0dcd7e2528..0338dce5a0 100644 --- a/esmvaltool/utils/recipe_test_workflow/flow.cylc +++ b/esmvaltool/utils/recipe_test_workflow/flow.cylc @@ -53,7 +53,6 @@ ROSE_APP_OPT_CONF_KEYS = {{ SITE }} [[configure]] - pre-script = "mkdir -p ${USER_CONFIG_DIR}" [[[environment]]] ROSE_TASK_APP = configure DRS_CMIP3 = {{ DRS_CMIP3 }} diff --git a/esmvaltool/utils/recipe_test_workflow/opt/rose-suite-dkrz.conf b/esmvaltool/utils/recipe_test_workflow/opt/rose-suite-dkrz.conf new file mode 100644 index 0000000000..dca068f8c2 --- /dev/null +++ b/esmvaltool/utils/recipe_test_workflow/opt/rose-suite-dkrz.conf @@ -0,0 +1,10 @@ +[template variables] +DRS_CMIP5="DKRZ" +DRS_CMIP6="DKRZ" +ENV_NAME="experimental" +KGO_ROOT_PATH="/work/bd0854/KGO/esmvaltool_output/" +ROOTPATH_CMIP5="/work/bd0854/DATA/ESMValTool2/CMIP5_DKRZ" +ROOTPATH_CMIP6="/work/bd0854/DATA/ESMValTool2/CMIP6_DKRZ" +ROOTPATH_OBS="/work/bd0854/DATA/ESMValTool2/OBS" +ROOTPATH_OBS4MIPS="/work/bd0854/DATA/ESMValTool2/OBS" +SITE="dkrz" diff --git a/esmvaltool/utils/recipe_test_workflow/site/dkrz-env b/esmvaltool/utils/recipe_test_workflow/site/dkrz-env new file mode 100755 index 0000000000..0821e59be2 --- /dev/null +++ b/esmvaltool/utils/recipe_test_workflow/site/dkrz-env @@ -0,0 +1,57 @@ +#!/bin/bash +# +# USAGE dkrz-env COMMAND +# +# ENVIRONMENT +# ENV_NAME The name of the container being used +# QUIET_MODE Don't print confirmation messages +# PYTHONPATH_PREPEND The path to prepend to PYTHONPATH +# +# OPTIONS +# COMMAND The command to execute with options +set -eu + +# Must be run before importing numpy, see +# https://docs.dask.org/en/stable/array-best-practices.html#avoid-oversubscribing-threads +export OMP_NUM_THREADS=1 +export OPENBLAS_NUM_THREADS=1 +export MKL_NUM_THREADS=1 +export VECLIB_MAXIMUM_THREADS=1 +export NUMEXPR_NUM_THREADS=1 + +# Ensure '~/.local' isn't added to 'sys.path'. +export PYTHONNOUSERSITE=True + +WORKFLOW_RUN_BIN_DIR="${CYLC_WORKFLOW_RUN_DIR}/bin" +WORKFLOW_SHARE_BIN_DIR="${CYLC_WORKFLOW_SHARE_DIR}/cycle/bin" +ROSE_APP_BIN_DIR="${CYLC_WORKFLOW_RUN_DIR}/app/${ROSE_TASK_APP:-$CYLC_TASK_NAME}/bin" + +# Bind paths for container. +export SINGULARITY_BIND="/home/b,/work,/scratch/b" + +# Suppress an ESMValTool "file not found" warning. +export SINGULARITYENV_PROJ_DATA="/opt/conda/envs/esmvaltool/share/proj" + +# Provide mkfile needed to build esmfpy package. +export SINGULARITYENV_ESMFMKFILE="/opt/conda/envs/esmvaltool/lib/esmf.mk" + +# Ensure that `singularity exec` finds the right version of python. +export SINGULARITYENV_PREPEND_PATH="/opt/conda/envs/esmvaltool/bin" + +# Include Rose/Cylc workflow directories in container PATH. +export SINGULARITYENV_APPEND_PATH="${WORKFLOW_RUN_BIN_DIR}:${WORKFLOW_SHARE_BIN_DIR}:${ROSE_APP_BIN_DIR}" + +# If PYTHONPATH_PREPEND has been set, prepend it to PYTHONPATH to extend the +# Python environment. +if [[ ! -z ${PYTHONPATH_PREPEND:-} ]]; then + echo "[INFO] Prepending the following to PYTHONPATH: ${PYTHONPATH_PREPEND}" + export PYTHONPATH=${PYTHONPATH_PREPEND}:${PYTHONPATH:-} +fi + +if [[ -z ${QUIET_MODE:-} ]]; then + echo "[INFO] Using the ${ENV_NAME} container" +fi + +singularity_command="singularity-env singularity -q exec ${CONTAINER_PATH} $@" +command="/usr/bin/time -v -o ${CYLC_TASK_LOG_ROOT}.time ${singularity_command}" +exec ${command} diff --git a/esmvaltool/utils/recipe_test_workflow/site/dkrz-singularity-env b/esmvaltool/utils/recipe_test_workflow/site/dkrz-singularity-env new file mode 100755 index 0000000000..3e74cd9b4e --- /dev/null +++ b/esmvaltool/utils/recipe_test_workflow/site/dkrz-singularity-env @@ -0,0 +1,34 @@ +#!/bin/bash +# +# USAGE dkrz-singularity-env COMMAND +# +# OPTIONS +# COMMAND The command to execute with options +# +# Since DKRZ uses the module environment to dynamically modify a user's +# environment via modulefiles (more details are available at +# https://docs.dkrz.de/doc/levante/access-and-environment.html#module-environment) +# this additional environment file is required to enable access to singularity +# on DKRZ. This file is used directly in the 'get_esmval' app for DKRZ, as well +# as in the 'dkrz-env' environment file. +set -eu + +module_count(){ + module list -t 2>&1 | wc -l +} + +safe_load(){ + PRE_LOAD_COUNT=$(module_count) + + module load "${1}" + # Check module count to determine whether module load was successful. + + if (( PRE_LOAD_COUNT == $(module_count) )); then + echo "[ERROR] Failed to load: ${1}" + exit 1 + fi +} +safe_load "singularity" + +command="/usr/bin/time -v -o ${CYLC_TASK_LOG_ROOT}.time $@" +exec ${command} diff --git a/esmvaltool/utils/recipe_test_workflow/site/dkrz.cylc b/esmvaltool/utils/recipe_test_workflow/site/dkrz.cylc new file mode 100644 index 0000000000..f04252d071 --- /dev/null +++ b/esmvaltool/utils/recipe_test_workflow/site/dkrz.cylc @@ -0,0 +1,102 @@ +#!jinja2 +[runtime] + [[root]] + [[[environment]]] + CONTAINER_DIR = ${ROSE_DATAC}/container + CONTAINER_FILE = esmvaltool.sif + CONTAINER_PATH = ${CONTAINER_DIR}/${CONTAINER_FILE} + # Warning: fragile assumption of location of esmvaltool code, + # issue #3437 contains more details. + ESMVALTOOL_DIR = /opt/conda/envs/esmvaltool/lib/python3.12/site-packages + + # COMPUTE provides defaults for computation-heavy tasks. + # Specific tasks below override some defaults, e.g. time & memory. + [[COMPUTE]] + platform = levante + execution time limit = PT3M + [[[directives]]] + --wckey = RTW + --account = bk1088 + --partition = interactive + --mem = 15G + + [[install_env_file]] + [[[environment]]] + ROSE_APP_OPT_CONF_KEYS = {{ SITE }} + SINGULARITY_ENV_FILE=singularity-env + SINGULARITY_ENV_FILE_SITE_PATH=${CYLC_WORKFLOW_RUN_DIR}/site/${SITE}-singularity-env + + [[get_esmval]] + platform = localhost + execution time limit = PT10M # Actual: 3m06s on 2024-12-18. + [[[environment]]] + # Move the location of the singularity cache from the user's + # home area to the directory where the container is saved. + # This variable must be specified only for the 'get_esmval' + # task, otherwise, for some reason, subsequent steps take much + # longer to run than the resources specified. + SINGULARITY_CACHEDIR = ${CONTAINER_DIR} + + [[configure]] + platform = localhost + execution time limit = PT2M # Actual: 0m14s on 2024-12-18. + [[[directives]]] + --mem = 2G + + # Resources for recipes that need more than the default. Both time and + # memory should be specified, in case the default changes. + # Variable (fast, medium) must be consistent with flow.cylc. + # Comment indicates example recorded usage on DKRZ. + [[process_examples--recipe_python]] + # Actual: 0m07s 2.1 GB on 2024-12-18. + execution time limit = PT2M + [[[directives]]] + --mem = 15G + + [[process_recipe_albedolandcover]] + # Actual: 0m10s 3.2 GB on 2024-12-18. + execution time limit = PT2M + [[[directives]]] + --mem = 15G + + [[process_recipe_autoassess_landsurface_soilmoisture]] + # Actual: 0m13s 3.8 GB on 2024-12-18. + execution time limit = PT2M + [[[directives]]] + --mem = 15G + + [[process_recipe_consecdrydays]] + # Actual: 0m08s 2.3 GB on 2024-12-18. + execution time limit = PT2M + [[[directives]]] + --mem = 15G + + [[process_recipe_ensclus]] + # Actual: 0m35s 2.0 GB on 2024-12-18. + execution time limit = PT2M + [[[directives]]] + --mem = 15G + + [[process_recipe_heatwaves_coldwaves]] + # Actual: 0m30s 1.6 GB on 2024-12-18. + execution time limit = PT2M + [[[directives]]] + --mem = 15G + + [[process_recipe_ocean_amoc]] + # Actual: Currently broken: No input files found for Dataset + execution time limit = PT2M + [[[directives]]] + --mem = 15G + + [[process_recipe_ocean_multimap]] + # Actual: Currently broken: No input files found for Dataset + execution time limit = PT2M + [[[directives]]] + --mem = 15G + + [[process_recipe_radiation_budget]] + # Actual: Currently broken: No input files found for Dataset + execution time limit = PT2M + [[[directives]]] + --mem =15G diff --git a/esmvaltool/utils/recipe_test_workflow/site/jasmin.cylc b/esmvaltool/utils/recipe_test_workflow/site/jasmin.cylc index 5eb1b083ad..56c70f9df7 100644 --- a/esmvaltool/utils/recipe_test_workflow/site/jasmin.cylc +++ b/esmvaltool/utils/recipe_test_workflow/site/jasmin.cylc @@ -2,7 +2,8 @@ [runtime] [[root]] [[[environment]]] - # Warning: fragile assumption of location of esmvaltool code, see #3437 + # Warning: fragile assumption of location of esmvaltool code, + # issue #3437 contains more details. ESMVALTOOL_DIR = /opt/conda/envs/esmvaltool/lib/python3.11/site-packages # COMPUTE provides defaults for computation-heavy tasks. diff --git a/tests/integration/diag_scripts/mlr/test_custom_sklearn_functions.py b/tests/integration/diag_scripts/mlr/test_custom_sklearn_functions.py index c37069f9ec..122afd3b32 100644 --- a/tests/integration/diag_scripts/mlr/test_custom_sklearn_functions.py +++ b/tests/integration/diag_scripts/mlr/test_custom_sklearn_functions.py @@ -42,7 +42,6 @@ # pylint: disable=too-few-public-methods # pylint: disable=too-many-arguments -import warnings from copy import copy, deepcopy import numpy as np @@ -505,9 +504,7 @@ def test_is_pairwise(): """Test ``_is_pairwise``.""" # Simple checks for _is_pairwise pca = KernelPCA(kernel='precomputed') - with warnings.catch_warnings(): - warnings.simplefilter("error") # make sure that no warning is raised - assert _is_pairwise(pca) + assert _is_pairwise(pca) # Pairwise attribute that is not consistent with the pairwise tag class IncorrectTagPCA(KernelPCA): @@ -533,9 +530,7 @@ class TruePairwise(BaseEstimator): # Pairwise attribute is not defined thus tag is used est = BaseEstimator() - with warnings.catch_warnings(): - warnings.simplefilter("error") # make sure that no warning is raised - assert not _is_pairwise(est) + assert not _is_pairwise(est) # _safe_split