diff --git a/.circleci/config.yml b/.circleci/config.yml index 47e87cf517..5be43d58c6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -27,6 +27,7 @@ commands: name: Log versions command: | . /opt/conda/etc/profile.d/conda.sh + conda env export --name base > /logs/base_environment.yml conda activate esmvaltool esmvaltool version dpkg -l > /logs/versions.txt @@ -40,6 +41,7 @@ commands: command: | . /opt/conda/etc/profile.d/conda.sh conda activate esmvaltool + mamba --version pytest -n 4 --junitxml=test-reports/report.xml esmvaltool version esmvaltool -- --help @@ -232,7 +234,7 @@ jobs: # Test building documentation docker: - image: condaforge/mambaforge:latest - resource_class: small + resource_class: medium steps: - checkout - run: @@ -265,7 +267,7 @@ jobs: # Install prerequisites mkdir /logs # Install ESMValTool in a new conda environment - mamba create -y --name esmvaltool -c conda-forge esmvaltool julia 'python=3.10' >> /logs/conda.txt 2>&1 + mamba create -y --name esmvaltool -c conda-forge esmvaltool julia 'python=3.11' >> /logs/conda.txt 2>&1 # Activate the environment set +x; conda activate esmvaltool; set -x # install the Julia dependencies diff --git a/CITATION.cff b/CITATION.cff index 147e3acd17..5c253e3bb5 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -388,11 +388,11 @@ authors: orcid: "https://orcid.org/0000-0003-3780-0784" cff-version: 1.2.0 -date-released: 2023-07-06 +date-released: 2023-12-20 doi: "10.5281/zenodo.3401363" license: "Apache-2.0" message: "If you use this software, please cite it using these metadata." repository-code: "https://github.com/ESMValGroup/ESMValTool/" title: ESMValTool -version: "v2.9.0" +version: "v2.10.0" ... diff --git a/README.md b/README.md index 71403fbf90..4fbe8aa84e 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![Codacy Badge](https://app.codacy.com/project/badge/Coverage/79bf6932c2e844eea15d0fb1ed7e415c)](https://www.codacy.com/gh/ESMValGroup/ESMValTool?utm_source=github.com&utm_medium=referral&utm_content=ESMValGroup/ESMValTool&utm_campaign=Badge_Coverage) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/79bf6932c2e844eea15d0fb1ed7e415c)](https://www.codacy.com/gh/ESMValGroup/ESMValTool?utm_source=github.com&utm_medium=referral&utm_content=ESMValGroup/ESMValTool&utm_campaign=Badge_Grade) [![Docker Build Status](https://img.shields.io/docker/cloud/build/esmvalgroup/esmvaltool.svg)](https://hub.docker.com/r/esmvalgroup/esmvaltool/) -[![Anaconda-Server Badge](https://img.shields.io/badge/Anaconda.org-2.9.0-blue.svg)](https://anaconda.org/conda-forge/esmvaltool) +[![Anaconda-Server Badge](https://img.shields.io/conda/vn/conda-forge/ESMValTool?color=blue&label=conda-forge&logo=conda-forge&logoColor=white)](https://anaconda.org/conda-forge/esmvaltool) ![stand with Ukraine](https://badgen.net/badge/stand%20with/UKRAINE/?color=0057B8&labelColor=FFD700) ![esmvaltoollogo](https://raw.githubusercontent.com/ESMValGroup/ESMValTool/main/doc/sphinx/source/figures/ESMValTool-logo-2.png) @@ -53,11 +53,11 @@ ESMValTool can run with the following types of [data as input](https://docs.esmv # Getting started -Please see [getting started](https://docs.esmvaltool.org/en/latest/quickstart/index.html) on readthedocs as well as [ESMValTool tutorial](https://tutorial.esmvaltool.org/index.html). The tutorial is a set of lessons that together teach skills needed to work with ESMValTool in climate-related domains. +Please see [getting started](https://docs.esmvaltool.org/en/latest/quickstart/index.html) on our instance of Read the Docs as well as [ESMValTool tutorial](https://tutorial.esmvaltool.org/index.html). The tutorial is a set of lessons that together teach skills needed to work with ESMValTool in climate-related domains. ## Getting help -The easiest way to get help if you cannot find the answer in the documentation on [readthedocs](https://docs.esmvaltool.org), is to open an [issue on GitHub](https://github.com/ESMValGroup/ESMValTool/issues). +The easiest way to get help, if you cannot find the answer in the documentation in our [docs](https://docs.esmvaltool.org), is to open an [issue on GitHub](https://github.com/ESMValGroup/ESMValTool/issues). ## Contributing diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 42d1ec03fc..d5f53fbe29 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 05ccb0eb21a22bcda85523e4fc91a3c5d43c69b2fc56e17f5c81159b2e906d6b +# input_hash: 9ebadc06c6267b4960d64d1b5af80ef1cf3716c4c49f5d7f45b0bfd2e4d7f8f3 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/_py-xgboost-mutex-2.0-gpu_0.tar.bz2#7702188077361f43a4d61e64c694f850 @@ -10,7 +10,7 @@ https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_2.conda https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2#19410c3df09dfb12d1206132a1d357c5 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda#6185f640c43843e5ad6fd1c5372c3f80 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-2.6.32-he073ed8_16.conda#7ca122655873935e02c91279c5b03c8c https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.2.0-ha9c7c90_103.conda#db8cd1a871a07404d94f7dcc78c21a61 @@ -18,7 +18,7 @@ https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.2.0-ha https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_3.conda#937eaed008f6bf2191c5fe76f87755e9 https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda#d8d7293c5b37f39b2ac32940621c6592 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda#8dee24b8be2d9ff81e7bd4d7d97ff1b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-imake-1.0.7-0.tar.bz2#23acfc5a339a6a34cc2241f64e4111be https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_3.conda#7124cbb46b13d395bdde68f2d215c989 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.cond https://conda.anaconda.org/conda-forge/linux-64/aom-3.5.0-h27087fc_0.tar.bz2#a08150fd2298460cd1fcccf626305642 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.8.23-hd590300_0.conda#cc4f06f7eedb1523f3b83fd0fb3942ff https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.22.1-hd590300_0.conda#8430bd266c7b2cfbda403f7585d5ee86 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.25.0-hd590300_0.conda#89e40af02dd3a0846c0c1131c5126706 https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/freexl-1.0.6-h166bdaf_1.tar.bz2#897e772a157faf3330d72dd291486f62 @@ -45,7 +45,7 @@ https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.t https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf https://conda.anaconda.org/conda-forge/linux-64/json-c-0.16-hc379101_0.tar.bz2#0e2bca6857cb73acec30387fef7c3142 -https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-h7f98852_2.tar.bz2#8e787b08fe19986d99d034b839df2961 +https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libabseil-20230125.3-cxx17_h59595ed_0.conda#d1db1b8be7c3a8983dcbbbfe4f0765de @@ -53,11 +53,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#12 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_9.conda#61641e239f96eae2b8492dc7e755828c https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 -https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_3.conda#c714d905cdfa0e70200f68b80cc04764 -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libnuma-2.0.16-h0b41bf4_1.conda#28bfe2cb11357ccc5be21101a6b7ce86 @@ -69,26 +69,27 @@ https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2#ede4266dc02e875fe1ea77b25dd43747 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.1-hd590300_0.conda#82bf6f63eb15ef719b556b63feec3a77 +https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h516909a_1000.tar.bz2#bb14fcb13341b81d5eb386423b9d2bac https://conda.anaconda.org/conda-forge/linux-64/make-4.3-hd18ef5c_1.tar.bz2#4049ebfd3190b580dffe76daed26155a https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.3.0-hcb278e6_0.conda#cc1213f464c357b647cc5dde5cfca881 -https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-h59595ed_1007.conda#40ccb8318df2500f83bd868dd8fcd201 +https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.1-h59595ed_2.conda#9ba5910c34210e7ad60736d172bbcd4c https://conda.anaconda.org/conda-forge/linux-64/nccl-2.19.4.1-h6103f9b_0.conda#2946f0e841f1f0be90c90bc67877d417 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.4-hd590300_0.conda#412ba6938c3e2abaca8b1129ea82e238 https://conda.anaconda.org/conda-forge/linux-64/p7zip-16.02-h9c3ff4c_1001.tar.bz2#941066943c0cac69d5aa52189451aa5f -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.42.2-h59595ed_0.conda#700edd63ccd5fc66b70b1c028cea9a68 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.0-h59595ed_0.conda#6b4b43013628634b6cfdee6b74fd696b https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h36c2ea0_1008.tar.bz2#fbef41ff6a4c8140c30057466a1cdd47 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/rdma-core-28.9-h59595ed_1.conda#aeffb7c06b5f65e55e6c637408dc4100 https://conda.anaconda.org/conda-forge/linux-64/re2-2023.03.02-h8c504da_0.conda#206f8fa808748f6e90599c3368a1114e https://conda.anaconda.org/conda-forge/linux-64/sed-4.8-he412f7d_0.tar.bz2#7362f0042e95681f5d371c46c83ebd08 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 -https://conda.anaconda.org/conda-forge/linux-64/tzcode-2023c-h0b41bf4_0.conda#0c0533894f21c3d35697cb8378d390e2 +https://conda.anaconda.org/conda-forge/linux-64/tzcode-2023d-h3f72095_0.conda#1c63518899838477ebd497e3e3327f81 https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.7-hcb278e6_1.conda#2c46deb08ba9b10e90d0a6401ad65deb https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -102,7 +103,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.0-h59595ed_4.conda#9cfbafab420f42b572f3c032ad59da85 +https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h59595ed_0.conda#fd486bffbf0d6841cf1456a8f2e3a995 https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.0.7-h0b41bf4_0.conda#49e8329110001f04923fe7e864990b0c https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.0-h93469e0_0.conda#580a52a05f5be28ce00764149017c6d4 https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h862ab75_1.conda#0013fcee7acb3cfc801c5929824feb3c @@ -124,17 +125,17 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_0.con https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.23.3-hd1fb520_1.conda#78c10e8637a6f8d377f9989327d0267d https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h0d5128d_13.conda#e1d6139ff0500977a760567a4bec1ce9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda#b58e6816d137f3aabf77d341dd5d732b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda#3b6a9f225c3dbe0d24f4fedd4625c5bf https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxgboost-1.7.6-cuda118_hd3b444d_6.conda#78509401d0879ef5aac72b8d1e104493 +https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.0.3-cuda118_hd3b444d_0.conda#cd2836b10eb0a5dec0ee63e0a2b80609 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h0d562d8_0.conda#558ab736404275d7df61c473c1af35aa https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h9458935_0.conda#4c28f3210b30250037a4a627eeee9e0f https://conda.anaconda.org/conda-forge/linux-64/openlibm-0.8.1-hd590300_1.conda#6eba22eb06d69e53d0ca01eef42bc675 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b -https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-4_hd590300_perl5.conda#3e785bff761095eb7f8676f4694bd1b1 +https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda#f2cfec9406850991f4e3d960cc9e3321 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.46-h06160fa_0.conda#413d96a0b655c8f8aacc36473a2dbb04 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -149,7 +150,7 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#00 https://conda.anaconda.org/conda-forge/linux-64/boost-cpp-1.78.0-h6582d0a_3.conda#d3c3c7698d0b878aab1b86db95407c8e https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/bwidget-1.9.14-ha770c72_1.tar.bz2#5746d6202ba2abad4a4707f2a2462795 -https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.11.2-hb4ffafa_0.conda#aa776e4716e54633d1279cf7599c3711 +https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.12.0-hb4ffafa_0.conda#1a9b16afb84d734a1bb2d196c308d477 https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hc118613_108.conda#6fa90698000b05dfe8ce6515794fe71a https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-13.2.0-h76e1118_3.conda#4a04c8f0a51d525776f267112198684d @@ -161,25 +162,25 @@ https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.5.1-h1f77430_0.conda#1 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.1-hebfc3b9_0.conda#ddd09e8904fde46b85f41896621803e6 https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.56.2-h3905398_1.conda#0b01e6ff8002994bd4ddbffcdbec7856 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda#f36ddc11ca46958197a45effdd286e45 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.25-pthreads_h384dd9e_0.conda#637ee73ecb26ad42c38278a6619a20ca https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.18.1-h8fd135c_2.conda#bbf65f7688512872f063810623b755dc https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.37-h0054252_1.conda#f27960e8873abb5476e96ef33bdbdccd -https://conda.anaconda.org/conda-forge/linux-64/nss-3.94-h1d7d5a4_0.conda#7caef74bbfa730e014b20f0852068509 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.96-h1d7d5a4_0.conda#1c8f8b8eb041ecd54053fc4b6ad57957 https://conda.anaconda.org/conda-forge/linux-64/orc-1.9.0-h385abfd_1.conda#2cd5aac7ef1b4c6ac51bf521251a89b3 https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.1.3-h32600fe_0.conda#8287aeb8462e2d4b235eff788e75919d https://conda.anaconda.org/conda-forge/linux-64/python-3.11.6-hab00c5b_0_cpython.conda#b0dfbe2fcbfdb097d321bfd50ecddab1 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda#df56c636df4a98990462d66ac7be2330 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.2-h2c6b66d_0.conda#4f2892c672829693fd978d065db4e8be https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-h0c5db8f_5.conda#9464044754ea25557a9c93f0327d90a6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_0.conda#ae5f4ad87126c55ba3f690ef07f81d64 -https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda#06006184e203b61d3525f90de394471e +https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481c9de49f040272556e2cedf42816 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b -https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h9599702_1.conda#a8820ce2dbe6f7d54f6540d9a3a0028a https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-hbe98c3e_0.conda#067641478d8f706b80a5a434a22b82be https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py311h38be061_8.conda#5384590f14dfe6ccd02811236afc9f8e @@ -195,47 +196,47 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/config-0.5.1-pyhd8ed1ab_0.tar.bz2#97275d4898af65967b1ad57923cef770 https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda#0d07dc29b1c1cc973f76b74beb44915f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.5-py311hb755f60_0.conda#25b42509a68f96e612534af3fe2cf033 +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.7-py311hb755f60_0.conda#97b12677eec6c2fd23c7867db1c7a87d https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda#5e4f3466526c52bc9af2d2353a1460bd -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.7-pyhd8ed1ab_0.conda#12d8aae6994f342618443a8f05c652a0 -https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_2.conda#33f8066e53679dd4be2355fec849bf01 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 +https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe https://conda.anaconda.org/conda-forge/noarch/dodgy-0.2.1-py_0.tar.bz2#62a69d073f7446c90f417b0787122f5b https://conda.anaconda.org/conda-forge/noarch/ecmwf-api-client-1.6.3-pyhd8ed1ab_0.tar.bz2#15621abf59053e184114d3e1d4f9d01e https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-1.1.0-pyhd8ed1ab_0.conda#a2f2138597905eaa72e561d8efb42cf3 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.3-pyhd8ed1ab_0.conda#e6518222753f519e911e83136d2158d9 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2#348e27e78a5e39090031448c72f66d5e https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.0-py311h459d7ec_1.conda#23d0b2d02252b32ee14e5063ccfb41e2 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.10.0-pyhca7485f_0.conda#5b86cf1ceaaa9be2ec4627377e538db1 +https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h459d7ec_0.conda#b267e553a337e1878512621e374845c5 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.12.2-pyhca7485f_0.conda#bf40f2a8835b78b1f91083d306b493d2 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h6b639ba_2.conda#ee8220db21db8094998005990418fe5b https://conda.anaconda.org/conda-forge/noarch/geographiclib-1.52-pyhd8ed1ab_0.tar.bz2#6880e7100ebae550a33ce26663316d85 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyhd8ed1ab_6.conda#2ed1fe4b9079da97c44cfe9c2e5078fd -https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.1.2-pyhd8ed1ab_0.tar.bz2#3c3de74912f11d2b590184f03c7cd09b https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f -https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.9.0-py311h459d7ec_1.conda#7cc99d87755a9e64586a6004c5f0f534 +https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.10.0-py311h459d7ec_0.conda#d39020c78fd00ed774ff9c876e8aba07 https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.3-pyhd8ed1ab_0.conda#69ea1d0fa7ab33b48c88394ad1dead65 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda#420f4e9be59d0dc9133a0f43f7bab3f3 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-h409715c_0.conda#50c873c9660ed116707ae15b663928d8 https://conda.anaconda.org/conda-forge/linux-64/libpq-15.3-hbcd7760_1.conda#8afb2a97d256ffde95b91a6283bc598c https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.1-hbf2b3c1_0.conda#4963f3f12db45a576f2b8fbe9a0b8569 https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.41.1-py311ha6695c7_0.conda#60fa8c1f3fb0d99dd10a9af2aff9c400 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/lxml-4.9.3-py311h1a07684_1.conda#aab51e50d994e58efdfa5382139b0468 -https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.2-py311h38e4bf4_1.conda#f8e0b648d77bbe44d1fe8af8cc56a590 +https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.3-py311h38e4bf4_0.conda#3910c815fc788621f88b2bdc0fa9f0a6 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_1.conda#71120b5155a0c500826cf81536721a15 https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2#34fc335fc50eef0b5ea708f2b5f54e0c https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed -https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.6-py311h9547e67_0.conda#e826b71bf3dc8c91ee097663e2bcface +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.7-py311h9547e67_0.conda#3ac85c6c226e2a2e4b17864fc2ca88ff https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.4-py311h459d7ec_1.conda#3dc76316237c8f7e7231d61b76c62b7c https://conda.anaconda.org/conda-forge/noarch/munch-4.0.0-pyhd8ed1ab_0.conda#376b32e8f9d3eacbd625f37d39bd507d https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -246,29 +247,29 @@ https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.25-pthreads_h https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/pathspec-0.11.2-pyhd8ed1ab_0.conda#e41debb259e68490e3ab81e46b639ab6 +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda#17064acba08d3686f1135b5ec1b32b12 https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.1.0-pyhd8ed1ab_0.conda#45a5065664da0d1dfa8f8cd2eaf05ab9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.3.0-pyhd8ed1ab_0.conda#2390bd10bed1f3fdc7a537fb5a447d8d -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py311h459d7ec_1.conda#490d7fa8675afd1aa6f1b2332d156a45 -https://conda.anaconda.org/conda-forge/noarch/py-1.11.0-pyh6c4a22f_0.tar.bz2#b4613d7e7a493916d867842a6a148054 +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.7-py311h459d7ec_0.conda#b4f2d78860bf9c8887b528c10995b427 https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.9.1-pyhd8ed1ab_0.tar.bz2#0191dd7efe1a94262812770183b68892 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyflakes-2.5.0-pyhd8ed1ab_0.tar.bz2#1b3bef4313288ae8d35b1dfba4cd84a3 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.1-pyhd8ed1ab_0.conda#5bb8a4f4162594af97cee1434d39f500 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.0-pyhd8ed1ab_0.conda#e4dbdb3585c0266b4710467fe7b75cf4 -https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.3-pyhd8ed1ab_0.conda#2590495f608a63625e165915fb4e2e34 +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.1-pyhd8ed1ab_0.conda#4d3ceee3af4b0f9a1f48f57176bf8625 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.4-pyhd8ed1ab_0.conda#c79cacf8a06a51552fc651652f170208 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda#c93346b446cd08c169d843ae5fc0da97 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.1-py311h34ded2d_2.conda#ea365280db99687905b4d76cf6a3568c -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.13.1-py311h46250e7_0.conda#b1924481122f7cb41cb001f5c96bf3f6 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.2-py311h34ded2d_0.conda#819aa640a0493d4b52faf938e94d129e +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.16.2-py311h46250e7_0.conda#79a19e53eae4bc42b7469feb46d90bd4 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py311h459d7ec_2.conda#56bc3fe5180c0b23e05c7a5708153ac7 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df -https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.2-py311h459d7ec_0.conda#d6478cbce002db6303f0d749860f3e22 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 @@ -277,24 +278,24 @@ https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.4.4-pyhd8ed1ab_0.conda#2e2f31b3b1c866c29636377e14f8c4c6 -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.10.0-h00ab1b0_2.conda#eb0d5c122f42714f86a7058d1ce7b2e6 -https://conda.anaconda.org/conda-forge/noarch/tblib-2.0.0-pyhd8ed1ab_0.conda#f5580336fe091d46f9a2ea97da044550 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.11.0-h00ab1b0_0.conda#fde515afbbe6e36eb4564965c20b1058 +https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f https://conda.anaconda.org/conda-forge/noarch/tenacity-8.2.3-pyhd8ed1ab_0.conda#1482e77f87c6a702a7e05ef22c9b197b -https://conda.anaconda.org/conda-forge/noarch/termcolor-2.3.0-pyhd8ed1ab_0.conda#440d508f025b1692168caaf436504af3 +https://conda.anaconda.org/conda-forge/noarch/termcolor-2.4.0-pyhd8ed1ab_0.conda#a5033708ad9283907c3b1bc1f90d0d0d https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.2.0-pyha21a80b_0.conda#978d03388b62173b8e6f79162cf52b86 https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.3-pyha770c72_0.conda#074d0ce7a6261ab8b497c3518796ef3e https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py311h459d7ec_1.conda#a700fcb5cedd3e72d0c75d095c7a6eda -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.13.0-pyhd8ed1ab_0.conda#8a9953c15e1e5a7c1baddbbf4511a567 -https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2023.11.14-pyhd8ed1ab_0.conda#dee8232c4bb962881f8e67588cd31670 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.8.0-pyha770c72_0.conda#5b1be40a26d10a06f6d4f1f9e19fa0c7 -https://conda.anaconda.org/conda-forge/linux-64/ujson-5.8.0-py311hb755f60_0.conda#91e67c62c48444e4efc08fb61835abe8 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.1-pyhd8ed1ab_0.conda#1c6acfdc7ecbfe09954c4216da99c146 +https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.1.8-pyhd8ed1ab_0.conda#b120d43603f9b021d252fb7754b35557 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.9.0-pyha770c72_0.conda#a92a6440c3fe7052d63244f3aba2a4a7 +https://conda.anaconda.org/conda-forge/linux-64/ujson-5.9.0-py311hb755f60_0.conda#36dda52dc99a4fb9cadd3b738ec24848 https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-py_0.tar.bz2#1447ead40f2a01733a9c8dfc32988375 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 https://conda.anaconda.org/conda-forge/noarch/webob-1.8.7-pyhd8ed1ab_0.tar.bz2#a8192f3585f341ea66c60c189580ac67 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.3-pyhd8ed1ab_0.conda#3fc026b9c87d091c4b34a6c997324ae8 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.16.0-py311h459d7ec_0.conda#6669b5529d206c1f880b642cdd17ae05 https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.1.9-pyhd8ed1ab_0.conda#70e533db62a710ae216fdaccc4a983c8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -310,7 +311,7 @@ https://conda.anaconda.org/conda-forge/noarch/asgiref-3.7.2-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/linux-64/astroid-2.15.8-py311h38be061_0.conda#46d70fcb74472aab178991f0231ee3c6 https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.0-hf8751d9_2.conda#deb12196f0c64c441bb3d083d06d0cf8 https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.8.14-h2e270ba_2.conda#58bbee5fd6cf2d4fffbead1bc33a5d3b -https://conda.anaconda.org/conda-forge/noarch/babel-2.13.1-pyhd8ed1ab_0.conda#3ccff479c246692468f604df9c85ef26 +https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad @@ -319,167 +320,169 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.cond https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.2.0-hd9d235c_0.conda#8c57a9adbafd87f5eff842abde599cb4 https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.3.2-py311h459d7ec_0.conda#7b3145fed7adc7c63a0e08f6f29f5480 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.4.0-py311h459d7ec_0.conda#bbaf0376ed2f153a90f167ad908da3d0 https://conda.anaconda.org/conda-forge/linux-64/curl-8.1.2-h409715c_0.conda#9f88cfb15b7d08b25880b138f91e0eb4 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.2-py311h459d7ec_1.conda#afe341dbe834ae76d2c23157ff00e633 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a https://conda.anaconda.org/conda-forge/noarch/fire-0.5.0-pyhd8ed1ab_0.conda#9fd22aae8d2f319e80f68b295ab91d64 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.45.0-py311h459d7ec_0.conda#316e188c8068e6d9c55d23bbead5d6c3 -https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.0-pyhd8ed1ab_0.conda#90faaa7eaeba3cc877074c0916efe30c +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.47.0-py311h459d7ec_0.conda#f7ec87c448f714f53519fe9c87ba1747 +https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_0.conda#c75621ce68f6570fff9a6734cf21c9a7 https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.0-nompi_hb72d44e_103.conda#975973a4350ab45ff1981fe535a12af5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda#3d5fa25cf42f3f32a12b2d874ace8574 https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 -https://conda.anaconda.org/conda-forge/noarch/isort-5.12.0-pyhd8ed1ab_1.conda#07ed3421bad60867234c7a9282ea39d4 +https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda#4da50d410f553db77e62ab62ffaa1abc -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.1-py311h38be061_0.conda#175a430872841f7c351879f4c4c85b9e +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_0.conda#3f0915b1fb2252ab73686a533c5f9d3f https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda#d12374af44575413fbbd4a217d46ea33 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hfa28ad5_6.conda#ef06bee47510a7f5db3c2297a51d6ce2 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.12.0-h840a212_1.conda#03c225a73835f5aa68c13e62eb360406 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda#9f100edf65436e3eabc2a51fc00b2c37 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_1.tar.bz2#2f59daeb14581d41b1e2dda0895933b2 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.2-py311h459d7ec_1.conda#5c809fb753f06a04c2f114394404769e https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py311h0b84326_0.conda#4b24acdc1fbbae9da03147e7d2cf8c8a -https://conda.anaconda.org/conda-forge/noarch/pip-23.3.1-pyhd8ed1ab_0.conda#2400c0b86889f43aa52067161e1fb108 +https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 https://conda.anaconda.org/conda-forge/noarch/plotly-5.18.0-pyhd8ed1ab_0.conda#9f6a8664f1fe752f79473eeb9bf33a60 https://conda.anaconda.org/conda-forge/linux-64/postgresql-15.3-hd458b1d_1.conda#4a4b5dede4d2e075e9aa5a44a9fd9f20 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda#7e23a61a7fbaedfef6eb0e1ac775c8e5 https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.0.0-pyhd8ed1ab_0.conda#21de50391d584eb7f4441b9de1ad773f -https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.3-pyhd8ed1ab_0.conda#5bdca0aca30b0ee62bb84854e027eae0 +https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.4-pyhd8ed1ab_0.conda#a9d145de8c5f064b5fa68fb34725d9f4 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.1-pyhd8ed1ab_0.conda#4dc77041fea14c63ecea50ce0eb92873 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.31.0-pyhd8ed1ab_0.conda#38c2b9b24e9a58725a233f1fa32c23e9 +https://conda.anaconda.org/conda-forge/noarch/referencing-0.32.1-pyhd8ed1ab_0.conda#753a592b4e99d7d2cde6a8fd0797f414 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-py_2.tar.bz2#a11f356d6f93b74b4a84e9501afd48b4 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.5-py311h459d7ec_0.conda#1101ec27377f8e45d8431a5f21d744f1 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.1-pyhd8ed1ab_0.conda#03c97908b976498dcae97eb4e4f3149c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.8.0-hd8ed1ab_0.conda#384462e63262a527bda564fa2d9126c0 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.9.0-hd8ed1ab_0.conda#c16524c1b7227dc80b36b4fa6f77cc86 https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.1.0-pyhd8ed1ab_0.conda#f8ced8ee63830dec7ecc1be048d1470a +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.0-pyhd8ed1ab_0.conda#c119653cba436d8183c27bf6d190e587 https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.4-h8d71039_2.conda#6d5edbe22b07abae2ea0a9065ef6be12 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.1.3-h7f98852_0.tar.bz2#3cdb89236358326adfce12be820a8af3 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hd590300_0.conda#12bf78e12f71405775e1c092902959d3 https://conda.anaconda.org/conda-forge/noarch/yamale-4.0.4-pyh6c4a22f_0.tar.bz2#cc9f59f147740d88679bf1bd94dbe588 https://conda.anaconda.org/conda-forge/noarch/yamllint-1.33.0-pyhd8ed1ab_0.conda#57d32eb2c4b76ef288f9dd789f8fe5af -https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.2-py311h459d7ec_1.conda#132637a291f818a0e99c8ca468e92eb8 +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.3-py311h459d7ec_0.conda#96f995652440b0a9266d66a691d9eff9 +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.1-py311h459d7ec_0.conda#a51ceb9a9219e3c11af56b2b77794839 https://conda.anaconda.org/conda-forge/linux-64/arpack-3.7.0-hdefa2d7_2.tar.bz2#8763fe86163198ef1778d1d8d22bb078 -https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.3-pyhd8ed1ab_0.conda#3ce482ec3066e6d809dbbb1d1679f215 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.13-heb0bb06_2.conda#c0866da05d5e7bb3a3f6b68bcbf7537b -https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.1-pyhd8ed1ab_0.conda#4b85ef7c94054bdbcb5c3e5861f9dcc3 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.5-py311h63ff55d_0.conda#22584e5c97ed8f1a6b63a0ff43dba827 -https://conda.anaconda.org/conda-forge/noarch/django-4.2.7-pyhd8ed1ab_0.conda#107fbbd296283091c717acd51a3a87fd +https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.3-pyhd8ed1ab_0.conda#91fc4700dcce4a46d439900a132fe4e5 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.7-py311hcb13ee4_1.conda#ca6e04ac7262ecaec846e483d6fdc6c8 +https://conda.anaconda.org/conda-forge/noarch/django-5.0.1-pyhd8ed1ab_0.conda#1e9684296d2b6082dc5c436af3713ad1 https://conda.anaconda.org/conda-forge/noarch/flake8-5.0.4-pyhd8ed1ab_0.tar.bz2#8079ea7dec0a917dd0cb6c257f7ea9ea https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/funcargparse-0.2.5-pyhd8ed1ab_0.tar.bz2#e557b70d736251fa0bbb7c4497852a92 https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.1-h22adcc9_11.conda#514167b60f598eaed3f7a60e1dceb9ee https://conda.anaconda.org/conda-forge/linux-64/git-2.42.0-pl5321h86e50cf_0.conda#96ad24c67e0056d171385859c43218a2 -https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.40-pyhd8ed1ab_0.conda#6bf74c3b7c13079a91d4bd3da51cefcf +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.41-pyhd8ed1ab_0.conda#84874a90c312088f7b5e63402fc44a58 https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-7.3.0-hdb3a94d_0.conda#765bc76c0dfaf24ff9d8a2935b2510df https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-h8b5b2df_13.conda#29a96d50cb53638a5b4806b5ca6e4b1d -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.11.1-pyhd8ed1ab_0.conda#094ff9cf36957f95bb74cee42ab140b2 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.1-h3845be2_3.conda#f38e5e47f62d6633166040192ad420a1 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0f3d0bb_105.conda#b5d412441b84305460e9df8a016a3392 https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.0.1-hca56755_27.conda#918a735059cab21b96fc13a8d04fbcd8 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py311h64a7726_0.conda#bf16a9f625126e378302f08e7ed67517 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.11.0-pyhd8ed1ab_0.conda#8f567c0a74aa44cf732f15773b4083b0 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.3-py311h64a7726_0.conda#231eef4f33640338f64ef9ab690ba08d https://conda.anaconda.org/conda-forge/linux-64/poppler-23.05.0-hd18248d_1.conda#09e0de1aa7330fe697eed76eaeef666d -https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.2.0-pyhd8ed1ab_0.tar.bz2#d883564cf1e9ba190f6b285036c5f949 +https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.3.2-pyhd8ed1ab_0.conda#d55cd7adfc98beaef0c717c61fa3d294 https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba +https://conda.anaconda.org/conda-forge/noarch/pylint-2.17.7-pyhd8ed1ab_0.conda#3cab6aee60038b3f621bce3e50f52bed https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311ha169711_0.conda#ad4b6e9be79a89959bb6d7d308027ff2 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda#06eb685a3a0b146347a58dda979485da -https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.1-pyhd8ed1ab_0.conda#0a4d7e888fae7b7d75243414b15d0c50 +https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.3-pyhd8ed1ab_0.conda#1dbdf019d740419852c4a7803fff49d9 https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.0.0-pyhd8ed1ab_1.conda#8bdcc0f401561213821bf67513abeeff https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.12.0-pyhd8ed1ab_0.conda#ac9fedc9a0c397f2318e82525491dd83 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.4.0-pyhd8ed1ab_0.conda#b8dc6f9db1b9670e564b68277a79ffeb +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b https://conda.anaconda.org/conda-forge/noarch/python-build-1.0.3-pyhd8ed1ab_0.conda#d9ccabf228cb98419ca3d5694b25e1a2 https://conda.anaconda.org/conda-forge/noarch/rdflib-7.0.0-pyhd8ed1ab_0.conda#44d14ef95495b3d4438f28998e0296a9 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.2.2-pyhd8ed1ab_0.conda#6626918380d99292df110f3c91b6e5ec -https://conda.anaconda.org/conda-forge/linux-64/suitesparse-5.10.1-h9e50725_1.tar.bz2#a3a685b5f9aeb890ed874502fe56accf +https://conda.anaconda.org/conda-forge/linux-64/suitesparse-5.10.1-h3ec001c_2.conda#9b37d27528c5f86ee09bf1fc6834da8e https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.13.2-hd532e3d_0.conda#6d97164f19dbd27575ef1899b02dc1e0 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.14-h7f98852_1.tar.bz2#45b68dc2fc7549c16044d533ceaf340e -https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.8.6-py311h459d7ec_1.conda#7d4b63a745f293029b5689b0b5d8aa15 +https://conda.anaconda.org/conda-forge/noarch/yapf-0.40.1-pyhd8ed1ab_0.conda#f269942e802d5e148632143d4c37acc9 https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.20.3-he9c0e7f_4.conda#7695770e1d722ce9029a2ea30c060a3d https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.6.1-pyhd8ed1ab_0.conda#454ed214cec806066097ae245a409171 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.11.0-pyhd8ed1ab_0.conda#3bf8f5c3fbab9e0cfffdf5914f021854 -https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.0-py_0.tar.bz2#6e166cd37cfeadefcfca1ffe00f222bb +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.12.1-pyhd8ed1ab_0.conda#bf6ad72d882bc3f04e6a0fb50fd2cce8 +https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhca7485f_0.conda#3639cf1ff1d1368fead4d4f5d671d09a https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.32-pyhd8ed1ab_0.conda#3ef8e9bab1bfaf900bb0a5db8c0c742c +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.33-pyhd8ed1ab_0.conda#93c8f8ceb83827d88deeba796f07fba7 https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2023.8.12-py311h67b54e4_0.conda#363e5c2f2c67ff69d717aba54422b03d -https://conda.anaconda.org/conda-forge/noarch/imageio-2.31.5-pyh8c1a49c_0.conda#6820ccf6a3a27df348f18c85dd89014a +https://conda.anaconda.org/conda-forge/noarch/imageio-2.33.1-pyh8c1a49c_0.conda#1c34d58ac469a34e7e96832861368bce https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.20.0-pyhd8ed1ab_0.conda#1116d79def5268414fb0917520b2bbf1 https://conda.anaconda.org/conda-forge/linux-64/julia-1.8.5-h783901f_0.conda#98c05ba7ca9c15d22216f730499e167a -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.5.0-py311h38be061_0.conda#cee83be29258275f75029125e186ab6d +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.0-pyhd8ed1ab_0.conda#6bd3f1069cdebb44c7ae9efb900e312d https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.0-h5418a03_2.conda#30ddbe080c260fb36da8509e3fd6c45f https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h4f3791c_100.conda#405c5b3ad4ef53eb0d93043b54206dd7 https://conda.anaconda.org/conda-forge/linux-64/numba-0.58.1-py311h96b013e_0.conda#06a0313ff3d2ec956a25767ccaf7c9f6 https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.12.1-py311hb755f60_0.conda#38a2ff8ea433fe8792279b45e84b3730 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.3-py311h320fe9a_0.conda#3ea3486e16d559dfcb539070ed330a1e +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py311h320fe9a_0.conda#e44ccb61b6621bf3f8053ae66eba7397 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-heaa33ce_1.conda#cde553e0e32389e26595db4eacf859eb +https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.0-pyhd8ed1ab_0.conda#134b2b57b7865d2316a7cce1915a51ed -https://conda.anaconda.org/conda-forge/noarch/pylint-2.17.7-pyhd8ed1ab_0.conda#3cab6aee60038b3f621bce3e50f52bed +https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.3.0-pyhd8ed1ab_0.conda#7819533e674dbbc51468f3228b9b1bb6 https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 -https://conda.anaconda.org/conda-forge/noarch/pytest-html-3.2.0-pyhd8ed1ab_1.tar.bz2#d5c7a941dfbceaab4b172a56d7918eb0 +https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py311h1f0f07a_1.conda#86b71ff85f3e4c8a98b5bace6d9c4565 https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.1.1-pyhd8ed1ab_0.conda#29bf13210ee541c59166cea092b91080 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.3-py311h64a7726_1.conda#e4b4d3b764e2d029477d0db88248a8b5 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.4-py311h64a7726_0.conda#9ac5334f1b5ed072d3dbc342503d7868 https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.4-py_1.tar.bz2#a9e101e1601faf5e5a119ab2bd7617a4 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311h54d622a_1.conda#a894c65b48676c4973e9ee8b59bceb9e https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-py_0.tar.bz2#cb83a3d6ecf73f50117635192414426a https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h43474b4_0.conda#fd815765a86daf44db1e15c6f6edf5e6 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.6-pyhd8ed1ab_0.conda#fb1fc875719e217ed799a7aae11d3be4 -https://conda.anaconda.org/conda-forge/noarch/yapf-0.40.1-pyhd8ed1ab_0.conda#f269942e802d5e148632143d4c37acc9 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-hbc2ea52_17.conda#452c7b08c21eea2ef01f4fd364d6affc -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.3.1-pyhd8ed1ab_0.conda#682d698da77e896c5e986b334ce8f0a5 +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.3.3-pyhd8ed1ab_0.conda#e6b7ca7e29811c2f72f93e8188171caa https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b -https://conda.anaconda.org/conda-forge/noarch/distributed-2023.11.0-pyhd8ed1ab_0.conda#a1ee8e3043eee1649f98704ea3e6feae +https://conda.anaconda.org/conda-forge/noarch/distributed-2023.12.1-pyhd8ed1ab_0.conda#6b31b9b627f238a0068926d5650ae128 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.30.2-h1f30a5c_0.conda#21ee8444a7f629924ea8cfe52a622cbd https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h20110ff_0.conda#11f5169aeff54ad7277476be8ba19ff7 https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.0-py311h281082f_2.conda#fde4fad3c517cc80f32995696f45198d https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.0-pyhd8ed1ab_0.conda#6bd3f1069cdebb44c7ae9efb900e312d https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-h98fae49_0.conda#620e754f4344f4c27259ff460a2b9c50 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py311h54ef318_0.conda#9f80753bc008bfc9b95f39d9ff9f1694 -https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.0-pyhd8ed1ab_2.tar.bz2#363b0816e411feb0df925d4f224f026a +https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.2-pyhd8ed1ab_0.conda#61ba076de6530d9301a0053b02f093d2 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h4d7c953_100.conda#c03492d0342e512e58aa2d6c5fdaaa91 -https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.3-pyhd8ed1ab_0.tar.bz2#50ef6b29b1fb0768ca82c5aeb4fb2d96 https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.5.0-pyha770c72_0.conda#964e3d762e427661c59263435a14c492 -https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.0-pyha770c72_0.conda#473a7cfca197da0a10cff3f6dded7d4b +https://conda.anaconda.org/conda-forge/noarch/pylint-celery-0.3-py_1.tar.bz2#e29456a611a62d3f26105a2f9c68f759 +https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.5.3-pyhd8ed1ab_0.tar.bz2#00d8853fb1f87195722ea6a582cc9b56 +https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h1f0f07a_1.conda#cd36a89a048ad2bcc6d8b43f648fb1d0 https://conda.anaconda.org/conda-forge/linux-64/r-base-4.1.3-hfabd6f2_9.conda#0ab4cf54fbddc0cc9ff260c6f77f8c84 https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.8-py311h41e4db2_0.conda#b35deb26af1d7e0d98438c8ac5c6b7b2 -https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.3.2-py311hc009520_1.conda#6b92d3d0680eae9d1d9860a721f7fb51 -https://conda.anaconda.org/conda-forge/noarch/sparse-0.14.0-pyhd8ed1ab_0.conda#ee01b310177a0612554b9d20e537fdbe -https://conda.anaconda.org/conda-forge/noarch/tifffile-2023.9.26-pyhd8ed1ab_0.conda#d133bea7d8ac17552492a0629229eeb1 -https://conda.anaconda.org/conda-forge/noarch/xarray-2023.11.0-pyhd8ed1ab_0.conda#f445b20bac3db8f604a48592087b2d8f +https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.3.2-py311hc009520_2.conda#9821f8e497a791858226f535e5e0be62 +https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.1-pyhd8ed1ab_0.conda#84a76fbe19aae30e13fa99265421ea5d +https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.1-py311h1f0f07a_0.conda#11ea602c16ad004033edf648ce054f9e +https://conda.anaconda.org/conda-forge/noarch/tifffile-2023.12.9-pyhd8ed1ab_0.conda#454bc0aff84f35fa53ba9e0369737a9b +https://conda.anaconda.org/conda-forge/noarch/xarray-2023.12.0-pyhd8ed1ab_0.conda#e9b31d3ab1b0dd5fd8c24419f6560b90 https://conda.anaconda.org/conda-forge/noarch/zarr-2.16.1-pyhd8ed1ab_0.conda#59ec835edbee50266b7bdbadab7ba335 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.8.6-pyhd8ed1ab_0.conda#2e33e3bdf2b1a79989ad792ac22104d3 +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.8.7-pyhd8ed1ab_0.conda#d475dc2fac9652bcd55cec9c387fc139 https://conda.anaconda.org/conda-forge/noarch/cmocean-3.0.3-pyhd8ed1ab_0.conda#eec7df83d725696d32c7bf99aff21d82 https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.8.2-pyhd8ed1ab_0.conda#cc344a296a41369bcb05f7216661cec8 -https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyh1a96a4e_2.tar.bz2#64068564a9c2932bf30e9b4ec567927d +https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a https://conda.anaconda.org/conda-forge/noarch/esmpy-8.4.2-pyhc1e730c_4.conda#ddcf387719b2e44df0cc4dd467643951 https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.4-py311hbac4ec9_0.conda#1d3445f5f7fa002a1c149c405376f012 https://conda.anaconda.org/conda-forge/linux-64/graphviz-8.1.0-h28d9a01_0.conda#33628e0e3de7afd2c8172f76439894cb @@ -489,11 +492,9 @@ https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-hf70af60_47.conda#ee27133164cb9f5e74681bdb8839688f https://conda.anaconda.org/conda-forge/linux-64/nco-5.1.6-hd62b316_0.conda#af7780f76ee37325d264327e21a478f5 +https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.3-pyhd8ed1ab_0.conda#f551d4d859a1d70c6abff8310a655481 https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.4.3-py311h38be061_1.tar.bz2#f0c9a1067c03e8f05e53ef0c5ad5fab3 -https://conda.anaconda.org/conda-forge/linux-64/py-xgboost-1.7.6-cuda118_py311h0be3a32_6.conda#e9989e03af742084940a11c7c3c395a5 -https://conda.anaconda.org/conda-forge/noarch/pylint-celery-0.3-py_1.tar.bz2#e29456a611a62d3f26105a2f9c68f759 -https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.5.3-pyhd8ed1ab_0.tar.bz2#00d8853fb1f87195722ea6a582cc9b56 -https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b +https://conda.anaconda.org/conda-forge/linux-64/py-xgboost-2.0.3-cuda118_py311h0be3a32_0.conda#7a06b457cb9be1e68faca26333625d34 https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r41hc72bb7e_1004.tar.bz2#831186670e5786df30f8ddeb5a623c5a https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.4.1-r41h06615bd_1.tar.bz2#9a00c3283f8fb4bce68deffe08fbe09d https://conda.anaconda.org/conda-forge/noarch/r-bigmemory.sri-0.1.6-r41hc72bb7e_0.tar.bz2#926471a5be30d287a25f2d10446d6066 @@ -502,7 +503,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-cli-3.6.1-r41h38f115c_0.conda# https://conda.anaconda.org/conda-forge/noarch/r-codetools-0.2_19-r41hc72bb7e_0.conda#401ac0ee6310d69deac481b2d2148458 https://conda.anaconda.org/conda-forge/linux-64/r-colorspace-2.1_0-r41h133d619_0.conda#b6f5d77e5e0334a8adda752364bc760e https://conda.anaconda.org/conda-forge/linux-64/r-contfrac-1.1_12-r41h06615bd_1003.tar.bz2#c9cbc66278bea99ce3ce9f8be9e8c0ad -https://conda.anaconda.org/conda-forge/noarch/r-cpp11-0.4.3-r41hc72bb7e_0.tar.bz2#2362e0b8e003b884686fe27cf18c9a81 +https://conda.anaconda.org/conda-forge/noarch/r-cpp11-0.4.7-r41hc72bb7e_0.conda#a81541ceb9c2c3d40695e746b2777961 https://conda.anaconda.org/conda-forge/noarch/r-crayon-1.5.2-r41hc72bb7e_1.tar.bz2#8cf94f6451aaadf3aa1119b29115b0c7 https://conda.anaconda.org/conda-forge/linux-64/r-curl-4.3.3-r41hf9611b0_2.conda#c4047e3aa1b795a4cb5adbb5c59b3972 https://conda.anaconda.org/conda-forge/linux-64/r-desolve-1.35-r41hb20cf53_0.conda#e475d0dbe391fa76fbf742ebee6ad449 @@ -558,19 +559,17 @@ https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.39-r41ha503ecb_0.conda# https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r41hc72bb7e_1.tar.bz2#921c0ef7104d8df0ab506f1bb81a062c https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.7-r41h133d619_0.conda#4af88071a607237aa73a3cbd51788a39 https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.22.0-py311h320fe9a_2.conda#e94b7f09b52628b89e66cdbd8c3029dd -https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.0-pyhd8ed1ab_0.conda#082666331726b2438986cfe33ae9a8ee -https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.0-py311h1f0f07a_2.conda#8f1e772e5430ce48229740ec00a90b61 +https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.1-pyhd8ed1ab_0.conda#c1c0e175f993a4677c3163b26652b96c https://conda.anaconda.org/conda-forge/linux-64/cdo-2.2.0-he026af2_4.conda#6c00b0a21b3de8a149eee137e83465d3 https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_15-pl5321hf48ede7_0.conda#53c9f7169b61e615d5f41c8d70a72c00 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.11.0-pyhd8ed1ab_0.conda#d59e0cb1ca993f8f910cfdf393232acf -https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.3-pyhd8ed1ab_0.conda#f551d4d859a1d70c6abff8310a655481 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.14.0-pyhd8ed1ab_0.conda#bf099b894a9fd1dc65c881940a2f4e69 https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.4.1-py311h38be061_2.tar.bz2#4c9101d329f6bc09c2617a80e3eb9c89 https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.6.6-pyhd8ed1ab_0.conda#255f9eac03143526c8aed41d1d091c63 https://conda.anaconda.org/conda-forge/linux-64/pyarrow-12.0.1-py311h39c9aba_7_cpu.conda#d513ab8d10ec5f3ee45b419c836195ec -https://conda.anaconda.org/conda-forge/linux-64/pydot-1.4.2-py311h38be061_4.conda#5c223cb0d9c05552bf9d1586a92720b2 +https://conda.anaconda.org/conda-forge/linux-64/pydot-2.0.0-py311h38be061_0.conda#cdfd23a54a18f3c8d5320d7717f4ed52 https://conda.anaconda.org/conda-forge/linux-64/r-askpass-1.1-r41h06615bd_3.tar.bz2#c8ec8683302ad9a2345cb31ab28e6c6b https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.1-r41h7525677_1.tar.bz2#6a956b57b027b49b7a9ca48031a8bbd6 https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.2.0-r41h57805ef_0.conda#dc314ad76563387e70e0117c5398a15a @@ -597,14 +596,14 @@ https://conda.anaconda.org/conda-forge/linux-64/r-spam-2.9_1-r41hb20cf53_1.conda https://conda.anaconda.org/conda-forge/linux-64/r-timechange-0.2.0-r41h38f115c_0.conda#04a4229419d779a1e27395d70d493571 https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.4-r41h1ad5fc0_1.conda#82c1446591783493d65273a158e8ce28 https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r41h133d619_0.conda#1d432d2eba171727afd03507faa5e2f6 -https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.0-hd8ed1ab_0.conda#ebd31a95a7008b7e164dad9dbbb5bb5a +https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.1-hd8ed1ab_0.conda#8d9b6f5e94b7840210b2b9ed235068c7 https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.2-pyhd8ed1ab_0.conda#8e765a0eca0ce1cfa889cd9af82a23a8 -https://conda.anaconda.org/conda-forge/linux-64/xgboost-1.7.6-cuda118_py311h0be3a32_6.conda#f061993f8ed8ca90d2bb6a547a47109f -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.11.0-pyhd8ed1ab_0.conda#51bd005efab7e5c5c2af2570327bd213 +https://conda.anaconda.org/conda-forge/linux-64/xgboost-2.0.3-cuda118_py311h0be3a32_0.conda#f3ef3a16aa577a4daf0f8aec6306d1ab +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.14.0-pyhd8ed1ab_0.conda#fe3613d8ff5d0553ae7097ffcd364fdd https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 https://conda.anaconda.org/conda-forge/noarch/psy-maps-1.4.2-pyhd8ed1ab_0.tar.bz2#3ed13103dfd46f71dc870d188bd0b276 https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.4.0-py311h38be061_3.conda#6f7871722c07922028043144e8873b37 -https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.5-pyhd8ed1ab_0.conda#a172245c7fdb6696f2ab357501e6d13e +https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhd8ed1ab_0.conda#3fd1a0b063c1fbbe4b7bd5a5a7601e84 https://conda.anaconda.org/conda-forge/linux-64/r-akima-0.6_2.3-r41h92ddd45_0.tar.bz2#bac0b7627ef744c98f4bc48885f52e72 https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.3-r41hc72bb7e_0.tar.bz2#af0891cc9b87e2954c9a3c66f144992d @@ -623,8 +622,8 @@ https://conda.anaconda.org/conda-forge/noarch/r-scales-1.2.1-r41hc72bb7e_1.tar.b https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r41ha503ecb_3.conda#2bc51f0d44b98092ba57cf2f8671b490 https://conda.anaconda.org/conda-forge/linux-64/r-splancs-2.01_43-r41h8da6f51_1.tar.bz2#3a6aad0706541141d10e3b514467a080 https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.2-r41ha503ecb_0.conda#1f7610a1863648cab254a9f85bd29dcd -https://conda.anaconda.org/conda-forge/noarch/dask-2023.11.0-pyhd8ed1ab_0.conda#b77d7b91f78b3c50cceb19eb1611a6cf -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.11.0-pyhd8ed1ab_0.conda#e492b36cbea1c83d1663fa73a8abff9b +https://conda.anaconda.org/conda-forge/noarch/dask-2023.12.1-pyhd8ed1ab_0.conda#9a6e8eb1d188bc246883ea11f4fe6a4d +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.14.0-pyhd8ed1ab_0.conda#c48d304428e46ec8d597fd483256e74f https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.0-r41hc72bb7e_1005.tar.bz2#800e1da5bf774be48934b8865dd78d33 https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r41hc72bb7e_1004.tar.bz2#71ebed7e976df735ff3443bb88bd154f https://conda.anaconda.org/conda-forge/noarch/r-httr-1.4.6-r41hc72bb7e_0.conda#53dbb769c96782db54bf2d414fc9b239 @@ -637,7 +636,7 @@ https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r41hc72bb7e_1.tar https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.9.0-pyhd8ed1ab_0.conda#570f2c6e387fd6dac5356a5152f91b3f https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.2-r41hc72bb7e_0.conda#9922b863cd10035cbb75e3c2edae64a7 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r41h133d619_1.conda#3ae9b78fb1d8a44deed24a27cce33ebf -https://conda.anaconda.org/conda-forge/label/esmvalcore_rc/noarch/esmvalcore-2.10.0rc1-pyh39db41b_0.conda#b973ee8c35712a7d21830ed06bdbc42d +https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.10.0-pyhd8ed1ab_0.conda#18bc5ed0e0583cb0b212927795debea7 https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.4.2-r41hc72bb7e_0.conda#c2b04f4ff351d84bf51fd5a77b5c9b6c https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r41hc72bb7e_2.tar.bz2#f67eae0562ffc808b82f1590776c25f5 https://conda.anaconda.org/conda-forge/noarch/r-styler-1.10.1-r41hc72bb7e_0.conda#c12b81cff8bb8745ffbe7aeb9dfd795f @@ -652,7 +651,7 @@ https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.0.2-r41hc72bb7e_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r41hc72bb7e_1.tar.bz2#2253f130c8dab435824d6ddb10a41c73 https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.6-pyhd8ed1ab_0.tar.bz2#4409dd7e06a62c3b2aa9e96782c49c6d https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.3-pyhd8ed1ab_0.conda#0dbaa7d08d3d79b2a1a4dd6a02cc4581 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.14.3-pyhd8ed1ab_1.conda#fbe2993dd48f14724b90bf12e92cc164 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.1-pyhd8ed1ab_0.conda#0fabe529030c483e4d9eb885667ce47f https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.7-pyhd8ed1ab_0.conda#aebfabcb60c33a89c1f9290cab49bc93 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.5-pyhd8ed1ab_0.conda#ebf08f5184d8eaa486697bc060031953 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.4-pyhd8ed1ab_0.conda#a9a89000dfd19656ad004b937eeb6828 diff --git a/doc/sphinx/source/api/esmvaltool.diag_scripts.monitor.rst b/doc/sphinx/source/api/esmvaltool.diag_scripts.monitor.rst index bb43997c43..3b1e3e6548 100644 --- a/doc/sphinx/source/api/esmvaltool.diag_scripts.monitor.rst +++ b/doc/sphinx/source/api/esmvaltool.diag_scripts.monitor.rst @@ -11,6 +11,7 @@ Examples -------- * :ref:`recipe_monitor` +* :ref:`recipe_model_evaluation` Diagnostic scripts diff --git a/doc/sphinx/source/changelog.rst b/doc/sphinx/source/changelog.rst index 52c3aa3086..d1180d3b8b 100644 --- a/doc/sphinx/source/changelog.rst +++ b/doc/sphinx/source/changelog.rst @@ -3,6 +3,116 @@ Changelog ========= +v2.10.0 +------- +Highlights + +- Add a realistic IPCC example recipe that reproduces figure 9.3 from AR6. It + computes the mean sea-surface temperature anomaly between 1850-2100 over all + available CMIP6 models. See the :ref:`recipe documentation ` + or read the `blog post `__ + for more information. + +- Added more plot types to monitoring diagnostic: Hovmoeller Z vs. time, + Hovmoeller time vs latlon, variable vs. latitude are now available. See the + :ref:`recipe documentation ` for more information. + +- Add support for 4 new datasets: + + - NOAA-CIRES-20CR v3 reanalysis + - NASA MERRA reanalysis + - NOAA marine boundary layer data for CH4 + - MOBO-DIC2004-2019 + + See :ref:`supported_datasets` and :ref:`inputdata_observations` for more + information. + +- Many recipes now have up-to-date obs4MIPs dataset names so required data can + automatically be downloaded from ESGF. + +This release includes + +Bug fixes +~~~~~~~~~ + +- Update recipe shapeselect to work with shapely v2 (:pull:`3283`) :user:`lukruh` +- Correctly handle ``~`` when reading ``plot_folder`` option of monitoring diagnostic (:pull:`3449`) :user:`schlunma` +- Fixed provenance tracking for NCL multipanel PNGs (:pull:`3332`) :user:`schlunma` +- Fixed plot paths in NCL provenance tracking (:pull:`3422`) :user:`schlunma` +- Fix erroneous file_type handling in certain NCL diagnostics (:pull:`3474`) :user:`zklaus` +- Fix NCL provenance tracking (:pull:`3477`) :user:`schlunma` +- Fix plots and provenance in Russell diagnostics (:pull:`3479`) :user:`schlunma` + +Documentation +~~~~~~~~~~~~~ + +- Add merge instructions to release instructions (:pull:`3292`) :user:`remi-kazeroni` +- Update release schedule after release of v2.9.0 (:pull:`3289`) :user:`remi-kazeroni` +- Add list of failing recipes for v2.9.0 release (:pull:`3294`) :user:`remi-kazeroni` +- Update ``mamba`` version in readthedocs configuration docs builds (:pull:`3310`) :user:`valeriupredoi` +- Add Romain Beucher to citation file as contributor (:pull:`3318`) :user:`valeriupredoi` +- Removed recipe_carvalhais14nat from list of broken recipes (:pull:`3319`) :user:`remi-kazeroni` +- Add `OBS-maintainers `__ team to documentation on OBS data maintenance and CMORizer reviews (:pull:`3335`) :user:`remi-kazeroni` +- Add Pauline Bonnet to citation file (:pull:`3347`) :user:`Paulinebonnet111` +- Ensure compatible zstandard and zstd in readthedocs builds (:pull:`3362`) :user:`zklaus` +- Fix documentation build (:pull:`3397`) :user:`bouweandela` +- Minor updates to release tools (:pull:`3216`) :user:`bouweandela` +- Enhance provenance documentation (:pull:`3305`) :user:`alistairsellar` +- Re-add communities and grants in zenodo file (:pull:`3416`) :user:`valeriupredoi` +- Update Anconda badge in README (:pull:`3375`, :pull:`3453`) :user:`valeriupredoi` + +Diagnostics +~~~~~~~~~~~ + +- Slight refactoring of diagnostic script ``galytska23/select_variables_for_tigramite.py`` for generality and portability (:pull:`3298`) :user:`valeriupredoi` and :user:`egalytska` +- Allow custom variable grouping in diagnostic script ``monitor/multi_datasets.py`` (:pull:`3343`) :user:`schlunma` +- Extended monitor diagnostic with plot type variable vs. latitude (:pull:`3340`) :user:`ellensarauer` +- Add Hovmoeller Z vs. time plot to monitoring diagnostic (:pull:`3345`) :user:`cubeme` and :user:`helgehr` +- Adding Hovmoeller time vs latlon plots to monitoring recipes (:pull:`3341`) :user:`lukruh` and :user:`jeremykraftdlr` +- Implied heat transport new diagnostic (:pull:`3177`) :user:`mo-abodas` +- Recipe changes for new statistics preprocessors (percentiles) (:pull:`3351`) :user:`schlunma` +- Add a realistic example recipe (:pull:`3356`) :user:`Peter9191` and :user:`bouweandela` +- Support ``CenteredNorm`` in diagnostic monitor/multidatasets.py (:pull:`3415`) :user:`schlunma` +- Use new preprocessor statistics calling convention for recipe_easy_ipcc.yml (:pull:`3418`) :user:`bouweandela` +- Adapt to changed style scheme name in matplotlib (:pull:`3475`) :user:`zklaus` +- Add version to dataset in python example recipe to avoid "Unknown file format" issue on JASMIN (:pull:`3322`) :user:`ehogan` +- Add the dataset version in the heatwaves_coldwaves recipe to avoid the "Unknown file format" issue on JASMIN (:pull:`3373`) :user:`ehogan` + +Observational and re-analysis dataset support +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Cmorizer for NOAA-CIRES-20CR v3 reanalysis (clt, clwvi, hus, prw, rlut, rlutcs, rsut, rsutcs) (:pull:`3137`) :user:`LisaBock` +- CMORizer for NASA MERRA reanalysis (:pull:`3039`) :user:`axel-lauer` +- Download and formatting of NOAA marine boundary layer data for CH4 (NOAA-MBL-CH4) (:pull:`3301`) :user:`FranziskaWinterstein` +- Added CMORizer for MOBO-DIC2004-2019 (:pull:`3297`) :user:`schlunma` +- Update obs4MIPs dataset names in quantilebias recipe (:pull:`3330`) :user:`rbeucher` +- Update obs4MIPs dataset names in Schlund20esd recipe (:pull:`3329`) :user:`rbeucher` +- Update obs4MIPs dataset names in flatoipcc recipes (:pull:`3328`) :user:`rbeucher` +- Update obs4mips dataset names in clouds recipes (:pull:`3326`) :user:`rbeucher` +- Update Obs4MIPs dataset names in ECS recipes (:pull:`3327`) :user:`rbeucher` +- Update obs4mips dataset names in Bock et al recipes (:pull:`3324`, :pull:`3389` and :pull:`3473`) :user:`rbeucher` and :user:`bouweandela` +- Update obs4mips dataset names in radiation budget recipe (:pull:`3323`) :user:`rbeucher` +- Update Obs4MIPs dataset names in perfmetrics CMIP5 recipe (:pull:`3325`) :user:`rbeucher` + +Automatic testing +~~~~~~~~~~~~~~~~~ + +- Made sklearn test backwards-compatible with sklearn < 1.3 (:pull:`3285`) :user:`schlunma` +- Update conda lock creation Github Action workflow and ship updated conda-lock file (:pull:`3307`, :pull:`3407`) :user:`valeriupredoi` +- Compress all bash shell setters into one default option per GitHub Action workflow (:pull:`3315`) :user:`valeriupredoi` +- Remove deprecated option ``offline`` from CI configuration (:pull:`3367`) :user:`schlunma` + +Installation +~~~~~~~~~~~~ + +- Use ESMValCore v2.10 (:pull:`3486`) :user:`bouweandela` + +Improvements +~~~~~~~~~~~~ + +- Merge v2.9.x into main (:pull:`3286`) :user:`schlunma` +- Allow NCL unit conversion `kg s-1` -> `GtC y-1` (:pull:`3300`) :user:`schlunma` + .. _changelog-v2-9-0: v2.9.0 @@ -46,70 +156,70 @@ This release includes Bug fixes ~~~~~~~~~ -- Fixed usage of ``work_dir`` in some CMORizer scripts (`#3192 `__) `Rémi Kazeroni `__ -- Realize data for scalar cube in `recipe_carvalhais14nat` to avert issue from dask latest (2023.6.0) (`#3265 `__) `Valeriu Predoi `__ -- Fix failing ``mlr`` diagnostic test by adding new scikit-learn default tag (`#3273 `__) `Rémi Kazeroni `__ -- Fix ordering of models in perfmetrics diagnostic script (`#3275 `__) `Lisa Bock `__ +- Fixed usage of ``work_dir`` in some CMORizer scripts (:pull:`3192`) :user:`remi-kazeroni` +- Realize data for scalar cube in `recipe_carvalhais14nat` to avert issue from dask latest (2023.6.0) (:pull:`3265`) :user:`valeriupredoi` +- Fix failing ``mlr`` diagnostic test by adding new scikit-learn default tag (:pull:`3273`) :user:`remi-kazeroni` +- Fix ordering of models in perfmetrics diagnostic script (:pull:`3275`) :user:`LisaBock` Documentation ~~~~~~~~~~~~~ -- Update release schedule after v2.8.0 (`#3138 `__) `Rémi Kazeroni `__ -- Added reference entry for Winterstein (`#3154 `__) `FranziskaWinterstein `__ -- Show logo on PyPI (`#3185 `__) `Valeriu Predoi `__ -- Add Release Managers for v2.9.0 and v2.10.0 (`#3184 `__) `Rémi Kazeroni `__ -- Fix readthedocs build with esmpy>=8.4.0 and missing ESMFMKFILE variable (`#3205 `__) `Valeriu Predoi `__ -- Add ESMValCore release v2.8.1 into the documentation (`#3235 `__) `Rémi Kazeroni `__ -- Modified links to the tutorial (`#3236 `__) `Rémi Kazeroni `__ -- Fix gitter badge in README (`#3258 `__) `Rémi Kazeroni `__ -- Add release notes for v2.9.0 (`#3266 `__) `Bouwe Andela `__ +- Update release schedule after v2.8.0 (:pull:`3138`) :user:`remi-kazeroni` +- Added reference entry for Winterstein (:pull:`3154`) :user:`FranziskaWinterstein` +- Show logo on PyPI (:pull:`3185`) :user:`valeriupredoi` +- Add Release Managers for v2.9.0 and v2.10.0 (:pull:`3184`) :user:`remi-kazeroni` +- Fix readthedocs build with esmpy>=8.4.0 and missing ESMFMKFILE variable (:pull:`3205`) :user:`valeriupredoi` +- Add ESMValCore release v2.8.1 into the documentation (:pull:`3235`) :user:`remi-kazeroni` +- Modified links to the tutorial (:pull:`3236`) :user:`remi-kazeroni` +- Fix gitter badge in README (:pull:`3258`) :user:`remi-kazeroni` +- Add release notes for v2.9.0 (:pull:`3266`) :user:`bouweandela` Diagnostics ~~~~~~~~~~~ -- New plot_type 1d_profile in monitor (`#3178 `__) `FranziskaWinterstein `__ -- Add Seaborn diagnostic (`#3155 `__) `Manuel Schlund `__ -- New recipe and diagnostic for Arctic-midlatitude research (`#3021 `__) `Evgenia Galytska `__ -- Generate climatology on the fly for AutoAssess soil moisture (`#3197 `__) `Alistair Sellar `__ -- Remove "fx_variables" from recipe_tebaldi21esd.yml (`#3211 `__) `Birgit Hassler `__ -- Remove "fx_variables" from ipccwg1ar5ch9 recipes (`#3215 `__) `katjaweigel `__ -- Remove "fx_variables" from recipe_wenzel14jgr.yml (`#3212 `__) `Birgit Hassler `__ -- Update obs4MIPs dataset to the current naming scheme in recipe_smpi.yml (`#2991 `__) `Bouwe Andela `__ -- Fixed pandas diagnostics for pandas>=2.0.0 (`#3209 `__) `Manuel Schlund `__ -- Update recipe_impact.yml to work with newer versions of `pandas` (`#3220 `__) `Bouwe Andela `__ -- Add variable long names to provenance record in monitoring diagnostics (`#3222 `__) `Brei Soliño `__ +- New plot_type 1d_profile in monitor (:pull:`3178`) :user:`FranziskaWinterstein` +- Add Seaborn diagnostic (:pull:`3155`) :user:`schlunma` +- New recipe and diagnostic for Arctic-midlatitude research (:pull:`3021`) :user:`egalytska` +- Generate climatology on the fly for AutoAssess soil moisture (:pull:`3197`) :user:`alistairsellar` +- Remove "fx_variables" from recipe_tebaldi21esd.yml (:pull:`3211`) :user:`hb326` +- Remove "fx_variables" from ipccwg1ar5ch9 recipes (:pull:`3215`) :user:`katjaweigel` +- Remove "fx_variables" from recipe_wenzel14jgr.yml (:pull:`3212`) :user:`hb326` +- Update obs4MIPs dataset to the current naming scheme in recipe_smpi.yml (:pull:`2991`) :user:`bouweandela` +- Fixed pandas diagnostics for pandas>=2.0.0 (:pull:`3209`) :user:`schlunma` +- Update recipe_impact.yml to work with newer versions of `pandas` (:pull:`3220`) :user:`bouweandela` +- Add variable long names to provenance record in monitoring diagnostics (:pull:`3222`) :user:`bsolino` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Add CMORizer for GPCP-SG (pr) (`#3150 `__) `FranziskaWinterstein `__ -- Extension of NASA MERRA2 CMORizer (cl, cli, clivi, clw, clwvi) (`#3167 `__) `Axel Lauer `__ +- Add CMORizer for GPCP-SG (pr) (:pull:`3150`) :user:`FranziskaWinterstein` +- Extension of NASA MERRA2 CMORizer (cl, cli, clivi, clw, clwvi) (:pull:`3167`) :user:`axel-lauer` Automatic testing ~~~~~~~~~~~~~~~~~ -- Add a CircleCI-testing-specific ``recipe_python_for_CI.yml`` to avoid calling geolocator/Nominatim over CI (`#3159 `__) `Valeriu Predoi `__ -- Check if Python minor version changed after Julia install in development installation test (`#3213 `__) `Valeriu Predoi `__ -- Fix tests using deprecated ``esmvalcore._config`` module that has been removed in ESMValCore v2.9 (`#3204 `__) `Valeriu Predoi `__ +- Add a CircleCI-testing-specific ``recipe_python_for_CI.yml`` to avoid calling geolocator/Nominatim over CI (:pull:`3159`) :user:`valeriupredoi` +- Check if Python minor version changed after Julia install in development installation test (:pull:`3213`) :user:`valeriupredoi` +- Fix tests using deprecated ``esmvalcore._config`` module that has been removed in ESMValCore v2.9 (:pull:`3204`) :user:`valeriupredoi` Installation ~~~~~~~~~~~~ -- Add support for Python=3.11 (`#3173 `__) `Valeriu Predoi `__ -- Drop python=3.8 support (`#3193 `__) `Valeriu Predoi `__ -- Repair generation of conda lock files (`#3148 `__) `Valeriu Predoi `__ -- Modernize lock creation script and repair lock generation (`#3174 `__) `Valeriu Predoi `__ -- Pin numpy !=1.24.3 due to severe masking bug (`#3182 `__) `Valeriu Predoi `__ -- Update xesmf to versions >= 0.4.0 (`#2728 `__) `Klaus Zimmermann `__ -- Update esmpy import for ESMF version 8.4.0 or larger (`#3188 `__) `Valeriu Predoi `__ -- Relax the pin on iris to allow the use of older versions for performance reasons (`#3270 `__) `Bouwe Andela `__ -- Use ESMValCore v2.9.0 (`#3274 `__) `Bouwe Andela `__ +- Add support for Python=3.11 (:pull:`3173`) :user:`valeriupredoi` +- Drop python=3.8 support (:pull:`3193`) :user:`valeriupredoi` +- Repair generation of conda lock files (:pull:`3148`) :user:`valeriupredoi` +- Modernize lock creation script and repair lock generation (:pull:`3174`) :user:`valeriupredoi` +- Pin numpy !=1.24.3 due to severe masking bug (:pull:`3182`) :user:`valeriupredoi` +- Update xesmf to versions >= 0.4.0 (:pull:`2728`) :user:`zklaus` +- Update esmpy import for ESMF version 8.4.0 or larger (:pull:`3188`) :user:`valeriupredoi` +- Relax the pin on iris to allow the use of older versions for performance reasons (:pull:`3270`) :user:`bouweandela` +- Use ESMValCore v2.9.0 (:pull:`3274`) :user:`bouweandela` Improvements ~~~~~~~~~~~~ -- Update pre-commit hooks (`#3189 `__) `Bouwe Andela `__ -- Add support for using a dask distributed scheduler (`#3151 `__) `Bouwe Andela `__ +- Update pre-commit hooks (:pull:`3189`) :user:`bouweandela` +- Add support for using a dask distributed scheduler (:pull:`3151`) :user:`bouweandela` .. _changelog-v2-8-0: @@ -152,22 +262,22 @@ Backwards incompatible changes Please read the descriptions of the linked pull requests for detailed upgrade instructions. - Deprecated features scheduled for removal in v2.8.0 or earlier have now been removed - (`#2941 `__) - `Manuel Schlund `__. + (:pull:`2941`) + :user:`schlunma`. Removed ``esmvaltool.iris_helpers.var_name_constraint`` (has been deprecated in v2.6.0; please use :class:`iris.NameConstraint` with the keyword argument ``var_name`` instead). Removed `write_netcdf` and `write_plots` from `recipe_filer.py`. - No files from the ``native6`` project will be found if a non-existent version of a dataset is specified (`#3041 `_) - `Rémi Kazeroni `__. + :user:`remi-kazeroni`. The tool now searches for exact ``version`` of ``native6`` datasets. Therefore, it is necessary to make sure that the version number in the directory tree matches with the version number in the recipe to find the files. - The conversion of precipitation units from monitoring diagnostic is now done at the preprocessor stage (`#3049 `_) - `Manuel Schlund `__. + :user:`schlunma`. To use the unit conversion for precipitation in the new version of this diagnostic, add it as a preprocessor for the precipitation dataset to the recipe. @@ -175,145 +285,145 @@ Please read the descriptions of the linked pull requests for detailed upgrade in Bug fixes ~~~~~~~~~ -- Fix for provenance records from `seaice_tsline.ncl` (`#2938 `__) `Axel Lauer `__ -- Fix in `validation.py` for resolving datasets with identical names by using distinct aliases (`#2955 `__) `FranziskaWinterstein `__ -- Bugfix: masking of non-significant differences in `zonal.ncl` (perfmetrics) (`#2957 `__) `Axel Lauer `__ -- Fix typo in `perfmetrics/main.ncl` to add tropopause (`#2966 `__) `FranziskaWinterstein `__ -- Fix .png bug in `wenzel16nat` diagnostics (`#2976 `__) `Axel Lauer `__ -- `Recipe_ocean_Landschuetzer2016`: Fix typo in filename to run model vs OBS diagnostics (`#2997 `__) `Tomas Torsvik `__ -- Fix read_cmor in NCL utilities (`#3007 `__) `Axel Lauer `__ -- Removed usages of deprecated features that cause diagnostic crashes (`#3009 `__) `Manuel Schlund `__ -- Replace removed `matplotlib.pyplot.savefig` option `additional_artists` (`#3075 `__) `Manuel Schlund `__ -- Added missing comma to `sommer17joss.bibtex` (`#3078 `__) `Manuel Schlund `__ -- Fix call of output_type in `aux_plotting.ncl` (`#3083 `__) `Lisa Bock `__ -- Remove colorbar from `bbox_extra_artists` (`#3087 `__) `Manuel Schlund `__ -- Fix `MPI-ESM1-2-HR` entries in `recipe_tebaldi21esd` (`#3093 `__) `Rémi Kazeroni `__ -- Fix bug in provenance writing of `perfmetrics` recipes v2.8.0 (`#3098 `__) `Axel Lauer `__ -- Fix `recipe_sea_surface_salinity` for v2.8 (`#3102 `__) `sloosvel `__ -- Fix variable `short_name` and metadata for ESACCI-LST CMORizer (`#3104 `__) `Rémi Kazeroni `__ -- Fix `recipe_carvalhais14`: replace outline patch with splines (`#3111 `__) `Valeriu Predoi `__ -- Replace deprecated function `cm.register_cmap` with `mpl.colormaps.register` for `recipe_ arctic_ocean` (`#3112 `__) `Tomas Torsvik `__ -- Fix `recipe_extract_shape.yml` (lacking caption for provenance) (`#3126 `__) `Valeriu Predoi `__ +- Fix for provenance records from `seaice_tsline.ncl` (:pull:`2938`) :user:`axel-lauer` +- Fix in `validation.py` for resolving datasets with identical names by using distinct aliases (:pull:`2955`) :user:`FranziskaWinterstein` +- Bugfix: masking of non-significant differences in `zonal.ncl` (perfmetrics) (:pull:`2957`) :user:`axel-lauer` +- Fix typo in `perfmetrics/main.ncl` to add tropopause (:pull:`2966`) :user:`FranziskaWinterstein` +- Fix .png bug in `wenzel16nat` diagnostics (:pull:`2976`) :user:`axel-lauer` +- `Recipe_ocean_Landschuetzer2016`: Fix typo in filename to run model vs OBS diagnostics (:pull:`2997`) :user:`TomasTorsvik` +- Fix read_cmor in NCL utilities (:pull:`3007`) :user:`axel-lauer` +- Removed usages of deprecated features that cause diagnostic crashes (:pull:`3009`) :user:`schlunma` +- Replace removed `matplotlib.pyplot.savefig` option `additional_artists` (:pull:`3075`) :user:`schlunma` +- Added missing comma to `sommer17joss.bibtex` (:pull:`3078`) :user:`schlunma` +- Fix call of output_type in `aux_plotting.ncl` (:pull:`3083`) :user:`LisaBock` +- Remove colorbar from `bbox_extra_artists` (:pull:`3087`) :user:`schlunma` +- Fix `MPI-ESM1-2-HR` entries in `recipe_tebaldi21esd` (:pull:`3093`) :user:`remi-kazeroni` +- Fix bug in provenance writing of `perfmetrics` recipes v2.8.0 (:pull:`3098`) :user:`axel-lauer` +- Fix `recipe_sea_surface_salinity` for v2.8 (:pull:`3102`) :user:`sloosvel` +- Fix variable `short_name` and metadata for ESACCI-LST CMORizer (:pull:`3104`) :user:`remi-kazeroni` +- Fix `recipe_carvalhais14`: replace outline patch with splines (:pull:`3111`) :user:`valeriupredoi` +- Replace deprecated function `cm.register_cmap` with `mpl.colormaps.register` for `recipe_ arctic_ocean` (:pull:`3112`) :user:`TomasTorsvik` +- Fix `recipe_extract_shape.yml` (lacking caption for provenance) (:pull:`3126`) :user:`valeriupredoi` Community ~~~~~~~~~ -- Update documentation on pre-installed versions on HPC clusters (`#2934 `__) `Rémi Kazeroni `__ +- Update documentation on pre-installed versions on HPC clusters (:pull:`2934`) :user:`remi-kazeroni` Deprecations ~~~~~~~~~~~~ -- Remove radiation recipes that have been superseded by :ref:`recipe_radiation_budget ` along with associated diagnostic scripts (`#3115 `_) `Alistair Sellar `__ +- Remove radiation recipes that have been superseded by :ref:`recipe_radiation_budget ` along with associated diagnostic scripts (`#3115 `_) :user:`alistairsellar` Documentation ~~~~~~~~~~~~~ -- Backward compatibility policy (`#2879 `__) `Alistair Sellar `__ -- Suppress installing and reinstalling dependencies with pip during readthedocs builds (`#2913 `__) `Valeriu Predoi `__ -- Update installation instructions (`#2939 `__) `Bouwe Andela `__ -- Update documentation for `recipe_extreme_index` (`#2951 `__) `katjaweigel `__ -- Update documentation and `recipe_check_obs` (ERA5) (`#2952 `__) `Axel Lauer `__ -- Updated ICON dataset entry in documentation (`#2954 `__) `Manuel Schlund `__ -- Add Franziska Winterstein as collaborator in CITATION file (`#3001 `__) `Valeriu Predoi `__ -- Update release schedule for v2.7.0 and v2.8.0 (`#3010 `__) `Rémi Kazeroni `__ -- Add ESMValCore Bugfix release v2.7.1 to the release overview table (`#3028 `__) `Valeriu Predoi `__ -- Detailed instructions for release procedure: running recipes and analyzing the output (`#3032 `__) `Valeriu Predoi `__ -- Link backward compatibility policy to top level of ESMValCore changelog (`#3052 `__) `Alistair Sellar `__ -- Update release instructions (`#3066 `__) `Rémi Kazeroni `__ -- Updated docs and tests regarding new `search_esgf` option (`#3069 `__) `Manuel Schlund `__ -- Update script to draft release notes (`#3070 `__) `Rémi Kazeroni `__ -- Synchronize documentation table of contents with ESMValCore (`#3073 `__) `Bouwe Andela `__ -- Update environment handling in release documentation (`#3096 `__) `Rémi Kazeroni `__ -- Clarify use (or not) of Jasmin climatology files by soil moisture & permafrost recipes (`#3103 `__) `Alistair Sellar `__ -- Add link to recipe portal in the gallery page (`#3113 `__) `Rémi Kazeroni `__ -- Improve stratosphere documentation (`#3114 `__) `Alistair Sellar `__ -- Added note to documentation that not all datasets used in `schlund20jgr` recipes are available on ESGF (`#3121 `__) `Manuel Schlund `__ -- Draft changelog for `v2.8.0` (`#3124 `__) `Rémi Kazeroni `__ -- Documenting broken recipes after recipe testing for releases (`#3129 `__) `Rémi Kazeroni `__ -- Increase ESMValTool version to 2.8.0 and update release dates (`#3136 `__) `Rémi Kazeroni `__ +- Backward compatibility policy (:pull:`2879`) :user:`alistairsellar` +- Suppress installing and reinstalling dependencies with pip during readthedocs builds (:pull:`2913`) :user:`valeriupredoi` +- Update installation instructions (:pull:`2939`) :user:`bouweandela` +- Update documentation for `recipe_extreme_index` (:pull:`2951`) :user:`katjaweigel` +- Update documentation and `recipe_check_obs` (ERA5) (:pull:`2952`) :user:`axel-lauer` +- Updated ICON dataset entry in documentation (:pull:`2954`) :user:`schlunma` +- Add Franziska Winterstein as collaborator in CITATION file (:pull:`3001`) :user:`valeriupredoi` +- Update release schedule for v2.7.0 and v2.8.0 (:pull:`3010`) :user:`remi-kazeroni` +- Add ESMValCore Bugfix release v2.7.1 to the release overview table (:pull:`3028`) :user:`valeriupredoi` +- Detailed instructions for release procedure: running recipes and analyzing the output (:pull:`3032`) :user:`valeriupredoi` +- Link backward compatibility policy to top level of ESMValCore changelog (:pull:`3052`) :user:`alistairsellar` +- Update release instructions (:pull:`3066`) :user:`remi-kazeroni` +- Updated docs and tests regarding new `search_esgf` option (:pull:`3069`) :user:`schlunma` +- Update script to draft release notes (:pull:`3070`) :user:`remi-kazeroni` +- Synchronize documentation table of contents with ESMValCore (:pull:`3073`) :user:`bouweandela` +- Update environment handling in release documentation (:pull:`3096`) :user:`remi-kazeroni` +- Clarify use (or not) of Jasmin climatology files by soil moisture & permafrost recipes (:pull:`3103`) :user:`alistairsellar` +- Add link to recipe portal in the gallery page (:pull:`3113`) :user:`remi-kazeroni` +- Improve stratosphere documentation (:pull:`3114`) :user:`alistairsellar` +- Added note to documentation that not all datasets used in `schlund20jgr` recipes are available on ESGF (:pull:`3121`) :user:`schlunma` +- Draft changelog for `v2.8.0` (:pull:`3124`) :user:`remi-kazeroni` +- Documenting broken recipes after recipe testing for releases (:pull:`3129`) :user:`remi-kazeroni` +- Increase ESMValTool version to 2.8.0 and update release dates (:pull:`3136`) :user:`remi-kazeroni` Diagnostics ~~~~~~~~~~~ -- Cloud diagnostics for Lauer et al. (2023) (`#2750 `__) `Axel Lauer `__ -- Splitting of `flato13ipcc.yml` into separate recipes and adding recipes for regional Figures (`#2156 `__) `katjaweigel `__ -- Adding IPCC AR6 Chapter 3 Figure 3.43 - Pattern Correlation (`#2772 `__) `Lisa Bock `__ -- Adding IPCC AR6 Chapter 3 Fig. 3.42 - Perfmetrics (`#2856 `__) `Lisa Bock `__ -- Comment missing datasets and remove deprecated argument in `recipe_climate_change_hotspot` (`#2920 `__) `sloosvel `__ -- Add plot type `annual_cycle` to multi-dataset monitoring diagnostic (`#2922 `__) `Manuel Schlund `__ -- Adding IPCC AR6 Chapter 3 Fig. 3.19 - Speed-Up Of Zonal Mean Wind (`#2984 `__) `Lisa Bock `__ -- Adding IPCC AR6 Chapter 3 Fig. 3.9 - Attribution (`#2986 `__) `Lisa Bock `__ -- Obs4mips CERES-EBAF: update version to latest available through esgf in `recipe_validation.yml` (`#3002 `__) `Valeriu Predoi `__ -- Improve flexibility of cloud diagnostics (`#3016 `__) `Axel Lauer `__ -- Let `recipe_impact.yml` write a CSV file that can directly be used in C4I portal (`#2258 `__) `Peter Kalverla `__ -- Fix version numbers of native6 datasets in recipes (`#3041`_) `Rémi Kazeroni `__ -- Removed automatic conversion of precipitation units from monitoring diagnostic (`#3049`_) `Manuel Schlund `__. -- Updated recipes for ESMValCore v2.8 (`#3064 `__) `Manuel Schlund `__ -- Fix `cos22esd` for release of 2.8 (`#3097 `__) `sloosvel `__ -- Diagnostic for `recipe_autoassess_stratosphere.yml`: remove unused feature incompatible with Matplotlib=3.7.1 (`#3089 `__) `Valeriu Predoi `__ -- Fix numpy deprecation in `hype` diagnostic (`#3101 `__) `Peter Kalverla `__ -- Remove superseded radiation recipes (`#3115`_) `Alistair Sellar `__ -- Removed `fx_variables` in `recipe_mpqb_xch4` and `recipe_lauer22jclim_fig8` (`#3117 `__) `Axel Lauer `__ -- Update Python example recipe (`#3119 `__) `Bouwe Andela `__ -- Updated figure settings to account for newer matplotlib version (`#3133 `__) `katjaweigel `__ +- Cloud diagnostics for Lauer et al. (2023) (:pull:`2750`) :user:`axel-lauer` +- Splitting of `flato13ipcc.yml` into separate recipes and adding recipes for regional Figures (:pull:`2156`) :user:`katjaweigel` +- Adding IPCC AR6 Chapter 3 Figure 3.43 - Pattern Correlation (:pull:`2772`) :user:`LisaBock` +- Adding IPCC AR6 Chapter 3 Fig. 3.42 - Perfmetrics (:pull:`2856`) :user:`LisaBock` +- Comment missing datasets and remove deprecated argument in `recipe_climate_change_hotspot` (:pull:`2920`) :user:`sloosvel` +- Add plot type `annual_cycle` to multi-dataset monitoring diagnostic (:pull:`2922`) :user:`schlunma` +- Adding IPCC AR6 Chapter 3 Fig. 3.19 - Speed-Up Of Zonal Mean Wind (:pull:`2984`) :user:`LisaBock` +- Adding IPCC AR6 Chapter 3 Fig. 3.9 - Attribution (:pull:`2986`) :user:`LisaBock` +- Obs4mips CERES-EBAF: update version to latest available through esgf in `recipe_validation.yml` (:pull:`3002`) :user:`valeriupredoi` +- Improve flexibility of cloud diagnostics (:pull:`3016`) :user:`axel-lauer` +- Let `recipe_impact.yml` write a CSV file that can directly be used in C4I portal (:pull:`2258`) :user:`Peter9192` +- Fix version numbers of native6 datasets in recipes (`#3041`_) :user:`remi-kazeroni` +- Removed automatic conversion of precipitation units from monitoring diagnostic (`#3049`_) :user:`schlunma`. +- Updated recipes for ESMValCore v2.8 (:pull:`3064`) :user:`schlunma` +- Fix `cos22esd` for release of 2.8 (:pull:`3097`) :user:`sloosvel` +- Diagnostic for `recipe_autoassess_stratosphere.yml`: remove unused feature incompatible with Matplotlib=3.7.1 (:pull:`3089`) :user:`valeriupredoi` +- Fix numpy deprecation in `hype` diagnostic (:pull:`3101`) :user:`Peter9192` +- Remove superseded radiation recipes (`#3115`_) :user:`alistairsellar` +- Removed `fx_variables` in `recipe_mpqb_xch4` and `recipe_lauer22jclim_fig8` (:pull:`3117`) :user:`axel-lauer` +- Update Python example recipe (:pull:`3119`) :user:`bouweandela` +- Updated figure settings to account for newer matplotlib version (:pull:`3133`) :user:`katjaweigel` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Earth System Data Cube (ESDC) cmorizer (`#2799 `__) `Brei Soliño `__ -- Added CMORizer for Landschützer2020 (spco2) (`#2908 `__) `Manuel Schlund `__ -- Added CMORizer for MOBO-DIC_MPIM (dissic) (`#2909 `__) `Manuel Schlund `__ -- Added CMORizer for OceanSODA-ETHZ (areacello, co3os, dissicos, fgco2, phos, spco2, talkos) (`#2915 `__) `Manuel Schlund `__ -- Extension of ERA-Interim CMORizer (cl, cli, clw, lwp, rlut, rlutcs, rsut, rsutcs) (`#2923 `__) `Axel Lauer `__ -- Add JRA-25 cmorizer (clt, hus, prw, rlut, rlutcs, rsut, rsutcs) (`#2927 `__) `Lisa Bock `__ -- New CMORizers for datasets from the NCEP family (NCEP-DOE-R2, NCEP-NCAR-R1, NOAA-CIRES-20CR) (`#2931 `__) `Birgit Hassler `__ -- Updates to the recipes that use the NCEP reanalysis dataset (`#2932 `__) `Birgit Hassler `__ -- MERRA2 cmorizer convert vertical level coordinate units from hPa to Pa (`#3003 `__) `Valeriu Predoi `__ -- MERRA2 cmorizer set UNLIMITED time coordinate (`#3006 `__) `Valeriu Predoi `__ -- Added CMORizers for TCOM-CH4 (CH4) and TCOM-N2O (N2O) (`#3014 `__) `Manuel Schlund `__ -- Update HadISST cmorizer to include recent years (`#3027 `__) `Rémi Kazeroni `__ +- Earth System Data Cube (ESDC) cmorizer (:pull:`2799`) :user:`bsolino` +- Added CMORizer for Landschützer2020 (spco2) (:pull:`2908`) :user:`schlunma` +- Added CMORizer for MOBO-DIC_MPIM (dissic) (:pull:`2909`) :user:`schlunma` +- Added CMORizer for OceanSODA-ETHZ (areacello, co3os, dissicos, fgco2, phos, spco2, talkos) (:pull:`2915`) :user:`schlunma` +- Extension of ERA-Interim CMORizer (cl, cli, clw, lwp, rlut, rlutcs, rsut, rsutcs) (:pull:`2923`) :user:`axel-lauer` +- Add JRA-25 cmorizer (clt, hus, prw, rlut, rlutcs, rsut, rsutcs) (:pull:`2927`) :user:`LisaBock` +- New CMORizers for datasets from the NCEP family (NCEP-DOE-R2, NCEP-NCAR-R1, NOAA-CIRES-20CR) (:pull:`2931`) :user:`hb326` +- Updates to the recipes that use the NCEP reanalysis dataset (:pull:`2932`) :user:`hb326` +- MERRA2 cmorizer convert vertical level coordinate units from hPa to Pa (:pull:`3003`) :user:`valeriupredoi` +- MERRA2 cmorizer set UNLIMITED time coordinate (:pull:`3006`) :user:`valeriupredoi` +- Added CMORizers for TCOM-CH4 (CH4) and TCOM-N2O (N2O) (:pull:`3014`) :user:`schlunma` +- Update HadISST cmorizer to include recent years (:pull:`3027`) :user:`remi-kazeroni` Automatic testing ~~~~~~~~~~~~~~~~~ -- Add DKRZ/Levante batch scripts for release recipe running (`#2883 `__) `Valeriu Predoi `__ -- Remove `pytest-flake8` and call the use of `flake8` straight (`#2904 `__) `Valeriu Predoi `__ -- Unpin `flake8` (`#2937 `__) `Valeriu Predoi `__ -- Fix failing tests that use deprecated feature of `sklearn` (`#2961 `__) `Manuel Schlund `__ -- Fix recipe loading tests for esmvalcore before and after version 2.8 (`#3020 `__) `Valeriu Predoi `__ -- Update recipe load test for v2.8 (`#3040 `__) `Bouwe Andela `__ -- Test running recipes with the development version of ESMValCore (`#3072 `__) `Bouwe Andela `__ -- Fix `test_naming.py` so it doesn't let through directories that need be ignored (`#3082 `__) `Valeriu Predoi `__ -- Conda environment files for interim use of `esmvalcore=2.8.0rc1` (`#3090 `__) `Valeriu Predoi `__ -- Move `flake8` check to a step separate from installation on CircleCI (`#3105 `__) `Bouwe Andela `__ -- Recreate conda lock file to harpoon esmvalcore=2.8.0rc1 (`#3108 `__) `Valeriu Predoi `__ -- Update batch script generation to run all recipes in one command (`#3130 `__) `Rémi Kazeroni `__ +- Add DKRZ/Levante batch scripts for release recipe running (:pull:`2883`) :user:`valeriupredoi` +- Remove `pytest-flake8` and call the use of `flake8` straight (:pull:`2904`) :user:`valeriupredoi` +- Unpin `flake8` (:pull:`2937`) :user:`valeriupredoi` +- Fix failing tests that use deprecated feature of `sklearn` (:pull:`2961`) :user:`schlunma` +- Fix recipe loading tests for esmvalcore before and after version 2.8 (:pull:`3020`) :user:`valeriupredoi` +- Update recipe load test for v2.8 (:pull:`3040`) :user:`bouweandela` +- Test running recipes with the development version of ESMValCore (:pull:`3072`) :user:`bouweandela` +- Fix `test_naming.py` so it doesn't let through directories that need be ignored (:pull:`3082`) :user:`valeriupredoi` +- Conda environment files for interim use of `esmvalcore=2.8.0rc1` (:pull:`3090`) :user:`valeriupredoi` +- Move `flake8` check to a step separate from installation on CircleCI (:pull:`3105`) :user:`bouweandela` +- Recreate conda lock file to harpoon esmvalcore=2.8.0rc1 (:pull:`3108`) :user:`valeriupredoi` +- Update batch script generation to run all recipes in one command (:pull:`3130`) :user:`remi-kazeroni` Installation ~~~~~~~~~~~~ -- Merge release branch `release_270stable` in main so we pick up unsquashed commits and set the correct version 2.7.0 for main (and up version in CITATION.cff) (`#2896 `__) `Valeriu Predoi `__ -- Unpin `NetCDF4` (`#2929 `__) `Valeriu Predoi `__ -- Unpin `cf-units` (`#2930 `__) `Bouwe Andela `__ -- Set the version number on the development branches to one minor version more than the last release (`#2964 `__) `Bouwe Andela `__ -- Pin `shapely<2.0.0` for linux64 (`#2970 `__) `Valeriu Predoi `__ -- Unpin `matplotlib` (`#3068 `__) `Valeriu Predoi `__ -- Add `packaging` as direct dependency to ESMValTool (`#3099 `__) `Valeriu Predoi `__ -- Re-pin sphinx to latest (6.1.3) and add nbsphinx to the environment (`#3118 `__) `Valeriu Predoi `__ -- Conda environment files for esmvalcore=2.8.0rc2 (`#3120 `__) `Rémi Kazeroni `__ -- Remove rc (release candidates) conda channel and re-pin esmvalcore to new stable 2.8 (`#3131 `__) `Valeriu Predoi `__ +- Merge release branch `release_270stable` in main so we pick up unsquashed commits and set the correct version 2.7.0 for main (and up version in CITATION.cff) (:pull:`2896`) :user:`valeriupredoi` +- Unpin `NetCDF4` (:pull:`2929`) :user:`valeriupredoi` +- Unpin `cf-units` (:pull:`2930`) :user:`bouweandela` +- Set the version number on the development branches to one minor version more than the last release (:pull:`2964`) :user:`bouweandela` +- Pin `shapely<2.0.0` for linux64 (:pull:`2970`) :user:`valeriupredoi` +- Unpin `matplotlib` (:pull:`3068`) :user:`valeriupredoi` +- Add `packaging` as direct dependency to ESMValTool (:pull:`3099`) :user:`valeriupredoi` +- Re-pin sphinx to latest (6.1.3) and add nbsphinx to the environment (:pull:`3118`) :user:`valeriupredoi` +- Conda environment files for esmvalcore=2.8.0rc2 (:pull:`3120`) :user:`remi-kazeroni` +- Remove rc (release candidates) conda channel and re-pin esmvalcore to new stable 2.8 (:pull:`3131`) :user:`valeriupredoi` Improvements ~~~~~~~~~~~~ -- Read `config-user.yml` using `esmvalcore.config` module (`#2736 `__) `Bouwe Andela `__ -- Make results of recipes `schlund20jgr_*.yml` deterministic (`#2900 `__) `Manuel Schlund `__ -- `Recipe_gier2020bg.yml`: add sorting to SA barplot (`#2905 `__) `Bettina Gier `__ -- Add the outline of a climatological tropopause to the zonalmean_profile plots (`#2947 `__) `FranziskaWinterstein `__ -- Update data finder imports (`#2958 `__) `Bouwe Andela `__ -- Add support for the upcoming ESMValCore v2.8 release to the recipe filler tool (`#2995 `__) `Bouwe Andela `__ -- Updated monitoring diagnostics with netCDF output and additional logging (`#3029 `__) `Manuel Schlund `__ -- Use aliases in perfmetrics (`#3058 `__) `FranziskaWinterstein `__ +- Read `config-user.yml` using `esmvalcore.config` module (:pull:`2736`) :user:`bouweandela` +- Make results of recipes `schlund20jgr_*.yml` deterministic (:pull:`2900`) :user:`schlunma` +- `Recipe_gier2020bg.yml`: add sorting to SA barplot (:pull:`2905`) :user:`bettina-gier` +- Add the outline of a climatological tropopause to the zonalmean_profile plots (:pull:`2947`) :user:`FranziskaWinterstein` +- Update data finder imports (:pull:`2958`) :user:`bouweandela` +- Add support for the upcoming ESMValCore v2.8 release to the recipe filler tool (:pull:`2995`) :user:`bouweandela` +- Updated monitoring diagnostics with netCDF output and additional logging (:pull:`3029`) :user:`schlunma` +- Use aliases in perfmetrics (:pull:`3058`) :user:`FranziskaWinterstein` .. _changelog-v2-7-0: @@ -331,81 +441,81 @@ Highlights Backwards incompatible changes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Remove installation of R dependencies from the help message (`#2761 `__) `Rémi Kazeroni `__ +- Remove installation of R dependencies from the help message (:pull:`2761`) :user:`remi-kazeroni` Bug fixes ~~~~~~~~~ -- Fix misplaced provenance records from IPCC AR5 Ch.12 diags (`#2758 `__) `Axel Lauer `__ -- Fix `esmvaltool.utils.testing.regression.compare` module to run with Python<3.10 too (`#2778 `__) `Valeriu Predoi `__ -- Fixed small bug that could lead to wrong pr units in `monitor/multi_datasets.py` (`#2788 `__) `Manuel Schlund `__ -- Pin `xgboost>1.6.1` so we avert documentation failing to build with `1.6.1` (`#2780 `__) `Valeriu Predoi `__ -- Pin `matplotlib-base<3.6.0` to avoid conflict from `mapgenerator` that fails doc builds (`#2830 `__) `Valeriu Predoi `__ -- Fixed wrong latitudes in NDP CMORizer (`#2832 `__) `Manuel Schlund `__ -- Fix indexer in Autoassess supermeans module use a tuple of `(slice(), idx, idx)` (`#2838 `__) `Valeriu Predoi `__ -- Replace xarray ufuncs with bogstandard numpy in weighting/climwip/calibrate_sigmas.py (`#2848 `__) `Valeriu Predoi `__ -- Fix units MERRA2 CMORizer (`#2850 `__) `Axel Lauer `__ -- Fix bug when using log-scale y-axis for ocean transects. (`#2862 `__) `Tomas Torsvik `__ +- Fix misplaced provenance records from IPCC AR5 Ch.12 diags (:pull:`2758`) :user:`axel-lauer` +- Fix `esmvaltool.utils.testing.regression.compare` module to run with Python<3.10 too (:pull:`2778`) :user:`valeriupredoi` +- Fixed small bug that could lead to wrong pr units in `monitor/multi_datasets.py` (:pull:`2788`) :user:`schlunma` +- Pin `xgboost>1.6.1` so we avert documentation failing to build with `1.6.1` (:pull:`2780`) :user:`valeriupredoi` +- Pin `matplotlib-base<3.6.0` to avoid conflict from `mapgenerator` that fails doc builds (:pull:`2830`) :user:`valeriupredoi` +- Fixed wrong latitudes in NDP CMORizer (:pull:`2832`) :user:`schlunma` +- Fix indexer in Autoassess supermeans module use a tuple of `(slice(), idx, idx)` (:pull:`2838`) :user:`valeriupredoi` +- Replace xarray ufuncs with bogstandard numpy in weighting/climwip/calibrate_sigmas.py (:pull:`2848`) :user:`valeriupredoi` +- Fix units MERRA2 CMORizer (:pull:`2850`) :user:`axel-lauer` +- Fix bug when using log-scale y-axis for ocean transects. (:pull:`2862`) :user:`TomasTorsvik` Community ~~~~~~~~~ -- Add MO-paths to config file (`#2784 `__) `mo-tgeddes `__ +- Add MO-paths to config file (:pull:`2784`) `mo-tgeddes `__ Deprecations ~~~~~~~~~~~~ -- Recipe `recipe_esacci_oc.yml` replace with new regrid scheme `nearest_extrapolate` (`#2841 `__) `Valeriu Predoi `__ +- Recipe `recipe_esacci_oc.yml` replace with new regrid scheme `nearest_extrapolate` (:pull:`2841`) :user:`valeriupredoi` Documentation ~~~~~~~~~~~~~ -- Update release schedule for v2.7 (`#2747 `__) `Bouwe Andela `__ -- Add Met Office installation method (`#2751 `__) `mo-tgeddes `__ -- Add release dates for 2023 (`#2769 `__) `Rémi Kazeroni `__ -- Made `maintainer` entry mandatory for published recipes (`#2703 `__) `Manuel Schlund `__ -- Use command with current command line opts for `cffconvert` in documentation (`#2791 `__) `Valeriu Predoi `__ -- Update CMORizer documentation with command options (`#2795 `__) `Rémi Kazeroni `__ -- Fixed broken link for monthly meetings (`#2806 `__) `Rémi Kazeroni `__ -- Update MO obs4MIPs paths in the user configuration file (`#2813 `__) `mo-tgeddes `__ -- Fix Windows incompatible file names in documentation of recipe_climate_change_hotspot.yml (`#2823 `__) `Lee de Mora `__ -- Update documentation for the Landschuetzer 2016 recipe. (`#2801 `__) `Tomas Torsvik `__ -- Fixed anaconda badge in README (`#2866 `__) `Valeriu Predoi `__ -- Update release strategy notes (`#2734 `__) `sloosvel `__ -- Add documentation on how to handle CMORizers for multiple dataset versions (`#2730 `__) `Rémi Kazeroni `__ -- Extending documentation: recipe maintainer + broken recipe policy (`#2719 `__) `Axel Lauer `__ +- Update release schedule for v2.7 (:pull:`2747`) :user:`bouweandela` +- Add Met Office installation method (:pull:`2751`) `mo-tgeddes `__ +- Add release dates for 2023 (:pull:`2769`) :user:`remi-kazeroni` +- Made `maintainer` entry mandatory for published recipes (:pull:`2703`) :user:`schlunma` +- Use command with current command line opts for `cffconvert` in documentation (:pull:`2791`) :user:`valeriupredoi` +- Update CMORizer documentation with command options (:pull:`2795`) :user:`remi-kazeroni` +- Fixed broken link for monthly meetings (:pull:`2806`) :user:`remi-kazeroni` +- Update MO obs4MIPs paths in the user configuration file (:pull:`2813`) `mo-tgeddes `__ +- Fix Windows incompatible file names in documentation of recipe_climate_change_hotspot.yml (:pull:`2823`) :user:`ledm` +- Update documentation for the Landschuetzer 2016 recipe. (:pull:`2801`) :user:`TomasTorsvik` +- Fixed anaconda badge in README (:pull:`2866`) :user:`valeriupredoi` +- Update release strategy notes (:pull:`2734`) :user:`sloosvel` +- Add documentation on how to handle CMORizers for multiple dataset versions (:pull:`2730`) :user:`remi-kazeroni` +- Extending documentation: recipe maintainer + broken recipe policy (:pull:`2719`) :user:`axel-lauer` Diagnostics ~~~~~~~~~~~ -- Recipe and diagnostics for : Tebaldi et al.,ESD, 2021 (`#2052 `__) `debe-kevin `__ -- Figures for IPCC AR6 WG1 Chapter 3 (Atmosphere) (`#2533 `__) `Lisa Bock `__ +- Recipe and diagnostics for : Tebaldi et al.,ESD, 2021 (:pull:`2052`) `debe-kevin `__ +- Figures for IPCC AR6 WG1 Chapter 3 (Atmosphere) (:pull:`2533`) :user:`LisaBock` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Update CERES-EBAF to Ed4.1 (`#2752 `__) `Axel Lauer `__ -- New CMORizer for CALIPSO-ICECLOUD (`#2753 `__) `Axel Lauer `__ -- New CMORizer for CLOUDSAT-L2 (`#2754 `__) `Axel Lauer `__ -- Update MERRA2 cmorizer with extra 2D and 3D variables (`#2774 `__) `Valeriu Predoi `__ +- Update CERES-EBAF to Ed4.1 (:pull:`2752`) :user:`axel-lauer` +- New CMORizer for CALIPSO-ICECLOUD (:pull:`2753`) :user:`axel-lauer` +- New CMORizer for CLOUDSAT-L2 (:pull:`2754`) :user:`axel-lauer` +- Update MERRA2 cmorizer with extra 2D and 3D variables (:pull:`2774`) :user:`valeriupredoi` Automatic testing ~~~~~~~~~~~~~~~~~ -- Pin `netcdf4 != 1.6.1` since that is spitting large numbers of SegFaults (`#2796 `__) `Valeriu Predoi `__ +- Pin `netcdf4 != 1.6.1` since that is spitting large numbers of SegFaults (:pull:`2796`) :user:`valeriupredoi` Installation ~~~~~~~~~~~~ -- Increase esmvalcore version to 2.7.0 in environment files (`#2860 `__) `Valeriu Predoi `__ -- Add iris-esmf-regrid as a dependency (`#2880 `__) `Klaus Zimmermann `__ +- Increase esmvalcore version to 2.7.0 in environment files (:pull:`2860`) :user:`valeriupredoi` +- Add iris-esmf-regrid as a dependency (:pull:`2880`) :user:`zklaus` Improvements ~~~~~~~~~~~~ -- Fix tebaldi21esd (`#2749 `__) `Axel Lauer `__ -- Added option to show basic statistics in plots of `monitor/multi_datasets.py` (`#2790 `__) `Manuel Schlund `__ -- Remove retracted datasets from `recipe_climate_change_hotspot` (`#2854 `__) `sloosvel `__ +- Fix tebaldi21esd (:pull:`2749`) :user:`axel-lauer` +- Added option to show basic statistics in plots of `monitor/multi_datasets.py` (:pull:`2790`) :user:`schlunma` +- Remove retracted datasets from `recipe_climate_change_hotspot` (:pull:`2854`) :user:`sloosvel` .. _changelog-v2-6-0: @@ -431,83 +541,83 @@ This release includes Bug fixes ~~~~~~~~~ -- Fix dtype for Marrmot recipe results (`#2646 `__) `SarahAlidoost `__ -- Adapt test_fix_coords to new version of cf-units (`#2707 `__) `Klaus Zimmermann `__ -- Fix nested axes in `recipe_martin18_grl` and `recipe_li17natcc` (`#2712 `__) `Lukas `__ -- Update common_climdex_preprocessing_for_plots.R (`#2727 `__) `Enrico Arnone `__ +- Fix dtype for Marrmot recipe results (:pull:`2646`) :user:`SarahAlidoost` +- Adapt test_fix_coords to new version of cf-units (:pull:`2707`) :user:`zklaus` +- Fix nested axes in `recipe_martin18_grl` and `recipe_li17natcc` (:pull:`2712`) :user:`lukruh` +- Update common_climdex_preprocessing_for_plots.R (:pull:`2727`) :user:`earnone` Community ~~~~~~~~~ -- Collecting github user names for config-references (`#2677 `__) `Lukas `__ +- Collecting github user names for config-references (:pull:`2677`) :user:`lukruh` Deprecations ~~~~~~~~~~~~ -- Deprecate the function `esmvaltool.diag_scripts.shared.var_name_constraint`. This function is scheduled for removal in v2.8.0. Please use :class:`iris.NameConstraint` with the keyword argument var_name instead: this is an exact replacement. (`#2655 `__) `Manuel Schlund `__ +- Deprecate the function `esmvaltool.diag_scripts.shared.var_name_constraint`. This function is scheduled for removal in v2.8.0. Please use :class:`iris.NameConstraint` with the keyword argument var_name instead: this is an exact replacement. (:pull:`2655`) :user:`schlunma` Documentation ~~~~~~~~~~~~~ -- Documentation Improvements (`#2580 `__) `stacristo `__ -- Fixed broken label in the documentation (`#2616 `__) `Rémi Kazeroni `__ -- Add readthedocs configuration file (`#2627 `__) `Bouwe Andela `__ -- Update the command for building the documentation (`#2622 `__) `Bouwe Andela `__ -- Added DKRZ-Levante to `config-user-example.yml` (`#2632 `__) `Rémi Kazeroni `__ -- Improved documentation on native dataset support (`#2635 `__) `Manuel Schlund `__ -- Add documentation on building and uploading Docker images (`#2662 `__) `Bouwe Andela `__ -- Remove support for Mistral in `config-user-example.yml` (`#2667 `__) `Rémi Kazeroni `__ -- Add note to clarify that CORDEX support is work in progress (`#2682 `__) `Bouwe Andela `__ -- Restore accidentally deleted text from input data docs (`#2683 `__) `Bouwe Andela `__ -- Add running settings note in `recipe_wenzel16nat.yml` documentation (`#2692 `__) `sloosvel `__ -- Add a note on transferring permissions to the release manager (`#2688 `__) `Bouwe Andela `__ -- Update documentation on ESMValTool module at DKRZ (`#2696 `__) `Rémi Kazeroni `__ -- Add note on how to run recipe_wenzel14jgr.yml (`#2717 `__) `sloosvel `__ -- Added conda forge feedstock repo link in README (`#2555 `__) `Valeriu Predoi `__ +- Documentation Improvements (:pull:`2580`) :user:`stacristo` +- Fixed broken label in the documentation (:pull:`2616`) :user:`remi-kazeroni` +- Add readthedocs configuration file (:pull:`2627`) :user:`bouweandela` +- Update the command for building the documentation (:pull:`2622`) :user:`bouweandela` +- Added DKRZ-Levante to `config-user-example.yml` (:pull:`2632`) :user:`remi-kazeroni` +- Improved documentation on native dataset support (:pull:`2635`) :user:`schlunma` +- Add documentation on building and uploading Docker images (:pull:`2662`) :user:`bouweandela` +- Remove support for Mistral in `config-user-example.yml` (:pull:`2667`) :user:`remi-kazeroni` +- Add note to clarify that CORDEX support is work in progress (:pull:`2682`) :user:`bouweandela` +- Restore accidentally deleted text from input data docs (:pull:`2683`) :user:`bouweandela` +- Add running settings note in `recipe_wenzel16nat.yml` documentation (:pull:`2692`) :user:`sloosvel` +- Add a note on transferring permissions to the release manager (:pull:`2688`) :user:`bouweandela` +- Update documentation on ESMValTool module at DKRZ (:pull:`2696`) :user:`remi-kazeroni` +- Add note on how to run recipe_wenzel14jgr.yml (:pull:`2717`) :user:`sloosvel` +- Added conda forge feedstock repo link in README (:pull:`2555`) :user:`valeriupredoi` Diagnostics ~~~~~~~~~~~ -- Compute bias instead of correlation in `compare_salinity.py` (`#2642 `__) `sloosvel `__ -- Update monitor diagnostics (`#2608 `__) `Manuel Schlund `__ -- Add new Psyplot diagnostic (`#2653 `__) `Manuel Schlund `__ -- Reduce memory usage of lisflood recipe (`#2634 `__) `Stefan Verhoeven `__ -- Provenance in ocean diagnostics (`#2651 `__) `Tomas Lovato `__ -- Extend monitor diagnostics with multi-dataset plots (`#2657 `__) `Manuel Schlund `__ -- Recipe and diagnostics to plot climate change hotspots: Cos et al., ESD 2022 (`#2614 `__) `Pep Cos `__ -- Update plots of consecutive dry days recipe (`#2671 `__) `Bouwe Andela `__ -- Fix the format of ids in Hype forcing files (`#2679 `__) `SarahAlidoost `__ -- WFlow diagnostic script: remove manual rechunking (`#2680 `__) `Peter Kalverla `__ +- Compute bias instead of correlation in `compare_salinity.py` (:pull:`2642`) :user:`sloosvel` +- Update monitor diagnostics (:pull:`2608`) :user:`schlunma` +- Add new Psyplot diagnostic (:pull:`2653`) :user:`schlunma` +- Reduce memory usage of lisflood recipe (:pull:`2634`) :user:`sverhoeven` +- Provenance in ocean diagnostics (:pull:`2651`) :user:`tomaslovato` +- Extend monitor diagnostics with multi-dataset plots (:pull:`2657`) :user:`schlunma` +- Recipe and diagnostics to plot climate change hotspots: Cos et al., ESD 2022 (:pull:`2614`) :user:`pepcos` +- Update plots of consecutive dry days recipe (:pull:`2671`) :user:`bouweandela` +- Fix the format of ids in Hype forcing files (:pull:`2679`) :user:`SarahAlidoost` +- WFlow diagnostic script: remove manual rechunking (:pull:`2680`) :user:`Peter9192` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Extending the HadCRUT5 cmorizer (`#2509 `__) `Lisa Bock `__ -- Cmorize Kadow2020 dataset (`#2513 `__) `Lisa Bock `__ -- Cmorize NOAAGlobalTemp dataset (`#2515 `__) `Lisa Bock `__ -- Add option to CMORize ts as tos in ESACCI data (`#2731 `__) `sloosvel `__ +- Extending the HadCRUT5 cmorizer (:pull:`2509`) :user:`LisaBock` +- Cmorize Kadow2020 dataset (:pull:`2513`) :user:`LisaBock` +- Cmorize NOAAGlobalTemp dataset (:pull:`2515`) :user:`LisaBock` +- Add option to CMORize ts as tos in ESACCI data (:pull:`2731`) :user:`sloosvel` Automatic testing ~~~~~~~~~~~~~~~~~ -- Add a tool for comparing recipe runs to previous runs (`#2613 `__) `Bouwe Andela `__ -- Ignore NCL interface files when comparing recipe runs (`#2673 `__) `Bouwe Andela `__ -- Add a short version of recipe deangelis15nat for testing (`#2685 `__) `katjaweigel `__ -- Expanded recipe output comparison tool to better handle absolute paths in output (`#2709 `__) `Manuel Schlund `__ -- Update development infrastructure (`#2663 `__) `Bouwe Andela `__ +- Add a tool for comparing recipe runs to previous runs (:pull:`2613`) :user:`bouweandela` +- Ignore NCL interface files when comparing recipe runs (:pull:`2673`) :user:`bouweandela` +- Add a short version of recipe deangelis15nat for testing (:pull:`2685`) :user:`katjaweigel` +- Expanded recipe output comparison tool to better handle absolute paths in output (:pull:`2709`) :user:`schlunma` +- Update development infrastructure (:pull:`2663`) :user:`bouweandela` Installation ~~~~~~~~~~~~ -- Removed `package/meta.yaml` and all references to it (`#2612 `__) `Manuel Schlund `__ +- Removed `package/meta.yaml` and all references to it (:pull:`2612`) :user:`schlunma` Improvements ~~~~~~~~~~~~ -- Improved handling of weights in MLR diagnostics (`#2625 `__) `Manuel Schlund `__ -- Fixed order of variables in perfemetrics plot of Anav13jclim recipe (`#2706 `__) `Manuel Schlund `__ -- Added input file sorting to many diagnostic to make output exactly reproducible (`#2710 `__) `Manuel Schlund `__ -- Removed 'ancestors' attributes before saving netcdf files in emergent constraints diagnostics (`#2713 `__) `Manuel Schlund `__ +- Improved handling of weights in MLR diagnostics (:pull:`2625`) :user:`schlunma` +- Fixed order of variables in perfemetrics plot of Anav13jclim recipe (:pull:`2706`) :user:`schlunma` +- Added input file sorting to many diagnostic to make output exactly reproducible (:pull:`2710`) :user:`schlunma` +- Removed 'ancestors' attributes before saving netcdf files in emergent constraints diagnostics (:pull:`2713`) :user:`schlunma` .. _changelog-v2-5-0: @@ -533,115 +643,115 @@ This release includes Backwards incompatible changes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Streamline observations download (`#1657 `__) `Javier Vegas-Regidor `__. This change removes the ``cmorize_obs`` command which has previously been used to CMORize observations and other datasets. The new command ``esmvaltool data`` provides many new features apart from the CMORization (``esmvaltool data format``), for example, automatic downloading of observational datasets (``esmvaltool data download``). More details on this can be found :ref:`here` and :ref:`here`. -- Dropped Python 3.7 (`#2585 `__) `Manuel Schlund `__. ESMValTool v2.5.0 dropped support for Python 3.7. From now on Python >=3.8 is required to install ESMValTool. The main reason for this is that conda-forge dropped support for Python 3.7 for OSX and arm64 (more details are given `here `__). +- Streamline observations download (:pull:`1657`) `Javier Vegas-Regidor `__. This change removes the ``cmorize_obs`` command which has previously been used to CMORize observations and other datasets. The new command ``esmvaltool data`` provides many new features apart from the CMORization (``esmvaltool data format``), for example, automatic downloading of observational datasets (``esmvaltool data download``). More details on this can be found :ref:`here` and :ref:`here`. +- Dropped Python 3.7 (:pull:`2585`) :user:`schlunma`. ESMValTool v2.5.0 dropped support for Python 3.7. From now on Python >=3.8 is required to install ESMValTool. The main reason for this is that conda-forge dropped support for Python 3.7 for OSX and arm64 (more details are given `here `__). Bug fixes ~~~~~~~~~ -- Remove the use of `esmvalgroup` channel from the conda install Github Action workflow (`#2420 `__) `Valeriu Predoi `__ -- Ignore .pymon-journal file in test discovery (`#2491 `__) `Klaus Zimmermann `__ -- Relocate pytest-monitor outputted database `.pymon` so `.pymon-journal` file should not be looked for by `pytest` (`#2501 `__) `Valeriu Predoi `__ -- Re-establish Python 3.7 compatibility (`#2506 `__) `Klaus Zimmermann `__ -- Update intersphinx mapping (`#2531 `__) `Klaus Zimmermann `__ -- Fixed `KeyError` in `recipe_ocean_bgc.yml` (`#2540 `__) `Manuel Schlund `__ -- Corrected ESACCI-SEA-SURFACE-SALINITY from OBS to OBS6 (`#2542 `__) `Axel Lauer `__ -- Fixed `recipe_kcs.yml` (`#2541 `__) `Manuel Schlund `__ -- Fix MDER diagnostic regression_stepwise (`#2545 `__) `Axel Lauer `__ -- Fix for recipe_wenzel16nat (`#2547 `__) `Axel Lauer `__ -- Fixed `recipe_carvalhais14nat` and removed deprecated use of np.float (`#2558 `__) `Manuel Schlund `__ -- Fix `recipe_wenzel14jgr` (`#2577 `__) `Rémi Kazeroni `__ -- Fixed various recipes by removing faulty or non-available datasets (`#2563 `__) `Manuel Schlund `__ -- Remove missing CMIP5 data from 2 recipes (`#2579 `__) `Rémi Kazeroni `__ -- Fix `recipe_seaice` (`#2578 `__) `Rémi Kazeroni `__ -- Fix `recipe_climwip_brunner20esd` (`#2581 `__) `Rémi Kazeroni `__ +- Remove the use of `esmvalgroup` channel from the conda install Github Action workflow (:pull:`2420`) :user:`valeriupredoi` +- Ignore .pymon-journal file in test discovery (:pull:`2491`) :user:`zklaus` +- Relocate pytest-monitor outputted database `.pymon` so `.pymon-journal` file should not be looked for by `pytest` (:pull:`2501`) :user:`valeriupredoi` +- Re-establish Python 3.7 compatibility (:pull:`2506`) :user:`zklaus` +- Update intersphinx mapping (:pull:`2531`) :user:`zklaus` +- Fixed `KeyError` in `recipe_ocean_bgc.yml` (:pull:`2540`) :user:`schlunma` +- Corrected ESACCI-SEA-SURFACE-SALINITY from OBS to OBS6 (:pull:`2542`) :user:`axel-lauer` +- Fixed `recipe_kcs.yml` (:pull:`2541`) :user:`schlunma` +- Fix MDER diagnostic regression_stepwise (:pull:`2545`) :user:`axel-lauer` +- Fix for recipe_wenzel16nat (:pull:`2547`) :user:`axel-lauer` +- Fixed `recipe_carvalhais14nat` and removed deprecated use of np.float (:pull:`2558`) :user:`schlunma` +- Fix `recipe_wenzel14jgr` (:pull:`2577`) :user:`remi-kazeroni` +- Fixed various recipes by removing faulty or non-available datasets (:pull:`2563`) :user:`schlunma` +- Remove missing CMIP5 data from 2 recipes (:pull:`2579`) :user:`remi-kazeroni` +- Fix `recipe_seaice` (:pull:`2578`) :user:`remi-kazeroni` +- Fix `recipe_climwip_brunner20esd` (:pull:`2581`) :user:`remi-kazeroni` Deprecations ~~~~~~~~~~~~ -- Remove `--use-feature=2020-resolver` command line option for obsolete pip 2020 solver (`#2493 `__) `Valeriu Predoi `__ -- Renamed vertical regridding schemes in affected recipes (`#2487 `__) `Manuel Schlund `__ +- Remove `--use-feature=2020-resolver` command line option for obsolete pip 2020 solver (:pull:`2493`) :user:`valeriupredoi` +- Renamed vertical regridding schemes in affected recipes (:pull:`2487`) :user:`schlunma` Documentation ~~~~~~~~~~~~~ -- Update release manager for v2.5 (`#2429 `__) `Axel Lauer `__ -- Mention ENES Climate Analytics service (`#2438 `__) `Bouwe Andela `__ -- Add recipe overview page (`#2439 `__) `Bouwe Andela `__ -- Fix pointer to Tutorial lesson on preprocessor from 05 to 06 (`#2473 `__) `Valeriu Predoi `__ -- Removed obsolete option `synda-download` from documentation (`#2485 `__) `Manuel Schlund `__ -- Update CMUG XCH4 docu figure (`#2502 `__) `Axel Lauer `__ -- Add Python=3.10 to package info, update Circle CI auto install and documentation for Python=3.10 (`#2503 `__) `Manuel Schlund `__ -- Unify user configuration file (`#2507 `__) `Manuel Schlund `__ -- Synchronized `config-user.yml` with version from ESMValCore (`#2516 `__) `Manuel Schlund `__ -- CITATION.cff fix and automatic validation of your citation metadata (`#2517 `__) `Abel Siqueira `__ -- Add backwards incompatible changes at the top of the release notes draft (`#2431 `__) `Bouwe Andela `__ -- Fixed intersphinx mapping of `scipy` (`#2523 `__) `Manuel Schlund `__ -- Add authors to citation cff (`#2525 `__) `SarahAlidoost `__ -- Update documentation on running a recipe (`#2432 `__) `Bouwe Andela `__ -- Fix recipe `hydrology/recipe_wflow.yml` (`#2549 `__) `Rémi Kazeroni `__ -- Update `draft_release_notes.py` for new release (`#2553 `__) `Manuel Schlund `__ -- Added stand with Ukraine badge (`#2565 `__) `Valeriu Predoi `__ -- Updated CREM docu (recipe_williams09climdyn.yml) (`#2567 `__) `Axel Lauer `__ -- First draft for v2.5.0 changelog (`#2554 `__) `Manuel Schlund `__ -- Replace nonfunctional Github Actions badge with cool one in README (`#2582 `__) `Valeriu Predoi `__ -- Updated changelog (`#2589 `__) `Manuel Schlund `__ -- Updated release strategy with current release and upcoming release (`#2597 `__) `Manuel Schlund `__ -- Increased ESMValTool version to 2.5.0 (`#2600 `__) `Manuel Schlund `__ +- Update release manager for v2.5 (:pull:`2429`) :user:`axel-lauer` +- Mention ENES Climate Analytics service (:pull:`2438`) :user:`bouweandela` +- Add recipe overview page (:pull:`2439`) :user:`bouweandela` +- Fix pointer to Tutorial lesson on preprocessor from 05 to 06 (:pull:`2473`) :user:`valeriupredoi` +- Removed obsolete option `synda-download` from documentation (:pull:`2485`) :user:`schlunma` +- Update CMUG XCH4 docu figure (:pull:`2502`) :user:`axel-lauer` +- Add Python=3.10 to package info, update Circle CI auto install and documentation for Python=3.10 (:pull:`2503`) :user:`schlunma` +- Unify user configuration file (:pull:`2507`) :user:`schlunma` +- Synchronized `config-user.yml` with version from ESMValCore (:pull:`2516`) :user:`schlunma` +- CITATION.cff fix and automatic validation of your citation metadata (:pull:`2517`) :user:`abelsiqueira` +- Add backwards incompatible changes at the top of the release notes draft (:pull:`2431`) :user:`bouweandela` +- Fixed intersphinx mapping of `scipy` (:pull:`2523`) :user:`schlunma` +- Add authors to citation cff (:pull:`2525`) :user:`SarahAlidoost` +- Update documentation on running a recipe (:pull:`2432`) :user:`bouweandela` +- Fix recipe `hydrology/recipe_wflow.yml` (:pull:`2549`) :user:`remi-kazeroni` +- Update `draft_release_notes.py` for new release (:pull:`2553`) :user:`schlunma` +- Added stand with Ukraine badge (:pull:`2565`) :user:`valeriupredoi` +- Updated CREM docu (recipe_williams09climdyn.yml) (:pull:`2567`) :user:`axel-lauer` +- First draft for v2.5.0 changelog (:pull:`2554`) :user:`schlunma` +- Replace nonfunctional Github Actions badge with cool one in README (:pull:`2582`) :user:`valeriupredoi` +- Updated changelog (:pull:`2589`) :user:`schlunma` +- Updated release strategy with current release and upcoming release (:pull:`2597`) :user:`schlunma` +- Increased ESMValTool version to 2.5.0 (:pull:`2600`) :user:`schlunma` Diagnostics ~~~~~~~~~~~ -- AutoAssess: Add new diagnostic for radiation budget (`#2282 `__) `Jon Lillis `__ -- CMUG Sea Surface Salinity dataset and diagnostic (`#1832 `__) `Javier Vegas-Regidor `__ -- Recipe with new diagnostics for ESA-CMUG H2O (`#1834 `__) `katjaweigel `__ -- Cleaned Schlund et al. (2020) recipe and fixed small bugs in corresponding diagnostic (`#2484 `__) `Manuel Schlund `__ -- Add ESA CCI LST cmorizer and diagnostic (`#1897 `__) `morobking `__ -- XCH4 ESA CMUG diagnostics (subset of the MPQB diagnostics) (`#1960 `__) `Birgit Hassler `__ -- Add support for ESACCI Ocean Color (Chlorophyll) observations (`#2055 `__) `ulrikaw-cloud `__ -- Updated `recipe_zmnam.yml` with hemisphere selection (`#2230 `__) `fserva `__ -- Add recipe and diagnostic scripts to compute figures of D9.4 of ISENES3 (`#2441 `__) `sloosvel `__ -- Save resampled climates from KCS diagnostic local_resampling.py (`#2221 `__) `Emma Daniels `__ -- Use years from KCS recipe (`#2223 `__) `Emma Daniels `__ -- Recipe to plot generic output from the preprocessor (`#2184 `__) `Javier Vegas-Regidor `__ -- Fixed provenance tracking for emergent constraint diagnostics (`#2573 `__) `Manuel Schlund `__ +- AutoAssess: Add new diagnostic for radiation budget (:pull:`2282`) :user:`Jon-Lillis` +- CMUG Sea Surface Salinity dataset and diagnostic (:pull:`1832`) `Javier Vegas-Regidor `__ +- Recipe with new diagnostics for ESA-CMUG H2O (:pull:`1834`) :user:`katjaweigel` +- Cleaned Schlund et al. (2020) recipe and fixed small bugs in corresponding diagnostic (:pull:`2484`) :user:`schlunma` +- Add ESA CCI LST cmorizer and diagnostic (:pull:`1897`) :user:`morobking` +- XCH4 ESA CMUG diagnostics (subset of the MPQB diagnostics) (:pull:`1960`) :user:`hb326` +- Add support for ESACCI Ocean Color (Chlorophyll) observations (:pull:`2055`) `ulrikaw-cloud `__ +- Updated `recipe_zmnam.yml` with hemisphere selection (:pull:`2230`) :user:`fserva` +- Add recipe and diagnostic scripts to compute figures of D9.4 of ISENES3 (:pull:`2441`) :user:`sloosvel` +- Save resampled climates from KCS diagnostic local_resampling.py (:pull:`2221`) :user:`Emmadd` +- Use years from KCS recipe (:pull:`2223`) :user:`Emmadd` +- Recipe to plot generic output from the preprocessor (:pull:`2184`) `Javier Vegas-Regidor `__ +- Fixed provenance tracking for emergent constraint diagnostics (:pull:`2573`) :user:`schlunma` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Ensure dummy data for cmorize_obs_woa test are written to the correct directory (`#2451 `__) `Emma Hogan `__ +- Ensure dummy data for cmorize_obs_woa test are written to the correct directory (:pull:`2451`) :user:`ehogan` - Add ESA CCI LST cmorizer and diagnostic (see previous section `Diagnostics`) Automatic testing ~~~~~~~~~~~~~~~~~ -- Run a nightly Github Actions workflow to monitor tests memory per test (configurable for other metrics too) and lists the slowest 100 tests (`#2449 `__) `Valeriu Predoi `__ -- Fix individual pytest runs broken due to missing explicit imports from `iris` and adding a couple missing package markers (`#2455 `__) `Valeriu Predoi `__ -- Add Python=3.10 to Github Actions and switch to Python=3.10 for the Github Action that builds the PyPi package (`#2488 `__) `Valeriu Predoi `__ -- Switch all github actions from miniconda to mambaforge (`#2498 `__) `Klaus Zimmermann `__ -- Pin `flake8<4` to have actual FLAKE8 error printed if tests fail and not garbage (`#2492 `__) `Valeriu Predoi `__ -- Implementing conda lock (`#2193 `__) `Valeriu Predoi `__ -- [Docker] Update Docker container builds with correct installations of Julia (`#2530 `__) `Valeriu Predoi `__ +- Run a nightly Github Actions workflow to monitor tests memory per test (configurable for other metrics too) and lists the slowest 100 tests (:pull:`2449`) :user:`valeriupredoi` +- Fix individual pytest runs broken due to missing explicit imports from `iris` and adding a couple missing package markers (:pull:`2455`) :user:`valeriupredoi` +- Add Python=3.10 to Github Actions and switch to Python=3.10 for the Github Action that builds the PyPi package (:pull:`2488`) :user:`valeriupredoi` +- Switch all github actions from miniconda to mambaforge (:pull:`2498`) :user:`zklaus` +- Pin `flake8<4` to have actual FLAKE8 error printed if tests fail and not garbage (:pull:`2492`) :user:`valeriupredoi` +- Implementing conda lock (:pull:`2193`) :user:`valeriupredoi` +- [Docker] Update Docker container builds with correct installations of Julia (:pull:`2530`) :user:`valeriupredoi` - Update Linux condalock file (various pull requests) github-actions[bot] Installation ~~~~~~~~~~~~ -- Comment out release candidate channel in environment.yml (`#2417 `__) `Klaus Zimmermann `__ -- Comment out rc channel in osx environment file (`#2421 `__) `Valeriu Predoi `__ -- Add `python-cdo` as conda-forge dependency in environment files to ensure `cdo` gets used from conda-forge and not pip (`#2469 `__) `Valeriu Predoi `__ -- Install rasterio from conda-forge and avoid issues from python=3.10 (`#2479 `__) `Valeriu Predoi `__ -- Updated dependencies with new ESMValCore version (`#2599 `__) `Manuel Schlund `__ +- Comment out release candidate channel in environment.yml (:pull:`2417`) :user:`zklaus` +- Comment out rc channel in osx environment file (:pull:`2421`) :user:`valeriupredoi` +- Add `python-cdo` as conda-forge dependency in environment files to ensure `cdo` gets used from conda-forge and not pip (:pull:`2469`) :user:`valeriupredoi` +- Install rasterio from conda-forge and avoid issues from python=3.10 (:pull:`2479`) :user:`valeriupredoi` +- Updated dependencies with new ESMValCore version (:pull:`2599`) :user:`schlunma` Improvements ~~~~~~~~~~~~ -- Remove use of OBS and use CMIP instead in `examples/recipe_ncl.yml` (`#2494 `__) `Valeriu Predoi `__ -- Expanded `recipe_preprocessor_test.yml` to account for new `multi_model_statistics` features (`#2519 `__) `Manuel Schlund `__ -- Updated piControl periods for recipes that use KACE-1-0-G (`#2537 `__) `Manuel Schlund `__ -- Reduced time range in `recipe_globwat.yml` (`#2548 `__) `Manuel Schlund `__ -- Removed models with missing data from recipe_williams09climdyn.yml (`#2566 `__) `Axel Lauer `__ -- Restored original versions of `recipe_schlund20esd.yml` and `recipe_meehl20sciadv.yml` (`#2583 `__) `Manuel Schlund `__ +- Remove use of OBS and use CMIP instead in `examples/recipe_ncl.yml` (:pull:`2494`) :user:`valeriupredoi` +- Expanded `recipe_preprocessor_test.yml` to account for new `multi_model_statistics` features (:pull:`2519`) :user:`schlunma` +- Updated piControl periods for recipes that use KACE-1-0-G (:pull:`2537`) :user:`schlunma` +- Reduced time range in `recipe_globwat.yml` (:pull:`2548`) :user:`schlunma` +- Removed models with missing data from recipe_williams09climdyn.yml (:pull:`2566`) :user:`axel-lauer` +- Restored original versions of `recipe_schlund20esd.yml` and `recipe_meehl20sciadv.yml` (:pull:`2583`) :user:`schlunma` .. _changelog-v2-4-0: @@ -668,119 +778,119 @@ This release includes Bug fixes ~~~~~~~~~ -- Fixed `recipe_meehl20sciadv.yml` for ESMValCore 2.3 (`#2253 `__) `Manuel Schlund `__ -- Fix provenance of NCL figures created using the log_provenance function (`#2279 `__) `Bouwe Andela `__ -- Fix bug in ClimWIP brunner19 recipe when plotting (`#2226 `__) `Lukas Brunner `__ -- Pin docutils <0.17 to fix sphinx build with rtd theme (`#2312 `__) `Klaus Zimmermann `__ -- Fix example recipes (`#2338 `__) `Valeriu Predoi `__ -- Do not add bounds to plev (plev19) in era interim cmorizer (`#2328 `__) `Valeriu Predoi `__ -- Fix problem with pip 21.3 that prevents installation from source (`#2344 `__) `Klaus Zimmermann `__ -- Add title to recipe embedded in test_diagnostic_run.py (`#2353 `__) `Klaus Zimmermann `__ -- Fix capitalization of obs4MIPs (`#2368 `__) `Bouwe Andela `__ -- Specify that areacella is needed for area statistics in the Python example recipe (`#2371 `__) `Bouwe Andela `__ -- Enabling variable `obs550lt1aer` in recipes (`#2388 `__) `Rémi Kazeroni `__ -- Update a diagnostic to new Iris version (`#2390 `__) `katjaweigel `__ -- Fixed bug in provenance tracking of ecs_scatter.ncl (`#2391 `__) `Manuel Schlund `__ -- Fix provenance issue in pv_capacity_factor.R (`#2392 `__) `katjaweigel `__ -- Remove obsolete write_plots option from R diagnostics (`#2395 `__) `Klaus Zimmermann `__ -- Fix arctic ocean diagnostic (`#2397 `__) `Klaus Zimmermann `__ -- Fix sea ice drift recipe and script (`#2404 `__) `sloosvel `__ -- Adapt diagnostic script to new version of iris (`#2403 `__) `Klaus Zimmermann `__ -- Fix ocean multimap (`#2406 `__) `Klaus Zimmermann `__ -- Fix diagnostic that uses `xarray`: `dtype` correctly set and harmonize `xarray` and `matplotlib` (`#2409 `__) `Klaus Zimmermann `__ -- Deactivate provenance logging for plots in thermodyn toolbox (`#2414 `__) `Klaus Zimmermann `__ +- Fixed `recipe_meehl20sciadv.yml` for ESMValCore 2.3 (:pull:`2253`) :user:`schlunma` +- Fix provenance of NCL figures created using the log_provenance function (:pull:`2279`) :user:`bouweandela` +- Fix bug in ClimWIP brunner19 recipe when plotting (:pull:`2226`) :user:`lukasbrunner` +- Pin docutils <0.17 to fix sphinx build with rtd theme (:pull:`2312`) :user:`zklaus` +- Fix example recipes (:pull:`2338`) :user:`valeriupredoi` +- Do not add bounds to plev (plev19) in era interim cmorizer (:pull:`2328`) :user:`valeriupredoi` +- Fix problem with pip 21.3 that prevents installation from source (:pull:`2344`) :user:`zklaus` +- Add title to recipe embedded in test_diagnostic_run.py (:pull:`2353`) :user:`zklaus` +- Fix capitalization of obs4MIPs (:pull:`2368`) :user:`bouweandela` +- Specify that areacella is needed for area statistics in the Python example recipe (:pull:`2371`) :user:`bouweandela` +- Enabling variable `obs550lt1aer` in recipes (:pull:`2388`) :user:`remi-kazeroni` +- Update a diagnostic to new Iris version (:pull:`2390`) :user:`katjaweigel` +- Fixed bug in provenance tracking of ecs_scatter.ncl (:pull:`2391`) :user:`schlunma` +- Fix provenance issue in pv_capacity_factor.R (:pull:`2392`) :user:`katjaweigel` +- Remove obsolete write_plots option from R diagnostics (:pull:`2395`) :user:`zklaus` +- Fix arctic ocean diagnostic (:pull:`2397`) :user:`zklaus` +- Fix sea ice drift recipe and script (:pull:`2404`) :user:`sloosvel` +- Adapt diagnostic script to new version of iris (:pull:`2403`) :user:`zklaus` +- Fix ocean multimap (:pull:`2406`) :user:`zklaus` +- Fix diagnostic that uses `xarray`: `dtype` correctly set and harmonize `xarray` and `matplotlib` (:pull:`2409`) :user:`zklaus` +- Deactivate provenance logging for plots in thermodyn toolbox (:pull:`2414`) :user:`zklaus` Deprecations ~~~~~~~~~~~~ -- Removed write_plots and write_netcdf from some NCL diagnostics (`#2293 `__) `Manuel Schlund `__ -- Fixed provenance logging of all python diagnostics by removing 'plot_file' entry (`#2296 `__) `Manuel Schlund `__ -- Do not deprecate classes Variable, Variables and Datasets on a specific version (`#2286 `__) `Manuel Schlund `__ -- Remove obsolete write_netcdf option from ncl diagnostic scripts (`#2387 `__) `Klaus Zimmermann `__ -- Remove write plots from ocean diagnostics (`#2393 `__) `Valeriu Predoi `__ -- More removals of instances of `write_plots` from Python diagnostics (appears to be the final removal from Py diags) (`#2394 `__) `Valeriu Predoi `__ +- Removed write_plots and write_netcdf from some NCL diagnostics (:pull:`2293`) :user:`schlunma` +- Fixed provenance logging of all python diagnostics by removing 'plot_file' entry (:pull:`2296`) :user:`schlunma` +- Do not deprecate classes Variable, Variables and Datasets on a specific version (:pull:`2286`) :user:`schlunma` +- Remove obsolete write_netcdf option from ncl diagnostic scripts (:pull:`2387`) :user:`zklaus` +- Remove write plots from ocean diagnostics (:pull:`2393`) :user:`valeriupredoi` +- More removals of instances of `write_plots` from Python diagnostics (appears to be the final removal from Py diags) (:pull:`2394`) :user:`valeriupredoi` Documentation ~~~~~~~~~~~~~ -- List Manuel Schlund as release manager for v2.5 (`#2268 `__) `Bouwe Andela `__ -- GlobWat fix download links and gdal command (`#2334 `__) `Banafsheh Abdollahi `__ -- Add titles to recipes authored by `predoi_valeriu` (`#2333 `__) `Valeriu Predoi `__ -- Added titles to recipes maintained by lauer_axel (`#2332 `__) `Axel Lauer `__ -- Update the documentation of the GRACE CMORizer (`#2349 `__) `Rémi Kazeroni `__ -- Add titles in BSC recipes (`#2351 `__) `sloosvel `__ -- Update esmvalcore dependency to 2.4.0rc1 (`#2348 `__) `Klaus Zimmermann `__ -- Add titles to recipes maintained by Peter Kalverla (`#2356 `__) `Peter Kalverla `__ -- Adding titles to the recipes with maintainer hb326 (`#2358 `__) `Birgit Hassler `__ -- Add title for zmnam as for #2354 (`#2363 `__) `fserva `__ -- Added recipe titles the the ocean recipes. (`#2364 `__) `Lee de Mora `__ -- Update recipe_thermodyn_diagtool.yml - add title (`#2365 `__) `ValerioLembo `__ -- Fix provenance of figures of several R diagnostics (`#2300 `__) `Bouwe Andela `__ -- Adding titles to Mattia's recipes (`#2367 `__) `Rémi Kazeroni `__ -- Adding titles to wenzel recipes (`#2366 `__) `Birgit Hassler `__ -- Fix formatting of some recipe titles merged from PR 2364 (`#2372 `__) `Klaus Zimmermann `__ -- Adding titles to Bjoern's recipes (`#2369 `__) `Rémi Kazeroni `__ -- Add titles to ocean recipes (maintainer Lovato) (`#2375 `__) `Tomas Lovato `__ -- Add titles for three c3s-magic recipes (`#2378 `__) `Klaus Zimmermann `__ -- Add title for recipe maintained by Ruth Lorenz (`#2379 `__) `Klaus Zimmermann `__ -- Fix toymodel recipe (`#2381 `__) `Javier Vegas-Regidor `__ -- Added titles for recipes of maintainer `schlund_manuel` (`#2377 `__) `Manuel Schlund `__ -- Write_plots and titles for deangelis15nat, li17natcc, martin18grl, pv_capacity_factor (`#2382 `__) `katjaweigel `__ -- Add titles for some recipes (`#2383 `__) `Klaus Zimmermann `__ -- Adding titles for recipes by von Hardenberg and Arnone (`#2384 `__) `Klaus Zimmermann `__ -- Last two missing titles (`#2386 `__) `Valeriu Predoi `__ -- Update documentation on downloading data (`#2370 `__) `Bouwe Andela `__ -- Fix installation instructions for Julia (`#2335 `__) `Klaus Zimmermann `__ -- Fix provenance of Julia example diagnostic (`#2289 `__) `Bouwe Andela `__ -- Added notes on use of mamba in the installation documentation chapter (`#2236 `__) `Valeriu Predoi `__ -- Update version number for 2.4.0 release (`#2410 `__) `Klaus Zimmermann `__ -- Update release schedule for 2.4.0 (`#2412 `__) `Klaus Zimmermann `__ -- Update changelog for 2.4.0 release (`#2411 `__) `Klaus Zimmermann `__ +- List Manuel Schlund as release manager for v2.5 (:pull:`2268`) :user:`bouweandela` +- GlobWat fix download links and gdal command (:pull:`2334`) :user:`babdollahi` +- Add titles to recipes authored by `predoi_valeriu` (:pull:`2333`) :user:`valeriupredoi` +- Added titles to recipes maintained by lauer_axel (:pull:`2332`) :user:`axel-lauer` +- Update the documentation of the GRACE CMORizer (:pull:`2349`) :user:`remi-kazeroni` +- Add titles in BSC recipes (:pull:`2351`) :user:`sloosvel` +- Update esmvalcore dependency to 2.4.0rc1 (:pull:`2348`) :user:`zklaus` +- Add titles to recipes maintained by Peter Kalverla (:pull:`2356`) :user:`Peter9192` +- Adding titles to the recipes with maintainer hb326 (:pull:`2358`) :user:`hb326` +- Add title for zmnam as for #2354 (:pull:`2363`) :user:`fserva` +- Added recipe titles the the ocean recipes. (:pull:`2364`) :user:`ledm` +- Update recipe_thermodyn_diagtool.yml - add title (:pull:`2365`) :user:`ValerioLembo` +- Fix provenance of figures of several R diagnostics (:pull:`2300`) :user:`bouweandela` +- Adding titles to Mattia's recipes (:pull:`2367`) :user:`remi-kazeroni` +- Adding titles to wenzel recipes (:pull:`2366`) :user:`hb326` +- Fix formatting of some recipe titles merged from PR 2364 (:pull:`2372`) :user:`zklaus` +- Adding titles to Bjoern's recipes (:pull:`2369`) :user:`remi-kazeroni` +- Add titles to ocean recipes (maintainer Lovato) (:pull:`2375`) :user:`tomaslovato` +- Add titles for three c3s-magic recipes (:pull:`2378`) :user:`zklaus` +- Add title for recipe maintained by Ruth Lorenz (:pull:`2379`) :user:`zklaus` +- Fix toymodel recipe (:pull:`2381`) `Javier Vegas-Regidor `__ +- Added titles for recipes of maintainer `schlund_manuel` (:pull:`2377`) :user:`schlunma` +- Write_plots and titles for deangelis15nat, li17natcc, martin18grl, pv_capacity_factor (:pull:`2382`) :user:`katjaweigel` +- Add titles for some recipes (:pull:`2383`) :user:`zklaus` +- Adding titles for recipes by von Hardenberg and Arnone (:pull:`2384`) :user:`zklaus` +- Last two missing titles (:pull:`2386`) :user:`valeriupredoi` +- Update documentation on downloading data (:pull:`2370`) :user:`bouweandela` +- Fix installation instructions for Julia (:pull:`2335`) :user:`zklaus` +- Fix provenance of Julia example diagnostic (:pull:`2289`) :user:`bouweandela` +- Added notes on use of mamba in the installation documentation chapter (:pull:`2236`) :user:`valeriupredoi` +- Update version number for 2.4.0 release (:pull:`2410`) :user:`zklaus` +- Update release schedule for 2.4.0 (:pull:`2412`) :user:`zklaus` +- Update changelog for 2.4.0 release (:pull:`2411`) :user:`zklaus` Diagnostics ~~~~~~~~~~~ -- Add all available CMIP5 and CMIP6 models to recipe_impact.yml (`#2251 `__) `Bouwe Andela `__ -- Add Fig. 6, 7 and 9 of Bock20jgr (`#2252 `__) `Lisa Bock `__ -- Generalize `recipe_validation*` diagnostic to work with identical control and experiment dataset names (`#2284 `__) `Valeriu Predoi `__ -- Add missing preprocessor to recipe_gier2020bg and adapt to available data (`#2399 `__) `Bettina Gier `__ -- Removed custom version of `AtmosphereSigmaFactory` in diagnostics (`#2405 `__) `Manuel Schlund `__ +- Add all available CMIP5 and CMIP6 models to recipe_impact.yml (:pull:`2251`) :user:`bouweandela` +- Add Fig. 6, 7 and 9 of Bock20jgr (:pull:`2252`) :user:`LisaBock` +- Generalize `recipe_validation*` diagnostic to work with identical control and experiment dataset names (:pull:`2284`) :user:`valeriupredoi` +- Add missing preprocessor to recipe_gier2020bg and adapt to available data (:pull:`2399`) :user:`bettina-gier` +- Removed custom version of `AtmosphereSigmaFactory` in diagnostics (:pull:`2405`) :user:`schlunma` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Replace recipe_era5.yml with recipe_daily_era5.yml (`#2182 `__) `SarahAlidoost `__ -- Update WOA cmorizer for WOA18 and WOA13v2 (`#1812 `__) `Lisa Bock `__ -- GLODAP v2.2016 ocean data cmorizer (`#2185 `__) `Tomas Lovato `__ -- Updated GCP CMORizer (`#2295 `__) `Manuel Schlund `__ +- Replace recipe_era5.yml with recipe_daily_era5.yml (:pull:`2182`) :user:`SarahAlidoost` +- Update WOA cmorizer for WOA18 and WOA13v2 (:pull:`1812`) :user:`LisaBock` +- GLODAP v2.2016 ocean data cmorizer (:pull:`2185`) :user:`tomaslovato` +- Updated GCP CMORizer (:pull:`2295`) :user:`schlunma` Automatic testing ~~~~~~~~~~~~~~~~~ -- Add a cylc suite to run all recipes (`#2219 `__) `Bouwe Andela `__ -- Retire test with Python 3.6 from full development Github Actions test (`#2229 `__) `Valeriu Predoi `__ -- Remove Python 3.6 tests from GitHub Actions (`#2264 `__) `Valeriu Predoi `__ -- Unpin upper bound for iris (previously was at <3.0.4) (`#2266 `__) `Valeriu Predoi `__ -- Pin latest esmvalcore to allow use of the bugfix release 2.3.1 always (`#2269 `__) `Valeriu Predoi `__ -- Add apt update so Julia gets found and installed by Docker (`#2290 `__) `Valeriu Predoi `__ -- Use mamba for environment update and creation in the Docker container build on DockerHub (`#2297 `__) `Valeriu Predoi `__ -- Docker container experimental - run a full env solve with mamba instead of a conda update (`#2306 `__) `Valeriu Predoi `__ -- Full use of mamba in Github Actions source install test and use generic Python 3.7 (removing the very specific 3.7.10) (`#2287 `__) `Valeriu Predoi `__ -- Replace use of conda with mamba for conda_install test on Circle CI (`#2237 `__) `Valeriu Predoi `__ -- Update circleci configuration (`#2357 `__) `Klaus Zimmermann `__ +- Add a cylc suite to run all recipes (:pull:`2219`) :user:`bouweandela` +- Retire test with Python 3.6 from full development Github Actions test (:pull:`2229`) :user:`valeriupredoi` +- Remove Python 3.6 tests from GitHub Actions (:pull:`2264`) :user:`valeriupredoi` +- Unpin upper bound for iris (previously was at <3.0.4) (:pull:`2266`) :user:`valeriupredoi` +- Pin latest esmvalcore to allow use of the bugfix release 2.3.1 always (:pull:`2269`) :user:`valeriupredoi` +- Add apt update so Julia gets found and installed by Docker (:pull:`2290`) :user:`valeriupredoi` +- Use mamba for environment update and creation in the Docker container build on DockerHub (:pull:`2297`) :user:`valeriupredoi` +- Docker container experimental - run a full env solve with mamba instead of a conda update (:pull:`2306`) :user:`valeriupredoi` +- Full use of mamba in Github Actions source install test and use generic Python 3.7 (removing the very specific 3.7.10) (:pull:`2287`) :user:`valeriupredoi` +- Replace use of conda with mamba for conda_install test on Circle CI (:pull:`2237`) :user:`valeriupredoi` +- Update circleci configuration (:pull:`2357`) :user:`zklaus` Installation ~~~~~~~~~~~~ -- Remove `mpich` from conda dependencies list (`#2343 `__) `Valeriu Predoi `__ +- Remove `mpich` from conda dependencies list (:pull:`2343`) :user:`valeriupredoi` Improvements ~~~~~~~~~~~~ -- Add script for extracting a list of input files from the provenance (`#2278 `__) `Bouwe Andela `__ -- Update github actions (`#2360 `__) `Klaus Zimmermann `__ -- Removed 'write_plots' from all NCL diagnostics (`#2331 `__) `Axel Lauer `__ -- Update and modernize `config-user-example.yml` (`#2374 `__) `Valeriu Predoi `__ +- Add script for extracting a list of input files from the provenance (:pull:`2278`) :user:`bouweandela` +- Update github actions (:pull:`2360`) :user:`zklaus` +- Removed 'write_plots' from all NCL diagnostics (:pull:`2331`) :user:`axel-lauer` +- Update and modernize `config-user-example.yml` (:pull:`2374`) :user:`valeriupredoi` .. _changelog-v2-3-0: @@ -793,91 +903,91 @@ This release includes Bug fixes ~~~~~~~~~ -- Indent block to pick up and raise exception if cmorizer data not found (TierX dir is not there) (`#1877 `__) `Valeriu Predoi `__ -- Skip recipe filler tests until we have a new release since GA tests are failing (`#2089 `__) `Valeriu Predoi `__ -- Fixed broken link to contributions in README (`#2102 `__) `Manuel Schlund `__ -- Fix recipe filler for the case the variable doesn't contain short_name (`#2104 `__) `Valeriu Predoi `__ -- Add fix for iris longitude bug to ClimWIP (`#2107 `__) `Lukas Brunner `__ -- Update for outdated link to reference Déandreis et al. (2014). (`#2076 `__) `katjaweigel `__ -- Fixed recipes for ESMValCore 2.3.0 (`#2203 `__) `Manuel Schlund `__ -- Fix the WFDE5 cmorizer (`#2211 `__) `Rémi Kazeroni `__ -- Fix broken CMORizer log message if no Tier directory exists (`#2207 `__) `jmrgonza `__ -- Fix bug in ClimWIP basic test recipe when plotting (`#2225 `__) `Lukas Brunner `__ -- Fix bug in ClimWIP advanced test recipe when plotting (`#2227 `__) `Lukas Brunner `__ -- Adjust time range for the `WDFE5` dataset in the `recipe_check_obs.yml` (`#2232 `__) `Rémi Kazeroni `__ -- Fix plot and provenance of recipe_consecdrydays (`#2244 `__) `Bouwe Andela `__ +- Indent block to pick up and raise exception if cmorizer data not found (TierX dir is not there) (:pull:`1877`) :user:`valeriupredoi` +- Skip recipe filler tests until we have a new release since GA tests are failing (:pull:`2089`) :user:`valeriupredoi` +- Fixed broken link to contributions in README (:pull:`2102`) :user:`schlunma` +- Fix recipe filler for the case the variable doesn't contain short_name (:pull:`2104`) :user:`valeriupredoi` +- Add fix for iris longitude bug to ClimWIP (:pull:`2107`) :user:`lukasbrunner` +- Update for outdated link to reference Déandreis et al. (2014). (:pull:`2076`) :user:`katjaweigel` +- Fixed recipes for ESMValCore 2.3.0 (:pull:`2203`) :user:`schlunma` +- Fix the WFDE5 cmorizer (:pull:`2211`) :user:`remi-kazeroni` +- Fix broken CMORizer log message if no Tier directory exists (:pull:`2207`) :user:`jmrgonza` +- Fix bug in ClimWIP basic test recipe when plotting (:pull:`2225`) :user:`lukasbrunner` +- Fix bug in ClimWIP advanced test recipe when plotting (:pull:`2227`) :user:`lukasbrunner` +- Adjust time range for the `WDFE5` dataset in the `recipe_check_obs.yml` (:pull:`2232`) :user:`remi-kazeroni` +- Fix plot and provenance of recipe_consecdrydays (:pull:`2244`) :user:`bouweandela` Documentation ~~~~~~~~~~~~~ -- Improving the README.md file with a more appealing look and bit more info (`#2065 `__) `Valeriu Predoi `__ -- Update plot title martin18grl (`#2080 `__) `katjaweigel `__ -- Update contribution guidelines (`#2031 `__) `Bouwe Andela `__ -- Update links in pull request template to point to latest documentation (`#2083 `__) `Bouwe Andela `__ -- Update release schedule (`#2081 `__) `Bouwe Andela `__ -- Updates to contribution guidelines (`#2092 `__) `Bouwe Andela `__ -- Update documentation for ERA5 with new variables (`#2111 `__) `Lukas Brunner `__ -- Add OSX installation instructions to docs (`#2115 `__) `Barbara Vreede `__ -- Instructions to use pre-installed versions on HPC clusters (`#2197 `__) `Rémi Kazeroni `__ -- Add functional Autoassess diagnostics: land surface metrics: permafrost, soil moisture, surface radiation (`#2170 `__) `Valeriu Predoi `__ -- Add citation info in `recipe_eady_growth_rate.yml` (`#2188 `__) `sloosvel `__ -- Update version number to 2.3.0 (`#2213 `__) `Klaus Zimmermann `__ -- Update release schedule for 2.3.0 (`#2247 `__) `Klaus Zimmermann `__ -- Changelog update to v2.3.0 (`#2214 `__) `Klaus Zimmermann `__ +- Improving the README.md file with a more appealing look and bit more info (:pull:`2065`) :user:`valeriupredoi` +- Update plot title martin18grl (:pull:`2080`) :user:`katjaweigel` +- Update contribution guidelines (:pull:`2031`) :user:`bouweandela` +- Update links in pull request template to point to latest documentation (:pull:`2083`) :user:`bouweandela` +- Update release schedule (:pull:`2081`) :user:`bouweandela` +- Updates to contribution guidelines (:pull:`2092`) :user:`bouweandela` +- Update documentation for ERA5 with new variables (:pull:`2111`) :user:`lukasbrunner` +- Add OSX installation instructions to docs (:pull:`2115`) :user:`bvreede` +- Instructions to use pre-installed versions on HPC clusters (:pull:`2197`) :user:`remi-kazeroni` +- Add functional Autoassess diagnostics: land surface metrics: permafrost, soil moisture, surface radiation (:pull:`2170`) :user:`valeriupredoi` +- Add citation info in `recipe_eady_growth_rate.yml` (:pull:`2188`) :user:`sloosvel` +- Update version number to 2.3.0 (:pull:`2213`) :user:`zklaus` +- Update release schedule for 2.3.0 (:pull:`2247`) :user:`zklaus` +- Changelog update to v2.3.0 (:pull:`2214`) :user:`zklaus` Diagnostics ~~~~~~~~~~~ -- Added figures 8 and 10 to recipe_bock20jgr.yml (`#2074 `__) `Manuel Schlund `__ -- Add hydrological forcing comparison recipe (`#2013 `__) `Stef Smeets `__ -- Added recipe for Meehl et al., Sci. Adv. (2020) (`#2094 `__) `Manuel Schlund `__ -- Add GlobWat recipe and diagnostic (`#1808 `__) `Banafsheh Abdollahi `__ -- Add ClimWIP recipe to reproduce Brunner et al. 2019 (`#2109 `__) `Lukas Brunner `__ -- Update Climwip recipe to reproduce brunner2020esd (`#1859 `__) `Ruth Lorenz `__ -- Update recipe_thermodyn_diagtool.yml: code improvements and more user options (`#1391 `__) `ValerioLembo `__ -- Remove model AWI-CM-1-1-MR from recipe_impact.yml (`#2238 `__) `Bouwe Andela `__ -- PV capacity factor for ESMValTool GMD paper (`#2153 `__) `katjaweigel `__ +- Added figures 8 and 10 to recipe_bock20jgr.yml (:pull:`2074`) :user:`schlunma` +- Add hydrological forcing comparison recipe (:pull:`2013`) :user:`stefsmeets` +- Added recipe for Meehl et al., Sci. Adv. (2020) (:pull:`2094`) :user:`schlunma` +- Add GlobWat recipe and diagnostic (:pull:`1808`) :user:`babdollahi` +- Add ClimWIP recipe to reproduce Brunner et al. 2019 (:pull:`2109`) :user:`lukasbrunner` +- Update Climwip recipe to reproduce brunner2020esd (:pull:`1859`) :user:`ruthlorenz` +- Update recipe_thermodyn_diagtool.yml: code improvements and more user options (:pull:`1391`) :user:`ValerioLembo` +- Remove model AWI-CM-1-1-MR from recipe_impact.yml (:pull:`2238`) :user:`bouweandela` +- PV capacity factor for ESMValTool GMD paper (:pull:`2153`) :user:`katjaweigel` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Cmorize wfde5 (`#1991 `__) `mwjury `__ -- Make cmorizer utils funcs public in utilities.py and add some numpy style docstrings (`#2206 `__) `Valeriu Predoi `__ -- CMORizer for CLARA-AVHRR cloud data (`#2101 `__) `Axel Lauer `__ -- Update of ESACCI-CLOUD CMORizer (`#2144 `__) `Axel Lauer `__ +- Cmorize wfde5 (:pull:`1991`) :user:`mwjury` +- Make cmorizer utils funcs public in utilities.py and add some numpy style docstrings (:pull:`2206`) :user:`valeriupredoi` +- CMORizer for CLARA-AVHRR cloud data (:pull:`2101`) :user:`axel-lauer` +- Update of ESACCI-CLOUD CMORizer (:pull:`2144`) :user:`axel-lauer` Automatic testing ~~~~~~~~~~~~~~~~~ -- Force latest Python in empty environment in conda install CI test (`#2069 `__) `Valeriu Predoi `__ -- Removed imports from private sklearn modules and improved test coverage of custom_sklearn.py (`#2078 `__) `Manuel Schlund `__ -- Move private _(global)_stock_cube from esmvacore.preprocessor._regrid to cmorizer (`#2087 `__) `Valeriu Predoi `__ -- Try mamba install esmvaltool (`#2125 `__) `Valeriu Predoi `__ -- Reinstate OSX Github Action tests (`#2110 `__) `Valeriu Predoi `__ -- Pin mpich to avoid default install of 3.4.1 and 3.4.2 with external_0 builds (`#2220 `__) `Valeriu Predoi `__ -- Include test sources in distribution (`#2234 `__) `Klaus Zimmermann `__ -- Pin `iris<3.0.4` to ensure we still (sort of) support Python 3.6 (`#2246 `__) `Valeriu Predoi `__ +- Force latest Python in empty environment in conda install CI test (:pull:`2069`) :user:`valeriupredoi` +- Removed imports from private sklearn modules and improved test coverage of custom_sklearn.py (:pull:`2078`) :user:`schlunma` +- Move private _(global)_stock_cube from esmvacore.preprocessor._regrid to cmorizer (:pull:`2087`) :user:`valeriupredoi` +- Try mamba install esmvaltool (:pull:`2125`) :user:`valeriupredoi` +- Reinstate OSX Github Action tests (:pull:`2110`) :user:`valeriupredoi` +- Pin mpich to avoid default install of 3.4.1 and 3.4.2 with external_0 builds (:pull:`2220`) :user:`valeriupredoi` +- Include test sources in distribution (:pull:`2234`) :user:`zklaus` +- Pin `iris<3.0.4` to ensure we still (sort of) support Python 3.6 (:pull:`2246`) :user:`valeriupredoi` Installation ~~~~~~~~~~~~ -- Fix conda build by skipping documentation test (`#2058 `__) `Javier Vegas-Regidor `__ -- Update pin on esmvalcore pick up esmvalcore=2.3.0 (`#2200 `__) `Valeriu Predoi `__ -- Pin Python to 3.9 for development installation (`#2208 `__) `Bouwe Andela `__ +- Fix conda build by skipping documentation test (:pull:`2058`) `Javier Vegas-Regidor `__ +- Update pin on esmvalcore pick up esmvalcore=2.3.0 (:pull:`2200`) :user:`valeriupredoi` +- Pin Python to 3.9 for development installation (:pull:`2208`) :user:`bouweandela` Improvements ~~~~~~~~~~~~ -- Add EUCP and IS-ENES3 projects to config-references (`#2066 `__) `Peter Kalverla `__ -- Fix flake8 tests on CircleCI (`#2070 `__) `Bouwe Andela `__ -- Added recipe filler. (`#1707 `__) `Lee de Mora `__ -- Update use of fx vars to new syntax (`#2145 `__) `sloosvel `__ -- Add recipe for climate impact research (`#2072 `__) `Peter Kalverla `__ -- Update references "master" to "main" (`#2172 `__) `Axel Lauer `__ -- Force git to ignore VSCode workspace files (`#2186 `__) `Javier Vegas-Regidor `__ -- Update to new ESMValTool logo (`#2168 `__) `Axel Lauer `__ -- Python cmorizers for CDR1 and CDR2 ESACCI H2O (TCWV=prw) data. (`#2152 `__) `katjaweigel `__ -- Remove obsolete conda package (closes #2100) (`#2103 `__) `Klaus Zimmermann `__ +- Add EUCP and IS-ENES3 projects to config-references (:pull:`2066`) :user:`Peter9192` +- Fix flake8 tests on CircleCI (:pull:`2070`) :user:`bouweandela` +- Added recipe filler. (:pull:`1707`) :user:`ledm` +- Update use of fx vars to new syntax (:pull:`2145`) :user:`sloosvel` +- Add recipe for climate impact research (:pull:`2072`) :user:`Peter9192` +- Update references "master" to "main" (:pull:`2172`) :user:`axel-lauer` +- Force git to ignore VSCode workspace files (:pull:`2186`) `Javier Vegas-Regidor `__ +- Update to new ESMValTool logo (:pull:`2168`) :user:`axel-lauer` +- Python cmorizers for CDR1 and CDR2 ESACCI H2O (TCWV=prw) data. (:pull:`2152`) :user:`katjaweigel` +- Remove obsolete conda package (closes #2100) (:pull:`2103`) :user:`zklaus` .. _changelog-v2-2-0: @@ -898,110 +1008,110 @@ This release includes Bug fixes ~~~~~~~~~ -- Bugfix: time weights in time_operations (`#1956 `__) `Axel Lauer `__ -- Fix issues with bibtex references (`#1955 `__) `Stef Smeets `__ -- Fix ImportError for `configure_logging` (`#1976 `__) `Stef Smeets `__ -- Add required functional parameters for extract time in recipe_er5.yml (`#1978 `__) `Valeriu Predoi `__ -- Revert "Fix ImportError for `configure_logging`" (`#1992 `__) `Bouwe Andela `__ -- Fix import of esmvalcore _logging module in cmorize_obs.py (`#2020 `__) `Valeriu Predoi `__ -- Fix logging import in cmorize_obs again since last merge was nulled by pre-commit hooks (`#2022 `__) `Valeriu Predoi `__ -- Refactor the functions in derive_evspsblpot due to new iris (`#2023 `__) `SarahAlidoost `__ -- Avoid importing private ESMValCore functions in CMORizer (`#2027 `__) `Bouwe Andela `__ -- Fix extract_seasons in validation recipe (`#2054 `__) `Javier Vegas-Regidor `__ +- Bugfix: time weights in time_operations (:pull:`1956`) :user:`axel-lauer` +- Fix issues with bibtex references (:pull:`1955`) :user:`stefsmeets` +- Fix ImportError for `configure_logging` (:pull:`1976`) :user:`stefsmeets` +- Add required functional parameters for extract time in recipe_er5.yml (:pull:`1978`) :user:`valeriupredoi` +- Revert "Fix ImportError for `configure_logging`" (:pull:`1992`) :user:`bouweandela` +- Fix import of esmvalcore _logging module in cmorize_obs.py (:pull:`2020`) :user:`valeriupredoi` +- Fix logging import in cmorize_obs again since last merge was nulled by pre-commit hooks (:pull:`2022`) :user:`valeriupredoi` +- Refactor the functions in derive_evspsblpot due to new iris (:pull:`2023`) :user:`SarahAlidoost` +- Avoid importing private ESMValCore functions in CMORizer (:pull:`2027`) :user:`bouweandela` +- Fix extract_seasons in validation recipe (:pull:`2054`) `Javier Vegas-Regidor `__ Deprecations ~~~~~~~~~~~~ -- Deprecate classes Variable, Variables and Datasets (`#1944 `__) `Manuel Schlund `__ -- Python 3.9: remove pynio as dependency and replace with rasterio and pin Matplotlib>3.3.1 and pin cartopy>=0.18 (`#1997 `__) `Valeriu Predoi `__ -- Removed write_plots and write_netcdf in some python diagnostics (`#2036 `__) `Manuel Schlund `__ +- Deprecate classes Variable, Variables and Datasets (:pull:`1944`) :user:`schlunma` +- Python 3.9: remove pynio as dependency and replace with rasterio and pin Matplotlib>3.3.1 and pin cartopy>=0.18 (:pull:`1997`) :user:`valeriupredoi` +- Removed write_plots and write_netcdf in some python diagnostics (:pull:`2036`) :user:`schlunma` Documentation ~~~~~~~~~~~~~ -- Update instructions on making a release (`#1867 `__) `Bouwe Andela `__ -- Update review.rst (`#1917 `__) `Axel Lauer `__ -- Add guidance on how to review a pull request (`#1872 `__) `Bouwe Andela `__ -- Adding tutorial links to documentation (`#1927 `__) `Birgit Hassler `__ -- Added bibtex file for schlund20jgr (`#1928 `__) `Manuel Schlund `__ -- Documentation contact added the actual email for the mailing list (`#1938 `__) `Valeriu Predoi `__ -- Make CircleCI badge specific to main branch (`#1831 `__) `Bouwe Andela `__ -- Documentation on how to move code from a private repository to a public repository (`#1920 `__) `Birgit Hassler `__ -- Refine pull request review guidelines (`#1924 `__) `Stef Smeets `__ -- Update release schedule (`#1948 `__) `Klaus Zimmermann `__ -- Improve contact info and move to more prominent location (`#1950 `__) `Bouwe Andela `__ -- Add some maintainers to some recipes that are missing them (`#1970 `__) `Valeriu Predoi `__ -- Update core team info (`#1973 `__) `Axel Lauer `__ -- Combine installation from source instructions and add common issues (`#1971 `__) `Bouwe Andela `__ -- Update iris documentation URL for sphinx (`#2003 `__) `Bouwe Andela `__ -- Fix iris documentation link(s) with new iris3 location on readthedocs (`#2012 `__) `Valeriu Predoi `__ -- Document how to run tests for installation verification (`#1847 `__) `Valeriu Predoi `__ -- List Remi Kazeroni as a code owner and sole merger of CMORizers (`#2017 `__) `Bouwe Andela `__ -- Install documentation: mention that we build conda package with python>=3.7 (`#2030 `__) `Valeriu Predoi `__ -- Recipe and documentation update for ERA5-Land. (`#1906 `__) `katjaweigel `__ -- Update changelog and changelog tool for v2.2.0 (`#2043 `__) `Javier Vegas-Regidor `__ -- Final update to the changelog for v2.2.0 (`#2056 `__) `Javier Vegas-Regidor `__ +- Update instructions on making a release (:pull:`1867`) :user:`bouweandela` +- Update review.rst (:pull:`1917`) :user:`axel-lauer` +- Add guidance on how to review a pull request (:pull:`1872`) :user:`bouweandela` +- Adding tutorial links to documentation (:pull:`1927`) :user:`hb326` +- Added bibtex file for schlund20jgr (:pull:`1928`) :user:`schlunma` +- Documentation contact added the actual email for the mailing list (:pull:`1938`) :user:`valeriupredoi` +- Make CircleCI badge specific to main branch (:pull:`1831`) :user:`bouweandela` +- Documentation on how to move code from a private repository to a public repository (:pull:`1920`) :user:`hb326` +- Refine pull request review guidelines (:pull:`1924`) :user:`stefsmeets` +- Update release schedule (:pull:`1948`) :user:`zklaus` +- Improve contact info and move to more prominent location (:pull:`1950`) :user:`bouweandela` +- Add some maintainers to some recipes that are missing them (:pull:`1970`) :user:`valeriupredoi` +- Update core team info (:pull:`1973`) :user:`axel-lauer` +- Combine installation from source instructions and add common issues (:pull:`1971`) :user:`bouweandela` +- Update iris documentation URL for sphinx (:pull:`2003`) :user:`bouweandela` +- Fix iris documentation link(s) with new iris3 location on readthedocs (:pull:`2012`) :user:`valeriupredoi` +- Document how to run tests for installation verification (:pull:`1847`) :user:`valeriupredoi` +- List Remi Kazeroni as a code owner and sole merger of CMORizers (:pull:`2017`) :user:`bouweandela` +- Install documentation: mention that we build conda package with python>=3.7 (:pull:`2030`) :user:`valeriupredoi` +- Recipe and documentation update for ERA5-Land. (:pull:`1906`) :user:`katjaweigel` +- Update changelog and changelog tool for v2.2.0 (:pull:`2043`) `Javier Vegas-Regidor `__ +- Final update to the changelog for v2.2.0 (:pull:`2056`) `Javier Vegas-Regidor `__ Diagnostics ~~~~~~~~~~~ -- Add mapplot diagnostic to ClimWIP (`#1864 `__) `Lukas Brunner `__ -- Add the option to weight variable groups in ClimWIP (`#1856 `__) `Lukas Brunner `__ -- Implementation of ensemble member recognition to the ClimWIP diagnostic (`#1852 `__) `Lukas Brunner `__ -- Restructure ClimWIP (`#1919 `__) `Lukas Brunner `__ -- Diagnostic for recipe_eyring13jgr.yml Fig. 12 (`#1922 `__) `Lisa Bock `__ -- Added changes in shared functions necessary for schlund20esd (`#1967 `__) `Manuel Schlund `__ -- Adding recipe and diagnostics for Gier et al 2020 (`#1914 `__) `Bettina Gier `__ -- Added recipe, diagnostics and documentation for Schlund et al., ESD (2020) (`#2015 `__) `Manuel Schlund `__ -- Add PRIMAVERA Eady Growth Rate diagnostic (`#1285 `__) `sloosvel `__ -- Implement shape parameter calibration for ClimWIP (`#1905 `__) `Lukas Brunner `__ +- Add mapplot diagnostic to ClimWIP (:pull:`1864`) :user:`lukasbrunner` +- Add the option to weight variable groups in ClimWIP (:pull:`1856`) :user:`lukasbrunner` +- Implementation of ensemble member recognition to the ClimWIP diagnostic (:pull:`1852`) :user:`lukasbrunner` +- Restructure ClimWIP (:pull:`1919`) :user:`lukasbrunner` +- Diagnostic for recipe_eyring13jgr.yml Fig. 12 (:pull:`1922`) :user:`LisaBock` +- Added changes in shared functions necessary for schlund20esd (:pull:`1967`) :user:`schlunma` +- Adding recipe and diagnostics for Gier et al 2020 (:pull:`1914`) :user:`bettina-gier` +- Added recipe, diagnostics and documentation for Schlund et al., ESD (2020) (:pull:`2015`) :user:`schlunma` +- Add PRIMAVERA Eady Growth Rate diagnostic (:pull:`1285`) :user:`sloosvel` +- Implement shape parameter calibration for ClimWIP (:pull:`1905`) :user:`lukasbrunner` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Extended ESRL cmorizer (`#1937 `__) `Bettina Gier `__ -- Cmorizer for GRACE data (`#1694 `__) `bascrezee `__ -- Cmorizer for latest ESACCI-SST data (`#1895 `__) `Valeriu Predoi `__ -- Fix longitude in ESRL cmorizer (`#1988 `__) `Bettina Gier `__ -- Selectively turn off fixing bounds for coordinates during cmorization with utilities.py (`#2014 `__) `Valeriu Predoi `__ -- Cmorize hadcrut5 (`#1977 `__) `mwjury `__ -- Cmorize gpcc masking (`#1995 `__) `mwjury `__ -- Cmorize_utils_save_1mon_Amon (`#1990 `__) `mwjury `__ -- Cmorize gpcc fix (`#1982 `__) `mwjury `__ -- Fix flake8 raised by develop test in cmorize_obs_gpcc.py (`#2038 `__) `Valeriu Predoi `__ +- Extended ESRL cmorizer (:pull:`1937`) :user:`bettina-gier` +- Cmorizer for GRACE data (:pull:`1694`) :user:`bascrezee` +- Cmorizer for latest ESACCI-SST data (:pull:`1895`) :user:`valeriupredoi` +- Fix longitude in ESRL cmorizer (:pull:`1988`) :user:`bettina-gier` +- Selectively turn off fixing bounds for coordinates during cmorization with utilities.py (:pull:`2014`) :user:`valeriupredoi` +- Cmorize hadcrut5 (:pull:`1977`) :user:`mwjury` +- Cmorize gpcc masking (:pull:`1995`) :user:`mwjury` +- Cmorize_utils_save_1mon_Amon (:pull:`1990`) :user:`mwjury` +- Cmorize gpcc fix (:pull:`1982`) :user:`mwjury` +- Fix flake8 raised by develop test in cmorize_obs_gpcc.py (:pull:`2038`) :user:`valeriupredoi` Automatic testing ~~~~~~~~~~~~~~~~~ -- Switched miniconda conda setup hooks for Github Actions workflows (`#1913 `__) `Valeriu Predoi `__ -- Fix style issue (`#1929 `__) `Bouwe Andela `__ -- Fix mlr test with solution that works for CentOS too (`#1936 `__) `Valeriu Predoi `__ -- Temporary deactivation Github Actions on OSX (`#1939 `__) `Valeriu Predoi `__ -- Fix conda installation test on CircleCI (`#1952 `__) `Bouwe Andela `__ -- Github Actions: change time for cron job that installs from conda (`#1969 `__) `Valeriu Predoi `__ -- CI upload relevant artifacts for test job (`#1999 `__) `Valeriu Predoi `__ -- Github Actions test that runs with the latest ESMValCore main (`#1989 `__) `Valeriu Predoi `__ -- Introduce python 39 in Github Actions tests (`#2029 `__) `Valeriu Predoi `__ -- Remove test for conda package installation on Python 3.6 (`#2033 `__) `Valeriu Predoi `__ -- Update codacy coverage reporter to fix coverage (`#2039 `__) `Bouwe Andela `__ +- Switched miniconda conda setup hooks for Github Actions workflows (:pull:`1913`) :user:`valeriupredoi` +- Fix style issue (:pull:`1929`) :user:`bouweandela` +- Fix mlr test with solution that works for CentOS too (:pull:`1936`) :user:`valeriupredoi` +- Temporary deactivation Github Actions on OSX (:pull:`1939`) :user:`valeriupredoi` +- Fix conda installation test on CircleCI (:pull:`1952`) :user:`bouweandela` +- Github Actions: change time for cron job that installs from conda (:pull:`1969`) :user:`valeriupredoi` +- CI upload relevant artifacts for test job (:pull:`1999`) :user:`valeriupredoi` +- Github Actions test that runs with the latest ESMValCore main (:pull:`1989`) :user:`valeriupredoi` +- Introduce python 39 in Github Actions tests (:pull:`2029`) :user:`valeriupredoi` +- Remove test for conda package installation on Python 3.6 (:pull:`2033`) :user:`valeriupredoi` +- Update codacy coverage reporter to fix coverage (:pull:`2039`) :user:`bouweandela` Installation ~~~~~~~~~~~~ -- Simplify installation of R development dependencies (`#1930 `__) `Bouwe Andela `__ -- Fix docker build (`#1934 `__) `Bouwe Andela `__ -- Use new conda environment for installing ESMValTool in Docker containers (`#1993 `__) `Bouwe Andela `__ -- Fix conda build (`#2026 `__) `Bouwe Andela `__ +- Simplify installation of R development dependencies (:pull:`1930`) :user:`bouweandela` +- Fix docker build (:pull:`1934`) :user:`bouweandela` +- Use new conda environment for installing ESMValTool in Docker containers (:pull:`1993`) :user:`bouweandela` +- Fix conda build (:pull:`2026`) :user:`bouweandela` Improvements ~~~~~~~~~~~~ -- Allow multiple references for a cmorizer script (`#1953 `__) `SarahAlidoost `__ -- Add GRACE to the recipe check_obs (`#1963 `__) `Rémi Kazeroni `__ -- Align ESMValTool to ESMValCore=2.2.0 (adopt iris3, fix environment for new Core release) (`#1874 `__) `Stef Smeets `__ -- Make it possible to use write_plots and write_netcdf from recipe instead of config-user.yml (`#2018 `__) `Bouwe Andela `__ -- Revise lisflood and hype recipes (`#2035 `__) `SarahAlidoost `__ -- Set version to 2.2.0 (`#2042 `__) `Javier Vegas-Regidor `__ +- Allow multiple references for a cmorizer script (:pull:`1953`) :user:`SarahAlidoost` +- Add GRACE to the recipe check_obs (:pull:`1963`) :user:`remi-kazeroni` +- Align ESMValTool to ESMValCore=2.2.0 (adopt iris3, fix environment for new Core release) (:pull:`1874`) :user:`stefsmeets` +- Make it possible to use write_plots and write_netcdf from recipe instead of config-user.yml (:pull:`2018`) :user:`bouweandela` +- Revise lisflood and hype recipes (:pull:`2035`) :user:`SarahAlidoost` +- Set version to 2.2.0 (:pull:`2042`) `Javier Vegas-Regidor `__ .. _changelog-v2-1-1: @@ -1013,14 +1123,14 @@ This release includes Improvements ~~~~~~~~~~~~ -- Fix the conda build on CircleCI (`#1883 `__) `Bouwe Andela `__ -- Pin matplotlib to <3.3 and add compilers (`#1898 `__) `Bouwe Andela `__ -- Pin esmvaltool subpackages to the same version and build as the esmvaltool conda package (`#1899 `__) `Bouwe Andela `__ +- Fix the conda build on CircleCI (:pull:`1883`) :user:`bouweandela` +- Pin matplotlib to <3.3 and add compilers (:pull:`1898`) :user:`bouweandela` +- Pin esmvaltool subpackages to the same version and build as the esmvaltool conda package (:pull:`1899`) :user:`bouweandela` Documentation ~~~~~~~~~~~~~ -- Release notes v2.1.1 (`#1932 `__) `Valeriu Predoi `__ +- Release notes v2.1.1 (:pull:`1932`) :user:`valeriupredoi` .. _changelog-v2-1-0: @@ -1032,51 +1142,51 @@ This release includes Diagnostics ~~~~~~~~~~~ -- Add extra steps to diagnostic to make output of hydrology/recipe_lisflood.yml usable by the LISFLOOD model (`#1737 `__) `Jaro Camphuijsen `__ -- Recipe to reproduce the 2014 KNMI Climate Scenarios (kcs). (`#1667 `__) `Peter Kalverla `__ -- Implement the climwip weighting scheme in a recipe and diagnostic (`#1648 `__) `Jaro Camphuijsen `__ -- Remove unreviewed autoassess recipes (`#1840 `__) `Valeriu Predoi `__ -- Changes in shared scripts for Schlund et al., JGR: Biogeosciences, 2020 (`#1845 `__) `Manuel Schlund `__ -- Updated derivation test recipe (`#1790 `__) `Manuel Schlund `__ -- Support for multiple model occurrence in perf main (`#1649 `__) `Bettina Gier `__ -- Add recipe and diagnostics for Schlund et al., JGR: Biogeosciences, 2020 (`#1860 `__) `Manuel Schlund `__ -- Adjust recipe_extract_shape.yml to recent changes in the example diagnostic.py (`#1880 `__) `Bouwe Andela `__ +- Add extra steps to diagnostic to make output of hydrology/recipe_lisflood.yml usable by the LISFLOOD model (:pull:`1737`) :user:`JaroCamphuijsen` +- Recipe to reproduce the 2014 KNMI Climate Scenarios (kcs). (:pull:`1667`) :user:`Peter9192` +- Implement the climwip weighting scheme in a recipe and diagnostic (:pull:`1648`) :user:`JaroCamphuijsen` +- Remove unreviewed autoassess recipes (:pull:`1840`) :user:`valeriupredoi` +- Changes in shared scripts for Schlund et al., JGR: Biogeosciences, 2020 (:pull:`1845`) :user:`schlunma` +- Updated derivation test recipe (:pull:`1790`) :user:`schlunma` +- Support for multiple model occurrence in perf main (:pull:`1649`) :user:`bettina-gier` +- Add recipe and diagnostics for Schlund et al., JGR: Biogeosciences, 2020 (:pull:`1860`) :user:`schlunma` +- Adjust recipe_extract_shape.yml to recent changes in the example diagnostic.py (:pull:`1880`) :user:`bouweandela` Documentation ~~~~~~~~~~~~~ -- Add pip installation instructions (`#1783 `__) `Bouwe Andela `__ -- Add installation instruction for R and Julia dependencies tot pip install (`#1787 `__) `Bouwe Andela `__ -- Avoid autodocsumm 0.2.0 and update documentation build dependencies (`#1794 `__) `Bouwe Andela `__ -- Add more information on working on cluster attached to ESGF node (`#1821 `__) `Bouwe Andela `__ -- Add release strategy to community documentation (`#1809 `__) `Klaus Zimmermann `__ -- Update esmvaltool run command everywhere in documentation (`#1820 `__) `Bouwe Andela `__ -- Add more info on documenting a recipe (`#1795 `__) `Bouwe Andela `__ -- Improve the Python example diagnostic and documentation (`#1827 `__) `Bouwe Andela `__ -- Improve description of how to use draft_release_notes.py (`#1848 `__) `Bouwe Andela `__ -- Update changelog for release 2.1 (`#1886 `__) `Valeriu Predoi `__ +- Add pip installation instructions (:pull:`1783`) :user:`bouweandela` +- Add installation instruction for R and Julia dependencies tot pip install (:pull:`1787`) :user:`bouweandela` +- Avoid autodocsumm 0.2.0 and update documentation build dependencies (:pull:`1794`) :user:`bouweandela` +- Add more information on working on cluster attached to ESGF node (:pull:`1821`) :user:`bouweandela` +- Add release strategy to community documentation (:pull:`1809`) :user:`zklaus` +- Update esmvaltool run command everywhere in documentation (:pull:`1820`) :user:`bouweandela` +- Add more info on documenting a recipe (:pull:`1795`) :user:`bouweandela` +- Improve the Python example diagnostic and documentation (:pull:`1827`) :user:`bouweandela` +- Improve description of how to use draft_release_notes.py (:pull:`1848`) :user:`bouweandela` +- Update changelog for release 2.1 (:pull:`1886`) :user:`valeriupredoi` Improvements ~~~~~~~~~~~~ -- Fix R installation in WSL (`#1789 `__) `Javier Vegas-Regidor `__ -- Add pre-commit for linting/formatting (`#1796 `__) `Stef Smeets `__ -- Speed up tests on CircleCI and use pytest to run them (`#1804 `__) `Bouwe Andela `__ -- Move pre-commit excludes to top-level and correct order of lintr and styler (`#1805 `__) `Stef Smeets `__ -- Remove isort setup to fix formatting conflict with yapf (`#1815 `__) `Stef Smeets `__ -- GitHub Actions (`#1806 `__) `Valeriu Predoi `__ -- Fix yapf-isort import formatting conflict (`#1822 `__) `Stef Smeets `__ -- Replace vmprof with vprof as the default profiler (`#1829 `__) `Bouwe Andela `__ -- Update ESMValCore v2.1.0 requirement (`#1839 `__) `Javier Vegas-Regidor `__ -- Pin iris to version 2 (`#1881 `__) `Bouwe Andela `__ -- Pin eccodes to not use eccodes=2.19.0 for cdo to work fine (`#1869 `__) `Valeriu Predoi `__ -- Increase version to 2.1.0 and add release notes (`#1868 `__) `Valeriu Predoi `__ -- Github Actions Build Packages and Deploy tests (conda and PyPi) (`#1858 `__) `Valeriu Predoi `__ +- Fix R installation in WSL (:pull:`1789`) `Javier Vegas-Regidor `__ +- Add pre-commit for linting/formatting (:pull:`1796`) :user:`stefsmeets` +- Speed up tests on CircleCI and use pytest to run them (:pull:`1804`) :user:`bouweandela` +- Move pre-commit excludes to top-level and correct order of lintr and styler (:pull:`1805`) :user:`stefsmeets` +- Remove isort setup to fix formatting conflict with yapf (:pull:`1815`) :user:`stefsmeets` +- GitHub Actions (:pull:`1806`) :user:`valeriupredoi` +- Fix yapf-isort import formatting conflict (:pull:`1822`) :user:`stefsmeets` +- Replace vmprof with vprof as the default profiler (:pull:`1829`) :user:`bouweandela` +- Update ESMValCore v2.1.0 requirement (:pull:`1839`) `Javier Vegas-Regidor `__ +- Pin iris to version 2 (:pull:`1881`) :user:`bouweandela` +- Pin eccodes to not use eccodes=2.19.0 for cdo to work fine (:pull:`1869`) :user:`valeriupredoi` +- Increase version to 2.1.0 and add release notes (:pull:`1868`) :user:`valeriupredoi` +- Github Actions Build Packages and Deploy tests (conda and PyPi) (:pull:`1858`) :user:`valeriupredoi` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Added CMORizer for Scripps-CO2-KUM (`#1857 `__) `Manuel Schlund `__ +- Added CMORizer for Scripps-CO2-KUM (:pull:`1857`) :user:`schlunma` .. _changelog-v2-0-0: @@ -1088,106 +1198,106 @@ This release includes Bug fixes ~~~~~~~~~ -- Fix pep8-naming errors and fix zmnam diagnostic (`#1702 `__) `Bouwe Andela `__ -- Fix keyword argument in cmorize_obs (`#1721 `__) `Mattia Righi `__ -- Fixed JMA-TRANSCOM CMORizer (`#1735 `__) `Manuel Schlund `__ -- Fix bug in extract_doi_value (`#1734 `__) `bascrezee `__ -- Fix small errors in the arctic_ocean diagnostic (`#1722 `__) `Nikolay Koldunov `__ -- Flatten ancestor lists for diag_spei.R and diag_spi.R. (`#1745 `__) `katjaweigel `__ -- Fix for recipe_ocean_ice_extent.yml (`#1744 `__) `Mattia Righi `__ -- Fix recipe_combined_indices.yml provenance (`#1746 `__) `Javier Vegas-Regidor `__ -- Fix provenance in recipe_multimodel_products (`#1747 `__) `Javier Vegas-Regidor `__ -- Exclude FGOALS-g2 due to ESMValCore issue #728 (`#1749 `__) `Mattia Righi `__ -- Fix recipe_modes_of_variability (`#1753 `__) `Javier Vegas-Regidor `__ -- Flatten lists for ancestors for hyint to prevent nested lists. (`#1752 `__) `katjaweigel `__ -- Fix bug in cmorize_obs_eppley_vgpm_modis.py (#1729) (`#1759 `__) `Tomas Lovato `__ -- Correct mip for clltkisccp in example derive preprocessor recipe (`#1768 `__) `Bouwe Andela `__ -- Update date conversion in recipe_hype.yml (`#1769 `__) `Bouwe Andela `__ -- Fix recipe_correlation.yml (`#1767 `__) `Bouwe Andela `__ -- Add attribute positive: down to plev coordinate in ERA-Interim CMORizer (`#1771 `__) `Bouwe Andela `__ -- Fix sispeed in recipe_preprocessor_derive_test (`#1772 `__) `Javier Vegas-Regidor `__ -- Fix extreme events and extreme index ancestors (`#1774 `__) `katjaweigel `__ -- Correct date in output filenames of ERA5 CMORizer recipe (`#1773 `__) `Bouwe Andela `__ -- Exclude WOA from multi-model stats in recipe_ocean_bgc (`#1778 `__) `Mattia Righi `__ +- Fix pep8-naming errors and fix zmnam diagnostic (:pull:`1702`) :user:`bouweandela` +- Fix keyword argument in cmorize_obs (:pull:`1721`) :user:`mattiarighi` +- Fixed JMA-TRANSCOM CMORizer (:pull:`1735`) :user:`schlunma` +- Fix bug in extract_doi_value (:pull:`1734`) :user:`bascrezee` +- Fix small errors in the arctic_ocean diagnostic (:pull:`1722`) :user:`koldunovn` +- Flatten ancestor lists for diag_spei.R and diag_spi.R. (:pull:`1745`) :user:`katjaweigel` +- Fix for recipe_ocean_ice_extent.yml (:pull:`1744`) :user:`mattiarighi` +- Fix recipe_combined_indices.yml provenance (:pull:`1746`) `Javier Vegas-Regidor `__ +- Fix provenance in recipe_multimodel_products (:pull:`1747`) `Javier Vegas-Regidor `__ +- Exclude FGOALS-g2 due to ESMValCore issue #728 (:pull:`1749`) :user:`mattiarighi` +- Fix recipe_modes_of_variability (:pull:`1753`) `Javier Vegas-Regidor `__ +- Flatten lists for ancestors for hyint to prevent nested lists. (:pull:`1752`) :user:`katjaweigel` +- Fix bug in cmorize_obs_eppley_vgpm_modis.py (#1729) (:pull:`1759`) :user:`tomaslovato` +- Correct mip for clltkisccp in example derive preprocessor recipe (:pull:`1768`) :user:`bouweandela` +- Update date conversion in recipe_hype.yml (:pull:`1769`) :user:`bouweandela` +- Fix recipe_correlation.yml (:pull:`1767`) :user:`bouweandela` +- Add attribute positive: down to plev coordinate in ERA-Interim CMORizer (:pull:`1771`) :user:`bouweandela` +- Fix sispeed in recipe_preprocessor_derive_test (:pull:`1772`) `Javier Vegas-Regidor `__ +- Fix extreme events and extreme index ancestors (:pull:`1774`) :user:`katjaweigel` +- Correct date in output filenames of ERA5 CMORizer recipe (:pull:`1773`) :user:`bouweandela` +- Exclude WOA from multi-model stats in recipe_ocean_bgc (:pull:`1778`) :user:`mattiarighi` Diagnostics ~~~~~~~~~~~ -- Enhancement of the hyint recipe to include etccdi indices (`#1133 `__) `Enrico Arnone `__ -- Add lazy regridding for wflow diagnostic (`#1630 `__) `Bouwe Andela `__ -- Miles default domains to include lat=0 (`#1626 `__) `Jost von Hardenberg `__ -- Miles: selection of reference dataset based on experiment (`#1632 `__) `Jost von Hardenberg `__ -- New recipe/diagnostic: recipe_li17natcc.yml for Axels GMD Paper (`#1567 `__) `katjaweigel `__ -- New recipe/diagnostics: recipe_deangelis_for_gmdpart4.yml for Axels GMD Paper (`#1576 `__) `katjaweigel `__ -- EWaterCycle: Add recipe to prepare input for LISFLOOD (`#1298 `__) `Stefan Verhoeven `__ -- Use area weighted regridding in wflow diagnostic (`#1643 `__) `Bouwe Andela `__ -- Workaround for permetrics recipe until Iris3 (`#1674 `__) `Mattia Righi `__ -- C3S_511_MPQB_bas-features (`#1465 `__) `bascrezee `__ -- Additional Land perfmetrics (`#1641 `__) `Bettina Gier `__ -- Necessary diagnostic from eyring06jgr for the release of version2 (`#1686 `__) `Birgit Hassler `__ -- Drought characteristics based on Martin2018 and SPI for gmd paper (`#1689 `__) `katjaweigel `__ -- Additional features and bugfixes for recipe anav13clim (`#1723 `__) `Bettina Gier `__ -- Gmd laueretal2020 revisions (`#1725 `__) `Axel Lauer `__ -- Wenzel16nature (`#1692 `__) `zechlau `__ -- Add mask albedolandcover (`#1673 `__) `bascrezee `__ -- IPCC AR5 fig. 9.3 (seasonality) (`#1726 `__) `Axel Lauer `__ -- Added additional emergent constraints on ECS (`#1585 `__) `Manuel Schlund `__ -- A diagnostic to evaluate the turnover times of land ecosystem carbon (`#1395 `__) `koir-su `__ -- Removed multi_model_statistics step in recipe_oceans_example.yml as a workaround (`#1779 `__) `Valeriu Predoi `__ +- Enhancement of the hyint recipe to include etccdi indices (:pull:`1133`) :user:`earnone` +- Add lazy regridding for wflow diagnostic (:pull:`1630`) :user:`bouweandela` +- Miles default domains to include lat=0 (:pull:`1626`) :user:`jhardenberg` +- Miles: selection of reference dataset based on experiment (:pull:`1632`) :user:`jhardenberg` +- New recipe/diagnostic: recipe_li17natcc.yml for Axels GMD Paper (:pull:`1567`) :user:`katjaweigel` +- New recipe/diagnostics: recipe_deangelis_for_gmdpart4.yml for Axels GMD Paper (:pull:`1576`) :user:`katjaweigel` +- EWaterCycle: Add recipe to prepare input for LISFLOOD (:pull:`1298`) :user:`sverhoeven` +- Use area weighted regridding in wflow diagnostic (:pull:`1643`) :user:`bouweandela` +- Workaround for permetrics recipe until Iris3 (:pull:`1674`) :user:`mattiarighi` +- C3S_511_MPQB_bas-features (:pull:`1465`) :user:`bascrezee` +- Additional Land perfmetrics (:pull:`1641`) :user:`bettina-gier` +- Necessary diagnostic from eyring06jgr for the release of version2 (:pull:`1686`) :user:`hb326` +- Drought characteristics based on Martin2018 and SPI for gmd paper (:pull:`1689`) :user:`katjaweigel` +- Additional features and bugfixes for recipe anav13clim (:pull:`1723`) :user:`bettina-gier` +- Gmd laueretal2020 revisions (:pull:`1725`) :user:`axel-lauer` +- Wenzel16nature (:pull:`1692`) :user:`zechlau` +- Add mask albedolandcover (:pull:`1673`) :user:`bascrezee` +- IPCC AR5 fig. 9.3 (seasonality) (:pull:`1726`) :user:`axel-lauer` +- Added additional emergent constraints on ECS (:pull:`1585`) :user:`schlunma` +- A diagnostic to evaluate the turnover times of land ecosystem carbon (:pull:`1395`) `koir-su `__ +- Removed multi_model_statistics step in recipe_oceans_example.yml as a workaround (:pull:`1779`) :user:`valeriupredoi` Documentation ~~~~~~~~~~~~~ -- Extend getting started instructions to obtain config-user.yml (`#1642 `__) `Peter Kalverla `__ -- Extend information about native6 support on RTD (`#1652 `__) `Peter Kalverla `__ -- Update citation of ESMValTool paper in the doc (`#1664 `__) `Mattia Righi `__ -- Updated references to documentation (now docs.esmvaltool.org) (`#1679 `__) `Axel Lauer `__ -- Replace dead link with ESGF link. (`#1681 `__) `Mattia Righi `__ -- Add all European grants to Zenodo (`#1682 `__) `Bouwe Andela `__ -- Update Sphinx to v3 or later (`#1685 `__) `Bouwe Andela `__ -- Small fix to number of models in ensclus documentation (`#1691 `__) `Jost von Hardenberg `__ -- Move draft_release_notes.py from ESMValCore to here and update (`#1701 `__) `Bouwe Andela `__ -- Improve the installation instructions (`#1634 `__) `Valeriu Predoi `__ -- Improve description of how to implement provenance in diagnostic (`#1750 `__) `SarahAlidoost `__ -- Update command line interface documentation and add links to ESMValCore configuration documentation (`#1776 `__) `Bouwe Andela `__ -- Documentation on how to find shapefiles for hydrology recipes (`#1777 `__) `Jaro Camphuijsen `__ +- Extend getting started instructions to obtain config-user.yml (:pull:`1642`) :user:`Peter9192` +- Extend information about native6 support on RTD (:pull:`1652`) :user:`Peter9192` +- Update citation of ESMValTool paper in the doc (:pull:`1664`) :user:`mattiarighi` +- Updated references to documentation (now docs.esmvaltool.org) (:pull:`1679`) :user:`axel-lauer` +- Replace dead link with ESGF link. (:pull:`1681`) :user:`mattiarighi` +- Add all European grants to Zenodo (:pull:`1682`) :user:`bouweandela` +- Update Sphinx to v3 or later (:pull:`1685`) :user:`bouweandela` +- Small fix to number of models in ensclus documentation (:pull:`1691`) :user:`jhardenberg` +- Move draft_release_notes.py from ESMValCore to here and update (:pull:`1701`) :user:`bouweandela` +- Improve the installation instructions (:pull:`1634`) :user:`valeriupredoi` +- Improve description of how to implement provenance in diagnostic (:pull:`1750`) :user:`SarahAlidoost` +- Update command line interface documentation and add links to ESMValCore configuration documentation (:pull:`1776`) :user:`bouweandela` +- Documentation on how to find shapefiles for hydrology recipes (:pull:`1777`) :user:`JaroCamphuijsen` Improvements ~~~~~~~~~~~~ -- Pin flake8<3.8.0 (`#1635 `__) `Valeriu Predoi `__ -- Update conda package path in more places (`#1636 `__) `Bouwe Andela `__ -- Remove curly brackets around issue number in pull request template (`#1637 `__) `Bouwe Andela `__ -- Fix style issue in test (`#1639 `__) `Bouwe Andela `__ -- Update Codacy badges (`#1662 `__) `Bouwe Andela `__ -- Support extra installation methods in R (`#1360 `__) `Javier Vegas-Regidor `__ -- Add ncdf4.helpers package as a dependency again (`#1678 `__) `Bouwe Andela `__ -- Speed up conda installation (`#1677 `__) `Bouwe Andela `__ -- Update CMORizers and recipes for ESMValCore v2.0.0 (`#1699 `__) `SarahAlidoost `__ -- Update setup.py for PyPI package (`#1700 `__) `Bouwe Andela `__ -- Cleanup recipe headers before the release (`#1740 `__) `Mattia Righi `__ -- Add colortables as esmvaltool subcommand (`#1666 `__) `Javier Vegas-Regidor `__ -- Increase version to v2.0.0 (`#1756 `__) `Bouwe Andela `__ -- Update job script (`#1757 `__) `Mattia Righi `__ -- Read authors and description from .zenodo.json (`#1758 `__) `Bouwe Andela `__ -- Update docker recipe to install from source (`#1651 `__) `Javier Vegas-Regidor `__ +- Pin flake8<3.8.0 (:pull:`1635`) :user:`valeriupredoi` +- Update conda package path in more places (:pull:`1636`) :user:`bouweandela` +- Remove curly brackets around issue number in pull request template (:pull:`1637`) :user:`bouweandela` +- Fix style issue in test (:pull:`1639`) :user:`bouweandela` +- Update Codacy badges (:pull:`1662`) :user:`bouweandela` +- Support extra installation methods in R (:pull:`1360`) `Javier Vegas-Regidor `__ +- Add ncdf4.helpers package as a dependency again (:pull:`1678`) :user:`bouweandela` +- Speed up conda installation (:pull:`1677`) :user:`bouweandela` +- Update CMORizers and recipes for ESMValCore v2.0.0 (:pull:`1699`) :user:`SarahAlidoost` +- Update setup.py for PyPI package (:pull:`1700`) :user:`bouweandela` +- Cleanup recipe headers before the release (:pull:`1740`) :user:`mattiarighi` +- Add colortables as esmvaltool subcommand (:pull:`1666`) `Javier Vegas-Regidor `__ +- Increase version to v2.0.0 (:pull:`1756`) :user:`bouweandela` +- Update job script (:pull:`1757`) :user:`mattiarighi` +- Read authors and description from .zenodo.json (:pull:`1758`) :user:`bouweandela` +- Update docker recipe to install from source (:pull:`1651`) `Javier Vegas-Regidor `__ Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Cmorize aphro ma (`#1555 `__) `mwjury `__ -- Respectable testing for cmorizers/obs/utilities.py and cmorizers/obs/cmorize_obs.py (`#1517 `__) `Valeriu Predoi `__ -- Fix start year in recipe_check_obs (`#1638 `__) `Mattia Righi `__ -- Cmorizer for the PERSIANN-CDR precipitation data (`#1633 `__) `Birgit Hassler `__ -- Cmorize eobs (`#1554 `__) `mwjury `__ -- Update download cds satellite lai fapar (`#1654 `__) `bascrezee `__ -- Added monthly mean vars (ta, va, zg) to era5 cmorizer via recipe (`#1644 `__) `Evgenia Galytska `__ -- Make format time check more flexible (`#1661 `__) `Mattia Righi `__ -- Exclude od550lt1aer from recipe_check_obs.yml (`#1720 `__) `Mattia Righi `__ -- PERSIANN-CDR cmorizer update: adding the capability to save monthly mean files (`#1728 `__) `Birgit Hassler `__ -- Add standard_name attribute to lon and lat in cmorize_obs_esacci_oc.py (`#1760 `__) `Tomas Lovato `__ -- Allow for incomplete months on daily frequency in cmorizer ncl utilities (`#1754 `__) `Mattia Righi `__ -- Fix AURA-TES cmorizer (`#1766 `__) `Mattia Righi `__ +- Cmorize aphro ma (:pull:`1555`) :user:`mwjury` +- Respectable testing for cmorizers/obs/utilities.py and cmorizers/obs/cmorize_obs.py (:pull:`1517`) :user:`valeriupredoi` +- Fix start year in recipe_check_obs (:pull:`1638`) :user:`mattiarighi` +- Cmorizer for the PERSIANN-CDR precipitation data (:pull:`1633`) :user:`hb326` +- Cmorize eobs (:pull:`1554`) :user:`mwjury` +- Update download cds satellite lai fapar (:pull:`1654`) :user:`bascrezee` +- Added monthly mean vars (ta, va, zg) to era5 cmorizer via recipe (:pull:`1644`) :user:`egalytska` +- Make format time check more flexible (:pull:`1661`) :user:`mattiarighi` +- Exclude od550lt1aer from recipe_check_obs.yml (:pull:`1720`) :user:`mattiarighi` +- PERSIANN-CDR cmorizer update: adding the capability to save monthly mean files (:pull:`1728`) :user:`hb326` +- Add standard_name attribute to lon and lat in cmorize_obs_esacci_oc.py (:pull:`1760`) :user:`tomaslovato` +- Allow for incomplete months on daily frequency in cmorizer ncl utilities (:pull:`1754`) :user:`mattiarighi` +- Fix AURA-TES cmorizer (:pull:`1766`) :user:`mattiarighi` .. _changelog-v2-0-0b4: @@ -1199,43 +1309,43 @@ This release includes Bug fixes ~~~~~~~~~ -- Fix HALOE plev coordinate (`#1590 `__) `Mattia Righi `__ -- Fix tro3 units in HALOE (`#1591 `__) `Mattia Righi `__ +- Fix HALOE plev coordinate (:pull:`1590`) :user:`mattiarighi` +- Fix tro3 units in HALOE (:pull:`1591`) :user:`mattiarighi` Diagnostics ~~~~~~~~~~~ -- Applicate sea ice negative feedback (`#1299 `__) `Javier Vegas-Regidor `__ -- Add Russell18jgr ocean diagnostics (`#1592 `__) `Bouwe Andela `__ -- Refactor marrmot recipe and diagnostic to use ERA5 daily data made by new cmorizer (`#1600 `__) `SarahAlidoost `__ -- In recipe_wflow, use daily ERA5 data from the new cmorizer. (`#1599 `__) `Peter Kalverla `__ -- In wflow diagnostic, calculate PET after(!) interpolation and lapse rate correction (`#1618 `__) `Jerom Aerts `__ -- Fixed wenz14jgr (`#1562 `__) `zechlau `__ -- Update portrait_plot.ncl (`#1625 `__) `Bettina Gier `__ +- Applicate sea ice negative feedback (:pull:`1299`) `Javier Vegas-Regidor `__ +- Add Russell18jgr ocean diagnostics (:pull:`1592`) :user:`bouweandela` +- Refactor marrmot recipe and diagnostic to use ERA5 daily data made by new cmorizer (:pull:`1600`) :user:`SarahAlidoost` +- In recipe_wflow, use daily ERA5 data from the new cmorizer. (:pull:`1599`) :user:`Peter9192` +- In wflow diagnostic, calculate PET after(!) interpolation and lapse rate correction (:pull:`1618`) :user:`jeromaerts` +- Fixed wenz14jgr (:pull:`1562`) :user:`zechlau` +- Update portrait_plot.ncl (:pull:`1625`) :user:`bettina-gier` Documentation ~~~~~~~~~~~~~ -- Restructure documentation (`#1587 `__) `Bouwe Andela `__ -- Add more links to documentation (`#1595 `__) `Bouwe Andela `__ -- Update links in readme (`#1598 `__) `Bouwe Andela `__ -- Minor improvements to installation documentation (`#1608 `__) `Bouwe Andela `__ -- Add info for new mailing list to documentation. (`#1607 `__) `Björn Brötz `__ -- Update making a release documentation (`#1627 `__) `Bouwe Andela `__ +- Restructure documentation (:pull:`1587`) :user:`bouweandela` +- Add more links to documentation (:pull:`1595`) :user:`bouweandela` +- Update links in readme (:pull:`1598`) :user:`bouweandela` +- Minor improvements to installation documentation (:pull:`1608`) :user:`bouweandela` +- Add info for new mailing list to documentation. (:pull:`1607`) :user:`bjoernbroetz` +- Update making a release documentation (:pull:`1627`) :user:`bouweandela` Improvements ~~~~~~~~~~~~ -- Avoid broken pytest-html plugin (`#1583 `__) `Bouwe Andela `__ -- Remove reference section in config-references.yml (`#1545 `__) `SarahAlidoost `__ -- Various improvements to development infrastructure (`#1570 `__) `Bouwe Andela `__ -- Install scikit-learn from conda, remove libunwind as a direct dependency (`#1611 `__) `Valeriu Predoi `__ -- Create conda subpackages and enable tests (`#1624 `__) `Bouwe Andela `__ +- Avoid broken pytest-html plugin (:pull:`1583`) :user:`bouweandela` +- Remove reference section in config-references.yml (:pull:`1545`) :user:`SarahAlidoost` +- Various improvements to development infrastructure (:pull:`1570`) :user:`bouweandela` +- Install scikit-learn from conda, remove libunwind as a direct dependency (:pull:`1611`) :user:`valeriupredoi` +- Create conda subpackages and enable tests (:pull:`1624`) :user:`bouweandela` Observational and re-analysis dataset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Cmorizer for HALOE (`#1581 `__) `Mattia Righi `__ -- Add CMORizer for CT2019 (`#1604 `__) `Manuel Schlund `__ +- Cmorizer for HALOE (:pull:`1581`) :user:`mattiarighi` +- Add CMORizer for CT2019 (:pull:`1604`) :user:`schlunma` For older releases, see the release notes on https://github.com/ESMValGroup/ESMValTool/releases. diff --git a/doc/sphinx/source/community/code_documentation.rst b/doc/sphinx/source/community/code_documentation.rst index 82f8c3a8f7..1c211daf39 100644 --- a/doc/sphinx/source/community/code_documentation.rst +++ b/doc/sphinx/source/community/code_documentation.rst @@ -442,7 +442,10 @@ name to the list of authors in ``CITATION.cff`` and generate the entry for the :: pip install cffconvert - cffconvert --format zenodo --outfile .zenodo.json + cffconvert --infile CITATION.cff --format zenodo --outfile .zenodo.json + +Presently, this method unfortunately discards entries `communities` +and `grants` from that file; please restore them manually. Note that authors of recipes and/or diagnostics also need to be added to the file `esmvaltool/config-references.yml `__, diff --git a/doc/sphinx/source/community/maintainer.rst b/doc/sphinx/source/community/maintainer.rst index 5bec2e825e..7e73748be9 100644 --- a/doc/sphinx/source/community/maintainer.rst +++ b/doc/sphinx/source/community/maintainer.rst @@ -8,7 +8,7 @@ the interface of library functions may change when updating to new versions. Thi withdrawal of datasets used by a recipe can result in an existing recipe to stop working. Such "broken" recipes might require some work to fix such problems and make the recipe fully functional again. -A first **contact point** for the technical lead development team (`@ESMValGroup/technical-lead-development-team`_) in such cases is the recipe "maintainer". The recipe +A first **contact point** for the technical lead development team (:team:`technical-lead-development-team`) in such cases is the recipe "maintainer". The recipe maintainer is then asked to check the affected recipe and if possible, fix the problems or work with the technical lead development team to find a solution. Ideally, a recipe maintainer is able to tell whether the results of a fixed recipe are scientifically valid and look as expected. Being a recipe maintainer consists of the following tasks: @@ -22,10 +22,7 @@ recipe are scientifically valid and look as expected. Being a recipe maintainer * informing the core development team when no longer available as maintainer Ideally, a recipe maintainer is named when contributing a new recipe to the ESMValTool. Recipe maintainers are asked to inform -the core development team (`@ESMValGroup/esmvaltool-coreteam`_) when they are no longer able to act as maintainer or when they would like to step down from this duty +the core development team (:team:`esmvaltool-coreteam`) when they are no longer able to act as maintainer or when they would like to step down from this duty for any reason. The core development team will then try to find a successor. If no recipe maintainer can be found, the :ref:`policy on unmaintained broken (non-working) recipes` might apply eventually leading to retirement of the affected recipe. - -.. _`@ESMValGroup/technical-lead-development-team`: https://github.com/orgs/ESMValGroup/teams/technical-lead-development-team -.. _`@ESMValGroup/esmvaltool-coreteam`: https://github.com/orgs/ESMValGroup/teams/esmvaltool-coreteam diff --git a/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst b/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst index 3f710eaa21..a73643f454 100644 --- a/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst +++ b/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst @@ -136,8 +136,8 @@ Recipe output can be copied by doing from the VM: .. code-block:: bash - nohup rsync -rlt /path_to_testing/esmvaltool_output/* /shared/esmvaltool/v2.x.x/ - + nohup rsync --exclude preproc/ -rlt /path_to_testing/esmvaltool_output/* /shared/esmvaltool/v2.x.x/ + By copying the debug.html and index.html files into /shared/esmvaltool/v2.x.x/, the output becomes available online, see for `example `_. @@ -151,13 +151,13 @@ Link the overview webpage to the release issue. This makes it much easier to ask for feedback from recipe developers and analyse failures. Results produced with the final ESMValCore release candidate should be put in a VM directory -named after the version number, e.g. ``v2.x.x``. +named after the version number, e.g. ``v2.x.x``. Once the release process is over, test results produced with previous release candidates can be deleted to save space on the VM. .. note:: If you wrote recipe runs output to Levante's `/scratch` partition, be aware that - the data will be removed after two weeks, so you will have to quickly move the + the data will be removed after two weeks, so you will have to quickly move the output data to the VM, using the ``nohup`` command above. Running the comparison @@ -189,15 +189,15 @@ The steps to running the compare tool on the VM are the following: - prerequisite - install `imagehash`: `pip install imagehash` - reference run (v2.7.0; previous stable release): `export reference_dir=/work/bd0854/b382109/v270` (contains `preproc/` dirs too, 122 recipes) - current run (v2.8.0): `export current_dir=path_to_current_run` -- run the :ref:`comparison script` with: +- run the :ref:`comparison script` with: .. code-block:: bash nohup python ESMValTool/esmvaltool/utils/testing/regression/compare.py --reference $reference_dir --current $current_dir > compare_v280_output.txt Copy the comparison txt file to the release issue. -Some of the recipes will appear as having identical output to the one from previous release. -However, others will need human inspection. +Some of the recipes will appear as having identical output to the one from previous release. +However, others will need human inspection. Ask the recipe maintainers (`@ESMValGroup/esmvaltool-recipe-maintainers`_) and ESMValTool Development Team (`@ESMValGroup/esmvaltool-developmentteam`_) to provide assistance in checking the results. Here are some guidelines on how to perform the human inspection: diff --git a/doc/sphinx/source/community/release_strategy/release_strategy.rst b/doc/sphinx/source/community/release_strategy/release_strategy.rst index 9bd8d71e2d..b358fdb7f3 100644 --- a/doc/sphinx/source/community/release_strategy/release_strategy.rst +++ b/doc/sphinx/source/community/release_strategy/release_strategy.rst @@ -54,34 +54,40 @@ With the following release schedule, we strive to have three releases per year a Upcoming releases ^^^^^^^^^^^^^^^^^ -- 2.10.0 (Release Manager: `Klaus Zimmermann`_) +- 2.11.0 (Release Manager: TBD) -+------------+--------------------------+ -| 2023-10-02 |ESMValCore feature freeze | -+------------+--------------------------+ -| 2023-10-09 |ESMValCore release | -+------------+--------------------------+ -| 2023-10-16 |ESMValTool feature freeze | -+------------+--------------------------+ -| 2023-10-23 |ESMValTool release | -+------------+--------------------------+ +Planned for February or March 2024 Past releases ^^^^^^^^^^^^^ +- 2.10.0 (Release Manager: `Klaus Zimmermann`_) + ++------------+------------+----------------------------------------+-------------------------------------+ +| Planned | Done | Event | Changelog | ++============+============+========================================+=====================================+ +| 2023-10-02 | | ESMValCore `Feature Freeze`_ | | ++------------+------------+----------------------------------------+-------------------------------------+ +| 2023-10-09 | 2023-12-19 | :esmvalcore-release:`v2.10.0` released | :ref:`esmvalcore:changelog-v2-10-0` | ++------------+------------+----------------------------------------+-------------------------------------+ +| 2023-10-16 | | ESMValTool `Feature Freeze`_ | | ++------------+------------+----------------------------------------+-------------------------------------+ +| 2023-10-16 | 2023-12-20 | :release:`v2.10.0` released | :ref:`changelog-v2-10-0` | ++------------+------------+----------------------------------------+-------------------------------------+ + - 2.9.0 (Release Manager: `Bouwe Andela`_) -+------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ -| Planned | Done | Event | Changelog | -+============+============+=============================================================================================+====================================+ -| 2023-06-05 | | ESMValCore Feature Freeze | | -+------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ -| 2023-06-12 | 2023-07-04 | `ESMValCore Release 2.9.0 `_ | :ref:`esmvalcore:changelog-v2-9-0` | -+------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ -| 2023-06-19 | | ESMValTool Feature Freeze | | -+------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ -| 2023-06-26 | 2023-07-06 | `ESMValTool Release 2.9.0 `_ | :ref:`changelog-v2-9-0` | -+------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ ++------------+------------+---------------------------------------+-------------------------------------+ +| Planned | Done | Event | Changelog | ++============+============+=======================================+=====================================+ +| 2023-06-05 | | ESMValCore `Feature Freeze`_ | | ++------------+------------+---------------------------------------+-------------------------------------+ +| 2023-06-12 | 2023-07-04 | :esmvalcore-release:`v2.9.0` released | :ref:`esmvalcore:changelog-v2-9-0` | ++------------+------------+---------------------------------------+-------------------------------------+ +| 2023-06-19 | | ESMValTool `Feature Freeze`_ | | ++------------+------------+---------------------------------------+-------------------------------------+ +| 2023-06-26 | 2023-07-06 | :release:`v2.9.0` released | :ref:`changelog-v2-9-0` | ++------------+------------+---------------------------------------+-------------------------------------+ - 2.8.1 (Bugfix, Release Manager: `Valeriu Predoi`_) @@ -287,6 +293,8 @@ These are the detailed steps to take to make a release. - If a bug is discovered that needs to be fixed before the release, a pull request can be made to the main branch to fix the bug. The person making the pull request can then ask the release manager to cherry-pick that commit into the release branch. - Update the :ref:`list of broken recipes ` with new recipes that could not be run successfully during the testing. Open a separate GitHub issue for each failing recipe and assign the next milestone. + Open an overview issue, see :issue:`3484` for an example, and review past overview issues. + Take action to ensure that the broken recipe policy is followed. #. ESMValCore release @@ -339,7 +347,7 @@ Glossary Feature freeze ~~~~~~~~~~~~~~ -The date on which no new features may be submitted for the upcoming release. +The date on which no new features may be submitted for the upcoming release. After this date, only critical bug fixes can still be included to the :ref:`release_branch`. Development work can continue in the main branch. If you are unsure whether new developments could interfere with the release, check with the :ref:`release_manager`. @@ -411,7 +419,7 @@ All tests should pass before making a release (branch). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The version number is automatically generated from the information provided by -git using [setuptools-scm](https://pypi.org/project/setuptools-scm/), but a +git using `setuptools-scm `__, but a static version number is stored in ``CITATION.cff``. Make sure to update the version number and release date in ``CITATION.cff``. See https://semver.org for more information on choosing a version number. @@ -464,8 +472,8 @@ and create the new release from the release branch (i.e. not from ``main``). The release tag always starts with the letter ``v`` followed by the version number, e.g. ``v2.1.0``. -6. Mark the release in the main branch -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +6. Merge the release branch back into the main branch +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When the (pre-)release is tagged, it is time to merge the release branch back into `main`. We do this for two reasons, namely, one, to mark the point up to which commits in `main` diff --git a/doc/sphinx/source/conf.py b/doc/sphinx/source/conf.py index 5ef08c3b06..600eaa8253 100644 --- a/doc/sphinx/source/conf.py +++ b/doc/sphinx/source/conf.py @@ -63,6 +63,7 @@ extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.doctest', + 'sphinx.ext.extlinks', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', @@ -441,6 +442,40 @@ 'sklearn': ('https://scikit-learn.org/stable', None), } +# -- Extlinks extension ------------------------------------------------------- +# See https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html + +extlinks = { + "discussion": ( + "https://github.com/ESMValGroup/ESMValTool/discussions/%s", + "Discussion #%s", + ), + "issue": ( + "https://github.com/ESMValGroup/ESMValTool/issues/%s", + "Issue #%s", + ), + "pull": ( + "https://github.com/ESMValGroup/ESMValTool/pull/%s", + "Pull request #%s", + ), + "release": ( + "https://github.com/ESMValGroup/ESMValTool/releases/tag/%s", + "ESMValTool %s", + ), + "esmvalcore-release": ( + "https://github.com/ESMValGroup/ESMValCore/releases/tag/%s", + "ESMValCore %s", + ), + "team": ( + "https://github.com/orgs/ESMValGroup/teams/%s", + "@ESMValGroup/%s", + ), + "user": ( + "https://github.com/%s", + "@%s", + ), +} + # -- Custom Document processing ---------------------------------------------- import gensidebar diff --git a/doc/sphinx/source/faq.rst b/doc/sphinx/source/faq.rst index 15d69192ca..10c72bd2cb 100644 --- a/doc/sphinx/source/faq.rst +++ b/doc/sphinx/source/faq.rst @@ -113,9 +113,15 @@ a symbolic link to it so it gets picked up at every re-run iteration: Can ESMValTool plot arbitrary model output? =========================================== -Recipe :ref:`recipe_monitor` allows for the plotting of any preprocessed model. -The plotting parameters are set through a yaml configuration file, and the -type of plots to be generated are determined in the recipe. +:ref:`recipe_model_evaluation` provides a set of recipes that can be used for a +basic climate model evaluation with observational data. +This is especially useful to get an overview of the general performance of a +simulation. + +Furthermore, recipe :ref:`recipe_monitor` allows for the plotting of any +preprocessed model. +The plotting parameters are set through a yaml configuration file, and the type +of plots to be generated are determined in the recipe. Moreover, recipe :ref:`recipes_psyplot_diag` and the corresponding diagnostic :ref:`psyplot_diag.py ` provide a diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index ed47c96857..af431c5215 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -112,6 +112,13 @@ ESMValTool currently supports two ways to perform this reformatting (aka checks and fixes'). Details on this second method are given at the :ref:`end of this chapter `. +A collection of readily CMORized OBS and OBS6 datasets can be accessed directly on CEDA/JASMIN and DKRZ. At CEDA/JASMIN +OBS and OBS6 data is stored in the `esmeval` Group Workspace (GWS), and to be granted read (and execute) permissions to the +GWS, one must apply at https://accounts.jasmin.ac.uk/services/group_workspaces/esmeval/ ; after permission has been granted, the user +is encouraged to use the data locally, and not move it elsewhere, to minimize both data transfers and +stale disk usage; to note that Tier 3 data is subject to data protection restrictions; for further inquiries, +the GWS is adminstered by [Valeriu Predoi](mailto:valeriu.predoi@ncas.ac.uk). + Using a CMORizer script ----------------------- @@ -252,9 +259,9 @@ A list of the datasets for which a CMORizers is available is provided in the fol | CERES-SYN1deg | rlds, rldscs, rlus, rluscs, rlut, rlutcs, rsds, rsdscs, rsus, rsuscs, rsut, rsutcs (3hr) | 3 | NCL | | | rlds, rldscs, rlus, rlut, rlutcs, rsds, rsdt, rsus, rsut, rsutcs (Amon) | | | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| CLARA-AVHRR | clt, clivi, lwp (Amon) | 3 | NCL | +| CLARA-AVHRR | clt, clivi, clwvi, lwp (Amon) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| CLOUDSAT-L2 | clw, clivi, lwp (Amon) | 3 | NCL | +| CLOUDSAT-L2 | clw, clivi, clwvi, lwp (Amon) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | CowtanWay | tasa (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ @@ -281,7 +288,7 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ESACCI-AEROSOL | abs550aer, od550aer, od550aerStderr, od550lt1aer, od870aer, od870aerStderr (aero) | 2 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| ESACCI-CLOUD | clivi, clt, cltStderr, lwp, rlut, rlutcs, rsut, rsutcs, rsdt, rlus, rsus, rsuscs (Amon) | 2 | NCL | +| ESACCI-CLOUD | clivi, clt, cltStderr, clwvi, lwp, rlut, rlutcs, rsut, rsutcs, rsdt, rlus, rsus, rsuscs (Amon) | 2 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ESACCI-FIRE | burntArea (Lmon) | 2 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ @@ -393,7 +400,7 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | NOAAGlobalTemp | tasa (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| NSIDC-0116-[nh|sh] | usi, vsi (day) | 3 | Python | +| NSIDC-0116-[nh|sh] [#note4]_ | usi, vsi (day) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | OceanSODA-ETHZ | areacello (Ofx), co3os, dissicos, fgco2, phos, spco2, talkos (Omon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ @@ -433,6 +440,10 @@ A list of the datasets for which a CMORizers is available is provided in the fol can be found in the corresponding section of `recipe_check_obs.yml `__. +.. [#note4] The cmoriser requires PROJ>=9.3. Previous version of PROJ will return an error: + ``Internal Proj Error: proj_create: unhandled axis direction: UNKNOWN)`` + You can check the version of PROJ in your conda environment by running: + ``conda list PROJ``. .. _inputdata_native_datasets: diff --git a/doc/sphinx/source/recipes/broken_recipe_list.rst b/doc/sphinx/source/recipes/broken_recipe_list.rst index 18471b2382..e2c5b874d8 100644 --- a/doc/sphinx/source/recipes/broken_recipe_list.rst +++ b/doc/sphinx/source/recipes/broken_recipe_list.rst @@ -20,7 +20,15 @@ More details can be found in the :ref:`broken recipe policy - `ERA5_native6` - Derivation of custom variables `rlus` and `rsus` - `#1388 `_ + * - :ref:`recipe_julia.yml ` + - `example` + - fill values are not interpreted, resulting in an unusable plot + - `#2595 `_ * - :ref:`recipe_seaice_drift.yml ` - `sea_ice_drift_SCICEX` - - ``shapely`` issue + - ``shapely 2`` issue - `#3243 `_ + * - :ref:`recipe_pysplot.yml ` + - `plot_map` + - ``shapely 2`` issue + - `#3483 `_ diff --git a/doc/sphinx/source/recipes/figures/model_evaluation/annual_cycle_clt_southerocean_Amon.jpg b/doc/sphinx/source/recipes/figures/model_evaluation/annual_cycle_clt_southerocean_Amon.jpg new file mode 100644 index 0000000000..0e1e8a4531 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/model_evaluation/annual_cycle_clt_southerocean_Amon.jpg differ diff --git a/doc/sphinx/source/recipes/figures/model_evaluation/map_swcre_MPI-ESM1-2-HR_Amon.jpg b/doc/sphinx/source/recipes/figures/model_evaluation/map_swcre_MPI-ESM1-2-HR_Amon.jpg new file mode 100644 index 0000000000..f6abf01516 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/model_evaluation/map_swcre_MPI-ESM1-2-HR_Amon.jpg differ diff --git a/doc/sphinx/source/recipes/figures/model_evaluation/map_tas_MPI-ESM1-2-HR_Amon.jpg b/doc/sphinx/source/recipes/figures/model_evaluation/map_tas_MPI-ESM1-2-HR_Amon.jpg new file mode 100644 index 0000000000..50b5ebbd20 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/model_evaluation/map_tas_MPI-ESM1-2-HR_Amon.jpg differ diff --git a/doc/sphinx/source/recipes/figures/model_evaluation/timeseries_rtnt_ambiguous_dataset_Amon.jpg b/doc/sphinx/source/recipes/figures/model_evaluation/timeseries_rtnt_ambiguous_dataset_Amon.jpg new file mode 100644 index 0000000000..2b65fe97e7 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/model_evaluation/timeseries_rtnt_ambiguous_dataset_Amon.jpg differ diff --git a/doc/sphinx/source/recipes/figures/model_evaluation/variable_vs_lat_pr_Amon.jpg b/doc/sphinx/source/recipes/figures/model_evaluation/variable_vs_lat_pr_Amon.jpg new file mode 100644 index 0000000000..4e252d7904 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/model_evaluation/variable_vs_lat_pr_Amon.jpg differ diff --git a/doc/sphinx/source/recipes/index.rst b/doc/sphinx/source/recipes/index.rst index c8e6b4a320..edcc48977a 100644 --- a/doc/sphinx/source/recipes/index.rst +++ b/doc/sphinx/source/recipes/index.rst @@ -21,6 +21,7 @@ large variety of input data. .. toctree:: :maxdepth: 1 + recipe_model_evaluation recipe_monitor recipe_psyplot recipe_seaborn diff --git a/doc/sphinx/source/recipes/recipe_model_evaluation.rst b/doc/sphinx/source/recipes/recipe_model_evaluation.rst new file mode 100644 index 0000000000..9e199815e0 --- /dev/null +++ b/doc/sphinx/source/recipes/recipe_model_evaluation.rst @@ -0,0 +1,98 @@ +.. _recipe_model_evaluation: + +General model evaluation +======================== + +Overview +-------- + +These recipes and diagnostics provide a basic climate model evaluation with +observational data. +This is especially useful to get an overview of the performance of a +simulation. +The diagnostics used here allow plotting arbitrary preprocessor output, i.e., +arbitrary variables from arbitrary datasets. + + +Available recipes and diagnostics +--------------------------------- + +Recipes are stored in `recipes/model_evaluation` + +* recipe_model_evaluation_basics.yml +* recipe_model_evaluation_clouds_clim.yml +* recipe_model_evaluation_clouds_cycles.yml +* recipe_model_evaluation_precip_zonal.yml + +Diagnostics are stored in `diag_scripts/monitor/` + +* :ref:`multi_datasets.py + `: + Monitoring diagnostic to show multiple datasets in one plot (incl. biases). + + +User settings +------------- + +It is recommended to use a vector graphic file type (e.g., SVG) for the output +format when running this recipe, i.e., run the recipe with the command line +option ``--output_file_type=svg`` or use ``output_file_type: svg`` in your +:ref:`esmvalcore:user configuration file`. +Note that map and profile plots are rasterized by default. +Use ``rasterize: false`` in the recipe to disable +this. + + +Recipe settings +~~~~~~~~~~~~~~~ + +A list of all possible configuration options that can be specified in the +recipe is given for each diagnostic individually (see links given for the +available diagnostics in the previous section). + + +Variables +--------- + +Any, but the variables' number of dimensions should match the ones expected by +each diagnostic (see links given for the available diagnostics in the previous +section). + + +Example plots +------------- + +.. _fig_1: +.. figure:: /recipes/figures/model_evaluation/map_tas_MPI-ESM1-2-HR_Amon.jpg + :align: center + :width: 14cm + +Global climatology of 2m near-surface air temperature. + +.. _fig_2: +.. figure:: /recipes/figures/model_evaluation/map_swcre_MPI-ESM1-2-HR_Amon.jpg + :align: center + :width: 14cm + +Global climatology of the shortwave cloud radiative effect (SWCRE). + +.. _fig_3: +.. figure:: /recipes/figures/model_evaluation/timeseries_rtnt_ambiguous_dataset_Amon.jpg + :align: center + :width: 14cm + +Time series of the global mean top-of-the-atmosphere net radiative flux. + +.. _fig_4: +.. figure:: /recipes/figures/model_evaluation/variable_vs_lat_pr_Amon.jpg + :align: center + :width: 14cm + +Zonal mean precipitation. + +.. _fig_5: +.. figure:: /recipes/figures/model_evaluation/annual_cycle_clt_southerocean_Amon.jpg + :align: center + :width: 14cm + +Annual cycle of Southern Ocean total cloud cover. diff --git a/doc/sphinx/source/recipes/recipe_monitor.rst b/doc/sphinx/source/recipes/recipe_monitor.rst index 9bdfd5d40b..ee3b9b44fa 100644 --- a/doc/sphinx/source/recipes/recipe_monitor.rst +++ b/doc/sphinx/source/recipes/recipe_monitor.rst @@ -18,19 +18,18 @@ Available recipes and diagnostics Recipes are stored in `recipes/monitor` - * recipe_monitor.yml - * recipe_monitor_with_refs.yml +* recipe_monitor.yml +* recipe_monitor_with_refs.yml Diagnostics are stored in `diag_scripts/monitor/` - * :ref:`monitor.py `: - Monitoring diagnostic to plot arbitrary preprocessor output. - * :ref:`compute_eofs.py `: - Monitoring diagnostic to plot EOF maps and associated PC timeseries. - * :ref:`multi_datasets.py - `: - Monitoring diagnostic to show multiple datasets in one plot (incl. - biases). +* :ref:`monitor.py `: + Monitoring diagnostic to plot arbitrary preprocessor output. +* :ref:`compute_eofs.py `: + Monitoring diagnostic to plot EOF maps and associated PC timeseries. +* :ref:`multi_datasets.py + `: + Monitoring diagnostic to show multiple datasets in one plot (incl. biases). User settings diff --git a/doc/sphinx/source/utils.rst b/doc/sphinx/source/utils.rst index e5e7b00553..03e2793dca 100644 --- a/doc/sphinx/source/utils.rst +++ b/doc/sphinx/source/utils.rst @@ -118,11 +118,11 @@ Running multiple recipes It is possible to run more than one recipe in one go. This can for example be achieved by using ``rose`` and/or ``cylc``, tools -that may be available at your local HPC cluster. +that may be available at your local HPC cluster. In the case in which neither ``rose`` nor ``cylc`` are available at your HPC cluster, it is possible to automatically generate job submission scripts, as well as a summary of the -job outputs using the scripts available in +job outputs using the scripts available in `esmvaltool/utils/batch-jobs `__. Using cylc @@ -218,7 +218,7 @@ a copy of `u-bd684` is always located in ``/home/users/valeriu/roses/u-bd684`` o Using the scripts in `utils/batch-jobs` --------------------------------------- -In `utils/batch-jobs `_, +In `utils/batch-jobs `_, you can find a script to generate slurm submission scripts for all available recipes in ESMValTool, as well as a script to parse the job outputs. @@ -227,15 +227,15 @@ as well as a script to parse the job outputs. Using `generate.py` ................... -The script `generate.py `_, +The script `generate.py `_, is a simple python script that creates slurm submission scripts, and if configured, submits them to the HPC cluster. It has been tested in `DKRZ's Levante cluster `_. The following parameters have to be set in the script in order to make it run: * ``env``, *str*: Name of the conda environment in which `esmvaltool` is installed. -* ``mail``, *bool*: Whether or not to recieve mail notifications when a submitted job fails or finishes successfully. Default is ``False``. -* ``submit``, *bool*: Wheter or not to automatically submit the job after creating the launch script. Default value is ``False``. +* ``mail``, *bool*: Whether or not to receive mail notifications when a submitted job fails or finishes successfully. Default is ``False``. +* ``submit``, *bool*: Whether or not to automatically submit the job after creating the launch script. Default value is ``False``. * ``account``, *str*: Name of the DKRZ account in which the job will be billed. * ``outputs``, *str*: Name of the directory in which the job outputs (.out and .err files) are going to be saved. The outputs will be saved in `/home/user/`. * ``conda_path``, *str*: Full path to the `mambaforge/etc/profile.d/conda.sh` executable. @@ -247,10 +247,10 @@ Optionally, the following parameters can be edited: * ``memory``, *str*: Amount of memory requested for each run. Default is ``64G`` to allow to run 4 recipes on the same node in parallel. * ``time``, *str*: Time limit. Default is ``04:00:00`` to increase the job priority. Jobs can run for up to 8 hours and 12 hours on the compute and interactive partitions, respectively. * ``default_max_parallel_tasks``, *int*: Default is ``8`` which works for most recipes. For other cases, an entry needs to be made to the ``MAX_PARALLEL_TASKS`` dictionary (see below). - + The script will generate a submission script for all recipes using by default the ``interactive`` queue and with a time limit of 4h. In case a recipe may require of additional resources, they can be defined in the ``SPECIAL_RECIPES`` dictionary. The recipe name has to be given as a ``key`` in which the -values are another dictionary. +values are another dictionary. The latter are used to specify the ``partition`` in which to submit the recipe, the new ``time`` limit and other ``memory`` requirements given by the slurm flags ``--mem``, ``--constraint`` or ``--ntasks``. In general, an entry in ``SPECIAL_RECIPES`` should be set as: @@ -284,17 +284,15 @@ Using `parse_recipes_outputs` You can run this script (simply as a standalone Python script) after all recipes have been run, to gather a bird's eye view of the run status for each recipe; running the script provides you with a Markdown-formatted list of recipes that succeeded, recipes that failed due to a diagnostic error, and recipes that failed due to missing data (the two most common causes for -recipe run failure). You should add a ``SLURM_OUT_DIR`` e.g. ``SLURM_OUT_DIR = "/home/b/b382109/output_v270"`` - this is the -physical location of your SLURM output, after all recipes have finished running and a ``GLOB_PATTERN``, a glob pattern, -which is reccommended to be set to the ``*.out`` extension, so that the script finds all the ``.out`` files. - -To keep the script execution fast, it is recommended to use ``log_level: info`` in your config-user.yml file so that SLURM -output files are rather small. This script also requires a list of recipes stored in a ``all_recipes.txt`` file, which can -be obtained by running: +recipe run failure). You should provide the location of the output log files from SLURM (``*.out`` and ``*.err``) to the +script as well as a list of all available recipes. To generate the list, run the command: .. code-block:: bash - for recipe in $(esmvaltool recipes list | grep '\.yml$'); do echo "$recipe"; done > all_recipes.txt + for recipe in $(esmvaltool recipes list | grep '\.yml$'); do echo $(basename "$recipe"); done > all_recipes.txt + +To keep the script execution fast, it is recommended to use ``log_level: info`` in your config-user.yml file so that SLURM +output files are rather small. .. _overview_page: @@ -323,7 +321,7 @@ Comparing recipe runs A command-line tool is available for comparing one or more recipe runs to known good previous run(s). This tool uses `xarray `_ to compare NetCDF -files and difference hasing provided by +files and difference hashing provided by `imagehash `_ to compare PNG images. All other file types are compared byte for byte. diff --git a/environment.yml b/environment.yml index fb2e5adb14..660cd7f11e 100644 --- a/environment.yml +++ b/environment.yml @@ -4,13 +4,11 @@ channels: # The release candidate channel should only be activated # during the rc phase right before the next release of the # ESMValCore. - - conda-forge/label/esmvalcore_rc + # - conda-forge/label/esmvalcore_rc - conda-forge - nodefaults dependencies: - - pip !=21.3 - - python >=3.9 - aiohttp - cartopy - cdo >=1.9.7 @@ -24,11 +22,11 @@ dependencies: - ecmwf-api-client - eofs - esmpy - - esmvalcore =2.10.0rc1 + - esmvalcore 2.10.* - fiona - fire - gdal - - iris >=3.6.0 + - iris >=3.6.1 - iris-esmf-regrid >=0.7.0 - jinja2 - joblib @@ -40,9 +38,10 @@ dependencies: - netCDF4 - numba - numpy !=1.24.3 # severe masking bug - - packaging - openpyxl + - packaging - pandas + - pip !=21.3 - progressbar2 - prov - psyplot @@ -50,6 +49,7 @@ dependencies: - psy-reg - psy-simple - pyproj >=2.1 + - python >=3.9 - python-cdo - python-dateutil - pyyaml @@ -61,7 +61,7 @@ dependencies: - scipy - seaborn - seawater - - shapely + - shapely >=2 - xarray >=0.12.0 - xesmf >=0.7.1 - xgboost >1.6.1 # github.com/ESMValGroup/ESMValTool/issues/2779 diff --git a/environment_osx.yml b/environment_osx.yml index 0734dee2c6..0d1f034e61 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -4,13 +4,11 @@ channels: # The release candidate channel should only be activated # during the rc phase right before the next release of the # ESMValCore. - - conda-forge/label/esmvalcore_rc + # - conda-forge/label/esmvalcore_rc - conda-forge - nodefaults dependencies: - - pip !=21.3 - - python >=3.9 - aiohttp - cartopy - cdo >=1.9.7 @@ -24,11 +22,11 @@ dependencies: - ecmwf-api-client - eofs - esmpy - - esmvalcore =2.10.0rc1 + - esmvalcore 2.10.* - fiona - fire - gdal - - iris >=3.6.0 + - iris >=3.6.1 - iris-esmf-regrid >=0.7.0 - jinja2 - joblib @@ -38,10 +36,12 @@ dependencies: - natsort - nc-time-axis - netCDF4 + - numba - numpy !=1.24.3 # severe masking bug - - packaging - openpyxl + - packaging - pandas + - pip !=21.3 - progressbar2 - prov - psyplot @@ -49,6 +49,7 @@ dependencies: - psy-reg - psy-simple - pyproj>=2.1 + - python >=3.9 - python-cdo - python-dateutil - pyyaml @@ -60,7 +61,7 @@ dependencies: - scipy - seaborn - seawater - - shapely + - shapely >=2 - xarray >=0.12.0 - xesmf >=0.7.1 - xgboost >1.6.1 # github.com/ESMValGroup/ESMValTool/issues/2779 diff --git a/esmvaltool/cmorizers/data/formatters/datasets/clara_avhrr.ncl b/esmvaltool/cmorizers/data/formatters/datasets/clara_avhrr.ncl index 05912b7b0e..b275332d48 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/clara_avhrr.ncl +++ b/esmvaltool/cmorizers/data/formatters/datasets/clara_avhrr.ncl @@ -34,6 +34,7 @@ ; 7) Untar all .tar files into a single directory. ; ; Modification history +; 20230818-lauer_axel: added output of clwvi (in addition to iwp, lwp) ; 20210506-lauer_axel: output of lwp instead of clwvi ; 20210323-lauer_axel: written. ; @@ -57,30 +58,31 @@ begin YEAR2 = 2018 ; Selected variable (standard name) - VAR = (/"clt", "clivi", "lwp"/) + VAR = (/"clt", "clivi", "lwp", "clwvi"/) ; Name in the raw data - NAME = (/"cfc", "iwp_allsky", "lwp_allsky"/) + NAME = (/"cfc", "iwp_allsky", "lwp_allsky", "iwp_allsky"/) ; Filename base - FNBASE = (/"CFCmm", "IWPmm", "LWPmm"/) + FNBASE = (/"CFCmm", "IWPmm", "LWPmm", "IWPmm"/) ; Conversion factor ; Remark: total cloud cover (CFC) is reported as "1" but is actually "%" ; IWP and LWP use scale_factor to convert to kg/m2 - ; CONV = (/1., 1., 1./) + ; CONV = (/1., 1., 1., 1./) ; MIP - MIP = (/"Amon", "Amon", "Amon"/) + MIP = (/"Amon", "Amon", "Amon", "Amon"/) ; Frequency - FREQ = (/"mon", "mon", "mon"/) + FREQ = (/"mon", "mon", "mon", "mon"/) ; CMOR table CMOR_TABLE = getenv("cmor_tables") + \ (/"/cmip5/Tables/CMIP5_Amon", \ "/cmip5/Tables/CMIP5_Amon", \ - "/custom/CMOR_lwp.dat"/) + "/custom/CMOR_lwp.dat", \ + "/cmip5/Tables/CMIP5_Amon"/) ; Type TYPE = "sat" @@ -159,17 +161,56 @@ begin output&lat = f->lat output!2 = "lon" output&lon = f->lon + fillval = xx@_FillValue end if output(ind(toint(yy * 100 + mm).eq.date), :, :) = (/xx/) delete(fname) delete(f) - + delete(xx) + + ; *** calculate clwvi (lwp + iwp) *** + + if (VAR(vv) .eq. "clwvi") then + fname = systemfunc("ls " + input_dir_path + "LWPmm" + \ + syear + smonth + "01*.nc") + + ; No files found + if (ismissing(fname)) then + log_info("Warning: input data incomplete for variable " + \ + VAR(vv) + " (" + syear + smonth + ")") + continue + end if + + ; Extract data + f = addfile(fname, "r") + val = f->lwp_allsky + if (isatt(val, "scale_factor")) then + scalefac = tofloat(val@scale_factor) + else + scalefac = 1.0 + end if + if (isatt(val, "add_offset")) then + offset = tofloat(val@add_offset) + else + offset = 0.0 + end if + xx = tofloat(val) * scalefac + offset + delete(val) + + idx = ind(toint(yy * 100 + mm).eq.date) + output(idx, :, :) = output(idx, :, :) + (/xx(0, :, :)/) + + delete(idx) + delete(xx) + delete(fname) + delete(f) + end if ; if VAR(vv) .eq. "clwvi" end do end do ; Set fill value - output = where(output.eq.xx@_FillValue, output@_FillValue, output) + output = where(output.eq.fillval, output@_FillValue, output) ; Format coordinates output!0 = "time" diff --git a/esmvaltool/cmorizers/data/formatters/datasets/cloudsat_l2.ncl b/esmvaltool/cmorizers/data/formatters/datasets/cloudsat_l2.ncl index f056ac4de6..d26ed74cd6 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/cloudsat_l2.ncl +++ b/esmvaltool/cmorizers/data/formatters/datasets/cloudsat_l2.ncl @@ -58,6 +58,7 @@ ; --end=2015 CLOUDSAT-L2 ; ; Modification history +; 20230904-lauer_axel: added output of clwvi (iwp + lwp) ; 20220809-lauer_axel: adapted CMORizer to new format introduced in ; ESMValTool v2.5.0 and added info message ; 20210924-lauer_axel: added processing of lwp and iwp @@ -100,12 +101,13 @@ begin end if ; output variable (standard name) - outvar = (/"clw", "lwp", "clivi"/) + outvar = (/"clw", "lwp", "clivi", "clwvi"/) ; input variables var = (/"LO_RO_liquid_water_content_2B_CWC_RO", \ "LO_RO_liquid_water_path_2B_CWC_RO", \ - "IO_RO_ice_water_path_2B_CWC_RO"/) + "IO_RO_ice_water_path_2B_CWC_RO", \ + "dummy"/) var_flag = "Precip_flag_2C_PRECIP_COLUMN" @@ -120,6 +122,7 @@ begin CMOR_TABLE = getenv("cmor_tables") + \ (/"/cmip5/Tables/CMIP5_" + mip, \ "/custom/CMOR_lwp.dat", \ + "/cmip5/Tables/CMIP5_" + mip, \ "/cmip5/Tables/CMIP5_" + mip/) ; Type @@ -168,26 +171,26 @@ begin grid = new((/nt, nz, ny, nx/), float) gridpts = new((/nt, nz, ny, nx/), integer) - grid2d = new((/nt, 2, ny, nx/), float) - gridpts2d = new((/nt, 2, ny, nx/), integer) + grid2d = new((/nt, 3, ny, nx/), float) + gridpts2d = new((/nt, 3, ny, nx/), integer) ; "grid-box average" (all points) grid_avg = new((/nt, nz, ny, nx/), float) gridpts_avg = new((/nt, nz, ny, nx/), integer) - grid2d_avg = new((/nt, 2, ny, nx/), float) - gridpts2d_avg = new((/nt, 2, ny, nx/), integer) + grid2d_avg = new((/nt, 3, ny, nx/), float) + gridpts2d_avg = new((/nt, 3, ny, nx/), integer) ; "in-cloud" (no precipitation) grid_noprecip = new((/nt, nz, ny, nx/), float) gridpts_noprecip = new((/nt, nz, ny, nx/), integer) - grid2d_noprecip = new((/nt, 2, ny, nx/), float) - gridpts2d_noprecip = new((/nt, 2, ny, nx/), integer) + grid2d_noprecip = new((/nt, 3, ny, nx/), float) + gridpts2d_noprecip = new((/nt, 3, ny, nx/), integer) ; "grid-box average" (no precipitation) grid_avg_noprecip = new((/nt, nz, ny, nx/), float) gridpts_avg_noprecip = new((/nt, nz, ny, nx/), integer) - grid2d_avg_noprecip = new((/nt, 2, ny, nx/), float) - gridpts2d_avg_noprecip = new((/nt, 2, ny, nx/), integer) + grid2d_avg_noprecip = new((/nt, 3, ny, nx/), float) + gridpts2d_avg_noprecip = new((/nt, 3, ny, nx/), integer) ; boundaries of vertical (height) bins @@ -491,23 +494,29 @@ begin delete(lon_ext) delete(hgt1d) - ; =================================== - ; 2-dim cloud liquid / ice water path - ; =================================== + ; ============================================================ + ; 2-dim cloud liquid / ice water path / total cloud water path + ; ============================================================ - do ivar = 1, 2 + do ivar = 1, 3 if (outvar(ivar) .eq. "lwp") then x = l1d ilev = 0 else if (outvar(ivar) .eq. "clivi") then x = i1d ilev = 1 + else if (outvar(ivar) .eq. "clwvi") then + ; clwvi is calculated from the *output* fields of lwp and iwp + ; to make sure it is the sum of the two (masking, etc.) + ; --> nothing to do here + continue else log_info("Warning: output variable unknown: " + outvar(ivar) + \ ", skipping variable " + outvar(ivar) + ".") continue end if end if + end if ; Find all elements that contain valid (x > 0) or missing (x = 0) ; values; invalid values (x < 0) are filtered out. @@ -746,11 +755,23 @@ begin ; save results to files - do ivar = 1, 2 + do ivar = 1, 3 if (outvar(ivar) .eq. "lwp") then ilev = 0 else if (outvar(ivar) .eq. "clivi") then ilev = 1 + else if (outvar(ivar) .eq. "clwvi") then + ; calculate clwvi (lwp+iwp) as sum of output fields for lwp and iwp + ilev = 2 + grid2d(:, ilev, :, :) = grid2d(:, 0, :, :) \ + + grid2d(:, 1, :, :) + grid2d_avg(:, ilev, :, :) = grid2d_avg(:, 0, :, :) \ + + grid2d_avg(:, 1, :, :) + grid2d_noprecip(:, ilev, :, :) = grid2d_noprecip(:, 0, :, :) \ + + grid2d_noprecip(:, 1, :, :) + grid2d_avg_noprecip(:, ilev, :, :) = grid2d_avg_noprecip(:, 0, :, :) \ + + grid2d_avg_noprecip(:, 1, :, :) + end if end if end if @@ -842,7 +863,7 @@ begin write_nc(fout, outvar(ivar), output, bounds, gAtt) delete(output) delete(gAtt) - end do ; loop over implemented 2-dim variables (lwp, iwp) + end do ; loop over implemented 2-dim variables (lwp, iwp, lwp+iwp) end do ; loop over years end diff --git a/esmvaltool/cmorizers/data/formatters/datasets/esacci_cloud.ncl b/esmvaltool/cmorizers/data/formatters/datasets/esacci_cloud.ncl index 10cf50a2a7..b19ae0b865 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/esacci_cloud.ncl +++ b/esmvaltool/cmorizers/data/formatters/datasets/esacci_cloud.ncl @@ -22,11 +22,12 @@ ; --reject="index.html*" ; https://public.satproj.klima.dwd.de/data/ESA_Cloud_CCI/ ; CLD_PRODUCTS/v3.0/L3C/AVHRR-PM/ - +; ; All files are expected in a single directory (no subdirectories ; with years). ; ; Modification history +; 20230818-lauer_axel: added output of clwvi (in addition to iwp, lwp) ; 20210428-lauer_axel: AVHRR-AM and AVHRR-PM data are now averaged during ; the overlapping time; TOA radiative fluxes are now ; also processed @@ -56,24 +57,25 @@ begin YEAR2 = get_year(end_year, 2016) ; Selected variable (standard name) - VAR = (/"clt", "cltStderr", "clivi", "lwp", "rlut", "rlutcs", \ + VAR = (/"clt", "cltStderr", "clivi", "lwp", "clwvi", "rlut", "rlutcs", \ "rsut", "rsutcs", "rsdt", "rlus", "rsus", "rsuscs"/) ; Name in the raw data - NAME = (/"cfc", "cfc_unc", "iwp_allsky", "lwp_allsky", "toa_lwup", \ - "toa_lwup_clr", "toa_swup", "toa_swup_clr", "toa_swdn", \ - "boa_lwup", "boa_swup", "boa_swup_clr"/) + NAME = (/"cfc", "cfc_unc", "iwp_allsky", "lwp_allsky", "iwp_allsky", \ + "toa_lwup", "toa_lwup_clr", "toa_swup", "toa_swup_clr", \ + "toa_swdn", "boa_lwup", "boa_swup", "boa_swup_clr"/) ; Conversion factor - CONV = (/100., 1., 0.001, 0.001, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0/) + CONV = (/100., 1., 0.001, 0.001, 0.001, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, \ + 1.0, 1.0/) ; MIP MIP = (/"Amon", "Amon", "Amon", "Amon", "Amon", "Amon", "Amon", "Amon", \ - "Amon", "Amon", "Amon", "Amon"/) + "Amon", "Amon", "Amon", "Amon", "Amon"/) ; Frequency FREQ = (/"mon", "mon", "mon", "mon", "mon", "mon", "mon", "mon", "mon", \ - "mon", "mon", "mon"/) + "mon", "mon", "mon", "mon"/) ; CMOR table CMOR_TABLE = getenv("cmor_tables") + \ @@ -88,6 +90,7 @@ begin "/cmip5/Tables/CMIP5_Amon", \ "/cmip5/Tables/CMIP5_Amon", \ "/cmip5/Tables/CMIP5_Amon", \ + "/cmip5/Tables/CMIP5_Amon", \ "/cmip5/Tables/CMIP5_Amon"/) ; Type @@ -151,6 +154,13 @@ begin ; Convert units xx_all(i, :, :, :) = xx * CONV(vv) + ; *** calculate clwvi (lwp + iwp) *** + if (VAR(vv) .eq. "clwvi") then + xx2 = f->lwp_allsky * 0.001 + xx_all(i, :, :, :) = xx_all(i, :, :, :) + xx2 + delete(xx2) + end if + if (firstime) then lat = f->lat lon = f->lon @@ -161,6 +171,7 @@ begin delete(fname) delete(xx) + xx = dim_avg_n(xx_all, 0) ; ignore missing values delete(xx_all) diff --git a/esmvaltool/config-references.yml b/esmvaltool/config-references.yml index 16725c3764..285ace740e 100644 --- a/esmvaltool/config-references.yml +++ b/esmvaltool/config-references.yml @@ -361,7 +361,7 @@ authors: malinina_elizaveta: name: Malinina, Elizaveta institute: CCCma, Canada - orchid: https://orcid.org/0000-0002-4102-2877 + orcid: https://orcid.org/0000-0002-4102-2877 github: malininae maloney_eric: name: Maloney, Eric diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_zonal_cont_diff_mmm_stippandhatch.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_zonal_cont_diff_mmm_stippandhatch.ncl index 1952cff668..dbe89529b6 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_zonal_cont_diff_mmm_stippandhatch.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_calc_zonal_cont_diff_mmm_stippandhatch.ncl @@ -78,13 +78,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl index 720840ff12..77f6441f59 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_map_diff_mmm_stipp.ncl @@ -51,13 +51,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl index 838888ae74..20a5e277ea 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_ts_line_mean_spread.ncl @@ -48,13 +48,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -251,11 +244,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -279,7 +271,7 @@ begin authors = (/"lorenz_ruth"/) references = (/"collins13ipcc"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl index e58ae142c7..261082f79f 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_plot_zonal_diff_mmm_stipp.ncl @@ -48,12 +48,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_snw_area_change_fig12-32.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_snw_area_change_fig12-32.ncl index 51c0dcc787..4834f5ccf0 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_snw_area_change_fig12-32.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_snw_area_change_fig12-32.ncl @@ -66,13 +66,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch12_ts_line_mean_spread.ncl b/esmvaltool/diag_scripts/ipcc_ar5/ch12_ts_line_mean_spread.ncl index c47902d8bb..e488d3a07f 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch12_ts_line_mean_spread.ncl +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch12_ts_line_mean_spread.ncl @@ -47,13 +47,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/mlr/custom_sklearn.py b/esmvaltool/diag_scripts/mlr/custom_sklearn.py index 198cbdc376..f1b99f4c5c 100644 --- a/esmvaltool/diag_scripts/mlr/custom_sklearn.py +++ b/esmvaltool/diag_scripts/mlr/custom_sklearn.py @@ -670,9 +670,18 @@ def fit_target_transformer_only(self, y_data, **fit_kwargs): def fit_transformers_only(self, x_data, y_data, **fit_kwargs): """Fit only ``transform`` steps of Pipeline.""" - fit_params = _get_fit_parameters(fit_kwargs, self.steps, - self.__class__) - return self._fit(x_data, y_data, **fit_params) + # Temporarily set the final estimator to 'passthrough' to avoid fitting + # it + final_step = self.steps[-1] + self.steps[-1] = (final_step[0], 'passthrough') + + # This will now fit all transformers, but not the final estimator + self.fit(x_data, y_data, **fit_kwargs) + + # Re-assign the original (non-fitted) final estimator + self.steps[-1] = final_step + + return self def transform_only(self, x_data): """Only perform ``transform`` steps of Pipeline.""" diff --git a/esmvaltool/diag_scripts/monitor/monitor_base.py b/esmvaltool/diag_scripts/monitor/monitor_base.py index 135027f374..21dc159619 100644 --- a/esmvaltool/diag_scripts/monitor/monitor_base.py +++ b/esmvaltool/diag_scripts/monitor/monitor_base.py @@ -97,7 +97,9 @@ def __init__(self, config): ) plot_folder = plot_folder.replace('{plot_dir}', self.cfg[names.PLOT_DIR]) - self.plot_folder = os.path.abspath(plot_folder) + self.plot_folder = os.path.abspath( + os.path.expandvars(os.path.expanduser(plot_folder)) + ) self.plot_filename = config.get( 'plot_filename', '{plot_type}_{real_name}_{dataset}_{mip}_{exp}_{ensemble}') @@ -293,11 +295,7 @@ def get_plot_folder(self, var_info): 'real_name': self._real_name(var_info['variable_group']), **var_info } - folder = os.path.expandvars( - os.path.expanduser( - list(_replace_tags(self.plot_folder, info))[0] - ) - ) + folder = list(_replace_tags(self.plot_folder, info))[0] if self.plot_folder.startswith('/'): folder = '/' + folder if not os.path.isdir(folder): diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl index 034d3a1287..db6426cc3a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig2.ncl @@ -76,7 +76,7 @@ begin colors = project_style(input_file_info, diag_script_info, "colors") dashes = project_style(input_file_info, diag_script_info, "dashes") thicks = project_style(input_file_info, diag_script_info, "thicks") - plotpath = config_user_info@plot_dir + "/russell18jgr_fig2_" \ + plotpath = config_user_info@plot_dir + "russell18jgr_fig2_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -156,17 +156,6 @@ begin delete(var_lon_avg) delete(dataset) - ; Call provenance logger - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 2", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) - if (iii .ne. 0) then overlay(plot(0), plot(iii)) end if @@ -192,4 +181,17 @@ begin "lgLineDashSegLenF" : 0.11 end create draw(legend) + + frame(wks) + + ; Call provenance logger + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 2", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl index c912663321..add52a2b7a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b-2.ncl @@ -72,7 +72,7 @@ begin thicks = project_style(input_file_info, diag_script_info, "thicks") plotpath = config_user_info@plot_dir \ - + "/russell18jgr_fig3_Polar-Front-position_" \ + + "russell18jgr_fig3_Polar-Front-position_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -273,15 +273,6 @@ begin delete(e) delete(last_index) delete(out_var) - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 3b part 2", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - inputfile_paths(iii)) end do draw(plot(0)) @@ -301,4 +292,16 @@ begin end create draw(legend) + frame(wks) + + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 3b part 2", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + inputfile_paths) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl index fd4cf3f43b..41ee0c3194 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig3b.ncl @@ -69,7 +69,7 @@ begin dashes = project_style(input_file_info, diag_script_info, "dashes") thicks = project_style(input_file_info, diag_script_info, "thicks") - plotpath = config_user_info@plot_dir + "/Russell18jgr_fig3_Subantarctic" \ + plotpath = config_user_info@plot_dir + "Russell18jgr_fig3_Subantarctic" \ + "-Fronts_" + sprinti("%0.4i", min(toint(start_years_data))) \ + "-" + sprinti("%0.4i", max(toint(end_years_data))) @@ -263,15 +263,6 @@ begin delete(e) delete(last_index) delete(out_var) - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 3b", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - inputfile_paths(iii)) end do draw(plot(0)) @@ -291,4 +282,16 @@ begin end create draw(legend) + frame(wks) + + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 3b", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + inputfile_paths) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl index 4e62c7b552..b03b81959f 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig4.ncl @@ -93,7 +93,7 @@ begin (/238, 91, 12/), (/209, 49, 7/), (/178, 0, 0/) /) colors_new = colors_new / 256.0 - plotpath = config_user_info@plot_dir + "/Russell18jgr-fig4_" \ + plotpath = config_user_info@plot_dir + "Russell18jgr-fig4_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -366,16 +366,6 @@ begin delete(var_final) delete(exact_lon) delete(totaltransport) - ; Call provenance logger - log_provenance(ncdf_outfile, \ - plotpath + "." + file_type, \ - "Russell et al 2018 figure 4", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - (/inputfile_paths(iii), volfile_paths(iii)/)) end do @@ -389,4 +379,15 @@ begin + "This is not an error, no response is needed by user for " \ + "plotting. ") end if + + ; Call provenance logger + log_provenance(ncdf_outfile, \ + plotpath + "." + file_type, \ + "Russell et al 2018 figure 4", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + inputfile_paths) end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl index 5a60ea03d9..62a5a6be1a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5.ncl @@ -59,7 +59,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig5_" + var0 + "_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig5_" + var0 + "_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -168,16 +168,6 @@ begin ncdf_outfile = ncdf_write(dataset, nc_filename) delete(dataset) - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 5 -polar", \ - "mean", \ - "sh", \ - "geo", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) - end do ; Draw the panel @@ -185,4 +175,15 @@ begin pres@gsnPanelLabelBar = False outfile = panelling(wks, plots, nvert, nhori, pres) + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 5 -polar", \ + "mean", \ + "sh", \ + "geo", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) + + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl index 67d8c53491..0b48c1e7ed 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig5g.ncl @@ -84,7 +84,7 @@ begin dashes = project_style(input_file_info, diag_script_info, "dashes") thicks = project_style(input_file_info, diag_script_info, "thicks") - plotpath = config_user_info@plot_dir + "/russell18jgr-fig5g_" + var0 + "_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig5g_" + var0 + "_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -224,17 +224,6 @@ begin overlay(plots(0), plots(iii)) end if - ; Call provenance logger - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 5g", \ - "mean", \ - "sh", \ - "times", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) - end do draw(plots(0)) @@ -261,4 +250,17 @@ begin "not an error, no responce is needed by user for plotting ") end if + frame(wks) + + ; Call provenance logger + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 5g", \ + "mean", \ + "sh", \ + "times", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl index 206d2909cc..bd672ed3cf 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl @@ -90,7 +90,7 @@ end begin - plotpath = config_user_info@plot_dir + "/Russell_figure-6a_" \ + plotpath = config_user_info@plot_dir + "Russell_figure-6a_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl index 2287b62adf..6b019625f0 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl @@ -92,7 +92,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig6b_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig6b_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl index 249712d29f..7700790e65 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7h.ncl @@ -64,7 +64,7 @@ begin dashes = project_style(input_file_info, diag_script_info, "dashes") thicks = project_style(input_file_info, diag_script_info, "thicks") - plotpath = config_user_info@plot_dir + "/Russell_figure7h_" + var0 + "_" \ + plotpath = config_user_info@plot_dir + "Russell_figure7h_" + var0 + "_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -163,15 +163,6 @@ begin ncdf_outfile = ncdf_write(var_lon_avg, nc_filename) delete(var_lon_avg) delete(dataset) - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 7h", \ - "mean", \ - "sh", \ - "zonal", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) end do draw(plot(0)) @@ -192,4 +183,16 @@ begin end create draw(legend) + frame(wks) + + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 7h", \ + "mean", \ + "sh", \ + "zonal", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl index 7abcc9e7a9..86ce4bee70 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl @@ -61,7 +61,7 @@ begin var0 = variable_info[0]@short_name - plotpath = config_user_info@plot_dir + "/Russell_figure7i_" + var0 + "_" \ + plotpath = config_user_info@plot_dir + "Russell_figure7i_" + var0 + "_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -201,16 +201,6 @@ begin overlay(plot(0), plot(iii)) end if - log_provenance(ncdf_outfile, \ - plotpath + "." + output_type(), \ - "Russell et al 2018 figure 7i", \ - "mean", \ - "sh", \ - "zonal", \ - "russell_joellen", \ - "russell18jgr", \ - infile_path) - end do draw(plot(0)) @@ -230,4 +220,16 @@ begin end create draw(legend) + frame(wks) + + log_provenance(ncdf_outfile, \ + plotpath + "." + output_type(), \ + "Russell et al 2018 figure 7i", \ + "mean", \ + "sh", \ + "zonal", \ + "russell_joellen", \ + "russell18jgr", \ + infile_path) + end diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl index 8bef8cb204..24ebe3f12e 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9a.ncl @@ -103,7 +103,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig9a_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig9a_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -297,6 +297,8 @@ begin end create draw(legend) + frame(wks) + do idd = 0, dimsizes(lat_width) - 1 nc_filename = config_user_info@work_dir + "russell18jgr_fig9a_" \ + annots(idd) + "_" + (start_years_data(idd)) + "-" \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl index 8afd05425a..112cd846f5 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9b.ncl @@ -94,7 +94,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig9b_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig9b_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -315,6 +315,8 @@ begin end create draw(legend) + frame(wks) + do idd = 0, dimsizes(lat_width) - 1 nc_filename = config_user_info@work_dir + "russell18jgr_fig9b_" \ + annots(idd) + "_" + (start_years_data(idd)) + "-" \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl index 0e5c828a6a..2fe0cc3e4a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl @@ -107,7 +107,7 @@ end begin - plotpath = config_user_info@plot_dir + "/russell18jgr-fig9c_" \ + plotpath = config_user_info@plot_dir + "russell18jgr-fig9c_" \ + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -312,6 +312,8 @@ begin end create draw(legend) + frame(wks) + do idd = 0, dimsizes(lat_width) - 1 nc_filename = config_user_info@work_dir + "russell18jgr_fig9c_" \ + annots(idd) + "_" + (start_years_data(idd)) + "-" \ diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl index b9c8f1faaa..106f161801 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-polar.ncl @@ -77,7 +77,7 @@ end begin - plotpath = config_user_info@plot_dir + "/Russell_polar-contour_" + var0 + \ + plotpath = config_user_info@plot_dir + "Russell_polar-contour_" + var0 + \ "_" + sprinti("%0.4i", min(toint(start_years_data))) + "-" \ + sprinti("%0.4i", max(toint(end_years_data))) @@ -231,6 +231,13 @@ begin ncdf_outfile = ncdf_write(dataset, nc_filename) delete(dataset) + end do + + ; Draw the panel + pres = True + pres@gsnPanelLabelBar = False + outfile = panelling(wks, plots, nvert, nhori, pres) + log_provenance(ncdf_outfile, \ plotpath + "." + output_type(), \ "Russell et al 2018 polar plot " + var0, \ @@ -239,11 +246,5 @@ begin "geo", \ "russell_joellen", \ "russell18jgr", \ - inputfile_paths(iii)) - end do - - ; Draw the panel - pres = True - pres@gsnPanelLabelBar = False - outfile = panelling(wks, plots, nvert, nhori, pres) + inputfile_paths) end diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_table_changes.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_table_changes.ncl index a2fc676d9b..0064e2da01 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_table_changes.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_table_changes.ncl @@ -53,13 +53,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_table_warming_level.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_table_warming_level.ncl index 01fb0b5c41..942a725275 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_table_warming_level.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_table_warming_level.ncl @@ -55,13 +55,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_across_realization_stddev_runave.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_across_realization_stddev_runave.ncl index 4e772935e7..5cf278a046 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_across_realization_stddev_runave.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_across_realization_stddev_runave.ncl @@ -56,13 +56,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_runave.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_runave.ncl index e3c92d5458..ceda4512fb 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_runave.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_runave.ncl @@ -55,13 +55,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp4.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp4.ncl index a64e5204ef..74baee5d88 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp4.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp4.ncl @@ -54,13 +54,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp5.ncl b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp5.ncl index 938158d37d..0ec3479508 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp5.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/calc_timeseries_mean_spread_ssp5.ncl @@ -54,13 +54,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_pattern.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_pattern.ncl index 109975882b..cd5aeb93c6 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_pattern.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_pattern.ncl @@ -58,13 +58,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_table_changes.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_table_changes.ncl index 115d04b130..60b1e731be 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_table_changes.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_table_changes.ncl @@ -57,13 +57,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -159,13 +152,12 @@ begin gsn_table(wks, ncr4, x4, y4, text4, res4) draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; Collect meta-data netcdf_dir = diag_script_info@input_files(1) datapath = netcdf_dir + "/" + variable_info[0]@diagnostic + ".nc" nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type caption = "Table of global annual mean" + \ variable_info[0]@long_name + " anomalies (relative to " + \ diag_script_info@begin_ref_year + "-" + diag_script_info@end_ref_year + \ @@ -177,7 +169,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") end diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_table_warming_level.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_table_warming_level.ncl index 2d7da64ac5..4bd691b6ea 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_table_warming_level.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_table_warming_level.ncl @@ -55,13 +55,6 @@ begin end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -160,13 +153,12 @@ begin gsn_table(wks, ncr4, x4, y4, text4, res4) draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; Collect meta-data netcdf_dir = diag_script_info@input_files(1) datapath = netcdf_dir + "/" + variable_info[0]@diagnostic + ".nc" nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type caption = text4 statistics = ("mean") domains = ("global") @@ -174,7 +166,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_across_realization_stddev_runave.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_across_realization_stddev_runave.ncl index 04f3f90dab..c562115c2c 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_across_realization_stddev_runave.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_across_realization_stddev_runave.ncl @@ -57,13 +57,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -108,9 +101,9 @@ begin ; *********** PLOTTING ************ ; Create plot variables outfile = var0 + "_ts_line_" + syears(0) + "_" + eyears(nperiods - 1) - wks_type = file_type + wks_type = 0 wks_type@wkPaperSize = "A4" - wks = gsn_open_wks(wks_type, plot_dir + outfile) + wks = get_wks(wks_type, DIAG_SCRIPT, outfile) if(isatt(diag_script_info, "colormap")) then colormap = RGBtoCmap(diag_script_info@colormap) else @@ -229,18 +222,17 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type statistics = ("stddev") domains = ("global") plot_types = ("times") authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread.ncl index 8caaf9c62f..780de8a235 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread.ncl @@ -55,13 +55,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -265,11 +258,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -282,7 +274,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_3scenarios.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_3scenarios.ncl index c95da587a4..6311d01782 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_3scenarios.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_3scenarios.ncl @@ -55,13 +55,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -261,11 +254,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -278,7 +270,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_constrained_projections.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_constrained_projections.ncl index 938804358a..0254d53e03 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_constrained_projections.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_constrained_projections.ncl @@ -67,13 +67,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -334,11 +327,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -351,7 +343,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_rightaxis_5scen.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_rightaxis_5scen.ncl index 475f9cbf56..72990171bc 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_rightaxis_5scen.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_rightaxis_5scen.ncl @@ -58,13 +58,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -279,11 +272,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -296,7 +288,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp4.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp4.ncl index 4162ec01c4..be50e29bb2 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp4.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp4.ncl @@ -55,13 +55,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -268,11 +261,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -285,7 +277,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp5.ncl b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp5.ncl index edbf881e49..9570b09ae4 100644 --- a/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp5.ncl +++ b/esmvaltool/diag_scripts/tebaldi21esd/plot_timeseries_mean_spread_ssp5.ncl @@ -55,13 +55,6 @@ end begin - ; Get environment variables - if (isatt(diag_script_info, "plot_type")) then - file_type = diag_script_info@plot_type - else - file_type = "pdf" - end if - ; Output netcdf directory work_dir = config_user_info@work_dir system("mkdir -p " + work_dir) @@ -253,11 +246,10 @@ begin draw(wks) frame(wks) - log_info(" Wrote " + plot_dir + "/" + outfile + "." + file_type) + log_info(" Wrote " + wks@fullname) ; collect meta-data nc_file = datapath - plot_file = plot_dir + "/" + outfile + "." + file_type if (isatt(diag_script_info, "spread")) then spread_str = diag_script_info@spread @@ -270,7 +262,7 @@ begin authors = (/"debeire_kevin"/) references = (/"tebaldi21esd"/) infiles = metadata_att_as_array(info_items, "filename") - log_provenance(nc_file, plot_file, caption, statistics, domains, \ + log_provenance(nc_file, wks@fullname, caption, statistics, domains, \ plot_types, authors, references, infiles) leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/validation.py b/esmvaltool/diag_scripts/validation.py index d72cc5e1ad..52c8d1a561 100644 --- a/esmvaltool/diag_scripts/validation.py +++ b/esmvaltool/diag_scripts/validation.py @@ -29,27 +29,11 @@ def _get_provenance_record(cfg, plot_file, caption, loc): """Create a provenance record describing the diagnostic data and plot.""" - all_input_files = [ - k for k in cfg["input_data"].keys() if k.endswith(".nc") - ] - if "_vs_" in plot_file: - model_1 = plot_file.split("_vs_")[0].split("_")[-1] - if plot_file.endswith(".png"): - model_2 = plot_file.split("_vs_")[1].strip(".png") - elif plot_file.endswith(".nc"): - model_2 = plot_file.split("_vs_")[1].strip(".nc") - ancestor_1 = [ - k for k in all_input_files if model_1 in os.path.basename(k) - ][0] - ancestor_2 = [ - k for k in all_input_files if model_2 in os.path.basename(k) - ][0] - ancestor_files = [ancestor_1, ancestor_2] - else: - model = os.path.basename(plot_file).split("_")[0] - ancestor_files = [ - k for k in all_input_files if model in os.path.basename(k) - ] + ancestor_files = [] + for dataset in cfg['input_data'].values(): + if (dataset['alias'] in plot_file and + dataset['short_name'] in plot_file): + ancestor_files.append(dataset['filename']) record = { 'caption': caption, 'statistics': ['mean'], @@ -72,9 +56,9 @@ def _get_provenance_record(cfg, plot_file, caption, loc): def plot_contour(cube, cfg, plt_title, file_name): """Plot a contour with iris.quickplot (qplot).""" if len(cube.shape) == 2: - qplt.contourf(cube, cmap='RdYlBu_r', bbox_inches='tight') + qplt.contourf(cube, cmap='RdYlBu_r') else: - qplt.contourf(cube[0], cmap='RdYlBu_r', bbox_inches='tight') + qplt.contourf(cube[0], cmap='RdYlBu_r') plt.title(plt_title) plt.gca().coastlines() plt.tight_layout() @@ -138,7 +122,10 @@ def plot_latlon_cubes(cube_1, # plot each cube var = data_names.split('_')[0] if not obs_name: - cube_names = [data_names.split('_')[1], data_names.split('_')[3]] + cube_names = [ + data_names.replace(f'{var}_', '').split('_vs_')[i] for i in + range(2) + ] for cube, cube_name in zip(cubes, cube_names): if not season: plot_file_path = os.path.join( @@ -179,23 +166,40 @@ def plot_zonal_cubes(cube_1, cube_2, cfg, plot_data): # xcoordinate: latotude or longitude (str) data_names, xcoordinate, period = plot_data var = data_names.split('_')[0] - cube_names = [data_names.split('_')[1], data_names.split('_')[3]] + cube_names = data_names.replace(var + '_', '').split('_vs_') lat_points = cube_1.coord(xcoordinate).points plt.plot(lat_points, cube_1.data, label=cube_names[0]) plt.plot(lat_points, cube_2.data, label=cube_names[1]) + plt.title(f'Annual Climatology of {var}' if period == 'alltime' + else f'{period} of {var}') if xcoordinate == 'latitude': - plt.title(period + ' Zonal Mean for ' + var + ' ' + data_names) + axis = plt.gca() + axis.set_xticks([-60, -30, 0, 30, 60], + labels=['60\N{DEGREE SIGN} S', + '30\N{DEGREE SIGN} S', + '0\N{DEGREE SIGN}', + '30\N{DEGREE SIGN} N', + '60\N{DEGREE SIGN} N']) elif xcoordinate == 'longitude': - plt.title(period + ' Meridional Mean for ' + var + ' ' + data_names) + axis = plt.gca() + axis.set_xticks([0, 60, 120, 180, 240, 300, 360], + labels=['0\N{DEGREE SIGN} E', + '60\N{DEGREE SIGN} E', + '120\N{DEGREE SIGN} E', + '180\N{DEGREE SIGN} E', + '240\N{DEGREE SIGN} E', + '300\N{DEGREE SIGN} E', + '0\N{DEGREE SIGN} E']) plt.xlabel(xcoordinate + ' (deg)') - plt.ylabel(var) + plt.ylabel(f'{var} [{str(cube_1.units)}]') plt.tight_layout() plt.grid() plt.legend() + png_name = f'{xcoordinate}_{period}_{data_names}.png' if xcoordinate == 'latitude': - png_name = 'Zonal_Mean_' + xcoordinate + '_' + data_names + '.png' + png_name = 'Zonal_Mean_' + png_name elif xcoordinate == 'longitude': - png_name = 'Merid_Mean_' + xcoordinate + '_' + data_names + '.png' + png_name = 'Merid_Mean_' + png_name plot_file_path = os.path.join(cfg['plot_dir'], period, png_name) plt.savefig(plot_file_path) save_plotted_cubes( @@ -252,13 +256,13 @@ def coordinate_collapse(data_set, cfg): if 'mask_threshold' in cfg: thr = cfg['mask_threshold'] data_set.data = np.ma.masked_array(data_set.data, - mask=(mask_cube.data > thr)) + mask=mask_cube.data > thr) else: logger.warning('Could not find masking threshold') logger.warning('Please specify it if needed') logger.warning('Masking on 0-values = True (masked value)') data_set.data = np.ma.masked_array(data_set.data, - mask=(mask_cube.data == 0)) + mask=mask_cube.data == 0) # if zonal mean on LON if analysis_type == 'zonal_mean': diff --git a/esmvaltool/interface_scripts/logging.ncl b/esmvaltool/interface_scripts/logging.ncl index 4cb5ff1498..6333479f96 100644 --- a/esmvaltool/interface_scripts/logging.ncl +++ b/esmvaltool/interface_scripts/logging.ncl @@ -371,7 +371,7 @@ begin original_entry = outstring do outfile_idx = 0, dimsizes(all_outfiles) - 1 file_to_add := all_outfiles(outfile_idx) - if (.not. fileexists(outfile)) then + if (.not. fileexists(file_to_add)) then error_msg("f", scriptname, funcname, "outfile (path to figure) '" + \ file_to_add + "' does not exist (for PNGs, this " + \ "function also searches for 'FILE.000001.png', " + \ diff --git a/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_1-4.yml b/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_1-4.yml index 1ae9066ec3..07475e5d74 100644 --- a/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_1-4.yml +++ b/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_1-4.yml @@ -445,7 +445,11 @@ diagnostics: end_year: 1999 additional_datasets: *cmip3_tas additional_datasets: - - {dataset: GPCP-V2.3, project: obs4MIPs, tier: 1, mip: Amon} + - dataset: GPCP-V2.3 + project: obs4MIPs + tier: 1 + mip: Amon + frequency: mon scripts: model_bias: <<: *model_bias_settings diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index 9a9e080b52..8998a5a157 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -167,6 +167,7 @@ diagnostics: clivi: clt: cltStderr: + clwvi: lwp: rlut: rlutcs: @@ -1083,6 +1084,8 @@ diagnostics: mip: Amon clivi: mip: Amon + clwvi: + mip: Amon lwp: mip: Amon additional_datasets: @@ -1096,6 +1099,7 @@ diagnostics: variables: clivi: clw: + clwvi: lwp: additional_datasets: - {dataset: CLOUDSAT-L2, project: OBS, tier: 3, type: sat, diff --git a/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_basics.yml b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_basics.yml new file mode 100644 index 0000000000..06f8ad3b12 --- /dev/null +++ b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_basics.yml @@ -0,0 +1,260 @@ +# ESMValTool +--- +documentation: + title: Basic Model Evaluation. + description: > + Show plots of several variables that can be used for basic model + evaluations ("sanity checks"). + authors: + - hassler_birgit + - lauer_axel + - bonnet_pauline + - schlund_manuel + maintainer: + - hassler_birgit + + +# Note: The following models are just examples +datasets: + - {project: CMIP6, dataset: MPI-ESM1-2-HR, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, dataset: MPI-ESM1-2-LR, exp: historical, ensemble: r1i1p1f1, grid: gn} + +# Note: for some observational datasets, we use preset time ranges due to +# their limited temporal availability +timerange_for_models: &time_period + timerange: '2003/2007' # can be specified, this is just an example + + +preprocessors: + + timeseries_regular: &pp_timeseries_regular + area_statistics: + operator: mean + + timeseries_regular_ann: + <<: *pp_timeseries_regular + annual_statistics: + operator: mean + + timeseries_regular_pr: + <<: *pp_timeseries_regular + convert_units: + units: mm day-1 + + full_climatology: &pp_full_climatology + climate_statistics: + period: full + regrid: + target_grid: 2x2 + scheme: + reference: esmf_regrid.schemes:ESMFAreaWeighted + + full_climatology_pr: + <<: *pp_full_climatology + convert_units: + units: mm day-1 + + zonal_mean: + custom_order: true # makes preprocessor much faster since input for extract_levels is smaller + climate_statistics: + period: full + extract_levels: + levels: {cmor_table: CMIP6, coordinate: plev19} + scheme: linear + coordinate: air_pressure + regrid: + scheme: + reference: esmf_regrid.schemes:ESMFAreaWeighted + target_grid: 2x2 + zonal_statistics: + operator: mean + + +diagnostics: + + # Climatologies - maps (full climatology) + + plot_maps_with_references_tas: + description: Plot climatology maps including reference datasets for tas. + variables: + tas: + <<: *time_period + mip: Amon + preprocessor: full_climatology + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: &plot_multi_dataset_default + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_{dataset}_{mip}' + script: monitor/multi_datasets.py + plots: + map: + common_cbar: true + + plot_maps_with_references_pr: + description: Plot climatology maps including reference datasets for pr. + variables: + pr: + <<: *time_period + mip: Amon + preprocessor: full_climatology_pr + additional_datasets: + - {project: OBS, dataset: GPCP-SG, type: atmos, version: 2.3, tier: 2, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + script: monitor/multi_datasets.py + plots: + map: + common_cbar: true + plot_kwargs: + default: + cmap: Blues + + # Climatologies (zonal means) + + plot_zonal_mean_profiles_with_references_ta: + description: Plot 2D zonal mean profiles including reference datasets. + variables: + ta: + <<: *time_period + mip: Amon + preprocessor: zonal_mean + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + script: monitor/multi_datasets.py + plots: + zonal_mean_profile: + common_cbar: true + + plot_zonal_mean_profiles_with_references_ua: + description: Plot 2D zonal mean profiles including reference datasets. + variables: + ua: + <<: *time_period + mip: Amon + preprocessor: zonal_mean + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + script: monitor/multi_datasets.py + plots: + zonal_mean_profile: + common_cbar: true + plot_kwargs: + default: + cmap: Blues + + plot_zonal_mean_profiles_with_references_hus: + description: Plot 2D zonal mean profiles including reference datasets. + variables: + hus: + <<: *time_period + mip: Amon + preprocessor: zonal_mean + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + script: monitor/multi_datasets.py + plots: + zonal_mean_profile: + common_cbar: true + plot_kwargs: + default: + cmap: Blues + + # Time series of global averages (monthly) + + plot_multiple_timeseries: + description: Plot time series including reference datasets. + variables: + tas: + <<: *time_period + mip: Amon + preprocessor: timeseries_regular + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + clt: + <<: *time_period + mip: Amon + preprocessor: timeseries_regular + additional_datasets: + - {project: OBS, dataset: ESACCI-CLOUD, type: sat, version: AVHRR-AMPM-fv3.0, tier: 2, reference_for_monitor_diags: true} + rsut: + <<: *time_period + mip: Amon + preprocessor: timeseries_regular + additional_datasets: + - {project: OBS, dataset: CERES-EBAF, type: sat, version: Ed4.1, tier: 2, reference_for_monitor_diags: true} + rlut: + <<: *time_period + mip: Amon + preprocessor: timeseries_regular + additional_datasets: + - {project: OBS, dataset: CERES-EBAF, type: sat, version: Ed4.1, tier: 2, reference_for_monitor_diags: true} + rtnt: + derive: true + force_derivation: true + mip: Amon + preprocessor: timeseries_regular_ann + timerange: '1995/2014' + prw: + <<: *time_period + mip: Amon + preprocessor: timeseries_regular + # timerange MUST NOT start before 2003 since the observations are not available before 2003 + additional_datasets: + - {project: OBS, dataset: ESACCI-WATERVAPOUR, type: sat, version: CDR2-L3S-05deg_fv3.1, tier: 3, timerange: '2003/2007', reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + group_variables_by: variable_group + script: monitor/multi_datasets.py + plots: + timeseries: + annual_mean_kwargs: false + plot_kwargs: + MPI-ESM1-2-HR: + color: C0 + MPI-ESM1-2-LR: + color: C1 + ERA5: + color: black + ESACCI-CLOUD: + color: black + CERES-EBAF: + color: black + ESACCI-WATERVAPOUR: + color: black + + plot_multiple_timeseries_pr: + description: Plot time series including reference datasets. + variables: + pr: + <<: *time_period + mip: Amon + preprocessor: timeseries_regular_pr + additional_datasets: + - {project: OBS, dataset: GPCP-SG, type: atmos, version: 2.3, tier: 2, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + script: monitor/multi_datasets.py + plots: + timeseries: + annual_mean_kwargs: false + plot_kwargs: + MPI-ESM1-2-HR: + color: C0 + MPI-ESM1-2-LR: + color: C1 + GPCP-SG: + color: black diff --git a/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_clim.yml b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_clim.yml new file mode 100644 index 0000000000..fd2d08781f --- /dev/null +++ b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_clim.yml @@ -0,0 +1,226 @@ +# ESMValTool +--- +documentation: + title: Model evaluation with focus on clouds. + description: > + Plot climatologies several cloud-related variables of multi-year + simulations. + authors: + - bonnet_pauline + - lauer_axel + - hassler_birgit + - schlund_manuel + maintainer: + - lauer_axel + + +# Note: the following models are just examples +datasets: + - {project: CMIP6, dataset: MPI-ESM1-2-HR, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, dataset: MPI-ESM1-2-LR, exp: historical, ensemble: r1i1p1f1, grid: gn} + +# Note: for some observational datasets, we use preset time ranges due to +# their limited temporal availability +timerange_for_models: &time_period + timerange: '2005/2014' # can be specified, this is just an example + + +preprocessors: + + full_climatology: &full_climatology_diag + climate_statistics: + period: full + regrid: + target_grid: 2x2 + scheme: + reference: esmf_regrid.schemes:ESMFAreaWeighted + + full_climatology_pr: + <<: *full_climatology_diag + convert_units: + units: mm day-1 + + zonal_mean: + custom_order: true # makes preprocessor much faster since input for extract_levels is smaller + climate_statistics: + period: full + extract_levels: + levels: {cmor_table: CMIP6, coordinate: plev19} + scheme: linear + coordinate: air_pressure + regrid: + scheme: + reference: esmf_regrid.schemes:ESMFAreaWeighted + target_grid: 2x2 + zonal_statistics: + operator: mean + + +diagnostics: + + plot_clt_maps: + description: Plot clt climatology maps including reference datasets. + variables: + clt: + <<: *time_period + mip: Amon + preprocessor: full_climatology + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, version: AVHRR-AMPM-fv3.0, tier: 2, reference_for_monitor_diags: true} + scripts: + plot: &plot_multi_dataset_default + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_{dataset}_{mip}' + plots: + map: + common_cbar: true + + plot_lwcre_maps: + description: Plot lwcre climatology maps including reference datasets. + variables: + lwcre: + <<: *time_period + mip: Amon + preprocessor: full_climatology + derive: true + additional_datasets: + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, timerange: '2001/2010', tier: 1, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + map: + common_cbar: true + + plot_swcre_maps: + description: Plot swcre climatology maps including reference datasets. + variables: + swcre: + <<: *time_period + mip: Amon + preprocessor: full_climatology + derive: true + additional_datasets: + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, tier: 1, timerange: '2001/2010', reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + map: + common_cbar: true + + plot_lwp_maps: + description: Plot lwp climatology maps including reference datasets. + variables: + lwp: + <<: *time_period + mip: Amon + preprocessor: full_climatology + derive: true + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + map: + common_cbar: true + fontsize: 6 + + plot_clivi_maps: + description: Plot clivi climatology maps including reference datasets. + variables: + clivi: + <<: *time_period + mip: Amon + preprocessor: full_climatology + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + map: + common_cbar: true + + plot_prw_maps: + description: Plot prw climatology maps including reference datasets. + variables: + prw: + <<: *time_period + mip: Amon + preprocessor: full_climatology + additional_datasets: + - {dataset: ESACCI-WATERVAPOUR, project: OBS, type: sat, version: CDR2-L3S-05deg_fv3.1, tier: 3, timerange: '2003/2017', reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + map: + common_cbar: true + + plot_pr_maps: + description: Plot prw climatology maps including reference datasets. + variables: + pr: + <<: *time_period + mip: Amon + preprocessor: full_climatology_pr + additional_datasets: + - {dataset: GPCP-SG, project: OBS, type: atmos, version: 2.3, tier: 2, + timerange: '2003/2017', reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + map: + common_cbar: true + + plot_clw_profiles: + description: Plot clw vertical profiles including reference datasets. + variables: + clw: + <<: *time_period + mip: Amon + preprocessor: zonal_mean + additional_datasets: + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, version: P1-R05-gridbox-average-noprecip, timerange: '2006/2017', tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + profile: + common_cbar: true + + plot_cli_profiles: + description: Plot cli vertical profiles including reference datasets. + variables: + cli: + <<: *time_period + mip: Amon + preprocessor: zonal_mean + additional_datasets: + - {dataset: CALIPSO-ICECLOUD, project: OBS, type: sat, version: 1-00, timerange: '2007/2015', tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + profile: + common_cbar: true + + plot_cl_profiles: + description: Plot cl vertical profiles including reference datasets. + variables: + cl: + <<: *time_period + mip: Amon + preprocessor: zonal_mean + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, reference_for_monitor_diags: true} + scripts: + plot: + <<: *plot_multi_dataset_default + plots: + profile: + common_cbar: true diff --git a/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_cycles.yml b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_cycles.yml new file mode 100644 index 0000000000..ed52fd7d3c --- /dev/null +++ b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_clouds_cycles.yml @@ -0,0 +1,178 @@ +# ESMValTool +--- +documentation: + title: Model evaluation with focus on clouds. + description: > + Plot annual cycles of several cloud-related variables of multi-year simulations. + authors: + - lauer_axel + - schlund_manuel + maintainer: + - lauer_axel + + +# Note: the following models are just examples +datasets: + - {project: CMIP6, dataset: MPI-ESM1-2-HR, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, dataset: MPI-ESM1-2-LR, exp: historical, ensemble: r1i1p1f1, grid: gn} + +# Note: for some observational datasets, we use preset time ranges due to +# their limited temporal availability +timerange_for_models: &time_period + timerange: '2000/2014' # can be specified, this is just an example + + +preprocessors: + + pp_global: &global_settings + area_statistics: + operator: mean + climate_statistics: + period: month + + pp_SEPacific: + <<: *global_settings + extract_region: + start_longitude: 265 + end_longitude: 275 + start_latitude: -25 + end_latitude: -5 + mask_landsea: + mask_out: land + + pp_SouthernOcean: + <<: *global_settings + extract_region: + start_longitude: 0 + end_longitude: 360 + start_latitude: -65 + end_latitude: -30 + mask_landsea: + mask_out: land + + pp_StormTracks: + <<: *global_settings + extract_region: + start_longitude: 0 + end_longitude: 360 + start_latitude: 45 + end_latitude: 60 + + +diagnostics: + + anncyc: + description: Plot annual cycles including reference datasets. + variables: + clt_global: &clt_settings + <<: *time_period + preprocessor: pp_global + short_name: clt + mip: Amon + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, version: AVHRR-AMPM-fv3.0, tier: 2} + clt_tropics: + <<: *clt_settings + clt_sepacific: + <<: *clt_settings + preprocessor: pp_SEPacific + clt_southerocean: + <<: *clt_settings + preprocessor: pp_SouthernOcean + clt_stormtracks: + <<: *clt_settings + preprocessor: pp_StormTracks + clivi_global: &clivi_settings + <<: *time_period + preprocessor: pp_global + short_name: clivi + mip: Amon + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, version: AVHRR-AMPM-fv3.0, tier: 2} + clivi_tropics: + <<: *clivi_settings + clivi_sepacific: + <<: *clivi_settings + preprocessor: pp_SEPacific + clivi_southerocean: + <<: *clivi_settings + preprocessor: pp_SouthernOcean + clivi_stormtracks: + <<: *clivi_settings + preprocessor: pp_StormTracks + lwp_global: &lwp_settings + <<: *time_period + preprocessor: pp_global + short_name: lwp + derive: true + mip: Amon + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, version: AVHRR-AMPM-fv3.0, tier: 2} + lwp_tropics: + <<: *lwp_settings + lwp_sepacific: + <<: *lwp_settings + preprocessor: pp_SEPacific + lwp_southerocean: + <<: *lwp_settings + preprocessor: pp_SouthernOcean + lwp_stormtracks: + <<: *lwp_settings + preprocessor: pp_StormTracks + swcre_global: &swcre_settings + <<: *time_period + preprocessor: pp_global + short_name: swcre + derive: true + mip: Amon + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, tier: 2} + swcre_tropics: + <<: *swcre_settings + swcre_sepacific: + <<: *swcre_settings + preprocessor: pp_SEPacific + swcre_southerocean: + <<: *swcre_settings + preprocessor: pp_SouthernOcean + swcre_stormtracks: + <<: *swcre_settings + preprocessor: pp_StormTracks + lwcre_global: &lwcre_settings + <<: *time_period + preprocessor: pp_global + short_name: lwcre + derive: true + mip: Amon + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, tier: 2} + lwcre_tropics: + <<: *lwcre_settings + lwcre_sepacific: + <<: *lwcre_settings + preprocessor: pp_SEPacific + lwcre_southerocean: + <<: *lwcre_settings + preprocessor: pp_SouthernOcean + lwcre_stormtracks: + <<: *lwcre_settings + preprocessor: pp_StormTracks + scripts: + allplots: + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_{mip}' + group_variables_by: variable_group + plots: + annual_cycle: + legend_kwargs: + loc: upper right + plot_kwargs: + MPI-ESM1-2-HR: + color: C0 + MPI-ESM1-2-LR: + color: C1 + ESACCI-CLOUD: + color: black + pyplot_kwargs: + title: '{short_name}' diff --git a/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_precip_zonal.yml b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_precip_zonal.yml new file mode 100644 index 0000000000..6bd1231046 --- /dev/null +++ b/esmvaltool/recipes/model_evaluation/recipe_model_evaluation_precip_zonal.yml @@ -0,0 +1,72 @@ +# ESMValTool +--- +documentation: + title: Model evaluation with focus on precipitation. + description: > + Plot zonal mean plots of precipitation. + authors: + - lauer_axel + - schlund_manuel + maintainer: + - lauer_axel + + +# Note: the following models are just examples +datasets: + - {project: CMIP6, dataset: MPI-ESM1-2-HR, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, dataset: MPI-ESM1-2-LR, exp: historical, ensemble: r1i1p1f1, grid: gn} + +# Note: for some observational datasets, we use preset time ranges due to +# their limited temporal availability +timerange_for_models: &time_period + timerange: '2000/2014' # can be specified, this is just an example + + +preprocessors: + + pp_zonal: + regrid: + target_grid: 2x2 + scheme: + reference: esmf_regrid.schemes:ESMFAreaWeighted + zonal_statistics: + operator: mean + climate_statistics: + operator: mean + period: full + convert_units: + units: mm day-1 + + +diagnostics: + + zonal: + description: Plot annual cycles including reference datasets. + variables: + pr: + <<: *time_period + preprocessor: pp_zonal + mip: Amon + additional_datasets: + - {dataset: ERA5, project: native6, type: reanaly, version: 'v1', tier: 3} + - {dataset: GPCP-SG, project: obs4MIPs, level: L3, version: v2.3, tier: 1} + scripts: + allplots: + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_{mip}' + group_variables_by: variable_group + plots: + variable_vs_lat: + legend_kwargs: + loc: upper right + plot_kwargs: + MPI-ESM1-2-HR: + color: C0 + MPI-ESM1-2-LR: + color: C1 + ERA5: + color: black + linestyle: dotted + GPCP-SG: + color: black diff --git a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml index e75cc763da..681277310c 100644 --- a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml +++ b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml @@ -1,7 +1,7 @@ # ESMValTool --- documentation: - title: Model Monitoring + title: Example recipe for model monitoring with reference datasets. description: | Show plots that include multiple datasets that can be used to monitor (ongoing) model simulations. diff --git a/esmvaltool/recipes/recipe_landcover.yml b/esmvaltool/recipes/recipe_landcover.yml index d324c02dc9..75c892b37c 100644 --- a/esmvaltool/recipes/recipe_landcover.yml +++ b/esmvaltool/recipes/recipe_landcover.yml @@ -67,5 +67,5 @@ diagnostics: landcover: script: landcover/landcover.py comparison: variable - colorscheme: seaborn-darkgrid + colorscheme: seaborn-v0_8-darkgrid diff --git a/esmvaltool/recipes/recipe_psyplot.yml b/esmvaltool/recipes/recipe_psyplot.yml index 4a07f4c558..c34ee203f0 100644 --- a/esmvaltool/recipes/recipe_psyplot.yml +++ b/esmvaltool/recipes/recipe_psyplot.yml @@ -2,13 +2,13 @@ # recipe_psyplot.yml --- documentation: - title: > - Create arbitrary Psyplot plots. + title: Example recipe for the Psyplot diagnostic. description: > This recipes showcases the use of the Psyplot diagnostic that provides a high-level interface to Psyplot for ESMValTool recipes. For each input - dataset, an individual plot is created. + dataset, an individual plot is created. With the Psyplot diagnostic, + arbitrary Psyplot plots can be created. authors: - schlund_manuel diff --git a/esmvaltool/recipes/recipe_seaborn.yml b/esmvaltool/recipes/recipe_seaborn.yml index faf0f07085..983efae0be 100644 --- a/esmvaltool/recipes/recipe_seaborn.yml +++ b/esmvaltool/recipes/recipe_seaborn.yml @@ -2,14 +2,14 @@ # recipe_seaborn.yml --- documentation: - title: > - Create arbitrary Seaborn plots. + title: Example recipe for the Seaborn diagnostic. description: > This recipe showcases the use of the Seaborn diagnostic that provides a high-level interface to Seaborn for ESMValTool recipes. For this, the input data is arranged into a single `pandas.DataFrame`, which is then used as - input for the Seaborn function defined by the option `seaborn_func`. + input for the Seaborn function defined by the option `seaborn_func`. With + the Seaborn diagnostic, arbitrary Seaborn plots can be created. authors: - schlund_manuel diff --git a/esmvaltool/utils/batch-jobs/generate.py b/esmvaltool/utils/batch-jobs/generate.py index fc9deb8339..afba37906f 100644 --- a/esmvaltool/utils/batch-jobs/generate.py +++ b/esmvaltool/utils/batch-jobs/generate.py @@ -24,6 +24,7 @@ """ import os import subprocess +import textwrap from pathlib import Path import esmvaltool @@ -84,10 +85,6 @@ 'time': '#SBATCH --time=08:00:00 \n', 'memory': '#SBATCH --constraint=512G \n', }, - 'recipe_daily_era5': { - 'partition': '#SBATCH --partition=compute \n', - 'memory': '#SBATCH --constraint=512G \n', - }, 'recipe_eady_growth_rate': { 'partition': '#SBATCH --partition=compute \n', }, @@ -190,6 +187,9 @@ 'recipe_thermodyn_diagtool': { 'partition': '#SBATCH --partition=compute \n', }, + 'recipe_wflow': { + 'partition': '#SBATCH --partition=compute \n', + }, 'recipe_wenzel16jclim': { 'partition': '#SBATCH --partition=compute \n', }, @@ -207,6 +207,9 @@ 'recipe_bock20jgr_fig_1-4': 1, 'recipe_bock20jgr_fig_6-7': 1, 'recipe_bock20jgr_fig_8-10': 1, + 'recipe_daily_era5': 1, + 'recipe_easy_ipcc': 1, + 'recipe_climate_change_hotspot': 1, 'recipe_flato13ipcc_figure_96': 1, 'recipe_flato13ipcc_figures_938_941_cmip3': 1, 'recipe_ipccwg1ar6ch3_fig_3_9': 1, @@ -214,25 +217,54 @@ 'recipe_ipccwg1ar6ch3_fig_3_43': 1, 'recipe_check_obs': 1, 'recipe_collins13ipcc': 1, - 'recipe_lauer22jclim_fig3-4_zonal': 3, - 'recipe_lauer22jclim_fig5_lifrac': 3, + 'recipe_lauer22jclim_fig3-4_zonal': 1, + 'recipe_lauer22jclim_fig5_lifrac': 1, 'recipe_smpi': 1, 'recipe_smpi_4cds': 1, 'recipe_wenzel14jgr': 1, } +DISTRIBUTED_RECIPES = [ + 'recipe_easy_ipcc', + 'recipe_daily_era5', + 'recipe_marrmot', + 'recipe_pcrglobwb', +] + def generate_submit(): """Generate and submit scripts.""" + print("It is recommended that you run the following recipes with the " + "configuration in dask.yml in ~/.esmvaltool/dask.yml:") + default_dask_config_file = textwrap.dedent(f""" + cluster: + type: dask_jobqueue.SLURMCluster + queue: compute + account: {account} + cores: 128 + memory: 256GiB + processes: 32 + interface: ib0 + local_directory: /scratch/{os.getlogin()[0]}/{os.getlogin()}/dask-tmp + n_workers: 32 + walltime: '8:00:00' + """) + for recipe in DISTRIBUTED_RECIPES: + print(f"- {recipe}.yml") + Path('dask.yml').write_text(default_dask_config_file, encoding='utf-8') + home = os.path.expanduser('~') # Fill the list with the names of the recipes to be excluded # This includes recipes containing missing datasets - exclude = ['recipe_schlund20jgr_gpp_abs_rcp85', - 'recipe_schlund20jgr_gpp_change_1pct', - 'recipe_schlund20jgr_gpp_change_rcp85'] + exclude = [ + 'recipe_schlund20jgr_gpp_abs_rcp85', + 'recipe_schlund20jgr_gpp_change_1pct', + 'recipe_schlund20jgr_gpp_change_rcp85' + ] dir_recipes = Path('/'.join((esmvaltool.__path__[0], 'recipes'))) for recipe in Path(dir_recipes).rglob('*.yml'): + recipe = recipe.relative_to(dir_recipes) filename = f'launch_{recipe.stem}.sh' if recipe.stem in exclude: continue @@ -241,11 +273,9 @@ def generate_submit(): file.write('\n') file.write(f'#SBATCH --job-name={recipe.stem}.%J\n') file.write( - f'#SBATCH --output={home}/{outputs}/{recipe.stem}.%J.out\n' - ) + f'#SBATCH --output={home}/{outputs}/{recipe.stem}.%J.out\n') file.write( - f'#SBATCH --error={home}/{outputs}/{recipe.stem}.%J.err\n' - ) + f'#SBATCH --error={home}/{outputs}/{recipe.stem}.%J.err\n') file.write(f'#SBATCH --account={account}\n') if not SPECIAL_RECIPES.get(recipe.stem, None): # continue diff --git a/esmvaltool/utils/batch-jobs/parse_recipes_output.py b/esmvaltool/utils/batch-jobs/parse_recipes_output.py index 9df80c6cc0..7daf202924 100644 --- a/esmvaltool/utils/batch-jobs/parse_recipes_output.py +++ b/esmvaltool/utils/batch-jobs/parse_recipes_output.py @@ -1,121 +1,126 @@ -""" -Parse recipes run output. +"""Parse recipes run output. -Parse typical batch job output files like .out and .err -to identify recipes that have succeeded or failed; display -results in a convenient Markdown format, to be added to -a GitHub issue or any other such documentation. +Parse typical batch job output files like .out and .err to identify +recipes that have succeeded or failed; display results in a convenient +Markdown format, to be added to a GitHub issue or any other such +documentation. """ import datetime -import glob import os +import re +from pathlib import Path +from typing import Iterator -# User change needed -# directory where SLURM output files (.out and .err) are -# written to, e.g. on Levante for user b382109 -# SLURM_OUT_DIR = "/home/b/b382109/output_v270" -SLURM_OUT_DIR = "" -# SLURM output file pattern (extension); usually all SLURM -# output is held in .out, unless there are internal/system errors -# so this is what you need most if the times -GLOB_PATTERN = "*.out*" +import fire -def parse_slurm_output(dirname, pattern): - """ - Parse the out dir from SLURM. +def parse_slurm_output(dirname: str, pattern: str) -> Iterator[Path]: + """Parse the out dir from SLURM. - Perform a glob on dirname/pattern where dirname - is the directory where SLURM output is stored, and - pattern is the out file pattern, like .out. Returns - all the files in dirname that have pattern extension. + Perform a glob on dirname/pattern where dirname is the directory + where SLURM output is stored, and pattern is the out file pattern, + like .out. Returns all the files in dirname that have pattern + extension. """ - pat = os.path.join(dirname, pattern) - files = glob.glob(pat) + return Path(dirname).expanduser().glob(pattern) - return files +def parse_output_file(slurm_out_dir: str) -> dict[str, list[str]]: + """Parse .out and .err files in a given dir. -def parse_output_file(): + Returns a tuple of lists of sorted .out files for each of these + criteria: recipes that ran successfulltm recipes that failed with + diagnostic errors, recipes that failed due to missing data. """ - Parse .out files in a given dir. + categories = [ + 'success', + 'diagnostic error', + 'missing data', + 'out of memory', + 'out of time', + 'unknown', + ] + results: dict[str, list[str]] = {k: [] for k in categories} - Returns a tuple of lists of sorted .out files for each - of these criteria: recipes that ran successfulltm recipes - that failed with diagnostic errors, recipes that failed - due to missing data. - """ - files = parse_slurm_output(SLURM_OUT_DIR, GLOB_PATTERN) - success_rec = [] - diag_fail_rec = [] - missing_data = [] - for fil in files: - with open(fil, "r", encoding='utf-8') as outfile: + files = parse_slurm_output(slurm_out_dir, '*.out') + for file in files: + recipe = str(Path(file.stem).with_suffix('.yml')) + with open(file, "r", encoding='utf-8') as outfile: lines = outfile.readlines() for line in lines: if "Run was successful\n" in line: - success_rec.append(fil) + results['success'].append(recipe) + break elif "esmvalcore._task.DiagnosticError" in line: - diag_fail_rec.append(fil) + results['diagnostic error'].append(recipe) + break elif "ERROR Missing data for preprocessor" in line: - missing_data.append(fil) - - # typical list elem - # /home/b/b382109/output_v270/recipe_zmnam.2378956.out - ok_recipe_outs = [os.path.basename(ofile) for ofile in success_rec] - ok_recipe_outs = [f.split(".")[0] + ".yml" for f in ok_recipe_outs] - df_recipe_outs = [os.path.basename(ofile) for ofile in diag_fail_rec] - df_recipe_outs = [f.split(".")[0] + ".yml" for f in df_recipe_outs] - md_recipe_outs = [os.path.basename(ofile) for ofile in missing_data] - md_recipe_outs = [f.split(".")[0] + ".yml" for f in md_recipe_outs] - - return (sorted(set(ok_recipe_outs)), - sorted(set(df_recipe_outs)), - sorted(set(md_recipe_outs))) - - -def display_in_md(): - """Print out recipes in Markdown list.""" + results['missing data'].append(recipe) + break + else: + if not file.with_suffix('.err').exists(): + results['unknown'].append(recipe) + else: + err = file.with_suffix('.err').read_text(encoding='utf-8') + if "killed by the cgroup out-of-memory" in err: + results['out of memory'].append(recipe) + elif "step tasks have been OOM Killed" in err: + results['out of memory'].append(recipe) + elif re.match(".* CANCELLED AT .* DUE TO TIME LIMIT", err): + results['out of time'].append(recipe) + else: + results['unknown'].append(recipe) + + results = {k: sorted(v) for k, v in results.items()} + + return results + + +def display_in_md( + slurm_out_dir: str = '.', + all_recipes_file: str = 'all_recipes.txt', +) -> None: + """Print out recipes in Markdown list. + + Parameters + ---------- + slurm_out_dir: + Directory where SLURM output files (.out and .err) are written to. + + all_recipes_file: + Text file containing a list of all recipes. + """ todaynow = datetime.datetime.now() print(f"## Recipe running session {todaynow}\n") - with open("all_recipes.txt", "r", encoding='utf-8') as allrecs: - all_recs = [ - os.path.basename(rec.strip()) for rec in allrecs.readlines() + with open(all_recipes_file, "r", encoding='utf-8') as file: + all_recipes = [ + os.path.basename(line.strip()) for line in file.readlines() ] - - # parse different types of recipe outcomes - recipe_list, failed, missing_dat = parse_output_file() - print("### Successfully ran recipes\n\n") - print(f"{len(recipe_list)} out of {len(all_recs)}\n") - for rec in recipe_list: - print("- " + rec) - - # surely failed with diagnostic error - print("\n### Recipes that failed with DiagnosticError\n") - print(f"{len(failed)} out of {len(all_recs)}\n") - for rec in failed: - print("- " + rec) - - # missing data - print("\n### Recipes that failed of Missing Data\n") - print(f"{len(missing_dat)} out of {len(all_recs)}\n") - for rec in missing_dat: - print("- " + rec) - - # look at other fails or still running - bad_recs = [ - rec for rec in all_recs - if rec not in recipe_list and rec not in failed - and rec not in missing_dat - ] - bad_recs = sorted(bad_recs) - print( - "\n### Recipes that failed of other reasons or are still running\n" - ) - print(f"{len(bad_recs)} out of {len(all_recs)} so far\n") - for rec in bad_recs: - print("- " + rec) + n_recipes = len(all_recipes) + + results = parse_output_file(slurm_out_dir) + results["no run"] = sorted( + set(all_recipes) - set(recipe for v in results.values() + for recipe in v)) + prefix = "Recipes that" + err_prefix = f"{prefix} failed because" + messages = { + "success": f"{prefix} ran successfully", + "diagnostic error": f"{err_prefix} the diagnostic script failed", + "missing data": f"{err_prefix} of missing data", + "out of time": f"{err_prefix} the run took too long", + "out of memory": f"{err_prefix} they used too much memory", + "unknown": f"{prefix} failed of other reasons or are still running", + "no run": f"{prefix} never ran", + } + for type_, msg in messages.items(): + result = results[type_] + if result: + print(f"### {msg} ({len(result)} out of {n_recipes})") + for recipe in result: + print(f"- {recipe}") + print() if __name__ == '__main__': - display_in_md() + fire.Fire(display_in_md) diff --git a/esmvaltool/utils/draft_release_notes.py b/esmvaltool/utils/draft_release_notes.py index 13bcb4324c..a11b03a9ae 100644 --- a/esmvaltool/utils/draft_release_notes.py +++ b/esmvaltool/utils/draft_release_notes.py @@ -41,11 +41,11 @@ 'esmvaltool': "ESMValGroup/ESMValTool", } +TIMEZONE = ZoneInfo("CET") + PREVIOUS_RELEASE = { - 'esmvalcore': - datetime.datetime(2023, 7, 4, 11, tzinfo=ZoneInfo("CET")), - 'esmvaltool': - datetime.datetime(2022, 10, 28, 18, tzinfo=ZoneInfo("CET")), + 'esmvalcore': datetime.datetime(2023, 6, 6, 0, tzinfo=TIMEZONE), + 'esmvaltool': datetime.datetime(2023, 6, 20, 0, tzinfo=TIMEZONE), } LABELS = { @@ -130,11 +130,17 @@ def draft_notes_since(project, previous_release_date=None, labels=None): print(f"Note: Unmerged PRs or PRs that have been merged before " f"{previous_release_date} are not shown\n") for pull in pulls: - if pull.updated_at < previous_release_date: + if pull.updated_at.astimezone(TIMEZONE) < previous_release_date: break - if not pull.merged or pull.merged_at < previous_release_date: + if (not pull.merged or + pull.merged_at.astimezone(TIMEZONE) < previous_release_date): continue - print(pull.updated_at, pull.merged_at, pull.number, pull.title) + print( + pull.updated_at.astimezone(TIMEZONE), + pull.merged_at.astimezone(TIMEZONE), + pull.number, + pull.title, + ) pr_labels = {label.name for label in pull.labels} if 'automatedPR' in pr_labels: continue @@ -205,12 +211,9 @@ def _list_labelless_pulls(labelless_pulls): def _compose_note(pull): user = pull.user - username = user.login if user.name is None else user.name title = pull.title title = title[0].upper() + title[1:] - return (f"- {title} (`#{pull.number} " - f"<{pull.html_url}>`__) " - f"`{username} `__") + return f"- {title} (:pull:`{pull.number}`) by :user:`{user.login}`" def main(): diff --git a/esmvaltool/utils/recipe_filler.py b/esmvaltool/utils/recipe_filler.py index 91033a12c8..40f637c6d5 100755 --- a/esmvaltool/utils/recipe_filler.py +++ b/esmvaltool/utils/recipe_filler.py @@ -291,16 +291,31 @@ def read_config_user_file(config_file, folder_name, options=None): } +def _get_download_dir(yamlconf, cmip_era): + """Get the Download Directory from user config file.""" + if 'download_dir' in yamlconf: + return os.path.join(yamlconf['download_dir'], cmip_era) + return False + + def _get_site_rootpath(cmip_era): """Get site (drs) from config-user.yml.""" config_yml = get_args().config_file with open(config_yml, 'r') as yamf: yamlconf = yaml.safe_load(yamf) drs = yamlconf['drs'][cmip_era] - rootdir = yamlconf['rootpath'][cmip_era] + + download_dir = _get_download_dir(yamlconf, cmip_era) + rootdir = [yamlconf['rootpath'][cmip_era], ] + + if download_dir: + rootdir.append(download_dir) logger.debug("%s root directory %s", cmip_era, rootdir) if drs == 'default' and 'default' in yamlconf['rootpath']: - rootdir = yamlconf['rootpath']['default'] + rootdir = [yamlconf['rootpath']['default'], ] + if download_dir: + rootdir.append(download_dir) + logger.debug("Using drs default and " "default: %s data directory", rootdir) @@ -327,6 +342,7 @@ def _determine_basepath(cmip_era): rootpaths = _get_site_rootpath(cmip_era)[1] else: rootpaths = [_get_site_rootpath(cmip_era)[1]] + basepaths = [] for rootpath in rootpaths: if _get_input_dir(cmip_era) != os.path.sep: diff --git a/setup.py b/setup.py index bd584b7b3b..34ef66d80e 100755 --- a/setup.py +++ b/setup.py @@ -35,6 +35,7 @@ 'esmvalcore', 'esmf-regrid>=0.7.0', 'fiona', + 'fire', 'GDAL', 'jinja2', 'joblib', @@ -46,27 +47,27 @@ 'netCDF4', 'numba', 'numpy!=1.24.3', # severe masking bug - 'packaging', 'openpyxl', + 'packaging', 'pandas', - 'pyproj>=2.1', - 'pyyaml', 'progressbar2', 'psyplot', 'psy-maps', 'psy-reg', 'psy-simple', + 'pyproj>=2.1', + 'python-dateutil', + 'pyyaml', 'rasterio', + 'requests', 'ruamel.yaml', 'scikit-image', 'scikit-learn', 'scipy', - # See the following issue for info on the iris pin below: - # https://github.com/ESMValGroup/ESMValTool/issues/3239#issuecomment-1613298587 - 'scitools-iris>=3.4.0', + 'scitools-iris>=3.6.1', 'seaborn', 'seawater', - 'shapely', + 'shapely>=2', 'xarray>=0.12.0', 'xesmf>=0.7.1', 'xgboost>1.6.1', # github.com/ESMValGroup/ESMValTool/issues/2779 diff --git a/tests/integration/diag_scripts/mlr/test_custom_sklearn_classes.py b/tests/integration/diag_scripts/mlr/test_custom_sklearn_classes.py index 37c4221bf5..eda795cc9e 100644 --- a/tests/integration/diag_scripts/mlr/test_custom_sklearn_classes.py +++ b/tests/integration/diag_scripts/mlr/test_custom_sklearn_classes.py @@ -142,35 +142,6 @@ def test_feature_importances_(self): ) assert pipeline.feature_importances_ == 42 - def test_fit(self): - """Test ``_fit``.""" - x_data = np.array([ - [0, 1000], - [1, 0], - [2, 3000], - [0, -5000], - [4, -3000], - [4, -3000], - ]) - y_data = np.array([1, 0, 3, -5, -3, -3]) - pipeline = AdvancedPipeline([ - ('t', StandardScaler()), ('r', LinearRegression()), - ]) - sample_weights = np.array([0.0, 0.0, 0.0, 0.0, 1.0, 1.0]) - kwargs = { - 't': {'sample_weight': sample_weights}, - 'r': {'sample_weight': sample_weights}, - } - pipeline._fit(x_data, y_data, **kwargs) - - transformer_ = pipeline.steps[0][1] - np.testing.assert_allclose(transformer_.scale_, [1.0, 1.0]) - np.testing.assert_allclose(transformer_.mean_, [4.0, -3000.0]) - - regressor_ = pipeline.steps[1][1] - with pytest.raises(NotFittedError): - regressor_.predict([[0, 0]]) - AREG = AdvancedTransformedTargetRegressor( transformer=NonStandardScaler(), regressor=LinearRegression(), @@ -253,7 +224,7 @@ def test_fit_target_transformer_only(self, pipeline, kwargs, output): (np.array([8.333333]), np.array([8.222222])), (np.array([6.333333]), np.array([8.222222])), ValueError, - ValueError, + KeyError, (np.array([8.333333]), np.array([8.222222]))], ) @@ -274,6 +245,8 @@ def test_fit_transformers_only(self, pipeline, kwargs, output): return np.testing.assert_allclose(transformer.mean_, output[0]) np.testing.assert_allclose(transformer.var_, output[1]) + assert pipeline.steps[-1][0] == 'r' + assert pipeline.steps[-1][1] != 'passthrough' with pytest.raises(NotFittedError): pipeline.predict(X_TRAIN) with pytest.raises(NotFittedError): @@ -455,8 +428,11 @@ def test_advanced_rfe_no_fit_kwargs(self, rfe): np.testing.assert_array_equal(rfe.support_, [False, False, True]) est = rfe.estimator_ assert isinstance(est, AdvancedPipeline) - assert est.steps[0][1].transformers_ == [ - ('passthrough', 'passthrough', [0])] + assert len(est.steps[0][1].transformers_) == 1 + transformer = est.steps[0][1].transformers_[0] + assert transformer[0] == 'passthrough' + assert isinstance(transformer[1], FunctionTransformer) + assert transformer[2] == [0] np.testing.assert_allclose(est.steps[1][1].coef_, [1.0]) np.testing.assert_allclose(est.steps[1][1].intercept_, 0.0, atol=1e-10) pred = rfe.predict(self.X_PRED) @@ -473,8 +449,11 @@ def test_advanced_rfe_fit_kwargs(self, rfe): np.testing.assert_array_equal(rfe.support_, [True, False, False]) est = rfe.estimator_ assert isinstance(est, AdvancedPipeline) - assert est.steps[0][1].transformers_ == [ - ('passthrough', 'passthrough', [0])] + assert len(est.steps[0][1].transformers_) == 1 + transformer = est.steps[0][1].transformers_[0] + assert transformer[0] == 'passthrough' + assert isinstance(transformer[1], FunctionTransformer) + assert transformer[2] == [0] np.testing.assert_allclose(est.steps[1][1].coef_, [0.5]) np.testing.assert_allclose(est.steps[1][1].intercept_, 0.0, atol=1e-10) pred = rfe.predict(self.X_PRED)