diff --git a/.circleci/config.yml b/.circleci/config.yml index c39f436453..71ee4a9c84 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,9 +2,10 @@ version: 2.1 orbs: - coverage-reporter: codacy/coverage-reporter@11.9.2 + coverage-reporter: codacy/coverage-reporter@13.13.0 commands: + check_changes: steps: - run: @@ -19,6 +20,19 @@ commands: echo Skipping installation tests circleci step halt fi + + log_versions: + steps: + - run: + name: Log versions + command: | + . /opt/conda/etc/profile.d/conda.sh + conda activate esmvaltool + esmvaltool version + dpkg -l > /logs/versions.txt + conda env export > /logs/environment.yml + pip freeze > /logs/requirements.txt + test_and_report: steps: - run: @@ -26,13 +40,13 @@ commands: command: | . /opt/conda/etc/profile.d/conda.sh conda activate esmvaltool - pytest -n 4 -m 'not flake8' --junitxml=test-reports/report.xml + pytest -n 4 --junitxml=test-reports/report.xml esmvaltool version esmvaltool -- --help ncl -V cdo --version - store_test_results: - path: test-reports/ + path: test-reports/report.xml - store_artifacts: path: /logs - run: @@ -47,6 +61,7 @@ commands: when: always - store_artifacts: path: test-reports.tar.gz + test_installation_from_source: parameters: extra: @@ -81,20 +96,13 @@ commands: then rm -r esmvaltool fi - - run: - name: Log versions - command: | - . /opt/conda/etc/profile.d/conda.sh - conda activate esmvaltool - dpkg -l > /logs/versions.txt - conda env export > /logs/environment.yml - pip freeze > /logs/requirements.txt + - log_versions - run: name: Lint source code command: | . /opt/conda/etc/profile.d/conda.sh conda activate esmvaltool - pytest -n 4 -m flake8 + flake8 -j 4 - test_and_report - save_cache: key: install-<< parameters.extra >>-{{ .Branch }}-{{ checksum "cache_key.txt" }} @@ -120,15 +128,19 @@ jobs: name: Install dependencies command: | . /opt/conda/etc/profile.d/conda.sh - mkdir /logs conda activate esmvaltool + mkdir /logs pip install .[test] > /logs/install.txt 2>&1 - # Run flake8 check with source code (it doesn't work without it) - pytest -n 4 -m flake8 - # Update/install Julia dependencies esmvaltool install Julia > /logs/install_julia.txt 2>&1 - # Remove source to test installed software - rm -r esmvaltool + - run: + name: Check Python code style and mistakes + command: | + . /opt/conda/etc/profile.d/conda.sh + conda activate esmvaltool + flake8 -j 4 + - run: + name: Remove source code to test the installed software + command: rm -r esmvaltool - test_and_report - save_cache: key: test-{{ .Branch }}-{{ checksum "cache_key.txt" }} @@ -143,7 +155,7 @@ jobs: test_installation_from_source_test_mode: # Test installation from source docker: - - image: condaforge/mambaforge + - image: condaforge/mambaforge:latest resource_class: large steps: - test_installation_from_source: @@ -152,17 +164,74 @@ jobs: test_installation_from_source_develop_mode: # Test development installation docker: - - image: condaforge/mambaforge + - image: condaforge/mambaforge:latest resource_class: large steps: - test_installation_from_source: extra: develop flags: "--editable" + test_upstream_development: + # Test running recipes with the development version of ESMValCore. The + # purpose of this test to discover backward-incompatible changes early on in + # the development cycle. + docker: + - image: condaforge/mambaforge:latest + resource_class: large + steps: + - run: + name: Install git and ssh + environment: + DEBIAN_FRONTEND: noninteractive # needed to install tzdata + command: apt update && apt install -y git ssh + - checkout + - run: + name: Generate cache key + command: echo $(date '+%Y')-$(expr $(date '+%V') / 2) | tee cache_key.txt + - restore_cache: + key: test-upstream-{{ .Branch }}-{{ checksum "cache_key.txt" }} + - run: + name: Install + command: | + # Install according to instructions on readthedocs with the + # development version of ESMValTool and ESMValCore: + # https://docs.esmvaltool.org/en/latest/quickstart/installation.html#install-from-source + . /opt/conda/etc/profile.d/conda.sh + mkdir /logs + mamba env create >> /logs/conda.txt 2>&1 + conda activate esmvaltool + pip install --editable .[develop] + esmvaltool install Julia > /logs/install_julia.txt 2>&1 + git clone https://github.com/ESMValGroup/ESMValCore $HOME/ESMValCore + pip install --editable $HOME/ESMValCore[develop] + - log_versions + - test_and_report + - run: + name: Run recipes + command: | + . /opt/conda/etc/profile.d/conda.sh + conda activate esmvaltool + mkdir -p ~/climate_data + esmvaltool config get_config_user + echo "offline: false" >> ~/.esmvaltool/config-user.yml + cat ~/.esmvaltool/config-user.yml + esmvaltool run examples/recipe_python.yml + for recipe in esmvaltool/recipes/testing/recipe_*.yml; do + esmvaltool run "$recipe" + done + - store_artifacts: + path: /root/esmvaltool_output + - save_cache: + key: test-upstream-{{ .Branch }}-{{ checksum "cache_key.txt" }} + paths: + - /opt/conda/pkgs + - /root/.cache/pip + - /root/climate_data + build_documentation: # Test building documentation docker: - - image: condaforge/mambaforge + - image: condaforge/mambaforge:latest resource_class: small steps: - checkout @@ -186,7 +255,7 @@ jobs: test_installation_from_conda: # Test conda package installation docker: - - image: condaforge/mambaforge + - image: condaforge/mambaforge:latest resource_class: medium steps: - run: @@ -229,5 +298,6 @@ workflows: - run_tests - test_installation_from_source_test_mode - test_installation_from_source_develop_mode + - test_upstream_development - build_documentation - test_installation_from_conda diff --git a/.github/workflows/create-condalock-file.yml b/.github/workflows/create-condalock-file.yml index 7cd0b21d5b..033bc0c761 100644 --- a/.github/workflows/create-condalock-file.yml +++ b/.github/workflows/create-condalock-file.yml @@ -63,6 +63,8 @@ jobs: run: esmvaltool --help - shell: bash -l {0} run: esmvaltool version + - shell: bash -l {0} + run: flake8 - shell: bash -l {0} run: pytest -n 2 -m "not installation" # Automated PR diff --git a/.github/workflows/install-from-condalock-file.yml b/.github/workflows/install-from-condalock-file.yml index 7a82b5bd9f..c9c2c65ad9 100644 --- a/.github/workflows/install-from-condalock-file.yml +++ b/.github/workflows/install-from-condalock-file.yml @@ -11,7 +11,7 @@ on: push: branches: - main - # - condalock-update + # - condalock-update # run the test only if the PR is to main # turn it on if required #pull_request: @@ -58,6 +58,8 @@ jobs: run: esmvaltool --help - shell: bash -l {0} run: esmvaltool version 2>&1 | tee source_install_linux_artifacts_python_${{ matrix.python-version }}/version.txt + - shell: bash -l {0} + run: flake8 - shell: bash -l {0} run: pytest -n 2 -m "not installation" - name: Upload artifacts diff --git a/.github/workflows/test-development.yml b/.github/workflows/test-development.yml index a5d80b290d..1b50e00076 100644 --- a/.github/workflows/test-development.yml +++ b/.github/workflows/test-development.yml @@ -55,6 +55,9 @@ jobs: git clone https://github.com/ESMValGroup/ESMValCore.git cd ESMValCore pip install -e .[develop] + - name: Run flake8 + shell: bash -l {0} + run: flake8 - name: Run tests shell: bash -l {0} run: pytest -n 2 -m "not installation" 2>&1 | tee develop_test_linux_artifacts_python_${{ matrix.python-version }}/test_report.txt diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index da49c08dbc..7f61929c10 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,6 +42,9 @@ jobs: - name: Install Julia dependencies shell: bash -l {0} run: esmvaltool install Julia + - name: Run flake8 + shell: bash -l {0} + run: flake8 - name: Run tests shell: bash -l {0} run: pytest -n 2 -m "not installation" 2>&1 | tee test_linux_artifacts_python_${{ matrix.python-version }}/test_report.txt @@ -83,6 +86,9 @@ jobs: - name: Install ESMValTool shell: bash -l {0} run: pip install -e .[develop] 2>&1 | tee test_osx_artifacts_python_${{ matrix.python-version }}/install.txt + - name: Run flake8 + shell: bash -l {0} + run: flake8 - name: Run tests shell: bash -l {0} run: pytest -n 2 -m "not installation" 2>&1 | tee test_osx_artifacts_python_${{ matrix.python-version }}/test_report.txt diff --git a/.readthedocs.yaml b/.readthedocs.yaml index c481981750..866983be20 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -10,19 +10,15 @@ build: os: ubuntu-22.04 tools: python: "mambaforge-4.10" + jobs: + post_create_environment: + - pip install . --no-deps # Declare the requirements required to build your docs conda: environment: environment.yml -python: - install: - - method: pip - path: . - extra_requirements: - - doc - # Build documentation in the doc directory with Sphinx sphinx: configuration: doc/sphinx/source/conf.py diff --git a/CITATION.cff b/CITATION.cff index f196cd08f7..f069250a3d 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -340,13 +340,22 @@ authors: family-names: Kazeroni given-names: Rémi orcid: "https://orcid.org/0000-0001-7205-9528" + - + affiliation: "NASA, USA" + family-names: Potter + given-names: Jerry + - + affiliation: "DLR, Germany" + family-names: Winterstein + given-names: Franziska + orcid: "https://orcid.org/0000-0002-2406-4936" cff-version: 1.2.0 -date-released: 2022-07-25 +date-released: 2023-03-28 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.6.0" +version: "v2.8.0" ... diff --git a/README.md b/README.md index 5668e537ef..9ef448eca1 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://anaconda.org/esmvalgroup/esmvaltool/badges/installer/conda.svg)](https://conda.anaconda.org/esmvalgroup) +[![Anaconda-Server Badge](https://anaconda.org/conda-forge/esmvaltool/badges/version.svg)](https://anaconda.org/conda-forge/esmvaltool) ![stand with Ukraine](https://badgen.net/badge/stand%20with/UKRAINE/?color=0057B8&labelColor=FFD700) ![esmvaltoollogo](https://github.com/ESMValGroup/ESMValTool/blob/main/doc/sphinx/source/figures/ESMValTool-logo-2.png) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 76f00aecc3..9ac3561647 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -1,92 +1,97 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: b7391e4378e8c483e856a7850fe9719f49c297286a7ebd1205f11d55c62a646b +# input_hash: 826fecacc72904416b8197dfed6eab249c660fb442332bcb060043d64426d1aa @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-cpu_0.tar.bz2#23b8f98a355030331f40d0245492f715 https://conda.anaconda.org/conda-forge/noarch/_r-mutex-1.0.1-anacondar_1.tar.bz2#19f9db5f4f1b7f5ef5f6d67207f25f38 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2022.6.15.1-ha878542_0.tar.bz2#2be128ae4d5e44803720d43644ce3e3e +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 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/kernel-headers_linux-64-2.6.32-he073ed8_15.tar.bz2#5dd5127afd710f91f6a75821bac0a4f0 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.36.1-hea4e1c9_2.tar.bz2#bd4f2e711b39af170e7ff15163fe87ee -https://conda.anaconda.org/conda-forge/linux-64/libgcc-devel_linux-64-12.1.0-h1ec3361_16.tar.bz2#0e6ab30ea5307e18bff4689958b51b83 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.1.0-hdcd56e2_16.tar.bz2#b02605b875559ff99f04351fd5040760 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-devel_linux-64-12.1.0-h1ec3361_16.tar.bz2#db535a3c3b757e1d34e6b031a111f029 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.1.0-ha89aaad_16.tar.bz2#6f5ba041a41eb102a1027d9e68731be7 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-devel_linux-64-12.2.0-h3b97bd3_19.tar.bz2#199a7292b1d3535376ecf7670c231d1f +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-devel_linux-64-12.2.0-h3b97bd3_19.tar.bz2#277d373b57791ee71cafc3c5bfcf0641 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-mpich.tar.bz2#c1fcff3417b5a22bbc4cf6e8c23648cf -https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.11-hd8ed1ab_0.tar.bz2#abc27381c4f005da588cffa1f76403ee -https://conda.anaconda.org/conda-forge/noarch/tzdata-2022c-h191b570_0.tar.bz2#a56386ad31a7322940dd7d03fb3a9979 +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.10-3_cp310.conda#4eb33d14d794b0f4be116443ffed3853 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda#51fc4fcfb19f5d95ffc8c339db5068e8 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/libgfortran-ng-12.1.0-h69a702a_16.tar.bz2#6bf15e29a20f614b18ae89368260d0a2 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.1.0-h8d9b700_16.tar.bz2#f013cf7749536ce43d82afbffdf499ab +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-12.2.0-h69a702a_19.tar.bz2#cd7a806282c16e1f2d39a7e80d3a3e0d +https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.2.0-h65d4601_19.tar.bz2#cedcee7c064c01c403f962c9e8d3c373 https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.12-he073ed8_15.tar.bz2#66c192522eacf5bb763568b4e415d133 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.36.1-h193b22a_2.tar.bz2#32aae4265554a47ea77f7c09f86aeb3b +https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-hf600244_0.conda#33084421a8c0af6aef1b439707f7662a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-12.1.0-h8d9b700_16.tar.bz2#4f05bc9844f7c101e6e147dab3c88d5c -https://conda.anaconda.org/conda-forge/linux-64/aom-3.4.0-h27087fc_1.tar.bz2#2c106206f789e598ae86e775c69bd78f +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-12.2.0-h65d4601_19.tar.bz2#e4c94f80aef025c17ab0828cd85ef535 +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.5-h166bdaf_0.tar.bz2#5590453a8d072c9c89bfa26fcf88d870 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2#f26ef8098fab1f719c91eb760d63381a https://conda.anaconda.org/conda-forge/linux-64/charls-2.3.4-h9c3ff4c_0.tar.bz2#c3f85a96a52befc5e41cab1145c8d3c2 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.0.0-h166bdaf_1.tar.bz2#e890928299fe7242a108850fc0a5b7fc -https://conda.anaconda.org/conda-forge/linux-64/expat-2.4.8-h27087fc_0.tar.bz2#e1b07832504eeba765d648389cc387a9 -https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf0379b8_105.tar.bz2#9d3e01547ba04a57372beee01158096f +https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-h27087fc_0.tar.bz2#c4fbad8d4bddeb3c085f18cbf97fbfad +https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf0379b8_106.conda#d7407e695358f068a2a7f8295cde0567 https://conda.anaconda.org/conda-forge/linux-64/freexl-1.0.6-h166bdaf_1.tar.bz2#897e772a157faf3330d72dd291486f62 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.0-h27087fc_0.tar.bz2#a583d0bc9a85c48e8b07a588d1ac8a80 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.1-h27087fc_0.tar.bz2#917b9a50001fffdd89b321b5dba31e55 +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 +https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-he1b5a44_1004.tar.bz2#cddaf2c63ea4a5901cf09524c490ecdc https://conda.anaconda.org/conda-forge/linux-64/ghostscript-9.54.0-h27087fc_2.tar.bz2#c3b35ac18d09ffc8d46064fb09a696af -https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h36c2ea0_2.tar.bz2#626e68ae9cc5912d6adb79d318cf962d +https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda#96f3b11872ef6fad973eac856cd2624f https://conda.anaconda.org/conda-forge/linux-64/gmp-6.2.1-h58526e2_0.tar.bz2#b94cf2db16066b242ebd26db2facbd56 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf -https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h166bdaf_2.tar.bz2#ee8b844357a0946870901c7c6f418268 +https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h0b41bf4_3.conda#c7a069243e1fbe9a556ed2ec030e6407 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/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/libaec-1.0.6-h9c3ff4c_0.tar.bz2#c77f5e4e418fa47d699d6afa54c5d444 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_7.tar.bz2#f82dc1c78bcf73583f2656433ce2933c -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.13-h166bdaf_0.tar.bz2#4b5bee2e957570197327d0b20a718891 +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20220623.0-cxx17_h05df665_6.conda#39f6394ae835f0b16f01cbbd3bb1e8e2 +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 +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.14-h166bdaf_0.tar.bz2#fc84a0446e4e4fb882e78d786cfb9734 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 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/libglu-9.0.0-he1b5a44_1001.tar.bz2#8208602aec4826053c116552369a394c -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.16-h516909a_0.tar.bz2#5c0f338a513a2943c659ae619fca9211 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.21-pthreads_h44c56fb_3.tar.bz2#47b4dacc90390eaf2ba541470a88b0c1 -https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-12.1.0-ha89aaad_16.tar.bz2#72d63459c86185f8f636772f28d6eb35 -https://conda.anaconda.org/conda-forge/linux-64/libtool-2.4.6-h9c3ff4c_1008.tar.bz2#16e143a1ed4b4fd169536373957f6fee +https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-12.2.0-h46fd767_19.tar.bz2#80d0e00150401e9c06a055f36e8e73f2 +https://conda.anaconda.org/conda-forge/linux-64/libtool-2.4.7-h27087fc_0.conda#f204c8ba400ec475452737094fb81d52 https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2#a730b2badd586580c5752cc73842e068 -https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.7.0-h7f98852_0.tar.bz2#913570ed14b42cf48ccbba364af20302 +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.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 -https://conda.anaconda.org/conda-forge/linux-64/libxgboost-1.6.2-cpu_ha3b9936_0.tar.bz2#4f2926571f4953c11cd5f6486768ac22 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.12-h166bdaf_2.tar.bz2#8302381297332ea50532cf2c67961080 +https://conda.anaconda.org/conda-forge/linux-64/libxgboost-1.7.4-cpu_h6e95104_0.conda#fc088970f9b7164fae21d798fe05b198 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 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.3-h9c3ff4c_1.tar.bz2#fbe97e8fa6f275d7c76a09e795adc3e6 +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/make-4.3-hd18ef5c_1.tar.bz2#4049ebfd3190b580dffe76daed26155a -https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.2.1-h27087fc_0.tar.bz2#79c3ab4506f532fbb3d65ede9d24c515 +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-h58526e2_1006.tar.bz2#d099b812378b1e133c12e3b75167d83a -https://conda.anaconda.org/conda-forge/linux-64/mpich-4.0.2-h846660c_100.tar.bz2#36a36fe04b932d4b327e7e81c5c43696 +https://conda.anaconda.org/conda-forge/linux-64/mpich-4.0.3-h846660c_100.tar.bz2#50d66bb751cfa71ee2a48b2d3eb90ac1 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 -https://conda.anaconda.org/conda-forge/linux-64/nspr-4.32-h9c3ff4c_1.tar.bz2#29ded371806431b0499aaee146abfc3e -https://conda.anaconda.org/conda-forge/linux-64/openlibm-0.7.5-h7f98852_0.tar.bz2#1d62208586da96232892e9dbd7e0227b -https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1q-h166bdaf_0.tar.bz2#07acc367c7fc8b716770cd5b36d31717 +https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 +https://conda.anaconda.org/conda-forge/linux-64/openlibm-0.8.1-h7f98852_0.tar.bz2#ba0c56761f2380babaa783b2a37b4d08 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.0-h0b41bf4_0.conda#2d833be81a21128e317325a01326d36f https://conda.anaconda.org/conda-forge/linux-64/ossuuid-1.6.2-hf484d3e_1000.tar.bz2#0ca24876ead80a9290d3936aea5fefb1 https://conda.anaconda.org/conda-forge/linux-64/p7zip-16.02-h9c3ff4c_1001.tar.bz2#941066943c0cac69d5aa52189451aa5f -https://conda.anaconda.org/conda-forge/linux-64/pcre-8.45-h9c3ff4c_0.tar.bz2#c05d1820a6d34ff07aaaab7a9b7eddaa https://conda.anaconda.org/conda-forge/linux-64/pixman-0.40.0-h36c2ea0_0.tar.bz2#660e72c82f2e75a6b3fe6a6e75c79f19 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/re2-2022.06.01-h27087fc_1.conda#68070cd09c67755f37e0db13f00a008b 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.9-hbd366e4_1.tar.bz2#418adb239781d9690afc6b1a05514c37 -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.5.0-h924138e_2.tar.bz2#e8220da90a56e361dcf759424917af34 -https://conda.anaconda.org/conda-forge/linux-64/tzcode-2022c-h166bdaf_0.tar.bz2#a0be56f9d718761f7efb1d67af7a1456 +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-2022g-h166bdaf_0.conda#229620ecbc0bf2f9f04b888fd3478f79 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.0.10-h7f98852_0.tar.bz2#d6b0b50b49eccfe0be0373be628be0f3 @@ -94,123 +99,146 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.9-h7f98852_0.tar https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 https://conda.anaconda.org/conda-forge/linux-64/xorg-makedepend-1.0.6-h27087fc_2.tar.bz2#d86b2cd22e63b0cb9a3c57f934783103 https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h7f98852_1002.tar.bz2#1e15f6ad85a7d743a2ac68dae6c82b98 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.0-h7f98852_3.tar.bz2#52402c791f35e414e704b7a113f99605 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 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-h27087fc_1.tar.bz2#a60ee11012a722ff8a71ce8c3032c6c0 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.0.6-h166bdaf_0.tar.bz2#8650e4fb44c4a618e5ab3e1e19607e32 -https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-12.1.0-hea43390_16.tar.bz2#8db926c5e0250835beca6557221b600b -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.19.8.1-h73d1719_1008.tar.bz2#af49250eca8e139378f8ff0ae9e57251 -https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_4.tar.bz2#dd3e1941dd06f64cb88647d2f7ff8aaa -https://conda.anaconda.org/conda-forge/linux-64/libavif-0.10.1-h166bdaf_1.tar.bz2#22e524a34f7289934afbcf3083038fd0 +https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.0-h27087fc_3.tar.bz2#0428af0510c3fafedf1c66b43102a34b +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.5.20-hff2c3d7_3.tar.bz2#afc84c17eb855bfe13a20ee603230235 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.16-hf5f93bc_0.tar.bz2#d279191a7bbce623d5087e0b1883cfb1 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.7-hf5f93bc_0.tar.bz2#772dcd299af4757edd9f4da140849cf2 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.14-h6027aba_0.conda#4960e03c8b6447aebc484f5a3c340180 +https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-12.2.0-hcc96c02_19.tar.bz2#bb48ea333c8e6dcc159a1575f04d869e +https://conda.anaconda.org/conda-forge/linux-64/glog-0.6.0-h6f12383_0.tar.bz2#b31f3565cb84435407594e548a2fb7b2 +https://conda.anaconda.org/conda-forge/linux-64/libavif-0.11.1-h5cdd6b5_0.tar.bz2#2040f9067e8852606208cafa66c3563f https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_7.tar.bz2#37a460703214d0d1b421e2a47eb5e6d0 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_7.tar.bz2#785a9296ea478eb78c47593c4da6550f +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-hdcd2b5c_1.tar.bz2#6fe9e31c2b8d0b022626ccac13e6ca3c -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.37-h753d276_4.tar.bz2#6b611734b73d639c084ac4be2fcd996a -https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hf730bdb_11.tar.bz2#13b2138ccfbd9821fe13ee0cb7471c03 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.39.3-h753d276_0.tar.bz2#ccb2457c73609f2622b8a4b3e42e5d8b -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-haa6b8db_3.tar.bz2#89acee135f0809a18a1f4537390aa2dd +https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.10-h28343ad_4.tar.bz2#4a049fc560e00e43151dc51368915fdd +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e +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-3.21.12-h3eb15da_0.conda#4b36c68184c6c85d88c6e595a32a1ede +https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-ha49c73b_12.tar.bz2#d2047c6de84b07a1db9cbe1683939956 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar.bz2#2e5f9a37d487e1019fd4d8113adb2f9f +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.9.14-h22db469_4.tar.bz2#aced7c1f4b4dbfea08e033c6ae97c53e -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc869a4a_1.tar.bz2#7a268cf1386d271e576e35ae82149ef2 -https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.1.0-h9202a9a_1.tar.bz2#ea9ebeddb066da8fad4a815e61b139be +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hca2bb57_4.conda#bb808b654bdc3c783deaf107a2ffb503 +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf +https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.0-hb012696_0.conda#14d87bdff2cbd3b1179a29fb316ed743 https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.21-pthreads_h3d04fff_3.tar.bz2#74538be2eb8238bbbda7ad5b23fd5a19 -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.37-hc3806b6_1.tar.bz2#dfd26f27a9d5de96cec1d007b9aeb964 +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-2_h7f98852_perl5.tar.bz2#09ba115862623f00962e9809ea248f1a https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.30-h3358134_0.conda#e8b48ce0f01d5182d400f4f822842fa9 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 -https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.3-h55805fa_5.tar.bz2#ec43d75a461c31b82f554632fbed8b53 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-hd9c2040_1000.tar.bz2#9e856f78d5c80d5a78f61e72d1d473a3 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.12-h166bdaf_2.tar.bz2#4533821485cde83ab12ff3d8bda83768 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h6239696_4.tar.bz2#adcf0be7897e73e312bd24353b613f74 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.1-h83bc5f7_3.tar.bz2#37baca23e60af4130cfc03e8ab9f8e22 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.11-h4f448d1_2.conda#b0eba50cc9096cd035e7978d4a2f9eda +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.3-hafa529b_0.conda#bcf0664a2dbbbb86cbd4c1e6ff10ddd6 https://conda.anaconda.org/conda-forge/linux-64/boost-cpp-1.78.0-h75c5d50_1.tar.bz2#accc1f1ca33809bbf9ad067a0a69e236 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_7.tar.bz2#1699c1211d56a23c66047524cd76796e +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 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.3.1-h7a311fb_0.tar.bz2#dcab5cdf21ccd036d969b9b76274787a -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_0.tar.bz2#4e54cbfc47b8c74c2ecc1e7730d8edce -https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-12.1.0-h1db8e46_16.tar.bz2#ef716bdedf23c9088ae8394a9322d52a -https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-12.1.0-hea43390_16.tar.bz2#f64e7c4aad2bf9d75ef1849ba12d550e -https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-hca1e490_1001.tar.bz2#87ede2169e3a7050c23a8c7d99200b2b -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.3-h3790be6_0.tar.bz2#7d862b05445123144bec92cb1acc8ef8 +https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.7.1-hf91038e_0.conda#3a19cba20d395f47b60b13251eb4e267 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 +https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-12.2.0-h55be85b_19.tar.bz2#143d770a2a2911cd84b98286db0e6a40 +https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-12.2.0-hcc96c02_19.tar.bz2#698aae34e4f5e0ea8eac0d529c8f20b6 +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_5.tar.bz2#ee08782aff2ff9b3291c967fa6bc7336 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.3-h08a2579_0.tar.bz2#d25e05e7ee0e302b52d24491db4891eb https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_openblas.tar.bz2#20bae26d0a1db73f758fc3754cab4719 -https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.5.0-h6529ace_0.tar.bz2#463736fc66751c493b311befebe49e19 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.72.1-h2d90d5f_0.tar.bz2#ebeadbb5fbc44052eeb6f96a2136e3c2 +https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.5.1-h1f77430_0.conda#16802fd0c80290248ea79a570bd83b95 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.74.1-h606061b_1.tar.bz2#ed5349aa96776e00b34eccecf4a948fe +https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.51.1-h30feacc_0.conda#9eae4dc6fb0a91b026d4e419f0450737 +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.0-hd6dc26d_0.conda#ab9d052373c9376c0ebcff4dfef3d296 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openblas.tar.bz2#955d993f41f9354bf753d29864ea20ad -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.4.0-h0e0dad5_3.tar.bz2#5627d42c13a9b117ae1701c6e195624f -https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.35-h8affb1d_0.tar.bz2#355e2a7295d76f3f7e7a18274c097dc2 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.39.3-h4ff8645_0.tar.bz2#f03cf4ec974e32b6c5d349f62637e36e +https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.16.0-he500d00_2.tar.bz2#0e169728f52de7bcf5ffdbbdd9075e1a +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.4.0-h82bc61c_5.conda#e712a63a21f9db647982971dc121cdcf +https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.37-h873f0b0_0.tar.bz2#ed0d77d947ddeb974892de8df7224d12 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.89-he45b914_0.conda#2745719a58eeaab6657256a3f142f099 +https://conda.anaconda.org/conda-forge/linux-64/orc-1.8.2-hfdbbad2_2.conda#3a7319406d88f6ad2242f29e835ac707 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.9-he550d4f_0_cpython.conda#3cb3e91b3fe66baa68a12c85f39b9b40 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-hb7b940f_3.tar.bz2#ea4d0879e40211fa26f38d8986db1bbe -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.7.2-h7f98852_0.tar.bz2#12a61e640b8894504326aadafccbb790 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.4-h0b41bf4_0.conda#ea8fbfeb976ac49cbeb594e985393514 +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/linux-64/antlr-python-runtime-4.7.2-py310hff52083_1003.tar.bz2#8324f8fff866055d4b32eb25e091fe31 https://conda.anaconda.org/conda-forge/linux-64/arpack-3.7.0-hdefa2d7_2.tar.bz2#8763fe86163198ef1778d1d8d22bb078 -https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.36.0-h3371d22_4.tar.bz2#661e1ed5d92552785d9f8c781ce68685 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_7.tar.bz2#3889dec08a472eb0f423e5609c76bde1 -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.0-hc2a2eb6_1.tar.bz2#139ace7da04f011abbd531cb2a9840ee -https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.8-hff1cb4f_0.tar.bz2#908fc30f89e27817d835b45f865536d7 -https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de -https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.12-hddcbb42_0.tar.bz2#797117394a4aa588de6d741b06fad80f -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.83.1-h7bff187_0.tar.bz2#d0c278476dba3b29ee13203784672ab1 -https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h37653c0_1015.tar.bz2#37d3747dd24d604f63d2610910576e63 -https://conda.anaconda.org/conda-forge/linux-64/libpq-14.5-hd77ab85_0.tar.bz2#d3126b425a04ed2360da1e651cef1b2d -https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h522a892_0.tar.bz2#802e43f480122a85ae6a34c1909f8f98 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.78-h2350873_0.tar.bz2#ab3df39f96742e6f1a9878b09274c1dc -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h7d73246_1.tar.bz2#a11b4df9271a8d7917686725aa04c8f2 -https://conda.anaconda.org/conda-forge/linux-64/python-3.9.13-h9a8a25e_0_cpython.tar.bz2#69bc307cc4d7396c5fccb26bbcc9c379 -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/xorg-libxext-1.3.4-h7f98852_1.tar.bz2#536cc5db4d0a3ba0630541aec064b5e4 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.10-h7f98852_1003.tar.bz2#f59c1242cc1dd93e72c2ee2b360979eb -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.2.1-h7f98852_2.tar.bz2#60d6eec5273f1c9af096c10c268912e3 -https://conda.anaconda.org/conda-forge/noarch/affine-2.3.1-pyhd8ed1ab_0.tar.bz2#466dc5c1b75c93180efbd81d99dc29b0 -https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.12-py_0.tar.bz2#2489a97287f90176ecdc3ca982b4b0a0 -https://conda.anaconda.org/conda-forge/noarch/attrs-22.1.0-pyh71513ae_1.tar.bz2#6d3ccbc56256204925bfa8378722792f -https://conda.anaconda.org/conda-forge/noarch/backports-1.0-py_2.tar.bz2#0da16b293affa6ac31812376f8eb79dd -https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-ha61ee94_1013.tar.bz2#148e1893454972ac8c595c98c7b8ed5c -https://conda.anaconda.org/conda-forge/noarch/certifi-2022.6.15.1-pyhd8ed1ab_0.tar.bz2#a7fa4e45a097ccca6b097f097800a7f6 +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-22.2.0-pyh71513ae_0.conda#8b76db7818a4e401ed4486c4c1635cd9 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.2.16-h52dae97_0.conda#90cf005da709e2f8d37aec7df0ec799e +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.6.29-hf21410f_0.conda#a748403b26a0ac6b09c860972927f5d3 +https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py310hff52083_7.tar.bz2#02d7c823f5e6fd4bbe5562c612465aed +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 +https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c -https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.1.0-hd9d235c_0.tar.bz2#ebc04a148d7204bb428f8633b89fd3dd https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.0-pyhd8ed1ab_0.tar.bz2#a6cf47b09786423200d7982d1faa19eb -https://conda.anaconda.org/conda-forge/noarch/codespell-2.2.1-pyhd8ed1ab_0.tar.bz2#a24b7054d0592159d19af7a37bdd7776 -https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.5-pyhd8ed1ab_0.tar.bz2#c267da48ce208905d7d976d49dfd9433 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 +https://conda.anaconda.org/conda-forge/noarch/codespell-2.2.4-pyhd8ed1ab_0.conda#27996543252c93207e54bb35daf80998 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/config-0.5.1-pyhd8ed1ab_0.tar.bz2#97275d4898af65967b1ad57923cef770 https://conda.anaconda.org/conda-forge/noarch/configargparse-1.5.3-pyhd8ed1ab_0.tar.bz2#318b72c3c2dfca9aebdbaf258609d02d -https://conda.anaconda.org/conda-forge/linux-64/curl-7.83.1-h7bff187_0.tar.bz2#ba33b9995f5e691e4f439422d6efafc7 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb +https://conda.anaconda.org/conda-forge/linux-64/cython-0.29.33-py310heca2aa9_0.conda#7a7b4577321717dd37c6a7fcf04c01aa 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.5.1-pyhd8ed1ab_0.tar.bz2#d713e993cf5e84bfe522ca1520b095b3 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.5-pyhd8ed1ab_0.tar.bz2#f15c3912378a07726093cc94d1e13251 +https://conda.anaconda.org/conda-forge/noarch/dill-0.3.6-pyhd8ed1ab_1.tar.bz2#88c82ca702197fff8a5e87619707556b +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.6-pyhd8ed1ab_0.tar.bz2#b65b4d50dbd2d50fa0aeac367ec9eed7 +https://conda.anaconda.org/conda-forge/linux-64/docutils-0.18.1-py310hff52083_1.tar.bz2#6405f87c427cdbc25b6b6a21bd6bfc2a 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/et_xmlfile-1.0.1-py_1001.tar.bz2#2ca571121f480d1c2b90782463924873 +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.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2#0e521f7a5e60d508b121d38b04874fb2 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.8.0-pyhd8ed1ab_0.tar.bz2#10f0218dbd493ab2e5dc6759ddea4526 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2022.8.2-pyhd8ed1ab_0.tar.bz2#140dc6615896e7d4be1059a63370be93 +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.10.0-pyhd8ed1ab_0.conda#6f90f1dc834447823b11d155726fcb37 +https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a +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.3.3-py310h5764c6d_0.tar.bz2#25e1626333f9a0646579a162e7b174ee +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.8-hff1cb4f_1.tar.bz2#a61c6312192e7c9de71548a6706a21e6 https://conda.anaconda.org/conda-forge/noarch/geographiclib-1.52-pyhd8ed1ab_0.tar.bz2#6880e7100ebae550a33ce26663316d85 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-mpi_mpich_h08b82f9_0.tar.bz2#de601caacbaa828d845f758e07e3b85e +https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de +https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 +https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-hb955811_1002.conda#2711b92eab8e4abf782a12c87259f2dc https://conda.anaconda.org/conda-forge/noarch/heapdict-1.0.1-py_0.tar.bz2#77242bfb1e74a627fb06319b5a2d3b95 -https://conda.anaconda.org/conda-forge/noarch/idna-3.3-pyhd8ed1ab_0.tar.bz2#40b50b8b030f5f2f22085c062ed013dd +https://conda.anaconda.org/conda-forge/linux-64/humanfriendly-10.0-py310hff52083_4.tar.bz2#43bd27c73e9e3b0bc508217ae409798f +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 -https://conda.anaconda.org/conda-forge/noarch/iniconfig-1.1.1-pyh9f0ad1d_0.tar.bz2#39161f81cc5e5ca45b8226fbb06c6905 -https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h18fbbfe_3.tar.bz2#ea9758cf553476ddf75c789fdd239dc5 -https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyh9f0ad1d_0.tar.bz2#b66e5cbd62ab93000794d7bb9cb985b5 +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.4-py310hbf28c38_1.tar.bz2#ad5647e517ba68e2868ef2e6e6ff7723 +https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.9.0-py310h1fa729e_0.conda#8664f43451412071a7111211fe7e38f2 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-h6ed2654_0.tar.bz2#dcc588839de1445d90995a0a2c4f3a39 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.86.0-h2283fc2_1.tar.bz2#fdca8cd67ec2676f90a70ac73a32538b +https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h37653c0_1015.tar.bz2#37d3747dd24d604f63d2610910576e63 +https://conda.anaconda.org/conda-forge/linux-64/libpq-15.1-h67c24c5_1.conda#e1389a8d9a907133b3e6483c2807d243 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h522a892_0.tar.bz2#802e43f480122a85ae6a34c1909f8f98 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.2-py310hbdc0903_0.conda#543906a26651f10c6180ca71fc4d48f2 +https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.2-py310h0cfdcf0_0.conda#29674148bef03cc0355e81cd069fa047 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py310h1fa729e_0.conda#a1f0db6709778b77b5903541eeac4032 https://conda.anaconda.org/conda-forge/noarch/mccabe-0.6.1-py_1.tar.bz2#a326cb400c1ccd91789f3e7d02124d61 +https://conda.anaconda.org/conda-forge/linux-64/mpi4py-3.1.4-py310h37cc914_0.tar.bz2#98d598d9178d7f3091212c61c0be693c +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.5-py310hdf3cbec_0.conda#5311a49aaea44b73935c84a6d9a68e5f +https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.4-py310h1fa729e_0.conda#b33287be963a70f8fb4b143b4561ba62 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/natsort-8.2.0-pyhd8ed1ab_0.tar.bz2#a8b2456513ed910ef418021afc5150bb -https://conda.anaconda.org/conda-forge/noarch/networkx-2.8.6-pyhd8ed1ab_0.tar.bz2#52243eec8c5b9d22924d1c463b01a1d8 -https://conda.anaconda.org/conda-forge/noarch/pathspec-0.10.1-pyhd8ed1ab_0.tar.bz2#2357d88e11ea38523d50b9e2fc98dfcf -https://conda.anaconda.org/conda-forge/noarch/platformdirs-2.5.2-pyhd8ed1ab_1.tar.bz2#2fb3f88922e7aec26ba652fcdfe13950 -https://conda.anaconda.org/conda-forge/linux-64/postgresql-14.5-hfdbbde3_0.tar.bz2#0930cb504b0f86546026d3c2651c92c8 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.0.1-h93bde94_1.tar.bz2#8259528ea471b0963a91ce174f002e55 +https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 +https://conda.anaconda.org/conda-forge/noarch/natsort-8.3.1-pyhd8ed1ab_0.conda#8c53149aa69bfeb045f28c92a2b2ddc7 +https://conda.anaconda.org/conda-forge/noarch/networkx-3.0-pyhd8ed1ab_0.conda#88e40007414ea9a13f8df20fcffa87e2 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py310h8deb116_0.conda#b7085457309e206174b8e234d90a7605 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h7d73246_1.tar.bz2#a11b4df9271a8d7917686725aa04c8f2 +https://conda.anaconda.org/conda-forge/noarch/packaging-23.0-pyhd8ed1ab_0.conda#1ff2e3ca41f0ce16afec7190db28288b +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.11.1-pyhd8ed1ab_0.conda#dbb80d1e8dc2dba5c8b106dc0768ad45 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2#7d301a0d25f424d96175f810935f0da9 +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.4-py310h5764c6d_0.tar.bz2#c3c55664e9becc48e6a652e2b641961f https://conda.anaconda.org/conda-forge/noarch/py-1.11.0-pyh6c4a22f_0.tar.bz2#b4613d7e7a493916d867842a6a148054 https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.8.0-pyhd8ed1ab_0.tar.bz2#f2532eee272d45b1283ea4869d71f044 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff @@ -218,340 +246,374 @@ https://conda.anaconda.org/conda-forge/noarch/pyflakes-2.4.0-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc 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-utils-3.3.3-pyhd8ed1ab_0.tar.bz2#1bcd0d111c11bc223eee59c650465488 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-2_cp39.tar.bz2#39adde4247484de2bb4000122fdcf665 -https://conda.anaconda.org/conda-forge/noarch/pytz-2022.2.1-pyhd8ed1ab_0.tar.bz2#974bca71d00364630f63f31fa7e059cb +https://conda.anaconda.org/conda-forge/noarch/python-utils-3.5.2-pyhd8ed1ab_0.conda#1bf147abc7440e5a1193457dd6322424 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py310h1fa729e_0.conda#8d155ac95b1dfe585bcb6bec6a91c73b +https://conda.anaconda.org/conda-forge/noarch/pytz-2022.7.1-pyhd8ed1ab_0.conda#f59d49a7b464901cf714b9e7984d01a2 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py310h5764c6d_5.tar.bz2#9e68d2ff6d98737c855b65f48dd3c597 +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py310h1fa729e_1.conda#2f9b517412af46255cef5e53a22c264e 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-65.3.0-pyhd8ed1ab_1.tar.bz2#a64c8af7be7a6348c1d9e530f88fa4da +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.0-pyhd8ed1ab_0.conda#e18ed61c37145bb9b48d1d98801960f7 +https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.18.4-py310h1fa729e_0.conda#618fca049b35698ef451189b83d3b5b7 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.2-py_0.tar.bz2#20b2eaeaeea4ef9a9a0d99770620fd09 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda#5a31a7d564f551d0e6dff52fd8cb5b16 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2#68e01cac9d38d0e717cd5c87bc3d2cc9 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.0-pyhd8ed1ab_0.tar.bz2#77dad82eb9c8c1525ff7953e0756d708 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8ed1ab_0.conda#6c8c4d6eb2325e59290ac6dbbeacd5f0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.tar.bz2#67cd9d9c0382d37479b4d306c369a2d4 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2#d01180388e6d1838c3e1ad029590aa7a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2#9ff55a0901cf952f05c654394de76bf7 -https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.4.2-pyhd8ed1ab_0.tar.bz2#25ba7b3dfd098e438d621c888ebb0519 +https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.4.3-pyhd8ed1ab_0.tar.bz2#d008e81907166f6dacea7e34292e79c6 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.8.0-hf52228f_0.conda#b4188d0c54ead87b3c6bc9cb07281f40 https://conda.anaconda.org/conda-forge/noarch/tblib-1.7.0-pyhd8ed1ab_0.tar.bz2#3d4afc31302aa7be471feb6be048ed76 -https://conda.anaconda.org/conda-forge/noarch/tenacity-8.0.1-pyhd8ed1ab_0.tar.bz2#8b29b2c12cb21dbd057755e5fd22d005 -https://conda.anaconda.org/conda-forge/noarch/termcolor-1.1.0-pyhd8ed1ab_3.tar.bz2#2a28d2137388d7c6a903f29319f262bc +https://conda.anaconda.org/conda-forge/noarch/tenacity-8.2.2-pyhd8ed1ab_0.conda#7b39e842b52966a99e229739cd4dc36e +https://conda.anaconda.org/conda-forge/noarch/termcolor-2.2.0-pyhd8ed1ab_0.conda#778f524c3d149577a6e873264d85ec68 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.1.0-pyh8a188c0_0.tar.bz2#a2995ee828f65687ac5b1e71a2ab1e0c 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/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.2-py310h5764c6d_1.tar.bz2#be4a201ac582c11d89ed7d15b3157cc3 +https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2023.3.9-pyhd8ed1ab_0.conda#e3cd3d5085a3a7488c9e4709628d87d8 https://conda.anaconda.org/conda-forge/noarch/typing-3.10.0.0-pyhd8ed1ab_0.tar.bz2#e6573ac68718f17b9d4f5c8eda3190f2 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.3.0-pyha770c72_0.tar.bz2#a9d85960bc62d53cc4ea0d1d27f73c98 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.5.0-pyha770c72_0.conda#43e7d9e50261fb11deb76e17d8431aac +https://conda.anaconda.org/conda-forge/linux-64/ujson-5.7.0-py310heca2aa9_0.conda#f62834fdbfc4df6f33517b0672aa9206 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py310h5764c6d_0.tar.bz2#e972c5a1f472561cf4a91962cb01f4b4 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-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 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.37.1-pyhd8ed1ab_0.tar.bz2#1ca02aaf78d9c70d9a81a3bed5752022 -https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.0.3-pyhd8ed1ab_0.tar.bz2#ef3249d0fc653f710a5933f08b89ab24 -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.13-h7f98852_0.tar.bz2#2bbe4b67a97c9d18a807598941fc3b4c +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.15.0-py310h1fa729e_0.conda#cbfdcc9c243ac7f080cf60833b482f97 +https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.0.9-pyhd8ed1ab_0.conda#d00d8a5adb3785fd41538c306797002a +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.10-h7f98852_1003.tar.bz2#f59c1242cc1dd93e72c2ee2b360979eb +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.2.1-h7f98852_2.tar.bz2#60d6eec5273f1c9af096c10c268912e3 https://conda.anaconda.org/conda-forge/noarch/yapf-0.32.0-pyhd8ed1ab_0.tar.bz2#177cba0b4bdfacad5c5fbb0ed31504c4 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.8.1-pyhd8ed1ab_0.tar.bz2#a3508a0c850745b875de88aea4c40cc5 -https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py39hf3d152e_1003.tar.bz2#5e8330e806e50bd6137ebd125f4bc1bb -https://conda.anaconda.org/conda-forge/noarch/asgiref-3.5.2-pyhd8ed1ab_0.tar.bz2#cea70257c4c605a4417632ba6cb3a20a -https://conda.anaconda.org/conda-forge/noarch/babel-2.10.3-pyhd8ed1ab_0.tar.bz2#72f1c6d03109d7a70087bc1d029a8eda -https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py39hb9d737c_5.tar.bz2#f64cfd07a4a209fba3c4a65b34dc774e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_0.tar.bz2#61e961a94c8fd535e4496b17e7452dfe -https://conda.anaconda.org/conda-forge/linux-64/click-8.1.3-py39hf3d152e_0.tar.bz2#40edd9ebc04e4b4ec27c1008e5e3f99d -https://conda.anaconda.org/conda-forge/linux-64/coverage-6.4.4-py39hb9d737c_0.tar.bz2#1f6e78943263ae8698032fdc28504c5f -https://conda.anaconda.org/conda-forge/linux-64/cython-0.29.32-py39h5a03fae_0.tar.bz2#bb64bc0c1ce34178f21bed95a47576d6 -https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.0-py39hb9d737c_0.tar.bz2#26740ffa0bfc09bfee7dbe9d226577c9 -https://conda.anaconda.org/conda-forge/noarch/docformatter-1.5.0-pyhd8ed1ab_0.tar.bz2#0f65c1ff31bdb3b4fc0efbc6f9a145a9 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 +https://conda.anaconda.org/conda-forge/noarch/asgiref-3.6.0-pyhd8ed1ab_0.conda#4437fc8d76835df622027fe9ae7da997 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.6.21-h774e2f3_1.conda#1b604a086486a97c0338b2fe3e9f79ea +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.7.13-hefb3e95_10.conda#7cfd30505adc0a8f30aa45277840948b +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-ha61ee94_1014.tar.bz2#d1a88f3ed5b52e1024b80d4bcd26a7a0 +https://conda.anaconda.org/conda-forge/noarch/cattrs-22.2.0-pyhd8ed1ab_0.tar.bz2#5dacf4d924ae284579288e378b1f5943 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 +https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.2.0-hd9d235c_0.conda#8c57a9adbafd87f5eff842abde599cb4 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b +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/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py310hdf3cbec_0.conda#7bf9d8c765b6b04882c719509652c6d6 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.2.2-py310h1fa729e_0.conda#8750e87414347c0208b1b2e035aa6af2 +https://conda.anaconda.org/conda-forge/linux-64/curl-7.86.0-h2283fc2_1.tar.bz2#9d4149760567cb232691cce2d8ccc21f +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.0-py310h5764c6d_1.tar.bz2#fd18cd597d23b2b5ddde23bd5b7aec32 +https://conda.anaconda.org/conda-forge/noarch/docformatter-1.5.1-pyhd8ed1ab_0.conda#7a8356601d0a66eb83fb5178bde841bf https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a -https://conda.anaconda.org/conda-forge/linux-64/docutils-0.17.1-py39hf3d152e_2.tar.bz2#fea5dea40592ea943aa56f4935308ee4 +https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.0-py_0.tar.bz2#6e166cd37cfeadefcfca1ffe00f222bb https://conda.anaconda.org/conda-forge/noarch/fire-0.4.0-pyh44b312d_0.tar.bz2#0b83cbdfb7b4067ebb051292d360d7a6 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a -https://conda.anaconda.org/conda-forge/noarch/geopy-2.2.0-pyhd8ed1ab_0.tar.bz2#07259c829ac940ca470525a74d4b5eb1 -https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.1-h4fc65e6_3.tar.bz2#dc47fc3ed22615992f89effadd512988 -https://conda.anaconda.org/conda-forge/linux-64/git-2.37.3-pl5321h36853c3_0.tar.bz2#a84d39ce9a34295720b85bbddac14c02 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-5.1.0-hf9f4e7c_0.tar.bz2#7c1f73a8f7864a202b126d82e88ddffc -https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-hc2f950b_10.tar.bz2#9114b5a6c2ee542d3a31616c2aaed2ba -https://conda.anaconda.org/conda-forge/noarch/html5lib-1.1-pyh9f0ad1d_0.tar.bz2#b2355343d6315c892543200231d7154a -https://conda.anaconda.org/conda-forge/linux-64/humanfriendly-10.0-py39hf3d152e_2.tar.bz2#f67fbf5dd896aeac1e145638bd1a7abf -https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-4.11.4-py39hf3d152e_0.tar.bz2#4c2a0eabf0b8980b2c755646a6f750eb -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.9.0-pyhd8ed1ab_0.tar.bz2#393a52ae5450ac981a0b67c8175d61fa +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.2-py310h1fa729e_0.conda#3b354798e12b65fa8ebe1d189de6a507 +https://conda.anaconda.org/conda-forge/noarch/geopy-2.3.0-pyhd8ed1ab_0.tar.bz2#529faeecd6eee3a3b782566ddf05ce92 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-mpi_mpich_h5d83325_0.tar.bz2#6b5c2d276f306df759cfbdb0f41c4db9 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.1.0-pyha770c72_0.conda#30b3127c385ca2ed5ef87f3d53d466bc +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b 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.10.1-pyhd8ed1ab_0.tar.bz2#83df9ffefe1cc01d9e60405bf871bfdb -https://conda.anaconda.org/conda-forge/noarch/joblib-1.1.0-pyhd8ed1ab_0.tar.bz2#07d1b5c8cde14d95998fd4767e1e62d2 -https://conda.anaconda.org/conda-forge/linux-64/kealib-1.4.15-ha7026e8_1.tar.bz2#085b1e5ae7fa9a236f88a68eae65374e -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py39hf939315_0.tar.bz2#e8d1310648c189d6d11a2e13f73da1fe +https://conda.anaconda.org/conda-forge/noarch/isort-5.12.0-pyhd8ed1ab_1.conda#07ed3421bad60867234c7a9282ea39d4 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2#7583652522d71ad78ba536bba06940eb https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 -https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.7.1-py39hb9d737c_1.tar.bz2#77c153b40cf8829b854ef789190196df -https://conda.anaconda.org/conda-forge/linux-64/libdap4-3.20.6-hd7c4107_2.tar.bz2#c265ae57e3acdc891f3e2b93cf6784f5 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-mpi_mpich_h06c54e2_4.tar.bz2#491803a7356c6a668a84d71f491c4014 -https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.0.1-h38b5f51_18.tar.bz2#4d82b1ae736b9203cac4155b9965f0fa -https://conda.anaconda.org/conda-forge/linux-64/lxml-4.9.1-py39hb9d737c_0.tar.bz2#cd930b4bc576085ef2bcd00788599779 -https://conda.anaconda.org/conda-forge/linux-64/lz4-4.0.0-py39h029007f_2.tar.bz2#f7471ec2e3d4a017e789bd92eaeb807c -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py39hb9d737c_1.tar.bz2#7cda413e43b252044a270c2477031c5c -https://conda.anaconda.org/conda-forge/linux-64/mpi4py-3.1.3-py39h32b9844_2.tar.bz2#b809706525f081610469169b671b2600 -https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.4-py39hf939315_0.tar.bz2#35b4a1a56408657cd2c6ce7145c21ecf +https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h18fbbfe_3.tar.bz2#ea9758cf553476ddf75c789fdd239dc5 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.5.0-h21dfe5b_1.conda#af905d193c58a376621f09a21849d2c6 +https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b +https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 https://conda.anaconda.org/conda-forge/noarch/munch-2.5.0-py_0.tar.bz2#31d9e9be500e25ff0050bc9f57a6bcd7 -https://conda.anaconda.org/conda-forge/linux-64/mypy_extensions-0.4.3-py39hf3d152e_5.tar.bz2#fc7500ebc3299b6f4a66652fa83f627e 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.7.0-pyhd8ed1ab_0.tar.bz2#fbe1182f650c04513046d6894046cd6c -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.23.2-py39hba7629e_0.tar.bz2#25285f960f9c7f4e8ef56171af5e2a22 -https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.0.10-py39hb9d737c_1.tar.bz2#934a1745e084d37db55f677c67e79b1e -https://conda.anaconda.org/conda-forge/noarch/packaging-21.3-pyhd8ed1ab_0.tar.bz2#71f1ab2de48613876becddd496371c85 +https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.11.0-py310heca2aa9_1.conda#476b14f637de9e4e811d881a925e8936 +https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.1-py310h1fa729e_0.conda#0809ed095abd8fbc11bf38a1f2580acf https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 -https://conda.anaconda.org/conda-forge/linux-64/pillow-9.2.0-py39hd5dbb17_2.tar.bz2#3b74a959f6a8008f5901de60b3572c09 -https://conda.anaconda.org/conda-forge/noarch/pip-22.2.2-pyhd8ed1ab_0.tar.bz2#0b43abe4d3ee93e82742d37def53a836 -https://conda.anaconda.org/conda-forge/noarch/plotly-5.10.0-pyhd8ed1ab_0.tar.bz2#e95502aa0f8e3db05d198214472575de -https://conda.anaconda.org/conda-forge/linux-64/pluggy-1.0.0-py39hf3d152e_3.tar.bz2#c375c89340e563053f3656c7f134d265 -https://conda.anaconda.org/conda-forge/linux-64/poppler-22.04.0-h0733791_3.tar.bz2#74fe2fe238e0cdb31ec61427527a80d7 -https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.0.0-pyhd8ed1ab_0.tar.bz2#c5107786251db3803d318f1c4afa27e3 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.2-py39hb9d737c_0.tar.bz2#1e7ffe59e21862559e06b981817e5058 -https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.1.1-pyhd8ed1ab_0.tar.bz2#e417954a987d382b3142886726ab3aad -https://conda.anaconda.org/conda-forge/noarch/pygments-2.13.0-pyhd8ed1ab_0.tar.bz2#9f478e8eedd301008b5f395bad0caaed -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.0-py39hdcf6798_0.tar.bz2#18648adb862018566fd43a2b65a00d03 +https://conda.anaconda.org/conda-forge/linux-64/pillow-9.2.0-py310h454ad03_3.tar.bz2#eb354ff791f505b1d6f13f776359d88e +https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 +https://conda.anaconda.org/conda-forge/noarch/plotly-5.13.1-pyhd8ed1ab_0.conda#761501a3de96c5855d840f4287a65e77 +https://conda.anaconda.org/conda-forge/linux-64/postgresql-15.1-ha105346_1.conda#81cfa38baa2a8741f0566f8815fef4e3 +https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.2.0-pyhd8ed1ab_0.tar.bz2#d883564cf1e9ba190f6b285036c5f949 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.0-h93bde94_0.tar.bz2#255c7204dda39747c3ba380d28b026d7 +https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda#7e23a61a7fbaedfef6eb0e1ac775c8e5 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda#c78cd16b11cd6a295484bd6c8f24bea1 +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.2.2-pyhd8ed1ab_0.conda#60958b19354e0ec295b43f6ab5cfab86 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.0.0-py39hb9d737c_1.tar.bz2#9f71f72dad4fd7b9da7bcc2ba64505bc -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py39hb9d737c_4.tar.bz2#dcc47a3b751508507183d17e569805e5 +https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.2.post0-py310hde88566_3.tar.bz2#0b686f306a76fba9a61e7019f854321f +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py310h0a54255_0.conda#b9e952fe3f7528ab603d2776175ba8d2 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.clib-0.2.6-py39hb9d737c_1.tar.bz2#a0fabd69dd35bb24ec84d28dc01c3c5b -https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.17.6-py39hb9d737c_1.tar.bz2#3c6f32079c94695c56b7dcceab6cea2e -https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.11.1-h1e4a385_0.tar.bz2#9afb7e977d8d0e6ef140d705099a2d75 -https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.11.4-pyha770c72_0.tar.bz2#c57d6a6abb22c3796add680597ee0096 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.1-py39hb9d737c_3.tar.bz2#5e13a2d214ed4184969df363a1aab420 -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.64.1-pyhd8ed1ab_0.tar.bz2#5526ff3f88f9db87bb0924b9ce575345 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.3.0-hd8ed1ab_0.tar.bz2#f3e98e944832fb271a0dbda7b7771dc6 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-14.0.0-py39hb9d737c_1.tar.bz2#ef84376736d1e8a814ccb06d1d814e6f -https://conda.anaconda.org/conda-forge/linux-64/virtualenv-20.16.5-py39hf3d152e_0.tar.bz2#165e71a44187ac22e2e1669fd3ca2392 -https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.14.1-py39hb9d737c_0.tar.bz2#25a4f17bf308bc36a15ebe63c3864ac7 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.14-h7f98852_1.tar.bz2#45b68dc2fc7549c16044d533ceaf340e -https://conda.anaconda.org/conda-forge/noarch/zict-2.2.0-pyhd8ed1ab_0.tar.bz2#cd563d01df94e51f968645dbf3b310b0 -https://conda.anaconda.org/conda-forge/linux-64/astroid-2.12.9-py39hf3d152e_0.tar.bz2#e6dbda6fee23f5b0c828e96f4d6c9a48 -https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py39hb9d737c_1004.tar.bz2#05a99367d885ec9990f25e74128a8a08 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.1-py39hd257fcd_0.tar.bz2#0911339f31c5fa644c312e4b3af95ea5 -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/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-37.0.4-py39hd97740a_0.tar.bz2#edc3668e7b71657237f94cf25e286478 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2022.9.0-pyhd8ed1ab_0.tar.bz2#859607d7a80dc90039b3d94cfa2b1931 -https://conda.anaconda.org/conda-forge/linux-64/django-4.1.1-py39hf3d152e_0.tar.bz2#7f3bf62f72815056ad60c7378134fa96 -https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.0-py_0.tar.bz2#6e166cd37cfeadefcfca1ffe00f222bb -https://conda.anaconda.org/conda-forge/noarch/flake8-4.0.1-pyhd8ed1ab_2.tar.bz2#a824bd55ce47e9c637427f730c651231 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.37.1-py39hb9d737c_0.tar.bz2#b006086e249cf6d88758bff9b462f971 -https://conda.anaconda.org/conda-forge/noarch/funcargparse-0.2.5-pyhd8ed1ab_0.tar.bz2#e557b70d736251fa0bbb7c4497852a92 -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2022.8.8-py39h6e07900_4.tar.bz2#a4779aa0812de091a68f66e6045a60b9 -https://conda.anaconda.org/conda-forge/noarch/imageio-2.21.2-pyhfa7a67d_0.tar.bz2#9c1c105aa38d385fee3ac1f2f9dc2c1e -https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-ha77e612_0.tar.bz2#054883e8ea7142e89bcbec08b5d401ea -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/julia-1.8.0-h6f5dd7c_1.tar.bz2#2c24c8da20a798fd3e5f6915b79db6f7 -https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.5.1-hc23bfc3_5.tar.bz2#1cc6caf3944f0033ca291c0cfaa9a861 -https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b -https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.6-pyhd8ed1ab_0.tar.bz2#5eed8c0182e7decdc130b175370fce1d -https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.0-mpi_mpich_hd09bd1e_0.tar.bz2#247c70ce54beeb3e60def44061576821 -https://conda.anaconda.org/conda-forge/linux-64/pandas-1.4.4-py39h1832856_0.tar.bz2#6ef85649798519bd47dfc24e399b8dcd -https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.9-hc4f8a73_0.tar.bz2#b8e090dce29a036357552a009c770187 -https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba -https://conda.anaconda.org/conda-forge/noarch/pyroma-2.4-py_0.tar.bz2#3c11b81760aab791ca0999d69371693a -https://conda.anaconda.org/conda-forge/linux-64/pytest-7.1.3-py39hf3d152e_0.tar.bz2#b807481ba94ec32bc742f2fe775d0bff -https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.2.post0-py39hd257fcd_2.tar.bz2#644be766007a1dc7590c3277647f81a1 -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.3.0-py39hd257fcd_1.tar.bz2#c4b698994b2d8d2e659ae02202e6abe4 -https://conda.anaconda.org/conda-forge/noarch/rdflib-6.2.0-pyhd8ed1ab_0.tar.bz2#b9acd5fbaf467f7447746b1ecac50e83 -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.17.21-py39hb9d737c_1.tar.bz2#2b94cf785616198b112170b9838262a4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.9.1-py39h8ba3f38_0.tar.bz2#beed054d4979cd70690aea2b257a6d55 +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.17.21-py310h1fa729e_3.conda#97204ae92b703d74a983db0e6d07d009 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-1.8.4-py39h68ae834_0.tar.bz2#e871ee7de5bfa95095256e95e30be2a6 +https://conda.anaconda.org/conda-forge/linux-64/shapely-1.8.5-py310h5b266fc_2.tar.bz2#c4a3707d6a630facb6cf7ed8e0d37326 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.1.1-h75968e7_1.tar.bz2#5ef99dd6be591291bd33bec1204dca55 -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py39hf939315_2.tar.bz2#5a3bb9dc2fe08a4a6f2b61548a1431d6 +https://conda.anaconda.org/conda-forge/linux-64/suitesparse-5.10.1-h9e50725_1.tar.bz2#a3a685b5f9aeb890ed874502fe56accf +https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.11.6-pyha770c72_0.tar.bz2#471bf9e605820b59988e830382b8d654 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.65.0-pyhd8ed1ab_1.conda#ed792aff3acb977d09c7013358097f83 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 +https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 +https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.4-h55805fa_1.tar.bz2#d127dc8efe24033b306180939e51e6af +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.13-h7f98852_0.tar.bz2#2bbe4b67a97c9d18a807598941fc3b4c 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.27.1-pyhd8ed1ab_0.tar.bz2#53a436cabeb9507941741b7543f43bdb +https://conda.anaconda.org/conda-forge/noarch/yamllint-1.29.0-pyhd8ed1ab_0.conda#769cd6ad3e31cf42cf570ae9232d68b3 +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.8.2-py310h5764c6d_0.conda#a88cda17074955bdb5e93b8e3be59e7d +https://conda.anaconda.org/conda-forge/noarch/zict-2.2.0-pyhd8ed1ab_0.tar.bz2#cd563d01df94e51f968645dbf3b310b0 +https://conda.anaconda.org/conda-forge/linux-64/astroid-2.15.0-py310hff52083_0.conda#9f41b6882f32c3c1852a92f4e74b683c +https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.2-pyhd8ed1ab_0.tar.bz2#25e79f9a1133556671becbd65a170c78 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.2.1-h927de71_2.conda#1b28bd938972d159828e75aeea284a0f https://conda.anaconda.org/conda-forge/noarch/bokeh-2.4.3-pyhd8ed1ab_3.tar.bz2#e4c6e6d99add99cede5328d811cacb21 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.0.1-py39hce5d2b2_2.tar.bz2#599cee42b88c9afba10033c01fb40d74 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.27.0-h164a9dd_0.tar.bz2#517bb7ad16aed252c06e3436bab00c9e -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.2.0-mpi_mpich_h5a1934d_102.tar.bz2#bb8bdfa5e3e9e3f6ec861f05cd2ad441 +https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py310h5764c6d_1005.tar.bz2#87669c3468dff637bbd0363bc0f895cf +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py310hde88566_2.tar.bz2#7433944046deda7775c5b1f7e0b6fe18 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.2-py310h34c0648_0.conda#99dc5a02a8b16cd88ca9a12354496e78 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.1-pyhd8ed1ab_0.conda#0a3abdbff6e296d056ce01ee3529638d +https://conda.anaconda.org/conda-forge/noarch/django-4.1.7-pyhd8ed1ab_0.conda#8714bfa712888b332195adf3904bcb37 +https://conda.anaconda.org/conda-forge/noarch/flake8-4.0.1-pyhd8ed1ab_2.tar.bz2#a824bd55ce47e9c637427f730c651231 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a +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-ha76d385_4.tar.bz2#6a613710a0f19aba3a5dfe83bf1c1c0f +https://conda.anaconda.org/conda-forge/linux-64/git-2.40.0-pl5321h693f4a3_0.conda#70fd89375d9b5ca90c15dcf3662b1b42 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda#448fe40d2fed88ccf4d9ded37cbb2b38 +https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-hc2f950b_10.tar.bz2#9114b5a6c2ee542d3a31616c2aaed2ba +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2022.9.26-py310h543e91f_4.conda#e0d3ca05bf830a6dc056648f0037c057 +https://conda.anaconda.org/conda-forge/noarch/imageio-2.26.0-pyh24c5eb1_0.conda#7158487eb6dbc42fbb5d20f0c5796c48 +https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.0-ha7026e8_0.conda#c948b920f45fd81a2dde8b1ab514cc84 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-mpi_mpich_hcd871d9_6.tar.bz2#6cdc429ed22edb566ac4308f3da6916d +https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.0.1-h7c8129e_22.tar.bz2#23abed7562ad969493b89ad0e5f5c521 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee +https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py310h9b08913_0.conda#467244b0dbb7da40927ac6ee0e9491de +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.1.1-pyhd8ed1ab_0.conda#1d1a27f637808c76dd83e3f469aa6f7e +https://conda.anaconda.org/conda-forge/linux-64/poppler-22.12.0-h92391eb_0.conda#7ad6d858f5615f9b0e9e4bd60395ea75 +https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py310hfc24d34_0.conda#c126f81b5cea6b2d4a64d0744249a26f +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.0.0-pyhd8ed1ab_0.tar.bz2#c9e3f8bfdb9bfc34aa1836a6ed4b25d7 +https://conda.anaconda.org/conda-forge/noarch/pytest-env-0.8.1-pyhd8ed1ab_0.conda#56466a4061d4c1150f6fe52235019bf8 +https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-2.0.4-pyhd8ed1ab_0.tar.bz2#7ac02a65917993d38ca1bfd7b87208e4 +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.10.0-pyhd8ed1ab_0.tar.bz2#db93caa9fe182f0cd20291aeb22f57ac +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 +https://conda.anaconda.org/conda-forge/noarch/python-build-0.10.0-pyhd8ed1ab_0.conda#63f6f208901dcd7ca8b675c3adf7ae75 +https://conda.anaconda.org/conda-forge/noarch/rdflib-6.3.1-pyhd8ed1ab_0.conda#dc00e349274512b09ba949d329bf7446 +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-py310hbf28c38_3.tar.bz2#703ff1ac7d1b27fb5944b8052b5d1edb +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.14-h7f98852_1.tar.bz2#45b68dc2fc7549c16044d533ceaf340e +https://conda.anaconda.org/conda-forge/noarch/zarr-2.14.2-pyhd8ed1ab_0.conda#0c5776fe65a12a421d7ddf90411a6c3f +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.8.4-py310h1fa729e_0.conda#ad96f1f4a5a53f6e474953539d0f73ea +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.18.16-h89864ff_5.conda#9a90a2264e50b6cc73a3f526f8f9311e +https://conda.anaconda.org/conda-forge/noarch/cmocean-2.0-py_3.tar.bz2#10f08c3aa77dc4080ebc1c03cb542f70 https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe -https://conda.anaconda.org/conda-forge/linux-64/gdal-3.5.1-py39haa391fb_5.tar.bz2#0999c11f4236d46e3463358358471fe4 +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.21-pyhd8ed1ab_0.conda#b5ada314668cded097e08fea86262317 +https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-h0ff4b12_1.conda#753b7aa9da058b8cb4cd699b71c4bb77 +https://conda.anaconda.org/conda-forge/linux-64/julia-1.8.5-h783901f_0.conda#98c05ba7ca9c15d22216f730499e167a +https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.6.1-hf2b5f72_1.conda#fc4c5716fac9e7f242223dca042e1045 +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/netcdf-fortran-4.6.0-mpi_mpich_h1e13492_2.conda#d4ed7704f0fa589e4d7656780fa87557 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py310h55e1e36_100.tar.bz2#4dd7aa28fb7d9a6de061c9579a30e7dd +https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 +https://conda.anaconda.org/conda-forge/linux-64/parallelio-2.5.9-mpi_mpich_h50e6f33_101.conda#87fac13c80750b8be35b0a32bb965bbe +https://conda.anaconda.org/conda-forge/noarch/pylint-2.17.0-pyhd8ed1ab_0.conda#c61f4831aa216de2096f4f03c80148e5 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 +https://conda.anaconda.org/conda-forge/noarch/pytest-html-3.2.0-pyhd8ed1ab_1.tar.bz2#d5c7a941dfbceaab4b172a56d7918eb0 +https://conda.anaconda.org/conda-forge/linux-64/requirements-detector-0.7-py310hff52083_3.tar.bz2#0cd9f8972da2c8ad624676d47643805f +https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.1.6-hf6b5aa3_1.conda#2a4aee55361a45fd1d7318090c54137f +https://conda.anaconda.org/conda-forge/noarch/tifffile-2022.10.10-pyhd8ed1ab_0.tar.bz2#1c126ff5b4643785bbc16e44e6327e41 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.21.0-pyhd8ed1ab_0.conda#cb9a711f7c9f3074fe522e5a34481e60 +https://conda.anaconda.org/conda-forge/noarch/xarray-2023.2.0-pyhd8ed1ab_0.conda#fb463f99beba9fa120f23f95f9dd5467 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.9.379-h33d5b13_6.conda#2b0d27972b01992d14e3cb32311c41df +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.8.0-pyhd8ed1ab_0.conda#53cf0d7a841e6876d2152142a004b062 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.28.0-h7513371_1.conda#5591e878880d0d621966336ec5474857 +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.3.1-mpi_mpich_h5a1934d_101.tar.bz2#ac4bfd5bdb0a5b4b99ee383fd0c8995c +https://conda.anaconda.org/conda-forge/linux-64/gdal-3.6.1-py310hc1b7723_1.conda#27f46e0d58cddd2b36520c7453a9ddca https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.5-pyhd8ed1ab_0.tar.bz2#985ef0c4ed7a26731c419818080ef6ce https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.54.4-h7abd40a_0.tar.bz2#921e53675ed5ea352f022b79abab076a -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.3-py39h19d6b11_2.tar.bz2#dc400bb297d8425b8b05367a21854b0b -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.0-nompi_py39h6ced12a_102.tar.bz2#b92600d0fef7f12f426935d87d6413e6 -https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.2-pyhd8ed1ab_0.tar.bz2#2e4e8be763551f60bbfcc22b650e5d49 -https://conda.anaconda.org/conda-forge/noarch/pylint-2.15.2-pyhd8ed1ab_0.tar.bz2#23e784500c9f365e5428befdfa458f5b -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.0.0-pyhd8ed1ab_0.tar.bz2#1d7e241dfaf5475e893d4b824bb71b44 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-3.0.0-pyhd8ed1ab_0.tar.bz2#0f7cac11bb696b62d378bde725bfc3eb -https://conda.anaconda.org/conda-forge/noarch/pytest-env-0.6.2-py_0.tar.bz2#2fe6beb5d2d87cf252a2575043919696 -https://conda.anaconda.org/conda-forge/noarch/pytest-flake8-1.1.1-pyhd8ed1ab_1.tar.bz2#d717971066d534fd18dfe80a79146f38 -https://conda.anaconda.org/conda-forge/noarch/pytest-forked-1.4.0-pyhd8ed1ab_0.tar.bz2#95286e05a617de9ebfe3246cecbfb72f -https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-2.0.2-pyhd8ed1ab_0.tar.bz2#3ec37c08592b7904827826919b72dbdf -https://conda.anaconda.org/conda-forge/linux-64/r-base-4.1.3-ha8c3e7c_2.tar.bz2#ef4598c5edc0c7cbfd6ca2a58d3372a1 -https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.2-py39h082961e_0.tar.bz2#81ca8bacb592d864ac7490df2ff13376 -https://conda.anaconda.org/conda-forge/linux-64/requirements-detector-0.7-py39hf3d152e_3.tar.bz2#b7112a1cc23e45bde6ec16ae35ef075f -https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.1.2-py39he5e8d7e_0.tar.bz2#52c40321f32e147c5a692bcab1b20a0b -https://conda.anaconda.org/conda-forge/noarch/tifffile-2022.8.12-pyhd8ed1ab_0.tar.bz2#8dd285ed95ab44a0a804a66bf27d4f45 -https://conda.anaconda.org/conda-forge/noarch/xarray-2022.6.0-pyhd8ed1ab_1.tar.bz2#ab3a191d1754bc69a6f61879c92fa7e1 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.0-py39hf5d525c_0.tar.bz2#b99ba7383d1c9dd18445dfff08439c48 -https://conda.anaconda.org/conda-forge/noarch/cmocean-2.0-py_3.tar.bz2#10f08c3aa77dc4080ebc1c03cb542f70 -https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.2.0-mpi_mpich_py39h8bb458d_101.tar.bz2#347f324dd99dfb0b1479a466213b55bf -https://conda.anaconda.org/conda-forge/linux-64/fiona-1.8.21-py39h54775ec_2.tar.bz2#d3fcd76578f901f49f2b9f790bb140a0 -https://conda.anaconda.org/conda-forge/linux-64/graphviz-5.0.1-h5abf519_0.tar.bz2#03f22ca50fcff4bbee39da0943ab8475 -https://conda.anaconda.org/conda-forge/linux-64/magics-4.12.1-hb2107fa_0.tar.bz2#c67fb5aa7697faf9471bafe44970d90e https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.0-pyhd8ed1ab_2.tar.bz2#363b0816e411feb0df925d4f224f026a -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-hfc90af8_40.tar.bz2#12092d40f5e7da8c110c00fa9a6e1ff1 -https://conda.anaconda.org/conda-forge/linux-64/nco-5.1.0-h81bb2a3_1.tar.bz2#519419bdf5a90b1377d7997e912b38ba https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d -https://conda.anaconda.org/conda-forge/linux-64/pre-commit-2.20.0-py39hf3d152e_0.tar.bz2#314c8cb1538706f62ec36cf64370f2b2 -https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.4.3-py39hf3d152e_0.tar.bz2#3be646be40ec2edd201b04eceab364e4 -https://conda.anaconda.org/conda-forge/linux-64/py-xgboost-1.6.2-cpu_py39h4655687_0.tar.bz2#35b1d161591f204e532ff67eae7ee3df +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.0-pyha770c72_0.conda#9a160452d1d88a9f10c373888f93586b +https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.4.3-py310hff52083_1.tar.bz2#f4031db74ce8816996e825ca98309858 https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 -https://conda.anaconda.org/conda-forge/noarch/pytest-html-3.1.1-pyhd8ed1ab_0.tar.bz2#88b638753087926088c778ea5b2f4b97 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-2.5.0-pyhd8ed1ab_0.tar.bz2#1fdd1f3baccf0deb647385c677a1a48e -https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r41hc72bb7e_1003.tar.bz2#c3b114ca38b60ba36c29bfe3f267b851 -https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.4.1-r41hcfec24a_0.tar.bz2#f431d585821313884e52d64b5ef0d8cd -https://conda.anaconda.org/conda-forge/noarch/r-bigmemory.sri-0.1.3-r41hc72bb7e_1004.tar.bz2#5d36a36881eb64c02162e1845e7e67be -https://conda.anaconda.org/conda-forge/linux-64/r-brio-1.1.3-r41hcfec24a_0.tar.bz2#8b244d9227122b63ca1191228e1e31c9 -https://conda.anaconda.org/conda-forge/noarch/r-codetools-0.2_18-r41hc72bb7e_0.tar.bz2#75bcb5a3087ce83b46137aa732d3ed00 -https://conda.anaconda.org/conda-forge/linux-64/r-colorspace-2.0_3-r41h06615bd_0.tar.bz2#0d8361af2384668b542faaa293862086 -https://conda.anaconda.org/conda-forge/noarch/r-crayon-1.5.1-r41hc72bb7e_0.tar.bz2#ac6c74e4a346d5aab9d8eac94b32bf62 -https://conda.anaconda.org/conda-forge/linux-64/r-curl-4.3.2-r41hcfec24a_0.tar.bz2#18de0d29e4da1b0c3d2200896a7c5cf8 -https://conda.anaconda.org/conda-forge/linux-64/r-digest-0.6.29-r41h03ef668_0.tar.bz2#9b5bcee4e903920236c5911fdd3478d8 -https://conda.anaconda.org/conda-forge/noarch/r-docopt-0.7.1-r41hc72bb7e_1.tar.bz2#44b9500be22cf4984b6b18137b84ce6a -https://conda.anaconda.org/conda-forge/linux-64/r-dotcall64-1.0_1-r41h859d828_0.tar.bz2#3c656d1bda434d961ac077ad124b8541 -https://conda.anaconda.org/conda-forge/noarch/r-evaluate-0.16-r41hc72bb7e_0.tar.bz2#4e6d48071b7aee6d8f4e82b72f082fc6 -https://conda.anaconda.org/conda-forge/linux-64/r-fansi-1.0.3-r41h06615bd_0.tar.bz2#f7eb22307beab0fdd027497ad586238d -https://conda.anaconda.org/conda-forge/linux-64/r-farver-2.1.1-r41h7525677_0.tar.bz2#06cbfe381a5f7eefd7bce35be1a7a643 -https://conda.anaconda.org/conda-forge/linux-64/r-fs-1.5.2-r41h7525677_1.tar.bz2#79e6d70cc797f5534d3375ebd0f0f5f5 -https://conda.anaconda.org/conda-forge/noarch/r-functional-0.6-r41ha770c72_1002.tar.bz2#20fc036451ecc312bb99170249b48832 -https://conda.anaconda.org/conda-forge/noarch/r-geomapdata-2.0_0-r41hc72bb7e_0.tar.bz2#5e940ba435d456fe37bf57aae7d82a71 -https://conda.anaconda.org/conda-forge/linux-64/r-git2r-0.30.1-r41h96773ce_0.tar.bz2#45bcf860b4efdf8f7d8bf76280560ab7 -https://conda.anaconda.org/conda-forge/linux-64/r-glue-1.6.2-r41h06615bd_0.tar.bz2#ac6fda8a0ebf198ee98252c60146c548 -https://conda.anaconda.org/conda-forge/linux-64/r-goftest-1.2_3-r41h06615bd_0.tar.bz2#194469dbcb627dabcfae7a103feb946e -https://conda.anaconda.org/conda-forge/noarch/r-gtable-0.3.1-r41hc72bb7e_0.tar.bz2#db42f11efeba36388f28393a629c8fde -https://conda.anaconda.org/conda-forge/noarch/r-iterators-1.0.14-r41hc72bb7e_0.tar.bz2#ab7219cb6f28d2bb25e9c248fe057593 -https://conda.anaconda.org/conda-forge/linux-64/r-jsonlite-1.8.0-r41h06615bd_0.tar.bz2#4d063eba6eabed26214bb23f18f891d2 -https://conda.anaconda.org/conda-forge/noarch/r-labeling-0.4.2-r41hc72bb7e_1.tar.bz2#7536c98f2faf4bf5faf4334fb79f1328 -https://conda.anaconda.org/conda-forge/linux-64/r-lattice-0.20_45-r41hcfec24a_0.tar.bz2#895ccbaf82eba857612be799cd5744b4 -https://conda.anaconda.org/conda-forge/linux-64/r-lazyeval-0.2.2-r41hcfec24a_2.tar.bz2#bd92cb1db1aafaf10d434b910f666eab -https://conda.anaconda.org/conda-forge/noarch/r-logging-0.10_108-r41ha770c72_2.tar.bz2#a616b95860639aab83498ec91db49ae5 -https://conda.anaconda.org/conda-forge/linux-64/r-magrittr-2.0.3-r41h06615bd_0.tar.bz2#08ef457aa9684c94036fb5e9e2753a9f -https://conda.anaconda.org/conda-forge/linux-64/r-maps-3.4.0-r41hcfec24a_0.tar.bz2#7b8a70280583f717752dc74878b096cb -https://conda.anaconda.org/conda-forge/linux-64/r-mass-7.3_58.1-r41h06615bd_0.tar.bz2#86d5c685acac50458692d96775c71d2f -https://conda.anaconda.org/conda-forge/linux-64/r-mba-0.0_9-r41h03ef668_1005.tar.bz2#fa9b431d02cab7bcf2cdbe46ce392667 -https://conda.anaconda.org/conda-forge/linux-64/r-mime-0.12-r41hcfec24a_0.tar.bz2#f40c9f8645ea54ce0709a5436d569e2d -https://conda.anaconda.org/conda-forge/noarch/r-nbclust-3.0.1-r41hc72bb7e_0.tar.bz2#3a614458b465bc5e73326d679d343b1a -https://conda.anaconda.org/conda-forge/linux-64/r-ncdf4-1.19-r41h8d2b980_1.tar.bz2#9c6f0a6affea40d572e15224379978df -https://conda.anaconda.org/conda-forge/linux-64/r-pcict-0.5_4.1-r41hcfec24a_0.tar.bz2#3707d9209ad5a389c929e764e17fe64f -https://conda.anaconda.org/conda-forge/noarch/r-pkgconfig-2.0.3-r41hc72bb7e_1.tar.bz2#2c4f78477753ad83700a1f9d605a3002 -https://conda.anaconda.org/conda-forge/noarch/r-praise-1.0.0-r41hc72bb7e_1005.tar.bz2#39585efa1172490943314141c133467b -https://conda.anaconda.org/conda-forge/linux-64/r-ps-1.7.1-r41h06615bd_0.tar.bz2#6c1e615b4e0767020c37c17252dd614a -https://conda.anaconda.org/conda-forge/noarch/r-r.methodss3-1.8.2-r41hc72bb7e_0.tar.bz2#f7a245e711518b5aa8a047bb28f600dd -https://conda.anaconda.org/conda-forge/noarch/r-r6-2.5.1-r41hc72bb7e_0.tar.bz2#a560798c2d5ab0dbb30feddc6b8e63fb -https://conda.anaconda.org/conda-forge/noarch/r-rcolorbrewer-1.1_3-r41h785f33e_0.tar.bz2#579b6792713b6c8538c1aa8e4ce636c0 -https://conda.anaconda.org/conda-forge/linux-64/r-rcpp-1.0.9-r41h7525677_1.tar.bz2#d7ad5262178fb2572c21ebe09f887379 -https://conda.anaconda.org/conda-forge/noarch/r-remotes-2.4.2-r41hc72bb7e_0.tar.bz2#c41802db474bb317ad1d704a50edc025 -https://conda.anaconda.org/conda-forge/linux-64/r-rlang-1.0.5-r41h7525677_0.tar.bz2#d55424a7d1cd42505ce01c404dfca07b -https://conda.anaconda.org/conda-forge/noarch/r-rpmg-2.2_3-r41hc72bb7e_1.tar.bz2#1fec74c48eac674d355494fa6a2bd025 -https://conda.anaconda.org/conda-forge/noarch/r-rstudioapi-0.14-r41hc72bb7e_0.tar.bz2#0b800d61f97fa9360e2d342492b4189b -https://conda.anaconda.org/conda-forge/noarch/r-snow-0.4_4-r41hc72bb7e_0.tar.bz2#6e7a0c895d09c4e035262a850d69a994 -https://conda.anaconda.org/conda-forge/linux-64/r-stringdist-0.9.8-r41hcfec24a_1.tar.bz2#2c7acff90f4529d942e9f3bf249d4541 -https://conda.anaconda.org/conda-forge/linux-64/r-stringi-1.7.8-r41h30a9eb7_0.tar.bz2#278dea1e2f510971b61ed878139e57a3 -https://conda.anaconda.org/conda-forge/linux-64/r-sys-3.4-r41hcfec24a_0.tar.bz2#bdf70442cc075fb748f874f4ebe922a8 -https://conda.anaconda.org/conda-forge/linux-64/r-udunits2-0.13.2.1-r41h06615bd_0.tar.bz2#4a765d9541c1f8485e7d43575ad51a0c -https://conda.anaconda.org/conda-forge/linux-64/r-utf8-1.2.2-r41hcfec24a_0.tar.bz2#3b958ecf41127b730cc0f0865cc8953e -https://conda.anaconda.org/conda-forge/linux-64/r-uuid-1.1_0-r41h06615bd_0.tar.bz2#d51eb6ae37fd2975156c6ba1561a13e7 -https://conda.anaconda.org/conda-forge/noarch/r-viridislite-0.4.1-r41hc72bb7e_0.tar.bz2#9e845780dbd53f680cc9d7a2602dca53 -https://conda.anaconda.org/conda-forge/noarch/r-withr-2.5.0-r41hc72bb7e_0.tar.bz2#53558bed67c14dc998209e5a567b6cfd -https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.32-r41h7525677_0.tar.bz2#9c23f79afb8196317bae03fd6f7a98be -https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r41hc72bb7e_0.tar.bz2#2e532e4a560c703602b75cdc78c0ae86 -https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.5-r41h06615bd_0.tar.bz2#69d70ac4bc847a644f793dda88e3b725 -https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.19.3-py39h1832856_1.tar.bz2#472bb5b9d9eb26ac697902da265ee551 -https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.12.0-pyhd8ed1ab_0.tar.bz2#05ee2fb22c1eca4309c06d11aff049f3 -https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.13.2-py39hd257fcd_0.tar.bz2#bd7cdadf70e34a19333c3aacc40206e8 -https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.11-pyhd8ed1ab_0.tar.bz2#0738978569b10669bdef41c671252dd1 -https://conda.anaconda.org/conda-forge/linux-64/cdo-2.0.5-hcb4c3c0_2.tar.bz2#e32a6d02f931959eab22d6333185805f -https://conda.anaconda.org/conda-forge/noarch/distributed-2022.9.0-pyhd8ed1ab_0.tar.bz2#1f3e94b8cc3eef3c71f81d2583a00689 -https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.0_47-pl5321hae1b4c2_0.tar.bz2#cf2fb869766c5da2b4ddef123fb22ba5 -https://conda.anaconda.org/conda-forge/noarch/iris-3.2.1-pyhd8ed1ab_0.tar.bz2#b723e3e16d57b43720233fa7c4241fa6 -https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.4.1-py39hf3d152e_1.tar.bz2#fc61a495d78bffafacd50fe34a89503d -https://conda.anaconda.org/conda-forge/linux-64/pydot-1.4.2-py39hf3d152e_2.tar.bz2#74c8563d1af0163f52220ce86401547b +https://conda.anaconda.org/conda-forge/linux-64/r-base-4.1.3-hb87df5d_4.conda#5f774a156ed3bea11994da08a95e41eb +https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.4-py310hfc14bbd_0.tar.bz2#e7d96b020ff846c1658afa1a08cee7bc +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 +https://conda.anaconda.org/conda-forge/noarch/distributed-2023.3.1-pyhd8ed1ab_0.conda#f115c48a59b7650876187e32ebaa5e03 +https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.3.1-mpi_mpich_py310h515c5ea_100.conda#ad531847b7cea3df5c63e0b7f2388e7c +https://conda.anaconda.org/conda-forge/linux-64/fiona-1.8.22-py310ha325b7b_5.conda#4dbdf48d4712e8906595291f38423eff +https://conda.anaconda.org/conda-forge/linux-64/graphviz-6.0.2-h99bc08f_0.conda#8f247587d1520a2bbc6f79a821b74c07 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-10.0.1-h86614e7_4_cpu.conda#9e2fbb34a627978eb15402d91e84efcb +https://conda.anaconda.org/conda-forge/linux-64/magics-4.12.1-h6972fcc_1.tar.bz2#1d7b5a76a43cd3c28bd9731d6b904ece +https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-h3fdc804_41.tar.bz2#924f3d7669669461b52ea24ffb792ccc +https://conda.anaconda.org/conda-forge/linux-64/nco-5.1.3-h3e2f719_1.conda#72f7bf7e3ef51a5fc836b11eb6a61fcd +https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.4.1-py310hff52083_2.tar.bz2#c4d1816369ca40c2266c86444c028f40 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/r-askpass-1.1-r41hcfec24a_2.tar.bz2#58e1d05890607b8534f1933bbc847901 -https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.1-r41h7525677_0.tar.bz2#f37b02b8f6fefee59c0a68bfa7bd3f3a -https://conda.anaconda.org/conda-forge/linux-64/r-cli-3.4.0-r41h7525677_0.tar.bz2#c2fbe95e9e316512b0920ea95f650bbf -https://conda.anaconda.org/conda-forge/linux-64/r-climdex.pcic-1.1_11-r41h03ef668_0.tar.bz2#62b9995e7f5bb6ba08dca316c4515e9d -https://conda.anaconda.org/conda-forge/linux-64/r-diffobj-0.3.5-r41hcfec24a_0.tar.bz2#01693a46ed0b5a2e355aefdffc626d67 -https://conda.anaconda.org/conda-forge/linux-64/r-ellipsis-0.3.2-r41hcfec24a_0.tar.bz2#44d25949d98811e21e9d19527b6e3cfe -https://conda.anaconda.org/conda-forge/noarch/r-foreach-1.5.2-r41hc72bb7e_0.tar.bz2#9edc70c908bd046bde57e58c45968bd7 -https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r41hc72bb7e_1003.tar.bz2#d06a67a555a584026fead4e8439fc605 -https://conda.anaconda.org/conda-forge/noarch/r-highr-0.9-r41hc72bb7e_0.tar.bz2#ee521053a1f3be94e20386f0c8cb58e5 -https://conda.anaconda.org/conda-forge/noarch/r-lifecycle-1.0.2-r41hc72bb7e_0.tar.bz2#b22d5a6a675d3a2ce268b5f7a913e41e -https://conda.anaconda.org/conda-forge/linux-64/r-mapproj-1.2.8-r41hcfec24a_0.tar.bz2#452f9179c0b907ec358cc6b33ef0d2b5 -https://conda.anaconda.org/conda-forge/linux-64/r-matrix-1.4_1-r41h0154571_0.tar.bz2#46bdce8fcf422c4b74e0af3091ddfdfc -https://conda.anaconda.org/conda-forge/noarch/r-munsell-0.5.0-r41hc72bb7e_1004.tar.bz2#f5bd0c85c189a1797f29f2731c13a4dd -https://conda.anaconda.org/conda-forge/noarch/r-ncdf4.helpers-0.3_6-r41hc72bb7e_0.tar.bz2#786c4dc6a717f5af93ca4b8fc81a055d -https://conda.anaconda.org/conda-forge/linux-64/r-nlme-3.1_159-r41h8da6f51_0.tar.bz2#e562ef41913c6cf417bf6f93527c7e4e -https://conda.anaconda.org/conda-forge/linux-64/r-plyr-1.8.7-r41h7525677_0.tar.bz2#19d96cf0f4c3dd6114f40aae9d8a8f7b -https://conda.anaconda.org/conda-forge/linux-64/r-processx-3.7.0-r41h06615bd_0.tar.bz2#b03077eb7df7e79e05ed2ccf5e2276a1 -https://conda.anaconda.org/conda-forge/linux-64/r-purrr-0.3.4-r41hcfec24a_1.tar.bz2#9f37c72ac24f3c9429e0eafcc1777463 -https://conda.anaconda.org/conda-forge/noarch/r-r.oo-1.25.0-r41hc72bb7e_0.tar.bz2#bab2f2fadec8ef62e345986506cbd5d2 -https://conda.anaconda.org/conda-forge/linux-64/r-rcpparmadillo-0.11.2.3.1-r41h9f5de39_0.tar.bz2#758f62b21b99de95a10f59f0b1ed1f02 -https://conda.anaconda.org/conda-forge/noarch/r-rex-1.2.1-r41hc72bb7e_0.tar.bz2#97192e56fb5e683090f013e3f0812a4c -https://conda.anaconda.org/conda-forge/noarch/r-rprojroot-2.0.3-r41hc72bb7e_0.tar.bz2#4c97577b6f80853234f34b548d8140ec -https://conda.anaconda.org/conda-forge/linux-64/r-sp-1.5_0-r41h06615bd_0.tar.bz2#9604d3d142d380414e443e53c95cd6bd -https://conda.anaconda.org/conda-forge/linux-64/r-spam-2.9_1-r41hb361e29_0.tar.bz2#af1c65aa0d022450296b4f09b8d7f483 -https://conda.anaconda.org/conda-forge/noarch/r-stringr-1.4.1-r41hc72bb7e_0.tar.bz2#99dba4f2796cd3d2d59ca79d2e0c7da4 -https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.3-r41h7525677_1.tar.bz2#f592e169aaf0ba69da972400f5d875fb -https://conda.anaconda.org/conda-forge/noarch/requests-2.28.1-pyhd8ed1ab_1.tar.bz2#089382ee0e2dc2eae33a04cc3c2bddb0 -https://conda.anaconda.org/conda-forge/noarch/seaborn-0.12.0-hd8ed1ab_0.tar.bz2#c22474d96fa1725ae47def82b5668686 -https://conda.anaconda.org/conda-forge/noarch/xesmf-0.3.0-py_0.tar.bz2#467fce81308d531483e8b8206d8f9f67 -https://conda.anaconda.org/conda-forge/linux-64/xgboost-1.6.2-cpu_py39h4655687_0.tar.bz2#9d2c5b5c6e75d6b85c6f258d402293ca -https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.5.1-pyhd8ed1ab_0.tar.bz2#97762346c21f72a467eec0a01a78d86b +https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r41hc72bb7e_1004.tar.bz2#831186670e5786df30f8ddeb5a623c5a +https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.4.1-r41h06615bd_1.tar.bz2#9a00c3283f8fb4bce68deffe08fbe09d +https://conda.anaconda.org/conda-forge/noarch/r-bigmemory.sri-0.1.6-r41hc72bb7e_0.tar.bz2#926471a5be30d287a25f2d10446d6066 +https://conda.anaconda.org/conda-forge/linux-64/r-brio-1.1.3-r41h06615bd_1.tar.bz2#3ba226bad01c3ebed18c4f7b022bf26d +https://conda.anaconda.org/conda-forge/linux-64/r-cli-3.6.0-r41h38f115c_0.conda#dab31d85303b08d43dc4734fd6694bfc +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-crayon-1.5.2-r41hc72bb7e_1.tar.bz2#8cf94f6451aaadf3aa1119b29115b0c7 +https://conda.anaconda.org/conda-forge/linux-64/r-curl-4.3.3-r41h06615bd_1.tar.bz2#1b63281b3fafc4f068db0d250b845aed +https://conda.anaconda.org/conda-forge/linux-64/r-desolve-1.35-r41hb20cf53_0.conda#e475d0dbe391fa76fbf742ebee6ad449 +https://conda.anaconda.org/conda-forge/linux-64/r-digest-0.6.31-r41h38f115c_0.conda#eecdd9b7292e968428497bbeb9e68dfe +https://conda.anaconda.org/conda-forge/noarch/r-docopt-0.7.1-r41hc72bb7e_2.tar.bz2#38883e8f3f07ec1c63834a4401098b39 +https://conda.anaconda.org/conda-forge/linux-64/r-dotcall64-1.0_2-r41hac0b197_1.conda#1ae51773e2544dcde64619a03395be84 +https://conda.anaconda.org/conda-forge/noarch/r-evaluate-0.20-r41hc72bb7e_0.conda#9468c41ffcbf71642a597f4b67b365a1 +https://conda.anaconda.org/conda-forge/linux-64/r-fansi-1.0.4-r41h133d619_0.conda#bdd2dca12682e87ebaee34af4250c718 +https://conda.anaconda.org/conda-forge/linux-64/r-farver-2.1.1-r41h7525677_1.tar.bz2#6c02f6ce0271b25d7936eeca4d06581c +https://conda.anaconda.org/conda-forge/linux-64/r-fs-1.6.1-r41h38f115c_0.conda#86c541347119c5a8105a37d6441e8ee5 +https://conda.anaconda.org/conda-forge/noarch/r-functional-0.6-r41ha770c72_1003.tar.bz2#b48ece4d136bc4af37b9320d40e9a37c +https://conda.anaconda.org/conda-forge/noarch/r-generics-0.1.3-r41hc72bb7e_1.tar.bz2#91a23d57270d474ab35b970ab153bdf4 +https://conda.anaconda.org/conda-forge/noarch/r-geomapdata-2.0_0-r41hc72bb7e_1.tar.bz2#2336d6504ec4e0f75c60e6176676eb49 +https://conda.anaconda.org/conda-forge/linux-64/r-git2r-0.31.0-r41hb760b46_0.conda#2912060dbb6b86babf9346e73d4feca2 +https://conda.anaconda.org/conda-forge/linux-64/r-glue-1.6.2-r41h06615bd_1.tar.bz2#7f4726fddb7ddc6354f299eeee77217d +https://conda.anaconda.org/conda-forge/linux-64/r-goftest-1.2_3-r41h06615bd_1.tar.bz2#ec4f56c61753d07694a08190a372d078 +https://conda.anaconda.org/conda-forge/linux-64/r-isoband-0.2.7-r41h38f115c_1.conda#2e385f2fb8a78b41ae7bf1854af45242 +https://conda.anaconda.org/conda-forge/noarch/r-iterators-1.0.14-r41hc72bb7e_1.tar.bz2#774088f2c449de9b334b0fc3f8a427a5 +https://conda.anaconda.org/conda-forge/linux-64/r-jsonlite-1.8.4-r41h133d619_0.conda#a52e803dce385c526d2ecfa1f2addc9f +https://conda.anaconda.org/conda-forge/noarch/r-labeling-0.4.2-r41hc72bb7e_2.tar.bz2#83807ad3d6daa0c5e88ad3f4e8df4758 +https://conda.anaconda.org/conda-forge/linux-64/r-lattice-0.20_45-r41h06615bd_1.tar.bz2#c2812cfb6718c3bf4de491a1b953d54c +https://conda.anaconda.org/conda-forge/linux-64/r-lazyeval-0.2.2-r41h06615bd_3.tar.bz2#6eb0969ca6d2304194b7f9fad926b325 +https://conda.anaconda.org/conda-forge/linux-64/r-lmom-2.9-r41h8da6f51_1.tar.bz2#3b56e155cfc9611b7e1f0cba68ae795b +https://conda.anaconda.org/conda-forge/noarch/r-logging-0.10_108-r41ha770c72_3.tar.bz2#d0a6a38b084ec13c87eb72124e08b54c +https://conda.anaconda.org/conda-forge/linux-64/r-magrittr-2.0.3-r41h06615bd_1.tar.bz2#02e0e78aaffe86ff8d8824b9c6744f05 +https://conda.anaconda.org/conda-forge/linux-64/r-maps-3.4.1-r41h06615bd_1.conda#594a80fe9ed00caf16654ea76444751e +https://conda.anaconda.org/conda-forge/linux-64/r-mass-7.3_58.3-r41h133d619_0.conda#bc1c1fdac18d5799439626c6b6c1591a +https://conda.anaconda.org/conda-forge/linux-64/r-mba-0.1_0-r41h7525677_0.conda#3be8fba4c63dda03bf34ab17e44a0fab +https://conda.anaconda.org/conda-forge/linux-64/r-mime-0.12-r41h06615bd_1.tar.bz2#9482f375317377b6362deeb045759756 +https://conda.anaconda.org/conda-forge/noarch/r-nbclust-3.0.1-r41hc72bb7e_1.tar.bz2#84a70bc1ed3e58e7a6560a0e7dd99355 +https://conda.anaconda.org/conda-forge/linux-64/r-ncdf4-1.21-r41h15f2bca_0.conda#ce4e8c0271af2985bc227b7d81a954a0 +https://conda.anaconda.org/conda-forge/linux-64/r-pcict-0.5_4.4-r41h133d619_0.conda#9c317abaabdf337e1790f1472343825d +https://conda.anaconda.org/conda-forge/noarch/r-pkgconfig-2.0.3-r41hc72bb7e_2.tar.bz2#fceb80e453285589b08efe53174ebe22 +https://conda.anaconda.org/conda-forge/noarch/r-praise-1.0.0-r41hc72bb7e_1006.tar.bz2#28ee09a92c8cb8ccb88205d6b768d3cc +https://conda.anaconda.org/conda-forge/linux-64/r-ps-1.7.2-r41h06615bd_0.tar.bz2#8fb46580302df3e39100d9f868ddffb6 +https://conda.anaconda.org/conda-forge/noarch/r-r.methodss3-1.8.2-r41hc72bb7e_1.tar.bz2#5cff1b8f457c863cc1025bb2b6396678 +https://conda.anaconda.org/conda-forge/noarch/r-r6-2.5.1-r41hc72bb7e_1.tar.bz2#04cf390ece28f6df5c096f78409a9b41 +https://conda.anaconda.org/conda-forge/noarch/r-rcolorbrewer-1.1_3-r41h785f33e_1.tar.bz2#cf94059b05cc67854cb7e704ea751d7f +https://conda.anaconda.org/conda-forge/linux-64/r-rcpp-1.0.10-r41h38f115c_0.conda#2ad2bd8a50f80e4f7420d7d6c83ea3d5 +https://conda.anaconda.org/conda-forge/noarch/r-remotes-2.4.2-r41hc72bb7e_1.tar.bz2#fee357b9269ee696fffdc18109ae8836 +https://conda.anaconda.org/conda-forge/linux-64/r-rlang-1.1.0-r41h38f115c_0.conda#7712d54c810e6025f780221aa02c43cc +https://conda.anaconda.org/conda-forge/noarch/r-rpmg-2.2_3-r41hc72bb7e_2.tar.bz2#e13db79c37c068d0117708bccbe2ed9d +https://conda.anaconda.org/conda-forge/noarch/r-rstudioapi-0.14-r41hc72bb7e_1.tar.bz2#3a6725acc73d5a6c3b7d9dd3131b58d8 +https://conda.anaconda.org/conda-forge/noarch/r-snow-0.4_4-r41hc72bb7e_1.tar.bz2#aea71b97f7046d9ab359ec9a0e494a6d +https://conda.anaconda.org/conda-forge/linux-64/r-stringdist-0.9.10-r41h06615bd_0.tar.bz2#db0b1d297278d5ae2787ad6a3e7eadbb +https://conda.anaconda.org/conda-forge/linux-64/r-sys-3.4.1-r41h06615bd_0.tar.bz2#ce0220a4de751074c57b76acc7aece01 +https://conda.anaconda.org/conda-forge/linux-64/r-udunits2-0.13.2.1-r41h133d619_1.conda#77677c475c2422d56dad703fcd6c7401 +https://conda.anaconda.org/conda-forge/linux-64/r-utf8-1.2.3-r41h133d619_0.conda#a990f02e71f6cf7033e4d9b6db5839dc +https://conda.anaconda.org/conda-forge/linux-64/r-uuid-1.1_0-r41h06615bd_1.tar.bz2#a8758fdf001eba9f46350e9ab37471da +https://conda.anaconda.org/conda-forge/noarch/r-viridislite-0.4.1-r41hc72bb7e_1.tar.bz2#9fee3e06b7121f47a946b700ffedddc5 +https://conda.anaconda.org/conda-forge/noarch/r-withr-2.5.0-r41hc72bb7e_1.tar.bz2#23c0e5a3dc9258b9a06928097560adba +https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.37-r41h38f115c_0.conda#9d1483b17407fb924f8770c37d5a58ee +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/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 +https://conda.anaconda.org/conda-forge/linux-64/arrow-cpp-10.0.1-h27aab58_4_cpu.conda#f730b5f9959317b5f97956dcac4b18ba +https://conda.anaconda.org/conda-forge/linux-64/cdo-2.1.0-h15029e1_0.tar.bz2#d3bfba242a8332d487973ad74bd1b83d +https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.6.1-pyhd8ed1ab_0.conda#454ed214cec806066097ae245a409171 https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc -https://conda.anaconda.org/conda-forge/noarch/dask-2022.9.0-pyhd8ed1ab_0.tar.bz2#6571048ce97733a2682de74f2dd2dfd0 +https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.0_55-pl5321h0d24a18_0.conda#35ab22e75b47bc042d914b4121ef976b +https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyhd8ed1ab_0.conda#eb2e0fc33ad0d04b51f9280360c13c1e https://conda.anaconda.org/conda-forge/noarch/prospector-1.7.7-pyhd8ed1ab_0.tar.bz2#01010f8ea38d650158703a581e51b979 +https://conda.anaconda.org/conda-forge/linux-64/pydot-1.4.2-py310hff52083_3.tar.bz2#45231e3f8fa29b6cea52e2cfe9b47a22 +https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 +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.1.0-r41h06615bd_1.tar.bz2#afec2bc1ab4b10a58d30894437cff177 +https://conda.anaconda.org/conda-forge/linux-64/r-climdex.pcic-1.1_11-r41h7525677_1.tar.bz2#06d19f02c04ff718b0c80c00b199976e +https://conda.anaconda.org/conda-forge/linux-64/r-diffobj-0.3.5-r41h06615bd_1.tar.bz2#5483435b5f12567c120966137ebb715f +https://conda.anaconda.org/conda-forge/linux-64/r-ellipsis-0.3.2-r41h06615bd_1.tar.bz2#2a63108f4bd95bacd3a9d60af4e7b933 +https://conda.anaconda.org/conda-forge/noarch/r-elliptic-1.4_0-r41hc72bb7e_3.tar.bz2#620fac0a4d3fdcb3b7f9620a121ca0e4 +https://conda.anaconda.org/conda-forge/noarch/r-foreach-1.5.2-r41hc72bb7e_1.tar.bz2#4ac59bcf363990abb478e9d358ea76ff +https://conda.anaconda.org/conda-forge/noarch/r-highr-0.10-r41hc72bb7e_0.conda#c5680c2ac76bcecf2c4c3d598fdea3a8 +https://conda.anaconda.org/conda-forge/noarch/r-lifecycle-1.0.3-r41hc72bb7e_1.tar.bz2#bed96e636722252c2a37c392c5994f9d +https://conda.anaconda.org/conda-forge/linux-64/r-mapproj-1.2.11-r41h133d619_0.conda#ac4d7a80cc1f6e67ed8eefcf6cccf21e +https://conda.anaconda.org/conda-forge/linux-64/r-matrix-1.5_3-r41h5f7b363_0.tar.bz2#40e29508ec05fa394452f373e8ff9a7d +https://conda.anaconda.org/conda-forge/noarch/r-munsell-0.5.0-r41hc72bb7e_1005.tar.bz2#102b2cf348101fd85afda3b26460b0f3 +https://conda.anaconda.org/conda-forge/noarch/r-ncdf4.helpers-0.3_6-r41hc72bb7e_1.tar.bz2#403ae973d19d3e2f2a4051aca3f12fc3 +https://conda.anaconda.org/conda-forge/linux-64/r-nlme-3.1_162-r41hac0b197_0.conda#76d797cfdad767d5bffaf053efad7f5d +https://conda.anaconda.org/conda-forge/linux-64/r-plyr-1.8.8-r41h7525677_0.tar.bz2#318c3b974ef18cc5c8e46069fd9cb27c +https://conda.anaconda.org/conda-forge/linux-64/r-processx-3.8.0-r41h06615bd_0.tar.bz2#6e64ebac18b1ffcf59f2760840ea09e4 +https://conda.anaconda.org/conda-forge/noarch/r-r.oo-1.25.0-r41hc72bb7e_1.tar.bz2#080778ce659a006984a7a0dbdde9a57a +https://conda.anaconda.org/conda-forge/linux-64/r-rcpparmadillo-0.11.4.4.0-r41h358215d_0.conda#cc8bd05e11f8f5d53ea9e132b6b44aea +https://conda.anaconda.org/conda-forge/noarch/r-rex-1.2.1-r41hc72bb7e_1.tar.bz2#e1af0f0eb2278c1a3330c2907eca8f44 +https://conda.anaconda.org/conda-forge/noarch/r-rprojroot-2.0.3-r41hc72bb7e_1.tar.bz2#9f5f482d79c7854068a01945f400a3bf +https://conda.anaconda.org/conda-forge/linux-64/r-sp-1.6_0-r41h133d619_0.conda#b3c74a52750f0023a84b0cfc3df16140 +https://conda.anaconda.org/conda-forge/linux-64/r-spam-2.9_1-r41hb20cf53_1.conda#9eab4a6bfff4bddeee5ed946c47830fa +https://conda.anaconda.org/conda-forge/linux-64/r-timechange-0.2.0-r41h38f115c_0.conda#04a4229419d779a1e27395d70d493571 +https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.3-r41h044e5c7_2.tar.bz2#fac12e879977f720e76af620be7ccaee +https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_11-r41h06615bd_1.tar.bz2#f0e1cc749147edf3baf9aa699b8978bf +https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.0.0-pyhd8ed1ab_0.conda#8cfbc0e46440e008590ab5be8f486770 +https://conda.anaconda.org/conda-forge/noarch/sphinx-6.1.3-pyhd8ed1ab_0.conda#5c3da961e16ead31147fe7213c06173c +https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.6-pyhd8ed1ab_0.tar.bz2#4409dd7e06a62c3b2aa9e96782c49c6d +https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyh1a96a4e_2.tar.bz2#64068564a9c2932bf30e9b4ec567927d +https://conda.anaconda.org/conda-forge/noarch/parquet-cpp-1.5.1-2.tar.bz2#79a5f78c42817594ae016a7896521a97 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-py39hf3d152e_1.tar.bz2#00995cef4965d56fd0c17a3ee1616e99 -https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.5.6-pyhd8ed1ab_0.tar.bz2#09bb24ec892891d7c9a7aaa5cdf59022 +https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.5.1-pyhd8ed1ab_0.conda#ea5622ef0ce3cc3b591bf0438e719477 +https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.5.7-pyhd8ed1ab_0.tar.bz2#8466896842fdeb35c96d4a73b3a3deaf 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.2-r41hc72bb7e_0.tar.bz2#0493d6ed1666106a66d218c0eb44d475 -https://conda.anaconda.org/conda-forge/noarch/r-desc-1.4.2-r41hc72bb7e_0.tar.bz2#b63a8a0a0fa2fd16a324d50b4df98238 -https://conda.anaconda.org/conda-forge/noarch/r-doparallel-1.0.17-r41hc72bb7e_0.tar.bz2#a3233412d05e7777ad00257b7e4a0d5b -https://conda.anaconda.org/conda-forge/noarch/r-knitr-1.40-r41hc72bb7e_0.tar.bz2#f044dd7b235df552f25d257e5ae11d53 -https://conda.anaconda.org/conda-forge/linux-64/r-lmoments-1.3_1-r41h6dc32e9_3.tar.bz2#55bbed478f19a047024392e053f386b0 -https://conda.anaconda.org/conda-forge/linux-64/r-mgcv-1.8_40-r41h0154571_0.tar.bz2#94ba55d80afb3db8a19d598e313ce078 -https://conda.anaconda.org/conda-forge/linux-64/r-openssl-2.0.2-r41hfaab4ff_0.tar.bz2#3334a5f769494453a7a80106ad90d04f -https://conda.anaconda.org/conda-forge/noarch/r-r.utils-2.12.0-r41hc72bb7e_0.tar.bz2#9c2240ac19873fb7b5b22f8f9a5a0aff -https://conda.anaconda.org/conda-forge/noarch/r-scales-1.2.1-r41hc72bb7e_0.tar.bz2#9ba5c1de3a9758871584ba40c378db14 -https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r41h7525677_1.tar.bz2#2a2296ad5a14fc431a2835c6f83268d5 -https://conda.anaconda.org/conda-forge/linux-64/r-splancs-2.01_43-r41h8da6f51_0.tar.bz2#153c0691eadf12837152a8b2b93332cc -https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.4.1-r41h7525677_0.tar.bz2#5bc4133cae4a09d70dd11f3c29c57a4c -https://conda.anaconda.org/conda-forge/noarch/requests_cache-0.4.13-py_0.tar.bz2#f823f9ba74df2c9a2fe0932501b41150 -https://conda.anaconda.org/conda-forge/noarch/sphinx-5.1.1-pyhd8ed1ab_1.tar.bz2#cd1129e88f6278787212624e1b7a8001 -https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.6-pyhd8ed1ab_0.tar.bz2#4409dd7e06a62c3b2aa9e96782c49c6d -https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyh6c4a22f_1.tar.bz2#ca750cf2d38b14dd944de4c7e4720c8f -https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.5-pyhd8ed1ab_0.tar.bz2#3787d05a66f5aa9490b52c566e338cff -https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.0-r41hc72bb7e_1004.tar.bz2#1ada20fcc4603a3844d8008c7ba0f0ae -https://conda.anaconda.org/conda-forge/noarch/r-httr-1.4.4-r41hc72bb7e_0.tar.bz2#0f25e3d569e80378216435d8f324c1f5 -https://conda.anaconda.org/conda-forge/noarch/r-lmomco-2.4.7-r41hc72bb7e_0.tar.bz2#2f3182025ee27c6ea679c88cc406543c -https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.3-r41hc72bb7e_0.tar.bz2#c298324f9f324ade38c26f3e376b3095 -https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.8.1-r41hc72bb7e_0.tar.bz2#88ffc0fd48cf9bb5501bf54a8c885124 -https://conda.anaconda.org/conda-forge/noarch/r-pkgload-1.3.0-r41hc72bb7e_0.tar.bz2#ad902132cde9da724b8c200b0e15e015 -https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r41hc72bb7e_0.tar.bz2#88ce3fe0ad1b2e8c650ec7aff0e409d6 -https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-1.0.0-pyhd8ed1ab_0.tar.bz2#9f633f2f2869184e31acfeae95b24345 -https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.6.0-pyhd8ed1ab_0.tar.bz2#3694ec3615e8e6e272c5c09f37e97fd4 -https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.1.3-r41hc72bb7e_0.tar.bz2#9a7aeee336411295dea3a842e767598b -https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.1.8-r41h06615bd_0.tar.bz2#702c8e30bf36644c2c558729b9a3570e -https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r41hc72bb7e_1.tar.bz2#5c26fbf849007fc5022745ec14e38822 -https://conda.anaconda.org/conda-forge/noarch/r-styler-1.7.0-r41hc72bb7e_0.tar.bz2#e7357a807dfb0a9e8179ac21dcfc94c0 -https://conda.anaconda.org/conda-forge/noarch/r-waldo-0.4.0-r41hc72bb7e_0.tar.bz2#974972fb4e38703ed8e1722f45600e8b -https://conda.anaconda.org/conda-forge/linux-64/r-testthat-3.1.4-r41h7525677_0.tar.bz2#ca36c7db9d50f7481e2742454b32ad92 -https://conda.anaconda.org/conda-forge/linux-64/r-isoband-0.2.5-r41h03ef668_0.tar.bz2#dfd1983b86abb444e3ae58e3b97cd148 -https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.0.0-r41hc72bb7e_0.tar.bz2#670dc18650e8296b94fabdb27259514f -https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.3.6-r41hc72bb7e_0.tar.bz2#e305660b2a4c78aea808bc5c2aa910a3 -https://conda.anaconda.org/conda-forge/noarch/r-spei-1.7-r41hc72bb7e_0.tar.bz2#22c2e00f2deb740430f7c7c9905111cf -https://conda.anaconda.org/conda-forge/noarch/r-viridis-0.6.2-r41hc72bb7e_0.tar.bz2#48e4402ef0d6b30777f48af10ebb0020 -https://conda.anaconda.org/conda-forge/linux-64/r-fields-14.1-r41h8da6f51_0.tar.bz2#572106b3f4f3c87f89c877342a2ee8f7 -https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_0-r41h06615bd_0.tar.bz2#a2a46fb9b26106a206dc6f1a349506bb -https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r41hc72bb7e_0.tar.bz2#689a0da9aa00b2ebf58ccb308fe1120e +https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.3-r41hc72bb7e_0.tar.bz2#af0891cc9b87e2954c9a3c66f144992d +https://conda.anaconda.org/conda-forge/noarch/r-desc-1.4.2-r41hc72bb7e_1.tar.bz2#35a5cf7ea666e2c13cb6b4a03282e2a3 +https://conda.anaconda.org/conda-forge/noarch/r-doparallel-1.0.17-r41hc72bb7e_1.tar.bz2#a7d2c685223b6538ecac271ecbb2c199 +https://conda.anaconda.org/conda-forge/noarch/r-gtable-0.3.2-r41hc72bb7e_0.conda#5b412ac90c094c647f4cd5a480a0881a +https://conda.anaconda.org/conda-forge/noarch/r-hypergeo-1.2_13-r41hc72bb7e_1003.tar.bz2#e0f2b02808243f63bc8c0d8dc2054f37 +https://conda.anaconda.org/conda-forge/noarch/r-knitr-1.42-r41hc72bb7e_1.conda#988cb78878502722269291f63b055dd3 +https://conda.anaconda.org/conda-forge/linux-64/r-lmoments-1.3_1-r41h37cf8d7_4.tar.bz2#30a0f4289a2570c3b4eccb5c62e0466e +https://conda.anaconda.org/conda-forge/linux-64/r-lubridate-1.9.2-r41h133d619_1.conda#995c8749407f4276d91833c54ea527e7 +https://conda.anaconda.org/conda-forge/linux-64/r-mgcv-1.8_42-r41he1ae0d6_0.conda#41523ce65336ebc723d7aa4e80cd8d27 +https://conda.anaconda.org/conda-forge/linux-64/r-openssl-2.0.6-r41habfbb5e_0.conda#d10bafe86b53c0b74659616a2db7528e +https://conda.anaconda.org/conda-forge/noarch/r-r.utils-2.12.2-r41hc72bb7e_0.tar.bz2#302c316e29b7f426fa2de6f1f21dec75 +https://conda.anaconda.org/conda-forge/linux-64/r-reshape-0.8.9-r41hc72bb7e_1.tar.bz2#acdda9b65715d9b2d7f928145605d283 +https://conda.anaconda.org/conda-forge/noarch/r-scales-1.2.1-r41hc72bb7e_1.tar.bz2#2a557fcc9f60e56e788a6d1293bc8701 +https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r41h7525677_2.tar.bz2#4f29fc17a4ca578035f136f4724cfe46 +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.0-r41h38f115c_0.conda#f1d332b29a6b07c76a51a9bf697c4dba +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py310h8deb116_0.conda#4c9604c5ec179c21f8f0a09e3c164480 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py310hcb7e713_0.conda#bd14eaad9bbf54b78e48ecb8b644fcf6 +https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.3-pyhd8ed1ab_0.tar.bz2#50ef6b29b1fb0768ca82c5aeb4fb2d96 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-10.0.1-py310hea98ffe_4_cpu.conda#f8ecae697df9d8a0f06d3ac68645e0c6 +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.5-r41hc72bb7e_0.conda#906d0309ac8736c9c73e9f92cbd639f5 +https://conda.anaconda.org/conda-forge/noarch/r-lmomco-2.4.7-r41hc72bb7e_1.tar.bz2#2a356fbe035dd79c20e5442c7ac6c3d7 +https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.3-r41hc72bb7e_1.tar.bz2#1c1d4ef6b2d3160fea3a2cdd355d7310 +https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.8.1-r41hc72bb7e_1.tar.bz2#6bb0584f534b275cef5ad171a62d98aa +https://conda.anaconda.org/conda-forge/noarch/r-pkgload-1.3.2-r41hc72bb7e_0.tar.bz2#e23a1a8420ab52056d86a6f9691d23fa +https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.1-r41h133d619_0.conda#d7404238cac0da3c97dc08503d116a2f +https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r41hc72bb7e_1.tar.bz2#aef451160d655cc630d8038d934dced3 +https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.19.3-py310h769672d_2.tar.bz2#c0391107b0cd0010708d6969ed759e8b +https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.2.2-py310h209a8ca_0.conda#5e8a2628fb16f6bd4c7be00a132de051 +https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.12.2-pyhd8ed1ab_0.conda#cf88f3a1c11536bc3c10c14ad00ccc42 +https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-1.2.0-pyha770c72_0.conda#55f8f3f0fa3fd6b7522f4133fac8ee59 +https://conda.anaconda.org/conda-forge/noarch/xesmf-0.3.0-py_0.tar.bz2#467fce81308d531483e8b8206d8f9f67 +https://conda.anaconda.org/conda-forge/noarch/dask-2023.3.1-pyhd8ed1ab_0.conda#df7b408dafa227e7f933addd71d8a5ed +https://conda.anaconda.org/conda-forge/noarch/iris-3.4.1-pyhd8ed1ab_0.conda#4dcbc9255798749fb7e0f5f443d4b22a +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/psy-maps-1.4.2-pyhd8ed1ab_0.tar.bz2#3ed13103dfd46f71dc870d188bd0b276 +https://conda.anaconda.org/conda-forge/linux-64/py-xgboost-1.7.4-cpu_py310hd1aba9c_0.conda#354a6164b00752371928785bc95796a3 +https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.0-r41hc72bb7e_0.conda#925214b7466d626c2af31b4f1ab03d10 +https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r41h133d619_1.conda#3ae9b78fb1d8a44deed24a27cce33ebf +https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.13.5-py310hde88566_2.tar.bz2#521b762fdb5e47915251d460a8fc5814 +https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.5.0-pyhd8ed1ab_0.tar.bz2#8c698d13c8d6b5497e0e0df2a0459be0 +https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.4.0-py310hff52083_2.tar.bz2#821da860c8dcb6b0ae872b45398a2062 +https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.4.1-r41hc72bb7e_0.conda#48ca4c05d582d1c91f01c4e8a1a38b87 +https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r41hc72bb7e_2.tar.bz2#f67eae0562ffc808b82f1590776c25f5 +https://conda.anaconda.org/conda-forge/noarch/seaborn-0.12.2-hd8ed1ab_0.conda#50847a47c07812f88581081c620f5160 +https://conda.anaconda.org/conda-forge/linux-64/xgboost-1.7.4-cpu_py310hd1aba9c_0.conda#0eb0e0cbf5e095a2dc3f65a42fa69b17 +https://conda.anaconda.org/conda-forge/label/esmvalcore_rc/noarch/esmvalcore-2.8.0rc2-pyh39db41b_0.conda#9305d7aaaa9896748aec24d44f116b3a +https://conda.anaconda.org/conda-forge/noarch/r-styler-1.9.1-r41hc72bb7e_0.conda#f197827ef18aa9ec3e94bbc9f2ae0532 +https://conda.anaconda.org/conda-forge/linux-64/r-tlmoments-0.7.5.3-r41h38f115c_0.conda#d6992015dff73f17ee76a9380b367b9f +https://conda.anaconda.org/conda-forge/noarch/r-viridis-0.6.2-r41hc72bb7e_1.tar.bz2#ecb550192b983ec27126164be02891af +https://conda.anaconda.org/conda-forge/noarch/r-waldo-0.4.0-r41hc72bb7e_1.tar.bz2#ab6bf092edad5b285ea39a334500587b +https://conda.anaconda.org/conda-forge/linux-64/r-fields-14.1-r41hac0b197_1.conda#3178d2a57796f6462ea7457ba4b6447c +https://conda.anaconda.org/conda-forge/noarch/r-spei-1.8.1-r41hc72bb7e_0.conda#c928901be40f7694f1237570a148416c +https://conda.anaconda.org/conda-forge/linux-64/r-testthat-3.1.7-r41h38f115c_0.conda#e104b83e0a387659fba666df30a6d4f2 +https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_0-r41h06615bd_1.tar.bz2#dabe8f942d619075cbd13c1481c8b538 +https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.0.2-r41hc72bb7e_0.tar.bz2#769c2305486b74fd61d85bfef2296f27 +https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r41hc72bb7e_1.tar.bz2#2253f130c8dab435824d6ddb10a41c73 diff --git a/config-user-example.yml b/config-user-example.yml index 30dd19f36d..ab9c8f3b4d 100644 --- a/config-user-example.yml +++ b/config-user-example.yml @@ -6,10 +6,11 @@ # -------------- # Site-specific entries for different HPC centers are given at the bottom of # this file. Comment out/replace as needed. This default version of the file -# can be used in combination with the command line argument ``offline=False`` -# If only certain values are allowed for an option, these are listed after -# ``---``. The option in square brackets is the default value, i.e., the one -# that is used if this option is omitted in the file. +# can be used in combination with the command line argument +# ``search_esgf=when_missing``. If only certain values are allowed for an +# option, these are listed after ``---``. The option in square brackets is the +# default value, i.e., the one that is used if this option is omitted in the +# file. # ############################################################################### # @@ -26,13 +27,26 @@ # Includes log files and performance stats. output_dir: ~/esmvaltool_output -# Directory for storing downloaded climate data -download_dir: ~/climate_data - # Auxiliary data directory # Used by some recipes to look for additional datasets. auxiliary_data_dir: ~/auxiliary_data +# Automatic data download from ESGF --- [never]/when_missing/always +# Use automatic download of missing CMIP3, CMIP5, CMIP6, CORDEX, and obs4MIPs +# data from ESGF. ``never`` disables this feature, which is useful if you are +# working on a computer without an internet connection, or if you have limited +# disk space. ``when_missing`` enables the automatic download for files that +# are not available locally. ``always`` will always check ESGF for the latest +# version of a file, and will only use local files if they correspond to that +# latest version. +search_esgf: never + +# Directory for storing downloaded climate data +# Make sure to use a directory where you can store multiple GBs of data. Your +# home directory on a HPC is usually not suited for this purpose, so please +# change the default value in this case! +download_dir: ~/climate_data + # Run at most this many tasks in parallel --- [null]/1/2/3/4/... # Set to ``null`` to use the number of available CPUs. If you run out of # memory, try setting max_parallel_tasks to ``1`` and check the amount of @@ -42,12 +56,6 @@ auxiliary_data_dir: ~/auxiliary_data # available in your system. max_parallel_tasks: null -# Disable automatic downloads --- [true]/false -# Disable the automatic download of missing CMIP3, CMIP5, CMIP6, CORDEX, -# and obs4MIPs data from ESGF by default. This is useful if you are working -# on a computer without an internet connection. -offline: true - # Log level of the console --- debug/[info]/warning/error # For much more information printed to screen set log_level to ``debug``. log_level: info @@ -84,17 +92,16 @@ config_developer_file: null profile_diagnostic: false # Rootpaths to the data from different projects -# This default setting will work if files have been downloaded by the -# ESMValTool via ``offline=False``. Lists are also possible. For site-specific -# entries and more examples, see below. Comment out these when using a -# site-specific path. +# This default setting will work if files have been downloaded by ESMValTool +# via ``search_esgf``. Lists are also possible. For site-specific entries and +# more examples, see below. Comment out these when using a site-specific path. rootpath: default: ~/climate_data # Directory structure for input data --- [default]/ESGF/BADC/DKRZ/ETHZ/etc. -# This default setting will work if files have been downloaded by the -# ESMValTool via ``offline=False``. See ``config-developer.yml`` for -# definitions. Comment out/replace as per needed. +# This default setting will work if files have been downloaded by ESMValTool +# via ``search_esgf``. See ``config-developer.yml`` for definitions. Comment +# out/replace as per needed. drs: CMIP3: ESGF CMIP5: ESGF @@ -125,7 +132,7 @@ drs: # Directory tree created by automatically downloading from ESGF # Uncomment the lines below to locate data that has been automatically -# downloaded from ESGF (using ``offline: false``). +# downloaded from ESGF (using ``search_esgf``). #rootpath: # CMIP3: ~/climate_data # CMIP5: ~/climate_data @@ -163,7 +170,7 @@ drs: # Site-specific entries: DKRZ-Levante # For bd0854 members a shared download directory is available -#offline: false +#search_esgf: when_missing #download_dir: /work/bd0854/DATA/ESMValTool2/download # Uncomment the lines below to locate data on Levante at DKRZ. #auxiliary_data_dir: /work/bd0854/DATA/ESMValTool2/AUX @@ -231,12 +238,12 @@ drs: # CMIP6: /project/champ/data/CMIP6 # CORDEX: /project/champ/data/cordex/output # OBS: /data/users/esmval/ESMValTool/temporary/obs/ -# obs4MIPs: /project/champ/data/obs4MIPs +# obs4MIPs: /data/users/esmval/ESMValTool/temporary/obs/ # ana4mips: /project/champ/data/ana4MIPs #drs: # CMIP5: BADC # CMIP6: BADC # CORDEX: BADC # OBS: default -# obs4MIPs: BADC +# obs4MIPs: default # ana4mips: BADC diff --git a/doc/sphinx/source/changelog.rst b/doc/sphinx/source/changelog.rst index 6b6478179b..e26ec7d26b 100644 --- a/doc/sphinx/source/changelog.rst +++ b/doc/sphinx/source/changelog.rst @@ -4,6 +4,303 @@ Changelog ========= +.. _changelog-v2-8-0: + +v2.8.0 +------ + +Highlights +~~~~~~~~~~ + +- This release includes the diagnostics for reproducing figures 3.9, 3.19, + 3.42 and 3.43 of the IPCC AR6 WG1 report. + See :ref:`recipe documentation ` about added recipes. +- A new set of recipes and diagnostics has been included to evaluate cloud + climatologies from CMIP models as used in `Lauer et al. (2023), J. Climate + `__. + See :ref:`recipe documentation ` about added recipes. +- Addition of a set of recipes for extreme events, regional and impact + evaluation as used in `Weigel et al. (2021), J. Climate + `__ and in IPCC AR5. + See :ref:`recipe documentation ` about added recipes. + +Highlights from ESMValCore v2.8.0 :ref:`here`: + +- ESMValCore now supports wildcards in recipes and offers improved support + for ancillary variables and dataset versioning. +- Support for CORDEX datasets in a rotated pole coordinate system has been added. +- Native :ref:`ICON ` output is now made UGRID-compliant + on-the-fly. +- The Python API has been extended with the addition of three modules: + :mod:`esmvalcore.config`, :mod:`esmvalcore.dataset`, and + :mod:`esmvalcore.local` +- The preprocessor :func:`~esmvalcore.preprocessor.multi_model_statistics` + has been extended to support more use-cases. + +This release includes: + +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 `__. + 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 `__. + 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 `__. + 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. + +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 `__ + +Community +~~~~~~~~~ + +- Update documentation on pre-installed versions on HPC clusters (`#2934 `__) `Rémi Kazeroni `__ + +Deprecations +~~~~~~~~~~~~ + +- Remove radiation recipes that have been superseded by :ref:`recipe_radiation_budget ` along with associated diagnostic scripts (`#3115 `_) `Alistair Sellar `__ + +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 `__ + +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 `__ + +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 `__ + +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 `__ + +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 `__ + +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 `__ + + +.. _changelog-v2-7-0: + +v2.7.0 +------ + +Highlights +~~~~~~~~~~ + +- This release has seen the inclusion of the code for figures 3.3, 3.4, 3.5, 3,13 and 3.15 of the IPCC AR6 WG1 report, see them in the `new documentation `__ +- We have also included new diagnostics and recipe necessary to produce the plots and tables for the journal article "Climate model projections from the Scenario Model Intercomparison Project (ScenarioMIP) of CMIP6" by `Tebaldi et al. in ESD 2020-68 `__ from 2021; also see the `recipe entry `__ +- We have also extended the support for MERRA2 observational dataset, by adding support for a large number of variables, including 3D variables, see the `table of supported obs datasets `__ + +Backwards incompatible changes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Remove installation of R dependencies from the help message (`#2761 `__) `Rémi 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 `__ + +Community +~~~~~~~~~ + +- Add MO-paths to config file (`#2784 `__) `mo-tgeddes `__ + +Deprecations +~~~~~~~~~~~~ + +- Recipe `recipe_esacci_oc.yml` replace with new regrid scheme `nearest_extrapolate` (`#2841 `__) `Valeriu Predoi `__ + +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 documention on how to handle CMORizers for multiple dataset versions (`#2730 `__) `Rémi Kazeroni `__ +- Extending documentation: recipe maintainer + broken recipe policy (`#2719 `__) `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 `__ + +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 `__ + +Automatic testing +~~~~~~~~~~~~~~~~~ + +- Pin `netcdf4 != 1.6.1` since that is spitting large numbers of SegFaults (`#2796 `__) `Valeriu Predoi `__ + +Installation +~~~~~~~~~~~~ + +- Increase esmvalcore version to 2.7.0 in environment files (`#2860 `__) `Valeriu Predoi `__ +- Add iris-esmf-regrid as a dependency (`#2880 `__) `Klaus Zimmermann `__ + +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 `__ + + .. _changelog-v2-6-0: v2.6.0 diff --git a/doc/sphinx/source/community/backward_compatibility.rst b/doc/sphinx/source/community/backward_compatibility.rst new file mode 100644 index 0000000000..8ea68acaf0 --- /dev/null +++ b/doc/sphinx/source/community/backward_compatibility.rst @@ -0,0 +1,275 @@ +.. _backward-compatibility-policy: + +ESMValTool policy on backward compatibility +=========================================== + +Motivation +---------- + +Development of recipes or conducting project-related work may require a +rather long period of time during which new versions of the ESMValTool +might become available. For a good user experience and a seamless +workflow, users and developers need to know before upgrading to a new +version if and how their work might be affected (backward +compatibility). This includes, for instance, information about changes +to technical features such as syntax of recipes and configuration files, +and interfaces of shared functions, but also changes that affect the +results of an ESMValTool run, e.g. modification of algorithms or changes +to the order of operators. It is therefore essential that users and +developers have the best advice on how and when to upgrade to new +versions. + +While trying to minimise the impact of new code developments on users +and developers by maintaining backward compatibility where possible, +this cannot always be guaranteed. A very restrictive policy might delay +the ESMValTool development and make it more complex for developers to +contribute. + +This document outlines the key principles of an updated ESMValTool policy +on backward compatibility. + +Definitions +----------- + +**Release:** A numbered version of ESMValCore / ESMValTool that has been +released to the community, e.g. 2.4.0. This policy relates only to +backward compatibility of releases, not to interim revisions of the main +branch. Release numbers are of the format x.y.z, where: + +- x indicates a major release +- y indicates a minor release +- z indicates a patch release + +**Backward-incompatible change:** A change in ESMValCore or ESMValTool that causes a +recipe to no longer run successfully (a *breaking change*), or which +results in scientifically significant changes in results (a *science +change*). + +**Breaking change:** A change which causes a previously working recipe +to no longer run successfully. + +**Science change:** A change that alters scientific results. We do not +formally distinguish between trivial science changes (e.g. from changes +in the order of calculations) and more significant changes that would +affect interpretation, although the detail that we communicate will +share any understanding that we have regarding expected impact. + +**Benign third-party dependency changes:** A change over which we have +no control, but which we believe will only have trivial technical +impacts (such as a change in font). Such changes are outside of the +scope of this policy, though we will communicate about those we are +aware of. + +**Developer of backward-incompatible change:** For the purpose of this +policy, developer is the individual that is responsible for the pull +request (PR) that is not backward compatible. + +**Recipe developer:** Someone who is developing a recipe that is not +(yet) integrated into the repository. + +**Recipe user:** For the purpose of this policy, a *recipe user* is +anyone who runs a recipe using a *release* of ESMValTool. In this +context, someone can be both a *recipe developer* and a *recipe user*, +but they perform different activities in each capacity. + +**Recipe maintainer:** First contact point for *integrated recipes* in +case of problems with that recipe (see also :ref:`Maintaining a recipe`). + +**Integrated recipes:** Recipes that are contained within the main +branch of the ESMValTool repository, and can therefore be updated by any +developer in line with the above guidance. Note that the recipe can be +updated by someone other than the original author. + +**User recipes:** Recipes developed by any developer outside of the main +branch of the repository (i.e. on a dev/feature branch or outside the +repository completely), and therefore cannot be updated by anyone else. + +Scope +----- + +The ESMValTool and ESMValCore policy on backward compatibility aims at balancing two +competing needs: the occasional need of improvements or maintenance to +break backward compatibility and the need for stability for existing +users and developers. The following aspects are covered by this policy: + +- Key principles and approaches to backward compatibility +- Guidelines and requirements for *developers of backward-incompatible + changes* +- Communication with users and developers about *backward-incompatible + changes* + +Not within the scope of this policy are: + +- Versioning scheme of ESMValTool +- Breakage of recipes due to changes in input data or dependencies. + This is covered by the :ref:`broken recipe policy`. + +Expectations of developers, users & funders +------------------------------------------- + +Stakeholders and their expectations and aims: + +Projects / Funders + +- Aim to facilitate scientific discovery +- Expect deliverables, e.g. new features/recipes +- Expect reproducible results + +*Recipe users* + +- Expect the recipe to work +- Expect the recipe to be easy to run +- Expect reproducible results +- Expect easy installation of ESMValTool + +*Recipe developers* + +- Develop recipes +- Expect their recipe to keep working with every new *release* of + ESMValCore +- Expect ESMValCore bugfixes and new features to become available + quickly +- Expect reproducible results +- Expect easy installation of ESMValTool + +Core developers and *recipe maintainers* + +- Fix bugs +- Add ESMValCore features requested by *recipe developers* +- Try to accommodate ESMValCore features contributed to by *recipe + developers* +- Maintain existing recipes +- Add new recipes +- Try to help (other) *recipe developers* with contributing their + recipe +- Try to make installation as easy as possible + +There is a tension between making new features available and keeping +everything as is. New features facilitate scientific discovery because +they enable *recipe developers* to do new research (e.g. analyse more +data, new data, or perform a different analysis). Ensuring that every +recipe ever made works with every new feature is technically a lot of +work, more than we have funding for. Therefore we need to make sure that +new features are added regularly, but we respect the timescale on which +*recipe developers* work when removing outdated features. Writing a +paper and getting it published may take up to a year, so this seems a +good timescale for larger changes. For changes that only affect a few +users, shorter timescales could be acceptable. It is also good to note +that we are part of a large software ecosystem (ESMValTool currently +depends on over 500 different software packages), so we may not always +be able to control at what pace changes are made to the software that we +depend upon. + +Two-way communication about new and removed features is needed to make +this work. This requires active involvement from both the people +developing the new features and the *recipe developers*. ESMValTool core +developers and ESMValCore core developers need to make sure they clearly +communicate changes. In the first place, this is done by writing good +descriptions in issues and pull requests on GitHub, but some of this +material also makes it to the changelog (where the GitHub pull requests +are linked). It is highly recommended to communicate a relevant +selection (e.g. important new, scheduled for removal, and removed +features) also by other means, to ensure we reach as many people +potentially affected as possible (see :ref:`Guidance on handling +*backward-incompatible changes*` +section below). +We organize :ref:`monthly community ` meetings where +*recipe developers* can learn about the latest developments and everyone is +welcome to join, ask questions, and provide feedback. + +To meet the needs of users and funders, we should take reproducibility +of older results seriously, but this should not hold us back from +advancing our tools. We can support this by uploading a well tested +container image to an archive that provides a DOI and by providing clear +instructions on how to use such containers. + +Helping developers to upgrade +----------------------------- + +*Recipe users* of ESMValTool should be able to successfully run +*integrated recipes* using a *release*, since all +*backward-incompatible changes* introduced between *releases* will have +been fixed before the *release* is created. Please note the +:ref:`broken recipe policy`. + +However, *recipe developers* working on *user recipes* must be provided +with information to enable them to adapt their code to resolve issues +related to *backward-incompatible changes* when *backward-incompatible +changes* are introduced to the main branch / when a *release* of +ESMValTool is created. + +.. _guidance-on-backward-incompatiable-changes: + +Guidance on handling *backward-incompatible changes* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +As well as helping users to handle *backward-incompatible changes*, the +policy and surrounding tools must help developers avoid making +*backward-incompatible changes*. Not many ideas are developed on this yet, +but components should include: + +- Testing; *backward-incompatible changes* should be discovered as + early in the development process as possible. This motivates + continued investment in automated testing. + To discover *backward-incompatible changes* early on in the development cycle, + every night a selection of recipes is run on + `CircleCI `__. + A recipe can be added to the test suite by adding it to the directory + `esmvaltool/recipes/testing `__. + Only add recipes that require a small amount of data, i.e. considerably less + than a gigabyte. +- Guidance on how to minimise the likelihood of introducing + *backward-incompatible changes* and how to use deprecation warnings + when needed (see :ref:`developer guidance `). +- :ref:`Instructions on how to provide text for the release notes ` + to assist *recipe developers* to adapt their recipe in light of the + *backward-incompatible change* +- General instructions for *recipe developers* working on *user + recipes* to enable them to adapt their code related to + *backward-incompatible changes* (see `ESMValTool_Tutorial: issue + #263 `__). +- The developer or reviewer must tag the core development team to + notify them of the *backward-incompatible change*, and give at least + 2 weeks for objections to be raised before merging to the main + branch. If a strong objection is raised the backward-incompatible + change should not be merged until the objection is resolved. + + +.. _guidance-on-releasing-backward-incompatible-changes: + +Guidance on releasing *backward-incompatible changes* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +During the *release* process, the following information must be +provided: + +- **Release notes:** The *release* notes are already documented in the + :ref:`ESMValTool Changelog ` and + :ref:`ESMValCore Changelog `, and + “*backward-incompatible changes*” is the first section after + “Highlights”. + + - **backward-incompatible changes:** This section must include + clear instructions detailing how a *recipe developer* should adapt + their code for each item in this section, whether the adapted code + would introduce a *science change*, and the list of affected or + fixed *integrated recipes* that had to be updated due to the + *backward-incompatible changes*, if applicable (to provide + further examples to *recipe developers* working on *user recipes* + of how to adapt code). + - **Developer guidance:** *Developers* *of backward-incompatible + changes* must: + + - write and include the information required for the + “*backward-incompatible changes*” section in the PR that + introduces the *backward-incompatible change* + - share details of the *backward-incompatible change* at the + next monthly ESMValTool community meeting + + - **Communication:** The *release* notes must be shared with the + community (for example, via the :ref:`mailing-list` and the + `Community `__ + repository) at the point the first *release* candidate is made, + highlighting the “*backward-incompatible changes*” section. The + User Engagement Team should organise the communication of new + *releases* together with the :ref:`release_manager`. diff --git a/doc/sphinx/source/community/broken_recipe_policy.rst b/doc/sphinx/source/community/broken_recipe_policy.rst new file mode 100644 index 0000000000..f9872a4ece --- /dev/null +++ b/doc/sphinx/source/community/broken_recipe_policy.rst @@ -0,0 +1,22 @@ +.. _broken-recipe-policy: + +Broken recipe policy +==================== + +Recipes might stop working for different reasons. Among those are, for instance, withdrawal of datasets +used by the recipe (i.e. the recipe contains data that are no longer publicly available), backward incompatible development +of the ESMValTool including new features or retiring old ones as well as +changes to Python or used dependencies such as library functions. +In such cases, the :ref:`Maintaining a recipe` is contacted by the technical lead development team (`@ESMValGroup/technical-lead-development-team`_) to find +a solution, fixing the affected recipe and checking the scientific output after applying the fix. If no recipe maintainer is +available, such recipes will be flagged by the release manager during the +:ref:`Release schedule and procedure` as "broken". +For this, the affected recipe will be added to the :ref:`list of broken recipes `, together with the version +number of the last known release in which the recipe was still working. +If a recipe continues to be broken for three releases of the ESMValTool (about one year) and no recipe maintainer could be found +during this time, the affected recipe and diagnostics will be retired. This means the recipe and diagnostic code are +removed from the ESMValTool main branch by the release manager and thus will not be included in future releases. +Only the scientific documentation of the recipe (and diagnostics) will be kept in the user and developer guide with an +additional note and link to the last release in which the recipe was still fully functional. + +.. _`@ESMValGroup/technical-lead-development-team`: https://github.com/orgs/ESMValGroup/teams/technical-lead-development-team diff --git a/doc/sphinx/source/community/code_documentation.rst b/doc/sphinx/source/community/code_documentation.rst index af045e8aba..82f8c3a8f7 100644 --- a/doc/sphinx/source/community/code_documentation.rst +++ b/doc/sphinx/source/community/code_documentation.rst @@ -87,6 +87,29 @@ All pull requests - 🛠 Changed dependencies are :ref:`added or removed correctly ` - 🛠 The :ref:`checks shown below the pull request ` are successful +If a pull request introduces a change that causes a recipe to +no longer run successfully (*breaking change*), or which results in scientifically +significant changes in results (*science change*), additional requirements +defined in the :ref:`backward compatibility policy` apply. +These include in particular: + +- 🛠 Instructions for the release notes to assist *recipe + developers* to adapt their recipe in light of the *backward-incompatible change* + available. +- 🛠 If applicable, instructions for *recipe developers* working on *user + recipes* to enable them to adapt their code related to + *backward-incompatible changes* available (see `ESMValTool_Tutorial: issue + #263 `__) + available. +- 🛠 Core development team tagged to notify them of the + *backward-incompatible change*, and give at least + 2 weeks for objections to be raised before merging to the main + branch. If a strong objection is raised the backward-incompatible + change should not be merged until the objection is resolved. +- 🛠 Information required for the “*backward-incompatible changes*” + section in the PR that introduces the *backward-incompatible change* + available. + New or updated recipe and/or diagnostic ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/sphinx/source/community/dataset.rst b/doc/sphinx/source/community/dataset.rst index 6971b3c8a6..d70438d9bc 100644 --- a/doc/sphinx/source/community/dataset.rst +++ b/doc/sphinx/source/community/dataset.rst @@ -3,9 +3,14 @@ Making a new dataset ******************** -If you are contributing a new dataset, please have a look at :ref:`new-cmorizer` for how to do so. -If you need the new dataset for a new recipe, please make a separate pull -for the CMORizer script. +If you are contributing a new dataset, please have a look at +:ref:`new-cmorizer` for how to do so. +Please always create separate pull requests for CMORizer scripts, even when +introducing a new dataset or updating an existing dataset with a new recipe. + +If you are updating a CMORizer script to support a different dataset version, +please have a look at :ref:`dataset-versions` for how to handle multiple +dataset versions. .. _dataset-documentation: @@ -16,7 +21,7 @@ The documentation required for a CMORizer script is the following: - Make sure that the new dataset is added to the list of :ref:`supported_datasets` and to the file datasets.yml_. -- The in code documentation should contain clear instructions on how to obtain +- The code documentation should contain clear instructions on how to obtain the data. - A BibTeX file named ``.bibtex`` defining the reference for the new dataset should be placed in the directory ``esmvaltool/references/``, see @@ -53,7 +58,8 @@ To test a pull request for a new CMORizer script: Scientific sanity check ======================= -When contributing a new dataset, we expect that the numbers and units of the dataset look physically meaningful. +When contributing a new dataset, we expect that the numbers and units of the +dataset look physically meaningful. The scientific reviewer needs to check this. Data availability @@ -69,8 +75,8 @@ He is also the person in charge of merging CMORizer pull requests. Detailed checklist for reviews ============================== -This (non-exhaustive) checklist provides ideas for things to check when reviewing -pull requests for new or updated CMORizer scripts. +This (non-exhaustive) checklist provides ideas for things to check when +reviewing pull requests for new or updated CMORizer scripts. Dataset description ------------------- diff --git a/doc/sphinx/source/community/index.rst b/doc/sphinx/source/community/index.rst index f87a7b3640..470fe7ae02 100644 --- a/doc/sphinx/source/community/index.rst +++ b/doc/sphinx/source/community/index.rst @@ -9,7 +9,7 @@ This chapter explains how to contribute to ESMValTool. We greatly value contributions of any kind. Contributions could include, but are not limited to documentation improvements, bug reports, new or improved diagnostic code, scientific and technical code -reviews, infrastructure improvements, mailing list and chat participation, +reviews, infrastructure improvements, maintenance of recipes, mailing list and chat participation, community help/building, education and outreach. If you have a bug or other issue to report, please open an issue on the @@ -25,9 +25,13 @@ help, e.g. on our Contributing code and documentation Contributing a diagnostic or recipe + Policy on backward compatibility + Broken recipe policy Contributing a dataset + Supporting multiple dataset versions Contributing a review + Maintaining a recipe Upgrading a namelist to a recipe GitHub workflow Moving work from the private to the public repository - Release schedule and procedure + Release strategy and procedures diff --git a/doc/sphinx/source/community/maintainer.rst b/doc/sphinx/source/community/maintainer.rst new file mode 100644 index 0000000000..5bec2e825e --- /dev/null +++ b/doc/sphinx/source/community/maintainer.rst @@ -0,0 +1,31 @@ +.. _recipe-maintainer: + +Maintaining a recipe +==================== + +As development of the ESMValTool continues, new features may be added, old ones replaced or retired or +the interface of library functions may change when updating to new versions. This or for example the +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 +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: + +* answering timely to requests from the technical lead development team, e.g. if a recipe is broken +* if needed, checking and trying to fix their recipe(s) / working with the technical lead development team + (e.g. fixing a recipe might include updating the actual recipe, diagnostic code or documentation) +* if needed, checking the output of the fixed recipe for scientific validity (asking science lead development team + for advice if needed) +* If needed, change the documentation to reflect that some differences from the original results might appear (for reproducibility reasons. e.g. some missing datasets in the fixed recipe produce slight differences in the results but do not modify the conclusions) +* 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 +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/multiple_dataset_versions.rst b/doc/sphinx/source/community/multiple_dataset_versions.rst new file mode 100644 index 0000000000..7cfa059a79 --- /dev/null +++ b/doc/sphinx/source/community/multiple_dataset_versions.rst @@ -0,0 +1,38 @@ +.. _dataset-versions: + +Support for multiple versions of a dataset +****************************************** + +If you plan to update a CMORizer script to support a newer version of an +existing dataset, indicate in the issue or pull request if support for previous +versions should be kept. +If the dataset is used in recipes, please also indicate if the recipes should +be updated with the newest dataset version. + +Policy for dropping support for older dataset versions +====================================================== + +Support for older versions should preferably be kept as long as the data are +publicly available. +This ensures reproducibility and eases comparison of results of recipes using +this dataset. + +Even when previous dataset versions are no longer available or data issues have +been fixed in a newer dataset version, it is preferable to keep support for the +previous version in addition to supporting the newer version. +In such cases, it is recommended to ask the recipe maintainers of recipes using +the older version of the dataset to update to the newer version if possible so +that support for the old version can be dropped in the future. + +Naming conventions +================== + +If the data structure is rather similar between versions, a single CMORizer +script (e.g. woa.py) and config file (e.g. WOA.yml) should be favored to handle +multiple versions and avoid code duplication. +Version-dependent data fixes can be applied based on the ``version`` keys +defined in the config file. + +In some cases, it can be simpler to use different names for different dataset +versions (e.g. GCP2018 and GCP2020). +CMORizer scripts and config files should be named accordingly. diff --git a/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst b/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst new file mode 100644 index 0000000000..3f710eaa21 --- /dev/null +++ b/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst @@ -0,0 +1,225 @@ +.. _detailed_release_procedure: + +Release: recipes runs and comparison +==================================== + +The release procedure for ESMValTool is a fairly involved process (at the moment), so it +is important to be very well organized and to have documented each procedural steps, so that +the next release manager can follow said steps, and finalize the release without any delays. + +The workflow below assumes an ESMValCore release candidate, or a completed stable release, have been released +and deployed on conda-forge and PyPI; it also assumes the release manager has access to accounts on `DKRZ/Levante +`_. + +Below is a list of steps that the release manager, together with the previous release manager, should go through before the actual release; +these include testing the new code by running all available recipes in the ``main`` branch, and comparing the output against +the previous release. + +Open an issue on GitHub +----------------------- + +First, open an issue on GitHub where the testing workflow before the release is documented (see example https://github.com/ESMValGroup/ESMValTool/issues/2881). +Name it something relevant like "Recipe testing and comparison for release 2.x.x", and populate the issue description with information +about where the testing is taking place, what tools are used, and what versions, here are some suggestions: + + +- path to the output directories on DKRZ/Levante + +We should document various utilities' versions so that the work can be reproduced in case there +is an issue, or release work needs to be picked up mid-release by another release manager: + +- documenting `conda`/`mamba` versions: + +.. code-block:: bash + + mamba --version + +- documenting `git` branch and its state: + +.. code-block:: bash + + git status + +Furthermore, the runtime environment needs to be documented: make a copy of the environment file, +and attach it in the release testing issue; to record the environment in a yaml file use e.g. + +.. code-block:: bash + + conda env export > ToolEnv_v2xx_Test.txt + +Modifications to configuration files need to be documented as well. +To test recipes, it is recommended to only use the default options and DKRZ data directories, simply by uncommenting +the DKRZ-Levante block of a newly generated ``config-user.yml`` file. + +Submit run scripts - test recipe runs +------------------------------------- + +We are now ready to start running all the available recipes, to compare output against previous release. Running is currently done +via batch scripts submitted to a schedulers (SLURM). Generate the submission scripts using the ``generate.py`` :ref:`utility Python script `. + +You will have to set the name of your environment, your email address (if you want to get email notifications for successful/failed jobs) and the name of the directory you want to store the log files of the jobs. A compute project from which resources are billed needs to be set, and the default partition is set to `interactive`. +More information on running jobs with SLURM on DKRZ/Levante can be found in the DKRZ `documentation +`_. + +You can also specify the path to your ``config-user.yml`` file where ``max_parallel_tasks`` can be set. The script was found to work well with ``max_parallel_tasks=8``. Some recipes need to be run with ``max_parallel_tasks=1`` (large memory requirements, CMIP3 data, diagnostic issues, ...). These recipes are listed in `ONE_TASK_RECIPES`. + +Some recipes need other job requirements, you can add their headers in the `SPECIAL_RECIPES` dictionary. Otherwise the header will be written following the template that is written in the lines below. If you want to exclude recipes, you can do so by uncommenting the `exclude` lines. + +Before submitting all jobs, it is recommended to try the batch script generation with ``submit = False`` and check the generated files. If recipes with special runtime requirements have been added to ESMValTool since the previous release, these may need to be added to `SPECIAL_RECIPES` and/or to `ONE_TASK_RECIPES`. +Other recipes should run successfully with the default SLURM settings set in this script. + +The launch scripts will be saved in the same directory you execute the script from. These are named like ``launch_recipe_.sh``. +To submit these scripts to the SLURM scheduler, use the ``sbatch launch_recipe_.sh`` command. You can check the status of your BATCH queue by invoking: + +.. code-block:: bash + + squeue -u $USER + +Also, for computationally-heavy recipes, you can require more memory and/or time, see e.g. edited batch header below +(note the `compute` partition which is used for such heavy runs): + +.. code-block:: bash + + #SBATCH --partition=compute + #SBATCH --time=08:00:00 + #SBATCH --mem=0 + #SBATCH --constraint=512G + +.. note:: + + On DKRZ/Levante, a user can't have more than 20 SLURM jobs running at a time. + As soon as a job is finished, the next one should start. More information on the job handling at DKRZ `here + `_. + Also note that the ``--mem=0`` argument needs be specified if any of the ``--constraint`` arguments are + used for memory requests, so that the node's full memory is allocated. + +Analyse the results +------------------- + +Once all jobs are completed, assemble some statistics so that issues with certain recipes +can be followed-up, and document this information in the release issue, such as: + +- number of successfully run recipes +- number of failed recipes with preprocessor errors (can they be fixed? Can the fixes be included in the release?) +- number of failed recipes with diagnostic errors (can they be fixed? Can the fixes be included in the release?) +- number of recipes that are missing data +- number of recipes that have various other issues (and document them) + +To parse the output of all these runs, use the ``parse_recipes_output.py`` :ref:`utility Python script `. +It is recommended to run the recipes with `log_level: info` in your config file to enable the parsing script to run fast. + +Share the results with the community +------------------------------------ + +Create the debug.html and index.html overview webpages by running the :ref:`utility script ` +in the directory containing the recipe runs. +These two files, together with the recipe output, need to be copied to the disk of a virtual machine (VM) +used to display recipe output in `webpages +`_. +Do not store final release results on the VM including `/preproc/` dirs, the total +size for all the recipes output, including `/preproc/` dirs is in the 4.5TB ballpark, +much too high for the VM storage capacity! Therefore, we would recommend using the option +to remove preprocessing directories upon recipe running successfully ``--remove-preproc-dir=True`` +at runtime, or set ``remove_preproc_dir: true`` in the configuration file. + +Login and access to the DKRZ esmvaltool VM - results from recipe runs +are stored on the VM; log in to the Levante head node and then continue to the VM with: + +.. code-block:: bash + + ssh user@esmvaltool.dkrz.de + +where `user` is your DKRZ/Levante user name. +Then create a new subdirectory in ``/shared/esmvaltool/`` that will contain recipe output. +This should be named like the ESMValCore version used for the testing, e.g. ``v2.x.xrcx`` or ``v2.x.x``. +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/ + +By copying the debug.html and index.html files into /shared/esmvaltool/v2.x.x/, the output +becomes available online, see for `example +`_. +Before copying the recipe output to the VM, you may want to clean up your directory containing +the results by removing any large ``preproc`` directories of failed runs and only keeping the last run for each recipe. +This will help generating a clearer overview webpage. +Note that the ``summarize.py`` script needs to be rerun if recipe runs were added or deleted +from your testing directory. + +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``. +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 + output data to the VM, using the ``nohup`` command above. + +Running the comparison +---------------------- + +To compare the newly produced output from running all recipes, follow these steps below. + +Access to the DKRZ esmvaltool VM, then install miniconda on the VM, and +if you have a Miniconda installer already downloaded in your Levante $HOME + +.. code-block:: bash + + scp Miniconda3-py39_4.12.0-Linux-x86_64.sh user@esmvaltool.dkrz.de:/mnt/esmvaltool_disk2/work/ + +.. warning:: + + conda environments should not be created in the home directory because it is on a very small disk, + but rather in a directory with your username under `/mnt/esmvaltool_disk2/work/` + +Next, we need to set up the input files + +The ``/work`` partition is visible from the VM so you can run the compare tool straight on the VM. + +The steps to running the compare tool on the VM are the following: + +- run date: log the run date here +- conda env: log the name of the conda environment you are using +- ESMValTool branch: log the name of the code branch you are using (e.g. `v2.8.x`) +- 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: + +.. 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. +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: + +- look at plots from current run vs previous release run: most of them will be identical, but if Matplotlib + has changed some plotting feature, images may look slightly different so the comparison script may report them + if the difference is larger than the threshold - but Mark I eyeball inspection will show they are identical +- other plots will differ due to changes in plot settings (different colours, axes etc) due to updated settings from the + diagnostic developers: if they look similar enough, then it's fine +- report (and subsequently open issues) if you notice major differences in plots; most times a simple comment on the + release issue, whereby you tag the diagnostic developers leads to them having a look at the plots and OK-ing them; if that's + not the case, then open a separate issue. You can example of release issues containing overview lists and tables + of failures and problems in `2881 `_ + and `3076 `_. + +Appendix +-------- + +Here you can find a list of utility scripts used to run recipes and analyse the results: + +- :ref:`Python scripts` that create slurm submission scripts and parse slurm log files. +- :ref:`Python script` that compares one or more recipe runs to known good previous run(s). +- :ref:`Python script` that creates the ``index.html`` and ``debug.html`` overview pages. + +.. _`@ESMValGroup/esmvaltool-recipe-maintainers`: https://github.com/orgs/ESMValGroup/teams/esmvaltool-recipe-maintainers +.. _`@ESMValGroup/esmvaltool-developmentteam`: https://github.com/orgs/ESMValGroup/teams/esmvaltool-developmentteam diff --git a/doc/sphinx/source/community/release_strategy/index.rst b/doc/sphinx/source/community/release_strategy/index.rst new file mode 100644 index 0000000000..61445a031d --- /dev/null +++ b/doc/sphinx/source/community/release_strategy/index.rst @@ -0,0 +1,17 @@ +.. _release_strategy: + +Release strategy and procedure +============================== + +These pages detail the release strategy and technical procedures +during a release; these pages are very helpful if you are the next +Release Manager. + +For the release schdule, check the :ref:`release_schedule` to see upcoming +and past releases. + +.. toctree:: + :maxdepth: 1 + + Release strategy and procedure + Detailed testing before release diff --git a/doc/sphinx/source/community/release_strategy.rst b/doc/sphinx/source/community/release_strategy/release_strategy.rst similarity index 83% rename from doc/sphinx/source/community/release_strategy.rst rename to doc/sphinx/source/community/release_strategy/release_strategy.rst index c853ae8ac5..8d97fe90af 100644 --- a/doc/sphinx/source/community/release_strategy.rst +++ b/doc/sphinx/source/community/release_strategy/release_strategy.rst @@ -1,3 +1,5 @@ +.. _preparation-new-release: + Release schedule and procedure for ESMValCore and ESMValTool ============================================================ @@ -52,16 +54,16 @@ With the following release schedule, we strive to have three releases per year a Upcoming releases ^^^^^^^^^^^^^^^^^ -- 2.10.0 (Release Manager: TBA) +- 2.8.0 (Release Manager: `Rémi Kazeroni`_) +------------+--------------------------+ -| 2023-10-02 |ESMValCore feature freeze | +| 2023-03-03 |ESMValCore feature freeze | +------------+--------------------------+ -| 2023-10-09 |ESMValCore release | +| 2023-03-23 |ESMValCore release | +------------+--------------------------+ -| 2023-10-16 |ESMValTool feature freeze | +| 2023-03-17 |ESMValTool feature freeze | +------------+--------------------------+ -| 2023-10-23 |ESMValTool release | +| 2023-03-28 |ESMValTool release | +------------+--------------------------+ - 2.9.0 (Release Manager: TBA) @@ -76,33 +78,43 @@ Upcoming releases | 2023-06-26 |ESMValTool release | +------------+--------------------------+ -- 2.8.0 (Release Manager: TBA) - -+------------+--------------------------+ -| 2023-02-06 |ESMValCore feature freeze | -+------------+--------------------------+ -| 2023-02-13 |ESMValCore release | -+------------+--------------------------+ -| 2023-02-20 |ESMValTool feature freeze | -+------------+--------------------------+ -| 2023-02-27 |ESMValTool release | -+------------+--------------------------+ - -- 2.7.0 (Release Manager: `Valeriu Predoi`_) +- 2.10.0 (Release Manager: TBA) +------------+--------------------------+ -| 2022-10-03 |ESMValCore feature freeze | +| 2023-10-02 |ESMValCore feature freeze | +------------+--------------------------+ -| 2022-10-10 |ESMValCore release | +| 2023-10-09 |ESMValCore release | +------------+--------------------------+ -| 2022-10-17 |ESMValTool feature freeze | +| 2023-10-16 |ESMValTool feature freeze | +------------+--------------------------+ -| 2022-10-24 |ESMValTool release | +| 2023-10-23 |ESMValTool release | +------------+--------------------------+ Past releases ^^^^^^^^^^^^^ +- 2.7.1 (Bugfix, Release Manager: `Valeriu Predoi`_) + ++------------+---------------------------------------------------------------------------------------------+------------------------------------+ +| Done | Event | Changelog | ++============+=============================================================================================+====================================+ +| 2022-12-12 | `ESMValCore Release 2.7.1 `_ | :ref:`esmvalcore:changelog-v2-7-1` | ++------------+---------------------------------------------------------------------------------------------+------------------------------------+ + +- 2.7.0 (Release Manager: `Valeriu Predoi`_) + ++------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ +| Planned | Done | Event | Changelog | ++============+============+=============================================================================================+====================================+ +| 2022-10-03 | | ESMValCore Feature Freeze | | ++------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ +| 2022-10-10 | 2022-10-13 | `ESMValCore Release 2.7.0 `_ | :ref:`esmvalcore:changelog-v2-7-0` | ++------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ +| 2022-10-17 | | ESMValTool Feature Freeze | | ++------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ +| 2022-10-24 | 2022-10-28 | `ESMValTool Release 2.7.0 `_ | :ref:`changelog-v2-7-0` | ++------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ + - 2.6.0 (Release Manager: `Saskia Loosveldt Tomas`_) +------------+------------+---------------------------------------------------------------------------------------------+------------------------------------+ @@ -219,6 +231,8 @@ Past releases +.. _release_steps: + Detailed timeline steps ~~~~~~~~~~~~~~~~~~~~~~~ @@ -230,35 +244,28 @@ These are the detailed steps to take to make a release. - Any contributor is welcome to add issues or pull requests that they intend to work on themselves to a milestone. -#. ESMValCore feature freeze +#. ESMValCore feature freeze, testing, and release candidates - A release branch is created and branch protection rules are set up so only the release manager (i.e. the person in charge of the release branch) can push commits to that branch. - - The creation of the release branch is announced to the ESMValTool development team along with the procedures to use the branch for testing and making last-minute changes (see next step) - - -#. Some additional testing of ESMValCore - - - Run all the recipes (optionally with a reduced amount of data) to check that they still work + - Make a release candidate with the release branch following the :ref:`ESMValCore release instructions `. + - Uncomment the release candidate channel item (i.e. ``conda-forge/label/esmvalcore_rc``) in the ``environment.yml`` of ESMValTool to add it to the list of channels used. Adjust the pin on ESMValCore after each release candidate (e.g. ``esmvalcore==2.8.0rc1``). Check that the environment creation of ESMValTool works fine and contains the latest release candidate version. + - Run all the recipes (optionally with a reduced amount of data) to check that they still work with the release candidate. - 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. - - -#. ESMValCore release - - - Make the release by following the :ref:`ESMValCore release instructions `. - - Ask the user engagement team to announce the release to the user mailing list, the development team mailing list, on twitter + - Make another release candidate including the bugfix(es) and run the affected recipes again to check for further bugs. + - Make as many release candidates for ESMValCore as needed in order to fix all the detected bugs. #. ESMValTool feature freeze - A release branch is created and branch protection rules are set up so only the release manager (i.e. the person in charge of the release branch) can push commits to that branch. - - The creation of the release branch is announced to the ESMValTool development team along with the procedures to use the branch for testing and making last-minute changes (see next step) + - The creation of the release branch is announced to the ESMValTool development team along with the procedures to use the branch for testing and making last-minute changes (see next step). #. Some additional testing of ESMValTool - - :ref:`Run all the recipes to check that they still work and generate the overview HTML pages.` + - :ref:`Run all the recipes to check that they still work and generate the overview HTML pages `. - Upload the results to the webpage at https://esmvaltool.dkrz.de/shared/esmvaltool/. - - :ref:`Compare the results to those obtained with the previous release.` + - :ref:`Compare the results to those obtained with the previous release `. - Create a `GitHub discussion `__ to communicate about the results. - If there are differences with the previous release, ask recipe maintainers or authors to review the plots and NetCDF files of their diagnostics, for @@ -266,12 +273,27 @@ These are the detailed steps to take to make a release. `mentioning `__ them in the discussion. - 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. + + +#. ESMValCore release + + - Make the official ESMValCore release with the last release candidate by following the :ref:`ESMValCore release instructions `. #. ESMValTool release - - Make the release by following :ref:`How to make a release` - - Ask the user engagement team to announce the release to the user mailing list, the development team mailing list, and on twitter + - Pin ESMValCore to the same version as ESMValTool in the ``environment.yml`` and on `conda-forge + `__. + This way, we make sure that ESMValTool uses the ESMValCore version with which it has been tested. + Make sure to comment again the release candidate channel once ESMValCore has been released. + - Make the release by following :ref:`How to make a release`. + + +#. Announce the releases + + - Ask the user engagement team to announce the releases to the user mailing list, the development team mailing list, and on twitter. #. Core development team meets to coordinate the content of next milestone @@ -305,15 +327,24 @@ Glossary Feature freeze ~~~~~~~~~~~~~~ -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. +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`. + Milestone ~~~~~~~~~ A milestone is a list of issues and pull-request on GitHub. It has a due date, this date is the date of the feature freeze. Adding an issue or pull request indicates the intent to finish the work on this issue before the due date of the milestone. If the due date is missed, the issue can be included in the next milestone. +.. _release_manager: + Release manager ~~~~~~~~~~~~~~~ The person in charge of making the release, both technically and organizationally. Appointed for a single release. +Check the :ref:`release_schedule` to see who is the manager of the next release. + +.. _release_branch: Release branch ~~~~~~~~~~~~~~ @@ -325,6 +356,9 @@ The release branch can be used to do some additional testing before the release, How to make an ESMValTool release --------------------------------- +Before the actual release, a number of tests, and pre-release steps must be performed, +a detailed workflow description can be found here :ref:`detailed_release_procedure`. + The release manager makes the release, assisted by the release manager of the previous release, or if that person is not available, another previous release manager. @@ -341,6 +375,7 @@ error. `PyPI `__, and `readthedocs `__. +The release of ESMValTool should come after the release of ESMValCore. To make a new release of the package, follow these steps: 1. Check that all tests and builds work @@ -368,17 +403,33 @@ git using [setuptools-scm](https://pypi.org/project/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. +Make sure that the ESMValCore version that is being used is set to the latest version. +See the :ref:`dependencies ` section in order to find more details on how update the ESMValCore version. Make a pull request and get it merged into ``main``. +.. _add-release-notes: + 3. Add release notes ~~~~~~~~~~~~~~~~~~~~ -Use the script :ref:`draft_release_notes.py` to create create a draft of the +Use the script :ref:`draft_release_notes.py` to create a draft of the release notes. This script uses the titles and labels of merged pull requests since the previous release. +Open a discussion to allow members of the development team to nominate pull requests +as highlights. Add the most voted pull requests as highlights at the beginning of +changelog. +After the highlights section, list any backward incompatible changes that the +release may include. +The :ref:`backward compatibility policy ` +lists the information that should be provided by the developer of any backward +incompatible change. +Make sure to also list any deprecations that the release may include, as well +as a brief description on how to upgrade a deprecated feature. Review the results, and if anything needs changing, change it on GitHub and re-run the script until the changelog looks acceptable. Copy the result to the file ``doc/sphinx/source/changelog.rst``. +If possible, try to set the script dates to the date of the release +you are managing. Make a pull request and get it merged into ``main``. 4. Create a release branch @@ -390,21 +441,7 @@ Announce the name of the branch in an issue and ask the members of the `ESMValTool development team `__ to run their favourite recipe using this branch. -5. Cherry pick bugfixes into the release branch -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -If a bug is found and fixed (i.e. pull request merged into the -``main`` branch) during the period of testing, use the command -``git cherry-pick COMMIT_HASH``, where ``COMMIT_HASH`` is the commit hash of the -commit that needs to be cherry-picked, to include the commit for this bugfix -into the release branch. -Cherry-pick any new contributions in the order they were merged, to avoid -conflicts. -When the testing period is over, make a pull request to update -the release notes with the latest changes (do not forget to include the pull -request itself into the changelog), get it merged into ``main`` and -cherry-pick it into the release branch. - -6. Make the release on GitHub +5. Make the release on GitHub ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Do a final check that all tests on CircleCI and GitHub Actions completed @@ -415,7 +452,7 @@ 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``. -7. Create and upload the PyPI package +6. Create and upload the PyPI package ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The package is automatically uploaded to the @@ -446,7 +483,7 @@ Follow these steps to create a new Python package: You can read more about this in `Packaging Python Projects `__. -8. Create the Conda package +7. Create the Conda package ~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``esmvaltool`` package is published on the `conda-forge conda channel @@ -467,7 +504,7 @@ they will merge the pull request, which will in turn publish the package on conda-forge some time later. Contact the feedstock maintainers if you want to become a maintainer yourself. -9. Check the Docker images +8. Check the Docker images ~~~~~~~~~~~~~~~~~~~~~~~~~~ There are three main Docker container images available for ESMValTool on @@ -546,7 +583,6 @@ by the actual ID. Changelog --------- - - 2020-09-09 Converted to rst and added to repository (future changes tracked by git) - 2020-09-03 Update during video conference (present: Bouwe Andela, Niels Drost, Javier Vegas, Valeriu Predoi, Klaus Zimmermann) - 2020-07-27 Update including tidying up and Glossary by Klaus Zimmermann and Bouwe Andela diff --git a/doc/sphinx/source/community/review.rst b/doc/sphinx/source/community/review.rst index 74bc6ce77d..41e596dda9 100644 --- a/doc/sphinx/source/community/review.rst +++ b/doc/sphinx/source/community/review.rst @@ -21,6 +21,10 @@ If you are a regular contributor, please try to review a bit more than two other pull requests for every pull request you create yourself, to make sure that each pull request gets the attention it deserves. +If a pull request contains backward-incompatible changes, the developer or +reviewer must tag the `@ESMValGroup/esmvaltool-coreteam`_ team to notify them +of the :ref:`backward-incompatible change `. + .. _technical_review: 1. Technical review @@ -82,6 +86,13 @@ Any issues that were solved by the pull request can be closed after merging. It is always a good idea to check with the author of an issue and ask if it is completely solved by the related pull request before closing the issue. +If a pull request contains +:ref:`backward-incompatible changes `, +the person in charge of merging must give the core development team at least 2 +weeks for objections to be raised before merging to the main branch. +If a strong objection is raised the backward-incompatible change should not be +merged until the objection is resolved. + The core development team can be contacted by writing `@ESMValGroup/esmvaltool-coreteam`_ in a comment on an issue or pull request on GitHub. diff --git a/doc/sphinx/source/generate_gallery.py b/doc/sphinx/source/generate_gallery.py index d1f15f0e5b..ec1aa6034a 100644 --- a/doc/sphinx/source/generate_gallery.py +++ b/doc/sphinx/source/generate_gallery.py @@ -9,7 +9,11 @@ HEADER = ('.. DO NOT MODIFY! THIS PAGE IS AUTOGENERATED!\n\n' '#######\nGallery\n#######\n\n' 'This section shows example plots produced by ESMValTool. For more ' - 'information, click on the footnote below the image.\n\n') + 'information, click on the footnote below the image. ' + 'A website displaying results produced with the latest release of ' + 'ESMValTool for all available recipes can be accessed `here ' + '`_.' + '\n\n') WIDTH = ':width: 90%' FIGURE_STR = '.. figure::' IMAGE_STR = ' image:: ' diff --git a/doc/sphinx/source/gensidebar.py b/doc/sphinx/source/gensidebar.py index 3e9197072a..970722ff0a 100644 --- a/doc/sphinx/source/gensidebar.py +++ b/doc/sphinx/source/gensidebar.py @@ -73,6 +73,7 @@ def _header(project, text): _header("esmvalcore", "ESMValCore") _write("esmvalcore", "Getting started", "quickstart/index") + _write("esmvalcore", "Example notebooks", "example-notebooks") _write("esmvalcore", "The recipe format", "recipe/index") _write("esmvalcore", "Diagnostic script interfaces", "interfaces") _write("esmvalcore", "Development", "develop/index") diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index ce7d2c1717..2a0e9c2956 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -72,7 +72,7 @@ For example, run .. code-block:: bash - esmvaltool run --offline=False examples/recipe_python.yml + esmvaltool run --search_esgf=when_missing examples/recipe_python.yml to run the default example recipe and automatically download the required data to the directory ``~/climate_data``. @@ -268,15 +268,14 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | Eppley-VGPM-MODIS | intpp (Omon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| ERA5 [#note1]_ | clt, evspsbl, evspsblpot, mrro, pr, prsn, ps, psl, ptype, rls, rlds, rlns, rlus [#note2]_, rsds, | 3 | n/a | +| ERA5 [#note1]_ | cl, clt, evspsbl, evspsblpot, mrro, pr, prsn, ps, psl, ptype, rls, rlds, rlns, rlus [#note2]_, rsds, | 3 | n/a | | | rsns, rsus [#note2]_, rsdt, rss, uas, vas, tas, tasmax, tasmin, tdps, ts, tsn (E1hr/Amon), orog (fx) | | | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ERA5-Land [#note1]_ | pr | 3 | n/a | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| ERA-Interim | clivi, clt, clwvi, evspsbl, hur, hus, pr, prsn, prw, ps, psl, rlds, rsds, rsdt, ta, tas, tauu, tauv, | 3 | Python | -| | ts, ua, uas, va, vas, wap, zg (Amon), ps, rsdt (CFday), clt, pr, prsn, psl, rsds, rss, ta, tas, | | | -| | tasmax, tasmin, uas, va, vas, zg (day), evspsbl, tdps, ts, tsn, rss, tdps (Eday), tsn (LImon), hfds, | | | -| | tos (Omon), orog, sftlf (fx) | | | +| ERA-Interim | cl, cli, clivi, clt, clw, clwvi, evspsbl, hfds, hur, hus, lwp, orog, pr, prsn, prw, ps, psl, rlds, | 3 | Python | +| | rlut, rlutcs, rsds, rsdt, rss, rsut, rsutcs, sftlf, ta, tas, tasmax, tasmin, tauu, tauv, tdps, tos, | | | +| | ts, tsn, ua, uas, va, vas, wap, zg | | | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ERA-Interim-Land | sm (Lmon) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ @@ -302,13 +301,15 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ESACCI-WATERVAPOUR | prw (Amon) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +| ESDC | tas, tasmax, tasmin (Amon) | 2 | Python | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ESRL | co2s (Amon) | 2 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | FLUXCOM | gpp (Lmon) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| GCP2018 | fgco2 (Omon), nbp (Lmon) | 2 | Python | +| GCP2018 | fgco2 (Omon [#note3]_), nbp (Lmon [#note3]_) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| GCP2020 | fgco2 (Omon), nbp (Lmon) | 2 | Python | +| GCP2020 | fgco2 (Omon [#note3]_), nbp (Lmon [#note3]_) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | GHCN | pr (Amon) | 2 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ @@ -338,6 +339,8 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | JMA-TRANSCOM | nbp (Lmon), fgco2 (Omon) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +| JRA-25 | clt, hus, prw, rlut, rlutcs, rsut, rsutcs (Amon) | 2 | Python | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | Kadow2020 | tasa (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | LAI3g | lai (Lmon) | 3 | Python | @@ -346,36 +349,50 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | Landschuetzer2016 | dpco2, fgco2, spco2 (Omon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +| Landschuetzer2020 | spco2 (Omon) | 2 | Python | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | MAC-LWP | lwp, lwpStderr (Amon) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | MERRA2 | sm (Lmon) | 3 | Python | +| | clt, pr, evspsbl, hfss, hfls, huss, prc, prsn, prw, ps, psl, rlds, rldscs, rlus, rlut, rlutcs, rsds, | | | +| | rsdscs, rsdt, tas, tasmin, tasmax, tauu, tauv, ts, uas, vas, rsus, rsuscs, rsut, rsutcs, ta, ua, va, | | | +| | tro3, zg, hus, wap, hur (Amon) | | | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | MLS-AURA | hur, hurStderr (day) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +| MOBO-DIC_MPIM | dissic (Omon) | 2 | Python | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | MODIS | cliwi, clt, clwvi, iwpStderr, lwpStderr (Amon), od550aer (aero) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | MSWEP [#note1]_ | pr | 3 | n/a | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | MTE | gpp, gppStderr (Lmon) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| NCEP | hur, hus, pr, ta, tas, ua, va, wap, zg (Amon) | 2 | NCL | +| NCEP-NCAR-R1 | clt, hur, hurs, hus, pr, prw, psl, rlut, rlutcs, rsut, rsutcs, sfcWind, ta, tas, | 2 | Python | +| | tasmax, tasmin, ts, ua, va, wap, zg (Amon) | | | | | pr, rlut, ua, va (day) | | | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +| NCEP-DOE-R2 | clt, hur, prw, ta (Amon) | 2 | Python | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | NDP | cVeg (Lmon) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | NIWA-BS | toz, tozStderr (Amon) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +| NOAA-CIRES-20CR | clt, clwvi, hus, prw, rlut, rsut (Amon) | 2 | Python | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | NOAAGlobalTemp | tasa (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | NSIDC-0116-[nh|sh] | usi, vsi (day) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +| OceanSODA-ETHZ | areacello (Ofx), co3os, dissicos, fgco2, phos, spco2, talkos (Omon) | 2 | Python | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | OSI-450-[nh|sh] | sic (OImon), sic (day) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | PATMOS-x | clt (Amon) | 2 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | PERSIANN-CDR | pr (Amon), pr (day) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| PHC | thetao, so | 2 | Python | +| PHC | thetao, so (Omon [#note3]_) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | PIOMAS | sit (day) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ @@ -383,6 +400,10 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | Scripps-CO2-KUM | co2s (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +| TCOM-CH4 | ch4 (Amon [#note3]_) | 2 | Python | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +| TCOM-N2O | n2o (Amon [#note3]_) | 2 | Python | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | UWisc | clwvi, lwpStderr (Amon) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | WFDE5 | tas, pr (Amon, day) | 2 | Python | @@ -391,10 +412,16 @@ A list of the datasets for which a CMORizers is available is provided in the fol | | no3, o2, po4, si (Oyr) | | | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -.. [#note1] CMORization is built into ESMValTool through the native6 project, so there is no separate CMORizer script. +.. [#note1] CMORization is built into ESMValTool through the native6 project, + so there is no separate CMORizer script. .. [#note2] Derived on the fly from down & net radiation. +.. [#note3] The frequency of this variable differs from the one specified in + the table. The correct entry that needs to be used in the recipe + can be found in the corresponding section of `recipe_check_obs.yml + `__. + .. _inputdata_native_datasets: @@ -428,8 +455,8 @@ For example: .. code-block:: yaml datasets: - - {project: native6, dataset: ERA5, type: reanaly, version: '1', tier: 3, start_year: 1990, end_year: 1990} - - {project: ICON, dataset: ICON, version: 42-0, component: atm, exp: amip, grid: R2B5, ensemble: r1i1, var_type: 2d} + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, start_year: 1990, end_year: 1990} + - {project: ICON, dataset: ICON, exp: icon-2.6.1_atm_amip_R2B5_r1i1p1f1, mip: Amon, short_name: tas, start_year: 2000, end_year: 2014} For project ``native6``, more examples can be found in the diagnostics ``ERA5_native6`` in the recipe `examples/recipe_check_obs.yml diff --git a/doc/sphinx/source/introduction.rst b/doc/sphinx/source/introduction.rst index fc18ac2b38..5802f1689d 100644 --- a/doc/sphinx/source/introduction.rst +++ b/doc/sphinx/source/introduction.rst @@ -59,7 +59,7 @@ Support for ESMValTool can be found in `ESMValTool Discussions page `__ where users can open an issue and a member of the `User Engagement Team `_ of ESMValTool -will reply as soon as possible. +will reply as soon as possible. This is open for all general and technical questions on the ESMValTool: installation, application, development, or any other question or comment you may have. @@ -85,8 +85,7 @@ or The mailing list also has a `public archive `_ online. - - +.. _monthly-meetings: Monthly meetings ---------------- @@ -94,8 +93,8 @@ Monthly meetings We have monthly online meetings using `zoom `__, anyone with an interest in the ESMValTool is welcome to join these meetings to connect with the community. -These meetings are always announced in an issue -on the `ESMValTool `_ +These meetings are always announced in a discussion +on the `ESMValTool Community `_ repository and on the mailing-list_. .. _core-team: diff --git a/doc/sphinx/source/quickstart/installation.rst b/doc/sphinx/source/quickstart/installation.rst index f2f45cced8..371ee417fd 100644 --- a/doc/sphinx/source/quickstart/installation.rst +++ b/doc/sphinx/source/quickstart/installation.rst @@ -8,35 +8,40 @@ Installation ESMValTool now uses `mamba` instead of `conda` for the recommended installation. For more information about the change, have a look at :ref:`Move to Mamba`. -ESMValTool 2.0 requires a Unix(-like) operating system and Python 3.8+. +ESMValTool supports Python 3.8 and later and requires Linux or MacOS. +Successful usage on Windows has been reported by following the Linux +installation instructions with +`WSL `__. -The ESMValTool can be installed in multiple ways. +ESMValTool can be installed in multiple ways. -Recommended installation methods: +Recommended installation method: -* On Linux, please install via the :ref:`mamba package manager` (see https://anaconda.com); +Install the :ref:`mamba package manager ` and then follow +the instructions for -* For MacOSX, please follow separate instructions for :ref:`installation on MacOSX`. +* :ref:`ESMValTool installation on Linux` +* :ref:`ESMValTool installation on MacOS`. Further options for installation are: -* :ref:`Installation with pip and mamba` (see https://pypi.org); +* :ref:`From the source code` available at https://github.com/ESMValGroup/ESMValTool; +* :ref:`From pre-installed versions on HPC clusters`; * :ref:`Deployment through a Docker container` (see https://www.docker.com); - * :ref:`Deployment through a Singularity container` (see https://sylabs.io/guides/latest/user-guide/); - -* :ref:`From the source code` available at https://github.com/ESMValGroup/ESMValTool; - -* :ref:`From pre-installed versions on HPC clusters`. +* :ref:`Installation with pip ` (see https://pypi.org); +* :ref:`installation_from_the_conda_lock_file`. The next sections will detail the procedure to install ESMValTool through each of these methods. -Note that there is also a -`Tutorial `__ -available with more explanations and guidance if the installation instructions -here are too concise. +There is also a lesson available in the +`ESMValTool tutorial `_ +that describes the installation of the ESMValTool in more detail. +It can be found +`here `_. + See `common installation issues`_ if you run into trouble. .. _install_with_mamba: @@ -44,13 +49,27 @@ See `common installation issues`_ if you run into trouble. Mamba/Conda installation ======================== -In order to install the `conda `_ package, you will need -mamba pre-installed. +In order to install ESMValTool and its dependencies from +`conda-forge `__, you will first need to install the +`mamba package manager `__. +We recommend using `mamba `__ as a package manager +for your conda environments instead of +`conda `__ because it is +much faster, see `move-to-mamba`_ for more information. For a minimal mamba installation (recommended) go to https://mamba.readthedocs.io/en/latest/installation.html. -It is recommended that you always use the latest version of mamba, as problems -have been reported when trying to use older versions. + +.. note:: + It is recommended that you always use the latest version of mamba, as + problems have been reported when trying to use older versions. + +.. note:: + Some systems provide a pre-installed version of conda or mamba (e.g. via + the module environment). + However, several users reported problems when installing with such versions. + It is therefore preferable to use a local, fully user-controlled mamba + installation. First download the installation file for `Linux `_ @@ -64,11 +83,26 @@ by running (Linux example): bash Mambaforge-Linux-x86_64.sh and follow the instructions on your screen. -Immediately update mamba after installing it: + +.. note:: + Make sure to choose an installation location where you have at least 10 GB + of disk space available. + +During installation, mamba will ask you if you want ``mamba`` to be +automatically loaded from your ``.bashrc`` or ``.bash-profile`` files. +It is recommended that you answer yes. +If you answered no, you can load the correct paths and environment variables +later by running: .. code-block:: bash - mamba update --name base mamba + source /etc/profile.d/conda.sh + +where ```` is the installation location of mamba (e.g. +``/home/$USER/mambaforge`` if you chose the default installation path). + +If you use another shell than Bash, have a look at the available configurations +in the ``/etc/profile.d`` directory. You can check that mamba installed correctly by running @@ -79,61 +113,58 @@ You can check that mamba installed correctly by running this should show the path to your mamba executable, e.g. ``~/mambaforge/bin/mamba``. -ESMValTool installation -======================= - -Once you have installed the above prerequisites, you can install the entire -ESMValTool package by running: +It is recommended to update both mamba and conda after installing: .. code-block:: bash - mamba create --name esmvaltool esmvaltool 'python=3.10' + mamba update --name base mamba conda -Here ``mamba`` is the executable calling the mamba package manager to install -``esmvaltool``. The reason why we are also specifying ``'python=3.10'`` is that -it will make it easier for mamba to find a working combination of all required -packages, see `Mamba fails to solve the environment`_ in `common installation -issues`_ for an in-depth explanation. Python 3.8 and 3.9 are also supported, in -case you prefer to work with an older version of Python. +.. _install_on_linux: -This will create a new -`conda environment `_ -and install ESMValTool into it with a single command. +ESMValTool installation on Linux +-------------------------------- +Once you have installed the mamba package manager, you can install +the entire ESMValTool package by running: .. code-block:: bash - conda activate esmvaltool - -Of course it is also possible to choose a different name than ``esmvaltool`` for the environment. - -The next step is to check that the installation works properly. -To do this, run the tool with: + mamba create --name esmvaltool esmvaltool -.. code-block:: bash +It is also possible to install just a subset of the ESMValTool dependencies +by installing one or more of the :ref:`subpackages ` +described in the next section. - esmvaltool --help - -If everything was installed properly, ESMValTool should have printed a help -message to the console. +The command above will create a new +`conda environment `_ +called ``esmvaltool``, and install ESMValTool in it. +Of course it is also possible to choose a different name than ``esmvaltool`` +for the environment. .. note:: Creating a new conda environment is often much faster and more reliable than trying to update an existing conda environment. + Therefore it is recommended that you create a new environment when you + want to upgrade to the latest version. -Julia installation ------------------- +The next step is to check that the installation works properly. -If you want to use the ESMValTool Julia functionality, you will also need to -install Julia. If you are just getting started, we suggest that you -come back to this step later when and if you need it. -To perform the Julia installation, make sure that your conda -environment is activated and then execute +First activate the environment with the command: .. code-block:: bash - mamba install julia + conda activate esmvaltool + +and then run the tool with the command: + +.. code-block:: bash + + esmvaltool --help + +If everything was installed properly, ESMValTool should have printed a help +message to the console. + .. _conda subpackages: @@ -149,12 +180,14 @@ There are three language specific packages available: * ``esmvaltool-python`` * ``esmvaltool-r`` -The main ``esmvaltool`` package contains all four subpackages listed above. If -you only need to run a recipe with diagnostics in some of these languages, it is -possible to install only the dependencies needed to do just that. The diagnostic -script(s) used in each recipe, are documented in :ref:`recipes`. The extension -of the diagnostic script can be used to see in which language a diagnostic -script is written. +The main ``esmvaltool`` package contains all three subpackages listed above. +For the Julia dependencies, there is no subpackage yet, but there are special +:ref:`installation instructions `. +If you only need to run a recipe with diagnostics in some of these languages, it +is possible to install only the dependencies needed to do just that. +The diagnostic script(s) used in each recipe, are documented in :ref:`recipes`. +The extension of the diagnostic script can be used to see in which language a +diagnostic script is written (``.py`` for Python, ``.ncl`` for NCL, ``.R`` for R, and ``.jl`` for Julia diagnostics). To install support for diagnostics written in Python and NCL into an existing environment, run @@ -171,29 +204,41 @@ Note that the ESMValTool source code is contained in the ``esmvaltool-python`` package, so this package will always be installed as a dependency if you install one or more of the packages for other languages. -There is also a lesson available in the -`ESMValTool tutorial `_ -that describes the installation of the ESMValTool in more detail. It can be found -`here `_. +.. _install_julia_dependencies: + +Installation of Julia dependencies +---------------------------------- +If you want to use the ESMValTool Julia functionality, you will also need to +install Julia. If you are just getting started, we suggest that you +come back to this step later when, and if you need it. +To perform the Julia installation, make sure that your conda +environment is activated and then execute + +.. code-block:: bash + + mamba install julia + esmvaltool install Julia .. _install_on_macosx: -Installation on MacOSX -====================== +ESMValTool installation on MacOS +--------------------------------- -The Python diagnostics of the ESMValTool are supported on MacOSX, but Julia, NCL, -and R are not. If any of these are needed, deployment through a :ref:`Docker` +The Python diagnostics of the ESMValTool are supported on MacOS, but Julia, +NCL, and R are not. +If any of these are needed, deployment through a +:ref:`Docker` container is advised. The ``esmvaltool-python`` diagnostics can be installed as follows: -First, ensure mamba is pre-installed (see `Mamba/Conda installation`_ for more details). +First, ensure mamba is installed (see install_with_mamba_ for more details). Create a new environment with the ``esmvaltool-python`` package: .. code-block:: bash - mamba create --name esmvaltool esmvaltool-python 'python=3.10' + mamba create --name esmvaltool esmvaltool-python Activate the new environment: @@ -208,7 +253,7 @@ Confirm that the ESMValTool is working with: esmvaltool --help Note that some recipes may depend on the OpenMP library, which does not -install via mamba on MacOSX. To install this library, run: +install via mamba on MacOS. To install this library, run: .. code-block:: bash @@ -217,146 +262,6 @@ install via mamba on MacOSX. To install this library, run: to install the library with Homebrew. In case you do not have Homebrew, follow installation instructions `here `__. -.. _install_with_pip: - -Pip installation -================ - -It is also possible to install ESMValTool from `PyPI `_. -However, this requires first installing dependencies that are not available on PyPI in some other way. -By far the easiest way to install these dependencies is to use `mamba`. -For a minimal mamba installation (recommended) go to https://mamba.readthedocs.io/en/latest/installation.html. - -After installing mamba, download -`the file with the list of dependencies `_: - -.. code-block:: bash - - wget https://raw.githubusercontent.com/ESMValGroup/ESMValTool/main/environment.yml - -and install these dependencies into a new conda environment with the command - -.. code-block:: bash - - mamba env create --name esmvaltool --file environment.yml - - -Finally, activate the newly created environment - -.. code-block:: bash - - conda activate esmvaltool - -and install ESMValTool as well as any remaining Python dependencies with the command: - -.. code-block:: bash - - pip install esmvaltool - -If you would like to run Julia diagnostic scripts, you will also need to -install the Julia dependencies: - -.. code-block:: bash - - esmvaltool install Julia - -.. _install_with_docker: - -Docker installation -=================== - -ESMValTool is also provided through `DockerHub `_ -in the form of docker containers. -See https://docs.docker.com for more information about docker containers and how to -run them. - -You can get the latest release with - -.. code-block:: bash - - docker pull esmvalgroup/esmvaltool:stable - -If you want to use the current main branch, use - -.. code-block:: bash - - docker pull esmvalgroup/esmvaltool:latest - -To run a container using those images, use: - -.. code-block:: bash - - docker run esmvalgroup/esmvaltool:stable --help - -Note that the container does not see the data or environmental variables -available in the host by default. You can make data available with -``-v /path:/path/in/container`` and environmental variables with ``-e VARNAME``. - -For example, the following command would run a recipe - -.. code-block:: bash - - docker run -e HOME -v "$HOME":"$HOME" -v /data:/data esmvalgroup/esmvaltool:stable run examples/recipe_python.yml - -with the environmental variable ``$HOME`` available inside the container and -the data in the directories ``$HOME`` and ``/data``, so these can be used to -find the configuration file, recipe, and data. - -It might be useful to define a `bash alias -`_ -or script to abbreviate the above command, for example - -.. code-block:: bash - - alias esmvaltool="docker run -e HOME -v $HOME:$HOME -v /data:/data esmvalgroup/esmvaltool:stable" - -would allow using the ``esmvaltool`` command without even noticing that the -tool is running inside a Docker container. - -.. _install_with_singularity: - -Singularity installation -======================== - -Docker is usually forbidden in clusters due to security reasons. However, -there is a more secure alternative to run containers that is usually available -on them: `Singularity `_. - -Singularity can use docker containers directly from DockerHub with the -following command - -.. code-block:: bash - - singularity run docker://esmvalgroup/esmvaltool:stable run examples/recipe_python.yml - -Note that the container does not see the data available in the host by default. -You can make host data available with ``-B /path:/path/in/container``. - -It might be useful to define a `bash alias -`_ -or script to abbreviate the above command, for example - -.. code-block:: bash - - alias esmvaltool="singularity run -B $HOME:$HOME -B /data:/data docker://esmvalgroup/esmvaltool:stable" - -would allow using the ``esmvaltool`` command without even noticing that the -tool is running inside a Singularity container. - -Some clusters may not allow to connect to external services, in those cases -you can first create a singularity image locally: - -.. code-block:: bash - - singularity build esmvaltool.sif docker://esmvalgroup/esmvaltool:stable - -and then upload the image file ``esmvaltool.sif`` to the cluster. -To run the container using the image file ``esmvaltool.sif`` use: - -.. code-block:: bash - - singularity run esmvaltool.sif run examples/recipe_python.yml - .. _install_from_source: Install from source @@ -365,8 +270,7 @@ Install from source Installing the tool from source is recommended if you need the very latest features or if you would like to contribute to its development. -Obtaining the source code -------------------------- +*Obtaining the source code* The ESMValTool source code is available on a public GitHub repository: https://github.com/ESMValGroup/ESMValTool @@ -411,48 +315,14 @@ file. If you choose to use this option, download the compressed file and extract its contents at the desired location. -Installation Using Mamba from Source ------------------------------------- +*Install dependencies* It is recommended to use mamba to manage ESMValTool dependencies. -For a minimal mamba installation go to https://mamba.readthedocs.io/en/latest/installation.html. +See the :ref:`mamba installation instructions ` at the top +of this page for instructions on installing mamba. To simplify the installation process, an environment definition file is provided in the repository (``environment.yml`` in the root folder). -.. attention:: - Some systems provide a preinstalled version of conda (e.g., via the module environment). - However, several users reported problems when installing NCL with such versions. It is - therefore preferable to use a local, fully user-controlled mamba installation. - Using an older version of mamba can also be a source of problems, so if you have mamba - installed already, make sure it is up to date by running ``mamba update -n base mamba``. - -To enable the ``mamba`` command, please source the appropriate configuration file -from your ``~/.bashrc`` file: - -.. code-block:: bash - - source /etc/profile.d/conda.sh - -or ``~/.cshrc``/``~/.tcshrc`` file: - -.. code-block:: bash - - source /etc/profile.d/conda.csh - -where ```` is the install location of your anaconda or miniconda -(e.g. ``/home/$USER/mambaforge``, ``/home/$USER/anaconda3`` or ``/home/$USER/miniconda3``). - - -.. note:: - Note that during the installation, mamba will ask you - if you want the installation to be automatically sourced from your - ``.bashrc`` or ``.bash-profile`` files; if you answered yes, then mamba - will write bash directives to those files and every time you get to your - shell, you will automatically be inside conda's ``(base)`` environment. - To deactivate this feature, look for the ``# >>> conda initialize >>>`` - code block in your ``.bashrc`` or ``.bash-profile`` and comment the whole block out. - - The ESMValTool conda environment file can also be used as a requirements list for those cases in which a mamba installation is not possible or advisable. From now on, we will assume that the installation is going to be done through @@ -461,70 +331,54 @@ mamba. Ideally, you should create a separate conda environment for ESMValTool, so it is independent from any other Python tools present in the system. -Note that it is advisable to update mamba to the latest version before -installing ESMValTool, using the command (as mentioned above) - -.. code-block:: bash - - mamba update --name base mamba - To create an environment, go to the directory containing the ESMValTool source -code (called ``ESMValTool`` if you did not choose a different name) +code that you just downloaded. It is called ``ESMValTool`` if you did not +choose a different name. .. code-block:: bash cd ESMValTool -and (when on Linux) create a new environment called ``esmvaltool`` -containing just Python with the command +and create a new environment called ``esmvaltool`` with the command (when on +Linux): .. code-block:: bash - mamba create --name esmvaltool 'python=3.10' - -if needed, older versions of Python can also be selected. -Next, install many of the required dependencies, including the ESMValCore package -and Python, R, and NCL interpreters, into this environment by running - -.. code-block:: bash - - mamba env update --name esmvaltool --file environment.yml + mamba env create --name esmvaltool --file environment.yml -**MacOSX note:** ESMValTool functionalities in Julia, NCL, and R are not -supported on MacOSX, due to conflicts in the conda environment. To install a -conda environment on MacOSX, use the dedicated environment file: +or (when on MacOS) .. code-block:: bash mamba env create --name esmvaltool --file environment_osx.yml -The environment is called ``esmvaltool`` by default, but it is possible to use -the option ``--name SOME_ENVIRONMENT_NAME`` to define a custom name. You should -then activate the environment using the command: +This will install all of the required development dependencies. +Note that the MacOS environment file contains only Python dependencies, +so you will not be able to run NCL, R, or Julia diagnostics with it. -.. code-block:: bash - - conda activate esmvaltool +.. note:: + The environment is called ``esmvaltool`` in the example above, but it is + possible to use the option ``--name some_environment_name`` to define a + different name. + This can be useful when you have an older ESMValTool installation that you + would like to keep. + It is recommended that you create a new environment when updating ESMValTool. -It is also possible to update an existing environment from the environment -file. This may be useful when updating an older installation of ESMValTool: +Next, activate the environment by using the command: .. code-block:: bash - mamba env update --name esmvaltool --file environment.yml - -but if you run into trouble, please try creating a new environment. + conda activate esmvaltool .. attention:: - From now on, we assume that the conda environment for ESMValTool is - activated. + From now on, we assume that the conda environment containing the + development dependencies for ESMValTool is activated. -Software installation ---------------------- +*Install ESMValTool* -Once all prerequisites are fulfilled, ESMValTool can be installed by running -the following commands in the directory containing the ESMValTool source code -(called ``ESMValTool`` if you did not choose a different name): +Once all dependencies have been installed, ESMValTool itself can be installed by +running the following command in the directory containing the ESMValTool source +code (called ``ESMValTool`` if you did not choose a different name): .. code-block:: bash @@ -534,8 +388,6 @@ Using the ``--editable`` flag will cause the installer to create a symbolic link from the installation location to your source code, so any changes you make to the source code will immediately be available in the installed version of the tool. -This command will also install extra development dependencies needed for -building the documentation, running the unit tests, etc. If you would like to run Julia diagnostic scripts, you will need to install the ESMValTool Julia dependencies: @@ -554,15 +406,16 @@ To do this, run the tool with: If everything was installed properly, ESMValTool should have printed a help message to the console. -**MacOSX note:** some recipes may depend on the OpenMP library, which does not -install via mamba on MacOSX. Instead run +.. note:: + **MacOS users:** some recipes may depend on the OpenMP library, which does not + install via mamba on MacOS. Instead run -.. code-block:: bash + .. code-block:: bash - brew install libomp + brew install libomp -to install the library with Homebrew. In case you do not have Homebrew, follow -installation instructions `here `__. + to install the library with Homebrew. In case you do not have Homebrew, follow + installation instructions `here `__. For a more complete installation verification, run the automated tests and confirm that no errors are reported: @@ -579,6 +432,8 @@ the `-n N` flag where N is the number of available threads e.g: pytest -n 4 +This concludes the installation from source guide. However, if you would like +to do development work on ESMValCore, please read on. .. _esmvalcore-development-installation: @@ -595,7 +450,8 @@ can install it from source into the same conda environment. if you are planning to develop new features for the ESMValCore, e.g. you want to implement a new preprocessor function. -First follow all steps above. +First follow the steps in the section above to +:ref:`install ESMValTool from source `. Next, go to the place where you would like to keep the source code and clone the ESMValCore github repository: @@ -633,10 +489,9 @@ To check that the installation was successful, run this should show the directory of the source code that you just downloaded. If the command above shows a directory inside your conda environment instead, -e.g. ``~/mamba/envs/esmvaltool/lib/python3.8/site-packages/esmvalcore``, you -may need to manually remove that directory and run -```pip install -e '.[develop]'`` -again. +e.g. ``~/mambaforge/envs/esmvaltool/lib/python3.8/site-packages/esmvalcore``, +you may need to manually remove that directory and run +``pip install --editable '.[develop]'`` again. .. _install_on_hpc: @@ -648,25 +503,170 @@ estate, so there is no need to install ESMValTool if you are just running recipe - CEDA-JASMIN: `esmvaltool` is available on the scientific compute nodes (`sciX.jasmin.ac.uk` where `X = 1, 2, 3, 4, 5`) after login and module loading via `module load esmvaltool`; see the helper page at - `CEDA `__ ; + `CEDA `__ . - DKRZ-Levante: `esmvaltool` is available on login nodes (`levante.dkrz.de`) after login and module loading via `module load esmvaltool`; the command `module help esmvaltool` provides some information about the module. + A Jupyter kernel based on the latest module is available from `DKRZ-JupyterHub `__. - Met Office: `esmvaltool` is available on the Linux estate after login and module loading via `module load`; see the ESMValTool Community of Practice SharePoint site for more details. +The ESMValTool Tutorial provides a `quickstart guide `__ +that is particularly suited for new users that have an access to pre-installed version of ESMValTool. + +Information on how to request an account at CEDA-JASMIN and DKRZ-Levante and to get started with these HPC clusters +can be found on the setup page of the tutorial `here `__. + +.. _install_with_docker: + +Docker installation +=================== + +ESMValTool is also provided through `DockerHub `_ +in the form of docker containers. +See https://docs.docker.com for more information about docker containers and how to +run them. + +You can get the latest release with + +.. code-block:: bash + + docker pull esmvalgroup/esmvaltool:stable + +If you want to use the current main branch, use + +.. code-block:: bash + + docker pull esmvalgroup/esmvaltool:latest + +To run a container using those images, use: + +.. code-block:: bash + + docker run esmvalgroup/esmvaltool:stable --help + +Note that the container does not see the data or environmental variables +available in the host by default. You can make data available with +``-v /path:/path/in/container`` and environmental variables with ``-e VARNAME``. + +For example, the following command would run a recipe + +.. code-block:: bash + + docker run -e HOME -v "$HOME":"$HOME" -v /data:/data esmvalgroup/esmvaltool:stable run examples/recipe_python.yml + +with the environmental variable ``$HOME`` available inside the container and +the data in the directories ``$HOME`` and ``/data``, so these can be used to +find the configuration file, recipe, and data. + +It might be useful to define a `bash alias +`_ +or script to abbreviate the above command, for example + +.. code-block:: bash + + alias esmvaltool="docker run -e HOME -v $HOME:$HOME -v /data:/data esmvalgroup/esmvaltool:stable" + +would allow using the ``esmvaltool`` command without even noticing that the +tool is running inside a Docker container. + +.. _install_with_singularity: + +Singularity installation +======================== + +Docker is usually forbidden in clusters due to security reasons. However, +there is a more secure alternative to run containers that is usually available +on them: `Singularity `_. + +Singularity can use docker containers directly from DockerHub with the +following command + +.. code-block:: bash + + singularity run docker://esmvalgroup/esmvaltool:stable run examples/recipe_python.yml + +Note that the container does not see the data available in the host by default. +You can make host data available with ``-B /path:/path/in/container``. + +It might be useful to define a `bash alias +`_ +or script to abbreviate the above command, for example + +.. code-block:: bash + + alias esmvaltool="singularity run -B $HOME:$HOME -B /data:/data docker://esmvalgroup/esmvaltool:stable" + +would allow using the ``esmvaltool`` command without even noticing that the +tool is running inside a Singularity container. + +Some clusters may not allow to connect to external services, in those cases +you can first create a singularity image locally: + +.. code-block:: bash + + singularity build esmvaltool.sif docker://esmvalgroup/esmvaltool:stable + +and then upload the image file ``esmvaltool.sif`` to the cluster. +To run the container using the image file ``esmvaltool.sif`` use: + +.. code-block:: bash + + singularity run esmvaltool.sif run examples/recipe_python.yml + +.. _install_with_pip: + +Pip installation +================ + +It is also possible to install ESMValTool from +`PyPI `_. +However, this requires first installing dependencies that are not available +on PyPI in some other way. +The list of required dependencies can be found in +:download:`environment.yml <../../../../environment.yml>`. + +.. warning:: + + It is recommended to use the installation with mamba instead, as it may not + be easy to install the correct versions of all dependencies. + +After installing the dependencies that are not available from PyPI_, install +ESMValTool and any remaining Python dependencies with the command: + +.. code-block:: bash + + pip install esmvaltool + +If you would like to run Julia diagnostic scripts, you will also need to +install the Julia dependencies: + +.. code-block:: bash + + esmvaltool install Julia + +.. _installation_from_the_conda_lock_file: + Installation from the conda lock file ===================================== -A fast conda environment creation is possible using the provided conda lock file. This is a secure alternative -to the installation from source, whenever the conda environment can not be created for some reason. A conda lock file -is an explicit environment file that contains pointers to dependency packages as they are hosted on the Anaconda cloud; -these have frozen version numbers, build hashes, and channel names, parameters established at the time -of the conda lock file creation, so may be obsolete after a while, -but they allow for a robust environment creation while they're still up-to-date. -We regenerate these lock files every 10 days through automatic Pull Requests -(or more frequently, since the automatic generator runs on merges on the main branch too), -so to minimize the risk of dependencies becoming obsolete. Conda environment creation from -a lock file is done just like with any other environment file: +The conda lock file is an alternative to the ``environment.yml`` file used in +the :ref:`installation from source instructions `. +All other steps in those installation instructions are the same. + +The conda lock file can be used to install the dependencies of ESMValTool +whenever the conda environment defined by ``environment.yml`` can not be solved +for some reason. +A conda lock file is a reproducible environment file that contains links to +dependency packages as they are hosted on the Anaconda cloud; +these have frozen version numbers, build hashes, and channel names. +These parameters are established at the time of the conda lock file creation, so +may be outdated after a while. +Therefore, we regenerate these lock files every 10 days through automatic +Pull Requests (or more frequently, since the automatic generator runs on merges +on the ``main`` branch too), to minimize the risk of dependencies becoming +outdated. + +Conda environment creation from a lock file is done with the following command: .. code-block:: bash @@ -675,9 +675,6 @@ a lock file is done just like with any other environment file: The latest, most up-to-date file can always be downloaded directly from the source code repository, a direct download link can be found `here `__. -.. note:: - `pip` and `conda` are NOT installed, so you will have to install them in the new environment: use conda-forge as channel): ``conda install -c conda-forge pip`` at the very minimum so we can install `esmvalcore` afterwards. - .. note:: For instructions on how to manually create the lock file, see :ref:`these instructions `. @@ -796,7 +793,7 @@ Move to Mamba Mamba is a much faster alternative to `conda`, and environment creation and updating benefits from the use of a much faster (C++ backend) dependency solver; tests have been performed to verify the integrity of the `esmvaltool` environment built with `mamba`, and we are -now confident that the change will not affect the way ESMValTool is installed and run, whether it be on a Linux or OSX platform. +now confident that the change will not affect the way ESMValTool is installed and run, whether it be on a Linux or OS platform. From the user's perspective, it is a straightforward use change: the CLI (command line interface) of `mamba` is identical to `conda`: any command that was run with `conda` before will now be run with `mamba` instead, keeping all the other command line arguments and diff --git a/doc/sphinx/source/quickstart/running.rst b/doc/sphinx/source/quickstart/running.rst index 679381ecb7..8df3f99635 100644 --- a/doc/sphinx/source/quickstart/running.rst +++ b/doc/sphinx/source/quickstart/running.rst @@ -35,16 +35,22 @@ from ESGF to the local directory ``~/climate_data``, run .. code:: bash - esmvaltool run examples/recipe_python.yml --offline=False + esmvaltool run examples/recipe_python.yml --search_esgf=when_missing -The ``--offline=False`` option tells ESMValTool to search for and download -the necessary climate data files, if they cannot be found locally. +The ``--search_esgf=when_missing`` option tells ESMValTool to search for and +download the necessary climate data files, if they cannot be found locally. The data only needs to be downloaded once, every following run will re-use previously downloaded data. -If you have all required data available locally, you can run the tool without -the ``--offline=False`` argument (the default). +If you have all required data available locally, you can run the tool with +``--search_esgf=never`` argument (the default). Note that in that case the required data should be located in the directories specified in your user configuration file. +A third option ``--search_esgf=always`` is available. +With this option, the tool will first check the ESGF for the needed data, +regardless of any local data availability; if the data found on ESGF is newer +than the local data (if any) or the user specifies a version of the data that +is available only from the ESGF, then that data will be downloaded; otherwise, +local data will be used. Recall that the chapter :ref:`Configuring ESMValTool ` provides an explanation of how to create your own config-user.yml file. diff --git a/doc/sphinx/source/recipes/broken_recipe_list.rst b/doc/sphinx/source/recipes/broken_recipe_list.rst new file mode 100644 index 0000000000..7da6f41437 --- /dev/null +++ b/doc/sphinx/source/recipes/broken_recipe_list.rst @@ -0,0 +1,26 @@ +.. _broken-recipe-list: + +Broken recipe list +================== + +This table gives an overview of the recipes that are known to have issues. +The table is always valid for the latest stable release of ESMValTool. +More details can be found in the :ref:`broken recipe policy +`. + +.. list-table:: Broken recipes + :widths: 25 25 25 25 + :header-rows: 1 + + * - Broken recipe + - Affected diagnostics + - Problem + - GitHub issue + * - :ref:`recipe_autoassess_landsurface_soilmoisture.yml ` + - All + - Dependency on some external climatology files + - `#2309 `_ + * - `recipe_check_obs.yml` + - `ERA5_native6` + - Derivation of custom variables `rlus` and `rsus` + - `#1388 `_ diff --git a/doc/sphinx/source/recipes/figures/clouds/cloud_lweffect.png b/doc/sphinx/source/recipes/figures/clouds/cloud_lweffect.png deleted file mode 100644 index 74bb43dab2..0000000000 Binary files a/doc/sphinx/source/recipes/figures/clouds/cloud_lweffect.png and /dev/null differ diff --git a/doc/sphinx/source/recipes/figures/clouds/cloud_neteffect.png b/doc/sphinx/source/recipes/figures/clouds/cloud_neteffect.png deleted file mode 100644 index 79f4696245..0000000000 Binary files a/doc/sphinx/source/recipes/figures/clouds/cloud_neteffect.png and /dev/null differ diff --git a/doc/sphinx/source/recipes/figures/clouds/cloud_sweffect.png b/doc/sphinx/source/recipes/figures/clouds/cloud_sweffect.png deleted file mode 100644 index 52b00c8c45..0000000000 Binary files a/doc/sphinx/source/recipes/figures/clouds/cloud_sweffect.png and /dev/null differ diff --git a/doc/sphinx/source/recipes/figures/clouds/cloud_var_multi.png b/doc/sphinx/source/recipes/figures/clouds/cloud_var_multi.png deleted file mode 100644 index 54a85593ae..0000000000 Binary files a/doc/sphinx/source/recipes/figures/clouds/cloud_var_multi.png and /dev/null differ diff --git a/doc/sphinx/source/recipes/figures/clouds/clouds_dyn_matrix_ts_wap_clt_cmip6_ocean.png b/doc/sphinx/source/recipes/figures/clouds/clouds_dyn_matrix_ts_wap_clt_cmip6_ocean.png new file mode 100644 index 0000000000..b7a1680365 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/clouds/clouds_dyn_matrix_ts_wap_clt_cmip6_ocean.png differ diff --git a/doc/sphinx/source/recipes/figures/clouds/clouds_interannual_pr.png b/doc/sphinx/source/recipes/figures/clouds/clouds_interannual_pr.png new file mode 100644 index 0000000000..49ee986a7f Binary files /dev/null and b/doc/sphinx/source/recipes/figures/clouds/clouds_interannual_pr.png differ diff --git a/doc/sphinx/source/recipes/figures/clouds/clouds_ipcc_lwcre_annual.png b/doc/sphinx/source/recipes/figures/clouds/clouds_ipcc_lwcre_annual.png new file mode 100644 index 0000000000..d8dcd97ecd Binary files /dev/null and b/doc/sphinx/source/recipes/figures/clouds/clouds_ipcc_lwcre_annual.png differ diff --git a/doc/sphinx/source/recipes/figures/clouds/clouds_ipcc_netcre_annual.png b/doc/sphinx/source/recipes/figures/clouds/clouds_ipcc_netcre_annual.png new file mode 100644 index 0000000000..507c4a9d36 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/clouds/clouds_ipcc_netcre_annual.png differ diff --git a/doc/sphinx/source/recipes/figures/clouds/clouds_ipcc_swcre_annual.png b/doc/sphinx/source/recipes/figures/clouds/clouds_ipcc_swcre_annual.png new file mode 100644 index 0000000000..0fe217b762 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/clouds/clouds_ipcc_swcre_annual.png differ diff --git a/doc/sphinx/source/recipes/figures/clouds/clouds_lwp_annual.png b/doc/sphinx/source/recipes/figures/clouds/clouds_lwp_annual.png new file mode 100644 index 0000000000..08e1062510 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/clouds/clouds_lwp_annual.png differ diff --git a/doc/sphinx/source/recipes/figures/clouds/clouds_pdf_clt_so_cmip6_line.png b/doc/sphinx/source/recipes/figures/clouds/clouds_pdf_clt_so_cmip6_line.png new file mode 100644 index 0000000000..70fe1e34a3 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/clouds/clouds_pdf_clt_so_cmip6_line.png differ diff --git a/doc/sphinx/source/recipes/figures/clouds/clouds_scatter_clt_swcre_so_cmip6.png b/doc/sphinx/source/recipes/figures/clouds/clouds_scatter_clt_swcre_so_cmip6.png new file mode 100644 index 0000000000..8bfa8a04b4 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/clouds/clouds_scatter_clt_swcre_so_cmip6.png differ diff --git a/doc/sphinx/source/recipes/figures/clouds/clouds_taylor_clt_annual.png b/doc/sphinx/source/recipes/figures/clouds/clouds_taylor_clt_annual.png new file mode 100644 index 0000000000..76d4b41830 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/clouds/clouds_taylor_clt_annual.png differ diff --git a/doc/sphinx/source/recipes/figures/clouds/clouds_zonal_clcalipso_annual_cmip6.png b/doc/sphinx/source/recipes/figures/clouds/clouds_zonal_clcalipso_annual_cmip6.png new file mode 100644 index 0000000000..f32de2a8d6 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/clouds/clouds_zonal_clcalipso_annual_cmip6.png differ diff --git a/doc/sphinx/source/recipes/figures/clouds/liq_h2o_path_multi.png b/doc/sphinx/source/recipes/figures/clouds/liq_h2o_path_multi.png deleted file mode 100644 index 57052e850d..0000000000 Binary files a/doc/sphinx/source/recipes/figures/clouds/liq_h2o_path_multi.png and /dev/null differ diff --git a/doc/sphinx/source/recipes/figures/clouds/liq_h2o_taylor.png b/doc/sphinx/source/recipes/figures/clouds/liq_h2o_taylor.png deleted file mode 100644 index 7e1e27ab1b..0000000000 Binary files a/doc/sphinx/source/recipes/figures/clouds/liq_h2o_taylor.png and /dev/null differ diff --git a/doc/sphinx/source/recipes/figures/cos22esd/scenario_combination_pr:pr_jja.png b/doc/sphinx/source/recipes/figures/cos22esd/scenario_combination_pr:pr_jja.png deleted file mode 100644 index 2fc88524e5..0000000000 Binary files a/doc/sphinx/source/recipes/figures/cos22esd/scenario_combination_pr:pr_jja.png and /dev/null differ diff --git a/doc/sphinx/source/recipes/figures/cos22esd/scenario_combination_pr:tas_jja.png b/doc/sphinx/source/recipes/figures/cos22esd/scenario_combination_pr:tas_jja.png deleted file mode 100644 index 8127ee2c23..0000000000 Binary files a/doc/sphinx/source/recipes/figures/cos22esd/scenario_combination_pr:tas_jja.png and /dev/null differ diff --git a/doc/sphinx/source/recipes/figures/cos22esd/scenario_combination_tas:tas_jja.png b/doc/sphinx/source/recipes/figures/cos22esd/scenario_combination_tas-tas_jja.png similarity index 100% rename from doc/sphinx/source/recipes/figures/cos22esd/scenario_combination_tas:tas_jja.png rename to doc/sphinx/source/recipes/figures/cos22esd/scenario_combination_tas-tas_jja.png diff --git a/doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-14.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-14.png similarity index 100% rename from doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-14.png rename to doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-14.png diff --git a/doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-2.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-2.png similarity index 100% rename from doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-2.png rename to doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-2.png diff --git a/doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-26.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-26.png similarity index 100% rename from doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-26.png rename to doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-26.png diff --git a/doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-27.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-27.png similarity index 100% rename from doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-27.png rename to doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-27.png diff --git a/doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-3.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-3.png similarity index 100% rename from doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-3.png rename to doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-3.png diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-38-pr.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-38-pr.png new file mode 100644 index 0000000000..157779d269 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-38-pr.png differ diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-38.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-38.png new file mode 100644 index 0000000000..2caa4b53e4 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-38.png differ diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-38_regions.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-38_regions.png new file mode 100644 index 0000000000..4bb2549bea Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-38_regions.png differ diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-39-pr.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-39-pr.png new file mode 100644 index 0000000000..1f256232ff Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-39-pr.png differ diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-39.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-39.png new file mode 100644 index 0000000000..05e6318493 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-39.png differ diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-39_regions.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-39_regions.png new file mode 100644 index 0000000000..58fd4541af Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-39_regions.png differ diff --git a/doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-4.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-4.png similarity index 100% rename from doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-4.png rename to doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-4.png diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-40-pr.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-40-pr.png new file mode 100644 index 0000000000..39afa9670c Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-40-pr.png differ diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-40.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-40.png new file mode 100644 index 0000000000..d62dc66213 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-40.png differ diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-40_regions.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-40_regions.png new file mode 100644 index 0000000000..cecc7fdb3f Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-40_regions.png differ diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-41b.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-41b.png new file mode 100644 index 0000000000..c2ea620059 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-41b.png differ diff --git a/doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-42a.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-42a.png similarity index 100% rename from doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-42a.png rename to doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-42a.png diff --git a/doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-42b.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-42b.png similarity index 100% rename from doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-42b.png rename to doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-42b.png diff --git a/doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-45a.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-45a.png similarity index 100% rename from doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-45a.png rename to doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-45a.png diff --git a/doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-5.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-5.png similarity index 100% rename from doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-5.png rename to doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-5.png diff --git a/doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-6.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-6.png similarity index 100% rename from doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-6.png rename to doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-6.png diff --git a/doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-8.png b/doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-8.png similarity index 100% rename from doc/sphinx/source/recipes/figures/flato13ipcc/fig-9-8.png rename to doc/sphinx/source/recipes/figures/ipccwg1ar5ch9/fig-9-8.png diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar6ch3/fig_3_42_a.png b/doc/sphinx/source/recipes/figures/ipccwg1ar6ch3/fig_3_42_a.png new file mode 100644 index 0000000000..59dbf502b2 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar6ch3/fig_3_42_a.png differ diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar6ch3/patterncor.png b/doc/sphinx/source/recipes/figures/ipccwg1ar6ch3/patterncor.png new file mode 100644 index 0000000000..059d897e1d Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar6ch3/patterncor.png differ diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar6ch3/tas_anom_damip_global_1850-2020.png b/doc/sphinx/source/recipes/figures/ipccwg1ar6ch3/tas_anom_damip_global_1850-2020.png new file mode 100644 index 0000000000..86f825c698 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar6ch3/tas_anom_damip_global_1850-2020.png differ diff --git a/doc/sphinx/source/recipes/figures/ipccwg1ar6ch3/zonal_westerly_winds.png b/doc/sphinx/source/recipes/figures/ipccwg1ar6ch3/zonal_westerly_winds.png new file mode 100644 index 0000000000..d70723d69f Binary files /dev/null and b/doc/sphinx/source/recipes/figures/ipccwg1ar6ch3/zonal_westerly_winds.png differ diff --git a/doc/sphinx/source/recipes/figures/monitor/annualcycle_with_ref.png b/doc/sphinx/source/recipes/figures/monitor/annualcycle_with_ref.png new file mode 100644 index 0000000000..eef1cf5ab6 Binary files /dev/null and b/doc/sphinx/source/recipes/figures/monitor/annualcycle_with_ref.png differ diff --git a/doc/sphinx/source/recipes/figures/combined_climate_extreme_index/t90p_IPSL-CM5A-LR_rcp85_2020_2040.png b/doc/sphinx/source/recipes/figures/recipe_extreme_index/t90p_IPSL-CM5A-LR_rcp85_2020_2040.png similarity index 100% rename from doc/sphinx/source/recipes/figures/combined_climate_extreme_index/t90p_IPSL-CM5A-LR_rcp85_2020_2040.png rename to doc/sphinx/source/recipes/figures/recipe_extreme_index/t90p_IPSL-CM5A-LR_rcp85_2020_2040.png diff --git a/doc/sphinx/source/recipes/index.rst b/doc/sphinx/source/recipes/index.rst index 0ad90d42e4..a579032c46 100644 --- a/doc/sphinx/source/recipes/index.rst +++ b/doc/sphinx/source/recipes/index.rst @@ -3,6 +3,10 @@ Recipes ------- +A website displaying results produced with the latest release of +ESMValTool for all available recipes can be accessed `here +`_. + .. toctree:: :maxdepth: 1 @@ -15,12 +19,12 @@ Atmosphere recipe_clouds recipe_cmug_h2o recipe_crem - recipe_combined_climate_extreme_index recipe_consecdrydays recipe_deangelis15nat recipe_diurnal_temperature_index recipe_eady_growth_rate recipe_extreme_events + recipe_extreme_index recipe_eyring06jgr recipe_eyring13jgr recipe_gier20bg @@ -78,7 +82,7 @@ IPCC :maxdepth: 1 recipe_ipccwg1ar6ch3 - recipe_flato13ipcc + recipe_ipccwg1ar5ch9 recipe_collins13ipcc Land @@ -128,3 +132,11 @@ Other recipe_shapeselect recipes_testing recipe_toymodel + +Broken recipe list +^^^^^^^^^^^^^^^^^^ + +.. toctree:: + :maxdepth: 1 + + broken_recipe_list diff --git a/doc/sphinx/source/recipes/recipe_autoassess_landsurface_permafrost.rst b/doc/sphinx/source/recipes/recipe_autoassess_landsurface_permafrost.rst index 1ab74cb6b4..4d6f9b3242 100644 --- a/doc/sphinx/source/recipes/recipe_autoassess_landsurface_permafrost.rst +++ b/doc/sphinx/source/recipes/recipe_autoassess_landsurface_permafrost.rst @@ -56,7 +56,6 @@ User settings in recipe * exp_model: name of model to be used as experiment * start: date (YYYY/MM/DD) at which period begins (see note on time gating) * end: date (YYYY/MM/DD) at which period ends (see note on time gating) - * climfiles_root: path to observation climatologies *Optional settings for script* diff --git a/doc/sphinx/source/recipes/recipe_autoassess_landsurface_soilmoisture.rst b/doc/sphinx/source/recipes/recipe_autoassess_landsurface_soilmoisture.rst index beb48863ab..9734498df8 100644 --- a/doc/sphinx/source/recipes/recipe_autoassess_landsurface_soilmoisture.rst +++ b/doc/sphinx/source/recipes/recipe_autoassess_landsurface_soilmoisture.rst @@ -134,6 +134,9 @@ This recipe is part of the larger group of Autoassess metrics ported to ESMValTo from the native Autoassess package from the UK's Met Office. The ``diagnostics`` settings are almost the same as for the other Autoassess metrics. +**Currently this recipe is marked as broken, because it only runs on Jasmin due to a dependency on some +external climatology files.** + .. note:: **Time gating for autoassess metrics.** diff --git a/doc/sphinx/source/recipes/recipe_autoassess_stratosphere.rst b/doc/sphinx/source/recipes/recipe_autoassess_stratosphere.rst index 92264dd7c1..c2e6839dd9 100644 --- a/doc/sphinx/source/recipes/recipe_autoassess_stratosphere.rst +++ b/doc/sphinx/source/recipes/recipe_autoassess_stratosphere.rst @@ -23,40 +23,6 @@ determining the stratospheric water vapour concentrations at entry point (70hPa, and this in turn is important for the accurate simulation of stratospheric chemistry and radiative balance. -Prior and current contributors ------------------------------- -Met Office: - -* Prior to May 2008: Neal Butchart -* May 2008 - May 2016: Steven C Hardiman -* Since May 2016: Alistair Sellar and Paul Earnshaw - -ESMValTool: - -* Since April 2018: Porting into ESMValTool by Valeriu Predoi - - -Developers ----------- -Met Office: - -* Prior to May 2008: Neal Butchart -* May 2008 - May 2016: Steven C Hardiman - -ESMValTool: - -* Since April 2018: Valeriu Predoi - -Review of current port in ESMValTool ------------------------------------- -The code and results review of the port from native Autoassess to ESMValTool -was conducted by Alistair Sellar (``_) and -Valeriu Predoi (``_) in July 2019. Review consisted in -comparing results from runs using ESMValTool's port and native Autoassess using -the same models and data stretches. - -Metrics and Diagnostics ------------------------ Performance metrics: @@ -75,28 +41,30 @@ Performance metrics: * 100 hPa equatorial temp (annual cycle strength) vs. ERA Interim * 70 hPa 10S-10N water vapour (annual mean) vs. ERA-Interim -Diagnostics: +Diagnostic plot: * Age of stratospheric air vs. observations from Andrews et al. (2001) and Engel et al. (2009) -Model Data ----------- +Available recipes and diagnostics +--------------------------------- -=========================== ================== ============== ============================================== -Variable/Field name realm frequency Comment -=========================== ================== ============== ============================================== -Eastward wind (ua) Atmosphere monthly mean original stash: x-wind, no stash -Air temperature (ta) Atmosphere monthly mean original stash: m01s30i204 -Specific humidity (hus) Atmosphere monthly mean original stash: m01s30i205 -=========================== ================== ============== ============================================== +Recipes are stored in esmvaltool/recipes/ -The recipe takes as input a control model and experimental model, comparisons being made -with these two CMIP models; additionally it can take observational data s input, in the -current implementation ERA-Interim. +* recipe_autoassess_stratosphere.yml + +Diagnostics are stored in esmvaltool/diag_scripts/autoassess/ + +* autoassess_area_base.py: wrapper for autoassess scripts +* stratosphere/strat_metrics_1.py: calculation of metrics +* stratosphere/age_of_air.py: calculate age of stratospheric air +* stratosphere/plotting.py: zonal mean wind and QBO plots +* plot_autoassess_metrics.py: plot normalised assessment metrics + + +User settings in recipe +----------------------- -Inputs and usage ----------------- The ``stratosphere`` area metric is part of the ``esmvaltool/diag_scripts/autoassess`` diagnostics, and, as any other ``autoassess`` metric, it uses the ``autoassess_area_base.py`` as general purpose wrapper. This wrapper accepts a number of input arguments that are read through from the recipe. @@ -156,19 +124,37 @@ over to the diagnostic/metric is listed below. end: 2014/12/01 # end date in native Autoassess format +Variables +--------- + +=========================== ================== ============== ============================================== +Variable/Field name realm frequency Comment +=========================== ================== ============== ============================================== +Eastward wind (ua) Atmosphere monthly mean original stash: x-wind, no stash +Air temperature (ta) Atmosphere monthly mean original stash: m01s30i204 +Specific humidity (hus) Atmosphere monthly mean original stash: m01s30i205 +=========================== ================== ============== ============================================== + +The recipe takes as input a control model and experimental model, comparisons being made +with these two CMIP models; additionally it can take observational data s input, in the +current implementation ERA-Interim. + + +Observations and reformat scripts +----------------------------------- + +ERA-Interim (ta, ua, hus - cmorizers/data/formatters/datasets/era_interim.py) + + References ---------- * Andrews, A. E., and Coauthors, 2001: Mean ages of stratospheric air derived from in situ observations of CO2, CH4, and N2O. J. Geophys. Res., 106 (D23), 32295-32314. * Dee, D. P., and Coauthors, 2011: The ERA-Interim reanalysis: configuration and performance of the data assimilation system. Q. J. R. Meteorol. Soc, 137, 553-597, doi:10.1002/qj.828. * Engel, A., and Coauthors, 2009: Age of stratospheric air unchanged within uncertainties over the past 30 years. Nat. Geosci., 2, 28-31, doi:10 .1038/NGEO388. -Observations Data sets ----------------------- -ERA-Interim data (Dee et al., 2011) data can be obtained online from ECMWF and NASA respectively. Monthly mean zonal mean U and T data are required. CMORized that exists on CEDA-Jasmin or DKRZ (contact Valeriu Predoi (``_) for Jasmin or Mattia Righi (``_ )for DKRZ). - -Sample Plots and metrics ------------------------- +Example metrics and plots +------------------------- Below is a set of metrics for UKESM1-0-LL (historical data); the table shows a comparison made between running ESMValTool on CMIP6 CMORized netCDF data freely available on ESGF nodes and the run made using native @@ -247,3 +233,28 @@ Another reference run comparing UKESM1-0-LL to the physical model HadGEM3-GC31-L :alt: teq_100hpa.png Equatorial temperature at 100hPa, multi annual means. + + +Prior and current contributors +------------------------------ +Met Office: + +* Prior to May 2008: Neal Butchart +* May 2008 - May 2016: Steven C Hardiman +* Since May 2016: Alistair Sellar and Paul Earnshaw + +ESMValTool: + +* Since April 2018: Porting into ESMValTool by Valeriu Predoi + + +Developers +---------- +Met Office: + +* Prior to May 2008: Neal Butchart +* May 2008 - May 2016: Steven C Hardiman + +ESMValTool: + +* Since April 2018: Valeriu Predoi diff --git a/doc/sphinx/source/recipes/recipe_bock20jgr.rst b/doc/sphinx/source/recipes/recipe_bock20jgr.rst index 47be186fca..7f0ebdabec 100644 --- a/doc/sphinx/source/recipes/recipe_bock20jgr.rst +++ b/doc/sphinx/source/recipes/recipe_bock20jgr.rst @@ -295,9 +295,9 @@ Observations and reformat scripts * JRA-55 (ana4mips) - reanalysis of sea surface pressure -* NCEP - reanalysis of surface temperature +* NCEP-NCAR-R1 - reanalysis of surface temperature - *Reformat script:* cmorizers/data/formatters/datasets/ncep.ncl + *Reformat script:* cmorizers/data/formatters/datasets/ncep_ncar_r1.py * PATMOS-x - total cloud cover diff --git a/doc/sphinx/source/recipes/recipe_climate_change_hotspot.rst b/doc/sphinx/source/recipes/recipe_climate_change_hotspot.rst index a40fc69241..9e12140d42 100644 --- a/doc/sphinx/source/recipes/recipe_climate_change_hotspot.rst +++ b/doc/sphinx/source/recipes/recipe_climate_change_hotspot.rst @@ -200,7 +200,7 @@ Example plots indicates the number of models included in the ensemble mean. .. _fig_climate_change_hotspot_2: -.. figure:: /recipes/figures/cos22esd/scenario_combination_tas:tas_jja.png +.. figure:: /recipes/figures/cos22esd/scenario_combination_tas-tas_jja.png :align: center Mediterranean region warming against global warming for the summer diff --git a/doc/sphinx/source/recipes/recipe_clouds.rst b/doc/sphinx/source/recipes/recipe_clouds.rst index 1c34f3c9b4..3106a616d7 100644 --- a/doc/sphinx/source/recipes/recipe_clouds.rst +++ b/doc/sphinx/source/recipes/recipe_clouds.rst @@ -6,45 +6,85 @@ Clouds Overview -------- -The recipe recipe_lauer13jclim.yml computes the climatology and interannual -variability of climate relevant cloud variables such as cloud radiative forcing -(CRE), liquid water path (lwp), cloud amount (clt), and total precipitation (pr) -reproducing some of the evaluation results of Lauer and Hamilton (2013). The -recipe includes a comparison of the geographical distribution of multi-year -average cloud parameters from individual models and the multi-model mean with -satellite observations. Taylor diagrams are generated that show the multi-year -annual or seasonal average performance of individual models and the multi-model -mean in reproducing satellite observations. The diagnostic also facilitates the -assessment of the bias of the multi-model mean and zonal averages of individual -models compared with satellite observations. Interannual variability is -estimated as the relative temporal standard deviation from multi-year timeseries -of data with the temporal standard deviations calculated from monthly anomalies -after subtracting the climatological mean seasonal cycle. +Four recipes are available to evaluate cloud climatologies from CMIP models. + +1) recipe_clouds_bias.yml computes climatologies and creates map plots of + multi-model mean, mean bias, absolute bias and relative bias of a given + variable. Similar to IPCC AR5 (ch. 9) fig. 9.2 a/b/c (`Flato et al., 2013`_). + +2) recipe_clouds_ipcc.yml computes multi-model mean bias and zonal means of + the clouds radiative effect (shortwave, longwave and net). Similar to + IPCC AR5 (ch. 9) fig. 9.5 (`Flato et al., 2013`_). + +3) Recipe recipe_lauer13jclim.yml computes the climatology and interannual + variability of climate relevant cloud variables such as cloud radiative forcing + (CRE), liquid water path (lwp), cloud amount (clt), and total precipitation (pr) + reproducing some of the evaluation results of `Lauer and Hamilton (2013)`_. The + recipe includes a comparison of the geographical distribution of multi-year + average cloud parameters from individual models and the multi-model mean with + satellite observations. Taylor diagrams are generated that show the multi-year + annual or seasonal average performance of individual models and the multi-model + mean in reproducing satellite observations. The diagnostic also facilitates the + assessment of the bias of the multi-model mean and zonal averages of individual + models compared with satellite observations. Interannual variability is + estimated as the relative temporal standard deviation from multi-year timeseries + of data with the temporal standard deviations calculated from monthly anomalies + after subtracting the climatological mean seasonal cycle. + +4) Recipe family recipe_lauer22jclim_*.yml is an extension of + recipe_lauer13jclim.yml for evaluation of cloud radiative forcing + (CRE), liquid water path (lwp), ice water path (clivi), total cloud amount (clt), + cloud liquid water content (clw), cloud ice water content (cli), cloud fraction + (cl) and water vapor path (prw) from CMIP6 models in comparison to CMIP5 results + and satellite observations. Wherever possible, the diagnostics use + multi-observational products as reference datasets. The recipe family + reproduces all figures from `Lauer et al. (2023)`_: maps of the geographical + distribution of multi-year averages, Taylor diagrams for multi-year annual + averages, temporal variability, seasonal cycle amplitude, cloud ice fraction + as a function of temperature, zonal means of 3-dim cloud liquid/ice content and + cloud fraction, matrices of cloud cover and total cloud water path as a function + of SST and 500 hPa vertical velocity, shortwave CRE and total cloud water path + binned by total cloud cover and pdfs of total cloud cover for selected regions. + +.. _`Flato et al., 2013`: https://www.ipcc.ch/site/assets/uploads/2018/02/WG1AR5_Chapter09_FINAL.pdf +.. _`Lauer and Hamilton (2013)`: https://journals.ametsoc.org/view/journals/clim/26/11/jcli-d-12-00451.1.xml +.. _`Lauer et al. (2023)`: https://journals.ametsoc.org/view/journals/clim/36/2/JCLI-D-22-0181.1.xml Available recipes and diagnostics --------------------------------- -Recipes are stored in recipes/ +Recipes are stored in recipes/clouds - * recipe_lauer13jclim.yml +* recipe_clouds_bias.yml +* recipe_clouds_ipcc.yml +* recipe_lauer13jclim.yml +* recipe_lauer22jclim_*.yml (* = fig1_clim_amip, fig1_clim, fig2_taylor_amip, + fig2_taylor, fig3-4_zonal, fig5_lifrac, fig6_interannual, fig7_seas, + fig8_dyn, fig9-11ab_scatter, fig9-11c_pdf) Diagnostics are stored in diag_scripts/clouds/ - * clouds.ncl: global maps of (multi-year) annual means including multi-model - mean - * clouds_bias.ncl: global maps of the multi-model mean and the multi-model - mean bias - * clouds_interannual: global maps of the interannual variability - * clouds_isccp: global maps of multi-model mean minus observations + zonal - averages of individual models, multi-model mean and observations - * clouds_taylor.ncl: taylor diagrams +* clouds.ncl: global maps of (multi-year) annual means including multi-model mean +* clouds_bias.ncl: global maps of the multi-model mean and the multi-model mean bias +* clouds_dyn_matrix.ncl: cloud properties by dynamical regime (SST, omega500) +* clouds_interannual.ncl: global maps of the interannual variability +* clouds_ipcc.ncl: global maps of multi-model mean minus observations + zonal + averages of individual models, multi-model mean and observations +* clouds_lifrac_scatter.ncl: cloud liquid water fraction as a function of temperature +* clouds_lifrac_scatter_postproc.ncl: additional plots and diagnostics using + the output of clouds_lifrac_scatter.ncl for given CMIP5/CMIP6 model pairs +* clouds_pdf.ncl: pdf of cloud parameters +* clouds_seasonal_cycle.ncl: seasonal cycle amplitude +* clouds_taylor.ncl: Taylor diagrams as in `Lauer and Hamilton (2013)`_ +* clouds_taylor_double.ncl: Taylor diagrams as in `Lauer et al. (2023)`_ +* clouds_zonal.ncl: zonal means of 3-dim variables User settings in recipe ----------------------- -#. Script clouds.ncl +1. Script clouds.ncl *Required settings (scripts)* @@ -56,12 +96,21 @@ User settings in recipe * explicit_cn_levels: explicit contour levels (array) * extralegend: plot legend(s) to extra file(s) * filename_add: optionally add this string to plot filesnames + * multiobs_exclude: list of *observational* datasets to be excluded when + calculating uncertainty estimates from multiple observational datasets + (see also multiobs_uncertainty) + * multiobs_uncertainty: calculate uncertainty estimates from multiple + observational datasets (true, false); by default, all "obs", "obs6", + "obs4mips" and "native6" datasets are used; any of such datasets can be + explicitly excluded when also specifying "multiobs_exclude" * panel_labels: label individual panels (true, false) * PanelTop: manual override for "@gnsPanelTop" used by panel plot(s) * projection: map projection for plotting (default = "CylindricalEquidistant") * showdiff: calculate and plot differences model - reference (default = false) + * showyears: add start and end years to the plot titles + (default = false) * rel_diff: if showdiff = true, then plot relative differences (%) (default = False) * ref_diff_min: lower cutoff value in case of calculating relative @@ -72,12 +121,14 @@ User settings in recipe "annual" = annual mean * treat_var_as_error: treat variable as error when averaging (true, false); true: avg = sqrt(mean(var*var)), false: avg = mean(var) + * var: short_name of variable to process (default = "" - use first + variable in variable list) *Required settings (variables)* none - * Optional settings (variables) + *Optional settings (variables)* * long_name: variable description * reference_dataset: reference dataset; REQUIRED when calculating @@ -88,7 +139,7 @@ User settings in recipe * variable "lwp": diag_scripts/shared/plot/rgb/qcm3.rgb -#. Script clouds_bias.ncl +2. Script clouds_bias.ncl *Required settings (scripts)* @@ -117,7 +168,38 @@ User settings in recipe * variable "pr-mmday": diag_scripts/shared/plots/rgb/ipcc-precip.rgb, diag_scripts/shared/plot/rgb/ipcc-precip-delta.rgb -#. Script clouds_interannual.ncl +3. Script clouds_dyn_matrix.ncl + + *Required settings (scripts)* + + * var_x: short name of variable on x-axis + * var_y: short name of variable on y-axis + * var_z: short name of variable to be binned + * xmin: min x value for generating x bins + * xmax: max x value for generating x bins + * ymin: min y value for generating y bins + * ymax: max y value for generating y bins + + *Optional settings (scripts)* + + * clevels: explicit values for probability labelbar (array) + * filename_add: optionally add this string to plot filesnames + * nbins: number of equally spaced bins (var_x), default = 100 + * sidepanels: show/hide side panels (default = False) + * xlabel: label overriding variable name for x-axis (e.g. SST) + * ylabel: label overriding variable name for y-axis (e.g. omega500) + * zdmin: min z value for labelbar (difference plots) + * zdmax: max z value for labelbar (difference plots) + * zmin: min z value for labelbar + * zmax: max z value for labelbar + + *Required settings (variables)* + + *Optional settings (variables)* + + * reference_dataset: reference dataset + +4. Script clouds_interannual.ncl *Required settings (scripts)* @@ -126,10 +208,12 @@ User settings in recipe *Optional settings (scripts)* * colormap: e.g., WhiteBlueGreenYellowRed, rainbow + * epsilon: "epsilon" value to be replaced with missing values * explicit_cn_levels: use these contour levels for plotting - * extrafiles: write plots for individual models to separate files - (true, false) + * filename_add: optionally add this string to plot filesnames * projection: map projection, e.g., Mollweide, Mercator + * var: short_name of variable to process (default = "" - use first + variable in variable list) *Required settings (variables)* @@ -140,13 +224,9 @@ User settings in recipe * long_name: description of variable * reference_dataset: name of reference datatset - *Color tables* - - * variable "lwp": diag_scripts/shared/plots/rgb/qcm3.rgb - .. _clouds_ipcc.ncl: -#. Script clouds_ipcc.ncl +5. Script clouds_ipcc.ncl *Required settings (scripts)* @@ -155,6 +235,7 @@ User settings in recipe *Optional settings (scripts)* * explicit_cn_levels: contour levels + * highlight_dataset: name of dataset to highlight (default = "MultiModelMean") * mask_ts_sea_ice: true = mask T < 272 K as sea ice (only for variable "ts"); false = no additional grid cells masked for variable "ts" * projection: map projection, e.g., Mollweide, Mercator @@ -177,7 +258,7 @@ User settings in recipe * variables "pr", "pr-mmday": diag_scripts/shared/plot/rgb/ipcc-precip-delta.rgb -#. Script clouds_taylor.ncl +6. Script clouds_lifrac_scatter.ncl *Required settings (scripts)* @@ -185,63 +266,240 @@ User settings in recipe *Optional settings (scripts)* - * embracelegend: false (default) = include legend in plot, max. 2 columns - with dataset names in legend; true = write extra file with legend, max. 7 - dataset names per column in legend, alternative observational dataset(s) - will be plotted as a red star and labeled "altern. ref. dataset" in legend - (only if dataset is of class "OBS") - * estimate_obs_uncertainty: true = estimate observational uncertainties - from mean values (assuming fractions of obs. RMSE from documentation of - the obs data); only available for "CERES-EBAF", "MODIS", "MODIS-L3"; - false = do not estimate obs. uncertainties from mean values - * filename_add: legacy feature: arbitrary string to be added to all - filenames of plots and netcdf output produced (default = "") - * mask_ts_sea_ice: true = mask T < 272 K as sea ice (only for variable "ts"); - false = no additional grid cells masked for variable "ts" - * styleset: "CMIP5", "DEFAULT" (if not set, clouds_taylor.ncl will create a - color table and symbols for plotting) - * timemean: time averaging; annualclim (default) = 1 plot annual mean; - seasonalclim = 4 plots (DJF, MAM, JJA, SON) - * valid_fraction: used for creating sea ice mask (mask_ts_sea_ice = true): - fraction of valid time steps required to mask grid cell as valid data + * filename_add: optionally add this string to plot filesnames + * min_mass: minimum cloud condensate (same units as clw, cli) + * mm_mean_median: calculate multi-model mean and meadian + * nbins: number of equally spaced bins (ta (x-axis)), default = 20 + * panel_labels: label individual panels (true, false) + * PanelTop: manual override for "@gnsPanelTop" used by panel plot(s)s *Required settings (variables)* - * reference_dataset: name of reference data set + *Optional settings (variables)* + + * reference_dataset: reference dataset + +7. Script clouds_lifrac_scatter_postproc.ncl + + *Required settings (scripts)* + + * models: array of CMIP5/CMIP6 model pairs to be compared + * refname: name of reference dataset + + *Optional settings (scripts)* + + * nbins: number of bins used by clouds_lifrac_scatter.ncl (default = 20) + * reg: region (string) (default = "") + * t_int: array of temperatures for printing additional diagnostics + + *Required settings (variables)* + + none + + *Optional settings (variables)* + + none + +8. Script clouds_pdf.ncl + + *Required settings (scripts)* + + * xmin: min value for bins (x axis) + * xmax: max value for bins (y axis) + + *Optional settings (scripts)* + + * filename_add: optionally add this string to output filenames + * plot_average: show average frequency per bin + * region: show only selected geographic region given as latmin, latmax, + lonmin, lonmax + * styleset: "CMIP5", "DEFAULT" + * ymin: min value for frequencies (%) (y axis) + * ymax: max value for frequencies (%) (y axis) + + *Required settings (variables)* *Optional settings (variables)* + * reference_dataset: reference dataset + +9. Script clouds_seasonal_cycle.ncl + + *Required settings (scripts)* + none + *Optional settings (scripts)* + + * colormap: e.g., WhiteBlueGreenYellowRed, rainbow + * epsilon: "epsilon" value to be replaced with missing values + * explicit_cn_levels: use these contour levels for plotting + * filename_add: optionally add this string to plot filesnames + * projection: map projection, e.g., Mollweide, Mercator + * showyears: add start and end years to the plot titles + (default = false) + * var: short_name of variable to process (default = "" i.e. use + first variable in variable list) + + *Required settings (variables)* + + *Optional settings (variables)* + + * long_name: description of variable + * reference_dataset: name of reference dataset + +10. Script clouds_taylor.ncl + + *Required settings (scripts)* + + none + + *Optional settings (scripts)* + + * embracelegend: false (default) = include legend in plot, max. 2 columns + with dataset names in legend; true = write extra file with legend, max. 7 + dataset names per column in legend, alternative observational dataset(s) + will be plotted as a red star and labeled "altern. ref. dataset" in legend + (only if dataset is of class "OBS") + * estimate_obs_uncertainty: true = estimate observational uncertainties + from mean values (assuming fractions of obs. RMSE from documentation of + the obs data); only available for "CERES-EBAF", "MODIS", "MODIS-L3"; + false = do not estimate obs. uncertainties from mean values + * filename_add: legacy feature: arbitrary string to be added to all + filenames of plots and netcdf output produced (default = "") + * legend_filter: do not show individual datasets in legend that are of + project "legend_filter" (default = "") + * mask_ts_sea_ice: true = mask T < 272 K as sea ice (only for variable "ts"); + false = no additional grid cells masked for variable "ts" + * multiobs_exclude: list of *observational* datasets to be excluded when + calculating uncertainty estimates from multiple observational datasets + (see also multiobs_uncertainty) + * multiobs_uncertainty: calculate uncertainty estimates from multiple + observational datasets (true, false); by default, all "obs", "obs6", + "obs4mips" and "native6" datasets are used; any of such datasets can be + explicitly excluded when also specifying "multiobs_exclude" + * styleset: "CMIP5", "DEFAULT" (if not set, clouds_taylor.ncl will create a + color table and symbols for plotting) + * timemean: time averaging; annualclim (default) = 1 plot annual mean; + seasonalclim = 4 plots (DJF, MAM, JJA, SON) + * valid_fraction: used for creating sea ice mask (mask_ts_sea_ice = true): + fraction of valid time steps required to mask grid cell as valid data + * var: short_name of variable to process (default = "" - use first variable + in variable list) + + *Required settings (variables)* + + * reference_dataset: name of reference data set + + *Optional settings (variables)* + + none + +11. Script clouds_taylor_double.ncl + + *Required settings (scripts)* + + none + + *Optional settings (scripts)* + + * filename_add: legacy feature: arbitrary string to be added to all + filenames of plots and netcdf output produced (default = "") + * multiobs_exclude: list of *observational* datasets to be excluded when + calculating uncertainty estimates from multiple observational datasets + (see also multiobs_uncertainty) + * multiobs_uncertainty: calculate uncertainty estimates from multiple + observational datasets (true, false); by default, all "obs", "obs6", + "obs4mips" and "native6" datasets are used; any of such datasets can be + explicitely excluded when also specifying "multiobs_exclude" + * projectcolors: colors for each projectgroups + (e.g. (/"(/0.0, 0.0, 1.0/)", "(/1.0, 0.0, 0.0/)"/) + * projectgroups: calculated mmm per "projectgroup" + (e.g. (/"cmip5", "cmip6")/) + * styleset: "CMIP5", "DEFAULT" (if not set, CLOUDS_TAYLOR_DOUBLE will + create a color table and symbols for plotting) + * timemean: time averaging; annualclim (default) = 1 plot annual mean, + seasonalclim = 4 plots (DJF, MAM, JJA, SON) + * var: short_name of variable to process (default = "" - use first variable + in variable list) + + *Required settings (variables)* + + * reference_dataset: name of reference data set + + *Optional settings (variables)* + +12. Script clouds_zonal.ncl + + *Required settings (scripts)* + + none + + *Optional settings (scripts)* + + * embracesetup: True = 2 plots per line, False = 4 plots per line (default) + * explicit_cn_levels: explicit contour levels for mean values (array) + * explicit_cn_dlevels: explicit contour levels for differences (array) + * extralegend: plot legend(s) to extra file(s) + * filename_add: optionally add this string to plot filesnames + * panel_labels: label individual panels (true, false) + * PanelTop: manual override for "@gnsPanelTop" used by panel plot(s) + * showdiff: calculate and plot differences (default = False) + * rel_diff: if showdiff = True, then plot relative differences (%) (default = False) + * rel_diff_min: lower cutoff value in case of calculating relative differences + (in units of input variable) + * t_test: perform t-test when calculating differences (default = False) + * timemean: time averaging - "seasonal" = DJF, MAM, JJA, SON), "annual" = annual mean + * units_to: target units (automatic conversion) + + *Required settings (variables)* + + none + + *Optional settings (variables)* + + * long_name: variable description + * reference_dataset: reference dataset; REQUIRED when calculating differences (showdiff = True) + * units: variable units (for labeling plot only) + Variables --------- +* cl (atmos, monthly mean, longitude latitude time) +* clcalipso (atmos, monthly mean, longitude latitude time) +* cli (atmos, monthly mean, longitude latitude time) +* clw (atmos, monthly mean, longitude latitude time) * clwvi (atmos, monthly mean, longitude latitude time) * clivi (atmos, monthly mean, longitude latitude time) * clt (atmos, monthly mean, longitude latitude time) * pr (atmos, monthly mean, longitude latitude time) +* prw (atmos, monthly mean, longitude latitude time) * rlut, rlutcs (atmos, monthly mean, longitude latitude time) * rsut, rsutcs (atmos, monthly mean, longitude latitude time) +* ta (atmos, monthly mean, longitude latitude time) +* wap (atmos, monthly mean, longitude latitude time) -Observations and reformat scripts ---------------------------------- - -*Note: (1) obs4MIPs data can be used directly without any preprocessing; -(2) use `esmvaltool data info DATASET` or see headers of reformat scripts for non-obs4MIPs data for download -instructions.* +Observations/realanyses +----------------------- -* CERES-EBAF (obs4MIPs) - CERES TOA radiation fluxes (used for calculation of - cloud forcing) -* GPCP-SG (obs4MIPs) - Global Precipitation Climatology Project total - precipitation -* MODIS (obs4MIPs) - MODIS total cloud fraction -* UWisc - University of Wisconsin-Madison liquid water path climatology, based - on satellite observbations from TMI, SSM/I, and AMSR-E, reference: O'Dell et - al. (2008), J. Clim. +* CALIPSO-GOCCP +* CALIPSO-ICECLOUD +* CERES-EBAF +* CLARA-AVHRR +* CLOUDSAT-L2 +* ERA5 +* ERA-Interim +* ESACCI-CLOUD +* ESACCI-WATERVAPOUR +* GPCP-SG +* ISCCP-FH +* MAC-LWP +* MODIS +* PATMOS-x +* UWisc - *Reformat script:* esmvaltool/cmorizers/data/formatters/datasets/uwisc.ncl References ---------- @@ -260,62 +518,104 @@ References models: A comparison of CMIP5 results with CMIP3 and satellite data, J. Clim., 26, 3823-3845, doi: 10.1175/JCLI-D-12-00451.1. -* O’Dell, C.W., F.J. Wentz, and R. Bennartz (2008), Cloud liquid water path - from satellite-based passive microwave observations: A new climatology over - the global oceans, J. Clim., 21, 1721-1739, doi:10.1175/2007JCLI1958.1. - -* Pincus, R., S. Platnick, S.A. Ackerman, R.S. Hemler, Robert J. Patrick - Hofmann (2012), Reconciling simulated and observed views of clouds: MODIS, - ISCCP, and the limits of instrument simulators. J. Climate, 25, 4699-4720, - doi: 10.1175/JCLI-D-11-00267.1. +* Lauer, A., L. Bock, B. Hassler, M. Schröder, and M. Stengel, Cloud climatologies + from global climate models - a comparison of CMIP5 and CMIP6 models with satellite + data, J. Climate, 36(2), doi: 10.1175/JCLI-D-22-0181.1, 2023. Example plots ------------- .. _fig_cloud_1: -.. figure:: /recipes/figures/clouds/liq_h2o_path_multi.png +.. figure:: /recipes/figures/clouds/clouds_lwp_annual.png :align: center The 20-yr average LWP (1986-2005) from the CMIP5 historical model runs and the multi-model mean in comparison with the UWisc satellite climatology - (1988-2007) based on SSM/I, TMI, and AMSR-E (O'Dell et al. 2008). + (1988-2007) based on SSM/I, TMI, and AMSR-E (O'Dell et al. 2008). Produced + with recipe_lauer13jclim.yml (diagnostic script clouds.ncl). .. _fig_cloud_2: -.. figure:: /recipes/figures/clouds/liq_h2o_taylor.png +.. figure:: /recipes/figures/clouds/clouds_taylor_clt_annual.png :align: center :width: 7cm Taylor diagram showing the 20-yr annual average performance of CMIP5 models - for total cloud fraction as compared to MODIS satellite observations. + for total cloud fraction as compared to MODIS satellite observations. Produced + with recipe_lauer13jclim.yml (diagnostic script clouds_taylor.ncl). .. _fig_cloud_3: -.. figure:: /recipes/figures/clouds/cloud_sweffect.png +.. figure:: /recipes/figures/clouds/clouds_ipcc_swcre_annual.png :align: center :width: 9cm -.. figure:: /recipes/figures/clouds/cloud_lweffect.png +.. figure:: /recipes/figures/clouds/clouds_ipcc_lwcre_annual.png :align: center :width: 9cm -.. figure:: /recipes/figures/clouds/cloud_neteffect.png +.. figure:: /recipes/figures/clouds/clouds_ipcc_netcre_annual.png :align: center :width: 9cm 20-year average (1986-2005) annual mean cloud radiative effects of CMIP5 - models against the CERES EBAF (2001–2012). Top row shows the shortwave + models against the CERES-EBAF (2001–2012). Top row shows the shortwave effect; middle row the longwave effect, and bottom row the net effect. - Multi-model mean biases against CERES EBAF are shown on the left, whereas the - right panels show zonal averages from CERES EBAF (thick black), the + Multi-model mean biases against CERES-EBAF are shown on the left, whereas the + right panels show zonal averages from CERES-EBAF (thick black), the individual CMIP5 models (thin gray lines) and the multi-model mean (thick - red line). Similar to Figure 9.5 of Flato et al. (2013). + red line). Similar to Figure 9.5 of `Flato et al., 2013`_. Produced + with recipe_clouds_ipcc.yml (diagnostic script clouds_ipcc.ncl). .. _fig_cloud_4: -.. figure:: /recipes/figures/clouds/cloud_var_multi.png +.. figure:: /recipes/figures/clouds/clouds_interannual_pr.png :align: center Interannual variability of modeled and observed (GPCP) precipitation rates estimated as relative temporal standard deviation from 20 years (1986-2005) - of data. The temporal standard devitions are calculated from monthly - anomalies after subtracting the climatological mean seasonal cycle. + of data. The temporal standard deviations are calculated from monthly + anomalies after subtracting the climatological mean seasonal cycle. Produced + with recipe_lauer13jclim.yml (clouds_interannual.ncl). + +.. _fig_cloud_5: +.. figure:: /recipes/figures/clouds/clouds_zonal_clcalipso_annual_cmip6.png + :align: center + :width: 14cm + + Zonal mean of the multi-year annual mean cloud fraction as seen from + CALIPSO from CMIP6 models in comparison to CALIPSO-GOCCP data. Produced + with recipe_lauer22jclim_fig3-4_zonal.yml (diagnostic script clouds_zonal.ncl). + +.. _fig_cloud_6: +.. figure:: /recipes/figures/clouds/clouds_scatter_clt_swcre_so_cmip6.png + :align: center + :width: 10cm + + Multi-year seasonal average (December-January-February) of cloud shortwave + radiative effect (W m\ :sup:`-2`) vs. total cloud fraction (clt, %) averaged over the + Southern Ocean defined as latitude belt 30°S-65°S (ocean grid cells only). + Shown are the CMIP6 multi-model mean (red filled circles and lines) and + observational estimates from ESACCI-CLOUD (black circles and lines). + The red shaded areas represent the range between the 10th and 90th percentiles + of the results from all individual models. Produced with + recipe_lauer22jclim_fig9-11ab_scatter.yml (diagnostic script clouds_scatter.ncl). + +.. _fig_cloud_7: +.. figure:: /recipes/figures/clouds/clouds_pdf_clt_so_cmip6_line.png + :align: center + :width: 8cm + + Frequency distribution of monthly mean total cloud cover from CMIP6 models + in comparison to ESACCI-CLOUD data. The red curve shows the multi-model average, + the blue curve the ESACCI-CLOUD data and the thin gray lines the individual + models. The red shading shows ±1 standard deviation of the inter-model spread. + Produced with recipe_lauer22jclim_fig9-11c_pdf.yml (diagnostic script clouds_pdf.ncl). + +.. _fig_cloud_8: +.. figure:: /recipes/figures/clouds/clouds_dyn_matrix_ts_wap_clt_cmip6_ocean.png + :align: center + :width: 8cm + 2-dimensional distribution of average total cloud cover (clt) binned by sea + surface temperature (SST, x-axis) and vertical velocity at 500 hPa (ω\ :sub:`500`, y-axis) + averaged over 20 years and all grid cells over the ocean. Produced with + recipe_lauer22jclim_fig8_dyn.yml (diagnostic script clouds_dyn_matrix.ncl). diff --git a/doc/sphinx/source/recipes/recipe_examples.rst b/doc/sphinx/source/recipes/recipe_examples.rst index 2736483810..5874e2c1c4 100644 --- a/doc/sphinx/source/recipes/recipe_examples.rst +++ b/doc/sphinx/source/recipes/recipe_examples.rst @@ -21,22 +21,11 @@ make sure to download all files with the same name but different extensions. The recipe examples/recipe_julia.yml produces a map plot with the mean temperature over the year 1997 plus a number that is configurable from the recipe. -The recipe examples/recipe_decadal.yml showcases how the ``timerange`` tag +The recipe examples/recipe_decadal.yml showcases how the ``timerange`` tag can be used to load datasets belonging to the DCPP activity. Produces timeseries plots comparing the global mean temperature of a DCPP dataset with an observational dataset. -For detailed instructions on obtaining input data, please refer to -:ref:`inputdata`. However, in case you just quickly want to run through the -example, you can use the following links to obtain the data from ESGF: - - * `BCC-ESM1 `_ - * `CanESM2 `_ - -Please refer to the terms of use for `CMIP5 -`_ and `CMIP6 -`_ data. - Available recipes and diagnostics --------------------------------- @@ -64,11 +53,6 @@ User settings in recipe Arguments that are accepted by these functions can also be specified here, e.g. ``cmap``. Preprocessors need to be configured such that the resulting data matches the plot type, e.g. a timeseries or a map. - *Optional settings for script* - - * ``write_netcdf``: ``true`` (default) or ``false``. - This can be used to disable writing the results to netcdf files. - #. Script ``examples/diagnostic.jl`` *Required settings for script* @@ -106,4 +90,3 @@ Example plots :align: center Global mean temperature of CMIP6 dcppA-hindcast EC-Earth3 and OBS ERA-Interim. - diff --git a/doc/sphinx/source/recipes/recipe_combined_climate_extreme_index.rst b/doc/sphinx/source/recipes/recipe_extreme_index.rst similarity index 92% rename from doc/sphinx/source/recipes/recipe_combined_climate_extreme_index.rst rename to doc/sphinx/source/recipes/recipe_extreme_index.rst index 5a86fec6e9..e4656a3a77 100644 --- a/doc/sphinx/source/recipes/recipe_combined_climate_extreme_index.rst +++ b/doc/sphinx/source/recipes/recipe_extreme_index.rst @@ -6,7 +6,7 @@ Combined Climate Extreme Index Overview -------- -The goal of this diagnostic is to compute time series of a number of extreme events: heatwave, coldwave, heavy precipitation, drought and high wind. Then, the user can combine these different components (with or without weights). The result is an index similar to the Climate Extremes Index (CEI; Karl et al., 1996), the modified CEI (mCEI; Gleason et al., 2008) or the Actuaries Climate Index (ACI; American Academy of Actuaries, 2018). The output consists of a netcdf file containing the area-weighted and multi-model multi-metric index. This recipe can be applied to data with any temporal resolution, and the running average is computed based on the user-defined window length (e.g. a window length of 5 would compute the 5-day running mean when applied to data, or 5-month running mean when applied to monthly data). +The goal of this diagnostic is to compute time series of a number of extreme events: heatwave, coldwave, heavy precipitation, drought and high wind. Then, the user can combine these different components (with or without weights). The result is an index similar to the Climate Extremes Index (CEI; Karl et al., 1996), the modified CEI (mCEI; Gleason et al., 2008) or the Actuaries Climate Index (ACI; American Academy of Actuaries, 2018). The output consists of a netcdf file containing the area-weighted and multi-model multi-metric index. This recipe expects data of daily temporal resolution, and the running average is computed based on the user-defined window length (e.g. a window length of 5 would compute the 5-day running mean). In recipe_extreme_index.yml, after defining the area and reference and projection period, the weigths for each metric selected. The options are @@ -89,7 +89,7 @@ Example plots ------------- .. _fig_combinedindices1: -.. figure:: /recipes/figures/combined_climate_extreme_index/t90p_IPSL-CM5A-LR_rcp85_2020_2040.png +.. figure:: /recipes/figures/recipe_extreme_index/t90p_IPSL-CM5A-LR_rcp85_2020_2040.png :align: center :width: 14cm diff --git a/doc/sphinx/source/recipes/recipe_flato13ipcc.rst b/doc/sphinx/source/recipes/recipe_ipccwg1ar5ch9.rst similarity index 60% rename from doc/sphinx/source/recipes/recipe_flato13ipcc.rst rename to doc/sphinx/source/recipes/recipe_ipccwg1ar5ch9.rst index 472ce03bb3..a52d682a78 100644 --- a/doc/sphinx/source/recipes/recipe_flato13ipcc.rst +++ b/doc/sphinx/source/recipes/recipe_ipccwg1ar5ch9.rst @@ -1,4 +1,4 @@ -.. _recipes_flato13ipcc: +.. _recipes_ipccwg1ar5ch9: IPCC AR5 Chapter 9 (selected figures) ===================================== @@ -12,6 +12,12 @@ versions. In this way we can next time start with what was available in the previous round and can focus on developing more innovative methods of analysis rather than constantly having to "re-invent the wheel". +.. note:: + + Please note that most recipes have been modified to include only models that are + (still) readily available via ESGF. Plots produced may therefore look different + than the original figures from IPCC AR5. + The plots are produced collecting the diagnostics from individual recipes. The following figures from Flato et al. (2013) can currently be reproduced: @@ -33,7 +39,7 @@ following figures from Flato et al. (2013) can currently be reproduced: CMIP5 multi-model mean and the climatology from the Global Precipitation Climatology Project (Adler et al., 2003), c) multi-model mean absolute error with respect to observations, and d) multi-model mean error - relative to the multi-model mean precipitation ifself. + relative to the multi-model mean precipitation itself. * Figure 9.5: Climatological (1985-2005) annual-mean cloud radiative effects in Wm-2 for the CMIP5 models against CERES EBAF (2001-2011) in @@ -43,7 +49,7 @@ following figures from Flato et al. (2013) can currently be reproduced: averages from CERES EBAF 2.6 (black), the individual CMIP5 models (thin gray lines), and the multi-model mean (thick red line). - * Figure 9.6: Centred pattern correlations between models and observations + * Figure 9.6: Centered pattern correlations between models and observations for the annual mean climatology over the period 1980–1999. Results are shown for individual CMIP3 (black) and CMIP5 (blue) models as thin dashes, along with the corresponding ensemble average (thick dash) and @@ -89,6 +95,21 @@ following figures from Flato et al. (2013) can currently be reproduced: calculated as the standard deviation of the annual means over the period 1986–2005. + * Figure 9.38: Seasonal cycle for the surface temperature or precipitation + over land within defined regions multi-model mean and difference to + reference dataset or absolute annual cycle can be chosen. + + * Figure 9.39: Seasonal bias box and whiskers plot + for surface temperature or precipitation within + SREX (IPCC Special Report on Managing the Risks of Extreme Events and + Disasters to Advance Climate Change Adaptation) regions. + + * Figure 9.40: Seasonal bias box and whiskers plot for surface + temperature or precipitation within defined polar and ocean regions. + + * Figure 9.41b: Comparison between observations and models for variable + values within defined regions. + * Figure 9.42a: Equilibrium climate sensitivity (ECS) against the global mean surface air temperature, both for the period 1961-1990 and for the pre-industrial control runs. @@ -103,9 +124,19 @@ following figures from Flato et al. (2013) can currently be reproduced: Available recipes and diagnostics --------------------------------- -Recipes are stored in esmvaltool/recipes/ +Recipes are stored in esmvaltool/recipes/recipe_ipccwg1ar5ch9 - * recipe_flato13ipcc.yml + * recipe_flato13ipcc_figures_92_95.yml: Figures 9.2, 9.3, 9.4, 9.5 + * recipe_flato13ipcc_figure_96.yml: Figure 9.6 + * recipe_flato13ipcc_figure_98.yml: Figure 9.8 + * recipe_flato13ipcc_figure_914.yml: Figure 9.14 + * recipe_flato13ipcc_figure_924.yml: Figure 9.24 + * recipe_flato13ipcc_figures_926_927.yml: Figures 9.26 and 9.27 + * recipe_flato13ipcc_figure_942.yml: Figure 9.42 + * recipe_flato13ipcc_figure_945a.yml: Figure 9.45a + * recipe_flato13ipcc_figures_938_941_cmip3.yml: Figures 9.38, 9.39, 9.40, and 9.41 + * recipe_flato13ipcc_figures_938_941_cmip6.yml: Figures 9.38, 9.39, 9.40, and 9.41 CMIP6 instead of CMIP3 + * recipe_weigel21gmd_figures_13_16.yml: ESMValTool paper version (Weigel et al., 2021) of Figures 9.38, 9.39, 9.40, and 9.41, only CMIP5 Diagnostics are stored in esmvaltool/diag_scripts/ @@ -113,7 +144,7 @@ Diagnostics are stored in esmvaltool/diag_scripts/ * climate_metrics/ecs.py: See :ref:`here`. * clouds/clouds_bias.ncl: global maps of the multi-model mean and the multi-model mean bias (Fig. 9.2, 9.4) - * clouds/clouds_isccp: global maps of multi-model mean minus observations + zonal + * clouds/clouds_ipcc.ncl: global maps of multi-model mean minus observations + zonal averages of individual models, multi-model mean and observations (Fig. 9.5) * ipcc_ar5/ch09_fig09_3.ncl: multi-model mean seasonality of near-surface temperature (Fig. 9.3) @@ -125,6 +156,10 @@ Diagnostics are stored in esmvaltool/diag_scripts/ * ipcc_ar5/ch09_fig09_14.py: Zonally averaged and equatorial SST (Fig. 9.14) * seaice/seaice_tsline.ncl: Time series of sea ice extent (Fig. 9.24a/b) * seaice/seaice_trends.ncl: Trend distributions of sea ice extent (Fig 9.24c/d) + * regional_downscaling/Figure9_38.ncl (Fig 9.38a (variable tas) and Fig 9.38b (variable pr)) + * regional_downscaling/Figure9_39.ncl (Fig 9.39a/c/e (variable tas) and Fig 9.39b/d/f (variable pr)) + * regional_downscaling/Figure9_40.ncl (Fig 9.40a/c/e (variable tas) and Fig 9.40b/d/f (variable pr)) + * regional_downscaling/Figure9_41.ncl (Fig 9.41b) * ipcc_ar5/ch09_fig09_42a.py: ECS vs. surface air temperature (Fig. 9.42a) * ipcc_ar5/ch09_fig09_42b.py: TCR vs. ECS (Fig. 9.42b) * emergent_constraints/snowalbedo.ncl: snow-albedo effect (Fig. 9.45a) @@ -142,8 +177,6 @@ User settings in recipe #. Script clouds/clouds_bias.ncl -#. Script clouds_bias.ncl - *Required settings (scripts)* none @@ -158,7 +191,7 @@ User settings in recipe * Required settings (variables)* - * reference_dataset: name of reference datatset + * reference_dataset: name of reference dataset *Optional settings (variables)* @@ -310,6 +343,100 @@ User settings in recipe * EMs_in_lg: create a legend label for individual ensemble members (default: False) * fill_pole_hole: fill polar hole (typically in satellite data) with sic = 1 (default: False) +#. Script regional_downscaling/Figure9.38.ncl + + *Required settings for script* + + none + + *Optional settings (scripts)* + + * styleset: for plot_type cycle (e.g. CMIP5, CMIP6), default "CMIP5" + * fig938_region_label: Labels for regions, which should be included + (["WNA", "ENA", "CAM", "TSA", "SSA", "EUM", "NAF","CAF", "SAF", "NAS", + "CAS", "EAS", "SAS", "SEA", "AUS"]), default "WNA" + * fig938_project_MMM: projects to average, default "CMIP5" + * fig938_experiment_MMM: experiments to average, default "historical" + * fig938_mip_MMM: mip to average, default "Amon" + * fig938_names_MMM: names in legend i.e. (["CMIP5","CMIP3"]), default fig938_project_MMM + * fig938_colors_MMM: Color for multi-model mean (e.g. ["red"]), default "red" + * If set fig938_mip_MMM, fig938_experiment_MMM, fig938_project_MMM, fig938_names_MMM, and fig938_colors_MMM must + have the same number of elements + + * fig938_refModel: Reference data set for differences default "ERA-Interim" + * fig938_MMM: Plot multi-model mean (true/false), default "true" + * fig938_YMin: minimum Y Axis + * fig938_YMax: maximum Y Axis + * fig938_diff: Difference to reference data (true) or absolute annual cycle (false), default "true" + +#. Script regional_downscaling/Figure9.39.ncl + + *Required settings (scripts)* + + * reference_dataset: reference dataset name (set of variables) + + *Optional settings (scripts)* + + * styleset: for plot_type cycle (e.g. CMIP5, CMIP6), default "CMIP5" + * fig939_season: seasons i.e. (["DJF","JJA","ANN"]), default "DJF" + * fig939_region_label: Labels for regions, which should be included + (["ALAs","CGIs","WNAs","CNAs","ENAs","CAMs","AMZs","NEBs","WSAs","SSAs", + "NEUs","CEUs","MEDs","SAHs","WAFs","EAFs","SAFs","NASs","WASs","CASs", + "TIBs","EASs","SASs","SEAs","NAUs","SAUs"]), default "ALAs" + * fig939_project_MMM: projects to average, default "CMIP5" + * fig939_experiment_MMM: experiments to average, default "historical" + * fig939_mip_MMM: mip to average, default "Amon" + * fig939_MMM: Plot multi-model mean (true/false) + * fig939_names_MMM: names in legend i.e. (["CMIP5","CMIP3"]) + * fig939_YMin: minimum Y Axis + * fig939_YMax: maximum Y Axis + * fig939_vert_line_pos: i.e. ([6,10,13,17,24,26]) + * fig939_vert_line_label: labels of vertical lines, i.e. (["North America", + "South America","Europe","Africa","Asia","Australia"]) + * fig939_mode: True= cumulative mode + +#. Script regional_downscaling/Figure9.40.ncl + + *Required settings (scripts)* + + * reference_dataset: reference dataset name (set of variables) + + *Optional settings (scripts)* + + * styleset: for plot_type cycle (e.g. CMIP5, CMIP6), default "CMIP5" + * fig940_season: seasons i.e. (["DJF","JJA","ANN"]), default "DJF" + * fig940_region_label: Labels for regions, which should be included + (["Arctic_land","Arctic_sea","Antarctic_land","Antarctic_sea", + "Caribbean","WesternIndianOcean","NorthernIndianOcean", + "NorthernTropicalPacific","EquatorialTropicalPacific", + "SouthernTropicalPacific","World_land","World_sea","World"]), + default "Arctic_land" + * fig940_project_MMM: projects to average, default "CMIP5" + * fig940_experiment_MMM: experiments to average, default "historical" + * fig940_mip_MMM: mip to average, default "Amon" + * fig940_MMM: Plot multi-model mean (true/false) + * fig940_names_MMM: names in legend i.e. (["CMIP5","CMIP3"]) + * fig940_YMin: minimum Y Axis + * fig940_YMax: maximum Y Axis + * fig940_vert_line_pos: i.e. ([6,10,13,17,24,26]) + * fig940_vert_line_label: labels of vertical lines, i.e. (["North America", + "South America","Europe","Africa","Asia","Australia"]) + * fig940_mode: True= cumulative mode + +#. Script regional_downscaling/Figure9.41.ncl + + *Required settings (scripts)* + + * reference_dataset: reference dataset name (set of variables) + + *Optional settings (scripts)* + + * styleset: for plot_type cycle (e.g. CMIP5, CMIP6), default "CMIP5" + * fig941_region_label: Labels for regions, which should be included + (["ALAs","CGIs","WNAs","CNAs","ENAs","CAMs","AMZs","NEBs","WSAs","SSAs", + "NEUs","CEUs","MEDs","SAHs","WAFs","EAFs","SAFs","NASs","WASs","CASs", + "TIBs","EASs","SASs","SEAs","NAUs","SAUs"]), default "MEDs" + #. Script ipcc_ar5/ch09_fig09_42a.py *Required settings for script* @@ -434,11 +561,31 @@ References variations to anthropogenic and natural causes using CMIP5 simulations. Journal of Geophysical Research: Atmosphere, 118, 4001-4024, doi:10.1002/jgrd.50239. +* Seneviratne, S. I., Nicholls, N., Easterling, D., Goodess, C. M., Kanae, S., + Kossin, J., Luo, Y., Marengo, J., McInnes, K., Rahimi, M., Reichstein, M., + Sorteberg, A., Vera, C., and Zhang, X., 2012: + Changes in climate extremes and their impacts on the naturalphysical + environment. , in: Managing the Risks of Extreme Events and Disasters to + Advance Climate Change Adaptation. A Special Report of Working Groups I and + II of the Intergovernmental Panel on ClimateChange (IPCC), edited by: + Field, C. B., Barros, V., Stocker, T. F., Qin, D., Dokken, D. J., + Ebi, K. L., Mastrandrea, M. D., Mach, K. J., Plattner, G.-K., Allen, S. K., + Tignor, M., and Midgley, P. M., Cambridge University Press, Cambridge, UK, + and New York, NY, USA, 109-230. + +* Weigel, K., Bock, L., Gier, B. K., Lauer, A., Righi, M., Schlund, M., Adeniyi, K., + Andela, B., Arnone, E., Berg, P., Caron, L.-P., Cionni, I., Corti, S., Drost, N., + Hunter, A., Lledó, L., Mohr, C. W., Paçal, A., Pérez-Zanón, N., Predoi, V., Sandstad, + M., Sillmann, J., Sterl, A., Vegas-Regidor, J., von Hardenberg, J., and Eyring, V.: + Earth System Model Evaluation Tool (ESMValTool) v2.0 - diagnostics for extreme events, + regional and impact evaluation, and analysis of Earth system models in CMIP, + Geosci. Model Dev., 14, 3159-3184, https://doi.org/10.5194/gmd-14-3159-2021, 2021. + Example plots ------------- -.. figure:: /recipes/figures/flato13ipcc/fig-9-2.png +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-2.png :align: center Figure 9.2 a,b,c: Annual-mean surface air temperature for the period @@ -447,7 +594,7 @@ Example plots (Dee et al., 2011), c) mean absolute model error with respect to the climatology from ERA-Interim. -.. figure:: /recipes/figures/flato13ipcc/fig-9-3.png +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-3.png :align: center Figure 9.3: Multi model values for seasonality of near-surface temperature, @@ -455,7 +602,7 @@ Example plots in seasonality, mean bias in absolute seasonality. Reference dataset: ERA-Interim. -.. figure:: /recipes/figures/flato13ipcc/fig-9-4.png +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-4.png :align: center Figure 9.4: Annual-mean precipitation rate (mm day-1) for the period @@ -463,9 +610,9 @@ Example plots CMIP5 multi-model mean and the climatology from the Global Precipitation Climatology Project (Adler et al., 2003), c) multi-model mean absolute error with respect to observations, and d) multi-model mean error - relative to the multi-model mean precipitation ifself. + relative to the multi-model mean precipitation itself. -.. figure:: /recipes/figures/flato13ipcc/fig-9-5.png +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-5.png :align: center Figure 9.5: Climatological (1985-2005) annual-mean cloud radiative @@ -476,10 +623,10 @@ Example plots averages from CERES EBAF 2.6 (black), the individual CMIP5 models (thin gray lines), and the multi-model mean (thick red line). -.. figure:: /recipes/figures/flato13ipcc/fig-9-6.png +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-6.png :align: center - Figure 9.6: Centred pattern correlations between models and observations + Figure 9.6: Centered pattern correlations between models and observations for the annual mean climatology over the period 1980–1999. Results are shown for individual CMIP3 (black) and CMIP5 (blue) models as thin dashes, along with the corresponding ensemble average (thick dash) and @@ -489,7 +636,7 @@ Example plots effect (SW CRE). The correlations between the reference and alternate observations are also shown (solid green circles). -.. figure:: /recipes/figures/flato13ipcc/fig-9-8.png +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-8.png :align: center Figure 9.8: Observed and simulated time series of the anomalies in annual @@ -501,7 +648,7 @@ Example plots different observations (thick black lines). Dataset pre-processing like described in Jones et al., 2013. -.. figure:: /recipes/figures/flato13ipcc/fig-9-14.png +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-14.png :align: center Figure 9.14: (a) Zonally averaged sea surface temperature (SST) error @@ -529,7 +676,7 @@ Example plots Figure 9.24a: Time series of total sea ice area and extent (accumulated) for the Arctic in September including multi-model mean and standard deviation. -.. figure:: /recipes/figures/flato13ipcc/fig-9-26.png +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-26.png :align: center Figure 9.26 (bottom): Ensemble-mean global land carbon uptake in the CMIP5 @@ -540,7 +687,7 @@ Example plots grey areas show the range of annual mean fluxes simulated across the model ensemble. -.. figure:: /recipes/figures/flato13ipcc/fig-9-27.png +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-27.png :align: center Figure 9.27 (top): Simulation of global mean atmosphere–ocean CO2 fluxes @@ -550,20 +697,138 @@ Example plots variability in the fluxes, calculated as the standard deviation of the annual means over the period 1986–2005. -.. figure:: /recipes/figures/flato13ipcc/fig-9-42a.png +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-38.png + :align: center + + Figure 9.38tas: Mean seasonal cycle for surface temperature (tas) + as multi model mean of 38 CMIP5 and 22 CMIP6 models as well as + CRU and ERA-Interim reanalysis data averaged + for 1980-2005 over land in different regions: + Western North America (WNA), Eastern North America (ENA), + Central America (CAM), Tropical South America (TSA), + Southern South America (SSA), Europe and Mediterranean (EUM), + North Africa (NAF), Central Africa (CAF), South Africa (SAF), + North Asia (NAS), Central Asia (CAS), East Asia (EAS), + South Asia (SAS), Southeast Asia (SEA), and Australia (AUS). + Similar to Fig. 9.38a from Flato et al. (2013), CMIP6 instead of CMIP3 and + set of CMIP5 models used different. + + +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-38-pr.png + :align: center + + Figure 9.38pr: Mean seasonal cycle for precipitation (pr) + as multi model mean of 38 CMIP5 and 22 CMIP6 models as well as + CRU and ERA-Interim reanalysis data averaged + for 1980-1999 over land in different regions: + Western North America (WNA), Eastern North America (ENA), + Central America (CAM), Tropical South America (TSA), + Southern South America (SSA), Europe and Mediterranean (EUM), + North Africa (NAF), Central Africa (CAF), South Africa (SAF), + North Asia (NAS), Central Asia (CAS), East Asia (EAS), + South Asia (SAS), Southeast Asia (SEA), and Australia (AUS). + Similar to Fig. 9.38b from Flato et al. (2013), CMIP6 instead of CMIP3 and + set of CMIP5 models used different. + +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-38_regions.png + :align: center + + Figure 9.38reg: Positions of the regions used in Figure 9.38. + +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-39.png + :align: center + + Figure 9.39tas: Box and whisker plots showing the 5th, 25th, 50th, 75th + and 95th percentiles of the seasonal- and annual mean biases for + surface temperature (tas) for 1980-2005 between 38 CMIP5 models + (box and whiskers) or 22 CMIP6 models (crosses) and CRU data. + The regions are: Alaska/NW Canada (ALAs), + Eastern Canada/Greenland/Iceland (CGIs), Western North America(WNAs), + Central North America (CNAs), Eastern North America (ENAs), + Central America/Mexico (CAMs), Amazon (AMZs), NE Brazil (NEBs), + West Coast South America (WSAs), South-Eastern South America (SSAs), + Northern Europe (NEUs), Central Europe (CEUs), + Southern Europe/the Mediterranean (MEDs), Sahara (SAHs), + Western Africa (WAFs), Eastern Africa (EAFs), Southern Africa (SAFs), + Northern Asia (NASs), Western Asia (WASs), Central Asia (CASs), + Tibetan Plateau (TIBs), Eastern Asia (EASs), Southern Asia (SASs), + Southeast Asia (SEAs), Northern Australia (NASs) and + Southern Australia/New Zealand (SAUs). + The positions of these regions are defined following + (Seneviratne et al., 2012) and differ from the ones in Fig. 9.38. + Similar to Fig. 9.39 a,c,e from Flato et al. (2013), CMIP6 instead of CMIP3 and + set of CMIP5 models used different. + +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-39-pr.png + :align: center + + Figure 9.39pr: Box and whisker plots showing the 5th, 25th, 50th, 75th + and 95th percentiles of the seasonal- and annual mean biases for + precipitation (pr) for 1980-2005 between 38 CMIP5 models + (box and whiskers) or 22 CMIP6 models (crosses) and CRU data. + The regions are: Alaska/NW Canada (ALAs), + Eastern Canada/Greenland/Iceland (CGIs), Western North America(WNAs), + Central North America (CNAs), Eastern North America (ENAs), + Central America/Mexico (CAMs), Amazon (AMZs), NE Brazil (NEBs), + West Coast South America (WSAs), South-Eastern South America (SSAs), + Northern Europe (NEUs), Central Europe (CEUs), + Southern Europe/the Mediterranean (MEDs), Sahara (SAHs), + Western Africa (WAFs), Eastern Africa (EAFs), Southern Africa (SAFs), + Northern Asia (NASs), Western Asia (WASs), Central Asia (CASs), + Tibetan Plateau (TIBs), Eastern Asia (EASs), Southern Asia (SASs), + Southeast Asia (SEAs), Northern Australia (NASs) and + Southern Australia/New Zealand (SAUs). + The positions of these regions are defined following + (Seneviratne et al., 2012) and differ from the ones in Fig. 9.38. + Similar to Fig. 9.39 b,d,f from Flato et al. (2013), CMIP6 instead of CMIP3 and + set of CMIP5 models used different. + +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-39_regions.png + :align: center + + Figure 9.39reg: Positions of the regions used in Figure 9.39. + +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-40.png + :align: center + + Figure 9.40tas: Box and whisker plots showing the 5th, 25th, 50th, 75th + and 95th percentiles of the seasonal- and annual mean biases for + surface temperature (tas) for oceanic and polar regions between 38 CMIP5 (box and whiskers) or 22 CMIP6 (crosses) + models and ERA-Interim data for 1980–2005. + +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-40-pr.png + :align: center + + Figure 9.40pr: Box and whisker plots showing the 5th, 25th, 50th, 75th + and 95th percentiles of the seasonal- and annual mean biases for + precipitation (pr) for oceanic and polar regions between 38 CMIP5 (box and whiskers) or 22 CMIP6 (crosses) + models and Global Precipitation Climatology Project - Satellite-Gauge (GPCP-SG) data for 1980–2005. + +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-40_regions.png + :align: center + + Figure 9.40reg: Positions of the regions used in Figure 9.40. + +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-41b.png + :align: center + + Figure 9.41b: Ranked modelled versus ERA-Interim mean temperature for + 38 CMIP5 models in the Mediterranean region for 1961–2000. + +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-42a.png :align: center Figure 9.42a: Equilibrium climate sensitivity (ECS) against the global mean surface air temperature of CMIP5 models, both for the period 1961-1990 (larger symbols) and for the pre-industrial control runs (smaller symbols). -.. figure:: /recipes/figures/flato13ipcc/fig-9-42b.png +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-42b.png :align: center Figure 9.42b: Transient climate response (TCR) against equilibrium climate sensitivity (ECS) for CMIP5 models. -.. figure:: /recipes/figures/flato13ipcc/fig-9-45a.png +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-45a.png :align: center Figure 9.45a: Scatterplot of springtime snow-albedo effect values in climate diff --git a/doc/sphinx/source/recipes/recipe_ipccwg1ar6ch3.rst b/doc/sphinx/source/recipes/recipe_ipccwg1ar6ch3.rst index 24b528db9c..42bedcec09 100644 --- a/doc/sphinx/source/recipes/recipe_ipccwg1ar6ch3.rst +++ b/doc/sphinx/source/recipes/recipe_ipccwg1ar6ch3.rst @@ -7,14 +7,18 @@ Overview -------- This recipe collects selected diagnostics used in IPCC AR6 WGI Chapter 3: -Human influence on the climate system. Plots from IPCC AR6 can be readily -reproduced and compared to previous versions. The aim is to be able to start -with what was available now the next time allowing us to -focus on developing more innovative analysis methods -rather than constantly having to "re-invent the wheel". +Human influence on the climate system (`Eyring et al., 2021`_). Plots from IPCC +AR6 can be readily reproduced and compared to previous versions. The aim is to +be able to start with what was available now the next time allowing us to focus +on developing more innovative analysis methods rather than constantly having to +"re-invent the wheel". + +Processing of CMIP3 models currently works only in serial mode, due to an issue +in the input data still under investigation. To run the recipe for Fig 3.42a +and Fig. 3.43 set "max_parallel_tasks: 1" in the config-user.yml file. The plots are produced collecting the diagnostics from individual recipes. The -following figures from Eyring et al. (2021) can currently be reproduced: +following figures from `Eyring et al. (2021)`_ can currently be reproduced: * Figure 3.3 a,b,c,d: Surface Air Temperature - Model Bias @@ -22,16 +26,43 @@ following figures from Eyring et al. (2021) can currently be reproduced: * Figure 3.5: Temporal Variability Of Near-Surface Air Temperature + * Figure 3.9: Anomaly Of Near-Surface Air Temperature - Attribution + * Figure 3.13: Precipitation - Model Bias * Figure 3.15: Precipitation Anomaly + * Figure 3.19: Speed-Up Of Zonal Mean Wind + + * Figure 3.42: Relative Model Performance + + * Figure 3.43: Correlation Pattern + +To reproduce Fig. 3.9 you need the shapefile of the `AR6 reference regions +`_ +(`Iturbide et al., 2020 `_). +Please download the file `IPCC-WGI-reference-regions-v4_shapefile.zip +`_, +unzip and store it in `/IPCC-regions/` (the `auxiliary_data_dir` +is defined in the `config-user.yml +`_ +file). + +.. _`Eyring et al., 2021`: https://www.ipcc.ch/report/ar6/wg1/chapter/chapter-3/ +.. _`Eyring et al. (2021)`: https://www.ipcc.ch/report/ar6/wg1/chapter/chapter-3/ + + Available recipes and diagnostics --------------------------------- Recipes are stored in esmvaltool/recipes/ipccwg1ar6ch3/ * recipe_ipccwg1ar6ch3_atmosphere.yml + * recipe_ipccwg1ar6ch3_fig_3_9.yml + * recipe_ipccwg1ar6ch3_fig_3_19.yml + * recipe_ipccwg1ar6ch3_fig_3_42_a.yml + * recipe_ipccwg1ar6ch3_fig_3_42_b.yml + * recipe_ipccwg1ar6ch3_fig_3_43.yml Diagnostics are stored in esmvaltool/diag_scripts/ @@ -49,6 +80,10 @@ Diagnostics are stored in esmvaltool/diag_scripts/ * ipcc_ar6/zonal_st_dev.ncl + Fig. 3.9: + + * ipcc_ar6/tas_anom_damip.ncl + Fig. 3.13: * ipcc_ar5/ch12_calc_IAV_for_stippandhatch.ncl: See :ref:`here:`. @@ -58,6 +93,20 @@ Diagnostics are stored in esmvaltool/diag_scripts/ * ipcc_ar6/precip_anom.ncl + Fig. 3.19: + + * ipcc_ar6/zonal_westerly_winds.ncl + + Fig. 3.42: + + * perfmetrics/main.ncl + * perfmetrics/collect.ncl + + Fig. 3.43: + + * ipcc_ar6/corr_pattern.ncl + * ipcc_ar6/corr_pattern_collect.ncl + User settings in recipe ----------------------- @@ -92,6 +141,7 @@ User settings in recipe * variable "sos": diag_scripts/shared/plot/rgb/ipcc-ar6_misc_seq_1.rgb, diag_scripts/shared/plot/rgb/ipcc-ar6_misc_div.rgb + #. Script ipcc_ar6/tas_anom.ncl *Required settings for script* @@ -122,6 +172,28 @@ User settings in recipe * e.g. diag_scripts/shared/plot/styles/cmip5.style + +#. Script ipcc_ar6/tas_anom_damip.ncl + + *Required settings for script* + + * start_year: start year in figure + * end_year: end year in figure + * panels: list of variable blocks for each panel + + *Optional settings for script* + + * ref_start: start year of reference period for anomalies + * ref_end: end year of reference period for anomalies + * ref_mask: if true, model fields will be masked by reference fields + * plot_units: variable unit for plotting + * y-min: set min of y-axis + * y-max: set max of y-axis + * header: title for each panel + * title: name of region as part of filename + * legend: set labels for optional output of a legend in an extra file + + #. Script ipcc_ar6/tsline_collect.ncl *Optional settings for script* @@ -142,6 +214,7 @@ User settings in recipe * reference_dataset: reference dataset; REQUIRED when calculating anomalies + #. Script ipcc_ar6/zonal_st_dev.ncl *Required settings for script* @@ -160,6 +233,7 @@ User settings in recipe * reference_dataset: reference dataset; REQUIRED when calculating anomalies + #. Script ipcc_ar6/precip_anom.ncl *Required settings for script* @@ -182,24 +256,116 @@ User settings in recipe * y_max: set max of y-axis + +#. Script ipcc_ar6/zonal_westerly_winds.ncl + + *Optional settings for variables* + + * reference_dataset: reference dataset; REQUIRED when calculating + anomalies + + *Optional settings for script* + + * e13fig12_start_year: year when the climatology calculation starts + (default: start_year of var) + * e13fig12_end_year: year when the climatology calculation ends + (default: end_year of var) + * e13fig12_multimean: multimodel mean (default: False) + * e13fig12_exp_MMM: name of the experiments for the MMM + (required if @e13fig12_multimean = True) + * e13fig12_season: season (default: ANN) + + + +#. Script perfmetrics/perfmetrics_main.ncl + + See :ref:`here`. + + +#. Script perfmetrics/perfmetrics_collect.ncl + + See :ref:`here`. + +#. Script ipcc_ar6/corr_pattern.ncl + + *Required settings for variables* + + * reference_dataset: name of reference observation + + *Optional settings for variables* + + * alternative_dataset: name of alternative observations + +#. Script ipcc_ar6/corr_pattern_collect.ncl + + *Optional settings for script* + + * diag_order: give order of plotting variables on the x-axis + * labels: List of labels for each variable on the x-axis + * model_spread: if True, model spread is shaded + * plot_median: if True, median is plotted + * project_order: give order of projects + + Variables --------- +* et (land, monthly mean, longitude latitude time) +* fgco2 (ocean, monthly mean, longitude latitude time) +* gpp (land, monthly mean, longitude latitude time) +* hfds (land, monthly mean, longitude latitude time) +* hus (land, monthly mean, longitude latitude level time) +* lai (land, monthly mean, longitude latitude time) +* lwcre (atmos, monthly mean, longitude latitude time) +* nbp (land, monthly mean, longitude latitude time) * pr (atmos, monthly mean, longitude latitude time) +* psl (atmos, monthly mean, longitude latitude time) +* rlds (atmos, monthly mean, longitude latitude time) +* rlus (atmos, monthly mean, longitude latitude time) +* rlut (atmos, monthly mean, longitude latitude time) +* rsds (atmos, monthly mean, longitude latitude time) +* rsus (atmos, monthly mean, longitude latitude time) +* rsut (atmos, monthly mean, longitude latitude time) +* sm (land, monthly mean, longitude latitude time) +* sic (seaice, monthly mean, longitude latitude time) +* siconc (seaice, monthly mean, longitude latitude time) +* swcre (atmos, monthly mean, longitude latitude time) +* ta (atmos, monthly mean, longitude latitude level time) * tas (atmos, monthly mean, longitude latitude time) * tasa (atmos, monthly mean, longitude latitude time) +* tos (atmos, monthly mean, longitude latitude time) +* ts (atmos, monthly mean, longitude latitude time) +* ua (atmos, monthly mean, longitude latitude level time) +* va (atmos, monthly mean, longitude latitude level time) +* zg (atmos, monthly mean, longitude latitude level time) Observations and reformat scripts --------------------------------- +* AIRS (hus - obs4MIPs) +* ATSR (tos - obs4MIPs) * BerkeleyEarth (tasa - esmvaltool/cmorizers/data/formatters/datasets/berkeleyearth.py) +* CERES-EBAF (rlds, rlus, rlut, rlutcs, rsds, rsus, rsut, rsutcs - obs4MIPs) * CRU (pr - esmvaltool/cmorizers/data/formatters/datasets/cru.py) -* ERA5 (tas - ERA5 data can be used via the native6 project) +* ESACCI-SOILMOISTURE (sm - esmvaltool/cmorizers/data/formatters/datasets + /esacci_soilmoisture.py) +* ESACCI-SST (ts - esmvaltool/cmorizers/data/formatters/datasets/esacci_sst.py) +* ERA5 (hus, psl, ta, tas, ua, va, zg - ERA5 data can be used via the native6 project) +* ERA-Interim (hfds - cmorizers/data/formatters/datasets/era_interim.py) +* FLUXCOM (gpp - cmorizers/data/formatters/datasets/fluxcom.py) * GHCN (pr - esmvaltool/cmorizers/data/formatters/datasets/ghcn.ncl) * GPCP-SG (pr - obs4MIPs) * HadCRUT5 (tasa - esmvaltool/cmorizers/data/formatters/datasets/hadcrut5.py) +* HadISST (sic, tos, ts - esmvaltool/cmorizers/data/formatters/datasets/hadisst.ncl) +* JMA-TRANSCOM (fgco2, nbp - esmvaltool/cmorizers/data/formatters/datasets/jma_transcom.py) +* JRA-55 (psl - ana4MIPs) * Kadow2020 (tasa - esmvaltool/cmorizers/data/formatters/datasets/kadow2020.py) +* LandFlux-EVAL (et - esmvaltool/cmorizers/data/formatters/datasets/landflux_eval.py) +* Landschuetzer2016 (fgco2 - esmvaltool/cmorizers/data/formatters/datasets/landschuetzer2016.py) +* LAI3g (lai - esmvaltool/cmorizers/data/formatters/datasets/lai3g.py) +* MTE (gpp - esmvaltool/cmorizers/data/formatters/datasets/mte.py) +* NCEP-NCAR-R1 (ta, tas, ua, va, zg - esmvaltool/cmorizers/data/formatters/datasets/ncep_ncar_r1.py) * NOAAGlobalTemp (tasa - esmvaltool/cmorizers/data/formatters/datasets/noaaglobaltemp.py) @@ -207,14 +373,16 @@ References ---------- * Eyring, V., N.P. Gillett, K.M. Achuta Rao, R. Barimalala, M. Barreiro - Parrillo, N. Bellouin, C. Cassou, P.J. Durack, Y. Kosaka, S. McGregor, S. Min, - O. Morgenstern, and Y. Sun, 2021: Human Influence on the Climate System. In - Climate Change 2021: The Physical Science Basis. Contribution of Working Group - I to the Sixth Assessment Report of the Intergovernmental Panel on Climate - Change [Masson-Delmotte, V., P. Zhai, A. Pirani, S.L. Connors, C. Péan, S. - Berger, N. Caud, Y. Chen, L. Goldfarb, M.I. Gomis, M. Huang, K. Leitzell, E. - Lonnoy, J.B.R. Matthews, T.K. Maycock, T. Waterfield, O. Yelekçi, R. Yu, and - B. Zhou (eds.)]. Cambridge University Press. In Press. + Parrillo, N. Bellouin, C. Cassou, P.J. Durack, Y. Kosaka, S. McGregor, + S. Min, O. Morgenstern, and Y. Sun, 2021: Human Influence on the Climate + System. In Climate Change 2021: The Physical Science Basis. Contribution + of Working Group I to the Sixth Assessment Report of the Intergovernmental + Panel on Climate Change [Masson-Delmotte, V., P. Zhai, A. Pirani, + S.L. Connors, C. Péan, S. Berger, N. Caud, Y. Chen, L. Goldfarb, M.I. Gomis + , M. Huang, K. Leitzell, E. Lonnoy, J.B.R. Matthews, T.K. Maycock, + T. Waterfield, O. Yelekçi, R. Yu, and B. Zhou (eds.)]. Cambridge Universiy + Press, Cambridge, United Kingdom and New York, NY, USA, pp. 423-552, + doi: 10.1017/9781009157896.005. Example plots @@ -224,7 +392,7 @@ Example plots :align: center Figure 3.3: Annual mean near-surface (2 m) air temperature (°C) for the - period 1995–2014. (a) Multi-model (ensemble) mean constructed with one + period 1995-2014. (a) Multi-model (ensemble) mean constructed with one realization of the CMIP6 historical experiment from each model. (b) Multi-model mean bias, defined as the difference between the CMIP6 multi-model mean and the climatology of the fifth generation European @@ -232,12 +400,12 @@ Example plots of the global climate (ERA5). (c) Multi-model mean of the root mean square error calculated over all months separately and averaged, with respect to the climatology from ERA5. Uncertainty is represented using the advanced - approach: No overlay indicates regions with robust signal, where ≥66% of - models show change greater than the variability threshold and ≥80% of all + approach: No overlay indicates regions with robust signal, where >=66% of + models show change greater than the variability threshold and >=80% of all models agree on sign of change; diagonal lines indicate regions with no change or no robust signal, where <66% of models show a change greater than the variability threshold; crossed lines indicate regions with - conflicting signal, where ≥66% of models show change greater than the + conflicting signal, where >=66% of models show change greater than the variability threshold and <80% of all models agree on sign of change. .. figure:: /recipes/figures/ipccwg1ar6ch3/gsat_Global_CMIP6_historical-ssp245_anom_1850-2020.png @@ -245,8 +413,8 @@ Example plots Figure 3.4a: Observed and simulated time series of the anomalies in annual and global mean surface air temperature (GSAT). All anomalies are - differences from the 1850–1900 time-mean of each individual time series. - The reference period 1850–1900 is indicated by grey shading. (a) Single + differences from the 1850-1900 time-mean of each individual time series. + The reference period 1850-1900 is indicated by grey shading. (a) Single simulations from CMIP6 models (thin lines) and the multi-model mean (thick red line). Observational data (thick black lines) are from the Met Office Hadley Centre/Climatic Research Unit dataset (HadCRUT5), and are blended @@ -261,17 +429,17 @@ Example plots Figure 3.4b: Observed and simulated time series of the anomalies in annual and global mean surface air temperature (GSAT). All anomalies are - differences from the 1850–1900 time-mean of each individual time series. - The reference period 1850–1900 is indicated by grey shading. (b) Multi-model + differences from the 1850-1900 time-mean of each individual time series. + The reference period 1850-1900 is indicated by grey shading. (b) Multi-model means of CMIP5 (blue line) and CMIP6 (red line) ensembles and associated 5th to 95th percentile ranges (shaded regions). Observational data are HadCRUT5, Berkeley Earth, National Oceanic and Atmospheric Administration NOAAGlobalTemp and Kadow et al. (2020). Masking was done as in (a). CMIP6 historical simulations were extended with SSP2-4.5 simulations for the - period 2015–2020 and CMIP5 simulations were extended with RCP4.5 simulations - for the period 2006–2020. All available ensemble members were used. The + period 2015-2020 and CMIP5 simulations were extended with RCP4.5 simulations + for the period 2006-2020. All available ensemble members were used. The multi-model means and percentiles were calculated solely from simulations - available for the whole time span (1850–2020). + available for the whole time span (1850-2020). .. figure:: /recipes/figures/ipccwg1ar6ch3/tas_std_dev_zonmean.png :align: center @@ -286,11 +454,26 @@ Example plots Observational and model datasets were detrended by removing the least-squares quadratic trend. +.. figure:: /recipes/figures/ipccwg1ar6ch3/tas_anom_damip_global_1850-2020.png + :align: center + + Figure 3.9: Global, land and ocean annual mean near-surface air + temperature anomalies in CMIP6 models and observations. Timeseries are + shown for CMIP6 historical anthropogenic and natural (brown) natural-only + (green), greenhouse gas only (grey) and aerosol only (blue) simulations + (multi-model means shown as thick lines, and shaded ranges between the 5th + and 95th percentiles) and for HadCRUT5 (black). All models have been + subsampled using the HadCRUT5 observational data mask. Temperature + anomalies are shown relative to 1950-2010 for Antarctica and relative to + 1850-1900 for other continents. CMIP6 historical simulations are expanded by + the SSP2-4.5 scenario simulations. All available ensemble members were used. + Regions are defined by Iturbide et al. (2020). + .. figure:: /recipes/figures/ipccwg1ar6ch3/model_bias_pr_annualclim_CMIP6.png :align: center - Figure 3.13: Annual-mean precipitation rate (mm day–1) for the period - 1995–2014. (a) Multi-model (ensemble) mean constructed with one realization + Figure 3.13: Annual-mean precipitation rate (mm day-1) for the period + 1995-2014. (a) Multi-model (ensemble) mean constructed with one realization of the CMIP6 historical experiment from each model. (b) Multi-model mean bias, defined as the difference between the CMIP6 multi-model mean and precipitation analysis from the Global Precipitation Climatology Project @@ -298,11 +481,11 @@ Example plots mean square error calculated over all months separately and averaged with respect to the precipitation analysis from GPCP version 2.3. Uncertainty is represented using the advanced approach. No overlay indicates regions with - robust signal, where ≥66% of models show change greater than the variability - threshold and ≥80% of all models agree on sign of change; diagonal lines + robust signal, where >=66% of models show change greater than the variability + threshold and >=80% of all models agree on sign of change; diagonal lines indicate regions with no change or no robust signal, where <66% of models show a change greater than the variability threshold; crossed lines indicate - regions with conflicting signal, where ≥66% of models show change greater + regions with conflicting signal, where >=66% of models show change greater than the variability threshold and <80% of all models agree on the sign of change. @@ -310,22 +493,70 @@ Example plots :align: center Figure 3.15: Observed and simulated time series of anomalies in zonal - average annual mean precipitation. (a), (c–f) Evolution of global and zonal - average annual mean precipitation (mm day–1) over areas of land where there - are observations, expressed relative to the base period of 1961–1990, + average annual mean precipitation. (a), (c-f) Evolution of global and zonal + average annual mean precipitation (mm day-1) over areas of land where there + are observations, expressed relative to the base period of 1961-1990, simulated by CMIP6 models (one ensemble member per model) forced with both anthropogenic and natural forcings (brown) and natural forcings only (green). Multi-model means are shown in thick solid lines and shading - shows the 5–95% confidence interval of the individual model simulations. + shows the 5-95% confidence interval of the individual model simulations. The data is smoothed using a low pass filter. Observations from three different datasets are included: gridded values derived from Global Historical Climatology Network (GHCN version 2) station data, updated from Zhang et al. (2007), data from the Global Precipitation Climatology Product (GPCP L3 version 2.3, Adler et al. (2003)) and from the Climate Research Unit (CRU TS4.02, Harris et al. (2014)). Also plotted are - boxplots showing interquartile and 5–95% ranges of simulated trends over + boxplots showing interquartile and 5-95% ranges of simulated trends over the period for simulations forced with both anthropogenic and natural forcings (brown) and natural forcings only (blue). Observed trends for each observational product are shown as horizontal lines. Panel (b) shows annual - mean precipitation rate (mm day–1) of GHCN version 2 for the years 1950–2014 + mean precipitation rate (mm day-1) of GHCN version 2 for the years 1950-2014 over land areas used to compute the plots. + +.. figure:: /recipes/figures/ipccwg1ar6ch3/zonal_westerly_winds.png + :align: center + + Figure 3.19: Long-term mean (thin black contours) and linear trend (colour) + of zonal mean December-January-February zonal winds from 1985 to 2014 + in the Southern Hemisphere. The figure shows (a) ERA5 and (b) the CMIP6 + multi-model mean (58 CMIP6 models). The solid contours show positive + (westerly) and zero long-term mean zonal wind, and the dashed contours show + negative (easterly) long-term mean zonal wind. Only one ensemble member per + model is included. Figure is modified from Eyring et al. (2013), their + Figure 12. + +.. figure:: /recipes/figures/ipccwg1ar6ch3/fig_3_42_a.png + :align: center + + Figure 3.42a: Relative space-time root-mean-square deviation (RMSD) + calculated from the climatological seasonal cycle of the CMIP simulations + (1980-1999) compared to observational datasets. A relative performance + measure is displayed, with blue shading indicating better and red shading + indicating worse performance than the median error of all model results. A + diagonal split of a grid square shows the relative error with respect to the + reference data set (lower right triangle) and an additional data set (upper + left triangle). Reference/additional datasets are from top to bottom in (a): + ERA5/NCEP, GPCP-SG/GHCN, CERES-EBAF, CERES-EBAF, CERES-EBAF, CERES-EBAF, + JRA-55/ERA5, ESACCI-SST/HadISST, ERA5/NCEP, ERA5/NCEP, ERA5/NCEP, ERA5/NCEP, + ERA5/NCEP, ERA5/NCEP, AIRS/ERA5, ERA5/NCEP. White boxes are used when data + are not available for a given model and variable. Figure is updated and + expanded from Bock et al. (2020). + +.. figure:: /recipes/figures/ipccwg1ar6ch3/patterncor.png + :align: center + + Figure 3.43 | Centred pattern correlations between models and observations + for the annual mean climatology over the period 1980-1999. Results are + shown for individual CMIP3 (green), CMIP5 (blue) and CMIP6 (red) models (one + ensemble member from each model is used) as short lines, along with the + corresponding multi-model ensemble averages (long lines). Correlations are + shown between the models and the primary reference observational data set + (from left to right: ERA5, GPCP-SG, CERES-EBAF, CERES-EBAF, CERES-EBAF, + CERES-EBAF, JRA-55, ESACCI-SST, ERA5, ERA5, ERA5, ERA5, ERA5, ERA5, AIRS, + ERA5). In addition, the correlation between the primary reference and + additional observational datasets (from left to right: NCEP, GHCN, -, -, -, + -, ERA5, HadISST, NCEP, NCEP, NCEP, NCEP, NCEP, NCEP, NCEP, ERA5) are shown + (solid grey circles) if available. To ensure a fair comparison across a + range of model resolutions, the pattern correlations are computed after + regridding all datasets to a resolution of 4° in longitude and 5° + latitude. diff --git a/doc/sphinx/source/recipes/recipe_monitor.rst b/doc/sphinx/source/recipes/recipe_monitor.rst index 28133c0ba6..5d1b3ed9ae 100644 --- a/doc/sphinx/source/recipes/recipe_monitor.rst +++ b/doc/sphinx/source/recipes/recipe_monitor.rst @@ -183,6 +183,13 @@ Annual cycle of tas. Timeseries of tas including a reference dataset. +.. _fig_annual_cycle_with_ref: +.. figure:: /recipes/figures/monitor/annualcycle_with_ref.png + :align: center + :width: 14cm + +Annual cycle of tas including a reference dataset. + .. _fig_map_with_ref: .. figure:: /recipes/figures/monitor/map_with_ref.png :align: center diff --git a/doc/sphinx/source/recipes/recipe_oceans.rst b/doc/sphinx/source/recipes/recipe_oceans.rst index 3b6f79b7b1..d8bf3143e1 100644 --- a/doc/sphinx/source/recipes/recipe_oceans.rst +++ b/doc/sphinx/source/recipes/recipe_oceans.rst @@ -806,8 +806,8 @@ These files need to be reformatted using the `esmvaltool data format WOA` comman Landschuetzer 2016 ------------------ These data can be downloaded from: -ftp://ftp.nodc.noaa.gov/nodc/archive/arc0105/0160558/1.1/data/0-data/spco2_1998-2011_ETH_SOM-FFN_CDIAC_G05.nc -(last access 02/28/2019) +https://www.nodc.noaa.gov/archive/arc0105/0160558/3.3/data/0-data/spco2_1982-2015_MPI_SOM-FFN_v2016.nc +(last access 09/20/2022) The following variables are used by the ocean diagnostics: - fgco2, Surface Downward Flux of Total CO2 diff --git a/doc/sphinx/source/recipes/recipe_perfmetrics.rst b/doc/sphinx/source/recipes/recipe_perfmetrics.rst index b78b037081..0a966d648a 100644 --- a/doc/sphinx/source/recipes/recipe_perfmetrics.rst +++ b/doc/sphinx/source/recipes/recipe_perfmetrics.rst @@ -53,6 +53,7 @@ User settings in recipe * calc_grading: calculates grading metrics (default: False) * stippling: uses stippling to mark statistically significant differences (default: False = mask out non-significant differences in gray) * show_global_avg: diplays the global avaerage of the input field as string at the top-right of lat-lon plots (default: False) + * annots: choose the annotation style, e.g. ```alias``` which would display the alias of the dataset as title (applies to plot_type zonal and cycle_zonal) * metric: chosen grading metric(s) (if calc_grading is True) * normalization: metric normalization (for RMSD and BIAS metrics only) * abs_levs: list of contour levels for absolute plot @@ -61,6 +62,34 @@ User settings in recipe * zonal_ymin: for plot_type zonal only, minimum pressure level on the y-axis (default: 5. hPa) * latlon_cmap: for plot_type latlon only, chosen color table (default: "amwg_blueyellowred") * plot_units: plotting units (if different from standard CMOR units) + * add_tropopause: adds an outline of a climatological tropopause to the zonal plot (default: False) + + *Special optional plot configurations* + + It is possible to make some specific customizations to the plots (zonal + only). + + This includes for example specific tickmark labels of the axes. + + Those special customizations can be done by adding ncl plotting resources + combined with prefix ``res_`` as optional settings of the main script in the + recipe. + + Note that this requires to be familiar with the ncl plotting routines for + pressure vs height plots + (https://www.ncl.ucar.edu/Document/Graphics/Interfaces/gsn_csm_pres_hgt.shtml) + and the corresponding resources. + + The following shows an example on customizing the latitude tickmarks so + that a degree sign and and empty space is used for the labels: + + .. code-block:: yaml + + # copernicus style of latitude tickmarks + res_tmXBMode: "Explicit" + res_tmXBValues: [-60, -30, 0, 30, 60] + res_tmXBLabels: ["60~F35~J~F21~ S", "30~F35~J~F21~ S", "0~F35~J", "30~F35~J~F21~ N", "60~F35~J~F21~ N"] + *Required settings (variables)* @@ -143,7 +172,7 @@ The following list shows the currently used observational data sets for this rec * GPCP-SG (pr - obs4MIPs) * HadISST (ts - esmvaltool/cmorizers/data/formatters/datasets/hadisst.ncl) * MODIS (od550aer - esmvaltool/cmorizers/data/formatters/datasets/modis.ncl) - * NCEP (tas, ta, ua, va, zg - esmvaltool/cmorizers/data/formatters/datasets/ncep.ncl) + * NCEP-NCAR-R1 (tas, ta, ua, va, zg - esmvaltool/cmorizers/data/formatters/datasets/ncep_ncar_r1.py) * NIWA-BS (toz - esmvaltool/cmorizers/data/formatters/datasets/niwa_bs.ncl) * PATMOS-x (clt - esmvaltool/cmorizers/data/formatters/datasets/patmos_x.ncl) @@ -171,7 +200,7 @@ Example plots .. figure:: /recipes/figures/perfmetrics/perfmetrics_fig_1.png :width: 90% - Annual cycle of globally averaged temperature at 850 hPa (time period 1980-2005) for different CMIP5 models (historical simulation) (thin colored lines) in comparison to ERA-Interim (thick yellow line) and NCEP (thick black dashed line) reanalysis data. + Annual cycle of globally averaged temperature at 850 hPa (time period 1980-2005) for different CMIP5 models (historical simulation) (thin colored lines) in comparison to ERA-Interim (thick yellow line) and NCEP-NCAR-R1 (thick black dashed line) reanalysis data. .. figure:: /recipes/figures/perfmetrics/perfmetrics_fig_2.png :width: 90% diff --git a/doc/sphinx/source/recipes/recipe_schlund20jgr.rst b/doc/sphinx/source/recipes/recipe_schlund20jgr.rst index bc458c8b3b..908af3c497 100644 --- a/doc/sphinx/source/recipes/recipe_schlund20jgr.rst +++ b/doc/sphinx/source/recipes/recipe_schlund20jgr.rst @@ -3,6 +3,15 @@ Constraining uncertainty in projected gross primary production (GPP) with machine learning ========================================================================================== +.. warning:: + + Not all datasets necessary to run these recipes are available on ESGF. + The following datasets are missing: + + * Dataset: co2, Amon, CMIP5, HadGEM2-ES, esmHistorical, r1i1p1 + * Dataset: gpp, Lmon, CMIP5, MIROC-ESM, esmFixClim1, r1i1p1 + * Supplementary: sftlf, fx, CMIP5, MIROC-ESM, esmFixClim1, r0i0p0 + Overview -------- diff --git a/doc/sphinx/source/recipes/recipe_snowalbedo.rst b/doc/sphinx/source/recipes/recipe_snowalbedo.rst index 22bde3bbba..5f3e5ae158 100644 --- a/doc/sphinx/source/recipes/recipe_snowalbedo.rst +++ b/doc/sphinx/source/recipes/recipe_snowalbedo.rst @@ -122,7 +122,7 @@ References Example plots ------------- -.. figure:: /recipes/figures/flato13ipcc/fig-9-45a.png +.. figure:: /recipes/figures/ipccwg1ar5ch9/fig-9-45a.png :align: center Scatterplot of springtime snow-albedo effect values in climate diff --git a/doc/sphinx/source/recipes/recipe_wenzel14jgr.rst b/doc/sphinx/source/recipes/recipe_wenzel14jgr.rst index ada58e6973..7c07c6e1f5 100644 --- a/doc/sphinx/source/recipes/recipe_wenzel14jgr.rst +++ b/doc/sphinx/source/recipes/recipe_wenzel14jgr.rst @@ -105,7 +105,7 @@ Observations and reformat scripts --------------------------------- * GCP2018: Global Carbon Budget including land (nbp) and ocean (fgco2) carbon fluxes -* NCEP: National Centers for Environmental Prediction reanalysis data for near surface temperature +* NCEP-NCAR-R1: National Centers for Environmental Prediction reanalysis data for near surface temperature References diff --git a/doc/sphinx/source/utils.rst b/doc/sphinx/source/utils.rst index f3a4d33030..5e46d06d81 100644 --- a/doc/sphinx/source/utils.rst +++ b/doc/sphinx/source/utils.rst @@ -116,24 +116,31 @@ 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 +`esmvaltool/utils/batch-jobs `__. Using cylc ---------- A cylc suite for running all recipes is available in -`esmvaltool/utils/testing/regression `__ +`esmvaltool/utils/testing/regression `__. +This suite is configured to work with versions of cylc older than 8.0.0 . To prepare for using this tool: -#. Log in to Mistral or another system that uses `slurm `_ +#. Log in to a system that uses `slurm `_ #. Make sure the required CMIP and observational datasets are available and configured in config-user.yml #. Make sure the required auxiliary data is available (see :ref:`recipe documentation `) #. Install ESMValTool #. Update config-user.yml so it points to the right data locations -Next, get started with `cylc `_: +Next, get started with `cylc `_: #. Run ``module load cylc`` #. Register the suite with cylc ``cylc register run-esmvaltool-recipes ~/ESMValTool/esmvaltool/utils/testing/regression`` @@ -142,7 +149,8 @@ Next, get started with `cylc `. Using Rose and cylc ------------------- @@ -205,6 +213,107 @@ There you will find the run shell: ``run_example``, as well as an example how to set the configuration file. If you don't have Met Office credentials, a copy of `u-bd684` is always located in ``/home/users/valeriu/roses/u-bd684`` on Jasmin. +.. _utils_batch_jobs: + +Using the scripts 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. + +.. _utils_generate: + +Using `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``. +* ``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. + +Optionally, the following parameters can be edited: + +* ``config_file``, *str*: Path to ``config-user.yml`` if default ``~/.esmvaltool/config-user.yml`` not used. +* ``partition``, *str*: Name of the DKRZ partition used to run jobs. Default is ``interactive`` to minimize computing cost compared to ``compute`` for which nodes cannot be shared. +* ``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. + +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. +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: + +.. code-block:: python + + SPECIAL_RECIPES = { + 'recipe_name': { + 'partition': '#SBATCH --partition=', + 'time': '#SBATCH --time=', + 'memory': '#SBATCH --mem=' # --constraint or --nstasks can be used instead. + }, + } + +Some recipes can only be run with ``--max_parallel_tasks=1`` for various reasons (memory issues, diagnostic issues, CMIP3 data used). +These recipes need to be added to the ``ONE_TASK_RECIPES`` list. + +Note that the script has been optimized to use standard SLURM settings to run most recipes while minimizing the computational cost of the jobs and tailored runtime settings for resource-intensive recipes. +It is only necessary to edit this script for recipes that have been added since the last release and cannot be run with the default settings. + +In the case in which ``submit`` is set to ``True``, but you want to exclude certain recipes from being submitted, their name can be added in the ``exclude`` list: + +.. code-block:: python + + exclude = ['recipe_to_be_excluded_1', 'recipe_to_be_excluded_2'] + +.. _utils_parse: + +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: + +.. code-block:: bash + + for recipe in $(esmvaltool recipes list | grep '\.yml$'); do echo "$recipe"; done > all_recipes.txt + +.. _overview_page: + +Overview of recipe runs +======================= + +To create overview webpages of a set of recipe runs, run: + +.. code-block:: python + + python esmvaltool/utils/testing/regression/summarize.py ~/esmvaltool_output/ + +This will generate 2 html files: + +- ``index.html`` that displays a summary of each recipe run, with a title and + a representative plot, a short description of the aim of the recipe, and + links to each individual run. +- ``debug.html`` that provides an overview table of successful and failed runs + with links to each individual run, and computing resources used for each run. + .. _compare_recipe_runs: Comparing recipe runs diff --git a/environment.yml b/environment.yml index 4e3404e845..eadcf089bd 100644 --- a/environment.yml +++ b/environment.yml @@ -11,10 +11,11 @@ channels: dependencies: - pip!=21.3 - python>=3.8 + - aiohttp - cartopy - cdo>=1.9.7 - cdsapi - - cf-units >=3.0.0,<3.1.0,!=3.0.1.post0 # see https://github.com/ESMValGroup/ESMValCore/issues/1655 + - cf-units - cftime - cmocean - cython @@ -22,11 +23,12 @@ dependencies: - ecmwf-api-client - eofs - esmpy - - esmvalcore 2.6.* + - esmvalcore 2.8.* - fiona - fire - gdal - iris>=3.1.0 + - iris-esmf-regrid - jinja2 - joblib - lime @@ -34,8 +36,9 @@ dependencies: - matplotlib-base - natsort - nc-time-axis - - netCDF4!=1.6.1 # https://github.com/ESMValGroup/ESMValCore/pull/1724 + - netCDF4 - numpy + - packaging - openpyxl - pandas - progressbar2 @@ -56,22 +59,25 @@ dependencies: - scipy - seaborn - seawater - - shapely + - shapely <2.0.0 # github.com/ESMValGroup/ESMValTool/issues/2965 - xarray>=0.12.0 - xesmf==0.3.0 - xgboost>1.6.1 # github.com/ESMValGroup/ESMValTool/issues/2779 - xlsxwriter + - zarr # Python packages needed for testing + - flake8 - pytest >=3.9,!=6.0.0rc1,!=6.0.0 - pytest-cov - pytest-env - - pytest-flake8 - pytest-html !=2.1.0 - pytest-metadata >=1.5.1 + - pytest-mock - pytest-xdist # Python packages needed for building docs - autodocsumm>=0.2.2 - - sphinx>=5 + - nbsphinx + - sphinx>=6.1.3 - sphinx_rtd_theme # Python packages needed for development - codespell diff --git a/environment_osx.yml b/environment_osx.yml index 2ee8e1c552..651379853e 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -11,10 +11,11 @@ channels: dependencies: - pip!=21.3 - python>=3.8 + - aiohttp - cartopy - cdo>=1.9.7 - cdsapi - - cf-units >=3.0.0,<3.1.0,!=3.0.1.post0 # see https://github.com/ESMValGroup/ESMValCore/issues/1655 + - cf-units - cftime - cmocean - cython @@ -22,11 +23,12 @@ dependencies: - ecmwf-api-client - eofs - esmpy - - esmvalcore 2.6.* + - esmvalcore 2.8.* - fiona - fire - gdal - iris>=3.1.0 + - iris-esmf-regrid - jinja2 - joblib - lime @@ -34,8 +36,9 @@ dependencies: - matplotlib-base - natsort - nc-time-axis - - netCDF4!=1.6.1 # https://github.com/ESMValGroup/ESMValCore/pull/1724 + - netCDF4 - numpy + - packaging - openpyxl - pandas - progressbar2 @@ -61,17 +64,20 @@ dependencies: - xesmf==0.3.0 - xgboost>1.6.1 # github.com/ESMValGroup/ESMValTool/issues/2779 - xlsxwriter + - zarr # Python packages needed for testing + - flake8 - pytest >=3.9,!=6.0.0rc1,!=6.0.0 - pytest-cov - pytest-env - - pytest-flake8 - pytest-html !=2.1.0 - pytest-metadata >=1.5.1 + - pytest-mock - pytest-xdist # Python packages needed for building docs - autodocsumm>=0.2.2 - - sphinx>=5 + - nbsphinx + - sphinx>=6.1.3 - sphinx_rtd_theme # Python packages needed for development - codespell diff --git a/esmvaltool/cmorizers/data/cmor_config/ERA-Interim.yml b/esmvaltool/cmorizers/data/cmor_config/ERA-Interim.yml index 3e2cc44240..cfea7d8265 100644 --- a/esmvaltool/cmorizers/data/cmor_config/ERA-Interim.yml +++ b/esmvaltool/cmorizers/data/cmor_config/ERA-Interim.yml @@ -126,6 +126,7 @@ variables: mip: day raw: z file: 'ERA-Interim_z_daily_*.nc' + # monthly frequency clivi: mip: Amon @@ -136,6 +137,22 @@ variables: mip: Amon raw: tcc file: 'ERA-Interim_tcc_monthly_*.nc' + # clt-low, clt-med, clt-high: support to be added in the future +# clt-low: +# short_name: clt-low +# mip: Amon +# raw: lcc +# file: 'ERA-Interim_lcc_monthly_*.nc' +# clt-med: +# short_name: clt-med +# mip: Amon +# raw: mcc +# file: 'ERA-Interim_mcc_monthly_*.nc' +# clt-high: +# short_name: clt-high +# mip: Amon +# raw: hcc +# file: 'ERA-Interim_hcc_monthly_*.nc' clwvi: mip: Amon raw: @@ -145,6 +162,21 @@ variables: files: - 'ERA-Interim_p56.162_monthly_*.nc' - 'ERA-Interim_p57.162_monthly_*.nc' + cl_month: + short_name: cl + mip: Amon + raw: cc + file: 'ERA-Interim_cc_monthly_*.nc' + cli_month: + short_name: cli + mip: Amon + raw: ciwc + file: 'ERA-Interim_ciwc_monthly_*.nc' + clw_month: + short_name: clw + mip: Amon + raw: clwc + file: 'ERA-Interim_clwc_monthly_*.nc' evspsbl_month: short_name: evspsbl mip: Amon @@ -171,6 +203,11 @@ variables: mip: Amon raw: q file: 'ERA-Interim_q_monthly_*.nc' + lwp_month: + short_name: lwp + mip: Amon + raw: p56.162 + file: 'ERA-Interim_p56.162_monthly_*.nc' pr_month: short_name: pr mip: Amon @@ -195,6 +232,16 @@ variables: mip: Amon raw: msl file: 'ERA-Interim_msl_monthly_*.nc' + rlut_month: + short_name: rlut + mip: Amon + raw: ttr + file: 'ERA-Interim_ttr_monthly_*.nc' + rlutcs_month: + short_name: rlutcs + mip: Amon + raw: ttrc + file: 'ERA-Interim_ttrc_monthly_*.nc' rsds_month: short_name: rsds mip: Amon @@ -210,6 +257,26 @@ variables: mip: Emon raw: ssr file: 'ERA-Interim_ssr_monthly_*.nc' + rsut_month: + short_name: rsut + mip: Amon + raw: + - tisr + - tsr + operator: diff + files: + - 'ERA-Interim_tisr_monthly_*.nc' + - 'ERA-Interim_tsr_monthly_*.nc' + rsutcs_month: + short_name: rsutcs + mip: Amon + raw: + - tisr + - tsrc + operator: diff + files: + - 'ERA-Interim_tisr_monthly_*.nc' + - 'ERA-Interim_tsrc_monthly_*.nc' ta: mip: Amon raw: t diff --git a/esmvaltool/cmorizers/data/cmor_config/ESACCI-LST.yml b/esmvaltool/cmorizers/data/cmor_config/ESACCI-LST.yml index b7b5c21366..b15ce08be0 100644 --- a/esmvaltool/cmorizers/data/cmor_config/ESACCI-LST.yml +++ b/esmvaltool/cmorizers/data/cmor_config/ESACCI-LST.yml @@ -27,6 +27,5 @@ variables: file_day: 'ESACCI-LST-L3C-LST-MODISA-0.05deg_1MONTHLY_DAY-' file_night: 'ESACCI-LST-L3C-LST-MODISA-0.05deg_1MONTHLY_NIGHT-' # plan to make it possible to change MODISA here but only placeholders in the python there for now - start_year: 2003 + # Period covered: 2003-2018 # 2003 Only has data from July onwards for Aqua MODIS - end_year: 2018 diff --git a/esmvaltool/cmorizers/data/cmor_config/ESDC.yml b/esmvaltool/cmorizers/data/cmor_config/ESDC.yml new file mode 100644 index 0000000000..7fc4a77ff7 --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/ESDC.yml @@ -0,0 +1,26 @@ +--- +filename: 'esdc-8d-{grid}-{chunking}-{version}.zarr' + +attributes: + project_id: OBS6 + dataset_id: ESDC + version: 3.0.1 + tier: 2 + grid: 0.25deg + chunking: 1x720x1440 + # chunking: 256x128x128 + modeling_realm: reanaly + source: http://data.rsc4earth.de/EarthSystemDataCube/ + reference: 'esdc' + comment: '' + +variables: + tas: + mip: Amon + raw: air_temperature_2m + tasmax: + mip: Amon + raw: max_air_temperature_2m + tasmin: + mip: Amon + raw: min_air_temperature_2m diff --git a/esmvaltool/cmorizers/data/cmor_config/JRA-25.yml b/esmvaltool/cmorizers/data/cmor_config/JRA-25.yml new file mode 100644 index 0000000000..94b1a480da --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/JRA-25.yml @@ -0,0 +1,50 @@ +--- +# Common global attributes for Cmorizer output +attributes: + dataset_id: JRA-25 + version: '1' + tier: 2 + modeling_realm: reanaly + project_id: OBS6 + source: 'https://esgf.nccs.nasa.gov/thredds/fileServer/CREATE-IP/reanalysis/JMA/JRA-25/JRA-25/' + reference: 'jra_25' + comment: | + '' + +# Variables to cmorize +variables: + clt_month: + short_name: clt + mip: Amon + raw: clt + file: clt_Amon_reanalysis_JRA-25_197901-201312.nc + hus_month: + short_name: hus + mip: Amon + raw: hus + file: hus_Amon_reanalysis_JRA-25_197901-201312.nc + prw_month: + short_name: prw + mip: Amon + raw: prw + file: prw_Amon_reanalysis_JRA-25_197901-201312.nc + rlut_month: + short_name: rlut + mip: Amon + raw: rlut + file: rlut_Amon_reanalysis_JRA-25_197901-201312.nc + rlutcs_month: + short_name: rlutcs + mip: Amon + raw: rlutcs + file: rlutcs_Amon_reanalysis_JRA-25_197901-201312.nc + rsut_month: + short_name: rsut + mip: Amon + raw: rsut + file: rsut_Amon_reanalysis_JRA-25_197901-201312.nc + rsutcs_month: + short_name: rsutcs + mip: Amon + raw: rsutcs + file: rsutcs_Amon_reanalysis_JRA-25_197901-201312.nc diff --git a/esmvaltool/cmorizers/data/cmor_config/Landschuetzer2020.yml b/esmvaltool/cmorizers/data/cmor_config/Landschuetzer2020.yml new file mode 100644 index 0000000000..8f52ef0403 --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/Landschuetzer2020.yml @@ -0,0 +1,19 @@ +--- +# Common global attributes for Cmorizer output +attributes: + dataset_id: Landschuetzer2020 + version: '1.1' + tier: 2 + modeling_realm: clim + project_id: OBS6 + source: 'https://www.ncei.noaa.gov/data/oceans/ncei/ocads/data/0209633/' + reference: 'landschuetzer2020' + comment: '' + +# Variables to cmorize +variables: + spco2: + filename: MPI-ULB-SOM_FFN_clim.nc + mip: Omon + raw_name: pco2 + raw_units: '1e-6 atm' diff --git a/esmvaltool/cmorizers/data/cmor_config/MERRA2.yml b/esmvaltool/cmorizers/data/cmor_config/MERRA2.yml index 42763d7ffb..2857464563 100644 --- a/esmvaltool/cmorizers/data/cmor_config/MERRA2.yml +++ b/esmvaltool/cmorizers/data/cmor_config/MERRA2.yml @@ -18,4 +18,201 @@ variables: short_name: sm mip: Lmon raw: SFMC - file: 'MERRA2_?00.tavgM_2d_lnd_Nx.{year}??.nc4' + file: 'MERRA2_???.tavgM_2d_lnd_Nx.{year}??.nc4' + # monthly frequency + # 2 dimensional variables + clt_monthly: + short_name: clt + mip: Amon + raw: CLDTOT + file: 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + pr_monthly: + short_name: pr + mip: Amon + raw: PRECTOT + file: 'MERRA2_???.tavgM_2d_flx_Nx.{year}??.nc4' + evspsbl_monthly: + short_name: evspsbl + mip: Amon + raw: EVAP + file: 'MERRA2_???.tavgM_2d_flx_Nx.{year}??.nc4' + hfss_monthly: + short_name: hfss + mip: Amon + raw: HFLUX + file: 'MERRA2_???.tavgM_2d_flx_Nx.{year}??.nc4' + hfls_monthly: + short_name: hfls + mip: Amon + raw: EFLUX + file: 'MERRA2_???.tavgM_2d_flx_Nx.{year}??.nc4' + huss_monthly: + short_name: huss + mip: Amon + raw: QV2M + file: 'MERRA2_???.tavgM_2d_slv_Nx.{year}??.nc4' + prc_monthly: + short_name: prc + mip: Amon + raw: PRECCON + file: 'MERRA2_???.tavgM_2d_flx_Nx.{year}??.nc4' + prsn_monthly: + short_name: prsn + mip: Amon + raw: PRECSNO + file: 'MERRA2_???.tavgM_2d_flx_Nx.{year}??.nc4' + prw_monthly: + short_name: prw + mip: Amon + raw: TQV + file: 'MERRA2_???.tavgM_2d_slv_Nx.{year}??.nc4' + ps_monthly: + short_name: ps + mip: Amon + raw: PS + file: 'MERRA2_???.tavgM_2d_slv_Nx.{year}??.nc4' + psl_monthly: + short_name: psl + mip: Amon + raw: SLP + file: 'MERRA2_???.tavgM_2d_slv_Nx.{year}??.nc4' + rlds_monthly: + short_name: rlds + mip: Amon + raw: LWGAB + file: 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + rldscs_monthly: + short_name: rldscs + mip: Amon + raw: LWGABCLR + file: 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + rlus_monthly: + short_name: rlus + mip: Amon + raw: LWGEM + file: 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + rlut_monthly: + short_name: rlut + mip: Amon + raw: LWTUP + file: 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + rlutcs_monthly: + short_name: rlutcs + mip: Amon + raw: LWTUPCLR + file: 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + rsds_monthly: + short_name: rsds + mip: Amon + raw: SWGDN + file: 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + rsdscs_monthly: + short_name: rsdscs + mip: Amon + raw: SWGDNCLR + file: 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + rsdt_monthly: + short_name: rsdt + mip: Amon + raw: SWTDN + file: 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + tas_monthly: + short_name: tas + mip: Amon + raw: T2M + file: 'MERRA2_???.tavgM_2d_slv_Nx.{year}??.nc4' + tasmax_monthly: + short_name: tasmax + mip: Amon + raw: T2MMAX + file: 'MERRA2_???.statM_2d_slv_Nx.{year}??.nc4' + tasmin_monthly: + short_name: tasmin + mip: Amon + raw: T2MMIN + file: 'MERRA2_???.statM_2d_slv_Nx.{year}??.nc4' + tauu_monthly: + short_name: tauu + mip: Amon + raw: TAUX + file: 'MERRA2_???.tavgM_2d_flx_Nx.{year}??.nc4' + tauv_monthly: + short_name: tauv + mip: Amon + raw: TAUY + file: 'MERRA2_???.tavgM_2d_flx_Nx.{year}??.nc4' + ts_monthly: + short_name: ts + mip: Amon + raw: TS + file: 'MERRA2_???.tavgM_2d_slv_Nx.{year}??.nc4' + uas_monthly: + short_name: uas + mip: Amon + raw: U10M + file: 'MERRA2_???.tavgM_2d_slv_Nx.{year}??.nc4' + vas_monthly: + short_name: vas + mip: Amon + raw: V10M + file: 'MERRA2_???.tavgM_2d_slv_Nx.{year}??.nc4' + rsus_monthly: + short_name: rsus + mip: Amon + raw: SWGDN-SWGNT + file: 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + rsuscs_monthly: + short_name: rsuscs + mip: Amon + raw: SWGDNCLR-SWGNTCLR + file: 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + rsut_monthly: + short_name: rsut + mip: Amon + raw: SWTDN-SWTNT + file: 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + rsutcs_monthly: + short_name: rsutcs + mip: Amon + raw: "SWTDN-SWTNTCLR" + file: 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + ta_monthly: + short_name: ta + mip: Amon + raw: "T" + file: 'MERRA2_???.instM_3d_ana_Np.{year}??.nc4' + ua_monthly: + short_name: ua + mip: Amon + raw: "U" + file: 'MERRA2_???.instM_3d_ana_Np.{year}??.nc4' + va_monthly: + short_name: va + mip: Amon + raw: "V" + file: 'MERRA2_???.instM_3d_ana_Np.{year}??.nc4' + tro3_monthly: + short_name: tro3 + mip: Amon + raw: "O3" + file: 'MERRA2_???.instM_3d_ana_Np.{year}??.nc4' + zg_monthly: + short_name: zg + mip: Amon + raw: "H" + file: 'MERRA2_???.instM_3d_ana_Np.{year}??.nc4' + hus_monthly: + short_name: hus + mip: Amon + raw: "QV" + file: 'MERRA2_???.instM_3d_ana_Np.{year}??.nc4' + wap_monthly: + short_name: wap + mip: Amon + raw: "OMEGA" + file: 'MERRA2_???.instM_3d_asm_Np.{year}??.nc4' + hur_monthly: + short_name: hur + mip: Amon + raw: "RH" + file: 'MERRA2_???.instM_3d_asm_Np.{year}??.nc4' diff --git a/esmvaltool/cmorizers/data/cmor_config/MOBO-DIC_MPIM.yml b/esmvaltool/cmorizers/data/cmor_config/MOBO-DIC_MPIM.yml new file mode 100644 index 0000000000..c25389fb12 --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/MOBO-DIC_MPIM.yml @@ -0,0 +1,19 @@ +--- +# Common global attributes for Cmorizer output +attributes: + dataset_id: MOBO-DIC_MPIM + version: '1.1' + tier: 2 + modeling_realm: clim + project_id: OBS6 + source: 'https://www.ncei.noaa.gov/data/oceans/ncei/ocads/data/0221526/' + reference: 'mobo_dic_mpim' + +# Variables to cmorize +variables: + dissic: + filename: MOBO-DIC_MPIM_monthly_clim.nc + mip: Omon + raw_name: DIC + raw_units: '1e-6 mol kg-1' + comment: 'The original units of this variable are mumol/kg. To convert to the CMOR units mol/m3, we assume a constant sea water density of 1032 kg/m3, which is approximately the sea water density for T=4°C, salinity=35PSU, and p=100bar according to the UNESCO formula (UNESCO, 1981, Tenth report of the joint panel on oceanographic tables and standards, UNESCO Technical Papers in Marine Science, see https://www.wkcgroup.com/tools-room/seawater-density-calculator/ and https://link.springer.com/content/pdf/bbm:978-3-319-18908-6/1.pdf).' diff --git a/esmvaltool/cmorizers/data/cmor_config/NCEP-DOE-R2.yml b/esmvaltool/cmorizers/data/cmor_config/NCEP-DOE-R2.yml new file mode 100644 index 0000000000..96fada79e4 --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/NCEP-DOE-R2.yml @@ -0,0 +1,36 @@ +--- +# Global attributes of NetCDF file +attributes: + dataset_id: NCEP-DOE-R2 + project_id: OBS6 + tier: 2 + version: '2' + modeling_realm: reanaly + source: 'https://psl.noaa.gov/data/gridded/data.ncep.reanalysis2.html' + reference: 'ncep-doe-r2' + comment: | + '' + +# Variables to CMORize +variables: + # monthly frequency + clt_month: + short_name: clt + mip: Amon + raw: tcdc + file: 'tcdc\.eatm\.mon\.mean\.nc' + hur_month: + short_name: hur + mip: Amon + raw: rhum + file: 'rhum\.mon\.mean\.nc' + prw_month: + short_name: prw + mip: Amon + raw: pr_wtr + file: 'pr_wtr\.eatm\.mon\.mean\.nc' + ta_month: + short_name: ta + mip: Amon + raw: air + file: 'air\.mon\.mean\.nc' diff --git a/esmvaltool/cmorizers/data/cmor_config/NCEP-NCAR-R1.yml b/esmvaltool/cmorizers/data/cmor_config/NCEP-NCAR-R1.yml new file mode 100644 index 0000000000..b012ae9cb4 --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/NCEP-NCAR-R1.yml @@ -0,0 +1,143 @@ +--- +# Global attributes of NetCDF file +attributes: + dataset_id: NCEP-NCAR-R1 + project_id: OBS6 + tier: 2 + version: '1' + modeling_realm: reanaly + source: 'https://psl.noaa.gov/data/gridded/data.ncep.reanalysis.html' + reference: 'ncep-ncar-r1' + comment: | + '' + +# Variables to CMORize +variables: +# daily frequency + pr_day: + short_name: pr + mip: day + raw: prate + file: 'surface\/prate\.sfc\.gauss\.[0-9]{4}\.nc' + rlut_day: + short_name: rlut + mip: day + raw: ulwrf + file: 'surface\/ulwrf\.ntat\.gauss\.[0-9]{4}\.nc' + ua_day: + short_name: ua + mip: day + raw: uwnd + file: 'pressure\/uwnd\.[0-9]{4}\.nc' + va_day: + short_name: va + mip: day + raw: vwnd + file: 'pressure\/vwnd\.[0-9]{4}\.nc' + +# monthly frequency + clt_month: + short_name: clt + mip: Amon + raw: tcdc + file: 'surface\/tcdc\.eatm\.mon\.mean\.nc' + hur_month: + short_name: hur + mip: Amon + raw: rhum + file: 'pressure\/rhum\.mon\.mean\.nc' + hurs_month: + short_name: hurs + mip: Amon + raw: rhum + file: 'surface\/rhum\.mon\.mean\.nc' + hus_month: + short_name: hus + mip: Amon + raw: shum + file: 'pressure\/shum\.mon\.mean\.nc' + pr_month: + short_name: pr + mip: Amon + raw: prate + file: 'surface\/prate\.mon\.mean\.nc' + prw_month: + short_name: prw + mip: Amon + raw: pr_wtr + file: 'surface\/pr_wtr\.mon\.mean\.nc' + psl_month: + short_name: psl + mip: Amon + raw: slp + file: 'surface\/slp\.mon\.mean\.nc' + rlut_month: + short_name: rlut + mip: Amon + raw: ulwrf + file: 'surface\/ulwrf\.ntat\.mon\.mean\.nc' + rlutcs_month: + short_name: rlutcs + mip: Amon + raw: csulf + file: 'surface\/csulf\.ntat\.mon\.mean\.nc' + rsut_month: + short_name: rsut + mip: Amon + raw: uswrf + file: 'surface\/uswrf\.ntat\.mon\.mean\.nc' + rsutcs_month: + short_name: rsutcs + mip: Amon + raw: csusf + file: 'surface\/csusf\.ntat\.mon\.mean\.nc' + sfcWind_month: + short_name: sfcWind + mip: Amon + raw: wspd + file: 'surface\/wspd\.mon\.mean\.nc' + ta_month: + short_name: ta + mip: Amon + raw: air + file: 'pressure\/air\.mon\.mean\.nc' + tas_month: + short_name: tas + mip: Amon + raw: air + file: 'surface\/air\.2m\.mon\.mean\.nc' + tasmax_month: + short_name: tasmax + mip: Amon + raw: tmax + file: 'surface\/tmax\.2m\.mon\.mean\.nc' + tasmin_month: + short_name: tasmin + mip: Amon + raw: tmin + file: 'surface\/tmin\.2m\.mon\.mean\.nc' + ts_month: + short_name: ts + mip: Amon + raw: air + file: 'surface\/air\.mon\.mean\.nc' + ua_month: + short_name: ua + mip: Amon + raw: uwnd + file: 'pressure\/uwnd\.mon\.mean\.nc' + va_month: + short_name: va + mip: Amon + raw: vwnd + file: 'pressure\/vwnd\.mon\.mean\.nc' + wap_month: + short_name: wap + mip: Amon + raw: omega + file: 'pressure\/omega\.mon\.mean\.nc' + zg_month: + short_name: zg + mip: Amon + raw: hgt + file: 'pressure\/hgt\.mon\.mean\.nc' diff --git a/esmvaltool/cmorizers/data/cmor_config/NDP.yml b/esmvaltool/cmorizers/data/cmor_config/NDP.yml index 48ef7a466d..36b0caa7ae 100644 --- a/esmvaltool/cmorizers/data/cmor_config/NDP.yml +++ b/esmvaltool/cmorizers/data/cmor_config/NDP.yml @@ -1,7 +1,7 @@ --- # General attributes filename: 'ndp017b.tar.gz' -delta_degrees: 0.083 +delta_degrees: 0.08333 missing_values: [-32768, -9999, -9998] # Common global attributes for Cmorizer output diff --git a/esmvaltool/cmorizers/data/cmor_config/NOAA-CIRES-20CR.yml b/esmvaltool/cmorizers/data/cmor_config/NOAA-CIRES-20CR.yml new file mode 100644 index 0000000000..cb3ccb38a8 --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/NOAA-CIRES-20CR.yml @@ -0,0 +1,46 @@ +--- +# Global attributes of NetCDF file +attributes: + dataset_id: NOAA-CIRES-20CR + project_id: OBS6 + tier: 2 + version: 'v2' + modeling_realm: reanaly + source: 'https://psl.noaa.gov/data/gridded/data.20thC_ReanV2.html' + reference: 'noaa-cires-20cr' + comment: | + '' + +# Variables to CMORize +variables: + # monthly frequency + clt_month: + short_name: clt + mip: Amon + raw: tcdc + file: 'tcdc.eatm.mon.mean.nc' + clwvi_month: + short_name: clwvi + mip: Amon + raw: cldwtr + file: 'cldwtr.eatm.mon.mean.nc' + prw_month: + short_name: prw + mip: Amon + raw: pr_wtr + file: 'pr_wtr.eatm.mon.mean.nc' + hus_month: + short_name: hus + mip: Amon + raw: shum + file: 'shum.mon.mean.nc' + rlut_month: + short_name: rlut + mip: Amon + raw: ulwrf + file: 'ulwrf.ntat.mon.mean.nc' + rsut_month: + short_name: rsut + mip: Amon + raw: uswrf + file: 'uswrf.ntat.mon.mean.nc' diff --git a/esmvaltool/cmorizers/data/cmor_config/OceanSODA-ETHZ.yml b/esmvaltool/cmorizers/data/cmor_config/OceanSODA-ETHZ.yml new file mode 100644 index 0000000000..87752e3947 --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/OceanSODA-ETHZ.yml @@ -0,0 +1,49 @@ +--- +# Common global attributes for Cmorizer output +# Note that the filename says version 'v2021a', but the file attribute and the +# documentation says 'v2021e'. Therefore, we use 'v2021e' here. +attributes: + dataset_id: OceanSODA-ETHZ + version: v2021e + tier: 2 + modeling_realm: reanaly + project_id: OBS6 + source: https://www.ncei.noaa.gov/data/oceans/ncei/ocads/data/0220059/ + reference: oceansoda_ethz + +# Variables to cmorize +variables: + areacello: + filename: OceanSODA-ETHZ_GRaCER_v2021a_1982-2020.nc + mip: Ofx + raw_name: area + co3os: + filename: OceanSODA-ETHZ_GRaCER_v2021a_1982-2020.nc + mip: Omon + raw_name: co3 + raw_units: '1e-6 mol kg-1' + comment: 'The original units of this variable are mumol/kg. To convert to the CMOR units mol/m3, we assume a constant sea water density of 1028 kg/m3, which is approximately the sea water density for T=4°C, salinity=35PSU, and p=0bar according to the UNESCO formula (UNESCO, 1981, Tenth report of the joint panel on oceanographic tables and standards, UNESCO Technical Papers in Marine Science, see https://www.wkcgroup.com/tools-room/seawater-density-calculator/ and https://link.springer.com/content/pdf/bbm:978-3-319-18908-6/1.pdf).' + dissicos: + filename: OceanSODA-ETHZ_GRaCER_v2021a_1982-2020.nc + mip: Omon + raw_name: dic + raw_units: '1e-6 mol kg-1' + comment: 'The original units of this variable are mumol/kg. To convert to the CMOR units mol/m3, we assume a constant sea water density of 1028 kg/m3, which is approximately the sea water density for T=4°C, salinity=35PSU, and p=0bar according to the UNESCO formula (UNESCO, 1981, Tenth report of the joint panel on oceanographic tables and standards, UNESCO Technical Papers in Marine Science, see https://www.wkcgroup.com/tools-room/seawater-density-calculator/ and https://link.springer.com/content/pdf/bbm:978-3-319-18908-6/1.pdf).' + fgco2: + filename: OceanSODA-ETHZ_GRaCER_v2021a_1982-2020.nc + mip: Omon + phos: + filename: OceanSODA-ETHZ_GRaCER_v2021a_1982-2020.nc + mip: Omon + raw_name: ph_total + raw_units: '1' + spco2: + filename: OceanSODA-ETHZ_GRaCER_v2021a_1982-2020.nc + mip: Omon + raw_units: '1e-6 atm' + talkos: + filename: OceanSODA-ETHZ_GRaCER_v2021a_1982-2020.nc + mip: Omon + raw_name: talk + raw_units: '1e-6 mol kg-1' + comment: 'The original units of this variable are mumol/kg. To convert to the CMOR units mol/m3, we assume a constant sea water density of 1028 kg/m3, which is approximately the sea water density for T=4°C, salinity=35PSU, and p=0bar according to the UNESCO formula (UNESCO, 1981, Tenth report of the joint panel on oceanographic tables and standards, UNESCO Technical Papers in Marine Science, see https://www.wkcgroup.com/tools-room/seawater-density-calculator/ and https://link.springer.com/content/pdf/bbm:978-3-319-18908-6/1.pdf).' diff --git a/esmvaltool/cmorizers/data/cmor_config/TCOM-CH4.yml b/esmvaltool/cmorizers/data/cmor_config/TCOM-CH4.yml new file mode 100644 index 0000000000..819b4ad2c8 --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/TCOM-CH4.yml @@ -0,0 +1,18 @@ +--- +# Common global attributes for Cmorizer output +attributes: + dataset_id: TCOM-CH4 + version: '1.0' + tier: 2 + modeling_realm: reanaly + project_id: OBS6 + source: 'https://zenodo.org/record/7293740' + reference: 'tcom_ch4' + +# Variables to cmorize +variables: + ch4: + filename: zmch4_TCOM_plev_T2Dz_1991_2021.nc + mip: Amon + raw_name: zmch4 + raw_units: 'mol mol-1' diff --git a/esmvaltool/cmorizers/data/cmor_config/TCOM-N2O.yml b/esmvaltool/cmorizers/data/cmor_config/TCOM-N2O.yml new file mode 100644 index 0000000000..87a41c9aad --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/TCOM-N2O.yml @@ -0,0 +1,18 @@ +--- +# Common global attributes for Cmorizer output +attributes: + dataset_id: TCOM-N2O + version: '1.0' + tier: 2 + modeling_realm: reanaly + project_id: OBS6 + source: 'https://zenodo.org/record/7386001' + reference: 'tcom_n2o' + +# Variables to cmorize +variables: + n2o: + filename: zmn2o_TCOM_plev_T2Dz_1991_2021.nc + mip: Amon + raw_name: zmn2o + raw_units: '1e-3 mol mol-1' # Note: the netcdf attribute wrongly says "mol/mol". This has been confirmed by the author of the dataset. diff --git a/esmvaltool/cmorizers/data/cmorizer.py b/esmvaltool/cmorizers/data/cmorizer.py index c78d86eeaa..16b7666350 100755 --- a/esmvaltool/cmorizers/data/cmorizer.py +++ b/esmvaltool/cmorizers/data/cmorizer.py @@ -14,8 +14,9 @@ import esmvalcore import yaml -from esmvalcore._config import configure_logging, read_config_user_file from esmvalcore._task import write_ncl_settings +from esmvalcore.config import CFG +from esmvalcore.config._logging import configure_logging from esmvaltool.cmorizers.data.utilities import read_cmor_config @@ -24,13 +25,15 @@ class Formatter(): - """Class to manage the download and formatting of datasets. + """ + Class to manage the download and formatting of datasets. Parameters ---------- info : dict Datasets information """ + def __init__(self, info): self.datasets = [] self.datasets_info = info @@ -55,8 +58,9 @@ def start(self, command, datasets, config_file, options): else: self.datasets = datasets - self.config = read_config_user_file(config_file, f'data_{command}', - options) + CFG.load_from_file(config_file) + CFG.update(options) + self.config = CFG.start_session(f'data_{command}') if not os.path.isdir(self.run_dir): os.makedirs(self.run_dir) @@ -90,12 +94,12 @@ def rawobs(self): @property def output_dir(self): """Output folder path.""" - return self.config['output_dir'] + return self.config.session_dir @property def run_dir(self): """Run dir folder path.""" - return os.path.join(self.config['output_dir'], 'run') + return self.config.run_dir @property def log_level(self): @@ -261,7 +265,9 @@ def format_dataset(self, dataset, start, end, install): 'datasets', self._dataset_to_module(dataset)) tier = self._get_dataset_tier(dataset) if tier is None: - logger.error('Data for %s not found', dataset) + logger.error("Data for %s not found. Perhaps you are not" + " storing it in a RAWOBS/TierX/%s" + " (X=2 or 3) directory structure?", dataset, dataset) return False # in-data dir; build out-dir tree @@ -390,8 +396,9 @@ def _run_pyt_script(self, in_dir, out_dir, dataset, start, end): class DataCommand(): """Download and format data to use with ESMValTool.""" + def __init__(self): - with open(datasets_file) as data: + with open(datasets_file, 'r', encoding='utf8') as data: self._info = yaml.safe_load(data) self.formatter = Formatter(self._info) diff --git a/esmvaltool/cmorizers/data/datasets.yml b/esmvaltool/cmorizers/data/datasets.yml index bf1a36441d..096fd7b693 100644 --- a/esmvaltool/cmorizers/data/datasets.yml +++ b/esmvaltool/cmorizers/data/datasets.yml @@ -340,18 +340,28 @@ datasets: Geopotential and monthly data of: + Fraction of cloud cover (3-dim) Inst. eastward turbulent surface stress Inst. northward turbulent surface stress + Net top solar radiation + Net top solar radiation clear-sky Sea surface temperature + Specific cloud ice water content + Specific cloud liquid water content + Specific humidity Surface net thermal radiation Surface latent heat flux Surface sensible heat flux Relative humidity Temperature + Top net thermal radiation clear-sky + Total column water wapour U component of wind V component of wind + Vertical integral of cloud condensed water (ice and liquid) + Vertical integral of cloud liquid water + Vertical integral of cloud frozen water Vertical velocity - Specific humidity Caveats Make sure to select the right steps for accumulated fluxes, see: @@ -514,6 +524,18 @@ datasets: data/tcwv/dataset3_1/CDR-*/... All files need to be in one directory, not in yearly subdirectories. + ESDC: + tier: 2 + source: http://data.rsc4earth.de/EarthSystemDataCube/ + last_access: 2023-01-26 + info: | + It is not necessary to download the data, as the cmorizer script can access + it directly from the cloud if it is not available locally. + + To download a dataset, the dataset folder can be explored on the source + website, and downloaded using wget: + ```wget -m -nH -np -R "index.html*" http://data.rsc4earth.de/EarthSystemDataCube/v3.0.1/``` + ESRL: tier: 2 source: http://www.esrl.noaa.gov/gmd/dv/data/index.php @@ -729,6 +751,20 @@ datasets: Meteorological Research Institute, Tsukuba City, Japan). See link above for more information. + JRA-25: + tier: 2 + source: https://esgf.nccs.nasa.gov/thredds/fileServer/CREATE-IP/reanalysis/JMA/JRA-25/JRA-25/ + last_access: 2022-11-17 + info: | + Download the following files: + mon/atmos/clt/clt_Amon_reanalysis_JRA-25_197901-201312.nc + mon/atmos/hus/hus_Amon_reanalysis_JRA-25_197901-201312.nc + mon/atmos/prw/prw_Amon_reanalysis_JRA-25_197901-201312.nc + mon/atmos/rlut/rlut_Amon_reanalysis_JRA-25_197901-201312.nc + mon/atmos/rlutcs/rlutcs_Amon_reanalysis_JRA-25_197901-201312.nc + mon/atmos/rsut/rsut_Amon_reanalysis_JRA-25_197901-201312.nc + mon/atmos/rsutcs/rsutcs_Amon_reanalysis_JRA-25_197901-201312.nc + Kadow2020: tier: 2 source: http://users.met.fu-berlin.de/~ChristopherKadow/ @@ -773,6 +809,13 @@ datasets: info: | Download the file spco2_1982-2015_MPI_SOM-FFN_v2016.nc + Landschuetzer2020: + tier: 2 + source: https://www.ncei.noaa.gov/data/oceans/ncei/ocads/data/0209633/ + last_access: 2022-11-02 + info: | + Download the file MPI-ULB-SOM_FFN_clim.nc + MAC-LWP: tier: 3 source: https://search.earthdata.nasa.gov/search?q=MAC-LWP @@ -786,9 +829,12 @@ datasets: MERRA2: tier: 3 - source: https://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2_MONTHLY/ - last_access: 2019-11-29 - info: Use automatic download. + source: https://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2_MONTHLY/ https://goldsmr5.gesdisc.eosdis.nasa.gov/data/MERRA2_MONTHLY/ + last_access: 2022-09-13 + info: | + Use automatic download. That will download monthly data but with + yearly granularity. Note that some (most) variables are on the goldsmr4 server, + whereas others are on the goldsmr5 server. MLS-AURA: tier: 3 @@ -804,6 +850,13 @@ datasets: information). A registration is required + MOBO-DIC_MPIM: + tier: 2 + source: https://www.ncei.noaa.gov/data/oceans/ncei/ocads/data/0221526/ + last_access: 2022-11-03 + info: | + Download the file MOBO-DIC_MPIM_monthly_clim.nc + MODIS: tier: 3 source: https://ladsweb.modaps.eosdis.nasa.gov/search/order @@ -831,16 +884,35 @@ datasets: EnsembleGPP_GL.nc A registration is required for - NCEP: + NCEP-DOE-R2: + tier: 2 + source: https://psl.noaa.gov/data/gridded/data.ncep.reanalysis2.html + last_access: 2022-09-06 + info: | + To facilitate the download, the links to the https server are provided. + + https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/ + pressure/ + rhum.mon.mean.nc + air.mon.mean.nc + https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/ + gaussian_grid + tcdc.eatm.mon.mean.nc + https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/ + surface + pr_wtr.eatm.mon.mean.nc + + + NCEP-NCAR-R1: tier: 2 - source: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html - last_access: 2019-02-04 + source: https://psl.noaa.gov/data/gridded/data.ncep.reanalysis.html + last_access: 2022-11-22 info: | To facilitate the download, the links to the ftp server are provided. Since the filenames are sometimes identical across different save the data in two subdirectories in input_dir_path. Subdirectory pressure/: - ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.derived/pressure/ + ftp://ftp.cdc.noaa.gov/Projects/Datasets/data.ncep.reanalysis/pressure/ air.mon.mean.nc hgt.mon.mean.nc rhum.mon.mean.nc @@ -849,24 +921,31 @@ datasets: vwnd.mon.mean.nc omega.mon.mean.nc ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/ - uwnd.YYYY.nc - vwnd.YYYY.nc + uwnd.*.nc + vwnd.*.nc Subdirectory surface/: ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.derived/surface/ air.mon.mean.nc + pr_wtr.mon.mean.nc + slp.mon.mean.nc + wspd.mon.mean.nc + rhum.mon.mean.nc ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.derived/surface_gauss/ - prate.mon.mean.nc + air.2m.mon.mean.nc + prate.sfc.mon.mean.nc + tmax.2m.mon.mean.nc + tmin.2m.mon.mean.nc + ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.derived/other_gauss/ + tcdc.eatm.mon.mean.nc ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/surface_gauss/ - prate.sft.gauss.YYYY.nc + prate.sft.gauss.*.nc ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/other_gauss/ - ulwrf.ntat.gauss.YYYY.nc + ulwrf.ntat.gauss.*.nc Select the section "Pressure" and "Surface" and download the variables listed below. Since raw data on pressure levels and for surface have the same file and variable name, save the data in two different subdirectories "press" and "surf" in input_dir_path. - Specify the time range of the data as YEAR1-YEAR2 below, considering only - complete years (Jan to Dec). NDP: tier: 3 @@ -897,6 +976,19 @@ datasets: https://nsidc.org/data/NSIDC-0116 Login required for download, and also requires citation only to use + NOAA-CIRES-20CR: + tier: 2 + source: ftp.cdc.noaa.gov/Projects/20thC_ReanV2/Monthlies/ + last_access: 2022-11-17 + info: | + Download the following files: + monolevel/cldwtr.eatm.mon.mean.nc + monolevel/pr_wtr.eatm.mon.mean.nc + pressure/shum.mon.mean.nc + gaussian/monolevel/tcdc.eatm.mon.mean.nc + gaussian/monolevel/ulwrf.ntat.mon.mean.nc + gaussian/monolevel/uswrf.ntat.mon.mean.nc + NOAAGlobalTemp: tier: 2 source: https://www.ncei.noaa.gov/data/noaa-global-surface-temperature/v5/access/ @@ -914,6 +1006,13 @@ datasets: https://nsidc.org/data/NSIDC-0116 Login required for download, and also requires citation only to use + OceanSODA-ETHZ: + tier: 2 + source: https://www.ncei.noaa.gov/data/oceans/ncei/ocads/data/0220059/ + last_access: 2022-11-03 + info: | + Download the file OceanSODA-ETHZ_GRaCER_v2021a_1982-2020.nc + OSI-450-nh: tier: 2 source: http://osisaf.met.no/p/ice/ @@ -1011,6 +1110,20 @@ datasets: Download the following file: monthly_flask_co2_kum.csv + TCOM-CH4: + tier: 2 + source: https://zenodo.org/record/7293740 + last_access: 2023-01-17 + info: | + Download the file zmch4_TCOM_plev_T2Dz_1991_2021.nc + + TCOM-N2O: + tier: 2 + source: https://zenodo.org/record/7386001 + last_access: 2023-01-17 + info: | + Download the file zmn2o_TCOM_plev_T2Dz_1991_2021.nc. + UWisc: tier: 3 source: Data provided by Ralf Bennartz. diff --git a/esmvaltool/cmorizers/data/download_scripts/download_era_interim.py b/esmvaltool/cmorizers/data/download_scripts/download_era_interim.py index cd93538055..72cf8d98af 100644 --- a/esmvaltool/cmorizers/data/download_scripts/download_era_interim.py +++ b/esmvaltool/cmorizers/data/download_scripts/download_era_interim.py @@ -149,12 +149,19 @@ ('147.128', 'slhf', 'accu'), # Surface latent heat flux ('146.128', 'sshf', 'accu'), # Surface sensible heat flux ('157.128', 'r', '3d'), # Relative humidity + ('246.128', 'clwc', '3d'), # Specific cloud liquid water content + ('247.128', 'ciwc', '3d'), # Specific cloud ice water content ('130.128', 't', '3d'), # Temperature ('131.128', 'u', '3d'), # U component of wind ('132.128', 'v', '3d'), # V component of wind ('135.128', 'w', '3d'), # Vertical velocity ('133.128', 'q', '3d'), # Specific humidity ('129.128', 'z', '3d'), # Geopotential + ('178.128', 'tsr', 'accu'), # net top solar radiation + ('208.128', 'tsrc', 'accu'), # net top solar radiation clear-sky + ('179.128', 'ttr', 'accu'), # top net thermal radiation + ('209.128', 'ttrc', 'accu'), # top net thermal radiation clear-sky + ('248.128', 'cc', '3d'), # fraction of cloud cover ] diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/jra_25.py b/esmvaltool/cmorizers/data/downloaders/datasets/jra_25.py new file mode 100644 index 0000000000..27e3dbc97c --- /dev/null +++ b/esmvaltool/cmorizers/data/downloaders/datasets/jra_25.py @@ -0,0 +1,65 @@ +"""Script to download JRA-25 from ESGF.""" +import logging +import os + +from esmvaltool.cmorizers.data.downloaders.wget import WGetDownloader + +logger = logging.getLogger(__name__) + + +def download_dataset(config, dataset, dataset_info, start_date, end_date, + overwrite): + """Download dataset. + + Parameters + ---------- + config : dict + ESMValTool's user configuration + dataset : str + Name of the dataset + dataset_info : dict + Dataset information from the datasets.yml file + start_date : datetime + Start of the interval to download + end_date : datetime + End of the interval to download + overwrite : bool + Overwrite already downloaded files + """ + downloader = WGetDownloader( + config=config, + dataset=dataset, + dataset_info=dataset_info, + overwrite=overwrite, + ) + + os.makedirs(downloader.local_folder, exist_ok=True) + + url = ("https://esgf.nccs.nasa.gov/thredds/fileServer/CREATE-IP/" + "reanalysis/JMA/JRA-25/JRA-25/mon/atmos/") + + downloader.download_file(url + + "clt/clt_Amon_reanalysis_JRA-25_197901-201312.nc", + wget_options=[]) + downloader.download_file(url + + "hus/hus_Amon_reanalysis_JRA-25_197901-201312.nc", + wget_options=[]) + downloader.download_file(url + + "prw/prw_Amon_reanalysis_JRA-25_197901-201312.nc", + wget_options=[]) + downloader.download_file(url + + "rlut/" + "rlut_Amon_reanalysis_JRA-25_197901-201312.nc", + wget_options=[]) + downloader.download_file(url + + "rlutcs/" + "rlutcs_Amon_reanalysis_JRA-25_197901-201312.nc", + wget_options=[]) + downloader.download_file(url + + "rsut/" + "rsut_Amon_reanalysis_JRA-25_197901-201312.nc", + wget_options=[]) + downloader.download_file(url + + "rsutcs/" + "rsutcs_Amon_reanalysis_JRA-25_197901-201312.nc", + wget_options=[]) diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/landschuetzer2020.py b/esmvaltool/cmorizers/data/downloaders/datasets/landschuetzer2020.py new file mode 100644 index 0000000000..88929cfc7a --- /dev/null +++ b/esmvaltool/cmorizers/data/downloaders/datasets/landschuetzer2020.py @@ -0,0 +1,39 @@ +"""Script to download Landschuetzer2020.""" +import logging + +from esmvaltool.cmorizers.data.downloaders.wget import WGetDownloader + +logger = logging.getLogger(__name__) + + +def download_dataset(config, dataset, dataset_info, start_date, end_date, + overwrite): + """Download dataset. + + Parameters + ---------- + config : dict + ESMValTool's user configuration + dataset : str + Name of the dataset + dataset_info : dict + Dataset information from the datasets.yml file + start_date : datetime + Start of the interval to download + end_date : datetime + End of the interval to download + overwrite : bool + Overwrite already downloaded files + """ + downloader = WGetDownloader( + config=config, + dataset=dataset, + dataset_info=dataset_info, + overwrite=overwrite, + ) + + downloader.download_file( + "https://www.ncei.noaa.gov/data/oceans/ncei/ocads/data/0209633/" + "MPI-ULB-SOM_FFN_clim.nc", + wget_options=[], + ) diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/merra2.py b/esmvaltool/cmorizers/data/downloaders/datasets/merra2.py index 64ac0124f4..809d5f0018 100644 --- a/esmvaltool/cmorizers/data/downloaders/datasets/merra2.py +++ b/esmvaltool/cmorizers/data/downloaders/datasets/merra2.py @@ -44,4 +44,22 @@ def download_dataset(config, dataset, dataset_info, start_date, end_date, downloader.download_folder( "https://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2_MONTHLY/" f"M2TMNXLND.5.12.4/{year}/") + downloader.download_folder( + "https://goldsmr5.gesdisc.eosdis.nasa.gov/data/MERRA2_MONTHLY/" + f"M2IMNPANA.5.12.4/{year}/") + downloader.download_folder( + "https://goldsmr5.gesdisc.eosdis.nasa.gov/data/MERRA2_MONTHLY/" + f"M2IMNPASM.5.12.4/{year}/") + downloader.download_folder( + "https://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2_MONTHLY/" + f"M2TMNXRAD.5.12.4/{year}/") + downloader.download_folder( + "https://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2_MONTHLY/" + f"M2TMNXSLV.5.12.4/{year}/") + downloader.download_folder( + "https://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2_MONTHLY/" + f"M2SMNXSLV.5.12.4/{year}/") + downloader.download_folder( + "https://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2_MONTHLY/" + f"M2TMNXFLX.5.12.4/{year}/") loop_date += relativedelta.relativedelta(years=1) diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/mobo_dic_mpim.py b/esmvaltool/cmorizers/data/downloaders/datasets/mobo_dic_mpim.py new file mode 100644 index 0000000000..58af5689d7 --- /dev/null +++ b/esmvaltool/cmorizers/data/downloaders/datasets/mobo_dic_mpim.py @@ -0,0 +1,39 @@ +"""Script to download MOBO-DIC_MPIM.""" +import logging + +from esmvaltool.cmorizers.data.downloaders.wget import WGetDownloader + +logger = logging.getLogger(__name__) + + +def download_dataset(config, dataset, dataset_info, start_date, end_date, + overwrite): + """Download dataset. + + Parameters + ---------- + config : dict + ESMValTool's user configuration + dataset : str + Name of the dataset + dataset_info : dict + Dataset information from the datasets.yml file + start_date : datetime + Start of the interval to download + end_date : datetime + End of the interval to download + overwrite : bool + Overwrite already downloaded files + """ + downloader = WGetDownloader( + config=config, + dataset=dataset, + dataset_info=dataset_info, + overwrite=overwrite, + ) + + downloader.download_file( + "https://www.ncei.noaa.gov/data/oceans/ncei/ocads/data/0221526/" + "MOBO-DIC_MPIM_monthly_clim.nc", + wget_options=[], + ) diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/ncep_doe_r2.py b/esmvaltool/cmorizers/data/downloaders/datasets/ncep_doe_r2.py new file mode 100644 index 0000000000..096b54e898 --- /dev/null +++ b/esmvaltool/cmorizers/data/downloaders/datasets/ncep_doe_r2.py @@ -0,0 +1,48 @@ +"""Script to download NCEP-DOE-R2.""" +import logging +import os + +from esmvaltool.cmorizers.data.downloaders.wget import WGetDownloader + +logger = logging.getLogger(__name__) + + +def download_dataset(config, dataset, dataset_info, start_date, end_date, + overwrite): + """ + Download dataset. + + Parameters + ---------- + config : dict + ESMValTool's user configuration + dataset : str + Name of the dataset + dataset_info : dict + Dataset information from the datasets.yml file + start_date : datetime + Start of the interval to download + end_date : datetime + End of the interval to download + overwrite : bool + Overwrite already downloaded files + """ + + downloader = WGetDownloader( + config=config, + dataset=dataset, + dataset_info=dataset_info, + overwrite=overwrite, + ) + + os.makedirs(downloader.local_folder, exist_ok=True) + + url = "https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/" + + downloader.download_file(url + "pressure/rhum.mon.mean.nc", + wget_options=[]) + downloader.download_file(url + "pressure/air.mon.mean.nc", wget_options=[]) + downloader.download_file(url + "gaussian_grid/tcdc.eatm.mon.mean.nc", + wget_options=[]) + downloader.download_file(url + "surface/pr_wtr.eatm.mon.mean.nc", + wget_options=[]) diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/ncep.py b/esmvaltool/cmorizers/data/downloaders/datasets/ncep_ncar_r1.py similarity index 71% rename from esmvaltool/cmorizers/data/downloaders/datasets/ncep.py rename to esmvaltool/cmorizers/data/downloaders/datasets/ncep_ncar_r1.py index 87606e72cf..f9b0816efe 100644 --- a/esmvaltool/cmorizers/data/downloaders/datasets/ncep.py +++ b/esmvaltool/cmorizers/data/downloaders/datasets/ncep_ncar_r1.py @@ -1,4 +1,4 @@ -"""Script to download NCEP.""" +"""Script to download NCEP-NCAR-R1.""" from datetime import datetime @@ -29,7 +29,7 @@ def download_dataset(config, dataset, dataset_info, start_date, end_date, if start_date is None: start_date = datetime(1948, 1, 1) if end_date is None: - end_date = datetime(2018, 1, 1) + end_date = datetime(2021, 1, 1) downloader = FTPDownloader( config=config, server='ftp.cdc.noaa.gov', @@ -52,8 +52,23 @@ def download_dataset(config, dataset, dataset_info, start_date, end_date, downloader.set_cwd("/Datasets/ncep.reanalysis.derived/surface/") downloader.download_file("air.mon.mean.nc", sub_folder='surface') + downloader.download_file("pr_wtr.mon.mean.nc", sub_folder='surface') + downloader.download_file("slp.mon.mean.nc", sub_folder='surface') + downloader.download_file("wspd.mon.mean.nc", sub_folder='surface') + downloader.download_file("rhum.mon.mean.nc", sub_folder='surface') + downloader.set_cwd("/Datasets/ncep.reanalysis.derived/surface_gauss/") + downloader.download_file("air.2m.mon.mean.nc", sub_folder='surface') downloader.download_file("prate.mon.mean.nc", sub_folder='surface') + downloader.download_file("tmax.2m.mon.mean.nc", sub_folder='surface') + downloader.download_file("tmin.2m.mon.mean.nc", sub_folder='surface') + + downloader.set_cwd("/Datasets/ncep.reanalysis.derived/other_gauss/") + downloader.download_file("tcdc.eatm.mon.mean.nc", sub_folder='surface') + downloader.download_file("ulwrf.ntat.mon.mean.nc", sub_folder='surface') + downloader.download_file("csulf.ntat.mon.mean.nc", sub_folder='surface') + downloader.download_file("uswrf.ntat.mon.mean.nc", sub_folder='surface') + downloader.download_file("csusf.ntat.mon.mean.nc", sub_folder='surface') while loop_date <= end_date: year = loop_date.year diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/noaa_cires_20cr.py b/esmvaltool/cmorizers/data/downloaders/datasets/noaa_cires_20cr.py new file mode 100644 index 0000000000..836cfe8391 --- /dev/null +++ b/esmvaltool/cmorizers/data/downloaders/datasets/noaa_cires_20cr.py @@ -0,0 +1,49 @@ +"""Script to download NOAA-CIRES-20CR.""" +import logging + +from esmvaltool.cmorizers.data.downloaders.ftp import FTPDownloader + +logger = logging.getLogger(__name__) + + +def download_dataset(config, dataset, dataset_info, start_date, end_date, + overwrite): + """Download dataset. + + Parameters + ---------- + config : dict + ESMValTool's user configuration + dataset : str + Name of the dataset + dataset_info : dict + Dataset information from the datasets.yml file + start_date : datetime + Start of the interval to download + end_date : datetime + End of the interval to download + overwrite : bool + Overwrite already downloaded files + """ + downloader = FTPDownloader( + config=config, + server='ftp.cdc.noaa.gov', + dataset=dataset, + dataset_info=dataset_info, + overwrite=overwrite, + ) + downloader.connect() + + downloader.set_cwd("Projects/20thC_ReanV2/Monthlies/") + downloader.download_file("monolevel/cldwtr.eatm.mon.mean.nc", + sub_folder='surface') + downloader.download_file("monolevel/pr_wtr.eatm.mon.mean.nc", + sub_folder='surface') + downloader.download_file("pressure/shum.mon.mean.nc", + sub_folder='pressure') + downloader.download_file("gaussian/monolevel/tcdc.eatm.mon.mean.nc", + sub_folder='surface_gauss') + downloader.download_file("gaussian/monolevel/ulwrf.ntat.mon.mean.nc", + sub_folder='surface_gauss') + downloader.download_file("gaussian/monolevel/uswrf.ntat.mon.mean.nc", + sub_folder='surface_gauss') diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/oceansoda_ethz.py b/esmvaltool/cmorizers/data/downloaders/datasets/oceansoda_ethz.py new file mode 100644 index 0000000000..cc01632cb3 --- /dev/null +++ b/esmvaltool/cmorizers/data/downloaders/datasets/oceansoda_ethz.py @@ -0,0 +1,39 @@ +"""Script to download OceanSODA-ETHZ.""" +import logging + +from esmvaltool.cmorizers.data.downloaders.wget import WGetDownloader + +logger = logging.getLogger(__name__) + + +def download_dataset(config, dataset, dataset_info, start_date, end_date, + overwrite): + """Download dataset. + + Parameters + ---------- + config : dict + ESMValTool's user configuration + dataset : str + Name of the dataset + dataset_info : dict + Dataset information from the datasets.yml file + start_date : datetime + Start of the interval to download + end_date : datetime + End of the interval to download + overwrite : bool + Overwrite already downloaded files + """ + downloader = WGetDownloader( + config=config, + dataset=dataset, + dataset_info=dataset_info, + overwrite=overwrite, + ) + + downloader.download_file( + "https://www.ncei.noaa.gov/data/oceans/ncei/ocads/data/0220059/" + "OceanSODA-ETHZ_GRaCER_v2021a_1982-2020.nc", + wget_options=[], + ) diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/tcom_ch4.py b/esmvaltool/cmorizers/data/downloaders/datasets/tcom_ch4.py new file mode 100644 index 0000000000..c317ec7f06 --- /dev/null +++ b/esmvaltool/cmorizers/data/downloaders/datasets/tcom_ch4.py @@ -0,0 +1,39 @@ +"""Script to download TCOM-CH4.""" +import logging + +from esmvaltool.cmorizers.data.downloaders.wget import WGetDownloader + +logger = logging.getLogger(__name__) + + +def download_dataset(config, dataset, dataset_info, start_date, end_date, + overwrite): + """Download dataset. + + Parameters + ---------- + config : dict + ESMValTool's user configuration + dataset : str + Name of the dataset + dataset_info : dict + Dataset information from the datasets.yml file + start_date : datetime + Start of the interval to download + end_date : datetime + End of the interval to download + overwrite : bool + Overwrite already downloaded files + """ + downloader = WGetDownloader( + config=config, + dataset=dataset, + dataset_info=dataset_info, + overwrite=overwrite, + ) + + downloader.download_file( + "https://zenodo.org/record/7293740/files/" + "zmch4_TCOM_plev_T2Dz_1991_2021.nc", + wget_options=[], + ) diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/tcom_n2o.py b/esmvaltool/cmorizers/data/downloaders/datasets/tcom_n2o.py new file mode 100644 index 0000000000..38d4515f97 --- /dev/null +++ b/esmvaltool/cmorizers/data/downloaders/datasets/tcom_n2o.py @@ -0,0 +1,39 @@ +"""Script to download TCOM-N2O.""" +import logging + +from esmvaltool.cmorizers.data.downloaders.wget import WGetDownloader + +logger = logging.getLogger(__name__) + + +def download_dataset(config, dataset, dataset_info, start_date, end_date, + overwrite): + """Download dataset. + + Parameters + ---------- + config : dict + ESMValTool's user configuration + dataset : str + Name of the dataset + dataset_info : dict + Dataset information from the datasets.yml file + start_date : datetime + Start of the interval to download + end_date : datetime + End of the interval to download + overwrite : bool + Overwrite already downloaded files + """ + downloader = WGetDownloader( + config=config, + dataset=dataset, + dataset_info=dataset_info, + overwrite=overwrite, + ) + + downloader.download_file( + "https://zenodo.org/record/7386001/files/" + "zmn2o_TCOM_plev_T2Dz_1991_2021.nc", + wget_options=[], + ) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/berkeleyearth.py b/esmvaltool/cmorizers/data/formatters/datasets/berkeleyearth.py index 1ffec43763..81e4909584 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/berkeleyearth.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/berkeleyearth.py @@ -48,7 +48,7 @@ def reinit_broken_time(cube_anom, cube_clim, climstart, climend): climcenter = (climend - climstart) // 2 times = iris.coords.DimCoord( - np.arange(int(n_days), dtype=float), + np.arange(int(n_days), dtype=np.float64), var_name='time', standard_name='time', long_name='time', @@ -56,7 +56,7 @@ def reinit_broken_time(cube_anom, cube_clim, climstart, climend): calendar=cf_units.CALENDAR_STANDARD)) # init a dummy cube to enable coord_categorisation - dummycube = iris.cube.Cube(np.zeros(int(n_days), np.int), + dummycube = iris.cube.Cube(np.zeros(int(n_days), np.int64), dim_coords_and_dims=[(times, 0)]) coord_categorisation.add_year(dummycube, 'time', name='year') coord_categorisation.add_month_number(dummycube, 'time', name='month') diff --git a/esmvaltool/cmorizers/data/formatters/datasets/era_interim.py b/esmvaltool/cmorizers/data/formatters/datasets/era_interim.py index 55288702ed..70c585c0b7 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/era_interim.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/era_interim.py @@ -63,6 +63,17 @@ V component of wind Vertical velocity Specific humidity + net top solar radiation + net top solar radiation clear-sky + top net thermal radiation + top net thermal radiation clear-sky + fraction of cloud cover (3-dim) + vertical integral of condensed cloud water (ice and liquid) + vertical integral of cloud liquid water + vertical integral of cloud frozen water + total column water vapour + specific cloud liquid water content + specific cloud ice water content Caveats Make sure to select the right steps for accumulated fluxes, see: @@ -114,9 +125,21 @@ def _fix_units(cube, definition): cube.units = cube.units * 'day-1' # Radiation fluxes are positive in downward direction cube.attributes['positive'] = 'down' + if cube.var_name in {'rlut', 'rlutcs'}: + # Add missing 'per day' + cube.units = cube.units * 'day-1' + # Radiation fluxes are positive in upward direction + cube.attributes['positive'] = 'up' + cube.data = cube.core_data() * -1. + if cube.var_name in {'rsut', 'rsutcs'}: + # Add missing 'per day' + cube.units = cube.units * 'day-1' + # Radiation fluxes are positive in upward direction + cube.attributes['positive'] = 'up' if cube.var_name in {'tauu', 'tauv'}: cube.attributes['positive'] = 'down' - if cube.var_name in {'sftlf', 'clt'}: + if cube.var_name in {'sftlf', 'clt', 'cl', 'clt-low', 'clt-med', + 'clt-high'}: # Change units from fraction to percentage cube.units = definition.units cube.data = cube.core_data() * 100. @@ -126,6 +149,8 @@ def _fix_units(cube, definition): # https://apps.ecmwf.int/codes/grib/param-db?id=129 cube.units = cube.units / 'm s-2' cube.data = cube.core_data() / 9.80665 + if cube.var_name in {'cli', 'clw'}: + cube.units = 'kg kg-1' def _fix_coordinates(cube, definition): @@ -143,8 +168,16 @@ def _fix_coordinates(cube, definition): utils.add_scalar_height_coord(cube, 2.) if 'height10m' in definition.dimensions: utils.add_scalar_height_coord(cube, 10.) + for coord_def in definition.coordinates.values(): axis = coord_def.axis + + # ERA-Interim cloud parameters are downloaded on pressure levels + # (CMOR standard = generic (hybrid) levels, alevel) + if axis == "" and coord_def.name == "alevel": + axis = "Z" + coord_def = CMOR_TABLES['CMIP6'].coords['plev19'] + coord = cube.coord(axis=axis) if axis == 'T': coord.convert_units('days since 1850-1-1 00:00:00.0') @@ -267,10 +300,22 @@ def _compute_daily(cube): def _load_cube(in_files, var): """Load in_files into an iris cube.""" ignore_warnings = ( + { + 'raw': 'cc', + 'units': '(0 - 1)', + }, { 'raw': 'tcc', 'units': '(0 - 1)', }, + { + 'raw': 'tciw', + 'units': 'kg m**-2', + }, + { + 'raw': 'tclw', + 'units': 'kg m**-2', + }, { 'raw': 'lsm', 'units': '(0 - 1)', @@ -314,6 +359,26 @@ def _load_cube(in_files, var): cube = in_cube else: cube += in_cube + elif var.get('operator', '') == 'diff': + # two variables case using diff operation + cube = None + elements_var = len(var['raw']) + elements_files = len(in_files) + if (elements_var != 2) or (elements_files != 2): + shortname = var.get('short_name') + errmsg = (f'operator diff selected for variable {shortname} ' + f'expects exactly two input variables and two input ' + f'files') + raise ValueError(errmsg) + cube = iris.load_cube( + in_files[0], + constraint=NameConstraint(var_name=var['raw'][0]), + ) + cube2 = iris.load_cube( + in_files[1], + constraint=NameConstraint(var_name=var['raw'][1]), + ) + cube -= cube2 else: raise ValueError( "Multiple input files found, with operator '{}' configured: {}" diff --git a/esmvaltool/cmorizers/data/formatters/datasets/esacci_lst.py b/esmvaltool/cmorizers/data/formatters/datasets/esacci_lst.py index 9625a0b9bb..70d8f1dc1e 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/esacci_lst.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/esacci_lst.py @@ -27,14 +27,14 @@ import iris -from ...utilities import fix_coords, save_variable +from esmvaltool.cmorizers.data import utilities as utils logger = logging.getLogger(__name__) def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): """Cmorization func call.""" - # cmor_table = cfg['cmor_table'] + cmor_table = cfg['cmor_table'] glob_attrs = cfg['attributes'] # run the cmorization @@ -47,6 +47,8 @@ def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): # like uncertainty information from the original files glob_attrs['mip'] = vals['mip'] + cmor_info = cmor_table.get_variable(vals['mip'], var) + var_name = cmor_info.short_name for key in vals.keys(): logger.info("%s %s", key, vals[key]) @@ -58,7 +60,8 @@ def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): # loop over years and months # get years from start_year and end_year # note 2003 doesn't start until July so not included at this stage - for year in range(vals['start_year'], vals['end_year'] + 1): + for year in range(glob_attrs['start_year'], + glob_attrs['end_year'] + 1): this_years_cubes = iris.cube.CubeList() for month0 in range(12): # Change this in final version month = month0 + 1 @@ -71,7 +74,7 @@ def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): month) # use CMORizer utils - monthly_cube = fix_coords(monthly_cube) + monthly_cube = utils.fix_coords(monthly_cube) this_years_cubes.append(monthly_cube) @@ -82,11 +85,18 @@ def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): this_years_cubes.long_name = 'Surface Temperature' this_years_cubes.standard_name = 'surface_temperature' - save_variable( + # Fix variable metadata + utils.fix_var_metadata(this_years_cubes, cmor_info) + + # Fix global metadata + utils.set_global_atts(this_years_cubes, glob_attrs) + + utils.save_variable( this_years_cubes, - var, + var_name, out_dir, glob_attrs, + unlimited_dimensions=['time'], ) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/esdc.py b/esmvaltool/cmorizers/data/formatters/datasets/esdc.py new file mode 100644 index 0000000000..bf473f53be --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/esdc.py @@ -0,0 +1,149 @@ +"""ESMValTool CMORizer for Earth System Data Cube data. + +Tier + Tier 2: other freely-available dataset. + +Source + http://data.rsc4earth.de/EarthSystemDataCube/ + +Last access + 20230126 + +Download and processing instructions + It is not necessary to download the data, as the cmorizer script can access + it directly from the cloud if it is not available locally. + + To download a dataset, the dataset folder can be explored on the source + website, and downloaded using wget: + ```wget -m -nH -np -R "index.html*" http://data.rsc4earth.de/EarthSystemDataCube/v3.0.1/``` +""" # noqa: E501 +import logging +from copy import deepcopy +from pathlib import Path + +import cf_units +import iris.std_names +import xarray as xr +from esmvalcore.preprocessor import monthly_statistics + +from esmvaltool.cmorizers.data import utilities as utils + +logger = logging.getLogger(__name__) + + +def _fix_cube(var, cube, cfg): + """General fixes for all cubes.""" + cmor_info = cfg['cmor_table'].get_variable(var['mip'], var['short_name']) + + # Set correct names + cube.var_name = cmor_info.short_name + if cmor_info.standard_name: + cube.standard_name = cmor_info.standard_name + cube.long_name = cmor_info.long_name + + # Set calendar to gregorian instead of proleptic gregorian + old_unit = cube.coord('time').units + if old_unit.calendar == 'proleptic_gregorian': + logger.info("Converting time units to gregorian") + cube.coord('time').units = cf_units.Unit(old_unit.origin, + calendar='gregorian') + utils.fix_coords(cube) + cube.convert_units(cmor_info.units) + if 'height2m' in cmor_info.dimensions: + utils.add_height2m(cube) + # Conversion from 8-d to monthly frequency + cube = monthly_statistics(cube, operator="mean") + + # Fix metadata + attrs = cfg['attributes'] + attrs['mip'] = var['mip'] + utils.fix_var_metadata(cube, cmor_info) + utils.set_global_atts(cube, attrs) + + return cube + + +def _open_zarr(path): + """Open zarr dataset.""" + logger.info('Opening zarr in "%s"', path) + try: + zarr_dataset = xr.open_dataset(path, engine='zarr') + return zarr_dataset + except KeyError as exception: + # Happens when the zarr folder is missing metadata, e.g. when + # it is a zarr array instead of a zarr dataset. + logger.error('Could not open zarr dataset "%s": "KeyError: %s"', path, + exception) + raise exception + + +def _extract_variable(zarr_path, var, cfg, out_dir): + """Open and cmorize cube.""" + attributes = deepcopy(cfg['attributes']) + all_attributes = { + **attributes, + **var + } # add the mip to the other attributes + raw_name = var['raw'] + zarr_dataset = _open_zarr(zarr_path) + cube_xr = zarr_dataset[raw_name] + + # Invalid standard names must be removed before converting to iris + standard_name = cube_xr.attrs.get('standard_name', None) + if (standard_name is not None + and standard_name not in iris.std_names.STD_NAMES): + del cube_xr.attrs['standard_name'] + logger.info('Removed invalid standard name "%s".', standard_name) + + cube_iris = cube_xr.to_iris() + cube = _fix_cube(var, cube_iris, cfg) + + utils.save_variable(cube=cube, + var=var['short_name'], + outdir=out_dir, + attrs=all_attributes, + unlimited_dimensions=['time']) + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Cmorize the dataset.""" + if start_date: + logger.warning('start_date set to "%s", but will be ignored', + start_date) + if end_date: + logger.warning('end_date set to "%s", but will be ignored', end_date) + + attributes = cfg['attributes'] + variables = cfg['variables'] + version = attributes['version'] + filename_pattern = cfg['filename'].format(grid=attributes['grid'], + chunking=attributes['chunking'], + version=version) + + local_path = Path(in_dir) + in_files = list(local_path.glob(filename_pattern)) + logger.debug('Pattern %s matched: %s', Path(local_path, filename_pattern), + in_files) + + if len(in_files) > 1: + logger.warning( + 'Pattern has matched "%i" files, ' + 'but only the first one will be used.', len(in_files)) + logger.warning('The following files will be ignored.: "%s"', + in_files[1:]) + zarr_path = in_files[0] + elif len(in_files) == 0: + logger.info( + 'No local matches for pattern "%s", ' + 'attempting connection to the cloud.', + Path(local_path, filename_pattern)) + if '*' in filename_pattern: + logger.warning( + 'Detected a wildcard character in path (*), ' + 'online connection to \"%s\" may not work', filename_pattern) + zarr_path = f'{attributes["source"]}/v{version}/{filename_pattern}' + + for short_name, var in variables.items(): + if 'short_name' not in var: + var['short_name'] = short_name + _extract_variable(zarr_path, var, cfg, out_dir) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/hadisst.ncl b/esmvaltool/cmorizers/data/formatters/datasets/hadisst.ncl index c4748a3ee6..579b74b2b7 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/hadisst.ncl +++ b/esmvaltool/cmorizers/data/formatters/datasets/hadisst.ncl @@ -37,7 +37,7 @@ begin ; Period YEAR1 = get_year(start_year, 1870) - YEAR2 = get_year(end_year, 2017) + YEAR2 = get_year(end_year, 2021) ; Selected variable (standard name) VAR = (/"ts", "tos", "sic"/) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/jra_25.py b/esmvaltool/cmorizers/data/formatters/datasets/jra_25.py new file mode 100644 index 0000000000..39830ff4e9 --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/jra_25.py @@ -0,0 +1,62 @@ +""" +ESMValTool CMORizer for JRA-25 data. + +Tier + Tier 2: other freely-available dataset. + +Source + ESGF: + https://esgf.nccs.nasa.gov/thredds/fileServer/CREATE-IP/ + reanalysis/JMA/JRA-25/JRA-25/mon/atmos/ + +Last access + 20221122 + +Download and processing instructions + see download script cmorizers/data/downloaders/datasets/jra_25.py +""" + +import copy +import logging +import os + +import iris +from iris import NameConstraint + +from esmvaltool.cmorizers.data import utilities as utils + +logger = logging.getLogger(__name__) + + +def _extract_variable(short_name, var, filename, cfg, in_dir, + out_dir): + """Extract variable.""" + # load data + filepath = os.path.join(in_dir, filename) + raw_var = var.get('raw', short_name) + cube = iris.load_cube(filepath, NameConstraint(var_name=raw_var)) + + # Fix metadata + cmor_info = cfg['cmor_table'].get_variable(var['mip'], short_name) + attrs = copy.deepcopy(cfg['attributes']) + attrs['mip'] = var['mip'] + utils.fix_var_metadata(cube, cmor_info) + utils.set_global_atts(cube, attrs) + + # Save variable + utils.save_variable(cube, + short_name, + out_dir, + attrs, + unlimited_dimensions=['time']) + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Cmorization func call.""" + # Run the cmorization + for (short_name, var) in cfg['variables'].items(): + short_name = var['short_name'] + filename = var['file'] + logger.info("CMORizing variable '%s' from file '%s'", short_name, + filename) + _extract_variable(short_name, var, filename, cfg, in_dir, out_dir) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/landschuetzer2020.py b/esmvaltool/cmorizers/data/formatters/datasets/landschuetzer2020.py new file mode 100644 index 0000000000..d5739cb8f1 --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/landschuetzer2020.py @@ -0,0 +1,139 @@ +"""ESMValTool CMORizer for Landschuetzer2020 data. + +Tier + Tier 2: other freely-available dataset. + +Source + https://www.ncei.noaa.gov/data/oceans/ncei/ocads/data/0209633/ + +Last access + 20221102 + +Download and processing instructions + Download the file MPI-ULB-SOM_FFN_clim.nc + +""" + +import logging +import warnings +from datetime import datetime +from pathlib import Path + +import iris +from cf_units import Unit +from dask import array as da +from iris import NameConstraint +from iris.coords import CellMethod, DimCoord + +from esmvaltool.cmorizers.data import utilities as utils + +logger = logging.getLogger(__name__) + + +def _callback_fix_fillvalue(cube, field, _): + """Create masked array from FillValue.""" + if hasattr(field.cf_data, 'FillValue'): + fill_value = int(field.cf_data.FillValue) + logger.info("Fixing fill value (%i)", fill_value) + cube.data = da.ma.masked_equal(cube.core_data(), fill_value) + + +def _fix_climatological_time(cube): + """Fix climatology coordinate.""" + time_units = Unit('days since 1950-01-01 00:00:00', calendar='standard') + + # Following the doc the covered time period of the climatology is + # 1988-01-01 to 2020-01-01 (Use 2004 as the "mean" year). See + # https://www.ncei.noaa.gov/access/metadata/landing-page/bin/ + # iso?id=gov.noaa.nodc%3A0209633 + time_points = time_units.date2num( + [datetime(2004, m, 15) for m in range(1, 13)] + ) + time_bounds = [ + [datetime(1988, m, 1), datetime(2019, m + 1, 1)] for m in range(1, 12) + ] + time_bounds.append([datetime(1988, 12, 1), datetime(2020, 1, 1)]) + time_bounds = time_units.date2num(time_bounds) + + # Add new time coordinate to cube + time_coord = DimCoord( + time_points, + bounds=time_bounds, + standard_name='time', + long_name='time', + var_name='time', + units=time_units, + climatological=True, + ) + cube.remove_coord('time') + cube.add_dim_coord(time_coord, 0) + + # Fix cell methods + cube.add_cell_method(CellMethod('mean within years', coords=time_coord)) + cube.add_cell_method(CellMethod('mean over years', coords=time_coord)) + + +def _fix_scalar_coords(cube): + """Fix scalar coordinates.""" + if cube.var_name == 'spco2': + utils.add_scalar_depth_coord(cube) + + +def _extract_variable(var_info, cmor_info, attrs, filepath, out_dir): + """Extract variable.""" + var = cmor_info.short_name + raw_var = var_info.get('raw_name', var) + + # Load data + with warnings.catch_warnings(): + warnings.filterwarnings( + action='ignore', + message='Ignoring netCDF variable .* invalid units .*', + category=UserWarning, + module='iris', + ) + cube = iris.load_cube(filepath, NameConstraint(var_name=raw_var), + callback=_callback_fix_fillvalue) + + # Fix variable metadata + if 'raw_units' in var_info: + cube.units = var_info['raw_units'] + cube.convert_units(cmor_info.units) + utils.fix_var_metadata(cube, cmor_info) + + # Fix coordinates + _fix_climatological_time(cube) + utils.fix_coords( + cube, + overwrite_lat_bounds=False, + overwrite_lon_bounds=False, + overwrite_time_bounds=False, + ) + _fix_scalar_coords(cube) + + # Fix global metadata + utils.set_global_atts(cube, attrs) + + # Save variable + utils.save_variable( + cube, + var, + out_dir, + attrs, + local_keys=['positive'], + unlimited_dimensions=['time'], + ) + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Cmorization func call.""" + cmor_table = cfg['cmor_table'] + glob_attrs = cfg['attributes'] + + # Run the cmorization + for (var, var_info) in cfg['variables'].items(): + filepath = Path(in_dir) / var_info['filename'] + logger.info("CMORizing variable '%s' from file %s", var, filepath) + glob_attrs['mip'] = var_info['mip'] + cmor_info = cmor_table.get_variable(var_info['mip'], var) + _extract_variable(var_info, cmor_info, glob_attrs, filepath, out_dir) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/merra2.py b/esmvaltool/cmorizers/data/formatters/datasets/merra2.py index a542a903d1..ed8dd00f5a 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/merra2.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/merra2.py @@ -6,9 +6,10 @@ Source https://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2_MONTHLY/ + https://daac.gsfc.nasa.gov/datasets/M2IUNPASM_5.12.4/summary?keywords=MERRA2 Last access - 20191129 + 20220913 Download and processing instructions - For download instructions see the download script `download_merra2.sh`. @@ -26,6 +27,9 @@ from esmvaltool.cmorizers.data import utilities as utils +# iris spits out a large amount of warnings +# logging.disable('WARNING') # careful: this deactivates writing +# to log files in the pytest test environment for other cmorizer tests logger = logging.getLogger(__name__) @@ -51,10 +55,53 @@ def _fix_time_monthly(cube): return cube +def _var_pairs(cube_list, var_parts, oper): + """Return a selection composed of two variables.""" + selected_1 = [c for c in cube_list if c.var_name == var_parts[0]] + selected_2 = [c for c in cube_list if c.var_name == var_parts[1]] + if not selected_1: + logger.error("Raw variable %s could not be found " + "in str(cube_list) - operation can not be performed.", + var_parts[0]) + raise ValueError + if not selected_2: + logger.error("Raw variable %s could not be found " + "in str(cube_list) - operation can not be performed.", + var_parts[1]) + raise ValueError + if oper == "-": + selected = [ + cube_1 - cube_2 for cube_1, cube_2 in zip(selected_1, selected_2) + ] + selected = iris.cube.CubeList(selected) + else: + raise NotImplementedError(f"Pairwise variables operation {oper} " + "not implemented yet, you can do it " + "yourself in the MERRA2 cmorizer.") + + return selected + + def _load_cube(in_files, var): cube_list = iris.load_raw(in_files) - selected = [c for c in cube_list if c.var_name == var['raw']] - selected = iris.cube.CubeList(selected) + pairwise_ops = ["+", "-", ":"] + var_parts = [] + for oper in pairwise_ops: + split_var = var['raw'].split(oper) + if len(split_var) == 2: + var_parts = [split_var[0], split_var[1]] + break + if len(split_var) > 2: + logger.error("Splitting raw variable %s by " + "operation %s results in more than two" + " raw variables, this is not yet implemented.", + var['raw'], oper) + raise NotImplementedError + if not var_parts: + selected = [c for c in cube_list if c.var_name == var['raw']] + selected = iris.cube.CubeList(selected) + else: + selected = _var_pairs(cube_list, var_parts, oper) drop_attrs = [ 'History', 'Filename', 'Comment', 'RangeBeginningDate', @@ -79,19 +126,52 @@ def _load_cube(in_files, var): def _fix_coordinates(cube, definition): """Fix coordinates.""" - axis2def = {'T': 'time', 'X': 'longitude', 'Y': 'latitude'} - for axis in 'T', 'X', 'Y': + if cube.ndim == 3: + axis2def = {'T': 'time', 'X': 'longitude', 'Y': 'latitude'} + axes = ['T', 'X', 'Y'] + elif cube.ndim == 4: + axis2def = {'T': 'time', 'X': 'longitude', + 'Y': 'latitude', 'Z': 'plev19'} + axes = ['T', 'X', 'Y', 'Z'] + for axis in axes: coord_def = definition.coordinates.get(axis2def[axis]) if coord_def: coord = cube.coord(axis=axis) if axis == 'T': coord.convert_units('days since 1850-1-1 00:00:00.0') + elif axis == 'Z': + if coord.units == "hPa": + coord.convert_units('Pa') + else: + try: + coord.convert_units('Pa') + except ValueError as exc: + logger.error("Attempting to convert units for " + "coordinate %s to Pa", coord) + raise exc coord.standard_name = coord_def.standard_name coord.var_name = coord_def.out_name coord.long_name = coord_def.long_name coord.points = coord.core_points().astype('float64') if len(coord.points) > 1: coord.guess_bounds() + else: + # special case for UV + # variable "uv" (raw: "V") comes with "alevel" instead + # of "plev19" in the table; "alevel" has empty fields for + # standard_name, out_name etc. so we need to set them; it's safe + # to do so since the cmor checker/fixer will convert that during + # preprocessing at cmor fix stage + if cube.var_name == "uv" and axis == "Z": + coord = cube.coord(axis=axis) + coord_def = definition.coordinates.get('alevel') + coord.standard_name = "air_pressure" + coord.var_name = "plev" + coord.long_name = "pressure" + coord.points = coord.core_points().astype('float64') + if len(coord.points) > 1: + coord.guess_bounds() + return cube @@ -100,11 +180,50 @@ def _extract_variable(in_files, var, cfg, out_dir): var['short_name'], ', '.join(in_files)) attributes = deepcopy(cfg['attributes']) attributes['mip'] = var['mip'] + attributes['raw'] = var['raw'] + pairwise_ops = ["+", "-", ":"] + for oper in pairwise_ops: + if oper in var['raw']: + components = var['raw'].split(oper) + if len(components) == 2: + attributes['component_raw_1'] = components[0] + attributes['component_raw_2'] = components[1] + attributes['component_operation'] = oper + break cmor_table = CMOR_TABLES[attributes['project_id']] definition = cmor_table.get_variable(var['mip'], var['short_name']) cube = _load_cube(in_files, var) + # keep the following raw cube attributes + attrs_to_keep = [ + "institution", "Institution", + "institute_id", "VersionID", + "experiment_id", + "source", "Source", # overrides empty string default + "model_id", "ModelID", + "contact", "Contact", + "references", + "tracking_id", + "mip_specs", # described by "mip" already + "source_id", "SourceID", + "product", "Product", + "frequency", "Frequency", + "creation_date", + "project_id", "ProjectID", + "table_id", "TableID", + "title", "Title", + "modeling_realm", + "doi", + "VersionID", # described by "version" already + ] + + attrs_to_keep_exist = [ + att for att in cube.attributes if att in attrs_to_keep + ] + for att in attrs_to_keep_exist: + attributes[att] = cube.attributes[att] + utils.set_global_atts(cube, attributes) # Set correct names @@ -112,8 +231,18 @@ def _extract_variable(in_files, var, cfg, out_dir): # cube.standard_name = definition.standard_name cube.long_name = definition.long_name - # Fix units - cube.units = definition.units + # Fix units (if needed) + # input variable reports m-3 m-3 instead of m3 m-3 + if cube.var_name == "sm": + cube.units = definition.units + # Convert units to CMOR units + cube.convert_units(definition.units) + + # Add height2m or height10m if needed + if 'height2m' in definition.dimensions: + utils.add_height2m(cube) + elif 'height10m' in definition.dimensions: + utils.add_height10m(cube) # Fix data type cube.data = cube.core_data().astype('float32') @@ -132,7 +261,10 @@ def _extract_variable(in_files, var, cfg, out_dir): cube = _fix_time_monthly(cube) logger.debug("Saving cube\n%s", cube) - utils.save_variable(cube, cube.var_name, out_dir, attributes) + logger.debug("Setting time dimension to UNLIMITED while saving!") + utils.save_variable(cube, cube.var_name, + out_dir, attributes, + unlimited_dimensions=['time']) logger.info("Finished CMORizing %s", ', '.join(in_files)) @@ -144,7 +276,7 @@ def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): else: start_date = start_date.year if end_date is None: - end_date = 2018 + end_date = 2022 else: end_date = end_date.year for year in range(start_date, end_date + 1): diff --git a/esmvaltool/cmorizers/data/formatters/datasets/mobo_dic_mpim.py b/esmvaltool/cmorizers/data/formatters/datasets/mobo_dic_mpim.py new file mode 100644 index 0000000000..68884c22ae --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/mobo_dic_mpim.py @@ -0,0 +1,161 @@ +"""ESMValTool CMORizer for MOBO-DIC_MPIM data. + +Tier + Tier 2: other freely-available dataset. + +Source + https://www.ncei.noaa.gov/data/oceans/ncei/ocads/data/0221526/ + +Last access + 20221103 + +Download and processing instructions + Download the file MOBO-DIC_MPIM_monthly_clim.nc + +""" + +import logging +import warnings +from datetime import datetime +from pathlib import Path + +import iris +from cf_units import Unit +from dask import array as da +from iris import NameConstraint +from iris.coords import CellMethod, DimCoord + +from esmvaltool.cmorizers.data import utilities as utils + +logger = logging.getLogger(__name__) + + +def _callback_fix_missing_value(cube, field, _): + """Create masked array from missing_value.""" + if hasattr(field.cf_data, 'missing_value'): + missing_value = float(field.cf_data.missing_value) + logger.info("Fixing missing value (%f)", missing_value) + cube.data = da.ma.masked_equal(cube.core_data(), missing_value) + + +def _fix_climatological_time(cube): + """Fix climatology coordinate.""" + time_units = Unit('days since 1950-01-01 00:00:00', calendar='standard') + + # Following the doc the covered time period of the climatology is + # January 2004 to December 2017 (Use 2011 as the "mean" year). See + # https://www.ncei.noaa.gov/access/metadata/landing-page/bin/ + # iso?id=gov.noaa.nodc%3A0221526 + time_points = time_units.date2num( + [datetime(2011, m, 15) for m in range(1, 13)] + ) + time_bounds = [ + [datetime(2004, m, 1), datetime(2017, m + 1, 1)] for m in range(1, 12) + ] + time_bounds.append([datetime(2004, 12, 1), datetime(2018, 1, 1)]) + time_bounds = time_units.date2num(time_bounds) + + # Add new time coordinate to cube + time_coord = DimCoord( + time_points, + bounds=time_bounds, + standard_name='time', + long_name='time', + var_name='time', + units=time_units, + climatological=True, + ) + cube.remove_coord('month of the year') + cube.add_dim_coord(time_coord, 0) + + # Fix cell methods + cube.add_cell_method(CellMethod('mean within years', coords=time_coord)) + cube.add_cell_method(CellMethod('mean over years', coords=time_coord)) + + +def _fix_var_metadata(var_info, cmor_info, cube): + """Fix variable metadata. + + Note + ---- + The original units of 'dissic' are mumol/kg. To convert to the CMOR units + mol/m3, we assume a constant sea water density of 1032 kg/m3, which is + approximately the sea water density for T=4°C, salinity=35PSU, and p=100bar + according to the UNESCO formula (UNESCO, 1981, Tenth report of the joint + panel on oceanographic tables and standards, UNESCO Technical Papers in + Marine Science, see + https://www.wkcgroup.com/tools-room/seawater-density-calculator/ and + https://link.springer.com/content/pdf/bbm:978-3-319-18908-6/1.pdf). + + """ + if 'raw_units' in var_info: + cube.units = var_info['raw_units'] + + # Special conversion for dissic (see Note above) + if cmor_info.short_name == 'dissic': + cube.data = cube.core_data() * 1032.0 + cube.units *= 'kg m-3' + + cube.convert_units(cmor_info.units) + + utils.fix_var_metadata(cube, cmor_info) + + +def _extract_variable(var_info, cmor_info, attrs, filepath, out_dir): + """Extract variable.""" + var = cmor_info.short_name + raw_var = var_info.get('raw_name', var) + + # Load data + with warnings.catch_warnings(): + warnings.filterwarnings( + action='ignore', + message='Ignoring netCDF variable .* invalid units .*', + category=UserWarning, + module='iris', + ) + cube = iris.load_cube(filepath, NameConstraint(var_name=raw_var), + callback=_callback_fix_missing_value) + + # Fix variable metadata + _fix_var_metadata(var_info, cmor_info, cube) + + # Fix coordinates + _fix_climatological_time(cube) + cube.coord('depth').units = 'm' + utils.fix_coords(cube, overwrite_time_bounds=False) + + # Fix global metadata + utils.set_global_atts(cube, attrs) + + # Save variable + with warnings.catch_warnings(): + warnings.filterwarnings( + action='ignore', + message='WARNING: missing_value not used', + category=UserWarning, + module='iris', + ) + utils.save_variable( + cube, + var, + out_dir, + attrs, + local_keys=['comment', 'positive'], + unlimited_dimensions=['time'], + ) + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Cmorization func call.""" + cmor_table = cfg['cmor_table'] + glob_attrs = cfg['attributes'] + + # Run the cmorization + for (var, var_info) in cfg['variables'].items(): + filepath = Path(in_dir) / var_info['filename'] + logger.info("CMORizing variable '%s' from file %s", var, filepath) + glob_attrs['comment'] = var_info['comment'] + glob_attrs['mip'] = var_info['mip'] + cmor_info = cmor_table.get_variable(var_info['mip'], var) + _extract_variable(var_info, cmor_info, glob_attrs, filepath, out_dir) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/ncep.ncl b/esmvaltool/cmorizers/data/formatters/datasets/ncep.ncl deleted file mode 100644 index 62c695be5c..0000000000 --- a/esmvaltool/cmorizers/data/formatters/datasets/ncep.ncl +++ /dev/null @@ -1,253 +0,0 @@ -; ############################################################################# -; ESMValTool CMORizer for NCEP data -; ############################################################################# -; -; Tier -; Tier 2: other freely-available dataset. -; -; Source -; http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html -; -; Last access -; 20190204 -; -; Download and processing instructions -; To facilitate the download, the links to the ftp server are provided. -; Since the filenames are sometimes identical across different -; save the data in two subdirectories in input_dir_path. -; Subdirectory pressure/: -; ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.derived/pressure/ -; air.mon.mean.nc -; hgt.mon.mean.nc -; rhum.mon.mean.nc -; shum.mon.mean.nc -; uwnd.mon.mean.nc -; vwnd.mon.mean.nc -; omega.mon.mean.nc -; ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/ -; uwnd.????.nc -; vwnd.????.nc -; Subdirectory surface/: -; ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.derived/surface/ -; air.mon.mean.nc -; ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.derived/surface_gauss/ -; prate.mon.mean.nc -; ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/surface_gauss/ -; prate.sft.gauss.????.nc -; ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/other_gauss/ -; ulwrf.ntat.gauss.????.nc -; -; Select the section "Pressure" and "Surface" and download the variables -; listed below. Since raw data on pressure levels and for surface have the -; same file and variable name, save the data in two different subdirectories -; "press" and "surf" in input_dir_path. -; Specify the time range of the data as YEAR1-YEAR2 below, considering only -; complete years (Jan to Dec). -; -; Modification history -; 20190204-righi_mattia: merged with NCEP-daily and adapted to v2. -; 20140128-righi_mattia: written. -; -; ############################################################################# -loadscript(getenv("esmvaltool_root") + \ - "/data/formatters/interface.ncl") - -begin - - ; Script name (for logger) - DIAG_SCRIPT = "ncep.ncl" - - ; Source name - OBSNAME = "NCEP" - - ; Tier - TIER = 2 - - ; Period - YEAR1 = get_year(start_year, 1948) - YEAR2 = get_year(end_year, 2018) - - ; Selected variable (standard name) - VAR = (/"ta", "zg", "hur", "hus", "ua", \ - "va", "wap", "tas", "pr", \ - "ua", "va", "pr", "rlut"/) - - ; Name in the raw data - NAME = (/"air", "hgt", "rhum", "shum", "uwnd", \ - "vwnd", "omega", "air", "prate", \ - "uwnd", "vwnd", "prate", "ulwrf"/) - - ; Subdirectory - SUBDIR = (/"pressure/", "pressure/", "pressure/", "pressure/", "pressure/", \ - "pressure/", "pressure/", "surface/", "surface/", \ - "pressure/", "pressure/", "surface/", "surface/"/) - - ; Expected units (according to CMOR standard) - EXPUNITS = (/"K", "m", "%", "1", "m/s", \ - "m/s", "Pascal/s", "K", "Kg/m^2/s", \ - "m/s", "m/s", "Kg/m^2/s", "W/m^2"/) - - ; MIP - MIP = (/"Amon", "Amon", "Amon", "Amon", "Amon", \ - "Amon", "Amon", "Amon", "Amon", \ - "day", "day", "day", "day"/) - - ; Frequency - FREQ = (/"mon", "mon", "mon", "mon", "mon", \ - "mon", "mon", "mon", "mon", \ - "day", "day", "day", "day"/) - - ; CMOR tables - CMOR_TABLE = getenv("cmor_tables") + "/cmip5/Tables/CMIP5_" + MIP - - ; Type - TYPE = "reanaly" - - ; Version - VERSION = "1" - - ; Global attributes - SOURCE = "http://www.esrl.noaa.gov/psd/data/gridded/" + \ - "data.ncep.reanalysis.html" - REF = "Kalnay et al., B. Am. Meteorol. Soc., " + \ - "doi:10.1175/1520-0477(1996)077<0437:TNYRP>2.0.CO;2, 1996" - COMMENT = "" - -end - -begin - - ; Loop over variables - do vv = 0, dimsizes(VAR) - 1 - - log_info("Processing " + VAR(vv) + " (" + MIP(vv) + ")") - - do yy = YEAR1, YEAR2 - - if (isStrSubset(MIP(vv), "mon")) then - fname = input_dir_path + SUBDIR(vv) + NAME(vv) + ".mon.mean.nc" - end if - - if (isStrSubset(MIP(vv), "day")) then - flist = systemfunc("ls " + input_dir_path + SUBDIR(vv) + NAME(vv) + \ - ".*" + yy + ".nc") - fname = flist(0) - delete(flist) - end if - - f = addfile(fname, "r") - tmp = f->$NAME(vv)$ - delete(fname) - delete(f) - fill_start = num(ismissing(tmp)) - - ; Extract time range - tmp&time@calendar = "standard" - date = cd_calendar(tmp&time, 0) - idx = ind(date(:, 0).eq.yy) - if (dimsizes(dimsizes(tmp)).eq.4) then - output = tmp(idx, :, :, :) - else - output = tmp(idx, :, :) - end if - delete(idx) - delete(tmp) - delete(date) - - ; Unpack variable according to metadata information - if (isatt(output, "scale_factor") .or. \ - isatt(output, "add_offset")) then - tmp = output * output@scale_factor + output@add_offset - copy_VarMeta(output, tmp) - delete(output) - output = tmp - delete(tmp) - end if - - ; Convert units - if (any(VAR(vv).eq.(/"ta", "tas"/)) .and. \ - output@units.eq."degC") then - output = output + 273.15 - output@units = "K" - end if - if (VAR(vv).eq."hus" .and. output@units.eq."grams/kg") then - output = output / 1000. - output@units = "1" - end if - if (output@units.ne.EXPUNITS(vv)) then - error_msg("f", DIAG_SCRIPT, "", \ - "possibly wrong input units for " + VAR(vv)) - end if - - rank = dimsizes(dimsizes(output)) - output!0 = "time" - if (rank.eq.4) then - output!1 = "plev" - output!2 = "lat" - output!3 = "lon" - output&plev = output&plev * 100. ; [mb] --> [Pa] - elseif (rank.eq.3) - output!1 = "lat" - output!2 = "lon" - end if - - ; Format coordinates - format_coords(output, yy + "0101", yy + "1231", FREQ(vv)) - - ; Set variable attributes - tmp = format_variable(output, VAR(vv), CMOR_TABLE(vv)) - delete(output) - output = tmp - delete(tmp) - - ; Calculate coordinate bounds - bounds = guess_coord_bounds(output, FREQ(vv)) - - ; Set global attributes - gAtt = set_global_atts(OBSNAME, TIER, SOURCE, REF, COMMENT) - - ; Check fill values - fill_end = num(ismissing(output)) - if (fill_start.ne.fill_end) then - error_msg("f", DIAG_SCRIPT, "", \ - "missing values lost during conversion") - end if - delete(fill_start) - delete(fill_end) - - ; Output file - DATESTR = yy + "01-" + yy + "12" - fout = output_dir_path + \ - str_join((/"OBS", OBSNAME, TYPE, VERSION, \ - MIP(vv), VAR(vv), DATESTR/), "_") + ".nc" - - ; Add height coordinate to tas variable (required by the new backend) - if (VAR(vv).eq."tas") then - output@coordinates = "height" - end if - - ; Write variable - write_nc(fout, VAR(vv), output, bounds, gAtt) - delete(gAtt) - delete(output) - delete(bounds) - - ; Add height coordinate to tas variable (required by the new backend) - if (VAR(vv).eq."tas") then - height = 2.d - height!0 = "ncl_scalar" - height@units = "m" - height@axis = "Z" - height@positive = "up" - height@long_name = "height" - height@standard_name = "height" - w = addfile(fout, "w") - w->height = height - delete(w) - end if - - end do - - end do - -end diff --git a/esmvaltool/cmorizers/data/formatters/datasets/ncep_doe_r2.py b/esmvaltool/cmorizers/data/formatters/datasets/ncep_doe_r2.py new file mode 100644 index 0000000000..3d6d56512d --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/ncep_doe_r2.py @@ -0,0 +1,32 @@ +"""ESMValTool CMORizer for NCEP-DOE-R2 data. + +Tier + Tier 2: other freely-available dataset. + +Source + https://psl.noaa.gov/data/gridded/data.ncep.reanalysis2.html + +Last access + 20220906 + +Download and processing instructions + To facilitate the download, the links to the https server are provided. + + https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/ + pressure/ + rhum.mon.mean.nc + air.mon.mean.nc + https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/ + gaussian_grid/ + tcdc.eatm.mon.mean.nc + https://downlooads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/ + surface/ + pr_wtr.eatm.mon.mean.nc + +Caveats + +""" +from .ncep_ncar_r1 import cmorization + +# The following line makes it clear that the above import is not an error +cmorization diff --git a/esmvaltool/cmorizers/data/formatters/datasets/ncep_ncar_r1.py b/esmvaltool/cmorizers/data/formatters/datasets/ncep_ncar_r1.py new file mode 100644 index 0000000000..5e2829af07 --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/ncep_ncar_r1.py @@ -0,0 +1,172 @@ +"""ESMValTool CMORizer for NCEP-NCAR-R1 data. + +Tier + Tier 2: other freely-available dataset. + +Source + https://psl.noaa.gov/data/gridded/data.ncep.reanalysis.html + +Last access + 20221116 + +Download and processing instructions + To facilitate the download, the links to the ftp server are provided. + Since the filenames are sometimes identical across different + save the data in two subdirectories in input_dir_path. + Subdirectory pressure/: + ftp://ftp.cdc.noaa.gov/Projects/Datasets/data.ncep.reanalysis/pressure/ + air.mon.mean.nc + hgt.mon.mean.nc + rhum.mon.mean.nc + shum.mon.mean.nc + uwnd.mon.mean.nc + vwnd.mon.mean.nc + omega.mon.mean.nc + ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/ + uwnd.*.nc + vwnd.*.nc + + Subdirectory surface/: + ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.derived/surface/ + air.mon.mean.nc + pr_wtr.mon.mean.nc + slp.mon.mean.nc + wspd.mon.mean.nc + rhum.mon.mean.nc + ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.derived/surface_gauss/ + air.2m.mon.mean.nc + prate.sfc.mon.mean.nc + tmax.2m.mon.mean.nc + tmin.2m.mon.mean.nc + ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.derived/other_gauss/ + tcdc.eatm.mon.mean.nc + ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/surface_gauss/ + prate.sft.gauss.*.nc + ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/other_gauss/ + ulwrf.ntat.gauss.*.nc + + + #Select the section "Pressure" and "Surface" and download the variables + #listed below. Since raw data on pressure levels and for surface have the + #same file and variable name, save the data in two different subdirectories + #"press" and "surf" in input_dir_path. + +Caveats + +""" + +import logging +import re +from copy import deepcopy +from pathlib import Path +from warnings import catch_warnings, filterwarnings +from cf_units import Unit + +import iris +from esmvalcore.cmor.table import CMOR_TABLES +from iris import NameConstraint + +from esmvaltool.cmorizers.data import utilities as utils + +logger = logging.getLogger(__name__) + + +def _fix_units(cube, definition): + """ + Fix issues with the units. + + Exception is `pr` since the units in the + raw file are not recognized correctly. + """ + + if cube.var_name != 'pr': + cube.convert_units(definition.units) + + +def _fix_coordinates(cube, definition, cmor_info): + # fix flipped latitude + utils.flip_dim_coord(cube, 'latitude') + # fix other coordinates + utils.fix_coords(cube) + + if 'height2m' in cmor_info.dimensions: + utils.add_height2m(cube) + if 'height10m' in cmor_info.dimensions: + utils.add_scalar_height_coord(cube, height=10.) + + for coord_def in definition.coordinates.values(): + axis = coord_def.axis + coord = cube.coord(axis=axis) + if axis == 'Z': + coord.convert_units(coord_def.units) + coord.standard_name = coord_def.standard_name + coord.var_name = coord_def.out_name + coord.long_name = coord_def.long_name + coord.points = coord.core_points().astype('float64') + if coord.var_name == 'plev': + coord.attributes['positive'] = 'down' + + return cube + + +def _extract_variable(short_name, var, cfg, raw_filepath, out_dir): + attributes = deepcopy(cfg['attributes']) + attributes['mip'] = var['mip'] + cmor_table = CMOR_TABLES[attributes['project_id']] + definition = cmor_table.get_variable(var['mip'], short_name) + cmor_info = cfg['cmor_table'].get_variable(var['mip'], short_name) + if cmor_info.positive != '': + attributes['positive'] = cmor_info.positive + + # load data + raw_var = var.get('raw', short_name) + with catch_warnings(): + filterwarnings('ignore', + message='Ignoring netCDF variable .* invalid units .*', + category=UserWarning, + module='iris') + cube = iris.load_cube(str(raw_filepath), + NameConstraint(var_name=raw_var)) + + utils.set_global_atts(cube, attributes) + + # Set correct names + cube.var_name = definition.short_name + if definition.standard_name: + cube.standard_name = definition.standard_name + cube.long_name = definition.long_name + + _fix_units(cube, definition) + + utils.fix_var_metadata(cube, cmor_info) + + # fix time units + cube.coord('time').convert_units( + Unit('days since 1950-1-1 00:00:00', calendar='gregorian')) + + cube = _fix_coordinates(cube, definition, cmor_info) + + utils.save_variable( + cube, + short_name, + out_dir, + attributes, + unlimited_dimensions=['time'], + ) + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Run CMORizer for NCEP-NCAR-R1.""" + # Run the cmorization + for (short_name, var) in cfg['variables'].items(): + logger.info("CMORizing variable '%s'", short_name) + short_name = var['short_name'] + raw_filenames = Path(in_dir).rglob('*.nc') + filenames = [] + for raw_filename in raw_filenames: + if re.search(var['file'], str(raw_filename)) is not None: + filenames.append(raw_filename) + + for filename in sorted(filenames): + + _extract_variable(short_name, var, cfg, filename, out_dir) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/ndp.py b/esmvaltool/cmorizers/data/formatters/datasets/ndp.py index 0cb0d3dcb5..76d82cdf27 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/ndp.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/ndp.py @@ -35,7 +35,7 @@ def _extract_variable(cmor_info, attrs, var_file, out_dir, cfg): array = grid_file.ReadAsArray() for missing_value in cfg['missing_values']: array = np.ma.masked_equal(array, missing_value) - array = array.astype(np.float) + array = array.astype(np.float32) np.ma.set_fill_value(array, 1e20) array = np.ma.expand_dims(array, 0) time = iris.coords.DimCoord([183.0], @@ -45,12 +45,12 @@ def _extract_variable(cmor_info, attrs, var_file, out_dir, cfg): var_name='time', long_name='time') lats = iris.coords.DimCoord( - 90.0 - np.arange(array.shape[1]) * cfg['delta_degrees'], + 83.65972 - np.arange(array.shape[1]) * cfg['delta_degrees'], standard_name='latitude', var_name='lat', long_name='latitude') lons = iris.coords.DimCoord( - 180.0 + np.arange(array.shape[2]) * cfg['delta_degrees'], + -180.0 + np.arange(array.shape[2]) * cfg['delta_degrees'], standard_name='longitude', var_name='lon', long_name='longitude') diff --git a/esmvaltool/cmorizers/data/formatters/datasets/noaa_cires_20cr.py b/esmvaltool/cmorizers/data/formatters/datasets/noaa_cires_20cr.py new file mode 100644 index 0000000000..cdc5efbd40 --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/noaa_cires_20cr.py @@ -0,0 +1,30 @@ +"""ESMValTool CMORizer for NOAA-CIRES-20CR data. + +Tier + Tier 2: other freely-available dataset. + +Source + https://psl.noaa.gov/data/gridded/data.ncep.reanalysis2.html + +Last access + 20220906 + +Download and processing instructions + To facilitate the download, the links to the ftp server are provided. + + ftp://ftp.cdc.noaa.gov/Projects/20thC_ReanV2/Monthlies/ + + pr_wtr.eatm.mon.mean.nc + cldwtr.eatm.mon.mean.nc + tcdc.eatm.mon.mean.nc + ulwrf.ntat.mon.mean.nc + uswrf.ntat.mon.mean.nc + shum.mon.mean.nc + +Caveats + +""" +from .ncep_ncar_r1 import cmorization + +# The following line makes it clear that the above import is not an error +cmorization diff --git a/esmvaltool/cmorizers/data/formatters/datasets/noaaglobaltemp.py b/esmvaltool/cmorizers/data/formatters/datasets/noaaglobaltemp.py index e6aefbeba6..eadbcee5f7 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/noaaglobaltemp.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/noaaglobaltemp.py @@ -21,6 +21,7 @@ import iris from cf_units import Unit +from iris import NameConstraint from esmvaltool.cmorizers.data import utilities as utils @@ -33,7 +34,7 @@ def _extract_variable(short_name, var, filename, cfg, in_dir, # load data filepath = os.path.join(in_dir, filename) raw_var = var.get('raw', short_name) - cube = iris.load_cube(filepath, utils.var_name_constraint(raw_var)) + cube = iris.load_cube(filepath, NameConstraint(var_name=raw_var)) # fix time units cube.coord('time').convert_units( diff --git a/esmvaltool/cmorizers/data/formatters/datasets/oceansoda_ethz.py b/esmvaltool/cmorizers/data/formatters/datasets/oceansoda_ethz.py new file mode 100644 index 0000000000..7867db259d --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/oceansoda_ethz.py @@ -0,0 +1,140 @@ +"""ESMValTool CMORizer for OceanSODA-ETHZ data. + +Tier + Tier 2: other freely-available dataset. + +Source + https://www.ncei.noaa.gov/data/oceans/ncei/ocads/data/0220059/ + +Last access + 20221103 + +Download and processing instructions + Download the file OceanSODA-ETHZ_GRaCER_v2021a_1982-2020.nc + +""" + +import logging +import warnings +from datetime import datetime +from pathlib import Path + +import iris +from dask import array as da +from iris import NameConstraint + +from esmvaltool.cmorizers.data import utilities as utils +from esmvaltool.diag_scripts.shared.iris_helpers import unify_time_coord + +logger = logging.getLogger(__name__) + + +def _fix_coords(cube, cmor_info): + """Fix coordinates.""" + # Dimensional coordinates + if 'time' in cmor_info.dimensions: + unify_time_coord(cube, 'days since 1950-01-01 00:00:00') + + # Move time points to center of month + time_coord = cube.coord('time') + old_dates = time_coord.units.num2date(time_coord.points) + new_dates = [datetime(t.year, t.month, 15) for t in old_dates] + time_coord.points = time_coord.units.date2num(new_dates) + cube.coord('lat').standard_name = 'latitude' + cube.coord('lon').standard_name = 'longitude' + utils.fix_coords(cube) + + # Scalar coordinates + if cmor_info.short_name in ('fgco2', 'spco2'): + utils.add_scalar_depth_coord(cube) + + +def _fix_data(cube, var): + """Fix data.""" + if var == 'areacello': + cube.data = da.ma.masked_equal(cube.core_data(), 0.0) + + +def _fix_var_metadata(var_info, cmor_info, attrs, cube): + """Fix variable metadata.""" + if 'raw_units' in var_info: + cube.units = var_info['raw_units'] + + # fgco2: + # Convert from mol(CO2) to kgC (note that one CO2 molecule contains one C + # atom) and fix wrong sign (the dataset reports sea->air flux, while CMOR + # expects "positive into ocean") + if cmor_info.short_name == 'fgco2': + cube.data = -cube.core_data() * 12.01 # molar mass of C [g/mol] + cube.units *= 'g mol-1' + attrs['positive'] = 'down' + + # co3os, dissicos, talkos: + # The original units of these variables are mumol/kg. To convert to the + # CMOR units mol/m3, we assume a constant sea water density of 1028 kg/m3, + # which is approximately the sea water density for T=4°C, salinity=35PSU, + # and p=0bar according to the UNESCO formula (UNESCO, 1981, Tenth report of + # the joint panel on oceanographic tables and standards, UNESCO Technical + # Papers in Marine Science, see + # https://www.wkcgroup.com/tools-room/seawater-density-calculator/ and + # https://link.springer.com/content/pdf/bbm:978-3-319-18908-6/1.pdf). + if cmor_info.short_name in ('co3os', 'dissicos', 'talkos'): + cube.data = cube.core_data() * 1028.0 + cube.units *= 'kg m-3' + + cube.convert_units(cmor_info.units) + + utils.fix_var_metadata(cube, cmor_info) + + +def _extract_variable(var_info, cmor_info, attrs, filepath, out_dir): + """Extract variable.""" + var = cmor_info.short_name + raw_var = var_info.get('raw_name', var) + + # Load data + with warnings.catch_warnings(): + warnings.filterwarnings( + action='ignore', + message='Ignoring netCDF variable .* invalid units .*', + category=UserWarning, + module='iris', + ) + cube = iris.load_cube(filepath, NameConstraint(var_name=raw_var)) + + # Fix data + _fix_data(cube, var) + + # Fix variable metadata + _fix_var_metadata(var_info, cmor_info, attrs, cube) + + # Fix coordinates + _fix_coords(cube, cmor_info) + + # Fix global metadata + utils.set_global_atts(cube, attrs) + + # Save variable + utils.save_variable( + cube, + var, + out_dir, + attrs, + local_keys=['comment', 'positive'], + unlimited_dimensions=['time'], + ) + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Cmorization func call.""" + cmor_table = cfg['cmor_table'] + glob_attrs = cfg['attributes'] + + # Run the cmorization + for (var, var_info) in cfg['variables'].items(): + filepath = Path(in_dir) / var_info['filename'] + logger.info("CMORizing variable '%s' from file %s", var, filepath) + glob_attrs['comment'] = var_info.get('comment', '') + glob_attrs['mip'] = var_info['mip'] + cmor_info = cmor_table.get_variable(var_info['mip'], var) + _extract_variable(var_info, cmor_info, glob_attrs, filepath, out_dir) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/tcom_ch4.py b/esmvaltool/cmorizers/data/formatters/datasets/tcom_ch4.py new file mode 100644 index 0000000000..f204c4bb44 --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/tcom_ch4.py @@ -0,0 +1,106 @@ +"""ESMValTool CMORizer for TCOM-CH4 data. + +Tier + Tier 2: other freely-available dataset. + +Source + https://zenodo.org/record/7293740 + +Last access + 20230117 + +Download and processing instructions + Download the file zmch4_TCOM_plev_T2Dz_1991_2021.nc + +""" + +import logging +import warnings +from pathlib import Path + +import iris +from iris import NameConstraint + +from esmvaltool.cmorizers.data import utilities as utils + +logger = logging.getLogger(__name__) + + +def _fix_var_metadata(var_info, cmor_info, cube): + """Fix variable metadata.""" + if 'raw_units' in var_info: + cube.units = var_info['raw_units'] + + cube.convert_units(cmor_info.units) + + utils.fix_var_metadata(cube, cmor_info) + + +def _fix_coords(cube): + """Fix coordinates.""" + utils.fix_dim_coordnames(cube) + + # Time + cube.coord('time').guess_bounds() + + # Pressure levels + cube.coord(axis='Z').standard_name = 'air_pressure' + cube.coord(axis='Z').long_name = 'pressure' + cube.coord(axis='Z').convert_units('Pa') + + # Latitude + utils.flip_dim_coord(cube, 'latitude') + cube.coord('latitude').guess_bounds() + + # Longitude + cube.coord('longitude').points = [180.0] + cube.coord('longitude').bounds = [[0.0, 360]] + + +def _extract_variable(var_info, cmor_info, attrs, filepath, out_dir): + """Extract variable.""" + var = cmor_info.short_name + raw_var = var_info.get('raw_name', var) + + # Load data + with warnings.catch_warnings(): + warnings.filterwarnings( + action='ignore', + message="Skipping global attribute 'units': 'units' is not a " + "permitted attribute", + category=UserWarning, + module='iris', + ) + cube = iris.load_cube(filepath, NameConstraint(var_name=raw_var)) + + # Fix variable metadata + _fix_var_metadata(var_info, cmor_info, cube) + + # Fix coordinates + _fix_coords(cube) + + # Fix global metadata + utils.set_global_atts(cube, attrs) + + # Save variable + utils.save_variable( + cube, + var, + out_dir, + attrs, + unlimited_dimensions=['time'], + ) + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Cmorization func call.""" + cmor_table = cfg['cmor_table'] + glob_attrs = cfg['attributes'] + + # Run the cmorization + for (var, var_info) in cfg['variables'].items(): + filepath = Path(in_dir) / var_info['filename'] + logger.info("CMORizing variable '%s' from file %s", var, filepath) + glob_attrs['mip'] = var_info['mip'] + cmor_info = cmor_table.get_variable(var_info['mip'], var) + _extract_variable(var_info, cmor_info, glob_attrs, filepath, out_dir) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/tcom_n2o.py b/esmvaltool/cmorizers/data/formatters/datasets/tcom_n2o.py new file mode 100644 index 0000000000..80d7c2ffb3 --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/tcom_n2o.py @@ -0,0 +1,17 @@ +"""ESMValTool CMORizer for TCOM-N2O data. + +Tier + Tier 2: other freely-available dataset. + +Source + https://zenodo.org/record/7386001 + +Last access + 20230117 + +Download and processing instructions + Download the file zmn2o_TCOM_plev_T2Dz_1991_2021.nc + +""" + +from .tcom_ch4 import cmorization # noqa diff --git a/esmvaltool/cmorizers/data/formatters/utilities.ncl b/esmvaltool/cmorizers/data/formatters/utilities.ncl index fb113d126c..42632889ef 100644 --- a/esmvaltool/cmorizers/data/formatters/utilities.ncl +++ b/esmvaltool/cmorizers/data/formatters/utilities.ncl @@ -803,14 +803,39 @@ begin idxu = ind(str_get_field(data, 1, ":").eq."! Variable attributes") + 2 idxd = ind(str_get_field(data, 1, ":").eq. \ "! Additional variable information") - 2 - attn = str_squeeze(str_get_field(data(idxu:idxd), 1, ":")) - attv = str_squeeze(str_get_field(data(idxu:idxd), 2, ":")) + n = idxd - idxu + 1 + attn = new(n, string) + attv = new(n, string) + do i = 0, n - 1 + substr = str_split(data(idxu + i), ":") + m = dimsizes(substr) + attn(i) = str_squeeze(substr(0)) + if (m .gt. 1) then + attv(i) = str_squeeze(str_join(substr(1:), ":")) + else + attv(i) = "" + end if + delete(substr) + end do end if out = True do ii = 0, dimsizes(attn) - 1 - out@$attn(ii)$ = attv(ii) + ; If present, do not copy the attribute 'cell_measures' to comply with the + ; CF conventions: + ; + ; "A variable referenced by cell_measures is not required to be present in + ; the file containing the data variable. If the cell_measures variable is + ; located in another file (an "external file"), rather than in the file + ; where it is referenced, it must be listed in the external_variables + ; attribute of the referencing file (Section 2.6.3)." + ; + ; ---> As we do not have such a variable (e.g. areacella), we remove + ; the attribute 'cell_measures' (if present). + if (attn(ii) .ne. "cell_measures") then + out@$attn(ii)$ = attv(ii) + end if end do return(out) diff --git a/esmvaltool/cmorizers/data/utilities.py b/esmvaltool/cmorizers/data/utilities.py index 95c79081d1..e31add6652 100644 --- a/esmvaltool/cmorizers/data/utilities.py +++ b/esmvaltool/cmorizers/data/utilities.py @@ -5,7 +5,6 @@ import os import re import shutil -import warnings from contextlib import contextmanager from pathlib import Path @@ -15,9 +14,8 @@ from cf_units import Unit from dask import array as da from esmvalcore.cmor.table import CMOR_TABLES -from iris import NameConstraint +from iris.cube import Cube -from esmvaltool import ESMValToolDeprecationWarning from esmvaltool import __file__ as esmvaltool_file from esmvaltool import __version__ as version @@ -26,37 +24,65 @@ REFERENCES_PATH = Path(esmvaltool_file).absolute().parent / 'references' -def add_height2m(cube): - """Add scalar coordinate 'height' with value of 2m. +def add_height2m(cube: Cube) -> None: + """Add scalar coordinate 'height' with value of 2m to cube in-place. Parameters ---------- cube: iris.cube.Cube - data cube to get the 2m height coordinate. + Cube which will get the 2m-height coordinate in-place. - Returns - ------- - iris.cube.Cube - Returns the cube with new 2m height coordinate. """ add_scalar_height_coord(cube, height=2.) -def add_scalar_height_coord(cube, height=2.): - """Add scalar coordinate 'height' with value of `height`m. +def add_height10m(cube: Cube) -> None: + """Add scalar coordinate 'height' with value of 10m to cube in-place. Parameters ---------- cube: iris.cube.Cube - data cube to have the height coordinate added to. + Cube which will get the 10m-height coordinate in-place. - height: float - value for height in meters + """ + add_scalar_height_coord(cube, height=10.) + + +def add_scalar_depth_coord(cube: Cube, depth: float = 0.0) -> None: + """Add scalar coordinate 'depth' to cube in-place. + + Parameters + ---------- + cube: iris.cube.Cube + Cube which will get the depth coordinate in-place. + depth: float, optional (default: 0.0) + Value for the depth in meters. + + """ + logger.debug("Adding depth coordinate (%sm)", depth) + depth_coord = iris.coords.AuxCoord(depth, + var_name='depth', + standard_name='depth', + long_name='depth', + units=Unit('m'), + attributes={'positive': 'down'}) + try: + cube.coord('depth') + except iris.exceptions.CoordinateNotFoundError: + cube.add_aux_coord(depth_coord, ()) + return cube + + +def add_scalar_height_coord(cube: Cube, height: float = 2.0) -> None: + """Add scalar coordinate 'height' to cube in-place. + + Parameters + ---------- + cube: iris.cube.Cube + Cube which will get the height coordinate in-place. + height: float, optional (default: 2.0) + Value for the height in meters. - Returns - ------- - iris.cube.Cube - Returns the iris cube with new height (value: height) coordinate. """ logger.debug("Adding height coordinate (%sm)", height) height_coord = iris.coords.AuxCoord(height, @@ -113,9 +139,9 @@ def convert_timeunits(cube, start_year): Returns the original iris cube with time coordinate reformatted. """ if cube.coord('time').units == 'months since 0000-01-01 00:00:00': - real_unit = 'months since {}-01-01 00:00:00'.format(str(start_year)) + real_unit = f'months since {str(start_year)}-01-01 00:00:00' elif cube.coord('time').units == 'days since 0000-01-01 00:00:00': - real_unit = 'days since {}-01-01 00:00:00'.format(str(start_year)) + real_unit = f'days since {str(start_year)}-01-01 00:00:00' elif cube.coord('time').units == 'days since 1950-1-1': real_unit = 'days since 1950-1-1 00:00:00' else: @@ -261,7 +287,7 @@ def read_cmor_config(dataset): """Read the associated dataset-specific config file.""" reg_path = os.path.join(os.path.dirname(__file__), 'cmor_config', dataset + '.yml') - with open(reg_path, 'r') as file: + with open(reg_path, 'r', encoding='utf-8') as file: cfg = yaml.safe_load(file) cfg['cmor_table'] = \ CMOR_TABLES[cfg['attributes']['project_id']] @@ -304,10 +330,12 @@ def save_variable(cube, var, outdir, attrs, **kwargs): year = str(time.cell(0).point.year) time_suffix = '-'.join([year + '01', year + '12']) else: - date1 = str(time.cell(0).point.year) + '%02d' % \ - time.cell(0).point.month - date2 = str(time.cell(-1).point.year) + '%02d' % \ - time.cell(-1).point.month + date1 = ( + f"{time.cell(0).point.year:d}{time.cell(0).point.month:02d}" + ) + date2 = ( + f"{time.cell(-1).point.year:d}{time.cell(-1).point.month:02d}" + ) time_suffix = '-'.join([date1, date2]) name_elements = [ @@ -399,38 +427,6 @@ def set_global_atts(cube, attrs): cube.attributes = glob_dict -def var_name_constraint(var_name): - """:class:`iris.Constraint` using ``var_name``. - - Warning - ------- - .. deprecated:: 2.6.0 - This function has been deprecated in ESMValTool version 2.6.0 and is - scheduled for removal in version 2.8.0. Please use the function - :class:`iris.NameConstraint` with the argument ``var_name`` instead: - this is an exact replacement. - - Parameters - ---------- - var_name: str - ``var_name`` used for the constraint. - - Returns - ------- - iris.Constraint - Constraint. - - """ - deprecation_msg = ( - "The function ``var_name_constraint`` has been deprecated in " - "ESMValTool version 2.6.0 and is scheduled for removal in version " - "2.8.0. Please use the function ``iris.NameConstraint`` with the " - "argument ``var_name`` instead: this is an exact replacement." - ) - warnings.warn(deprecation_msg, ESMValToolDeprecationWarning) - return NameConstraint(var_name=var_name) - - def fix_bounds(cube, dim_coord): """Reset and fix all bounds.""" if len(cube.coord(dim_coord).points) > 1: @@ -522,7 +518,7 @@ def roll_cube_data(cube, shift, axis): def set_units(cube, units): """Set units in compliance with cf_unit.""" special = {'psu': 1, 'Sv': '1e6 m3 s-1'} - if units in list(special.keys()): + if units in special: cube.units = special[units] else: cube.units = Unit(units) diff --git a/esmvaltool/config-references.yml b/esmvaltool/config-references.yml index b8ee4c03d8..5ccadcc9ed 100644 --- a/esmvaltool/config-references.yml +++ b/esmvaltool/config-references.yml @@ -193,7 +193,7 @@ authors: frank_franziska: name: Frank, Franziska institute: DLR, Germany - orcid: + orcid: https://orcid.org/0000-0002-2406-4936 fuckar_neven: name: Fuckar, Neven institute: BSC, Spain @@ -835,4 +835,5 @@ statistics: smpi: single metric performance index statistics mder: multiple diagnostic ensemble regression mvi: model variability index + pdf: probability density function (PDF) other: other statistics diff --git a/esmvaltool/diag_scripts/arctic_ocean/utils.py b/esmvaltool/diag_scripts/arctic_ocean/utils.py index fb391cbee8..372c561880 100644 --- a/esmvaltool/diag_scripts/arctic_ocean/utils.py +++ b/esmvaltool/diag_scripts/arctic_ocean/utils.py @@ -13,7 +13,6 @@ import seawater as sw from cdo import Cdo from cmocean import cm as cmo -from matplotlib import cm from matplotlib import pylab as plt from matplotlib.colors import LinearSegmentedColormap @@ -193,8 +192,11 @@ def shiftedcolormap(cmap, start=0, midpoint=0.5, stop=1.0, name='shiftedcmap'): cdict['blue'].append((shii, blue, blue)) cdict['alpha'].append((shii, alpha, alpha)) - newcmap = mpl.colors.LinearSegmentedColormap(name, cdict) - cm.register_cmap(cmap=newcmap) + try: + newcmap = mpl.colors.LinearSegmentedColormap(name, cdict) + mpl.colormaps.register(cmap=newcmap) + except ValueError: + logger.info("A colormap named %s is already registered.", name) return newcmap @@ -220,15 +222,19 @@ def get_cmap(cmap_name): Additional custom colormap for salinity is provided: - "custom_salinity1" """ - cm.register_cmap(cmap=LinearSegmentedColormap( - 'cubehelix3', mpl._cm.cubehelix(gamma=1.0, s=2.0, r=1.0, h=3))) + try: + mpl.colormaps.register(cmap=LinearSegmentedColormap( + 'cubehelix3', mpl._cm.cubehelix(gamma=1.0, s=2.0, r=1.0, h=3)), + name="new_cubehelix3", force=False) + except ValueError: + logger.info('Colormap new_cubehelix3 is already registered.') if cmap_name in cmo.cmapnames: colormap = cmo.cmap_d[cmap_name] elif cmap_name in plt.colormaps(): colormap = plt.get_cmap(cmap_name) elif cmap_name == "custom_salinity1": - colormap = shiftedcolormap(cm.get_cmap("cubehelix3"), + colormap = shiftedcolormap(mpl.colormaps.get_cmap("new_cubehelix3"), start=0, midpoint=0.89, stop=0.9, diff --git a/esmvaltool/diag_scripts/autoassess/_rms_radiation.py b/esmvaltool/diag_scripts/autoassess/_rms_radiation.py deleted file mode 100644 index a96f06cb23..0000000000 --- a/esmvaltool/diag_scripts/autoassess/_rms_radiation.py +++ /dev/null @@ -1,314 +0,0 @@ -""" -Port for ESMValTool v2 from v1. - -Uses: ESMValTool v2, Python 3.x -Valeriu Predoi, UREAD, July 2018 - -Functionality: computes root mean squares for a bunch of geographical -regions; - -Original docstring: -This file contains an rms class which contains all the information needed -to make a rms table of a particular region. -""" - -import os -import math -import logging -import numpy.ma as ma -import iris -from esmvaltool.diag_scripts.autoassess._valmod_radiation import area_avg - -logger = logging.getLogger(os.path.basename(__file__)) - - -class RMSLISTCLASS(list): - """ - Construct the regions class. - - This is the class for a list of RMSCLASS (i.e. for lots of regions). - """ - - def __init__(self, *args): - """Init.""" - if not args: - super(RMSLISTCLASS, self).__init__() - else: - super(RMSLISTCLASS, self).__init__(args[0]) - - def __repr__(self): - """Repr.""" - rms_out = "[" - for rms_item in self: - rms_out += "rms.RMSCLASS for " + rms_item.region + ", \n" - rms_out = rms_out[0:-3] - rms_out += "]" - - return rms_out - - def __call__(self, region=False): - """Call.""" - rms_found = False - region_list = [] - for rms_item in self: - region_list.append(rms_item.region) - if region: - if rms_item.region == region: - rms_returned = rms_item - rms_found = True - if not region: - logger.warning( - "Please supply a region using the region='xxx' input. " + - "Available regions are:") - elif not rms_found: - logger.warning("ERROR: Requested region not found.") - if not rms_found: - logger.error(region_list) - raise Exception - return rms_returned - - -# This is the class for one set of rms values (i.e. for one region) -class RMSCLASS: - """Class per region.""" - - def __init__(self, region, exper='experiment', control='control'): - """ - Create instances of this class but also start making. - - html files that will contain all the rms data. (old) - - region = the region name - exper = experiment jobid - control = control jobid. - """ - # Store the region name, experiment and control - self.region = region - self.exper = exper - self.control = control - - # This could be a dictionary in the future; not now tho - - # Store the region boundaries - if region == 'north': - self.region_bounds = [-180, 30, 180, 90] - if region == 'south': - self.region_bounds = [-180, -90, 180, -30] - if region == 'tropical_land': - self.region_bounds = [-180, -30, 180, 30] - if region == 'tropical_ocean': - self.region_bounds = [-180, -30, 180, 30] - if region == 'east_asia': - self.region_bounds = [100, 20, 145, 50] - if region == 'natl_europe': - self.region_bounds = [-45, 25, 60, 75] - if region == 'australia_land': - self.region_bounds = [100, -45, 155, -10] - - # Store the end of the mask key - if region == 'tropical_land': - self.mask_end = 'land_gt_50pc' - if region == 'tropical_ocean': - self.mask_end = 'ocean_gt_50pc' - if region == 'australia_land': - self.mask_end = 'land_gt_50pc' - if region == 'sahara_n_africa': - self.mask_end = 'SaharaNC' - if region == 'tropical_n_africa': - self.mask_end = 'TNAfrica' - if region == 'east_africa': - self.mask_end = 'EAfrica' - if region == 'central_africa': - self.mask_end = 'CAfrica' - if region == 'southern_africa': - self.mask_end = 'SAfrica' - if region == 'africa_land': - self.mask_end = 'Africa' - - # Make a blank dictionary to store the values - self.data_dict = {} - - # Allow iterations over this - def __iter__(self): - """Iter.""" - return self - - # This defines how this class is shown on the screen if you print it - def __repr__(self): - """Repr.""" - rms_out = "rms.RMSCLASS for {0}".format(self.region) - return rms_out - - def calc(self, toplot_cube, mask_cube): - """Calculate the rms value of a cube for this region. - - toplot_cube = (cube) cube that is to be plotted - mask_cube = (cube) the mask to be applied (land/sea) - """ - # Make a copy of the input cube - working_cube = toplot_cube.copy() - - # What type of plot is this - plot_type = 'lat_lon' - if not toplot_cube.coords(axis='x'): - plot_type = 'zonal_mean' - else: - if len(toplot_cube.coords(axis='x')[0].points) == 1: - plot_type = 'zonal_mean' - if not toplot_cube.coords(axis='y'): - plot_type = 'meridional_mean' - else: - if len(toplot_cube.coords(axis='y')[0].points) == 1: - plot_type = 'meridional_mean' - - # Apply the mask but only for lat_lon plots - if hasattr(self, 'mask_end'): - if plot_type == 'lat_lon': - # Apply the mask - working_cube.data = \ - ma.masked_array(working_cube.data, - mask=(mask_cube.data > 0.5)) - - else: - # If there is a mask but we are using zonal - # mean or meridional mean, return missing - return 1e+20 - - # Extract a region - if hasattr(self, 'region_bounds'): - - # Extract just the latitudes you want - lonc = iris.Constraint() - latc = iris.Constraint() - if plot_type == 'lat_lon' or plot_type == 'meridional_mean': - lonc = iris.Constraint( - longitude=lambda lon: - self.region_bounds[0] <= lon <= self.region_bounds[2] - ) - if plot_type == 'lat_lon' or plot_type == 'zonal_mean': - latc = iris.Constraint( - latitude=lambda lat: - self.region_bounds[1] <= lat <= self.region_bounds[3] - ) - working_cube = working_cube.extract(lonc & latc) - - # Check to see if we have any data left. - # If not then apply a missing data number. - amount_of_data = len(working_cube.data) - if hasattr(working_cube.data, 'compressed'): - amount_of_data = len(working_cube.data.compressed()) - if amount_of_data == 0: - rms_float = 1e+20 - else: - logger.info('Calculating RMS for %s', self.region) - - # Square the values - squared_cube = working_cube**2 - - # Mean the values - area_average = area_avg( - squared_cube, coord1='latitude', coord2='longitude') - - # Square root the answer - rms_float = math.sqrt(area_average.data) - - return rms_float - - def calc_wrapper(self, toplot_cube, mask_cube, page_title): - """ - Get the RMS value and adds it to its own data array. - - toplot_cube = (cube) cube that is to be plotted - mask_cube = (cube) mask land/sea - page_title = (str) the page title for this plot - """ - rms_float = self.calc(toplot_cube, mask_cube) - self.data_dict[page_title] = [] - if rms_float: - self.data_dict[page_title].append(rms_float) - return rms_float - - def tofile(self, csv_dir): - """Output all the RMS statistics to csv files.""" - csv_file = 'summary_' + self.region + '_RMS_' + self.exper + '.csv' - csv_path = os.path.join(csv_dir, csv_file) - with open(csv_path, 'a') as out_file: - for page_title, rms_list in self.data_dict.items(): - out_file.write('{0}: '.format(page_title)) - for rms_val in rms_list: - out_file.write('{0}'.format(str(rms_val))) - out_file.write('\n') - - -def start(exper='experiment', control='control'): - """ - Make some instances of the rms class. - - exper = experiment jobid (optional) - control = control jobid (optional). - """ - # Loop over all regions. Regions are: - # 0 = globe - # 1 = north of 30N - # 2 = south of 30S - # 3 = tropical land - # 4 = tropical ocean - # 5 = east asia - # 6 = north atlantic and europe - # 7 = australian land - # 8 = sahara and north african coast - # 9 = tropical northern africa - # 10 = east africa - # 11 = central africa - # 12 = southern africa - # 13 = african land - - # Make a list of the regions - region_list = [ - 'global', 'north', 'south', 'tropical_land', 'tropical_ocean', - 'east_asia', 'natl_europe', 'australia_land', 'sahara_n_africa', - 'tropical_n_africa', 'east_africa', 'central_africa', - 'southern_africa', 'africa_land' - ] - - # Make a blank list that will hold the rms classes - rms_list = RMSLISTCLASS() - - # Make the rms classes. This will also start making the summary web pages. - for region in region_list: - rms_list.append(RMSCLASS(region, exper=exper, control=control)) - - return rms_list - - -def calc_all(rms_list, toplot_cube, mask_cube, page_title): - """ - Loop through all the regions. - - Calculate rms values and store them in the class. - rms_list = list of rms classes that stores all the information to do - with the rms regions and the resulting answers. - toplot_cube = (cube) cube that is to be plotted - page_title = (str) the page title for this plot. - """ - # Run through the loop, calculating rms values for each region - rms_float_list = [] - n_rms = len(rms_list) - for i in range(n_rms): - rms_float = rms_list[i].calc_wrapper(toplot_cube, mask_cube, - page_title) - rms_float_list.append(rms_float) - - # Return the global rms value - return rms_float_list[0] - - -def end(rms_list, csv_dir): - """ - Finish using the rms class. - - rms_list = list of rms classes that stores all the information to do with - the rms regions and the resulting answers. - """ - for rms_instance in rms_list: - rms_instance.tofile(csv_dir) diff --git a/esmvaltool/diag_scripts/autoassess/_valmod_radiation.py b/esmvaltool/diag_scripts/autoassess/_valmod_radiation.py deleted file mode 100644 index dd1f330623..0000000000 --- a/esmvaltool/diag_scripts/autoassess/_valmod_radiation.py +++ /dev/null @@ -1,81 +0,0 @@ -#! /usr/local/sci/bin/python -""" -Port for ESMValTool v2 from v1. - -Uses: ESMValTool v2, Python 3.x -Valeriu Predoi, UREAD, July 2018 - -The script is well different than the v1 vresion but executes the -same set of functionalities; script name kept the same as in v1 -for historical purposes. -""" - -import iris -import iris.analysis.cartography - - -def get_cube_ready(cube): - """Remve unwanted coords and check bounds.""" - to_remove_list = [ - 'forecast_reference_time', 'forecast_period', 'source', 'season', - 'time' - ] - for coord in cube.coords(): - if coord.name() in to_remove_list: - cube.remove_coord(coord) - if not cube.coord(axis='x').has_bounds(): - cube.coord(axis='x').guess_bounds() - if not cube.coord(axis='y').has_bounds(): - cube.coord(axis='y').guess_bounds() - - return cube - - -def area_avg(cube, coord1=None, coord2=None): - """ - Get area average. - - Perform an area average of a cube using weights to account for - changes in latitude. - """ - for coord in (coord1, coord2): - if not cube.coord(coord).has_bounds(): - cube.coord(coord).guess_bounds() - grid_areas = iris.analysis.cartography.area_weights(cube) - result = cube.collapsed( - [coord1, coord2], iris.analysis.MEAN, weights=grid_areas) - - return result - - -def perform_equation(dataset_1, dataset_2, analysis_type): - """ - Perform a simple cube operation. - - analysis_type = type of analysis (zonal_mean, vertical_mean,...) - This can be easily adapted for more than one type of operation - by passing an argument e.g. 'sum_of_squares' etc. - """ - # Make sure all the fields have correct units - dataset_1_ready = get_cube_ready(dataset_1) - dataset_2_ready = get_cube_ready(dataset_2) - - if analysis_type == 'zonal_mean': - dataset_1_mean = dataset_1_ready.collapsed('longitude', - iris.analysis.MEAN) - dataset_2_mean = dataset_2_ready.collapsed('longitude', - iris.analysis.MEAN) - - elif analysis_type == 'vertical_mean': - dataset_1_mean = dataset_1_ready.collapsed('pressure', - iris.analysis.MEAN) - dataset_2_mean = dataset_2_ready.collapsed('pressure', - iris.analysis.MEAN) - elif analysis_type == 'lat_lon': - dataset_1_mean = dataset_1_ready - dataset_2_mean = dataset_2_ready - - # Perform simple difference - toplot_cube = dataset_1_mean - dataset_2_mean - - return toplot_cube diff --git a/esmvaltool/diag_scripts/autoassess/autoassess_radiation_rms.py b/esmvaltool/diag_scripts/autoassess/autoassess_radiation_rms.py deleted file mode 100644 index 5687518dd7..0000000000 --- a/esmvaltool/diag_scripts/autoassess/autoassess_radiation_rms.py +++ /dev/null @@ -1,118 +0,0 @@ -""" -Port to Version 2 with implementation of v2-specific changes. - -Uses: ESMValTool v2, Python3.x -Valeriu Predoi, UREAD, July 2018 - -Porting replicates the functionality to minimum errors. - -Original Description from Version 1 Diagnostic: -;;########################################################################### -;; AutoAssess_radiation_rms.py -;;########################################################################### -;; Description -;; This script is the RMS error metric script of -;; AutoAssess radiation -;; ########################################################################### - -This diagnostic uses CMIP5 data; to switch to CMIP6 change _CMIP_TYPE. -""" - -import os -import logging -import iris -from esmvaltool.diag_scripts.autoassess._rms_radiation import (start, end, - calc_all) -from esmvaltool.diag_scripts.autoassess._valmod_radiation import ( - perform_equation) -from esmvaltool.diag_scripts.shared import ( - group_metadata, run_diagnostic, get_control_exper_obs, apply_supermeans) - -logger = logging.getLogger(os.path.basename(__file__)) - -_CMIP_TYPE = 'CMIP5' - - -def apply_rms(data_1, data_2, cfg, component_dict, var_name): - """Compute RMS for any data1-2 combination.""" - data_names = [model['dataset'] for model in component_dict.values()] - plot_title = var_name + ': ' + data_names[0] + ' vs ' + data_names[1] - rms_list = start(data_names[0], data_names[1]) - analysis_type = cfg['analysis_type'] - landsea_mask_file = os.path.join( - os.path.dirname(__file__), 'autoassess_source', cfg['landsea_mask']) - landsea_mask_cube = iris.load_cube(landsea_mask_file) - data1_vs_data2 = perform_equation(data_1, data_2, analysis_type) - - # call to rms.calc_all() to compute rms; rms.end() to write results - calc_all(rms_list, data1_vs_data2, landsea_mask_cube, plot_title) - end(rms_list, cfg['work_dir']) - - -def do_preamble(cfg): - """Execute some preamble functionality.""" - # get data - input_data = cfg['input_data'].values() - grouped_input_data = group_metadata( - input_data, 'short_name', sort='dataset') - - return input_data, grouped_input_data - - -def main(cfg): - """Execute the radiation rms diag.""" - logger.setLevel(cfg['log_level'].upper()) - input_data, grouped_input_data = do_preamble(cfg) - - # select variables and their corresponding - # obs files - for short_name in grouped_input_data: - logger.info("Processing variable %s", short_name) - - # control, experiment and obs's - ctrl, exper, obslist = get_control_exper_obs(short_name, input_data, - cfg, _CMIP_TYPE) - - # apply the supermeans - ctrl_sm, exper_sm, obs_sm_list = apply_supermeans(ctrl, exper, obslist) - - # assemble a dict that contains various params depending - # on the data combinations for RMS computations - # control-experiment - data_component_dict = {'ct-ex': {'ctrl': ctrl, 'exper': exper}} - logger.info("Computing CONTROL-EXPERIMENT RMS...") - apply_rms(ctrl_sm, exper_sm, cfg, data_component_dict['ct-ex'], - short_name) - if obs_sm_list: - for obs, obsfile in zip(obs_sm_list, obslist): - data_component_dict = { - 'ct-obs': { - 'ctrl': ctrl, - 'obs': obsfile - }, - 'ex-obs': { - 'exper': exper, - 'obs': obsfile - } - } - - # ctrl-obs - logger.info("Computing CONTROL-OBS RMS...") - apply_rms(ctrl_sm, obs, cfg, data_component_dict['ct-obs'], - short_name) - # exper-obs - logger.info("Computing EXPERIMENT-OBS RMS...") - apply_rms(exper_sm, obs, cfg, data_component_dict['ex-obs'], - short_name) - else: - # only ctrl-exper - data_component_dict = {'ct-ex': {'ctrl': ctrl, 'exper': exper}} - logger.info("Computing CONTROL-EXPERIMENT RMS...") - apply_rms(ctrl_sm, exper_sm, cfg, data_component_dict['ct-ex'], - short_name) - - -if __name__ == '__main__': - - with run_diagnostic() as config: - main(config) diff --git a/esmvaltool/diag_scripts/autoassess/land_surface_permafrost/permafrost.py b/esmvaltool/diag_scripts/autoassess/land_surface_permafrost/permafrost.py index 638c768b68..0844132017 100644 --- a/esmvaltool/diag_scripts/autoassess/land_surface_permafrost/permafrost.py +++ b/esmvaltool/diag_scripts/autoassess/land_surface_permafrost/permafrost.py @@ -230,7 +230,7 @@ def num_frozen(data, threshold, axis, frozen_length): # Find the windows "full of True-s" (along the added 'window axis'). full_windows = np.all(hit_windows, axis=axis + 1) # Count points fulfilling the condition (along the time axis). - frozen_point_counts = np.sum(full_windows, axis=axis, dtype=int) + frozen_point_counts = np.sum(full_windows, axis=axis, dtype=np.int64) return frozen_point_counts diff --git a/esmvaltool/diag_scripts/autoassess/stratosphere/strat_metrics_1.py b/esmvaltool/diag_scripts/autoassess/stratosphere/strat_metrics_1.py index ad0c7a579f..91a2defcb5 100644 --- a/esmvaltool/diag_scripts/autoassess/stratosphere/strat_metrics_1.py +++ b/esmvaltool/diag_scripts/autoassess/stratosphere/strat_metrics_1.py @@ -95,7 +95,6 @@ def plot_timehgt(cube, levels, title, log=False, ax1=None): new_epoch = time_coord.points[0] new_unit_str = 'hours since {}' new_unit = new_unit_str.format(time_coord.units.num2date(new_epoch)) - ax1.xaxis.axis_date() ax1.xaxis.set_label(new_unit) ax1.xaxis.set_major_locator(mdates.YearLocator(4)) ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y')) diff --git a/esmvaltool/diag_scripts/carbon_ec/carbon_beta.ncl b/esmvaltool/diag_scripts/carbon_ec/carbon_beta.ncl index 0d6319ea85..eb43b10cd3 100644 --- a/esmvaltool/diag_scripts/carbon_ec/carbon_beta.ncl +++ b/esmvaltool/diag_scripts/carbon_ec/carbon_beta.ncl @@ -279,7 +279,11 @@ begin create_legend_lines(leg@annots, leg, plot_dir + \ DIAG_SCRIPT + "_legend", "markers") - plotname = plot_dir + plot_file + "." + file_type + if (file_type .ne. "png") then + plotname = plot_dir + plot_file + "." + file_type + else + plotname = plot_dir + plot_file + ".000001.png" + end if ; Call provenance logger log_provenance(ncdf_outfile, \ diff --git a/esmvaltool/diag_scripts/carbon_ec/carbon_co2_cycle.ncl b/esmvaltool/diag_scripts/carbon_ec/carbon_co2_cycle.ncl index f37b7bc23a..7876ffdb62 100644 --- a/esmvaltool/diag_scripts/carbon_ec/carbon_co2_cycle.ncl +++ b/esmvaltool/diag_scripts/carbon_ec/carbon_co2_cycle.ncl @@ -492,7 +492,11 @@ begin ; Write NetCDF output ncdf_outfile = ncdf_write(CO2var, new_path) - plotname = plot_dir + plot_file + "." + file_type + if (file_type .ne. "png") then + plotname = plot_dir + plot_file + "." + file_type + else + plotname = plot_dir + plot_file + ".000001.png" + end if ; ----------------------------------------------------------- ; Call provenance logger diff --git a/esmvaltool/diag_scripts/climate_metrics/create_scatterplot.py b/esmvaltool/diag_scripts/climate_metrics/create_scatterplot.py index f13a2b52fe..9f81046de7 100644 --- a/esmvaltool/diag_scripts/climate_metrics/create_scatterplot.py +++ b/esmvaltool/diag_scripts/climate_metrics/create_scatterplot.py @@ -102,7 +102,7 @@ def plot_data(cfg, cube): plt.savefig(plot_path, orientation='landscape', bbox_inches='tight', - additional_artists=[legend]) + bbox_extra_artists=[legend]) logger.info("Wrote %s", plot_path) plt.close() return plot_path diff --git a/esmvaltool/diag_scripts/climate_metrics/ecs.py b/esmvaltool/diag_scripts/climate_metrics/ecs.py index 9c34879c25..e3a23065f5 100644 --- a/esmvaltool/diag_scripts/climate_metrics/ecs.py +++ b/esmvaltool/diag_scripts/climate_metrics/ecs.py @@ -413,9 +413,10 @@ def plot_gregory_plot(cfg, dataset_name, tas_cube, rtnt_cube, reg_stats): # Save plot plot_path = get_plot_filename(dataset_name, cfg) - plt.savefig(plot_path, - additional_artists=[legend], - **cfg['savefig_kwargs']) + savefig_kwargs = dict(cfg['savefig_kwargs']) + if legend is not None: + savefig_kwargs['bbox_extra_artists'] = [legend] + plt.savefig(plot_path, **savefig_kwargs) logger.info("Wrote %s", plot_path) plt.close() diff --git a/esmvaltool/diag_scripts/climate_metrics/feedback_parameters.py b/esmvaltool/diag_scripts/climate_metrics/feedback_parameters.py index 00cdc07775..f984fd04a1 100644 --- a/esmvaltool/diag_scripts/climate_metrics/feedback_parameters.py +++ b/esmvaltool/diag_scripts/climate_metrics/feedback_parameters.py @@ -308,10 +308,8 @@ def _create_feedback_plot(tas_cube, cube, dataset_name, cfg, description=None): filename += f"_{description.replace(' ', '_')}" plt.title(title) plot_path = get_plot_filename(filename, cfg) - plt.savefig(plot_path, - bbox_inches='tight', - orientation='landscape', - additional_artists=[colorbar]) + savefig_kwargs = dict(bbox_inches='tight', orientation='landscape') + plt.savefig(plot_path, **savefig_kwargs) logger.info("Wrote %s", plot_path) plt.close() diff --git a/esmvaltool/diag_scripts/clouds/clouds.ncl b/esmvaltool/diag_scripts/clouds/clouds.ncl index 8ceedf4231..928d7cc96d 100644 --- a/esmvaltool/diag_scripts/clouds/clouds.ncl +++ b/esmvaltool/diag_scripts/clouds/clouds.ncl @@ -17,24 +17,35 @@ ; explicit_cn_levels: explicit contour levels (array) ; extralegend: plot legend(s) to extra file(s) ; filename_add: optionally add this string to plot filesnames +; multiobs_exclude: list of *observational* datasets to be excluded when +; calculating uncertainty estimates from multiple +; observational datasets (see also multiobs_uncertainty) +; multiobs_uncertainty: calculate uncertainty estimates from multiple +; observational datasets (true, false); by default, +; all "obs", "obs6", "obs4mips" and "native6" datasets +; are used; any of such datasets can be explicitely +; excluded when also specifying "multiobs_exclude" ; panel_labels: label individual panels (true, false) ; PanelTop: manual override for "@gnsPanelTop" used by panel ; plot(s) ; projection: map projection for plotting (default = ; "CylindricalEquidistant") -; showdiff calculate and plot differences (default = False) +; showdiff: calculate and plot differences (default = False) +; showyears: add start and end years to the plot titles (default = +; false) ; rel_diff: if showdiff = True, then plot relative differences (%) ; (default = False) -; ref_diff_min: lower cutoff value in case of calculating relative -; differences -; (in units of input variable) +; rel_diff_min: lower cutoff value in case of calculating relative +; differences (in units of input variable) ; region: show only selected geographic region given as latmin, ; latmax, lonmin, lonmax ; timemean: time averaging - "seasonal" = DJF, MAM, JJA, SON), -; "annual" = annual mean +; "annualclim" = annual mean ; treat_var_as_error: treat variable as error when averaging (true, false) ; true: avg = sqrt(mean(var*var)) ; false: avg = mean(var) +; var: short_name of variable to process (default = "" - use +; first variable in variable list) ; ; Required variable attributes (variable specific) ; none @@ -49,7 +60,13 @@ ; none ; ; Modification history +; 20230117-lauer_axel: added support for ICON (code from Manuel) +; 20211021-lauer_axel: added output of basic statistics as ascii files ; 20211006-lauer_axel: removed write_plots +; 20210325-lauer_axel: added option to estimate observational uncertainty +; from multiple observational datasets +; 20210318-lauer_axel: added option to speficfy variable if more than one +; variable is present ; 20190220-lauer_axel: added output of provenance (v2.0) ; 20181119-lauer_axel: adapted code to multi-variable capable framework ; 20180923-lauer_axel: added writing of results to netcdf @@ -67,39 +84,60 @@ load "$diag_scripts/../interface_scripts/interface.ncl" load "$diag_scripts/shared/statistics.ncl" load "$diag_scripts/shared/plot/style.ncl" load "$diag_scripts/shared/plot/contour_maps.ncl" +load "$diag_scripts/shared/dataset_selection.ncl" begin enter_msg(DIAG_SCRIPT, "") - var0 = variable_info[0]@short_name - info0 = select_metadata_by_name(input_file_info, var0) - dim_MOD = ListCount(info0) - if (isatt(variable_info[0], "reference_dataset")) then - refname = variable_info[0]@reference_dataset - end if - names = metadata_att_as_array(info0, "dataset") - projects = metadata_att_as_array(info0, "project") - - log_info("++++++++++++++++++++++++++++++++++++++++++") - log_info(DIAG_SCRIPT + " (var: " + var0 + ")") - log_info("++++++++++++++++++++++++++++++++++++++++++") - ; Set default values for non-required diag_script_info attributes set_default_att(diag_script_info, "embrace_setup", False) set_default_att(diag_script_info, "extralegend", False) set_default_att(diag_script_info, "filename_add", "") + set_default_att(diag_script_info, "multiobs_exclude", "") + set_default_att(diag_script_info, "multiobs_uncertainty", False) set_default_att(diag_script_info, "panel_labels", True) set_default_att(diag_script_info, "rel_diff", False) set_default_att(diag_script_info, "rel_diff_min", -1.0e19) set_default_att(diag_script_info, "showdiff", False) + set_default_att(diag_script_info, "showyears", False) set_default_att(diag_script_info, "timemean", "annualclim") set_default_att(diag_script_info, "treat_var_as_error", False) + set_default_att(diag_script_info, "var", "") + + if (diag_script_info@var .eq. "") then + var0 = variable_info[0]@short_name + else + var0 = diag_script_info@var + end if + + variables = metadata_att_as_array(variable_info, "short_name") + if (.not. any(variables .eq. var0)) then + errstr = "diagnostic " + diag + " requires the following variable: " + var0 + error_msg("f", DIAG_SCRIPT, "", errstr) + end if + + var0_info = select_metadata_by_name(variable_info, var0) + var0_info := var0_info[0] + info0 = select_metadata_by_name(input_file_info, var0) + dim_MOD = ListCount(info0) + + if (isatt(var0_info, "reference_dataset")) then + refname = var0_info@reference_dataset + end if + names = metadata_att_as_array(info0, "dataset") + projects = metadata_att_as_array(info0, "project") + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT + " (var: " + var0 + ")") + log_info("++++++++++++++++++++++++++++++++++++++++++") flag_diff = diag_script_info@showdiff flag_rel_diff = diag_script_info@rel_diff flag_rel_diff_min = diag_script_info@rel_diff_min + flag_multiobs_unc = diag_script_info@multiobs_uncertainty + multiobs_exclude = diag_script_info@multiobs_exclude if (.not.flag_diff .and. flag_rel_diff) then log_info("flag_rel_diff = True has no effect until flag_diff is also " \ @@ -135,6 +173,38 @@ begin season = (/"DJF", "MAM", "JJA", "SON"/) end if + if (flag_multiobs_unc .and. timemean .ne. "annualclim") then + log_info("multiobs_uncertainty = True is currently supported for annual" \ + + " means only (timemean = annualclim). Setting " \ + + " multiobs_uncertainty to False.") + flag_multiobs_unc = False + end if + + if (flag_multiobs_unc) then + ; find indices of all OBS and obs4mips datasets (including "native6" ERA5) + idxobs = get_obs(names, projects, multiobs_exclude) + + if (idxobs(0) .eq. -1) then + flag_multiobs_unc = False + else + refname = "REF" + ref_ind = dimsizes(names) + names := array_append_record(names, (/refname/), 0) + end if + else + ref_ind = -1 ; set to invalid value + idxobs = -1 + ; if attribute is present, use it so correlations can be calculated + if (isvar("refname")) then + ; set reference model + ref_ind = ind(names .eq. refname) + if (ismissing(ref_ind)) then + log_info("warning: reference dataset (" + refname + ") not found.") + ref_ind = -1 + end if + end if + end if + ; create string for caption (netcdf provenance) allseas = season(0) @@ -154,18 +224,6 @@ begin ; Create work dir system("mkdir -p " + work_dir) - ref_ind = -1 ; set to invalid value - - ; if attribute is present, use it so correlations can be calculated - if (isvar("refname")) then - ; set reference model - ref_ind = ind(names .eq. refname) - if (ismissing(ref_ind)) then - log_info("warning: reference dataset (" + refname + ") not found.") - ref_ind = -1 - end if - end if - climofiles = metadata_att_as_array(info0, "filename") outfile = new(numseas, string) @@ -182,11 +240,9 @@ begin end if ; set reference model - - ref_ind = ind(names .eq. refname) - if (ismissing(ref_ind)) then - error_msg("f", DIAG_SCRIPT, "", "reference dataset (" \ - + refname + ") is missing") + if (ref_ind .lt. 0) then + error_msg("f", DIAG_SCRIPT, "", "cannot calculate differences as " \ + + "reference dataset (" + refname + ") is missing") end if end if @@ -197,21 +253,111 @@ begin ; # get data and average time # ; ########################################### - maps = new((/dim_MOD, 4/), graphic) - maps_d = new((/dim_MOD, 4/), graphic) + ; --------------------------------------------------------- + ; if requested, calculate multi-observational mean and standard deviation + + if (flag_multiobs_unc) then + nobs = dimsizes(idxobs) + + ; step 1: calculate multi-obs mean + + do i = 0, nobs - 1 + A0 = read_data(info0[idxobs(i)]) + + ; calculate time average + mean = time_operations(A0, -1, -1, "average", "annualclim", True) + delete(A0) + + ; if requested, extract geographical region + if (isatt(diag_script_info, "region")) then + region = diag_script_info@region + mean := area_operations(mean, region(0), region(1), region(2), \ + region(3), "extract", False) + end if + if (i .eq. 0) then + dims = dimsizes(mean) + newdims = new(dimsizes(dims) + 1, integer) + newdims(0) = nobs + newdims(1:dimsizes(newdims) - 1) = dims + ref_tmp = new(newdims, float) + delete(dims) + end if + ref_tmp(i, :, :) = mean + end do + delete(mean) + ; note: we are using dim_avg_n_Wrap so missing values are ignored + ; when averaging + ref_avg = dim_avg_n_Wrap(ref_tmp, 0) + delete(ref_tmp) + + ; step 2: calculate standard deviation of all obs datasets using + ; the multi-obs mean + + sigma2 = new(dimsizes(ref_avg), float) + sig_tmp = new(newdims, float) + delete(newdims) + + do i = 0, nobs - 1 + A0 = read_data(info0[idxobs(i)]) + ; calculate yearly averages + ymean = time_operations(A0, -1, -1, "average", "yearly", True) + delete(A0) + ; if requested, extract geographical region + if (isatt(diag_script_info, "region")) then + region = diag_script_info@region + ymean := area_operations(ymean, region(0), region(1), region(2), \ + region(3), "extract", False) + end if + dims = dimsizes(ymean) + nyears = dims(0) + delete(dims) + sigma2 = 0.0 + do j = 0, nyears - 1 ; dimension 0 = time + sigma2 = sigma2 + (ref_avg - ymean(j, :, :)) ^ 2 + end do + if (nyears .gt. 1) then + sigma2 = sigma2 / tofloat(nyears - 1) + end if + sig_tmp(i, :, :) = sigma2 + delete(ymean) + end do + delete(sigma2) + ; note: we are using dim_avg_n so missing values are ignored + ; when averaging + ref_std = sqrt(dim_avg_n(sig_tmp, 0)) + delete(sig_tmp) + copy_VarCoords(ref_avg, ref_std) + ref_std@units = ref_avg@units + end if + +; system("rm debug.nc") +; debugfile = addfile("debug.nc", "c") +; debugfile->avg = ref_avg +; debugfile->std = ref_std + + ; --------------------------------------------------------- + + nplots = dim_MOD + if (flag_multiobs_unc) then + nplots = nplots + 1 + end if + + maps = new((/nplots, 4/), graphic) + maps_d = new((/nplots, 4/), graphic) - ind_all_sorted = ispan(0, dim_MOD - 1, 1) ; create array + ind_all_sorted = ispan(0, nplots, 1) ; create array if (ref_ind .ge. 0) then ind_wo_ref = ind(names .ne. refname) ind_all_sorted(0) = ref_ind - ind_all_sorted(1:dim_MOD - 1) = ind_wo_ref + n = dimsizes(names) + ind_all_sorted(1:n - 1) = ind_wo_ref end if - corr = new((/numseas/), float) - gavg = new((/numseas/), float) - rmsd = new((/numseas/), float) - bias = new((/numseas/), float) + corr = new((/nplots, numseas/), float) + gavg = new((/nplots, numseas/), float) + rmsd = new((/nplots, numseas/), float) + bias = new((/nplots, numseas/), float) ; filenames for netcdf output @@ -220,10 +366,12 @@ begin nc_filename_mean = work_dir + "clouds_" + var0 + "_mean.nc" nc_filename_mean@existing = "append" - do ii = 0, dim_MOD - 1 + res = True + + do ii = 0, nplots - 1 imod = ind_all_sorted(ii) - log_info("processing " + names(imod)) + log_info("processing " + names(imod) + " ***") if (isvar("data1")) then delete(data1) @@ -233,43 +381,47 @@ begin delete(A0) end if - A0 = read_data(info0[imod]) + if (imod .ne. ref_ind .or. .not.flag_multiobs_unc) then + A0 = read_data(info0[imod]) + ; check dimensions - ; check dimensions + dims = getvardims(A0) + if (dimsizes(dims) .lt. 2) then + error_msg("f", DIAG_SCRIPT, "", dimsizes(dims) + \ + " dimensions, need 2 or 3") + end if + idx = ind(dims .eq. "lat") + if (ismissing(idx)) then + error_msg("f", DIAG_SCRIPT, "", "no lat dimension") + end if + idx = ind(dims .eq. "lon") + if (ismissing(idx)) then + error_msg("f", DIAG_SCRIPT, "", "no lon dimension") + end if - dims = getvardims(A0) - if (dimsizes(dims) .lt. 2) then - error_msg("f", DIAG_SCRIPT, "", dimsizes(dims) + \ - " dimensions, need 2 or 3") - end if - idx = ind(dims .eq. "lat") - if (ismissing(idx)) then - error_msg("f", DIAG_SCRIPT, "", "no lat dimension") - end if - idx = ind(dims .eq. "lon") - if (ismissing(idx)) then - error_msg("f", DIAG_SCRIPT, "", "no lon dimension") - end if + ; average over time - ; average over time + ; if variable is an error variable, we have to square it before + ; averaging and then calculate the square-root afterwards - ; if variable is an error variable, we have to square it before - ; averaging and then calculate the square-root afterwards + if (treat_var_as_error) then + log_info(" ++++++++++++++ Treating variable as error " + \ + "variable when averaging ") + A0 = A0 * A0 + end if - if (treat_var_as_error) then - log_info(" ++++++++++++++ Treating variable as error " + \ - "variable when averaging ") - A0 = A0 * A0 - end if + data1 = time_operations(A0, -1, -1, "average", timemean, True) - data1 = time_operations(A0, -1, -1, "average", timemean, True) + if (treat_var_as_error) then + data1 = sqrt(data1) + end if - if (treat_var_as_error) then - data1 = sqrt(data1) + delete(A0) + else + data1 = ref_avg + delete(ref_avg) end if - delete(A0) - ; if requested, select geographical region if (isatt(diag_script_info, "region")) then @@ -278,13 +430,13 @@ begin region(3), "extract", False) if (region(2).eq.0. .and. region(3).eq.360.) then else - data1@res_gsnAddCyclic = False + res@gsnAddCyclic = False end if - data1@res_mpMinLatF = region(0) ; range to zoom in on - data1@res_mpMaxLatF = region(1) - data1@res_mpMinLonF = region(2) - data1@res_mpMaxLonF = region(3) - data1@res_mpCenterLonF = 0.5 * (region(2) + region(3)) + res@mpMinLatF = region(0) ; range to zoom in on + res@mpMaxLatF = region(1) + res@mpMinLonF = region(2) + res@mpMaxLonF = region(3) + res@mpCenterLonF = 0.5 * (region(2) + region(3)) delete(region) end if @@ -298,106 +450,131 @@ begin ; # plot ressources # ; ########################################### - data1@res_cnFillOn = True ; color plot desired - data1@res_cnLineLabelsOn = False ; contour lines + res@cnFillOn = True ; color plot desired + res@cnLineLabelsOn = False ; contour lines ; colors ; http://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml ; annotation - data1@res_tiMainOn = False - data1@res_cnLevelSelectionMode = "ExplicitLevels" - data1@res_cnLinesOn = False + ; if desired, add years to plot title + years_str = "" + if (diag_script_info@showyears) then + years_str = " (" + var0_info@start_year + if (var0_info@start_year .ne. var0_info@end_year) then + years_str = years_str + "-" + var0_info@end_year + end if + years_str = years_str + ")" + end if + +; res@tiMainOn = False + res@tiMainString = names(imod) + years_str + res@tiMainFontHeightF = 0.025 + + res@cnLevelSelectionMode = "ExplicitLevels" + res@cnLinesOn = False - data1@res_mpOutlineOn = True - data1@res_mpFillOn = False + res@mpOutlineOn = True + res@mpFillOn = False ; variable specific plotting settings + if (isatt(var0_info, "units")) then + data1@units = var0_info@units + else + data1@units = "" + end if + if (var0.eq."pr") then - data1@res_cnLevels = fspan(0.5, 10, 20) + res@cnLevels = fspan(0.5, 10, 20) ; convert from kg m-2 s-1 to mm day-1 data1 = data1 * 86400.0 data1@units = "mm day-1" end if if (var0.eq."lwp") then - data1@res_cnLevels = ispan(10, 200, 10) * 0.001 - data1@res_mpOutlineOn = False - data1@res_mpFillOn = True - data1@res_mpLandFillColor = "Black" + res@cnLevels = ispan(10, 200, 10) * 0.001 +; res@mpOutlineOn = False +; res@mpFillOn = True +; res@mpLandFillColor = "Black" pal = read_colormap_file("$diag_scripts/shared/plot/rgb/qcm3.rgb") - data1@res_cnFillColors = pal + res@cnFillColors = pal end if if (var0.eq."tas") then - data1@res_cnLevels = ispan(-30, 30, 3) + res@cnLevels = ispan(-30, 30, 3) pal = read_colormap_file("$diag_scripts/shared/plot/rgb/ipcc-tas.rgb") - data1@res_cnFillColors = pal + res@cnFillColors = pal ; convert from K to degC data1 = data1 - 273.15 data1@units = "degC" end if - if (var0.eq."clt") then - data1@res_cnLevels = fspan(5, 100, 20) + if ((var0.eq."clt") .or. (var0.eq."cltisccp")) then + res@cnLevels = fspan(5, 100, 20) end if if (var0.eq."clivi") then - data1@res_cnLevels = ispan(10, 200, 10) * 0.001 + res@cnLevels = ispan(10, 200, 10) * 0.001 end if if (var0.eq."clwvi") then - data1@res_cnLevels = ispan(10, 300, 10) * 0.001 + res@cnLevels = ispan(10, 300, 10) * 0.001 end if if (var0.eq."swcre") then - data1@res_cnLevels = ispan(-100, 0, 10) + res@cnLevels = ispan(-100, 0, 10) end if if (var0.eq."lwcre") then - data1@res_cnLevels = ispan(0, 100, 10) + res@cnLevels = ispan(0, 100, 10) end if if (var0.eq."netcre") then - data1@res_cnLevels = ispan(-70, 70, 10) + res@cnLevels = ispan(-70, 70, 10) + end if + + if (var0.eq."prw") then + res@cnLevels = ispan(0, 60, 5) end if - data1@res_lbLabelBarOn = False - data1@res_gsnRightString = "" +; res@lbLabelBarOn = False + res@gsnRightString = "" - data1@res_mpFillDrawOrder = "PostDraw" ; draw map last - data1@res_cnMissingValFillColor = "Gray" + res@mpFillDrawOrder = "PostDraw" ; draw map last + res@cnMissingValFillColor = "Gray" ; no tickmarks and no labels - data1@res_tmYLLabelsOn = False - data1@res_tmYLOn = False - data1@res_tmYRLabelsOn = False - data1@res_tmYROn = False - data1@res_tmXBLabelsOn = False - data1@res_tmXBOn = False - data1@res_tmXTLabelsOn = False - data1@res_tmXTOn = False - data1@res_cnInfoLabelOn = False ; turn off cn info label - data1@res_mpPerimOn = perim ; draw line around map + res@tmYLLabelsOn = False + res@tmYLOn = False + res@tmYRLabelsOn = False + res@tmYROn = False + res@tmXBLabelsOn = False + res@tmXBOn = False + res@tmXTLabelsOn = False + res@tmXTOn = False + res@cnInfoLabelOn = False ; turn off cn info label + res@mpPerimOn = perim ; draw line around map + + res@gsnStringFontHeightF = 0.02 ; specified in namelist - data1@res_mpProjection = projection + res@mpProjection = projection ; set explicit contour levels if (isatt(diag_script_info, "explicit_cn_levels")) then - data1@res_cnLevelSelectionMode = "ExplicitLevels" - data1@res_cnLevels = diag_script_info@explicit_cn_levels + res@cnLevelSelectionMode = "ExplicitLevels" + res@cnLevels = diag_script_info@explicit_cn_levels end if - if (.not. isatt(data1, "res_cnLevels")) then + if (.not. isatt(res, "cnLevels")) then log_info(DIAG_SCRIPT + " (var: " + var0 + "):") log_info("info: using default contour levels") - data1@res_cnLevels = fspan(min(data1), max(data1), 20) + res@cnLevels = fspan(min(data1), max(data1), 20) end if ; ########################################### @@ -414,18 +591,12 @@ begin data1@diag_script = (/DIAG_SCRIPT/) end if - if (isatt(variable_info[0], "long_name")) then - data1@var_long_name = variable_info[0]@long_name + if (isatt(var0_info, "long_name")) then + data1@long_name = var0_info@long_name end if data1@var = var0 - if (isatt(variable_info[0], "units")) then - data1@var_units = variable_info[0]@units - else - data1@var_units = "" - end if - if (.not. isvar("ref_data")) then ref_data = data1 end if @@ -452,42 +623,73 @@ begin + "preprocessor settings in recipe).") end if - corr = corr@_FillValue - gavg = gavg@_FillValue + corr(imod, :) = corr@_FillValue + gavg(imod, :) = gavg@_FillValue if (.not.all(ismissing(data1))) then if (numseas.gt.1) then do is = 0, numseas - 1 if (same_grid .and. (ref_ind .ge. 0)) then - corr(is) = calculate_metric(ref_data(is, :, :), data1(is, :, :), \ - "correlation") + mask1 = ref_data(is, :, :) + mask2 = data1(is, :, :) + mask1 = where(.not.ismissing(mask1), 0., mask1@_FillValue) + mask2 = where(.not.ismissing(mask2), 0., mask2@_FillValue) + amask = mask1 + mask2 + delete(mask1) + delete(mask2) + refmasked = ref_data(is, :, :) + refmasked = refmasked + amask + datmasked = data1(is, :, :) + datmasked = datmasked + amask + corr(imod, is) = calculate_metric(refmasked, datmasked, \ + "correlation") +; corr(imod, is) = calculate_metric(ref_data(is, :, :), \ +; data1(is, :, :), "correlation") + delete(amask) + delete(refmasked) + delete(datmasked) end if - gavg(is) = area_operations(data1(is, :, :), -90., 90., 0., 360., \ - "average", True) + gavg(imod, is) = area_operations(data1(is, :, :), -90., 90., \ + 0., 360., "average", True) end do else if (same_grid .and. (ref_ind .ge. 0)) then - corr(0) = calculate_metric(ref_data, data1, "correlation") + mask1 = ref_data + mask2 = data1 + mask1 = where(.not.ismissing(mask1), 0., mask1@_FillValue) + mask2 = where(.not.ismissing(mask2), 0., mask2@_FillValue) + amask = mask1 + mask2 + delete(mask1) + delete(mask2) + refmasked = ref_data + refmasked = refmasked + amask + datmasked = data1 + datmasked = datmasked + amask + corr(imod, 0) = calculate_metric(refmasked, datmasked, "correlation") +; corr(imod, 0) = calculate_metric(ref_data, data1, "correlation") + delete(amask) + delete(refmasked) + delete(datmasked) end if - gavg(0) = area_operations(data1, -90., 90., 0., 360., "average", True) + gavg(imod, 0) = area_operations(data1, -90., 90., 0., 360., \ + "average", True) end if end if - data1@res_gsnLeftStringFontHeightF = min((/0.025, 0.015 * 6.0 \ - / tofloat((dim_MOD + 1) / 2)/)) - data1@res_gsnRightStringFontHeightF = min((/0.025, 0.015 * 6.0 \ - / tofloat((dim_MOD + 1) / 2)/)) + res@lbTitleString = data1@units + res@lbTitlePosition = "Bottom" + res@lbTitleFontHeightF = 0.02 + res@lbLabelFontHeightF = 0.02 ; ########################################### ; # create the plot # ; ########################################### - data1@res_gsnDraw = False ; do not draw yet - data1@res_gsnFrame = False ; don't advance frame - ; function in aux_plotting.ncl if (ii.eq.0) then + nframe = 0 + ndframe = 0 ; note: an array of workspaces (i.e. wks(numseas)) does not work as ; attributes cannot be assigned to each array element ; individually @@ -519,53 +721,55 @@ begin if (numseas.gt.1) then do is = 0, numseas - 1 - if (.not.ismissing(corr(is))) then - data1@res_gsnRightString = "corr = " + sprintf("%6.3f", corr(is)) + if (.not.ismissing(corr(imod, is))) then + res@gsnRightString = "corr = " + sprintf("%6.3f", corr(imod, is)) else - data1@res_gsnRightString = "" + res@gsnRightString = "" end if - if (.not.ismissing(gavg(is))) then - data1@res_gsnLeftString = "mean = " + sprintf("%6.3f", gavg(is)) + if (.not.ismissing(gavg(imod, is))) then + res@gsnLeftString = "mean = " + sprintf("%6.3f", gavg(imod, is)) else - data1@res_gsnLeftString = "" + res@gsnLeftString = "" end if if (imod.eq.ref_ind) then ; remove corr. string for reference dataset - data1@res_gsnRightString = "" + res@gsnRightString = "" end if if (is.eq.0) then - maps(imod, is) = contour_map(wks0, data1(is, :, :), var0) + maps(imod, is) = gsn_csm_contour_map(wks0, data1(is, :, :), res) end if if (is.eq.1) then - maps(imod, is) = contour_map(wks1, data1(is, :, :), var0) + maps(imod, is) = gsn_csm_contour_map(wks1, data1(is, :, :), res) end if if (is.eq.2) then - maps(imod, is) = contour_map(wks2, data1(is, :, :), var0) + maps(imod, is) = gsn_csm_contour_map(wks2, data1(is, :, :), res) end if if (is.eq.3) then - maps(imod, is) = contour_map(wks3, data1(is, :, :), var0) + maps(imod, is) = gsn_csm_contour_map(wks3, data1(is, :, :), res) end if end do else - if (.not.ismissing(corr(0))) then - data1@res_gsnRightString = "corr = " + sprintf("%6.3f", corr(0)) + if (.not.ismissing(corr(imod, 0))) then + res@gsnRightString = "corr = " + sprintf("%6.3f", corr(imod, 0)) else - data1@res_gsnRightString = "" + res@gsnRightString = "" end if - if (.not.ismissing(gavg(0))) then - data1@res_gsnLeftString = "mean = " + sprintf("%6.3f", gavg(0)) + if (.not.ismissing(gavg(imod, 0))) then + res@gsnLeftString = "mean = " + sprintf("%6.3f", gavg(imod, 0)) else - data1@res_gsnLeftString = "" + res@gsnLeftString = "" end if if (imod.eq.ref_ind) then ; remove corr. string for reference dataset - data1@res_gsnRightString = "" + res@gsnRightString = "" end if - maps(imod, 0) = contour_map(wks0, data1, var0) + maps(imod, 0) = gsn_csm_contour_map(wks0, data1, res) end if + nframe = nframe + 1 + ; mandatory netcdf output data1@var = var0 + "_mean_" + names(imod) @@ -575,41 +779,66 @@ begin ; Create difference plots (if requested) ; ======================================================================= - if (flag_diff .and. (imod .ne. ref_ind)) then - - diff = data1 - if (flag_rel_diff) then - diff = (diff - ref_data) / ref_data * 100.0 - diff = where(ref_data .le. rel_diff_min, diff@_FillValue, diff) - else - diff = diff - ref_data - end if + if (flag_diff) then - diff@res_gsnLeftString = "" - diff@res_gsnRightString = "" + dres = True - rmsd = rmsd@_FillValue - bias = bias@_FillValue + if (imod .ne. ref_ind) then + diff = data1 + if (flag_rel_diff) then + diff = (diff - ref_data) / ref_data * 100.0 + diff = where(ref_data .le. rel_diff_min, diff@_FillValue, diff) + diff@units = "%" + else + diff = diff - ref_data + end if - if (numseas.gt.1) then - do is = 0, numseas - 1 + dres@gsnLeftString = "" + dres@gsnRightString = "" + dres@gsnCenterString = "" + dres@mpPerimOn = perim ; draw line around map + dres@gsnStringFontHeightF = 0.02 + + dres@tiMainString = names(imod) + " - " + refname + years_str + dres@tiMainFontHeightF = 0.025 + + rmsd(imod, :) = rmsd@_FillValue + bias(imod, :) = bias@_FillValue + + if (numseas.gt.1) then + do is = 0, numseas - 1 + if (.not. flag_rel_diff) then + if (same_grid) then + rmsd(imod, is) = calculate_metric(ref_data(is, :, :), \ + data1(is, :, :), "RMSD") + end if + bias(imod, is) = area_operations(diff(is, :, :), -90., 90., \ + 0., 360., "average", True) + end if + end do + else if (.not. flag_rel_diff) then if (same_grid) then - rmsd(is) = calculate_metric(ref_data(is, :, :), \ - data1(is, :, :), "RMSD") + rmsd(imod, 0) = calculate_metric(ref_data, data1, "RMSD") end if - bias(is) = area_operations(diff(is, :, :), -90., 90., 0., 360., \ - "average", True) + bias(imod, 0) = area_operations(diff, -90., 90., 0., 360., \ + "average", True) end if - end do - else - if (.not. flag_rel_diff) then - if (same_grid) then - rmsd(0) = calculate_metric(ref_data, data1, "RMSD") - end if - bias(0) = area_operations(diff, -90., 90., 0., 360., "average", \ - True) end if + else if (flag_multiobs_unc) then + diff = ref_std + if (.not.isatt(diff, "diag_script")) then + diff@diag_script = (/DIAG_SCRIPT/) + end if + dres@gsnLeftString = "" + dres@gsnRightString = "" + dres@gsnCenterString = "" + dres@tiMainString = refname + " uncertainty" + years_str + rmsd(imod, :) = rmsd@_FillValue + bias(imod, :) = bias@_FillValue + else + continue + end if end if ; ---------------------------------------------------------------------- @@ -618,25 +847,23 @@ begin ; # plot ressources # ; ########################################### - diff@res_gsnLeftStringFontHeightF = min((/0.025, 0.015 * 6.0 \ - / tofloat((dim_MOD + 1) / 2)/)) - diff@res_gsnRightStringFontHeightF = min((/0.025, 0.015 * 6.0 \ - / tofloat((dim_MOD + 1) / 2)/)) + dres@cnFillOn = True ; color plot desired + dres@cnLineLabelsOn = False ; contour lines + dres@cnLinesOn = False - diff@res_tiMainOn = False - - diff@res_cnFillOn = True ; color plot desired - diff@res_cnLineLabelsOn = False ; contour lines - diff@res_cnLinesOn = False + dres@lbTitleString = diff@units + dres@lbTitlePosition = "Bottom" + dres@lbTitleFontHeightF = 0.02 + dres@lbLabelFontHeightF = 0.02 ; colors ; http://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml ; annotation - diff@res_cnLevelSelectionMode = "ExplicitLevels" - diff@res_mpOutlineOn = True - diff@res_mpFillOn = False + dres@cnLevelSelectionMode = "ExplicitLevels" + dres@mpOutlineOn = True + dres@mpFillOn = False ; variable specific plotting settings @@ -644,64 +871,65 @@ begin if (.not.isvar("cnLevels")) then - if (isatt(diff, "res_cnLevels")) then - delete(diff@res_cnLevels) + if (isatt(dres, "cnLevels")) then + delete(dres@cnLevels) end if - if (isatt(diff, "res_cnFillColors")) then - delete(diff@res_cnFillColors) + if (isatt(dres, "cnFillColors")) then + delete(dres@cnFillColors) end if if (isvar("pal")) then delete(pal) end if if (var0.eq."pr") then - diff@res_cnLevels = ispan(-30, 30, 5) * 0.1 + dres@cnLevels = ispan(-30, 30, 5) * 0.1 pal = read_colormap_file("$diag_scripts/shared/plot/rgb/" \ + "ipcc-precip-delta.rgb") - diff@res_cnFillColors = pal - diff@res_lbOrientation = "horizontal" + dres@cnFillColors = pal + dres@lbOrientation = "horizontal" end if if ((var0.eq."tas") .or. (var0.eq."ts")) then pal = read_colormap_file("$diag_scripts/shared/plot/rgb/" \ + "ipcc-tas-delta.rgb") - diff@res_cnFillPalette = pal + dres@cnFillPalette = pal if (var0.eq."ts") then - diff@res_cnLevels = ispan(-5, 5, 1) * 0.5 + dres@cnLevels = ispan(-5, 5, 1) * 0.5 end if end if if (var0.eq."lwp") then - diff@res_cnLevels = ispan(-50, 50, 10) * 0.001 - diff@res_mpOutlineOn = False - diff@res_mpFillOn = True - diff@res_mpLandFillColor = "Black" + dres@cnLevels = ispan(-45, 45, 5) * 0.001 pal = read_colormap_file("$diag_scripts/shared/plot/rgb/qcm3.rgb") - diff@res_cnFillColors = pal + dres@cnFillColors = pal end if if (var0.eq."clt") then - diff@res_cnLevels = fspan(-25, 25, 11) + dres@cnLevels = fspan(-25, 25, 11) end if if (var0.eq."clivi") then - diff@res_cnLevels = ispan(-70, 70, 10) * 0.001 + dres@cnLevels = ispan(-70, 70, 10) * 0.001 end if if (var0.eq."clwvi") then - diff@res_cnLevels = ispan(-50, 50, 10) * 0.001 + dres@cnLevels = ispan(-50, 50, 10) * 0.001 end if if (var0.eq."swcre") then - data1@res_cnLevels = ispan(-30, 30, 5) + dres@cnLevels = ispan(-30, 30, 5) end if if (var0.eq."lwcre") then - data1@res_cnLevels = ispan(-30, 30, 5) + dres@cnLevels = ispan(-30, 30, 5) end if if (var0.eq."netcre") then - data1@res_cnLevels = ispan(-30, 30, 5) + dres@cnLevels = ispan(-30, 30, 5) + end if + + if (var0.eq."prw") then + dres@cnLevels = ispan(-14, 14, 2) end if ; ****************************************************** @@ -709,86 +937,86 @@ begin ; ****************************************************** if (flag_rel_diff) then - if (isatt(diff, "res_cnLevels")) then - delete(diff@res_cnLevels) + if (isatt(dres, "cnLevels")) then + delete(dres@cnLevels) end if - if (isatt(diff, "res_cnFillColors")) then - delete(diff@res_cnFillColors) + if (isatt(dres, "cnFillColors")) then + delete(dres@cnFillColors) end if - diff@res_cnLevels = fspan(-100, 100, 21) + dres@cnLevels = fspan(-100, 100, 21) if (isvar("pal")) then delete(pal) end if pal = read_colormap_file("$diag_scripts/shared/plot/rgb/" \ + "percent100.rgb") - diff@res_cnFillColors = pal + dres@cnFillColors = pal end if ; ****************************************************** - if (.not. isatt(diff, "res_cnLevels")) then + if (.not. isatt(dres, "cnLevels")) then log_info(DIAG_SCRIPT + " (var: " + var0 + "):") log_info("info: using default contour levels") - diff@res_cnLevels = fspan(min(diff), max(diff), 20) + dres@cnLevels = fspan(min(diff), max(diff), 20) end if - cnLevels = diff@res_cnLevels - if (isatt(diff, "res_cnFillColors")) then - cnFillColors = diff@res_cnFillColors + cnLevels = dres@cnLevels + if (isatt(dres, "cnFillColors")) then + cnFillColors = dres@cnFillColors end if else ; use previously defined colors and contour intervals - if (isatt(diff, "res_cnLevels")) then - delete(diff@res_cnLevels) + if (isatt(dres, "cnLevels")) then + delete(dres@cnLevels) end if - if (isatt(diff, "res_cnFillColors")) then - delete(diff@res_cnFillColors) + if (isatt(dres, "cnFillColors")) then + delete(dres@cnFillColors) end if - diff@res_cnLevels = cnLevels + dres@cnLevels = cnLevels if (isvar("cnFillColors")) then - diff@res_cnFillColors = cnFillColors + dres@cnFillColors = cnFillColors end if end if ; if .not.isvar("cnLevels") - if (imod.eq.ref_ind) then - diff@res_lbLabelBarOn = True - else - diff@res_lbLabelBarOn = False - end if +; if (imod.eq.ref_ind) then +; dres@lbLabelBarOn = True +; else +; dres@lbLabelBarOn = False +; end if ; map attributes - diff@res_mpFillDrawOrder = "PostDraw" ; draw map last - diff@res_cnMissingValFillColor = "Gray" + dres@mpFillDrawOrder = "PostDraw" ; draw map last + dres@cnMissingValFillColor = "Gray" ; no tickmarks and no labels - diff@res_tmYLLabelsOn = False - diff@res_tmYLOn = False - diff@res_tmYRLabelsOn = False - diff@res_tmYROn = False - diff@res_tmXBLabelsOn = False - diff@res_tmXBOn = False - diff@res_tmXTLabelsOn = False - diff@res_tmXTOn = False - diff@res_cnInfoLabelOn = False ; turn off cn info label + dres@tmYLLabelsOn = False + dres@tmYLOn = False + dres@tmYRLabelsOn = False + dres@tmYROn = False + dres@tmXBLabelsOn = False + dres@tmXBOn = False + dres@tmXTLabelsOn = False + dres@tmXTOn = False + dres@cnInfoLabelOn = False ; turn off cn info label ; specified in namelist - diff@res_mpProjection = projection + dres@mpProjection = projection ; set explicit contour levels if (isatt(diag_script_info, "explicit_cn_levels")) then - diff@res_cnLevelSelectionMode = "ExplicitLevels" - if (isatt(diff, "res_cnLevels")) then - delete(diff@res_cnLevels) + dres@cnLevelSelectionMode = "ExplicitLevels" + if (isatt(dres, "cnLevels")) then + delete(dres@cnLevels) end if - diff@res_cnLevels = diag_script_info@explicit_cn_levels + dres@cnLevels = diag_script_info@explicit_cn_levels end if ; ########################################### @@ -797,62 +1025,133 @@ begin ; add to diff as attributes without prefix if (isatt(variable_info, "long_name")) then - diff@var_long_name = variable_info@long_name + diff@long_name = variable_info@long_name end if if (isatt(variable_info, "units")) then - diff@var_units = variable_info@units + diff@units = variable_info@units else - diff@var_units = "" + diff@units = "" end if ; ########################################### ; # create the plot # ; ########################################### - diff@res_gsnDraw = False ; do not draw yet - diff@res_gsnFrame = False ; don't advance frame + if (flag_multiobs_unc) then + dres@gsnDraw = False ; do not draw yet + dres@gsnFrame = False ; don't advance frame + end if ; ---------------------------------------------------------------------- if (numseas.gt.1) then do is = 0, numseas - 1 - if (.not.ismissing(rmsd(is))) then - diff@res_gsnRightString = "rmsd = " + sprintf("%6.3f", rmsd(is)) + if (.not.ismissing(rmsd(imod, is))) then + dres@gsnRightString = "rmsd = " + sprintf("%6.3f", rmsd(imod, is)) + else + dres@gsnRightString = "" + end if + if (.not.ismissing(bias(imod, is))) then + dres@gsnLeftString = "bias = " + sprintf("%6.3f", bias(imod, is)) else - diff@res_gsnRightString = "" + dres@gsnLeftString = "" end if - if (.not.ismissing(bias(is))) then - diff@res_gsnLeftString = "bias = " + sprintf("%6.3f", bias(is)) + if (.not.ismissing(corr(imod, is))) then + dres@gsnCenterString = "corr = " + sprintf("%6.3f", corr(imod, is)) else - diff@res_gsnLeftString = "" + dres@gsnCenterString = "" end if if (is.eq.0) then - maps_d(imod, is) = contour_map(wks0d, diff(is, :, :), var0) + maps_d(imod, is) = gsn_csm_contour_map(wks0d, diff(is, :, :), dres) end if if (is.eq.1) then - maps_d(imod, is) = contour_map(wks1d, diff(is, :, :), var0) + maps_d(imod, is) = gsn_csm_contour_map(wks1d, diff(is, :, :), dres) end if if (is.eq.2) then - maps_d(imod, is) = contour_map(wks2d, diff(is, :, :), var0) + maps_d(imod, is) = gsn_csm_contour_map(wks2d, diff(is, :, :), dres) end if if (is.eq.3) then - maps_d(imod, is) = contour_map(wks3d, diff(is, :, :), var0) + maps_d(imod, is) = gsn_csm_contour_map(wks3d, diff(is, :, :), dres) end if end do else - if (.not.ismissing(rmsd(0))) then - diff@res_gsnRightString = "rmsd = " + sprintf("%6.3f", rmsd(0)) + if (.not.ismissing(rmsd(imod, 0))) then + dres@gsnRightString = "rmsd = " + sprintf("%6.3f", rmsd(imod, 0)) else - diff@res_gsnRightString = "" + dres@gsnRightString = "" end if - if (.not.ismissing(bias(0))) then - diff@res_gsnLeftString = "bias = " + sprintf("%6.3f", bias(0)) + if (.not.ismissing(bias(imod, 0))) then + dres@gsnLeftString = "bias = " + sprintf("%6.3f", bias(imod, 0)) else - diff@res_gsnLeftString = "" + dres@gsnLeftString = "" + end if + if (.not.ismissing(corr(imod, 0))) then + dres@gsnCenterString = "corr = " + sprintf("%6.3f", corr(imod, 0)) + else + dres@gsnCenterString = "" end if - maps_d(imod, 0) = contour_map(wks0d, diff, var0) - end if + + maps_d(imod, 0) = gsn_csm_contour_map(wks0d, diff, dres) + + ; obs uncertainty + + if (flag_multiobs_unc) then + xmask = where(abs(diff) .gt. ref_std, 1.0, 0.0) + copy_VarMeta(diff, xmask) + +; if (ii .eq. 0) then +; system("rm debug.nc") +; debugfile = addfile("debug.nc", "c") +; end if +; xm = "xmask" + names(imod) +; debugfile->$xm$ = xmask +; debugfile->obs_std = ref_std +; dn = "diff" + names(imod) +; debugfile->$dn$ = diff + + xres = True + xres@gsnDraw = False ; do not draw yet + xres@gsnFrame = False ; don't advance frame + xres@cnMissingValFillColor = -1 + xres@cnLevelSelectionMode = "ExplicitLevels" + xres@cnLevels = 0.5 + xres@cnFillColors = (/"black", "transparent"/) + xres@cnFillPattern = 17 ; 10 = hatching, 17 = stippling + xres@cnFillOn = True ; color plot desired + xres@cnInfoLabelOn = False + xres@cnLinesOn = False + xres@cnLineLabelsOn = False + xres@lbLabelBarOn = False + xres@gsnRightString = "" + xres@gsnLeftString = "" + xres@gsnCenterString = "" + xres@gsnCenterString = "" + xres@tiYAxisOn = False + xres@tmXBBorderOn = False + xres@tmXTBorderOn = False + xres@tmYLBorderOn = False + xres@tmYRBorderOn = False + xres@tmXBLabelsOn = False + xres@tmYLLabelsOn = False + xres@tmXBOn = False + xres@tmXTOn = False + xres@tmYLOn = False + xres@tmYROn = False + xres@cnConstFEnableFill = True + + if (imod .ne. ref_ind) then + plotmask = gsn_csm_contour(wks0d, xmask, xres) + overlay(maps_d(imod, 0), plotmask) + delete(plotmask) + end if + delete(xmask) + draw(maps_d(imod, 0)) + frame(wks0d) + end if ; if flag_multiobs_unc + end if ; if numseas .gt. 1 + + ndframe = ndframe + 1 ; mandatory netcdf output @@ -870,7 +1169,7 @@ begin tmp_colors = gsn_retrieve_colormap(wks0) cdims = dimsizes(tmp_colors) - nboxes = dimsizes(data1@res_cnLevels) + nboxes = dimsizes(res@cnLevels) clen = cdims(0) stride = max((/1, ((clen(0)-1) - 2) / nboxes /)) fill_colors = ispan(2, clen(0) - 1, stride) @@ -893,8 +1192,7 @@ begin plotind(j) = plottmp(i) j = j + 1 else if (plottmp(i) .lt. dimsizes(projects)) then - if (isStrSubset(str_lower(projects(plottmp(i))), \ - "obs")) then + if (isStrSubset(str_lower(projects(plottmp(i))), "obs")) then plotind(j) = plottmp(i) j = j + 1 end if @@ -913,7 +1211,6 @@ begin pres = True ; needed to override ; panelling defaults - pres@gsnPanelLabelBar = True ; add common colorbar if (panel_labels) then ; print dataset name on each panel pres@gsnPanelFigureStrings = names(plotind) @@ -924,12 +1221,6 @@ begin / tofloat((dim_MOD + 1) / 2)/)) pres@lbAutoManage = False pres@lbTopMarginF = 0.1 - pres@lbTitleOn = True - pres@lbTitleFontHeightF = min((/0.015, 0.01 * 6.0 \ - / tofloat((dim_MOD + 1) / 2)/)) - pres@lbTitlePosition = "Bottom" - pres@lbTitleString = data1@long_name + " (" \ - + data1@units + ")" pres@lbPerimOn = False ; draw line around label ; bar area pres@gsnPanelCenter = False @@ -976,10 +1267,8 @@ begin plotsperline = new((dim_MOD + 1) / 2, integer) plotsperline = 2 - if ((isStrSubset(str_lower(projects(plotind(0))), \ - "obs")).and. \ - .not.(isStrSubset(str_lower(projects(plotind(1))), \ - "obs"))) then + if ((isStrSubset(str_lower(projects(plotind(0))), "obs")).and. \ + .not.(isStrSubset(str_lower(projects(plotind(1))), "obs"))) then plotsperline(0) = 1 end if @@ -1021,10 +1310,19 @@ begin end if end if ; if embracesetup + nframe = nframe + 1 + do is = 0, numseas - 1 log_info("Wrote " + outfile(is)) end do + do is = 0, numseas - 1 + suffix = get_file_suffix(outfile(is), 0) + if (suffix .eq. ".png") then + outfile(is) = suffix@fBase + "." + sprinti("%0.6i", nframe) + suffix + end if + end do + ; ------------------------------------------------------------------------ ; write provenance to netcdf output and plot file(s) (mean) ; ------------------------------------------------------------------------ @@ -1047,8 +1345,8 @@ begin ; ======================================================================== if (flag_diff) then - pres@lbTitleString = "~F33~D~F21~" + diff@long_name + " (" + \ - diff@units + ")" +; pres@lbTitleString = "~F33~D~F21~" + diff@long_name + " (" + \ +; diff@units + ")" ; save default color map in case it is needed later for optionally ; plotting color bar to a separate file @@ -1059,7 +1357,7 @@ begin tmp_colors = gsn_retrieve_colormap(wks0d) cdims = dimsizes(tmp_colors) - nboxes = dimsizes(diff@res_cnLevels) + nboxes = dimsizes(dres@cnLevels) clen = cdims(0) stride = max((/1, ((clen(0)-1) - 2) / nboxes /)) fill_colors = ispan(2, clen(0) - 1, stride) @@ -1123,7 +1421,7 @@ begin (dim_MOD + 3) / 4, 4, pres) pres@txString = season(3) - outfile_d(3) = panelling(wks3, maps_d(plotind, 3), \ + outfile_d(3) = panelling(wks3d, maps_d(plotind, 3), \ (dim_MOD + 3) / 4, 4, pres) else pres@gsnPanelRowSpec = True ; tell panel what order to plt @@ -1184,6 +1482,13 @@ begin end if end if ; end if embracesetup + do is = 0, numseas - 1 + suffix = get_file_suffix(outfile_d(is), 0) + if (suffix .eq. ".png") then + outfile_d(is) = suffix@fBase + "." + sprinti("%0.6i", ndframe) + suffix + end if + end do + do is = 0, numseas - 1 log_info(" Wrote " + outfile(is)) @@ -1209,13 +1514,12 @@ begin log_provenance(nc_outfile_bias, outfile_d(is), caption, statistics, \ domain, plottype, "", "", climofiles) end do - end if ; if flag_diff ; optionally save legend(s) to extra file(s) if (extralegend) then - nboxes = dimsizes(data1@res_cnLevels) + 1 + nboxes = dimsizes(res@cnLevels) + 1 wksleg = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_" + var0 \ + "_legend") pres@lbMonoFillPattern = True @@ -1224,10 +1528,10 @@ begin pres@vpHeightF = 0.1 pres@lbLabelFontHeightF = 0.015 pres@lbLabelAlignment = "InteriorEdges" - pres@lbTitleFontHeightF = 0.015 - pres@lbTitleString = data1@long_name + " (" + data1@units + ")" +; pres@lbTitleFontHeightF = 0.015 +; pres@lbTitleString = data1@long_name + " (" + data1@units + ")" - labels = tostring(data1@res_cnLevels) + labels = tostring(res@cnLevels) ; remove trailing zeros from strings @@ -1245,10 +1549,10 @@ begin end if end do - if (isatt(data1, "res_cnFillColors")) then - pres@lbFillColors = data1@res_cnFillColors - else if (isatt(data1, "res_cnFillPalette")) then - pres@lbFillColors = data1@res_cnFillPalette + if (isatt(res, "cnFillColors")) then + pres@lbFillColors = res@cnFillColors + else if (isatt(res, "cnFillPalette")) then + pres@lbFillColors = res@cnFillPalette else pres@lbFillColors = mean_colors ; default colors end if @@ -1261,11 +1565,11 @@ begin delete(pres@lbFillColors) if (flag_diff) then - nboxes = dimsizes(diff@res_cnLevels) + 1 + nboxes = dimsizes(dres@cnLevels) + 1 wksleg = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_" + var0 \ + "_diff_legend") - labels = tostring(diff@res_cnLevels) + labels = tostring(dres@cnLevels) ; remove trailing zeros from strings @@ -1283,17 +1587,17 @@ begin end if end do - if (flag_rel_diff) then - pres@lbTitleString = "~F33~D~F21~" + data1@long_name + " (%)" - else - pres@lbTitleString = "~F33~D~F21~" + data1@long_name + " (" + \ - data1@units + ")" - end if - - if (isatt(diff, "res_cnFillColors")) then - pres@lbFillColors = diff@res_cnFillColors - else if (isatt(diff, "res_cnFillPalette")) then - pres@lbFillColors = diff@res_cnFillPalette +; if (flag_rel_diff) then +; pres@lbTitleString = "~F33~D~F21~" + data1@long_name + " (%)" +; else +; pres@lbTitleString = "~F33~D~F21~" + data1@long_name + " (" + \ +; data1@units + ")" +; end if + + if (isatt(dres, "cnFillColors")) then + pres@lbFillColors = dres@cnFillColors + else if (isatt(dres, "cnFillPalette")) then + pres@lbFillColors = dres@cnFillPalette else pres@lbFillColors = diff_colors ; default colors end if @@ -1305,6 +1609,123 @@ begin ; ========================================================================== + ; output some statistics to ASCII files + + statLabel = (/ " mean", " stddev", " min", \ + " lowDec", " lowOct", " lowSex", \ + "lowQuart", " lowTri", " median", \ + " hiTri", " hiQuart", " hiSex", " hiOct", " hiDec", \ + " max", " range", " disper", " RMS", \ + " nTot", " nUse", " nMsg", " %Msg" /) + + idxmod = get_mod(names, projects) ; model indices w/o MultiModelMean + + if ((idxmod(0) .ne. -1) .and. (idxobs(0) .ne. -1)) then + + do is = 0, numseas - 1 + + ; *** mean *** + + ofile = work_dir + var0 + "_mean_" + season(is) + filename_add + ".txt" + statmod = stat_dispersion(gavg(idxmod, is), False) + statobs = stat_dispersion(gavg(idxobs, is), False) + + statselect = (/0, 1, 2, 14, 3, 6, 8, 10, 13/) + + write_table(ofile, "w", [/names + " " + tostring(gavg(:, is))/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/"statistics models:"/], "%s") + write_table(ofile, "a", [/names(idxmod)/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/statLabel(statselect) + " " + \ + tostring(statmod(statselect))/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/"statistics observations:"/], "%s") + write_table(ofile, "a", [/names(idxobs)/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/statLabel(statselect) + " " + \ + tostring(statobs(statselect))/], "%s") + + delete(statselect) + + ; *** bias *** + + ofile = work_dir + var0 + "_bias_" + season(is) + filename_add + ".txt" + statmod = stat_dispersion(bias(idxmod, is), False) + statobs = stat_dispersion(bias(idxobs, is), False) + + statselect = (/0, 1, 2, 14, 3, 6, 8, 10, 13/) + + write_table(ofile, "w", [/names + " " + tostring(bias(:, is))/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/"statistics models:"/], "%s") + write_table(ofile, "a", [/names(idxmod)/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/statLabel(statselect) + " " + \ + tostring(statmod(statselect))/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/"statistics observations:"/], "%s") + write_table(ofile, "a", [/names(idxobs)/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/statLabel(statselect) + " " + \ + tostring(statobs(statselect))/], "%s") + + delete(statselect) + + ; *** correlation *** + + ofile = work_dir + var0 + "_corr_" + season(is) + filename_add + ".txt" + statmod = stat_dispersion(corr(idxmod, is), False) + statobs = stat_dispersion(corr(idxobs, is), False) + + statselect = (/2, 14, 3, 6, 8, 10, 13/) + + write_table(ofile, "w", [/names + " " + tostring(corr(:, is))/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/"statistics models:"/], "%s") + write_table(ofile, "a", [/names(idxmod)/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/statLabel(statselect) + " " + \ + tostring(statmod(statselect))/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/"statistics observations:"/], "%s") + write_table(ofile, "a", [/names(idxobs)/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/statLabel(statselect) + " " + \ + tostring(statobs(statselect))/], "%s") + + delete(statselect) + + ; *** rmsd *** + + ofile = work_dir + var0 + "_rmsd_" + season(is) + filename_add + ".txt" + statmod = stat_dispersion(rmsd(idxmod, is), False) + statobs = stat_dispersion(rmsd(idxobs, is), False) + + statselect = (/2, 14, 3, 6, 8, 10, 13/) + + write_table(ofile, "w", [/names + " " + tostring(rmsd(:, is))/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/"statistics models:"/], "%s") + write_table(ofile, "a", [/names(idxmod)/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/statLabel(statselect) + " " + \ + tostring(statmod(statselect))/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/"statistics observations:"/], "%s") + write_table(ofile, "a", [/names(idxobs)/], "%s") + write_table(ofile, "a", [/"--------------------------------"/], "%s") + write_table(ofile, "a", [/statLabel(statselect) + " " + \ + tostring(statobs(statselect))/], "%s") + + delete(statselect) + + end do ; loop over seasons + + end if ; if there are models and observations + + ; ========================================================================== + leave_msg(DIAG_SCRIPT, "") end diff --git a/esmvaltool/diag_scripts/clouds/clouds_bias.ncl b/esmvaltool/diag_scripts/clouds/clouds_bias.ncl index db8435aaea..5eeaaaded9 100644 --- a/esmvaltool/diag_scripts/clouds/clouds_bias.ncl +++ b/esmvaltool/diag_scripts/clouds/clouds_bias.ncl @@ -4,7 +4,7 @@ ; PROJECT-NAME EMBRACE ; ############################################################################ ; Description -; Calculates the multi-model mean bias, absolute difference and relative +; Calculates the (multi-model mean) bias, absolute difference and relative ; difference of annual mean 2-d cloud variables compared with a ; reference dataset (observations). ; @@ -28,6 +28,7 @@ ; none ; ; Modification history +; 20230118-lauer_axel: added support to plot just 1 model ; 20211006-lauer_axel: removed write_plots ; 20190222-lauer_axel: added output of provenance (v2.0) ; 20181119-lauer_axel: adapted code to multi-variable capable framework @@ -126,7 +127,15 @@ begin mm_ind = ind(names .eq. "MultiModelMean") if (ismissing(mm_ind)) then - error_msg("f", DIAG_SCRIPT, "", "multi-model mean is missing (required)") + mod_ind = ind(names .ne. ref_ind) + if (all(ismissing(mod_ind))) then + error_msg("f", DIAG_SCRIPT, "", "no dataset besides reference " \ + + "dataset found. Cannot continue.") + end if + mm_ind = mod_ind(0) + log_info("multi-model mean is missing, using first dataset (" \ + + names(mm_ind) + ") instead") + delete(mod_ind) end if ; basename of diag_script @@ -233,7 +242,7 @@ begin diff@res_tiMainFontHeightF = 0.016 - diff@res_tiMainString = "Multi Model Mean Bias" + diff@res_tiMainString = names(mm_ind) + " Bias" copy_VarMeta(diff, mmdata) delete(mmdata@res_cnLevels) @@ -272,7 +281,7 @@ begin end if end if - mmdata@res_tiMainString = "Multi Model Mean" + mmdata@res_tiMainString = names(mm_ind) plotsperline = (/2, 0/) plotind = (/0, 1/) ; mmm and mean bias are always plotted @@ -298,7 +307,7 @@ begin absdiff@res_cnLevels = tmp(1:dimsizes(tmp)-1) delete(tmp) - absdiff@res_tiMainString = "Multi Model Mean of Absolute Error" + absdiff@res_tiMainString = names(mm_ind) + " Absolute Error" iadd = 2 itmp = array_append_record(plotind, iadd, 0) @@ -319,7 +328,7 @@ begin copy_VarMeta(diff, reldiff) delete(reldiff@res_cnLevels) reldiff@res_cnLevels = fspan(-90.0, 90.0, 13) - reldiff@res_tiMainString = "Multi Model Mean of Relative Error" + reldiff@res_tiMainString = names(mm_ind) + " Relative Error" reldiff@units = "%" reldiff@res_lbTitleString = "(" + reldiff@units + ")" if (isvar("pal4")) then @@ -384,8 +393,8 @@ begin ; add meta data to plot (for reporting) - caption = "Multi model values, from top left to bottom right: " \ - + "mean, bias" + caption = names(mm_ind) + " values, from top left to bottom right: " \ + + "mean, bias" if (plot_abs_diff) then caption = caption + ", absolute error" end if @@ -403,22 +412,22 @@ begin nc_filename@existing = "append" mmdata@var = var0 + "_mean" - mmdata@long_name = var0 + " (multi-model mean)" + mmdata@long_name = var0 + " " + names(mm_ind) + " (mean)" nc_outfile = ncdf_write(mmdata, nc_filename) diff@var = var0 + "_bias" - diff@long_name = var0 + " (multi-model bias)" + diff@long_name = var0 + " " + names(mm_ind) + " (bias)" nc_outfile = ncdf_write(diff, nc_filename) if (isvar("absdiff")) then absdiff@var = var0 + "_abs_bias" - absdiff@long_name = var0 + " (multi-model absolute bias)" + absdiff@long_name = var0 + " " + names(mm_ind) + " (absolute bias)" nc_outfile = ncdf_write(absdiff, nc_filename) end if if (isvar("reldiff")) then reldiff@var = var0 + "_rel_bias" - reldiff@long_name = var0 + " (multi-model relative bias)" + reldiff@long_name = var0 + " " + names(mm_ind) + " (relative bias)" reldiff@units = reldiff@units nc_outfile = ncdf_write(reldiff, nc_filename) end if diff --git a/esmvaltool/diag_scripts/clouds/clouds_dyn_matrix.ncl b/esmvaltool/diag_scripts/clouds/clouds_dyn_matrix.ncl new file mode 100644 index 0000000000..9fcfadebbb --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_dyn_matrix.ncl @@ -0,0 +1,846 @@ +; CLOUDS_DYN_MATRIX +; ############################################################################ +; Author: Axel Lauer (DLR, Germany) +; ############################################################################ +; Description +; Calculates mean values of variable z per bin of variable x and y. +; The results are displayed as a matrix. +; +; Required diag_script_info attributes (diagnostic specific) +; var_x: short name of variable on x-axis +; var_y: short name of variable on y-axis +; var_z: short name of variable to be binned +; xmin: min x value for generating x bins +; xmax: max x value for generating x bins +; ymin: min y value for generating y bins +; ymax: max y value for generating y bins +; +; Optional diag_script_info attributes (diagnostic specific) +; clevels: explicit values for probability labelbar (array) +; filename_add: optionally add this string to plot filesnames +; nbins: number of equally spaced bins (var_x), default = 100 +; sidepanels: show/hide side panels +; xlabel: label overriding variable name for x-axis (e.g. SST) +; ylabel: label overriding variable name for y-axis (e.g. omega500) +; zdmin: min z value for labelbar (difference plots) +; zdmax: max z value for labelbar (difference plots) +; zmin: min z value for labelbar +; zmax: max z value for labelbar +; +; Required variable attributes (variable specific) +; none +; +; Optional variable_info attributes (variable specific) +; reference_dataset: reference dataset +; +; Caveats +; none +; +; Modification history +; 20230117-lauer_axel: added support for ICON (code from Manuel) +; 20220126-lauer_axel: added optional variable labels for x- and y-axes +; 20211118-lauer_axel: added output of frequency distributions +; 20210607-lauer_axel: added multi-model-average (= average over all models) +; as an individual plot +; 20210408-lauer_axel: written +; +; ############################################################################ + +load "$diag_scripts/../interface_scripts/interface.ncl" + +load "$diag_scripts/shared/plot/aux_plotting.ncl" +load "$diag_scripts/shared/statistics.ncl" +load "$diag_scripts/shared/plot/style.ncl" +load "$diag_scripts/shared/dataset_selection.ncl" + +begin + + enter_msg(DIAG_SCRIPT, "") + + diag = "clouds_dyn_matrix.ncl" + variables = get_unique_values(metadata_att_as_array(variable_info, \ + "short_name")) + + ; Check required diag_script_info attributes + exit_if_missing_atts(diag_script_info, (/"var_x", "var_y", "var_z", \ + "xmin", "xmax", "ymin", "ymax"/)) + + file_type = output_type() + + ; make sure required variables are available + var_x = diag_script_info@var_x + var_y = diag_script_info@var_y + var_z = diag_script_info@var_z + + ; special case: columnicefrac = clivi / (clivi + lwp) + ; note: clwvi is not used since it contains lwp only for some models + ; (by error) + + calcicefrac = new(3, logical) + calctcwp = new(3, logical) + calcswclt = new(3, logical) + calclwclt = new(3, logical) + + calcicefrac = False + calctcwp = False + calcswclt = False + calclwclt = False + + ; if present, replace special variables "columnicefrac" and "totalcwp" in + ; list with variables used for variable derivation + + tmplist = (/var_x, var_y, var_z/) + checklist = (/"columnicefrac", "totalcwp", "swcreclt", "lwcreclt"/) + substlist = (/(/"clivi", "lwp"/), (/"clivi", "lwp"/), (/"swcre", "clt"/), \ + (/"lwcre", "clt"/)/) + varstart = new(3, integer) + varstart(0) = 0 + + do i = 0, dimsizes(tmplist) - 1 + if (i .eq. 0) then + if (any(checklist .eq. tmplist(i))) then + j = ind(checklist .eq. tmplist(i)) + varlist = substlist(j, :) + varstart(1) = 2 + else + varlist = tmplist(i) + varstart(1) = 1 + end if + else + if (any(checklist .eq. tmplist(i))) then + j = ind(checklist .eq. tmplist(i)) + varlist := array_append_record(varlist, substlist(j, :), 0) + if (i .lt. dimsizes(tmplist) - 1) then + varstart(i + 1) = varstart(i) + 2 + end if + else + varlist := array_append_record(varlist, tmplist(i), 0) + if (i .lt. dimsizes(tmplist) - 1) then + varstart(i + 1) = varstart(i) + 1 + end if + end if + end if + end do + + do i = 0, dimsizes(tmplist) - 1 + if (tmplist(i) .eq. checklist(0)) then + calcicefrac(i) = True + else if (tmplist(i) .eq. checklist(1)) then + calctcwp(i) = True + else if (tmplist(i) .eq. checklist(2)) then + calcswclt(i) = True + else if (tmplist(i) .eq. checklist(3)) then + calclwclt(i) = True + end if + end if + end if + end if + end do + + idx = new(dimsizes(varlist), integer) + + nVAR = dimsizes(varlist) + refname = new(nVAR, string) + + do i = 0, nVAR - 1 + idx(i) = ind(variables .eq. varlist(i)) + end do + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT + " (var: " + variables(idx) + ")") + log_info("++++++++++++++++++++++++++++++++++++++++++") + + if (any(ismissing(idx))) then + errstr = "diagnostic " + diag + " requires the following variable(s): " \ + + str_join(varlist, ", ") + error_msg("f", DIAG_SCRIPT, "", errstr) + end if + + ; save input files for writing provenance + + infiles = metadata_att_as_array(input_file_info, "filename") + + ; get reference datasets (if present) and check that number of datasets + ; is equal for each variable + + do i = 0, nVAR - 1 + var = variables(idx(i)) + var_info = select_metadata_by_name(variable_info, var) + var_info := var_info[0] + if (isatt(var_info, "reference_dataset")) then + refname(i) = var_info@reference_dataset + end if + info = select_metadata_by_name(input_file_info, var) + if (i .eq. 0) then + dim_MOD = ListCount(info) + else + dim_test = ListCount(info) + if (dim_test .ne. dim_MOD) then + error_msg("f", DIAG_SCRIPT, "", "number of datasets for variable " \ + + var + " does not match number of datasets for " \ + + variables(idx(0))) + end if + end if + delete(info) + delete(var) + delete(var_info) + end do + + ; Set default values for non-required diag_script_info attributes + + set_default_att(diag_script_info, "filename_add", "") + set_default_att(diag_script_info, "nbins", 100) + set_default_att(diag_script_info, "sidepanels", False) + set_default_att(diag_script_info, "xlabel", var_x) + set_default_att(diag_script_info, "ylabel", var_y) + + if (diag_script_info@filename_add .ne. "") then + filename_add = "_" + diag_script_info@filename_add + else + filename_add = "" + end if + + if (diag_script_info@sidepanels) then + flag_sidepanels = True + else + flag_sidepanels = False + end if + + nbins = toint(diag_script_info@nbins) + + ; make sure path for (mandatory) netcdf output exists + + work_dir = config_user_info@work_dir + ; Create work dir + system("mkdir -p " + work_dir) + +end + +begin + ; ############ + ; # get data # + ; ############ + + info_x = select_metadata_by_name(input_file_info, varlist(varstart(0))) + names_x = metadata_att_as_array(info_x, "dataset") + projects_x = metadata_att_as_array(info_x, "project") + info_y = select_metadata_by_name(input_file_info, varlist(varstart(1))) + names_y = metadata_att_as_array(info_y, "dataset") + projects_y = metadata_att_as_array(info_y, "project") + info_z = select_metadata_by_name(input_file_info, varlist(varstart(2))) + names_z = metadata_att_as_array(info_z, "dataset") + projects_z = metadata_att_as_array(info_z, "project") + + refidx_x = ind(names_x .eq. refname(varstart(0))) + refidx_y = ind(names_y .eq. refname(varstart(1))) + refidx_z = ind(names_z .eq. refname(varstart(2))) + + if (ismissing(refidx_x) .or. ismissing(refidx_y) .or. ismissing(refidx_z)) \ + then + refidx_x = -1 + refidx_y = -1 + refidx_z = -1 + end if + + ref_ind = refidx_x + names = names_x + projects = projects_x + + if (ref_ind .ge. 0) then + ; if reference datasets for var_x, var_y, var_z are from different + ; sources + uninames = get_unique_values(refname) + names(ref_ind) = str_join(uninames, "/") + delete(uninames) + end if + + ; find all indices of models w/o MultiModelMean/MultiModelMedian (if present) + + idxmod = get_mod(names_x, projects_x) + + if (idxmod(0) .eq. -1) then ; no model found + flag_multimod = False + elseif (dimsizes(idxmod) .eq. 1) then ; one model found + flag_multimod = False + else ; more than one model found + flag_multimod = True + end if + + result = new((/dim_MOD, nbins, nbins/), float) + count = new((/dim_MOD, nbins, nbins/), float) + bincenter_x = new((/nbins/), float) + bincenter_y = new((/nbins/), float) + bin_x0 = new((/nbins/), float) + bin_x1 = new((/nbins/), float) + bin_y0 = new((/nbins/), float) + bin_y1 = new((/nbins/), float) + + xmax = diag_script_info@xmax + xmin = diag_script_info@xmin + ymax = diag_script_info@ymax + ymin = diag_script_info@ymin + binsize_x = tofloat(xmax - xmin) / nbins + binsize_y = tofloat(ymax - ymin) / nbins + + do n = 0, nbins - 1 + x0 = n * binsize_x + x1 = x0 + binsize_x + bincenter_x(n) = xmin + 0.5 * (x0 + x1) + bin_x0(n) = bincenter_x(n) - 0.5 * binsize_x + bin_x1(n) = bincenter_x(n) + 0.5 * binsize_x + y0 = n * binsize_y + y1 = y0 + binsize_y + bincenter_y(n) = ymin + 0.5 * (y0 + y1) + bin_y0(n) = bincenter_y(n) - 0.5 * binsize_y + bin_y1(n) = bincenter_y(n) + 0.5 * binsize_y + end do + + atts_x = True + atts_y = True + atts_z = True + + do ii = 0, dim_MOD - 1 + atts_x@short_name = varlist(varstart(0)) + atts_y@short_name = varlist(varstart(1)) + atts_z@short_name = varlist(varstart(2)) + + ; reference datasets may have different names + if (ii .eq. refidx_x) then + atts_x@dataset = refname(varstart(0)) + atts_y@dataset = refname(varstart(1)) + atts_z@dataset = refname(varstart(2)) + else ; all other datasets: force same dataset name for var_x, var_y, var_z + atts_x@dataset = names_x(ii) + atts_y@dataset = names_x(ii) + atts_z@dataset = names_x(ii) + end if + + ; read var_x + + info = select_metadata_by_atts(input_file_info, atts_x) + x = read_data(info[0]) + delete(info) + + ; read var_y + + info = select_metadata_by_atts(input_file_info, atts_y) + y = read_data(info[0]) + delete(info) + + ; read var_z + + info = select_metadata_by_atts(input_file_info, atts_z) + z = read_data(info[0]) + delete(info) + + atts_list = NewList("fifo") + + ListAppend(atts_list, atts_x) + ListAppend(atts_list, atts_y) + ListAppend(atts_list, atts_z) + + vars_list = NewList("fifo") + + ListAppend(vars_list, x) + ListAppend(vars_list, y) + ListAppend(vars_list, z) + + do i = 0, 2 + ; read second variable needed to derive icefrac/tcwp/swcreclt/lwcreclt + if (calcicefrac(i) .or. calctcwp(i) .or. calcswclt(i) .or. \ + calclwclt(i)) then + atts_list[i]@short_name = varlist(varstart(i) + 1) + if (ii .eq. refidx_x) then + atts_list[i]@dataset = refname(varstart(i) + 1) + end if + info = select_metadata_by_atts(input_file_info, atts_list[i]) + var2 = read_data(info[0]) + delete(info) + var2 = where(isnan_ieee(var2), var2@_FillValue, var2) + end if + + ; calculate column ice fraction + + if (calcicefrac(i)) then + min_mass = 1.0e-6 + ; filter invalid values (needed for some models) + vars_list[i] = where(vars_list[i] .lt. 0.0, vars_list[i]@_FillValue, \ + vars_list[i]) + vars_list[i] = where(isnan_ieee(vars_list[i]), \ + vars_list[i]@_FillValue, vars_list[i]) + var2 = where(var2 .lt. 0.0, var2@_FillValue, var2) + mass = vars_list[i] + var2 + mass = where(mass .lt. min_mass, mass@_FillValue, mass) + + ; ice fraction = ice / (ice + lwp) * 100% + vars_list[i] = 100.0 * vars_list[i] / mass + delete(mass) + + vars_list[i]@units = "%" + vars_list[i]@long_name = "cloud ice fraction" + vars_list[i]@var = "columnicefrac" + end if + + ; calculate total cloud water path as sum of liquid water path (lwp) + ; and ice water path (clivi); + ; we do not use the CMOR variable clwvi directly as this variable + ; erroneously contains only cloud liquid water for some models + + if (calctcwp(i)) then + vars_list[i] = vars_list[i] + var2 + vars_list[i]@long_name = "Condensed Water Path" + vars_list[i]@var = "totalcwp" + end if + + ; calculate swcre divided by cloud fraction + + if (calcswclt(i)) then + var2 = where(var2 .le. 1.0e-6, var2@_FillValue, var2) + vars_list[i] = vars_list[i] / var2 * 100.0 + vars_list[i]@long_name = \ + "Shortwave cloud radiative effect / cloud cover" + vars_list[i]@var = "swcreclt" + end if + + ; calculate swcre divided by cloud fraction + + if (calclwclt(i)) then + var2 = where(var2 .le. 1.0e-6, var2@_FillValue, var2) + vars_list[i] = vars_list[i] / var2 * 100.0 + vars_list[i]@long_name = \ + "Longwave cloud radiative effect / cloud cover" + vars_list[i]@var = "lwcreclt" + end if + + if (isvar("var2")) then + delete(var2) + end if + end do + + delete(atts_list) + + ; check dimensions + + dims_x = dimsizes(x) + dims_y = dimsizes(y) + dims_z = dimsizes(z) + + dimerror = False + + if (dimsizes(dims_x) .eq. dimsizes(dims_y)) then + if (any(dims_x - dims_y .ne. 0)) then + dimerror = True + end if + else + dimerror = True + end if + + if (dimsizes(dims_x) .eq. dimsizes(dims_z)) then + if (any(dims_x - dims_z .ne. 0)) then + dimerror = True + end if + else + dimerror = True + end if + + if (dimerror) then + error_msg("f", DIAG_SCRIPT, "", "dimensions of datasets " \ + + atts_x@dataset + " (variable " + var_x + ") and " \ + + atts_y@dataset + " (variable " + var_y + ") and " \ + + atts_z@dataset + " (variable " + var_z + ") do not match.") + end if + + ; check dimensions + + if ((dimsizes(dims_x) .ne. dimsizes(dims_y)) .or. \ + (dimsizes(dims_x) .lt. 3) .or. (dimsizes(dims_x) .gt. 4)) then + dimerror = True + end if + + if ((dimsizes(dims_y) .ne. dimsizes(dims_z)) .or. \ + (dimsizes(dims_y) .lt. 3) .or. (dimsizes(dims_y) .gt. 4)) then + dimerror = True + end if + + if (dimerror) then + error_msg("f", DIAG_SCRIPT, "", "all variables need to have the " + \ + "same number of dimensions (time, [optional: level], " + \ + "latitude, longitude)") + end if + + do i = 0, 2 + dims = getvardims(vars_list[i]) + testidx = ind(dims .eq. "lon") + if (ismissing(testidx)) then + error_msg("f", DIAG_SCRIPT, "", var + ": no lon dimension") + end if + testidx = ind(dims .eq. "lat") + if (ismissing(testidx)) then + error_msg("f", DIAG_SCRIPT, "", var + ": no lat dimension") + end if + testidx = ind(dims .eq. "time") + if (ismissing(testidx)) then + error_msg("f", DIAG_SCRIPT, "", var + ": no time dimension") + end if + delete(dims) + end do + + delete(vars_list) + + delete(dims_x) + delete(dims_y) + delete(dims_z) + delete(testidx) + + ; save attributes long_name and units + long_name = z@long_name + xunits = x@units + yunits = y@units + zunits = z@units + + x1d = ndtooned(x) + delete(x) + y1d = ndtooned(y) + delete(y) + z1d = ndtooned(z) + delete(z) + + ; This approach to grid the data is significantly slower than + ; using "bin_avg" but still fine for moderate grids (e.g. 100x100 grid + ; cells). In NCL 6.6.2, the function bin_avg crashes after being + ; called several times (segmentation violation). This is the reason + ; for choosing this "manual" approach. + + do n = 0, nbins - 1 + selidx = ind((x1d .ge. bin_x0(n)) .and. (x1d .lt. bin_x1(n))) + if (all(ismissing(selidx))) then + delete(selidx) + result(ii, :, n) = result@_FillValue + count(ii, :, n) = count@_FillValue + continue + end if + xsel = x1d(selidx) + ysel = y1d(selidx) + zsel = z1d(selidx) + delete(selidx) + do m = 0, nbins - 1 + selidx = ind((ysel .ge. bin_y0(m)) .and. (ysel .lt. bin_y1(m))) + if (.not.all(ismissing(selidx))) then + result(ii, m, n) = avg(zsel(selidx)) + count(ii, m, n) = num(.not.ismissing(zsel(selidx))) + else + result(ii, m, n) = result@_FillValue + count(ii, m, n) = count@_FillValue + end if + delete(selidx) + end do + delete(xsel) + delete(ysel) + delete(zsel) + end do + +; r = bin_avg(x1d, y1d, z1d, bincenter_x, bincenter_y, False) +; result(ii, :, :) = r(0, :, :) + + delete(x1d) + delete(y1d) + delete(z1d) +; delete(r) + + count(ii, :, :) = count(ii, :, :) / sum(count(ii, :, :)) * 1.0e2 + + end do ; ii-loop (models) + + ; ########################################### + ; # netCDF output # + ; ########################################### + + nc_filename = work_dir + "clouds_scatter_" + var_x + "_" + var_y + "_" + \ + var_z + filename_add + ".nc" + nc_filename2 = work_dir + "clouds_scatter_prob_" + var_x + "_" + var_y + \ + filename_add + ".nc" + + result!0 = "model" + result!1 = "bin_y" + result!2 = "bin_x" + + result&model = str_sub_str(names, "/", "-") + result&bin_y = bincenter_y + result&bin_x = bincenter_x + + result@diag_script = (/DIAG_SCRIPT/) + result@var = var_z + result@var_long_name = long_name + result@var_units = zunits + result@_FillValue = 1.0e20 + + copy_VarCoords(result, count) + count@diag_script = (/DIAG_SCRIPT/) + count@var = "count" + count@var_units = "1e-3 %" + + nc_outfile = ncdf_write(result, nc_filename) + nc_outfile2 = ncdf_write(count, nc_filename2) + + ; ########################################### + ; # create the plots # + ; ########################################### + + nplots = dim_MOD + if (flag_multimod) then + nplots = nplots + 1 + end if + + plots = new((/nplots, 2/), graphic) + baseplots = new(nplots, graphic) + xaddplots = new(nplots, graphic) + yaddplots = new(nplots, graphic) + + dplots = new(nplots, graphic) + + plots_c = new((/nplots, 2/), graphic) + baseplots_c = new(nplots, graphic) + xaddplots_c = new(nplots, graphic) + yaddplots_c = new(nplots, graphic) + + res = True + res@cnFillOn = True ; color Fill + res@cnFillMode = "RasterFill" ; Raster Mode + res@cnLinesOn = False ; Turn off contour lines + res@tiXAxisString = diag_script_info@xlabel + " (" + xunits + ")" + res@tiYAxisString = diag_script_info@ylabel + " (" + yunits + ")" + res@lbOrientation = "Vertical" + res@lbTitleString = zunits + res@lbTitlePosition = "Right" + res@lbTitleFontHeightF = 0.0275 + res@lbLabelFontHeightF = 0.0275 + res@tmXMajorGrid = True + res@tmXMinorGrid = True + res@tmYMajorGrid = True + res@tmYMinorGrid = True + + dres = res + + if (flag_sidepanels) then + res@pmLabelBarOrthogonalPosF = 0.35 + end if + + cres = res + cres@lbTitleString = count@var_units + + if (isatt(diag_script_info, "zmin") .and. isatt(diag_script_info, "zmax")) \ + then + res@cnLevelSelectionMode = "ExplicitLevels" + res@cnLevels = fspan(diag_script_info@zmin, diag_script_info@zmax, 19) + end if + + if (isatt(diag_script_info, "zdmin") .and. \ + isatt(diag_script_info, "zdmax")) then + dres@cnLevelSelectionMode = "ExplicitLevels" + dres@cnLevels = fspan(diag_script_info@zdmin, diag_script_info@zdmax, 19) + end if + + if (isatt(diag_script_info, "clevels")) then + cres@cnLevelSelectionMode = "ExplicitLevels" + cres@cnLevels = diag_script_info@clevels + end if + + wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_dyn_matrix_" + \ + var_x + "_" + var_y + "_" + var_z + filename_add) + dwks = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_dyn_matrix_bias_" + \ + var_x + "_" + var_y + "_" + var_z + filename_add) + cwks = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_dyn_matrix_prob_" + \ + var_x + "_" + var_y + filename_add) + + res@gsnDraw = False ; don't draw yet + res@gsnFrame = False ; don't advance frame yet + + cres@gsnDraw = False ; don't draw yet + cres@gsnFrame = False ; don't advance frame yet + + xyres1 = True ; xy plot mods desired + xyres1@tmXBMinorOn = False ; no minor tickmarks + xyres1@tmXBLabelStride = 2 ; label stride + xyres1@gsnDraw = False ; don't draw yet + xyres1@gsnFrame = False ; don't advance frame yet + xyres1@xyLineThicknessF = 2.0 + xyres1@tmEqualizeXYSizes = True + xyres1@tmXBLabelFontHeightF = 0.0275 + + xyres2 = xyres1 + + xyres1@vpHeightF = .20 ; set width of second plot + xyres1@trXMinF = xmin + xyres1@trXMaxF = xmax + xyres1@tiXAxisString = diag_script_info@xlabel + " (" + xunits + ")" + + xyres2@vpWidthF = .20 ; set width of second plot + xyres2@trYMinF = ymin + xyres2@trYMaxF = ymax + xyres2@tiXAxisSide = "Top" + xyres2@tmXTLabelsOn = True + xyres2@tmXBLabelsOn = False + + nframe = 0 + + do ii = 0, nplots - 1 + if (ii .lt. dim_MOD) then + plotdata = result(ii, :, :) + countdata = count(ii, :, :) + plotname = names(ii) + else + plotdata = dim_avg_n_Wrap(result(idxmod, :, :), 0) + countdata = dim_avg_n_Wrap(count(idxmod, :, :), 0) + plotname = "Multi-model average" + end if + + countdata = countdata * 1.0e3 + + res@tiMainString = plotname + res@tiMainFontHeightF = 0.03 + + if (ii .eq. ref_ind) then + if (refname(varstart(0)) .eq. refname(varstart(1))) then + plotname = refname(varstart(0)) + else + plotname = refname(varstart(0)) + "/" + refname(varstart(1)) + end if + end if + + cres@tiMainString = plotname + + ; z-values + + baseplots(ii) = gsn_csm_contour(wks, plotdata, res) + + if (flag_sidepanels) then + xyres1@tiYAxisString = zunits + xyres2@tiXAxisString = zunits + + xaddplots(ii) = gsn_csm_xy(wks, result&bin_x, \ + dim_avg_n(plotdata, 0), xyres1) + yaddplots(ii) = gsn_csm_xy(wks, dim_avg_n(plotdata, 1), \ + result&bin_y, xyres2) + xyres1@gsnAttachPlotsXAxis = True + plots(ii, 0) = gsn_attach_plots(baseplots(ii), xaddplots(ii), \ + res, xyres1) + delete(xyres1@gsnAttachPlotsXAxis) + plots(ii, 1) = gsn_attach_plots(baseplots(ii), yaddplots(ii), \ + res, xyres2) + end if + + draw(baseplots(ii)) + frame(wks) + + ; differences z-values + + if (isdefined("dresplot")) then + delete(dresplot) + end if + if (ii .eq. ref_ind) then + dresplot = res + dresplot@tiMainString = "REF" + diff = plotdata + else + dresplot = dres + dresplot@tiMainString = plotname + " - REF" + diff = plotdata - result(ref_ind, :, :) + end if + copy_VarCoords(plotdata, diff) + dplots(ii) = gsn_csm_contour(dwks, diff, dresplot) + + ; probability values (%) + + xyres1@tiYAxisString = count@var_units + xyres2@tiXAxisString = count@var_units + + baseplots_c(ii) = gsn_csm_contour(cwks, countdata, cres) + + if (flag_sidepanels) then + xaddplots_c(ii) = gsn_csm_xy(cwks, count&bin_x, \ + dim_avg_n(countdata, 0), xyres1) + yaddplots_c(ii) = gsn_csm_xy(cwks, dim_avg_n(countdata, 1), \ + count&bin_y, xyres2) + + xyres1@gsnAttachPlotsXAxis = True + plots_c(ii, 0) = gsn_attach_plots(baseplots_c(ii), \ + xaddplots_c(ii), cres, xyres1) + delete(xyres1@gsnAttachPlotsXAxis) + plots_c(ii, 1) = gsn_attach_plots(baseplots_c(ii), \ + yaddplots_c(ii), cres, xyres2) + end if + + draw(baseplots_c(ii)) + frame(cwks) + + delete(plotdata) + delete(countdata) + + nframe = nframe + 1 + end do + +; pres = True ; needed to override +; ; panelling defaults +; pres@gsnPanelCenter = False +; +; pres@gsnPanelFigureStrings = names +; pres@gsnPanelFigureStringsFontHeightF = min((/0.008, 0.008 * 6.0 \ +; / tofloat((dim_MOD + 1) / 2)/)) +; pres@lbLabelFontHeightF = min((/0.01, 0.01 * 6.0 \ +; / tofloat((dim_MOD + 1) / 2)/)) +; outfile = panelling(wks, baseplots, (dim_MOD + 3) / 4, 4, pres) +; doutfile = panelling(dwks, dplots, (dim_MOD + 3) / 4, 4, pres) + + outfile = wks@fullname + doutfile = dwks@fullname + coutfile = cwks@fullname + + log_info("Wrote " + outfile) + log_info("Wrote " + doutfile) + log_info("Wrote " + coutfile) + + suffix = get_file_suffix(outfile, 0) + if (suffix .eq. ".png") then + outfile = suffix@fBase + "." + sprinti("%0.6i", nframe) + suffix + end if + + ; ========================================================================== + + ; ---------------------------------------------------------------------- + ; write provenance to netcdf output (and plot file) + ; ---------------------------------------------------------------------- + + statistics = (/"clim", "mean"/) + domain = "reg" + plottype = "scatter" + caption = "Scatterplot of " + var_x + " (x) vs. " + var_y + " (y)." + log_provenance(nc_outfile, outfile, caption, statistics, \ + domain, plottype, "", "", infiles) + + ; ---------------------------------------------------------------------- + ; write relative differences of the probabilities (count) to netcdf + ; ---------------------------------------------------------------------- + + ref = where(count(ref_ind, :, :) .gt. 1.0e-3, count(ref_ind, :, :), \ + count@_FillValue) + if (dimsizes(idxmod) .gt. 1) then + modavg = dim_avg_n_Wrap(count(idxmod, :, :), 0) + else + modavg = count(idxmod, :, :) + end if + modavg = where(modavg .gt. 1.0e-3, modavg, modavg@_FillValue) + + diff = modavg + diff = (diff - ref) / ref * 100.0 + + nc_filename3 = work_dir + "clouds_scatter_prob_" + var_x + "_" + var_y + \ + "_mmm-ref-reldiff" + filename_add + ".nc" + + diff@var_long_name = "(count(MMM) - count(REF)) / count(REF) * 100%" + diff@var_units = "%" + + nc_outfile3 = ncdf_write(diff, nc_filename3) + + leave_msg(DIAG_SCRIPT, "") + +end diff --git a/esmvaltool/diag_scripts/clouds/clouds_interannual.ncl b/esmvaltool/diag_scripts/clouds/clouds_interannual.ncl index 9c9a7fd30e..e27984a822 100644 --- a/esmvaltool/diag_scripts/clouds/clouds_interannual.ncl +++ b/esmvaltool/diag_scripts/clouds/clouds_interannual.ncl @@ -13,10 +13,12 @@ ; ; Optional diag_script_info attributes (diagnostic specific) ; colormap: e.g., WhiteBlueGreenYellowRed, rainbow +; epsilon: "epsilon" value to be replaced with missing values ; explicit_cn_levels: use these contour levels for plotting -; extrafiles: write plots for individual models to separate files -; (True, False) +; filename_add: optionally add this string to plot filesnames ; projection: map projection, e.g., Mollweide, Mercator +; var: short_name of variable to process (default = "" - use +; first variable in variable list) ; ; Required variable_info attributes (variable specific) ; none @@ -29,7 +31,12 @@ ; none ; ; Modification history +; 20230117-lauer_axel: added support for ICON (code from Manuel) ; 20211006-lauer_axel: removed write_plots +; 20210413-lauer_axel: added multi-obs mean and average over all models +; as individual plots +; 20210407-lauer_axel: added option to speficfy variable if more than one +; variable is present ; 20190220-lauer_axel: added provenance to output (v2.0) ; 20181120-lauer_axel: adapted code to multi-variable capable framework ; 20180923-lauer_axel: added writing of results to netcdf @@ -55,29 +62,46 @@ load "$diag_scripts/shared/plot/aux_plotting.ncl" load "$diag_scripts/shared/statistics.ncl" load "$diag_scripts/shared/plot/style.ncl" load "$diag_scripts/shared/plot/contour_maps.ncl" +load "$diag_scripts/shared/dataset_selection.ncl" begin enter_msg(DIAG_SCRIPT, "") - var0 = variable_info[0]@short_name + set_default_att(diag_script_info, "colormap", "WhiteBlueGreenYellowRed") + set_default_att(diag_script_info, "epsilon", 1.0e-4) + set_default_att(diag_script_info, "filename_add", "") + set_default_att(diag_script_info, "projection", "CylindricalEquidistant") + set_default_att(diag_script_info, "var", "") + + if (diag_script_info@var .eq. "") then + var0 = variable_info[0]@short_name + else + var0 = diag_script_info@var + end if + + variables = metadata_att_as_array(variable_info, "short_name") + if (.not. any(variables .eq. var0)) then + errstr = "diagnostic " + diag + " requires the following variable: " + var0 + error_msg("f", DIAG_SCRIPT, "", errstr) + end if + + var0_info = select_metadata_by_name(variable_info, var0) + var0_info := var0_info[0] info0 = select_metadata_by_name(input_file_info, var0) dim_MOD = ListCount(info0) - if (isatt(variable_info[0], "reference_dataset")) then - refname = variable_info[0]@reference_dataset + + if (isatt(var0_info, "reference_dataset")) then + refname = var0_info@reference_dataset end if + names = metadata_att_as_array(info0, "dataset") + projects = metadata_att_as_array(info0, "project") infiles = metadata_att_as_array(info0, "filename") log_info("++++++++++++++++++++++++++++++++++++++++++") log_info(DIAG_SCRIPT + " (var: " + var0 + ")") log_info("++++++++++++++++++++++++++++++++++++++++++") - set_default_att(diag_script_info, "colormap", "WhiteBlueGreenYellowRed") - set_default_att(diag_script_info, "extrafiles", False) - set_default_att(diag_script_info, "projection", "CylindricalEquidistant") - - extrafiles = diag_script_info@extrafiles - ; make sure path for (mandatory) netcdf output exists work_dir = config_user_info@work_dir + "/" @@ -99,6 +123,34 @@ begin ref_ind = ind(names .eq. refname) end if + if (diag_script_info@filename_add .ne. "") then + filename_add = "_" + diag_script_info@filename_add + else + filename_add = "" + end if + + ; find indices of all OBS and obs4mips datasets (including "native6" ERA5) + + idxobs = get_obs(names, projects, "") + + if (idxobs(0) .eq. -1) then + flag_multiobs = False + else + flag_multiobs = True + end if + + ; find all indices of models w/o MultiModelMean/MultiModelMedian (if present) + + idxmod = get_mod(names, projects) + + if (idxmod(0) .eq. -1) then ; no model found + flag_multimod = False + elseif (dimsizes(idxmod) .eq. 1) then ; one model found + flag_multimod = False + else ; more than one model found + flag_multimod = True + end if + end begin @@ -154,6 +206,34 @@ begin A0@units = "mm day-1" end if + ; check if time dimension is a multiple of 12 + ; if not, use only complete years + + idx = ind(dims .eq. "time") + if (.not.ismissing(idx)) then + dimsize = dimsizes(A0) + nt = dimsize(idx) + if (mod(nt, 12) .ne. 0) then + if (nt .lt. 12) then + error_msg("f", DIAG_SCRIPT, "", "time dimension < 12 (" \ + + names(imod) + ")") + else + tfull = nt - mod(nt, 12) + log_info("warning, using only first " + tostring(tfull) \ + + " time steps (" + names(imod) + ")") + if (dimsizes(dims) .eq. 2) then + A0 := A0(0:tfull - 1, :) + else if (dimsizes(dims) .eq. 3) then + A0 := A0(0:tfull - 1, :, :) + else + error_msg("f", DIAG_SCRIPT, "", "number of dimensions " \ + + "must be 2 or 3 (" + names(imod) + ")") + end if + end if + end if + end if + end if + ; subtract climatological seasonal cycle from time series if (isvar("timeseries")) then @@ -174,9 +254,67 @@ begin end if mean = time_operations(A0, -1, -1, "average", "annualclim", True) ; replace "epsilon" values with missing value - mean = where(abs(mean).lt.1.0e-4, mean@_FillValue, mean) + mean = where(abs(mean).lt.diag_script_info@epsilon, mean@_FillValue, mean) data1 = 100.0 * data1 / abs(mean) + ; create arrays for multi-obs and multi-model averages (if requested) + + if (ii .eq. 0) then + multidim = dimsizes(data1) + if (flag_multiobs) then + newdims = array_append_record(dimsizes(idxobs), multidim, 0) + multiobs_all = new(newdims, float) + end if + if (flag_multimod) then + newdims = array_append_record(dimsizes(idxmod), multidim, 0) + multimod_all = new(newdims, float) + end if + end if + + ; calculate multi-obs and multi-model averages (if requested) + + if (flag_multiobs) then + iidx = ind(idxobs .eq. imod) + if (.not.ismissing(iidx)) then + dims1 = dimsizes(data1) + dimerror = False + if (dimsizes(multidim) .eq. dimsizes(dims1)) then + if (any(multidim - dims1 .ne. 0)) then + dimerror = True + end if + else + dimerror = True + end if + if (dimerror) then + error_msg("f", DIAG_SCRIPT, "", "dimensions of datasets " \ + + "do not match. Use preprocessor to regrid data to " \ + + "common grid.") + end if + multiobs_all(iidx, :, :) = data1 + end if + end if + + if (flag_multimod) then + iidx = ind(idxmod .eq. imod) + if (.not.ismissing(iidx)) then + dims1 = dimsizes(data1) + dimerror = False + if (dimsizes(multidim) .eq. dimsizes(dims1)) then + if (any(multidim - dims1 .ne. 0)) then + dimerror = True + end if + else + dimerror = True + end if + if (dimerror) then + error_msg("f", DIAG_SCRIPT, "", "dimensions of datasets " \ + + "do not match. Use preprocessor to regrid data to " \ + + "common grid.") + end if + multimod_all(iidx, :, :) = data1 + end if + end if + ; ########################################### ; # Style dependent annotation # ; ########################################### @@ -189,10 +327,11 @@ begin ; # plot ressources # ; ########################################### - data1@res_gsnMaximize = True ; use full page for the plot - data1@res_cnFillOn = True ; color plot desired - data1@res_cnLineLabelsOn = False ; contour lines - data1@res_cnLinesOn = False + res = True + + res@cnFillOn = True ; color plot desired + res@cnLineLabelsOn = False ; contour lines + res@cnLinesOn = False ; colors ; http://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml @@ -204,68 +343,67 @@ begin ; annotation - data1@res_tiMainOn = False - data1@res_gsnLeftStringFontHeightF = 0.015 - data1@res_cnLevelSelectionMode = "ExplicitLevels" + res@tiMainString = names(imod) + res@tiMainFontHeightF = 0.025 + res@gsnStringFontHeightF = 0.02 + res@cnLevelSelectionMode = "ExplicitLevels" if (diag_script_info@projection.eq."Robinson") then - data1@res_mpPerimOn = False ; turn off perimeter around map - data1@res_mpGridLineColor = -1 - data1@res_mpGridAndLimbOn = True + res@mpPerimOn = False ; turn off perimeter around map + res@mpGridLineColor = -1 + res@mpGridAndLimbOn = True end if - data1@res_mpOutlineOn = True - data1@res_mpFillOn = False + res@mpOutlineOn = True + res@mpFillOn = False ; variable specific plotting settings - if (any((/"clt"/).eq.var0)) then - data1@res_cnLevels = ispan(5, 50, 5) + if (any((/"clt", "prw"/).eq.var0)) then + res@cnLevels = ispan(5, 50, 5) else - data1@res_cnLevels = ispan(5, 100, 5) - end if - - if (var0.eq."lwp") then - data1@res_mpOutlineOn = False - data1@res_mpFillOn = True - data1@res_mpLandFillColor = "Black" -; delete(pal) -; pal = read_colormap_file("$diag_scripts/shared/plot/rgb/qcm3.rgb") + res@cnLevels = ispan(5, 100, 5) end if - nboxes = dimsizes(data1@res_cnLevels) + nboxes = dimsizes(res@cnLevels) clen = dimsizes(pal) stride = max((/1, ((clen(0)-1) - 2) / nboxes /)) fill_colors = ispan(2, clen(0) - 1, stride) - data1@res_cnFillColors = fill_colors + res@cnFillColors = fill_colors - data1@res_lbLabelBarOn = False - data1@res_gsnRightString = "" + res@gsnRightString = "" + + gavg = area_operations(data1, -90., 90., 0., 360., "average", True) + if (.not.ismissing(gavg)) then + res@gsnLeftString = "mean = " + sprintf("%6.3f", gavg) + else + res@gsnLeftString = "" + end if ; map attributes - data1@res_mpFillDrawOrder = "PostDraw" ; draw map last - data1@res_cnMissingValFillColor = "Gray" + res@mpFillDrawOrder = "PostDraw" ; draw map last + res@cnMissingValFillColor = "Gray" ; no tickmarks and no labels - data1@res_tmYLLabelsOn = False - data1@res_tmYLOn = False - data1@res_tmYRLabelsOn = False - data1@res_tmYROn = False - data1@res_tmXBLabelsOn = False - data1@res_tmXBOn = False - data1@res_tmXTLabelsOn = False - data1@res_tmXTOn = False - data1@res_cnInfoLabelOn = False ; turn off cn info label + res@tmYLLabelsOn = False + res@tmYLOn = False + res@tmYRLabelsOn = False + res@tmYROn = False + res@tmXBLabelsOn = False + res@tmXBOn = False + res@tmXTLabelsOn = False + res@tmXTOn = False + res@cnInfoLabelOn = False ; turn off cn info label - data1@res_mpProjection = diag_script_info@projection + res@mpProjection = diag_script_info@projection ; set explicit contour levels if (isatt(diag_script_info, "explicit_cn_levels")) then - data1@res_cnLevelSelectionMode = "ExplicitLevels" - data1@res_cnLevels = diag_script_info@explicit_cn_levels + res@cnLevelSelectionMode = "ExplicitLevels" + res@cnLevels = diag_script_info@explicit_cn_levels end if ; ########################################### @@ -282,145 +420,159 @@ begin data1@diag_script = (/DIAG_SCRIPT/) end if data1@var = var0 ; Overwrite existing entry - if (isatt(variable_info[0], "long_name")) then - data1@var_long_name = variable_info[0]@long_name + if (isatt(var0_info, "long_name")) then + data1@long_name = var0_info@long_name else - data1@var_long_name = var0 + data1@long_name = var0 end if - data1@var_units = "%" + data1@units = "%" ; copy attributes for netCDF output - data1@long_name = "interannual variability " + data1@var_long_name - data1@units = data1@var_units + data1@long_name = "interannual variability " + data1@long_name ; ########################################### ; # create the plot # ; ########################################### - data1@res_gsnFrame = False ; don't advance frame - data1@res_gsnDraw = False + res@lbTitleString = data1@units + res@lbTitlePosition = "Bottom" + res@lbTitleFontHeightF = 0.02 + res@lbLabelFontHeightF = 0.02 ; function in aux_plotting.ncl if (ii.eq.0) then - if (.not.extrafiles) then - wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_interannual_" \ - + var0) - end if -; drawNDCGrid(wks) ; debugging option - end if - - if (extrafiles) then - if (isvar("wks")) then - delete(wks) - end if wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_interannual_" \ - + var0 + "_" + annots(imod)) + + var0 + filename_add) + nframe = 0 end if - maps(ii) = contour_map(wks, data1, var0) - - if (extrafiles) then - txres = True - txres@txFontHeightF = 0.03 - txres@txJust = "BottomRight" - txres@txPerimOn = True - txres@txBackgroundFillColor = "white" - text = gsn_add_text(wks, maps(ii), annots(imod), 170, -80, txres) - draw(maps(ii)) - frame(wks) - plotfile = maps@outfile - - ; ########################################## - ; # output each dataset to separate netCDF # - ; ########################################## - - nc_filename = work_dir + "clouds_interannual_" + var0 + "_" \ - + annots(imod) + ".nc" - nc_outfile = ncdf_write(data1, nc_filename) - - ; ------------------------------------------------------------------- - ; write provenance info - ; ------------------------------------------------------------------- - - statistics = (/"clim", "var"/) - domain = ("glob") - plottype = ("geo") - climofile = infiles(imod) - caption = "Interannual variability of variable " + var0 + \ - " from dataset " + annots(imod) + "." - - log_provenance(nc_outfile, plotfile, caption, statistics, domain, \ - plottype, "", "", climofile) - - else ; extrafiles .eq. false - - ; ######################################### - ; # output all datasets to common netCDF # - ; ######################################### - - nc_filename = work_dir + "clouds_interannual_" + var0 + ".nc" - nc_filename@existing = "append" - data1@var = var0 + "_var_" + annots(imod) - nc_outfile = ncdf_write(data1, nc_filename) - - end if ; if extrafiles + maps(ii) = gsn_csm_contour_map(wks, data1, res) + nframe = nframe + 1 + + ; ######################################### + ; # output all datasets to common netCDF # + ; ######################################### + + nc_filename = work_dir + "clouds_interannual_" + var0 + ".nc" + nc_filename@existing = "append" + data1@var = var0 + "_var_" + annots(imod) + nc_outfile = ncdf_write(data1, nc_filename) + end do ; ii-loop (datasets) + ; create panel plot + pres = True ; needed to override ; panelling defaults - pres@gsnPanelLabelBar = True ; add common colorbar ; print dataset name on each panel pres@gsnPanelFigureStrings = annots(ind_all_sorted) pres@gsnPanelFigureStringsFontHeightF = 0.007 pres@lbLabelFontHeightF = 0.01 pres@lbAutoManage = False pres@lbTopMarginF = 0.1 - pres@lbTitleOn = True - pres@lbTitleFontHeightF = 0.009 - pres@lbTitlePosition = "Bottom" - pres@lbTitleString = "~F8~s~F21~" + var0 + " (%)" pres@lbPerimOn = False ; draw line around label ; bar area pres@gsnPanelCenter = False pres@pmLabelBarOrthogonalPosF = -0.01 ; shift label bar a bit to ; the bottom -; pres@gsnPanelDebug = True + outfile = panelling(wks, maps, (dim_MOD + 3) / 4, 4, pres) + nframe = nframe + 1 + + ; plot multi-obs and multi-model average (if requested) + + if (flag_multiobs) then + multiobs = dim_avg_n(multiobs_all, 0) + delete(multiobs_all) + copy_VarMeta(data1, multiobs) + gavg = area_operations(multiobs, -90., 90., 0., 360., "average", True) + res@gsnLeftString = "mean = " + sprintf("%6.3f", gavg) + res@tiMainString = "Multi-obs average" + map_multiobs = gsn_csm_contour_map(wks, multiobs, res) + end if - if (extrafiles) then - if (isvar("wks")) then - delete(wks) - end if - ; plot legend - wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_interannual_" \ - + var0 + "_legend") - pres@lbMonoFillPattern = True - pres@lbOrientation = "Horizontal" - pres@vpWidthF = 0.7 - pres@vpHeightF = 0.1 - pres@lbLabelFontHeightF = 0.015 - pres@lbLabelAlignment = "InteriorEdges" - pres@lbTitleFontHeightF = 0.015 - labels = tostring(data1@res_cnLevels) - pres@lbFillColors = fill_colors - gsn_labelbar_ndc(wks, nboxes, labels, 0.1, 0.9, pres) - else - outfile = panelling(wks, maps, (dim_MOD + 3) / 4, 4, pres) - log_info(" Wrote " + outfile) + if (flag_multimod) then + multimod = dim_avg_n(multimod_all, 0) + delete(multimod_all) + copy_VarMeta(data1, multimod) + + mask1 = multiobs + mask2 = multimod + mask1 = where(.not.ismissing(mask1), 0., mask1@_FillValue) + mask2 = where(.not.ismissing(mask2), 0., mask2@_FillValue) + amask = mask1 + mask2 + delete(mask1) + delete(mask2) + refmasked = multiobs + refmasked = refmasked + amask + datmasked = multimod + datmasked = datmasked + amask + delete(amask) + corr = calculate_metric(refmasked, datmasked, "correlation") + gavg = area_operations(datmasked, -90., 90., 0., 360., \ + "average", True) + rmsd = calculate_metric(refmasked, datmasked, "RMSD") + +; system("rm debug.nc") +; debugfile = addfile("debug.nc", "c") +; debugfile->refmasked = refmasked +; debugfile->datmasked = datmasked + + delete(refmasked) + delete(datmasked) + + res@gsnLeftString = "mean = " + sprintf("%6.3f", gavg) + res@gsnCenterString = "corr = " + sprintf("%6.3f", corr) + res@gsnRightString = "rmsd = " + sprintf("%6.3f", rmsd) + +; gavg = area_operations(multimod, -90., 90., 0., 360., "average", True) +; res@gsnLeftString = "mean = " + sprintf("%6.3f", gavg) + res@tiMainString = "Multi-model average" + map_multimod = gsn_csm_contour_map(wks, multimod, res) + + end if + + log_info(" Wrote " + outfile) + + suffix = get_file_suffix(outfile, 0) + if (suffix .eq. ".png") then + outfile = suffix@fBase + "." + sprinti("%0.6i", nframe) + suffix end if ; ------------------------------------------------------------------------ ; write provenance to common netcdf and plot file ; ------------------------------------------------------------------------ - if (.not. extrafiles) then - statistics = (/"clim", "var"/) - domain = "global" - plottype = "geo" - caption = "Interannual variability of variable " + var0 + "." - log_provenance(nc_outfile, outfile, caption, statistics, domain, \ - plottype, "", "", infiles) + statistics = (/"clim", "var"/) + domain = "global" + plottype = "geo" + caption = "Interannual variability of variable " + var0 + "." + log_provenance(nc_outfile, outfile, caption, statistics, domain, \ + plottype, "", "", infiles) + + ; ---------------------------------------------------------------------- + ; write differences of the multi-model and multi-obs means to netcdf + ; ---------------------------------------------------------------------- + + if (flag_multimod .and. flag_multiobs) then + diff = multimod + diff = diff - multiobs + diff@var = "MMM-MOBSMEAN" + + nc_filename2 = work_dir + "clouds_interannual_" + var0 + \ + "_mmm-mobsmean-absdiff.nc" + nc_filename2@existing = "append" + + diff@var_long_name = "MMM - MOBSMEAN" + multimod@var = "MMM" + multimod@var_long_name = "multi-model mean (MMM)" + multiobs@var = "MOBSMEAN" + multiobs@var_long_name = "multi-obs mean (MOBSMEAN)" + + nc_outfile2 = ncdf_write(diff, nc_filename2) + nc_outfile2 = ncdf_write(multimod, nc_filename2) + nc_outfile2 = ncdf_write(multiobs, nc_filename2) end if leave_msg(DIAG_SCRIPT, "") diff --git a/esmvaltool/diag_scripts/clouds/clouds_ipcc.ncl b/esmvaltool/diag_scripts/clouds/clouds_ipcc.ncl index 5a948a3fe7..101ca0a080 100644 --- a/esmvaltool/diag_scripts/clouds/clouds_ipcc.ncl +++ b/esmvaltool/diag_scripts/clouds/clouds_ipcc.ncl @@ -17,6 +17,7 @@ ; ; Optional diag_script_info attributes (diagnostic specific) ; explicit_cn_levels: contour levels +; highlight_dataset: name of dataset to highlight ("MultiModelMean") ; mask_ts_sea_ice: - True = mask T < 272 K as sea ice (only for ; variable "ts") ; - False = no additional grid cells masked for @@ -50,6 +51,8 @@ ; plot is written to 2 separate netCDFs. ; ; Modification history +; 20230118-lauer_axel: added support to highlight other dataset than +; MultiModelMean ; 20211006-lauer_axel: removed write_plots ; 20190222-lauer_axel: added output of provenance (v2.0) ; 20181119-lauer_axel: adapted code to multi-variable capable framework @@ -127,6 +130,7 @@ begin log_info("++++++++++++++++++++++++++++++++++++++++++") ; Set default values for non-required diag_script_info attributes + set_default_att(diag_script_info, "highlight_dataset", "MultiModelMean") set_default_att(diag_script_info, "mask_ts_sea_ice", False) set_default_att(diag_script_info, "projection", "CylindricalEquidistant") set_default_att(diag_script_info, "timemean", "annualclim") @@ -192,12 +196,23 @@ begin ; get multi-model mean index - mm_ind = ind(names .eq. "MultiModelMean") + mm_ind = ind(names .eq. diag_script_info@highlight_dataset) if (ismissing(mm_ind)) then - error_msg("f", DIAG_SCRIPT, "", "multi-model mean is missing (required)") + mod_ind = ind(names .ne. ref_ind) + if (all(ismissing(mod_ind))) then + error_msg("f", DIAG_SCRIPT, "", "no dataset besides reference " \ + + "dataset found. Cannot continue.") + end if + mm_ind = mod_ind(0) + log_info("highlight_dataset (" + diag_script_info@highlight_dataset \ + + " ) not found, using first dataset (" + names(mm_ind) \ + + ") instead.") + delete(mod_ind) end if + highlight_name = names(mm_ind) + mask_ts_sea_ice = diag_script_info@mask_ts_sea_ice if ((var0 .eq. "ts") .and. (mask_ts_sea_ice)) @@ -357,7 +372,8 @@ begin delete(tmp) - ; save maps of multi-model mean and reference data + ; save maps of highlight_dataset (default = multi-model mean) + ; and reference data if (imod.eq.mm_ind) then mmdata = data @@ -376,7 +392,8 @@ begin end do ; imod - ; differences between multi-model mean and reference data set + ; differences between highlight_dataset (default = multi-model mean) + ; and reference data set diff = mmdata - refdata copy_VarMeta(refdata, diff) @@ -384,17 +401,19 @@ begin ; debugfile->diff = diff ; we order the zonal mean array in a way so that - ; the lines for the multi-model mean and reference model will - ; be drawn on top of the lines for the individual models, i.e.: + ; the lines for the highligh_dataset (default = multi-model mean) + ; and reference model will be drawn on top of the lines for the individual + ; models, i.e.: ; (1) individual model(s) ; (2) reference model(s) (observations) - ; (3) multi-model mean + ; (3) highlight_dataset (default = multi-model mean) dims = dimsizes(zm) zonalmean = new(dims, float) copy_VarMeta(zm, zonalmean) - ; model indices with no reference model(s) and no multi-model mean + ; model indices with no reference model(s) and no highlight_dataset + ; (default = multi-model mean) model_ind = ispan(0, dim_MOD0 - 1, 1) model_ind(ref_ind) = -1 @@ -406,18 +425,22 @@ begin modelsonly_ind = ind(model_ind.ge.0) delete(model_ind) - n = dimsizes(modelsonly_ind) - 1 + if (.not.all(ismissing(modelsonly_ind))) then + n = dimsizes(modelsonly_ind) - 1 - ; first entries in "zonalmean" = individual models + ; first entries in "zonalmean" = individual models - if (numseas.gt.1) then - zonalmean(0:n, :, :) = zm(modelsonly_ind, :, :) + if (numseas.gt.1) then + zonalmean(0:n, :, :) = zm(modelsonly_ind, :, :) + else + zonalmean(0:n, :) = zm(modelsonly_ind, :) + end if + + zonalmean&model(0:n) = zm&model(modelsonly_ind) else - zonalmean(0:n, :) = zm(modelsonly_ind, :) + n = -1 end if - zonalmean&model(0:n) = zm&model(modelsonly_ind) - ; observation(s) n = n + 1 @@ -441,14 +464,14 @@ begin zonalmean&model(n) = zm&model(ref_ind2) end if - ; last entry in "zonalmean" = multi-model mean + ; last entry in "zonalmean" = highlight_dataset (default = multi-model mean) n = n + 1 if (numseas.gt.1) then - zonalmean(n, :, :) = zm(mm_ind, :, :) ; multi-model mean + zonalmean(n, :, :) = zm(mm_ind, :, :) ; highlight_dataset else - zonalmean(n, :) = zm(mm_ind, :) ; multi-model mean + zonalmean(n, :) = zm(mm_ind, :) ; highlight_dataset end if zonalmean&model(n) = zm&model(mm_ind) @@ -621,7 +644,7 @@ begin n = dimsizes(modelsonly_ind) - 1 ; settings for all models that have been used to calculate the - ; multi-model mean (= first entries in "zonalmean") + ; highligh_dataset (= first entries in "zonalmean") linethickness(0:n) = 1.0 linecolor(0:n) = "(/0.5, 0.5, 0.5/)" @@ -648,9 +671,9 @@ begin end do else linethickness(n+1:dim_MOD0-1) = 4.0 ; reference dataset(s) - linethickness(mm_ind) = 4.0 ; multi-model mean + linethickness(mm_ind) = 4.0 ; highlight_dataset linecolor(n+1:dim_MOD0-1) = "Black" ; reference data set - linecolor(mm_ind) = "Red" ; multi-model mean + linecolor(mm_ind) = "Red" ; highlight_dataset end if res = True @@ -708,7 +731,7 @@ begin pres = True pres@gsnPanelCenter = False pres@gsnPanelXF = (/0.075, 0.625/) ; hor. pos. of sub-plots - pres@txString = season(is) + pres@txString = highlight_name + " (" + season(is) + ")" outfile = panelling(wks, plots(:, is), 1, 2, pres) log_info("Wrote " + wks@fullname) @@ -745,9 +768,9 @@ begin statistics = "clim" domain = "global" plottype = (/"geo", "zonal"/) - caption = "Multi model mean bias (left) and zonal averages (right) " \ - + "for variable " + var0 + " (" + allseas \ - + "), reference = " + names(ref_ind) + "." + caption = names(mm_ind) + " bias (left) and zonal averages (right) " \ + + "for variable " + var0 + " (" + allseas \ + + "), reference = " + names(ref_ind) + "." do is = 0, numseas - 1 log_provenance(nc_outfile_bias, plotfile(is), caption, statistics, \ diff --git a/esmvaltool/diag_scripts/clouds/clouds_lifrac_scatter.ncl b/esmvaltool/diag_scripts/clouds/clouds_lifrac_scatter.ncl new file mode 100644 index 0000000000..f9bf33f30d --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_lifrac_scatter.ncl @@ -0,0 +1,780 @@ +; CLOUDS_LIFRAC_SCATTER +; ############################################################################ +; Author: Axel Lauer (DLR, Germany) +; ############################################################################ +; Description +; Calculates average liquid / ice fraction vs. temperature. +; +; Required diag_script_info attributes (diagnostic specific) +; none +; +; Optional diag_script_info attributes (diagnostic specific) +; filename_add: optionally add this string to plot filesnames +; min_mass: minimum cloud condensate (same units as clw, cli) +; mm_mean_median: calculate multi-model mean and meadian +; nbins: number of equally spaced bins (ta (x-axis)), default = 20 +; panel_labels: label individual panels (true, false) +; PanelTop: manual override for "@gnsPanelTop" used by panel +; plot(s) +; +; Required variable attributes (variable specific) +; none +; +; Optional variable_info attributes (variable specific) +; reference_dataset: reference dataset +; +; Caveats +; none +; +; Modification history +; 20230117-lauer_axel: added support for ICON (code from Manuel) +; 20210302-lauer_axel: written. +; +; ############################################################################ + +load "$diag_scripts/../interface_scripts/interface.ncl" + +load "$diag_scripts/shared/plot/aux_plotting.ncl" +load "$diag_scripts/shared/statistics.ncl" +load "$diag_scripts/shared/plot/style.ncl" +load "$diag_scripts/shared/dataset_selection.ncl" + +begin + + enter_msg(DIAG_SCRIPT, "") + + diag = "clouds_lifrac_scatter.ncl" + variables = get_unique_values(metadata_att_as_array(variable_info, \ + "short_name")) + dim_VAR = dimsizes(variables) + refname = new(dim_VAR, string) + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT + " (var: " + variables + ")") + log_info("++++++++++++++++++++++++++++++++++++++++++") + + ; make sure required variables are available + + varlist = (/"clw", "cli", "ta"/) + idx = new(dimsizes(varlist), integer) + + do i = 0, dimsizes(varlist) - 1 + idx(i) = ind(variables .eq. varlist(i)) + end do + + if (any(ismissing(idx))) then + errstr = "diagnostic " + diag + " requires the following variable(s): " \ + + str_join(varlist, ", ") + error_msg("f", DIAG_SCRIPT, "", errstr) + end if + + ; save input files for writing provenance + + infiles = metadata_att_as_array(input_file_info, "filename") + + ; get reference datasets (if present) and check that number of datasets + ; is equal for each variable + + do i = 0, dim_VAR - 1 + var = variables(idx(i)) + var_info = select_metadata_by_name(variable_info, var) + var_info := var_info[0] + if (isatt(var_info, "reference_dataset")) then + refname(i) = var_info@reference_dataset + end if + info = select_metadata_by_name(input_file_info, var) + if (i .eq. 0) then + dim_MOD = ListCount(info) + else + dim_test = ListCount(info) + if (dim_test .ne. dim_MOD) then + error_msg("f", DIAG_SCRIPT, "", "number of datasets for variable " \ + + variables(i) + " does not match number of datasets for " \ + + variables(0)) + end if + end if + delete(info) + delete(var) + delete(var_info) + end do + + delete(idx) + + ; Set default values for non-required diag_script_info attributes + + set_default_att(diag_script_info, "filename_add", "") + set_default_att(diag_script_info, "panel_labels", True) + set_default_att(diag_script_info, "min_mass", 1.0e-15) + set_default_att(diag_script_info, "mm_mean_median", True) + set_default_att(diag_script_info, "nbins", 20) + + if (diag_script_info@filename_add .ne. "") then + filename_add = "_" + diag_script_info@filename_add + else + filename_add = "" + end if + + nbins = toint(diag_script_info@nbins) + + panel_labels = diag_script_info@panel_labels + min_mass = diag_script_info@min_mass + mm_mean_median = diag_script_info@mm_mean_median + + ; make sure path for (mandatory) netcdf output exists + + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + +end + +begin + ; ############ + ; # get data # + ; ############ + + info_clw = select_metadata_by_name(input_file_info, "clw") + names_clw = metadata_att_as_array(info_clw, "dataset") + projects_clw = metadata_att_as_array(info_clw, "project") + info_cli = select_metadata_by_name(input_file_info, "cli") + names_cli = metadata_att_as_array(info_cli, "dataset") + projects_cli = metadata_att_as_array(info_cli, "project") + info_ta = select_metadata_by_name(input_file_info, "ta") + names_ta = metadata_att_as_array(info_ta, "dataset") + projects_ta = metadata_att_as_array(info_ta, "project") + + refidx_clw = ind(names_clw .eq. refname(0)) + refidx_cli = ind(names_cli .eq. refname(1)) + refidx_ta = ind(names_ta .eq. refname(2)) + + if (ismissing(refidx_clw) .or. ismissing(refidx_cli) .or. \ + ismissing(refidx_ta)) then + if (ismissing(refidx_clw)) then + str = refname(0) + end if + if (ismissing(refidx_cli)) then + if (isdefined("str")) then + str = str + " + " + refname(1) + else + str = refname(1) + end if + end if + if (ismissing(refidx_ta)) then + if (isdefined("str")) then + str = str + " + " + refname(2) + else + str = refname(2) + end if + end if + + error_msg("f", DIAG_SCRIPT, "", "the following reference dataset(s) " \ + + "are not available: " + str) + end if + + add_dim_MOD = 0 + + if (mm_mean_median) then + ; check if enough model datasets are available to calculate multi-model + ; mean and median ice/liquid fractions + + ; find all indices of models w/o MultiModelMean/MultiModelMedian + ; (if present) + idxmod = get_mod(names_clw, projects_clw) + + if ((idxmod(0) .eq. -1) .or. (dimsizes(idxmod) .le. 2)) then + log_info("Not enough model datasets to calculate multi-model " \ + + "mean and median. Setting of 'mm_mean_median' will" \ + + " be ignored.") + mm_mean_median = False + else ; more than one model found + add_dim_MOD = 2 + end if + delete(idxmod) + end if + + resulti = new((/dim_MOD + add_dim_MOD, nbins/), float) + resultl = new((/dim_MOD + add_dim_MOD, nbins/), float) + bincenter = new((/nbins/), float) + + xmax = 300. ; Kelvin (27°C) + xmin = 230. ; Kelvin (-43°C) + binsize = tofloat(xmax - xmin) / nbins + + do n = 0, nbins - 1 + x0 = n * binsize + x1 = x0 + binsize + bincenter(n) = xmin + 0.5 * (x0 + x1) + end do + + ; ------------------------------------------------------------------------- + + ; create index vector with reference dataset as first entry (index 0) + ; so reference icefrac is calculated first + + idataset = ispan(0, dim_MOD - 1, 1) + idataset0 = idataset(0) + i1 = ind(idataset .eq. refidx_clw) + idataset(0) = idataset(i1) + idataset(i1) = idataset0 + + do ii = 0, dim_MOD - 1 + + i = idataset(ii) + + atts_cli = True + atts_cli@short_name = "cli" + + atts_clw = True + atts_clw@short_name = "clw" + + atts_ta = True + atts_ta@short_name = "ta" + + ; reference datasets may have different names + if (i .eq. refidx_clw) then + atts_clw@dataset = refname(0) + atts_cli@dataset = refname(1) + atts_ta@dataset = refname(2) + ; all other datasets: force same dataset name for clw, cli and ta + else + atts_clw@dataset = names_clw(i) + atts_cli@dataset = names_clw(i) + atts_ta@dataset = names_clw(i) + end if + + ; read cli + + info = select_metadata_by_atts(input_file_info, atts_cli) + cli = read_data(info[0]) + delete(info) + + ; read clw + + info = select_metadata_by_atts(input_file_info, atts_clw) + clw = read_data(info[0]) + delete(info) + + ; read ta + + info = select_metadata_by_atts(input_file_info, atts_ta) + ta = read_data(info[0]) + delete(info) + + ; check dimensions + + dims_clw = dimsizes(clw) + dims_cli = dimsizes(cli) + dims_ta = dimsizes(ta) + + dimerror = False + + if (dimsizes(dims_cli) .eq. dimsizes(dims_clw)) then + if (any(dims_cli - dims_clw .ne. 0)) then + dimerror = True + end if + else + dimerror = True + end if + + if (dimsizes(dims_cli) .eq. dimsizes(dims_ta)) then + if (any(dims_cli - dims_ta .ne. 0)) then + dimerror = True + end if + else + dimerror = True + end if + + if (dimerror) then + error_msg("f", DIAG_SCRIPT, "", "dimensions of datasets " \ + + atts_cli@dataset + " (variable cli), " \ + + atts_clw@dataset + " (variable clw), " \ + + atts_ta@dataset + " (variable ta) do not match.") + end if + + delete(dims_cli) + delete(dims_clw) + delete(dims_ta) + + ; calculate ice fraction + + ; filter valid values (needed for some models) + + cli = where(cli .lt. 0.0, cli@_FillValue, cli) + cli = where(isnan_ieee(cli), cli@_FillValue, cli) + clw = where(clw .lt. 0.0, clw@_FillValue, clw) + clw = where(isnan_ieee(clw), clw@_FillValue, clw) + + mass = cli + clw + mass = where(mass .lt. min_mass, mass@_FillValue, mass) + + icefrac = 100.0 * cli / mass + liqfrac = 100.0 * clw / mass + + ; ======================================================================== + + ; output zonal means of cli with max icefrac limited to observed icefrac + ; ---------------------------------------------------------------------- + ; as modeled and observed timeseries of icefrac may differ in length and + ; years covered, we use average seasonal cycles instead of the full time + ; series + + copy_VarMeta(cli, icefrac) + icedims = dimsizes(cli) + icedimnames = getvardims(cli) + lonidx = ind(icedimnames .eq. "lon") + if (ismissing(lonidx)) then + error_msg("f", DIAG_SCRIPT, "", "no lon dimension") + end if + + if (ii .eq. 0) then + system("rm " + config_user_info@work_dir + "zonal.nc") + zonalfile = addfile(config_user_info@work_dir + "zonal.nc", "c") + end if + + cli_avg = time_operations(cli, -1, -1, "average", "monthlyclim", True) + zcli = dim_avg_n_Wrap(cli_avg, lonidx) + delete(zcli&month) + zcli!0 = "time" + zcli&time = ispan(0, 11, 1) + + var = "f_" + tostring(atts_cli@dataset) + zonalfile->$var$ = zcli + + delete(cli_avg) + delete(zcli) + + ; ======================================================================== + + cli1d = ndtooned(cli) + + delete(clw) + delete(mass) + + icefrac_units = "%" + liqfrac_units = "%" + icefrac_long_name = "cloud ice fraction" + liqfrac_long_name = "cloud liquid fraction" + icefrac_var = "icefrac" + liqfrac_var = "liqfrac" + ref_ind = refidx_cli + if (ismissing(ref_ind)) then + ref_ind = -1 + end if + names = names_cli + projects = projects_cli + + ; if reference datasets for clw, cli, ta are from different sources + if (refname(0) .ne. refname(1)) then + names(refidx_cli) = refname(0) + "/" + refname(1) + end if + if (refname(0) .ne. refname(2) .and. refname(1) .ne. refname(2)) then + names(refidx_cli) = names(refidx_cli) + "/" + refname(2) + end if + + ; ======================================================================== + + ; bin data + + ice1d = ndtooned(icefrac) + delete(icefrac) + liq1d = ndtooned(liqfrac) + delete(liqfrac) + ta1d = ndtooned(ta) + ta_units = ta@units + delete(ta) + + resulti@_FillValue = ice1d@_FillValue + resultl@_FillValue = ice1d@_FillValue + + cli_limited1d = cli1d + + do n = 0, nbins - 1 + resulti(i, n) = 0.0 + resultl(i, n) = resultl@_FillValue + x0 = xmin + n * binsize + x1 = x0 + binsize + idx0 = ind((ta1d .gt. x0) .and. (ta1d .le. x1)) + if (.not.all(ismissing(idx0))) then + nv = num(.not.ismissing(ice1d(idx0))) + if (nv .gt. 0) then + resulti(i, n) = avg(ice1d(idx0)) + ; ------------------------------------------------------------------ + + iref = idataset(0) + ifrac_ref = resulti(iref, n) + ifrac_mod = resulti(i, n) + + if (.not.ismissing(ifrac_ref) .and. .not.ismissing(ifrac_mod)) then + if (ifrac_mod .gt. 0.0) then + corr_fac = ifrac_ref / ifrac_mod + if (corr_fac .lt. 1.0) then + cli_limited1d(idx0) = cli1d(idx0) * corr_fac + end if + end if + end if + ; ------------------------------------------------------------------ + end if + nv = num(.not.ismissing(liq1d(idx0))) + if (nv .gt. 0) then + resultl(i, n) = avg(liq1d(idx0)) + end if + end if + delete(idx0) + end do + + cli_limited = onedtond(cli_limited1d, icedims) + copy_VarMeta(cli, cli_limited) + + cli_avg = time_operations(cli_limited, -1, -1, "average", \ + "monthlyclim", True) + zcli = dim_avg_n_Wrap(cli_avg, lonidx) + delete(zcli&month) + zcli!0 = "time" + zcli&time = ispan(0, 11, 1) + + var = "l_" + tostring(atts_cli@dataset) + zonalfile->$var$ = zcli + + delete(cli_avg) + delete(zcli) + delete(cli_limited) + delete(cli_limited1d) + + delete(ice1d) + delete(liq1d) + delete(ta1d) + delete(cli1d) + delete(icedims) + delete(icedimnames) + + delete(cli) + + ; ========================================================================== + + end do ; loop over all datasets (ii) + + ; calculate average and median over all models excluding possibly present + ; MultiModelMean, MultiModelMedian and reference dataset + + if (mm_mean_median) then + index_my_mm = dim_MOD + index_my_med = dim_MOD + 1 + + xnames = array_append_record(names, (/"Average", "Median"/), 0) + delete(names) + names = xnames + delete(xnames) + + mm_ind = ind(names .eq. "MultiModelMean") + mmed_ind = ind(names .eq. "MultiModelMedian") + + if (ismissing(mm_ind)) then + mm_ind = -1 + end if + if (ismissing(mmed_ind)) then + mmed_ind = -1 + end if + + imod = ispan(0, dim_MOD - 1, 1) + idx0 = ind((imod .ne. ref_ind) .and. (imod .ne. mm_ind) .and. \ + (imod .ne. mmed_ind)) + + mmed25i = new(nbins, float) + mmed75i = new(nbins, float) + mmed25l = new(nbins, float) + mmed75l = new(nbins, float) + + mmstdi = new(nbins, float) + mmstdl = new(nbins, float) + + if (.not.all(ismissing(idx0))) then + do n = 0, nbins - 1 + nv = num(.not.ismissing(resulti(idx0, n))) + if (nv .gt. 2) then + stat = stat_dispersion(resulti(idx0, n), False) + resulti(index_my_mm, n) = stat(0) ; mean + mmstdi(n) = stat(1) ; standard deviation + mmed25i(n) = stat(6) ; lower quartile + resulti(index_my_med, n) = stat(8) ; median + mmed75i(n) = stat(10) ; upper quartile + ; if number of datasets < 4, quartiles cannot be calculated + if (ismissing(mmed25i(n)) .or. ismissing(mmed75i(n))) then + mmed25i(n) = 0.0 + mmed75i(n) = 0.0 + end if + else + resulti(index_my_mm, n) = 0.0 + mmstdi(n) = 0.0 + mmed25i(n) = 0.0 + resulti(index_my_med, n) = 0.0 + mmed75i(n) = 0.0 + end if + nv = num(.not.ismissing(resultl(idx0, n))) + if (nv .gt. 2) then + stat = stat_dispersion(resultl(idx0, n), False) + resultl(index_my_mm, n) = stat(0) ; mean + mmstdl(n) = stat(1) ; standard deviation + mmed25l(n) = stat(6) ; lower quartile + resultl(index_my_med, n) = stat(8) ; median + mmed75l(n) = stat(10) ; upper quartile + ; if number of datasets < 4, quartiles cannot be calculated + if (ismissing(mmed25l(n)) .or. ismissing(mmed75l(n))) then + mmed25l(n) = 0.0 + mmed75l(n) = 0.0 + end if + else + resultl(index_my_mm, n) = 0.0 + mmstdl(n) = 0.0 + mmed25l(n) = 0.0 + resultl(index_my_med, n) = 0.0 + mmed75l(n) = 0.0 + end if + end do + end if + + if (isdefined("stat")) then + delete(stat) + end if + delete(idx0) + delete(imod) + else + index_my_mm = -1 + index_my_med = -1 + end if + +; if (mm_ind .ge. 0) then +; mmstdi = new(nbins, float) +; mmstdl = new(nbins, float) +; mmstdi = 0.0 +; mmstdl = 0.0 +; imod = ispan(0, dim_MOD - 1, 1) +; idx0 = ind((imod .ne. ref_ind) .and. (imod .ne. mm_ind) .and. \ +; (imod .ne. mmed_ind)) +; if (.not.all(ismissing(idx0))) then +; do n = 0, nbins - 1 +; nv = num(.not.ismissing(resulti(idx0, n))) +; if (nv .gt. 2) then +; mmstdi(n) = stddev(resulti(idx0, n)) +; end if +; nv = num(.not.ismissing(resultl(idx0, n))) +; if (nv .gt. 2) then +; mmstdl(n) = stddev(resultl(idx0, n)) +; end if +; end do +; end if +; delete(idx0) +; delete(imod) +; end if +; +; ; if MultiModelMedian is present, calculate 25 and 75 pecentiles +; +; if (mmed_ind .ge. 0) then +; mmed25i = new(nbins, float) +; mmed75i = new(nbins, float) +; mmed25l = new(nbins, float) +; mmed75l = new(nbins, float) +; mmed25i = 0.0 +; mmed75i = 0.0 +; mmed25l = 0.0 +; mmed75l = 0.0 +; imod = ispan(0, dim_MOD - 1, 1) +; idx0 = ind((imod .ne. ref_ind) .and. (imod .ne. mm_ind) .and. \ +; (imod .ne. mmed_ind)) +; if (.not.all(ismissing(idx0))) then +; do n = 0, nbins - 1 +; nv = num(.not.ismissing(resulti(idx0, n))) +; if (nv .gt. 2) then +; stat = stat_dispersion(resulti(idx0, n), False) +; mmed25i(n) = stat(6) +; mmed75i(n) = stat(10) +; end if +; nv = num(.not.ismissing(resultl(idx0, n))) +; if (nv .gt. 2) then +; stat = stat_dispersion(resultl(idx0, n), False) +; mmed25l(n) = stat(6) +; mmed75l(n) = stat(10) +; end if +; end do +; end if +; delete(idx0) +; delete(imod) +; delete(stat) +; end if + + ; ########################################### + ; # netCDF output # + ; ########################################### + + nc_filename_i = work_dir + "clouds_lifrac_scatter_ice" + \ + filename_add + ".nc" + nc_filename_l = work_dir + "clouds_lifrac_scatter_liq" + \ + filename_add + ".nc" + + resulti!0 = "model" + resulti!1 = "bin" + resulti&model = str_sub_str(names, "/", "-") + resulti&bin = bincenter + resulti@diag_script = (/DIAG_SCRIPT/) + + copy_VarMeta(resulti, resultl) + + resulti@var = icefrac_var + resulti@var_long_name = icefrac_long_name + resulti@var_units = icefrac_units + + resultl@var = liqfrac_var + resultl@var_long_name = liqfrac_long_name + resultl@var_units = liqfrac_units + + nc_outfile_i = ncdf_write(resulti, nc_filename_i) + nc_outfile_l = ncdf_write(resultl, nc_filename_l) + + ; ########################################### + ; # create the plots # + ; ########################################### + + plots_i = new(dim_MOD + add_dim_MOD, graphic) + plots_l = new(dim_MOD + add_dim_MOD, graphic) + res = True + + wks_i = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_lifrac_scatter_" + \ + "ice" + filename_add) + wks_l = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_lifrac_scatter_" + \ + "liq" + filename_add) + + data_i = new((/2, nbins/), float) + data_l = new((/2, nbins/), float) + if (ref_ind .gt. 0) then + data_i(0, :) = resulti(ref_ind, :) + data_l(0, :) = resultl(ref_ind, :) + else + data_i(0, :) = data@_FillValue + data_l(0, :) = data@_FillValue + end if + + nframe = 0 + + do ii = 0, dim_MOD + add_dim_MOD - 1 + if (ii .eq. refidx_ta) then + continue + end if + + res@gsnDraw = False ; do not draw yet + res@gsnFrame = False ; don't advance frame + + res@xyMarkLineMode = "Markers" + res@xyMarkers = (/4, 16/) + res@xyMonoMarkerColor = False + res@xyMarkerColors = (/"black", "red"/) + res@xyMarkerSizeF = 0.01 + res@tmLabelAutoStride = True + + res@tiMainFontHeightF = 0.025 + res@tiYAxisFontHeightF = 0.025 + res@tiXAxisFontHeightF = 0.025 + res@tiXAxisString = varlist(2) + " (" + ta_units + ")" + + data_i(1, :) = resulti(ii, :) + data_l(1, :) = resultl(ii, :) + + res@tiMainString = names(ii) + + res@tiYAxisString = icefrac_var + " (" + icefrac_units + ")" + plots_i(ii) = gsn_csm_xy(wks_i, resulti&bin, data_i, res) + res@tiYAxisString = liqfrac_var + " (" + liqfrac_units + ")" + plots_l(ii) = gsn_csm_xy(wks_l, resultl&bin, data_l, res) + + if (ii .eq. index_my_mm) then + res_std = True + res_std@gsnDraw = False ; do not draw yet + res_std@gsnFrame = False ; don't advance frame + res_std@gsnXYFillColors = "lightpink" + res_std@xyLineColor = -1 ; Make lines transparent + mmstddev = new((/2, nbins/), float) + mmstddev(0, :) = resulti(ii, :) - mmstdi(:) + mmstddev(1, :) = resulti(ii, :) + mmstdi(:) + plotstd_i = gsn_csm_xy(wks_i, resulti&bin, mmstddev, res_std) + overlay(plots_i(ii), plotstd_i) + mmstddev(0, :) = resultl(ii, :) - mmstdl(:) + mmstddev(1, :) = resultl(ii, :) + mmstdl(:) + plotstd_l = gsn_csm_xy(wks_l, resultl&bin, mmstddev, res_std) + delete(mmstddev) + overlay(plots_l(ii), plotstd_l) + end if + + if (ii .eq. index_my_med) then + res_med = True + res_med@gsnDraw = False ; do not draw yet + res_med@gsnFrame = False ; don't advance frame + res_med@gsnXYFillColors = "lightpink" + res_med@xyLineColor = -1 ; Make lines transparent + mmed = new((/2, nbins/), float) + mmed(0, :) = mmed25i(:) + mmed(1, :) = mmed75i(:) + plotmed_i = gsn_csm_xy(wks_i, resulti&bin, mmed, res_med) + overlay(plots_i(ii), plotmed_i) + mmed(0, :) = mmed25l(:) + mmed(1, :) = mmed75l(:) + plotmed_l = gsn_csm_xy(wks_l, resultl&bin, mmed, res_med) + delete(mmed) + overlay(plots_l(ii), plotmed_l) + end if + + draw(plots_i(ii)) + frame(wks_i) + draw(plots_l(ii)) + frame(wks_l) + + nframe = nframe + 1 + end do + + pres = True ; needed to override + ; panelling defaults + pres@gsnPanelCenter = False + + idx0 = ind(.not.ismissing(plots_i)) + n = dimsizes(idx0) + pres@gsnPanelFigureStrings = names(idx0) + pres@gsnPanelFigureStringsFontHeightF = min((/0.008, 0.008 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + pres@lbLabelFontHeightF = min((/0.01, 0.01 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + + outfile_i = panelling(wks_i, plots_i(idx0), (n + 3) / 4, 4, pres) + log_info("Wrote " + outfile_i) + + outfile_l = panelling(wks_l, plots_l(idx0), (n + 3) / 4, 4, pres) + log_info("Wrote " + outfile_l) + delete(idx0) + + nframe = nframe + 1 + + suffix = get_file_suffix(outfile_i, 0) + if (suffix .eq. ".png") then + outfile_i = suffix@fBase + "." + sprinti("%0.6i", nframe) + suffix + end if + suffix = get_file_suffix(outfile_l, 0) + if (suffix .eq. ".png") then + outfile_l = suffix@fBase + "." + sprinti("%0.6i", nframe) + suffix + end if + + ; ========================================================================== + + ; ---------------------------------------------------------------------- + ; write provenance to netcdf output (and plot file) + ; ---------------------------------------------------------------------- + + statistics = (/"clim", "mean", "pdf"/) + domain = "reg" + plottype = "scatter" + caption_i = "Scatterplot of air temperature (x) vs. cloud ice fraction (y)." + caption_l = "Scatterplot of air temperature (x) vs. " + \ + "cloud liquid fraction (y)." + log_provenance(nc_outfile_i, outfile_i, caption_i, statistics, \ + domain, plottype, "", "", infiles) + log_provenance(nc_outfile_l, outfile_l, caption_l, statistics, \ + domain, plottype, "", "", infiles) + + leave_msg(DIAG_SCRIPT, "") + +end diff --git a/esmvaltool/diag_scripts/clouds/clouds_lifrac_scatter_postproc.ncl b/esmvaltool/diag_scripts/clouds/clouds_lifrac_scatter_postproc.ncl new file mode 100644 index 0000000000..92cc4b13e3 --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_lifrac_scatter_postproc.ncl @@ -0,0 +1,371 @@ +; CLOUDS_LIFRAC_SCATTER_POSTPROC +; ############################################################################ +; Author: Axel Lauer (DLR, Germany) +; ############################################################################ +; Description +; Read ice fraction from clouds_lifrac_scatter.ncl and plot results for +; cmip5/cmip6 model pairs defined below. +; +; Required diag_script_info attributes (diagnostic specific) +; models: array of CMIP5/CMIP6 model pairs to be compared +; refname: name of reference dataset +; +; Optional diag_script_info attributes (diagnostic specific) +; nbins: number of bins used by clouds_lifrac_scatter.ncl (default = 20) +; reg: region (string) (default = "") +; t_int: array of temperatures for printing additional diagnostics +; +; Required variable attributes (variable specific) +; none +; +; Optional variable_info attributes (variable specific) +; none +; +; Caveats +; none +; +; Modification history +; 20211113-lauer_axel: written. +; +; ############################################################################ + +load "$diag_scripts/../interface_scripts/interface.ncl" +load "$diag_scripts/shared/plot/aux_plotting.ncl" + +begin + + enter_msg(DIAG_SCRIPT, "") + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT) + log_info("++++++++++++++++++++++++++++++++++++++++++") + + set_default_att(diag_script_info, "nbins", 20) + set_default_att(diag_script_info, "reg", "") + set_default_att(diag_script_info, "t_int", (/240.0, 250.0, 260.0, 270.0/)) + + models = diag_script_info@models + t_int = diag_script_info@t_int + + if (isatt(diag_script_info, "refname")) then + refname = diag_script_info@refname + else + error_msg("f", DIAG_SCRIPT, "", "no reference dataset defined (refname).") + end if + + dims = dimsizes(models) + nmod = dims(0) + + nbins = diag_script_info@nbins + reg = diag_script_info@reg + + test = str_lower(diag_script_info@input_files) + + i = dimsizes(test) + if (i .ne. 2) then + error_msg("f", DIAG_SCRIPT, "", "number of datasets (ancestors) is " \ + + tostring(i) + ", expected 2") + end if + + if (reg .ne. "") then + reg = "_" + reg + end if + + fname5 = "" + fname6 = "" + + do i = 0, dimsizes(test) - 1 + if (isStrSubset(test(i), "cmip5")) then + fname5 = diag_script_info@input_files(i) + \ + "/clouds_lifrac_scatter_ice_cmip5" + reg + ".nc" + end if + if (isStrSubset(test(i), "cmip6")) then + fname6 = diag_script_info@input_files(i) + \ + "/clouds_lifrac_scatter_ice_cmip6" + reg + ".nc" + end if + end do + + if (fname5 .eq. "") then + error_msg("f", DIAG_SCRIPT, "", "no dataset (ancestor) for CMIP5 found.") + end if + if (fname6 .eq. "") then + error_msg("f", DIAG_SCRIPT, "", "no dataset (ancestor) for CMIP6 found.") + end if + + results = new((/nmod, nbins, 2/), float) + refdata = new(nbins, float) + mmmedian = new((/nbins, 2/), float) + mmmean = new((/nbins, 2/), float) + mmp10 = new((/nbins, 2/), float) + mmp90 = new((/nbins, 2/), float) + mmstd = new((/nbins, 2/), float) + + ; CMIP5 + infile5 = addfile(fname5, "r") + icefrac5 = infile5->icefrac + ; CMIP6 + infile6 = addfile(fname6, "r") + icefrac6 = infile6->icefrac + + results!1 = "bin" + results&bin = icefrac5&bin + + tmp = infile5->model + dims = dimsizes(tmp) + idxtmp = ispan(0, dims(0) - 1, 1) + models5 = new(dims(0), string) + do i = 0, dims(0) - 1 + models5(i) = tostring(tmp(i, :)) + if (isStrSubset(models5(i), "Median") .or. \ + isStrSubset(models5(i), "Mean") .or. \ + isStrSubset(models5(i), "Average") .or. \ + isStrSubset(models5(i), refname)) then + idxtmp(i) = -1 + end if + end do + delete(tmp) + delete(dims) + + idx5 = ind(idxtmp .ge. 0) + delete(idxtmp) + + tmp = infile6->model + dims = dimsizes(tmp) + idxtmp = ispan(0, dims(0) - 1, 1) + models6 = new(dims(0), string) + do i = 0, dims(0) - 1 + models6(i) = tostring(tmp(i, :)) + if (isStrSubset(models6(i), "Median") .or. \ + isStrSubset(models6(i), "Mean") .or. \ + isStrSubset(models6(i), "Average") .or. \ + isStrSubset(models6(i), refname)) then + idxtmp(i) = -1 + end if + end do + delete(tmp) + delete(dims) + + idx6 = ind(idxtmp .ge. 0) + delete(idxtmp) + + model_ok = new((/nmod, 2/), logical) + model_ok = False + ref_ok = False + + do imod = 0, nmod - 1 + idx = ind(models5 .eq. models(imod, 0)) + if (.not. ismissing(idx)) then + results(imod, :, 0) = icefrac5(idx, :) + model_ok(imod, 0) = True + end if + idx = ind(models6 .eq. models(imod, 1)) + if (.not. ismissing(idx)) then + results(imod, :, 1) = icefrac6(idx, :) + model_ok(imod, 1) = True + end if + idx = ind(models6 .eq. refname) + if (.not. ismissing(idx)) then + refdata(:) = icefrac6(idx, :) + ref_ok = True + end if + end do + + if (any(.not. model_ok(:, 0))) then + inotok = ind(.not. model_ok(:, 0)) + log_info("warning: could not find data for the following CMIP5 model(s) " \ + + str_join(models(inotok, 0), ",")) + end if + if (any(.not. model_ok(:, 1))) then + inotok = ind(.not. model_ok(:, 1)) + log_info("warning: could not find data for the following CMIP6 model(s) " \ + + str_join(models(inotok, 1), ",")) + end if + + ; calculate multi-model, p10 and p90, mean and standard deviation + + print("T (K), CMIP5-CMIP6 (abs), CMIP5-CMIP6 (rel), CMIP5, CMIP6, ref") + print("--------------------------------------------------------------") + + do n = 0, nbins - 1 + selection = icefrac5(idx5, n) + itmp = ind(.not.ismissing(selection)) + if (.not. ismissing(itmp(0))) then + sorted = selection(itmp) + qsort(sorted) + i10 = toint(dimsizes(sorted) * 0.1 + 0.5) + i50 = toint(dimsizes(sorted) * 0.5 + 0.5) + i90 = toint(dimsizes(sorted) * 0.9 - 0.5) + mmp10(n, 0) = sorted(i10) + mmmedian(n, 0) = sorted(i50) + mmp90(n, 0) = sorted(i90) + delete(sorted) + mmmean(n, 0) = avg(selection) + mmstd(n, 0) = stddev(selection) + else + mmp10(n, 0) = mmp10@_FillValue + mmedian(n, 0) = mmmedian@_FillValue + mmp90(n, 0) = mmp90@_FillValue + mmmean(n, 0) = mmmean@_FillValue + mmstd(n, 0) = mmstd@_FillValue + end if + + delete(selection) + delete(itmp) + + selection = icefrac6(idx6, n) + itmp = ind(.not.ismissing(selection)) + if (.not. ismissing(itmp(0))) then + sorted = selection(itmp) + qsort(sorted) + i10 = toint(dimsizes(sorted) * 0.1 + 0.5) + i50 = toint(dimsizes(sorted) * 0.5 + 0.5) + i90 = toint(dimsizes(sorted) * 0.9 - 0.5) + mmp10(n, 1) = sorted(i10) + mmmedian(n, 1) = sorted(i50) + mmp90(n, 1) = sorted(i90) + delete(sorted) + mmmean(n, 1) = avg(selection) + mmstd(n, 1) = stddev(selection) + else + mmp10(n, 1) = mmp10@_FillValue + mmedian(n, 0) = mmmedian@_FillValue + mmp90(n, 1) = mmp90@_FillValue + mmmean(n, 1) = mmmean@_FillValue + mmstd(n, 1) = mmstd@_FillValue + end if + + delete(selection) + delete(itmp) + + delta = mmmean(n, 0) - mmmean(n, 1) + + if (n .ge. 1) then + do it = 0, dimsizes(t_int) - 1 + if ((results&bin(n - 1) .lt. t_int(it)) .and. \ + (results&bin(n) .gt. t_int(it))) then + dx = results&bin(n) - results&bin(n - 1) + dy5 = mmmean(n, 0) - mmmean(n - 1, 0) + dy6 = mmmean(n, 1) - mmmean(n - 1, 1) + dyr = refdata(n) - refdata(n - 1) + r5 = mmmean(n - 1, 0) + dy5 / dx * (t_int(it) - results&bin(n - 1)) + r6 = mmmean(n - 1, 1) + dy6 / dx * (t_int(it) - results&bin(n - 1)) + rr = refdata(n - 1) + dyr / dx * (t_int(it) - results&bin(n - 1)) + + print(tostring(t_int(it)) + ", " + tostring(r5) + ", " \ + + tostring(r6) + ", " + tostring(rr)) + end if + end do + end if + + mmmean = where(mmmean .eq. 0, mmmean@_FillValue, mmmean) + + print(tostring(results&bin(n)) + ", " + tostring(delta) + " (" \ + + tostring(delta / mmmean(n, 0) * 100.0 + "%)") \ + + ", " + tostring(mmmean(n, 0)) + ", " + tostring(mmmean(n, 1)) \ + + ", " + tostring(refdata(n))) + end do + + ; ########################################### + ; # create the plots # + ; ########################################### + + plots = new(nmod + 2, graphic) + + res = True + res@gsnDraw = False ; do not draw yet + res@gsnFrame = False ; don't advance frame + res@xyMarkLineMode = "MarkLines" + res@xyMarkers = (/16, 16, 16/) + res@xyMonoMarkerColor = False + res@xyMarkerColors = (/"blue", "red", "black"/) + res@xyDashPatterns = (/0, 0, 0/) + res@xyMarkerSizeF = 0.01 + res@tmLabelAutoStride = True + res@tiMainFontHeightF = 0.025 + res@tiYAxisFontHeightF = 0.025 + res@tiXAxisFontHeightF = 0.025 + res@tiXAxisString = "temperature (K)" + res@tiYAxisString = "icefrac (%)" + + lgres = True + lgres@vpWidthF = 0.2 ; width of legend (NDC) + lgres@vpHeightF = 0.08 ; height of legend (NDC) + lgres@lgAutoManage = False ; Necessary to set font hgt + lgres@lgMonoLineColor = True + lgMonoMarkerIndex = False + lgMonoMarkerColor = False + lgres@lgLineColors = "black" + lgres@lgMonoItemType = True ; more than one type + lgres@lgItemType = res@xyMarkLineMode ; line/marker + lgres@lgDashIndexes = res@xyDashPatterns ; dash indexes + lgres@lgMarkerIndexes = res@xyMarkers ; marker indexes + lgres@lgMarkerColors = res@xyMarkerColors ; marker colors + lgres@lgLabelFontHeightF = 0.12 + lgres@lgLineLabelsOn = False + lgres@lgMarkerSizeF = 0.01 + + wks = get_wks("dummy_for_wks", DIAG_SCRIPT, \ + "clouds_lifrac_scatter_post_ice" + reg) + + data = new((/3, nbins/), float) + + do ii = 0, nmod + 1 + if (ii .lt. nmod) then + data(0, :) = results(ii, :, 0) + data(1, :) = results(ii, :, 1) + data(2, :) = refdata(:) + labels = (/models(ii, 0), models(ii, 1), "observations"/) + else if (ii .eq. nmod) then + data(0, :) = (/mmmedian(:, 0)/) + data(1, :) = (/mmmedian(:, 1)/) + data(2, :) = refdata(:) + labels = (/"CMIP5 MMMedian", "CMIP6 MMMedian", "observations"/) + else if (ii .eq. nmod + 1) then + data(0, :) = (/mmmean(:, 0)/) + data(1, :) = (/mmmean(:, 1)/) + data(2, :) = refdata(:) + labels = (/"CMIP5 MMMean", "CMIP6 MMMean", "observations"/) + end if + end if + end if + + plots(ii) = gsn_csm_xy(wks, results&bin, data, res) + + gsn_legend_ndc(wks, 3, labels, 0.58, 0.78, lgres) + + if (ii .ge. nmod) then + res2 = True + res2@gsnDraw = False ; do not draw yet + res2@gsnFrame = False ; don't advance frame + res2@xyLineColor = -1 ; Make lines transparent + mmvar = new((/2, nbins/), float) + if (ii .eq. nmod) then ; median + percentiles + mmvar(0, :) = mmp10(:, 0) + mmvar(1, :) = mmp90(:, 0) + else if (ii .eq. nmod + 1) then ; mean + stddev + mmvar(0, :) = mmmean(:, 0) - mmstd(:, 0) + mmvar(1, :) = mmmean(:, 0) + mmstd(:, 0) + end if + end if + res2@gsnXYFillColors = (/0.9, 0.9, 1.0, 1.0/) ; "lightblue" + plotvar5 = gsn_csm_xy(wks, results&bin, mmvar, res2) + overlay(plots(ii), plotvar5) + if (ii .eq. nmod) then ; median + percentiles + mmvar(0, :) = mmp10(:, 1) + mmvar(1, :) = mmp90(:, 1) + else if (ii .eq. nmod + 1) then + mmvar(0, :) = mmmean(:, 1) - mmstd(:, 1) + mmvar(1, :) = mmmean(:, 1) + mmstd(:, 1) + end if + end if + res2@gsnXYFillColors = (/1.0, 0.9, 0.9, 0.3/) ; "lightpink" + plotvar6 = gsn_csm_xy(wks, results&bin, mmvar, res2) + overlay(plots(ii), plotvar6) + delete(mmvar) + end if + + draw(plots(ii)) + frame(wks) + end do + +end diff --git a/esmvaltool/diag_scripts/clouds/clouds_pdf.ncl b/esmvaltool/diag_scripts/clouds/clouds_pdf.ncl new file mode 100644 index 0000000000..36f9f6fbef --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_pdf.ncl @@ -0,0 +1,554 @@ +; CLOUDS_PDF +; ############################################################################ +; Author: Axel Lauer (DLR, Germany) +; PROJECT-NAME ESA-CCI CMUG +; ############################################################################ +; Description +; Calculates temporal/spatial pdf's of 2-d (cloud) parameters for selected +; regions. +; +; Required diag_script_info attributes (diagnostic specific) +; xmin min value for bins (x axis) +; xmax max value for bins (x axis) +; +; Optional diag_script_info attributes (diagnostic specific) +; filename_add: optionally add this string to output filenames +; plot_average: show average frequency per bin +; region: show only selected geographic region given as latmin, +; latmax, lonmin, lonmax +; styleset: "CMIP5", "DEFAULT" +; ymin min value for frequencies (%) (y axis) +; ymax max value for frequencies (%) (y axis) +; +; Required variable attributes (variable specific) +; none +; +; Optional variable_info attributes (variable specific) +; reference_dataset: reference dataset +; +; Caveats +; none +; +; Modification history +; 20190916-lauer_axel: written. +; +; ############################################################################ + +load "$diag_scripts/../interface_scripts/interface.ncl" + +load "$diag_scripts/shared/statistics.ncl" +load "$diag_scripts/shared/plot/aux_plotting.ncl" +load "$diag_scripts/shared/dataset_selection.ncl" +load "$diag_scripts/shared/plot/style.ncl" +load "$diag_scripts/shared/plot/xy_line.ncl" + +begin + + enter_msg(DIAG_SCRIPT, "") + + var0 = variable_info[0]@short_name + info0 = select_metadata_by_name(input_file_info, var0) + dim_MOD = ListCount(info0) + if (isatt(variable_info[0], "reference_dataset")) then + refname = variable_info[0]@reference_dataset + end if + names = metadata_att_as_array(info0, "dataset") + projects = metadata_att_as_array(info0, "project") + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT + " (var: " + var0 + ")") + log_info("++++++++++++++++++++++++++++++++++++++++++") + + ; Set default values for non-required diag_script_info attributes + set_default_att(diag_script_info, "filename_add", "") + set_default_att(diag_script_info, "plot_average", False) + set_default_att(diag_script_info, "styleset", "DEFAULT") + set_default_att(diag_script_info, "multi_model_mean", False) + + if (.not.isatt(diag_script_info, "xmin") .or. \ + .not.isatt(diag_script_info, "xmax")) then + error_msg("f", DIAG_SCRIPT, "", "no xmin / xmax specified in recipe") + end if + + xmin = diag_script_info@xmin + xmax = diag_script_info@xmax + + if (diag_script_info@filename_add .ne. "") then + filename_add = "_" + diag_script_info@filename_add + else + filename_add = "" + end if + + plot_average = diag_script_info@plot_average + + ; make sure path for (mandatory) netcdf output exists + + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + + ref_ind = -1 ; set to invalid value + + ; if attribute is present, use it so datasets can be sorted + if (isvar("refname")) then + ; set reference model + ref_ind = ind(names .eq. refname) + if (ismissing(ref_ind)) then + log_info("warning: reference dataset (" + refname + ") not found.") + ref_ind = -1 + end if + end if + + climofiles = metadata_att_as_array(info0, "filename") + + outfile = "" + +end + +begin + ; ############ + ; # get data # + ; ############ + + plot = new((/dim_MOD/), graphic) + + ind_all_sorted = ispan(0, dim_MOD - 1, 1) ; create array + + if (ref_ind .ge. 0) then + ind_wo_ref = ind(names .ne. refname) + ind_all_sorted(0) = ref_ind + ind_all_sorted(1:dim_MOD - 1) = ind_wo_ref + end if + + bins = 20 + + data_all = new((/dim_MOD, bins/), float) + data_all!0 = "models" + data_all&models = names + + ; filenames for netcdf output + + nc_filename = work_dir + "clouds_pdf_" + var0 + filename_add + ".nc" + nc_filename@existing = "append" + + do ii = 0, dim_MOD - 1 + + imod = ind_all_sorted(ii) + log_info("processing " + names(imod)) + + if (isvar("data1")) then + delete(data1) + end if + + data1 = read_data(info0[imod]) + + ; check dimensions + + dims = getvardims(data1) + if (dimsizes(dims) .lt. 2) then + error_msg("f", DIAG_SCRIPT, "", dimsizes(dims) + \ + " dimensions, need 2 or 3") + end if + idx = ind(dims .eq. "lat") + if (ismissing(idx)) then + error_msg("f", DIAG_SCRIPT, "", "no lat dimension") + end if + idx = ind(dims .eq. "lon") + if (ismissing(idx)) then + error_msg("f", DIAG_SCRIPT, "", "no lon dimension") + end if + + ; if requested, select geographical region + + if (isatt(diag_script_info, "region")) then + region = diag_script_info@region + data1 := area_operations(data1, region(0), region(1), region(2), \ + region(3), "extract", False) + delete(region) + end if + + ; variable specific plotting settings + + res = True + + if (var0.eq."pr") then + ; convert from kg m-2 s-1 to mm day-1 + data1 = data1 * 86400.0 + data1@units = "mm day-1" + end if + + if (var0.eq."tas") then + ; convert from K to degC + data1 = data1 - 273.15 + data1@units = "degC" + end if + + if (var0.eq."clt") then + res@gsnHistogramClassIntervals = ispan(0, 100, 10) + end if + + ; ########################################### + ; # other Metadata: diag_script, var # + ; ########################################### + ; add to data1 as attributes without prefix + + if (isatt(data1, "diag_script")) then ; add to existing entries + temp = data1@diag_script + delete(data1@diag_script) + data1@diag_script = array_append_record(temp, (/DIAG_SCRIPT/), 0) + delete(temp) + else ; add as new attribute + data1@diag_script = (/DIAG_SCRIPT/) + end if + + if (isatt(variable_info[0], "long_name")) then + data1@var_long_name = variable_info[0]@long_name + end if + + data1@var = var0 + + if (isatt(variable_info[0], "units")) then + data1@var_units = variable_info[0]@units + else + data1@var_units = "" + end if + + ; ########################################### + ; # create the plot # + ; ########################################### + + ; function in aux_plotting.ncl + + if (ii.eq.0) then + nframe = 0 + wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_pdf_" + var0 \ + + filename_add) + wks_line = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_pdf_" + var0 \ + + filename_add + "_line") + end if + + res@gsnHistogramComputePercentages = True + res@gsnHistogramPercentSign = True + res@tiXAxisString = data1@var + " (" + data1@units + ")" + res@tmYLOn = False + res@tiYAxisOn = False + res@tiMainString = names(imod) + + plot(ii) = gsn_histogram(wks, ndtooned(data1), res) + nframe = nframe + 1 + + ; mandatory netcdf output + + opt = True + opt@bin_min = xmin + opt@bin_max = xmax + + data_out = pdfx(data1, bins, opt) + data_out@diag_script = (/DIAG_SCRIPT/) + data_out@var = var0 + "_pdf_" + names(imod) + nc_outfile = ncdf_write(data_out, nc_filename) + + if (ii .eq. 0) then + bin_min = data_out@bin_bound_min + bin_max = data_out@bin_bound_max + data_all!1 = var0 + data_all&$var0$ = data_out@bin_center + data_all@units = data_out@units + end if + + data_all(imod, :) = tofloat(data_out) + + delete(data_out) + + ; ======================================================================= + + end do ; ii-loop (models) + + ; sort plots if needed (observations go first) + + plottmp = ispan(0, dim_MOD - 1, 1) + plotind = plottmp + + ; move plots of observational datasets (if present) into the first line(s) + ; of the panel plot + + j = 0 + do i = 0, dimsizes(plottmp) - 1 + if (i.eq.ref_ind) then + plotind(j) = plottmp(i) + j = j + 1 + else if (plottmp(i) .lt. dimsizes(projects)) then + if (isStrSubset(str_lower(projects(plottmp(i))), "obs")) then + plotind(j) = plottmp(i) + j = j + 1 + end if + end if + end if + end do + + do i = 0, dimsizes(plottmp) - 1 + if ((isStrSubset(str_lower(projects(plottmp(i))), \ + "obs")).or.(i.eq.ref_ind)) then + else + plotind(j) = plottmp(i) + j = j + 1 + end if + end do + + pres = True ; needed to override + ; panelling defaults + + pres@gsnPanelFigureStrings = names(plotind) + + pres@gsnPanelFigureStringsFontHeightF = min((/0.01, 0.01 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + pres@lbLabelFontHeightF = min((/0.015, 0.01 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + pres@lbAutoManage = False + pres@lbTopMarginF = 0.1 + pres@lbTitleOn = True + pres@lbTitleFontHeightF = min((/0.015, 0.01 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + pres@lbTitlePosition = "Bottom" + pres@lbTitleString = data1@long_name + " (" \ + + data1@units + ")" + pres@lbPerimOn = False ; draw line around label + ; bar area + pres@gsnPanelCenter = False + if (dim_MOD.le.8) then + pres@pmLabelBarOrthogonalPosF = -0.03 + else + pres@pmLabelBarOrthogonalPosF = -0.01 ; shift label bar a bit to + ; the bottom + end if + + pres@gsnPanelRowSpec = True ; tell panel what order to plt + pres@gsnPanelYWhiteSpacePercent = 5 + pres@gsnPanelXWhiteSpacePercent = 5 + if (isatt(diag_script_info, "PanelTop")) then + top = tofloat(diag_script_info@PanelTop) + else + top = 0.99 ; default + end if + pres@gsnPanelTop = top + + if (isvar("plotsperline")) then + delete(plotsperline) + end if + + n = toint((dim_MOD + 1) / 4) + if (n .lt. 1) then + n = 1 + end if + plotsperline = new(n, integer) + plotsperline = 4 + + if ((isStrSubset(str_lower(projects(plotind(0))), \ + "obs")).and. \ + .not.(isStrSubset(str_lower(projects(plotind(1))), \ + "obs"))) then + plotsperline(0) = 1 + end if + + if (sum(plotsperline).gt.dimsizes(plotind)) then + plotsperline(dimsizes(plotsperline) - 1) = 1 + end if + + if (sum(plotsperline).lt.dimsizes(plotind)) then + xadd = 1 + xtmp = array_append_record(plotsperline, xadd, 0) + delete(plotsperline) + plotsperline = xtmp + delete(xtmp) + end if + + gsn_panel(wks, plot(plotind), plotsperline, pres) + outfile = wks@fullname + nframe = nframe + 1 + + suffix = get_file_suffix(outfile, 0) + if (suffix .eq. ".png") then + outfile = suffix@fBase + "." + sprinti("%0.6i", nframe) + suffix + end if + + ; ======================================================================== + + ; line plot + + colors = project_style(info0, diag_script_info, "colors") + dashes = project_style(info0, diag_script_info, "dashes") + thicks = project_style(info0, diag_script_info, "thicks") + + delete(res) + res = True + res@gsnDraw = False ; do not draw yet + res@gsnFrame = False ; don't advance frame + res@xyLineColors = colors ; change line color + res@xyLineThicknesses = thicks ; make 2nd lines thicker + res@xyMonoDashPattern = False + res@xyDashPatterns = dashes + res@gsnDraw = False ; don't draw yet + res@gsnFrame = False ; don't advance frame yet + res@tiMainFontHeightF = .025 ; font height + res@gsnMaximize = True + res@vpHeightF = 0.4 + res@vpWidthF = 0.8 + if (isatt(diag_script_info, "ymin")) then + res@trYMinF = diag_script_info@ymin + else + res@trYMinF = min(data_all) + end if + if (isatt(diag_script_info, "ymax")) then + res@trYMaxF = diag_script_info@ymax + else + res@trYMaxF = max(data_all) + end if +; res@tiXAxisString = data1@long_name + " (" + data1@units + ")" + res@tiXAxisString = data1@var + " (" + data1@units + ")" + res@tiYAxisString = "Frequency (" + data_all@units + ")" + + lineplot = gsn_csm_xy(wks_line, data_all&$var0$, data_all, res) + + if (plot_average) then + ; model indices w/o MultiModelMean / MultiModelMedian + idxmod = get_mod(names, projects) + ; calculate mean and stddev + result_avg = dim_avg_n(data_all(idxmod, :), 0) + result_std = dim_stddev_n(data_all(idxmod, :), 0) + + ; plot average + stddev + res_std = True + res_std@gsnDraw = False ; do not draw yet + res_std@gsnFrame = False ; don't advance frame + res_std@gsnXYFillColors = (/1.0, 0.9, 0.9/) + res_std@xyLineColor = -1 ; Make lines transparent + mmstddev = new((/2, bins/), float) + mmp10 = new((/bins/), float) + mmp90 = new((/bins/), float) + + do n = 0, bins - 1 + selection = data_all(idxmod, n) + itmp = ind(.not.ismissing(selection)) + if (.not. ismissing(itmp(0))) then + sorted = selection(itmp) + qsort(sorted) + i10 = toint(dimsizes(sorted) * 0.1 + 0.5) + i90 = toint(dimsizes(sorted) * 0.9 - 0.5) + mmp10(n) = sorted(i10) + mmp90(n) = sorted(i90) + delete(sorted) + else + mmp10(n) = mmp10@_FillValue + mmp90(n) = mmp90@_FillValue + end if + delete(selection) + delete(itmp) + end do + +; mmstddev(0, :) = result_avg - result_std +; mmstddev(1, :) = result_avg + result_std +; plotstd = gsn_csm_xy(wks_line, data_all&$var0$, mmstddev, res_std) + + mmstddev(0, :) = mmp10(:) + mmstddev(1, :) = mmp90(:) + plotstd = gsn_csm_xy(wks_line, data_all&$var0$, mmstddev, res_std) + + delete(mmstddev) + + overlay(lineplot, plotstd) + + res_avg = True + res_avg@gsLineColor = "red" + res_avg@gsLineThicknessF = 3 + + avgline = gsn_add_polyline(wks_line, plotstd, data_all&$var0$, \ + result_avg, res_avg) + end if + + draw(lineplot) + frame(wks_line) + +; delete(res) +; res = True +; res@stddev = True +; res@tiXAxisString = data1@long_name + " (" + data1@units + ")" +; res@tiYAxisString = "Frequency (" + data_all@units + ")" +; diag_script_info@xy_line_legend = False +; data_all@legend_outside = True +; wks_line@legendfile = get_plot_dir() + "clouds_pdf_" + var0 \ +; + filename_add + "_legend" +; xy_line(wks_line, data_all, data_all&$var0$, dim_stddev_n(data_all, 0), \ +; xy_line(wks_line, data_all, data_all&$var0$, result_std, \ +; res, info0) + + outfile_line = wks_line@fullname + + ; ======================================================================== + + log_info("Wrote " + outfile) + log_info("Wrote " + outfile_line) + + ; ------------------------------------------------------------------------ + ; write provenance to netcdf output and plot file(s) (mean) + ; ------------------------------------------------------------------------ + + statistics = (/"clim", "pdf"/) + if (isatt(diag_script_info, "region")) then + domain = "reg" + else + domain = "global" + end if + plottype = "geo" + + caption = "Pdf of variable " + var0 + ")." + log_provenance(nc_outfile, outfile, caption, statistics, \ + domain, plottype, "", "", climofiles) + + ; ---------------------------------------------------------------------- + ; write mmm and ref to additional netcdf + ; ---------------------------------------------------------------------- + + if (isvar("idxmod")) then + delete(idxmod) + end if + idxmod = get_mod(names, projects) + ; calculate mmm + if (dimsizes(idxmod) .gt. 1) then + mmmpdf = dim_avg_n_Wrap(data_all(idxmod, :), 0) + + mmmpdf@diag_script = (/DIAG_SCRIPT/) + mmmpdf@var = var0 + "_pdf_mmm" + mmmpdf@datasets = str_join(names(idxmod), ", ") + + if (var0 .eq. "clt") then + x = mmmpdf&$var0$ + idx60 = ind(x .ge. 60.) + idx80 = ind(x .ge. 80.) + mmmpdf@cummulative_freq_ge_60 = sum(mmmpdf(idx60)) + mmmpdf@cummulative_freq_ge_80 = sum(mmmpdf(idx80)) + end if + + nc_filename2 = work_dir + "clouds_pdf_" + var0 + filename_add + \ + "_mmm_ref.nc" + + if (ref_ind .ge. 0) then + refpdf = data_all(ref_ind, :) + refpdf@diag_script = (/DIAG_SCRIPT/) + refpdf@var = var0 + "_pdf_ref" + refpdf@datasets = names(ref_ind) + if (var0 .eq. "clt") then + refpdf@cummulative_freq_ge_60 = sum(refpdf(idx60)) + refpdf@cummulative_freq_ge_80 = sum(refpdf(idx80)) + end if + nc_outfile2 = ncdf_write(refpdf, nc_filename2) + nc_filename2@existing = "append" + end if + + nc_outfile2 = ncdf_write(mmmpdf, nc_filename2) + end if + + ; ======================================================================== + + leave_msg(DIAG_SCRIPT, "") + +end diff --git a/esmvaltool/diag_scripts/clouds/clouds_scatter.ncl b/esmvaltool/diag_scripts/clouds/clouds_scatter.ncl new file mode 100644 index 0000000000..35e217613b --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_scatter.ncl @@ -0,0 +1,609 @@ +; CLOUDS_SCATTER +; ############################################################################ +; Author: Axel Lauer (DLR, Germany) +; ############################################################################ +; Description +; Calculates mean values of variable y per bin of variable x and displays +; the results as scatter plot. +; +; Required diag_script_info attributes (diagnostic specific) +; var_x: short name of variable on x-axis +; var_y: short name of variable on y-axis +; xmin: min x value for generating bins +; xmax: max x value for generating bins +; +; Optional diag_script_info attributes (diagnostic specific) +; filename_add: optionally add this string to plot filesnames +; nbins: number of equally spaced bins (var_x), default = 20 +; ymin_mm: min y value for plotting MultiModelMean +; ymax_mm: max y value for plotting MultiModelMean +; +; Required variable attributes (variable specific) +; none +; +; Optional variable_info attributes (variable specific) +; reference_dataset: reference dataset +; +; Caveats +; none +; +; Modification history +; 20230117-lauer_axel: added support for ICON (code from Manuel) +; 20210210-lauer_axel: written. +; +; ############################################################################ + +load "$diag_scripts/../interface_scripts/interface.ncl" + +load "$diag_scripts/shared/plot/aux_plotting.ncl" +load "$diag_scripts/shared/dataset_selection.ncl" +load "$diag_scripts/shared/statistics.ncl" +load "$diag_scripts/shared/plot/style.ncl" + +begin + + enter_msg(DIAG_SCRIPT, "") + + diag = "clouds_scatter.ncl" + variables = get_unique_values(metadata_att_as_array(variable_info, \ + "short_name")) + + ; Check required diag_script_info attributes + exit_if_missing_atts(diag_script_info, (/"var_x", "var_y", "xmin", "xmax"/)) + + file_type = output_type() + + ; make sure required variables are available + var_x = diag_script_info@var_x + var_y = diag_script_info@var_y + + ; special case: columnicefrac = clivi / (clivi + lwp) + ; note: clwvi is not used since it contains lwp only for some models + ; (by error) + + calcicefrac = False + calctcwp = False + if (var_y .eq. "columnicefrac") then + calcicefrac = True + varlist = (/var_x, "clivi", "lwp"/) + else if (var_y .eq. "totalcwp") then + calctcwp = True + varlist = (/var_x, "clivi", "lwp"/) + else + varlist = (/var_x, var_y/) + end if + end if + idx = new(dimsizes(varlist), integer) + + nVAR = dimsizes(varlist) + refname = new(nVAR, string) + + do i = 0, nVAR - 1 + idx(i) = ind(variables .eq. varlist(i)) + end do + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT + " (var: " + variables(idx) + ")") + log_info("++++++++++++++++++++++++++++++++++++++++++") + + if (any(ismissing(idx))) then + errstr = "diagnostic " + diag + " requires the following variable(s): " \ + + str_join(varlist, ", ") + error_msg("f", DIAG_SCRIPT, "", errstr) + end if + + ; save input files for writing provenance + + infiles = metadata_att_as_array(input_file_info, "filename") + + ; get reference datasets (if present) and check that number of datasets + ; is equal for each variable + + do i = 0, nVAR - 1 + var = variables(idx(i)) + var_info = select_metadata_by_name(variable_info, var) + var_info := var_info[0] + if (isatt(var_info, "reference_dataset")) then + refname(i) = var_info@reference_dataset + end if + info = select_metadata_by_name(input_file_info, var) + if (i .eq. 0) then + dim_MOD = ListCount(info) + else + dim_test = ListCount(info) + if (dim_test .ne. dim_MOD) then + error_msg("f", DIAG_SCRIPT, "", "number of datasets for variable " \ + + var + " does not match number of datasets for " \ + + variables(idx(0))) + end if + end if + delete(info) + delete(var) + delete(var_info) + end do + + ; Set default values for non-required diag_script_info attributes + + set_default_att(diag_script_info, "filename_add", "") + set_default_att(diag_script_info, "nbins", 20) + + if (diag_script_info@filename_add .ne. "") then + filename_add = "_" + diag_script_info@filename_add + else + filename_add = "" + end if + + nbins = toint(diag_script_info@nbins) + + ; make sure path for (mandatory) netcdf output exists + + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + +end + +begin + ; ############ + ; # get data # + ; ############ + + info_x = select_metadata_by_name(input_file_info, varlist(0)) + names_x = metadata_att_as_array(info_x, "dataset") + projects_x = metadata_att_as_array(info_x, "project") + info_y = select_metadata_by_name(input_file_info, varlist(1)) + names_y = metadata_att_as_array(info_y, "dataset") + projects_y = metadata_att_as_array(info_y, "project") + + refidx_x = ind(names_x .eq. refname(0)) + refidx_y = ind(names_y .eq. refname(1)) + + if (ismissing(refidx_x) .or. ismissing(refidx_y)) then + refidx_x = -1 + refidx_y = -1 + end if + + result_avg = new((/dim_MOD, nbins/), float) + result_std = new((/dim_MOD, nbins/), float) + bincenter = new((/nbins/), float) + + xmax = diag_script_info@xmax + xmin = diag_script_info@xmin + binsize = tofloat(xmax - xmin) / nbins + + do n = 0, nbins - 1 + x0 = n * binsize + x1 = x0 + binsize + bincenter(n) = xmin + 0.5 * (x0 + x1) + end do + + do ii = 0, dim_MOD - 1 + atts_x = True + atts_x@short_name = varlist(0) + + atts_y = True + atts_y@short_name = varlist(1) + + ; reference datasets may have different names + if (ii .eq. refidx_x) then + atts_y@dataset = refname(1) + atts_x@dataset = refname(0) + ; all other datasets: force same dataset name for var_x and var_y + else + atts_y@dataset = names_x(ii) + atts_x@dataset = names_x(ii) + end if + + ; read var_x + + info = select_metadata_by_atts(input_file_info, atts_x) + x = read_data(info[0]) + delete(info) + + ; read var_y + + info = select_metadata_by_atts(input_file_info, atts_y) + y = read_data(info[0]) + delete(info) + + if (calcicefrac) then + atts_y@short_name = varlist(2) + info = select_metadata_by_atts(input_file_info, atts_y) + z = read_data(info[0]) + delete(info) + min_mass = 1.0e-6 + ; filter valid values (needed for some models) + y = where(y .lt. 0.0, y@_FillValue, y) + y = where(isnan_ieee(y), y@_FillValue, y) + z = where(z .lt. 0.0, z@_FillValue, z) + z = where(isnan_ieee(z), z@_FillValue, z) + mass = y + z + delete(z) + mass = where(mass .lt. min_mass, mass@_FillValue, mass) + + ; ice fraction = ice / (ice + lwp) * 100% + y = 100.0 * y / mass + delete(mass) + + y@units = "%" + y@long_name = "cloud ice fraction" + y@var = "columnicefrac" + end if + + ; calculate total cloud water path as sum of liquid water path (lwp) + ; and ice water path (clivi); + ; we do not use the CMOR variable clwvi directly as this variable + ; erroneously contains only cloud liquid water for some models + + if (calctcwp) then + atts_y@short_name = varlist(2) + info = select_metadata_by_atts(input_file_info, atts_y) + z = read_data(info[0]) + delete(info) + y = y + z + delete(z) + y@long_name = "Condensed Water Path" + y@var = "totalcwp" + end if + + ; check dimensions + + dims_x = dimsizes(x) + dims_y = dimsizes(y) + + dimerror = False + + if (dimsizes(dims_x) .eq. dimsizes(dims_y)) then + if (any(dims_x - dims_y .ne. 0)) then + dimerror = True + end if + else + dimerror = True + end if + + if (dimerror) then + error_msg("f", DIAG_SCRIPT, "", "dimensions of datasets " \ + + atts_x@dataset + " (variable " + var_x + ") and " \ + + atts_y@dataset + " (variable " + var_y + ") do not match.") + end if + + ; check dimensions + + if ((dimsizes(dims_x) .ne. dimsizes(dims_y)) .or. \ + (dimsizes(dims_x) .lt. 3) .or. (dimsizes(dims_x) .gt. 4)) then + error_msg("f", DIAG_SCRIPT, "", "all variables need to have the " + \ + "same number of dimensions (time, [optional: level], " + \ + "latitude, longitude)") + end if + + do i = 0, nVAR - 1 + var = variables(idx(i)) + if (var .eq. varlist(0)) then + dims = getvardims(x) + else + dims = getvardims(y) + end if + testidx = ind(dims .eq. "lon") + if (ismissing(testidx)) then + error_msg("f", DIAG_SCRIPT, "", var + ": no lon dimension") + end if + testidx = ind(dims .eq. "lat") + if (ismissing(testidx)) then + error_msg("f", DIAG_SCRIPT, "", var + ": no lat dimension") + end if + testidx = ind(dims .eq. "time") + if (ismissing(testidx)) then + error_msg("f", DIAG_SCRIPT, "", var + ": no time dimension") + end if + delete(dims) + end do + + delete(dims_x) + delete(dims_y) + delete(testidx) + + ref_ind = refidx_x + if (ismissing(ref_ind)) then + ref_ind = -1 + end if + names = names_x + projects = projects_x + + if (refidx_x .ge. 0) then + ; if reference datasets for var_x and var_y are from different sources + if (refname(0) .ne. refname(1)) then + names(refidx_x) = refname(0) + "/" + refname(1) + end if + end if + + ; save attributes long_name and units + long_name = y@long_name + units = y@units + xunits = x@units + + x1d = ndtooned(x) + delete(x) + y1d = ndtooned(y) + delete(y) + + do n = 0, nbins - 1 + x0 = xmin + n * binsize + x1 = x0 + binsize + idx0 = ind((x1d .gt. x0) .and. (x1d .le. x1)) + if (.not.all(ismissing(idx0))) then + result_avg(ii, n) = avg(y1d(idx0)) + result_std(ii, n) = stddev(y1d(idx0)) + + else + result_avg(ii, n) = result_avg@_FillValue + result_std(ii, n) = result_std@_FillValue + end if + delete(idx0) + end do + + delete(x1d) + delete(y1d) + end do ; ii-loop (models) + + ; if multiple models are present, calculate standard deviation of all models + + ; find all indices of models w/o MultiModelMean/MultiModelMedian (if present) + + idxmod = get_mod(names, projects) + + if (idxmod(0) .eq. -1) then + flag_multimod = False + mm_ind = -1 + elseif (dimsizes(idxmod) .eq. 1) then + flag_multimod = False + mm_ind = -1 + else + flag_multimod = True + mmavg = new((/1, nbins/), float) + mmstd = new((/1, nbins/), float) + mmp10 = new((/1, nbins/), float) + mmp90 = new((/1, nbins/), float) + do n = 0, nbins - 1 + mmavg(0, n) = avg(result_avg(idxmod, n)) + mmstd(0, n) = stddev(result_avg(idxmod, n)) + selection = result_avg(idxmod, n) + itmp = ind(.not.ismissing(selection)) + if (.not. ismissing(itmp(0))) then + sorted = selection(itmp) + qsort(sorted) + i10 = toint(dimsizes(sorted) * 0.1 + 0.5) + i90 = toint(dimsizes(sorted) * 0.9 - 0.5) + mmp10(0, n) = sorted(i10) + mmp90(0, n) = sorted(i90) + delete(sorted) + else + mmp10(0, n) = mmp10@_FillValue + mmp90(0, n) = mmp90@_FillValue + end if + delete(selection) + delete(itmp) + end do + mm_ind = dim_MOD + dim_MOD = dim_MOD + 1 + result_avg := array_append_record(result_avg, mmavg, 0) + result_std := array_append_record(result_std, mmstd, 0) + result_std(dim_MOD - 1, :) = 0.0 + names := array_append_record(names, (/"Multi-model average"/), 0) + end if + + ; ########################################### + ; # netCDF output # + ; ########################################### + + nc_filename = work_dir + "clouds_scatter_" + var_x + "_" + var_y + \ + filename_add + ".nc" + + result_avg!0 = "model" + result_avg!1 = "bin" + + result_avg&model = str_sub_str(names, "/", "-") + result_avg&bin = bincenter + + result_avg@diag_script = (/DIAG_SCRIPT/) + result_avg@var = var_y + result_avg@var_long_name = long_name + result_avg@var_units = units + + nc_outfile = ncdf_write(result_avg, nc_filename) + + ; ########################################### + ; # create the plots # + ; ########################################### + + plots = new(dim_MOD, graphic) + stdbar = new((/nbins, dim_MOD/), graphic) + centers = new((/nbins, dim_MOD/), graphic) + centersout = new((/nbins, dim_MOD/), graphic) + stdbarR = new((/nbins, dim_MOD/), graphic) + centersR = new((/nbins, dim_MOD/), graphic) + centersRout = new((/nbins, dim_MOD/), graphic) + res = True + + wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_scatter_" + \ + var_x + "_" + var_y + filename_add) + + data = new((/2, nbins/), float) + if (ref_ind .gt. 0) then + data(0, :) = result_avg(ref_ind, :) + else + data(0, :) = data@_FillValue + end if + + nframe = 0 + + do ii = 0, dim_MOD - 1 + if (ii .eq. refidx_x) then + continue + end if + + res@gsnDraw = False ; do not draw yet + res@gsnFrame = False ; don't advance frame + res@xyMarkLineMode = "MarkLines" + res@xyDashPatterns = (/0., 0./) + res@tmLabelAutoStride = True + res@xyLineThicknesses = (/2.0, 2.0/) + res@xyLineColors = (/"black", "red"/) + res@tiMainFontHeightF = 0.025 + res@tiYAxisFontHeightF = 0.025 + res@tiXAxisFontHeightF = 0.025 + res@tiXAxisString = var_x + " (" + xunits + ")" + res@tiYAxisString = var_y + " (" + units + ")" + + if (ii .eq. mm_ind) then + if (isatt(diag_script_info, "ymin_mm")) then + res@trYMinF = diag_script_info@ymin_mm + end if + if (isatt(diag_script_info, "ymax_mm")) then + res@trYMaxF = diag_script_info@ymax_mm + end if + else + if (isatt(res, "trYMinF")) then + delete(res@trYMinF) + end if + if (isatt(res, "trYMaxF")) then + delete(res@trYMaxF) + end if + end if + + polyres = True + polyres@gsMarkerSizeF = 0.01 + polyres@gsLineColor = "red" + polyres@gsLineThicknessF = 1.0 + + polyresRef = True + polyresRef@gsMarkerSizeF = 0.01 + polyresRef@gsLineColor = "black" + polyresRef@gsLineThicknessF = 1.0 + + data(1, :) = result_avg(ii, :) + + res@tiMainString = names(ii) + + plots(ii) = gsn_csm_xy(wks, result_avg&bin, data, res) + nframe = nframe + 1 + + if (ii .eq. mm_ind) then + res_std = True + res_std@gsnDraw = False ; do not draw yet + res_std@gsnFrame = False ; don't advance frame + res_std@gsnXYFillColors = (/1.0, 0.9, 0.9/) ; "lightpink" + res_std@xyLineColor = -1 ; Make lines transparent + mmstddev = new((/2, nbins/), float) +; mmstddev(0, :) = mmavg(0, :) - mmstd(0, :) +; mmstddev(1, :) = mmavg(0, :) + mmstd(0, :) + mmstddev(0, :) = mmp10(0, :) + mmstddev(1, :) = mmp90(0, :) + plotstd = gsn_csm_xy(wks, result_avg&bin, mmstddev, res_std) + delete(mmstddev) + overlay(plots(ii), plotstd) + end if + + do i = 0, nbins - 1 + y0 = result_avg(ii, i) + if (.not.ismissing(y0)) then + x0 = result_avg&bin(i) + stdbar(i, ii) = gsn_add_polyline(wks, plots(ii), (/x0, x0/), \ + (/y0 + result_std(ii, i), y0 - \ + result_std(ii, i)/), polyres) + polyres@gsMarkerIndex = 16 + polyres@gsMarkerColor = "red" + centers(i, ii) = gsn_add_polymarker(wks, plots(ii), (/x0, x0/), \ + (/y0, y0/), polyres) + polyres@gsMarkerIndex = 4 + polyres@gsMarkerColor = "black" + centersout(i, ii) = gsn_add_polymarker(wks, plots(ii), (/x0, x0/), \ + (/y0, y0/), polyres) + end if + y0 = result_avg(ref_ind, i) + if (.not.ismissing(y0)) then + x0 = result_avg&bin(i) + stdbarR(i, ii) = gsn_add_polyline(wks, plots(ii), (/x0, x0/), \ + (/y0 + result_std(ref_ind, i), \ + y0 - result_std(ref_ind, i)/), \ + polyresRef) + polyresRef@gsMarkerIndex = 16 + polyresRef@gsMarkerColor = "white" + centersR(i, ii) = gsn_add_polymarker(wks, plots(ii), (/x0, x0/), \ + (/y0, y0/), polyresRef) + polyresRef@gsMarkerIndex = 4 + polyresRef@gsMarkerColor = "black" + centersRout(i, ii) = gsn_add_polymarker(wks, plots(ii), (/x0, x0/), \ + (/y0, y0/), polyresRef) + end if + end do + + draw(plots(ii)) + frame(wks) + + end do + + pres = True ; needed to override + ; panelling defaults + pres@gsnPanelCenter = False + + idx0 = ind(.not.ismissing(plots)) + n = dimsizes(idx0) + pres@gsnPanelFigureStrings = names(idx0) + pres@gsnPanelFigureStringsFontHeightF = min((/0.008, 0.008 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + pres@lbLabelFontHeightF = min((/0.01, 0.01 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + outfile = panelling(wks, plots(idx0), (n + 3) / 4, 4, pres) + nframe = nframe + 1 + delete(idx0) + + log_info("Wrote " + outfile) + + suffix = get_file_suffix(outfile, 0) + if (suffix .eq. ".png") then + outfile = suffix@fBase + "." + sprinti("%0.6i", nframe) + suffix + end if + + ; ========================================================================== + + ; ---------------------------------------------------------------------- + ; write provenance to netcdf output (and plot file) + ; ---------------------------------------------------------------------- + + statistics = (/"clim", "mean"/) + domain = "reg" + plottype = "scatter" + caption = "Scatterplot of " + var_x + " (x) vs. " + var_y + " (y)." + log_provenance(nc_outfile, outfile, caption, statistics, \ + domain, plottype, "", "", infiles) + + ; ---------------------------------------------------------------------- + ; write mmm and ref to additional netcdf + ; ---------------------------------------------------------------------- + + if ((mm_ind .ge. 0) .and. (ref_ind .ge. 0)) then + mmm = result_avg(mm_ind, :) + ref = result_avg(ref_ind, :) + + mmm@var = var_y + "_mmm" + ref@var = var_y + "_ref" + + ratio = mmm + ratio = ratio / ref + ratio@average = avg(ratio) + ratio@var = var_y + "_ratio" + + nc_filename2 = work_dir + "clouds_scatter_" + var_x + "_" + var_y + \ + filename_add + "_ref_mmm_ratio.nc" + + nc_outfile2 = ncdf_write(mmm, nc_filename2) + nc_filename2@existing = "append" + nc_outfile2 = ncdf_write(ref, nc_filename2) + nc_outfile2 = ncdf_write(ratio, nc_filename2) + end if + + ; ---------------------------------------------------------------------- + + leave_msg(DIAG_SCRIPT, "") + +end diff --git a/esmvaltool/diag_scripts/clouds/clouds_seasonal_cycle.ncl b/esmvaltool/diag_scripts/clouds/clouds_seasonal_cycle.ncl new file mode 100644 index 0000000000..d918e9eccb --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_seasonal_cycle.ncl @@ -0,0 +1,510 @@ +; CLOUDS_SEASONAL_CYCLE +; ############################################################################ +; Author: Axel Lauer (DLR, Germany) +; ############################################################################ +; Description +; Calculates the amplitude and month of maximum values from the +; climatological mean seasonal cycle. +; +; Required diag_script_info attributes (diagnostic specific) +; none +; +; Optional diag_script_info attributes (diagnostic specific) +; colormap: e.g., WhiteBlueGreenYellowRed, rainbow +; epsilon: "epsilon" value to be replaced with missing values +; explicit_cn_levels: use these contour levels for plotting +; filename_add: optionally add this string to plot filesnames +; projection: map projection, e.g., Mollweide, Mercator +; var: short_name of variable to process (default = "" i.e. use +; first variable in variable list) +; +; Required variable_info attributes (variable specific) +; none +; +; Optional variable_info attributes (variable specific) +; long_name: description of variable +; reference_dataset: name of reference datatset +; +; Caveats +; none +; +; Modification history +; 20230117-lauer_axel: added support for ICON (code from Manuel) +; 20210415-lauer_axel: written. +; +; ############################################################################ + +; ##################################### +; # load external NCL code, if needed # +; ##################################### + +; A temporary file written by the invoking Python script +; Passes on a number of variables from Python to NCL + +load "$diag_scripts/../interface_scripts/interface.ncl" + +load "$diag_scripts/shared/plot/aux_plotting.ncl" +load "$diag_scripts/shared/statistics.ncl" +load "$diag_scripts/shared/plot/style.ncl" +load "$diag_scripts/shared/plot/contour_maps.ncl" +load "$diag_scripts/shared/dataset_selection.ncl" + +begin + enter_msg(DIAG_SCRIPT, "") + + set_default_att(diag_script_info, "colormap", "BkBlAqGrYeOrReViWh200") + set_default_att(diag_script_info, "epsilon", 1.0e-4) + set_default_att(diag_script_info, "filename_add", "") + set_default_att(diag_script_info, "projection", "CylindricalEquidistant") + set_default_att(diag_script_info, "var", "") + + if (diag_script_info@var .eq. "") then + var0 = variable_info[0]@short_name + else + var0 = diag_script_info@var + end if + + variables = metadata_att_as_array(variable_info, "short_name") + if (.not. any(variables .eq. var0)) then + errstr = "diagnostic " + diag + " requires the following variable: " + var0 + error_msg("f", DIAG_SCRIPT, "", errstr) + end if + + var0_info = select_metadata_by_name(variable_info, var0) + var0_info := var0_info[0] + info0 = select_metadata_by_name(input_file_info, var0) + dim_MOD = ListCount(info0) + + if (isatt(var0_info, "reference_dataset")) then + refname = var0_info@reference_dataset + end if + + names = metadata_att_as_array(info0, "dataset") + projects = metadata_att_as_array(info0, "project") + infiles = metadata_att_as_array(info0, "filename") + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT + " (var: " + var0 + ")") + log_info("++++++++++++++++++++++++++++++++++++++++++") + + ; make sure path for (mandatory) netcdf output exists + + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + + ref_ind = -1 ; set to invalid value + + ; if reference dataset has been defined, use it so plots can be sorted + + if (isvar("refname")) then + ref_ind = ind(names .eq. refname) + end if + + if (diag_script_info@filename_add .ne. "") then + filename_add = "_" + diag_script_info@filename_add + else + filename_add = "" + end if + + ; find indices of all OBS and obs4mips datasets (including "native6" ERA5) + + idxobs = get_obs(names, projects, "") + + if (idxobs(0) .eq. -1) then + flag_multiobs = False + else + flag_multiobs = True + end if + + ; find all indices of models w/o MultiModelMean/MultiModelMedian (if present) + + idxmod = get_mod(names, projects) + + if (idxmod(0) .eq. -1) then ; no model found + flag_multimod = False + elseif (dimsizes(idxmod) .eq. 1) then ; one model found + flag_multimod = False + else ; more than one model found + flag_multimod = True + end if + +end + +begin + ind_all_sorted = ispan(0, dim_MOD - 1, 1) ; create array + + if (ref_ind .ge. 0) then + ind_wo_ref = ind(names .ne. refname) + ind_all_sorted(0) = ref_ind + ind_all_sorted(1:dim_MOD - 1) = ind_wo_ref + end if + + maps = new(dim_MOD, graphic) ; collect individual maps in a graphic array + + ; ########################################### + ; # get data and average time # + ; ########################################### + + do ii = 0, dim_MOD - 1 + + imod = ind_all_sorted(ii) + + if (isvar("data1")) then + delete(data1) + end if + + log_info("processing " + names(imod)) + + if (isvar("A0")) then + delete(A0) + end if + + A0 = read_data(info0[imod]) + + ; check dimensions + + dims = getvardims(A0) + if (dimsizes(dims) .lt. 2) then + error_msg("f", DIAG_SCRIPT, "", dimsizes(dims) + \ + " dimensions, need 2 or 3") + end if + idx = ind(dims .eq. "lat") + if (ismissing(idx)) then + error_msg("f", DIAG_SCRIPT, "", "no lat dimension") + end if + idx = ind(dims .eq. "lon") + if (ismissing(idx)) then + error_msg("f", DIAG_SCRIPT, "", "no lon dimension") + end if + + ; calculate climatological seasonal cycle from time series + + if (isvar("timeseries")) then + delete(timeseries) + end if + + timeseries = time_operations(A0, -1, -1, "average", "monthlyclim", True) + + ; calculate amplitude at each grid cell + + monmean = dim_avg_n_Wrap(timeseries, 0) + monmean = where(abs(monmean) .le. diag_script_info@epsilon, \ + monmean@_FillValue, monmean) + + monmin = monmean + monmax = monmin + + do i = 0, 11 + monmin = where(timeseries(i, :, :) .lt. monmin, timeseries(i, :, :), \ + monmin) + monmax = where(timeseries(i, :, :) .gt. monmax, timeseries(i, :, :), \ + monmax) + end do + +; monind = dim_maxind(timeseries, 0) + +; data1 = 1.0 + monind + data1 = 100.0 * abs((monmax - monmin) / monmean) + copy_VarMeta(monmin, data1) + + ; create arrays for multi-obs and multi-model averages (if requested) + + if (ii .eq. 0) then + multidim = dimsizes(data1) + if (flag_multiobs) then + newdims = array_append_record(dimsizes(idxobs), multidim, 0) + multiobs_all = new(newdims, float) + end if + if (flag_multimod) then + newdims = array_append_record(dimsizes(idxmod), multidim, 0) + multimod_all = new(newdims, float) + end if + end if + + same_grid = False + + ; calculate multi-obs and multi-model averages (if requested) + + if (flag_multiobs) then + iidx = ind(idxobs .eq. imod) + if (.not.ismissing(iidx)) then + dims1 = dimsizes(data1) + dimerror = False + if (dimsizes(multidim) .eq. dimsizes(dims1)) then + if (any(multidim - dims1 .ne. 0)) then + dimerror = True + end if + else + dimerror = True + end if + if (dimerror) then + error_msg("f", DIAG_SCRIPT, "", "dimensions of datasets " \ + + "do not match. Use preprocessor to regrid data to " \ + + "common grid.") + end if + multiobs_all(iidx, :, :) = data1 + same_grid = True + end if + end if + + if (flag_multimod) then + iidx = ind(idxmod .eq. imod) + if (.not.ismissing(iidx)) then + dims1 = dimsizes(data1) + dimerror = False + if (dimsizes(multidim) .eq. dimsizes(dims1)) then + if (any(multidim - dims1 .ne. 0)) then + dimerror = True + end if + else + dimerror = True + end if + if (dimerror) then + error_msg("f", DIAG_SCRIPT, "", "dimensions of datasets " \ + + "do not match. Use preprocessor to regrid data to " \ + + "common grid.") + end if + multimod_all(iidx, :, :) = data1 + same_grid = True + end if + end if + + ; ########################################### + ; # Style dependent annotation # + ; ########################################### + ; retrieve unique strings describing the data + ; function in ./diag_scripts/lib/ncl/style.ncl + + annots = project_style(info0, diag_script_info, "annots") + + ; ########################################### + ; # plot ressources # + ; ########################################### + + res = True + + res@cnFillOn = True ; color plot desired + res@cnLineLabelsOn = False ; contour lines + res@cnLinesOn = False + + ; colors + ; http://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml + + if (isdefined("pal")) then + delete(pal) + end if + pal = read_colormap_file(diag_script_info@colormap) +; pal = read_colormap_file("Cat12") + ; annotation + + res@tiMainString = names(imod) + res@tiMainFontHeightF = 0.025 + res@gsnStringFontHeightF = 0.02 + res@cnLevelSelectionMode = "ExplicitLevels" + + if (diag_script_info@projection.eq."Robinson") then + res@mpPerimOn = False ; turn off perimeter around map + res@mpGridLineColor = -1 + res@mpGridAndLimbOn = True + end if + + res@mpOutlineOn = True + res@mpFillOn = False + + ; variable specific plotting settings + + res@cnLevels = ispan(10, 200, 10) +; res@cnLevels = ispan(2, 12, 1) +; res@lbLabelStrings = (/"J", "F", "M", "A", "M", "J", "J", "A", "S", \ +; "O", "N", "D"/) +; res@lbLabelAlignment = "BoxCenters" + + nboxes = dimsizes(res@cnLevels) + clen = dimsizes(pal) + stride = max((/1, ((clen(0) - 1) - 2) / nboxes /)) + fill_colors = ispan(1, clen(0) - 1, stride) + res@cnFillColors = pal(fill_colors, :) + + res@gsnRightString = "" + res@gsnLeftString = "" + res@gsnCenterString = "" + + gavg = area_operations(data1, -90., 90., 0., 360., "average", True) + + if (.not.ismissing(gavg)) then + res@gsnLeftString = "mean = " + sprintf("%6.3f", gavg) + else + res@gsnLeftString = "" + end if + + ; map attributes + + res@mpFillDrawOrder = "PostDraw" ; draw map last + res@cnMissingValFillColor = "Gray" +; res@cnFillMode = "RasterFill" ; Raster Mode + + ; no tickmarks and no labels + + res@tmYLLabelsOn = False + res@tmYLOn = False + res@tmYRLabelsOn = False + res@tmYROn = False + res@tmXBLabelsOn = False + res@tmXBOn = False + res@tmXTLabelsOn = False + res@tmXTOn = False + res@cnInfoLabelOn = False ; turn off cn info label + + res@mpProjection = diag_script_info@projection + + ; set explicit contour levels + + if (isatt(diag_script_info, "explicit_cn_levels")) then + res@cnLevelSelectionMode = "ExplicitLevels" + res@cnLevels = diag_script_info@explicit_cn_levels + end if + + ; ########################################### + ; # other Metadata: diag_script, var # + ; ########################################### + ; add to data1, as attributes without prefix + + if (isatt(data1, "diag_script")) then ; add to existing entries + temp = data1@diag_script + delete(data1@diag_script) + data1@diag_script = array_append_record(temp, (/DIAG_SCRIPT/), 0) + delete(temp) + else ; add as new attribute + data1@diag_script = (/DIAG_SCRIPT/) + end if + data1@var = var0 ; Overwrite existing entry + if (isatt(var0_info, "long_name")) then + data1@long_name = var0_info@long_name + else + data1@long_name = var0 + end if + data1@units = "%" +; data1@units = "month" + + ; copy attributes for netCDF output + + data1@long_name = "interannual variability " + data1@long_name + + ; ########################################### + ; # create the plot # + ; ########################################### + + res@lbTitleString = data1@units + res@lbTitlePosition = "Bottom" + res@lbTitleFontHeightF = 0.02 + res@lbLabelFontHeightF = 0.02 + + ; function in aux_plotting.ncl + + if (ii.eq.0) then + wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_seasonal_cycle_" \ + + var0 + filename_add) + nframe = 0 + end if + + maps(ii) = gsn_csm_contour_map(wks, data1, res) + nframe = nframe + 1 + + ; ######################################### + ; # output all datasets to common netCDF # + ; ######################################### + + nc_filename = work_dir + "clouds_seasonal_cycle_" + var0 + ".nc" + nc_filename@existing = "append" + data1@var = var0 + "_var_" + annots(imod) + nc_outfile = ncdf_write(data1, nc_filename) + + end do ; ii-loop (datasets) + + ; create panel plot + + pres = True ; needed to override + ; panelling defaults + ; print dataset name on each panel + pres@gsnPanelFigureStrings = annots(ind_all_sorted) + pres@gsnPanelFigureStringsFontHeightF = 0.007 + pres@lbLabelFontHeightF = 0.01 + pres@lbAutoManage = False + pres@lbTopMarginF = 0.1 + pres@lbPerimOn = False ; draw line around label + ; bar area + pres@gsnPanelCenter = False + pres@pmLabelBarOrthogonalPosF = -0.01 ; shift label bar a bit to + ; the bottom + outfile = panelling(wks, maps, (dim_MOD + 3) / 4, 4, pres) + nframe = nframe + 1 + + suffix = get_file_suffix(outfile, 0) + if (suffix .eq. ".png") then + outfile = suffix@fBase + "." + sprinti("%0.6i", nframe) + suffix + end if + + ; plot multi-obs and multi-model average (if requested) + + if (flag_multiobs) then + multiobs = dim_avg_n(multiobs_all, 0) + delete(multiobs_all) + copy_VarMeta(data1, multiobs) + gavg = area_operations(multiobs, -90., 90., 0., 360., "average", True) + res@gsnLeftString = "mean = " + sprintf("%6.3f", gavg) + res@tiMainString = "Multi-obs average" + map_multiobs = gsn_csm_contour_map(wks, multiobs, res) + nframe = nframe + 1 + end if + + if (flag_multimod) then + multimod = dim_avg_n(multimod_all, 0) + delete(multimod_all) + copy_VarMeta(data1, multimod) + + mask1 = multiobs + mask2 = multimod + mask1 = where(.not.ismissing(mask1), 0., mask1@_FillValue) + mask2 = where(.not.ismissing(mask2), 0., mask2@_FillValue) + amask = mask1 + mask2 + delete(mask1) + delete(mask2) + refmasked = multiobs + refmasked = refmasked + amask + datmasked = multimod + datmasked = datmasked + amask + delete(amask) + corr = calculate_metric(refmasked, datmasked, "correlation") + gavg = area_operations(datmasked, -90., 90., 0., 360., "average", True) + rmsd = calculate_metric(refmasked, datmasked, "RMSD") + + delete(refmasked) + delete(datmasked) + +; gavg = area_operations(multimod, -90., 90., 0., 360., "average", True) + res@gsnLeftString = "mean = " + sprintf("%6.3f", gavg) + res@gsnCenterString = "corr = " + sprintf("%6.3f", corr) + res@gsnRightString = "rmsd = " + sprintf("%6.3f", rmsd) + res@tiMainString = "Multi-model average" + map_multimod = gsn_csm_contour_map(wks, multimod, res) + nframe = nframe + 1 + end if + + log_info(" Wrote " + outfile) + + ; ------------------------------------------------------------------------ + ; write provenance to common netcdf and plot file + ; ------------------------------------------------------------------------ + + statistics = (/"clim", "var"/) + domain = "global" + plottype = "geo" + caption = "Relative amplitude of the climatological mean seasonal cycle " \ + + "of variable " + var0 + "." + log_provenance(nc_outfile, outfile, caption, statistics, domain, \ + plottype, "", "", infiles) + + leave_msg(DIAG_SCRIPT, "") + +end diff --git a/esmvaltool/diag_scripts/clouds/clouds_taylor.ncl b/esmvaltool/diag_scripts/clouds/clouds_taylor.ncl index c9a3a2920f..e2de9117cd 100644 --- a/esmvaltool/diag_scripts/clouds/clouds_taylor.ncl +++ b/esmvaltool/diag_scripts/clouds/clouds_taylor.ncl @@ -34,10 +34,20 @@ ; filename_add: legacy feature: arbitrary string to be added to all ; filenames of plots and netcdf output produced ; (default = "") +; legend_filter: do not show individual datasets in legend that are of +; project "legend_filter" (default = "") ; mask_ts_sea_ice: - True = mask T < 272 K as sea ice (only for ; variable "ts") ; - False = no additional grid cells masked for ; variable "ts" +; multiobs_exclude: list of *observational* datasets to be excluded when +; calculating uncertainty estimates from multiple +; observational datasets (see also multiobs_uncertainty) +; multiobs_uncertainty: calculate uncertainty estimates from multiple +; observational datasets (true, false); by default, +; all "obs", "obs6", "obs4mips" and "native6" datasets +; are used; any of such datasets can be explicitely +; excluded when also specifying "multiobs_exclude" ; styleset: "CMIP5", "DEFAULT" ; (if not set, CLOUDS_TAYLOR will create a color table and ; symbols for plotting) @@ -47,6 +57,8 @@ ; valid_fraction: used for creating sea ice mask (mask_ts_sea_ice = true): ; fraction of valid time steps required to mask grid cell ; as valid data +; var: short_name of variable to process (default = "" - use +; first variable in variable list) ; ; Required variable_info attributes (variable specific) ; reference_dataset: name of reference data set @@ -67,7 +79,14 @@ ; variable has been calculated from) the *second* (third, ...) ; ; Modification history +; 20230117-lauer_axel: added support for ICON (code from Manuel) +; 20211028-lauer_axel: added option to calculate tcwp as lwp + iwp +; 20211018-lauer_axel: added option to remove individual models from legend ; 20211006-lauer_axel: removed write_plots +; 20210407-lauer_axel: added option to estimate observational uncertainty +; from multiple observational datasets +; 20210318-lauer_axel: added option to speficfy variable if more than one +; variable is present ; 20190221-lauer_axel: added provenance to output (v2.0) ; 20181120-lauer_axel: adapted code to multi-variable capable framework ; 20180923-lauer_axel: added writing of results to netcdf @@ -92,6 +111,7 @@ load "$diag_scripts/shared/plot/aux_plotting.ncl" load "$diag_scripts/shared/statistics.ncl" load "$diag_scripts/shared/plot/style.ncl" load "$diag_scripts/shared/plot/taylor_plot.ncl" +load "$diag_scripts/shared/dataset_selection.ncl" begin @@ -100,12 +120,17 @@ begin set_default_att(diag_script_info, "embracelegend", False) set_default_att(diag_script_info, "estimate_obs_uncertainty", False) set_default_att(diag_script_info, "mask_ts_sea_ice", False) + set_default_att(diag_script_info, "legend_filter", "") + set_default_att(diag_script_info, "multiobs_exclude", "") + set_default_att(diag_script_info, "multiobs_uncertainty", False) set_default_att(diag_script_info, "timemean", "annualclim") set_default_att(diag_script_info, "valid_fraction", 0.5) + set_default_att(diag_script_info, "var", "") estimate_obs_uncertainty = diag_script_info@estimate_obs_uncertainty - variables = metadata_att_as_array(variable_info, "short_name") + variables = get_unique_values(metadata_att_as_array(variable_info, \ + "short_name")) numvars = dimsizes(variables) ; find "main" variable and if present uncertainty estimates or auxiliary @@ -114,18 +139,12 @@ begin mainvarind = 0 ; default = main variable is first (and only) variable errvarind = -1 ; default = no error estimate available - if (numvars.gt.1) then - ; uncertainty estimates are identified by "err" in their short_name - do i = 0, numvars - 1 - if (isStrSubset(variables(i), "err")) then - errvarind = i - break - end if - end do - ; now find the main variable: + if (diag_script_info@var .eq. "") then ; it is assumed that the main variable is either the first non-error ; variable or the first "derived" variable - idx = ind(ispan(0, numvars - 1, 1) .ne. errvarind) + + ivar = ispan(0, numvars - 1, 1) + idx = ind(.not.(isStrSubset(variables(ivar), "err"))) mainvarind = idx(0) ; first non-error variable ; now check for possibly derived variables do ii = 1, dimsizes(idx) - 1 @@ -142,25 +161,62 @@ begin end if end do end do + var0 = variables(mainvarind) else + mainvarind = ind(variables .eq. diag_script_info@var) + var0 = diag_script_info@var + end if + + if (ismissing(mainvarind)) then + errstr = "diagnostic " + diag + " requires the following variable: " + var0 + error_msg("f", DIAG_SCRIPT, "", errstr) + end if + + var0_info = select_metadata_by_name(variable_info, var0) + var0_info := var0_info[0] + + flag_multiobs_unc = diag_script_info@multiobs_uncertainty + multiobs_exclude = diag_script_info@multiobs_exclude + if (estimate_obs_uncertainty .and. flag_multiobs_unc) then + log_info("estimate_obs_uncertainty is not supported when " + \ + "multiobs_uncertainty is enabled. Setting " + \ + "estimate_obs_uncertainty to False") + estimate_obs_uncertainty = False + end if + + if (.not. flag_multiobs_unc) then + ; check if corresponding uncertainty estimates are available; + ; uncertainty estimates are identified by "err" in their short_name + + if (numvars.gt.1) then + ; uncertainty estimates are identified by "err" in their short_name + do i = 0, numvars - 1 + if (isStrSubset(variables(i), var0) .and. \ + isStrSubset(variables(i), "err")) then + errvarind = i + break + end if + end do + end if end if - var0 = variable_info[mainvarind]@short_name info0 = select_metadata_by_name(input_file_info, var0) dim_MOD = ListCount(info0) - if (isatt(variable_info[mainvarind], "reference_dataset")) then - refname = variable_info[mainvarind]@reference_dataset + if (isatt(var0_info, "reference_dataset")) then + refname = var0_info@reference_dataset end if - if (isatt(variable_info[mainvarind], "alternative_dataset")) then - refname2 = variable_info[mainvarind]@alternative_dataset + if (isatt(var0_info, "alternative_dataset")) then + refname2 = var0_info@alternative_dataset end if names = metadata_att_as_array(info0, "dataset") + projects = metadata_att_as_array(info0, "project") infiles = metadata_att_as_array(input_file_info, "filename") - ; check for reference model definition - - if (.not.isvar("refname")) then - error_msg("f", DIAG_SCRIPT, "", "no reference dataset defined in recipe") + if (.not. flag_multiobs_unc) then + ; check for reference model definition + if (.not.isvar("refname")) then + error_msg("f", DIAG_SCRIPT, "", "no reference dataset defined in recipe") + end if end if ; print info on variable(s) to log file @@ -214,13 +270,20 @@ begin delete(auxind) end if - ; time averaging: at the moment, only "annualclim" and "seasonalclim" - ; are supported - timemean = diag_script_info@timemean numseas = 1 ; default season = (/"annual"/) + ; time averaging: at the moment, only "annualclim" and "seasonalclim" + ; are supported + + if (flag_multiobs_unc .and. timemean .ne. "annualclim") then + log_info("multiobs_uncertainty = True is currently supported for annual" \ + + " means only (timemean = annualclim). Setting " \ + + " multiobs_uncertainty to False.") + flag_multiobs_unc = False + end if + if (timemean.eq."seasonalclim") then numseas = 4 delete(season) @@ -249,10 +312,38 @@ begin ; get reference model - ref_ind = ind(names .eq. refname) - if (ismissing(ref_ind)) then - error_msg("f", DIAG_SCRIPT, "", "reference dataset (" \ - + refname + ") is missing") + ; find indices of all OBS and obs4mips datasets + ; (treat ERA5 as special case) + + if (flag_multiobs_unc) then + ; find indices of all OBS and obs4mips datasets (including "native6" ERA5) + + idxobs = get_obs(names, projects, multiobs_exclude) + + if (idxobs(0) .eq. -1) then + flag_multiobs_unc = False + log_info("No OBS or obs4mips datasets found. Setting " \ + + " multiobs_uncertainty to False.") + else + refname = "REF" + ref_ind = dimsizes(names) + names := array_append_record(names, (/refname/), 0) + dim_MOD = dim_MOD + 1 + end if + end if + + if (.not. flag_multiobs_unc) then + ; if attribute is present, use it so correlations can be calculated + if (isvar("refname")) then + ; set reference model + ref_ind = ind(names .eq. refname) + if (ismissing(ref_ind)) then + error_msg("f", DIAG_SCRIPT, "", "reference dataset (" + refname + \ + ") not found.") + end if + else + error_msg("f", DIAG_SCRIPT, "", "no reference dataset defined in recipe") + end if end if ; get multi-model mean index (if present) @@ -263,6 +354,12 @@ begin mm_ind = -1 end if + legend_filter = diag_script_info@legend_filter + + if ((legend_filter .ne. "") .and. mm_ind .gt. -1) then + projects(mm_ind) = "CMIP_MMM" + end if + mask_ts_sea_ice = diag_script_info@mask_ts_sea_ice if (isatt(diag_script_info, "filename_add")) then @@ -317,6 +414,38 @@ begin ; debugfile = addfile("debug.nc","c") ; debugfile->mask = global_mask + ; --------------------------------------------------------- + ; if requested, calculate multi-observational mean and standard deviation + + if (flag_multiobs_unc) then + nobs = dimsizes(idxobs) + + ; step 1: calculate multi-obs mean + + do i = 0, nobs - 1 + A0 = read_data(info0[idxobs(i)]) + + ; calculate time average + mean = time_operations(A0, -1, -1, "average", "annualclim", True) + delete(A0) + + if (i .eq. 0) then + dims = dimsizes(mean) + newdims = new(dimsizes(dims) + 1, integer) + newdims(0) = nobs + newdims(1:dimsizes(newdims) - 1) = dims + ref_tmp = new(newdims, float) + delete(dims) + end if + ref_tmp(i, :, :) = mean + end do + delete(mean) + ; note: we are using dim_avg_n_Warp so missing values are ignored + ; when averaging + ref_avg = dim_avg_n_Wrap(ref_tmp, 0) + delete(ref_tmp) + end if + ; read data and calculate time average ierridx = 0 @@ -344,26 +473,33 @@ begin info = select_metadata_by_name(input_file_info, variables(ivar)) do imod = modelf, modell - data_temp = read_data(info[imod]) - - ; The uncertainty estimates are assumed to be given as - ; 1-sigma of normally distributed error estimates - ; Note: uncertainty estimates must have "err" in their - ; variable name, otherwise variables are assumed - ; to be fields used for calculating derived variables - ; (in this case, fields are not squared before averaging) - ; ---> square sigma before averaging over time, then - ; calculate square-root to get average sigma - - if (ivar.eq.errvarind) then - data_temp = data_temp * data_temp - end if - data1 = time_operations(data_temp, -1, -1, "average", \ - timemean, True) + if (imod .ne. ref_ind .or. .not.flag_multiobs_unc) then + data_temp = read_data(info[imod]) + ; The uncertainty estimates are assumed to be given as + ; 1-sigma of normally distributed error estimates + ; Note: uncertainty estimates must have "err" in their + ; variable name, otherwise variables are assumed + ; to be fields used for calculating derived variables + ; (in this case, fields are not squared before averaging) + ; ---> square sigma before averaging over time, then + ; calculate square-root to get average sigma + + if (ivar.eq.errvarind) then + data_temp = data_temp * data_temp + end if + + data1 = time_operations(data_temp, -1, -1, "average", \ + timemean, True) - if (ivar.eq.errvarind) then - data1 = sqrt(data1) + delete(data_temp) + + if (ivar.eq.errvarind) then + data1 = sqrt(data1) + end if + else + data1 = ref_avg + delete(ref_avg) end if if (isdefined("global_mask")) then @@ -388,30 +524,29 @@ begin copy_VarCoords(data1, data(imod, :, :, :)) end if end if - dim_data = dimsizes(data) - rank = dimsizes(dim_data) - if (numseas.eq.1) then - data(imod, :, :) = data1 - else - data(imod, :, :, :) = data1 - end if - delete(data_temp) - delete(data1) + dim_data = dimsizes(data) + rank = dimsizes(dim_data) + if (numseas.eq.1) then + data(imod, :, :) = data1 else - if (.not.isdefined("err")) then - dim_data = array_append_record((/numvars - 1/), dimsizes(data1), 0) - err = new(dim_data, float) - err!0 = "var" - err&var = variables(ind(variables .ne. var0)) - end if - if (numseas.eq.1) then - err(ierridx, :, :) = data1 - else - err(ierridx, :, :, :) = data1 - end if + data(imod, :, :, :) = data1 end if + delete(data1) + else + if (.not.isdefined("err")) then + dim_data = array_append_record((/numvars - 1/), dimsizes(data1), 0) + err = new(dim_data, float) + err!0 = "var" + err&var = variables(ind(variables .ne. var0)) + end if + if (numseas.eq.1) then + err(ierridx, :, :) = data1 + else + err(ierridx, :, :, :) = data1 + end if + end if - ; debug output + ; debug output ; debugfile->$input_file_info@dataset(imod)$ = data1 end do ; imod loop @@ -757,7 +892,7 @@ begin end if ; override alternative obs (if "EMBRACE" legend) if (embracelegend) then - if ((isStrSubset(str_lower(input_file_info@project(i)), "obs"))) \ + if ((isStrSubset(str_lower(projects(i)), "obs"))) \ then if (mm_ind .ge. 0) then colors(i) = "(/1.00, 0.00, 0.00/)" ; red @@ -784,7 +919,7 @@ begin else if (embracelegend) then colors(i) = colortab(idx) - if ((isStrSubset(str_lower(input_file_info@project(i)), "obs"))) \ + if ((isStrSubset(str_lower(projects(i)), "obs"))) \ then if (mm_ind .ge. 0) then colors(i) = "(/1.00, 0.00, 0.00/)" ; red @@ -823,12 +958,15 @@ begin end if ropts = True - ropts@Colors = colors - ropts@Markers = markers ; marker styles ropts@gsMarkerSizeF = 0.0125 + ropts@Colors = colors + ropts@Markers = markers ; marker styles + ropts@caseLabels = val&models - modelnames = val&models - ropts@caseLabels = modelnames + if (legend_filter .ne. "") then + ropts@legend_filter = legend_filter + ropts@projects = projects + end if ropts@stnRad = (/ 0.5, 1.5, 2.0, 2.5 /) ropts@OneX = "1.00" diff --git a/esmvaltool/diag_scripts/clouds/clouds_taylor_double.ncl b/esmvaltool/diag_scripts/clouds/clouds_taylor_double.ncl new file mode 100644 index 0000000000..20b7027bb4 --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_taylor_double.ncl @@ -0,0 +1,742 @@ +; ############################################################################ +; CLOUDS_TAYLOR_DOUBLE +; ############################################################################ +; Author: Axel Lauer (DLR, Germany) +; PROJECT-NAME EMBRACE +; ############################################################################ +; Description +; Calculates the performance of models in reproducing 2-d fields of annual +; mean or seasonal (DFJ, MAM, JJA, SON) mean cloud properties +; (Taylor diagramms). The code is based on +; 1) clouds_taylor.ncl +; 2) perfmetrics_main.ncl +; 3) perfmetrics_taylor.ncl +; 4) perfmetrics_taylor_collect.ncl +; Note: This code requires that all data are provided on the same grid. +; +; Required diag_script_info attributes (diagnostic specific) +; none +; +; Optional diag_script_info attributes (diagnostic specific) +; filename_add: legacy feature: arbitrary string to be added to all +; filenames of plots and netcdf output produced +; (default = "") +; multiobs_exclude: list of *observational* datasets to be excluded when +; calculating uncertainty estimates from multiple +; observational datasets (see also multiobs_uncertainty) +; multiobs_uncertainty: calculate uncertainty estimates from multiple +; observational datasets (true, false); by default, +; all "obs", "obs6", "obs4mips" and "native6" datasets +; are used; any of such datasets can be explicitely +; excluded when also specifying "multiobs_exclude" +; projectcolors: colors for each projectgroups +; (e.g. (/"(/0.0, 0.0, 1.0/)", "(/1.0, 0.0, 0.0/)"/) +; projectgroups: calculated mmm per "projectgroup" +; (e.g. (/"cmip5", "cmip6")/) +; styleset: "CMIP5", "DEFAULT" +; (if not set, CLOUDS_TAYLOR_DOUBLE will create a color +; table and symbols for plotting) +; timemean: time averaging +; - annualclim (default) = 1 plot annual mean +; - seasonalclim = 4 plots (DJF, MAM, JJA, SON) +; var: short_name of variable to process (default = "" - use +; first variable in variable list) +; +; Required variable_info attributes (variable specific) +; reference_dataset: name of reference data set +; +; Optional variable attributes (variable specific) +; none +; +; Caveats +; KNOWN LIMITATIONS +; 1) only 2-dim variables are currently supported +; +; Modification history +; 20211108-lauer_axel: written. +; +; ########################################################################### + + +load "$diag_scripts/../interface_scripts/interface.ncl" + +load "$diag_scripts/shared/plot/aux_plotting.ncl" +load "$diag_scripts/shared/statistics.ncl" +load "$diag_scripts/shared/plot/style.ncl" +load "$diag_scripts/shared/plot/taylor_plot.ncl" +load "$diag_scripts/shared/dataset_selection.ncl" + +begin + + enter_msg(DIAG_SCRIPT, "") + + set_default_att(diag_script_info, "multiobs_exclude", "") + set_default_att(diag_script_info, "multiobs_uncertainty", False) + set_default_att(diag_script_info, "projectcolors", "(/0.0, 0.0, 1.0/)") + set_default_att(diag_script_info, "projectgroups", "") + set_default_att(diag_script_info, "timemean", "annualclim") + set_default_att(diag_script_info, "valid_fraction", 0.5) + set_default_att(diag_script_info, "var", "") + + projectgroups = diag_script_info@projectgroups + if (projectgroups(0) .ne. "") then + dim_GROUPS = dimsizes(projectgroups) + dim_COLORS = dimsizes(diag_script_info@projectcolors) + projectcolors_mmm = new(dim_COLORS, string) + projectcolors = new(dim_GROUPS, string) + newrgb = new(3, float) + do i = 0, dim_GROUPS - 1 + if (i .lt. dim_COLORS) then + projectcolors(i) = diag_script_info@projectcolors(i) + else + projectcolors(i) = "(/0.0, 0.0, 1.0/)" + end if + + do j = 0, 2 + rgb = str_get_field(projectcolors(i), j + 1, ",") + rgb = str_sub_str(rgb, "(", "") + rgb = str_sub_str(rgb, ")", "") + rgb = str_sub_str(rgb, "/", "") + newrgb(j) = 0.75 * tofloat(rgb) + end do + + projectcolors_mmm(i) = sprintf("(/%f, ", newrgb(0)) + \ + sprintf("%f, ", newrgb(1)) + sprintf("%f/)", newrgb(2)) + end do + groupnames = projectgroups + "_mmm" + + else + dim_GROUPS = 0 + groupnames = "" + end if + + variables = metadata_att_as_array(variable_info, "short_name") + numvars = dimsizes(variables) + + if (diag_script_info@var .eq. "") then + var0 = variable_info[0]@short_name + else + var0 = diag_script_info@var + end if + + varidx = ind(variables .eq. var0) + if (ismissing(varidx)) then + errstr = "diagnostic " + diag + " requires the following variable: var0" + error_msg("f", DIAG_SCRIPT, "", errstr) + end if + + flag_multiobs_unc = diag_script_info@multiobs_uncertainty + multiobs_exclude = diag_script_info@multiobs_exclude + + info0 = select_metadata_by_name(input_file_info, var0) + dim_MOD = ListCount(info0) + if (isatt(variable_info[varidx], "reference_dataset")) then + refname = variable_info[varidx]@reference_dataset + end if + if (isatt(variable_info[varidx], "alternative_dataset")) then + refname2 = variable_info[varidx]@alternative_dataset + end if + names = metadata_att_as_array(info0, "dataset") + projects = metadata_att_as_array(info0, "project") + infiles = metadata_att_as_array(input_file_info, "filename") + + if (.not. flag_multiobs_unc) then + ; check for reference model definition + if (.not.isvar("refname")) then + error_msg("f", DIAG_SCRIPT, "", "no reference dataset defined in recipe") + end if + end if + + ; print info on variable(s) to log file + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT) + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info("variable: " + variables(varidx)) + log_info("++++++++++++++++++++++++++++++++++++++++++") + + timemean = diag_script_info@timemean + numseas = 1 ; default + season = (/"annual"/) + + ; time averaging: at the moment, only "annualclim" and "seasonalclim" + ; are supported + + if (flag_multiobs_unc .and. timemean .ne. "annualclim") then + log_info("multiobs_uncertainty = True is currently supported for annual" \ + + " means only (timemean = annualclim). Setting " \ + + " multiobs_uncertainty to False.") + flag_multiobs_unc = False + end if + + if (timemean.eq."seasonalclim") then + numseas = 4 + delete(season) + season = (/"DJF", "MAM", "JJA", "SON"/) + end if + + ; create string for caption (netcdf provenance) + + allseas = season(0) + do is = 1, numseas - 1 + allseas = allseas + "/" + season(i) + end do + + ; make sure path for (mandatory) netcdf output exists + + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + +end + +begin + ; ======================================================================== + ; ========================== initialization ============================== + ; ======================================================================== + + ; get reference model + + ; find indices of all OBS and obs4mips datasets + ; (treat ERA5 as special case) + + if (flag_multiobs_unc) then + ; find indices of all OBS and obs4mips datasets (including "native6" ERA5) + + idxobs = get_obs(names, projects, multiobs_exclude) + + if (idxobs(0) .eq. -1) then + flag_multiobs_unc = False + log_info("No OBS or obs4mips datasets found. Setting " \ + + " multiobs_uncertainty to False.") + else + refname = "REF" + ref_ind = dimsizes(names) + names := array_append_record(names, (/refname/), 0) + dim_MOD = dim_MOD + 1 + end if + end if + + if (.not. flag_multiobs_unc) then + ; if attribute is present, use it so correlations can be calculated + if (isvar("refname")) then + ; set reference model + ref_ind = ind(names .eq. refname) + if (ismissing(ref_ind)) then + error_msg("f", DIAG_SCRIPT, "", "reference dataset (" + refname + \ + ") not found.") + end if + else + error_msg("f", DIAG_SCRIPT, "", "no reference dataset defined in recipe") + end if + end if + + ; get multi-model mean index (if present) + + mm_ind = ind(names .eq. "MultiModelMean") + + if (ismissing(mm_ind)) then + mm_ind = -1 + end if + + if (isatt(diag_script_info, "filename_add")) then + filename_add = "_" + diag_script_info@filename_add + else + filename_add = "" + end if + + if (dim_GROUPS .gt. 0) then + names := array_append_record(names, groupnames, 0) + projects := array_append_record(projects, "group_" + projectgroups, 0) + dim_MOD = dim_MOD + dim_GROUPS + end if + + ; ======================================================================== + ; ============================ statistics ================================ + ; ======================================================================== + + ; --------------------------------------------------------- + ; if requested, calculate multi-observational mean and standard deviation + + if (flag_multiobs_unc) then + nobs = dimsizes(idxobs) + + ; step 1: calculate multi-obs mean + + do i = 0, nobs - 1 + A0 = read_data(info0[idxobs(i)]) + + ; calculate time average + mean = time_operations(A0, -1, -1, "average", "annualclim", True) + delete(A0) + + if (i .eq. 0) then + dims = dimsizes(mean) + newdims = new(dimsizes(dims) + 1, integer) + newdims(0) = nobs + newdims(1:dimsizes(newdims) - 1) = dims + ref_tmp = new(newdims, float) + delete(dims) + end if + ref_tmp(i, :, :) = mean + end do + delete(mean) + ; note: we are using dim_avg_n_Warp so missing values are ignored + ; when averaging + ref_avg = dim_avg_n_Wrap(ref_tmp, 0) + delete(ref_tmp) + end if + + ; read data and calculate time average + + ivar = varidx + + info = select_metadata_by_name(input_file_info, variables(ivar)) + + ; loop over all datasets not including groups means (to be calculated + ; separately) + + do imod = 0, dim_MOD - 1 - dim_GROUPS + + if (imod .ne. ref_ind .or. .not.flag_multiobs_unc) then + data_temp = read_data(info[imod]) + data1 = time_operations(data_temp, -1, -1, "average", \ + timemean, True) + + delete(data_temp) + else + data1 = ref_avg + delete(ref_avg) + end if + + if (isdefined("global_mask")) then + if (numseas.eq.1) then + data1 = data1 + global_mask + else + do is = 0, numseas - 1 + data1(is, :, :) = data1(is, :, :) + global_mask + end do + end if + end if + + if (.not.isdefined("data")) then + dim_data = array_append_record((/dim_MOD/), dimsizes(data1), 0) + data = new(dim_data, float) + data!0 = "model" + data&model = names + if (numseas.eq.1) then + copy_VarCoords(data1, data(imod, :, :)) + else + copy_VarCoords(data1, data(imod, :, :, :)) + end if + end if + + dim_data = dimsizes(data) + rank = dimsizes(dim_data) + if (numseas.eq.1) then + data(imod, :, :) = data1 + else + data(imod, :, :, :) = data1 + end if + delete(data1) + + ; debug output + + ; debugfile->$input_file_info@dataset(imod)$ = data1 + end do ; imod loop + + ; ------------------------------------ + ; calculate group means (if requested) + ; ------------------------------------ + + j = 0 + do imod = dim_MOD - dim_GROUPS, dim_MOD - 1 + idxgroup = ind(projects .eq. projectgroups(j)) + if (.not.all(ismissing(idxgroup))) then + isize = dimsizes(idxgroup) + if (isize .gt. 1) then + if (numseas.eq.1) then + data(imod, :, :) = dim_avg_n(data(idxgroup, :, :), 0) + else + data(imod, :, :, :) = dim_avg_n(data(idxgroup, :, :, :), 0) + end if + else + if (numseas.eq.1) then + data(imod, :, :) = data(idxgroup, :, :) + else + data(imod, :, :, :) = data(idxgroup, :, :, :) + end if + end if + end if + delete(idxgroup) + j = j + 1 + end do + + ; ------------------------------------ + + ; number of used reference data sets + + dim_REF = 1 + if (isvar("refname2")) then + dim_REF = dim_REF + 1 + end if + + ; define result variable + + val = new((/dim_MOD - dim_REF, 2, numseas/), float) + val!0 = "models" + val!1 = "statistic" + val!2 = "time" + val&models = names(ind((names .ne. refname))) + val&statistic = (/"stddev_ratio", "correlation"/) + val&time = ispan(0, numseas - 1, 1) + + ; extract data + + do is = 0, numseas - 1 + + if (numseas.eq.1) then + ref = data(ref_ind, :, :) + else + ref = data(ref_ind, is, :, :) + end if + + ; loop over models (skip reference) + + mod_i = 0 + do imod = 0, dim_MOD - 1 + + ; skip reference + + if (imod.eq.ref_ind) then + log_info("Ref_dataset = " + data&model(imod)) + continue + end if + + if (numseas.eq.1) then + var = data(imod, :, :) + else + var = data(imod, is, :, :) + end if + + ; common mask + mask1 = where(.not.ismissing(var), 0., var@_FillValue) + mask2 = where(.not.ismissing(ref), 0., ref@_FillValue) + amask = mask1 + mask2 + delete(mask1) + delete(mask2) + refmasked = ref + refmasked = refmasked + amask + var = var + amask + delete(amask) + + ; calculate rate of standard deviations + + ; val(mod_i, 0, is) = calculate_metric(var, ref, "stddev_ratio_nowgt") + val(mod_i, 0, is) = calculate_metric(var, refmasked, "stddev_ratio") + + ; calculate pattern correlation + + ; val(mod_i, 1, is) = calculate_metric(var, ref, "correlation_nowgt") + val(mod_i, 1, is) = calculate_metric(var, refmasked, "correlation") + + delete(var) + delete(refmasked) + mod_i = mod_i + 1 + + end do ; loop over datasets + end do ; loop over seasons + + ; attach attributes to the results + + val@title = "taylor metrics" + val@long_name = "Taylor diagram" + val@diag_script = (/DIAG_SCRIPT/) + val@var = "var" + + ; ------------------- calculate/estimate RMS of observations --------------- + + rmsobs = new((/numseas/), float) + + do is = 0, numseas - 1 + if (numseas.eq.1) then + ref = data(ref_ind, :, :) + else + ref = data(ref_ind, is, :, :) + end if + + ; This code is equivalent to the function "calculate_metric" + ; (statistics.ncl) + weights = map_area(ref&lat, ref&lon) + ; optional: no weights --> reset weights + ; wgt1d = 1.0 + + ; convert to 1-D arrays + ref1d = ndtooned(ref) + wgt1d = ndtooned(weights) + wgt1d = wgt1d / dim_avg_n_Wrap(wgt1d, 0) + + rmsobs(is) = 0.0 + + ; normalize RMS by dividing by standard deviation of obs (ref) +; avg_ref = dim_avg_wgt_Wrap(ref1d, wgt1d, 1) +; rmsobs(is) = rmsobs(is) / sqrt(dim_avg_wgt_Wrap((ref1d - avg_ref) ^ 2, \ +; wgt1d, 1)) + + end do ; loop over seasons + + if (isvar("var")) then + delete(var) + end if + if (isvar("ref")) then + delete(ref) + end if + if (isvar("weights")) then + delete(weights) + end if + if (isvar("var1d")) then + delete(var1d) + end if + if (isvar("ref1d")) then + delete(ref1d) + end if + if (isvar("wgt1d")) then + delete(wgt1d) + end if + + ; ======================================================================== + ; ============================= plotting ================================= + ; ======================================================================== + + nummods = dim_MOD - dim_REF + + colors = new(nummods, string) + markers = new(nummods, integer) + + ratio = new((/nummods, 1, numseas/), float) ; standard deviation ratios + ratio = val(:, 0, :) + cc = new((/nummods, 1, numseas/), float) ; correlations + cc = val(:, 1, :) + + if (isatt(diag_script_info, "styleset")) then + colortab = project_style(info0, diag_script_info, "colors") + markertab = project_style(info0, diag_script_info, "markers") + else + colortab = (/"(/0.00, 0.00, 0.59/)", "(/0.00, 0.39, 1.00/)", \ + "(/0.20, 1.00, 1.00/)", "(/0.20, 0.88, 0.00/)", \ + "(/1.00, 0.88, 0.00/)", "(/1.00, 0.59, 0.00/)", \ + "(/1.00, 0.20, 0.00/)", "(/0.59, 0.00, 0.00/)", \ + "(/0.78, 0.00, 0.78/)", "(/0.59, 0.00, 0.59/)", \ + "(/0.90, 0.90, 0.90/)", "(/0.70, 0.70, 0.70/)", \ + "(/0.50, 0.50, 0.50/)", "(/0.30, 0.30, 0.30/)"/) + markertab = (/16, 4, 5, 0/) + end if + + plotfile = new((/numseas/), string) + + do is = 0, numseas - 1 + if (isvar("wks")) then + delete(wks) + end if + + if (isvar("legendwks")) then + delete(legendwks) + end if + + if (isvar("plot")) then + delete(plot) + end if + + wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_taylor_" + var0 \ + + "_" + season(is) + filename_add) + + ; create new marker: filled star + + mstring = "z" + fontnum = 35 + size = 1.75 ; 1.5 + angle = 0.0 + + new_index = NhlNewMarker(wks, mstring, fontnum, 0.0, 0.0, \ + 1.0, size, angle) + + ; create new marker: filled dot + + mstring = "m" + fontnum = 37 + size = 1.0 + angle = 0.0 + + new_index_dot = NhlNewMarker(wks, mstring, fontnum, 0.0, 0.0, \ + 1.0, size, angle) + + legendwks = wks + + i = 0 + idx = 0 + + if (isatt(diag_script_info, "styleset")) then + do ii = 0, dim_MOD - 1 + + if (ii.eq.ref_ind) then + continue + end if + + ; define group means (if present) + testidx = ind(groupnames .eq. names(ii)) + if (.not.ismissing(testidx)) then + colors(i) = projectcolors_mmm(testidx) + markers(i) = new_index + i = i + 1 + continue + end if + + colors(i) = colortab(i) + markers(i) = markertab(i) + + ; override multi-model mean (if present) + if (ii .eq. mm_ind) then + colors(i) = "(/0.00, 0.00, 0.00/)" ; black + markers(i) = new_index + end if + + ; override colors and markers of all group members + ; (if groups are defined) + testidx = ind(projectgroups .eq. projects(ii)) + if (.not.ismissing(testidx)) then + colors(i) = projectcolors(testidx) + markers(i) = new_index_dot ; 16 + end if + + i = i + 1 + end do + else + do ii = 0, dim_MOD - 1 + + if (ii.eq.ref_ind) then + continue + end if + + ; define group means (if present) + testidx = ind(groupnames .eq. names(ii)) + if (.not.ismissing(testidx)) then + colors(i) = projectcolors_mmm(testidx) + markers(i) = new_index + i = i + 1 + continue + end if + + if (ii .eq. mm_ind) then + colors(i) = "(/0.00, 0.00, 0.00/)" ; black + markers(i) = new_index + i = i + 1 + else + do n = 0, dim_MOD / dimsizes(colortab) + colors(i) = colortab(idx) + markers(i) = markertab(n) + i = i + 1 + if (i.ge.dim_MOD) then + break + end if + end do + idx = idx + 1 + if (idx.ge.dimsizes(colortab)) then + idx = dimsizes(colortab) - 1 + end if + end if + + ; override colors and markers of all group members + ; (if groups are defined) + testidx = ind(projectgroups .eq. projects(ii)) + if (.not.ismissing(testidx)) then + colors(i) = projectcolors(testidx) + markers(i) = new_index_dot ; 16 + end if + + end do + end if + + ropts = True + ropts@gsMarkerSizeF = 0.0125 + ropts@Colors = colors + ropts@Markers = markers ; marker styles + ropts@caseLabels = val&models + + if (dim_GROUPS .gt. 0) then + ropts@legend_filter = projectgroups + ropts@projects = projects + end if + + ropts@stnRad = (/ 0.5, 1.5, 2.0, 2.5 /) + ropts@OneX = "1.00" + ropts@ccRays = (/ 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, \ + 0.9, 0.95, 0.99 /) + ropts@ccRays_color = "Black" + ropts@centerDiffRMS = True + ropts@centerDiffRMS_color = "PaleGreen1" ; "LightGray" + + ropts@printDataLabels = False ; print numeric label for each data pt. + ropts@reverseOrder = True ; reverse order of items in legend + ropts@legendBox = True ; draw box around legend + + ; legend parameters + + ropts@legendXpos = 0.6 + ropts@legendYpos = -0.5 + ropts@legendWidth = 0.2 + + ropts@caseLabelsFontHeightF = 0.1 + ropts@plotSize = 0.6 + + ropts@legendExtraFile = False + if (dim_MOD.ge.20) then + ropts@caseLabelsFontHeightF = 0.06 + ropts@plotSize = 0.45 + end if + + ; plot + ropts@tiMainString = var0 + " (" + season(is) + ")" ; title + ropts@tiMainOffsetYF = 0.025 + ; observational uncertainties as normalized RMS error + ropts@rmsobs = rmsobs(is) + + plot = taylor_diagram(wks, legendwks, ratio(:, :, is), cc(:, :, is), \ + ropts) + + plotfile(is) = wks@fullname + log_info("Wrote " + plotfile) + end do ; is-loop (seasons) + + ; write netCDF output + + if (any(rmsobs .gt. 0.0)) then + val@RMSE_observations = rmsobs + end if + + nc_filename = work_dir + "clouds_taylor_" + var0 + filename_add + ".nc" + nc_outfile = ncdf_write(val, nc_filename) + + ; ------------------------------------------------------------------------ + ; write provenance to netcdf output and plot file(s) + ; ------------------------------------------------------------------------ + + statistics = "clim" + domain = "global" + plottype = "taylor" + + do is = 0, numseas - 1 + ; note: because function log_provenance does not yet support to attach + ; different captions to netcdf (contains all seasons) and plots + ; (contain one season each), the caption cannot specifiy the + ; season plotted; using "annual" or "DJF/MAM/JJA/SON" instead. + + caption = "Taylor diagram for variable " + var0 + " (" + allseas \ + + "), reference = " + refname + "." + + log_provenance(nc_outfile, plotfile, caption, statistics, domain, \ + plottype, "", "", infiles) + end do + + leave_msg(DIAG_SCRIPT, "") + +end diff --git a/esmvaltool/diag_scripts/clouds/clouds_zonal.ncl b/esmvaltool/diag_scripts/clouds/clouds_zonal.ncl new file mode 100644 index 0000000000..32b7befb7f --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_zonal.ncl @@ -0,0 +1,1425 @@ +; CLOUDS_ZONAL +; ############################################################################ +; Author: Axel Lauer (DLR, Germany) +; ############################################################################ +; Description +; Calculates annual/seasonal means of zonally averaged 3-d (cloud) +; parameters for comparison with a reference data set. Optionally, +; differences to the reference data set are also plotted. +; +; Required diag_script_info attributes (diagnostic specific) +; none +; +; Optional diag_script_info attributes (diagnostic specific) +; embracesetup: True = 2 plots per line, False = 4 plots per line +; (default) +; explicit_cn_levels: explicit contour levels for mean values (array) +; explicit_cn_dlevels: explicit contour levels for differences (array) +; extralegend: plot legend(s) to extra file(s) +; filename_add: optionally add this string to plot filesnames +; panel_labels: label individual panels (true, false) +; PanelTop: manual override for "@gnsPanelTop" used by panel +; plot(s) +; showdiff: calculate and plot differences (default = False) +; showyears: add start and end years to the plot titles +; (default = False) +; rel_diff: if showdiff = True, then plot relative differences (%) +; (default = False) +; rel_diff_min: lower cutoff value in case of calculating relative +; differences +; (in units of input variable) +; t_test: perform t-test when calculating differences +; (default = False) +; timemean: time averaging - "seasonal" = DJF, MAM, JJA, SON), +; "annual" = annual mean +; units_to: target units (automatic conversion) +; +; Required variable attributes (variable specific) +; none +; +; Optional variable_info attributes (variable specific) +; long_name: variable description +; reference_dataset: reference dataset; REQUIRED when calculating +; differences (showdiff = True) +; units: variable units (for labeling plot only) +; +; Caveats +; none +; +; Modification history +; 20230117-lauer_axel: added support for ICON (code from Manuel) +; 20200211-lauer_axel: written. +; +; ############################################################################ + +load "$diag_scripts/../interface_scripts/interface.ncl" + +load "$diag_scripts/shared/plot/aux_plotting.ncl" +load "$diag_scripts/shared/scaling.ncl" +load "$diag_scripts/shared/statistics.ncl" +load "$diag_scripts/shared/plot/style.ncl" + +begin + + enter_msg(DIAG_SCRIPT, "") + + var0 = variable_info[0]@short_name + info0 = select_metadata_by_name(input_file_info, var0) + dim_MOD = ListCount(info0) + if (isatt(variable_info[0], "reference_dataset")) then + refname = variable_info[0]@reference_dataset + end if + names = metadata_att_as_array(info0, "dataset") + projects = metadata_att_as_array(info0, "project") + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT + " (var: " + var0 + ")") + log_info("++++++++++++++++++++++++++++++++++++++++++") + + ; Set default values for non-required diag_script_info attributes + + set_default_att(diag_script_info, "embrace_setup", False) + set_default_att(diag_script_info, "extralegend", False) + set_default_att(diag_script_info, "filename_add", "") + set_default_att(diag_script_info, "panel_labels", True) + set_default_att(diag_script_info, "rel_diff", False) + set_default_att(diag_script_info, "rel_diff_min", -1.0e19) + set_default_att(diag_script_info, "showdiff", False) + set_default_att(diag_script_info, "showyears", False) + set_default_att(diag_script_info, "t_test", False) + set_default_att(diag_script_info, "timemean", "annualclim") + set_default_att(diag_script_info, "units_to", "") + + flag_diff = diag_script_info@showdiff + flag_rel_diff = diag_script_info@rel_diff + rel_diff_min = diag_script_info@rel_diff_min + t_test = diag_script_info@t_test + + if (.not.flag_diff) then + if (flag_rel_diff) then + log_info("rel_diff = True has no effect until showdiff is also " \ + + "set to True") + end if + if (t_test) then + log_info("t_test = True has no effect until showdiff is also " \ + + "set to True") + t_test = False + end if + end if + + if (diag_script_info@filename_add .ne. "") then + filename_add = "_" + diag_script_info@filename_add + else + filename_add = "" + end if + + embracesetup = diag_script_info@embrace_setup + + ; time averaging: at the moment, only "annualclim" and "seasonalclim" + ; are supported + + timemean = diag_script_info@timemean + numseas = 1 ; default + season = (/"annual"/) + + if (timemean.eq."seasonalclim") then + numseas = 4 + delete(season) + season = (/"DJF", "MAM", "JJA", "SON"/) + end if + + units_to = diag_script_info@units_to + + ; create string for caption (netcdf provenance) + + allseas = season(0) + do is = 1, numseas - 1 + allseas = allseas + "/" + season(i) + end do + + panel_labels = diag_script_info@panel_labels + + extralegend = diag_script_info@extralegend + + ; make sure path for (mandatory) netcdf output exists + + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + + ref_ind = -1 ; set to invalid value + + ; if attribute is present, use it so correlations can be calculated + if (isvar("refname")) then + ; set reference model + ref_ind = ind(names .eq. refname) + if (ismissing(ref_ind)) then + log_info("warning: reference dataset (" + refname + ") not found.") + ref_ind = -1 + end if + end if + + climofiles = metadata_att_as_array(info0, "filename") + + outfile = new(numseas, string) + outfile(:) = "" + + if (flag_diff) then + outfile_d = new(numseas, string) + outfile_d(:) = "" + + ; check for reference model definition + if (.not.isvar("refname")) then + error_msg("f", DIAG_SCRIPT, "", \ + "no reference dataset defined in recipe") + end if + + ; set reference model + + ref_ind = ind(names .eq. refname) + if (ismissing(ref_ind)) then + error_msg("f", DIAG_SCRIPT, "", "reference dataset (" \ + + refname + ") is missing") + end if + end if + +end + +begin + ; ########################################### + ; # get data and average time # + ; ########################################### + + maps = new((/dim_MOD, 4/), graphic) + maps_d = new((/dim_MOD, 4/), graphic) + + ind_all_sorted = ispan(0, dim_MOD - 1, 1) ; create array + + if (ref_ind .ge. 0) then + ind_wo_ref = ind(names .ne. refname) + ind_all_sorted(0) = ref_ind + ind_all_sorted(1:dim_MOD - 1) = ind_wo_ref + end if + + corr = new((/numseas/), float) + gavg = new((/numseas/), float) + rmsd = new((/numseas/), float) + bias = new((/numseas/), float) + + ; filenames for netcdf output + + nc_filename_bias = work_dir + "clouds_" + var0 + "_bias.nc" + nc_filename_bias@existing = "append" + nc_filename_mean = work_dir + "clouds_" + var0 + "_mean.nc" + nc_filename_mean@existing = "append" + + do ii = 0, dim_MOD - 1 + + imod = ind_all_sorted(ii) + log_info("processing " + names(imod)) + + if (isvar("data1")) then + delete(data1) + end if + + if (isvar("A0")) then + delete(A0) + end if + + A0 = read_data(info0[imod]) + + ; check dimensions + + dims = getvardims(A0) + + if (dimsizes(dims) .lt. 2) then + error_msg("f", DIAG_SCRIPT, "", dimsizes(dims) + \ + " dimensions, need 3") + end if + idx = ind(dims .eq. "lat") + if (ismissing(idx)) then + error_msg("f", DIAG_SCRIPT, "", "no lat dimension") + end if + idx = ind(dims .eq. "time") + if (ismissing(idx)) then + error_msg("f", DIAG_SCRIPT, "", "no time dimension") + end if + +; ; if coordinate variables do not have the attribute "long_name", +; ; try to use attribute "standard_name" as a substitute +; +; do n = 0, dimsizes(dims) - 1 +; if (.not.isatt(A0&$dims(n)$, "long_name")) then +; if (isatt(A0&$dims(n)$, "standard_name")) then +; A0&$dims(n)$@long_name = A0&$dims(n)$@standard_name +; end if +; end if +; end do + + vcoord = dims(1) ; save name of vertical coordinate variable + if (ii .eq. 0) then + vcoord0_var = A0&$vcoord$ + vcoord0 = vcoord + if (isatt(vcoord0_var, "units")) then + vcoord0_units = vcoord0_var@units + else + vcoord0_units = "" + end if + end if + + delete(dims) + + ; vertical coordinate is assumed to be the dimension not being + ; "time" and "lat" + + ; average over time + + data1 = time_operations(A0, -1, -1, "average", timemean, True) + + if (t_test) then + start_year = info0[imod]@start_year + end_year = info0[imod]@end_year + nyears = end_year - start_year + 1 + + if (nyears .lt. 3) then + log_info("warning: cannot calculate t-test for dataset " \ + + names(imod) + "; need at least 3 years, dataset " \ + + "length = " + tostring(nyears) + " years; disabling t-test") + t_test = False + else + if (isvar("data1_t_stddev")) then + delete(data1_t_stddev) + end if + if (isvar("data1_t_mean")) then + delete(data1_t_mean) + end if + data1_t_stddev = interannual_variability(A0, -1, -1, timemean, "None") + data1_t_mean = data1 + end if + end if + + delete(A0) + + if (units_to .ne. "") then + data0 = convert_units(data1, units_to) + delete(data1) + data1 = data0 + delete(data0) + ; if attribute is present, overwrite with user specified units + if (isatt(variable_info[0], "units")) then + variable_info[0]@units = units_to + end if + end if + + ; ########################################### + ; # Style dependent annotation # + ; ########################################### + ; retrieve unique strings describing the data + ; function in ./diag_scripts/shared/plot/style.ncl + + ; ########################################### + ; # plot ressources # + ; ########################################### + + res = True + + res@cnFillOn = True ; color plot desired + res@cnLineLabelsOn = False ; contour lines + + ; colors + ; http://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml + + ; annotation + + ; if desired, add years to plot title + years_str = "" + if (diag_script_info@showyears) then + years_str = " (" + variable_info[0]@start_year + if (variable_info[0]@start_year .ne. variable_info[0]@end_year) then + years_str = years_str + "-" + variable_info[0]@end_year + end if + years_str = years_str + ")" + end if + +; res@tiMainOn = False + res@tiMainString = names(imod) + years_str + res@cnLevelSelectionMode = "ExplicitLevels" + res@cnLinesOn = False + +; res@lbLabelBarOn = False + res@gsnRightString = "" + + res@cnMissingValFillColor = "Gray" + + res@cnInfoLabelOn = False ; turn off cn info label + + if (isatt(data1&$vcoord$, "standard_name")) then + res@tiYAxisString = data1&$vcoord$@standard_name + if (isatt(data1&$vcoord$, "units")) then + res@tiYAxisString = res@tiYAxisString + " (" \ + + data1&$vcoord$@units + ")" + end if + end if + + if (isatt(data1&lat, "standard_name")) then + res@tiXAxisString = data1&lat@standard_name + end if + + ; set explicit contour levels + + if (isatt(diag_script_info, "explicit_cn_levels")) then + res@cnLevelSelectionMode = "ExplicitLevels" + res@cnLevels = diag_script_info@explicit_cn_levels + end if + + if (.not.isatt(res, "cnLevels")) then + if (var0.eq."clcalipso") then + res@cnLevels = fspan(5, 50, 10) + else + log_info(DIAG_SCRIPT + " (var: " + var0 + "):") + log_info("info: using default contour levels") + res@cnLevels = fspan(min(data1), max(data1), 20) + end if + end if + + ; ########################################### + ; # other Metadata: diag_script, var # + ; ########################################### + ; add to data1 as attributes without prefix + + if (isatt(data1, "diag_script")) then ; add to existing entries + temp = data1@diag_script + delete(data1@diag_script) + data1@diag_script = array_append_record(temp, (/DIAG_SCRIPT/), 0) + delete(temp) + else ; add as new attribute + data1@diag_script = (/DIAG_SCRIPT/) + end if + + if (isatt(variable_info[0], "long_name")) then + data1@var_long_name = variable_info[0]@long_name + end if + + data1@var = var0 + + if (isatt(variable_info[0], "units")) then + data1@var_units = variable_info[0]@units + else + data1@var_units = "" + end if + + res@lbTitleOn = True + res@lbTitleString = data1@var_units + res@lbTitlePosition = "Bottom" + res@lbTitleFontHeightF = 0.015 + + if (.not. isvar("ref_data")) then + ref_data = data1 + vcoord_ref = vcoord + if (t_test) then ; save mean in same units as stddev + ref_data_t_stddev = data1_t_stddev + ref_data_t_mean = data1_t_mean + nyears_ref = nyears + end if + end if + + ; check if data are on same grid (for calculating difference, RMSD, + ; correlation) + + same_grid = False + + if (all(dimsizes(ref_data) .eq. dimsizes(data1))) then + if (max(abs(ref_data&lat - data1&lat)) .le. 1.0e-6) then + if (max(abs(ref_data&$vcoord_ref$ - data1&$vcoord$)) .le. 1.0e-6) then + same_grid = True + end if + end if + end if + + if (flag_diff .and. .not.same_grid) then + flag_diff = False + error_msg("f", DIAG_SCRIPT, "", \ + "Data are not on same grid (horizontal and / or vertical), " \ + + "cannot calculate differences. " \ + + "Set showdiff to False in recipe or regrid data to " \ + + "common grid (check/adjust " \ + + "preprocessor settings in recipe).") + end if + + corr = corr@_FillValue + gavg = gavg@_FillValue + +; if (.not.all(ismissing(data1))) then +; if (numseas.gt.1) then +; do is = 0, numseas - 1 +; if (same_grid .and. (ref_ind .ge. 0)) then +; corr(is) = calculate_metric(ref_data(is, :, :), data1(is, :, :), \ +; "correlation") +; end if +; gavg(is) = dim_avg_n_Wrap(data1(is, :, :), (/0, 1/)) +; end do +; else +; if (same_grid .and. (ref_ind .ge. 0)) then +; corr(0) = calculate_metric(ref_data, data1, "correlation") +; end if +; gavg(0) = dim_avg_n_Wrap(data1, (/0, 1/)) +; end if +; end if + + res@gsnLeftStringFontHeightF = min((/0.025, 0.015 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + res@gsnRightStringFontHeightF = min((/0.025, 0.015 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + + ; ########################################### + ; # create the plot # + ; ########################################### + + ; function in aux_plotting.ncl + + if (ii.eq.0) then + ; note: an array of workspaces (i.e. wks(numseas)) does not work as + ; attributes cannot be assigned to each array element + ; individually + wks0 = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_zonal_" + var0 + \ + "_" + season(0) + filename_add) + nframe = 0 + ; difference plots will be saved to a different file + if (flag_diff) then + wks0d = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_zonal_" + \ + var0 + "_bias_" + season(0) + filename_add) + ndframe = 0 + end if + if (numseas.gt.1) then + wks1 = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_zonal_" + var0 + \ + "_" + season(1) + filename_add) + wks2 = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_zonal_" + var0 + \ + "_" + season(2) + filename_add) + wks3 = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_zonal_" + var0 + \ + "_" + season(3) + filename_add) + ; difference plots will be saved to a different files + if (flag_diff) then + wks1d = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_zonal_" + \ + var0 + "_bias_" + season(1) + filename_add) + wks2d = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_zonal_" + \ + var0 + "_bias_" + season(2) + filename_add) + wks3d = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_zonal_" + \ + var0 + "_bias_" + season(3) + filename_add) + end if + end if + end if + + if (numseas.gt.1) then + do is = 0, numseas - 1 + if (.not.ismissing(corr(is))) then + res@gsnRightString = "corr = " + sprintf("%6.3f", corr(is)) + else + res@gsnRightString = "" + end if + if (.not.ismissing(gavg(is))) then + res@gsnLeftString = "mean = " + sprintf("%6.3f", gavg(is)) + else + res@gsnLeftString = "" + end if + + if (imod.eq.ref_ind) then ; remove corr. string for reference dataset + res@gsnRightString = "" + end if + + if (vcoord0_units .eq. "Pa") then + if (is.eq.0) then + maps(imod, is) = gsn_csm_pres_hgt(wks0, data1(is, :, :), res) + end if + if (is.eq.1) then + maps(imod, is) = gsn_csm_pres_hgt(wks1, data1(is, :, :), res) + end if + if (is.eq.2) then + maps(imod, is) = gsn_csm_pres_hgt(wks2, data1(is, :, :), res) + end if + if (is.eq.3) then + maps(imod, is) = gsn_csm_pres_hgt(wks3, data1(is, :, :), res) + end if + else + if (is.eq.0) then + maps(imod, is) = gsn_csm_contour(wks0, data1(is, :, :), res) + end if + if (is.eq.1) then + maps(imod, is) = gsn_csm_contour(wks1, data1(is, :, :), res) + end if + if (is.eq.2) then + maps(imod, is) = gsn_csm_contour(wks2, data1(is, :, :), res) + end if + if (is.eq.3) then + maps(imod, is) = gsn_csm_contour(wks3, data1(is, :, :), res) + end if + end if + end do + else + if (.not.ismissing(corr(0))) then + res@gsnRightString = "corr = " + sprintf("%6.3f", corr(0)) + else + res@gsnRightString = "" + end if + if (.not.ismissing(gavg(0))) then + res@gsnLeftString = "mean = " + sprintf("%6.3f", gavg(0)) + else + res@gsnLeftString = "" + end if + + if (imod.eq.ref_ind) then ; remove corr. string for reference dataset + res@gsnRightString = "" + end if + if (vcoord0_units .eq. "Pa") then + maps(imod, 0) = gsn_csm_pres_hgt(wks0, data1, res) + else + maps(imod, 0) = gsn_csm_contour(wks0, data1, res) + end if + end if + nframe = nframe + 1 + + ; mandatory netcdf output + + data1@var = var0 + "_mean_" + names(imod) + + ; vertical coordinate might have a different name, which prevents + ; all data to be written to the same netcdf file + ; --> rename vertical coordinate to match the one of the first dataset + ; written to the netcdf file + delete(data1&$vcoord$) + data1!0 = vcoord0 + data1&$vcoord0$ = vcoord0_var + + nc_outfile_mean = ncdf_write(data1, nc_filename_mean) + + ; ======================================================================= + ; Create difference plots (if requested) + ; ======================================================================= + + if (flag_diff .and. (imod .ne. ref_ind)) then + + diff = data1 + if (flag_rel_diff) then + ref_data = where(ref_data .le. 1.0e-19, ref_data@_FillValue, \ + ref_data) + diff = (diff - ref_data) / ref_data * 100.0 + diff = where(ref_data .le. rel_diff_min, diff@_FillValue, diff) + else + diff = diff - ref_data + end if + + dres = res + + dres@gsnLeftString = "" + dres@gsnRightString = "" + + rmsd = rmsd@_FillValue + bias = bias@_FillValue + +; if (numseas.gt.1) then +; do is = 0, numseas - 1 +; if (.not. flag_rel_diff) then +; if (same_grid) then +; rmsd(is) = calculate_metric(ref_data(is, :, :), \ +; data1(is, :, :), "RMSD") +; end if +; bias(is) = dim_avg_n_Wrap(diff(is, :, :), (/0, 1/)) +; end if +; end do +; else +; if (.not. flag_rel_diff) then +; if (same_grid) then +; rmsd(0) = calculate_metric(ref_data, data1, "RMSD") +; end if +; bias(0) = dim_avg_n_Wrap(diff, (/0, 1/)) +; end if +; end if + + ; ---------------------------------------------------------------------- + + ; ########################################### + ; # plot ressources # + ; ########################################### + + dres@gsnLeftStringFontHeightF = min((/0.025, 0.015 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + dres@gsnRightStringFontHeightF = min((/0.025, 0.015 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + +; dres@tiMainOn = False + dres@tiMainString = names(imod) + " - " + refname + years_str + + dres@cnFillOn = True ; color plot desired + dres@cnLineLabelsOn = False ; contour lines + dres@cnLinesOn = False + + ; colors + ; http://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml + + ; annotation + + dres@cnLevelSelectionMode = "ExplicitLevels" + + ; variable specific plotting settings + + ; set contour levels / colors + + if (.not.isvar("cnLevels")) then + + if (isatt(dres, "cnLevels")) then + delete(dres@cnLevels) + end if + if (isatt(dres, "cnFillColors")) then + delete(dres@cnFillColors) + end if + if (isvar("pal")) then + delete(pal) + end if + + if (var0.eq."clcalipso") then + dres@cnLevels = fspan(-25, 25, 11) + end if + + ; ****************************************************** + ; *** relative differences: use specific color table *** + ; ****************************************************** + + if (flag_rel_diff) then + if (isatt(dres, "cnLevels")) then + delete(dres@cnLevels) + end if + if (isatt(dres, "cnFillColors")) then + delete(dres@cnFillColors) + end if + dres@cnLevels = fspan(-100, 100, 21) + if (isvar("pal")) then + delete(pal) + end if + pal = read_colormap_file("$diag_scripts/shared/plot/rgb/" \ + + "percent100.rgb") + dres@cnFillColors = pal + end if + + ; ****************************************************** + + if (.not. isatt(dres, "cnLevels")) then + log_info(DIAG_SCRIPT + " (var: " + var0 + "):") + log_info("info: using default contour levels") + dres@cnLevels = fspan(min(diff), max(diff), 20) + end if + + cnLevels = dres@cnLevels + if (isatt(dres, "cnFillColors")) then + cnFillColors = dres@cnFillColors + end if + + else ; use previously defined colors and contour intervals + + if (isatt(dres, "cnLevels")) then + delete(dres@cnLevels) + end if + if (isatt(dres, "cnFillColors")) then + delete(dres@cnFillColors) + end if + + dres@cnLevels = cnLevels + + if (isvar("cnFillColors")) then + dres@cnFillColors = cnFillColors + end if + + end if ; if .not.isvar("cnLevels") + +; if (imod.eq.ref_ind) then +; dres@lbLabelBarOn = True +; else +; dres@lbLabelBarOn = False +; end if + + ; map attributes + + dres@cnMissingValFillColor = "Gray" + + dres@cnInfoLabelOn = False ; turn off cn info label + + ; set explicit contour levels + + if (isatt(diag_script_info, "explicit_cn_dlevels")) then + dres@cnLevelSelectionMode = "ExplicitLevels" + if (isatt(dres, "cnLevels")) then + delete(dres@cnLevels) + end if + dres@cnLevels = diag_script_info@explicit_cn_dlevels + end if + + ; ########################################### + ; # other Metadata: diag_script, var # + ; ########################################### + ; add to diff as attributes without prefix + + if (isatt(variable_info[0], "long_name")) then + diff@var_long_name = variable_info[0]@long_name + end if + if (isatt(variable_info[0], "units")) then + diff@var_units = variable_info[0]@units + else + diff@var_units = "" + end if + + ; ########################################### + ; # create the plot # + ; ########################################### + + if (t_test) then + dres@gsnDraw = False ; do not draw yet + dres@gsnFrame = False ; don't advance frame + end if + + ; ---------------------------------------------------------------------- + + if (numseas.gt.1) then + do is = 0, numseas - 1 + if (.not.ismissing(rmsd(is))) then + dres@gsnRightString = "rmsd = " + sprintf("%6.3f", rmsd(is)) + else + dres@gsnRightString = "" + end if + if (.not.ismissing(bias(is))) then + dres@gsnLeftString = "bias = " + sprintf("%6.3f", bias(is)) + else + dres@gsnLeftString = "" + end if + + if (vcoord0_units .eq. "Pa") then + if (is.eq.0) then + maps_d(imod, is) = gsn_csm_pres_hgt(wks0d, diff(is, :, :), dres) + end if + if (is.eq.1) then + maps_d(imod, is) = gsn_csm_pres_hgt(wks1d, diff(is, :, :), dres) + end if + if (is.eq.2) then + maps_d(imod, is) = gsn_csm_pres_hgt(wks2d, diff(is, :, :), dres) + end if + if (is.eq.3) then + maps_d(imod, is) = gsn_csm_pres_hgt(wks3d, diff(is, :, :), dres) + end if + else + if (is.eq.0) then + maps_d(imod, is) = gsn_csm_contour(wks0d, diff(is, :, :), dres) + end if + if (is.eq.1) then + maps_d(imod, is) = gsn_csm_contour(wks1d, diff(is, :, :), dres) + end if + if (is.eq.2) then + maps_d(imod, is) = gsn_csm_contour(wks2d, diff(is, :, :), dres) + end if + if (is.eq.3) then + maps_d(imod, is) = gsn_csm_contour(wks3d, diff(is, :, :), dres) + end if + end if + end do + else + if (.not.ismissing(rmsd(0))) then + dres@gsnRightString = "rmsd = " + sprintf("%6.3f", rmsd(0)) + else + dres@gsnRightString = "" + end if + if (.not.ismissing(bias(0))) then + dres@gsnLeftString = "bias = " + sprintf("%6.3f", bias(0)) + else + dres@gsnLeftString = "" + end if + if (vcoord0_units .eq. "Pa") then + maps_d(imod, 0) = gsn_csm_pres_hgt(wks0d, diff, dres) + else + maps_d(imod, 0) = gsn_csm_contour(wks0d, diff, dres) + end if + end if + ndframe = ndframe + 1 + + ; mandatory netcdf output + + diff@var = var0 + "_bias_" + names(imod) + nc_outfile_bias = ncdf_write(diff, nc_filename_bias) + + ; --------------------------------------------------------------------- + ; optionally mask non-significant grid cells + ; --------------------------------------------------------------------- + + if (t_test) then + n1 = nyears + n2 = nyears_ref + + tres = True + + tres@gsnDraw = False ; do not draw yet + tres@gsnFrame = False ; don't advance frame + tres@cnMissingValFillColor = -1 + tres@cnLevelSelectionMode = "ExplicitLevels" + tres@cnLevels = 0.95 +; tres@cnFillColors = (/"gray70", "transparent"/) + tres@cnFillColors = (/"black", "transparent"/) + tres@cnFillPattern = 17 + tres@cnFillOn = True ; color plot desired + tres@cnInfoLabelOn = False + tres@cnLinesOn = False + tres@cnLineLabelsOn = False + tres@lbLabelBarOn = False + tres@gsnRightString = "" + tres@gsnLeftString = "" + tres@gsnCenterString = "" + tres@tiYAxisOn = False + tres@tmXBBorderOn = False + tres@tmXTBorderOn = False + tres@tmYLBorderOn = False + tres@tmYRBorderOn = False + tres@tmXBLabelsOn = False + tres@tmYLLabelsOn = False + tres@tmXBOn = False + tres@tmXTOn = False + tres@tmYLOn = False + tres@tmYROn = False + + if (numseas.gt.1) then + do is = 0, numseas - 1 + x1 = data1_t_mean(is, :, :) + x2 = ref_data_t_mean(is, :, :) + s1 = data1_t_stddev(is, :, :) ^ 2 + s2 = ref_data_t_stddev(is, :, :) ^ 2 + + prob = ttest(x1, s1, n1, x2, s2, n2, True, False) + plot_var = 1. - prob + copy_VarCoords(data1_t_mean, plot_var) + + if (vcoord0_units .eq. "Pa") then + if (is.eq.0) then + tmask = gsn_csm_pres_hgt(wks0d, plot_var, tres) + end if + if (is.eq.1) then + tmask = gsn_csm_pres_hgt(wks1d, plot_var, tres) + end if + if (is.eq.2) then + tmask = gsn_csm_pres_hgt(wks2d, plot_var, tres) + end if + if (is.eq.3) then + tmask = gsn_csm_pres_hgt(wks3d, plot_var, tres) + end if + else + if (is.eq.0) then + tmask = gsn_csm_contour(wks0d, plot_var, tres) + end if + if (is.eq.1) then + tmask = gsn_csm_contour(wks1d, plot_var, tres) + end if + if (is.eq.2) then + tmask = gsn_csm_contour(wks2d, plot_var, tres) + end if + if (is.eq.3) then + tmask = gsn_csm_contour(wks3d, plot_var, tres) + end if + end if + + overlay(maps_d(imod, is), tmask) + delete(tmask) + draw(maps_d(imod, is)) + + if (is.eq.0) then + frame(wks0d) + end if + if (is.eq.1) then + frame(wks1d) + end if + if (is.eq.2) then + frame(wks2d) + end if + if (is.eq.3) then + frame(wks3d) + end if + + end do + else + x1 = data1_t_mean + x2 = ref_data_t_mean + s1 = data1_t_stddev ^ 2 + s2 = ref_data_t_stddev ^ 2 + + prob = ttest(x1, s1, n1, x2, s2, n2, True, False) + plot_var = 1. - prob + copy_VarCoords(data1_t_mean, plot_var) + + if (vcoord0_units .eq. "Pa") then + tmask = gsn_csm_pres_hgt(wks0d, plot_var, tres) + else + tmask = gsn_csm_contour(wks0d, plot_var, tres) + end if + + overlay(maps_d(imod, 0), tmask) + delete(tmask) + draw(maps_d(imod, 0)) + frame(wks0d) + end if + + delete([/x1, x2, s1, s2, prob/]) + end if ; if t_test + + ; --------------------------------------------------------------------- + + end if ; if flag_diff + + ; ======================================================================= + + end do ; ii-loop (models) + + ; save default color map in case it is needed later for optionally + ; plotting color bar to a separate file + + tmp_colors = gsn_retrieve_colormap(wks0) + cdims = dimsizes(tmp_colors) + nboxes = dimsizes(res@cnLevels) + clen = cdims(0) + stride = max((/1, ((clen(0)-1) - 2) / nboxes /)) + fill_colors = ispan(2, clen(0) - 1, stride) + mean_colors = tmp_colors(fill_colors, :) + delete(tmp_colors) + delete(fill_colors) + delete(cdims) + + ; sort plots if needed (observations go first) + + plottmp = ispan(0, dim_MOD - 1, 1) + plotind = plottmp + + ; move plots of observational datasets (if present) into the first line(s) + ; of the panel plot + j = 0 + do i = 0, dimsizes(plottmp) - 1 + if (i.eq.ref_ind) then + plotind(j) = plottmp(i) + j = j + 1 + else if (plottmp(i) .lt. dimsizes(projects)) then + if (isStrSubset(str_lower(projects(plottmp(i))), \ + "obs")) then + plotind(j) = plottmp(i) + j = j + 1 + end if + end if + end if + end do + + do i = 0, dimsizes(plottmp) - 1 + if ((isStrSubset(str_lower(projects(plottmp(i))), \ + "obs")).or.(i.eq.ref_ind)) then + else + plotind(j) = plottmp(i) + j = j + 1 + end if + end do + + pres = True ; needed to override + ; panelling defaults +; pres@gsnPanelLabelBar = True ; add common colorbar + if (panel_labels) then + ; print dataset name on each panel + pres@gsnPanelFigureStrings = names(plotind) + end if + pres@gsnPanelFigureStringsJust = "TopRight" + pres@gsnPanelFigureStringsFontHeightF = min((/0.01, 0.01 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + pres@lbLabelFontHeightF = min((/0.015, 0.01 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + pres@lbAutoManage = False + pres@lbTopMarginF = 0.1 + pres@lbTitleOn = True + pres@lbTitleFontHeightF = min((/0.015, 0.01 * 6.0 \ + / tofloat((dim_MOD + 1) / 2)/)) + pres@lbTitlePosition = "Bottom" + pres@lbTitleString = data1@long_name + " (" \ + + data1@units + ")" + pres@gsnPanelCenter = False + if (dim_MOD.le.8) then + pres@pmLabelBarOrthogonalPosF = -0.03 + else + pres@pmLabelBarOrthogonalPosF = -0.01 ; shift label bar a bit to + ; the bottom + end if + + if (embracesetup) then + if (numseas.gt.1) then + pres@txString = season(0) + outfile(0) = panelling(wks0, maps(plotind, 0), (dim_MOD + 3) / 4, \ + 4, pres) + + pres@txString = season(1) + outfile(1) = panelling(wks1, maps(plotind, 1), (dim_MOD + 3) / 4, \ + 4, pres) + + pres@txString = season(2) + outfile(2) = panelling(wks2, maps(plotind, 2), (dim_MOD + 3) / 4, \ + 4, pres) + + pres@txString = season(3) + outfile(3) = panelling(wks3, maps(plotind, 3), (dim_MOD + 3) / 4, \ + 4, pres) + log_info(" Wrote " + outfile) + else + pres@gsnPanelRowSpec = True ; tell panel what order to plt + pres@gsnPanelYWhiteSpacePercent = 5 + pres@gsnPanelXWhiteSpacePercent = 5 + if (isatt(diag_script_info, "PanelTop")) then + top = tofloat(diag_script_info@PanelTop) + else + top = 0.99 ; default + end if + pres@gsnPanelTop = top + + if (isvar("plotsperline")) then + delete(plotsperline) + end if + + plotsperline = new((dim_MOD + 1) / 2, integer) + plotsperline = 2 + + if ((isStrSubset(str_lower(projects(plotind(0))), \ + "obs")).and. \ + .not.(isStrSubset(str_lower(projects(plotind(1))), \ + "obs"))) then + plotsperline(0) = 1 + end if + + if (sum(plotsperline).gt.dimsizes(plotind)) then + plotsperline(dimsizes(plotsperline) - 1) = 1 + end if + + if (sum(plotsperline).lt.dimsizes(plotind)) then + xadd = 1 + xtmp = array_append_record(plotsperline, xadd, 0) + delete(plotsperline) + plotsperline = xtmp + delete(xtmp) + end if + gsn_panel(wks0, maps(plotind, 0), plotsperline, pres) + outfile(0) = wks0@fullname + end if + else ; if embracesetup + if (numseas.gt.1) then + pres@txString = season(0) + outfile(0) = panelling(wks0, maps(plotind, 0), (dim_MOD + 3) / 4, \ + 4, pres) + + pres@txString = season(1) + outfile(1) = panelling(wks1, maps(plotind, 1), (dim_MOD + 3) / 4, \ + 4, pres) + + pres@txString = season(2) + outfile(2) = panelling(wks2, maps(plotind, 2), (dim_MOD + 3) / 4, \ + 4, pres) + + pres@txString = season(3) + outfile(3) = panelling(wks3, maps(plotind, 3), (dim_MOD + 3) / 4, \ + 4, pres) + else + outfile(0) = panelling(wks0, maps(plotind, 0), (dim_MOD + 3) / 4, \ + 4, pres) + end if + end if ; if embracesetup + nframe = nframe + 1 + + do is = 0, numseas - 1 + log_info("Wrote " + outfile(is)) + end do + + do is = 0, numseas - 1 + suffix = get_file_suffix(outfile(is), 0) + if (suffix .eq. ".png") then + outfile(is) = suffix@fBase + "." + sprinti("%0.6i", nframe) + suffix + end if + end do + + ; ------------------------------------------------------------------------ + ; write provenance to netcdf output and plot file(s) (mean) + ; ------------------------------------------------------------------------ + + statistics = (/"clim", "mean"/) + domain = "global" + plottype = "zonal" + + do is = 0, numseas - 1 + caption = "Zonal mean values for variable " + var0 \ + + " (" + allseas + ")." + log_provenance(nc_outfile_mean, outfile(is), caption, statistics, \ + domain, plottype, "", "", climofiles) + end do + + ; ======================================================================== + + if (flag_diff) then + pres@lbTitleString = "~F33~D~F21~" + diff@long_name + " (" + \ + diff@units + ")" + + ; save default color map in case it is needed later for optionally + ; plotting color bar to a separate file + + if (isvar("nboxes")) then + delete(nboxes) + end if + + tmp_colors = gsn_retrieve_colormap(wks0d) + cdims = dimsizes(tmp_colors) + nboxes = dimsizes(dres@cnLevels) + clen = cdims(0) + stride = max((/1, ((clen(0)-1) - 2) / nboxes /)) + fill_colors = ispan(2, clen(0) - 1, stride) + diff_colors = tmp_colors(fill_colors, :) + delete(tmp_colors) + delete(fill_colors) + delete(cdims) + + if (isvar("plottmp")) then + delete(plottmp) + end if + + if (isvar("plotind")) then + delete(plotind) + end if + + plottmp = ind(ispan(0, dim_MOD - 1, 1).ne.ref_ind) + plotind = plottmp + + ; if there is a second observational dataset, move the corresponding + ; plot to the first line of the panel plot + + j = 0 + do i = 0, dimsizes(plottmp) - 1 + if (isStrSubset(str_lower(projects(plottmp(i))), "obs")) then + plotind(j) = plottmp(i) + j = j + 1 + end if + end do + do i = 0, dimsizes(plottmp) - 1 + if (isStrSubset(str_lower(projects(plottmp(i))), "obs")) then + else + plotind(j) = plottmp(i) + j = j + 1 + end if + end do + + if (isatt(pres, "gsnPanelFigureStrings")) then + delete(pres@gsnPanelFigureStrings) + end if + if (panel_labels) then + pres@gsnPanelFigureStrings = names(plotind) + end if + + if (dimsizes(plotind).eq.1) then + pres@gsnPanelRight = 0.5 + end if + + if (embracesetup) then + if (numseas.gt.1) then + pres@txString = season(0) + outfile_d(0) = panelling(wks0d, maps_d(plotind, 0), \ + (dim_MOD + 3) / 4, 4, pres) + + pres@txString = season(1) + outfile_d(1) = panelling(wks1d, maps_d(plotind, 1), \ + (dim_MOD + 3) / 4, 4, pres) + + pres@txString = season(2) + outfile_d(2) = panelling(wks2d, maps_d(plotind, 2), \ + (dim_MOD + 3) / 4, 4, pres) + + pres@txString = season(3) + outfile_d(3) = panelling(wks3d, maps_d(plotind, 3), \ + (dim_MOD + 3) / 4, 4, pres) + else + pres@gsnPanelRowSpec = True ; tell panel what order to plt + pres@gsnPanelYWhiteSpacePercent = 5 + pres@gsnPanelXWhiteSpacePercent = 5 + pres@gsnPanelTop = tofloat(diag_script_info@PanelTop) + + if (isvar("plotsperline")) then + delete(plotsperline) + end if + + plotsperline = new(max((/1, dim_MOD / 2/)), integer) + plotsperline = 2 + + if (dimsizes(plotind).gt.1) then + if ((isStrSubset(str_lower(projects(plotind(0))), "obs")).and. \ + .not. \ + (isStrSubset(str_lower(projects(plotind(1))), "obs"))) then + plotsperline(0) = 1 + end if + end if + + if (sum(plotsperline).gt.dimsizes(plotind)) then + plotsperline(dimsizes(plotsperline) - 1) = 1 + end if + + if (sum(plotsperline).lt.dimsizes(plotind)) then + xadd = 1 + xtmp = array_append_record(plotsperline, xadd, 0) + delete(plotsperline) + plotsperline = xtmp + delete(xtmp) + end if + + gsn_panel(wks0d, maps_d(plotind, 0), plotsperline, pres) + outfile_d(0) = wks0d@fullname + end if + else ; embracesetup = False + if (numseas.gt.1) then + pres@txString = season(0) + outfile_d(0) = panelling(wks0d, maps_d(plotind, 0), \ + (dim_MOD + 3) / 4, 4, pres) + + pres@txString = season(1) + outfile_d(1) = panelling(wks1d, maps_d(plotind, 1), \ + (dim_MOD + 3) / 4, 4, pres) + + pres@txString = season(2) + outfile_d(2) = panelling(wks2d, maps_d(plotind, 2), \ + (dim_MOD + 3) / 4, 4, pres) + + pres@txString = season(3) + outfile_d(3) = panelling(wks3d, maps_d(plotind, 3), \ + (dim_MOD + 3) / 4, 4, pres) + else + outfile_d(0) = panelling(wks0d, maps_d(plotind, 0), \ + (dim_MOD + 3) / 4, 4, pres) + end if + end if ; end if embracesetup + ndframe = ndframe + 1 + + do is = 0, numseas - 1 + suffix = get_file_suffix(outfile_d(is), 0) + if (suffix .eq. ".png") then + outfile_d(is) = suffix@fBase + "." + sprinti("%0.6i", ndframe) + suffix + end if + end do + + do is = 0, numseas - 1 + log_info(" Wrote " + outfile(is)) + + ; -------------------------------------------------------------------- + ; write provenance to netcdf output and plot file(s) (bias) + ; -------------------------------------------------------------------- + + statistics = (/"clim", "diff"/) + domain = "global" + plottype = "zonal" + + ; note: because function log_provenance does not yet support to attach + ; different captions to netcdf (contains all seasons) and plots + ; (contain one season each), the caption cannot specifiy the + ; season plotted; using "annual" or "DJF/MAM/JJA/SON" instead. + + caption = "Differences for zonally averaged variable " + var0 \ + + " (" + allseas + "), reference = " + refname + "." + + if (t_test) then + caption = caption \ + + " Non-significant grid cells are hatched." + end if + + log_provenance(nc_outfile_bias, outfile_d(is), caption, statistics, \ + domain, plottype, "", "", climofiles) + end do + + end if ; if flag_diff + + ; optionally save legend(s) to extra file(s) + + if (extralegend) then + nboxes = dimsizes(res@cnLevels) + 1 + wksleg = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_" + var0 \ + + "_legend") + pres@lbMonoFillPattern = True + pres@lbOrientation = "Horizontal" + pres@vpWidthF = 0.7 + pres@vpHeightF = 0.1 + pres@lbLabelFontHeightF = 0.015 + pres@lbLabelAlignment = "InteriorEdges" + pres@lbTitleFontHeightF = 0.015 + pres@lbTitleString = data1@long_name + " (" + data1@units + ")" + + labels = tostring(res@cnLevels) + + ; remove trailing zeros from strings + + do i = 0, dimsizes(labels) - 1 + i1 = str_index_of_substr(labels(i), ".", -1) + if (.not.ismissing(i1)) then + tmp = stringtochar(labels(i)) + do j = dimsizes(tmp) - 2, i1, 1 + if ((tmp(j).ne.".").and.(tmp(j).ne."0")) then + break + end if + end do + labels(i) = chartostring(tmp(0:j)) + delete(tmp) + end if + end do + + if (isatt(data1, "res_cnFillColors")) then + pres@lbFillColors = res@cnFillColors + else if (isatt(data1, "res_cnFillPalette")) then + pres@lbFillColors = res@cnFillPalette + else + pres@lbFillColors = mean_colors ; default colors + end if + end if + + gsn_labelbar_ndc(wksleg, nboxes, labels, 0.1, 0.9, pres) + + delete(wksleg) + delete(labels) + delete(pres@lbFillColors) + + if (flag_diff) then + nboxes = dimsizes(dres@cnLevels) + 1 + wksleg = get_wks("dummy_for_wks", DIAG_SCRIPT, "clouds_" + var0 \ + + "_diff_legend") + + labels = tostring(dres@cnLevels) + + ; remove trailing zeros from strings + + do i = 0, dimsizes(labels) - 1 + i1 = str_index_of_substr(labels(i), ".", -1) + if (.not.ismissing(i1)) then + tmp = stringtochar(labels(i)) + do j = dimsizes(tmp) - 2, i1, 1 + if ((tmp(j).ne.".").and.(tmp(j).ne."0")) then + break + end if + end do + labels(i) = chartostring(tmp(0:j)) + delete(tmp) + end if + end do + + if (flag_rel_diff) then + pres@lbTitleString = "~F33~D~F21~" + data1@long_name + " (%)" + else + pres@lbTitleString = "~F33~D~F21~" + data1@long_name + " (" + \ + data1@units + ")" + end if + + if (isatt(diff, "res_cnFillColors")) then + pres@lbFillColors = dres@cnFillColors + else if (isatt(diff, "res_cnFillPalette")) then + pres@lbFillColors = dres@cnFillPalette + else + pres@lbFillColors = diff_colors ; default colors + end if + end if + + gsn_labelbar_ndc(wksleg, nboxes, labels, 0.1, 0.9, pres) + end if ; if (flag_diff) + end if ; if (extralegend) + + ; ========================================================================== + + leave_msg(DIAG_SCRIPT, "") + +end diff --git a/esmvaltool/diag_scripts/cmug_h2o/diag_tropopause.py b/esmvaltool/diag_scripts/cmug_h2o/diag_tropopause.py index 25aa647744..fc42026f3e 100644 --- a/esmvaltool/diag_scripts/cmug_h2o/diag_tropopause.py +++ b/esmvaltool/diag_scripts/cmug_h2o/diag_tropopause.py @@ -144,8 +144,9 @@ def find_min(data, data_min, axis): def plot_tp_map(cfg, mean_cube, titlestr, variable, listdata): """Plot contour map.""" # create figure and axes instances - fig, axx = plt.subplots(figsize=(7, 5)) - axx = plt.axes(projection=cart.PlateCarree()) + + subplot_kw = {'projection': cart.PlateCarree(central_longitude=0.0)} + fig, axx = plt.subplots(figsize=(7, 5), subplot_kw=subplot_kw) axx.set_extent([-180, 180, -90, 90], cart.PlateCarree()) data_c, lon_c = add_cyclic_point(mean_cube.data, @@ -216,6 +217,10 @@ def plot_tp_map(cfg, mean_cube, titlestr, variable, listdata): _get_provenance_record(listdata, titlestr + variable, ['other'], ['global'])) + provenance_logger.log(get_plot_filename(figname, cfg), + _get_provenance_record(listdata, + titlestr + variable, + ['other'], ['global'])) def main(cfg): diff --git a/esmvaltool/diag_scripts/cmug_h2o/diag_tropopause_zonalmean.py b/esmvaltool/diag_scripts/cmug_h2o/diag_tropopause_zonalmean.py index 0401bb45af..d342a6224c 100644 --- a/esmvaltool/diag_scripts/cmug_h2o/diag_tropopause_zonalmean.py +++ b/esmvaltool/diag_scripts/cmug_h2o/diag_tropopause_zonalmean.py @@ -284,6 +284,8 @@ def plot_zonal_mean(cfg, mean_cube, dataname, titlestr, variable): pformat(provenance_record)) with ProvenanceLogger(cfg) as provenance_logger: provenance_logger.log(diagnostic_file, provenance_record) + provenance_logger.log(get_plot_filename(figname, cfg), + provenance_record) def plot_zonal_timedev(cfg, mean_cube, dataname, titlestr, variable): @@ -340,6 +342,8 @@ def plot_zonal_timedev(cfg, mean_cube, dataname, titlestr, variable): pformat(provenance_record)) with ProvenanceLogger(cfg) as provenance_logger: provenance_logger.log(diagnostic_file, provenance_record) + provenance_logger.log(get_plot_filename(figname, cfg), + provenance_record) def plot_profiles(cfg, profiles, available_vars_min_tas, available_datasets): @@ -400,6 +404,8 @@ def plot_profiles(cfg, profiles, available_vars_min_tas, available_datasets): pformat(provenance_record)) with ProvenanceLogger(cfg) as provenance_logger: provenance_logger.log(diagnostic_file, provenance_record) + provenance_logger.log(get_plot_filename(figname, cfg), + provenance_record) def main(cfg): diff --git a/esmvaltool/diag_scripts/cos22esd/climate_change_hotspot.py b/esmvaltool/diag_scripts/cos22esd/climate_change_hotspot.py index c55395cb62..8126894964 100644 --- a/esmvaltool/diag_scripts/cos22esd/climate_change_hotspot.py +++ b/esmvaltool/diag_scripts/cos22esd/climate_change_hotspot.py @@ -94,7 +94,7 @@ def extract_regional(self, cube): self.cfg["region"][2], # start_lat self.cfg["region"][3], # end_lat ) - regional_cube = mask_landsea(regional_cube, "sea", True) + regional_cube = mask_landsea(regional_cube, "sea") return regional_cube diff --git a/esmvaltool/diag_scripts/cos22esd/hotspot_plotter.py b/esmvaltool/diag_scripts/cos22esd/hotspot_plotter.py index 38574d97b8..e7de5764e8 100644 --- a/esmvaltool/diag_scripts/cos22esd/hotspot_plotter.py +++ b/esmvaltool/diag_scripts/cos22esd/hotspot_plotter.py @@ -194,8 +194,7 @@ def _hotspot_fields_plot_panels(self, results_dict, fig, keys, style): @staticmethod def _add_axes_attributes(axes, path_ext, plotextend): - axes.set_boundary(path_ext, transform=ccrs.PlateCarree(), - use_as_clip_path=True) + axes.set_boundary(path_ext, transform=ccrs.PlateCarree()) axes.set_facecolor("silver") axes.set_extent(plotextend, crs=ccrs.PlateCarree()) axes.coastlines("50m", linewidth=0.8) @@ -347,8 +346,9 @@ def timeseries_scatter_plot(self, results_dict, season, var_combination): provenance_record = self.get_rolling_mean_provenance( suptitle, ancestor_files) - save_figure(f"scenario_combination_{var_combination}_{season}", - provenance_record, self.cfg) + basename = ("scenario_combination_" + f"{var_combination.replace(':', '-')}_{season}") + save_figure(basename, provenance_record, self.cfg) @staticmethod def _timeseries_scatter_plot_data(results_dict, large_scale_key, diff --git a/esmvaltool/diag_scripts/deangelis15nat/deangelisf1b.py b/esmvaltool/diag_scripts/deangelis15nat/deangelisf1b.py index 8824a81a35..6d525ef34b 100644 --- a/esmvaltool/diag_scripts/deangelis15nat/deangelisf1b.py +++ b/esmvaltool/diag_scripts/deangelis15nat/deangelisf1b.py @@ -233,8 +233,8 @@ def main(cfg): data_var_sum = {} for iexp in available_exp: - data_var_sum[iexp] = np.fromiter(data_var[iexp].values(), - dtype=float) / float(len(pathlist)) + data_var_sum[iexp] = np.fromiter( + data_var[iexp].values(), dtype=np.float64) / float(len(pathlist)) # Plot ECS regression if desired plot_bar_deangelis(cfg, data_var_sum, available_exp, available_vars) diff --git a/esmvaltool/diag_scripts/deangelis15nat/deangelisf2ext.py b/esmvaltool/diag_scripts/deangelis15nat/deangelisf2ext.py index 90c3178b67..634e513dd5 100644 --- a/esmvaltool/diag_scripts/deangelis15nat/deangelisf2ext.py +++ b/esmvaltool/diag_scripts/deangelis15nat/deangelisf2ext.py @@ -36,6 +36,7 @@ import iris import iris.coord_categorisation as cat import matplotlib.pyplot as plt +import matplotlib.transforms as mpltrans import numpy as np from scipy import stats @@ -365,6 +366,8 @@ def plot_slope_regression(cfg, data_dict): pformat(provenance_record)) with ProvenanceLogger(cfg) as provenance_logger: provenance_logger.log(diagnostic_file, provenance_record) + provenance_logger.log(get_plot_filename('fig2a', cfg), + provenance_record) fig, axx = plt.subplots(figsize=(7, 7)) @@ -536,6 +539,8 @@ def plot_slope_regression_all(cfg, data_dict, available_vars): pformat(provenance_record)) with ProvenanceLogger(cfg) as provenance_logger: provenance_logger.log(diagnostic_file, provenance_record) + provenance_logger.log(get_plot_filename('exfig2a', cfg), + provenance_record) def plot_rlnst_regression(cfg, dataset_name, data, variables, regs): @@ -609,8 +614,7 @@ def plot_rlnst_regression(cfg, dataset_name, data, variables, regs): 'label': yreg_dict["lab_hfss"]}, {'color': 'tab:gray', 'linestyle': '-'}], - save_kwargs={'bbox_inches': 'tight', - 'orientation': 'landscape'}, + save_kwargs={'bbox_inches': mpltrans.Bbox.from_extents(0, -1, 6.5, 6)}, axes_functions={'set_title': dataset_name, 'set_xlabel': '2−m temperature (tas)' + 'global−mean annual anomaly (' + @@ -670,6 +674,7 @@ def plot_rlnst_regression(cfg, dataset_name, data, variables, regs): pformat(provenance_record)) with ProvenanceLogger(cfg) as provenance_logger: provenance_logger.log(diagnostic_file, provenance_record) + provenance_logger.log(filepath, provenance_record) def substract_and_reg_deangelis2(cfg, data, var): diff --git a/esmvaltool/diag_scripts/deangelis15nat/deangelisf3f4.py b/esmvaltool/diag_scripts/deangelis15nat/deangelisf3f4.py index 7ef72f8763..a8014d20aa 100644 --- a/esmvaltool/diag_scripts/deangelis15nat/deangelisf3f4.py +++ b/esmvaltool/diag_scripts/deangelis15nat/deangelisf3f4.py @@ -129,7 +129,7 @@ def set_grid_pw_reg_obs(cubes, meas_tub_rsnstcsnorm, meas_tub_prw): # Observations (one rsnstcsnorm, X PRW data set, DeAngelis contains 3 data_prw_obs = OrderedDict() grid_pw = {} - grid_pw["x"] = np.arange(12.0, 59.0, 2, dtype=float) + grid_pw["x"] = np.arange(12.0, 59.0, 2, dtype=np.float64) grid_pw["yobs"] = OrderedDict() reg_prw_obs = OrderedDict() @@ -345,6 +345,8 @@ def plot_deangelis_fig3a(cfg, dataset_name, data, reg_prw, reg_obs): pformat(provenance_record)) with ProvenanceLogger(cfg) as provenance_logger: provenance_logger.log(diagnostic_file, provenance_record) + provenance_logger.log(get_plot_filename('fig3a_' + dataset_name, cfg), + provenance_record) def plot_deangelis_fig4(cfg, data_model, mdrsnstdts, prw): @@ -457,6 +459,8 @@ def plot_deangelis_fig4(cfg, data_model, mdrsnstdts, prw): pformat(provenance_record)) with ProvenanceLogger(cfg) as provenance_logger: provenance_logger.log(diagnostic_file, provenance_record) + provenance_logger.log(get_plot_filename('fig4', cfg), + provenance_record) def plot_deangelis_fig3b4(cfg, data_model, reg_prw_obs): @@ -574,6 +578,8 @@ def plot_deangelis_fig3b4(cfg, data_model, reg_prw_obs): pformat(provenance_record)) with ProvenanceLogger(cfg) as provenance_logger: provenance_logger.log(diagnostic_file, provenance_record) + provenance_logger.log(get_plot_filename('fig3b', cfg), + provenance_record) # Fig 4 plot_deangelis_fig4(cfg, data_model, mdrsnstdts, prw) @@ -581,7 +587,7 @@ def plot_deangelis_fig3b4(cfg, data_model, reg_prw_obs): def make_grid_prw(grid_pwx, data_prw_obs, data_rsnstcsnorm_obs): """Grid rsnstcsnorm based on prw grid.""" - gridded_rsnstcsnorm_obs = np.zeros(len(grid_pwx), dtype=float) + gridded_rsnstcsnorm_obs = np.zeros(len(grid_pwx), dtype=np.float64) for jjj, bincenter in enumerate(grid_pwx): index_obs = np.where((data_prw_obs >= bincenter - 1.0) & diff --git a/esmvaltool/diag_scripts/emergent_constraints/__init__.py b/esmvaltool/diag_scripts/emergent_constraints/__init__.py index 2cd5ec6433..cda3723f18 100644 --- a/esmvaltool/diag_scripts/emergent_constraints/__init__.py +++ b/esmvaltool/diag_scripts/emergent_constraints/__init__.py @@ -69,7 +69,10 @@ def _check_x_y_arrays(x_array, y_array): def _add_column(data_frame, series, column_name): """Add column to :class:`pandas.DataFrame` (expands index if necessary).""" for row in series.index.difference(data_frame.index): - data_frame = data_frame.append(pd.Series(name=row)) + data_frame = pd.concat([ + data_frame, + pd.Series(name=row, dtype=np.float64).to_frame().T, + ]) if column_name in data_frame.columns: for row in series.index: if np.isnan(data_frame.loc[row, column_name]): @@ -486,6 +489,8 @@ def _create_pred_input_plot(x_pred, vline_kwargs = {'color': 'k', 'linestyle': ':', 'label': 'Observation'} if vspan_kwargs is None: vspan_kwargs = {'color': 'k', 'alpha': 0.1} + x_pred = x_pred[0] + x_pred_error = x_pred_error[0] axes.axvline(x_pred, **vline_kwargs) axes.axvspan(x_pred - x_pred_error, x_pred + x_pred_error, **vspan_kwargs) return axes @@ -804,9 +809,13 @@ def get_input_data(cfg): # Unify indices of features and label for row in features.index.difference(label.index): - label = label.append(pd.Series(name=row)) + label = pd.concat( + [label, pd.Series(name=row, dtype=np.float64).to_frame().T] + ) for row in label.index.difference(features.index): - features = features.append(pd.Series(name=row)) + features = pd.concat( + [features, pd.Series(name=row, dtype=np.float64).to_frame().T] + ) # Sort data frames for data_frame in (features, label, pred_input, pred_input_err): @@ -1385,14 +1394,16 @@ def plot_target_distributions(training_data, pred_input_data, attributes, add_combined_group=cfg['combine_groups']) summary_columns = pd.MultiIndex.from_product( [groups, ['best estimate', 'range', 'min', 'max']]) - summary = pd.DataFrame(columns=summary_columns) + summary = pd.DataFrame(columns=summary_columns, dtype=np.float64) # Iterate over features for feature in training_data.x.columns: (x_data, y_data) = get_xy_data_without_nans(training_data, feature, label) colors = get_colors(cfg, groups=groups) - summary_for_feature = pd.Series(index=summary_columns, name=feature) + summary_for_feature = pd.Series( + index=summary_columns, name=feature, dtype=np.float64 + ) # Iterate over groups for (idx, group) in enumerate(groups): @@ -1445,7 +1456,7 @@ def plot_target_distributions(training_data, pred_input_data, attributes, summary_for_feature[(group, 'max')] = y_max # Save results to feature - summary = summary.append(summary_for_feature) + summary = pd.concat([summary, summary_for_feature.to_frame().T]) # Plot appearance set_plot_appearance(axes, attributes, plot_title=feature) diff --git a/esmvaltool/diag_scripts/emergent_constraints/cox18nature.py b/esmvaltool/diag_scripts/emergent_constraints/cox18nature.py index e071f56aaf..9318e76a30 100644 --- a/esmvaltool/diag_scripts/emergent_constraints/cox18nature.py +++ b/esmvaltool/diag_scripts/emergent_constraints/cox18nature.py @@ -140,14 +140,10 @@ def _get_project(cfg): def _save_fig(cfg, basename, legend=None): """Save matplotlib figure.""" path = get_plot_filename(basename, cfg) - if legend is None: - legend = [] - else: - legend = [legend] - FIG.savefig(path, - additional_artists=legend, - bbox_inches='tight', - orientation='landscape') + savefig_kwargs = dict(bbox_inches='tight', orientation='landscape') + if legend is not None: + savefig_kwargs['bbox_extra_artists'] = [legend] + FIG.savefig(path, **savefig_kwargs) logger.info("Wrote %s", path) AXES.cla() return path diff --git a/esmvaltool/diag_scripts/ensclus/ens_plots.py b/esmvaltool/diag_scripts/ensclus/ens_plots.py index 7540875350..55ad420b08 100644 --- a/esmvaltool/diag_scripts/ensclus/ens_plots.py +++ b/esmvaltool/diag_scripts/ensclus/ens_plots.py @@ -29,10 +29,10 @@ def ens_plots(dir_output, dir_plot, name_outputs, numclus, # ____________Load labels namef = os.path.join(dir_output, 'labels_{0}.txt'.format(name_outputs)) - labels = np.loadtxt(namef, dtype=int) + labels = np.loadtxt(namef, dtype=np.int64) namef = os.path.join(dir_output, 'repr_ens_{0}.txt'.format(name_outputs)) - reprens = np.loadtxt(namef, dtype=int) + reprens = np.loadtxt(namef, dtype=np.int64) namef = os.path.join(dir_output, 'legend_{0}.txt'.format(name_outputs)) legends = np.loadtxt(namef, dtype=str) diff --git a/esmvaltool/diag_scripts/examples/diagnostic.py b/esmvaltool/diag_scripts/examples/diagnostic.py index f4b68e1159..6ef63d13f1 100644 --- a/esmvaltool/diag_scripts/examples/diagnostic.py +++ b/esmvaltool/diag_scripts/examples/diagnostic.py @@ -20,8 +20,7 @@ def get_provenance_record(attributes, ancestor_files): """Create a provenance record describing the diagnostic data and plot.""" - caption = ("Average {long_name} between {start_year} and {end_year} " - "according to {dataset}.".format(**attributes)) + caption = attributes['caption'].format(**attributes) record = { 'caption': caption, @@ -96,6 +95,8 @@ def main(cfg): output_basename = Path(input_file).stem if group_name != attributes['short_name']: output_basename = group_name + '_' + output_basename + if "caption" not in attributes: + attributes['caption'] = input_file provenance_record = get_provenance_record( attributes, ancestor_files=[input_file]) plot_diagnostic(cube, output_basename, provenance_record, cfg) diff --git a/esmvaltool/diag_scripts/hydrology/hype.py b/esmvaltool/diag_scripts/hydrology/hype.py index 3d77e7d25a..c3a995900b 100644 --- a/esmvaltool/diag_scripts/hydrology/hype.py +++ b/esmvaltool/diag_scripts/hydrology/hype.py @@ -69,8 +69,7 @@ def get_data_times_and_ids(attributes): times = [x.point.strftime("%Y-%m-%d") for x in time_coord.cells()] # first string to float, then to int - ids = cube.coord('shape_id').core_points().astype( - numpy.float).astype(numpy.int) + ids = cube.coord('shape_id').core_points().astype(float).astype(int) return data, times, ids diff --git a/esmvaltool/diag_scripts/impact/bias_and_change.py b/esmvaltool/diag_scripts/impact/bias_and_change.py index 21fd056881..1862f7b627 100644 --- a/esmvaltool/diag_scripts/impact/bias_and_change.py +++ b/esmvaltool/diag_scripts/impact/bias_and_change.py @@ -179,6 +179,40 @@ def plot_htmltable(dataframe, ancestors, cfg): log_provenance(filename, ancestors, caption, cfg) +def make_tidy(dataset): + """Convert xarray data to tidy dataframe.""" + dataframe = dataset.rename( + tas='Temperature (K)', + pr='Precipitation (kg/m2/s)', + ).to_dataframe() + dataframe.columns.name = 'variable' + tidy_df = dataframe.stack('variable').unstack('metric') + + return tidy_df + + +def save_csv(dataframe, ancestors, cfg): + """Save output for use in Climate4Impact preview page.""" + # modify dataframe columns + dataframe = dataframe.unstack('variable') + dataframe.columns = ['tas_bias', 'pr_bias', 'tas_change', 'pr_change'] + project_model_member = np.array( + [x.split('_') for x in dataframe.index.values]) + + # metadata in separate columns + dataframe[['project', 'member', + 'model']] = project_model_member[:, [0, -1, 1]] + + # kg/m2/s to mm/day + dataframe[['pr_bias', 'pr_change']] *= 24 * 60 * 60 + + # save + filename = get_diagnostic_filename('recipe_output', cfg, extension='csv') + caption = "Bias and change for each variable" + dataframe.to_csv(filename) + log_provenance(filename, ancestors, caption, cfg) + + def main(cfg): """Calculate, visualize and save the bias and change for each model.""" metadata = cfg['input_data'].values() @@ -219,17 +253,11 @@ def main(cfg): 'Bias (RMSD of all gridpoints)', 'Mean change (Future - Reference)' ] - dataframe = combined.rename( - tas='Temperature (K)', - pr='Precipitation (kg/m2/s)', - ).to_dataframe() - dataframe.columns.name = 'variable' - tidy_df = dataframe.stack('variable').unstack('metric') - + tidy_df = make_tidy(combined) plot_scatter(tidy_df, ancestors, cfg) plot_table(tidy_df, ancestors, cfg) plot_htmltable(tidy_df, ancestors, cfg) - + save_csv(tidy_df, ancestors, cfg) return diff --git a/esmvaltool/diag_scripts/ipcc_ar5/ch09_fig09_42b.py b/esmvaltool/diag_scripts/ipcc_ar5/ch09_fig09_42b.py index 4340ddd22c..019fddc587 100644 --- a/esmvaltool/diag_scripts/ipcc_ar5/ch09_fig09_42b.py +++ b/esmvaltool/diag_scripts/ipcc_ar5/ch09_fig09_42b.py @@ -217,9 +217,10 @@ def plot_data(cfg, ecs_cube, tcr_cube): # Save plot plot_path = get_plot_filename(f'{project}_ch09_fig09_42b', cfg) - plt.savefig(plot_path, - additional_artists=[legend], - **cfg['savefig_kwargs']) + savefig_kwargs = dict(cfg['savefig_kwargs']) + if legend is not None: + savefig_kwargs['bbox_extra_artists'] = [legend] + plt.savefig(plot_path, **savefig_kwargs) logger.info("Wrote %s", plot_path) plt.close() return plot_path diff --git a/esmvaltool/diag_scripts/ipcc_ar6/corr_pattern.ncl b/esmvaltool/diag_scripts/ipcc_ar6/corr_pattern.ncl new file mode 100644 index 0000000000..98724696ae --- /dev/null +++ b/esmvaltool/diag_scripts/ipcc_ar6/corr_pattern.ncl @@ -0,0 +1,193 @@ +; ############################################################################# +; DIAGNOSTIC SCRIPT for pattern correlation figure +; Author: Bettina Gier (Uni Bremen & DLR, Germany) +; IPCC-AR6 project +; ############################################################################# +; +; Description +; Calculates centred pattern correlations for annual mean climatologies +; and plots them. Like IPCC AR5 Ch. 9 Fig 9.6 +; +; Required diag_script_info attributes (diagnostics specific) +; none +; +; Optional diag_script_info attributes (diagnostic specific) +; none +; +; Required variable_info attributes (variable specific) +; reference_dataset: name of reference observation +; +; Optional variable_info attributes (variable specific) +; alternative_dataset: name of alternative observations +; +; Caveats +; +; +; Modification history +; 20210226-A_bock_lisa: Modified diagnostic based on +; ipcc_ar5/ch09_fig09_6.ncl +; +; ############################################################################# + +load "$diag_scripts/../interface_scripts/interface.ncl" +load "$diag_scripts/shared/latlon.ncl" +load "$diag_scripts/shared/statistics.ncl" + +begin + enter_msg(DIAG_SCRIPT, "") + + var0 = variable_info[0]@short_name + info_items = select_metadata_by_name(input_file_info, var0) + infiles = metadata_att_as_array(info_items, "filename") + datasetnames = metadata_att_as_array(info_items, "dataset") + projectnames = metadata_att_as_array(info_items, "project") + dim_MOD = ListCount(info_items) + dim_VAR = ListCount(variable_info) + + ; Check and set reference dataset + ref_model = variable_info[0]@reference_dataset + if (variable_info[0]@reference_dataset.eq."None") then + error_msg("f", DIAG_SCRIPT, "", "no reference dataset is specified") + end if + log_info("reference model = " + ref_model) + ref_ind = ind(datasetnames.eq.ref_model) + if isatt(variable_info[0], "alternative_dataset") then + alt_ref = True + aref_ind = ind(datasetnames.eq.variable_info[0]@alternative_dataset) + else + alt_ref = False + end if + +end + +begin + ; Output directories + ncdf_dir = config_user_info@work_dir + "pattern_cor.nc" + modproj_dir = config_user_info@work_dir + "modprojnames.txt" + system("mkdir -p " + config_user_info@work_dir) +end + +begin +; ----------------------------------------------------------------------------- +; -------------------- Compute correlation for one var ------------------------ +; ----------------------------------------------------------------------------- + + ; Save list of preproc files for provenance in collect.ncl + preproc_files = metadata_att_as_array(info_items, "filename") + + ; Reference model + mod_idx = ispan(0, dim_MOD - 1, 1) + mod_ind_woref = mod_idx(ind(mod_idx.ne.ref_ind)) + delete(mod_idx) + + ; Make output array + all_cor = new((/dim_MOD-1/), float) + all_cor@_FillValue = 1.e20 + all_cor!0 = "models" + all_cor&models = datasetnames(mod_ind_woref) + ; Pass on alt models + if alt_ref then + all_cor@alt_obs = variable_info[0]@alternative_dataset + else + all_cor@alt_obs = "none" + end if + + ; Loop over models, with ref model processed first + model_ind = array_append_record(ref_ind, mod_ind_woref, 0) + do iloop = 0, dim_MOD - 1 + imod = model_ind(iloop) + log_info("Processing " + datasetnames(imod)) + + ; Extract model corresponding data + var = read_data(info_items[imod]) + + ; Calculate annual mean + data_yearly = time_operations(var, \ + toint(info_items[imod]@start_year), \ + toint(info_items[imod]@end_year), \ + "average", "yearly", True) + + ; Mean over the years + mean_years = dim_avg_n_Wrap(data_yearly, 0) + delete(data_yearly) + + ; Compute centred pattern correlation (ref_model will be first so no error) + if datasetnames(imod).eq.ref_model then + data_ref = mean_years + else + ; Since ref model processed first, move all models up one spot + all_cor(iloop-1) = pattern_cor(data_ref, mean_years, 1.0, 0) + end if + delete(mean_years) + delete(var) + end do + + ; ************************************* + ; calculate means over ensemble members + ; ************************************* + + datasetnames := datasetnames(mod_ind_woref) + projectnames := projectnames(mod_ind_woref) + + ndim := dimsizes(datasetnames) + ensemble_assign = new(ndim, integer) + + unique_models = get_unique_values(datasetnames) + do gg = 0, dimsizes(unique_models) - 1 + ensemble_assign = where(datasetnames.eq.unique_models(gg), gg + 1, \ + ensemble_assign) + end do + ensemble_assign@model = datasetnames + + all_cor_em = all_cor(:max(ensemble_assign)-1) + all_cor_em = all_cor_em@_FillValue + datasetnames_em = datasetnames(:max(ensemble_assign)-1) + projectnames_em = projectnames(:max(ensemble_assign)-1) + + do gg = 1, max(ensemble_assign) ; calculate ensemble means + wind := ind(ensemble_assign.eq.gg) + if (dimsizes(wind).eq.1) then + all_cor_em(gg-1) = (/ all_cor(wind) /) + all_cor_em&models(gg-1) = datasetnames(wind) + datasetnames_em(gg-1) = datasetnames(wind) + projectnames_em(gg-1) = projectnames(wind) + else + all_cor_em(gg-1) = (/ dim_avg_n(all_cor(wind), 0) /) + all_cor_em&models(gg-1) = datasetnames(wind(0)) + datasetnames_em(gg-1) = datasetnames(wind(0)) + projectnames_em(gg-1) = projectnames(wind(0)) + end if + end do + + delete(all_cor) + all_cor = all_cor_em + delete(all_cor_em) + + ; Write data + all_cor@corvar = var0 + all_cor@corvar_long = variable_info[0]@long_name + all_cor@var = "cor" + all_cor@diag_script = DIAG_SCRIPT + all_cor@diagnostics = variable_info[0]@diagnostic + all_cor@ncdf = ncdf_dir + all_cor@input = str_join(infiles, ",") + ncdf_outfile = ncdf_write(all_cor, ncdf_dir) + + ; Write provenance + statistics = (/"corr", "clim"/) + domains = (/"global"/) + plottype = "other" + authors = (/"gier_bettina", "bock_lisa"/) + references = (/"flato13ipcc"/) + log_provenance(ncdf_outfile, "n/a", "n/a", statistics, domains, "other", \ + authors, references, preproc_files) + + ; Write list of models with project (arrays get squished as attributes) + modnames = datasetnames_em + projnames = projectnames_em + modproj = (/modnames, projnames/) + asciiwrite(modproj_dir, modproj) + + leave_msg(DIAG_SCRIPT, "") + +end diff --git a/esmvaltool/diag_scripts/ipcc_ar6/corr_pattern_collect.ncl b/esmvaltool/diag_scripts/ipcc_ar6/corr_pattern_collect.ncl new file mode 100644 index 0000000000..28aaab2410 --- /dev/null +++ b/esmvaltool/diag_scripts/ipcc_ar6/corr_pattern_collect.ncl @@ -0,0 +1,492 @@ +; ############################################################################# +; DIAGNOSTIC PLOT SCRIPT for correlation pattern figure +; Author: Bettina Gier (DLR, Germany), Lisa Bock (DLR, Germany) +; IPCC-AR6 project +; ############################################################################# +; +; Description +; Calculated centred pattern correlations for annual mean climatologies +; and plots them. Like IPCC AR5 Ch. 9 Fig 9.6 +; +; Required diag_script_info attributes (diagnostics specific) +; +; Optional diag_script_info attributes (diagnostic specific) +; diag_order: give order of plotting variables on the x-axis +; labels: List of labels for each variable on the x-axis +; model_spread: if True, model spread is shaded +; plot_median: if True, median is plotted +; project_order: give order of projects +; +; Required variable_info attributes (variable specific) +; none +; +; Optional variable_info attributes (variable specific) +; none +; +; Required variable attributes (defined in namelist) +; reference_dataset: name of reference data set (observations) +; +; Caveats +; Effect of different regridding methods not yet determined +; +; Modification history +; 20210226-A_bock_lisa: Modified diagnostic based on +; ipcc_ar5/ch09_fig09_6_collect.ncl +; +; ############################################################################# +load "$diag_scripts/../interface_scripts/interface.ncl" +load "$diag_scripts/shared/plot/style.ncl" + +begin + enter_msg(DIAG_SCRIPT, "") + + ; Define file type + file_type = config_user_info@output_file_type + if (ismissing(file_type)) then + file_type = "ps" + end if + + ; Set default values for non-required diag_script_info attributes + set_default_att(diag_script_info, "plot_median", False) + +; ----------------------------------------------------------------------------- +; ------------------- Collecting Data ----------------------------------------- +; ----------------------------------------------------------------------------- + + ; List of correlation files and project names + file_list = tostring(diag_script_info@input_files) + "/pattern_cor.nc" + mp_file_list = tostring(diag_script_info@input_files) + "/modprojnames.txt" + + ; Filter non-existing files (mp files only useful if cor file exists) + file_list := file_list(ind(isfilepresent(file_list))) + mp_file_list := mp_file_list(ind(isfilepresent(file_list))) + + ; Set up auxiliary variables + var_name = new(dimsizes(file_list), string) + var_collect = new(dimsizes(file_list), string) + var_diag = new(dimsizes(file_list), string) + alt_obs = new(dimsizes(file_list), string) + + ; Loop over files in list, read and append data + do ii = 0, dimsizes(file_list) - 1 + + data_temp = ncdf_read(file_list(ii), "cor") + var_name(ii) = data_temp@corvar_long + var_collect(ii) = data_temp@corvar + var_diag(ii) = data_temp@diagnostics + alt_obs(ii) = data_temp@alt_obs + + ; Make 2D array to store all data + if (.not.isdefined("data_all")) then + data_all = new((/dimsizes(data_temp), dimsizes(file_list)/), float) + data_all(:, ii) = data_temp + data_all!0 = "models" + data_all&models = data_temp&models + + ; Input file list for provenance + prov_files = str_split(data_temp@input, ",") + else + ; If model coordinates are identical + if (dimsizes(data_temp&models).eq.dimsizes(data_all&models)) \ + .and. all(data_temp&models.eq.data_all&models) then + data_all(:, ii) = (/data_temp/) + else + ; Loop over models in new data entry + do imod_temp = 0, dimsizes(data_temp&models) - 1 + ; If current model is not already part of the model coordinate + if (.not.any(data_temp&models(imod_temp) .eq. data_all&models)) then + ; Append record for model(imod) + data_new = extend_var_at(data_all, 0, \ + dimsizes(data_all&models)) + data_new(dimsizes(data_all&models), ii) = (/data_temp(imod_temp)/) + data_new&models(dimsizes(data_all&models)) = \ + (/data_temp&models(imod_temp)/) + delete(data_all) + data_all = data_new + delete(data_new) + else + ; Loop over models of data + do imod = 0, dimsizes(data_all&models)-1 + ; if neq data model is similar to current + ; entry, write data entry + if (data_all&models(imod).eq. data_temp&models(imod_temp)) then + data_all(imod, ii) = (/data_temp(imod_temp)/) + end if + end do + end if + end do + end if + ; Append input file list for provenance + prov_files := array_append_record(prov_files, \ + str_split(data_temp@input, ","), 0) + end if + delete(data_temp) + end do + data_all!1 = "vars" + data_all&vars = var_name + delete(var_name) + + ; Get project for models + projects = new(dimsizes(data_all&models), string) + + ; Loop over model-project files to complete project list + do ii = 0, dimsizes(mp_file_list) - 1 + modproj = asciiread(mp_file_list(ii), -1, "string") + mods = modproj(:dimsizes(modproj)/2-1) + projs = modproj(dimsizes(modproj)/2:) + + overlap_index = get1Dindex(data_all&models, mods) + projects(overlap_index) = projs + delete([/modproj, mods, projs, overlap_index/]) + end do + + data_all&models@project = projects + delete(projects) + + ; Sort diagnostics in the order specified in the settings + if (isatt(diag_script_info, "diag_order")) then + l_ok = True + if (dimsizes(data_all&vars).ne. \ + dimsizes(diag_script_info@diag_order)) then + error_msg("w", DIAG_SCRIPT, "", "specified order of diagnostics " + \ + "cannot be applied, number of diagnostics does not match") + l_ok = False + end if + pid = new(dimsizes(diag_script_info@diag_order), integer) + do ii = 0, dimsizes(diag_script_info@diag_order) - 1 + tmp = ind(var_diag.eq.diag_script_info@diag_order(ii)) + if (any(ismissing(tmp)) .or. dimsizes(tmp).gt.1) then + error_msg("w", DIAG_SCRIPT, "", "specified order of diagnostics " + \ + "cannot be applied, invalid entry in diag_order") + break + end if + pid(ii) = tmp + delete(tmp) + end do + if (l_ok) then + data_all := data_all(:, pid) + alt_obs := alt_obs(pid) + end if + end if + +; ------------------------------------------------------------------------- +; ----------------- Interim Functions ------------------------------------- +; ------------------------------------------------------------------------- + + undef("get_unique_entries") + function get_unique_entries(array) + ; + ; Arguments: + ; array: 1D array + ; + ; Return value: 1D array of unique entries in array + ; + ; Modification history: + ; 20170406-A_gier_bettina: written. + local dummy_array, unique_new, new_array, nodupes + begin + dummy_array = array + do while (dimsizes(dummy_array).ne.0) + if (.not.isdefined("unique")) then + unique = dummy_array(0) + else + unique_new = array_append_record(unique, dummy_array(0), 0) + delete(unique) + unique = unique_new + delete(unique_new) + end if + nodupes = ind(dummy_array.ne.dummy_array(0)) + ; Missing value index are dim 1 and would give an error + if (dimsizes(dummy_array).eq. \ + dimsizes(ind(dummy_array.eq.dummy_array(0)))) then + break + end if + new_array = dummy_array(nodupes) + delete(nodupes) + delete(dummy_array) + dummy_array = new_array + delete(new_array) + end do + return(unique) + end +; ----------------------------------------------------------------------------- +; ---------------------------- Plotting --------------------------------------- +; ----------------------------------------------------------------------------- + + ; Calculating necessary values + ; Number of Projects needed to determine span + ; For now just CMIP projects + c_projects = str_match_ic(data_all&models@project, "CMIP") + projects = get_unique_entries(c_projects) + if (isatt(diag_script_info, "project_order")) then + project_order = diag_script_info@project_order + if (dimsizes(project_order) .eq. dimsizes(projects)) then + projects := project_order + else + error_msg("w", DIAG_SCRIPT, "", "specified order of projects " + \ + "cannot be applied, invalid number of projects") + end if + end if + n_var = dimsizes(data_all&vars) + + nr_projects = dimsizes(projects) + if (nr_projects .eq. 2) then + x_val = new(n_var, float) + do i = 0, n_var-1 + x_val(i) = 1 + i * 3 + end do + elseif (nr_projects .eq. 3) then + x_val = new(n_var, float) + do i = 0, n_var-1 + x_val(i) = 1.5 + i * 4 + end do + else + x_val = ispan(1, n_var*nr_projects, nr_projects) + end if + + ; Mean and Median of Ensemble - without alt obs + obs_ind = get1Dindex(data_all&models, alt_obs) + if all(alt_obs.eq."none") then + mod_ind = ispan(0, dimsizes(data_all&models)-1, 1) + else + ex_ind = obs_ind(ind(.not.ismissing(obs_ind))) + mods_ind = ispan(0, dimsizes(data_all&models)-1, 1) + ex_ind@_FillValue = default_fillvalue("integer") + mods_ind@_FillValue = default_fillvalue("integer") + mod_ind = get1Dindex_Collapse(mods_ind, ex_ind) + delete(mods_ind) + delete(ex_ind) + end if + ; Split by project + means = new((/nr_projects, n_var/), float) + if (diag_script_info@plot_median) then + median = new((/nr_projects, n_var/), float) + end if + + do iproj = 0, nr_projects - 1 + mod_proj_ind = ind(data_all&models@project(mod_ind).eq.projects(iproj)) + means(iproj, :) = dim_avg_n(data_all(mod_proj_ind, :), 0) + if (diag_script_info@plot_median) then + median(iproj, :) = dim_median_n(data_all(mod_proj_ind, :), 0) + end if + delete(mod_proj_ind) + end do + + ; Create outfile directory + system("mkdir -p " + config_user_info@plot_dir) + + ; Plotting preparation + name = "" + outfile = config_user_info@plot_dir + name + "patterncor." + file_type + wks = gsn_open_wks(file_type, outfile) + wks@fullname = outfile + + ; Calc limits + y_min = min(data_all) + y_min := decimalPlaces(y_min-0.05, 1, True) + x_max = max(x_val) + nr_projects * 0.5 + + ; Set half line length + l_length = 0.1 + + ; Project Colors - TODO: let them be specified in cfg + fcolors = read_colormap_file("$diag_scripts/shared/plot/rgb/" \ + + "ipcc-ar6_cmip_line.rgb") + + res = True + res@gsnDraw = False + res@gsnFrame = False + res@tiMainString = "Pattern Correlation With Observational Reference" + res@tiMainFontHeightF = 0.01 + res@vpWidthF = 0.8 + n_square = 16. + if x_max.le. n_square then + res@vpHeightF = 0.8 + else + res@vpHeightF = 0.8*(n_square/x_max) + end if + font_height = 0.02/0.6 * res@vpHeightF + res@gsnMaximize = True + res@tiYAxisString = "Correlation" + res@trYMinF = y_min + res@trYMaxF = 1 + yspan = res@trYMaxF - res@trYMinF + res@trXMinF = 0 + res@trXMaxF = x_max +if (isatt(diag_script_info, "labels")) then + res@tmXBLabels = diag_script_info@labels +else + res@tmXBLabels = data_all&vars +end if + + res@tmXBValues = x_val + res@tmXBMode = "Explicit" + if (n_var .gt. 3) then + res@tmXBLabelFontHeightF = font_height * 0.6 + else + res@tmXBLabelFontHeightF = font_height + end if + ; Set Marker Size to be half of line_length + marker_size = res@vpWidthF * 3 * l_length / (res@trXMaxF - res@trXMinF) + + ; Resources for model lines + res_lines = True ; polyline mods desired + res_lines@gsLineDashPattern = 0. ; solid line + res_lines@gsLineThicknessF = 2.5 ; line thickness + res_lines@tfPolyDrawOrder = "PreDraw" + + ; Resources for mean lines + res_mlines = True ; polyline mods desired + res_mlines@gsLineDashPattern = 0. ; solid line + res_mlines@gsLineThicknessF = 4. ; line thicker + res_mlines@tfPolyDrawOrder = "PreDraw" + + ; Resources for obs data markers + res_circ = True + res_circ@gsMarkerIndex = 16 + res_circ@gsMarkerColor = (/120, 120, 120, 255/) / 255. + res_circ@gsMarkerSizeF = 4 * marker_size + res_circ@gsMarkerOpacityF = 0.4 + + ; Resources for white markers below median + res_circw = True + res_circw@gsMarkerIndex = 16 + res_circw@gsMarkerColor = "white" + res_circw@gsMarkerSizeF = 0.95*marker_size + res_circw@tfPolyDrawOrder = "PreDraw" + + ; Resources for median markers if required + res_circm = True + res_circm@gsMarkerIndex = 4 + res_circm@gsMarkerSizeF = marker_size + res_circm@gsMarkerThicknessF = 3. + res_circm@tfPolyDrawOrder = "Draw" + + ; Resources for legend text + res_text = True ; text mods desired + res_text@txFontHeightF = font_height ; change text size + res_text@txJust = "CenterLeft" ; text justification + + ; New x_val according to median! + x_val_proj = new((/nr_projects, n_var/), float) + ; space between projects in graph +d_proj = 1. ; offset + do iproj = 0, nr_projects - 1 + do ivar = 0, n_var - 1 + x_val_proj(iproj, ivar) = ivar*(1 + nr_projects) - 0.5 \ + + d_proj*(iproj+1.) + end do + end do + ; Start with blank plot! gs and xy marker sizes are different.. + plot = gsn_csm_blank_plot(wks, res) + + if (diag_script_info@plot_median) then + do iproj = 0, nr_projects - 1 + res_circm@gsMarkerColor = fcolors(iproj, :) + plot@$unique_string("dum_median")$ = gsn_add_polymarker( \ + wks, plot, x_val_proj(iproj, :), median(iproj, :), res_circm) + end do + end if + + ; add lines for individual models + do ivar = 0, dimsizes(data_all(0, :))-1 + do iproj = 0, dimsizes(projects)-1 + ; Skip Project if no data for it + proj_mods = ind(data_all&models@project(mod_ind).eq.projects(iproj)) + if .not. all(ismissing(data_all(proj_mods, ivar))) then + proj_center = x_val_proj(iproj, ivar) + xx = (/proj_center-l_length, proj_center+l_length/) + ; Plot lines for mean + xx_mean = (/proj_center-l_length*3., proj_center+l_length*3./) + yy_mean = (/means(iproj, ivar), means(iproj, ivar)/) + res_mlines@gsLineColor = fcolors(iproj, :) + res_lines@gsLineColor = fcolors(iproj, :) + plot@$unique_string("dum")$ = gsn_add_polyline( \ + wks, plot, xx_mean, yy_mean, res_mlines) + ymin = 1. + ymax = 0. + do imod = 0, dimsizes(data_all(:, 0)) - 1 + ; Only plot if model in right project + if data_all&models@project(imod).eq.projects(iproj) then + ; Don't plot obs as lines + if (.not.ismissing(data_all(imod, ivar))) then + if (data_all&models(imod).ne.alt_obs(ivar)) then + yy = (/data_all(imod, ivar), data_all(imod, ivar)/) + plot@$unique_string("dum")$ = gsn_add_polyline( \ + wks, plot, xx, yy, res_lines) + end if + if (yy(0) .lt. ymin) then + ymin = yy(0) + end if + if (yy(0) .gt. ymax) then + ymax = yy(0) + end if + end if + end if + end do + if (diag_script_info@plot_median) then + plot@$unique_string("dum_ci")$ = gsn_add_polymarker( \ + wks, plot, x_val_proj(iproj, ivar), median(iproj, ivar), res_circw) + end if + if (isatt(diag_script_info, "model_spread")) then + if (diag_script_info@model_spread) then + yyyy = (/ymin, ymin, ymax, ymax/) + xxxx = (/xx(0), xx(1), xx(1), xx(0)/) + res_shading = res_lines + res_shading@gsFillColor = fcolors(iproj, :) + res_shading@gsFillOpacityF = 0.2 + plot@$unique_string("dum")$ = gsn_add_polygon( \ + wks, plot, xxxx, yyyy, res_shading) + end if + end if + end if + delete(proj_mods) + end do + if (alt_obs(ivar).ne."none") then + ; Plot obs as circles + plot@$unique_string("dum_circ")$ = gsn_add_polymarker( \ + wks, plot, x_val(ivar), data_all(obs_ind(ivar), ivar), res_circ) + end if + end do + + y_min_label = res@trYMinF + 0.1*yspan + lb_stride = yspan/res@vpHeightF * font_height * 2. + plabel = projects + ; Draw Legend + do iproj = 0, dimsizes(projects)-1 + res_text@txFontColor = fcolors(iproj, :) + ; CMIP5 label has to be reduced to CMIP5 sometimes + if str_match_ind_ic(plabel, "CMIP5").eq.iproj then + plabel(iproj) = "CMIP5" + end if + plot@$unique_string("dum_l")$ = gsn_add_text(wks, plot, plabel(iproj),\ + x_val(0)-0.5, y_min_label + \ + lb_stride*(iproj+1.2), \ + res_text) + end do + res_text@txFontColor = res_circ@gsMarkerColor + plot@$unique_string("dum_l")$ = gsn_add_text(wks, plot, \ + "additional Observations", \ + x_val(0)-0.5, y_min_label, \ + res_text) + + draw(plot) + frame(wks) + ; Write output + system("mkdir -p " + config_user_info@work_dir) + workpath = config_user_info@work_dir + "pattern_cor.nc" + ncdf_outfile = ncdf_write(data_all, workpath) + + ; collect meta-data and call ESMValMD function + caption = "Centered pattern correlations between models and observations" \ + + " for the annual mean climatologies " \ + + "(similar to IPCC ch. 9 fig. 9.6)." + statistics = (/"corr", "clim"/) + domains = (/"global"/) + plottype = "other" + authors = (/"gier_bettina", "bock_lisa"/) + references = (/"flato13ipcc"/) + log_provenance(ncdf_outfile, outfile, caption, statistics, domains, \ + plottype, authors, references, prov_files) + leave_msg(DIAG_SCRIPT, "") +end diff --git a/esmvaltool/diag_scripts/ipcc_ar6/tas_anom_damip.ncl b/esmvaltool/diag_scripts/ipcc_ar6/tas_anom_damip.ncl new file mode 100644 index 0000000000..21cbe4992a --- /dev/null +++ b/esmvaltool/diag_scripts/ipcc_ar6/tas_anom_damip.ncl @@ -0,0 +1,624 @@ +; ############################################################################# +; PLOTS TIME SERIES +; Authors: Lisa Bock (DLR, Germany) +; ############################################################################# +; +; Description +; This script is for plotting a time series of the global mean (anomaly). +; +; Required diag_script_info attributes (diagnostic specific) +; start_year: start year in figure +; end_year: end year in figure +; panels: list of variable blocks for each panel +; +; Optional diag_script_info attributes (diagnostic specific) +; ref_start: start year of reference period for anomalies +; ref_end: end year of reference period for anomalies +; ref_mask: if true, model fields will be masked by reference fields +; plot_units: variable unit for plotting +; y-min: set min of y-axis +; y-max: set max of y-axis +; header: title for each panel +; title: name of region as part of filename +; legend: set labels for optional output of a legend in an extra file +; +; Caveats +; +; ############################################################################# + +load "$diag_scripts/../interface_scripts/interface.ncl" + +load "$diag_scripts/shared/latlon.ncl" +load "$diag_scripts/shared/statistics.ncl" +load "$diag_scripts/shared/scaling.ncl" +load "$diag_scripts/shared/ensemble.ncl" + +load "$diag_scripts/shared/plot/style.ncl" +load "$diag_scripts/shared/plot/xy_line.ncl" + + +begin + + enter_msg(DIAG_SCRIPT, "") + + ; Check required diag_script_info attributes + exit_if_missing_atts(diag_script_info, (/"panels", "start_year", \ + "end_year"/)) + + ; Set default values for non-required diag_script_info attributes + set_default_att(diag_script_info, "anomaly", True) + set_default_att(diag_script_info, "ref_mask", False) + + if (isatt(diag_script_info, "title")) then + header = diag_script_info@title + else + header = "" + end if + + ; Create output directories + plot_dir = config_user_info@plot_dir + system("mkdir -p " + plot_dir) + out_path = config_user_info@work_dir + system("mkdir -p " + out_path) + + if (diag_script_info@anomaly) then + anom = "anom" + if (isatt(diag_script_info, "ref_start") .and. \ + isatt(diag_script_info, "ref_end")) then + ref_start = diag_script_info@ref_start + ref_end = diag_script_info@ref_end + else + error_msg("f", DIAG_SCRIPT, "", \ + "period for reference years is not defined " + \ + "(needed for anomaly)") + end if + else + anom = "abs" + end if + + ; Plot file type + file_type = config_user_info@output_file_type + if (ismissing(file_type)) then + file_type = "ps" + end if + + ; Determine time range + start_year = diag_script_info@start_year + end_year = diag_script_info@end_year + all_years = ispan(start_year, end_year, 1) + + ; Create time coordinate + ntime = end_year - start_year + 1 + time = new(ntime, integer) + time = ispan(start_year, end_year, 1) + + ; ************************************* + ; General settings for the plot + ; ************************************* + + ; Define workstation + outfile = config_user_info@plot_dir + "tas_" + anom + "_damip_" \ + + header + "_" + start_year \ + + "-" + end_year + wks = gsn_open_wks(file_type, outfile) + + ; Set resources + res = True + res@gsnDraw = False + res@gsnFrame = False + + res@vpXF = 0.05 + res@vpYF = 0.7 + res@vpHeightF = 0.4 + res@vpWidthF = 0.7 + res@pmLegendDisplayMode = "Never" + res@tmYRLabelFontHeightF = 0.016 + res@tmYLLabelFontHeightF = 0.016 + res@tiXAxisFontHeightF = 0.016 + res@tiYAxisFontHeightF = 0.016 + res@tmXBMajorOutwardLengthF = 0.006 + res@tmYLMajorOutwardLengthF = 0.006 + res@tmXBMinorOutwardLengthF = 0.003 + res@tmYLMinorOutwardLengthF = 0.003 + res@tmXBMajorLengthF = 0.006 + res@tmYLMajorLengthF = 0.006 + res@tmXBMinorLengthF = 0.003 + res@tmYLMinorLengthF = 0.003 + + xmin = start_year + xmax = end_year + res@trXMinF = xmin + res@trXMaxF = xmax + ; res@trXMaxF = xmax + 0.25 * (xmax - xmin) + res@tmXBMode = "Explicit" + if (xmax - xmin.gt.20) then + res@tmXBValues = ispan(xmin, xmax, 10) + res@tmXBLabels = ispan(xmin, xmax, 10) + res@tmXBMinorValues = ispan(xmin, xmax, 5) + else + res@tmXBValues = ispan(xmin, xmax, 5) + res@tmXBLabels = ispan(xmin, xmax, 5) + res@tmXBMinorValues = ispan(xmin, xmax, 1) + end if + res@tmXBLabelAngleF = 45 + res@tmXBLabelJust = "CenterRight" + + res@tmXBMode = "Manual" + res@tmXBTickSpacingF = 20 + + if (isatt(diag_script_info, "y_min")) then + res@trYMinF = diag_script_info@y_min + end if + if (isatt(diag_script_info, "y_max")) then + res@trYMaxF = diag_script_info@y_max + end if + res@tiYAxisOn = True + res@tiXAxisString = "" + res@gsnStringFontHeightF = 0.016 + + ; ------------------------------------------------------------------ + ; Panel settings + ; ------------------------------------------------------------------ + + nvar = ListCount(variable_info) + + panels = diag_script_info@panels + reference = diag_script_info@reference + tmp := dimsizes(panels) + if(dimsizes(tmp).gt.1) then + npanels = tmp(0) + nexp = tmp(1) + else + npanels = 1 + nexp = tmp(0) + end if + delete(tmp) + plots = new((/npanels/), graphic) + + ; ------------------------------------------------------------------ + ; Loop over panels + ; ------------------------------------------------------------------ + + do ivar = 0, npanels-1 + + ; ------------------------------------------------------------------ + ; Read reference dataset + ; ------------------------------------------------------------------ + + var = reference(ivar) + + log_info("processing " + var) + + ; Retrieve metadata item + atts = True + atts@variable_group = var + info_ref = select_metadata_by_atts(input_file_info, atts) + delete(atts) + + ref_dataset = metadata_att_as_array(info_ref, "dataset") + + A_ref = read_data(info_ref[0]) + + ; Anomaly + if (anom .eq. "anom") then + tmp = time_operations(A_ref, ref_start, ref_end, "average", \ + "monthlyclim", True) + ndim := dimsizes(A_ref) + do i = 0, ndim(0) - 1 + A_ref(i, :, :) = A_ref(i, :, :) - tmp(mod(i, 12), :, :) + end do + delete(tmp) + end if + + ; yearly average + tmp := time_operations(A_ref, -1, -1, "average", \ + "yearly", True) + + ; calculate field mean + diag_ref := area_operations(tmp, -90., 90., \ + 0., 360., "average", True) + + ref_arr = new((/ntime/), double) + ref_arr!0 = "time" + ref_arr&time = time + ref_arr@_FillValue = 1e+20 + ref_arr = ref_arr@_FillValue + + ; Match time coordinate + date = diag_ref&year + idx1 = ind(date(0).eq.ref_arr&time) + idx2 = ind(date(dimsizes(date) - 1).eq.ref_arr&time) + ref_arr(idx1:idx2) = (/diag_ref/) + copy_VarAtts(diag_ref, ref_arr) + delete(diag_ref) + delete(date) + + ; ------------------------------------------------------------------ + ; Read model datasets + ; ------------------------------------------------------------------ + + ; create array for statistics + model_arr_stat = new((/5, 3, ntime/), double) + model_arr_stat!0 = "exp" + model_arr_stat!1 = "stat" + model_arr_stat!2 = "time" + model_arr_stat&exp = (/"exp1", "exp2", "exp3", "exp4", "ref"/) + model_arr_stat&time = time + model_arr_stat&stat = (/"mean", "min", "max"/) + + model_arr_stat(4, 0, :) = (/ref_arr/) + + do iexp = 0, nexp - 1 + + if(npanels .gt. 1) then + var = panels(ivar, iexp) + else + var = panels(iexp) + end if + + log_info("processing " + var) + + ; Retrieve metadata item + atts = True + atts@variable_group = var + info_items = select_metadata_by_atts(input_file_info, atts) + delete(atts) + + var0 = info_items[0]@short_name + exp0 = info_items[0]@exp + datasetnames := metadata_att_as_array(info_items, "dataset") + ensembles := metadata_att_as_array(info_items, "ensemble") + dim_MOD = ListCount(info_items) + + ; get multi-model mean index + mmm_ind = ind(datasetnames .eq. "MultiModelMean") + + ; Create model array + model_arr = new((/dim_MOD, ntime/), double) + model_arr!0 = "model" + model_arr!1 = "time" + model_arr&model = datasetnames + model_arr&time = time + model_arr@_FillValue = 1e+20 + model_arr = model_arr@_FillValue + + ; Loop over models + do imod = 0, dim_MOD - 1 + + log_info("Process dataset: " + datasetnames(imod)) + + ; Read data + A0 = read_data(info_items[imod]) + dnames = getVarDimNames(A0) + + ; Convert units for plotting (if required) + if (isatt(diag_script_info, "plot_units")) then + A0 = convert_units(A0, diag_script_info@plot_units) + end if + + ; Anomaly + if (anom .eq. "anom") then + if (ref_start.lt.start_year) then + ref_start = start_year + end if + if ((ref_start.lt.start_year) .or. (ref_end.gt.end_year) .or. \ + (ref_end.lt.ref_start)) then + error_msg("f", DIAG_SCRIPT, "", \ + "period for reference years is not properly defined") + end if + end if + + ; masking with reference dataset + if (diag_script_info@ref_mask) then + ; Determine start/end year + start_year = info_items[imod]@start_year + end_year = info_items[imod]@end_year + A_ref_mask = time_operations(A_ref, start_year, \ + end_year, "extract", "", 0) + A0 = where(A_ref_mask.eq.A_ref_mask@_FillValue, \ + A_ref_mask@_FillValue, A0) + delete(A_ref_mask) + end if + + ; Anomaly + if (anom .eq. "anom") then + tmp := time_operations(A0, ref_start, ref_end, "extract", "", 0) + A0_monavg_ref = time_operations(tmp, ref_start, ref_end, "average", \ + "monthlyclim", True) + delete(tmp) + + ; calculate anomaly for each grid point + do i = 0, dimsizes(A0&time) - 1 + A0(i, :, :) = A0(i, :, :) - A0_monavg_ref(mod(i, 12), :, :) + end do + + delete(A0_monavg_ref) + + end if + + ; Calculate time average of dataset + A0_timavg = time_operations(A0, -1, -1, "average", \ + "yearly", True) + delete(A0) + + ; calculate global mean of complete time series + procmod = area_operations(A0_timavg, -90., 90., 0., 360., \ + "average", True) + delete(A0_timavg) + + ; Match time coordinate + date = procmod&year + idx1 = ind(date(0).eq.model_arr&time) + idx2 = ind(date(dimsizes(date) - 1).eq.model_arr&time) + model_arr(imod, idx1:idx2) = (/procmod/) + if (imod.eq.0) then + copy_VarAtts(procmod, model_arr) + end if + delete(procmod) + delete(date) + + end do + + ; ************************************* + ; calculate means over ensemble members + ; ************************************* + + ndim := dimsizes(datasetnames) + ensemble_assign := new(ndim, integer) + ensemble_size := new(ndim, integer) + + enum = 1 + temp = datasetnames(0) + do gg = 0, ndim - 1 + if (temp.eq.datasetnames(gg)) then + ensemble_assign(gg) = enum + else + enum = enum + 1 + ensemble_assign(gg) = enum + temp = datasetnames(gg) + end if + end do + ensemble_assign@model = datasetnames + delete(temp) + ensemble_assign@models = str_join(datasetnames + "/" + ensembles, ",") + + model_arr_em := model_arr(:max(ensemble_assign)-1, :) + model_arr_em = model_arr_em@_FillValue + datasetnames_em := datasetnames(:max(ensemble_assign)-1) + + do gg = 1, max(ensemble_assign) ; calculate ensemble means + wind := ind(ensemble_assign.eq.gg) + ensemble_size(wind) = dimsizes(wind) + if (dimsizes(wind).eq.1) then + model_arr_em(gg-1, :) = (/ model_arr(wind, :) /) + datasetnames_em(gg-1) = datasetnames(wind) + else + model_arr_em(gg-1, :) = (/ dim_avg_n(model_arr(wind, :), 0) /) + datasetnames_em(gg-1) = datasetnames(wind(0)) + end if + end do + + ; ************************************* + ; calculate multi-model mean + ; ************************************* + + ind_mod := ind(datasetnames_em.ne."MultiModelMean") + model_arr(mmm_ind, :) = dim_avg_n(model_arr_em(ind_mod, :), 0) + + ; ************************************* + ; calculate 5% and 95% quantiles + ; ************************************* + + q_05 = new(ntime, double) + q_95 = new(ntime, double) + + do itime = 0, ntime - 1 + if (any(.not.ismissing(model_arr(:, itime)))) then + model_num = num(.not.ismissing(model_arr_em(ind_mod, itime))) + ind_m := ind(.not.ismissing(model_arr(:, itime)) .and. \ + datasetnames .ne. "MultiModelMean") + ind_sort := dim_pqsort(model_arr(ind_m, itime), 1) + count = 0. + do imodel = 0, dimsizes(ind_m) - 1 + count = count + 1./(model_num * \ + ensemble_size(ind_m(ind_sort(imodel)))) + if(count .gt. 0.95) then + break + end if + if(ismissing(q_05(itime)) .and. count .gt. 0.05) then + q_05(itime) = model_arr(ind_m(ind_sort(imodel)), itime) + end if + q_95(itime) = model_arr(ind_m(ind_sort(imodel)), itime) + end do + end if + end do + + model_arr_stat&exp(iexp) = var + model_arr_stat(iexp, 0, :) = (/model_arr(mmm_ind, :)/) + model_arr_stat(iexp, 1, :) = (/q_05/) + model_arr_stat(iexp, 2, :) = (/q_95/) + + delete(model_arr) + + end do + + ; ************************************* + ; output to NetCDF + ; ************************************* + + out_path1 = out_path + "tas_" + anom + "_damip_" + header + "_" \ + + ivar + ".nc" + model_arr_stat@ncdf = out_path + model_arr_stat@diag_script = DIAG_SCRIPT + model_arr_stat@var = var0 + ncdf_outfile = ncdf_write(model_arr_stat, out_path1) + + ; ************************************* + ; Plotting + ; ************************************* + + cmap = read_colormap_file("$diag_scripts/shared/plot/rgb/" + \ + "ipcc-ar6_damip_line.rgb") + + res@xyDashPatterns := (/0, 0, 0, 0/) + res@xyLineThicknesses := (/3, 3, 3, 3/) + res@xyLineColors := cmap(:, :) + + ymax = max(model_arr_stat) + ymin = min(model_arr_stat) + res@trYMaxF := max((/0.2, ymax + 0.05 * (ymax - ymin)/)) + res@trYMinF := min((/-0.2, ymin - 0.05 * (ymax - ymin)/)) + + if (isatt(diag_script_info, "header")) then + res@tiMainString = diag_script_info@header(ivar) + else + res@tiMainString = "" + end if + + if (isatt(diag_script_info, "plot_units")) then + units = diag_script_info@plot_units + else + units = info_items[0]@units + end if + + if (ivar .eq. 0) then + res@tiYAxisString = "Change in Temperature (~F34~0~F~ C)" + else + res@tiYAxisString = "" + end if + + plots(ivar) = gsn_csm_xy(wks, time, model_arr_stat(0:4, 0, :), res) + + res@pmLegendDisplayMode = "Never" + + ; --------------------------------------------------------------------- + ; Add multi model statistics + ; --------------------------------------------------------------------- + res_stat = True + res_stat@gsnXYFillOpacities = 0.1 + cmap = read_colormap_file("$diag_scripts/shared/plot/rgb/" + \ + "ipcc-ar6_damip_shading.rgb") + copy_VarMeta(res, res_stat) + delete(res_stat@xyLineColors) + res_stat@gsnXYFillColors = cmap(3, :) + res_stat@xyLineColor := cmap(3, :) + res_stat@xyLineThicknesses := (/1, 1/) + shading_plot = gsn_csm_xy(wks, time, model_arr_stat(3, 1:2, :), \ + res_stat) + overlay(plots(ivar), shading_plot) + + res_stat@gsnXYFillColors = cmap(2, :) + res_stat@xyLineColor = cmap(2, :) + shading_plot = gsn_csm_xy(wks, time, model_arr_stat(2, 1:2, :), \ + res_stat) + overlay(plots(ivar), shading_plot) + + res_stat@gsnXYFillColors = cmap(1, :) + res_stat@xyLineColor = cmap(1, :) + shading_plot = gsn_csm_xy(wks, time, model_arr_stat(1, 1:2, :), \ + res_stat) + overlay(plots(ivar), shading_plot) + + res_stat@gsnXYFillColors = cmap(0, :) + res_stat@xyLineColor = cmap(0, :) + shading_plot = gsn_csm_xy(wks, time, model_arr_stat(0, 1:2, :), \ + res_stat) + overlay(plots(ivar), shading_plot) + + ; --------------------------------------------------------------------- + ; add reference datasets + ; --------------------------------------------------------------------- + res@xyDashPatterns := (/0/) + res@xyLineThicknesses := (/3/) ; make 2nd lines thicker + res@xyLineColors := "black" ; change line color + + ref_p = gsn_csm_xy(wks, time, ref_arr, res) ; create plot + overlay(plots(ivar), ref_p) + + end do + + ; Plotting panels + + pres = True + + pres@gsnPanelMainString = "Anomaly of Near-Surface Air Temperature" + + pres@gsnPanelRowSpec = True + pres@gsnPanelCenter = False + + pres@gsnPanelFigureStrings = diag_script_info@panel_figure_strings + pres@gsnPanelFigureStringsPerimOn = False + pres@gsnPanelFigureStringsBackgroundFillColor = "transparent" + pres@gsnPanelFigureStringsJust = "TopLeft" + pres@gsnPanelFigureStringsFontHeightF = 0.014 + + gsn_panel(wks, plots, (/3, 3, 3, 1/), pres) + + log_info(" wrote " + outfile + "." + file_type) + + ; *************************************** + ; add file with legend + ; *************************************** + + if isatt(diag_script_info, "legend") then + + labels = diag_script_info@legend + labels := array_append_record(labels, "Observations", 0) + cmap = read_colormap_file("$diag_scripts/shared/plot/rgb/" + \ + "ipcc-ar6_damip_line.rgb") + cmap_l := new((/5, 4/), float) + cmap_l(0:3, :) = cmap + cmap_l(4, :) = (/0., 0., 0., 1/) + + wks = gsn_open_wks(file_type, config_user_info@plot_dir + "legend") + + lgres = True + + lgres@vpWidthF = 0.7 ; width of legend (NDC) + lgres@vpHeightF = 0.4 ; height of legend (NDC) + + lgres@lgTitleString = "Legend" + lgres@lgTitleFontHeightF = 0.03 + lgres@lgAutoManage = True + + lgres@lgLineColors = cmap_l(::-1, :) + lgres@lgLineThicknessF = 4. + lgres@lgLineLabelsOn = False + lgres@lgMonoDashIndex = True + + gsn_legend_ndc(wks, 5, labels(::-1), 0.1, 0.95, lgres) + + frame(wks) + + end if + + ; *************************************** + ; add meta data to plot (for reporting) + ; *************************************** + + domain = "global" + + if (anom .eq. "anom") then + statistics = "anomaly" + else + statistics = "mean" + end if + + caption = "Time series of the " + statistics + " for " \ + + info_items[0]@long_name + contrib_authors = (/"bock_lisa"/) + + ; Call provenance logger + log_provenance(ncdf_outfile, \ + outfile + "." + file_type, \ + caption, \ + statistics, \ + domain, \ + "times", \ + contrib_authors, \ + (/"eyring21ipcc"/), \ + metadata_att_as_array(input_file_info, "filename")) + + leave_msg(DIAG_SCRIPT, "") + +end diff --git a/esmvaltool/diag_scripts/ipcc_ar6/zonal_westerly_winds.ncl b/esmvaltool/diag_scripts/ipcc_ar6/zonal_westerly_winds.ncl new file mode 100644 index 0000000000..7219db221e --- /dev/null +++ b/esmvaltool/diag_scripts/ipcc_ar6/zonal_westerly_winds.ncl @@ -0,0 +1,392 @@ +; Based on EYRING13JGR_FIG12 +; Author: Irene Cionni (ENEA, Italy), Veronika Eyring (DLR, Germany), +; Lisa Bock (DLR, Germany), Birgit Hassler (DLR, Germany) +; ############################################################################# +; Description +; Calculation of the long-term mean and trend of the zonal wind +; +; +; Optional diag_script_info attributes (diagnostic specific) +; @e13fig12_start_year: year when the climatology calculation starts +; @e13fig12_end_year: year when the climatology calculation ends +; @e13fig12_multimean: multimodel mean +; @e13fig12_season: season +; @e13fig12_exp_MMM: name of the experiments dor the MMM +; Caveats +; +; Modification history +; ############################################################################# +load "$diag_scripts/../interface_scripts/interface.ncl" + +load "$diag_scripts/shared/statistics.ncl" +load "$diag_scripts/shared/plot/aux_plotting.ncl" +load "$diag_scripts/shared/plot/style.ncl" + +begin + + enter_msg(DIAG_SCRIPT, "") + var0 = variable_info[0]@short_name + info0 = select_metadata_by_name(input_file_info, var0) + dim_MOD1 = ListCount(info0) + names = metadata_att_as_array(info0, "dataset") + projects = metadata_att_as_array(info0, "project") + exps = metadata_att_as_array(info0, "exp") + ensembles = metadata_att_as_array(info0, "ensemble") + y1 = (/ metadata_att_as_array(info0, "start_year")/) + y2 = (/ metadata_att_as_array(info0, "end_year") /) + work_dir = config_user_info@work_dir + "/" + ; Create work dir + + exps_name = where(ismissing(exps), "OBS", exps) + system("mkdir -p " + work_dir) + + if (isatt(variable_info[0], "reference_dataset")) then + refname = variable_info[0]@reference_dataset + do imod = 0, dimsizes(names) - 1 + if (names(imod) .eq. refname) then + iref = imod + end if + end do + end if + + if(isatt(variable_info, "units")) then + UNITS = variable_info@units + else + UNITS = "m s~S~-1~N~" + end if + + if(isatt(variable_info, "long_name")) then + LONG_NAME = variable_info@long_name + else + LONG_NAME = var0 + end if + + ; Plot file type + file_type = config_user_info@output_file_type + if (ismissing(file_type)) then + file_type = "ps" + end if + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT + " (var: " + var0 + ")") + log_info("++++++++++++++++++++++++++++++++++++++++++") + + ; Set default values for optional diag_script_info attributes + + set_default_att(diag_script_info, "e13fig12_multimean", False) + set_default_att(diag_script_info, "e13fig12_start_year", max(y1)) + set_default_att(diag_script_info, "e13fig12_end_year", min(y2)) + set_default_att(diag_script_info, "e13fig12_season", "ANN") + flag_mod = where(projects.ne."OBS6" .and. projects.ne."OBS" .and.\ + projects.ne."obs4mips", 1, 0) + + index_mod = ind(flag_mod.gt.0) + index_obs = ind(flag_mod.eq.0) + dim_MOD = dimsizes(index_mod) + dim_OBS = 0 + + if (.not.all(ismissing(index_obs))) then + dim_OBS = dimsizes(index_obs) + list_obs_mod = names(index_obs) + end if + + multimean = diag_script_info@e13fig12_multimean + season = diag_script_info@e13fig12_season + if (multimean) then + exp_MMM = diag_script_info@e13fig12_exp_MMM + flag_exp = new((/dimsizes(projects), dimsizes(exp_MMM)/), "integer") + do id = 0, dimsizes(exp_MMM) - 1 + flag_exp(:, id) = where(projects.eq.exp_MMM(id), 0, 1) + end do + dimTot = dim_MOD + dim_OBS + 1 + if (dimsizes(exp_MMM).gt.1) then + dimTot = dim_MOD + dim_OBS + dimsizes(exp_MMM) + end if + else + dimTot = dim_MOD + dim_OBS + end if + + ; make sure path for (mandatory) netcdf output exists + year_start = toint(diag_script_info@e13fig12_start_year) + year_end = toint(diag_script_info@e13fig12_end_year) + +end + +begin + + aux_title_info = "" + ; wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "eyring13f12_" + var0 +\ + ; "_" + plotMod) + A0 = read_data(info0[iref]) + lat0 = A0&lat + plev0 = A0&plev + delete(A0) + + tmpData = new((/dim_MOD + dim_OBS, dimsizes(plev0), dimsizes(lat0), 3/),\ + "double") + tmpData!0 = "line" + tmpData!1 = "plev" + tmpData!2 = "lat" + tmpData!3 = "stat" + + XXdata = new((/dimTot, dimsizes(plev0), dimsizes(lat0), 3/), "double") + XXdata!0 = "line" + XXdata!1 = "plev" + XXdata!2 = "lat" + XXdata!3 = "stat" + + XXref = new((/dimsizes(plev0), dimsizes(lat0), 3/), "double") + XXref!0 = "plev" + XXref!1 = "lat" + XXref!2 = "stat" + + years1 = new(dimTot, "integer") + years2 = new(dimTot, "integer") + plot = new(dimTot, "graphic") + plot_num = integertochar(ispan(97, 122, 1)) + + plotMod = new(dimTot, typeof(names)) + + ik = 0 + +; ****************************************************************** + do imod = 0, dim_MOD1 - 1 + years1(imod) = y1(imod) + years2(imod) = y2(imod) + years = tofloat(ispan(years1(imod), years2(imod), 1)) + plotMod(imod) = names(imod) + ; Extract data + A0 = read_data(info0[imod]) + if (season.eq."ANN") then + A1 = time_operations(A0, year_start, year_end, "average",\ + "annualclim", True) + A2 = time_operations(A0, -1, -1, "extract", "yearly", True) + A2trend = regCoef(years, A2(plev|:, lat|:, time|:)) + tval_A2 = A2trend@tval + b_A2 = 0.5 + df_A2 = A2trend@nptxy - 2 + prob_A2 = (/1 - betainc(df_A2 / (df_A2 + tval_A2 ^ 2),\ + df_A2 / 2.0, b_A2)/) + else + A1 = time_operations(A0, -1, -1, "average", season, True) + A2 = month_to_season(A0, season) + A2trend = regCoef(years, A2(plev|:, lat|:, time|:)) + tval_A2 = A2trend@tval + b_A2 = tval_A2 + b_A2 = (/0.5/) + df_A2 = A2trend@nptxy - 2 + prob_A2 = A2(0, :, :) + prob_A2 = onedtond((/1 - betainc(df_A2 / (df_A2 + tval_A2 ^ 2), \ + df_A2 / 2.0, b_A2)/), dimsizes(A2(0, :, :))) + delete(df_A2) + delete(tval_A2) + delete(b_A2) + end if + delete(A0) + tmpData(imod, :, :, 0) = (/A1/) + tmpData(imod, :, :, 1) = (/A2trend * 10/) + tmpData(imod, :, :, 2) = (/prob_A2/) + end do + XXdata(:dim_MOD1 - 1, :, :, :) = (/tmpData/) + + XXref = (/tmpData(iref, :, :, :)/) + + XXdata!0 = "line" + XXdata!1 = "plev" + XXdata!2 = "lat" + XXdata!3 = "stat" + XXdata&lat = lat0 + plev0@long_name = "Pressure [hPa]" + XXdata&plev = plev0 + + ; ***************************************************** + if (multimean) then + do id = 0, dimsizes(exp_MMM) - 1 + flag_exp(:, id) = where(projects.eq.exp_MMM(id), 0, 1) + index_exp = ind(flag_exp(:, id).gt.0) + XXdata(dimTot - 1, :, :, :) = \ + (/dim_avg_n(XXdata(index_exp, :, :, :), 0)/) + ; plotMod(dimTot - 1) = "MMM_" + exps_name(id) + plotMod(dimTot - 1) = projects(flag_mod(0)) + years1(dimTot - 1) = max(y1) + years2(dimTot - 1) = min(y2) + delete(index_exp) + end do + end if + + X_MMM_std = (/dim_stddev_n(XXdata(index_mod, :, :, :), 0)/) + plot_d = new(2, "graphic") + + ; *************************plotting****************************************** + wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "zonal_westerly_winds") + res = True ; plot mods desired + res@gsnDraw = False + res@gsnFrame = False + + res@lbLabelBarOn = False + + pal = read_colormap_file("$diag_scripts/shared/plot/rgb/" \ + + "ipcc-ar6_wind_div.rgb") + res@cnFillPalette = pal + + res@tiYAxisFont = "helvetica" + res@tiMainFont = "helvetica" + res@tmXBLabelFont = "helvetica" + res@tmYLLabelFont = "helvetica" + res@lbLabelFont = "helvetica" + res@cnLevelSelectionMode = "ExplicitLevels" + res@cnLevels = (/-5., -2., -1., -0.5, -0.2, -0.1, 0., 0.1, 0.2, 0.5, 1., \ + 2., 5./) + res@tmXBMode = "Explicit" + res@tmXBValues = (/-90., -60., -30., 0./) + res@tmXBLabels = (/"90~F34~0~F~S", "60~F34~0~F~S", "30~F34~0~F~S", \ + "0~F34~0~F~"/) + res@trXMinF = -90. + res@trXMaxF = 0. + res@tmYRMode = "Automatic" + res@tmYRLabelsOn = False + res@tmYLMode = "Explicit" + res@tmYLValues = (/1000., 500., 100., 50., 10., 5., 1./) + res@tmYLLabels = (/"1000", "500", "100", "50", "10", "5", "1"/) + res@trYMinF = 1. + res@trYMaxF = 1000. + res@cnLineLabelsOn = False ; turn off line labels + res@cnFillOn = True ; turn on color fill + res@cnLinesOn = False + res@cnInfoLabelOn = False ; turn off contour label + res@gsnSpreadColors = True ; use full range of colors + res@lbLabelAutoStride = True ; optimal labels + res@gsnLeftString = "" + + res@gsnLeftStringFontHeightF = 0.017 + res@gsnRightStringFontHeightF = 0.017 + res@tmXBMode = "Explicit" ; explicit labels + + res@gsnRightString = "" + + res@tiMainString = plotMod(iref) ; title + + plot_d(0) = gsn_csm_pres_hgt(wks, XXdata(iref, :, :, 1), res) + + res@tiMainString = plotMod(dimTot - 1) ; title + res@tiYAxisString = "" + + plot_d(1) = gsn_csm_pres_hgt(wks, XXdata(dimTot - 1, :, :, 1), res) + + res2 = True + res2@gsnDraw = False + res2@gsnFrame = False + res2@cnLevelSelectionMode = "ManualLevels" ; set manual contour levels + res2@cnMinLevelValF = -20. ; set min contour level + res2@cnMaxLevelValF = 40. ; set max contour level + res2@cnLevelSpacingF = 10. ; set contour spacing + res2@cnLineLabelsOn = True + res2@gsnContourZeroLineThicknessF = 2. ; doubles thickness of zero contour + res2@gsnContourNegLineDashPattern = 1 + res2@cnFillOn = False + res2@cnInfoLabelOn = False + res2@cnLinesOn = True + res2@cnLineColor = "Black" ; color of second contours + res2@cnLineThicknessF = 2. ; line thickness + res2@tmYRMode = "Automatic" + res2@tmXBMode = "Explicit" + res2@tmXBValues = (/-90., -60., -30., 0./) + res2@tmYLMode = "Explicit" + res2@tmYLValues = (/1000., 500., 100., 50., 10., 5., 1./) + res2@lbTitleFontHeightF = 0.01 ; default: 0.025 + res2@lbTitleOffsetF = -0.25 ; default: 0.03 (negative values move it down) + res2@lbTopMarginF = 0.1 ; default: 0.05 (negative values move it up) + res2@lbTitleJust = "BottomCenter" ; default: CenterCenter + res2@lbLabelFontHeightF = 0.025 + ; model specific ressources + res2@tiMainFontHeightF = 0.03 + + res2@tiMainString = plotMod(iref) + plotv_0 = gsn_csm_pres_hgt(wks, XXdata(iref, :, :, 0), res2) + + res2@tiMainString = plotMod(dimTot - 1) + plotv_1 = gsn_csm_pres_hgt(wks, XXdata(dimTot - 1, :, :, 0), res2) + + delete(res) + res3 = True + res3@gsnDraw = False + res3@gsnFrame = False + res3@cnLevelSelectionMode = "ManualLevels" ; set manual contour levels + res3@cnMinLevelValF = 0. ; set min contour level + res3@cnMaxLevelValF = 1. ; set max contour level + res3@cnLevelSpacingF = 0.005 ; set contour spacing + res3@cnLineLabelsOn = False + res3@cnInfoLabelOn = False + res3@cnFillOn = False + res3@cnLinesOn = False + res3@tmYRMode = "Automatic" + + plotz_0 = gsn_csm_pres_hgt(wks, XXdata(iref, :, :, 2), res3) + + plotz_1 = gsn_csm_pres_hgt(wks, XXdata(dimTot - 1, :, :, 2), res3) + + opt = True + opt@gsnShadeFillType = "pattern" ; pattern fill + opt@gsnShadeHigh = 17 + plotz_0 = gsn_contour_shade(plotz_0, 1., 0.95, opt) + plotz_1 = gsn_contour_shade(plotz_1, 1., 0.95, opt) + + overlay(plot_d(0), plotv_0) + + overlay(plot_d(1), plotv_1) + + ; Call legend-plotting routine + Pres = True + Pres@gsnFrame = False + Pres@gsnPanelBottom = 0.2 + Pres@amJust = "TopLeft" + + Pres@gsnPanelMainString = "Speed-up of zonal-mean wind (" + years1(iref) \ + + "-" + years2(iref) + ")" + Pres@gsnPanelXWhiteSpacePercent = 0.2 + + Pres@gsnPanelFigureStrings = (/"a)", "b)"/) + Pres@gsnPanelFigureStringsPerimOn = False + Pres@gsnPanelFigureStringsBackgroundFillColor = "transparent" + Pres@gsnPanelFigureStringsJust = "TopLeft" + Pres@gsnPanelFigureStringsFontHeightF = 0.016 + + Pres@gsnPanelLabelBar = True ; add common colorbar + Pres@lbLabelFontHeightF = 0.007 ; make labels smaller + Pres@lbBoxEndCapStyle = "TriangleBothEnds" + Pres@lbBoxLineColor = "gray10" + Pres@lbTitleString = "zonal wind (" + UNITS + "/decade)" + Pres@lbTitlePosition = "Bottom" + Pres@lbLabelFontHeightF = 0.012 + Pres@pmLabelBarWidthF = 0.7 + Pres@lbTitleFontHeightF = 0.016 + + gsn_panel(wks, plot_d, (/1, 2/), Pres) + + frame(wks) + + ; *******************OUTPUT FILE****************************************** + nc_filename = work_dir + "eyring13f12_" + var0 + ".nc" + Xdata = XXdata(line|:, plev|:, lat|:, stat|:) + Xdata@var = var0 + Xdata@diag_script = "eyring13f12" + Xdata&stat = (/"mean", "trend", "prob"/) + Xdata&line = plotMod + Xdata&plev = plev0 + Xdata&lat = lat0 + nc_outfile = ncdf_write(Xdata, nc_filename) + + ; Call provenance logger + plotpath = config_user_info@plot_dir + "zonal_westerly_winds" + log_provenance(nc_filename, \ + plotpath + "." + file_type, \ + "Long-term mean and trend of " + var0, \ + (/"mean", "trend"/), \ + (/"global"/), \ + "pro", \ + (/"bock_lisa", "cionni_irene", "eyring_veronika", \ + "hassler_birgit"/), \ + (/"eyring13jgr"/), \ + metadata_att_as_array(info0, "filename")) + +end diff --git a/esmvaltool/diag_scripts/kcs/local_resampling.py b/esmvaltool/diag_scripts/kcs/local_resampling.py index b8d20e07aa..9eb2ea28ed 100644 --- a/esmvaltool/diag_scripts/kcs/local_resampling.py +++ b/esmvaltool/diag_scripts/kcs/local_resampling.py @@ -266,7 +266,7 @@ def _best_subset(combinations, n_sample=8): # Store the indices in a nice dataframe n_segments = combinations.shape[1] best_subset = pd.DataFrame( - data=np.empty((n_sample, n_segments), dtype=int), + data=np.empty((n_sample, n_segments), dtype=np.int64), columns=[f'Segment {x}' for x in range(n_segments)], index=[f'Combination {x}' for x in range(n_sample)]) diff --git a/esmvaltool/diag_scripts/land_carbon_cycle/diag_global_turnover.py b/esmvaltool/diag_scripts/land_carbon_cycle/diag_global_turnover.py index 902ef7122d..0d8b95ff84 100644 --- a/esmvaltool/diag_scripts/land_carbon_cycle/diag_global_turnover.py +++ b/esmvaltool/diag_scripts/land_carbon_cycle/diag_global_turnover.py @@ -275,7 +275,7 @@ def _fix_map(axis_obj): """ axis_obj.set_global() axis_obj.coastlines(linewidth=0.4, color='grey') - plt.gca().outline_patch.set_visible(False) + plt.gca().spines["geo"].set_visible(False) return axis_obj diff --git a/esmvaltool/diag_scripts/land_carbon_cycle/diag_zonal_correlation.py b/esmvaltool/diag_scripts/land_carbon_cycle/diag_zonal_correlation.py index baad5c2280..e4d6a2b6eb 100644 --- a/esmvaltool/diag_scripts/land_carbon_cycle/diag_zonal_correlation.py +++ b/esmvaltool/diag_scripts/land_carbon_cycle/diag_zonal_correlation.py @@ -129,8 +129,8 @@ def _calc_zonal_correlation(dat_tau, dat_pr, dat_tas, dat_lats, fig_config): # minimum 1/8 of the given window has valid data points min_points = np.shape(dat_tau)[1] * fig_config['min_points_frac'] for lat_index in range(len(corr_dat)): - istart = np.int(max(0, lat_index - window_size)) - iend = np.int(min(np.size(dat_lats), lat_index + window_size + 1)) + istart = int(max(0, lat_index - window_size)) + iend = int(min(np.size(dat_lats), lat_index + window_size + 1)) dat_tau_zone = dat_tau[istart:iend, :] dat_pr_zone = dat_pr[istart:iend, :] dat_tas_zone = dat_tas[istart:iend, :] diff --git a/esmvaltool/diag_scripts/land_carbon_cycle/diag_zonal_turnover.py b/esmvaltool/diag_scripts/land_carbon_cycle/diag_zonal_turnover.py index 0e67890f19..9f93115754 100644 --- a/esmvaltool/diag_scripts/land_carbon_cycle/diag_zonal_turnover.py +++ b/esmvaltool/diag_scripts/land_carbon_cycle/diag_zonal_turnover.py @@ -77,8 +77,9 @@ def _calc_zonal_tau(gpp, ctotal, fig_config): # get the interval of latitude and create array for partial correlation dat_lats = gpp.coord('latitude').points lat_int = abs(dat_lats[1] - dat_lats[0]) - window_size = np.int(max(2, - np.round(fig_config['bandsize'] / lat_int))) + window_size = int( + max(2, np.round(fig_config['bandsize'] / lat_int)) + ) gpp_z = gpp_zs.rolling_window('latitude', iris.analysis.SUM, window_size) ctotal_z = ctotal_zs.rolling_window('latitude', iris.analysis.SUM, diff --git a/esmvaltool/diag_scripts/land_carbon_cycle/shared.py b/esmvaltool/diag_scripts/land_carbon_cycle/shared.py index b0185d182d..66d1e8240b 100644 --- a/esmvaltool/diag_scripts/land_carbon_cycle/shared.py +++ b/esmvaltool/diag_scripts/land_carbon_cycle/shared.py @@ -32,7 +32,7 @@ def _apply_common_mask(*args): mask_where = np.ma.getmask(np.ma.masked_less(dat_mask, 1.)) odat = [] for arg_ in range(nargs): - _dat = args[arg_].astype(np.float) + _dat = args[arg_].astype(np.float64) _dat[mask_where] = np.nan odat = np.append(odat, np.ma.masked_invalid(_dat)) odat = odat.reshape(nargs, _dat.shape[0], _dat.shape[1]) diff --git a/esmvaltool/diag_scripts/mlr/custom_sklearn.py b/esmvaltool/diag_scripts/mlr/custom_sklearn.py index 79e35b467f..2e403163cb 100644 --- a/esmvaltool/diag_scripts/mlr/custom_sklearn.py +++ b/esmvaltool/diag_scripts/mlr/custom_sklearn.py @@ -77,7 +77,7 @@ from sklearn.preprocessing import FunctionTransformer from sklearn.utils import check_array, check_X_y, indexable, safe_sqr from sklearn.utils.fixes import np_version, parse_version -from sklearn.utils.metaestimators import if_delegate_has_method +from sklearn.utils.metaestimators import available_if from sklearn.utils.validation import check_is_fitted from esmvaltool.diag_scripts import mlr @@ -107,6 +107,20 @@ } +def _estimator_has(attr): + """Check if we can delegate a method to the underlying estimator. + + First, we check the first fitted estimator if available, otherwise we + check the unfitted estimator. + + """ + return lambda self: ( + hasattr(self.estimator_, attr) + if hasattr(self, "estimator_") + else hasattr(self.estimator, attr) + ) + + def _determine_key_type(key, accept_slice=True): """Determine the data type of key.""" err_msg = ("No valid specification of the columns. Only a scalar, list or " @@ -122,8 +136,8 @@ def _determine_key_type(key, accept_slice=True): if isinstance(key, tuple(dtype_to_str.keys())): try: return dtype_to_str[type(key)] - except KeyError: - raise ValueError(err_msg) + except KeyError as exc: + raise ValueError(err_msg) from exc if isinstance(key, slice): if not accept_slice: raise TypeError( @@ -151,8 +165,8 @@ def _determine_key_type(key, accept_slice=True): if hasattr(key, 'dtype'): try: return array_dtype_to_str[key.dtype.kind] - except KeyError: - raise ValueError(err_msg) + except KeyError as exc: + raise ValueError(err_msg) from exc raise ValueError(err_msg) @@ -197,8 +211,8 @@ def _safe_indexing(x_data, indices, *_, axis=0): if axis not in (0, 1): raise ValueError( - "'axis' should be either 0 (to index rows) or 1 (to index " - "column). Got {} instead.".format(axis) + f"'axis' should be either 0 (to index rows) or 1 (to index " + f"column). Got {axis} instead." ) indices_dtype = _determine_key_type(indices) @@ -210,10 +224,9 @@ def _safe_indexing(x_data, indices, *_, axis=0): if axis == 1 and x_data.ndim != 2: raise ValueError( - "'x_data' should be a 2D NumPy array, 2D sparse matrix or pandas " - "dataframe when indexing the columns (i.e. 'axis=1'). " - "Got {} instead with {} dimension(s).".format(type(x_data), - x_data.ndim) + f"'x_data' should be a 2D NumPy array, 2D sparse matrix or pandas " + f"dataframe when indexing the columns (i.e. 'axis=1'). " + f"Got {type(x_data)} instead with {x_data.ndim} dimension(s)." ) if axis == 1 and indices_dtype == 'str' and not hasattr(x_data, 'loc'): @@ -249,7 +262,7 @@ def _make_indexable(iterable): def _num_samples(x_data): """Return number of samples in array-like x_data.""" - message = 'Expected sequence or array-like, got %s' % type(x_data) + message = f"Expected sequence or array-like, got {type(x_data)}" if hasattr(x_data, 'fit') and callable(x_data.fit): # Don't get num_samples from an ensembles length! raise TypeError(message) @@ -262,8 +275,10 @@ def _num_samples(x_data): if hasattr(x_data, 'shape') and x_data.shape is not None: if len(x_data.shape) == 0: - raise TypeError("Singleton array %r cannot be considered a valid " - "collection." % x_data) + raise TypeError( + f"Singleton array {x_data!r} cannot be considered a valid " + f"collection." + ) # Check that shape is returning an integer or default to len # Dask dataframes may not return numeric shape[0] value if isinstance(x_data.shape[0], numbers.Integral): @@ -391,19 +406,21 @@ def _fit_and_score_weighted(estimator, x_data, y_data, scorer, train, test, estimator.fit(x_train, **fit_params) else: estimator.fit(x_train, y_train, **fit_params) - except Exception: + except Exception as exc: if error_score == 'raise': raise if isinstance(error_score, numbers.Number): test_score = error_score - warnings.warn("Estimator fit failed. The score on this train-test " - "partition for these parameters will be set to %f. " - "Details: \n%s" % (error_score, format_exc()), - FitFailedWarning) + warnings.warn( + f"Estimator fit failed. The score on this train-test " + f"partition for these parameters will be set to " + f"{error_score:f}. Details: \n{format_exc()}", + FitFailedWarning) else: - raise ValueError("error_score must be the string 'raise' or a " - "numeric value. (Hint: if using 'raise', please " - "make sure that it has been spelled correctly.)") + raise ValueError( + "error_score must be the string 'raise' or a " + "numeric value. (Hint: if using 'raise', please " + "make sure that it has been spelled correctly.)") from exc else: test_score = _score_weighted(estimator, x_test, y_test, scorer, sample_weights=sample_weights_test) @@ -424,10 +441,10 @@ def _get_fit_parameters(fit_kwargs, steps, cls): f"of the parameter, got '{param_name}'") try: params[param_split[0]][param_split[1]] = param_val - except KeyError: + except KeyError as exc: raise ValueError( f"Expected one of {step_names} for step of fit parameter, got " - f"'{param_split[0]}' for parameter '{param_name}'") + f"'{param_split[0]}' for parameter '{param_name}'") from exc return params @@ -558,10 +575,10 @@ def get_rfecv_transformer(rfecv_estimator): """Get transformer step of RFECV estimator.""" try: check_is_fitted(rfecv_estimator) - except NotFittedError: + except NotFittedError as exc: raise NotFittedError( "RFECV instance used to initialize FeatureSelectionTransformer " - "must be fitted") + "must be fitted") from exc transformer = FeatureSelectionTransformer( grid_scores=rfecv_estimator.grid_scores_, n_features=rfecv_estimator.n_features_, @@ -711,7 +728,7 @@ def _fit(self, x_data, y_data, step_score=None, **fit_kwargs): raise ValueError("Step must be >0") support_ = np.ones(n_features, dtype=bool) - ranking_ = np.ones(n_features, dtype=int) + ranking_ = np.ones(n_features, dtype=np.int64) if step_score: self.scores_ = [] @@ -724,7 +741,7 @@ def _fit(self, x_data, y_data, step_score=None, **fit_kwargs): # Rank the remaining features estimator = clone(self.estimator) if self.verbose > 0: - print("Fitting estimator with %d features." % np.sum(support_)) + print(f"Fitting estimator with {np.sum(support_):d} features.") _update_transformers_param(estimator, support_) estimator.fit(x_data[:, features], y_data, **fit_kwargs) @@ -785,7 +802,7 @@ def _fit(self, x_data, y_data, step_score=None, **fit_kwargs): return self - @if_delegate_has_method(delegate='estimator') + @available_if(_estimator_has("predict")) def predict(self, x_data, **predict_kwargs): """Expand :meth:`predict()` to accept kwargs.""" check_is_fitted(self) diff --git a/esmvaltool/diag_scripts/mlr/models/__init__.py b/esmvaltool/diag_scripts/mlr/models/__init__.py index ebee1338a2..4f60464289 100644 --- a/esmvaltool/diag_scripts/mlr/models/__init__.py +++ b/esmvaltool/diag_scripts/mlr/models/__init__.py @@ -246,12 +246,14 @@ parameters: dict Parameters used for the whole pipeline. Have to be given for each step of the pipeline separated by two underscores, i.e. ``s__p`` is the parameter - ``p`` for step ``s``. + ``p`` for step ``s``. ``random_state`` parameters are explicitly allowed + here (in contrast to ``parameters_final_regressor``). parameters_final_regressor: dict Parameters used for the **final** regressor. If these parameters are updated using the function :meth:`update_parameters`, the new names have to be given for each step of the pipeline separated by two underscores, i.e. - ``s__p`` is the parameter ``p`` for step ``s``. + ``s__p`` is the parameter ``p`` for step ``s``. Note: to pass an argument + for ``random_state``, use the option ``random_state`` of this class. pca: bool (default: False) Preprocess numerical input features using PCA. Parameters for this pipeline step can be given via the ``parameters`` argument. @@ -259,6 +261,13 @@ Root directory to save plots. plot_units: dict Replace specific units (keys) with other text (values) in plots. +random_state: int or None (default: None) + Random seed for :class:`numpy.random.RandomState` that is used by all + functionalities of this class that require randomness (e.g., probabilistic + ML algorithms like Gradient Boosting Regression models, random train test + splits, etc.). If ``None``, use a random seed. Use an :obj:`int` to get + reproducible results. See ``__ for more details. savefig_kwargs: dict Keyword arguments for :func:`matplotlib.pyplot.savefig`. seaborn_settings: dict @@ -287,6 +296,7 @@ import importlib import logging import os +import warnings from copy import deepcopy from inspect import getfullargspec from pprint import pformat @@ -306,7 +316,7 @@ from sklearn.decomposition import PCA from sklearn.exceptions import NotFittedError from sklearn.impute import SimpleImputer -from sklearn.inspection import plot_partial_dependence +from sklearn.inspection import PartialDependenceDisplay from sklearn.model_selection import ( GridSearchCV, LeaveOneGroupOut, @@ -354,8 +364,9 @@ def _load_mlr_models(): os.path.splitext(model_file)[0]) try: importlib.import_module( - 'esmvaltool.diag_scripts.mlr.models.{}'.format( - module.replace(os.sep, '.'))) + f"esmvaltool.diag_scripts.mlr.models." + f"{module.replace(os.sep, '.')}" + ) except ImportError: pass @@ -428,6 +439,9 @@ def __init__(self, input_datasets, **kwargs): # Set default settings self._set_default_settings() + # Random state + self._random_state = np.random.RandomState(self._cfg['random_state']) + # Seaborn sns.set(**self._cfg.get('seaborn_settings', {})) @@ -478,7 +492,7 @@ def features(self): @property def features_after_preprocessing(self): """numpy.ndarray: Features of the input data after preprocessing.""" - x_train = self.get_x_array('train') + x_train = self.data['train'].x y_train = self.get_y_array('train') try: self._check_fit_status('Calculating features after preprocessing') @@ -563,6 +577,11 @@ def parameters(self): """dict: Parameters of the complete MLR model pipeline.""" return self._parameters + @property + def random_state(self): + """numpy.random.RandomState: Random state instance.""" + return self._random_state + def efecv(self, **kwargs): """Perform exhaustive feature elimination using cross-validation. @@ -954,11 +973,14 @@ def plot_1d_model(self, filename=None, n_points=1000): **self._get_plot_kwargs(data_type, plot_type='scatter')) # Plot MLR model - x_lin = np.linspace(self.data['all'].x[feature].values.min(), - self.data['all'].x[feature].values.max(), - n_points) - y_pred = self._clf.predict(x_lin.reshape(-1, 1)) - axes.plot(x_lin, y_pred, color='k', linewidth=2, + x_lin = pd.DataFrame.from_dict( + {feature: np.linspace(self.data['all'].x[feature].values.min(), + self.data['all'].x[feature].values.max(), + n_points)} + ) + y_pred = self._clf.predict(x_lin) + x_lin_1d = x_lin.values[:, 0] + axes.plot(x_lin_1d, y_pred, color='k', linewidth=2, label=self._cfg['mlr_model_name']) # Plot appearance @@ -980,7 +1002,7 @@ def plot_1d_model(self, filename=None, n_points=1000): # Save provenance cube = mlr.get_1d_cube( - x_lin, + x_lin_1d, y_pred, x_kwargs={'var_name': feature, 'long_name': feature, @@ -1015,19 +1037,32 @@ def plot_partial_dependences(self, filename=None): filename = 'partial_dependece_{feature}' # Plot for every feature + # Note: Ignore warnings about missing feature names here because they + # are not used. x_train = self.get_x_array('train', impute_nans=True) - verbosity = self._get_verbosity_parameters(plot_partial_dependence) + verbosity = self._get_verbosity_parameters( + PartialDependenceDisplay.from_estimator + ) for feature_name in self.features: logger.debug("Plotting partial dependence of '%s'", feature_name) - display = plot_partial_dependence( - self._clf, - x_train, - features=[feature_name], - feature_names=self.features, - method='brute', - line_kw={'color': 'b'}, - **verbosity, - ) + with warnings.catch_warnings(): + warnings.filterwarnings( + 'ignore', + message=('X does not have valid feature names, but ' + 'SimpleImputer was fitted with feature names'), + category=UserWarning, + module='sklearn', + ) + display = PartialDependenceDisplay.from_estimator( + self._clf, + x_train, + features=[feature_name], + feature_names=self.features, + method='brute', + line_kw={'color': 'b'}, + random_state=self.random_state, + **verbosity, + ) title = (f"Partial dependence of {self.label} on {feature_name} " f"for MLR model {self._cfg['mlr_model_name']}") plt.title(title) @@ -1619,11 +1654,7 @@ def reset_pipeline(self): # Imputer if self._cfg['imputation_strategy'] != 'remove': - verbosity = self._get_verbosity_parameters(SimpleImputer) - imputer = SimpleImputer( - strategy=self._cfg['imputation_strategy'], - **verbosity, - ) + imputer = SimpleImputer(strategy=self._cfg['imputation_strategy']) steps.append(('imputer', imputer)) # Scaler for numerical features @@ -1637,7 +1668,8 @@ def reset_pipeline(self): # PCA for numerical features if self._cfg.get('pca'): pca = ColumnTransformer( - [('', PCA(), numerical_features_idx)], + [('', PCA(random_state=self.random_state), + numerical_features_idx)], remainder='passthrough', ) steps.append(('pca', pca)) @@ -1906,13 +1938,17 @@ def _check_dataset(self, datasets, var_type, tag, text=None): def _check_fit_status(self, text): """Check if MLR model is fitted and raise exception otherwise.""" - x_dummy = np.ones((1, self.features.size), dtype=self._cfg['dtype']) + x_dummy = pd.DataFrame( + np.ones((1, self.features.size), dtype=self._cfg['dtype']), + columns=self.features, + ) try: self._clf.predict(x_dummy) - except NotFittedError: + except NotFittedError as exc: raise NotFittedError( f"{text} not possible, MLR model {self._CLF_TYPE} is not " - f"fitted yet, call fit(), grid_search_cv() or rfecv() first") + f"fitted yet, call fit(), grid_search_cv() or rfecv() " + f"first") from exc def _estimate_mlr_model_error(self, target_length, strategy): """Estimate squared error of MLR model (using CV or test data).""" @@ -2087,11 +2123,11 @@ def _extract_x_data(self, datasets, var_type): (group_data, x_cube, weights) = self._get_x_data_for_group(group_datasets, var_type, group_attr) - x_data = x_data.append(group_data) + x_data = pd.concat([x_data, group_data]) # Append weights if desired if sample_weights is not None: - sample_weights = sample_weights.append(weights) + sample_weights = pd.concat([sample_weights, weights]) # Adapt sample_weights if necessary if sample_weights is not None: @@ -2150,7 +2186,7 @@ def _extract_y_data(self, datasets, var_type): index=self._get_multiindex(cube, group_attr=group_attr), dtype=self._cfg['dtype'], ) - y_data = y_data.append(cube_data) + y_data = pd.concat([y_data, cube_data]) # Convert index back to MultiIndex y_data.index = pd.MultiIndex.from_tuples( @@ -2309,11 +2345,11 @@ def _get_features_of_datasets(self, datasets, var_type, pred_name): for coord_name in self._cfg.get('coords_as_features', []): try: coord = ref_cube.coord(coord_name) - except iris.exceptions.CoordinateNotFoundError: + except iris.exceptions.CoordinateNotFoundError as exc: raise iris.exceptions.CoordinateNotFoundError( f"Coordinate '{coord_name}' given in 'coords_as_features' " f"not found in '{var_type}' data for prediction " - f"'{pred_name_str}'") + f"'{pred_name_str}'") from exc units[coord_name] = coord.units types[coord_name] = 'coordinate' @@ -2354,26 +2390,45 @@ def _get_label(self): def _get_lime_feature_importance(self, x_pred): """Get most important feature given by LIME.""" logger.info( - "Calculating global feature importance using LIME (this may take " + "Calculating local feature importance using LIME (this may take " "a while...)") x_pred = self._impute_nans(x_pred) # Most important feature for single input def _most_important_feature(x_single_pred, explainer, predict_fn): - """Get most important feature for single input.""" - explanation = explainer.explain_instance(x_single_pred, predict_fn) + """Get most important feature for single input. + + Note + ---- + Ignore warnings about missing feature names here because they are + not used. + + """ + with warnings.catch_warnings(): + warnings.filterwarnings( + 'ignore', + message=('X does not have valid feature names, but ' + 'SimpleImputer was fitted with feature names'), + category=UserWarning, + module='sklearn', + ) + explanation = explainer.explain_instance(x_single_pred, + predict_fn) local_exp = explanation.local_exp[1] sorted_exp = sorted(local_exp, key=lambda elem: elem[0]) - norm = sum([abs(elem[1]) for elem in sorted_exp]) + norm = sum(abs(elem[1]) for elem in sorted_exp) return [abs(elem[1]) / norm for elem in sorted_exp] # Apply on whole input (using multiple processes) parallel = Parallel(n_jobs=self._cfg['n_jobs']) lime_feature_importance = parallel( - [delayed(_most_important_feature)(x, - explainer=self._lime_explainer, - predict_fn=self._clf.predict) - for x in x_pred.values] + [ + delayed(_most_important_feature)( + x, + explainer=self._lime_explainer, + predict_fn=self._clf.predict, + ) for x in x_pred.values + ] ) lime_feature_importance = np.array(lime_feature_importance, dtype=self._cfg['dtype']) @@ -2491,9 +2546,9 @@ def _get_prediction_dict(self, pred_name, x_pred, x_err, y_ref, def _get_prediction_dtype(self): """Get ``dtype`` of the output of final regressor's ``predict()``.""" - x_data = self.get_x_array('train')[0].reshape(1, -1) + x_data = self.data['train'].x.iloc[:1] y_pred = self._clf.predict(x_data) - return y_pred.dtype + return y_pred.values.dtype def _get_prediction_properties(self): """Get important properties of prediction input.""" @@ -2559,7 +2614,11 @@ def _get_verbosity_parameters(self, function, boolean=False): } parameters = {} for (param, log_levels) in verbosity_params.items(): - if param in getfullargspec(function).args: + all_params = ( + getfullargspec(function).args + + getfullargspec(function).kwonlyargs + ) + if param in all_params: parameters[param] = log_levels.get(self._cfg['log_level'], log_levels['default']) if boolean: @@ -2664,17 +2723,17 @@ def _impute_nans(self, data_frame, copy=True): if 'x' in data_frame.columns: if support is not None: data_frame.x.values[:, support] = transform( - data_frame.x.values[:, support]) + data_frame.x.iloc[:, support]) data_frame = data_frame.fillna(data_frame.mean()) else: - data_frame.x.values[:] = transform(data_frame.x.values) + data_frame.x.values[:] = transform(data_frame.x) else: if support is not None: data_frame.values[:, support] = transform( - data_frame.values[:, support]) + data_frame.iloc[:, support]) data_frame = data_frame.fillna(data_frame.mean()) else: - data_frame.values[:] = transform(data_frame.values) + data_frame.values[:] = transform(data_frame) return data_frame def _is_ready_for_plotting(self): @@ -2747,9 +2806,11 @@ def _load_data(self): # Split train/test data if desired test_size = self._cfg['test_size'] if test_size: - (self._data['train'], - self._data['test']) = train_test_split(self._data['all'].copy(), - test_size=test_size) + (self._data['train'], self._data['test']) = train_test_split( + self._data['all'].copy(), + test_size=test_size, + random_state=self.random_state, + ) self._data['train'] = self._data['train'].sort_index() self._data['test'] = self._data['test'].sort_index() for data_type in ('train', 'test'): @@ -2770,10 +2831,14 @@ def _load_data(self): def _load_final_parameters(self): """Load parameters for final regressor.""" parameters = self._cfg.get('parameters_final_regressor', {}) - logger.debug("Using parameter(s) for final regressor: %s", parameters) + + # Update parameters + self._update_random_state_parameter(self._CLF_TYPE, parameters) verbosity_params = self._get_verbosity_parameters(self._CLF_TYPE) for (param, verbosity) in verbosity_params.items(): parameters.setdefault(param, verbosity) + + logger.debug("Using parameter(s) for final regressor: %s", parameters) return parameters def _load_input_datasets(self, input_datasets): @@ -2859,8 +2924,7 @@ def _load_lime_explainer(self): y_train = self.get_y_array('train', impute_nans=True) verbosity = self._get_verbosity_parameters(LimeTabularExplainer, boolean=True) - for param in verbosity: - verbosity[param] = False + verbosity = {param: False for param in verbosity} categorical_features_idx = [ int(np.where(self.features == tag)[0][0]) for tag in self.categorical_features @@ -2873,6 +2937,7 @@ def _load_lime_explainer(self): categorical_features=categorical_features_idx, discretize_continuous=False, sample_around_instance=True, + random_state=self.random_state, **verbosity, ) logger.debug( @@ -2988,8 +3053,8 @@ def _pred_type_to_metadata(self, pred_type, cube): if pred_type is None: attributes['var_type'] = 'prediction_output' elif isinstance(pred_type, int): - var_name += '_{:d}'.format(pred_type) - long_name += ' {:d}'.format(pred_type) + var_name += f'_{pred_type:d}' + long_name += f' {pred_type:d}' logger.warning("Got unknown prediction type with index %i", pred_type) attributes['var_type'] = 'prediction_output_misc' @@ -3065,8 +3130,23 @@ def _propagate_input_errors(self, x_pred, x_err): # Propagated error for single input def _propagated_error(x_single_pred, x_single_err, explainer, predict_fn, features, categorical_features): - """Get propagated prediction input error for single input.""" - exp = explainer.explain_instance(x_single_pred, predict_fn) + """Get propagated prediction input error for single input. + + Note + ---- + Ignore warnings about missing feature names here because they are + not used. + + """ + with warnings.catch_warnings(): + warnings.filterwarnings( + 'ignore', + message=('X does not have valid feature names, but ' + 'SimpleImputer was fitted with feature names'), + category=UserWarning, + module='sklearn', + ) + exp = explainer.explain_instance(x_single_pred, predict_fn) x_single_err = np.nan_to_num(x_single_err) x_err_scaled = x_single_err / explainer.scaler.scale_ squared_error = 0.0 @@ -3127,7 +3207,7 @@ def _save_prediction_cubes(self, pred_dict, pred_name, x_cube): logger.debug("Creating output cubes") for (pred_type, y_pred) in pred_dict.items(): y_pred = self._mask_prediction_array(y_pred, x_cube) - if y_pred.size == np.prod(x_cube.shape, dtype=np.int): + if y_pred.size == np.prod(x_cube.shape, dtype=np.int64): pred_cube = x_cube.copy(y_pred.reshape(x_cube.shape)) else: dim_coords = [] @@ -3200,6 +3280,7 @@ def _set_default_settings(self): self._cfg.setdefault('plot_dir', os.path.expanduser(os.path.join('~', 'plots'))) self._cfg.setdefault('plot_units', {}) + self._cfg.setdefault('random_state', None) self._cfg.setdefault('savefig_kwargs', { 'bbox_inches': 'tight', 'dpi': 300, @@ -3265,7 +3346,10 @@ def _update_fit_kwargs(self, fit_kwargs): f"'{param_name}'") # Add sample weights if possible - allowed_fit_kwargs = getfullargspec(self._CLF_TYPE.fit).args + allowed_fit_kwargs = ( + getfullargspec(self._CLF_TYPE.fit).args + + getfullargspec(self._CLF_TYPE.fit).kwonlyargs + ) for kwarg in ('sample_weight', 'sample_weights'): if kwarg not in allowed_fit_kwargs: continue @@ -3280,6 +3364,29 @@ def _update_fit_kwargs(self, fit_kwargs): return new_fit_kwargs + def _update_random_state_parameter(self, function, parameters): + """Update ``random_state`` parameter if necessary.""" + all_params = ( + getfullargspec(function).args + + getfullargspec(function).kwonlyargs + ) + if 'random_state' in all_params: + if 'random_state' in parameters: + logger.warning( + "Parameter 'random_state=%s' is ignored for '%s', use the " + "'random_state' option to initialize the MLRModel class " + "instead", + parameters['random_state'], + self._CLF_TYPE, + ) + parameters['random_state'] = self.random_state + logger.debug( + "Updated 'random_state' parameter of '%s' to '%s'", + self._CLF_TYPE, + self.random_state, + ) + return parameters + def _write_plot_provenance(self, cube, plot_path, **additional_info): """Write provenance information for plots.""" netcdf_path = mlr.get_new_path(self._cfg, plot_path) @@ -3307,10 +3414,10 @@ def _convert_units_in_cube(cube, new_units, power=None, text=None): new_units) try: cube.convert_units(new_units) - except ValueError: + except ValueError as exc: raise ValueError( f"Cannot convert units{msg} from '{cube.units}' to " - f"'{new_units}'") + f"'{new_units}'") from exc @staticmethod def _convert_units_in_metadata(datasets): @@ -3322,10 +3429,11 @@ def _convert_units_in_metadata(datasets): units_to = Unit(dataset['convert_units_to']) try: units_from.convert(0.0, units_to) - except ValueError: + except ValueError as exc: raise ValueError( f"Cannot convert units of {dataset['var_type']} " - f"'{dataset['tag']}' from '{units_from}' to '{units_to}'") + f"'{dataset['tag']}' from '{units_from}' to " + f"'{units_to}'") from exc dataset['units'] = dataset['convert_units_to'] @staticmethod @@ -3354,10 +3462,10 @@ def _get_coordinate_data(ref_cube, var_type, tag, text=None): return 0.0 try: coord = ref_cube.coord(tag) - except iris.exceptions.CoordinateNotFoundError: + except iris.exceptions.CoordinateNotFoundError as exc: raise iris.exceptions.CoordinateNotFoundError( f"Coordinate '{tag}' given in 'coords_as_features' not found " - f"in reference cube for '{var_type}'{msg}") + f"in reference cube for '{var_type}'{msg}") from exc coord_array = np.ma.filled(coord.points, np.nan) coord_dims = ref_cube.coord_dims(coord) if coord_dims == (): diff --git a/esmvaltool/diag_scripts/mlr/models/gbr_base.py b/esmvaltool/diag_scripts/mlr/models/gbr_base.py index a811e41c60..cf0412fabd 100644 --- a/esmvaltool/diag_scripts/mlr/models/gbr_base.py +++ b/esmvaltool/diag_scripts/mlr/models/gbr_base.py @@ -100,7 +100,7 @@ def _plot_training_progress(self, title = f"Training progress ({self._cfg['mlr_model_name']})" axes.set_title(title) axes.set_xlabel('Boosting iterations') - axes.set_ylabel('Normalized RMSE') + axes.set_ylabel('Loss') axes.legend(loc='upper right') new_filename = filename + '.' + self._cfg['output_file_type'] plot_path = os.path.join(self._cfg['mlr_plot_dir'], new_filename) diff --git a/esmvaltool/diag_scripts/mlr/models/gbr_sklearn.py b/esmvaltool/diag_scripts/mlr/models/gbr_sklearn.py index 0b6145e17e..3921e12691 100644 --- a/esmvaltool/diag_scripts/mlr/models/gbr_sklearn.py +++ b/esmvaltool/diag_scripts/mlr/models/gbr_sklearn.py @@ -9,6 +9,7 @@ import numpy as np from sklearn.ensemble import GradientBoostingRegressor +from sklearn.metrics import mean_squared_error from esmvaltool.diag_scripts.mlr.models import MLRModel from esmvaltool.diag_scripts.mlr.models.gbr_base import GBRModel @@ -36,12 +37,14 @@ def plot_training_progress(self, filename=None): test_score = None if 'test' in self.data: test_score = np.zeros((len(clf.train_score_), ), dtype=np.float64) - x_test = self._clf.transform_only(self.get_x_array('test')) + x_test = self._clf.transform_only(self.data['test'].x) y_test = self._clf.transform_target_only(self.get_y_array('test')) sample_weights = self._get_sample_weights('test') for (idx, y_pred) in enumerate(clf.staged_predict(x_test)): - test_score[idx] = clf.loss_(y_test, - y_pred, - sample_weight=sample_weights) + test_score[idx] = np.sqrt(mean_squared_error( + y_test, + y_pred, + sample_weight=sample_weights, + )) self._plot_training_progress(train_score, test_score=test_score, filename=filename) diff --git a/esmvaltool/diag_scripts/mlr/models/gbr_xgboost.py b/esmvaltool/diag_scripts/mlr/models/gbr_xgboost.py index 14d44e8f69..502487c998 100644 --- a/esmvaltool/diag_scripts/mlr/models/gbr_xgboost.py +++ b/esmvaltool/diag_scripts/mlr/models/gbr_xgboost.py @@ -49,7 +49,7 @@ def _update_fit_kwargs(self, fit_kwargs): fit_kwargs = super()._update_fit_kwargs(fit_kwargs) # Fit all transformers - x_train = self.get_x_array('train') + x_train = self.data['train'].x y_train = self.get_y_array('train') self._clf.fit_transformers_only(x_train, y_train, **fit_kwargs) self._clf.fit_target_transformer_only(y_train, **fit_kwargs) @@ -60,7 +60,7 @@ def _update_fit_kwargs(self, fit_kwargs): eval_set = [(x_train, y_train)] sample_weights = [self._get_sample_weights('train')] if 'test' in self.data: - x_test = self._clf.transform_only(self.get_x_array('test')) + x_test = self._clf.transform_only(self.data['test'].x) y_test = self._clf.transform_target_only(self.get_y_array('test')) eval_set.append((x_test, y_test)) sample_weights.append(self._get_sample_weights('test')) diff --git a/esmvaltool/diag_scripts/mlr/postprocess.py b/esmvaltool/diag_scripts/mlr/postprocess.py index 30778c1503..0f7ab80f82 100644 --- a/esmvaltool/diag_scripts/mlr/postprocess.py +++ b/esmvaltool/diag_scripts/mlr/postprocess.py @@ -176,10 +176,10 @@ def _convert_units(cfg, cube): units_to) try: cube.convert_units(units_to) - except ValueError: + except ValueError as exc: raise ValueError( f"Cannot convert units of cube {cube.summary(shorten=True)} " - f"from '{cube.units}' to '{units_to}'") + f"from '{cube.units}' to '{units_to}'") from exc def _collapse_covariance_cube(cfg, cov_cube, ref_cube): @@ -304,7 +304,7 @@ def _estim_cov_identical_shape(squared_error_cube, cov_est_cube, weights): error_dim0 = np.ma.sqrt(np.ma.sum(cov_dim0, axis=(1, 2))) error_dim1 = np.ma.sqrt(np.ma.sum(cov_dim1, axis=(1, 2))) - # Collaps further (all weights are already included in first step) + # Collapse further (all weights are already included in first step) cov_order_0 = pearson_dim0 * np.ma.outer(error_dim0, error_dim0) cov_order_1 = pearson_dim1 * np.ma.outer(error_dim1, error_dim1) error_order_0 = np.ma.sqrt(np.ma.sum(cov_order_0)) @@ -567,7 +567,7 @@ def check_cfg(cfg): """Check options of configuration and catch errors.""" for operation in ('sum', 'mean'): if operation in cfg: - cfg[operation] = list(set(cfg[operation])) + cfg[operation] = sorted(list(set(cfg[operation]))) for coord in cfg.get('sum', []): if coord in cfg.get('mean', []): raise ValueError(f"Coordinate '{coord}' given in 'sum' and 'mean'") diff --git a/esmvaltool/diag_scripts/monitor/monitor_base.py b/esmvaltool/diag_scripts/monitor/monitor_base.py index a2a7bf5524..265443d022 100644 --- a/esmvaltool/diag_scripts/monitor/monitor_base.py +++ b/esmvaltool/diag_scripts/monitor/monitor_base.py @@ -2,11 +2,11 @@ import logging import os +import re import cartopy import matplotlib.pyplot as plt import yaml -from esmvalcore._data_finder import _replace_tags from iris.analysis import MEAN from mapgenerator.plotting.timeseries import PlotSeries @@ -15,6 +15,72 @@ logger = logging.getLogger(__name__) +def _replace_tags(paths, variable): + """Replace tags in the config-developer's file with actual values.""" + if isinstance(paths, str): + paths = set((paths.strip('/'), )) + else: + paths = set(path.strip('/') for path in paths) + tlist = set() + for path in paths: + tlist = tlist.union(re.findall(r'{([^}]*)}', path)) + if 'sub_experiment' in variable: + new_paths = [] + for path in paths: + new_paths.extend( + (re.sub(r'(\b{ensemble}\b)', r'{sub_experiment}-\1', path), + re.sub(r'({ensemble})', r'{sub_experiment}-\1', path))) + tlist.add('sub_experiment') + paths = new_paths + + for tag in tlist: + original_tag = tag + tag, _, _ = _get_caps_options(tag) + + if tag == 'latestversion': # handled separately later + continue + if tag in variable: + replacewith = variable[tag] + else: + raise ValueError(f"Dataset key '{tag}' must be specified for " + f"{variable}, check your recipe entry") + paths = _replace_tag(paths, original_tag, replacewith) + return paths + + +def _replace_tag(paths, tag, replacewith): + """Replace tag by replacewith in paths.""" + _, lower, upper = _get_caps_options(tag) + result = [] + if isinstance(replacewith, (list, tuple)): + for item in replacewith: + result.extend(_replace_tag(paths, tag, item)) + else: + text = _apply_caps(str(replacewith), lower, upper) + result.extend(p.replace('{' + tag + '}', text) for p in paths) + return list(set(result)) + + +def _get_caps_options(tag): + lower = False + upper = False + if tag.endswith('.lower'): + lower = True + tag = tag[0:-6] + elif tag.endswith('.upper'): + upper = True + tag = tag[0:-6] + return tag, lower, upper + + +def _apply_caps(original, lower, upper): + if lower: + return original.lower() + if upper: + return original.upper() + return original + + class MonitorBase(): """Base class for monitoring diagnostic. diff --git a/esmvaltool/diag_scripts/monitor/multi_datasets.py b/esmvaltool/diag_scripts/monitor/multi_datasets.py index 3cbf1c2440..8a15b6cc4a 100644 --- a/esmvaltool/diag_scripts/monitor/multi_datasets.py +++ b/esmvaltool/diag_scripts/monitor/multi_datasets.py @@ -14,6 +14,9 @@ - Time series (plot type ``timeseries``): for each variable separately, all datasets are plotted in one single figure. Input data needs to be 1D with single dimension `time`. + - Annual cycle (plot type ``annual_cycle``): for each variable separately, + all datasets are plotted in one single figure. Input data needs to be 1D + with single dimension `month_number`. - Maps (plot type ``map``): for each variable and dataset, an individual map is plotted. If a reference dataset is defined, also include this dataset and a bias plot into the figure. Note that if a reference dataset @@ -48,9 +51,9 @@ default, uses ``constrained_layout: true``. plots: dict, optional Plot types plotted by this diagnostic (see list above). Dictionary keys - must be ``timeseries``, ``map``, or ``profile``. Dictionary values are - dictionaries used as options for the corresponding plot. The allowed - options for the different plot types are given below. + must be ``timeseries``, ``annual_cycle``, ``map``, or ``profile``. + Dictionary values are dictionaries used as options for the corresponding + plot. The allowed options for the different plot types are given below. plot_filename: str, optional Filename pattern for the plots. Defaults to ``{plot_type}_{real_name}_{dataset}_{mip}_{exp}_{ensemble}``. @@ -101,6 +104,31 @@ to something like ``ambiguous_project``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. +Configuration options for plot type ``annual_cycle`` +---------------------------------------------------- +legend_kwargs: dict, optional + Optional keyword arguments for :func:`matplotlib.pyplot.legend`. Use + ``legend_kwargs: false`` to not show legends. +plot_kwargs: dict, optional + Optional keyword arguments for :func:`iris.plot.plot`. Dictionary keys are + elements identified by ``facet_used_for_labels`` or ``default``, e.g., + ``CMIP6`` if ``facet_used_for_labels: project`` or ``historical`` if + ``facet_used_for_labels: exp``. Dictionary values are dictionaries used as + keyword arguments for :func:`iris.plot.plot`. String arguments can include + facets in curly brackets which will be derived from the corresponding + dataset, e.g., ``{project}``, ``{short_name}``, ``{exp}``. Examples: + ``default: {linestyle: '-', label: '{project}'}, CMIP6: {color: red, + linestyle: '--'}, OBS: {color: black}``. +pyplot_kwargs: dict, optional + Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys + are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as + single argument for these functions. String arguments can include facets in + curly brackets which will be derived from the datasets plotted in the + corresponding plot, e.g., ``{short_name}``, ``{exp}``. Facets like + ``{project}`` that vary between the different datasets will be transformed + to something like ``ambiguous_project``. Examples: ``title: 'Awesome Plot + of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + Configuration options for plot type ``map`` ------------------------------------------- cbar_label: str, optional (default: '{short_name} [{units}]') @@ -177,6 +205,14 @@ graphics (e.g., ``output_file_type=pdf,svg,ps``). show_stats: bool, optional (default: True) Show basic statistics on the plots. +x_pos_stats_avg: float, optional (default: 0.0) + Text x-position of average (shown on the left) in Axes coordinates. Can be + adjusted to avoid overlap with the figure. Only relevant if ``show_stats: + true``. +x_pos_stats_bias: float, optional (default: 0.92) + Text x-position of bias statistics (shown on the right) in Axes + coordinates. Can be adjusted to avoid overlap with the figure. Only + relevant if ``show_stats: true``. Configuration options for plot type ``profile`` ----------------------------------------------- @@ -247,6 +283,14 @@ Show tick labels for the minor ticks on the Y axis. show_stats: bool, optional (default: True) Show basic statistics on the plots. +x_pos_stats_avg: float, optional (default: 0.01) + Text x-position of average (shown on the left) in Axes coordinates. Can be + adjusted to avoid overlap with the figure. Only relevant if ``show_stats: + true``. +x_pos_stats_bias: float, optional (default: 0.7) + Text x-position of bias statistics (shown on the right) in Axes + coordinates. Can be adjusted to avoid overlap with the figure. Only + relevant if ``show_stats: true``. .. hint:: @@ -277,7 +321,9 @@ from esmvaltool.diag_scripts.monitor.monitor_base import MonitorBase from esmvaltool.diag_scripts.shared import ( ProvenanceLogger, + get_diagnostic_filename, group_metadata, + io, run_diagnostic, ) @@ -306,10 +352,19 @@ def __init__(self, config): # Load input data self.input_data = self._load_and_preprocess_data() - self.grouped_input_data = group_metadata(self.input_data, 'short_name') + self.grouped_input_data = group_metadata( + self.input_data, + 'short_name', + sort=self.cfg['facet_used_for_labels'], + ) # Check given plot types and set default settings for them - self.supported_plot_types = ['timeseries', 'map', 'profile'] + self.supported_plot_types = [ + 'timeseries', + 'annual_cycle', + 'map', + 'profile', + ] for (plot_type, plot_options) in self.plots.items(): if plot_type not in self.supported_plot_types: raise ValueError( @@ -330,11 +385,18 @@ def __init__(self, config): self.plots[plot_type].setdefault('rasterize', True) self.plots[plot_type].setdefault('show_stats', True) - # Defaults profile plots + # Defaults for map plots + if plot_type == 'map': + self.plots[plot_type].setdefault('x_pos_stats_avg', 0.0) + self.plots[plot_type].setdefault('x_pos_stats_bias', 0.92) + + # Defaults for profile plots if plot_type == 'profile': self.plots[plot_type].setdefault('log_y', True) self.plots[plot_type].setdefault('show_y_minor_ticklabels', False) + self.plots[plot_type].setdefault('x_pos_stats_avg', 0.01) + self.plots[plot_type].setdefault('x_pos_stats_bias', 0.7) # Check that facet_used_for_labels is present for every dataset for dataset in self.input_data: @@ -374,20 +436,31 @@ def _add_colorbar(self, plot_type, plot_left, plot_right, axes_left, cbar_right.set_label(cbar_label_right, fontsize=fontsize) cbar_right.ax.tick_params(labelsize=fontsize) - def _add_stats(self, plot_type, axes, dim_coords, cube, ref_cube=None): + def _add_stats(self, plot_type, axes, dim_coords, dataset, + ref_dataset=None): """Add text to plot that describes basic statistics.""" if not self.plots[plot_type]['show_stats']: return + # Extract cube(s) + cube = dataset['cube'] + if ref_dataset is None: + ref_cube = None + label = self._get_label(dataset) + else: + ref_cube = ref_dataset['cube'] + label = (f'{self._get_label(dataset)} vs. ' + f'{self._get_label(ref_dataset)}') + # Different options for the different plots types fontsize = 6.0 y_pos = 0.95 if plot_type == 'map': - x_pos_bias = 0.92 - x_pos = 0.0 + x_pos_bias = self.plots[plot_type]['x_pos_stats_bias'] + x_pos = self.plots[plot_type]['x_pos_stats_avg'] elif plot_type == 'profile': - x_pos_bias = 0.7 - x_pos = 0.01 + x_pos_bias = self.plots[plot_type]['x_pos_stats_bias'] + x_pos = self.plots[plot_type]['x_pos_stats_avg'] else: raise NotImplementedError(f"plot_type '{plot_type}' not supported") @@ -410,9 +483,23 @@ def _add_stats(self, plot_type, axes, dim_coords, cube, ref_cube=None): if ref_cube is None: mean = cube.collapsed(dim_coords, iris.analysis.MEAN, weights=weights) + logger.info( + "Area-weighted mean of %s for %s = %f%s", + dataset['short_name'], + label, + mean.data, + dataset['units'], + ) else: mean = (cube - ref_cube).collapsed(dim_coords, iris.analysis.MEAN, weights=weights) + logger.info( + "Area-weighted bias of %s for %s = %f%s", + dataset['short_name'], + label, + mean.data, + dataset['units'], + ) axes.text(x_pos, y_pos, f"{mean.data:.2f}{cube.units}", fontsize=fontsize, transform=axes.transAxes) if ref_cube is None: @@ -423,6 +510,13 @@ def _add_stats(self, plot_type, axes, dim_coords, cube, ref_cube=None): weights=weights) axes.text(x_pos_bias, y_pos, f"RMSE={rmse.data:.2f}{cube.units}", fontsize=fontsize, transform=axes.transAxes) + logger.info( + "Area-weighted RMSE of %s for %s = %f%s", + dataset['short_name'], + label, + rmse.data, + dataset['units'], + ) # Weighted R2 mask = np.ma.getmaskarray(cube.data).ravel() @@ -433,6 +527,12 @@ def _add_stats(self, plot_type, axes, dim_coords, cube, ref_cube=None): r2_val = r2_score(cube_data, ref_cube_data, sample_weight=weights) axes.text(x_pos_bias, y_pos - 0.1, rf"R$^2$={r2_val:.2f}", fontsize=fontsize, transform=axes.transAxes) + logger.info( + "Area-weighted R2 of %s for %s = %f", + dataset['short_name'], + label, + r2_val, + ) def _get_custom_mpl_rc_params(self, plot_type): """Get custom matplotlib rcParams.""" @@ -543,7 +643,7 @@ def _get_plot_kwargs(self, plot_type, dataset, bias=False): plot_kwargs[key] = val # Default settings for different plot types - if plot_type == 'timeseries': + if plot_type in ('timeseries', 'annual_cycle'): plot_kwargs.setdefault('label', label) return deepcopy(plot_kwargs) @@ -570,12 +670,6 @@ def _load_and_preprocess_data(self): z_coord = cube.coord('altitude') z_coord.attributes['positive'] = 'up' - # Convert pr units if necessary - if cube.var_name == 'pr' and cube.units == 'kg m-2 s-1': - cube.units = 'mm s-1' - cube.convert_units('mm day-1') - dataset['units'] = 'mm day-1' - dataset['cube'] = cube return input_data @@ -583,8 +677,8 @@ def _load_and_preprocess_data(self): def _plot_map_with_ref(self, plot_func, dataset, ref_dataset): """Plot map plot for single dataset with a reference dataset.""" plot_type = 'map' - logger.debug("Plotting map with reference dataset '%s' for '%s'", - self._get_label(ref_dataset), self._get_label(dataset)) + logger.info("Plotting map with reference dataset '%s' for '%s'", + self._get_label(ref_dataset), self._get_label(dataset)) # Make sure that the data has the correct dimensions cube = dataset['cube'] @@ -613,7 +707,7 @@ def _plot_map_with_ref(self, plot_func, dataset, ref_dataset): if gridline_kwargs is not False: axes_data.gridlines(**gridline_kwargs) axes_data.set_title(self._get_label(dataset), pad=3.0) - self._add_stats(plot_type, axes_data, dim_coords_dat, cube) + self._add_stats(plot_type, axes_data, dim_coords_dat, dataset) # Plot reference dataset (top right) # Note: make sure to use the same vmin and vmax than the top left @@ -629,7 +723,7 @@ def _plot_map_with_ref(self, plot_func, dataset, ref_dataset): if gridline_kwargs is not False: axes_ref.gridlines(**gridline_kwargs) axes_ref.set_title(self._get_label(ref_dataset), pad=3.0) - self._add_stats(plot_type, axes_ref, dim_coords_ref, ref_cube) + self._add_stats(plot_type, axes_ref, dim_coords_ref, ref_dataset) # Add colorbar(s) self._add_colorbar(plot_type, plot_data, plot_ref, axes_data, @@ -658,8 +752,8 @@ def _plot_map_with_ref(self, plot_func, dataset, ref_dataset): fontsize=fontsize, ) cbar_bias.ax.tick_params(labelsize=fontsize) - self._add_stats(plot_type, axes_bias, dim_coords_dat, cube, - ref_cube) + self._add_stats(plot_type, axes_bias, dim_coords_dat, dataset, + ref_dataset) # Customize plot fig.suptitle(f"{dataset['long_name']} ({dataset['start_year']}-" @@ -670,13 +764,24 @@ def _plot_map_with_ref(self, plot_func, dataset, ref_dataset): if self.plots[plot_type]['rasterize']: self._set_rasterized([axes_data, axes_ref, axes_bias]) - return self.get_plot_path(plot_type, dataset) + # File paths + plot_path = self.get_plot_path(plot_type, dataset) + netcdf_path = ( + get_diagnostic_filename(Path(plot_path).stem + "_{pos}", self.cfg) + ) + netcdf_paths = { + netcdf_path.format(pos='top_left'): cube, + netcdf_path.format(pos='top_right'): ref_cube, + netcdf_path.format(pos='bottom'): bias_cube, + } + + return (plot_path, netcdf_paths) def _plot_map_without_ref(self, plot_func, dataset): """Plot map plot for single dataset without a reference dataset.""" plot_type = 'map' - logger.debug("Plotting map without reference dataset for '%s'", - self._get_label(dataset)) + logger.info("Plotting map without reference dataset for '%s'", + self._get_label(dataset)) # Make sure that the data has the correct dimensions cube = dataset['cube'] @@ -695,7 +800,7 @@ def _plot_map_without_ref(self, plot_func, dataset): axes.gridlines(**gridline_kwargs) # Print statistics if desired - self._add_stats(plot_type, axes, dim_coords_dat, cube) + self._add_stats(plot_type, axes, dim_coords_dat, dataset) # Setup colorbar fontsize = self.plots[plot_type]['fontsize'] @@ -715,13 +820,17 @@ def _plot_map_without_ref(self, plot_func, dataset): if self.plots[plot_type]['rasterize']: self._set_rasterized([axes]) - return self.get_plot_path(plot_type, dataset) + # File paths + plot_path = self.get_plot_path(plot_type, dataset) + netcdf_path = get_diagnostic_filename(Path(plot_path).stem, self.cfg) + + return (plot_path, {netcdf_path: cube}) def _plot_profile_with_ref(self, plot_func, dataset, ref_dataset): """Plot profile plot for single dataset with a reference dataset.""" plot_type = 'profile' - logger.debug("Plotting profile with reference dataset '%s' for '%s'", - self._get_label(ref_dataset), self._get_label(dataset)) + logger.info("Plotting profile with reference dataset '%s' for '%s'", + self._get_label(ref_dataset), self._get_label(dataset)) # Make sure that the data has the correct dimensions cube = dataset['cube'] @@ -755,7 +864,7 @@ def _plot_profile_with_ref(self, plot_func, dataset, ref_dataset): FormatStrFormatter('%.1f')) else: axes_data.get_yaxis().set_minor_formatter(NullFormatter()) - self._add_stats(plot_type, axes_data, dim_coords_dat, cube) + self._add_stats(plot_type, axes_data, dim_coords_dat, dataset) # Plot reference dataset (top right) # Note: make sure to use the same vmin and vmax than the top left @@ -769,7 +878,7 @@ def _plot_profile_with_ref(self, plot_func, dataset, ref_dataset): plot_ref = plot_func(ref_cube, **plot_kwargs) axes_ref.set_title(self._get_label(ref_dataset), pad=3.0) plt.setp(axes_ref.get_yticklabels(), visible=False) - self._add_stats(plot_type, axes_ref, dim_coords_ref, ref_cube) + self._add_stats(plot_type, axes_ref, dim_coords_ref, ref_dataset) # Add colorbar(s) self._add_colorbar(plot_type, plot_data, plot_ref, axes_data, @@ -797,8 +906,8 @@ def _plot_profile_with_ref(self, plot_func, dataset, ref_dataset): fontsize=fontsize, ) cbar_bias.ax.tick_params(labelsize=fontsize) - self._add_stats(plot_type, axes_bias, dim_coords_dat, cube, - ref_cube) + self._add_stats(plot_type, axes_bias, dim_coords_dat, dataset, + ref_dataset) # Customize plot fig.suptitle(f"{dataset['long_name']} ({dataset['start_year']}-" @@ -809,13 +918,24 @@ def _plot_profile_with_ref(self, plot_func, dataset, ref_dataset): if self.plots[plot_type]['rasterize']: self._set_rasterized([axes_data, axes_ref, axes_bias]) - return self.get_plot_path(plot_type, dataset) + # File paths + plot_path = self.get_plot_path(plot_type, dataset) + netcdf_path = ( + get_diagnostic_filename(Path(plot_path).stem + "_{pos}", self.cfg) + ) + netcdf_paths = { + netcdf_path.format(pos='top_left'): cube, + netcdf_path.format(pos='top_right'): ref_cube, + netcdf_path.format(pos='bottom'): bias_cube, + } + + return (plot_path, netcdf_paths) def _plot_profile_without_ref(self, plot_func, dataset): """Plot profile plot for single dataset without a reference dataset.""" plot_type = 'profile' - logger.debug("Plotting profile without reference dataset for '%s'", - self._get_label(dataset)) + logger.info("Plotting profile without reference dataset for '%s'", + self._get_label(dataset)) # Make sure that the data has the correct dimensions cube = dataset['cube'] @@ -830,7 +950,7 @@ def _plot_profile_without_ref(self, plot_func, dataset): plot_profile = plot_func(cube, **plot_kwargs) # Print statistics if desired - self._add_stats(plot_type, axes, dim_coords_dat, cube) + self._add_stats(plot_type, axes, dim_coords_dat, dataset) # Setup colorbar fontsize = self.plots[plot_type]['fontsize'] @@ -862,7 +982,11 @@ def _plot_profile_without_ref(self, plot_func, dataset): if self.plots[plot_type]['rasterize']: self._set_rasterized([axes]) - return self.get_plot_path(plot_type, dataset) + # File paths + plot_path = self.get_plot_path(plot_type, dataset) + netcdf_path = get_diagnostic_filename(Path(plot_path).stem, self.cfg) + + return (plot_path, {netcdf_path: cube}) def _process_pyplot_kwargs(self, plot_type, dataset): """Process functions for :mod:`matplotlib.pyplot`.""" @@ -880,6 +1004,7 @@ def _process_pyplot_kwargs(self, plot_type, dataset): def _check_cube_dimensions(cube, plot_type): """Check that cube has correct dimensional variables.""" expected_dimensions_dict = { + 'annual_cycle': (['month_number'],), 'map': (['latitude', 'longitude'],), 'profile': (['latitude', 'air_pressure'], ['latitude', 'altitude']), @@ -951,9 +1076,11 @@ def create_timeseries_plot(self, datasets, short_name): # Plot all datasets in one single figure ancestors = [] + cubes = {} for dataset in datasets: ancestors.append(dataset['filename']) cube = dataset['cube'] + cubes[self._get_label(dataset)] = cube self._check_cube_dimensions(cube, plot_type) # Plot original time series @@ -994,6 +1121,13 @@ def create_timeseries_plot(self, datasets, short_name): logger.info("Wrote %s", plot_path) plt.close() + # Save netCDF file + netcdf_path = get_diagnostic_filename(Path(plot_path).stem, self.cfg) + var_attrs = { + n: datasets[0][n] for n in ('short_name', 'long_name', 'units') + } + io.save_1d_data(cubes, netcdf_path, 'time', var_attrs) + # Provenance tracking caption = (f"Time series of {multi_dataset_facets['long_name']} for " f"various datasets.") @@ -1005,6 +1139,75 @@ def create_timeseries_plot(self, datasets, short_name): } with ProvenanceLogger(self.cfg) as provenance_logger: provenance_logger.log(plot_path, provenance_record) + provenance_logger.log(netcdf_path, provenance_record) + + def create_annual_cycle_plot(self, datasets, short_name): + """Create annual cycle plot.""" + plot_type = 'annual_cycle' + if plot_type not in self.plots: + return + + if not datasets: + raise ValueError(f"No input data to plot '{plot_type}' given") + + logger.info("Plotting %s", plot_type) + fig = plt.figure(**self.cfg['figure_kwargs']) + axes = fig.add_subplot() + + # Plot all datasets in one single figure + ancestors = [] + cubes = {} + for dataset in datasets: + ancestors.append(dataset['filename']) + cube = dataset['cube'] + cubes[self._get_label(dataset)] = cube + self._check_cube_dimensions(cube, plot_type) + + # Plot annual cycle + plot_kwargs = self._get_plot_kwargs(plot_type, dataset) + plot_kwargs['axes'] = axes + iris.plot.plot(cube, **plot_kwargs) + + # Default plot appearance + multi_dataset_facets = self._get_multi_dataset_facets(datasets) + axes.set_title(multi_dataset_facets['long_name']) + axes.set_xlabel('Month') + axes.set_ylabel(f"{short_name} [{multi_dataset_facets['units']}]") + axes.set_xticks(range(1, 13), [str(m) for m in range(1, 13)]) + + # Legend + legend_kwargs = self.plots[plot_type].get('legend_kwargs', {}) + if legend_kwargs is not False: + axes.legend(**legend_kwargs) + + # Customize plot appearance + self._process_pyplot_kwargs(plot_type, multi_dataset_facets) + + # Save plot + plot_path = self.get_plot_path(plot_type, multi_dataset_facets) + fig.savefig(plot_path, **self.cfg['savefig_kwargs']) + logger.info("Wrote %s", plot_path) + plt.close() + + # Save netCDF file + netcdf_path = get_diagnostic_filename(Path(plot_path).stem, self.cfg) + var_attrs = { + n: datasets[0][n] for n in ('short_name', 'long_name', 'units') + } + io.save_1d_data(cubes, netcdf_path, 'month_number', var_attrs) + + # Provenance tracking + caption = (f"Annual cycle of {multi_dataset_facets['long_name']} for " + f"various datasets.") + provenance_record = { + 'ancestors': ancestors, + 'authors': ['schlund_manuel'], + 'caption': caption, + 'plot_types': ['seas'], + } + with ProvenanceLogger(self.cfg) as provenance_logger: + provenance_logger.log(plot_path, provenance_record) + provenance_logger.log(netcdf_path, provenance_record) def create_map_plot(self, datasets, short_name): """Create map plot.""" @@ -1033,15 +1236,18 @@ def create_map_plot(self, datasets, short_name): continue ancestors = [dataset['filename']] if ref_dataset is None: - plot_path = self._plot_map_without_ref(plot_func, dataset) + (plot_path, netcdf_paths) = ( + self._plot_map_without_ref(plot_func, dataset) + ) caption = ( f"Map plot of {dataset['long_name']} of dataset " f"{dataset['dataset']} (project {dataset['project']}) " f"from {dataset['start_year']} to {dataset['end_year']}." ) else: - plot_path = self._plot_map_with_ref(plot_func, dataset, - ref_dataset) + (plot_path, netcdf_paths) = ( + self._plot_map_with_ref(plot_func, dataset, ref_dataset) + ) caption = ( f"Map plot of {dataset['long_name']} of dataset " f"{dataset['dataset']} (project {dataset['project']}) " @@ -1062,6 +1268,10 @@ def create_map_plot(self, datasets, short_name): logger.info("Wrote %s", plot_path) plt.close() + # Save netCDFs + for (netcdf_path, cube) in netcdf_paths.items(): + io.iris_save(cube, netcdf_path) + # Provenance tracking provenance_record = { 'ancestors': ancestors, @@ -1071,6 +1281,8 @@ def create_map_plot(self, datasets, short_name): } with ProvenanceLogger(self.cfg) as provenance_logger: provenance_logger.log(plot_path, provenance_record) + for netcdf_path in netcdf_paths: + provenance_logger.log(netcdf_path, provenance_record) def create_profile_plot(self, datasets, short_name): """Create profile plot.""" @@ -1099,15 +1311,19 @@ def create_profile_plot(self, datasets, short_name): continue ancestors = [dataset['filename']] if ref_dataset is None: - plot_path = self._plot_profile_without_ref(plot_func, dataset) + (plot_path, netcdf_paths) = ( + self._plot_profile_without_ref(plot_func, dataset) + ) caption = ( f"Vertical profile of {dataset['long_name']} of dataset " f"{dataset['dataset']} (project {dataset['project']}) " f"from {dataset['start_year']} to {dataset['end_year']}." ) else: - plot_path = self._plot_profile_with_ref(plot_func, dataset, - ref_dataset) + (plot_path, netcdf_paths) = ( + self._plot_profile_with_ref(plot_func, dataset, + ref_dataset) + ) caption = ( f"Vertical profile of {dataset['long_name']} of dataset " f"{dataset['dataset']} (project {dataset['project']}) " @@ -1128,6 +1344,10 @@ def create_profile_plot(self, datasets, short_name): logger.info("Wrote %s", plot_path) plt.close() + # Save netCDFs + for (netcdf_path, cube) in netcdf_paths.items(): + io.iris_save(cube, netcdf_path) + # Provenance tracking provenance_record = { 'ancestors': ancestors, @@ -1137,12 +1357,15 @@ def create_profile_plot(self, datasets, short_name): } with ProvenanceLogger(self.cfg) as provenance_logger: provenance_logger.log(plot_path, provenance_record) + for netcdf_path in netcdf_paths: + provenance_logger.log(netcdf_path, provenance_record) def compute(self): """Plot preprocessed data.""" for (short_name, datasets) in self.grouped_input_data.items(): logger.info("Processing variable %s", short_name) self.create_timeseries_plot(datasets, short_name) + self.create_annual_cycle_plot(datasets, short_name) self.create_map_plot(datasets, short_name) self.create_profile_plot(datasets, short_name) diff --git a/esmvaltool/diag_scripts/ocean/diagnostic_transects.py b/esmvaltool/diag_scripts/ocean/diagnostic_transects.py index 57af68188c..5d74d1ebbd 100644 --- a/esmvaltool/diag_scripts/ocean/diagnostic_transects.py +++ b/esmvaltool/diag_scripts/ocean/diagnostic_transects.py @@ -261,7 +261,7 @@ def make_transects_plots( qplt.contourf(cube, 15, linewidth=0, rasterized=True) if set_y_logscale: - plt.axes().set_yscale('log') + plt.gca().set_yscale('log') if region: region_title = region @@ -381,9 +381,9 @@ def make_transect_contours( linestyles=linestyles, rasterized=True) - # Determine y log scale. + # Determine y log scale. Use gca to set scale if determine_set_y_logscale(cfg, metadata): - plt.axes().set_yscale('log') + plt.gca().set_yscale('log') add_sea_floor(cube) @@ -517,7 +517,7 @@ def multi_model_contours( } if set_y_logscale: - plt.axes().set_yscale('log') + plt.gca().set_yscale('log') title = metadatas[filename]['long_name'] units = str(model_cubes[filename][region].units) diff --git a/esmvaltool/diag_scripts/perfmetrics/collect.ncl b/esmvaltool/diag_scripts/perfmetrics/collect.ncl index fac9b64534..6381912e12 100644 --- a/esmvaltool/diag_scripts/perfmetrics/collect.ncl +++ b/esmvaltool/diag_scripts/perfmetrics/collect.ncl @@ -29,6 +29,8 @@ ; Caveats ; ; Modification history +; 20220609-bock_lisa: added gaps between project blocks and improved style +; 20211014-bock_lisa: added sorting by project ; 20190315-hassler_birgit: added SMPI case ; 20180508-righi_mattia: renamed and generalized ; 20151027-lauer_axel: moved call to 'write_references' to the beginning @@ -332,9 +334,16 @@ begin data_temp = data_all n_proj = dimsizes(diag_script_info@project_order) id1 = ind(projectnames.eq.diag_script_info@project_order(0)) + id1_mm = (/ind(data_all&models(id1) .eq. \ + diag_script_info@project_order(0) + "_mean"), \ + ind(data_all&models(id1) .eq. \ + diag_script_info@project_order(0) + "_median") /) + if(any(ismissing(id1_mm))) then + id1_mm = -1 + end if + pid1 = sort_alphabetically(data_all&models(id1), id1_mm, "begin") n1 = dimsizes(id1) breakpoints = n1 - pid1 = sort_alphabetically(data_all&models(id1), -1, "begin") if (dimsizes(dimsizes(data_all)).eq.3) then data_all(:, 0:(n1-1), :) = data_temp(:, id1(pid1), :) else @@ -342,7 +351,14 @@ begin end if if (n_proj .gt. 1) then id2 = ind(projectnames.eq.diag_script_info@project_order(1)) - pid2 = sort_alphabetically(data_temp&models(id2), -1, "begin") + id2_mm = (/ind(data_all&models(id2) .eq. \ + diag_script_info@project_order(1) + "_mean"), \ + ind(data_all&models(id2) .eq. \ + diag_script_info@project_order(1) + "_median") /) + if (any(ismissing(id2_mm))) then + id2_mm = -1 + end if + pid2 = sort_alphabetically(data_temp&models(id2), id2_mm, "begin") n2 = dimsizes(id2) breakpoints = n1 if (dimsizes(dimsizes(data_all)).eq.3) then @@ -352,7 +368,14 @@ begin end if if (n_proj .gt. 2) then id3 = ind(projectnames.eq.diag_script_info@project_order(2)) - pid3 = sort_alphabetically(data_temp&models(id3), -1, "begin") + id3_mm = (/ind(data_all&models(id3) .eq. \ + diag_script_info@project_order(2) + "_mean"), \ + ind(data_all&models(id3) .eq. \ + diag_script_info@project_order(2) + "_median") /) + if (any(ismissing(id3_mm))) then + id3_mm = -1 + end if + pid3 = sort_alphabetically(data_temp&models(id3), id3_mm, "begin") n3 = dimsizes(id3) breakpoints := array_append_record(breakpoints, n1+n2, 0) if (dimsizes(dimsizes(data_all)).eq.3) then @@ -372,7 +395,7 @@ begin ; Sort diagnostics in the order specified in the settings if (isatt(diag_script_info, "diag_order")) then l_ok = True - if (dimsizes(data_all&diagnostics).ne. \ + if (dimsizes(data_all&diagnostics).lt. \ dimsizes(diag_script_info@diag_order)) then error_msg("w", DIAG_SCRIPT, "", "specified order of diagnostics " + \ "cannot be applied, number of diagnostics does not match") diff --git a/esmvaltool/diag_scripts/perfmetrics/cycle_latlon.ncl b/esmvaltool/diag_scripts/perfmetrics/cycle_latlon.ncl index d52ce53785..da420f85c7 100644 --- a/esmvaltool/diag_scripts/perfmetrics/cycle_latlon.ncl +++ b/esmvaltool/diag_scripts/perfmetrics/cycle_latlon.ncl @@ -22,9 +22,9 @@ begin annots = project_style(info_items, diag_script_info, "annots") ; Loop over datasets - do ii = 0, dimsizes(modidx) - 1 + do ii_modidx = 0, dimsizes(modidx) - 1 - imod = modidx(ii) + imod = modidx(ii_modidx) log_debug("Processing " + datasetnames(imod)) @@ -42,6 +42,10 @@ begin ; Read data var = read_data(info_items[imod]) + if (var0 .eq. "tos" .and. var@units .eq. "K") then + var = convert_units(var, "degC") + end if + ; Convert data to floats if necessary if (typeof(var) .eq. "double") then var := dble2flt(var) @@ -71,6 +75,28 @@ begin var_all@ref_model = variable_info[0]@reference_dataset delete(var_avg) + grading_models = remove_index(datasetnames, ref_inds) + + ; Store all models in one array + if(ii_modidx .eq. 0) then + var_all_mod = new(array_append_record(dimsizes(var_all), \ + dimsizes(grading_models), 0), float) + var_all_mod!4 = "models" + var_all_mod&models = remove_index(datasetnames, ref_inds) + copy_VarAtts(diag_script_info, var_all_mod) + end if + if (l_altern) then + if (imod .ne. ref_ind .and. imod .ne. alt_ind) then + igrad = ind(datasetnames(imod) .eq. grading_models) + var_all_mod(:, :, :, :, igrad) = var_all + end if + else + if (imod.ne.ref_ind) then + igrad = ind(datasetnames(imod) .eq. grading_models) + var_all_mod(:, :, :, :, igrad) = var_all + end if + end if + ; Store reference dataset if (imod.eq.ref_ind) then var_ref = var_all @@ -131,15 +157,14 @@ begin else - locidx = ind(datasetnames(imod).eq.grading&models) - if (ismissing(locidx)) then + if (.not.any(datasetnames(imod).eq.grading&models)) then continue end if - grading(met, 0, locidx, 0) = \ + grading(met, 0, igrad, 0) = \ calculate_metric(var_all(:, :, :, 0), var_ref(:, :, :, 0), \ diag_script_info@metric(met)) if (l_altern) then - grading(met, 0, locidx, 1) = \ + grading(met, 0, igrad, 1) = \ calculate_metric(var_all(:, :, :, 0), var_alt(:, :, :, 0), \ diag_script_info@metric(met)) end if @@ -150,4 +175,70 @@ begin end do + if (diag_script_info@calc_grading .and. \ + any(diag_script_info@metric.eq."RMSD") .and. \ + all(grading_models.ne."MultiModelMean") .and. \ + all(grading_models.ne."MultiModelMedian")) then + + ; ************************************* + ; calculate means over ensemble members + ; ************************************* + + imet = ind(diag_script_info@metric.eq."RMSD") + + datasetnames := grading@models + projectnames := remove_index(projectnames, ref_inds) + + ndim := dimsizes(datasetnames) + + ; ****************************************************** + ; calculate multi-model mean and median for each project + ; ****************************************************** + + projects = get_unique_values(projectnames) + n_proj = dimsizes(projects) + + do iproj = 0, n_proj - 1 + + log_debug("Processing mean of " + projects(iproj)) + + ind_proj := ind(projectnames .eq. projects(iproj)) + + tmp := dim_avg_n_Wrap(var_all_mod(:, :, :, :, ind_proj), 4) + mean_ref = calculate_metric(tmp(:, :, :, 0), var_ref(:, :, :, 0), \ + diag_script_info@metric(imet)) + if (l_altern) then + mean_alt = calculate_metric(tmp(:, :, :, 0), var_alt(:, :, :, 0), \ + diag_script_info@metric(imet)) + end if + tmp = dim_median_n(var_all_mod(:, :, :, :, ind_proj), 4) + median_ref = calculate_metric(tmp(:, :, :, 0), var_ref(:, :, :, 0), \ + diag_script_info@metric(imet)) + if (l_altern) then + median_alt = calculate_metric(tmp(:, :, :, 0), var_alt(:, :, :, 0), \ + diag_script_info@metric(imet)) + end if + + dims = dimsizes(grading) + tmp := new((/dims(0), dims(1), dims(2) + 2, dims(3)/), float) + copy_VarAtts(grading, tmp) + tmp(imet, 0, :dims(2)-1, :) = grading(imet, 0, :, :) + tmp(imet, 0, dims(2), 0) = (/mean_ref/) + tmp(imet, 0, dims(2)+1, 0) = (/median_ref/) + if (l_altern) then + tmp(imet, 0, dims(2), 1) = (/mean_alt/) + tmp(imet, 0, dims(2)+1, 1) = (/median_alt/) + end if + + delete(grading) + grading = tmp + grading&models(dims(2)) = projects(iproj)+"_mean" + grading&models(dims(2)+1) = projects(iproj)+"_median" + grading@projects = grading@projects + " " + projects(iproj) + \ + " " + projects(iproj) + delete(tmp) + end do + + end if + end diff --git a/esmvaltool/diag_scripts/perfmetrics/cycle_zonal.ncl b/esmvaltool/diag_scripts/perfmetrics/cycle_zonal.ncl index 7c4a11e6bf..62bcff1966 100644 --- a/esmvaltool/diag_scripts/perfmetrics/cycle_zonal.ncl +++ b/esmvaltool/diag_scripts/perfmetrics/cycle_zonal.ncl @@ -19,7 +19,11 @@ begin modidx := array_append_record(ref_ind, modidx(ind(modidx.ne.ref_ind)), 0) end if - annots = project_style(info_items, diag_script_info, "annots") + if (isatt(diag_script_info, "annots")) then + annots = metadata_att_as_array(info_items, diag_script_info@annots) + else + annots = project_style(info_items, diag_script_info, "annots") + end if ; Loop over datasets do ii = 0, dimsizes(modidx) - 1 diff --git a/esmvaltool/diag_scripts/perfmetrics/main.ncl b/esmvaltool/diag_scripts/perfmetrics/main.ncl index a11fc06ad3..0d683d6ef7 100644 --- a/esmvaltool/diag_scripts/perfmetrics/main.ncl +++ b/esmvaltool/diag_scripts/perfmetrics/main.ncl @@ -43,6 +43,8 @@ ; zonal_ymin (for zonal): minimum pressure on the plots (default: 5. hPa) ; latlon_cmap (for latlon): color table (default: "amwg_blueyellowred") ; plot_units: plotting units (if different from standard CMOR units) +; add_tropopause: add an optional tropopause outline to the zonal plots +; res_*: any resource as applied to ncl gsn_csm_press_hgt plots ; ; Required variable_info attributes: ; reference_dataset: reference dataset to compare with (usualy observations) @@ -53,6 +55,10 @@ ; Caveats ; ; Modification history +; 20221209-winterstein_franziska: added optional tropopause and plotting +; 20220609-bock_lisa: added calculation of multi-model mean and median for +; each project +; 20211014-bock_lisa: added sorting by project ; 20200506-gier_bettina: implemented support for multiple occurence of ; models with different experiments and ensembles ; 20190405-righi_mattia: added provenance logging @@ -104,11 +110,23 @@ begin enter_msg(DIAG_SCRIPT, "") + vars = metadata_att_as_array(variable_info, "short_name") + ; Get variables and datasets var0 = variable_info[0]@short_name info_items = select_metadata_by_name(input_file_info, var0) nDatasets = ListCount(info_items) + if (dimsizes(vars) .gt. 1) then + var1 = variable_info[1]@short_name + info_items_1 = select_metadata_by_name(input_file_info, var1) + cnt = ListCount(info_items_1) + do ii = 0, cnt - 1 + ListAppend(info_items, info_items_1[ii]) + end do + nDatasets = ListCount(info_items) + end if + ; Check required diag_script_info attributes exit_if_missing_atts(diag_script_info, (/"plot_type", "time_avg", "region"/)) @@ -146,6 +164,7 @@ begin set_default_att(diag_script_info, "zonal_ymin", 5.) set_default_att(diag_script_info, "zonal_cmap", "amwg_blueyellowred") set_default_att(diag_script_info, "latlon_cmap", "amwg_blueyellowred") + set_default_att(diag_script_info, "add_tropopause", False) ; Check consistency of diff plots settings if (diag_script_info@t_test .and. .not.diag_script_info@plot_diff) then @@ -441,23 +460,19 @@ begin diag_script_info@metric(met) + ".nc" if (fileexists(temp_dir)) then - temp_file = addfile(temp_dir, "r") - temp_list = temp_file->temp_list - temp_list := tostring(temp_list) - temp_list := array_append_record(temp_list, ncdf_dir(met), 0) - temp_list := tochar(temp_list) system("rm -f " + temp_dir) - else - ncdf_char = tochar(ncdf_dir(met)) - temp_list = new((/1, dimsizes(ncdf_char)/), character) - temp_list(0, :) = ncdf_char end if + ncdf_char = tochar(ncdf_dir(met)) + temp_list = new((/1, dimsizes(ncdf_char)/), character) + temp_list(0, :) = ncdf_char + delete(ncdf_char) + ; Create new file and add list temp = addfile(temp_dir, "c") temp->temp_list = temp_list - delete([/metric, temp_dir, temp_list, ncdf_char/]) + delete([/metric, temp_dir, temp_list/]) end do diff --git a/esmvaltool/diag_scripts/perfmetrics/zonal.ncl b/esmvaltool/diag_scripts/perfmetrics/zonal.ncl index 2af49c3e44..788c465625 100644 --- a/esmvaltool/diag_scripts/perfmetrics/zonal.ncl +++ b/esmvaltool/diag_scripts/perfmetrics/zonal.ncl @@ -14,7 +14,13 @@ begin modidx = ispan(0, nDatasets - 1, 1) modidx := array_append_record(ref_ind, modidx(ind(modidx.ne.ref_ind)), 0) - annots = project_style(info_items, diag_script_info, "annots") + if (isatt(diag_script_info, "annots")) then + annots = metadata_att_as_array(info_items, diag_script_info@annots) + else + annots = project_style(info_items, diag_script_info, "annots") + end if + + print(annots) ; Loop over datasets do ii = 0, dimsizes(modidx) - 1 @@ -111,6 +117,7 @@ begin plot_var@res_trYMinF = diag_script_info@zonal_ymin plot_var@res_gsnLeftString = \ plot_var@long_name + " [" + format_units(plot_var@units) + "]" + copy_VarMeta(diag_script_info, plot_var) wks = gsn_open_wks(file_type, plotpath_abs) gsn_define_colormap(wks, diag_script_info@zonal_cmap) plot = zonalmean_profile(wks, plot_var, var0) @@ -171,11 +178,11 @@ begin plot_var@res_cnLevelSelectionMode = "ExplicitLevels" plot_var@res_cnLevels := diag_script_info@conf_level if (diag_script_info@stippling) then - plot_var@res_cnFillColors = (/"transparent", "black"/) + plot_var@res_cnFillColors = (/"black", "transparent"/) plot_var@res_cnFillPattern = 17 caption = caption + " (non-significant points are stippled)" else - plot_var@res_cnFillColors = (/"transparent", "gray70"/) + plot_var@res_cnFillColors = (/"gray70", "transparent"/) caption = caption + " (non-significant points are masked out in gray)" end if plot_var@res_cnInfoLabelOn = False diff --git a/esmvaltool/diag_scripts/regional_downscaling/Figure9.38.ncl b/esmvaltool/diag_scripts/regional_downscaling/Figure9.38.ncl new file mode 100644 index 0000000000..e8844107e2 --- /dev/null +++ b/esmvaltool/diag_scripts/regional_downscaling/Figure9.38.ncl @@ -0,0 +1,822 @@ +; ########### ############################################################### +; # ANNUAL CYCLE CONTOUR PLOTS OF REGIONAL MEANS # +; ############################################################################# +; # Author: Irene Cionni(ENEA, Italy) # +; # CRESCENDO project +; ############################################################################# +; # +; # Description +; # * Creates annual cycle regional plots for individual models and +; # multi model over the selected project&experiment&mip +; # - Read regions +; # - select the regions +; # - calculate annual cycle for each model +; # - evaluate the MMM over selected project&experiment&mip +; # - plot the individual models annual cycle +; # - plot the MMMs annual cycle and standard deviations +; # +; # Optional diag_script_info attributes: +; # +; # * styleset, default "CMIP5" +; # * fig938_region_label: +; # (/"WNA","ENA","CAM","TSA","SSA","EUM","NAF","CAF","SAF", +; # "NAS","CAS","EAS","SAS","SEA","AUS"/) +; # these reagions are defined in function select_region +; # (./diag_scripts/regional_downscaling/regional_function.ncl) +; # according to a personal comunication of Sin Chan Chou, default "WNA" +; # * fig938_project_MMM: projects to average, default "CMIP5" +; # * fig938_experiment_MMM: experiments to average, default "historical" +; # * fig938_mip_MMM: mip to average, default "Amon" +; # * fig938_names_MMM: names in legend, default "CMIP5" +; # * fig938_colors_MMM: colors, default "red" +; # * fig938_YMin : minimum Y Axis +; # * fig938_YMax : maximum Y Axis +; # * fig938_diff: difference to reference data (true) or +; # absolute annual cycle (false), default: true +; # +; # fig938_mip_MMM, fig938_experiment_MMM, fig938_project_MMM, +; # fig938_names_MMM, and fig938_colors_MMM +; # must have the same number of elements i.e. +; # fig938_project_MMM=(/"CMIP5", "CMIP3"/) +; # fig938_experiment_MMM=(/"historical", "historical"/) +; # fig938_mip_MMM=(/"Amon", "Amon"/) +; # fig938_names_MMM=(/"CMIP5","CMIP3"/) +; # fig938_colors_MMM:=(/"red","blue"/) +; # +; # +; # +; # Caveats: +; # +; # Comments: +; # Regions borders are polygons defined in function select_region_938 +; # in regional_function.ncl +; # +; # Modification history: +; # 20230127-weigel_katja: Update for absolute annual cycle including +; # new fig938_diff attribute +; # and bug fixes in index of data sets/models and +; # color for regions +; # 20221026-weigel_katja: header updated +; # 20220314-weigel_katja: header updated +; # original file anncycplot.ncl +; # # +; ############################################################### +load "$diag_scripts/../interface_scripts/interface.ncl" + +load "$diag_scripts/shared/statistics.ncl" +load "$diag_scripts/shared/scaling.ncl" +load "$diag_scripts/shared/plot/aux_plotting.ncl" +load "$diag_scripts/shared/plot/style.ncl" +load "$diag_scripts/regional_downscaling/regional_function.ncl" + + +begin + enter_msg(DIAG_SCRIPT, "") + var0 = variable_info[0]@short_name + units = variable_info[0]@units + info0 = select_metadata_by_name(input_file_info, var0) + dim_MOD1 = ListCount(info0) + names = metadata_att_as_array(info0, "dataset") + projects = metadata_att_as_array(info0, "project") + exps = metadata_att_as_array(info0, "exp") + ensembles = metadata_att_as_array(info0, "ensemble") + mips = metadata_att_as_array(info0, "mip") + y1 = metadata_att_as_array(info0, "start_year") + y2 = metadata_att_as_array(info0, "end_year") + long_name = variable_info[0]@long_name + if (isatt(variable_info[0], "reference_dataset")) then + refname = variable_info[0]@reference_dataset + do imod = 0, dimsizes(names) - 1 + if (names(imod) .eq. refname) then + iref = imod + end if + end do + else + error_msg("f", DIAG_SCRIPT, "", "no reference dataset " + \ + "(variable_info[0]@reference_dataset) needs to be defined.") + end if + if(isatt(variable_info, "units")) then + units = variable_info@units + else + units = "K" + end if + if(isatt(variable_info, "long_name")) then + LONG_NAME = variable_info@long_name + else + LONG_NAME = var0 + end if + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT + " (var: " + var0 + ")") + log_info("++++++++++++++++++++++++++++++++++++++++++") + + ; Set default values for optional diag_script_info attributes + + set_default_att(diag_script_info, "fig938_region_label", "WNA") + set_default_att(diag_script_info, "styleset", "CMIP5") + set_default_att(diag_script_info, "fig938_MMM", "True") + set_default_att(diag_script_info, "fig938_project_MMM", "CMIP5") + set_default_att(diag_script_info, "fig938_experiment_MMM", "historical") + set_default_att(diag_script_info, "fig938_mip_MMM", "Amon") + set_default_att(diag_script_info, "fig938_names_MMM", \ + diag_script_info@fig938_project_MMM) + set_default_att(diag_script_info, "fig938_colors_MMM", "red") + set_default_att(diag_script_info, "refModel", "ERA-Interim") + set_default_att(diag_script_info, "fig938_diff", "True") + colors = project_style(info0, diag_script_info, "colors") + dashes = project_style(info0, diag_script_info, "dashes") + thicks = tofloat(project_style(info0, diag_script_info, "thicks")) + markers = project_style(info0, diag_script_info, "markers") + lin_mar_mod = new((/dimsizes(colors)/), "string") + lin_mar_mod = (/"Lines"/) + + if (isatt(diag_script_info, "refModel")) then + idx_ref = ind(names .eq. diag_script_info@refModel) + if (all(ismissing(idx_ref))) then + error_msg("f", diag_script, "", "refModel is not included in " + \ + "model list (namelist)") + end if + p_ref = "ref_" + else + idx_ref = -1 + p_ref = "" + end if + region_label = tostring(diag_script_info@fig938_region_label) + dim_reg = dimsizes(region_label) + latrange = new((/dimsizes(region_label), 2/), "double") + lonrange = new((/dimsizes(region_label), 2/), "double") + do ir = 0, dimsizes(region_label) - 1 + region = select_region1(region_label(ir)) + latrange(ir, :) = region(0:1) + lonrange(ir, :) = region(2:3) + end do + flag_mod = where(projects.ne."OBS" .and.projects.ne."OBS6"\ + .and. projects.ne."obs4mips", 1, 0) + index_mod = ind(flag_mod.gt.0) + index_obs = ind(flag_mod.eq.0) + dim_MOD = dimsizes(index_mod) + dim_OBS = 0 + + if (.not.all(ismissing(index_obs))) then + dim_OBS = dimsizes(index_obs) + list_obs_mod = names(index_obs) + end if + ; make sure path for (mandatory) netcdf output exists + + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + +end +begin + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "Figure9_38_" + var0) + wks_r = get_wks("dummy_for_wks", DIAG_SCRIPT, "Figure9_38_regions_" + var0) + wks_l = get_wks("dummy_for_wks", DIAG_SCRIPT, "Figure9_38_legend_" + var0) + if (diag_script_info@fig938_MMM.eq."True") + wks_MMM = get_wks("dummy_for_wks", DIAG_SCRIPT, "Figure9_38_MMM_" + var0) + end if + ; ****************************************************************** + ; common resources for plots + pan = True + res = True + res@gsnDraw = False + res@gsnFrame = False + res@vpHeightF = 0.6 + res@vpWidthF = 0.8 + ; res@txFontHeightF = 0.018 + months = ispan(0, 12, 1) + + res@tiMainFontHeightF = 0.022 + res@tmXBMode = "Explicit" + res@tmXBValues = ispan(0, 12, 1) + res@tmXBLabels = (/"J", "F", "M", "A", "M", "J", "J", "A", "S", \ + "O", "N", "D", "J"/) + res@tmXBLabelFontHeightF = 0.035 + res@tmYLLabelFontHeightF = 0.035 + res@tiXAxisString = " " + res@tiYAxisString = " " + res@xyLineDashSegLenF = 0.5 +; ------------res1-------------------------------------------------- + + pan1 = True + res1 = True + res1@gsnDraw = False + res1@gsnFrame = False + ; res1@txFontHeightF = 0.02 + res1@tiMainFontHeightF = 0.02 + res1@tmXBMode = "Explicit" + res1@tmXBValues = ispan(0, 12, 1) + res1@tmXBLabels = (/"J", "F", "M", "A", "M", "J", "J", "A", "S", \ + "O", "N", "D", "J"/) + res1@vpHeightF = 0.6 + res1@vpWidthF = 0.8 + res1@tmXBLabelFontHeightF = 0.035 + res1@tmYLLabelFontHeightF = 0.035 + res1@tiXAxisString = " " + res1@tiYAxisString = " " + res1@xyLineDashSegLenF = 0.5 + ; ************************select MMM********************* + dim_MMM = 1 + if (diag_script_info@fig938_MMM.eq."True") + if (dimsizes(diag_script_info@fig938_project_MMM).eq.\ + dimsizes(diag_script_info@fig938_experiment_MMM).eq.\ + dimsizes(diag_script_info@fig938_mip_MMM)) then + dim_MMM = dimsizes(diag_script_info@fig938_project_MMM) + indic_s = new((/dimsizes(diag_script_info@fig938_project_MMM),\ + dimsizes(names)/), "integer") + indic_not_s = new((/dimsizes(diag_script_info@fig938_project_MMM),\ + dimsizes(names)/), "integer") + do ik = 0, dimsizes(diag_script_info@fig938_project_MMM) - 1 + ii_s = ind((projects.eq.diag_script_info@fig938_project_MMM(ik)).and.\ + (exps.eq.diag_script_info@fig938_experiment_MMM(ik)).and.\ + (mips.eq.diag_script_info@fig938_mip_MMM(ik))) + indic_s(ik, :dimsizes(ii_s) - 1) = ii_s + delete(ii_s) + + ii_not_s = \ + ind((projects.ne.diag_script_info@fig938_project_MMM(ik))\ + .or.(exps.ne.diag_script_info@fig938_experiment_MMM(ik))\ + .or.(mips.ne.diag_script_info@fig938_mip_MMM(ik))) + indic_not_s(ik, :dimsizes(ii_not_s)-1) = ii_not_s + delete(ii_not_s) + end do + else + error_msg("f", diag_script, "", "diag_script_info@fig938_project_MMM" + \ + "diag_script_info@fig938_experiment_MMM and" + \ + " diag_script_info@fig938_experiment_MMM" + \ + " must have the same dimension") + end if + end if + if (dimsizes(diag_script_info@fig938_project_MMM).gt.1) then + indic_not_sela = get_unique_difference(indic_s, indic_not_s) + else + ndim = ndtooned(indic_not_s) + ise = ind(.not.ismissing(ndim)) + indic_not_sela = ndim(ise) + delete(ise) + delete(ndim) + end if + plot = new(dim_reg, "graphic") + plot_MMM = new(dim_reg, "graphic") + plot_STD = new((/dim_reg, dim_MMM/), "graphic") + + ; map = new(dimsizes(region_label), "graphic") + map_r = new(1, "graphic") + mres_r = True + mres_r@gsnDraw = False + mres_r@gsnFrame = False + mres_r@lbLabelBarOn = False + mres_r@cnLevelSelectionMode = "ManualLevels" + mres_r@cnMinLevelValF = 0. + mres_r@cnMaxLevelValF = 200.0 + mres_r@cnMaxLevelCount = 42.0 + mres_r@cnLevelSpacingF = max((/5.0, 200.0/tofloat(dim_reg + 2.0)/)) + mres_r@cnInfoLabelOn = False + mres_r@cnLineLabelsOn = False + mres_r@cnFillOn = True + mres_r@cnFillOpacityF = 0.5 + cmap_r = read_colormap_file("GMT_wysiwygcont") + mres_r@cnFillPalette = cmap_r(::-1, :) + mres_r@mpFillOn = True + txres = True + txres@txFontHeightF = 0.015 + txres@txFont = 22 + txres@txJust = "CenterLeft" + + random_setallseed(36484749, 9494848) + unf = random_uniform(0, 1, (/dim_reg + 2/)) + ip = dim_pqsort(unf, 1) + + do ir = 0, dim_reg - 1 + case1 = region_label(ir) + if(idx_ref.ne.-1) then + if (diag_script_info@fig938_MMM.eq."True") + if ((diag_script_info@fig938_diff.eq."True").and.(idx_ref.ne.-1)) then + indic_s = where(indic_s.eq.idx_ref, indic_s@_FillValue, indic_s) + indic_not_sel = where(indic_not_sela.eq.idx_ref,\ + indic_not_sela@_FillValue, indic_not_sela) + if(.not.(any(ismissing(indic_not_sel)))) then + indic_not_sel1 = indic_not_sel(ind(.not.ismissing(indic_not_sel))) + delete(indic_not_sel) + indic_not_sel = indic_not_sel1 + delete(indic_not_sel1) + end if + else + indic_not_sel = indic_not_sela + end if + end if + + if (diag_script_info@fig938_diff.eq."True") then + pan@txString = LONG_NAME + " bias vs. " + names(idx_ref) + else + pan@txString = LONG_NAME + end if + D = new((/dim_MOD1, 13/), "double") + models = new((/dim_MOD1/), "string") + C = new((/dim_MOD1 - 1, 13/), "double") + models1 = new((/dim_MOD1 - 1/), "string") + colors1 = new((/dim_MOD1 - 1/), typeof(colors)) + dashes1 = new((/dim_MOD1 - 1/), typeof(dashes)) + thicks1 = new((/dim_MOD1 - 1/), typeof(thicks)) + markers1 = new((/dim_MOD1 - 1/), typeof(markers)) + lin_mar_mod1 = new((/dim_MOD1 - 1/), "string") + ; (b) difference of each model from 'reference' + ; CASE 1 + A0 = read_data(info0[idx_ref]) + ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ; Get infos for map plot + lsdata = A0(0, :, :) + cell_fill = (/select_region_938(region_label(ir), lsdata)/) + cell_fill!0 = "lat" + cell_fill!1 = "lon" + cell_fill&lat = lsdata&lat + cell_fill&lon = lsdata&lon + irc = (ip(ir + 1)) * 200.0/tofloat(dim_reg + 2) + + if (ir.eq.0) then + cell_fill2 = where(ismissing(cell_fill), -1., irc) + cell_fill2!0 = "lat" + cell_fill2!1 = "lon" + cell_fill2&lat = lsdata&lat + cell_fill2&lon = lsdata&lon + else + cell_fill2 = where(ismissing(cell_fill), cell_fill2, irc) + end if + ; ***************************************************************** + Atmp1 = A0 + Atmp = area_operations(Atmp1, latrange(ir, 0), latrange(ir, 1), \ + lonrange(ir, 0), lonrange(ir, 1), "average",\ + True) + delete(A0) + if (Atmp@units.eq."K") then + A = convert_units(Atmp, "degC") ; get Celsius + UNITS = "~S~o~N~C" + else + if (Atmp@units.eq."kg m-2 s-1") then + A = convert_units(Atmp, "mm/day") + UNITS = "mm/day" + else + A = (/Atmp/) + UNITS = units + end if + end if + ; end if + delete(Atmp) + delete(Atmp1) + + jmod = 0 + do imod = 0, dim_MOD1 - 1 + models(imod) = names(imod) + if (imod .ne. idx_ref) then + B0 = read_data(info0[imod]) + Btmp1 = B0 + Btmp = area_operations(Btmp1, latrange(ir, 0), latrange(ir, 1), \ + lonrange(ir, 0), lonrange(ir, 1), "average",\ + True) + delete(B0) + if (Btmp@units.eq."K") then + B = convert_units(Btmp, "degC") ; get Celsius + UNITS = "~S~o~N~C" + else + if (Btmp@units.eq."kg m-2 s-1") then + B = convert_units(Btmp, "mm/day") + UNITS = "mm/day" + else + B = (/Btmp/) + UNITS = units + end if + end if + delete(Btmp) + delete(Btmp1) + + ; --------------------------------------------------------- + ; difference plot of time(x) vs. latitude(y) + + if (diag_script_info@fig938_diff.eq."True") then + C(jmod, 0:11) = (/A - B/) ; get diff values + C(jmod, 12) = (/A(0) - B(0)/) + D(imod, 0:11) = (/A - B/) + D(imod, 12) = (/A(0) - B(0)/) + else + C(jmod, 0:11) = (/B/) + C(jmod, 12) = (/B(0)/) + D(imod, 0:11) = (/B/) + D(imod, 12) = (/B(0)/) + end if + + delete(B) + colors1(jmod) = colors(imod) + dashes1(jmod) = dashes(imod) + thicks1(jmod) = thicks(imod) + markers1(jmod) = markers(imod) + models1(jmod) = names(imod) + lin_mar_mod1(jmod) = "Lines" + jmod = jmod + 1 + end if + end do ; imod + else + if (diag_script_info@fig938_MMM.eq."True") + if ((diag_script_info@fig938_diff.eq."True").and.(idx_ref.ne.-1)) then + indic_s = where(indic_s.eq.idx_ref, indic_s@_FillValue, indic_s) + indic_not_sel = where(indic_not_sela.eq.idx_ref,\ + indic_not_sela@_FillValue, indic_not_sela) + if(.not.(any(ismissing(indic_not_sel)))) then + indic_not_sel1 = indic_not_sel(ind(.not.ismissing(indic_not_sel))) + delete(indic_not_sel) + indic_not_sel = indic_not_sel1 + delete(indic_not_sel1) + end if + else + indic_not_sel = indic_not_sela + end if + end if + lin_mar_mod1 = lin_mar_mod + C = new((/dim_MOD1, 13/), "double") + do imod = 0, dim_MOD1 - 1 + ; CASE 1 + pan@txString = LONG_NAME + A0 = read_data(info0[imod]) + Atmp1 = A0 + Atmp = area_operations(Atmp1, latrange(ir, 0), latrange(ir, 1), \ + lonrange(ir, 0), lonrange(ir, 1), "average",\ + True) + delete(A0) + if (Atmp@units.eq."K") then + A = convert_units(Atmp, "degC") ; get Celsius + UNITS = "~S~o~N~C" + else + if (Atmp@units.eq."kg m-2 s-1") then + A = convert_units(Atmp, "mm/day") + UNITS = "mm/day" + else + A = (/Atmp/) + UNITS = units + end if + end if + delete(Atmp) + delete(Atmp1) + C(imod, 0:11) = A + C(imod, 12) = A(0) + lin_mar_mod1(imod) = "Lines" + end do + + colors1 = colors + dashes1 = dashes + thicks1 = thicks + markers1 = markers + models1 = names + end if + + ; case contour plots of time(x) vs. latitude(y) + + ; res@tiMainString =variable_info@long_name + if (diag_script_info@fig938_diff.eq."True") then + E = C + else + E = D + E(idx_ref, 0:11) = (/A/) + E(idx_ref, 12) = (/A(0)/) + end if + if (diag_script_info@fig938_diff.eq."True") then + Ehlp = reshape(E, (/13*(dim_MOD1 - 1)/)) + else + Ehlp = reshape(E, (/13*dim_MOD1/)) + end if + if (any(.not.ismissing(Ehlp))) then + min1 = min(Ehlp(ind(.not.ismissing(Ehlp)))) + max1 = max(Ehlp(ind(.not.ismissing(Ehlp)))) + else + min1 = 0.0 + max1 = 1.0 + end if + if (isatt(diag_script_info, "fig938_YMin")) then + res@trYMinF = diag_script_info@Figure_938_YMin + else + res@trYMinF = min1 + end if + if (isatt(diag_script_info, "fig938_YMax")) then + res@trYMaxF = diag_script_info@Figure_938_YMax + else + res@trYMaxF = max1 + end if + if (diag_script_info@fig938_diff.eq."True") then + res@xyLineColors = colors1 ; line colors + res@xyLineThicknesses = thicks1 ; line thicknesses + res@xyDashPatterns = dashes1 ; line patterns + else + res@xyLineColors = colors ; line colors + res@xyLineThicknesses = thicks ; line thicknesses + res@xyDashPatterns = dashes ; line patterns + end if + + res@gsnLeftString = case1 + res@gsnLeftStringFontHeightF = 0.04 + res@gsnRightString = UNITS + res@gsnRightStringFontHeightF = 0.04 + res@tfPolyDrawOrder = "Draw" + + plot(ir) = gsn_csm_xy(wks, months, E, res) + + ; ******************single region output file************************** + + nc_filename = work_dir + "fig938_" + var0 + ".nc" + E@var = var0 + "_" + case1 + E@diag_script = "fig938" + E!0 = "line" + E!1 = "month" + month_n = (/"J", "F", "M", "A", "M", "J", "J", "A", "S", \ + "O", "N", "D", "J"/) + + if (diag_script_info@fig938_diff.eq."True") then + E&line = models1 + else + E&line = models + end if + E&month = month_n + + if (ir .eq. 0) then + E@existing = "overwrite" + else + E@existing = "append" + end if + + nc_outfile = ncdf_write(E, nc_filename) + + ; ******************single region output file************************** + + if (diag_script_info@fig938_MMM.eq."True") + if ((diag_script_info@fig938_diff.ne."True").and.(idx_ref .ne. -1)) then + if(.not.all(ismissing(indic_not_sel))) then + if (any(indic_not_sel.eq.idx_ref)) then + dim_extr = dimsizes(indic_not_sel) + else + dim_extr = dimsizes(indic_not_sel) + 1 + end if + else + dim_extr = 1 + end if + else + if(.not.all(ismissing(indic_not_sel))) then + dim_extr = dimsizes(indic_not_sel) + else + dim_extr = 0 + end if + end if + + MMM = new((/dimsizes(diag_script_info@fig938_project_MMM) +\ + dim_extr, 13/), typeof(C)) + STD = new((/dimsizes(diag_script_info@fig938_project_MMM) + \ + dim_extr, 13/), typeof(C)) + names_MMM = new((/dimsizes(diag_script_info@fig938_project_MMM) + \ + dim_extr/), "string") + colors_MMM = new((/dimsizes(diag_script_info@fig938_project_MMM) + \ + dim_extr/), typeof(colors)) + thicks_MMM = new((/dimsizes(diag_script_info@fig938_project_MMM) + \ + dim_extr/), typeof(thicks)) + dashes_MMM = new((/dimsizes(diag_script_info@fig938_project_MMM) + \ + dim_extr/), typeof(dashes)) + lin_mar_mod_MMM = new((/dimsizes(diag_script_info@fig938_project_MMM) + \ + dim_extr/), typeof(lin_mar_mod1)) + colori_def = (/"red", "blue", "green", "magenta", "yellow"/) + do iin = 0, dimsizes(diag_script_info@fig938_project_MMM) - 1 + aa = indic_s(iin, ind(.not.ismissing(indic_s(iin, :)))) + if (idx_ref .ne. -1) + D!0 = "case" + MMM(iin, :) = dim_avg_n_Wrap(D(aa, :), 0) + STD(iin, :) = dim_stddev_n_Wrap(D(aa, :), 0) + else + C!0 = "case" + MMM(iin, :) = dim_avg_n_Wrap(C(aa, :), 0) + STD(iin, :) = dim_stddev_n_Wrap(C(aa, :), 0) + end if + delete(aa) + if(isatt(diag_script_info, "fig938_colors_MMM")) then + colors_MMM(iin) = diag_script_info@fig938_colors_MMM(iin) + else + colors_MMM(iin) = colori_def(iin) + end if + thicks_MMM(iin) = 3. + dashes_MMM(iin) = 0 + lin_mar_mod_MMM(iin) = "Lines" + if(isatt(diag_script_info, "fig938_names_MMM")) then + names_MMM(iin) = diag_script_info@fig938_names_MMM(iin) + else + names_MMM(iin) = diag_script_info@fig938_project_MMM(iin) + " " + \ + diag_script_info@fig938_experiment_MMM(iin) + \ + " " + diag_script_info@fig938_mip_MMM(iin) + end if + end do + if(.not.all(ismissing(indic_not_sel))) then + if (idx_ref .ne. -1) + MMM(dimsizes(diag_script_info@fig938_project_MMM):, :) = \ + (/E(indic_not_sel(ind(.not.ismissing(indic_not_sel))), :)/) + colors_MMM(dimsizes(diag_script_info@fig938_project_MMM):) = \ + colors(indic_not_sel(ind(.not.ismissing(indic_not_sel)))) + thicks_MMM(dimsizes(diag_script_info@fig938_project_MMM):) = 3. + dashes_MMM(dimsizes(diag_script_info@fig938_project_MMM):) = \ + dashes(indic_not_sel(ind(.not.ismissing(indic_not_sel)))) + lin_mar_mod_MMM(dimsizes(diag_script_info@fig938_project_MMM):) = \ + lin_mar_mod(indic_not_sel(ind(.not.ismissing(indic_not_sel)))) + names_MMM(dimsizes(diag_script_info@fig938_project_MMM):) = \ + models(indic_not_sel(ind(.not.ismissing(indic_not_sel)))) + else + MMM(dimsizes(diag_script_info@fig938_project_MMM):, :) = \ + (/C(indic_not_sel, :)/) + colors_MMM(dimsizes(diag_script_info@fig938_project_MMM):) = \ + colors1(indic_not_sel) + thicks_MMM(dimsizes(diag_script_info@fig938_project_MMM):) = 3. + dashes_MMM(dimsizes(diag_script_info@fig938_project_MMM):) = \ + dashes1(indic_not_sel) + lin_mar_mod_MMM(dimsizes(diag_script_info@fig938_project_MMM):) = \ + lin_mar_mod1(indic_not_sel) + names_MMM(dimsizes(diag_script_info@fig938_project_MMM):) = \ + models1(indic_not_sel) + end if + end if + end if + if(isatt(diag_script_info, "fig938_YMin")) then + res1@trYMinF = diag_script_info@fig938_YMin + else + res1@trYMinF = min1 + end if + + if(isatt(diag_script_info, "fig938_YMax")) then + res1@trYMaxF = diag_script_info@fig938_YMax + else + res1@trYMaxF = max1 + end if + + res1@xyLineColors = colors_MMM ; line colors + res1@xyLineThicknesses = thicks_MMM ; line thicknesses + res1@xyDashPatterns = dashes_MMM ; line patterns + res1@gsnLeftString = case1 + res1@gsnRightString = UNITS + res1@gsnLeftStringFontHeightF = 0.04 + res1@gsnRightStringFontHeightF = 0.04 + res1@tfPolyDrawOrder = "Draw" + plot_MMM(ir) = gsn_csm_xy(wks_MMM, months, MMM, res1) + xp = new((/2 * 13/), typeof(MMM)) + yp = new((/2 * 13, dimsizes(diag_script_info@fig938_project_MMM)/), \ + typeof(MMM)) + do k = 0, 12 + yp(k, :) = MMM(:dimsizes(diag_script_info@fig938_project_MMM) - 1, k) + \ + STD(:dimsizes(diag_script_info@fig938_project_MMM) - 1, k) + xp(k) = months(k) + xp(2 * 13 - 1 - k) = months(k) + yp(2 * 13 - 1 - k, :) = \ + MMM(:dimsizes(diag_script_info@fig938_project_MMM) - 1, k) \ + - STD(:dimsizes(diag_script_info@fig938_project_MMM) - 1, k) + end do + do iin = 0, dimsizes(diag_script_info@fig938_project_MMM) - 1 + gsres = True + gsres@gsFillColor = colors_MMM(iin) + gsres@gsFillOpacityF = 0.3 + plot_STD(ir, iin) = gsn_add_polygon(wks_MMM, plot_MMM(ir), xp,\ + yp(:, iin), gsres) + end do + + ; ******************single region output file************************** + + nc_filename_MMM = work_dir + "fig938_" + var0 + "_MMM.nc" + MMM@var = var0 + "_" + case1 + MMM@diag_script = "fig938" + month_n = (/"J", "F", "M", "A", "M", "J", "J", "A", "S", \ + "O", "N", "D", "J"/) + MMM!0 = "line" + MMM!1 = "month" + MMM&line = names_MMM + MMM&month = month_n + + if (ir .eq. 0) then + MMM@existing = "overwrite" + else + MMM@existing = "append" + end if + + nc_outfile = ncdf_write(MMM, nc_filename_MMM) + + ; ******************single region output file************************** + + nc_filename_STD = work_dir + "fig938_" + var0 + "_STD.nc" + STD@var = var0 + "_" + case1 + STD@diag_script = "fig938" + month_n = (/"J", "F", "M", "A", "M", "J", "J", "A", "S", \ + "O", "N", "D", "J"/) + STD!0 = "line" + STD!1 = "month" + STD&line = names_MMM + STD&month = month_n + + if (ir .eq. 0) then + STD@existing = "overwrite" + else + STD@existing = "append" + end if + + nc_outfile = ncdf_write(STD, nc_filename_STD) + + ; ******************single region output file************************** + + delete(min1) + delete(max1) + delete(C) + delete(MMM) + delete(STD) + delete(xp) + delete(yp) + delete(indic_not_sel) + delete(A) + delete(E) + delete(Ehlp) + end do ; region + + ; Panel plots + pan = True + pan@gsnMaximize = True + pan@gsnFrame = False + pan@gsnPaperOrientation = "portrait" + n_p = dimsizes(plot) / 5 + if (mod(dimsizes(plot), 5) .ne. 0) then + n_p = n_p + 1 + end if + gsn_panel(wks, plot, (/n_p, 5/), pan) + frame(wks) + + ; ***********add legend**************************** + if (diag_script_info@fig938_diff.eq."True") then + add_legenda_page(wks_l, models1, colors1, dashes1, lin_mar_mod1,\ + thicks1, "0.9") + else + add_legenda_page(wks_l, models, colors, dashes, lin_mar_mod,\ + thicks, "0.9") + end if + frame(wks_l) + + if (diag_script_info@fig938_MMM.eq."True") + pan1 = True + pan1@gsnMaximize = True + pan1@gsnFrame = False + pan1@gsnPaperOrientation = "portrait" + n_p = dimsizes(plot_MMM) / 5 + if (mod(dimsizes(plot_MMM), 5) .ne. 0) then + n_p = n_p + 1 + end if + gsn_panel(wks_MMM, plot_MMM, (/n_p, 5/), pan1) + add_legend(wks_MMM, names_MMM, colors_MMM,\ + dashes_MMM, lin_mar_mod_MMM, thicks_MMM, "0.2") + ; end if + end if + frame(wks_MMM) + delete(plot_MMM) + delete(res1) + delete(pan1) + + map_r = gsn_csm_contour_map(wks_r, cell_fill2, mres_r) + + do ir = 0, dim_reg - 1 + txres@txFontColor = "black" + region_array_hlp = select_region1(region_label(ir)) + dum = gsn_add_text(wks_r, map_r, region_label(ir),\ + region_array_hlp(2) + 5.0, region_array_hlp(0) + 15.0,\ + txres) + delete(region_array_hlp) + end do + draw(map_r) + frame(wks_r) + + ; ------------------------------------------------------------- + ; Add provenance + ; ------------------------------------------------------------- + + caption = "Mean seasonal cycle for " + var0 + " over " + \ + "land in different regions" + + log_provenance(nc_filename, \ + wks@fullname, \ + caption, \ + (/"clim"/), \ + (/"reg"/), \ + "seas", \ + (/"cionni_irene"/), \ + (/"flato13ipcc"/), \ + metadata_att_as_array(info0, "filename")) + + if (diag_script_info@fig938_MMM .eq. "True") + + log_provenance(nc_filename_MMM, \ + wks_MMM@fullname, \ + caption, \ + (/"clim"/), \ + (/"reg"/), \ + "seas", \ + (/"cionni_irene"/), \ + (/"flato13ipcc"/), \ + metadata_att_as_array(info0, "filename")) + + end if + + +end diff --git a/esmvaltool/diag_scripts/regional_downscaling/Figure9.39.ncl b/esmvaltool/diag_scripts/regional_downscaling/Figure9.39.ncl new file mode 100644 index 0000000000..96ebeb27d7 --- /dev/null +++ b/esmvaltool/diag_scripts/regional_downscaling/Figure9.39.ncl @@ -0,0 +1,782 @@ +; ############################################################################# +; # SEASONAL OR ANNUAL BIAS # +; ############################################################################# +; # Author: Irene Cionni(ENEA, Italy) # +; # CRESCENDO project +; ############################################################################# +; +; # Description: # +; # * Create seasonal or annual bias box plots at selected regions # +; # - Read regions +; # -create mask map using region poligons +; # - for all the models calculate the bias reference_dataset +; # - sort biases for each selected project&experiment&mip +; # - evaluate percentiles (5th 25th 50th 75th 95th) +; # - plot the first selected project&experiment&mip as box-and-whisker +; # - plot the others selected projects&experiment&mip as markers +; # - compare the root-mean-square error of first project&experiment&mip +; # with the second if exist labeled with red for the regions where +; # the first error is larger than the second. +; # +; # Required variable_info attributes (variable specific): +; # +; # * reference_dataset: reference dataset name +; # +; # Optional diag_script_info attributes: +; # +; # * styleset, default "CMIP5" +; # * fig939_season : seasons i.e. (/"DJF","JJA","ANN"/) +; # * fig939_region_label : +; # (/"ALA","CGI","WNA","CNA","ENA","CAM","AMZ","NEB","WSA","SSA","NEU", +; # "CEU","MED","SAH","WAF","EAF","SAF","NAS","WAS","CAS","TIB","EAS", +; # "SAS","SEA","NAU","SAU"/) +; # these region are defined in Seneviratne et al., 2012: Appendix 3.A +; # Notes and technical details on Chapter 3 figures. +; # In: Managing the Risks of Extreme Events and Disasters to Advance +; # Climate Change Adaptation(IPCC). . +; # * fig939_MMM, default: True +; # * fig939_project_MMM: projects to average +; # * fig939_experiment_MMM: experiments to average +; # * fig939_mip_MMM: mip to average +; # * Dimensions of fig939_project_MMM, fig939_experiment_MMM and +; # fig939_mip_MMM must have the number of elements i.e. +; # fig939_project_MMM=(/"CMIP5", "CMIP3"/) +; # fig939_experiment_MMM=(/"historical", "historical"/) +; # fig939_mip_MMM=(/"Amon", "Amon"/) +; # +; # * Names for legend +; # fig939_names_MMM :names in legend i.e. (/"CMIP5","CMIP3"/ +; # * Vertical lines divide groups of region +; # fig939_vert_line_pos +; # i.e. (/6,10,13,17,24,26/) +; # * labels of vertical lines +; # fig939_vert_line_label +; # e.g. (/"North America","South America","Europe","Africa", +; # "Asia","Australia"/) +; # fig939_mode : True= cumulative mode +; # fig939_YMin : minimum Y Axis +; # fig939_YMax : maximum Y Axis +; # fig939_percentage : default: False +; # Caveats: +; # This script requires NCL version 6.40 +; # +; # Comments: +; # Regions borders are polygons defined in function select_region_srex +; # in regional_function.ncl +; # +; # Modification history: +; # 20230110-weigel_katja: fixed calendar, calendar starting point needs to +; # including time: "months since 1-1-1 00:00:00" +; # and converting month number to time Axis +; # with -1.0 +; # 20230111-weigel_katja: added option for percentage difference +; # 20230110-weigel_katja: fixed calendar, calendar starting point needs to +; # including time: "months since 1-1-1 00:00:00" +; # and converting month number to time Axis +; # with -1.0 +; # 20221026-weigel_katja: header updated +; # 20221026-weigel_katja: fixed calendar, time_operations expects +; # "gregorian" instead of "Gregorian" +; # 20221026-weigel_katja: removed unused variable fig939_colors_MMM +; # 20221026-weigel_katja: removed unused variable refModel +; # (reference_dataset instead) +; # 20220314-weigel_katja: header updated +; ############################################################### +load "$diag_scripts/../interface_scripts/interface.ncl" + +load "$diag_scripts/shared/statistics.ncl" +load "$diag_scripts/shared/plot/aux_plotting.ncl" +load "$diag_scripts/shared/plot/style.ncl" +load "$diag_scripts/regional_downscaling/regional_function.ncl" + + +begin + enter_msg(DIAG_SCRIPT, "") + var0 = variable_info[0]@short_name + UNITS = variable_info[0]@units + info0 = select_metadata_by_name(input_file_info, var0) + dim_MOD1 = ListCount(info0) + names = metadata_att_as_array(info0, "dataset") + projects = metadata_att_as_array(info0, "project") + exps = metadata_att_as_array(info0, "exp") + ensembles = metadata_att_as_array(info0, "ensemble") + mips = metadata_att_as_array(info0, "mip") + y1 = metadata_att_as_array(info0, "start_year") + y2 = metadata_att_as_array(info0, "end_year") + long_name = variable_info[0]@long_name + if (isatt(variable_info[0], "reference_dataset")) then + refname = variable_info[0]@reference_dataset + do imod = 0, dimsizes(names) - 1 + if (names(imod) .eq. refname) then + idx_ref = imod + end if + end do + else + error_msg("f", DIAG_SCRIPT, "", "no reference dataset " + \ + "(variable_info[0]@reference_dataset) needs to be defined.") + end if + if(isatt(variable_info, "long_name")) then + LONG_NAME = variable_info@long_name + else + LONG_NAME = var0 + end if + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT + " (var: " + var0 + ")") + log_info("++++++++++++++++++++++++++++++++++++++++++") + + ; Set default values for optional diag_script_info attributes + + set_default_att(diag_script_info, "fig939_region_label", "ALAs") + set_default_att(diag_script_info, "styleset", "CMIP5") + set_default_att(diag_script_info, "fig939_MMM", "True") + set_default_att(diag_script_info, "fig939_project_MMM", "CMIP5") + set_default_att(diag_script_info, "fig939_experiment_MMM", "historical") + set_default_att(diag_script_info, "fig939_mip_MMM", "Amon") + ; set_default_att(diag_script_info, "fig939_colors_MMM", "red") + set_default_att(diag_script_info, "fig939_names_MMM", \ + diag_script_info@fig939_project_MMM) + set_default_att(diag_script_info, "fig939_season", "DJF") + set_default_att(diag_script_info, "fig939_percentage", "False") + + colors = project_style(info0, diag_script_info, "colors") + dashes = project_style(info0, diag_script_info, "dashes") + thicks = tofloat(project_style(info0, diag_script_info, "thicks")) + markers = project_style(info0, diag_script_info, "markers") + lin_mar_mod = new((/dimsizes(colors)/), "string") + lin_mar_mod = (/"Lines"/) + season = diag_script_info@fig939_season + mode = new(1, logical) + if(isatt(diag_script_info, "fig939_mode")) then + mode = True + else + mode = False + end if + region_label = tostring(diag_script_info@fig939_region_label) + dim_reg = dimsizes(region_label) + dim_seas = dimsizes(season) + + flag_mod = where(projects.ne."OBS" .and.projects.ne."OBS6"\ + .and. projects.ne."obs4mips", 1, 0) + index_mod = ind(flag_mod.gt.0) + index_obs = ind(flag_mod.eq.0) + dim_MOD = dimsizes(index_mod) + dim_OBS = 0 + + if (.not.all(ismissing(index_obs))) then + dim_OBS = dimsizes(index_obs) + list_obs_mod = names(index_obs) + end if + ; make sure path for (mandatory) netcdf output exists + + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + +end +begin + dim_MMM = 1 + + project_MMM = diag_script_info@fig939_project_MMM + exp_MMM = diag_script_info@fig939_experiment_MMM + mip_MMM = diag_script_info@fig939_mip_MMM + if (diag_script_info@fig939_MMM.eq."True") + if (dimsizes(project_MMM).eq.dimsizes(exp_MMM).eq.dimsizes(mip_MMM)) then + dim_MMM = dimsizes(project_MMM) + indic_s = new((/dimsizes(project_MMM),\ + dimsizes(names)/), "integer") + indic_not_s = new((/dimsizes(project_MMM),\ + dimsizes(names)/), "integer") + do ik = 0, dimsizes(diag_script_info@fig939_project_MMM) - 1 + ii_s = ind((projects.eq.project_MMM(ik))\ + .and.(exps.eq.exp_MMM(ik))\ + .and.(mips.eq.mip_MMM(ik))) + indic_s(ik, :dimsizes(ii_s) - 1) = ii_s + delete(ii_s) + ii_not_s = ind((projects.ne.project_MMM(ik)).or.(exps.ne.exp_MMM(ik))\ + .or.(mips.ne.mip_MMM(ik))) + indic_not_s(ik, :dimsizes(ii_not_s) - 1) = ii_not_s + delete(ii_not_s) + end do + else + error_msg("f", diag_script, "", "diag_script_info@fig939_project_MMM" + \ + "diag_script_info@fig939_experiment_MMM and" + \ + " diag_script_info@fig939_experiment_MMM" + \ + " must have the same dimension") + end if + end if + + if (dimsizes(project_MMM).gt.1) then + indic_not_sela = get_unique_difference(indic_s, indic_not_s) + else + ndim = ndtooned(indic_not_s) + ise = ind(.not.ismissing(ndim)) + indic_not_sela = ndim(ise) + delete(ise) + delete(ndim) + end if + MMM = new((/dim_seas, dim_reg, dimsizes(project_MMM) +\ + dimsizes(indic_not_sela), 6/), "double") + names_MMM = new((/dimsizes(project_MMM)/), "string") + MMM_rmse = new((/dim_seas, dim_reg, dimsizes(project_MMM)/), "double") + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "Figure9_39_" + var0) + wks_r = get_wks("dummy_for_wks", DIAG_SCRIPT, "Figure9_39_regions_" + var0) + wks_l = get_wks("dummy_for_wks", DIAG_SCRIPT, "Figure9_39_legend_" + var0) + ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Amask = read_data(info0[idx_ref]) + lsdata = Amask(0, :, :) + lsdata = where(ismissing(lsdata), 1., lsdata) + ; ***************************************************************** + map_r = new(1, "graphic") + plot = new(dim_seas, "graphic") + dum_ref = new(dim_seas, "graphic") + dum1 = new((/dim_seas, dimsizes(project_MMM)/),\ + "graphic") + dum2 = new((/dim_seas, dimsizes(project_MMM)/),\ + "graphic") + dum3 = new((/dim_seas, dimsizes(project_MMM)/),\ + "graphic") + dum4 = new((/dim_seas, dimsizes(project_MMM)/),\ + "graphic") + dum5 = new((/dim_seas, dimsizes(project_MMM)/),\ + "graphic") + dum_lines = new((/dim_seas, 30/), "graphic") + dum_txt = new((/dim_seas, 30/), "graphic") + mres_r = True + mres_r@gsnDraw = False + mres_r@gsnFrame = False + mres_r@lbLabelBarOn = False + mres_r@cnLevelSelectionMode = "ManualLevels" + mres_r@cnMinLevelValF = 0. + mres_r@cnMaxLevelValF = 200.0 + mres_r@cnMaxLevelCount = 42.0 + mres_r@cnLevelSpacingF = max((/5.0, 200.0/tofloat(dim_reg + 2.0)/)) + mres_r@cnInfoLabelOn = False + mres_r@cnLineLabelsOn = False + mres_r@cnFillOn = True + mres_r@cnFillOpacityF = 0.5 + cmap_r = read_colormap_file("GMT_wysiwygcont") + mres_r@cnFillPalette = cmap_r(::-1, :) + mres_r@mpFillOn = True + gsres = True + gsres@gsFillOpacityF = 0.7 + txres = True + txres@txFontHeightF = 0.012 + txres@txFont = 22 + txres@txJust = "CenterLeft" + + random_setallseed(36484749, 9494848) + unf = random_uniform(0, 1, (/dim_reg + 2/)) + ip = dim_pqsort(unf, 1) + + do iseas = 0, dim_seas - 1 + do ir = 0, dim_reg - 1 + case1 = region_label(ir) + cell_fill = (/select_region_srex(region_label(ir), lsdata)/) + cell_fill!0 = "lat" + cell_fill!1 = "lon" + cell_fill&lat = lsdata&lat + cell_fill&lon = lsdata&lon + + if (iseas.eq.0) then + irc = (ip(ir + 1)) * 200.0/tofloat(dim_reg + 2.0) + + if (ir.eq.0) then + cell_fill2 = where(ismissing(cell_fill), -1., irc) + cell_fill2!0 = "lat" + cell_fill2!1 = "lon" + cell_fill2&lat = lsdata&lat + cell_fill2&lon = lsdata&lon + else + cell_fill2 = where(ismissing(cell_fill), cell_fill2, irc) + end if + end if + cell_fill = where(ismissing(cell_fill), -1., 1.) + if (diag_script_info@fig939_MMM.eq."True") + indic_s = where(indic_s.eq.idx_ref, indic_s@_FillValue, indic_s) + indic_not_sel = where(indic_not_sela.eq.idx_ref,\ + indic_not_sela@_FillValue, indic_not_sela) + if(.not.ismissing(all(indic_not_sel))) then + indic_not_sel1 = indic_not_sel(ind(.not.ismissing(indic_not_sel))) + delete(indic_not_sel) + indic_not_sel = indic_not_sel1 + delete(indic_not_sel1) + end if + end if + D = new((/dim_MOD+1/), "double") + C = new((/dim_MOD/), "double") + models1 = new((/dim_MOD/), "string") + colors1 = new((/dim_MOD/), typeof(colors)) + dashes1 = new((/dim_MOD/), typeof(dashes)) + thicks1 = new((/dim_MOD/), typeof(thicks)) + markers1 = new((/dim_MOD/), typeof(markers)) + lin_mar_mod1 = new((/dim_MOD/), "string") + ; (b) difference of each model from 'reference' + ; CASE 1 In this plot only case1 exsist!!!!! + ; case1 = models@name(idx_ref) + " " + models@case_name(idx_ref) + A0 = read_data(info0[idx_ref]) + if (season(iseas).ne."ANN") then + if (mode) then + A0!0 = "time" + time1 = todouble(A0&time - 1.0) + time1!0 = "time" + ; ys=input_file_info[idx_ref]@start_year + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(A0&time) + A0&time = time1 + delete(time1) + Atmp3 = time_operations(A0, -1, -1, "extract", season(iseas), True) + date3 = cd_calendar(Atmp3&time, 0) + year3 = date3(:, 0) + month3 = date3(:, 1) + weights3 = days_in_month(toint(year3), toint(month3)) + Atmp4 = Atmp3 + Atmp4 = (/Atmp3 * conform(Atmp3, weights3, 0)/) + Atmp1 = dim_sum_n_Wrap(Atmp4, 0) + delete(Atmp3) + delete(Atmp4) + delete(date3) + delete(year3) + delete(month3) + delete(weights3) + else + A0!0 = "time" + time1 = todouble(A0&time - 1.0) + time1!0 = "time" + ; ys=input_file_info[idx_ref]@start_yea + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(A0&time) + A0&time = time1 + Atmp1 = time_operations(A0, -1, -1, "average", season(iseas), True) + end if + else + if (mode) then + A0!0 = "time" + time1 = todouble(A0&time - 1.0) + time1!0 = "time" + ; ys=input_file_info[idx_ref]@start_year + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(A0&time) + A0&time = time1 + Atmp3 = A0 + date3 = cd_calendar(Atmp3&time, 0) + year3 = date3(:, 0) + month3 = date3(:, 1) + weights3 = days_in_month(toint(year3), toint(month3)) + Atmp4 = Atmp3 + Atmp4 = (/Atmp3 * conform(Atmp3, weights3, 0)/) + Atmp1 = dim_sum_n_Wrap(Atmp4, 0) + delete(Atmp3) + delete(Atmp4) + delete(date3) + delete(year3) + delete(month3) + delete(weights3) + else + A0!0 = "time" + time1 = todouble(A0&time - 1.0) + time1!0 = "time" + ; ys=input_file_info[idx_ref]@start_year + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(A0&time) + A0&time = time1 + Atmp1 = time_operations(A0, -1, -1, "average", "annualclim", True) + end if + end if + ; ******************mask region********************* + Atmp1 = mask(Atmp1, cell_fill.eq.-1, False) + ; ************************************************** + Atmp = area_operations(Atmp1, -90., 90., 0., 360., "average", True) + delete(A0) + A = Atmp + delete(Atmp) + delete(Atmp1) + jmod = 0 + do imod = 0, dim_MOD - 1 + if (imod .ne. idx_ref) then + B0 = read_data(info0[imod]) + if (season(iseas).ne."ANN") then + if (mode) then + B0!0 = "time" + time1 = todouble(B0&time - 1.0) + time1!0 = "time" + ; ys = input_file_info[idx_ref]@start_year + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(B0&time) + B0&time = time1 + Btmp3 = time_operations(B0, -1, -1, "extract",\ + season(iseas), True) + + date3 = cd_calendar(Btmp3&time, 0) + year3 = date3(:, 0) + month3 = date3(:, 1) + weights3 = days_in_month(toint(year3), toint(month3)) + Btmp4 = Btmp3 + Btmp4 = (/Btmp3 * conform(Btmp3, weights3, 0)/) + Btmp1 = dim_sum_n_Wrap(Btmp4, 0) + delete(Btmp3) + delete(Btmp4) + delete(date3) + delete(year3) + delete(month3) + delete(weights3) + else + B0!0 = "time" + time1 = todouble(B0&time - 1.0) + time1!0 = "time" + ; ys=input_file_info[idx_ref]@start_year + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(B0&time) + B0&time = time1 + Btmp1 = time_operations(B0, -1, -1, "average",\ + season(iseas), True) + end if + else + if (mode) then + Btmp3 = B0 + Btmp3!0 = "time" + time1 = todouble(Btmp3&time - 1.0) + time1!0 = "time" + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(Btmp3&time) + Btmp3&time = time1 + date3 = cd_calendar(Btmp3&time, 0) + year3 = date3(:, 0) + month3 = date3(:, 1) + weights3 = days_in_month(toint(year3), toint(month3)) + Btmp4 = Btmp3 + Btmp4 = (/Btmp3 * conform(Btmp3, weights3, 0)/) + Btmp1 = dim_sum_n_Wrap(Btmp4, 0) + delete(Btmp3) + delete(Btmp4) + delete(date3) + delete(year3) + delete(month3) + delete(weights3) + else + B0!0 = "time" + time1 = todouble(B0&time - 1.0) + time1!0 = "time" + ; ys = input_file_info[idx_ref]@start_year + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(B0&time) + B0&time = time1 + Btmp1 = time_operations(B0, -1, -1, "average", "annualclim",\ + True) + end if + end if + ; ******************mask region********************** + Btmp1 = mask(Btmp1, cell_fill.eq.-1, False) + ; ************************************************** + Btmp = area_operations(Btmp1, -90., 90., 0., 360., "average", True) + delete(B0) + B = Btmp + delete(Btmp) + delete(Btmp1) + ; -------------------------------------------------------- + ; Bias + if (mode) then + print("cumulative mode") + C(jmod) = (/ 100 * (avg(B) - avg(A)) / avg(A)/) + D(imod) = (/100 * (avg(B) - avg(A)) / avg(A)/) + else + C(jmod) = (/avg(B) - avg(A)/) ; get diff values + D(imod) = (/avg(B) - avg(A)/) + end if + + if (UNITS.eq."K") then + UNITS = "~S~o~N~C" + else + if (mode) then + UNITS = "%" + else + UNITS = variable_info[0]@units + end if + end if + + delete(B) + colors1(jmod) = colors(imod) + dashes1(jmod) = dashes(imod) + thicks1(jmod) = thicks(imod) + markers1(jmod) = markers(imod) + models1(jmod) = names(imod) + lin_mar_mod1(jmod) = "Lines" + jmod = jmod + 1 + end if + end do ; imod + delete(A) + if (diag_script_info@fig939_MMM.eq."True") + colori_def = (/"red", "orange", "green", "blue", "purple"/) + scatters_def = (/0, 5, 16, 4, 7, 8, 12/) + do iin = 0, dimsizes(diag_script_info@fig939_project_MMM) - 1 + if (.not.all(ismissing(indic_s(iin, :)))) then + aa = indic_s(iin, ind(.not.ismissing(indic_s(iin, :)))) + end if + F = D(aa) + qsort(F) + dimt = dimsizes(F) + x5 = round(.05 * dimt, 3) - 1 + x25 = round(.25 * dimt, 3) - 1 + x50 = round(.50 * dimt, 3) - 1 + x75 = round(.75 * dimt, 3) - 1 + x95 = round(.95 * dimt, 3) - 1 + x5 = where(x5.lt.0, 0, x5) + x25 = where(x25.lt.0, 0, x25) + x50 = where(x50.lt.0, 0, x50) + x75 = where(x75.lt.0, 0, x75) + x95 = where(x95.lt.0, 0, x95) + MMM_rmse(iseas, ir, iin) = (sum(F ^ 2) / dimt) ^ 0.5 + MMM(iseas, ir, iin, :) = (/F(x5), F(x25), F(x50),\ + F(x75), F(x95), stddev(F)/) + delete(aa) + delete(F) + delete(dimt) + + ; if(isatt(diag_script_info, "fig939_markers_MMM")) then + ; markers_MMM(iin) = diag_script_info@fig939_markers_MMM(iin) + ; else + ; markers_MMM(iin) = scatters_def(iin) + ; end if + + ; markers_MMM(iin) = 0 + + if(isatt(diag_script_info, "fig939_names_MMM")) then + names_MMM(iin) = diag_script_info@fig939_names_MMM(iin) + else + names_MMM(iin) = diag_script_info@fig939_project_MMM(iin) + " " +\ + diag_script_info@fig939_experiment_MMM(iin) +\ + " " + diag_script_info@fig939_mip_MMM(iin) + end if + end do + if (.not.ismissing(all(indic_not_sela))) then + MMM(iseas, ir, dimsizes(diag_script_info@fig939_project_MMM):, 0) =\ + (/D(indic_not_sela)/) + end if + end if + delete(C) + delete(D) + end do + res = True ; plot mods desired + ; add * if first project root mean square error is larger than the second + region_label1 = region_label + colors_reg = new(dimsizes(region_label), "string") + do irg = 0, dimsizes(region_label) - 1 + if (dim_MMM.gt.1) then + if (MMM_rmse(iseas, irg, 0).gt.MMM_rmse(iseas, irg, 1)) then + region_label1(irg) = region_label(irg) + "*" + colors_reg(irg) = "red" + else + region_label1(irg) = region_label(irg) + colors_reg(irg) = "blue" + end if + else + colors_reg(irg) = "blue" + end if + end do + + ind_blue = ind(colors_reg.eq."blue") + ind_red = ind(colors_reg.eq."red") + res@ind_blue = ind_blue + res@ind_red = ind_red + res@tmXBLabels = region_label1 + res@tmXBLabelFontHeightF = 0.017 + res@tiMainString = "bias, " + long_name + \ + " ("+UNITS+"), " + season(iseas) + if(isatt(diag_script_info, "fig939_YMin")) then + res@trYMinF = diag_script_info@fig939_YMin + else + res@trYMinF = min(MMM) - min(MMM) / 5 + end if + + if (isatt(diag_script_info, "fig939_YMax")) then + res@trYMaxF = diag_script_info@fig939_YMax + else + res@trYMaxF = max(MMM) + max(MMM) / 5 + end if + res@tmXBLabelAngleF = 90. + res@vpHeightF = 0.5 + res@vpWidthF = 0.9 + ; res@gsnYRefLine=0.0 + ; res@gsnYRefLineColor="gray11" + ; res@gsnYRefLineDashPattern=1. + plot(iseas) = box_plot_cr(wks, ispan(1, dim_reg, 1),\ + MMM(iseas, :, 0, :), False, res, False) + if (isatt(diag_script_info, "fig939_vert_line_pos")) then + lines_x = diag_script_info@fig939_vert_line_pos + do ilin = 0, dimsizes(lines_x) - 1 + dres = True + dres@gsLineColor = "gray11" + dres@gsLineDashPattern = 2. + dum_lines(iseas, ilin) = gsn_add_polyline(wks, plot(iseas),\ + (/lines_x(ilin) + 0.5,\ + lines_x(ilin) + 0.5/),\ + (/min(MMM) - avg(MMM) / 10,\ + max(MMM) + \ + avg(MMM) / 10/),\ + dres) + end do + if (isatt(diag_script_info, "fig939_vert_line_label")) then + lab_x = diag_script_info@fig939_vert_line_label + + do itxt = 0, dimsizes(lab_x) - 1 + txres = True + txres@txFontHeightF = 0.02 + txres@txAngleF = 90. + txres@txJust = "BottomRight" + dum_txt(iseas, itxt) = gsn_add_text(wks, plot(iseas), lab_x(itxt),\ + lines_x(itxt) + 0.4,\ + min(MMM) - min(MMM) / 4,\ + txres) + end do + end if + end if + rres = True + rres@gsLineColor = "gray11" + rres@gsLineDashPattern = 1. + dum_ref(iseas) = gsn_add_polyline(wks, plot(iseas), (/0., 100./),\ + (/0., 0./), rres) + do iin = 1, dimsizes(diag_script_info@fig939_project_MMM) - 1 + mres = True ; marker mods desired + mres@gsMarkerIndex = scatters_def(iin) ; polymarker style + mres@gsMarkerSizeF = 0.008 * 26 / dim_reg + mres@gsMarkerThicknessF = 2. + mres@gsMarkerColor = "purple" ; polymarker color + dum1(iseas, iin) = gsn_add_polymarker(wks, plot(iseas),\ + ispan(1, dim_reg, 1),\ + MMM(iseas, :, iin, 0), mres) + mres@gsMarkerColor = "blue" ; polymarker color + dum2(iseas, iin) = gsn_add_polymarker(wks, plot(iseas),\ + ispan(1, dim_reg, 1),\ + MMM(iseas, :, iin, 1),\ + mres) + mres@gsMarkerColor = "green" ; polymarker color + dum3(iseas, iin) = gsn_add_polymarker(wks, plot(iseas),\ + ispan(1, dim_reg, 1), \ + MMM(iseas, :, iin, 2), \ + mres) + mres@gsMarkerColor = "orange" ; polymarker color + dum4(iseas, iin) = gsn_add_polymarker(wks, plot(iseas),\ + ispan(1, dim_reg, 1),\ + MMM(iseas, :, iin, 3),\ + mres) + mres@gsMarkerColor = "red" ; polymarker color + dum5(iseas, iin) = gsn_add_polymarker(wks, plot(iseas), \ + ispan(1, dim_reg, 1),\ + MMM(iseas, :, iin, 4), mres) + end do + delete(ind_blue) + delete(ind_red) + delete(res@ind_blue) + delete(res@ind_red) + end do + + ; ******************single region output file************************** + + print(work_dir) + nc_filename_MMM = work_dir + "fig939_" + var0 + "_MMM.nc" + MMM@var = var0 + MMM@diag_script = "fig939" + MMM!0 = "season" + MMM!1 = "region" + MMM!2 = "line" + MMM!3 = "stat" + dsizes_x = dimsizes(MMM) + nline = dsizes_x(2) + MMM&line = new((/nline/), "string") ; (/"None", "None", "None"/) + MMM&season = season + MMM®ion = region_label + MMM&stat = (/"x5", "x25", "x50", "x75", "x95", "stddev"/) + nc_outfile = ncdf_write(MMM, nc_filename_MMM) + + pan = True + pan@gsnMaximize = True + pan@gsnFrame = False + pan@gsnPaperOrientation = "portrait" + n_p = dimsizes(plot) / 3 + if (mod(dimsizes(plot), 3) .ne. 0) then + n_p = n_p + 1 + end if + gsn_panel(wks, plot, (/3, n_p/), pan) + frame(wks) + res1 = True ; plot mods desired + res1@tmXTLabels = names_MMM + res1@tmXTValues = ispan(1, dimsizes(diag_script_info@fig939_project_MMM)\ + + 1, 1) + res1@vpHeightF = 0.5 + res1@vpWidthF = 0.5 + lg_y = new((/1, 6/), "float") + lg_y(0, 0:4) = (/5., 25., 50., 75., 95./) + plot_lg = box_plot_lg(wks_l, 1, lg_y, False, res1, False) + duml1 = new(dimsizes(project_MMM), "graphic") + duml2 = new(dimsizes(project_MMM), "graphic") + duml3 = new(dimsizes(project_MMM), "graphic") + duml4 = new(dimsizes(project_MMM), "graphic") + duml5 = new(dimsizes(project_MMM), "graphic") + do iin = 1, dimsizes(project_MMM) - 1 + mresl = True ; marker mods desired + mresl@gsMarkerIndex = scatters_def(iin) ; polymarker style + ; mresl@gsMarkerSizeF = 60./dim_reg ; polymarker size + mresl@gsMarkerSizeF = 0.025 * 26 / dim_reg + mresl@gsMarkerThicknessF = 3. + mresl@gsMarkerColor = "purple" ; polymarker color + duml1(iin) = gsn_add_polymarker(wks_l, plot_lg, iin + 1, lg_y(0, 0), mresl) + mresl@gsMarkerColor = "blue" ; polymarker color + duml2(iin) = gsn_add_polymarker(wks_l, plot_lg, iin + 1, lg_y(0, 1), mresl) + mresl@gsMarkerColor = "green" ; polymarker color + duml3(iin) = gsn_add_polymarker(wks_l, plot_lg, iin + 1, lg_y(0, 2), mresl) + mresl@gsMarkerColor = "orange" ; polymarker color + duml4(iin) = gsn_add_polymarker(wks_l, plot_lg, iin + 1, lg_y(0, 3), mresl) + mresl@gsMarkerColor = "red" ; polymarker color + duml5(iin) = gsn_add_polymarker(wks_l, plot_lg, iin + 1, lg_y(0, 4), mresl) + end do + draw(plot_lg) + delete(pan) + delete(n_p) + frame(wks_l) + pan = True + pan@gsnMaximize = True + pan@gsnFrame = False + pan@gsnPaperOrientation = "portrait" + map_r = gsn_csm_contour_map(wks_r, cell_fill2, mres_r) + + do ir = 0, dim_reg - 1 + txres@txFontColor = "black" + cregion_array = (/select_region_srex_poly(region_label(ir))/) + dum = gsn_add_text(wks_r, map_r, region_label(ir),\ + cregion_array(0), cregion_array(1), txres) + delete(cregion_array) + end do + draw(map_r) + frame(wks_r) +; info_output("wrote " + output_dir + output_filename, verbosity, 1) +; info_output(">>>>>>>> Leaving " + diag_script, verbosity, 4) + + ; ------------------------------------------------------------- + ; Add provenance + ; ------------------------------------------------------------- + + caption = "Seasonal- and annual mean biases of " + var0 + " over " + \ + "land in different regions" + + log_provenance(nc_filename_MMM, \ + wks@fullname, \ + caption, \ + (/"diff", "mean", "perc"/), \ + (/"reg"/), \ + "box", \ + (/"cionni_irene"/), \ + (/"flato13ipcc", "seneviratne12ipcc"/), \ + metadata_att_as_array(info0, "filename")) + +end diff --git a/esmvaltool/diag_scripts/regional_downscaling/Figure9.40.ncl b/esmvaltool/diag_scripts/regional_downscaling/Figure9.40.ncl new file mode 100644 index 0000000000..744e3d7b66 --- /dev/null +++ b/esmvaltool/diag_scripts/regional_downscaling/Figure9.40.ncl @@ -0,0 +1,830 @@ +; ########### ############################################################### +; # SEASONAL OR ANNUAL BIAS # +; ############################################################################# +; # Author: Irene Cionni(ENEA, Italy) # +; # CRESCENDO project +; ############################################################################# +; +; # Description: +; # * Create seasonal or annual bias box plots at selected regions +; # - Read regions +; # -create mask map using region poligons +; # - for all the models calculate the bias respect reference_dataset +; # - sort biases for each selected project&experiment&mip +; # - evaluate percentiles (5th 25th 50th 75th 95th) +; # - plot the first selected project&experiment&mip as box-and-whisker +; # - plot the others selected projects&experiment&mip as markers +; # - compare the root-mean-square error of first project&experiment&mip +; # with the second if exist labeled with red for the regions where +; # the first error is larger than the second. +; # +; # Required variable_info attributes (variable specific): +; # +; # * reference_dataset: reference dataset name +; # +; # Optional diag_script_info attributes +; # +; # *styleset, default "CMIP5" +; # * fig940_season : seasons i.e. (/"DJF","JJA","ANN"/), default "DJF" +; # * fig940_region_label :(/(/"Arctic_land","Arctic_sea",\ +; # "Antarctic_land",\ +; # "Antarctic_sea","Caribbean",\ +; # "WesternIndianOcean",\ +; # "NorthernIndianOcean","NorthernTropicalPacific",\ +; # "EquatorialTropicalPacific",\ +; # "SouthernTropicalPacific",\ +; # "World_land","World_sea","World"/) +; # these region are defined in Seneviratne et al., 2012: Appendix 3.A +; # Notes and technical details on Chapter 3 figures. +; # In: Managing the Risks of Extreme Events and Disasters to Advance +; # Climate Change Adaptation(IPCC). . +; # default "Arctic_land" +; # * fig940_MMM, default True +; # * fig940_project_MMM: projects to average, deafault "CMIP5" +; # * fig940_experiment_MMM: experiments to average, default "historical" +; # * fig940_mip_MMM: mip to average +; # * Dimensions of fig940_project_MMM, fig940_experiment_MMM and +; # fig940_mip_MMM must be the same i.e. +; # fig940_project_MMM=(/"CMIP5", "CMIP3"/) +; # fig940_experiment_MMM=(/"historical", "historical"/) +; # fig940_mip_MMM=(/"Amon", "Amon"/), default "Amon" +; # * fig940_names_MMM:names in legend i.e. (/"CMIP5","CMIP3"/) +; # default fig940_project_MMM +; # * Vertical lines divide groups of region +; # fig940_vert_line_pos +; # i.e. (/6,10,13,17,24,26/) +; # * labels of vertical lines +; # fig940_vert_line_label +; # e.g.(/"North America", "South America", "Europe", "Africa", +; # "Asia", "Australia"/) +; # * fig940_mode : True= cumulative mode +; # * fig940_YMin : minimum Y Axis +; # * fig940_YMax : maximum Y Axis +; # +; # Caveats: +; # This script requires NCL version 6.40 +; # +; # Comments: +; # Regions borders are polygons defined in function select_region_srex +; # in regional_function.ncl +; # +; # Modification history: +; # 20230110-weigel_katja: fixed calendar, calendar starting point needs to +; # including time: "months since 1-1-1 00:00:00" +; # and converting month number to time Axis +; # with -1.0 +; # 20221026-weigel_katja: header updated +; # 20221026-weigel_katja: fixed calendar, time_operations expects +; # "gregorian" instead of "Gregorian" +; # 20221026-weigel_katja: removed unused variable fig940_colors_MMM +; # 20221026-weigel_katja: removed unused variable refModel +; # (reference_dataset instead) +; # 20221024-weigel_katja: Figure9_40_regions fixed +; # 20220314-weigel_katja: header updated +; # +; # # +; ############################################################### +load "$diag_scripts/../interface_scripts/interface.ncl" + +load "$diag_scripts/shared/statistics.ncl" +load "$diag_scripts/shared/plot/aux_plotting.ncl" +load "$diag_scripts/shared/plot/style.ncl" +load "$diag_scripts/regional_downscaling/regional_function.ncl" + + +begin + enter_msg(DIAG_SCRIPT, "") + var0 = variable_info[0]@short_name + UNITS = variable_info[0]@units + info0 = select_metadata_by_name(input_file_info, var0) + dim_MOD1 = ListCount(info0) + names = metadata_att_as_array(info0, "dataset") + projects = metadata_att_as_array(info0, "project") + exps = metadata_att_as_array(info0, "exp") + ensembles = metadata_att_as_array(info0, "ensemble") + mips = metadata_att_as_array(info0, "mip") + y1 = metadata_att_as_array(info0, "start_year") + y2 = metadata_att_as_array(info0, "end_year") + long_name = variable_info[0]@long_name + if (isatt(variable_info[0], "reference_dataset")) then + refname = variable_info[0]@reference_dataset + do imod = 0, dimsizes(names) - 1 + if (names(imod) .eq. refname) then + idx_ref = imod + end if + end do + else + error_msg("f", DIAG_SCRIPT, "", "no reference dataset " + \ + "(variable_info[0]@reference_dataset) needs to be defined.") + end if + if(isatt(variable_info, "long_name")) then + LONG_NAME = variable_info@long_name + else + LONG_NAME = var0 + end if + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT + " (var: " + var0 + ")") + log_info("++++++++++++++++++++++++++++++++++++++++++") + + ; Set default values for optional diag_script_info attributes + + set_default_att(diag_script_info, "fig940_region_label", "Arctic_land") + set_default_att(diag_script_info, "styleset", "CMIP5") + set_default_att(diag_script_info, "fig940_MMM", "True") + set_default_att(diag_script_info, "fig940_project_MMM", "CMIP5") + set_default_att(diag_script_info, "fig940_experiment_MMM", "historical") + set_default_att(diag_script_info, "fig940_mip_MMM", "Amon") + set_default_att(diag_script_info, "fig940_names_MMM", \ + diag_script_info@fig940_project_MMM) + set_default_att(diag_script_info, "fig940_season", "DJF") + + colors = project_style(info0, diag_script_info, "colors") + dashes = project_style(info0, diag_script_info, "dashes") + thicks = tofloat(project_style(info0, diag_script_info, "thicks")) + markers = project_style(info0, diag_script_info, "markers") + lin_mar_mod = new((/dimsizes(colors)/), "string") + lin_mar_mod = (/"Lines"/) + season = diag_script_info@fig940_season + mode = new(1, logical) + if(isatt(diag_script_info, "fig940_mode")) then + mode = True + else + mode = False + end if + region_label = tostring(diag_script_info@fig940_region_label) + dim_reg = dimsizes(region_label) + dim_seas = dimsizes(season) + flag_mod = where(projects.ne."OBS" .and.projects.ne."OBS6"\ + .and. projects.ne."obs4mips", 1, 0) + index_mod = ind(flag_mod.gt.0) + index_obs = ind(flag_mod.eq.0) + dim_MOD = dimsizes(index_mod) + dim_OBS = 0 + + if (.not.all(ismissing(index_obs))) then + dim_OBS = dimsizes(index_obs) + list_obs_mod = names(index_obs) + end if + ; make sure path for (mandatory) netcdf output exists + + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + +end +begin + dim_MMM = 1 + + project_MMM = diag_script_info@fig940_project_MMM + exp_MMM = diag_script_info@fig940_experiment_MMM + mip_MMM = diag_script_info@fig940_mip_MMM + if (diag_script_info@fig940_MMM.eq."True") + if (dimsizes(project_MMM).eq.dimsizes(exp_MMM).eq.dimsizes(mip_MMM)) then + dim_MMM = dimsizes(project_MMM) + indic_s = new((/dimsizes(project_MMM),\ + dimsizes(names)/), "integer") + indic_not_s = new((/dimsizes(project_MMM),\ + dimsizes(names)/), "integer") + do ik = 0, dimsizes(diag_script_info@fig940_project_MMM) - 1 + ii_s = ind((projects.eq.project_MMM(ik))\ + .and.(exps.eq.exp_MMM(ik))\ + .and.(mips.eq.mip_MMM(ik))) + indic_s(ik, :dimsizes(ii_s) - 1) = ii_s + delete(ii_s) + ii_not_s = ind((projects.ne.project_MMM(ik)).or.(exps.ne.exp_MMM(ik))\ + .or.(mips.ne.mip_MMM(ik))) + indic_not_s(ik, :dimsizes(ii_not_s) - 1) = ii_not_s + delete(ii_not_s) + end do + else + error_msg("f", diag_script, "", "diag_script_info@fig940_project_MMM" + \ + "diag_script_info@fig940_experiment_MMM and" + \ + " diag_script_info@fig940_experiment_MMM" + \ + " must have the same dimension") + end if + end if + + if (dimsizes(project_MMM).gt.1) then + indic_not_sela = get_unique_difference(indic_s, indic_not_s) + else + ndim = ndtooned(indic_not_s) + ise = ind(.not.ismissing(ndim)) + indic_not_sela = ndim(ise) + delete(ise) + delete(ndim) + end if + MMM = new((/dim_seas, dim_reg, dimsizes(project_MMM) +\ + dimsizes(indic_not_sela), 6/), "double") + names_MMM = new((/dimsizes(project_MMM)/), "string") + MMM_rmse = new((/dim_seas, dim_reg, dimsizes(project_MMM)/), "double") + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "Figure9_40_" + var0) + wks_r = get_wks("dummy_for_wks", DIAG_SCRIPT, "Figure9_40_regions_" + var0) + wks_l = get_wks("dummy_for_wks", DIAG_SCRIPT, "Figure9_40_legend_" + var0) + + ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Amask = read_data(info0[idx_ref]) + lsdata = Amask(0, :, :) + a = addfile("$NCARG_ROOT/lib/ncarg/data/cdf/landsea.nc", "r") + lsdata1 = a->LSMASK + lsm = landsea_mask(lsdata1, lsdata&lat, lsdata&lon) + ; ***************************************************************** + + map_r = new(1, "graphic") + plot = new(dim_seas, "graphic") + dum_ref = new(dim_seas, "graphic") + dum1 = new((/dim_seas, dimsizes(project_MMM)/),\ + "graphic") + dum2 = new((/dim_seas, dimsizes(project_MMM)/),\ + "graphic") + dum3 = new((/dim_seas, dimsizes(project_MMM)/),\ + "graphic") + dum4 = new((/dim_seas, dimsizes(project_MMM)/),\ + "graphic") + dum5 = new((/dim_seas, dimsizes(project_MMM)/),\ + "graphic") + dum_lines = new((/dim_seas, 30/), "graphic") + dum_txt = new((/dim_seas, 30/), "graphic") + mres_r = True + mres_r@gsnDraw = False + mres_r@gsnFrame = False + mres_r@lbLabelBarOn = False + mres_r@cnLevelSelectionMode = "ManualLevels" + mres_r@cnMinLevelValF = 0. + mres_r@cnMaxLevelValF = 200.0 + ; mres_r@cnLevelSpacingF = 0.1 * 200.0/tofloat(dim_reg) + mres_r@cnLevelSpacingF = max((/5.0, 200.0/tofloat(dim_reg + 2.0)/)) + mres_r@cnInfoLabelOn = False + mres_r@cnLineLabelsOn = False + mres_r@cnFillOn = True + mres_r@cnFillOpacityF = 0.5 + cmap_r = read_colormap_file("GMT_wysiwygcont") + mres_r@cnFillPalette = cmap_r(::-1, :) + mres_r@mpFillOn = True + gsres = True + gsres@gsFillOpacityF = 0.7 + txres = True + txres@txFontHeightF = 0.012 + txres@txFont = 22 + txres@txJust = "CenterLeft" + + random_setallseed(36484749, 9494848) + unf = random_uniform(0, 1, (/dim_reg + 2/)) + ip = dim_pqsort(unf, 1) + + do iseas = 0, dim_seas - 1 + do ir = 0, dim_reg - 1 + + case1 = region_label(ir) + region_lab = str_get_field(case1, 1, "_") + region_ch = str_get_field(case1, 2, "_") + cell_fill = (/select_region_srex(region_lab, lsdata)/) + cell_fill!0 = "lat" + cell_fill!1 = "lon" + cell_fill&lat = lsdata&lat + cell_fill&lon = lsdata&lon + if(region_ch.eq."land") then + cell_fill = mask(cell_fill, lsm.eq.0, False) ; 0 = Ocean + cell_fill = mask(cell_fill, lsm.eq.2, False) ; 2 = Lake + ; cell_fill = mask(cell_fill,lsdata.eq.4,False) ; 4 = Ice Shelf + end if + if(region_ch.eq."sea") then + cell_fill = mask(cell_fill, lsm.eq.1, False) ; 1 = Land + cell_fill = mask(cell_fill, lsm.eq.3, False) ; 3 = Small Island + end if + if (iseas.eq.0) then + irc = (ip(ir + 1)) * 200.0/tofloat(dim_reg) + if (ir.eq.0) then + cell_fill2 = where(ismissing(cell_fill), -1., irc) + cell_fill2!0 = "lat" + cell_fill2!1 = "lon" + cell_fill2&lat = lsdata&lat + cell_fill2&lon = lsdata&lon + else + plot_on = True + if (region_label(ir).eq."World") then + plot_on = False + end if + if (region_label(ir).eq."World_land") then + plot_on = False + end if + if (region_label(ir).eq."World_sea") then + plot_on = False + end if + if (plot_on) then + cell_fill2 = where(ismissing(cell_fill), cell_fill2, irc) + end if + end if + end if + cell_fill = where(ismissing(cell_fill), -1., 1.) + mres_r@tiMainString = region_label(ir) + if (iseas.eq.0) then + mres_r@tiMainString = region_label(ir) + ; map(ir) = gsn_csm_contour_map(wks_r, cell_fill, mres) + end if + if (diag_script_info@fig940_MMM.eq."True") + indic_s = where(indic_s.eq.idx_ref, indic_s@_FillValue, indic_s) + indic_not_sel = where(indic_not_sela.eq.idx_ref,\ + indic_not_sela@_FillValue, indic_not_sela) + if(.not.ismissing(all(indic_not_sel))) then + indic_not_sel1 = indic_not_sel(ind(.not.ismissing(indic_not_sel))) + delete(indic_not_sel) + indic_not_sel = indic_not_sel1 + delete(indic_not_sel1) + end if + end if + D = new((/dim_MOD+1/), "double") + C = new((/dim_MOD/), "double") + models1 = new((/dim_MOD/), "string") + colors1 = new((/dim_MOD/), typeof(colors)) + dashes1 = new((/dim_MOD/), typeof(dashes)) + thicks1 = new((/dim_MOD/), typeof(thicks)) + markers1 = new((/dim_MOD/), typeof(markers)) + lin_mar_mod1 = new((/dim_MOD/), "string") + + A0 = read_data(info0[idx_ref]) + if (season(iseas).ne."ANN") then + if (mode) then + A0!0 = "time" + time1 = todouble(A0&time - 1.0) + time1!0 = "time" + ; ys=input_file_info[idx_ref]@start_year + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(A0&time) + A0&time = time1 + delete(time1) + Atmp3 = time_operations(A0, -1, -1, "extract", season(iseas), True) + date3 = cd_calendar(Atmp3&time, 0) + year3 = date3(:, 0) + month3 = date3(:, 1) + weights3 = days_in_month(toint(year3), toint(month3)) + Atmp4 = Atmp3 + Atmp4 = (/Atmp3 * conform(Atmp3, weights3, 0)/) + Atmp1 = dim_sum_n_Wrap(Atmp4, 0) + delete(Atmp3) + delete(Atmp4) + delete(date3) + delete(year3) + delete(month3) + delete(weights3) + else + A0!0 = "time" + time1 = todouble(A0&time - 1.0) + time1!0 = "time" + ; ys=input_file_info[idx_ref]@start_yea + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(A0&time) + A0&time = time1 + Atmp1 = time_operations(A0, -1, -1, "average", season(iseas), True) + end if + else + if (mode) then + A0!0 = "time" + time1 = todouble(A0&time - 1.0) + time1!0 = "time" + ; ys=input_file_info[idx_ref]@start_year + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(A0&time) + A0&time = time1 + Atmp3 = A0 + date3 = cd_calendar(Atmp3&time, 0) + year3 = date3(:, 0) + month3 = date3(:, 1) + weights3 = days_in_month(toint(year3), toint(month3)) + Atmp4 = Atmp3 + Atmp4 = (/Atmp3 * conform(Atmp3, weights3, 0)/) + Atmp1 = dim_sum_n_Wrap(Atmp4, 0) + delete(Atmp3) + delete(Atmp4) + delete(date3) + delete(year3) + delete(month3) + delete(weights3) + else + A0!0 = "time" + time1 = todouble(A0&time - 1.0) + time1!0 = "time" + ; ys=input_file_info[idx_ref]@start_year + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(A0&time) + A0&time = time1 + Atmp1 = time_operations(A0, -1, -1, "average", "annualclim", True) + end if + end if + ; ******************mask region********************* + Atmp1 = mask(Atmp1, cell_fill.eq.-1, False) + ; ************************************************** + Atmp = area_operations(Atmp1, -90., 90., 0., 360., "average", True) + delete(A0) + A = Atmp + delete(Atmp) + delete(Atmp1) + jmod = 0 + do imod = 0, dim_MOD - 1 + if (imod .ne. idx_ref) then + B0 = read_data(info0[imod]) + if (season(iseas).ne."ANN") then + if (mode) then + B0!0 = "time" + time1 = todouble(B0&time - 1.0) + time1!0 = "time" + ; ys = input_file_info[idx_ref]@start_year + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(B0&time) + B0&time = time1 + Btmp3 = time_operations(B0, -1, -1, "extract",\ + season(iseas), True) + date3 = cd_calendar(Btmp3&time, 0) + year3 = date3(:, 0) + month3 = date3(:, 1) + weights3 = days_in_month(toint(year3), toint(month3)) + Btmp4 = Btmp3 + Btmp4 = (/Btmp3 * conform(Btmp3, weights3, 0)/) + Btmp1 = dim_sum_n_Wrap(Btmp4, 0) + delete(Btmp3) + delete(Btmp4) + delete(date3) + delete(year3) + delete(month3) + delete(weights3) + else + B0!0 = "time" + time1 = todouble(B0&time - 1.0) + time1!0 = "time" + ; ys=input_file_info[idx_ref]@start_year + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(B0&time) + B0&time = time1 + Btmp1 = time_operations(B0, -1, -1, "average",\ + season(iseas), True) + end if + else + if (mode) then + Btmp3 = B0 + Btmp3!0 = "time" + time1 = todouble(Btmp3&time - 1.0) + time1!0 = "time" + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(Btmp3&time) + Btmp3&time = time1 + date3 = cd_calendar(Btmp3&time, 0) + year3 = date3(:, 0) + month3 = date3(:, 1) + weights3 = days_in_month(toint(year3), toint(month3)) + Btmp4 = Btmp3 + Btmp4 = (/Btmp3 * conform(Btmp3, weights3, 0)/) + Btmp1 = dim_sum_n_Wrap(Btmp4, 0) + delete(Btmp3) + delete(Btmp4) + delete(date3) + delete(year3) + delete(month3) + delete(weights3) + else + B0!0 = "time" + time1 = todouble(B0&time - 1.0) + time1!0 = "time" + ; ys = input_file_info[idx_ref]@start_year + time1@units = "months since 1-1-1 00:00:00" + time1@calendar = "gregorian" + delete(B0&time) + B0&time = time1 + Btmp1 = time_operations(B0, -1, -1, "average", "annualclim",\ + True) + end if + end if + ; ******************mask region********************** + Btmp1 = mask(Btmp1, cell_fill.eq.-1, False) + ; ************************************************** + Btmp = area_operations(Btmp1, -90., 90., 0., 360., "average", True) + delete(B0) + B = Btmp + delete(Btmp) + delete(Btmp1) + ; -------------------------------------------------------- + ; Bias + if (mode) then + print("cumulative mode") + C(jmod) = (/ 100 * (avg(B) - avg(A)) / avg(A)/) + D(imod) = (/100 * (avg(B) - avg(A)) / avg(A)/) + UNITS = "%" + else + C(jmod) = (/avg(B) - avg(A)/) ; get diff values + D(imod) = (/avg(B) - avg(A)/) + end if + + if (UNITS.eq."K") then + UNITS = "~S~o~N~C" + else + if (mode) then + UNITS = "%" + else + UNITS = variable_info[0]@units + end if + end if + + delete(B) + colors1(jmod) = colors(imod) + dashes1(jmod) = dashes(imod) + thicks1(jmod) = thicks(imod) + markers1(jmod) = markers(imod) + models1(jmod) = names(imod) + lin_mar_mod1(jmod) = "Lines" + jmod = jmod + 1 + end if + end do ; imod + delete(A) + if (diag_script_info@fig940_MMM.eq."True") + colori_def = (/"red", "orange", "green", "blue", "purple"/) + scatters_def = (/0, 5, 16, 4, 7, 8, 12/) + do iin = 0, dimsizes(diag_script_info@fig940_project_MMM) - 1 + if (.not.all(ismissing(indic_s(iin, :)))) then + aa = indic_s(iin, ind(.not.ismissing(indic_s(iin, :)))) + end if + F = D(aa) + qsort(F) + dimt = dimsizes(F) + x5 = round(.05 * dimt, 3) - 1 + x25 = round(.25 * dimt, 3) - 1 + x50 = round(.50 * dimt, 3) - 1 + x75 = round(.75 * dimt, 3) - 1 + x95 = round(.95 * dimt, 3) - 1 + x5 = where(x5.lt.0, 0, x5) + x25 = where(x25.lt.0, 0, x25) + x50 = where(x50.lt.0, 0, x50) + x75 = where(x75.lt.0, 0, x75) + x95 = where(x95.lt.0, 0, x95) + MMM_rmse(iseas, ir, iin) = (sum(F ^ 2) / dimt) ^ 0.5 + MMM(iseas, ir, iin, :) = (/F(x5), F(x25), F(x50),\ + F(x75), F(x95), stddev(F)/) + delete(aa) + delete(F) + delete(dimt) + + if(isatt(diag_script_info, "fig940_names_MMM")) then + names_MMM(iin) = diag_script_info@fig940_names_MMM(iin) + else + names_MMM(iin) = diag_script_info@fig940_project_MMM(iin) + " " +\ + diag_script_info@fig940_experiment_MMM(iin) +\ + " " + diag_script_info@fig940_mip_MMM(iin) + end if + end do + if (.not.ismissing(all(indic_not_sela))) then + MMM(iseas, ir, dimsizes(diag_script_info@fig940_project_MMM):, 0) =\ + (/D(indic_not_sela)/) + end if + end if + delete(C) + delete(D) + end do + res = True ; plot mods desired + ; add * if first project root mean square error is larger than the second + region_label1 = region_label + colors_reg = new(dimsizes(region_label), "string") + do irg = 0, dimsizes(region_label) - 1 + if (dim_MMM.gt.1) then + if (MMM_rmse(iseas, irg, 0).gt.MMM_rmse(iseas, irg, 1)) then + region_label1(irg) = region_label(irg) + "*" + colors_reg(irg) = "red" + else + region_label1(irg) = region_label(irg) + colors_reg(irg) = "blue" + end if + else + colors_reg(irg) = "blue" + end if + end do + + ind_blue = ind(colors_reg.eq."blue") + ind_red = ind(colors_reg.eq."red") + res@ind_blue = ind_blue + res@ind_red = ind_red + res@tmXBLabels = region_label1 + res@tmXBLabelFontHeightF = 0.017 + res@tiMainString = "bias, " + long_name + \ + " ("+UNITS+"), " + season(iseas) + if(isatt(diag_script_info, "fig940_YMin")) then + res@trYMinF = diag_script_info@fig940_YMin + else + res@trYMinF = min(MMM) - min(MMM) / 5 + end if + + if (isatt(diag_script_info, "fig940_YMax")) then + res@trYMaxF = diag_script_info@fig940_YMax + else + res@trYMaxF = max(MMM) + max(MMM) / 5 + end if + res@tmXBLabelAngleF = 90. + res@vpHeightF = 0.5 + res@vpWidthF = 0.9 + plot(iseas) = box_plot_cr(wks, ispan(1, dim_reg, 1),\ + MMM(iseas, :, 0, :), False, res, False) + if (isatt(diag_script_info, "fig940_vert_line_pos")) then + lines_x = diag_script_info@fig940_vert_line_pos + do ilin = 0, dimsizes(lines_x) - 1 + dres = True + dres@gsLineColor = "gray11" + dres@gsLineDashPattern = 2. + dum_lines(iseas, ilin) = gsn_add_polyline(wks, plot(iseas),\ + (/lines_x(ilin) + 0.5,\ + lines_x(ilin) + 0.5/),\ + (/min(MMM) - avg(MMM) / 10,\ + max(MMM) + \ + avg(MMM) / 10/),\ + dres) + end do + if (isatt(diag_script_info, "fig940_vert_line_label")) then + lab_x = diag_script_info@fig940_vert_line_label + + do itxt = 0, dimsizes(lab_x) - 1 + txres = True + txres@txFontHeightF = 0.02 + txres@txAngleF = 90. + txres@txJust = "BottomRight" + dum_txt(iseas, itxt) = gsn_add_text(wks, plot(iseas), lab_x(itxt),\ + lines_x(itxt) + 0.4,\ + min(MMM) - min(MMM) / 4,\ + txres) + end do + end if + end if + rres = True + rres@gsLineColor = "gray11" + rres@gsLineDashPattern = 1. + dum_ref(iseas) = gsn_add_polyline(wks, plot(iseas), (/0., 100./),\ + (/0., 0./), rres) + do iin = 1, dimsizes(diag_script_info@fig940_project_MMM) - 1 + mres = True ; marker mods desired + mres@gsMarkerIndex = scatters_def(iin) ; polymarker style + mres@gsMarkerSizeF = 0.008 * 26 / dim_reg + mres@gsMarkerThicknessF = 2. + mres@gsMarkerColor = "purple" ; polymarker color + dum1(iseas, iin) = gsn_add_polymarker(wks, plot(iseas),\ + ispan(1, dim_reg, 1),\ + MMM(iseas, :, iin, 0), mres) + mres@gsMarkerColor = "blue" ; polymarker color + dum2(iseas, iin) = gsn_add_polymarker(wks, plot(iseas),\ + ispan(1, dim_reg, 1),\ + MMM(iseas, :, iin, 1),\ + mres) + mres@gsMarkerColor = "green" ; polymarker color + dum3(iseas, iin) = gsn_add_polymarker(wks, plot(iseas),\ + ispan(1, dim_reg, 1), \ + MMM(iseas, :, iin, 2), \ + mres) + mres@gsMarkerColor = "orange" ; polymarker color + dum4(iseas, iin) = gsn_add_polymarker(wks, plot(iseas),\ + ispan(1, dim_reg, 1),\ + MMM(iseas, :, iin, 3),\ + mres) + mres@gsMarkerColor = "red" ; polymarker color + dum5(iseas, iin) = gsn_add_polymarker(wks, plot(iseas), \ + ispan(1, dim_reg, 1),\ + MMM(iseas, :, iin, 4), mres) + end do + delete(ind_blue) + delete(ind_red) + delete(res@ind_blue) + delete(res@ind_red) + end do + + ; ******************single region output file************************** + + nc_filename_MMM = work_dir + "fig940_" + var0 + "_MMM.nc" + MMM@var = var0 + MMM@diag_script = "fig940" + MMM!0 = "season" + MMM!1 = "region" + MMM!2 = "line" + MMM!3 = "stat" + dsizes_x = dimsizes(MMM) + nline = dsizes_x(2) + MMM&line = new((/nline/), "string") ; (/"None", "None", "None"/) + MMM&season = season + MMM®ion = region_label + MMM&stat = (/"x5", "x25", "x50", "x75", "x95", "stddev"/) + nc_outfile = ncdf_write(MMM, nc_filename_MMM) + + pan = True + pan@gsnMaximize = True + pan@gsnFrame = False + pan@gsnPaperOrientation = "portrait" + n_p = dimsizes(plot) / 3 + if (mod(dimsizes(plot), 3) .ne. 0) then + n_p = n_p + 1 + end if + gsn_panel(wks, plot, (/3, n_p/), pan) + frame(wks) + res1 = True ; plot mods desired + res1@tmXTLabels = names_MMM + res1@tmXTValues = ispan(1, dimsizes(diag_script_info@fig940_project_MMM)\ + + 1, 1) + res1@vpHeightF = 0.5 + res1@vpWidthF = 0.5 + lg_y = new((/1, 6/), "float") + lg_y(0, 0:4) = (/5., 25., 50., 75., 95./) + plot_lg = box_plot_lg(wks_l, 1, lg_y, False, res1, False) + duml1 = new(dimsizes(project_MMM), "graphic") + duml2 = new(dimsizes(project_MMM), "graphic") + duml3 = new(dimsizes(project_MMM), "graphic") + duml4 = new(dimsizes(project_MMM), "graphic") + duml5 = new(dimsizes(project_MMM), "graphic") + do iin = 1, dimsizes(project_MMM) - 1 + mresl = True ; marker mods desired + mresl@gsMarkerIndex = scatters_def(iin) ; polymarker style + ; mresl@gsMarkerSizeF = 60./dim_reg ; polymarker size + mresl@gsMarkerSizeF = 0.025 * 26 / dim_reg + mresl@gsMarkerThicknessF = 3. + mresl@gsMarkerColor = "purple" ; polymarker color + duml1(iin) = gsn_add_polymarker(wks_l, plot_lg, iin + 1, lg_y(0, 0), mresl) + mresl@gsMarkerColor = "blue" ; polymarker color + duml2(iin) = gsn_add_polymarker(wks_l, plot_lg, iin + 1, lg_y(0, 1), mresl) + mresl@gsMarkerColor = "green" ; polymarker color + duml3(iin) = gsn_add_polymarker(wks_l, plot_lg, iin + 1, lg_y(0, 2), mresl) + mresl@gsMarkerColor = "orange" ; polymarker color + duml4(iin) = gsn_add_polymarker(wks_l, plot_lg, iin + 1, lg_y(0, 3), mresl) + mresl@gsMarkerColor = "red" ; polymarker color + duml5(iin) = gsn_add_polymarker(wks_l, plot_lg, iin + 1, lg_y(0, 4), mresl) + end do + draw(plot_lg) + delete(pan) + delete(n_p) + frame(wks_l) + pan = True + pan@gsnMaximize = True + pan@gsnFrame = False + pan@gsnPaperOrientation = "portrait" + map_r = gsn_csm_contour_map(wks_r, cell_fill2, mres_r) + + do ir = 0, dim_reg - 1 + txres@txFontColor = "black" + region = region_label(ir) + add_r = 0.0 + add_y = 0.0 + plot_on = True + if (region_label(ir).eq."Arctic_land") then + region = "Arctic" + add_r = 5.0 + end if + if (region_label(ir).eq."Arctic_sea") then + region = "Arctic" + add_r = 60.0 + end if + if (region_label(ir).eq."Antarctic_land") then + region = "Antarctic" + add_r = 110.0 + end if + if (region_label(ir).eq."Antarctic_sea") then + region = "Antarctic" + add_y = 15.0 + end if + if (region_label(ir).eq."NorthernTropicalPacific") then + add_r = 10.0 + end if + if (region_label(ir).eq."World") then + plot_on = False + end if + if (region_label(ir).eq."World_land") then + plot_on = False + end if + if (region_label(ir).eq."World_sea") then + plot_on = False + end if + if (plot_on) then + cregion_array = (/select_region_srex_poly(region)/) + dum = gsn_add_text(wks_r, map_r, region_label(ir),\ + cregion_array(0) + add_r, \ + cregion_array(1) + add_y, txres) + delete(cregion_array) + end if + end do + draw(map_r) + frame(wks_r) + ; ------------------------------------------------------------- + ; Add provenance + ; ------------------------------------------------------------- + + caption = "Seasonal- and annual mean biases of " + var0 + " over " + \ + "land in different regions" + + log_provenance(nc_filename_MMM, \ + wks@fullname, \ + caption, \ + (/"diff", "mean", "perc"/), \ + (/"reg"/), \ + "box", \ + (/"cionni_irene"/), \ + (/"flato13ipcc"/), \ + metadata_att_as_array(info0, "filename")) + +end diff --git a/esmvaltool/diag_scripts/regional_downscaling/Figure9.41.ncl b/esmvaltool/diag_scripts/regional_downscaling/Figure9.41.ncl new file mode 100644 index 0000000000..6e714ab8a4 --- /dev/null +++ b/esmvaltool/diag_scripts/regional_downscaling/Figure9.41.ncl @@ -0,0 +1,286 @@ +; ############################################################################# +; ############################################################################# +; # Author: Irene Cionni (ENEA, Italy) # +; # ESMVal project +; ############################################################################# +; # * Creates plot ranked monthly data of observations vs models. # +; # 3 pages are created: +; # 1st page Centred (data are adjusted to get a zero mean in model data with +; # respect to the diagonal) +; # 2nd page Uncentred (data not adjusted) +; # 3th page Full models legend +; # +; # Required variable_info attributes (variable specific): +; # *Reference Dataset +; # variable_info[0]@reference_dataset +; # Optional diag_script_info attributes (diagnostics specific): +; # *Region Label +; # diag_script_info@fig941_region_label, default "MEDs" +; # *styleset, default "CMIP5" +; # +; #Optional diag_script_info attributes +; # # +; # # +; # Caveats: # +; # # +; # Modification history: +; # 20221026-weigel_katja: header updated +; # 20220314-weigel_katja: header updated +; ############################################################################# +; ############################################################################# +load "$diag_scripts/../interface_scripts/interface.ncl" +load "$diag_scripts/shared/statistics.ncl" +load "$diag_scripts/shared/plot/aux_plotting.ncl" +load "$diag_scripts/shared/plot/style.ncl" +load "$diag_scripts/regional_downscaling/regional_function.ncl" + +begin + enter_msg(DIAG_SCRIPT, "") + var0 = variable_info[0]@short_name + UNITS = variable_info[0]@units + info0 = select_metadata_by_name(input_file_info, var0) + dim_MOD1 = ListCount(info0) + names = metadata_att_as_array(info0, "dataset") + projects = metadata_att_as_array(info0, "project") + exps = metadata_att_as_array(info0, "exp") + ensembles = metadata_att_as_array(info0, "ensemble") + mips = metadata_att_as_array(info0, "mip") + y1 = metadata_att_as_array(info0, "start_year") + y2 = metadata_att_as_array(info0, "end_year") + long_name = variable_info[0]@long_name + if (isatt(variable_info[0], "reference_dataset")) then + refname = variable_info[0]@reference_dataset + do imod = 0, dimsizes(names) - 1 + if (names(imod) .eq. refname) then + idx_ref = imod + end if + end do + else + error_msg("f", DIAG_SCRIPT, "", "no reference dataset " + \ + "(variable_info[0]@reference_dataset) needs to be defined.") + end if + if(isatt(variable_info, "long_name")) then + LONG_NAME = variable_info@long_name + else + LONG_NAME = var0 + end if + + log_info("++++++++++++++++++++++++++++++++++++++++++") + log_info(DIAG_SCRIPT + " (var: " + var0 + ")") + log_info("++++++++++++++++++++++++++++++++++++++++++") + + ; Set default values for optional diag_script_info attributes + + set_default_att(diag_script_info, "fig941_region_label", "MEDs") + set_default_att(diag_script_info, "styleset", "CMIP5") + colors = project_style(info0, diag_script_info, "colors") + dashes = project_style(info0, diag_script_info, "dashes") + thicks = tofloat(project_style(info0, diag_script_info, "thicks")) + markers = project_style(info0, diag_script_info, "markers") + lin_mar_mod = new((/dimsizes(colors)/), "string") + lin_mar_mod = (/"Lines"/) + region_label = tostring(diag_script_info@fig941_region_label) + dim_reg = dimsizes(region_label) + flag_mod = where(projects.ne."OBS" .and.projects.ne."OBS6"\ + .and. projects.ne."obs4mips", 1, 0) + index_mod = ind(flag_mod.gt.0) + index_obs = ind(flag_mod.eq.0) + dim_MOD = dimsizes(index_mod) + dim_OBS = 0 + + if (.not.all(ismissing(index_obs))) then + dim_OBS = dimsizes(index_obs) + list_obs_mod = names(index_obs) + end if + ; make sure path for (mandatory) netcdf output exists + + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + +end +begin + work_dir = config_user_info@work_dir + "/" + ; Create work dir + system("mkdir -p " + work_dir) + wks = get_wks("dummy_for_wks", DIAG_SCRIPT, "Figure9_41_" + var0) + wks_r = get_wks("dummy_for_wks", DIAG_SCRIPT, "Figure9_41_raw_" + var0) + wks_l = get_wks("dummy_for_wks", DIAG_SCRIPT, "Figure9_41_legend_" + var0) + ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Amask = read_data(info0[idx_ref]) + lsdata = Amask(0, :, :) + ; ***************************************************************** + plot = new(dimsizes(region_label), "graphic") + plot1 = new(dimsizes(region_label), "graphic") + dum_diag = new(dimsizes(region_label), "graphic") + dum_diag1 = new(dimsizes(region_label), "graphic") + do ir = 0, dim_reg - 1 + case1 = region_label(ir) + cell_fill = (/select_region_srex(region_label(ir), lsdata)/) + cell_fill!0 = "lat" + cell_fill!1 = "lon" + cell_fill&lat = lsdata&lat + cell_fill&lon = lsdata&lon + cell_fill = where(ismissing(cell_fill), -1., 1.) + models1 = new((/dim_MOD/), "string") + colors1 = new((/dim_MOD/), typeof(colors)) + dashes1 = new((/dim_MOD/), typeof(dashes)) + thicks1 = new((/dim_MOD/), typeof(thicks)) + markers1 = new((/dim_MOD/), typeof(markers)) + lin_mar_mod1 = new((/dim_MOD/), "string") + A0 = read_data(info0[idx_ref]) + time = A0&time + Atmp1 = A0 + ; ******************mask region********************* + Atmp1 = (/ mask(A0, cell_fill.eq.-1, False)/) + ; ************************************************** + + Atmp = area_operations(Atmp1, -90., 90., 0., 360., "average", True) + delete(A0) + A = Atmp + delete(Atmp) + qsort(A) ; rank the observation in ascending order + + ; ----------------------------------------------------------- + ; netcdf output file + + nc_filename = work_dir + "fig941_" + var0 + "_" + \ + region_label(ir) + "_obs.nc" + A@var = var0 + A@diag_script = "fig941" + nc_outfile = ncdf_write(A, nc_filename) + + D = new((/dim_MOD, dimsizes(time)/), "double") + C = new((/dim_MOD, dimsizes(time)/), "double") + + jmod = 0 + do imod = 0, dim_MOD - 1 + if (imod .ne. idx_ref) then + B0 = read_data(info0[imod]) + B0&time = time + ; ******************mask region********************** + Btmp1 = B0 + Btmp1 = (/mask(B0, cell_fill.eq.-1, False)/) + ; ************************************************** + Btmp = area_operations(Btmp1, -90., 90., 0., 360., "average", True) + delete(B0) + B = Btmp + qsort(B) + delete(Btmp) + delete(Btmp1) + ; -------------------------------------------------------- + ; Bias + C(jmod, :) = B + D(jmod, :) = B - avg(B) + avg(A) + delete(B) + colors1(jmod) = colors(imod) + dashes1(jmod) = dashes(imod) + thicks1(jmod) = thicks(imod)+1 + markers1(jmod) = markers(imod) + models1(jmod) = names(imod) + lin_mar_mod1(jmod) = "Lines" + jmod = jmod + 1 + end if + end do ; imod + + UNITS = variable_info[0]@units + if (UNITS.eq."K") then + UNITS = "~S~o~N~C" + C = C - 273.15 + D = D - 273.15 + A = A - 273.15 + end if + + ; ----------------------------------------------------------- + ; netcdf output file + nc_filename = work_dir + "fig941_" + var0 + "_" \ + + region_label(ir) + "_models.nc" + D!0 = "models" + D!1 = "time" + D&models = models1 + D&time = A&time + D@var = var0 + D@diag_script = "fig941" + D@existing = "overwrite" + nc_outfile = ncdf_write(D, nc_filename) + + ; ----------------------------------------------------------- + ; plots of time(x) vs. latitude(y) + min1 = min(C) + max1 = max(C) + res = True + res@gsnDraw = False ; don't draw + res@gsnFrame = False ; don't advance frame + ; res@tiMainString =variable_info@long_name + res@tiYAxisString = "RAW MODELS" + res@tiXAxisString = "OBS" + res@trYMinF = min1 + res@trYMaxF = max1 + res@trXMinF = min1 + res@trXMaxF = max1 + res@xyLineColors = colors1 ; line colors + res@xyLineThicknesses = thicks1 ; line thicknesses + res@xyDashPatterns = dashes1 ; line patterns + res@gsnLeftString = case1 + res@gsnRightString = UNITS + res@vpHeightF = 0.4 + res@vpWidthF = 0.8 + res@tiMainFontHeightF = 0.02 + res@txFontHeightF = 0.02 + res@tmXBLabelFontHeightF = 0.02 + res@tmYLLabelFontHeightF = 0.02 + ; res@tfPolyDrawOrder = "Draw" + plot(ir) = gsn_csm_xy(wks_r, A, C, res) + lnres = True + dum_diag(ir) = gsn_add_polyline(wks_r, plot(ir), (/min1, max1/), \ + (/min1, max1/), lnres) + res@tiYAxisString = "MODELS" + res@tiXAxisString = "OBS" + plot1(ir) = gsn_csm_xy(wks, A, D, res) + dum_diag1(ir) = gsn_add_polyline(wks, plot1(ir), (/min1, max1/), \ + (/min1, max1/), lnres) + delete(C) + delete(A) + delete(D) + end do + + ; Panel plots + pan = True + pan@gsnMaximize = True + pan@gsnFrame = False + pan@gsnPaperOrientation = "portrait" + n_p = dimsizes(plot) / 3 + if (mod(dimsizes(plot), 3) .ne. 0) then + n_p = n_p + 1 + end if + pan@txString = "Centered " + LONG_NAME + " bias vs. " + \ + names(idx_ref) + gsn_panel(wks, plot1, (/3, n_p/), pan) + + ; ***********add legend**************************** + frame(wks) + pan@txString = "Uncentered " + LONG_NAME + " bias vs. " + \ + names(idx_ref) + gsn_panel(wks_r, plot, (/3, n_p/), pan) + frame(wks_r) + add_legenda_page(wks_l, models1, colors1, dashes1, lin_mar_mod1,\ + thicks1, "0.99") + frame(wks_l) + + ; ------------------------------------------------------------- + ; Add provenance + ; ------------------------------------------------------------- + + caption = "Modelled versus observed monthly mean temperature" + + log_provenance(nc_filename, \ + wks@fullname, \ + caption, \ + (/"corr"/), \ + (/"reg"/), \ + "line", \ + (/"cionni_irene"/), \ + (/"flato13ipcc"/), \ + metadata_att_as_array(info0, "filename")) + +end diff --git a/esmvaltool/diag_scripts/regional_downscaling/regional_function.ncl b/esmvaltool/diag_scripts/regional_downscaling/regional_function.ncl new file mode 100644 index 0000000000..c2a00ad2fd --- /dev/null +++ b/esmvaltool/diag_scripts/regional_downscaling/regional_function.ncl @@ -0,0 +1,1428 @@ +; ************************************************************************** +; This library contains functions in support of regional_downscaling +; the functions included are: +; * function: +; select_region1(region:string) +; * function: +; box_plot_cr(wks:graphic, x[* ]:numeric, y[* ][* ]:numeric, \ +; boxOpts:logical, plotres:logical, lineres:logical) +; * function: +; * box_plot_lg(wks:graphic, x[* ]:numeric, y[* ][* ]:numeric, \ +; boxOpts:logical, plotres:logical, lineres:logical) +; * function: +; select_region_938(region:string, lsdata:numeric) +; * function +; select_region_srex_poly(region:string) +; * function: +; select_region_srex(region:string, lsdata:numeric) +; * function: +; get_unique_intersection( a, b ) +; * function: +; get_unique_difference( a, b ) +; * procedure: +; add_legenda_page(wks, MODEL:string, colors:string, dashs:numeric,\ +; scatters:string, ticknesses:numeric, place:string) +; # Caveats: # +; # # +; # Modification history: +; 20220314-weigel_katja: get_unique_intersection and get_unique_difference +; (ESMValTool v1 functions to allow labelling of +; multiple projects) +; 2021????-weigel_katja: replaces select_region_939 and select_region_940 +; with select_region_srex, added select_region_srex_poly +; ************************************************************************** +undef("select_region1") +function select_region1(region:string) +; +; Arguments +; region: a string specifying the region to be selected. +; +; Return value +; An array with the region boundary as (latmin, latmax, lonmin, lonmax) +; with the name of the region as a string attribute @name. +; +; Description +; Translates a region specification into lat/lon boundaries and a region +; name as an attribute. +; +; Modification history +; 20141205 -A_gott_kl: adjusted names to Righi et al. (2015). +; 20140410 -A_fran_fr: extended to midlat, equatorial and polar regions. +; 20140129 -A_fran_fr: written. +; +local funcname, scriptname, verbosity, region +begin + + funcname = "select_region1" + scriptname = "diag_scripts/lib/ncl/latlon.ncl" + verbosity = stringtointeger(getenv("ESMValTool_verbosity")) + ; enter_msg(scriptname, funcname, 10) + + if (region.eq."Global") then + region_array = (/ -90., 90., 0., 360./) + region_array@name = "Glob" + return(region_array) + end if + if (region.eq."Tropics") then + region_array = (/ -20., 20., 0., 360./) + region_array@name = "Trop" + return(region_array) + end if + if (region.eq."NH extratropics") then + region_array = (/20., 90., 0., 360./) + region_array@name = "NHext" + return(region_array) + end if + if (region.eq."SH extratropics") then + region_array = (/ -90., -20., 0., 360./) + region_array@name = "SHext" + return(region_array) + end if + if (region.eq."NH equatorial") then + region_array = (/0., 30., 0., 360./) + region_array@name = "NHtrop" + return(region_array) + end if + if (region.eq."SH equatorial") then + region_array = (/ -30., 0., 0., 360./) + region_array@name = "SHtrop" + return(region_array) + end if + if (region.eq."Northern Hemisphere") then + region_array = (/20., 90., 0., 360./) + region_array@name = "NH" + return(region_array) + end if + if (region.eq."Southern Hemisphere") then + region_array = (/ -90., -20., 0., 360./) + region_array@name = "SH" + return(region_array) + end if + if (region.eq."NH midlatitudes") then + region_array = (/35., 60., 0., 360./) + region_array@name = "NHmidlat" + return(region_array) + end if + if (region.eq."SH midlatitudes") then + region_array = (/ -60., -35., 0., 360./) + region_array@name = "SHmidlat" + return(region_array) + end if + if (region.eq."Arctic") then + region_array = (/60., 90., 0., 360./) + region_array@name = "NHpolar" + return(region_array) + end if + if (region.eq."Antarctic") then + region_array = (/ -90., -60., 0., 360./) + region_array@name = "SHpolar" + return(region_array) + end if + if (region.eq."Equatorial") then + region_array = (/ -10., 10., 0., 360./) + region_array@name = "EQ" + return(region_array) + end if + ; Region latitudes and longitudes following Figure 9.38 Chapter 9 AR5 + ; (as Comunication from Chou Sin Chan) + ; 1 - ENA Eastern North America + ; Lon = 250 to 350 + ; Lat = 30 to 67 + + if (region.eq."ENA") then + region_array = (/30., 67., 250., 350./) + region_array@name = "ENA" + return(region_array) + end if + ; 2 - WNA Western North America + ; Lon = 190 to 250 + ; Lat = 30 to 67 + if (region.eq."WNA") then + region_array = (/30., 67., 190., 250./) + region_array@name = "WNA" + return(region_array) + end if + ; 3 - CAM Central America + ; Lon = 240 to 300 + ; Lat = 10 to 30 + if (region.eq."CAM") then + region_array = (/10., 30., 240., 300./) + region_array@name = "CAM" + return(region_array) + end if + ; 4 - AMZ Amazon + ; Lon = 277 to 329 + ; Lat = -20 to 10 + if (region.eq."TSA") then + region_array = (/ -20., 10., 277., 329./) + region_array@name = "TSA" + return(region_array) + end if + ; 5 - SSA Southern South America + ; Lon = 277 to 329 + ; Lat = -56 to -20 + if (region.eq."SSA") then + region_array = (/ -56., -20., 277., 329./) + region_array@name = "SSA" + return(region_array) + end if + ; 6 - EUM Europe and Mediterranean + ; Lon = 350 to 40 + ; Lat = 30 to 67 + if (region.eq."EUM") then + region_array = (/30., 67., 350., 40./) + region_array@name = "ENA" + return(region_array) + end if + ; 7 - NAF Northern Africa + ; Lon = 342 to 65 + ; Lat = 16 to 30 + if (region.eq."NAF") then + region_array = (/16., 30., 342., 65./) + region_array@name = "NAF" + return(region_array) + end if + ; 8 - SAF South Africa + ; Lon = 10 to 51 + ; Lat = -35 to -10 + if (region.eq."SAF") then + region_array = (/ -35., -10., 10., 51./) + region_array@name = "SAF" + return(region_array) + end if + ; 9 - CAF central Africa + ; Lon = 342 to 60 + ; Lat = -10 to 16 + if (region.eq."CAF") then + region_array = (/ -10., 16., 342., 60./) + region_array@name = "CAF" + return(region_array) + end if + ; 10 - NAS Nothern Asia + ; Lon = 40 to 167 + ; Lat = 48 to 67 + if (region.eq."NAS") then + region_array = (/48., 67., 40., 167./) + region_array@name = "NAS" + return(region_array) + end if + ; 11 - EAS Eastern Asia + ; Lon = 100 to 167 + ; Lat = 20 to 48 + if (region.eq."EAS") then + region_array = (/20., 48., 100., 167./) + region_array@name = "EAS" + return(region_array) + end if + ; 12 - CAS Central Asia + ; Lon = 40 to 100 + ; Lat = 30 to 48 + if (region.eq."CAS") then + region_array = (/30., 48., 40., 100./) + region_array@name = "CAS" + return(region_array) + end if + ; 13 - SEA Southeast Asia + ; Lon = 95 to 151 + ; Lat = -11 to 20 + if (region.eq."SEA") then + region_array = (/ - 11., 20., 95., 151./) + region_array@name = "SEA" + return(region_array) + end if + ; 14 - SAS South Asia + ; Lon = 65 to 95 + ; Lat = 5 to 30 + if (region.eq."SAS") then + region_array = (/5., 30., 65., 95./) + region_array@name = "SAS" + return(region_array) + end if + ; 15 - AUS Oceania + ; Lon = 112 to 180 + ; Lat = -48 to -11 + if (region.eq."AUS") then + region_array = (/ - 48., - 11., 112., 180./) + region_array@name = "AUS" + return(region_array) + end if + if (region.eq."Arctic") then + region_array = (/67.5, 90., 0., 360./) + region_array@name = "Arctic" + return(region_array) + end if +end +; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +undef("box_plot_cr") +function box_plot_cr(wks:graphic, x[*]:numeric, y[*][*]:numeric, \ + boxOpts:logical, plotres:logical, lineres:logical) + +begin + dimquery = dimsizes(y) + numbox = dimquery(0) + boxWidths = new((/numbox/), float) + if (numbox.ne.dimsizes(x)) then + print("boxplot: Fatal: X must be one - dimensional and both X and Y" + \ + "have the same rightmost dimension") + exit + end if + if (any(ismissing(x))) then + print("boxplot: Fatal: X array cannot contain missing data, exiting") + exit + end if +; Developing x -axis + xAxis = new(numbox + 2, typeof(x)) + xAxis(1:numbox) = x + if (numbox.ne.1) then + dx = x(1) - x(0) + xAxis(0) = x(0) - dx + xAxis(numbox + 1) = x(numbox - 1) + dx + else + dx = 1 + xAxis(0) = x - dx + xAxis(2) = x + dx + end if + if (boxOpts) then + if (isatt(boxOpts, "boxWidth")) then + if (dimsizes(boxOpts@boxWidth).ne.1.and.dimsizes(boxOpts@boxWidth)\ + .ne.numbox) then + print("boxplot: Number of input box widths must either equal 1 or" +\ + "the number of boxes (" + numbox + "). Using first specified" +\ + "box width only.") + boxWidths(:) = boxOpts@boxWidth(0) + else + boxWidths = boxOpts@boxWidth + end if + else + boxWidths(:) = dx * .4 + end if + else + boxWidths(:) = dx * .4 + end if + labarr = new(numbox + 2, "string") ; Prepare actual X -axis labels... + labarr(0) = "" + labarr(numbox + 1) = "" + labarr(1:numbox) = xAxis(1:numbox) + + ; Whether to maximize plot in frame. + maximize = get_res_value(plotres, "gsnMaximize", False) + + if (plotres) then + ; print("Plot resources detected, accepting") + fsatts = getvaratts(plotres) + do ty = 0, dimsizes(fsatts) - 1 + if (fsatts(ty).eq."tmXBLabels") then ; XBLabels + if (dimsizes(plotres@tmXBLabels).ne.numbox) then + print("boxplot: Fatal:Number of XB Labels does not match number" + \ + "of boxes, exiting") + exit + else + labarr(1:numbox) = plotres@$fsatts(ty)$ + end if + xblab = plotres@tmXBLabels + delete(plotres@tmXBLabels) ; Delete so tmXBLabels is not used + end if ; atts are assigned below... + end do + delete(fsatts) + end if + ind_blue = plotres@ind_blue + ind_red = plotres@ind_red + ind_blue = ind_blue + 1 + ind_red = ind_red + 1 + plot = create "plot" logLinPlotClass wks + "trYMinF" : min(y) - 2 + "trYMaxF" : max(y) + 2 + "trXMinF" : min(xAxis) + "trXMaxF" : max(xAxis) + "pmTickMarkDisplayMode" : "Always" + "tmXBMode" : "Explicit" + "tmXBValues" : xAxis(ind_blue) + "tmXBLabels" : labarr(ind_blue) + "tmXBLabelFontHeightF" : 0.014 + "tmXBLabelAngleF" : 90. + "tmXBLabelJust" : "TopRight" + "tmXBLabelFontColor" : "blue" + "tmYROn" : False + "tmXTOn" : False + "tmYRBorderOn" : True + "tmXTBorderOn" : True + "pmTitleDisplayMode": "Always" + "tiMainOn" : True + "tiMainString" : "" + end create + if (.not.all(ismissing(plotres@ind_red))) then + plot1 = create "plot" logLinPlotClass wks + "trYMinF" : min(y) - 2 + "trYMaxF" : max(y) + 2 + "trXMinF" : min(xAxis) + "trXMaxF" : max(xAxis) + "pmTickMarkDisplayMode" : "Always" + "tmXBMode" : "Explicit" + "tmXBValues" : xAxis(ind_red) + "tmXBLabels" : labarr(ind_red) + "tmXBLabelFontHeightF" : 0.0105 + "tmXBLabelAngleF" : 90. + "tmXBLabelFontColor" : "red" + "tmXBLabelJust" : "TopRight" + "tmYROn" : False + "tmXTOn" : False + "tmYRBorderOn" : True + "tmXTBorderOn" : True + "pmTitleDisplayMode": "Always" ; allow titles + "tiMainOn" : True + "tiMainString" : "" + end create + overlay(plot, plot1) + end if + + if (plotres) then + attsetvalues(plot, plotres) + end if + + polyres = True ; Set up defaults + polyres@gsLineColor = "black" ; color of lines + polyres@gsLineThicknessF = 1.5 ; thickness of lines + polyres@gsLineDashPattern = 0 + if (lineres) then + fsatts = getvaratts(lineres) + do ty = 0, dimsizes(fsatts) - 1 + polyres@$fsatts(ty)$ = lineres@$fsatts(ty)$ + end do + end if + + if (boxOpts) then + if (isatt(boxOpts, "boxColors")) then + boxcolor = boxOpts@boxColors + if (dimsizes(boxcolor).eq.1.or.dimsizes(boxcolor).ne.numbox) then + if (dimsizes(boxcolor).ne.numbox) then + print("boxplot: warning: Number of input colors must either " + \ + "equal 1 or the number of boxes (" + numbox + ")." + \ + "Using first specified color only.") + end if + polyres@gsLineColor = boxcolor(0) + cflag = 1 + else + cflag = 2 + end if + else + cflag = 1 + end if + else + cflag = 1 + end if + + dum = new((/numbox, 9/), graphic) + do gg = 0, numbox - 1 + ff = xAxis(gg + 1) + if (cflag.eq.2) then + polyres@gsLineColor = boxcolor(gg) + end if + yy = (/y(gg, 4), y(gg, 4)/) + xx = (/(ff - (boxWidths(gg) / 8.)), (ff + (boxWidths(gg) / 8.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 0) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + + yy = (/y(gg, 3), y(gg, 4)/) + xx = (/ff, ff/) + polyres@gsLineDashPattern = 0 + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 1) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + polyres@gsLineDashPattern = 0 + + yy = (/y(gg, 3), y(gg, 3)/) + xx = (/(ff - (boxWidths(gg) / 2.)), (ff + (boxWidths(gg) / 2.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 2) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + + yy = (/y(gg, 1), y(gg, 3)/) + xx = (/(ff - (boxWidths(gg) / 2.)), (ff - (boxWidths(gg) / 2.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 3) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + + yy = (/y(gg, 2), y(gg, 2)/) + xx = (/(ff - (boxWidths(gg) / 2.)), (ff + (boxWidths(gg) / 2.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 4) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + + yy = (/y(gg, 1), y(gg, 3)/) + xx = (/(ff + (boxWidths(gg) / 2.)), (ff + (boxWidths(gg) / 2.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 5) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + + yy = (/y(gg, 1), y(gg, 1)/) + xx = (/(ff - (boxWidths(gg) / 2.)), (ff + (boxWidths(gg) / 2.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 6) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + + yy = (/y(gg, 0), y(gg, 1)/) + xx = (/ff, ff/) + polyres@gsLineDashPattern = 0 + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 7) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + polyres@gsLineDashPattern = 0 + + yy = (/y(gg, 0), y(gg, 0)/) + xx = (/(ff - (boxWidths(gg) / 8.)), (ff + (boxWidths(gg) / 8.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 8) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + end do + + dumname = unique_string("dum") + plot@$dumname$ = dum + if (isvar("xblab").eq."True") then + plotres@tmXBLabels = xblab ; reassign XBLabels for possible future plots + end if + if (maximize) then + mres = True + mres@gsnDraw = False + mres@gsnFrame = False + maximize_output(wks, mres) + end if + return(plot) +end +; ------------------------------------- +; Adam Phillips +; +undef("box_plot_lg") +function box_plot_lg(wks:graphic, x[*]:numeric, y[*][*]:numeric, \ + boxOpts:logical, plotres:logical, lineres:logical) +begin + dimquery = dimsizes(y) + numbox = dimquery(0) + boxWidths = new((/numbox/), float) + if (numbox.ne.dimsizes(x)) then + print("boxplot: Fatal: X must be one -dimensional and both X and Y " + \ + "must have the same rightmost dimension") + exit + end if + if (any(ismissing(x))) then + print("boxplot: Fatal: X array cannot contain missing data, exiting") + exit + end if + + ; Developing x -axis + xAxis = new(numbox + 2, typeof(x)) + xAxis(1:numbox) = x + if (numbox.ne.1) then + dx = x(1) - x(0) + xAxis(0) = x(0) - dx + xAxis(numbox + 1) = x(numbox - 1) + dx + else + dx = 1 + xAxis(0) = x - dx + xAxis(2) = x + dx + end if + + if (boxOpts) then + if (isatt(boxOpts, "boxWidth")) then + if (dimsizes(boxOpts@boxWidth).ne.1.and.(dimsizes(boxOpts@boxWidth).ne.\ + numbox)) then + print("boxplot: Number of input box widths must either equal 1 " + \ + "or the number of boxes (" + numbox + "). Using first " + \ + "specified box width only.") + boxWidths(:) = boxOpts@boxWidth(0) + else + boxWidths = boxOpts@boxWidth + end if + else + boxWidths(:) = dx * .4 + end if + else + boxWidths(:) = dx * .4 + end if + + labarr = new(numbox + 2, "string") + labarr(0) = "" + labarr(numbox + 1) = "" + labarr(1:numbox) = xAxis(1:numbox) + +; Whether to maximize plot in frame. + maximize = get_res_value(plotres, "gsnMaximize", False) + + if (plotres) then + print("Plot resources detected, accepting") + fsatts = getvaratts(plotres) + do ty = 0, dimsizes(fsatts) - 1 + if (fsatts(ty).eq."tmXTLabels") then + print(plotres@tmXTLabels) + if (dimsizes(plotres@tmXTLabels).ne.numbox) then + delete(labarr) + labarr = new(dimsizes(plotres@tmXTLabels) + 2, "string") + labarr(0) = "" + labarr(dimsizes(plotres@tmXTLabels) + 1) = "" + labarr(1:dimsizes(plotres@tmXTLabels)) = plotres@$fsatts(ty)$ + else + labarr(1:numbox) = plotres@$fsatts(ty)$ + end if + xblab = plotres@tmXTLabels + delete(plotres@tmXTLabels) + end if + end do + delete(fsatts) + end if + plot = create "plot" logLinPlotClass wks + "trYMinF" : - 25 + "trYMaxF" : 125 + "trXMinF" : 0.5 + "trXMaxF" : dimsizes(labarr) + 0.5 + "pmTickMarkDisplayMode" : "Always" + "tmXTMode" : "Explicit" + "tmXTValues" : ispan(0, dimsizes(labarr) - 2, 1) + "tmXTLabels" : labarr(1:) + "tmYLMode" : "Explicit" + "tmYLValues" : (/5, 25, 50, 75, 95/) + "tmYLLabels" : (/"5%", "25%", "50%", "75%", "95%"/) + "tmXTLabelFontColor" : "black" + "tmYLOn" : True + "tmXBOn" : False + "tmXTOn" : True + "tmXBLabelsOn": False + "tmXTLabelsOn": True + "tmXTMinorOn" :False + "tmXBMinorOn" :False + "tmYLMinorOn" :False + "tmXUseBottom": False + "tmYRBorderOn" : False + "tmXTBorderOn" : False + "tmYLBorderOn" : False + "tmXBBorderOn" : False + "tmXTMajorLineColor" : "Transparent" + "tmYLMajorLineColor" : "Transparent" + "tmYLLabelFontHeightF" : 0.02 + "tmXTLabelFontHeightF" : 0.02 + "pmTitleDisplayMode": "Always" + "tiMainOn" : True + "tiMainString" : "" + end create + + if (plotres) then + attsetvalues(plot, plotres) + end if + polyres = True + polyres@gsLineColor = "black" + polyres@gsLineThicknessF = 3. + polyres@gsLineDashPattern = 0 + if (lineres) then + fsatts = getvaratts(lineres) + do ty = 0, dimsizes(fsatts) - 1 + polyres@$fsatts(ty)$ = lineres@$fsatts(ty)$ + end do + end if + + if (boxOpts) then + if (isatt(boxOpts, "boxColors")) then + boxcolor = boxOpts@boxColors + if (dimsizes(boxcolor).eq.1.or.dimsizes(boxcolor).ne.numbox) then + if (dimsizes(boxcolor).ne.numbox) then + print("boxplot: warning: Number of input colors must either" + \ + "equal 1 or the number of boxes (" + numbox + ")." + \ + "Using first specified color only.") + end if + polyres@gsLineColor = boxcolor(0) + cflag = 1 + else + cflag = 2 + end if + else + cflag = 1 + end if + else + cflag = 1 + end if + dum = new((/numbox, 9/), graphic) + do gg = 0, numbox - 1 + ff = xAxis(gg + 1) + if (cflag.eq.2) then + polyres@gsLineColor = boxcolor(gg) + end if + yy = (/y(gg, 4), y(gg, 4)/) + xx = (/(ff - (boxWidths(gg)/8.)), (ff + (boxWidths(gg)/8.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 0) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + + yy = (/y(gg, 3), y(gg, 4)/) + xx = (/ff, ff/) + polyres@gsLineDashPattern = 0 + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 1) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + polyres@gsLineDashPattern = 0 + + yy = (/y(gg, 3), y(gg, 3)/) + xx = (/(ff - (boxWidths(gg)/2.)), (ff + (boxWidths(gg)/2.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 2) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + + yy = (/y(gg, 1), y(gg, 3)/) + xx = (/(ff - (boxWidths(gg)/2.)), (ff - (boxWidths(gg)/2.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 3) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + + yy = (/y(gg, 2), y(gg, 2)/) + xx = (/(ff - (boxWidths(gg)/2.)), (ff + (boxWidths(gg)/2.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 4) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + + yy = (/y(gg, 1), y(gg, 3)/) + xx = (/(ff + (boxWidths(gg)/2.)), (ff + (boxWidths(gg)/2.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 5) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + + yy = (/y(gg, 1), y(gg, 1)/) + xx = (/(ff - (boxWidths(gg)/2.)), (ff + (boxWidths(gg)/2.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 6) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + + yy = (/y(gg, 0), y(gg, 1)/) + xx = (/ff, ff/) + polyres@gsLineDashPattern = 0 + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 7) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + polyres@gsLineDashPattern = 0 + + yy = (/y(gg, 0), y(gg, 0)/) + xx = (/(ff - (boxWidths(gg)/8.)), (ff + (boxWidths(gg)/8.))/) + if (.not.(any(ismissing(xx).or.ismissing(yy)))) then + dum(gg, 8) = gsn_add_polyline(wks, plot, xx, yy, polyres) + end if + end do + + dumname = unique_string("dum") + plot@$dumname$ = dum + if (isvar("xblab").eq."True") then + ; plotres@tmXBLabels = + plotres@tmXBLabels = xblab + end if + if (maximize) then + mres = True + mres@gsnDraw = False + mres@gsnFrame = False + maximize_output(wks, mres) + end if + return(plot) +end +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; ##################################################################### +undef("select_region_938") +function select_region_938(region:string, lsdata:numeric) +; Arguments +; region: a string specifying the region to be selected. +; +; Return value +; An array with the region boundary as (lon1, lat1, lon2,\ +; lat2, lon3, lat3, lon4, lat4 ect) based on the borders +; given through select_region1 +; with the name of the region as a string attribute @name. +; +; Description +; Translates a region specification into lat/lon boundaries and a region +; name as an attribute for non SREX regions +; +; Modification history +begin + + funcname = "select_region_938" + scriptname = "diag_scripts/lib/ncl/latlon.ncl" + verbosity = stringtointeger(getenv("ESMValTool_verbosity")) + + region_array_hlp = select_region1(region) + region_array = (/(/region_array_hlp(2), region_array_hlp(0)/), \ + (/region_array_hlp(2), region_array_hlp(1)/), \ + (/region_array_hlp(3), region_array_hlp(1)/), \ + (/region_array_hlp(3), region_array_hlp(0)/)/) + + lat = lsdata&lat + lon = lsdata&lon + inout = new((/dimsizes(lsdata)/), "float") + in = 0 + inn = 0 + do ilat = 0, dimsizes(lat) - 1 + do ilon = 0, dimsizes(lon) - 1 + if (dimsizes(region_array(:, 0)).le.2) then + if ((lat(ilat).ge.region_array(0, 1)).and.(lat(ilat)\ + .lt.region_array(1, 1)).and.(lon(ilon).ge.region_array(0, 0))\ + .and.(lon(ilon).lt.region_array(1, 0))) then + inou = "True" + if (inou.eq."True") then + inout(ilat, ilon) = 1. + in = in + 1 + end if + delete(inou) + inn = inn + 1 + end if + else + inou = gc_inout(lat(ilat), lon(ilon), region_array(:, 1),\ + region_array(:, 0)) + + if(inou.eq."True") then + inout(ilat, ilon) = 1. + in = in + 1 + delete(inou) + end if + inn = inn + 1 + end if + end do + end do + + return(inout) +end +; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; ##################################################################### +undef("select_region_srex_poly") +function select_region_srex_poly(region:string) +; +; Arguments +; region: a string specifying the region to be selected. +; +; Return value +; An array with the position for the string in the region boundary as +; (lon, lat) +; +; Description +; Position for the name of the region on a map. +; +; Modification history +begin + + funcname = "select_region_srex_poly" + scriptname = "diag_scripts/lib/ncl/latlon.ncl" + verbosity = stringtointeger(getenv("ESMValTool_verbosity")) + + if (region.eq."ALAs") then + region_array = (/200.000, 68.000/) + end if + if (region.eq."AMZs") then + region_array = (/285., 0.000/) + end if + if (region.eq."CAMs") then + region_array = (/265., 15./) + end if + if (region.eq."CASs") then + region_array = (/62.000, 40.000/) + end if + if (region.eq."CEUs") then + region_array = (/ 15.000, 52.000/) + end if + if (region.eq."CGIs") then + region_array = (/265.000, 65.000/) + end if + if (region.eq."CNAs") then + region_array = (/255.000, 40.000/) + end if + if (region.eq."EAFs") then + region_array = (/30.000, -5.0/) + end if + if (region.eq."EASs") then + region_array = (/110.000, 30.000/) + end if + if (region.eq."ENAs") then + region_array = (/280.000, 30.000/) + end if + if (region.eq."MEDs") then + region_array = (/355.000, 38.000/) + end if + if (region.eq."NASs") then + region_array = (/50.000, 72.000/) + end if + if (region.eq."NAUs") then + region_array = (/120.000, -20.000/) + end if + if (region.eq."NEBs") then + region_array = (/315.000, -6.000/) + end if + if (region.eq."NEUs") then + region_array = (/355.000, 65.000/) + end if + if (region.eq."SAFs") then + region_array = (/320.000, -20.000/) + end if + if (region.eq."SAHs") then + region_array = (/350.000, 22.000/) + end if + if (region.eq."SASs") then + region_array = (/70.000, 10.000/) + end if + if (region.eq."SAUs") then + region_array = (/120.000, -42.000/) + end if + if (region.eq."SSAs") then + region_array = (/295.0, -40.000/) + end if + if (region.eq."SEAs") then + region_array = (/105.000, -0.000/) + end if + if (region.eq."TIBs") then + region_array = (/85.000, 40.000/) + end if + if (region.eq."WAFs") then + region_array = (/350.000, 0.0/) + end if + if (region.eq."WASs") then + region_array = (/45.000, 25.000/) + end if + if (region.eq."WSAs") then + region_array = (/280.0, -30.0/) + end if + if (region.eq."WNAs") then + region_array = (/233.000, 35.0/) + end if + if (region.eq."Arctic") then + region_array = (/300.000, 75.000/) + end if + if (region.eq."Antarctic") then + region_array = (/300.000, -75.000/) + end if + if (region.eq."Caribbean") then + region_array = (/290.0, 15.0/) + end if + if (region.eq."WesternIndianOcean") then + region_array = (/60.000, -20.000/) + end if + if (region.eq."NorthernIndianOcean") then + region_array = (/70.000, 10.000/) + end if + if (region.eq."NorthernTropicalPacific") then + region_array = (/175.000, 10.000/) + end if + if (region.eq."EquatorialTropicalPacific") then + region_array = (/185.000, 0.000/) + end if + if (region.eq."SouthernTropicalPacific") then + region_array = (/195.000, -10.000/) + end if + if (region.eq."World") then + region_array = (/300.000, 0.000/) + end if + + return(region_array) + +end + +; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +undef("select_region_srex") +function select_region_srex(region:string, lsdata:numeric) +; Arguments +; region: a string specifying the region to be selected. +; +; Return value +; An array with the region boundary as (lon1, lat1, lon2,\ +; lat2, lon3, lat3, lon4, lat4 ect) +; with the name of the region as a string attribute @name. +; +; Description +; Translates a region specification into lat/lon boundaries and a region +; name as an attribute. +; +; Modification history +begin + + funcname = "select_region_srex" + scriptname = "diag_scripts/lib/ncl/latlon.ncl" + verbosity = stringtointeger(getenv("ESMValTool_verbosity")) + + if (region.eq."ALAs") then + region_array = (/(/255.000, 60.000/), \ + (/191.978, 60.000/), \ + (/191.978, 72.554/), \ + (/255.000, 72.554/)/) + end if + if (region.eq."AMZs") then + region_array = (/(/293.623, - 20.000/), \ + (/280.271, - 1.239/), \ + (/291.2, 11.439/), \ + (/310.00, 11.439/), \ + (/310.00, - 20.00/)/) + end if + if (region.eq."CAMs") then + region_array = (/(/291.2, 11.439/), \ + (/280.271, -1.239/), \ + (/241.677, 28.566/), \ + (/269.685, 28.566/)/) + end if + if (region.eq."CASs") then + region_array = (/(/60.000, 30.000/), \ + (/60.000, 50.000/), \ + (/75.000, 50.000/), \ + (/75.000, 30.000/)/) + end if + if (region.eq."CEUs") then + region_array = (/(/ -10.000, 45.000/), \ + (/ -10.000, 48.000/), \ + (/ 40.000, 61.320/), \ + (/ 40.000, 45.000/)/) + end if + if (region.eq."CGIs") then + region_array = (/(/350.000, 50.000/), \ + (/255.000, 50.000/), \ + (/255.000, 85.000/), \ + (/350.000, 85.000/)/) + end if + if (region.eq."CNAs") then + region_array = (/(/275.000, 50.000/), \ + (/275.000, 28.566/), \ + (/255.000, 28.566/), \ + (/255.000, 50.000/)/) + end if + if (region.eq."EAFs") then + region_array = (/(/25.000, -11.365/), \ + (/25.000, 15.000/), \ + (/51.990, 15.000/), \ + (/51.990, -11.365/)/) + end if + if (region.eq."EASs") then + region_array = (/(/100.000, 20.000/), \ + (/100.000, 50.000/), \ + (/145.000, 50.000/), \ + (/145.000, 20.000/)/) + end if + if (region.eq."ENAs") then + region_array = (/(/300.000, 25.000/), \ + (/275.000, 25.000/), \ + (/275.000, 50.000/), \ + (/300.000, 50.000/)/) + end if + if (region.eq."MEDs") then + region_array = (/(/350.000, 30.000/), \ + (/350.000, 45.000/), \ + (/40.000, 45.000/), \ + (/40.000, 30.000/)/) + end if + if (region.eq."NASs") then + region_array = (/(/40.000, 50.000/), \ + (/40.000, 70.000/), \ + (/180.000, 70.000/), \ + (/180.000, 50.000/)/) + end if + if (region.eq."NAUs") then + region_array = (/(/110.000, -30.000/), \ + (/110.000, -10.000/), \ + (/155.000, -10.000/), \ + (/155.000, -30.000/)/) + end if + if (region.eq."NEBs") then + region_array = (/(/326.000, -20.000/), \ + (/310.000, -20.000/), \ + (/310.000, 0.000/), \ + (/326.000, 0.000/)/) + end if + if (region.eq."NEUs") then + region_array = (/(/350.000, 48.000/), \ + (/350.000, 75.000/), \ + (/40.000, 75.000/), \ + (/40.000, 61.320/)/) + end if + if (region.eq."SAFs") then + region_array = (/(/350.000, -35.000/), \ + (/350.000, -11.365/), \ + (/308.01, -11.365/), \ + (/308.01, -35.000/)/) + end if + if (region.eq."SAHs") then + region_array = (/(/340.000, 15.000/), \ + (/340.000, 30.000/), \ + (/ 40.000, 30.000/), \ + (/ 40.000, 15.000/)/) + end if + if (region.eq."SASs") then + region_array = (/(/60.000, 5.000/), \ + (/60.000, 30.000/), \ + (/100.000, 30.000/), \ + (/100.000, 20.000/), \ + (/95.000, 20.000/), \ + (/95.000, 5.000/)/) + end if + if (region.eq."SAUs") then + region_array = (/(/110.000, -50.000/), \ + (/110.000, -30.000/), \ + (/180.000, -30.000/), \ + (/180.000, -50.000/)/) + end if + if (region.eq."SSAs") then + region_array = (/(/320.624, -20.000/), \ + (/320.624, -56.704/), \ + (/292.652, -56.704/), \ + (/287.859, -50.000/), \ + (/293.623, -20.000/)/) + end if + if (region.eq."SEAs") then + region_array = (/(/95.000, -10.000/), \ + (/95.000, 20.000/), \ + (/155.000, 20.000/), \ + (/155.000, -10.000/)/) + end if + if (region.eq."TIBs") then + region_array = (/(/75.000, 30.000/), \ + (/75.000, 50.000/), \ + (/100.000, 50.000/), \ + (/100.000, 30.000/)/) + end if + if (region.eq."WAFs") then + region_array = (/(/340.000, -11.365/), \ + (/340.000, 15.000/), \ + (/25.000, 15.000/), \ + (/25.000, -11.365/)/) + end if + if (region.eq."WASs") then + region_array = (/(/40.000, 15.000/), \ + (/40.000, 50.000/), \ + (/60.000, 50.000/), \ + (/60.000, 15.000/)/) + end if + if (region.eq."WSAs") then + region_array = (/(/280.271, -1.239/), \ + (/293.623, -20.000/), \ + (/287.859, -50.000/), \ + (/292.652, -56.704/), \ + (/277.978, -56.704/), \ + (/277.978, 0.530/)/) + end if + + if (region.eq."WNAs") then + region_array = (/(/255.000, 28.566/), \ + (/230.000, 28.566/), \ + (/230.000, 60.000/), \ + (/255.000, 60.000/)/) + end if + + if (region.eq."Arctic") then + region_array = (/(/0.000, 67.500/), \ + (/360.000, 90.000/)/) + + end if + if (region.eq."Antarctic") then + region_array = (/(/0.000, -90.000/), \ + (/360.000, -50.000/)/) + end if + if (region.eq."Caribbean") then + region_array = (/(/291.200, 11.400/), \ + (/274.200, 25.000/), \ + (/300.000, 25.000/), \ + (/300.000, 11.400/)/) + end if + if (region.eq."WesternIndianOcean") then + region_array = (/(/52.000, -25.000/), \ + (/75.000, 5.000/)/) + end if + if (region.eq."NorthernIndianOcean") then + region_array = (/(/60.000, 5.000/), \ + (/95.000, 30.000/)/) + end if + if (region.eq."NorthernTropicalPacific") then + region_array = (/(/155.000, 5.000/), \ + (/210.000, 25.000/)/) + end if + if (region.eq."EquatorialTropicalPacific") then + region_array = (/(/155.000, -5.000/), \ + (/230.000, 5.000/)/) + end if + if (region.eq."SouthernTropicalPacific") then + region_array = (/(/155.000, -25.000/), \ + (/230.000, -5.000/)/) + end if + if (region.eq."World") then + region_array = (/(/0.000, -90.000/), \ + (/360.000, 90.000/)/) + end if + + lat = lsdata&lat + lon = lsdata&lon + inout = new((/dimsizes(lsdata)/), "float") + in = 0 + inn = 0 + do ilat = 0, dimsizes(lat) - 1 + do ilon = 0, dimsizes(lon) - 1 + if (dimsizes(region_array(:, 0)).le.2) then + if ((lat(ilat).ge.region_array(0, 1)).and.(lat(ilat)\ + .lt.region_array(1, 1)).and.(lon(ilon).ge.region_array(0, 0))\ + .and.(lon(ilon).lt.region_array(1, 0))) then + inou = "True" + if (inou.eq."True") then + inout(ilat, ilon) = 1. + in = in + 1 + end if + delete(inou) + inn = inn + 1 + end if + else + inou = gc_inout(lat(ilat), lon(ilon), region_array(:, 1),\ + region_array(:, 0)) + + if(inou.eq."True") then + inout(ilat, ilon) = 1. + in = in + 1 + delete(inou) + end if + inn = inn + 1 + end if + end do + end do + + return(inout) +end +; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° +undef("add_legenda_page") +procedure add_legenda_page(wks, MODEL:string, colors:string, dashs:numeric,\ + scatters:string, ticknesses:numeric, place:string) +local MODEL, dim_mod, colors, dashs, edge_x, edge_y, edge_res, tx1res, \ + dim_lb, xleg, xl, yleg, yl, xtxt, ytxt, place, dim_lines,\ + space_lines, lin_sp, scatters, ticknesses +begin +; * * * Create Legend * * * * * * * * * * * * * * * * * * * * * * * * + dim_mod = dimsizes(MODEL) + dim_lines = floattoint(dim_mod/3) + 1 + if ((mod(dim_mod, 3)).eq.0) then + dim_lines = floattoint(dim_mod/3) + 1 + else + dim_lines = floattoint(dim_mod/3) + 2 + end if + lin_sp = 0.025 + space_lines = (dim_lines + 1) * lin_sp + + if (place.eq."bottom") + top_line = 0.20 + end if + if (place.eq."middle") + top_line = 0.42 + end if + if (place.eq."top") + top_line = 0.99 + end if + if ((place.ne."bottom").and.(place.ne."middle").and.(place.ne."top")) then + top_line = tofloat(place) + end if + bot_line = top_line - space_lines + ; edge_x = (/ 0.12, 0.92, 0.92, 0.12, 0.12/) + + edge_x = (/ 0.22, 0.76, 0.76, 0.22, 0.22/) + edge_y = (/space_lines + bot_line, space_lines + bot_line,\ + bot_line, bot_line, space_lines + bot_line/) + edge_res = True ; Indicate you want to set some resources. + edge_res@gsLineColor = "white" + gsn_polyline_ndc(wks, edge_x, edge_y, edge_res) + +; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + + dim_lb = dimsizes(MODEL) + + gs1res = True + tx1res = True + tx1res@txFontHeightF = lin_sp / 5 * 2 + + xleg = new((/3 * dim_lines, 4/), "float") + xl = new((/3, 4/), "float") + + do i = 0, 2 + xl(0, :) = fspan((edge_x(0) + 0.02), (edge_x(0) + 0.07), 4) + xl(1, :) = fspan(((edge_x(2) + edge_x(0))/2 - 0.09),\ + ((edge_x(2) + edge_x(0))/2 - 0.04), 4) + xl(2, :) = fspan((edge_x(2) - 0.20), (edge_x(2) - 0.15), 4) + end do + + nt = 0 + do j = 0, dim_lines - 1 + do i = 0, 2 + xleg(nt, :) = (/xl(i, :)/) + nt = nt + 1 + end do + end do + + yleg = new((/3 * dim_lines, 4/), "float") + yl = new(dim_lines, "float") + + do i = 0, dim_lines - 1 + yl(dim_lines - 1 - i) = edge_y(3) + (((edge_y(0) - \ + (edge_y(3)))/dim_lines) * \ + (i + 1)) - (lin_sp) + end do + + nt = 0 + do j = 0, dim_lines - 1 + do i = 0, 2 + yleg(nt, :) = (/yl(j)/) + nt = nt + 1 + end do + end do + + xtxt = new((/dim_lines * 3/), "float") + ytxt = new((/dim_lines * 3/), "float") + + nt = 0 + do j = 0, dim_lines - 1 + do i = 0, 2 + xtxt(nt) = xl(i, 3) + lin_sp/5. + nt = nt + 1 + end do + end do + nt = 0 + do i = 0, dim_lines - 1 + do j = 0, 2 + ytxt(nt) = (/yl(i)/) + nt = nt + 1 + end do + end do + + do i = 0, (dimsizes(MODEL) - 1) + gs1res@gsLineColor = colors(i) + gs1res@gsLineDashPattern = dashs(i) + gs1res@gsLineThicknessF = ticknesses(i) + tx1res@txFontColor = colors(i) + tx1res@txJust = "CenterLeft" ; change justification + if (scatters(i).eq."Markers") + gs1res@gsMarkerColor = colors(i) + gs1res@gsMarkerIndex = dashs(i) + gs1res@gsMarkerSizeF = 0.01 + gs1res@gsMarkerThicknessF = 1.5 + gsn_polymarker_ndc(wks, xleg(i, 2), yleg(i, 2), gs1res) + else + + gsn_polyline_ndc(wks, xleg(i, :), yleg(i, :), gs1res) + end if + + gsn_text_ndc(wks, MODEL(i), xtxt(i), ytxt(i), tx1res) + end do + +end + +; --------------------------------------------------------------------- +; The INTERSECTION of two sets is the set of elements which are in both sets. +; For example: let A = (1,2,3) and B = (3,4,5). +; The INTERSECTION of A and B, written A intersection B = (3). +; --------------------------------------------------------------------- +undef("get_unique_intersection") +function get_unique_intersection(a, b) +local atype, btype, au, bu, nau, nbu, abi, k, n, m +begin + atype = typeof(a) + btype = typeof(b) + if (atype.ne.btype) then + print("get_unique_intersection: arguments a and b must be the same type") + print(" typeof(a)="+atype) + print(" typeof(b)="+btype) + exit + end if + ; 'get_unique_values' sorts the elements + ; and returns a one-dimensional arry + au = get_unique_values(a) ; avoid duplicate 'a' entries + bu = get_unique_values(b) ; avoid duplicate 'b' entries + + nau = dimsizes(au) + nbu = dimsizes(bu) + ; reserve space + abi = new(min((/nau, nbu/)), typeof(a), default_fillvalue(atype)) + k = -1 + + na = 0 ; MH suggested loop + nb = 0 + do while(na.lt.nau.and.nb.lt.nbu) + if (bu(nb).gt.au(na)) then + na = na + 1 + else + if (au(na).gt.bu(nb)) then + nb = nb + 1 + else ; they are equal + k = k+1 + abi(k) = au(na) + nb = nb + 1 + na = na + 1 + end if + end if + end do + + if (k.eq.-1) then + abi := new(1, typeof(a), default_fillvalue(atype)) + abi@tag = "get_unique_intersection; NULL set; no intersection pairs" + return(abi) + end if + + abi@tag = "NCL: get_unique_intersection has created the result" + return(abi(0:k)) +end + +; --------------------------------------------------------------------- +; The DIFFERENCE of two sets is the set of elements, +; which are unique to each set. +; For example: let A = (1,2,3) and B = (3,4,5). +; The DIFFERENCE of A and B, written A difference B = (1,2,4,5). +; --------------------------------------------------------------------- +undef("get_unique_difference") +function get_unique_difference(a, b) +local atype, btype, abi, nabi, au, bu, abd, AB, nAB, n +begin + atype = typeof(a) + btype = typeof(b) + if (atype.ne.btype) then + print("get_unique_difference: arguments a and b must be the same type") + print(" typeof(a)=" + atype) + print(" typeof(b)=" + btype) + exit + end if + ; 'get_unique_values' sorts the elements + ; and returns a one-dimensional arry + abi = get_unique_intersection(a, b) ; intersect (common) values + if (ismissing(abi(0))) then ; NO intersect + ; 'get_unique_values' sorts the elements + au = get_unique_values(a) ; unique 'a' [au] + bu = get_unique_values(b) ; unique 'b' [bu] + ; all unique valuesl [d] difference + abd = array_append_record(au, bu, 0) + delete([/au, bu /]) + ; must sort again cuz 'ab' may not be in order + if (atype.eq."string") then + sqsort(abd) + else + qsort(abd) + end if + abd@tag = "NCL: get_unique_difference; arrays are DISJOINT; " + \ + "no intersection" + return(abd) + end if + nabi = dimsizes(abi) + + au = get_unique_values(a) ; 'a' [u]nique entries + bu = get_unique_values(b) ; 'b' [u]nique entries + nau = dimsizes(au) + nbu = dimsizes(bu) + ; reserve space + abd = new(nau + nbu, typeof(a), default_fillvalue(atype)) + ABu = array_append_record(au, bu, 0) ; unique AB + delete([/au, bu /]) + nABu = dimsizes(ABu) + + abd = new(nABu, typeof(a), default_fillvalue(atype)) + k = -1 + do n = 0, nABu - 1 + if (.not.any(abi.eq.ABu(n))) then + k = k+1 + abd(k) = ABu(n) + end if + end do + ; must sort again cuz 'ab' may not be in order + if (atype.eq."string") then + sqsort(abd(0:k)) + else + qsort(abd(0:k)) + end if + abd@tag = "NCL: get_unique_difference has created the result" + return(abd(0:k)) +end + +; ###################################################################### diff --git a/esmvaltool/diag_scripts/runoff_et/catchment_analysis.py b/esmvaltool/diag_scripts/runoff_et/catchment_analysis.py index 03b1d74989..6340813e94 100644 --- a/esmvaltool/diag_scripts/runoff_et/catchment_analysis.py +++ b/esmvaltool/diag_scripts/runoff_et/catchment_analysis.py @@ -556,9 +556,9 @@ def get_catch_avg(catchments, sim_cube): avg = {} for river, rid in catchments['catchments'].items(): data_catch = np.ma.masked_where( - catchments['cube'].data.astype(np.int) != rid, sim_cube.data) + catchments['cube'].data.astype(np.int64) != rid, sim_cube.data) area_catch = np.ma.masked_where( - catchments['cube'].data.astype(np.int) != rid, + catchments['cube'].data.astype(np.int64) != rid, catchments['area'].data) avg[river] = (data_catch * (area_catch / area_catch.sum())).sum() return avg diff --git a/esmvaltool/diag_scripts/sea_surface_salinity/compare_salinity.py b/esmvaltool/diag_scripts/sea_surface_salinity/compare_salinity.py index e1fa384297..ec13a92b9d 100644 --- a/esmvaltool/diag_scripts/sea_surface_salinity/compare_salinity.py +++ b/esmvaltool/diag_scripts/sea_surface_salinity/compare_salinity.py @@ -125,7 +125,7 @@ def create_radar_plot(self, data_info, data, reference, reference_alias, letters, color='grey', size=8, - rotation=angles[:-1]) + rotation=45) # Draw ylabels ax.set_rlabel_position(0) diff --git a/esmvaltool/diag_scripts/seaice/seaice_tsline.ncl b/esmvaltool/diag_scripts/seaice/seaice_tsline.ncl index b51bfd586a..eaf0a727e1 100644 --- a/esmvaltool/diag_scripts/seaice/seaice_tsline.ncl +++ b/esmvaltool/diag_scripts/seaice/seaice_tsline.ncl @@ -295,8 +295,8 @@ begin else ; Create plot variables - wks_ext = gsn_open_wks(file_type, config_user_info@plot_dir + out_ext) - wks_area = gsn_open_wks(file_type, config_user_info@plot_dir + out_area) + wks_ext = gsn_open_wks(file_type, plot_dir + out_ext) + wks_area = gsn_open_wks(file_type, plot_dir + out_area) ; Define plot resources res = True @@ -338,7 +338,7 @@ begin ; but is same for both area and extent anyway if (diag_script_info@legend_outside) then val_area@legend_outside = True - wks_area@legendfile = config_user_info@plot_dir + out_ext + "_legend" + wks_area@legendfile = plot_dir + out_ext + "_legend" end if else diag_script_info@legend_outside = False @@ -361,7 +361,8 @@ begin nc_ext = \ ncdf_write(val_ext, config_user_info@work_dir + out_ext + ".nc") - log_provenance(nc_ext, out_ext, caption_ext, \ + fullname = plot_dir + out_ext + "." + file_type + log_provenance(nc_ext, fullname, caption_ext, \ (/"mean", "stddev", "clim"/), domain, "times", \ (/"senftleben_daniel", "gottschaldt_klaus-dirk"/), \ "stroeve07grl", infiles) @@ -374,7 +375,8 @@ begin nc_area = \ ncdf_write(val_area, config_user_info@work_dir + out_area + ".nc") - log_provenance(nc_area, out_area, caption_area, \ + fullname = plot_dir + out_area + "." + file_type + log_provenance(nc_area, fullname, caption_area, \ (/"mean", "stddev", "clim"/), domain, "times", \ (/"senftleben_daniel", "gottschaldt_klaus-dirk"/), \ "stroeve07grl", infiles) diff --git a/esmvaltool/diag_scripts/shared/_supermeans.py b/esmvaltool/diag_scripts/shared/_supermeans.py index 0614d1b8c0..7099ba4725 100644 --- a/esmvaltool/diag_scripts/shared/_supermeans.py +++ b/esmvaltool/diag_scripts/shared/_supermeans.py @@ -297,7 +297,7 @@ def time_average_by(cube, periods='time'): idx_obj = [None] * cube.data.ndim idx_obj[cube.coord_dims('time')[0]] = slice( None) # [None, slice(None), None] == [np.newaxis, :, np.newaxis] - cube.data *= durations_cube.data[idx_obj] + cube.data *= durations_cube.data[tuple(idx_obj)] if periods == ['time']: # duration weighted averaging cube = cube.collapsed(periods, iris.analysis.SUM) @@ -311,7 +311,7 @@ def time_average_by(cube, periods='time'): if durations_cube.data.shape == (): cube.data /= durations_cube.data else: - cube.data /= durations_cube.data[idx_obj] + cube.data /= durations_cube.data[tuple(idx_obj)] # correct cell methods cube.cell_methods = orig_cell_methods diff --git a/esmvaltool/diag_scripts/shared/_validation.py b/esmvaltool/diag_scripts/shared/_validation.py index 0bbf639d3e..c922f91e65 100644 --- a/esmvaltool/diag_scripts/shared/_validation.py +++ b/esmvaltool/diag_scripts/shared/_validation.py @@ -1,56 +1,17 @@ """Load functions needed by diags with CONTROL and EXPERIMENT.""" import logging import os -import sys import iris from esmvalcore.preprocessor import climate_statistics from esmvaltool.diag_scripts.shared import select_metadata -logger = logging.getLogger(os.path.basename(__file__)) +logger = logging.getLogger(os.path.basename(__file__)) -def _disentagle_iden_datasets(dat_selection): - """ - Disentangle identical dataset names for CONTROL and EXPERIMENT. - This func takes a list of exactly two dictionaries - that have the same value for `dataset` key and returns a composite - dataset name assembled from the actual dataset name + parameter that - is different between the two dicts (e.g. mip or exp or grid etc.) - """ - orig_ctrl, orig_exper = dat_selection - dif_pars = [ - key for key in orig_ctrl.keys() & orig_exper - if orig_ctrl[key] != orig_exper[key] - ] - - # do not populate dataset name with these (long) params - unwanted_pars = ['filename', 'alias', 'recipe_dataset_index'] - dif_pars = [ - dif_par for dif_par in dif_pars if dif_par not in unwanted_pars - ] - if not dif_pars: - logger.error("Your CONTROL and EXPERIMENT " - "datasets are completely identical, your analysis " - "will output garbage, exiting.") - sys.exit(1) - - # assemble new dataset names - new_ctrl = [str(orig_ctrl[k]) for k in dif_pars] - new_ctrl = orig_ctrl['dataset'] + "-" + "-".join(new_ctrl) - new_exper = [str(orig_exper[k]) for k in dif_pars] - new_exper = orig_exper['dataset'] + "-" + "-".join(new_exper) - - # recast the new names in the old dicts - orig_ctrl['dataset'] = new_ctrl - orig_exper['dataset'] = new_exper - - return orig_ctrl, orig_exper - - -def get_control_exper_obs(short_name, input_data, cfg, cmip_type): +def get_control_exper_obs(short_name, input_data, cfg, cmip_type=None): """ Get control, exper and obs datasets. @@ -62,10 +23,14 @@ def get_control_exper_obs(short_name, input_data, cfg, cmip_type): short_name: variable short name input_data: dict containing the input data info cfg: config file as used in this module + cmip_type: optional, CMIP project type (CMIP5 or CMIP6) """ - # select data per short name and CMIP type - dataset_selection = select_metadata( - input_data, short_name=short_name, project=cmip_type) + # select data per short name and optional CMIP type + if not cmip_type: + dataset_selection = select_metadata(input_data, short_name=short_name) + else: + dataset_selection = select_metadata(input_data, short_name=short_name, + project=cmip_type) # get the obs datasets if specified in recipe if 'observational_datasets' in cfg: @@ -82,22 +47,30 @@ def get_control_exper_obs(short_name, input_data, cfg, cmip_type): logger.info("Observations dataset(s) %s", [obs['dataset'] for obs in obs_selection]) - # determine CONTROL and EXPERIMENT datasets + # make sure the chosen datasets for control and exper are available + alias_selection = [] + for model in dataset_selection: + try: + dataset_name = model['alias'].split("_")[1] + except IndexError: + dataset_name = model['alias'] + alias_selection.append(dataset_name) + + if cfg['control_model'] not in alias_selection: + raise ValueError(f"Control dataset {cfg['control_model']} " + "not in datasets") - # corner case: they could be the same dataset name - if cfg['control_model'] == cfg['exper_model']: - logger.info("Identical Control/Experiment dataset names: %s", - dataset_selection[0]['dataset']) - control, experiment = _disentagle_iden_datasets(dataset_selection) - return control, experiment, obs_selection + if cfg['exper_model'] not in alias_selection: + raise ValueError(f"Experiment dataset {cfg['exper_model']} " + "not in datasets") - # if they're not the same dataset, fire away + # pick control and experiment dataset for model in dataset_selection: - if model['dataset'] == cfg['control_model']: - logger.info("Control dataset %s", model['dataset']) + if cfg['control_model'] in model['alias'].split("_"): + logger.info("Control dataset %s", model['alias']) control = model - elif model['dataset'] == cfg['exper_model']: - logger.info("Experiment dataset %s", model['dataset']) + elif cfg['exper_model'] in model['alias'].split("_"): + logger.info("Experiment dataset %s", model['alias']) experiment = model return control, experiment, obs_selection diff --git a/esmvaltool/diag_scripts/shared/dataset_selection.ncl b/esmvaltool/diag_scripts/shared/dataset_selection.ncl new file mode 100644 index 0000000000..0d29ae46e8 --- /dev/null +++ b/esmvaltool/diag_scripts/shared/dataset_selection.ncl @@ -0,0 +1,168 @@ +; ############################################################################# +; GENERAL ROUTINES FOR SELECTING DATASETS +; ############################################################################# +; Please consider using of extending existing routines before adding new ones. +; Check the header of each routine for documentation. +; +; Contents: +; function get_obs +; function get_mod +; ############################################################################# + + +; ############################################################################# +undef("get_obs") +function get_obs(names[*]:string, projects[*]:string, exclude[*]:string) +; +; Arguments +; names: names of datasets +; projects: project class of datasets +; exclude: optional list of observational datasets to explicitely exclude +; +; Return value +; An integer array containing all indices of observational datasets +; (project classes OBS, OBS6, obs4mips). +; ERA5 data are handled separately because they can be of project +; OBS6 or nativ6. ERA5 (if present) are also returned as observational +; dataset. +; +; Description +; Checks the project class of all datasets and returns all indices +; of datasets that belong to one of the observational classes. +; +; Caveats +; ERA5 is the only "native6" observational dataset that can be found +; at the moment. An extension to include other native6 observations +; is needed once more of such datasets are available. +; +; References +; +; Modification history +; 20211018-lauer_axel: added option to exclude observational datasets +; 20210415-lauer_axel: written. +; +local funcname, scriptname, i, idx, idxobs +begin + + funcname = "get_obs" + scriptname = "diag_scripts/shared/dataset_selection.ncl" + enter_msg(scriptname, funcname) + + ; find indices of all OBS and obs4mips datasets + ; (treat ERA5 as special case) + + idx = new(dimsizes(projects), integer) + + do i = 0, dimsizes(projects) - 1 + if (isStrSubset(str_lower(projects(i)), "obs")) + idx(i) = 1 + else + idx(i) = 0 + end if + ; ERA5 might be native6 and thus not yet included in the list + ; of observations + if (isStrSubset(str_lower(names(i)), "era5") .and. \ + isStrSubset(str_lower(projects(i)), "native")) then + idx(i) = 1 + end if + + ; check for observational datasets to exclude (optional) + + do j = 0, dimsizes(exclude) - 1 + if (names(i) .eq. exclude(j)) then + idx(i) = 2 + end if + end do + end do + + idxobs = ind(idx .eq. 1) + + if (all(ismissing(idxobs))) then + idxobs = -1 + else + log_info("The following observational datasets are used for calculating" \ + + " multiobs products: " + str_join(names(idxobs), ", ")) + idxexcl = ind(idx .eq. 2) + if (.not.all(ismissing(idxexcl))) then + log_info("Observational datasets excluded by user: " \ + + str_join(names(idxexcl), ", ")) + end if + end if + + leave_msg(scriptname, funcname) + return(idxobs) + +end + +; ############################################################################# +undef("get_mod") +function get_mod(names[*]:string, projects[*]:string) +; +; Arguments +; names: names of datasets +; projects: project class of datasets +; +; Return value +; An integer array containing all indices of model datasets +; excluding MultiModelMean / MultiModelMedian (if present). +; +; Description +; Checks the project class of all datasets and returns all indices +; of datasets that do not belong to one of the observational classes and +; that are not "MultiModelMean" or "MultiModelMedian". +; +; Caveats +; The dataset names MultiModelMean and MultiModelMedian are hardcoded and +; need to be adjusted if the corresponding preprocessor creating these +; datasets should change. +; +; References +; +; Modification history +; 20210415-lauer_axel: written. +; +local funcname, scriptname, i, idx, idxmod, idxobs, mm_ind1, mm_ind2 +begin + + funcname = "get_mod" + scriptname = "diag_scripts/shared/dataset_selection.ncl" + enter_msg(scriptname, funcname) + + idx = new(dimsizes(projects), integer) + idx = 1 + + ; flag all observations (if present) + + idxobs = get_obs(names, projects, "") + + if (idxobs(0) .ne. -1) then + idx(idxobs) = 0 + end if + + ; flag MultiModelMean and MultiModelMedian (if preset) + + mm_ind1 = ind(names .eq. "MultiModelMean") + mm_ind2 = ind(names .eq. "MultiModelMedian") + + if (.not. ismissing(mm_ind1)) then + idx(mm_ind1) = 0 + end if + + if (.not. ismissing(mm_ind2)) then + idx(mm_ind2) = 0 + end if + + idxmod = ind(idx .eq. 1) + + if (all(ismissing(idxmod))) then + idxmod = -1 + else + log_info("The following model datasets have been found (exluding " \ + + "MultiModelMean/MultiModelMedian): " \ + + str_join(names(idxmod), ", ")) + end if + + leave_msg(scriptname, funcname) + return(idxmod) + +end diff --git a/esmvaltool/diag_scripts/shared/iris_helpers.py b/esmvaltool/diag_scripts/shared/iris_helpers.py index 00eb2970a4..1f38014999 100644 --- a/esmvaltool/diag_scripts/shared/iris_helpers.py +++ b/esmvaltool/diag_scripts/shared/iris_helpers.py @@ -1,16 +1,12 @@ """Convenience functions for :mod:`iris` objects.""" import logging -import warnings from pprint import pformat import iris import numpy as np from cf_units import Unit -from iris import NameConstraint from iris.exceptions import CoordinateNotFoundError -from esmvaltool import ESMValToolDeprecationWarning - from ._base import group_metadata logger = logging.getLogger(__name__) @@ -371,35 +367,3 @@ def unify_time_coord(cube, target_units='days since 1850-01-01 00:00:00'): coord_dims = cube.coord_dims('time') cube.remove_coord('time') cube.add_dim_coord(new_time_coord, coord_dims) - - -def var_name_constraint(var_name): - """:class:`iris.Constraint` using ``var_name``. - - Warning - ------- - .. deprecated:: 2.6.0 - This function has been deprecated in ESMValTool version 2.6.0 and is - scheduled for removal in version 2.8.0. Please use the function - :class:`iris.NameConstraint` with the argument ``var_name`` instead: - this is an exact replacement. - - Parameters - ---------- - var_name: str - ``var_name`` used for the constraint. - - Returns - ------- - iris.Constraint - Constraint. - - """ - deprecation_msg = ( - "The function ``var_name_constraint`` has been deprecated in " - "ESMValTool version 2.6.0 and is scheduled for removal in version " - "2.8.0. Please use the function ``iris.NameConstraint`` with the " - "argument ``var_name`` instead: this is an exact replacement." - ) - warnings.warn(deprecation_msg, ESMValToolDeprecationWarning) - return NameConstraint(var_name=var_name) diff --git a/esmvaltool/diag_scripts/shared/plot/_plot.py b/esmvaltool/diag_scripts/shared/plot/_plot.py index c9255a394f..d7db4e1b14 100644 --- a/esmvaltool/diag_scripts/shared/plot/_plot.py +++ b/esmvaltool/diag_scripts/shared/plot/_plot.py @@ -415,13 +415,14 @@ def multi_dataset_scatterplot(x_data, y_data, datasets, filepath, **kwargs): marker=style['mark'], **(kwargs.get('plot_kwargs', empty_dict)[idx])) - # Costumize plot + # Customize plot legend = _process_axes_functions(axes, kwargs.get('axes_functions')) # Save plot - fig.savefig(filepath, - additional_artists=[legend], - **kwargs.get('save_kwargs', {})) + savefig_kwargs = dict(kwargs.get('save_kwargs', {})) + if legend is not None: + savefig_kwargs['bbox_extra_artists'] = [legend] + fig.savefig(filepath, **savefig_kwargs) logger.info("Wrote %s", filepath) plt.close() @@ -494,12 +495,12 @@ def scatterplot(x_data, y_data, filepath, **kwargs): axes.plot(x_vals, y_data[idx], **(kwargs.get('plot_kwargs', empty_dict)[idx])) - # Costumize plot + # Customize plot legend = _process_axes_functions(axes, kwargs.get('axes_functions')) # Save plot fig.savefig(filepath, - additional_artists=[legend], + bbox_extra_artists=[legend], **kwargs.get('save_kwargs', {})) logger.info("Wrote %s", filepath) plt.close() diff --git a/esmvaltool/diag_scripts/shared/plot/aux_plotting.ncl b/esmvaltool/diag_scripts/shared/plot/aux_plotting.ncl index 27a1196b91..23fe72b5b0 100644 --- a/esmvaltool/diag_scripts/shared/plot/aux_plotting.ncl +++ b/esmvaltool/diag_scripts/shared/plot/aux_plotting.ncl @@ -6,8 +6,8 @@ ; ; Contents: ; -; procedure create_legend_lines ; function output_type +; procedure create_legend_lines ; procedure copy_VarAtt_sel ; function panelling ; function get_plot_dir @@ -37,6 +37,41 @@ load "$diag_scripts/../interface_scripts/auxiliary.ncl" load "$diag_scripts/../interface_scripts/logging.ncl" +; ############################################################################# +undef("output_type") +function output_type() +; +; Arguments +; +; Return value +; A string with the output file type +; +; Description +; Provides a default, if file type is not explicitly specified +; +; Caveats +; +; Modification history +; 20131028-gottschaldt_klaus-dirk: written. +; +local funcname, scriptname, file_type +begin + + funcname = "output_type" + scriptname = "diag_scripts/shared/plot/aux_plotting.ncl" + enter_msg(scriptname, funcname) + + file_type = config_user_info@output_file_type + if (ismissing(file_type)) then + file_type = "ps" + end if + file_type = str_lower(file_type) + + leave_msg(scriptname, funcname) + return(file_type) + +end + ; ############################################################################# undef("create_legend_lines") procedure create_legend_lines(labels:string, \ @@ -75,7 +110,8 @@ begin enter_msg(scriptname, funcname) ; Open workstation - wks_legend = gsn_open_wks("epsi", outfile) + file_type = output_type() + wks_legend = gsn_open_wks(file_type, outfile) ; General resources res = True @@ -178,41 +214,6 @@ begin end -; ############################################################################# -undef("output_type") -function output_type() -; -; Arguments -; -; Return value -; A string with the output file type -; -; Description -; Provides a default, if file type is not explicitly specified -; -; Caveats -; -; Modification history -; 20131028-gottschaldt_klaus-dirk: written. -; -local funcname, scriptname, file_type -begin - - funcname = "output_type" - scriptname = "diag_scripts/shared/plot/aux_plotting.ncl" - enter_msg(scriptname, funcname) - - file_type = config_user_info@output_file_type - if (ismissing(file_type)) then - file_type = "ps" - end if - file_type = str_lower(file_type) - - leave_msg(scriptname, funcname) - return(file_type) - -end - ; ############################################################################# undef("copy_VarAtt_sel") procedure copy_VarAtt_sel(var1, var2, sel: string) diff --git a/esmvaltool/diag_scripts/shared/plot/portrait_plot.ncl b/esmvaltool/diag_scripts/shared/plot/portrait_plot.ncl index d90b0871de..903d4b51a6 100644 --- a/esmvaltool/diag_scripts/shared/plot/portrait_plot.ncl +++ b/esmvaltool/diag_scripts/shared/plot/portrait_plot.ncl @@ -45,6 +45,8 @@ function portrait_plot(wks_in[1], ; Caveats ; ; Modification history +; 20220609-bock_lisa: added gaps between project blocks and improved style +; 20211014-bock_lisa: added sorting by project ; 20151027-righi_mattia: added option for displaying rankings. ; 20140605-righi_mattia: modified with flexible plot shapes. ; 20140204-frank_franziska: extended. @@ -290,9 +292,14 @@ begin res@vpYF = 0.2 + res@vpHeightF ; Title - res@tiMainFontHeightF = 0.020 + res@tiMainFontHeightF = 0.01 if (isatt(data, "metric")) then - res@tiMainString = data@metric + if (isatt(data, "caption")) then + res@tiMainOffsetYF = 0.01 + res@tiMainString = data@caption + else + res@tiMainString = data@metric + end if end if ; Override defaults with "res_" attributes of "data" @@ -306,6 +313,7 @@ begin resTxt = True resTxt@txFontHeightF = 0.010 resTxt@txJust = "CenterCenter" + resTxt@txFont = "times-roman" ; Polygons resources resPol = True @@ -518,80 +526,104 @@ begin scale_font = 1. end if resTxt@txFontHeightF = min((/0.012 * scale_font, \ - 0.57 * scale_font / max((/ndiag, nmod/))/)) + 0.57 * scale_font / max((/ndiag, (nmod)/))/)) resTxt@txJust = "CenterRight" step = res@vpHeightF / ndiag xpos = 0.195 ypos = 0.2 + step / 2. do idiag = 0, ndiag - 1 - gsn_text_ndc(wks, data&diagnostics(idiag), xpos, ypos, resTxt) + if (isatt(data, "diag_label")) then + gsn_text_ndc(wks, data@diag_label(idiag), xpos, ypos, resTxt) + else + gsn_text_ndc(wks, data&diagnostics(idiag), xpos, ypos, resTxt) + end if ypos = ypos + step end do ; Add text for the models - resTxt@txAngleF = 90. + resTxt@txAngleF = 45. + resTxt@txFontHeightF = min((/0.12 * scale_font, \ + 0.37 * scale_font / max((/ndiag, (nmod)/))/)) step = res@vpWidthF / nmod resTxt@txJust = "CenterRight" xposs = 0.2 + (x_space+.5)*(res@vpWidthF/(nmod+2.*nbreak)) - ypos = 0.19 + yposs = 0.19 do imod = 0, nmod - 1 - gsn_text_ndc(wks, data&models(imod), xposs(imod), ypos, resTxt) + gsn_text_ndc(wks, data&models(imod), xposs(imod), yposs, resTxt) end do + ; Add subtitles + if (isatt(diag_script_info, "project_order")) then + titles = diag_script_info@project_order + resTxt@txAngleF = 0. + resTxt@txFontHeightF = 0.008 + resTxt@txJust = "CenterLeft" + ypos = ypos + 0.005 + gsn_text_ndc(wks, titles(0), xposs(0), ypos, resTxt) + do ititle = 1, dimsizes(titles) - 1 + gsn_text_ndc(wks, titles(ititle), xposs(data@breakpoints(ititle-1)+1), \ + ypos, resTxt) + end do + end if + ; Draw a labelbar - resTxt@txFontHeightF = 0.015 * scale_font - resTxt@txAngleF = 0. - resTxt@txJust = "CenterLeft" - height = res@vpHeightF / npos - xp1 = 0.2 + res@vpWidthF + 0.01 - xp2 = 0.2 + res@vpWidthF + 0.04 - xpm = (xp1 + xp2) / 2. - ypos = 0.2 - - il = 0 - do ii = 0, npos - 1 - resPol@gsFillColor = pos(ii) - if (ii.eq.0) then - if (label_lo) then - gsn_polygon_ndc(wks, (/xpm, xp1, xp2, xpm/),\ - (/ypos, ypos + height, \ - ypos + height, ypos/), resPol) - else - gsn_polygon_ndc(wks, (/xp1, xp1, xp2, xp2, xp1/),\ - (/ypos, ypos + height, \ - ypos + height, ypos, ypos/), resPol) - gsn_text_ndc(wks, sprintf("%4.2f", levels(il)), \ - xp2 + 0.01, ypos, resTxt) - il = il + 1 - end if - elseif (ii.eq.(npos - 1)) then - if (label_hi) then - gsn_polygon_ndc(wks, (/xp1, xpm, xp2, xp1/), \ - (/ypos, ypos + height, ypos, ypos/), resPol) - gsn_text_ndc(wks, sprintf("%4.2f", levels(il)), \ - xp2 + 0.01, ypos, resTxt) - il = il + 1 + if (.not.isatt(data, "no_labelbar") .or. \ + (isatt(data, "no_labelbar") .and. data@no_labelbar .eq. False)) then + resTxt@txFontHeightF = 0.015 * scale_font + resTxt@txAngleF = 0. + resTxt@txJust = "CenterLeft" + height = res@vpHeightF / npos + xp1 = 0.2 + res@vpWidthF + 0.01 + xp2 = 0.2 + res@vpWidthF + 0.04 + xpm = (xp1 + xp2) / 2. + ypos = 0.2 + + il = 0 + do ii = 0, npos - 1 + resPol@gsFillColor = pos(ii) + if (ii.eq.0) then + if (label_lo) then + gsn_polygon_ndc(wks, (/xpm, xp1, xp2, xpm/),\ + (/ypos, ypos + height, \ + ypos + height, ypos/), resPol) + else + gsn_polygon_ndc(wks, (/xp1, xp1, xp2, xp2, xp1/),\ + (/ypos, ypos + height, \ + ypos + height, ypos, ypos/), resPol) + gsn_text_ndc(wks, sprintf("%4.2f", levels(il)), \ + xp2 + 0.01, ypos, resTxt) + il = il + 1 + end if + elseif (ii.eq.(npos - 1)) then + if (label_hi) then + gsn_polygon_ndc(wks, (/xp1, xpm, xp2, xp1/), \ + (/ypos, ypos + height, ypos, ypos/), resPol) + gsn_text_ndc(wks, sprintf("%4.2f", levels(il)), \ + xp2 + 0.01, ypos, resTxt) + il = il + 1 + else + gsn_polygon_ndc(wks, (/xp1, xp1, xp2, xp2, xp1/),\ + (/ypos, ypos + height, \ + ypos + height, ypos, ypos/), resPol) + gsn_text_ndc(wks, sprintf("%4.2f", levels(il)), \ + xp2 + 0.01, ypos, resTxt) + il = il + 1 + gsn_text_ndc(wks, sprintf("%4.2f", levels(il)), \ + xp2 + 0.01, ypos + height, resTxt) + il = il + 1 + end if else - gsn_polygon_ndc(wks, (/xp1, xp1, xp2, xp2, xp1/),\ - (/ypos, ypos + height, \ - ypos + height, ypos, ypos/), resPol) + gsn_polygon_ndc(wks, (/xp1, xp1, xp2, xp2, xp1/), \ + (/ypos, ypos + height, ypos + height, ypos, ypos/), \ + resPol) gsn_text_ndc(wks, sprintf("%4.2f", levels(il)), \ xp2 + 0.01, ypos, resTxt) il = il + 1 - gsn_text_ndc(wks, sprintf("%4.2f", levels(il)), \ - xp2 + 0.01, ypos + height, resTxt) - il = il + 1 end if - else - gsn_polygon_ndc(wks, (/xp1, xp1, xp2, xp2, xp1/), \ - (/ypos, ypos + height, ypos + height, ypos, ypos/), \ - resPol) - gsn_text_ndc(wks, sprintf("%4.2f", levels(il)), \ - xp2 + 0.01, ypos, resTxt) - il = il + 1 - end if - ypos = ypos + height - end do + ypos = ypos + height + end do + end if + draw(plot) frame(wks) diff --git a/esmvaltool/diag_scripts/shared/plot/rgb/ipcc-ar6_wind_div.rgb b/esmvaltool/diag_scripts/shared/plot/rgb/ipcc-ar6_wind_div.rgb new file mode 100644 index 0000000000..ee83bf24ac --- /dev/null +++ b/esmvaltool/diag_scripts/shared/plot/rgb/ipcc-ar6_wind_div.rgb @@ -0,0 +1,260 @@ +ncolors=256 + +#R G B +43 25 76 +43 27 77 +43 28 79 +43 29 80 +43 31 82 +43 32 83 +43 34 84 +43 35 86 +43 37 87 +43 38 89 +43 40 90 +43 41 92 +42 42 93 +42 44 94 +42 45 96 +42 47 97 +42 48 99 +42 50 100 +42 51 102 +42 53 103 +42 54 105 +41 55 106 +41 57 108 +41 58 109 +41 60 111 +41 61 112 +41 63 114 +41 64 115 +41 66 117 +41 68 118 +41 69 120 +42 71 121 +42 72 123 +42 74 124 +43 75 126 +43 77 127 +43 79 129 +44 80 130 +45 82 131 +46 84 133 +46 85 134 +47 87 136 +48 89 137 +49 90 139 +51 92 140 +52 94 141 +53 95 143 +55 97 144 +56 99 146 +58 100 147 +59 102 148 +61 104 149 +63 105 151 +64 107 152 +66 109 153 +68 111 155 +70 112 156 +72 114 157 +74 116 158 +76 117 159 +78 119 161 +80 121 162 +82 122 163 +84 124 164 +86 126 165 +88 127 167 +90 129 168 +92 131 169 +94 132 170 +97 134 171 +99 136 172 +101 137 174 +103 139 175 +105 141 176 +107 142 177 +109 144 178 +112 146 179 +114 147 181 +116 149 182 +118 151 183 +120 153 184 +123 154 185 +125 156 186 +127 158 188 +129 159 189 +131 161 190 +134 163 191 +136 164 192 +138 166 193 +140 168 195 +143 170 196 +145 171 197 +147 173 198 +149 175 199 +152 176 201 +154 178 202 +156 180 203 +158 182 204 +161 183 205 +163 185 206 +165 187 208 +167 188 209 +170 190 210 +172 192 211 +174 194 212 +177 195 214 +179 197 215 +181 199 216 +183 201 217 +186 202 218 +188 204 219 +190 206 220 +192 207 222 +195 209 223 +197 211 224 +199 213 225 +201 214 225 +203 216 226 +205 217 227 +207 219 228 +209 221 228 +210 222 229 +212 223 229 +214 225 230 +215 226 230 +216 227 230 +217 228 229 +218 229 229 +218 230 228 +218 230 228 +218 231 227 +218 231 226 +218 231 224 +217 231 223 +216 231 221 +215 230 220 +214 230 218 +213 229 216 +211 228 215 +210 228 213 +208 227 211 +206 226 209 +204 225 207 +202 224 205 +201 223 203 +199 222 201 +197 221 199 +195 219 197 +193 218 195 +191 217 193 +189 216 191 +187 215 189 +185 214 187 +183 212 185 +181 211 183 +179 210 181 +177 209 179 +174 208 177 +172 207 175 +170 205 173 +168 204 171 +166 203 170 +164 202 168 +162 201 166 +160 199 164 +158 198 162 +156 197 160 +154 196 158 +152 195 156 +150 193 154 +148 192 152 +146 191 150 +144 190 148 +142 189 146 +140 188 144 +138 186 142 +136 185 140 +134 184 138 +132 183 137 +130 182 135 +128 181 133 +126 179 131 +124 178 129 +122 177 127 +120 176 125 +118 175 123 +116 173 121 +114 172 119 +112 171 117 +111 170 115 +109 169 113 +107 167 111 +105 166 109 +103 165 107 +101 164 105 +99 162 103 +97 161 101 +95 160 99 +93 158 97 +91 157 95 +89 155 93 +88 154 91 +86 153 89 +84 151 87 +82 150 84 +81 148 82 +79 146 80 +78 145 78 +76 143 76 +75 141 73 +73 140 71 +72 138 69 +71 136 67 +70 135 65 +69 133 62 +68 131 60 +68 129 58 +67 128 56 +66 126 54 +66 124 52 +65 123 51 +65 121 49 +65 119 47 +64 118 45 +64 116 44 +64 115 42 +64 113 40 +64 112 39 +64 110 37 +64 109 36 +64 107 34 +64 106 33 +64 105 32 +64 103 30 +64 102 29 +64 101 28 +64 99 26 +65 98 25 +65 97 24 +65 95 22 +65 94 21 +65 93 20 +65 92 18 +65 90 17 +65 89 16 +65 88 15 +65 87 13 +66 86 12 +66 84 11 +66 83 9 +66 82 8 +66 81 7 +66 80 5 +66 78 4 +66 77 3 +66 76 2 + diff --git a/esmvaltool/diag_scripts/shared/plot/styles/cmip356.style b/esmvaltool/diag_scripts/shared/plot/styles/cmip356.style new file mode 100644 index 0000000000..e64e3d71e3 --- /dev/null +++ b/esmvaltool/diag_scripts/shared/plot/styles/cmip356.style @@ -0,0 +1,205 @@ +############################################################################### +# CMIP3+5+6 STYLES +############################################################################### +# This file defines the plot attributes for the CMIP6 models. +# +# MODEL NAME: must be the same as given in the main recipe. +# COLOR: can be either an NCL named color, a RGB code (size 3) on a 0-255 scale +# or a RGBA code (size 4) with the last element indicating the opacity +# on a 0-1 scale (0 = transparent, 1 = full), see +# http://www.ncl.ucar.edu/Applications/Scripts/rgb.txt +# https://www.ncl.ucar.edu/Document/glossary.shtml#RGB +# https://www.ncl.ucar.edu/Document/glossary.shtml#RGBA +# https://www.ncl.ucar.edu/Document/Graphics/create_color_table.shtml +# DASH: the dash pattern index lines, see +# https://www.ncl.ucar.edu/Document/Graphics/Images/dashpatterns.png +# THICK: the line thickness (NCL default is 1) +# MARK: marker index for markers, see +# https://www.ncl.ucar.edu/Document/Graphics/Images/markers.png +# AVG-STD: 0 = takes part in the calculation of mean and stddev +# 1 = does not take part in the calculation of mean and stddev +# (usually 0 for models, 1 for observations/reanalysis) +# +# Mind the formatting: columns are separated by the | symbol , colors given +# as RGB/RGBA must be comma-separated. +############################################################################### +MODEL NAME # COLOR # DASH # THICK # MARK # AVG-STD +############################################################################### +bccr_bcm2_0 | 148, 25, 30 | 0 | 2 | 4 | 0 +cccma_cgcm3_1 | 255, 255, 0 | 0 | 2 | 4 | 0 +cccma_cgcm3_1_t63 | 255, 255, 0 | 1 | 2 | 4 | 0 +csiro_mk3_0 | 30, 76, 36 | 0 | 2 | 4 | 0 +gfdl_cm2_0 | 35, 54, 109 | 0 | 2 | 4 | 0 +gfdl_cm2_1 | 35, 54, 109 | 1 | 2 | 4 | 0 +giss_aom | 119, 29, 123 | 0 | 2 | 4 | 0 +giss_model_e_h | 119, 29, 123 | 1 | 2 | 4 | 0 +giss_model_e_r | 119, 29, 123 | 2 | 2 | 4 | 0 +iap_fgoals1_0_g | 145, 214, 126 | 0 | 2 | 4 | 0 +ingv_echam4 | 255, 204, 0 | 0 | 2 | 4 | 0 +inmcm3_0 | 161, 37, 44 | 0 | 2 | 4 | 0 +ipsl_cm4 | 91, 83, 174 | 0 | 2 | 4 | 0 +ipsl_cm4A-LR | 91, 83, 174 | 1 | 2 | 4 | 0 +miroc3_2_hires | 184, 95, 182 | 0 | 2 | 4 | 0 +miroc3_2_medres | 184, 95, 182 | 1 | 2 | 4 | 0 +mpi_echam5 | 93, 161, 162 | 0 | 2 | 4 | 0 +mpi_echam5-HR | 93, 161, 162 | 1 | 2 | 4 | 0 +mri_cgcm2_3_2a | 173, 255, 47 | 0 | 2 | 4 | 0 +ncar_ccsm3_0 | 174, 170, 170 | 0 | 2 | 4 | 0 +ncar_pcm1 | 174, 170, 170 | 1 | 2 | 4 | 0 +ukmo_hadcm3 | 122, 139, 38 | 0 | 2 | 4 | 0 +ukmo_hadgem1 | 122, 139, 38 | 1 | 2 | 4 | 0 +ACCESS1-0 | 91, 142, 210 | 0 | 1 | 4 | 0 +ACCESS1-3 | 91, 142, 210 | 1 | 1 | 6 | 0 +bcc-csm1-1 | 148, 25, 30 | 0 | 1 | 4 | 0 +bcc-csm1-1-m | 148, 25, 30 | 1 | 1 | 6 | 0 +BNU-ESM | 196, 121, 0 | 0 | 1 | 4 | 0 +CanCM4 | 30, 76, 36 | 0 | 1 | 4 | 0 +CanESM2 | 30, 76, 36 | 1 | 1 | 6 | 0 +CNRM-AM-PRE6 | 30, 76, 36 | 1 | 1 | 6 | 0 +CCSM4 | 67, 178, 216 | 0 | 1 | 4 | 0 +CESM1-BGC | 67, 178, 216 | 1 | 1 | 6 | 0 +CESM1-CAM5 | 67, 178, 216 | 2 | 1 | 7 | 0 +CESM1-CAM5-1-FV2 | 67, 178, 216 | 2 | 1 | 7 | 0 +CESM1-FASTCHEM | 67, 178, 216 | 3 | 1 | 5 | 0 +CESM1-WACCM | 67, 178, 216 | 4 | 1 | 2 | 0 +CMCC-CESM | 232, 32, 35 | 0 | 1 | 4 | 0 +CMCC-CM | 232, 32, 35 | 1 | 1 | 6 | 0 +CMCC-CMS | 232, 32, 35 | 2 | 1 | 7 | 0 +CNRM-CM5 | 145, 214, 126 | 0 | 1 | 4 | 0 +CSIRO-Mk3-6-0 | 241, 75, 32 | 0 | 1 | 4 | 0 +EC-EARTH | 124, 99, 184 | 0 | 1 | 4 | 0 +FGOALS-g2 | 248, 154, 28 | 0 | 1 | 4 | 0 +FIO-ESM | 77, 187, 55 | 0 | 1 | 4 | 0 +GFDL-CM2p1 | 35, 54, 109 | 0 | 1 | 4 | 0 +GFDL-CM3 | 35, 54, 109 | 1 | 1 | 6 | 0 +GFDL-ESM2G | 35, 54, 109 | 2 | 1 | 7 | 0 +MPIESM-1-1 | 35, 54, 109 | 2 | 1 | 7 | 0 +GFDL-ESM2M | 35, 54, 109 | 3 | 1 | 5 | 0 +GISS-E2-H | 119, 29, 123 | 0 | 1 | 4 | 0 +GISS-E2-H-CC | 119, 29, 123 | 1 | 1 | 6 | 0 +GISS-E2-R | 119, 29, 123 | 2 | 1 | 7 | 0 +GISS-E2-R-CC | 119, 29, 123 | 3 | 1 | 5 | 0 +HadCM3 | 122, 139, 38 | 0 | 1 | 4 | 0 +HadGEM2-AO | 122, 139, 38 | 1 | 1 | 6 | 0 +HadGEM2-A | 122, 139, 38 | 1 | 1 | 6 | 0 +HadGEM2-CC | 122, 139, 38 | 2 | 1 | 7 | 0 +HadGEM2-ES | 122, 139, 38 | 3 | 1 | 5 | 0 +inmcm4 | 161, 37, 44 | 0 | 1 | 4 | 0 +INMCM4 | 161, 37, 44 | 0 | 1 | 4 | 0 +IPSL-CM5A-LR | 91, 83, 174 | 0 | 1 | 4 | 0 +IPSL-CM5A-MR | 91, 83, 174 | 1 | 1 | 6 | 0 +IPSL-CM5B-LR | 91, 83, 174 | 2 | 1 | 7 | 0 +MIROC4h | 184, 95, 182 | 0 | 1 | 4 | 0 +MIROC5 | 184, 95, 182 | 1 | 1 | 6 | 0 +MIROC-ESM | 184, 95, 182 | 2 | 1 | 7 | 0 +MIROC-ESM-CHEM | 184, 95, 182 | 3 | 1 | 5 | 0 +MPI-ESM-LR | 93, 161, 162 | 0 | 1 | 4 | 0 +MPI-ESM-MR | 93, 161, 162 | 1 | 1 | 6 | 0 +MPI-ESM-P | 93, 161, 162 | 2 | 1 | 7 | 0 +MRI-CGCM3 | 173, 255, 47 | 0 | 1 | 4 | 0 +MRI-ESM1 | 173, 255, 47 | 1 | 1 | 7 | 0 +NorESM1-M | 241, 58, 167 | 0 | 1 | 4 | 0 +NorESM1-ME | 241, 58, 167 | 1 | 1 | 7 | 0 +ACCESS-CM2 | 0, 176, 80 | 0 | 2 | 4 | 0 +ACCESS-ESM1-5 | 0, 176, 80 | 1 | 2 | 4 | 0 +AWI-CM-1-1-MR | 153, 0, 255 | 0 | 2 | 4 | 0 +AWI-ESM-1-1-LR | 153, 0, 255 | 1 | 2 | 4 | 0 +BCC-CSM2-MR | 148, 25, 30 | 0 | 2 | 4 | 0 +BCC-ESM1 | 148, 25, 30 | 1 | 2 | 6 | 0 +CAMS-CSM1-0 | 255, 255, 0 | 0 | 2 | 4 | 0 +CanESM5 | 30, 76, 36 | 0 | 2 | 4 | 0 +CanESM5-CanOE | 30, 76, 36 | 1 | 2 | 4 | 0 +CAS-ESM2-0 | 255, 102, 0 | 0 | 2 | 4 | 0 +CESM2 | 67, 178, 216 | 0 | 2 | 4 | 0 +CESM2-FV2 | 67, 178, 216 | 1 | 2 | 4 | 0 +CESM2-WACCM | 67, 178, 216 | 2 | 2 | 6 | 0 +CESM2-WACCM-FV2 | 67, 178, 216 | 3 | 2 | 6 | 0 +CIESM | 68, 113, 212 | 0 | 2 | 4 | 0 +CMCC-CM2-HR4 | 255, 153, 51 | 0 | 2 | 4 | 0 +CMCC-CM2-SR5 | 255, 153, 51 | 1 | 2 | 4 | 0 +CMCC-ESM2 | 255, 153, 51 | 2 | 2 | 4 | 0 +CNRM-CM6-1 | 145, 214, 126 | 0 | 2 | 4 | 0 +CNRM-CM6-1-HR | 145, 214, 126 | 1 | 2 | 4 | 0 +CNRM-ESM2-1 | 145, 214, 126 | 2 | 2 | 4 | 0 +E3SM-1-0 | 255, 204, 0 | 0 | 2 | 4 | 0 +E3SM-1-1 | 255, 204, 0 | 1 | 2 | 4 | 0 +E3SM-1-1-ECA | 255, 204, 0 | 2 | 2 | 4 | 0 +EC-Earth3 | 124, 99, 184 | 0 | 2 | 4 | 0 +EC-Earth3-AerChem | 124, 99, 184 | 1 | 2 | 4 | 0 +EC-Earth3-CC | 124, 99, 184 | 2 | 2 | 4 | 0 +EC-Earth3-LR | 124, 99, 184 | 3 | 2 | 4 | 0 +EC-Earth3-Veg | 124, 99, 184 | 4 | 2 | 6 | 0 +EC-Earth3-Veg-LR | 124, 99, 184 | 5 | 2 | 6 | 0 +FGOALS-f3-L | 248, 154, 28 | 0 | 2 | 4 | 0 +FGOALS-g3 | 248, 154, 28 | 1 | 2 | 4 | 0 +FIO-ESM-2-0 | 77, 187, 55 | 0 | 2 | 4 | 0 +GFDL-CM4 | 35, 54, 109 | 0 | 2 | 4 | 0 +GFDL-ESM4 | 35, 54, 109 | 1 | 2 | 6 | 0 +GISS-E2-1-G | 119, 29, 123 | 0 | 2 | 4 | 0 +GISS-E2-1-G-CC | 119, 29, 123 | 1 | 2 | 4 | 0 +GISS-E2-1-H | 119, 29, 123 | 2 | 2 | 6 | 0 +GISS-E2-2-G | 119, 29, 123 | 3 | 2 | 4 | 0 +HadGEM3-GC31-LL | 122, 139, 38 | 0 | 2 | 4 | 0 +HadGEM3-GC31-MM | 122, 139, 38 | 1 | 2 | 4 | 0 +IITM-ESM | 0, 51, 204 | 0 | 2 | 4 | 0 +INM-CM4-8 | 161, 37, 44 | 0 | 2 | 4 | 0 +INM-CM5-0 | 161, 37, 44 | 1 | 2 | 6 | 0 +IPSL-CM5A2-INCA | 91, 83, 174 | 0 | 2 | 4 | 0 +IPSL-CM6A-LR | 91, 83, 174 | 1 | 2 | 4 | 0 +KACE-1-0-G | 231, 23, 157 | 0 | 2 | 6 | 0 +KIOST-ESM | 119, 29, 123 | 0 | 2 | 6 | 0 +MCM-UA-1-0 | 197, 90, 17 | 1 | 2 | 4 | 0 +MIROC6 | 184, 95, 182 | 0 | 2 | 4 | 0 +MIROC-ES2L | 184, 95, 182 | 1 | 2 | 4 | 0 +MPI-ESM1-2-HR | 93, 161, 162 | 0 | 2 | 4 | 0 +MPI-ESM1-2-LR | 93, 161, 162 | 1 | 2 | 4 | 0 +MPI-ESM-1-2-HAM | 93, 161, 162 | 2 | 2 | 4 | 0 +MRI-ESM2-0 | 173, 255, 47 | 0 | 2 | 4 | 0 +NESM3 | 174, 170, 170 | 0 | 2 | 4 | 0 +NorCPM1 | 241, 58, 167 | 0 | 2 | 4 | 0 +NorESM1-F | 241, 58, 167 | 1 | 2 | 4 | 0 +NorESM2-LM | 241, 58, 167 | 2 | 2 | 4 | 0 +NorESM2-MM | 241, 58, 167 | 3 | 2 | 4 | 0 +SAM0-UNICON | 11, 247, 200 | 0 | 2 | 4 | 0 +TaiESM1 | 174, 170, 170 | 0 | 2 | 4 | 0 +UKESM1-0-LL | 164, 60, 112 | 0 | 2 | 4 | 0 +MultiModelMean | 255, 0, 0 | 0 | 4 | 12 | 1 +MultiModelMedian | 0, 0, 255 | 0 | 3 | 12 | 1 +multi-model mean | 255, 0, 0 | 0 | 3 | 12 | 1 +AMSRE | 0, 0, 0 | 2 | 3 | 16 | 1 +BDBP | 0, 0, 0 | 1 | 3 | 4 | 1 +BerkeleyEarth | 0, 0, 0 | 1 | 4 | 0 | 0 +CDS-XCO2 | 0, 0, 0 | 0 | 3 | 16 | 1 +CERES-SYN1deg | 0, 0, 0 | 0 | 1 | 16 | 0 +CLARA-A2 | 0, 255, 255 | 0 | 3 | 0 | 0 +CMAP | 0, 0, 0 | 6 | 3 | 16 | 1 +CowtanWay | 0, 0, 0 | 5 | 4 | 0 | 0 +ERAINT | 0, 0, 0 | 3 | 3 | 16 | 1 +ERA-Interim | 255, 200, 0 | 0 | 3 | 0 | 0 +ESACCI-AEROSOL | 0, 0, 0 | 0 | 3 | 16 | 1 +ESACCI-AMSR | 0, 0, 0 | 1 | 4 | 0 | 0 +ESACCI-CLOUD | 255, 0, 0 | 0 | 3 | 0 | 0 +ESACCI-SSMI | 0, 0, 0 | 0 | 4 | 0 | 0 +GHCN | 0, 0, 0 | 0 | 3 | 0 | 0 +GISTEMP | 0, 0, 0 | 4 | 4 | 0 | 0 +GPCP-1DD-V12 | 0, 0, 0 | 7 | 3 | 16 | 1 +HadCRUT4 | 0, 0, 0 | 4 | 4 | 0 | 0 +HadCRUT5 | 0, 0, 0 | 0 | 4 | 0 | 0 +HadISST | 0, 0, 0 | 1 | 3 | 16 | 1 +IGAG/SPARC | 248, 154, 28 | 0 | 3 | 16 | 0 +Kadow | 0, 0, 0 | 3 | 4 | 0 | 0 +MERRA | 0, 0, 0 | 8 | 3 | 16 | 1 +MODIS | 0, 255, 0 | 0 | 3 | 16 | 1 +MOHC-HadISST | 0, 0, 0 | 1 | 3 | 16 | 1 +NCEP | 0, 0, 0 | 4 | 3 | 16 | 1 +NIWA | 0, 0, 0 | 1 | 3 | 8 | 1 +NIWA-BS | 0, 0, 0 | 1 | 3 | 8 | 1 +NOAAGlobalTemp-Interim| 0, 0, 0 | 2 | 4 | 0 | 0 +NSIDC | 0, 0, 0 | 0 | 3 | 16 | 1 +NSIDC-BT | 0, 0, 0 | 12 | 3 | 0 | 0 +NSIDC-NT | 0, 0, 0 | 2 | 3 | 0 | 0 +PATMOS | 0, 0, 255 | 0 | 3 | 0 | 0 +PATMOS-x | 0, 0, 255 | 0 | 3 | 0 | 0 +TRMM-3B43-v7-0.25deg | 0, 0, 0 | 5 | 3 | 16 | 1 +TRMM-L3 | 0, 0, 0 | 5 | 3 | 16 | 1 +default | 0, 0, 0 | 0 | 1 | 16 | 0 diff --git a/esmvaltool/diag_scripts/shared/plot/styles/lauer21.style b/esmvaltool/diag_scripts/shared/plot/styles/lauer21.style new file mode 100644 index 0000000000..3cba1e2d02 --- /dev/null +++ b/esmvaltool/diag_scripts/shared/plot/styles/lauer21.style @@ -0,0 +1,44 @@ +############################################################################### +# CMIP5+6 STYLES +############################################################################### +# This file defines the plot attributes for the CMIP5 models. +# Mostly based on IPCC-AR5 Chapter 9 figures. +# +# MODEL NAME: must be the same as given in the main recipe. +# COLOR: can be either an NCL named color, a RGB code (size 3) on a 0-255 scale +# or a RGBA code (size 4) with the last element indicating the opacity +# on a 0-1 scale (0 = transparent, 1 = full), see +# http://www.ncl.ucar.edu/Applications/Scripts/rgb.txt +# https://www.ncl.ucar.edu/Document/glossary.shtml#RGB +# https://www.ncl.ucar.edu/Document/glossary.shtml#RGBA +# https://www.ncl.ucar.edu/Document/Graphics/create_color_table.shtml +# DASH: the dash pattern index lines, see +# https://www.ncl.ucar.edu/Document/Graphics/Images/dashpatterns.png +# THICK: the line thickness (NCL default is 1) +# MARK: marker index for markers, see +# https://www.ncl.ucar.edu/Document/Graphics/Images/markers.png +# AVG-STD: 0 = takes part in the calculation of mean and stddev +# 1 = does not take part in the calculation of mean and stddev +# (usually 0 for models, 1 for observations/reanalysis) +# +# Mind the formatting: columns are separated by the | symbol , colors given +# as RGB/RGBA must be comma-separated. +########################################################################### +MODEL NAME # COLOR # DASH # THICK # MARK # AVG-STD +########################################################################### +MultiModelAverage | 0, 0, 0 | 0 | 3 | 12 | 1 +MultiModelMean | 255, 0, 0 | 0 | 3 | 12 | 1 +MultiModelMedian | 255, 127, 63 | 0 | 3 | 12 | 1 +CERES-EBAF | 100, 200, 200 | 0 | 3 | 4 | 0 +CLARA-AVHRR | 150, 200, 250 | 0 | 3 | 4 | 0 +CLOUDSAT-L2 | 50, 200, 100 | 0 | 3 | 4 | 0 +ERA5 | 255, 200, 0 | 0 | 3 | 4 | 0 +ERA-Interim | 255, 150, 0 | 0 | 3 | 4 | 0 +ESACCI-CLOUD | 0, 50, 200 | 0 | 3 | 4 | 0 +ESACCI-WATERVAPOUR | 0, 50, 200 | 0 | 3 | 4 | 0 +ISCCP-FH | 250, 0, 50 | 0 | 3 | 4 | 0 +MAC-LWP | 150, 200, 50 | 0 | 3 | 4 | 0 +MODIS | 150, 0, 150 | 0 | 3 | 4 | 0 +SSMI-MERIS | 0, 250, 0 | 0 | 3 | 4 | 0 +PATMOS-x | 0, 150, 0 | 0 | 3 | 4 | 0 +default | 200, 200, 200 | 0 | 1 | 16 | 0 diff --git a/esmvaltool/diag_scripts/shared/plot/taylor_plot.ncl b/esmvaltool/diag_scripts/shared/plot/taylor_plot.ncl index 3914d0f557..b50af96114 100644 --- a/esmvaltool/diag_scripts/shared/plot/taylor_plot.ncl +++ b/esmvaltool/diag_scripts/shared/plot/taylor_plot.ncl @@ -498,8 +498,8 @@ begin if (rmax.lt.1.5) then rmax = 1.5 end if - if (rmax.gt.3.0) then - rmax = 3.0 + if (rmax.gt.3.5) then + rmax = 3.5 end if xyMax = rmax + 0.1 xyMax_Panel = xyMax + 0.10 @@ -594,6 +594,9 @@ begin else rxy@tiMainFontHeightF = 0.0225 end if + if (isatt(rOpts, "tiMainOffsetYF")) then + rxy@tiMainOffsetYF = rOpts@tiMainOffsetYF + end if end if taylor = gsn_xy(wks, xx, yy, rxy) @@ -819,11 +822,21 @@ begin respl@gsLineColor = rOpts@centerDiffRMS_color end if + respl2 = True + respl2@txFontHeightF = 0.015 + respl2@txFontColor = respl@gsLineColor + respl2@txBackgroundFillColor = "White" + dx = delta - ncon = 4 + ncon = toint(rmax * 2) npts = 100 ; arbitrary + n10 = toint(npts * 0.1) + n90 = toint(npts * 0.9) ang = fspan(180, 360, npts) * rad dum9 = new(ncon, graphic) + dum9a = new(ncon, graphic) + + pi = 3.1415927 do n = 1, ncon rr = n * dx ; radius from 1.0 [OBS] abscissa @@ -837,23 +850,46 @@ begin if (xtmp.eq.0.0) then phitmp = 3.1415927 else if (xtmp.gt.0.0) then - phitmp = 2.0 * 3.1415927 - atan(ytmp / xtmp) + phitmp = 2.0 * pi - atan(ytmp / xtmp) else - phitmp = 3.1415927 + atan(ytmp / xtmp) + phitmp = pi + atan(ytmp / xtmp) end if end if - ang2 = fspan(3.1415927, phitmp, npts) + + ang2 = fspan(pi, phitmp, npts) xx2 = 1.0 + rr * cos(ang2) yy2 = fabs(rr * sin(ang2)) + + if (phitmp .lt. pi) then + tmpang = ang2(n10) + pi / 2.0 + else + tmpang = ang2(n90) + end if + dum9(n - 1) = gsn_add_polyline(wks, taylor, xx2, yy2, respl) + xl = xx2(n90) + yl = yy2(n90) + respl2@txAngleF = 630.0 - tmpang / pi * 180.0 + if (respl2@txAngleF .gt. 360.0) then + respl2@txAngleF = respl2@txAngleF - 360.0 + end if delete(ang2) delete(xx2) delete(yy2) else dum9(n - 1) = gsn_add_polyline(wks, taylor, xx, yy, respl) + xl = xx(n90) + yl = yy(n90) + respl2@txAngleF = 630.0 - ang(n90) / pi * 180.0 + if (respl2@txAngleF .gt. 360.0) then + respl2@txAngleF = respl2@txAngleF - 360.0 + end if end if delete(dist_n) + dum9a(n - 1) = gsn_add_text(wks, taylor, sprintf("%3.1f", n * 0.5), \ + xl, yl, respl2) + end do delete(ang) delete(xx) @@ -971,108 +1007,150 @@ begin if (isatt(rOpts, "caseLabelsFontHeightF")) then caseLabelsFontHeightF = rOpts@caseLabelsFontHeightF + else + caseLabelsFontHeightF = 0.05 + end if + + lgres = True + lgres@lgMarkerSizeF = gsMarkerSizeF + lgres@lgLabelFontHeightF = caseLabelsFontHeightF + lgres@lgItemType = "Markers" + + if (isatt(rOpts, "legend_filter")) then + iii = ispan(0, dimsizes(rOpts@projects) - 1, 1) + iii = 1 + do i = 0, dimsizes(rOpts@legend_filter) - 1 + do ii = 0, dimsizes(rOpts@projects) - 1 + if (str_lower(rOpts@projects(ii)) .eq. \ + str_lower(rOpts@legend_filter(i))) then + iii(ii) = -1 + end if + end do + end do + testind = ind(iii .eq. -1) ; indices of datasets to be filtered out + if (.not. all(ismissing(testind))) then + iselect = ind(iii .ne. -1) ; datasets *not* to be filtered out + lgres@lgMarkerColors = Colors(iselect) + lgres@lgMarkerIndexes = Markers(iselect) + Labels = rOpts@caseLabels(iselect) + do i = 0, dimsizes(rOpts@legend_filter) - 1 + auxind = ind(str_lower(rOpts@projects) .eq. \ + str_lower(rOpts@legend_filter(i))) + if (.not. all(ismissing(auxind))) then + color0 := Colors(auxind(0)) + marker0 := Markers(auxind(0)) + label0 = rOpts@legend_filter(i) + lgres@lgMarkerColors := array_append_record(color0, \ + lgres@lgMarkerColors, \ + 0) + lgres@lgMarkerIndexes := \ + array_append_record(marker0, lgres@lgMarkerIndexes, 0) + Labels := array_append_record(label0, Labels, 0) + end if + delete(auxind) + end do else - caseLabelsFontHeightF = 0.05 + lgres@lgMarkerColors = Colors + lgres@lgMarkerIndexes = Markers end if - - lgres = True + else lgres@lgMarkerColors = Colors lgres@lgMarkerIndexes = Markers - lgres@lgMarkerSizeF = gsMarkerSizeF - lgres@lgItemType = "Markers" - lgres@lgLabelFontHeightF = caseLabelsFontHeightF + Labels = rOpts@caseLabels + end if - nModel = dimsizes(rOpts@caseLabels) - if (isatt(rOpts, "legendWidth")) then - lgres@vpWidthF = rOpts@legendWidth - else - lgres@vpWidthF = 0.15 - end if + nModel = dimsizes(Labels) + if (isatt(rOpts, "legendWidth")) then + lgres@vpWidthF = rOpts@legendWidth + else + lgres@vpWidthF = 0.15 + end if + + if (nModel.gt.20) then + lgres@vpWidthF = lgres@vpWidthF * 0.5 + lgres@lgMarkerSizeF = lgres@lgMarkerSizeF * 0.75 + end if - if (nModel.gt.20) then - lgres@vpWidthF = lgres@vpWidthF * 0.5 - lgres@lgMarkerSizeF = lgres@lgMarkerSizeF * 0.75 + lgres@lgPerimOn = False + if (isatt(rOpts, "legendBox")) then + if (rOpts@legendBox) then + lgres@lgPerimOn = True + lgres@lgRightMarginF = 0.1 end if + end if - lgres@lgPerimOn = False - if (isatt(rOpts, "legendBox")) then - if (rOpts@legendBox) then - lgres@lgPerimOn = True - lgres@lgRightMarginF = 0.1 + if (nModel.le.20) then + if (isatt(rOpts, "reverseOrder")) then + if (rOpts@reverseOrder) then + lgres@lgItemOrder = ispan(nModel - 1, 0, 1) end if end if + if (isatt(rOpts, "legendHeight")) then + lgres@vpHeightF = rOpts@legendHeight + else + lgres@vpHeightF = 0.030 * nModel + end if + lbid = gsn_create_legend(legendwks, nModel, Labels, lgres) + amres = True + if (isatt(rOpts, "legendXpos")) then + amres@amParallelPosF = rOpts@legendXpos + amres@amJust = "TopLeft" + else + amres@amParallelPosF = 0.35 + end if + if (isatt(rOpts, "legendYpos")) then + amres@amOrthogonalPosF = rOpts@legendYpos + amres@amJust = "TopLeft" + else + amres@amOrthogonalPosF = -0.35 + end if + if (extrafile) then + gsn_legend_ndc(legendwks, nModel, Labels(0:nModel - 1), \ + 0.78, 0.75, lgres) + else + annoid1 = gsn_add_annotation(taylor, lbid, amres) + end if + else + if (isatt(rOpts, "modelsperrow")) then + modelsperrow = rOpts@modelsperrow + else + modelsperrow = (nModel + 1) / 2 + end if + + do lr = 0, nModel / modelsperrow + ix0 = lr * modelsperrow + if (ix0.ge.nCase) then + break + end if + ix1 = min((/nCase - 1, ix0 + modelsperrow - 1/)) + dumdelta = ix1 - ix0 + 1 - if (nModel.le.20) then if (isatt(rOpts, "reverseOrder")) then if (rOpts@reverseOrder) then - lgres@lgItemOrder = ispan(nModel - 1, 0, 1) - end if - end if - if (isatt(rOpts, "legendHeight")) then - lgres@vpHeightF = rOpts@legendHeight - else - lgres@vpHeightF = 0.030 * nCase - end if - lbid = gsn_create_legend(legendwks, nModel, rOpts@caseLabels, lgres) - amres = True - if (isatt(rOpts, "legendXpos")) then - amres@amParallelPosF = rOpts@legendXpos - amres@amJust = "TopLeft" - else - amres@amParallelPosF = 0.35 - end if - if (isatt(rOpts, "legendYpos")) then - amres@amOrthogonalPosF = rOpts@legendYpos - amres@amJust = "TopLeft" - else - amres@amOrthogonalPosF = -0.35 - end if - if (extrafile) then - gsn_legend_ndc(legendwks, nModel, rOpts@caseLabels(0:nModel - 1), \ - 0.78, 0.75, lgres) - else - annoid1 = gsn_add_annotation(taylor, lbid, amres) - end if - else - if (isatt(rOpts, "modelsperrow")) then - modelsperrow = rOpts@modelsperrow - else - modelsperrow = (nModel + 1) / 2 - end if - do lr = 0, nModel / modelsperrow - ix0 = lr * modelsperrow - if (ix0.ge.nCase) then - break - end if - ix1 = min((/nCase - 1, ix0 + modelsperrow - 1/)) - dumdelta = ix1 - ix0 + 1 - - if (isatt(rOpts, "reverseOrder")) then - if (rOpts@reverseOrder) then - if (isatt(lgres, "lgItemOrder")) then - delete(lgres@lgItemOrder) - end if - lgres@lgItemOrder = ispan(dumdelta - 1, 0, 1) + if (isatt(lgres, "lgItemOrder")) then + delete(lgres@lgItemOrder) end if + lgres@lgItemOrder = ispan(dumdelta - 1, 0, 1) end if + end if - lgres@vpHeightF = 0.026 * dumdelta + lgres@vpHeightF = 0.026 * dumdelta - delete(lgres@lgMarkerColors) - delete(lgres@lgMarkerIndexes) - lgres@lgMarkerColors = Colors(ix0:ix1) - lgres@lgMarkerIndexes = Markers(ix0:ix1) - lgres@lgPerimOn = False + delete(lgres@lgMarkerColors) + delete(lgres@lgMarkerIndexes) + lgres@lgMarkerColors = Colors(ix0:ix1) + lgres@lgMarkerIndexes = Markers(ix0:ix1) + lgres@lgPerimOn = False - if (extrafile) then - legend_x = 0.05 + 0.11 * lr - else - legend_x = 0.78 + 0.11 * lr - end if + if (extrafile) then + legend_x = 0.05 + 0.11 * lr + else + legend_x = 0.78 + 0.11 * lr + end if - gsn_legend_ndc(legendwks, dumdelta, rOpts@caseLabels(ix0:ix1), \ - legend_x, 0.75, lgres) - end do + gsn_legend_ndc(legendwks, dumdelta, Labels(ix0:ix1), \ + legend_x, 0.75, lgres) + end do end if end if diff --git a/esmvaltool/diag_scripts/shared/plot/zonalmean_profile.ncl b/esmvaltool/diag_scripts/shared/plot/zonalmean_profile.ncl index 1e19daa1a6..d1d6425109 100644 --- a/esmvaltool/diag_scripts/shared/plot/zonalmean_profile.ncl +++ b/esmvaltool/diag_scripts/shared/plot/zonalmean_profile.ncl @@ -105,6 +105,22 @@ begin plot = gsn_csm_pres_hgt(wks, data, res) plot@outfile = wks@name + ; Add the outline of the climatological tropopause + if (isatt(data, "add_tropopause")) then + if data@add_tropopause then + xyres = True + xyres@gsLineColor = "brown" + xyres@gsLineDashPattern = 1 + xyres@gsLineThicknessF = 3. + lat = data&lat + tp := (300. - 215. * (cos(lat / 180. * get_pi("f"))) ^ 2) + str = unique_string("tropopause") + plot@$str$ = gsn_add_polyline(wks, plot, lat, tp, xyres) + delete(tp) + delete(lat) + end if + end if + leave_msg(scriptname, funcname) return(plot) diff --git a/esmvaltool/diag_scripts/shared/scaling.ncl b/esmvaltool/diag_scripts/shared/scaling.ncl index 8cf2533eed..986398746d 100644 --- a/esmvaltool/diag_scripts/shared/scaling.ncl +++ b/esmvaltool/diag_scripts/shared/scaling.ncl @@ -152,6 +152,12 @@ begin leave_msg(scriptname, funcname) return(out) end if + if (any(units_to.eq.(/"g kg-1", "g/kg"/))) then + out = out * 1.e3 + out@units = units_to + leave_msg(scriptname, funcname) + return(out) + end if end if if (units_from.eq."kg s-1") then diff --git a/esmvaltool/diag_scripts/validation.py b/esmvaltool/diag_scripts/validation.py index bda93ff82a..d72cc5e1ad 100644 --- a/esmvaltool/diag_scripts/validation.py +++ b/esmvaltool/diag_scripts/validation.py @@ -340,14 +340,13 @@ def main(cfg): for short_name in grouped_input_data: logger.info("Processing variable %s", short_name) - cmip_era = cfg["cmip_era"] # get the control, experiment and obs dicts + cmip_type = cfg["cmip_era"] if "cmip_era" in cfg else None ctrl, exper, obs = get_control_exper_obs(short_name, input_data, cfg, - cmip_era) + cmip_type=cmip_type) # set a plot key holding info on var and data set names - plot_key = "{}_{}_vs_{}".format(short_name, ctrl['dataset'], - exper['dataset']) - control_dataset_name = ctrl['dataset'] + plot_key = f"{short_name}_{ctrl['alias']}_vs_{exper['alias']}" + control_dataset_name = ctrl['alias'] # get seasons if needed then apply analysis if cfg['seasonal_analysis']: @@ -366,8 +365,8 @@ def main(cfg): obs_seasons = [ coordinate_collapse(obss, cfg) for obss in obs_seasons ] - plot_key_obs = "{}_{}_vs_{}".format( - short_name, ctrl['dataset'], iobs['dataset']) + plot_key_obs = (f"{short_name}_{ctrl['alias']}" + + f"_vs_{iobs['alias']}") plot_ctrl_exper_seasons(ctrl_seasons, obs_seasons, cfg, plot_key_obs) @@ -381,9 +380,8 @@ def main(cfg): if obs_list: for obs_i, obsfile in zip(obs_list, obs): obs_analyzed = coordinate_collapse(obs_i, cfg) - obs_name = obsfile['dataset'] - plot_key = "{}_{}_vs_{}".format(short_name, - control_dataset_name, obs_name) + obs_name = obsfile['alias'] + plot_key = f"{short_name}_{control_dataset_name}_vs_{obs_name}" if cfg['analysis_type'] == 'lat_lon': plot_latlon_cubes(ctrl, obs_analyzed, diff --git a/esmvaltool/diag_scripts/weighting/climwip/calibrate_sigmas.py b/esmvaltool/diag_scripts/weighting/climwip/calibrate_sigmas.py index f4dd4f5f10..0998346b22 100644 --- a/esmvaltool/diag_scripts/weighting/climwip/calibrate_sigmas.py +++ b/esmvaltool/diag_scripts/weighting/climwip/calibrate_sigmas.py @@ -95,7 +95,7 @@ def calculate_percentiles(target: 'xr.DataArray', vectorize=True, ) - inside_count = xr.ufuncs.logical_and( + inside_count = np.logical_and( target_perfect >= percentiles_data.isel(percentile=0), target_perfect <= percentiles_data.isel(percentile=1)).values inside_ratio = inside_count.sum() / len(inside_count) diff --git a/esmvaltool/diag_scripts/xco2_analysis/main.ncl b/esmvaltool/diag_scripts/xco2_analysis/main.ncl index 8874180fc2..8f585e5f62 100644 --- a/esmvaltool/diag_scripts/xco2_analysis/main.ncl +++ b/esmvaltool/diag_scripts/xco2_analysis/main.ncl @@ -584,6 +584,15 @@ begin sa_Rates@diag_script = (/DIAG_SCRIPT/) ncdf_outfile = ncdf_write(sa_Rates, outfile_netcdf_grbp) + ; Sort by size + sort_by = sa_Rates(:, 0) + qsort(sort_by) + perm_idx = new(dimsizes(sort_by), integer) + do idim = 0, dimsizes(sort_by) - 1 + perm_idx(idim) = ind(sort_by(idim).eq.sa_Rates(:, 0)) + end do + sa_Rates_sort = sa_Rates(perm_idx, :) + res = True res@gsnDraw = False res@gsnFrame = False @@ -591,7 +600,7 @@ begin res@gsnXYBarChart = True res@tmXBMode = "Explicit" res@tmXBValues = ispan(0, dimsizes(amp_series&model) - 1, 1) - res@tmXBLabels = amp_series&model + res@tmXBLabels = labels_ini(perm_idx) ; amp_series&model res@tmXBLabelAngleF = 60. res@tmXBLabelJust = "CenterRight" res@tmXBLabelFontHeightF = 0.014 @@ -600,17 +609,14 @@ begin res@trYMaxF = max(sa_Rates(:, 0) + sa_Rates(:, 1)) + 0.15 res@trXMinF = -1. res@trXMaxF = dimsizes(amp_series&model) - res@tiMainString = "Mean Seasonal Cycle Amplitude from " + \ - tostring(start_year) + " - " + tostring(end_year) + \ - ", " + region res@tiYAxisString = "Seasonal Cycle Amplitude [" + sa_Rates@units + "]" res@tiYAxisFontHeightF = 0.02 res@gsnXYBarChartBarWidth = 0.75 - res@gsnXYBarChartColors = bp_colors + res@gsnXYBarChartColors = bp_colors(perm_idx) x = ispan(0, dimsizes(amp_series&model)-1, 1) - plot_sabp = gsn_csm_xy(wks, x, sa_Rates(:, 0), res) + plot_sabp = gsn_csm_xy(wks, x, sa_Rates_sort(:, 0), res) ; Add errorbars @@ -622,16 +628,19 @@ begin do imod = 0, dimsizes(amp_series&model) - 1 plot_sabp@$unique_string("errbar")$ = \ gsn_add_polyline(wks, plot_sabp, (/imod, imod/), \ - (/sa_Rates(imod, 0) + sa_Rates(imod, 1), \ - sa_Rates(imod, 0) - sa_Rates(imod, 1)/), lres) + (/sa_Rates_sort(imod, 0) + sa_Rates_sort(imod, 1), \ + sa_Rates_sort(imod, 0) - sa_Rates_sort(imod, 1)/), \ + lres) plot_sabp@$unique_string("errbar")$ = \ gsn_add_polyline(wks, plot_sabp, (/imod + err_wdth, imod - err_wdth/), \ - (/sa_Rates(imod, 0) + sa_Rates(imod, 1), \ - sa_Rates(imod, 0) + sa_Rates(imod, 1)/), lres) + (/sa_Rates_sort(imod, 0) + sa_Rates_sort(imod, 1), \ + sa_Rates_sort(imod, 0) + sa_Rates_sort(imod, 1)/), \ + lres) plot_sabp@$unique_string("errbar")$ = \ gsn_add_polyline(wks, plot_sabp, (/imod + err_wdth, imod - err_wdth/), \ - (/sa_Rates(imod, 0) - sa_Rates(imod, 1), \ - sa_Rates(imod, 0) - sa_Rates(imod, 1)/), lres) + (/sa_Rates_sort(imod, 0) - sa_Rates_sort(imod, 1), \ + sa_Rates_sort(imod, 0) - sa_Rates_sort(imod, 1)/), \ + lres) end do draw(plot_sabp) diff --git a/esmvaltool/interface_scripts/auxiliary.ncl b/esmvaltool/interface_scripts/auxiliary.ncl index 079dc77f3d..3ba09318ce 100644 --- a/esmvaltool/interface_scripts/auxiliary.ncl +++ b/esmvaltool/interface_scripts/auxiliary.ncl @@ -523,7 +523,7 @@ function ncdf_define(ncdf, data) ; 20131112-gottschaldt_klaus-dirk: written. ; local funcname, scriptname, data, diag_script, var, fAtt, dimNames, dimSzs, \ - dimUnlim, atts + dimUnlim, atts, i, ii, jj begin funcname = "ncdf_define" @@ -657,7 +657,7 @@ function ncdf_write(data, ; Modification history ; 20131107-gottschaldt_klaus-dirk: written. ; -local funcname, scriptname, data, outfile, outfile_in, ncdf, varname +local funcname, scriptname, data, outfile, outfile_in, ncdf, varname, i, idim begin funcname = "ncdf_write" @@ -838,7 +838,7 @@ function copy_CoordNames_n(var_from, ; Modification history ; 20130419-gottschaldt_klaus-dirk: written. ; -local funcname, scriptname, var_from, var_to, n, rank +local funcname, scriptname, var_from, var_to, n, rank, ii begin funcname = "copy_CoordNames_n" diff --git a/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_6-7.yml b/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_6-7.yml index 542d1c5740..c54ffc5f1e 100644 --- a/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_6-7.yml +++ b/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_6-7.yml @@ -264,7 +264,7 @@ diagnostics: tas: preprocessor: ppNOLEV1 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -297,7 +297,7 @@ diagnostics: - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -412,7 +412,7 @@ diagnostics: zg: preprocessor: pp500 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -444,7 +444,7 @@ diagnostics: - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -712,7 +712,7 @@ diagnostics: ua: preprocessor: pp200 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -746,7 +746,7 @@ diagnostics: - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -763,7 +763,7 @@ diagnostics: va: preprocessor: pp850 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -797,7 +797,7 @@ diagnostics: - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -814,7 +814,7 @@ diagnostics: ua: preprocessor: pp850 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -848,7 +848,7 @@ diagnostics: - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -865,7 +865,7 @@ diagnostics: va: preprocessor: pp200 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -899,7 +899,7 @@ diagnostics: - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -916,7 +916,7 @@ diagnostics: ta: preprocessor: pp850 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -950,7 +950,7 @@ diagnostics: - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -967,7 +967,7 @@ diagnostics: ta: preprocessor: pp200 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -1001,7 +1001,7 @@ diagnostics: - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -1041,7 +1041,7 @@ diagnostics: tas: &var_settings preprocessor: regrid_4_5 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 project: CMIP5 exp: historical ensemble: r1i1p1 @@ -1074,7 +1074,7 @@ diagnostics: - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} scripts: pattern_cor: &fig_pattern_cor script: bock20jgr/corr_pattern.ncl diff --git a/esmvaltool/recipes/recipe_clouds_bias.yml b/esmvaltool/recipes/clouds/recipe_clouds_bias.yml similarity index 100% rename from esmvaltool/recipes/recipe_clouds_bias.yml rename to esmvaltool/recipes/clouds/recipe_clouds_bias.yml diff --git a/esmvaltool/recipes/recipe_clouds_ipcc.yml b/esmvaltool/recipes/clouds/recipe_clouds_ipcc.yml similarity index 100% rename from esmvaltool/recipes/recipe_clouds_ipcc.yml rename to esmvaltool/recipes/clouds/recipe_clouds_ipcc.yml diff --git a/esmvaltool/recipes/recipe_lauer13jclim.yml b/esmvaltool/recipes/clouds/recipe_lauer13jclim.yml similarity index 100% rename from esmvaltool/recipes/recipe_lauer13jclim.yml rename to esmvaltool/recipes/clouds/recipe_lauer13jclim.yml diff --git a/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig1_clim.yml b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig1_clim.yml new file mode 100644 index 0000000000..f63f527da4 --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig1_clim.yml @@ -0,0 +1,428 @@ +# recipe_lauer22jclim_fig1_clim.yml +--- +documentation: + title: Cloud diagnostics v2 (climatologies) + + description: | + Multi-year annaul means of cloud properties. + + authors: + - lauer_axel + + maintainer: + - lauer_axel + + references: + - lauer22jclim + + projects: + - cmug + + +preprocessors: + clim: + regrid: + target_grid: 2x2 + scheme: linear + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [CERES-EBAF, CLARA-AVHRR, CLOUDSAT-L2, ERA5, ERA-Interim, + ESACCI-CLOUD, ESACCI-WATERVAPOUR, HadISST, ISCCP-FH, MAC-LWP, + MODIS, PATMOS-x, reference_dataset, SSMI-MERIS] +# annual_statistics: +# operator: mean + + +CMIP5: &cmip5_models + - {dataset: ACCESS1-0, ensemble: r1i1p1} + - {dataset: ACCESS1-3, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1} + - {dataset: BNU-ESM, ensemble: r1i1p1} + - {dataset: CanESM2, ensemble: r1i1p1} + - {dataset: CCSM4, ensemble: r1i1p1} + - {dataset: CESM1-BGC, ensemble: r1i1p1} + - {dataset: CESM1-CAM5, ensemble: r1i1p1} + - {dataset: CESM1-FASTCHEM, ensemble: r1i1p1} + - {dataset: CESM1-WACCM, ensemble: r1i1p1} + - {dataset: CMCC-CESM, ensemble: r1i1p1} + - {dataset: CMCC-CM, ensemble: r1i1p1} + # missing data - {dataset: CMCC-CMS, ensemble: r1i1p1} + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1} + - {dataset: FGOALS-g2, ensemble: r1i1p1} + - {dataset: FIO-ESM, ensemble: r1i1p1} + - {dataset: GFDL-CM3, ensemble: r1i1p1} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1} + - {dataset: GISS-E2-H-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-H, ensemble: r1i1p1} + - {dataset: GISS-E2-R-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-R, ensemble: r1i1p1} + - {dataset: HadGEM2-CC, ensemble: r1i1p1} + - {dataset: HadGEM2-ES, ensemble: r1i1p1} + - {dataset: inmcm4, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1} + - {dataset: MIROC4h, ensemble: r1i1p1} + - {dataset: MIROC5, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1} + - {dataset: MIROC-ESM, ensemble: r1i1p1} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1} + - {dataset: MPI-ESM-P, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, ensemble: r1i1p1} + - {dataset: MRI-ESM1, ensemble: r1i1p1} + - {dataset: NorESM1-ME, ensemble: r1i1p1} + - {dataset: NorESM1-M, ensemble: r1i1p1} + +CMIP6: &cmip6_models + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn} + # time_coord_problem_rlut - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + # no_prw - {dataset: FGOALS-f3-L, ensemble: r2i1p1f1, grid: gr} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn} + - {dataset: IPSL-CM6A-LR, ensemble: r3i1p1f1, grid: gr} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-HR, institute: MPI-M, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn} + - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + + +diagnostics: + + # ========================================================================== + # Geographical distribution of multi-year annual/seasonal means (panel plot) + # ========================================================================== + + clouds_clim_cmip5: + description: climatological annual means + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: PATMOS-x, project: OBS, type: sat, version: NOAA, + tier: 2, start_year: 1982, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + clivi: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + lwp: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, + version: V002_01, tier: 3, + start_year: 1982, end_year: 2018} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: MAC-LWP, project: OBS, type: sat, version: v1, + tier: 3, start_year: 1988, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + swcre: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, + tier: 2, start_year: 1984, end_year: 2016} + lwcre: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, + tier: 2, start_year: 1984, end_year: 2016} + prw: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-WATERVAPOUR + additional_datasets: + - {dataset: ESACCI-WATERVAPOUR, project: OBS, type: sat, + version: CDR2-L3S-05deg_fv3.1, tier: 3, start_year: 2003, + end_year: 2017} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + additional_datasets: *cmip5_models + scripts: + avgclt: &settings5 + script: clouds/clouds.ncl + projection: Robinson + timemean: annualclim + showdiff: true + multiobs_uncertainty: true + multiobs_exclude: ["ERA-Interim", "ERA5"] + filename_add: cmip5 + var: clt + avgclivi: + <<: *settings5 + var: clivi + avglwp: + <<: *settings5 + var: lwp + avgswcre: + <<: *settings5 + var: swcre + avglwcre: + <<: *settings5 + var: lwcre + avgprw: + <<: *settings5 + var: prw + + clouds_clim_cmip6: + description: climatological annual means + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, + version: V002_01, tier: 3, start_year: 1982, end_year: 2018} + - {dataset: PATMOS-x, project: OBS, type: sat, version: NOAA, + tier: 2, start_year: 1982, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + clivi: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + lwp: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, + version: V002_01, tier: 3, start_year: 1982, end_year: 2018} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: MAC-LWP, project: OBS, type: sat, version: v1, tier: 3, + start_year: 1988, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + swcre: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + lwcre: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 2001 + end_year: 2010 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + prw: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-WATERVAPOUR + additional_datasets: + - {dataset: ESACCI-WATERVAPOUR, project: OBS, type: sat, + version: CDR2-L3S-05deg_fv3.1, tier: 3, + start_year: 2003, end_year: 2017} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + additional_datasets: *cmip6_models + scripts: + avgclt: &settings6 + script: clouds/clouds.ncl + projection: Robinson + timemean: annualclim + showdiff: true + multiobs_uncertainty: true + multiobs_exclude: ["ERA-Interim", "ERA5"] + filename_add: cmip6 + var: clt + avgclivi: + <<: *settings6 + var: clivi + avglwp: + <<: *settings6 + var: lwp + avgswcre: + <<: *settings6 + var: swcre + avglwcre: + <<: *settings6 + var: lwcre + avgprw: + <<: *settings6 + var: prw diff --git a/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig1_clim_amip.yml b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig1_clim_amip.yml new file mode 100644 index 0000000000..65818e71e4 --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig1_clim_amip.yml @@ -0,0 +1,443 @@ +# recipe_lauer22jclim_fig1_clim_amip.yml +--- +documentation: + title: Cloud diagnostics v2 (climatologies) + + description: | + Multi-year annual means of cloud properties (AMIP models). + + authors: + - lauer_axel + + maintainer: + - lauer_axel + + references: + - lauer22jclim + + projects: + - cmug + + +preprocessors: + clim: + regrid: + target_grid: 2x2 + scheme: linear + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [CERES-EBAF, CLARA-AVHRR, CLOUDSAT-L2, ERA5, ERA-Interim, + ESACCI-CLOUD, ESACCI-WATERVAPOUR, HadISST, ISCCP-FH, MAC-LWP, + MODIS, PATMOS-x, reference_dataset, SSMI-MERIS] +# annual_statistics: +# operator: mean + + +CMIP5: &cmip5_models + - {dataset: ACCESS1-0, ensemble: r1i1p1} + - {dataset: ACCESS1-3, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1} + - {dataset: BNU-ESM, ensemble: r1i1p1} + # - {dataset: CanESM2, ensemble: r1i1p1} no amip + - {dataset: CanAM4, ensemble: r1i1p1} + - {dataset: CCSM4, ensemble: r1i1p1} + # - {dataset: CESM1-BGC, ensemble: r1i1p1} no amip + - {dataset: CESM1-CAM5, ensemble: r1i1p1} + # - {dataset: CESM1-FASTCHEM, ensemble: r1i1p1} no amip + # - {dataset: CESM1-WACCM, ensemble: r1i1p1} no amip + # - {dataset: CMCC-CESM, ensemble: r1i1p1} no amip + - {dataset: CMCC-CM, ensemble: r1i1p1} + # missing data - {dataset: CMCC-CMS, ensemble: r1i1p1} no amip + - {dataset: CNRM-CM5, ensemble: r1i1p1} + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1} + - {dataset: FGOALS-g2, ensemble: r1i1p1} + - {dataset: FGOALS-s2, ensemble: r1i1p1} + # - {dataset: FIO-ESM, ensemble: r1i1p1} no amip + - {dataset: GFDL-CM3, ensemble: r1i1p1} + # - {dataset: GFDL-ESM2G, ensemble: r1i1p1} no amip + # - {dataset: GFDL-ESM2M, ensemble: r1i1p1} no amip + - {dataset: GFDL-HIRAM-C180, ensemble: r1i1p1} + - {dataset: GFDL-HIRAM-C360, ensemble: r1i1p1} + # - {dataset: GISS-E2-H-CC, ensemble: r1i1p1} no amip + # - {dataset: GISS-E2-H, ensemble: r1i1p1} no amip + # - {dataset: GISS-E2-R-CC, ensemble: r1i1p1} no amip + - {dataset: GISS-E2-R, ensemble: r1i1p1} + - {dataset: HadGEM2-A, ensemble: r1i1p1} + # - {dataset: HadGEM2-CC, ensemble: r1i1p1} no amip + # - {dataset: HadGEM2-ES, ensemble: r1i1p1} no amip + - {dataset: inmcm4, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1} + # - {dataset: MIROC4h, ensemble: r1i1p1} no amip + - {dataset: MIROC5, ensemble: r1i1p1} + # - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1} no amip + - {dataset: MIROC-ESM, ensemble: r1i1p1} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1} + # - {dataset: MPI-ESM-P, ensemble: r1i1p1} no amip + - {dataset: MRI-CGCM3, ensemble: r1i1p1} + # - {dataset: MRI-ESM1, ensemble: r1i1p1} no amip + # - {dataset: NorESM1-ME, ensemble: r1i1p1} no amip + - {dataset: NorESM1-M, ensemble: r1i1p1} + +CMIP6: &cmip6_models + # - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn} no amip + # error time coordinate - {dataset: BCC-CSM2-MR, ensemble: r2i1p1f1, grid: gn} + # time_coord_problem_rlut - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: CanESM5, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + # error time coordinate - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: EC-Earth3, ensemble: r1i1p1f1, grid: gr} + - {dataset: EC-Earth3-Veg, ensemble: r1i1p1f1, grid: gr} + # no_prw - {dataset: FGOALS-f3-L, ensemble: r2i1p1f1, grid: gr} + # missing data - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn} + # error time coordinate - {dataset: GFDL-AM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + # missing data - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1} + # error concat. cubes - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn} + # - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn} no amip + - {dataset: GISS-E2-2-G, ensemble: r1i1p3f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn} + - {dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3, grid: gn} + - {dataset: INM-CM4-8, ensemble: r1i1p1f1, grid: gr1} + - {dataset: INM-CM5-0, ensemble: r1i1p1f1, grid: gr1} + - {dataset: IPSL-CM6A-LR, ensemble: r1i1p1f1, grid: gr} + # missing data - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn} + # missing data - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-HR, institute: MPI-M, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn} + - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn} + # missing data - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + # err. parent time units- {dataset: UKESM1-0-LL, ensemble: r1i1p1f4, grid: gn} + + +diagnostics: + + # ========================================================================== + # Geographical distribution of multi-year annual/seasonal means (panel plot) + # ========================================================================== + + clouds_clim_cmip5_amip: + description: climatological annual means + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: amip + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: PATMOS-x, project: OBS, type: sat, version: NOAA, + tier: 2, start_year: 1982, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + clivi: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: amip + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + lwp: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: amip + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: MAC-LWP, project: OBS, type: sat, version: v1, tier: 3, + start_year: 1988, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + swcre: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: amip + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + lwcre: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: amip + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + prw: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: amip + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-WATERVAPOUR + additional_datasets: + - {dataset: ESACCI-WATERVAPOUR, project: OBS, type: sat, + version: CDR2-L3S-05deg_fv3.1, tier: 3, + start_year: 2003, end_year: 2017} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + additional_datasets: *cmip5_models + scripts: + avgclt: &settings5 + script: clouds/clouds.ncl + projection: Robinson + timemean: annualclim + showdiff: true + multiobs_uncertainty: true + multiobs_exclude: ["ERA-Interim", "ERA5"] + filename_add: cmip5_amip + var: clt + avgclivi: + <<: *settings5 + var: clivi + avglwp: + <<: *settings5 + var: lwp + avgswcre: + <<: *settings5 + var: swcre + avglwcre: + <<: *settings5 + var: lwcre + avgprw: + <<: *settings5 + var: prw + + clouds_clim_cmip6_amip: + description: climatological annual means + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: amip + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: PATMOS-x, project: OBS, type: sat, version: NOAA, + tier: 2, start_year: 1982, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + clivi: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: amip + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + lwp: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: amip + start_year: 1995 + end_year: 2014 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: MAC-LWP, project: OBS, type: sat, version: v1, tier: 3, + start_year: 1988, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + swcre: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: amip + start_year: 1995 + end_year: 2014 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + lwcre: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: amip + start_year: 2001 + end_year: 2010 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + prw: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: amip + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-WATERVAPOUR + additional_datasets: + - {dataset: ESACCI-WATERVAPOUR, project: OBS, type: sat, + version: CDR2-L3S-05deg_fv3.1, tier: 3, + start_year: 2003, end_year: 2017} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + additional_datasets: *cmip6_models + scripts: + avgclt: &settings6 + script: clouds/clouds.ncl + projection: Robinson + timemean: annualclim + showdiff: true + multiobs_uncertainty: true + multiobs_exclude: ["ERA-Interim", "ERA5"] + filename_add: cmip6_amip + var: clt + avgclivi: + <<: *settings6 + var: clivi + avglwp: + <<: *settings6 + var: lwp + avgswcre: + <<: *settings6 + var: swcre + avglwcre: + <<: *settings6 + var: lwcre + avgprw: + <<: *settings6 + var: prw diff --git a/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig2_taylor.yml b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig2_taylor.yml new file mode 100644 index 0000000000..8bce0895cb --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig2_taylor.yml @@ -0,0 +1,315 @@ +# recipe_lauer22jclim_fig2_taylor.yml +--- +documentation: + title: Cloud diagnostics v2 (taylor) + + description: | + Taylor diagrams of clouds properties. + + authors: + - lauer_axel + + maintainer: + - lauer_axel + + references: + - lauer22jclim + + projects: + - cmug + + +preprocessors: + clim: + regrid: + target_grid: 2x2 + scheme: linear + + +diagnostics: + + # ========================================================================== + # Taylor plots of multi-year mean quantities + # ========================================================================== + + clouds_tay: + description: climatological annual means + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: clim + mip: Amon + exp: historical + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, + version: V002_01, tier: 3, + start_year: 1982, end_year: 2018} + - {dataset: PATMOS-x, project: OBS, type: sat, version: NOAA, + tier: 2, start_year: 1982, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 1986, end_year: 2014} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3, start_year: 1986, end_year: 2014} + clivi: + preprocessor: clim + mip: Amon + exp: historical + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 1986, end_year: 2014} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3, start_year: 1986, end_year: 2014} + lwp: + preprocessor: clim + mip: Amon + exp: historical + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: MAC-LWP, project: OBS, type: sat, version: v1, tier: 3, + start_year: 1988, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 1986, end_year: 2014} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3, start_year: 1986, end_year: 2014} + swcre: + preprocessor: clim + mip: Amon + exp: historical + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + lwcre: + preprocessor: clim + mip: Amon + exp: historical + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + prw: + preprocessor: clim + mip: Amon + exp: historical + reference_dataset: ESACCI-WATERVAPOUR + additional_datasets: + - {dataset: ESACCI-WATERVAPOUR, project: OBS, type: sat, + version: CDR2-L3S-05deg_fv3.1, tier: 3, + start_year: 2003, end_year: 2017} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3, start_year: 1986, end_year: 2014} + additional_datasets: + - {dataset: ACCESS1-0, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: ACCESS1-3, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: bcc-csm1-1, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: BNU-ESM, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: CanESM2, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: CCSM4, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-BGC, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-CAM5, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-FASTCHEM, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-WACCM, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: CMCC-CESM, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: CMCC-CM, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # missing_data - {dataset: CMCC-CMS, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: FGOALS-g2, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: FIO-ESM, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-CM3, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-H-CC, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-H, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-R-CC, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-R, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: HadGEM2-CC, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: HadGEM2-ES, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: inmcm4, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: MIROC4h, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: MIROC5, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: MIROC-ESM, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-P, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: MRI-CGCM3, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: MRI-ESM1, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: NorESM1-ME, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: NorESM1-M, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + # time_coord_problem_rlut - {dataset: BCC-ESM1, ensemble: r1i1p1f1, + # grid: gn, project: CMIP6, + # start_year: 1995, end_year: 2014} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6, start_year: 1995, end_year: 2014} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6, start_year: 1995, end_year: 2014} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr, project: CMIP6, + start_year: 1995, end_year: 2014} + # no_prw - {dataset: FGOALS-f3-L, ensemble: r2i1p1f1, grid: gr, + # project: CMIP6, start_year: 1995, end_year: 2014} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: IPSL-CM6A-LR, ensemble: r3i1p1f1, grid: gr, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: MPI-ESM1-2-HR, institute: MPI-M, ensemble: r1i1p1f1, grid: gn, + project: CMIP6, start_year: 1995, end_year: 2014} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + scripts: + tayclt: &settings + script: clouds/clouds_taylor_double.ncl + multiobs_uncertainty: true + multiobs_exclude: ["ERA-Interim", "ERA5"] + styleset: lauer21 + timemean: annualclim + valid_fraction: 0.5 + projectcolors: ["(/0.6, 0.8, 1.0/)", "(/1.0, 0.6, 0.8/)"] + projectgroups: ["CMIP5", "CMIP6"] + var: clt + tayclivi: + <<: *settings + var: clivi + taylwp: + <<: *settings + var: lwp + tayswcre: + <<: *settings + var: swcre + taylwcre: + <<: *settings + var: lwcre + tayprw: + <<: *settings + var: prw diff --git a/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig2_taylor_amip.yml b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig2_taylor_amip.yml new file mode 100644 index 0000000000..0c36bc8dc9 --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig2_taylor_amip.yml @@ -0,0 +1,348 @@ +# recipe_lauer22jclim_fig2_taylor_amip.yml +--- +documentation: + title: Cloud diagnostics v2 (taylor) + + description: | + Taylor diagrams of clouds properties (AMIP models). + + authors: + - lauer_axel + + maintainer: + - lauer_axel + + references: + - lauer22jclim + + projects: + - cmug + + +preprocessors: + clim: + regrid: + target_grid: 2x2 + scheme: linear + + +diagnostics: + + # ========================================================================== + # Taylor plots of multi-year mean quantities + # ========================================================================== + + clouds_tay_amip: + description: climatological annual means + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: clim + mip: Amon + exp: amip + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: PATMOS-x, project: OBS, type: sat, version: NOAA, + tier: 2, start_year: 1982, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 1986, end_year: 2014} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3, start_year: 1986, end_year: 2014} + clivi: + preprocessor: clim + mip: Amon + exp: amip + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 1986, end_year: 2014} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3, start_year: 1986, end_year: 2014} + lwp: + preprocessor: clim + mip: Amon + exp: amip + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: MAC-LWP, project: OBS, type: sat, version: v1, tier: 3, + start_year: 1988, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 1986, end_year: 2014} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3, start_year: 1986, end_year: 2014} + swcre: + preprocessor: clim + mip: Amon + exp: amip + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + lwcre: + preprocessor: clim + mip: Amon + exp: amip + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + prw: + preprocessor: clim + mip: Amon + exp: amip + reference_dataset: ESACCI-WATERVAPOUR + additional_datasets: + - {dataset: ESACCI-WATERVAPOUR, project: OBS, type: sat, + version: CDR2-L3S-05deg_fv3.1, tier: 3, + start_year: 2003, end_year: 2017} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3, start_year: 1986, end_year: 2014} + additional_datasets: + - {dataset: ACCESS1-0, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: ACCESS1-3, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: bcc-csm1-1, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: BNU-ESM, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # no data - {dataset: CanESM2, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + - {dataset: CanAM4, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: CCSM4, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # no data - {dataset: CESM1-BGC, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + - {dataset: CESM1-CAM5, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # no data - {dataset: CESM1-FASTCHEM, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + # no data - {dataset: CESM1-WACCM, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + # no data - {dataset: CMCC-CESM, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} no amip + - {dataset: CMCC-CM, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # missing data - {dataset: CMCC-CMS, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} no amip + - {dataset: CNRM-CM5, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: FGOALS-g2, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: FGOALS-s2, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # no data - {dataset: FIO-ESM, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + - {dataset: GFDL-CM3, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # no data - {dataset: GFDL-ESM2G, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + # no data - {dataset: GFDL-ESM2M, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + - {dataset: GFDL-HIRAM-C180, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-HIRAM-C360, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # no data - {dataset: GISS-E2-H-CC, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + # no data - {dataset: GISS-E2-H, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + # no data - {dataset: GISS-E2-R-CC, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-R, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: HadGEM2-A, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # no data - {dataset: HadGEM2-CC, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + # no data - {dataset: HadGEM2-ES, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + - {dataset: inmcm4, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # no data - {dataset: MIROC4h, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + - {dataset: MIROC5, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # no data - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + - {dataset: MIROC-ESM, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # no data - {dataset: MPI-ESM-P, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + - {dataset: MRI-CGCM3, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # no data - {dataset: MRI-ESM1, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} + # no data - {dataset: NorESM1-ME, ensemble: r1i1p1, project: CMIP5, + # start_year: 1986, end_year: 2005} no amip + - {dataset: NorESM1-M, ensemble: r1i1p1, project: CMIP5, + start_year: 1986, end_year: 2005} + # no data - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn, + # project: CMIP6, start_year: 1995, end_year: 2014} + # error time coord. - {dataset: BCC-CSM2-MR, ensemble: r2i1p1f1, grid: gn, + # project: CMIP6, start_year: 1995, end_year: 2014} + # time_coord_problem_rlut - {dataset: BCC-ESM1, ensemble: r1i1p1f1, + # grid: gn, project: CMIP6, start_year: 1995, + # end_year: 2014} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: CanESM5, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6, start_year: 1995, end_year: 2014} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6, start_year: 1995, end_year: 2014} + - {dataset: CESM2-WACCM-FV2, institute: NCAR, ensemble: r1i1p1f1, + grid: gn, project: CMIP6, start_year: 1995, end_year: 2014} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr, project: CMIP6, + start_year: 1995, end_year: 2014} + # error time coord. - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, + # project: CMIP6, start_year: 1995, end_year: 2014} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: EC-Earth3, ensemble: r1i1p1f1, grid: gr, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: EC-Earth3-Veg, ensemble: r1i1p1f1, grid: gr, project: CMIP6, + start_year: 1995, end_year: 2014} + # no prw - {dataset: FGOALS-f3-L, ensemble: r2i1p1f1, grid: gr, + # project: CMIP6, start_year: 1995, end_year: 2014} + # missing data - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn, + # project: CMIP6, start_year: 1995, end_year: 2014} + # error time coord. - {dataset: GFDL-AM4, ensemble: r1i1p1f1, grid: gr1, + # project: CMIP6, start_year: 1995, end_year: 2014} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6, + start_year: 1995, end_year: 2014} + # missing data - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1, + # project: CMIP6, start_year: 1995, end_year: 2014} + # error concat. cubes - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, + # grid: gn, project: CMIP6, start_year: 1995, + # end_year: 2014} + # no data - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, + # project: CMIP6, start_year: 1995, end_year: 2014} + - {dataset: GISS-E2-2-G, ensemble: r1i1p3f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: INM-CM4-8, ensemble: r1i1p1f1, grid: gr1, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: INM-CM5-0, ensemble: r1i1p1f1, grid: gr1, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: IPSL-CM6A-LR, ensemble: r1i1p1f1, grid: gr, project: CMIP6, + start_year: 1995, end_year: 2014} + # missing data - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr, + # project: CMIP6, start_year: 1995, end_year: 2014} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + # missing data - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn, + # project: CMIP6, start_year: 1995, end_year: 2014} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: MPI-ESM1-2-HR, institute: MPI-M, ensemble: r1i1p1f1, grid: gn, + project: CMIP6, start_year: 1995, end_year: 2014} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + # missing data - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn, + # project: CMIP6, start_year: 1995, end_year: 2014} + # error parent_time_units - {dataset: UKESM1-0-LL, ensemble: r1i1p1f4, + # grid: gn, project: CMIP6, start_year: 1995, + # end_year: 2014} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, project: CMIP6, + start_year: 1995, end_year: 2014} + scripts: + tayclt: &settings + script: clouds/clouds_taylor_double.ncl + multiobs_uncertainty: true + multiobs_exclude: ["ERA-Interim", "ERA5"] + styleset: lauer21 + timemean: annualclim + valid_fraction: 0.5 + projectcolors: ["(/0.6, 0.8, 1.0/)", "(/1.0, 0.6, 0.8/)"] + projectgroups: ["CMIP5", "CMIP6"] + var: clt + tayclivi: + <<: *settings + var: clivi + taylwp: + <<: *settings + var: lwp + tayswcre: + <<: *settings + var: swcre + taylwcre: + <<: *settings + var: lwcre + tayprw: + <<: *settings + var: prw diff --git a/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig3-4_zonal.yml b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig3-4_zonal.yml new file mode 100644 index 0000000000..cedef4767f --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig3-4_zonal.yml @@ -0,0 +1,586 @@ +# ESMValTool +# recipe_lauer22jclim_fig3-4_zonal.yml +--- +documentation: + title: Cloud diagnostics v2 (zonal means) + + description: | + Diagnostics of 3-d cloud parameters. + + authors: + - lauer_axel + + maintainer: + - lauer_axel + + references: + - lauer22jclim + + projects: + - cmug + + +preprocessors: + ppa40: + extract_levels: + levels: {cmor_table: CMIP6, coordinate: alt40} + coordinate: altitude + scheme: linear + regrid: + target_grid: 2x2 + scheme: linear + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [reference_dataset] + zonal_statistics: + operator: mean + + pp27: + extract_levels: + levels: {cmor_table: CMIP6, coordinate: plev27} + coordinate: air_pressure + scheme: linear + regrid: + target_grid: 2x2 + scheme: linear + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [reference_dataset] + zonal_statistics: + operator: mean + + +diagnostics: + + clw_cmip6: + description: cloud liquid water zonal mean + themes: + - phys + - clouds + realms: + - atmos + variables: + clw: + preprocessor: pp27 + reference_dataset: CLOUDSAT-L2 + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + additional_datasets: + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, mip: Amon, tier: 3} + # concetenation error - {dataset: ACCESS-CM2, institute: CSIRO-ARCCSS, + # ensemble: r1i1p1f1, grid: gn} + # concetenation error - {dataset: ACCESS-ESM1-5, ensemble: r1i1p1f1, + # grid: gn} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM-FV2, ensemble: r1i1p1f1, grid: gn} + # error - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + # error - {dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + # ERROR_ps_missing - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn} + # ERROR_coordinates_screwed - {dataset: IPSL-CM6A-LR, ensemble: r4i1p1f1, + # grid: gr} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-HR, institute: MPI-M, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn} + - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + scripts: + zonal: + script: clouds/clouds_zonal.ncl + timemean: annualclim + embracesetup: false + extralegend: false + panel_labels: true + explicit_cn_levels: [0., 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, + 0.09, 0.1, 0.11, 0.12, 0.13, 0.14] + explicit_cn_dlevels: [-0.05, -0.04, -0.03, -0.02, -0.01, 0., 0.01, 0.02, + 0.03, 0.04, 0.05] + units_to: g/kg + showdiff: true + rel_diff: false + t_test: true + filename_add: cmip6 + + clw_cmip5: + description: cloud liquid water zonal mean + themes: + - phys + - clouds + realms: + - atmos + variables: + clw: + preprocessor: pp27 + reference_dataset: CLOUDSAT-L2 + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + additional_datasets: + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + # concatenation error - {dataset: ACCESS1-0, ensemble: r1i1p1} + # concatenation error - {dataset: ACCESS1-3, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1} + - {dataset: BNU-ESM, ensemble: r1i1p1} + - {dataset: CanESM2, ensemble: r1i1p1} + - {dataset: CCSM4, ensemble: r1i1p1} + - {dataset: CESM1-BGC, ensemble: r1i1p1} + - {dataset: CESM1-CAM5, ensemble: r1i1p1} + - {dataset: CESM1-FASTCHEM, ensemble: r1i1p1} + - {dataset: CESM1-WACCM, ensemble: r1i1p1} + # data look wrong - {dataset: CMCC-CESM, ensemble: r1i1p1} + # data look wrong - {dataset: CMCC-CM, ensemble: r1i1p1} + # data look wrong - {dataset: CMCC-CMS, ensemble: r1i1p1} + # - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1} + # - {dataset: FGOALS-g2, ensemble: r1i1p1} + - {dataset: FIO-ESM, ensemble: r1i1p1} + - {dataset: GFDL-CM3, ensemble: r1i1p1} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1} + - {dataset: GISS-E2-H-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-H, ensemble: r1i1p1} + - {dataset: GISS-E2-R-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-R, ensemble: r1i1p1} + - {dataset: HadGEM2-CC, ensemble: r1i1p1} + - {dataset: HadGEM2-ES, ensemble: r1i1p1} + - {dataset: inmcm4, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1} + # - {dataset: MIROC4h, ensemble: r1i1p1} + # concatenation error - {dataset: MIROC5, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1} + - {dataset: MIROC-ESM, ensemble: r1i1p1} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1} + - {dataset: MPI-ESM-P, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, ensemble: r1i1p1} + - {dataset: MRI-ESM1, ensemble: r1i1p1} + - {dataset: NorESM1-ME, ensemble: r1i1p1} + - {dataset: NorESM1-M, ensemble: r1i1p1} + scripts: + zonal: + script: clouds/clouds_zonal.ncl + timemean: annualclim + embracesetup: false + extralegend: false + panel_labels: true + explicit_cn_levels: [0., 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, + 0.09, 0.1, 0.11, 0.12, 0.13, 0.14] + explicit_cn_dlevels: [-0.05, -0.04, -0.03, -0.02, -0.01, 0., 0.01, 0.02, + 0.03, 0.04, 0.05] + units_to: g/kg + showdiff: true + rel_diff: false + t_test: true + filename_add: cmip5 + + clcalipso_cmip6: + description: cloud fraction zonal mean + themes: + - phys + - clouds + realms: + - atmos + variables: + clcalipso: + preprocessor: ppa40 + reference_dataset: CALIPSO-GOCCP + mip: CFmon + exp: historical + project: CMIP6 + start_year: 1995 + end_year: 2014 + additional_datasets: + - {dataset: CALIPSO-GOCCP, project: OBS, type: sat, version: 3.1.2, + mip: cfMon, start_year: 2007, end_year: 2015, tier: 2} + - {dataset: CESM2, ensemble: r10i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: E3SM-1-0, ensemble: r4i1p1f1, grid: gr} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: IPSL-CM6A-LR, ensemble: r4i1p1f1, grid: gr} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn} + scripts: + zonal: + script: clouds/clouds_zonal.ncl + timemean: annualclim + explicit_cn_levels: [5., 10., 15., 20., 25., 30., 35., 40., 45., 50.] + explicit_cn_dlevels: [-20., -15., -10., -5., 0, 5., 10., 15., 20.] + embracesetup: true + extralegend: false + panel_labels: true + showdiff: true + rel_diff: false + t_test: true + filename_add: cmip6 + + clcalipso_cmip5: + description: cloud fraction zonal mean + themes: + - phys + - clouds + realms: + - atmos + variables: + clcalipso: + preprocessor: ppa40 + reference_dataset: CALIPSO-GOCCP + mip: cfMon + exp: historical + project: CMIP5 + start_year: 1986 + end_year: 2005 + additional_datasets: + - {dataset: CALIPSO-GOCCP, project: OBS, type: sat, version: 3.1.2, + mip: cfMon, tier: 2, start_year: 2007, end_year: 2015} + - {dataset: CanESM2, ensemble: r1i1p1} + - {dataset: HadGEM2-ES, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1} + - {dataset: MIROC5, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1} + - {dataset: MIROC-ESM, ensemble: r1i1p1} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, ensemble: r1i1p1} + scripts: + zonal: + script: clouds/clouds_zonal.ncl + timemean: annualclim + explicit_cn_levels: [5., 10., 15., 20., 25., 30., 35., 40., 45., 50.] + explicit_cn_dlevels: [-20., -15., -10., -5., 0, 5., 10., 15., 20.] + embracesetup: true + extralegend: false + panel_labels: true + showdiff: true + rel_diff: false + t_test: true + filename_add: cmip5 + + cli_cmip6: + description: cloud ice content zonal mean + themes: + - phys + realms: + - atmos + variables: + cli: + preprocessor: pp27 + reference_dataset: CALIPSO-ICECLOUD + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + additional_datasets: + - {dataset: CALIPSO-ICECLOUD, project: OBS, type: sat, version: 1-00, + mip: Amon, start_year: 2007, end_year: 2015, tier: 3} + # concatenation error - {dataset: ACCESS-CM2, institute: CSIRO-ARCCSS, + # ensemble: r1i1p1f1, grid: gn} + # concatenation error - {dataset: ACCESS-ESM1-5, ensemble: r1i1p1f1, + # grid: gn} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + # error - {dataset: FGOALS-f3-L, ensemble: r2i1p1f1, grid: gr} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + # ERROR_ps_missing - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn} + # ERROR_coordinates_screwed - {dataset: IPSL-CM6A-LR, ensemble: r3i1p1f1, + # grid: gr} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-HR, institute: MPI-M, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn} + - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + scripts: + zonal: + script: clouds/clouds_zonal.ncl + timemean: annualclim + explicit_cn_levels: [0., 0.002, 0.004, 0.006, 0.008, 0.01, 0.012, 0.014, + 0.016, 0.018, 0.02, 0.022, 0.024, 0.026, 0.028] + explicit_cn_dlevels: [-0.01, -0.008, -0.006, -0.004, -0.002, 0., 0.002, + 0.004, 0.006, 0.008, 0.01] + extralegend: false + panel_labels: true + showdiff: true + t_test: true + rel_diff: false + units_to: g/kg + filename_add: cmip6 + + cli_cmip5: + description: cloud ice content zonal mean + themes: + - phys + realms: + - atmos + variables: + cli: + preprocessor: pp27 + reference_dataset: CALIPSO-ICECLOUD + mip: Amon + exp: historical + project: CMIP5 + start_year: 1986 + end_year: 2005 + additional_datasets: + - {dataset: CALIPSO-ICECLOUD, project: OBS, type: sat, version: 1-00, + mip: Amon, start_year: 2007, end_year: 2015, tier: 3} + # concatenation error - {dataset: ACCESS1-0, ensemble: r1i1p1} + # concatenation error - {dataset: ACCESS1-3, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1} + - {dataset: BNU-ESM, ensemble: r1i1p1} + - {dataset: CanESM2, ensemble: r1i1p1} + - {dataset: CCSM4, ensemble: r1i1p1} + - {dataset: CESM1-BGC, ensemble: r1i1p1} + - {dataset: CESM1-CAM5, ensemble: r1i1p1} + - {dataset: CESM1-FASTCHEM, ensemble: r1i1p1} + - {dataset: CESM1-WACCM, ensemble: r1i1p1} + # fix needed - {dataset: CMCC-CESM, ensemble: r1i1p1} + # fix needed - {dataset: CMCC-CM, ensemble: r1i1p1} + # fix needed - {dataset: CMCC-CMS, ensemble: r1i1p1} + # - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1} + # - {dataset: FGOALS-g2, ensemble: r1i1p1} + - {dataset: FIO-ESM, ensemble: r1i1p1} + - {dataset: GFDL-CM3, ensemble: r1i1p1} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1} + - {dataset: GISS-E2-H-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-H, ensemble: r1i1p1} + - {dataset: GISS-E2-R-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-R, ensemble: r1i1p1} + - {dataset: HadGEM2-CC, ensemble: r1i1p1} + - {dataset: HadGEM2-ES, ensemble: r1i1p1} + - {dataset: inmcm4, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1} + # concatenation error - {dataset: MIROC5, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1} + - {dataset: MIROC-ESM, ensemble: r1i1p1} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1} + - {dataset: MPI-ESM-P, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, ensemble: r1i1p1} + - {dataset: MRI-ESM1, ensemble: r1i1p1} + - {dataset: NorESM1-ME, ensemble: r1i1p1} + - {dataset: NorESM1-M, ensemble: r1i1p1} + scripts: + zonal: + script: clouds/clouds_zonal.ncl + timemean: annualclim + t_test: true + explicit_cn_levels: [0., 0.002, 0.004, 0.006, 0.008, 0.01, 0.012, + 0.014, 0.016, 0.018, 0.02, 0.022, 0.024, 0.026, + 0.028] + explicit_cn_dlevels: [-0.01, -0.008, -0.006, -0.004, -0.002, 0., 0.002, + 0.004, 0.006, 0.008, 0.01] + extralegend: false + panel_labels: true + showdiff: true + rel_diff: false + units_to: g/kg + filename_add: cmip5 + + cl_cmip6: + description: 3-dim cloud cover, zonal mean + themes: + - phys + realms: + - atmos + variables: + cl: + preprocessor: pp27 + reference_dataset: ERA5 + mip: Amon + project: CMIP6 + start_year: 1995 + end_year: 2014 + exp: historical + additional_datasets: + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 1986, end_year: 2014} + # concatenation error - {dataset: ACCESS-CM2, institute: CSIRO-ARCCSS, + # ensemble: r1i1p1f1, grid: gn} + # concatenation error - {dataset: ACCESS-ESM1-5, ensemble: r1i1p1f1, + # grid: gn} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM-FV2, institute: NCAR, ensemble: r1i1p1f1, + grid: gn} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CIESM, ensemble: r1i1p1f1, grid: gr} + # error - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr} + # error - {dataset: E3SM-1-1-ECA, ensemble: r1i1p1f1, grid: gr} + - {dataset: E3SM-1-1, ensemble: r1i1p1f1, grid: gr} + # error - {dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + # error - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-G-CC, institute: NASA-GISS, ensemble: r1i1p1f1, + grid: gn} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn} + - {dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3, grid: gn} + # ERROR_coordinates_screwed - {dataset: IPSL-CM6A-LR, ensemble: r3i1p1f1, + # grid: gr} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr} + # error - {dataset: MCM-UA-1-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-HR, institute: MPI-M, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn} + - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn} + - {dataset: NorESM2-MM, ensemble: r1i1p1f1, grid: gn} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + scripts: + zonal: + script: clouds/clouds_zonal.ncl + timemean: annualclim + explicit_cn_dlevels: [-25., -20., -15., -10., -5., 0., 5., 10., 15., + 20., 25.] + explicit_cn_levels: [5., 10., 15., 20., 25., 30., 35., 40., 45., 50.] + extralegend: false + panel_labels: true + showdiff: true + t_test: true + rel_diff: false + filename_add: cmip6 + + cl_cmip5: + description: 3-dim cloud cover, zonal mean + themes: + - phys + realms: + - atmos + variables: + cl: + preprocessor: pp27 + reference_dataset: ERA5 + mip: Amon + project: CMIP5 + start_year: 1986 + end_year: 2005 + exp: historical + additional_datasets: + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 1986, end_year: 2014} + - {dataset: ACCESS1-0, ensemble: r1i1p1} + - {dataset: ACCESS1-3, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1} + - {dataset: BNU-ESM, ensemble: r1i1p1} + - {dataset: CanESM2, ensemble: r1i1p1} + - {dataset: CCSM4, ensemble: r1i1p1} + - {dataset: CESM1-BGC, ensemble: r1i1p1} + - {dataset: CESM1-CAM5, ensemble: r1i1p1} + - {dataset: CESM1-FASTCHEM, ensemble: r1i1p1} + - {dataset: CESM1-WACCM, ensemble: r1i1p1} + # fix needed - {dataset: CMCC-CESM, ensemble: r1i1p1} + # fix needed - {dataset: CMCC-CM, ensemble: r1i1p1} + # fix needed - {dataset: CMCC-CMS, ensemble: r1i1p1} + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1} + - {dataset: FGOALS-g2, ensemble: r1i1p1} + - {dataset: FIO-ESM, ensemble: r1i1p1} + - {dataset: GFDL-CM2p1, ensemble: r1i1p1} + - {dataset: GFDL-CM3, ensemble: r1i1p1} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1} + - {dataset: GISS-E2-H-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-H, ensemble: r1i1p1} + - {dataset: GISS-E2-R-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-R, ensemble: r1i1p1} + - {dataset: HadGEM2-CC, ensemble: r1i1p1} + - {dataset: HadGEM2-ES, ensemble: r1i1p1} + - {dataset: inmcm4, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1} + - {dataset: MIROC5, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1} + - {dataset: MIROC-ESM, ensemble: r1i1p1} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1} + - {dataset: MPI-ESM-P, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, ensemble: r1i1p1} + - {dataset: MRI-ESM1, ensemble: r1i1p1} + - {dataset: NorESM1-ME, ensemble: r1i1p1} + - {dataset: NorESM1-M, ensemble: r1i1p1} + scripts: + zonal: + script: clouds/clouds_zonal.ncl + timemean: annualclim + explicit_cn_dlevels: [-25., -20., -15., -10., -5., 0., 5., 10., 15., + 20., 25.] + explicit_cn_levels: [5., 10., 15., 20., 25., 30., 35., 40., 45., 50.] + extralegend: false + panel_labels: true + showdiff: true + t_test: true + rel_diff: false + filename_add: cmip5 diff --git a/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig5_lifrac.yml b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig5_lifrac.yml new file mode 100644 index 0000000000..970bd469ab --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig5_lifrac.yml @@ -0,0 +1,237 @@ +# ESMValTool +# recipe_lauer22jclim_fig5_lifrac.yml +--- +documentation: + title: Cloud diagnostics v2 (liquid/ice fraction) + + description: | + Diagnostics of 3-d cloud parameters. + + authors: + - lauer_axel + + maintainer: + - lauer_axel + + references: + - lauer22jclim + + projects: + - cmug + + +preprocessors: + + pp27_all_lev: + extract_levels: + levels: {cmor_table: CMIP6, coordinate: plev27} + coordinate: air_pressure + scheme: linear + regrid: + target_grid: 2x2 + scheme: linear + multi_model_statistics: + span: overlap + statistics: [mean, median] + exclude: [reference_dataset] + + +diagnostics: + + lifrac_scatter_cmip6: + description: ice / liquid fraction vs. temperature + themes: + - phys + - clouds + realms: + - atmos + variables: + clw: + preprocessor: pp27_all_lev + mip: Amon + project: CMIP6 + start_year: 1995 + end_year: 2014 + exp: historical + reference_dataset: CLOUDSAT-L2 + additional_datasets: + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, tier: 3, + start_year: 2007, end_year: 2015} + cli: + preprocessor: pp27_all_lev + mip: Amon + project: CMIP6 + start_year: 1995 + end_year: 2014 + exp: historical + reference_dataset: CALIPSO-ICECLOUD + additional_datasets: + - {dataset: CALIPSO-ICECLOUD, project: OBS, type: sat, + version: 1-00, mip: Amon, tier: 3, + start_year: 2007, end_year: 2015} + ta: + preprocessor: pp27_all_lev + mip: Amon + project: CMIP6 + start_year: 1995 + end_year: 2014 + exp: historical + reference_dataset: ERA5 + additional_datasets: + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 2007, end_year: 2015} + additional_datasets: + # concatenation error - {dataset: ACCESS-CM2, institute: CSIRO-ARCCSS, + # ensemble: r1i1p1f1, grid: gn} + # concatenation error - {dataset: ACCESS-ESM1-5, ensemble: r1i1p1f1, + # grid: gn} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM-FV2, ensemble: r1i1p1f1, grid: gn} + # error - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + # error - {dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + # ERROR_ps_missing - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn} + # ERROR_coordinates_screwed - {dataset: IPSL-CM6A-LR, ensemble: r4i1p1f1, + # grid: gr} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-HR, institute: MPI-M, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn} + - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + scripts: + lifrac_scatter: + script: clouds/clouds_lifrac_scatter.ncl + filename_add: cmip6 + min_mass: 1.0e-6 + panel_labels: true + + lifrac_scatter_cmip5: + description: ice / liquid fraction vs. temperature + themes: + - phys + - clouds + realms: + - atmos + variables: + clw: + preprocessor: pp27_all_lev + mip: Amon + project: CMIP5 + start_year: 1986 + end_year: 2005 + exp: historical + reference_dataset: CLOUDSAT-L2 + additional_datasets: + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, tier: 3, + start_year: 2007, end_year: 2015} + cli: + preprocessor: pp27_all_lev + mip: Amon + project: CMIP5 + start_year: 1986 + end_year: 2005 + exp: historical + reference_dataset: CALIPSO-ICECLOUD + additional_datasets: + - {dataset: CALIPSO-ICECLOUD, project: OBS, type: sat, version: 1-00, + mip: Amon, tier: 3, + start_year: 2007, end_year: 2015} + ta: + preprocessor: pp27_all_lev + mip: Amon + project: CMIP5 + start_year: 1986 + end_year: 2005 + exp: historical + reference_dataset: ERA5 + additional_datasets: + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 2007, end_year: 2015} + additional_datasets: + # concatenation error - {dataset: ACCESS1-0, ensemble: r1i1p1} + # concatenation error - {dataset: ACCESS1-3, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1} + - {dataset: BNU-ESM, ensemble: r1i1p1} + - {dataset: CanESM2, ensemble: r1i1p1} + - {dataset: CCSM4, ensemble: r1i1p1} + - {dataset: CESM1-BGC, ensemble: r1i1p1} + - {dataset: CESM1-CAM5, ensemble: r1i1p1} + - {dataset: CESM1-FASTCHEM, ensemble: r1i1p1} + - {dataset: CESM1-WACCM, ensemble: r1i1p1} + # data look wrong - {dataset: CMCC-CESM, ensemble: r1i1p1} + # data look wrong - {dataset: CMCC-CM, ensemble: r1i1p1} + # - {dataset: CMCC-CMS, ensemble: r1i1p1} #data look wrong + # - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1} + # - {dataset: FGOALS-g2, ensemble: r1i1p1} + - {dataset: FIO-ESM, ensemble: r1i1p1} + - {dataset: GFDL-CM3, ensemble: r1i1p1} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1} + - {dataset: GISS-E2-H-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-H, ensemble: r1i1p1} + - {dataset: GISS-E2-R-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-R, ensemble: r1i1p1} + - {dataset: HadGEM2-CC, ensemble: r1i1p1} + - {dataset: HadGEM2-ES, ensemble: r1i1p1} + - {dataset: inmcm4, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1} + # - {dataset: MIROC4h, ensemble: r1i1p1} + # concatenation error - {dataset: MIROC5, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1} + - {dataset: MIROC-ESM, ensemble: r1i1p1} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1} + - {dataset: MPI-ESM-P, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, ensemble: r1i1p1} + - {dataset: MRI-ESM1, ensemble: r1i1p1} + - {dataset: NorESM1-ME, ensemble: r1i1p1} + - {dataset: NorESM1-M, ensemble: r1i1p1} + scripts: + lifrac_scatter: + script: clouds/clouds_lifrac_scatter.ncl + filename_add: cmip5 + min_mass: 1.0e-6 + panel_labels: true + + postproc: + description: | + Post-processing: CMIP5/CMIP6 comparison and additional statistics + scripts: + cmip5cmip6: + script: clouds/clouds_lifrac_scatter_postproc.ncl + ancestors: ['lifrac_scatter_cmip*/lifrac_scatter'] + models: [["bcc-csm1-1", "BCC-CSM2-MR"], + ["CESM1-WACCM", "CESM2-WACCM"], + ["GFDL-CM3", "GFDL-CM4"], + ["GISS-E2-H", "GISS-E2-1-H"], + ["HadGEM2-CC", "HadGEM3-GC31-LL"], + ["MIROC-ESM", "MIROC-ES2L"], + ["MPI-ESM-LR", "MPI-ESM1-2-LR"], + ["MRI-ESM1", "MRI-ESM2-0"], + ["NorESM1-M", "NorESM2-LM"]] + refname: "CLOUDSAT-L2-CALIPSO-ICECLOUD-ERA5" diff --git a/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig6_interannual.yml b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig6_interannual.yml new file mode 100644 index 0000000000..f5c76aad79 --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig6_interannual.yml @@ -0,0 +1,409 @@ +# recipe_lauer22jclim_fig6_interannual.yml +--- +documentation: + title: Cloud diagnostics v2 (interannual variability) + + description: | + Diagnostics for interannual variability of 2-d cloud parameters. + + authors: + - lauer_axel + + maintainer: + - lauer_axel + + references: + - lauer22jclim + + projects: + - cmug + + +preprocessors: + clim: + regrid: + target_grid: 2x2 + scheme: linear + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [CERES-EBAF, CLARA-AVHRR, CLOUDSAT-L2, ERA5, ERA-Interim, + ESACCI-CLOUD, ESACCI-WATERVAPOUR, HadISST, ISCCP-FH, MAC-LWP, + MODIS, PATMOS-x, reference_dataset, SSMI-MERIS] + + +CMIP5: &cmip5_models + - {dataset: ACCESS1-0, ensemble: r1i1p1} + - {dataset: ACCESS1-3, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1} + - {dataset: BNU-ESM, ensemble: r1i1p1} + - {dataset: CanESM2, ensemble: r1i1p1} + - {dataset: CCSM4, ensemble: r1i1p1} + - {dataset: CESM1-BGC, ensemble: r1i1p1} + - {dataset: CESM1-CAM5, ensemble: r1i1p1} + - {dataset: CESM1-FASTCHEM, ensemble: r1i1p1} + - {dataset: CESM1-WACCM, ensemble: r1i1p1} + - {dataset: CMCC-CESM, ensemble: r1i1p1} + - {dataset: CMCC-CM, ensemble: r1i1p1} + # missing data - {dataset: CMCC-CMS, ensemble: r1i1p1} + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1} + - {dataset: FGOALS-g2, ensemble: r1i1p1} + - {dataset: FIO-ESM, ensemble: r1i1p1} + - {dataset: GFDL-CM3, ensemble: r1i1p1} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1} + - {dataset: GISS-E2-H-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-H, ensemble: r1i1p1} + - {dataset: GISS-E2-R-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-R, ensemble: r1i1p1} + - {dataset: HadGEM2-CC, ensemble: r1i1p1} + - {dataset: HadGEM2-ES, ensemble: r1i1p1} + - {dataset: inmcm4, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1} + - {dataset: MIROC4h, ensemble: r1i1p1} + - {dataset: MIROC5, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1} + - {dataset: MIROC-ESM, ensemble: r1i1p1} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1} + - {dataset: MPI-ESM-P, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, ensemble: r1i1p1} + - {dataset: MRI-ESM1, ensemble: r1i1p1} + - {dataset: NorESM1-ME, ensemble: r1i1p1} + - {dataset: NorESM1-M, ensemble: r1i1p1} + +CMIP6: &cmip6_models + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn} + # time_coord_problem_rlut - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + # no_prw - {dataset: FGOALS-f3-L, ensemble: r2i1p1f1, grid: gr} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn} + - {dataset: IPSL-CM6A-LR, ensemble: r3i1p1f1, grid: gr} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-HR, institute: MPI-M, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn} + - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + + +diagnostics: + + # ========================================================================== + # Lauer and Hamilton (2013) - Equation 2, part of Figure 8 + # Interannual variability: relative temporal standard deviation calculated + # from monthly mean anomalies after subtracting the climatological mean + # seasonal cycle + # ========================================================================== + + clouds_intera_cmip5: + description: interannual variability + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: PATMOS-x, project: OBS, type: sat, version: NOAA, + tier: 2, start_year: 1982, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + clivi: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + lwp: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: MAC-LWP, project: OBS, type: sat, version: v1, tier: 3, + start_year: 1988, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + swcre: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + lwcre: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + prw: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-WATERVAPOUR + additional_datasets: + - {dataset: ESACCI-WATERVAPOUR, project: OBS, type: sat, + version: CDR2-L3S-05deg_fv3.1, tier: 3, + start_year: 2003, end_year: 2017} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + additional_datasets: *cmip5_models + scripts: + varclt: &settings5 + script: clouds/clouds_interannual.ncl + colormap: WhiteBlueGreenYellowRed + projection: Robinson + timemean: annualclim + filename_add: cmip5 + var: clt + epsilon: 1.0 + varclivi: + <<: *settings5 + var: clivi + epsilon: 0.001 + varlwp: + <<: *settings5 + var: lwp + epsilon: 0.001 + varlwcre: + <<: *settings5 + var: lwcre + epsilon: 1.0 + varswcre: + <<: *settings5 + var: swcre + epsilon: 1.0 + varprw: + <<: *settings5 + var: prw + epsilon: 1.0 + + + clouds_intera_cmip6: + description: interannual variability + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: PATMOS-x, project: OBS, type: sat, version: NOAA, + tier: 2, start_year: 1982, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + clivi: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, + tier: 2, start_year: 1992, end_year: 2016} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + lwp: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: MAC-LWP, project: OBS, type: sat, version: v1, tier: 3, + start_year: 1988, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + swcre: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + lwcre: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + prw: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-WATERVAPOUR + additional_datasets: + - {dataset: ESACCI-WATERVAPOUR, project: OBS, type: sat, + version: CDR2-L3S-05deg_fv3.1, tier: 3, + start_year: 2003, end_year: 2017} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + additional_datasets: *cmip6_models + scripts: + varclt: &settings6 + script: clouds/clouds_interannual.ncl + colormap: WhiteBlueGreenYellowRed + projection: Robinson + timemean: annualclim + var: clt + epsilon: 1.0 + filename_add: cmip6 + varclivi: + <<: *settings6 + var: clivi + epsilon: 0.001 + varlwp: + <<: *settings6 + var: lwp + epsilon: 0.001 + varlwcre: + <<: *settings6 + var: lwcre + epsilon: 1.0 + varswcre: + <<: *settings6 + var: swcre + epsilon: 1.0 + varprw: + <<: *settings6 + var: prw + epsilon: 1.0 diff --git a/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig7_seas.yml b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig7_seas.yml new file mode 100644 index 0000000000..aedba080b7 --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig7_seas.yml @@ -0,0 +1,421 @@ +# recipe_lauer22jclim_fig7_seas.yml +--- +documentation: + title: Cloud diagnostics v2 (seasonal cycle amplitude) + + description: | + Diagnostics of 2-d cloud parameters. + + authors: + - lauer_axel + + maintainer: + - lauer_axel + + references: + - lauer22jclim + + projects: + - cmug + + +preprocessors: + clim: + regrid: + target_grid: 2x2 + scheme: linear + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [CERES-EBAF, CLARA-AVHRR, CLOUDSAT-L2, ERA5, ERA-Interim, + ESACCI-CLOUD, ESACCI-WATERVAPOUR, HadISST, ISCCP-FH, MAC-LWP, + MODIS, PATMOS-x, reference_dataset, SSMI-MERIS] + + +CMIP5: &cmip5_models + - {dataset: ACCESS1-0, ensemble: r1i1p1} + - {dataset: ACCESS1-3, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1} + - {dataset: BNU-ESM, ensemble: r1i1p1} + - {dataset: CanESM2, ensemble: r1i1p1} + - {dataset: CCSM4, ensemble: r1i1p1} + - {dataset: CESM1-BGC, ensemble: r1i1p1} + - {dataset: CESM1-CAM5, ensemble: r1i1p1} + - {dataset: CESM1-FASTCHEM, ensemble: r1i1p1} + - {dataset: CESM1-WACCM, ensemble: r1i1p1} + - {dataset: CMCC-CESM, ensemble: r1i1p1} + - {dataset: CMCC-CM, ensemble: r1i1p1} + # missing data - {dataset: CMCC-CMS, ensemble: r1i1p1} + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1} + - {dataset: FGOALS-g2, ensemble: r1i1p1} + - {dataset: FIO-ESM, ensemble: r1i1p1} + - {dataset: GFDL-CM3, ensemble: r1i1p1} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1} + - {dataset: GISS-E2-H-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-H, ensemble: r1i1p1} + - {dataset: GISS-E2-R-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-R, ensemble: r1i1p1} + - {dataset: HadGEM2-CC, ensemble: r1i1p1} + - {dataset: HadGEM2-ES, ensemble: r1i1p1} + - {dataset: inmcm4, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1} + - {dataset: MIROC4h, ensemble: r1i1p1} + - {dataset: MIROC5, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1} + - {dataset: MIROC-ESM, ensemble: r1i1p1} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1} + - {dataset: MPI-ESM-P, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, ensemble: r1i1p1} + - {dataset: MRI-ESM1, ensemble: r1i1p1} + - {dataset: NorESM1-ME, ensemble: r1i1p1} + - {dataset: NorESM1-M, ensemble: r1i1p1} + +CMIP6: &cmip6_models + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn} + # time_coord_problem_rlut - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + # no_prw - {dataset: FGOALS-f3-L, ensemble: r2i1p1f1, grid: gr} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn} + - {dataset: IPSL-CM6A-LR, ensemble: r3i1p1f1, grid: gr} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-HR, institute: MPI-M, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn} + - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + + +diagnostics: + + # ============================================================================ + # Analyses climatological mean seasonal cycle amplitudes + # ============================================================================ + + clouds_seas_cmip5: + description: seasonal cycle amplitudes + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: PATMOS-x, project: OBS, type: sat, version: NOAA, tier: 2, + start_year: 1982, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + clivi: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + lwp: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: MAC-LWP, project: OBS, type: sat, version: v1, tier: 3, + start_year: 1988, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + swcre: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + lwcre: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + prw: + preprocessor: clim + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-WATERVAPOUR + additional_datasets: + - {dataset: ESACCI-WATERVAPOUR, project: OBS, type: sat, + version: CDR2-L3S-05deg_fv3.1, tier: 3, + start_year: 2003, end_year: 2017} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + additional_datasets: *cmip5_models + scripts: + seasclt: &settings5 + script: clouds/clouds_seasonal_cycle.ncl + projection: Robinson + filename_add: cmip5 + var: clt + epsilon: 1.0 + seasclivi: + <<: *settings5 + var: clivi + epsilon: 0.001 + seaslwp: + <<: *settings5 + var: lwp + epsilon: 0.001 + seaslwcre: + <<: *settings5 + var: lwcre + epsilon: 1.0 + seasswcre: + <<: *settings5 + var: swcre + epsilon: 1.0 + seasprw: + <<: *settings5 + var: prw + epsilon: 1.0 + + clouds_seas_cmip6: + description: seasonal cycle amplitudes + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: PATMOS-x, project: OBS, type: sat, version: NOAA, tier: 2, + start_year: 1982, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + clivi: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + lwp: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: CLARA-AVHRR, project: OBS, type: sat, version: V002_01, + tier: 3, start_year: 1982, end_year: 2018} + - {dataset: CLOUDSAT-L2, project: OBS, type: sat, + version: P1-R05-gridbox-average-noprecip, + start_year: 2006, end_year: 2017, tier: 3} + - {dataset: MAC-LWP, project: OBS, type: sat, version: v1, tier: 3, + start_year: 1988, end_year: 2016} + - {dataset: MODIS, project: OBS, type: sat, version: MYD08-M3, + tier: 3, start_year: 2003, end_year: 2018} + swcre: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + lwcre: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + derive: true + reference_dataset: CERES-EBAF + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.1, + tier: 2, start_year: 2001, end_year: 2021} + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + prw: + preprocessor: clim + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-WATERVAPOUR + additional_datasets: + - {dataset: ESACCI-WATERVAPOUR, project: OBS, type: sat, + version: CDR2-L3S-05deg_fv3.1, tier: 3, + start_year: 2003, end_year: 2017} + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, tier: 2, + start_year: 1984, end_year: 2016} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: '1', + tier: 3} + additional_datasets: *cmip6_models + scripts: + seasclt: &settings6 + script: clouds/clouds_seasonal_cycle.ncl + projection: Robinson + filename_add: cmip6 + var: clt + epsilon: 1.0 + seasclivi: + <<: *settings6 + var: clivi + epsilon: 0.001 + seaslwp: + <<: *settings6 + var: lwp + epsilon: 0.001 + seaslwcre: + <<: *settings6 + var: lwcre + epsilon: 1.0 + seasswcre: + <<: *settings6 + var: swcre + epsilon: 1.0 + seasprw: + <<: *settings6 + var: prw + epsilon: 1.0 diff --git a/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig8_dyn.yml b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig8_dyn.yml new file mode 100644 index 0000000000..43faf1f366 --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig8_dyn.yml @@ -0,0 +1,353 @@ +# recipe_lauer22jclim_fig8_dyn.yml +--- +documentation: + title: Cloud diagnostics v2 (dyn) + + description: | + Diagnostics of clouds parameters sorted by dynamical regime. + + authors: + - lauer_axel + + maintainer: + - lauer_axel + + references: + - lauer22jclim + + projects: + - cmug + + +preprocessors: + clim500_ocean: + # extract_region: + # start_longitude: 0 + # end_longitude: 360 + # start_latitude: -30 + # end_latitude: 30 + convert_units: + units: "Pa min-1" + mask_landsea: + mask_out: land + extract_levels: + levels: 50000 + scheme: linear + regrid: + target_grid: 2x2 + scheme: linear + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [reference_dataset] + + clim_ocean: + # extract_region: + # start_longitude: 0 + # end_longitude: 360 + # start_latitude: -30 + # end_latitude: 30 + mask_landsea: + mask_out: land + regrid: + target_grid: 2x2 + scheme: linear + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [reference_dataset] + + +CMIP5: &cmip5_models + # landmaskdimensionerror - {dataset: ACCESS1-0, ensemble: r1i1p1} + # landmaskdimensionerror - {dataset: ACCESS1-3, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1} + - {dataset: BNU-ESM, ensemble: r1i1p1} + - {dataset: CanESM2, ensemble: r1i1p1} + - {dataset: CCSM4, ensemble: r1i1p1} + - {dataset: CESM1-BGC, ensemble: r1i1p1} + - {dataset: CESM1-CAM5, ensemble: r1i1p1} + - {dataset: CESM1-FASTCHEM, ensemble: r1i1p1} + - {dataset: CESM1-WACCM, ensemble: r1i1p1} + - {dataset: CMCC-CESM, ensemble: r1i1p1} + - {dataset: CMCC-CM, ensemble: r1i1p1} + # missing data - {dataset: CMCC-CMS, ensemble: r1i1p1} + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1} + - {dataset: FGOALS-g2, ensemble: r1i1p1} + - {dataset: FIO-ESM, ensemble: r1i1p1} + - {dataset: GFDL-CM3, ensemble: r1i1p1} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1} + - {dataset: GISS-E2-H-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-H, ensemble: r1i1p1} + - {dataset: GISS-E2-R-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-R, ensemble: r1i1p1} + # no wap - {dataset: HadGEM2-CC, ensemble: r1i1p1} + # time_series_incomplete - {dataset: HadGEM2-ES, ensemble: r1i1p1} + - {dataset: inmcm4, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1} + - {dataset: MIROC4h, ensemble: r1i1p1} + - {dataset: MIROC5, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1} + - {dataset: MIROC-ESM, ensemble: r1i1p1} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1} + - {dataset: MPI-ESM-P, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, ensemble: r1i1p1} + - {dataset: MRI-ESM1, ensemble: r1i1p1} + - {dataset: NorESM1-ME, ensemble: r1i1p1} + - {dataset: NorESM1-M, ensemble: r1i1p1} + +CMIP6: &cmip6_models + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn} + # time_coord_problem_rlut - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + # no prw - {dataset: FGOALS-f3-L, ensemble: r2i1p1f1, grid: gr} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn} + - {dataset: IPSL-CM6A-LR, ensemble: r3i1p1f1, grid: gr} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-HR, institute: MPI-M, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn} + - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + + +diagnostics: + + # ========================================================================== + # Matrices: x = sst, y = omega500, z = clt, tcwp + # ========================================================================== + + clouds_dynmatrices_cmip5_ocean: + description: cloud matrices - dynamical regimes vs. cloud parameter + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: clim_ocean + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + ts: + preprocessor: clim_ocean + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ERA5 + additional_datasets: + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 1992, end_year: 2016} + wap: + preprocessor: clim500_ocean + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ERA5 + additional_datasets: + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 1992, end_year: 2016} + clivi: + preprocessor: clim_ocean + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + lwp: + preprocessor: clim_ocean + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + additional_datasets: *cmip5_models + scripts: + dynclt: + script: clouds/clouds_dyn_matrix.ncl + var_x: ts + var_y: wap + var_z: clt + xmin: 275 + xmax: 305 + ymin: -10 + ymax: 10 + zmin: 5 + zmax: 95 + zdmin: -45 + zdmax: 45 + xlabel: SST + ylabel: omega500 + clevels: [1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 60, 70, 100, + 130, 160, 190] + filename_add: cmip5_ocean + dyntcwp: + script: clouds/clouds_dyn_matrix.ncl + var_x: ts + var_y: wap + var_z: totalcwp + xmin: 275 + xmax: 305 + ymin: -10 + ymax: 10 + zmin: 0.05 + zmax: 0.5 + zdmin: -0.09 + zdmax: 0.09 + xlabel: SST + ylabel: omega500 + clevels: [1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 60, 70, 100, 130, + 160, 190] + filename_add: cmip5_ocean + + # ############################################################################ + + clouds_dynmatrices_cmip6_ocean: + description: cloud matrices - dynamical regimes vs. cloud parameter + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: clim_ocean + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + ts: + preprocessor: clim_ocean + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ERA5 + additional_datasets: + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 1992, end_year: 2016} + wap: + preprocessor: clim500_ocean + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ERA5 + additional_datasets: + - {dataset: ERA5, project: native6, type: reanaly, version: v1, + tier: 3, start_year: 1992, end_year: 2016} + clivi: + preprocessor: clim_ocean + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + lwp: + preprocessor: clim_ocean + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + additional_datasets: *cmip6_models + scripts: + dynclt: + script: clouds/clouds_dyn_matrix.ncl + var_x: ts + var_y: wap + var_z: clt + xmin: 275 + xmax: 305 + ymin: -10 + ymax: 10 + zmin: 5 + zmax: 95 + zdmin: -45 + zdmax: 45 + xlabel: SST + ylabel: omega500 + clevels: [1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 60, 70, 100, + 130, 160, 190] + filename_add: cmip6_ocean + dyntcwp: + script: clouds/clouds_dyn_matrix.ncl + var_x: ts + var_y: wap + var_z: totalcwp + xmin: 275 + xmax: 305 + ymin: -10 + ymax: 10 + zmin: 0.05 + zmax: 0.5 + zdmin: -0.09 + zdmax: 0.09 + xlabel: SST + ylabel: omega500 + clevels: [1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 60, 70, 100, + 130, 160, 190] + filename_add: cmip6_ocean diff --git a/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig9-11ab_scatter.yml b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig9-11ab_scatter.yml new file mode 100644 index 0000000000..61f0dcaee3 --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig9-11ab_scatter.yml @@ -0,0 +1,625 @@ +# ESMValTool +# recipe_lauer22jclim_fig9-11ab_scatter.yml +--- +documentation: + title: Cloud diagnostics v2 (scatter) + + description: | + Cloud properties sorted by total cloud cover. + + authors: + - lauer_axel + + maintainer: + - lauer_axel + + references: + - lauer22jclim + + projects: + - cmug + + +preprocessors: + ppITCZPacific: + extract_region: + start_longitude: 135 + end_longitude: 275 + start_latitude: 0 + end_latitude: 12 + regrid: + target_grid: 1x1 + scheme: linear + mask_landsea: + mask_out: land + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [reference_dataset] + + ppSEPacific: + extract_region: + start_longitude: 265 + end_longitude: 275 + start_latitude: -25 + end_latitude: -5 + mask_landsea: + mask_out: land + regrid: + target_grid: 1x1 + scheme: linear + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [reference_dataset] + + ppSouthernOcean: + extract_region: + start_longitude: 0 + end_longitude: 360 + start_latitude: -65 + end_latitude: -30 + extract_season: + season: DJF + mask_landsea: + mask_out: land + regrid: + target_grid: 2x2 + scheme: linear + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [reference_dataset] + + +CMIP5: &cmip5_models + - {dataset: ACCESS1-0, ensemble: r1i1p1} + - {dataset: ACCESS1-3, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1} + - {dataset: BNU-ESM, ensemble: r1i1p1} + - {dataset: CanESM2, ensemble: r1i1p1} + - {dataset: CCSM4, ensemble: r1i1p1} + - {dataset: CESM1-BGC, ensemble: r1i1p1} + - {dataset: CESM1-CAM5, ensemble: r1i1p1} + - {dataset: CESM1-FASTCHEM, ensemble: r1i1p1} + - {dataset: CESM1-WACCM, ensemble: r1i1p1} + - {dataset: CMCC-CESM, ensemble: r1i1p1} + - {dataset: CMCC-CM, ensemble: r1i1p1} + # missing data - {dataset: CMCC-CMS, ensemble: r1i1p1} + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1} + - {dataset: FGOALS-g2, ensemble: r1i1p1} + - {dataset: FIO-ESM, ensemble: r1i1p1} + - {dataset: GFDL-CM3, ensemble: r1i1p1} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1} + - {dataset: GISS-E2-H-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-H, ensemble: r1i1p1} + - {dataset: GISS-E2-R-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-R, ensemble: r1i1p1} + # error_extract_season - {dataset: HadGEM2-CC, ensemble: r1i1p1} + # error_extract_season - {dataset: HadGEM2-ES, ensemble: r1i1p1} + - {dataset: inmcm4, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1} + - {dataset: MIROC4h, ensemble: r1i1p1} + - {dataset: MIROC5, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1} + - {dataset: MIROC-ESM, ensemble: r1i1p1} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1} + - {dataset: MPI-ESM-P, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, ensemble: r1i1p1} + - {dataset: MRI-ESM1, ensemble: r1i1p1} + - {dataset: NorESM1-ME, ensemble: r1i1p1} + - {dataset: NorESM1-M, ensemble: r1i1p1} + +CMIP6: &cmip6_models + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn} + # time_coord_problem_rlut - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + # no_prw - {dataset: FGOALS-f3-L, ensemble: r2i1p1f1, grid: gr} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn} + - {dataset: IPSL-CM6A-LR, ensemble: r3i1p1f1, grid: gr} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-HR, institute: MPI-M, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn} + - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + + +diagnostics: + + scatter_southernocean_cmip5: + description: scatter plot cloud fraction vs shortwave cloud forcing + themes: + - phys + - clouds + realms: + - atmos + variables: + clt: + preprocessor: ppSouthernOcean + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + clivi: + preprocessor: ppSouthernOcean + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + lwp: + preprocessor: ppSouthernOcean + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + swcre: + preprocessor: ppSouthernOcean + mip: Amon + project: CMIP5 + exp: historical + start_year: 1986 + end_year: 2005 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + additional_datasets: *cmip5_models + scripts: + scatter_swcre: + script: clouds/clouds_scatter.ncl + var_x: clt + var_y: swcre + xmin: 0 + xmax: 100 + ymin_mm: -150.0 + ymax_mm: 0.0 + filename_add: so_cmip5 + scatter_totalcwp: + script: clouds/clouds_scatter.ncl + var_x: clt + var_y: totalcwp + xmin: 0 + xmax: 100 + ymin_mm: 0.0 + ymax_mm: 0.2 + filename_add: so_cmip5 + + scatter_southernocean_cmip6: + description: scatter plot cloud fraction vs shortwave cloud forcing + themes: + - phys + - clouds + realms: + - atmos + variables: + clt: + preprocessor: ppSouthernOcean + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + clivi: + preprocessor: ppSouthernOcean + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + lwp: + preprocessor: ppSouthernOcean + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + swcre: + preprocessor: ppSouthernOcean + mip: Amon + project: CMIP6 + exp: historical + start_year: 1995 + end_year: 2014 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + additional_datasets: *cmip6_models + scripts: + scatter_swcre: + script: clouds/clouds_scatter.ncl + var_x: clt + var_y: swcre + xmin: 0 + xmax: 100 + ymin_mm: -150.0 + ymax_mm: 0.0 + filename_add: so_cmip6 + scatter_totalcwp: + script: clouds/clouds_scatter.ncl + var_x: clt + var_y: totalcwp + xmin: 0 + xmax: 100 + ymin_mm: 0.0 + ymax_mm: 0.2 + filename_add: so_cmip6 + + scatter_sepacific_cmip5: + description: scatter plot cloud fraction vs shortwave cloud forcing + themes: + - phys + - clouds + realms: + - atmos + variables: + clt: + preprocessor: ppSEPacific + mip: Amon + project: CMIP5 + exp: historical + start_year: 1996 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + clivi: + preprocessor: ppSEPacific + mip: Amon + project: CMIP5 + exp: historical + start_year: 1996 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + lwp: + preprocessor: ppSEPacific + mip: Amon + project: CMIP5 + exp: historical + start_year: 1996 + end_year: 2005 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + swcre: + preprocessor: ppSEPacific + mip: Amon + project: CMIP5 + exp: historical + start_year: 1996 + end_year: 2005 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + additional_datasets: *cmip5_models + scripts: + scatter_swcre: + script: clouds/clouds_scatter.ncl + var_x: clt + var_y: swcre + xmin: 0 + xmax: 100 + ymin_mm: -150.0 + ymax_mm: 0.0 + filename_add: sep_cmip5 + scatter_totalcwp: + script: clouds/clouds_scatter.ncl + var_x: clt + var_y: totalcwp + xmin: 0 + xmax: 100 + ymin_mm: 0.0 + ymax_mm: 0.2 + filename_add: sep_cmip5 + + scatter_sepacific_cmip6: + description: scatter plot cloud fraction vs shortwave cloud forcing + themes: + - phys + - clouds + realms: + - atmos + variables: + clt: + preprocessor: ppSEPacific + mip: Amon + project: CMIP6 + exp: historical + start_year: 1996 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + clivi: + preprocessor: ppSEPacific + mip: Amon + project: CMIP6 + exp: historical + start_year: 1996 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + lwp: + preprocessor: ppSEPacific + mip: Amon + project: CMIP6 + exp: historical + start_year: 1996 + end_year: 2014 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + swcre: + preprocessor: ppSEPacific + mip: Amon + project: CMIP6 + exp: historical + start_year: 1996 + end_year: 2014 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + additional_datasets: *cmip6_models + scripts: + scatter_swcre: + script: clouds/clouds_scatter.ncl + var_x: clt + var_y: swcre + xmin: 0 + xmax: 100 + ymin_mm: -150.0 + ymax_mm: 0.0 + filename_add: sep_cmip6 + scatter_totalcwp: + script: clouds/clouds_scatter.ncl + var_x: clt + var_y: totalcwp + xmin: 0 + xmax: 100 + ymin_mm: 0.0 + ymax_mm: 0.2 + filename_add: sep_cmip6 + + scatter_itcz_cmip5: + description: scatter plot cloud fraction vs shortwave cloud forcing + themes: + - phys + - clouds + realms: + - atmos + variables: + clt: + preprocessor: ppITCZPacific + mip: Amon + project: CMIP5 + exp: historical + start_year: 1996 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + clivi: + preprocessor: ppITCZPacific + mip: Amon + project: CMIP5 + exp: historical + start_year: 1996 + end_year: 2005 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + lwp: + preprocessor: ppITCZPacific + mip: Amon + project: CMIP5 + exp: historical + start_year: 1996 + end_year: 2005 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + swcre: + preprocessor: ppITCZPacific + mip: Amon + project: CMIP5 + exp: historical + start_year: 1996 + end_year: 2005 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + additional_datasets: *cmip5_models + scripts: + scatter_swcre: + script: clouds/clouds_scatter.ncl + var_x: clt + var_y: swcre + xmin: 0 + xmax: 100 + ymin_mm: -150.0 + ymax_mm: 0.0 + filename_add: itcz_cmip5 + scatter_totalcwp: + script: clouds/clouds_scatter.ncl + var_x: clt + var_y: totalcwp + xmin: 0 + xmax: 100 + ymin_mm: 0.0 + ymax_mm: 0.3 + filename_add: itcz_cmip5 + + scatter_itcz_cmip6: + description: scatter plot cloud fraction vs shortwave cloud forcing + themes: + - phys + - clouds + realms: + - atmos + variables: + clt: + preprocessor: ppITCZPacific + mip: Amon + project: CMIP6 + exp: historical + start_year: 1996 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + clivi: + preprocessor: ppITCZPacific + mip: Amon + project: CMIP6 + exp: historical + start_year: 1996 + end_year: 2014 + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + lwp: + preprocessor: ppITCZPacific + mip: Amon + project: CMIP6 + exp: historical + start_year: 1996 + end_year: 2014 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + swcre: + preprocessor: ppITCZPacific + mip: Amon + project: CMIP6 + exp: historical + start_year: 1996 + end_year: 2014 + derive: true + reference_dataset: ESACCI-CLOUD + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + additional_datasets: *cmip6_models + scripts: + scatter_swcre: + script: clouds/clouds_scatter.ncl + var_x: clt + var_y: swcre + xmin: 0 + xmax: 100 + ymin_mm: -150.0 + ymax_mm: 0.0 + filename_add: itcz_cmip6 + scatter_totalcwp: + script: clouds/clouds_scatter.ncl + var_x: clt + var_y: totalcwp + xmin: 0 + xmax: 100 + ymin_mm: 0.0 + ymax_mm: 0.3 + filename_add: itcz_cmip6 diff --git a/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig9-11c_pdf.yml b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig9-11c_pdf.yml new file mode 100644 index 0000000000..223aaa2583 --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_lauer22jclim_fig9-11c_pdf.yml @@ -0,0 +1,276 @@ +# ESMValTool +# recipe_lauer22jclim_fig9-11c_pdf.yml +--- +documentation: + title: Cloud diagnostics v2 (pdf) + + description: | + Frequency distributions of cloud parameters. + + authors: + - lauer_axel + + maintainer: + - lauer_axel + + references: + - lauer22jclim + + projects: + - cmug + + +preprocessors: + ppOcean: + regrid: + target_grid: 2x2 + scheme: linear + # multi_model_statistics: + # span: overlap + # statistics: [mean] + # exclude: [reference_dataset] + mask_landsea: + mask_out: land + + ppSouthernOcean: + extract_region: + start_longitude: 0 + end_longitude: 360 + start_latitude: -65 + end_latitude: -30 + extract_season: + season: DJF + mask_landsea: + mask_out: land + # multi_model_statistics: + # span: overlap + # statistics: [mean] + # exclude: [reference_dataset] + regrid: + target_grid: 2x2 + scheme: linear + + +CMIP5: &cmip5_models + - {dataset: ACCESS1-0, ensemble: r1i1p1} + - {dataset: ACCESS1-3, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1} + - {dataset: BNU-ESM, ensemble: r1i1p1} + - {dataset: CanESM2, ensemble: r1i1p1} + - {dataset: CCSM4, ensemble: r1i1p1} + - {dataset: CESM1-BGC, ensemble: r1i1p1} + - {dataset: CESM1-CAM5, ensemble: r1i1p1} + - {dataset: CESM1-FASTCHEM, ensemble: r1i1p1} + - {dataset: CESM1-WACCM, ensemble: r1i1p1} + - {dataset: CMCC-CESM, ensemble: r1i1p1} + - {dataset: CMCC-CM, ensemble: r1i1p1} + # missing data - {dataset: CMCC-CMS, ensemble: r1i1p1} + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1} + - {dataset: FGOALS-g2, ensemble: r1i1p1} + - {dataset: FIO-ESM, ensemble: r1i1p1} + - {dataset: GFDL-CM3, ensemble: r1i1p1} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1} + - {dataset: GISS-E2-H-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-H, ensemble: r1i1p1} + - {dataset: GISS-E2-R-CC, ensemble: r1i1p1} + - {dataset: GISS-E2-R, ensemble: r1i1p1} + - {dataset: HadGEM2-CC, ensemble: r1i1p1} + - {dataset: HadGEM2-ES, ensemble: r1i1p1} + - {dataset: inmcm4, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1} + - {dataset: MIROC4h, ensemble: r1i1p1} + - {dataset: MIROC5, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, ensemble: r1i1p1} + - {dataset: MIROC-ESM, ensemble: r1i1p1} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1} + - {dataset: MPI-ESM-P, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, ensemble: r1i1p1} + - {dataset: MRI-ESM1, ensemble: r1i1p1} + - {dataset: NorESM1-ME, ensemble: r1i1p1} + - {dataset: NorESM1-M, ensemble: r1i1p1} + +CMIP6: &cmip6_models + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn} + # time_coord_problem_rlut - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + # no_prw - {dataset: FGOALS-f3-L, ensemble: r2i1p1f1, grid: gr} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn} + - {dataset: IPSL-CM6A-LR, ensemble: r3i1p1f1, grid: gr} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-HR, institute: MPI-M, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn} + - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + + +diagnostics: + + pdf_clt_djf_cmip6: + description: climatological annual means + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: ppSouthernOcean + reference_dataset: ESACCI-CLOUD + project: CMIP6 + mip: Amon + exp: historical + start_year: 1995 + end_year: 2014 + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + additional_datasets: *cmip6_models + scripts: + southernocean: + script: clouds/clouds_pdf.ncl + styleset: lauer21 + xmin: 0 + xmax: 100 + ymin: 0 + ymax: 30 + plot_average: true + filename_add: so_cmip6 + + pdf_clt_djf_cmip5: + description: climatological annual means + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: ppSouthernOcean + reference_dataset: ESACCI-CLOUD + project: CMIP5 + mip: Amon + exp: historical + start_year: 1986 + end_year: 2005 + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + additional_datasets: *cmip5_models + scripts: + southernocean: + script: clouds/clouds_pdf.ncl + styleset: lauer21 + xmin: 0 + xmax: 100 + ymin: 0 + ymax: 30 + plot_average: true + filename_add: so_cmip5 + + pdf_clt_ann_cmip6: + description: climatological annual means + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: ppOcean + reference_dataset: ESACCI-CLOUD + project: CMIP6 + mip: Amon + exp: historical + start_year: 1995 + end_year: 2014 + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + additional_datasets: *cmip6_models + scripts: + sep: + script: clouds/clouds_pdf.ncl + region: [-25, -5, 265, 275] + styleset: lauer21 + xmin: 0 + xmax: 100 + ymin: 0 + ymax: 24 + plot_average: true + filename_add: sep_cmip6 + itcz: + script: clouds/clouds_pdf.ncl + styleset: lauer21 + region: [0, 12, 135, 275] + xmin: 0 + xmax: 100 + ymin: 0 + ymax: 27 + plot_average: true + filename_add: itcz_cmip6 + + pdf_clt_ann_cmip5: + description: climatological annual means + themes: + - clouds + realms: + - atmos + variables: + clt: + preprocessor: ppOcean + reference_dataset: ESACCI-CLOUD + project: CMIP5 + mip: Amon + exp: historical + start_year: 1986 + end_year: 2005 + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, + start_year: 1992, end_year: 2016} + additional_datasets: *cmip5_models + scripts: + sep: + script: clouds/clouds_pdf.ncl + styleset: lauer21 + region: [-25, -5, 265, 275] + xmin: 0 + xmax: 100 + ymin: 0 + ymax: 24 + plot_average: true + filename_add: sep_cmip5 + itcz: + script: clouds/clouds_pdf.ncl + styleset: lauer21 + region: [0, 12, 135, 275] + xmin: 0 + xmax: 100 + ymin: 0 + ymax: 27 + plot_average: true + filename_add: itcz_cmip5 diff --git a/esmvaltool/recipes/cmorizers/recipe_daily_era5.yml b/esmvaltool/recipes/cmorizers/recipe_daily_era5.yml index ba94263d2b..986b2583bc 100644 --- a/esmvaltool/recipes/cmorizers/recipe_daily_era5.yml +++ b/esmvaltool/recipes/cmorizers/recipe_daily_era5.yml @@ -23,7 +23,7 @@ documentation: datasets: # For the daily diagnostic, always add the next year, otherwise the last day is not cmor compatible - - {dataset: ERA5, project: native6, type: reanaly, version: '1', tier: 3, start_year: 1990, end_year: 1991} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3, start_year: 1990, end_year: 1991} preprocessors: add_one_day: &add_one_day diff --git a/esmvaltool/recipes/cmorizers/recipe_era5-land.yml b/esmvaltool/recipes/cmorizers/recipe_era5-land.yml index 39cdb05944..3a8782ad67 100644 --- a/esmvaltool/recipes/cmorizers/recipe_era5-land.yml +++ b/esmvaltool/recipes/cmorizers/recipe_era5-land.yml @@ -18,7 +18,7 @@ documentation: - eval4cmip datasets: - - {dataset: ERA5-Land, project: native6, type: reanaly, version: '1', + - {dataset: ERA5-Land, project: native6, type: reanaly, version: v1, tier: 3, start_year: 1981, end_year: 1982} diagnostics: diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index c8b3101a40..9e75d0d9ef 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -288,6 +288,18 @@ diagnostics: scripts: null + ESDC: + description: ESDC check + variables: + tas: + tasmin: + tasmax: + additional_datasets: + - {dataset: ESDC, project: OBS6, mip: Amon, tier: 2, + type: reanaly, version: 3.0.1, + start_year: 1979, end_year: 2021} + scripts: null + ESRL: description: ESRL check variables: @@ -452,7 +464,7 @@ diagnostics: mip: OImon additional_datasets: - {dataset: HadISST, project: OBS, tier: 2, - type: reanaly, version: 1, start_year: 1870, end_year: 2017} + type: reanaly, version: 1, start_year: 1870, end_year: 2021} scripts: null @@ -475,6 +487,21 @@ diagnostics: type: sat, version: v0, start_year: 1984, end_year: 2016} scripts: null + JRA-25: + description: JRA-25 check + variables: + clt: + hus: + prw: + rlut: + rlutcs: + rsut: + rsutcs: + additional_datasets: + - {dataset: JRA-25, project: OBS6, mip: Amon, tier: 2, + type: reanaly, version: 1, start_year: 1979, end_year: 2013} + scripts: null + Kadow2020: description: Kadow2020 check variables: @@ -497,11 +524,35 @@ diagnostics: scripts: null - NCEP: - description: NCEP check + Landschuetzer2020: + description: Landschuetzer2020 check + variables: + spco2: + additional_datasets: + - {dataset: Landschuetzer2020, project: OBS6, mip: Omon, tier: 2, + type: clim, version: '1.1', start_year: 2004, end_year: 2004} + scripts: null + + + MOBO-DIC_MPIM: + description: MOBO-DIC_MPIM check variables: + dissic: + additional_datasets: + - {dataset: MOBO-DIC_MPIM, project: OBS6, mip: Omon, tier: 2, + type: clim, version: '1.1', start_year: 2011, end_year: 2011} + scripts: null + + + NCEP-NCAR-R1: + description: NCEP-NCAR-R1 check + variables: + clt: + mip: Amon hur: mip: Amon + hurs: + mip: Amon hus: mip: Amon pr_month: @@ -510,12 +561,34 @@ diagnostics: pr_day: short_name: pr mip: day - rlut: + prw: + mip: Amon + psl: + mip: Amon + rlut_day: + short_name: rlut mip: day + rlut_month: + short_name: rlut + mip: Amon + rlutcs: + mip: Amon + rsut: + mip: Amon + rsutcs: + mip: Amon + sfcWind: + mip: Amon ta: mip: Amon tas: mip: Amon + tasmax: + mip: Amon + tasmin: + mip: Amon + ts: + mip: Amon ua_month: short_name: ua mip: Amon @@ -533,13 +606,41 @@ diagnostics: zg: mip: Amon additional_datasets: - - {dataset: NCEP, project: OBS, tier: 2, - type: reanaly, version: 1, start_year: 1948, end_year: 2018} + - {dataset: NCEP-NCAR-R1, project: OBS6, tier: 2, + type: reanaly, version: 1, start_year: 1948, end_year: 2021} + scripts: null + + + NCEP-DOE-R2: + description: NCEP-DOE-R2 check + variables: + clt: + hur: + prw: + ta: + additional_datasets: + - {dataset: NCEP-DOE-R2, project: OBS6, mip: Amon, tier: 2, + type: reanaly, version: 2, start_year: 1979, end_year: 2021} + scripts: null + + + NOAA-CIRES-20CR: + description: NOAA-CIRES-20CR check + variables: + clt: + clwvi: + hus: + prw: + rsut: + rlut: + additional_datasets: + - {dataset: NOAA-CIRES-20CR, project: OBS6, mip: Amon, tier: 2, + type: reanaly, version: v2, start_year: 1871, end_year: 2012} scripts: null NOAAGlobalTemp: - decription: NOAAGlobalTemp check + description: NOAAGlobalTemp check variables: tasa: additional_datasets: @@ -548,6 +649,29 @@ diagnostics: scripts: null + OceanSODA-ETHZ: + description: OceanSODA-ETHZ check + variables: + areacello: + mip: Ofx + co3os: + mip: Omon + dissicos: + mip: Omon + fgco2: + mip: Omon + phos: + mip: Omon + spco2: + mip: Omon + talkos: + mip: Omon + additional_datasets: + - {dataset: OceanSODA-ETHZ, project: OBS6, tier: 2, type: reanaly, + version: v2021e, start_year: 1982, end_year: 2020} + scripts: null + + OSI-450: description: OSI-450 check variables: @@ -660,6 +784,26 @@ diagnostics: scripts: null + TCOM-CH4: + description: TCOM-CH4 check + variables: + ch4: + additional_datasets: + - {dataset: TCOM-CH4, project: OBS6, mip: Amon, frequency: day, tier: 2, + type: reanaly, version: '1.0', start_year: 1991, end_year: 2021} + scripts: null + + + TCOM-N2O: + description: TCOM-N2O check + variables: + n2o: + additional_datasets: + - {dataset: TCOM-N2O, project: OBS6, mip: Amon, frequency: day, tier: 2, + type: reanaly, version: '1.0', start_year: 1991, end_year: 2021} + scripts: null + + WOA: description: WOA check variables: @@ -929,6 +1073,10 @@ diagnostics: ERA-Interim: description: ERA-Interim check variables: + cl: + mip: Amon + cli: + mip: Amon clivi: mip: Amon clt_day: @@ -937,6 +1085,8 @@ diagnostics: clt_month: short_name: clt mip: Amon + clw: + mip: Amon clwvi: mip: Amon evspsbl_day: @@ -951,6 +1101,8 @@ diagnostics: mip: Amon hus: mip: Amon + lwp: + mip: Amon orog: mip: fx pr_day: @@ -982,6 +1134,12 @@ diagnostics: rlds_day: short_name: rlds mip: day + rlut_month: + short_name: rlut + mip: Amon + rlutcs_month: + short_name: rlutcs + mip: Amon rsds_day: short_name: rsds mip: day @@ -994,6 +1152,12 @@ diagnostics: rsdt_month: short_name: rsdt mip: Amon + rsut_month: + short_name: rsut + mip: Amon + rsutcs_month: + short_name: rsutcs + mip: Amon rss_day: short_name: rss mip: day @@ -1249,6 +1413,9 @@ diagnostics: clt_Amon: short_name: clt mip: Amon + cl_Amon: + short_name: cl + mip: Amon evspsbl_Amon: short_name: evspsbl mip: Amon @@ -1325,7 +1492,7 @@ diagnostics: mip: fx additional_datasets: - {dataset: ERA5, project: native6, tier: 3, type: reanaly, - version: 1, start_year: 1990, end_year: 1990} + version: v1, start_year: 1990, end_year: 1990} scripts: null @@ -1424,10 +1591,129 @@ diagnostics: MERRA2: description: MERRA2 check variables: - sm: + sm_monthly: + short_name: sm + mip: Lmon + clt_monthly: + short_name: clt + mip: Amon + pr_monthly: + short_name: pr + mip: Amon + evspsbl_monthly: + short_name: evspsbl + mip: Amon + hfss_monthly: + short_name: hfss + mip: Amon + hfls_monthly: + short_name: hfls + mip: Amon + huss_monthly: + short_name: huss + mip: Amon + prc_monthly: + short_name: prc + mip: Amon + prsn_monthly: + short_name: prsn + mip: Amon + prw_monthly: + short_name: prw + mip: Amon + ps_monthly: + short_name: ps + mip: Amon + psl_monthly: + short_name: psl + mip: Amon + rlds_monthly: + short_name: rlds + mip: Amon + rldscs_monthly: + short_name: rldscs + mip: Amon + rlus_monthly: + short_name: rlus + mip: Amon + rlut_monthly: + short_name: rlut + mip: Amon + rsds_monthly: + short_name: rsds + mip: Amon + rsdscs_monthly: + short_name: rsdscs + mip: Amon + rsdt_monthly: + short_name: rsdt + mip: Amon + tas_monthly: + short_name: tas + mip: Amon + tasmax_monthly: + short_name: tasmax + mip: Amon + tasmin_monthly: + short_name: tasmin + mip: Amon + tauu_monthly: + short_name: tauu + mip: Amon + tauv_monthly: + short_name: tauv + mip: Amon + rlutcs_monthly: + short_name: rlutcs + mip: Amon + ts_monthly: + short_name: ts + mip: Amon + uas_monthly: + short_name: uas + mip: Amon + vas_monthly: + short_name: vas + mip: Amon + rsus_monthly: + short_name: rsus + mip: Amon + rsuscs_monthly: + short_name: rsuscs + mip: Amon + rsut_monthly: + short_name: rsut + mip: Amon + rsutcs_monthly: + short_name: rsutcs + mip: Amon + ta_monthly: + short_name: ta + mip: Amon + ua_monthly: + short_name: ua + mip: Amon + va_monthly: + short_name: va + mip: Amon + tro3_monthly: + short_name: tro3 + mip: Amon + zg_monthly: + short_name: zg + mip: Amon + hus_monthly: + short_name: hus + mip: Amon + wap_monthly: + short_name: wap + mip: Amon + hur_monthly: + short_name: hur + mip: Amon additional_datasets: - - {dataset: MERRA2, project: OBS6, mip: Lmon, tier: 3, - type: reanaly, version: 5.12.4, start_year: 1980, end_year: 2018} + - {dataset: MERRA2, project: OBS6, tier: 3, + type: reanaly, version: 5.12.4, start_year: 1980, end_year: 2022} scripts: null diff --git a/esmvaltool/recipes/examples/recipe_python.yml b/esmvaltool/recipes/examples/recipe_python.yml index 22931c2385..a6309d826e 100644 --- a/esmvaltool/recipes/examples/recipe_python.yml +++ b/esmvaltool/recipes/examples/recipe_python.yml @@ -1,5 +1,11 @@ # ESMValTool # recipe_python.yml +# +# See https://docs.esmvaltool.org/en/latest/recipes/recipe_examples.html +# for a description of this recipe. +# +# See https://docs.esmvaltool.org/projects/esmvalcore/en/latest/recipe/overview.html +# for a description of the recipe format. --- documentation: description: | @@ -23,18 +29,19 @@ documentation: datasets: - {dataset: BCC-ESM1, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn} - - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1} preprocessors: + # See https://docs.esmvaltool.org/projects/esmvalcore/en/latest/recipe/preprocessor.html + # for a description of the preprocessor functions. - select_january: - extract_month: - month: 1 + to_degrees_c: + convert_units: + units: degrees_C annual_mean_amsterdam: - extract_point: - latitude: 52.379189 - longitude: 4.899431 + extract_location: + location: Amsterdam scheme: linear annual_statistics: operator: mean @@ -42,14 +49,16 @@ preprocessors: statistics: - mean span: overlap + convert_units: + units: degrees_C annual_mean_global: area_statistics: operator: mean - fx_variables: - areacella: annual_statistics: operator: mean + convert_units: + units: degrees_C diagnostics: @@ -62,9 +71,10 @@ diagnostics: variables: tas: mip: Amon - preprocessor: select_january - start_year: 2000 - end_year: 2000 + preprocessor: to_degrees_c + timerange: 2000/P1M + caption: | + Global map of {long_name} in January 2000 according to {dataset}. scripts: script1: script: examples/diagnostic.py @@ -83,14 +93,14 @@ diagnostics: short_name: tas mip: Amon preprocessor: annual_mean_amsterdam - start_year: 1850 - end_year: 2000 + timerange: 1850/2000 + caption: Annual mean {long_name} in Amsterdam according to {dataset}. tas_global: short_name: tas mip: Amon preprocessor: annual_mean_global - start_year: 1850 - end_year: 2000 + timerange: 1850/2000 + caption: Annual global mean {long_name} according to {dataset}. scripts: script1: script: examples/diagnostic.py diff --git a/esmvaltool/recipes/hydrology/recipe_globwat.yml b/esmvaltool/recipes/hydrology/recipe_globwat.yml index 1642c4e8cb..31aeae82fa 100644 --- a/esmvaltool/recipes/hydrology/recipe_globwat.yml +++ b/esmvaltool/recipes/hydrology/recipe_globwat.yml @@ -79,7 +79,7 @@ diagnostics: description: monthly precipitation and potential evaporation of ERA5 & ERA-Interim additional_datasets: - {dataset: ERA-Interim, project: OBS6, tier: 3, type: reanaly, version: 1} - - {dataset: ERA5, project: native6, type: reanaly, version: '1', tier: 3} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} variables: pr: &var_monthly mip: Amon diff --git a/esmvaltool/recipes/hydrology/recipe_hydro_forcing.yml b/esmvaltool/recipes/hydrology/recipe_hydro_forcing.yml index 5acb6825d5..f68a597733 100644 --- a/esmvaltool/recipes/hydrology/recipe_hydro_forcing.yml +++ b/esmvaltool/recipes/hydrology/recipe_hydro_forcing.yml @@ -28,7 +28,7 @@ documentation: datasets: - {dataset: ERA-Interim, project: OBS6, tier: 3, type: reanaly, version: 1} - {dataset: ERA5, project: OBS6, tier: 3, type: reanaly, version: 1} - - {dataset: MSWEP, project: native6, exp: historical, ensemble: r1i1p1, type: reanaly, version: 220, tier: 3} + - {dataset: MSWEP, project: native6, exp: historical, ensemble: r1i1p1, type: reanaly, version: v220, tier: 3} preprocessors: daily: diff --git a/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_914.yml b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_914.yml new file mode 100644 index 0000000000..e0f0baab64 --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_914.yml @@ -0,0 +1,134 @@ +# ESMValTool +# recipe_flato13ipcc_figure_914.yml +--- +documentation: + title: IPCC AR5, chap. 9 diagnostics for 9.14 + + description: | + Reproducing Fig. 9.14 from IPCC AR5, chap. 9 (Flato et al., 2013). + Data sets taken out were part of the original publication but are + currently not available on ESGF. + + authors: + - bock_lisa + - gier_bettina + - lauer_axel + - schlund_manuel + - senftleben_daniel + - zimmermann_klaus + + maintainer: + - lauer_axel + + references: + - flato13ipcc + + projects: + - embrace + - esmval + - crescendo + + +preprocessors: + + zonal_mean: + custom_order: true + climate_statistics: + regrid: + target_grid: 1x1 + scheme: linear + zonal_statistics: + operator: mean + convert_units: + units: degC + + equatorial: + custom_order: true + climate_statistics: + regrid: + target_grid: 1x1 + scheme: linear + extract_region: + start_longitude: 0. + end_longitude: 360. + start_latitude: -5. + end_latitude: 5. + meridional_statistics: + operator: mean + convert_units: + units: degC + +diagnostics: + + # ********************************************************************** + # Flato et al. (2013) - IPCC AR5, chap. 9 + # similar to fig. 9.14 + # ********************************************************************** + # SST zonal mean and equatorial, multi model mean + # ********************************************************************** + + fig09-14: + title: Fig. 9.14 (SST) + description: | + IPCC AR5 Ch. 9, Fig. 9.14 (sst error, zonal mean and equatorial) + themes: + - phys + realms: + - ocean + variables: + tos_zm: &fig09_14_settings + project: CMIP5 + exp: historical + ensemble: r1i1p1 + mip: Omon + short_name: tos + preprocessor: zonal_mean + reference_dataset: HadISST + start_year: 1979 + end_year: 1999 + tos_eq: + <<: *fig09_14_settings + preprocessor: equatorial + additional_datasets: + - {dataset: HadISST, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + # - {dataset: bcc-csm1-1-m} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CM} + - {dataset: CMCC-CMS} + - {dataset: CNRM-CM5} + - {dataset: CSIRO-Mk3-6-0} + - {dataset: EC-EARTH} + - {dataset: FGOALS-g2} + - {dataset: FIO-ESM} + - {dataset: GFDL-CM2p1} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H} + - {dataset: GISS-E2-R} + - {dataset: HadCM3} + - {dataset: HadGEM2-AO} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC5} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + scripts: + fig09-14: + script: ipcc_ar5/ch09_fig09_14.py diff --git a/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_924.yml b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_924.yml new file mode 100644 index 0000000000..27fcff1af3 --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_924.yml @@ -0,0 +1,136 @@ +# ESMValTool +# recipe_flato13ipcc_figure_924.yml +--- +documentation: + title: IPCC AR5, chap. 9 diagnostics for 9.24 + + description: | + Reproducing Fig. 9.24 from IPCC AR5, chap. 9 (Flato et al., 2013). + Data sets taken out were part of the original publication but are + currently not available on ESGF. + + authors: + - bock_lisa + - gier_bettina + - lauer_axel + - schlund_manuel + - senftleben_daniel + - zimmermann_klaus + + maintainer: + - lauer_axel + + references: + - flato13ipcc + + projects: + - embrace + - esmval + - crescendo + + +diagnostics: + + # *********************************************************************** + # Flato et al. (2013) - IPCC AR5, chap. 9 + # similar to fig. 9.24 + # *********************************************************************** + # 9.24a/b: time series of Arctic and Antarctic sea ice extent + # 9.24c/d: trend distribution of September/February Arctic/Antarctic + # sea ice extent + # *********************************************************************** + + fig09-24: + title: Fig. 9.24 (sea ice) + description: timeseries and trend distributions of sea ice extent + themes: + - seaIce + realms: + - seaIce + variables: + sic: + mip: OImon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 1960 + end_year: 2005 + additional_datasets: + - {dataset: HadISST, project: OBS, type: reanaly, version: 1, tier: 2} + areacello: + mip: fx + project: CMIP5 + exp: historical + ensemble: r0i0p0 + start_year: 1960 + end_year: 2005 + additional_datasets: + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + # - {dataset: bcc-csm1-1-m} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-CAM5} + - {dataset: CNRM-CM5} + - {dataset: CSIRO-Mk3-6-0} + - {dataset: FGOALS-g2} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + # - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + # - {dataset: MIROC5} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + scripts: + fig09-24a: + script: seaice/seaice_tsline.ncl + # "Arctic" or "Antarctic"; entire hemisphere will be evaluated + region: "Arctic" + # A = annual mean, 3 = March, 9 = September + month: "9" + # "CMIP5", "DEFAULT" + styleset: "CMIP5" + # Plot multi-model mean & std dev + multi_model_mean: true + # Create legend label for each individual ensemble member + EMs_in_lg: false + # Fill polar hole in data with sic = 1. + fill_pole_hole: true + fig09-24b: + script: seaice/seaice_tsline.ncl + # "Arctic" or "Antarctic"; entire hemisphere will be evaluated + region: "Antarctic" + # A = annual mean, 3 = March, 9 = September + month: "2" + # "CMIP5", "DEFAULT" + styleset: "CMIP5" + # Plot multi-model mean & std dev + multi_model_mean: true + # Create legend label for each individual ensemble member + EMs_in_lg: false + # Fill polar hole in data with sic = 1. + fill_pole_hole: false + fig09-24c: + script: seaice/seaice_trends.ncl + # "Arctic" or "Antarctic"; entire hemisphere will be evaluated + region: "Arctic" + # A = annual mean, 3 = March, 9 = September + month: "9" + # Fill polar hole in data with sic = 1. + fill_pole_hole: true + fig09-24d: + script: seaice/seaice_trends.ncl + # "Arctic" or "Antarctic"; entire hemisphere will be evaluated + region: "Antarctic" + # A = annual mean, 3 = March, 9 = September + month: "2" diff --git a/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_942.yml b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_942.yml new file mode 100644 index 0000000000..20e0d7bd82 --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_942.yml @@ -0,0 +1,550 @@ +# ESMValTool +# recipe_flato13ipcc_figure_942.yml +--- +documentation: + title: IPCC AR5, chap. 9 diagnostics for 9.42 + + description: | + Reproducing Fig. 9.42 from IPCC AR5, chap. 9 (Flato et al., 2013). + Data sets taken out were part of the original publication but are + currently not available on ESGF. + + authors: + - bock_lisa + - gier_bettina + - lauer_axel + - schlund_manuel + - senftleben_daniel + - zimmermann_klaus + + maintainer: + - lauer_axel + + references: + - flato13ipcc + + projects: + - embrace + - esmval + - crescendo + + +preprocessors: + + spatial_mean: + area_statistics: + operator: mean + + +diagnostics: + + # ********************************************************************** + # Flato et al. (2013) - IPCC AR5, chap. 9 + # similar to fig. 9.42 + # ********************************************************************** + # + # ********************************************************************** + + ecs_cmip5: + description: Calculate ECS for CMIP5 models. + themes: + - phys + realms: + - atmos + variables: + tas_rtnt: &ecs_settings + short_name: tas + preprocessor: spatial_mean + project: CMIP5 + ensemble: r1i1p1 + mip: Amon + additional_datasets: &datasets_cmip5_rtnt + - {dataset: ACCESS1-0, exp: piControl, start_year: 300, end_year: 449} + - {dataset: ACCESS1-0, exp: abrupt4xCO2, start_year: 300, end_year: 449} + - {dataset: bcc-csm1-1, exp: piControl, start_year: 160, end_year: 309} + - {dataset: bcc-csm1-1, exp: abrupt4xCO2, start_year: 160, end_year: 309} + # - {dataset: bcc-csm1-1-m, exp: piControl, start_year: 240, end_year: 389} + # - {dataset: bcc-csm1-1-m, exp: abrupt4xCO2, start_year: 240, end_year: 389} + - {dataset: CanESM2, exp: piControl, start_year: 2321, end_year: 2470} + - {dataset: CanESM2, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} + # Wrong start year for piControl? (branch_time = 2.) + - {dataset: CCSM4, exp: piControl, start_year: 250, end_year: 399} + - {dataset: CCSM4, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} + - {dataset: CNRM-CM5, exp: piControl, start_year: 1850, end_year: 1999} + - {dataset: CNRM-CM5, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} + - {dataset: CSIRO-Mk3-6-0, exp: piControl, start_year: 104, end_year: 253} + - {dataset: CSIRO-Mk3-6-0, exp: abrupt4xCO2, start_year: 1, end_year: 150} + - {dataset: GFDL-CM3, exp: piControl, start_year: 1, end_year: 150} + - {dataset: GFDL-CM3, exp: abrupt4xCO2, start_year: 1, end_year: 150} + # - {dataset: GFDL-ESM2G, exp: piControl, start_year: 1, end_year: 150} + # - {dataset: GFDL-ESM2G, exp: abrupt4xCO2, start_year: 1, end_year: 150} + # - {dataset: GFDL-ESM2M, exp: piControl, start_year: 1, end_year: 150} + # - {dataset: GFDL-ESM2M, exp: abrupt4xCO2, start_year: 1, end_year: 150} + - {dataset: GISS-E2-H, exp: piControl, start_year: 2660, end_year: 2809} + - {dataset: GISS-E2-H, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} + - {dataset: GISS-E2-R, exp: piControl, start_year: 4200, end_year: 4349} + - {dataset: GISS-E2-R, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} + # Experiments start at 1859-12-01 + # - {dataset: HadGEM2-ES, exp: piControl, start_year: 1860, end_year: 2009} + # - {dataset: HadGEM2-ES, exp: abrupt4xCO2, start_year: 1860, end_year: 2009} + # - {dataset: inmcm4, exp: piControl, start_year: 2090, end_year: 2239} + # - {dataset: inmcm4, exp: abrupt4xCO2, start_year: 2090, end_year: 2239} + - {dataset: IPSL-CM5B-LR, exp: piControl, start_year: 1850, end_year: 1999} + - {dataset: IPSL-CM5B-LR, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} + - {dataset: MIROC5, exp: piControl, start_year: 2100, end_year: 2249} + - {dataset: MIROC5, exp: abrupt4xCO2, start_year: 2100, end_year: 2249} + - {dataset: MIROC-ESM, exp: piControl, start_year: 1880, end_year: 2029} + - {dataset: MIROC-ESM, exp: abrupt4xCO2, start_year: 1, end_year: 150} + - {dataset: MPI-ESM-LR, exp: piControl, start_year: 1880, end_year: 2029} + - {dataset: MPI-ESM-LR, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} + - {dataset: MPI-ESM-P, exp: piControl, start_year: 1866, end_year: 2015} + - {dataset: MPI-ESM-P, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} + # - {dataset: MRI-CGCM3, exp: piControl, start_year: 1891, end_year: 2040} + # - {dataset: MRI-CGCM3, exp: abrupt4xCO2, start_year: 1851, end_year: 2000} + - {dataset: NorESM1-M, exp: piControl, start_year: 700, end_year: 849} + - {dataset: NorESM1-M, exp: abrupt4xCO2, start_year: 1, end_year: 150} + tas_rtmt: + <<: *ecs_settings + # additional_datasets: &datasets_cmip5_rtmt + # - {dataset: IPSL-CM5A-LR, exp: piControl, start_year: 1850, end_year: 1999} + # - {dataset: IPSL-CM5A-LR, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} + rtnt: + <<: *ecs_settings + short_name: rtnt + derive: true + additional_datasets: *datasets_cmip5_rtnt + rtmt: + <<: *ecs_settings + short_name: rtmt + # additional_datasets: *datasets_cmip5_rtmt + scripts: + ecs: &ecs_script + script: climate_metrics/ecs.py + + tcr_cmip5: + description: Calculate TCR for CMIP5 models. + themes: + - phys + realms: + - atmos + variables: + 1pctCO2: &tcr_settings + short_name: tas + preprocessor: spatial_mean + project: CMIP5 + ensemble: r1i1p1 + exp: 1pctCO2 + mip: Amon + additional_datasets: + - {dataset: ACCESS1-0, start_year: 300, end_year: 439} + - {dataset: bcc-csm1-1, start_year: 160, end_year: 299} + # - {dataset: bcc-csm1-1-m, start_year: 240, end_year: 379} + - {dataset: CanESM2, start_year: 1850, end_year: 1989} + - {dataset: CCSM4, start_year: 1850, end_year: 1989} + - {dataset: CNRM-CM5, start_year: 1850, end_year: 1989} + - {dataset: CSIRO-Mk3-6-0, start_year: 1, end_year: 140} + - {dataset: GFDL-CM3, start_year: 1, end_year: 140} + - {dataset: GFDL-ESM2G, start_year: 1, end_year: 140} + - {dataset: GFDL-ESM2M, start_year: 1, end_year: 140} + - {dataset: GISS-E2-H, start_year: 1850, end_year: 1989} + - {dataset: GISS-E2-R, start_year: 1850, end_year: 1989} + # Experiments starts at 1859-12-01 + - {dataset: HadGEM2-ES, start_year: 1860, end_year: 1999} + # - {dataset: inmcm4, start_year: 2090, end_year: 2229} + - {dataset: IPSL-CM5A-LR, start_year: 1850, end_year: 1989} + - {dataset: IPSL-CM5B-LR, start_year: 1850, end_year: 1989} + - {dataset: MIROC5, start_year: 2200, end_year: 2339} + - {dataset: MIROC-ESM, start_year: 1, end_year: 140} + - {dataset: MPI-ESM-LR, start_year: 1850, end_year: 1989} + - {dataset: MPI-ESM-P, start_year: 1850, end_year: 1989} + - {dataset: MRI-CGCM3, start_year: 1851, end_year: 1990} + - {dataset: NorESM1-M, start_year: 1, end_year: 140} + piControl: + <<: *tcr_settings + exp: piControl + additional_datasets: + - {dataset: ACCESS1-0, start_year: 300, end_year: 439} + - {dataset: bcc-csm1-1, start_year: 160, end_year: 299} + # - {dataset: bcc-csm1-1-m, start_year: 240, end_year: 379} + - {dataset: CanESM2, start_year: 2321, end_year: 2460} + - {dataset: CCSM4, start_year: 251, end_year: 390} + - {dataset: CNRM-CM5, start_year: 1850, end_year: 1989} + - {dataset: CSIRO-Mk3-6-0, start_year: 104, end_year: 243} + - {dataset: GFDL-CM3, start_year: 1, end_year: 140} + - {dataset: GFDL-ESM2G, start_year: 1, end_year: 140} + - {dataset: GFDL-ESM2M, start_year: 1, end_year: 140} + - {dataset: GISS-E2-H, start_year: 2410, end_year: 2549} + - {dataset: GISS-E2-R, start_year: 3981, end_year: 4120} + # Experiments starts at 1859-12-01 + - {dataset: HadGEM2-ES, start_year: 1860, end_year: 1999} + # - {dataset: inmcm4, start_year: 2090, end_year: 2229} + - {dataset: IPSL-CM5A-LR, start_year: 1850, end_year: 1989} + - {dataset: IPSL-CM5B-LR, start_year: 1850, end_year: 1989} + - {dataset: MIROC5, start_year: 2200, end_year: 2339} + - {dataset: MIROC-ESM, start_year: 1880, end_year: 2019} + - {dataset: MPI-ESM-LR, start_year: 1880, end_year: 2019} + - {dataset: MPI-ESM-P, start_year: 1866, end_year: 2005} + - {dataset: MRI-CGCM3, start_year: 1891, end_year: 2030} + - {dataset: NorESM1-M, start_year: 700, end_year: 839} + scripts: + tcr: &tcr_script + script: climate_metrics/tcr.py + + fig09-42a_cmip5: + title: Fig. 9.42a CMIP5 (ECS vs. GMSAT) + description: Plot ECS vs. GMSAT for CMIP5 models. + themes: + - phys + realms: + - atmos + variables: + tas: + <<: *ecs_settings + additional_datasets: + - {dataset: ACCESS1-0, exp: piControl, start_year: 300, end_year: 449} + - {dataset: ACCESS1-0, exp: historical, start_year: 1961, end_year: 1990} + # Wrong start year for piControl (must be 407) + - {dataset: bcc-csm1-1, exp: piControl, start_year: 160, end_year: 299} + - {dataset: bcc-csm1-1, exp: historical, start_year: 1961, end_year: 1990} + # Wrong start year for piControl (must be 344) + # - {dataset: bcc-csm1-1-m, exp: piControl, start_year: 240, end_year: 379} + # - {dataset: bcc-csm1-1-m, exp: historical, start_year: 1961, end_year: 1990} + - {dataset: CanESM2, exp: piControl, start_year: 2321, end_year: 2470} + - {dataset: CanESM2, exp: historical, start_year: 1961, end_year: 1990} + - {dataset: CCSM4, exp: piControl, start_year: 937, end_year: 1086} + - {dataset: CCSM4, exp: historical, start_year: 1961, end_year: 1990} + - {dataset: CNRM-CM5, exp: piControl, start_year: 2250, end_year: 2399} + - {dataset: CNRM-CM5, exp: historical, start_year: 1961, end_year: 1990} + - {dataset: CSIRO-Mk3-6-0, exp: piControl, start_year: 81, end_year: 230} + - {dataset: CSIRO-Mk3-6-0, exp: historical, start_year: 1961, end_year: 1990} + - {dataset: GFDL-CM3, exp: piControl, start_year: 1, end_year: 150} + - {dataset: GFDL-CM3, exp: historical, start_year: 1961, end_year: 1990} + # - {dataset: GFDL-ESM2G, exp: piControl, start_year: 162, end_year: 311} + # - {dataset: GFDL-ESM2G, exp: historical, start_year: 1961, end_year: 1990} + # - {dataset: GFDL-ESM2M, exp: piControl, start_year: 162, end_year: 311} + # - {dataset: GFDL-ESM2M, exp: historical, start_year: 1961, end_year: 1990} + - {dataset: GISS-E2-H, exp: piControl, start_year: 2410, end_year: 2559} + - {dataset: GISS-E2-H, exp: historical, start_year: 1961, end_year: 1990} + - {dataset: GISS-E2-R, exp: piControl, start_year: 3981, end_year: 4130} + - {dataset: GISS-E2-R, exp: historical, start_year: 1961, end_year: 1990} + # - {dataset: HadGEM2-ES, exp: piControl, start_year: 1860, end_year: 2009} + # - {dataset: HadGEM2-ES, exp: historical, start_year: 1961, end_year: 1990} + # - {dataset: inmcm4, exp: piControl, start_year: 1850, end_year: 1999} + # - {dataset: inmcm4, exp: historical, start_year: 1961, end_year: 1990} + # - {dataset: IPSL-CM5A-LR, exp: piControl, start_year: 1850, end_year: 1999} + # - {dataset: IPSL-CM5A-LR, exp: historical, start_year: 1961, end_year: 1990} + - {dataset: IPSL-CM5B-LR, exp: piControl, start_year: 1850, end_year: 1999} + - {dataset: IPSL-CM5B-LR, exp: historical, start_year: 1961, end_year: 1990} + - {dataset: MIROC5, exp: piControl, start_year: 2411, end_year: 2560} + - {dataset: MIROC5, exp: historical, start_year: 1961, end_year: 1990} + - {dataset: MIROC-ESM, exp: piControl, start_year: 1880, end_year: 2029} + - {dataset: MIROC-ESM, exp: historical, start_year: 1961, end_year: 1990} + - {dataset: MPI-ESM-LR, exp: piControl, start_year: 1880, end_year: 2029} + - {dataset: MPI-ESM-LR, exp: historical, start_year: 1961, end_year: 1990} + # Parent experiment of historical is NOT piControl, but past1000 + - {dataset: MPI-ESM-P, exp: piControl, start_year: 2850, end_year: 2999} + - {dataset: MPI-ESM-P, exp: historical, start_year: 1961, end_year: 1990} + # - {dataset: MRI-CGCM3, exp: piControl, start_year: 1950, end_year: 2099} + # - {dataset: MRI-CGCM3, exp: historical, start_year: 1961, end_year: 1990} + - {dataset: NorESM1-M, exp: piControl, start_year: 700, end_year: 849} + - {dataset: NorESM1-M, exp: historical, start_year: 1961, end_year: 1990} + scripts: + fig09-42a: &fig09_42a_script + script: ipcc_ar5/ch09_fig09_42a.py + ancestors: ['tas', 'ecs_cmip5/ecs'] + tas_units: celsius + save: + bbox_inches: tight + orientation: landscape + axes_functions: &axes_functions + set_title: GMSAT vs. ECS for CMIP5 models + set_xlabel: ECS / °C + set_ylabel: GMSAT / °C + set_xlim: [1.5, 6.0] + legend: + kwargs: + loc: center left + bbox_to_anchor: [1.05, 0.5] + borderaxespad: 0.0 + ncol: 2 + + fig09-42b_cmip5: + title: Fig. 9.42b CMIP5 (TCR vs. ECS) + description: Plot TCR vs. ECS for CMIP5 models. + themes: + - phys + realms: + - atmos + scripts: + fig09-42b: &fig09_42b_script + script: ipcc_ar5/ch09_fig09_42b.py + ancestors: ['ecs_cmip5/ecs', 'tcr_cmip5/tcr'] + + ecs_cmip6: + description: Calculate ECS for CMIP6 models. + themes: + - phys + realms: + - atmos + variables: + tas_rtnt: + <<: *ecs_settings + project: CMIP6 + additional_datasets: &datasets_cmip6_rtnt + # No monthly data (parent_time_units not correct) + # - {dataset: AWI-CM-1-1-MR, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 2650, end_year: 2799, mip: day} + # - {dataset: AWI-CM-1-1-MR, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999, mip: day} + - {dataset: BCC-CSM2-MR, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: BCC-CSM2-MR, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: BCC-ESM1, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: BCC-ESM1, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: CAMS-CSM1-0, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 3030, end_year: 3179} + - {dataset: CAMS-CSM1-0, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 3030, end_year: 3179} + - {dataset: CESM2, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 150} + - {dataset: CESM2, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 150} + - {dataset: CESM2-WACCM, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 150, institute: NCAR} + - {dataset: CESM2-WACCM, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 150, institute: NCAR} + - {dataset: CNRM-CM6-1, exp: piControl, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1999} + - {dataset: CNRM-CM6-1, exp: abrupt-4xCO2, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1999} + - {dataset: CNRM-ESM2-1, exp: piControl, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1999} + - {dataset: CNRM-ESM2-1, exp: abrupt-4xCO2, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1999} + - {dataset: E3SM-1-0, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 101, end_year: 250} + - {dataset: E3SM-1-0, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr, start_year: 1, end_year: 150} + # No abrupt-4xCO2 + # - {dataset: EC-Earth3, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1999} + # - {dataset: EC-Earth3, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1999} + - {dataset: EC-Earth3-Veg, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1999} + - {dataset: EC-Earth3-Veg, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1999} + # Only mixed ensemble members available, parent_time_units messed up + # - {dataset: FGOALS-f3-L, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 151, end_year: 300} + # - {dataset: FGOALS-f3-L, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 150} + # Wrong start year for piControl (must be 101) + - {dataset: GFDL-CM4, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 151, end_year: 300} + - {dataset: GFDL-CM4, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 150} + - {dataset: GFDL-ESM4, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 101, end_year: 250} + - {dataset: GFDL-ESM4, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 150} + - {dataset: GISS-E2-1-G, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 4150, end_year: 4299} + - {dataset: GISS-E2-1-G, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: GISS-E2-1-H, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 3180, end_year: 3329} + - {dataset: GISS-E2-1-H, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: HadGEM3-GC31-LL, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: HadGEM3-GC31-LL, exp: abrupt-4xCO2, ensemble: r1i1p1f3, grid: gn, start_year: 1850, end_year: 1999} + # Wrong start year for piControl (must be 2099), data withdrawn + # - {dataset: INM-CM5-0, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 2499, end_year: 2648} + # - {dataset: INM-CM5-0, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 1999} + # Not enough years for piControl run, data withdrawn + # - {dataset: INM-CM4-8, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 1947, end_year: 2096} + # - {dataset: INM-CM4-8, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 1999} + - {dataset: IPSL-CM6A-LR, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 1870, end_year: 2019} + - {dataset: IPSL-CM6A-LR, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1999} + - {dataset: MIROC6, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 3200, end_year: 3349} + - {dataset: MIROC6, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 3200, end_year: 3349} + - {dataset: MIROC-ES2L, exp: piControl, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: MIROC-ES2L, exp: abrupt-4xCO2, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: MPI-ESM1-2-HR, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: MPI-ESM1-2-HR, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: MRI-ESM2-0, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: MRI-ESM2-0, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + # parent_time_units not correct + - {dataset: NESM3, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 550, end_year: 699} + - {dataset: NESM3, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + # Issue #286 (manual copying was necessary) + - {dataset: SAM0-UNICON, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 274, end_year: 423} + - {dataset: SAM0-UNICON, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + tas_rtmt: + <<: *ecs_settings + project: CMIP6 + additional_datasets: &datasets_cmip6_rtmt + - {dataset: CanESM5, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 5201, end_year: 5350} + - {dataset: CanESM5, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + # No 'piControl' data available for 'rtnt' of 'UKESM1-0-LL' + # - {dataset: UKESM1-0-LL, exp: piControl, ensemble: r1i1p1f2, grid: gn, start_year: 1960, end_year: 2109} + # - {dataset: UKESM1-0-LL, exp: abrupt-4xCO2, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1999} + rtnt: + <<: *ecs_settings + short_name: rtnt + project: CMIP6 + derive: true + additional_datasets: *datasets_cmip6_rtnt + rtmt: + <<: *ecs_settings + short_name: rtmt + project: CMIP6 + additional_datasets: *datasets_cmip6_rtmt + scripts: + ecs: + <<: *ecs_script + + tcr_cmip6: + description: Calculate TCR for all CMIP6 models. + variables: + 1pctCO2: + <<: *tcr_settings + project: CMIP6 + additional_datasets: + # No monthly data (parent_time_units not correct) + # - {dataset: AWI-CM-1-1-MR, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989, mip: day} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + # Model fix would be needed for BCC-ESM1 1pctCO2: + # esmvalcore.cmor.check.CMORCheckError: There were errors in variable areacello: + # There are multiple coordinates with standard_name "latitude": ['lat', 'latitude'] + # There are multiple coordinates with standard_name "longitude": ['lon', 'longitude'] + # areacello: does not match coordinate rank + # - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, start_year: 3030, end_year: 3169} + - {dataset: CanESM5, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 140} + - {dataset: CESM2-WACCM, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 140, institute: NCAR} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1989} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1989} + - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, start_year: 1, end_year: 140} + # No 1pctCO2 available + # - {dataset: EC-Earth3, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1989} + - {dataset: EC-Earth3-Veg, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1989} + # Only mixed ensemble members available, parent_time_units messed up + # - {dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 140} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 140} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 140} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn, start_year: 1850, end_year: 1989} + # Data withdrawn + # - {dataset: INM-CM4-8, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 1989} + - {dataset: IPSL-CM6A-LR, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1989} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, start_year: 3200, end_year: 3339} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1989} + - {dataset: MPI-ESM1-2-HR, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + # parent_time_units not correct, incorrect start year for piControl + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1989} + piControl: + <<: *tcr_settings + project: CMIP6 + exp: piControl + additional_datasets: + # No monthly data (parent_time_units not correct) + # - {dataset: AWI-CM-1-1-MR, ensemble: r1i1p1f1, grid: gn, start_year: 2650, end_year: 2789, mip: day} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + # - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, start_year: 3030, end_year: 3169} + - {dataset: CanESM5, ensemble: r1i1p1f1, grid: gn, start_year: 5201, end_year: 5340} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn, start_year: 501, end_year: 640} + - {dataset: CESM2-WACCM, ensemble: r1i1p1f1, grid: gn, start_year: 70, end_year: 209, institute: NCAR} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1989} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1989} + - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, start_year: 101, end_year: 240} + # No 1pctCO2 available + # - {dataset: EC-Earth3, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1989} + - {dataset: EC-Earth3-Veg, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1989} + # Only mixed ensemble members available, parent_time_units messed up + # - {dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 140} + # Wrong start year (must be 101) + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1, start_year: 151, end_year: 290} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1, start_year: 101, end_year: 240} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn, start_year: 4150, end_year: 4289} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, start_year: 3180, end_year: 3319} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + # Data withdrawn + # - {dataset: INM-CM4-8, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 1947, end_year: 2086} + - {dataset: IPSL-CM6A-LR, ensemble: r1i1p1f1, grid: gr, start_year: 1870, end_year: 2009} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, start_year: 3200, end_year: 3339} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1989} + - {dataset: MPI-ESM1-2-HR, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} + # parent_time_units not correct, incorrect start year for piControl + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, start_year: 550, end_year: 689} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, start_year: 274, end_year: 413} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn, start_year: 1960, end_year: 2099} + scripts: + tcr: + <<: *tcr_script + + fig09-42a_cmip6: + title: Fig. 9.42a CMIP6 (ECS vs. GMSAT) + description: Plot ECS vs. GMSAT for CMIP6 models. + themes: + - phys + realms: + - atmos + variables: + tas: + <<: *ecs_settings + project: CMIP6 + additional_datasets: + - {dataset: BCC-CSM2-MR, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: BCC-CSM2-MR, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} + - {dataset: BCC-ESM1, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 2110, end_year: 2259} + - {dataset: BCC-ESM1, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} + - {dataset: CAMS-CSM1-0, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 3025, end_year: 3174} + - {dataset: CAMS-CSM1-0, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} + - {dataset: CanESM5, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 5201, end_year: 5350} + - {dataset: CanESM5, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} + - {dataset: CESM2, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 150} + - {dataset: CESM2, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} + - {dataset: CESM2-WACCM, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 150, institute: NCAR} + - {dataset: CESM2-WACCM, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990, institute: NCAR} + - {dataset: CNRM-CM6-1, exp: piControl, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1999} + - {dataset: CNRM-CM6-1, exp: historical, ensemble: r1i1p1f2, grid: gr, start_year: 1961, end_year: 1990} + - {dataset: CNRM-ESM2-1, exp: piControl, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1999} + - {dataset: CNRM-ESM2-1, exp: historical, ensemble: r1i1p1f2, grid: gr, start_year: 1961, end_year: 1990} + - {dataset: E3SM-1-0, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 101, end_year: 250} + - {dataset: E3SM-1-0, exp: historical, ensemble: r1i1p1f1, grid: gr, start_year: 1961, end_year: 1990} + - {dataset: EC-Earth3-Veg, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 2030, end_year: 2179} + - {dataset: EC-Earth3-Veg, exp: historical, ensemble: r1i1p1f1, grid: gr, start_year: 1961, end_year: 1990} + # Wrong start year (must be 101) + - {dataset: GFDL-CM4, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 151, end_year: 300} + - {dataset: GFDL-CM4, exp: historical, ensemble: r1i1p1f1, grid: gr1, start_year: 1961, end_year: 1990} + - {dataset: GFDL-ESM4, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 101, end_year: 250} + - {dataset: GFDL-ESM4, exp: historical, ensemble: r1i1p1f1, grid: gr1, start_year: 1961, end_year: 1990} + - {dataset: GISS-E2-1-G, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 4150, end_year: 4299} + - {dataset: GISS-E2-1-G, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} + - {dataset: GISS-E2-1-H, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 3180, end_year: 3329} + - {dataset: GISS-E2-1-H, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} + - {dataset: HadGEM3-GC31-LL, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: HadGEM3-GC31-LL, exp: historical, ensemble: r1i1p1f3, grid: gn, start_year: 1961, end_year: 1990} + # Wrong start year for piControl (must be 2099), data withdrawn + # - {dataset: INM-CM5-0, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 2499, end_year: 2648} + # - {dataset: INM-CM5-0, exp: historical, ensemble: r1i1p1f1, grid: gr1, start_year: 1961, end_year: 1990} + # Not enough years for piControl run + # - {dataset: INM-CM4-8, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 1947, end_year: 2096} + # - {dataset: INM-CM4-8, exp: historical, ensemble: r1i1p1f1, grid: gr1, start_year: 1961, end_year: 1990} + - {dataset: IPSL-CM6A-LR, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1999} + - {dataset: IPSL-CM6A-LR, exp: historical, ensemble: r1i1p1f1, grid: gr, start_year: 1961, end_year: 1990} + - {dataset: MIROC6, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 3200, end_year: 3349} + - {dataset: MIROC6, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} + - {dataset: MIROC-ES2L, exp: piControl, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: MIROC-ES2L, exp: historical, ensemble: r1i1p1f2, grid: gn, start_year: 1961, end_year: 1990} + - {dataset: MPI-ESM1-2-HR, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: MPI-ESM1-2-HR, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} + - {dataset: MRI-ESM2-0, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} + - {dataset: MRI-ESM2-0, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} + # parent_time_units not correct (must start in 1300) + - {dataset: NESM3, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 550, end_year: 699} + - {dataset: NESM3, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} + - {dataset: SAM0-UNICON, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 274, end_year: 423} + - {dataset: SAM0-UNICON, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} + # - {dataset: UKESM1-0-LL, exp: piControl, ensemble: r1i1p1f2, grid: gn, start_year: 2250, end_year: 2399} + # - {dataset: UKESM1-0-LL, exp: historical, ensemble: r1i1p1f2, grid: gn, start_year: 1961, end_year: 1990} + scripts: + fig09-42a: + <<: *fig09_42a_script + ancestors: ['tas', 'ecs_cmip6/ecs'] + axes_functions: + <<: *axes_functions + set_title: GMSAT vs. ECS for CMIP6 models + dataset_style: cmip6 + + fig09-42b_cmip6: + title: Fig. 9.42b CMIP6 (TCR vs. ECS) + description: Plot TCR vs. ECS for CMIP6 models. + themes: + - phys + realms: + - atmos + scripts: + fig09-42b: + <<: *fig09_42b_script + ancestors: ['ecs_cmip6/ecs', 'tcr_cmip6/tcr'] + dataset_style: cmip6 diff --git a/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_945a.yml b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_945a.yml new file mode 100644 index 0000000000..98a1b3365d --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_945a.yml @@ -0,0 +1,108 @@ +# ESMValTool +# recipe_flato13ipcc_figure945a.yml +--- +documentation: + title: IPCC AR5, chap. 9 diagnostics for 9.45a + + description: | + Reproducing selected Figure 9.45a from IPCC AR5, chap. 9 (Flato et al., 2013). + Data sets taken out were part of the original publication but are + currently not available on ESGF. + + authors: + - bock_lisa + - gier_bettina + - lauer_axel + - schlund_manuel + - senftleben_daniel + - zimmermann_klaus + + maintainer: + - lauer_axel + + references: + - flato13ipcc + + projects: + - embrace + - esmval + - crescendo + + +diagnostics: + + # *********************************************************************** + # Flato et al. (2013) - IPCC AR5, chap. 9 + # similar to fig. 9.45a + # *********************************************************************** + # Scatterplot of springtime snow-albedo effect values in climate + # change vs. springtime d(alpha_s)/d(T_s) values in the seasonal + # cycle in transient climate change experiments. + # *********************************************************************** + + fig09-45a: + title: Fig. 9.45a (snow-albedo feedback) + description: springtime snow-albedo feedback values vs. seasonal cycle + themes: + - EC + realms: + - atmos + variables: + alb: + mip: Amon + project: CMIP5 + ensemble: r1i1p1 + reference_dataset: ISCCP-FH + derive: true + additional_datasets: + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, start_year: 1984, end_year: 2000, tier: 2} + tas: + mip: Amon + project: CMIP5 + ensemble: r1i1p1 + reference_dataset: ERA-Interim + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, start_year: 1984, end_year: 2000, tier: 3} + rsdt: + mip: Amon + project: CMIP5 + ensemble: r1i1p1 + reference_dataset: ISCCP-FH + additional_datasets: + - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, start_year: 1984, end_year: 2000, tier: 2} + additional_datasets: + - {dataset: bcc-csm1-1, exp: historical, start_year: 1901, end_year: 2000} + - {dataset: bcc-csm1-1, exp: rcp45, start_year: 2101, end_year: 2200} + - {dataset: CanESM2, exp: historical, start_year: 1901, end_year: 2000} + - {dataset: CanESM2, exp: rcp45, start_year: 2101, end_year: 2200} + # - {dataset: CCSM4, exp: historical, start_year: 1901, end_year: 2000} + # - {dataset: CCSM4, exp: rcp45, start_year: 2101, end_year: 2200} + - {dataset: CNRM-CM5, exp: historical, start_year: 1901, end_year: 2000} + - {dataset: CNRM-CM5, exp: rcp45, start_year: 2101, end_year: 2200} + - {dataset: CSIRO-Mk3-6-0, exp: historical, start_year: 1901, end_year: 2000} + - {dataset: CSIRO-Mk3-6-0, exp: rcp45, start_year: 2101, end_year: 2200} + # - {dataset: GFDL-CM3, exp: historical, start_year: 1901, end_year: 2000} + # - {dataset: GFDL-CM3, exp: rcp45, start_year: 2101, end_year: 2200} + - {dataset: GISS-E2-H, exp: historical, start_year: 1901, end_year: 2000} + - {dataset: GISS-E2-H, exp: rcp45, start_year: 2101, end_year: 2200} + - {dataset: GISS-E2-R, exp: historical, start_year: 1901, end_year: 2000} + - {dataset: GISS-E2-R, exp: rcp45, start_year: 2101, end_year: 2200} + - {dataset: IPSL-CM5A-LR, exp: historical, start_year: 1901, end_year: 2000} + - {dataset: IPSL-CM5A-LR, exp: rcp45, start_year: 2101, end_year: 2200} + - {dataset: MIROC-ESM, exp: historical, start_year: 1901, end_year: 2000} + - {dataset: MIROC-ESM, exp: rcp45, start_year: 2101, end_year: 2200} + - {dataset: MPI-ESM-LR, exp: historical, start_year: 1901, end_year: 2000} + - {dataset: MPI-ESM-LR, exp: rcp45, start_year: 2101, end_year: 2200} + - {dataset: NorESM1-M, exp: historical, start_year: 1901, end_year: 2000} + - {dataset: NorESM1-M, exp: rcp45, start_year: 2101, end_year: 2200} + scripts: + fig09_45a: + script: emergent_constraints/snowalbedo.ncl + exp_presentday: historical + exp_future: rcp45 + legend_outside: false + xmin: -1.7 + xmax: -0.3 + ymin: -1.7 + ymax: -0.3 + styleset: "CMIP5" diff --git a/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_96.yml b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_96.yml new file mode 100644 index 0000000000..2c473b17cb --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_96.yml @@ -0,0 +1,397 @@ +# ESMValTool +# recipe_flato13ipcc_figure_96.yml +--- +documentation: + title: IPCC AR5, chap. 9 diagnostics for 9.6 + + description: | + Reproducing Fig. 9.6 from IPCC AR5, chap. 9 (Flato et al., 2013). + Processing of CMIP3 models currently works only in serial mode, due to + an issue in the input data still under investigation. CMIP3 models + are used in diagnostics for Fig. 9.6 in this recipe. + Data sets taken out were part of the original publication but are + currently not available on ESGF. + + authors: + - bock_lisa + - gier_bettina + - lauer_axel + - schlund_manuel + - senftleben_daniel + - zimmermann_klaus + + maintainer: + - lauer_axel + + references: + - flato13ipcc + + projects: + - embrace + - esmval + - crescendo + +preprocessors: + + regrid_4_5: + regrid: + target_grid: 4x5 + scheme: linear + +diagnostics: + + # *************************************************************************** + # Flato et al. (2013) - IPCC AR5, chap. 9 + # similar to fig. 9.6 + # *************************************************************************** + # Centred pattern correlations between models and observations for + # the annual mean climatology over the period 1980-1999. + # *************************************************************************** + + fig09-6_tas: + title: Fig. 9.6 (near-surface temperature) + description: Calculate pattern correlation for tas + variables: + tas: + preprocessor: regrid_4_5 + reference_dataset: ERA-Interim + alternative_dataset: NCEP-NCAR-R1 + project: CMIP5 + exp: historical + ensemble: r1i1p1 + mip: Amon + field: T2Ms + start_year: 1980 + end_year: 1999 + additional_datasets: + - &cmip3 {dataset: bccr_bcm2_0, institute: BCCR, project: CMIP3, mip: A1, modeling_realm: atm, exp: 20c3m, frequency: mo, ensemble: run1} + - {<<: *cmip3, dataset: cccma_cgcm3_1, institute: CCCMA} + - {<<: *cmip3, dataset: cccma_cgcm3_1_t63, institute: CCCMA} + - {<<: *cmip3, dataset: csiro_mk3_0, institute: CSIRO} + - {<<: *cmip3, dataset: giss_aom, institute: NASA} + - {<<: *cmip3, dataset: giss_model_e_h, institute: NASA} + - {<<: *cmip3, dataset: giss_model_e_r, institute: NASA} + - {<<: *cmip3, dataset: iap_fgoals1_0_g, institute: LASG} + - {<<: *cmip3, dataset: ingv_echam4, institute: INGV} + - {<<: *cmip3, dataset: inmcm3_0, institute: INM} + - {<<: *cmip3, dataset: ipsl_cm4, institute: IPSL} + - {<<: *cmip3, dataset: miroc3_2_hires, institute: NIES} + - {<<: *cmip3, dataset: miroc3_2_medres, institute: NIES} + - {<<: *cmip3, dataset: mpi_echam5, institute: MPIM} + - {<<: *cmip3, dataset: ncar_ccsm3_0, institute: NCAR} + - {<<: *cmip3, dataset: ncar_pcm1, institute: NCAR} + - {<<: *cmip3, dataset: ukmo_hadcm3, institute: UKMO} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + # - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CM} + - {dataset: CMCC-CMS} + - {dataset: CNRM-CM5} + - {dataset: CNRM-CM5-2} + - {dataset: FIO-ESM} + - {dataset: GFDL-CM2p1} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {dataset: HadGEM2-AO} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + # - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} + scripts: + fig09-6_pattern_cor: &fig09_6_pattern_cor + script: ipcc_ar5/ch09_fig09_6.ncl + + fig09-6_rlut: + title: Fig. 9.6 (TOA longwave radiation) + description: Calculate pattern correlation for all-sky longwave radiation + variables: + rlut: + preprocessor: regrid_4_5 + reference_dataset: CERES-EBAF + project: CMIP5 + exp: historical + ensemble: r1i1p1 + mip: Amon + field: T2Ms + start_year: 1980 + end_year: 1999 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: cccma_cgcm3_1, institute: CCCMA} + - {<<: *cmip3, dataset: cccma_cgcm3_1_t63, institute: CCCMA} + - {<<: *cmip3, dataset: csiro_mk3_0, institute: CSIRO} + - {<<: *cmip3, dataset: giss_aom, institute: NASA} + - {<<: *cmip3, dataset: giss_model_e_h, institute: NASA} + - {<<: *cmip3, dataset: giss_model_e_r, institute: NASA} + - {<<: *cmip3, dataset: iap_fgoals1_0_g, institute: LASG} + - {<<: *cmip3, dataset: ingv_echam4, institute: INGV} + - {<<: *cmip3, dataset: inmcm3_0, institute: INM} + - {<<: *cmip3, dataset: ipsl_cm4, institute: IPSL} + - {<<: *cmip3, dataset: miroc3_2_hires, institute: NIES} + - {<<: *cmip3, dataset: miroc3_2_medres, institute: NIES} + - {<<: *cmip3, dataset: mpi_echam5, institute: MPIM} + - {<<: *cmip3, dataset: ncar_ccsm3_0, institute: NCAR} + - {<<: *cmip3, dataset: ncar_pcm1, institute: NCAR} + - {<<: *cmip3, dataset: ukmo_hadcm3, institute: UKMO} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + # - {dataset: bcc-csm1-1} + # - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CM} + - {dataset: CMCC-CMS} + - {dataset: CNRM-CM5} + - {dataset: CNRM-CM5-2} + - {dataset: FIO-ESM} + - {dataset: GFDL-CM2p1} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {dataset: HadGEM2-AO} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + # - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-7, tier: 1, start_year: 2003, end_year: 2011} + scripts: + fig09-6_pattern_cor: + <<: *fig09_6_pattern_cor + + fig09-6_pr: + title: Fig. 9.6 (precipitation) + description: Calculate pattern correlation for precipitation + variables: + pr: + preprocessor: regrid_4_5 + reference_dataset: GPCP-SG + alternative_dataset: GHCN + project: CMIP5 + exp: historical + ensemble: r1i1p1 + mip: Amon + field: T2Ms + start_year: 1980 + end_year: 1999 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: cccma_cgcm3_1, institute: CCCMA} + - {<<: *cmip3, dataset: cccma_cgcm3_1_t63, institute: CCCMA} + - {<<: *cmip3, dataset: csiro_mk3_0, institute: CSIRO} + - {<<: *cmip3, dataset: giss_aom, institute: NASA} + - {<<: *cmip3, dataset: giss_model_e_h, institute: NASA} + - {<<: *cmip3, dataset: giss_model_e_r, institute: NASA} + - {<<: *cmip3, dataset: iap_fgoals1_0_g, institute: LASG} + - {<<: *cmip3, dataset: ingv_echam4, institute: INGV} + - {<<: *cmip3, dataset: inmcm3_0, institute: INM} + - {<<: *cmip3, dataset: ipsl_cm4, institute: IPSL} + - {<<: *cmip3, dataset: miroc3_2_hires, institute: NIES} + - {<<: *cmip3, dataset: miroc3_2_medres, institute: NIES} + - {<<: *cmip3, dataset: mpi_echam5, institute: MPIM} + - {<<: *cmip3, dataset: ncar_ccsm3_0, institute: NCAR} + - {<<: *cmip3, dataset: ncar_pcm1, institute: NCAR} + - {<<: *cmip3, dataset: ukmo_hadcm3, institute: UKMO} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + # - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CM} + - {dataset: CMCC-CMS} + - {dataset: CNRM-CM5} + - {dataset: CNRM-CM5-2} + - {dataset: FIO-ESM} + - {dataset: GFDL-CM2p1} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {dataset: HadGEM2-AO} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + # - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + + - {dataset: GPCP-SG, project: obs4MIPs, level: L3, version: v2.2, tier: 1} + - {dataset: GHCN, project: OBS, type: ground, version: 1, tier: 2} + scripts: + fig09-6_pattern_cor: + <<: *fig09_6_pattern_cor + + fig09-6_swcre: + title: Fig. 9.6 (shortwave CRE) + description: Calculate pattern correlation for shortwave cloud radiative effect + variables: + swcre: + preprocessor: regrid_4_5 + reference_dataset: CERES-EBAF + project: CMIP5 + exp: historical + ensemble: r1i1p1 + mip: Amon + field: T2Ms + start_year: 1980 + end_year: 1999 + derive: true + force_derivation: false + additional_datasets: + - {<<: *cmip3, dataset: cccma_cgcm3_1, institute: CCCMA} + - {<<: *cmip3, dataset: csiro_mk3_0, institute: CSIRO} + - {<<: *cmip3, dataset: giss_model_e_h, institute: NASA} + - {<<: *cmip3, dataset: giss_model_e_r, institute: NASA} + - {<<: *cmip3, dataset: iap_fgoals1_0_g, institute: LASG} + - {<<: *cmip3, dataset: inmcm3_0, institute: INM} + - {<<: *cmip3, dataset: ipsl_cm4, institute: IPSL} + - {<<: *cmip3, dataset: miroc3_2_hires, institute: NIES} + - {<<: *cmip3, dataset: miroc3_2_medres, institute: NIES} + - {<<: *cmip3, dataset: mpi_echam5, institute: MPIM} + - {<<: *cmip3, dataset: ncar_ccsm3_0, institute: NCAR} + - {<<: *cmip3, dataset: ncar_pcm1, institute: NCAR} + - {<<: *cmip3, dataset: ukmo_hadcm3, institute: UKMO} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + # - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CM} + - {dataset: CNRM-CM5} + - {dataset: CNRM-CM5-2} + - {dataset: FGOALS-g2} + - {dataset: FIO-ESM} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {dataset: HadGEM2-AO} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + # - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-7, tier: 1, start_year: 2003, end_year: 2011} + scripts: + fig09-6_pattern_cor: + <<: *fig09_6_pattern_cor + + ### COLLECT CORRELATIONS AND PLOT ########################################### + fig09-6_cor_collect: + description: Wrapper to collect and plot previously calculated correlations + scripts: + fig09-6_cor_collect: + script: ipcc_ar5/ch09_fig09_6_collect.ncl + ancestors: ['*/fig09-6_pattern_cor'] + diag_order: ['fig09-6_tas', 'fig09-6_rlut', 'fig09-6_pr'] diff --git a/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_98.yml b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_98.yml new file mode 100644 index 0000000000..7390d12d36 --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figure_98.yml @@ -0,0 +1,151 @@ +# ESMValTool +# recipe_flato13ipcc_figure_98.yml +--- +documentation: + title: IPCC AR5, chap. 9 diagnostics for 9.8 + + description: | + Reproducing selected Fig. 9.8 from IPCC AR5, chap. 9 (Flato et al., 2013). + Data sets taken out were part of the original publication but are + currently not available on ESGF. + + authors: + - bock_lisa + - gier_bettina + - lauer_axel + - schlund_manuel + - senftleben_daniel + - zimmermann_klaus + + maintainer: + - lauer_axel + + references: + - flato13ipcc + + projects: + - embrace + - esmval + - crescendo + + +preprocessors: + + clim_ref: + regrid: + target_grid: reference_dataset + scheme: linear + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [reference_dataset] + + +diagnostics: + + # ********************************************************************** + # Flato et al. (2013) - IPCC AR5, chap. 9 + # similar to fig. 9.8 + # ********************************************************************** + # Time series of anomalies of annual and global surface temperature + # ********************************************************************** + + fig09-8: + title: Fig. 9.8 (near-surface temperature) + description: IPCC AR5 Ch. 9, Fig. 9.8 (near-surface temperature) + themes: + - phys + realms: + - atmos + variables: + tas: + preprocessor: clim_ref + reference_dataset: HadCRUT4 + mip: Amon + project: CMIP5 + exp: [historical, rcp45] + ensemble: r1i1p1 + start_year: 1870 + end_year: 2017 + additional_datasets: + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + # Historical data end year is 2012, not 2005 (overlaps with RCP4.5) + # - {dataset: bcc-csm1-1} + # Historical data end year is 2012, not 2005 (overlaps with RCP4.5) + # - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + # - {dataset: CanCM4} + # - {dataset: CanESM2} + # rcp starts with year 2005 - not 2006 + # - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + # - {dataset: CESM1-CAM5-1-FV2} + # no rcp45 at DKRZ + # - {dataset: CESM1-FASTCHEM} + # no historival and rcp45 from the same exp + # - {dataset: CESM1-WACCM} + # no rcp45 at DKRZ + # - {dataset: CMCC-CESM} + - {dataset: CMCC-CM} + - {dataset: CMCC-CMS} + # no rcp45 at DKRZ + # - {dataset: CNRM-CM5} + # no rcp45 at DKRZ + # - {dataset: CNRM-CM5-2} + - {dataset: CSIRO-Mk3-6-0} + # - {dataset: EC-EARTH, ensemble: r6i1p1} + # - {dataset: FGOALS-g2} + # - {dataset: FGOALS-s2} + - {dataset: FIO-ESM} + # Historical data end year is 2040, not 2005 (overlaps with RCP4.5) + # - {dataset: GFDL-CM2p1} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + # Historical data end year is 2010, not 2005 (overlaps with RCP4.5) + # - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + # Historical data end year is 2010, not 2005 (overlaps with RCP4.5) + # - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {dataset: HadGEM2-AO} + # dataset ends November 2005 + # - {dataset: HadGEM2-CC} + # dataset ends November 2005 + # - {dataset: HadGEM2-ES} + # - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + # - {dataset: MIROC4h} + # Historical data end year is 2012, not 2005 (overlaps with RCP4.5) + # - {dataset: MIROC5} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + # no rcp45 at DKRZ + # - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + # no rcp45 at DKRZ + # - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + - {dataset: HadCRUT4, project: OBS, type: ground, version: 1, + start_year: 1870, end_year: 2017, tier: 2} + scripts: + fig09-8: + script: ipcc_ar5/tsline.ncl + time_avg: "yearly" + ts_anomaly: "anom" + ref_start: 1961 + ref_end: 1990 + ref_mask: True + plot_units: "degC" + y_min: -1.2 + y_max: 1.5 + volcanoes: True + styleset: CMIP5 # Plot style diff --git a/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figures_926_927.yml b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figures_926_927.yml new file mode 100644 index 0000000000..a44bca6644 --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figures_926_927.yml @@ -0,0 +1,186 @@ +# ESMValTool +# recipe_flato13ipcc_figures_926_927.yml +--- +documentation: + title: IPCC AR5, chap. 9 diagnostics for 9.26 and 9.27 + + description: | + Reproducing selected figures from IPCC AR5, chap. 9 (Flato et al., 2013) + 9.26, 9.27. + Data sets taken out were part of the original publication but are + currently not available on ESGF. + + authors: + - bock_lisa + - gier_bettina + - lauer_axel + - schlund_manuel + - senftleben_daniel + - zimmermann_klaus + + maintainer: + - lauer_axel + + references: + - flato13ipcc + + projects: + - embrace + - esmval + - crescendo + + +preprocessors: + + land_fraction_weighting: + weighting_landsea_fraction: &weighting_options + area_type: land + exclude: [ + # 'bcc-csm1-1-m', + 'GCP2018', + # 'inmcm4', + 'JMA-TRANSCOM', + ] + + sea_fraction_weighting: + weighting_landsea_fraction: + <<: *weighting_options + area_type: sea + regrid: + target_grid: 2x2 + scheme: linear + + +diagnostics: + + # ********************************************************************** + # Flato et al. (2013) - IPCC AR5, chap. 9 + # similar to fig. 9.26 + # ********************************************************************** + # Ensemble-mean global ocean carbon uptake (top) and global land + # carbon uptake (bottom) in the CMIP5 ESMs for the historical period + # 1901-2005. + # ********************************************************************** + + fig09-26top: + title: Fig. 9.26a (carbon uptake) + variables: + fgco2: &fgco2_settings + preprocessor: sea_fraction_weighting + project: CMIP5 + mip: Omon + exp: historical + ensemble: r1i1p1 + start_year: 1901 + end_year: 2005 + reference_dataset: JMA-TRANSCOM + plot_units: PgC y-1 + additional_datasets: + - {dataset: JMA-TRANSCOM, project: OBS, type: reanaly, version: 2018, tier: 3, start_year: 1986, end_year: 2005} + # - {dataset: CanESM2} + # - {dataset: CESM1-BGC} + # - {dataset: GFDL-ESM2G} + # - {dataset: GFDL-ESM2M} + # - {dataset: HadGEM2-CC} + # - {dataset: HadGEM2-ES} + # - {dataset: inmcm4} + # - {dataset: IPSL-CM5A-LR} + # - {dataset: IPSL-CM5A-MR} + # - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC-ESM, supplementary_variables: [{short_name: sftlf, mip: fx, ensemble: r0i0p0}, {short_name: sftof, skip: true}]} + - {dataset: MIROC-ESM-CHEM, supplementary_variables: [{short_name: sftlf, mip: fx, ensemble: r0i0p0}, {short_name: sftof, skip: true}]} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: NorESM1-ME} + fgco2_GCP2018: + <<: *fgco2_settings + preprocessor: default + short_name: fgco2 + additional_datasets: + - {dataset: GCP2018, project: OBS, type: reanaly, version: '1.0', tier: 2, start_year: 1959, end_year: 2005, frequency: yr} + scripts: + main_global: &fig09_26_settings + script: carbon_cycle/main.ncl + styleset: CMIP5 + region: global + legend_year_outside: false + legend_outside: false + sort: true + anav_month: true + seasonal_cycle_plot: false + errorbar_plot: false + mean_IAV_plot: false + evolution_plot: true + evolution_plot_volcanoes: false + evolution_plot_anomaly: false + evolution_plot_ref_dataset: GCP2018 + + fig09-26bottom: + title: Fig. 9.26b (carbon uptake) + variables: + nbp: + <<: *fgco2_settings + preprocessor: land_fraction_weighting + mip: Lmon + additional_datasets: &nbp_datasets + - {dataset: GCP2018, project: OBS, type: reanaly, version: '1.0', tier: 2, start_year: 1959, end_year: 2005, frequency: yr} + - {dataset: JMA-TRANSCOM, project: OBS, type: reanaly, version: 2018, tier: 3, start_year: 1986, end_year: 2005} + - {dataset: BNU-ESM} + - {dataset: CanESM2} + - {dataset: CESM1-BGC} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + # - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: NorESM1-ME} + scripts: + main_global: + <<: *fig09_26_settings + + + # ********************************************************************** + # Flato et al. (2013) - IPCC AR5, chap. 9 + # similar to fig. 9.27 + # ********************************************************************** + # Simulation of global mean (a) atmosphere-ocean CO2 fluxes (fgCO2) + # and (b) net atmosphere-land CO2 fluxes (NBP), by ESMs for the + # period 1986-2005. + # ********************************************************************** + + fig09-27top: + title: Fig. 9.27a (CO2 fluxes) + variables: + fgco2: + <<: *fgco2_settings + start_year: 1986 + fgco2_GCP2018: + <<: *fgco2_settings + preprocessor: default + short_name: fgco2 + additional_datasets: + - {dataset: GCP2018, project: OBS, type: reanaly, version: '1.0', tier: 2, start_year: 1986, end_year: 2005, frequency: yr} + scripts: + main_global: &fig09_27_settings + <<: *fig09_26_settings + errorbar_plot: true + evolution_plot: false + + fig09-27bottom: + variables: + nbp: + <<: *fgco2_settings + preprocessor: default + mip: Lmon + start_year: 1986 + additional_datasets: *nbp_datasets + scripts: + main_global: + <<: *fig09_27_settings diff --git a/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figures_92_95.yml b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figures_92_95.yml new file mode 100644 index 0000000000..298b2bbc07 --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figures_92_95.yml @@ -0,0 +1,688 @@ +# ESMValTool +# recipe_flato13ipcc_figures_92_95.yml +--- +documentation: + title: IPCC AR5, chap. 9 diagnostics 9.2-9.5 + + description: | + Reproducing selected figures from IPCC AR5, chap. 9 (Flato et al., 2013) + 9.2, 9.3, 9.4, 9.5. + Data sets taken out were part of the original publication but are + currently not available on ESGF. + + authors: + - bock_lisa + - gier_bettina + - lauer_axel + - schlund_manuel + - senftleben_daniel + - zimmermann_klaus + + maintainer: + - lauer_axel + + references: + - flato13ipcc + + projects: + - embrace + - esmval + - crescendo + + +preprocessors: + + clim: + regrid: + target_grid: 2x2 + scheme: linear + mask_fillvalues: + threshold_fraction: 0.95 + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [reference_dataset] + + clim_ref_9-3: + regrid: + target_grid: reference_dataset + scheme: linear + mask_fillvalues: + threshold_fraction: 0.95 + multi_model_statistics: + span: overlap + statistics: [mean] + exclude: [reference_dataset] + convert_units: + units: degC + +diagnostics: + + # ********************************************************************** + # Flato et al. (2013) - IPCC AR5, chap. 9 + # similar to fig. 9.2 a/b/c + # ********************************************************************** + # Multi model mean, multi model mean bias, and mean absolute error + # (geographical distributions) + # ********************************************************************** + + fig09-2: + title: Fig. 9.2 (near-surface temperature) + description: IPCC AR5 Ch. 9, Fig. 9.2 (near-surface temperature) + themes: + - phys + realms: + - atmos + variables: + tas: + preprocessor: clim + reference_dataset: ERA-Interim + mip: Amon + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, + start_year: 1986, end_year: 2005, tier: 3} + - {dataset: ACCESS1-0, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: ACCESS1-3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: bcc-csm1-1-m, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: BNU-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CCSM4, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-BGC, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: CESM1-CAM5-1-FV, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CESM1-CAM5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-FASTCHEM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CESM1-WACCM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CMCC-CESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: CMCC-CM, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + # - {dataset: CMCC-CMS, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + # - {dataset: CNRM-CM5-2, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CNRM-CM5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CSIRO-Mk3-6-0, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: FGOALS-g2, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GFDL-CM3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-ESM2G, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-ESM2M, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-H-CC, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: GISS-E2-H, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-R-CC, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-R, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: HadGEM2-CC, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: HadGEM2-ES, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: inmcm4, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-LR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-MR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5B-LR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: MIROC4h, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC-ESM-CHEM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-LR, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-MR, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-P, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MRI-CGCM3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: NorESM1-M, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: NorESM1-ME, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + scripts: + fig09-2: &fig-9-2_and_9-4_settings + script: clouds/clouds_bias.ncl + projection: Robinson + timemean: annualclim + plot_abs_diff: true + plot_rel_diff: false + + # *************************************************************************** + # Flato et al. (2013) - IPCC AR5, chap. 9 + # similar to fig. 9.3 + # *************************************************************************** + # Multi model mean seasonality, mean absolute seasonality, mean bias + # in seasonality, and mean bias in absolute seasonality + # *************************************************************************** + + fig09-3: + title: Fig. 9.3 (near-surface temperature) + description: Calculate seasonality of multi-model mean for tas + themes: + - phys + realms: + - atmos + variables: + tas: + preprocessor: clim_ref_9-3 + reference_dataset: ERA-Interim + project: CMIP5 + exp: historical + ensemble: r1i1p1 + mip: Amon + start_year: 1980 + end_year: 2005 + additional_datasets: + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + # - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CM} + - {dataset: CMCC-CMS} + - {dataset: CNRM-CM5} + - {dataset: CNRM-CM5-2} + - {dataset: FIO-ESM} + - {dataset: GFDL-CM2p1} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {dataset: HadGEM2-AO} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + # - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} + scripts: + fig09-3: + script: ipcc_ar5/ch09_fig09_3.ncl + + # ********************************************************************** + # Flato et al. (2013) - IPCC AR5, chap. 9 + # similar to fig. 9.4 + # ********************************************************************** + # Multi model mean, multi model mean bias, mean absolute error, and + # mean relative error (geographical ditributions) + # ********************************************************************** + + fig09-4: + title: Fig. 9.4 (precipitation) + description: IPCC AR5 Ch. 9, Fig. 9.4 (precipitation) + themes: + - clouds + realms: + - atmos + variables: + pr: + preprocessor: clim + reference_dataset: GPCP-SG + mip: Amon + additional_datasets: + - {dataset: GPCP-SG, project: obs4MIPs, level: L3, version: v2.2, + start_year: 1986, end_year: 2005, tier: 1} + - {dataset: ACCESS1-0, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: ACCESS1-3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: bcc-csm1-1-m, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: BNU-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CCSM4, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-BGC, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: CESM1-CAM5-1-FV, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CESM1-CAM5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-FASTCHEM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CESM1-WACCM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CMCC-CESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: CMCC-CM, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + # - {dataset: CMCC-CMS, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + # - {dataset: CNRM-CM5-2, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CNRM-CM5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CSIRO-Mk3-6-0, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: FGOALS-g2, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GFDL-CM3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-ESM2G, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-ESM2M, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-H-CC, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: GISS-E2-H, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-R-CC, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-R, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: HadGEM2-CC, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: HadGEM2-ES, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: inmcm4, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-LR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-MR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5B-LR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: MIROC4h, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC-ESM-CHEM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-LR, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-MR, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-P, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MRI-CGCM3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: NorESM1-M, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: NorESM1-ME, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + scripts: + fig09-4: + <<: *fig-9-2_and_9-4_settings + plot_abs_diff: true + plot_rel_diff: true + + # ********************************************************************** + # Flato et al. (2013) - IPCC AR5, chap. 9 + # similar to fig. 9.5 + # ********************************************************************** + # Difference of multi-model mean and reference data set (geographical + # distribution, annual mean) + zonal averages of individual models + # and multi-model mean (annual means). + # ********************************************************************** + + fig09-5a: + title: Fig. 9.5a (shortwave CRE) + description: differences of multi-model mean and reference dataset + themes: + - clouds + realms: + - atmos + variables: + swcre: + preprocessor: clim + reference_dataset: CERES-EBAF + mip: Amon + derive: true + additional_datasets: + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-7, + start_year: 2001, end_year: 2010, tier: 1} + - {dataset: ACCESS1-0, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: ACCESS1-3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: bcc-csm1-1-m, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: BNU-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CCSM4, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-BGC, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: CESM1-CAM5-1-FV, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CESM1-CAM5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-FASTCHEM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CESM1-WACCM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CMCC-CESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: CMCC-CM, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + # - {dataset: CMCC-CMS, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + # - {dataset: CNRM-CM5-2, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CNRM-CM5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CSIRO-Mk3-6-0, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: FGOALS-g2, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GFDL-CM3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-ESM2G, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-ESM2M, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-H-CC, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: GISS-E2-H, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-R-CC, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-R, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: HadGEM2-CC, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: HadGEM2-ES, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: inmcm4, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-LR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-MR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5B-LR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: MIROC4h, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC-ESM-CHEM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-LR, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-MR, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-P, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MRI-CGCM3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: NorESM1-M, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: NorESM1-ME, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + scripts: + fig09-5a: &fig-9-5_settings + script: clouds/clouds_ipcc.ncl + projection: Robinson + colormap: WhiteBlueGreenYellowRed + timemean: annualclim + + fig09-5b: + title: Fig. 9.5b (longwave CRE) + description: differences of multi-model mean and reference dataset + themes: + - clouds + realms: + - atmos + variables: + lwcre: + preprocessor: clim + reference_dataset: CERES-EBAF + mip: Amon + derive: true + additional_datasets: + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-7, + start_year: 2001, end_year: 2010, tier: 1} + - {dataset: ACCESS1-0, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: ACCESS1-3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: bcc-csm1-1-m, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: BNU-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CCSM4, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-BGC, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: CESM1-CAM5-1-FV, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CESM1-CAM5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-FASTCHEM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CESM1-WACCM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CMCC-CESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: CMCC-CM, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + # - {dataset: CMCC-CMS, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + # - {dataset: CNRM-CM5-2, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CNRM-CM5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CSIRO-Mk3-6-0, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: FGOALS-g2, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GFDL-CM3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-ESM2G, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-ESM2M, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-H-CC, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: GISS-E2-H, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-R-CC, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-R, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: HadGEM2-CC, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: HadGEM2-ES, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: inmcm4, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-LR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-MR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5B-LR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: MIROC4h, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC-ESM-CHEM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-LR, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-MR, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-P, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MRI-CGCM3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: NorESM1-M, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: NorESM1-ME, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + scripts: + fig09-5b: + <<: *fig-9-5_settings + + fig09-5c: + title: Fig. 9.5c (net CRE) + description: differences of multi-model mean and reference dataset + themes: + - clouds + realms: + - atmos + variables: + netcre: + preprocessor: clim + reference_dataset: CERES-EBAF + mip: Amon + derive: true + additional_datasets: + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-7, + start_year: 2001, end_year: 2010, tier: 1} + - {dataset: ACCESS1-0, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: ACCESS1-3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: bcc-csm1-1-m, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: BNU-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CCSM4, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-BGC, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: CESM1-CAM5-1-FV, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CESM1-CAM5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CESM1-FASTCHEM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CESM1-WACCM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CMCC-CESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: CMCC-CM, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + # - {dataset: CMCC-CMS, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + # - {dataset: CNRM-CM5-2, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: CNRM-CM5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: CSIRO-Mk3-6-0, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: FGOALS-g2, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GFDL-CM3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-ESM2G, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GFDL-ESM2M, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-H-CC, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: GISS-E2-H, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-R-CC, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: GISS-E2-R, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + # - {dataset: HadGEM2-CC, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: HadGEM2-ES, project: CMIP5, exp: historical, + # ensemble: r1i1p1, start_year: 1986, end_year: 2005} + # - {dataset: inmcm4, project: CMIP5, exp: historical, ensemble: r1i1p1, + # start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-LR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5A-MR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: IPSL-CM5B-LR, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: MIROC4h, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC5, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MIROC-ESM-CHEM, project: CMIP5, exp: historical, + ensemble: r1i1p1, start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-LR, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-MR, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MPI-ESM-P, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: MRI-CGCM3, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: NorESM1-M, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + - {dataset: NorESM1-ME, project: CMIP5, exp: historical, ensemble: r1i1p1, + start_year: 1986, end_year: 2005} + scripts: + fig09-5c: + <<: *fig-9-5_settings + diff --git a/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figures_938_941_cmip3.yml b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figures_938_941_cmip3.yml new file mode 100644 index 0000000000..87749ce222 --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figures_938_941_cmip3.yml @@ -0,0 +1,367 @@ +# ESMValTool +# recipe_flato13ipcc_figures_938_941_cmip3.yml +--- +documentation: + title: IPCC AR5, chap. 9 diagnostics to reproduce regional figures 9.38-9.41 + description: | + Reproducing selected figures from IPCC AR5, chap. 9 (Flato et al., 2013) + 9.38, 9.39, 9.40, 9.41. + Differences to the IPCC version: + - No CMIP3 A1B runs included, therefore the time series stops in 1999 + - CRU data version 4.02 instead of 3.10 + - Not exactly the same CMIP3 and CMIP5 models and version. + Processing of CMIP3 models currently works only in serial mode, due to + an issue in the input data still under investigation. + Data sets comented out are currently not available on DKRZ. + + authors: + - cionni_irene + + maintainer: + - weigel_katja + + references: + - flato13ipcc + - seneviratne12ipcc + + projects: + - crescendo + +datasets: + - &cmip3 {dataset: bccr_bcm2_0, institute: BCCR, project: CMIP3, mip: A1, modeling_realm: atm, exp: 20c3m, frequency: mo, ensemble: run1} + - {<<: *cmip3, dataset: cccma_cgcm3_1, institute: CCCMA} + - {<<: *cmip3, dataset: cccma_cgcm3_1_t63, institute: CCCMA} + - {<<: *cmip3, dataset: csiro_mk3_0, institute: CSIRO} + - {<<: *cmip3, dataset: giss_aom, institute: NASA} + - {<<: *cmip3, dataset: giss_model_e_h, institute: NASA} + - {<<: *cmip3, dataset: giss_model_e_r, institute: NASA} + - {<<: *cmip3, dataset: iap_fgoals1_0_g, institute: LASG} + - {<<: *cmip3, dataset: ingv_echam4, institute: INGV} + - {<<: *cmip3, dataset: inmcm3_0, institute: INM} + - {<<: *cmip3, dataset: ipsl_cm4, institute: IPSL} + - {<<: *cmip3, dataset: miroc3_2_hires, institute: NIES} + - {<<: *cmip3, dataset: miroc3_2_medres, institute: NIES} + - {<<: *cmip3, dataset: mpi_echam5, institute: MPIM} + - {<<: *cmip3, dataset: ncar_ccsm3_0, institute: NCAR} + - {<<: *cmip3, dataset: ncar_pcm1, institute: NCAR} + - {<<: *cmip3, dataset: ukmo_hadcm3, institute: UKMO} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: ACCESS1-0, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: ACCESS1-3, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: BNU-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CCSM4, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CESM1-BGC, project: CMIP5, exp: historical, ensemble: r1i1p1} + # - {dataset: CESM1-CAM5-1-FV, project: CMIP5, exp: historical} + - {dataset: CESM1-CAM5, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CESM1-FASTCHEM, project: CMIP5, exp: historical} + - {dataset: CESM1-WACCM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CMCC-CESM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CMCC-CM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CMCC-CMS, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CNRM-CM5-2, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CNRM-CM5, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CSIRO-Mk3-6-0, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: FGOALS-g2, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GFDL-CM3, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GFDL-ESM2G, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GFDL-ESM2M, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GISS-E2-H-CC, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GISS-E2-H, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GISS-E2-R-CC, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GISS-E2-R, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: HadGEM2-CC, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: HadGEM2-ES, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: inmcm4, project: CMIP5, exp: historical, ensemble: r1i1p1} + # - {dataset: IPSL-CM5A-LR, project: CMIP5, exp: historical, ensemble: r1i1p1} + # - {dataset: IPSL-CM5A-MR, project: CMIP5, exp: historical, ensemble: r1i1p1} + # - {dataset: IPSL-CM5B-LR, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MIROC4h, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MIROC5, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MIROC-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, project: CMIP5, exp: historical} + - {dataset: MPI-ESM-LR, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MPI-ESM-P, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: NorESM1-M, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: NorESM1-ME, project: CMIP5, exp: historical, ensemble: r1i1p1} + + +preprocessors: + annual_cycle: + regrid: + target_grid: reference_dataset + scheme: linear + climate_statistics: + operator: mean + period: month + mask_landsea: + fx_variables: null + mask_out: sea + mask_fillvalues: + threshold_fraction: 0.95 + annual_cycle_pr: + regrid: + target_grid: reference_dataset + scheme: linear + climate_statistics: + operator: mean + period: month + mask_landsea: + fx_variables: null + mask_out: sea + mask_fillvalues: + threshold_fraction: 0.66 + + clima_nomask: + regrid: + target_grid: reference_dataset + scheme: linear + climate_statistics: + operator: mean + period: month + mask_fillvalues: + threshold_fraction: 0.95 + clima_nomask_pr: + regrid: + target_grid: reference_dataset + scheme: linear + climate_statistics: + operator: mean + period: month + mask_fillvalues: + threshold_fraction: 0.66 + regr: + regrid: + target_grid: reference_dataset + scheme: linear + +diagnostics: + + # ========================================================================== + # Chapter 9 - Figure938 + # ========================================================================== + regional_downscaling_Fig938tas: + description: Creates annual cycle regional plots for individual models + and mumltimodel over the selected project&experiemnt&mip + themes: + - chem + realms: + - atmos + variables: + tas: + preprocessor: annual_cycle + reference_dataset: ERA-Interim + mip: Amon + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} + - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + scripts: + clim: &Fig938_settings + script: regional_downscaling/Figure9.38.ncl + styleset: CMIP356 + fig938_region_label: ["WNA", "ENA", "CAM", "TSA", "SSA", "EUM", "NAF", + "CAF", "SAF", "NAS", "CAS", "EAS", "SAS", "SEA", + "AUS"] + fig938_project_MMM: ["CMIP5", "CMIP3"] + fig938_experiment_MMM: ["historical", "20c3m"] + fig938_mip_MMM: ["Amon", "A1"] + fig938_colors_MMM: ["red", "blue"] + fig938_refModel: ERA-Interim + fig938_MMM: true + fig938_diff: false + regional_downscaling_Fig938pr: + description: Creates annual cycle regional plots for individual models + and mumltimodel over the selected project&experiemnt&mip + themes: + - chem + realms: + - atmos + variables: + pr: + preprocessor: annual_cycle_pr + reference_dataset: ERA-Interim + mip: Amon + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} + - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + scripts: + clim: + <<: *Fig938_settings + + # ========================================================================== + # Chapter 9 - Figure939 + # ========================================================================== + regional_downscaling_Fig939tas: + description: Creates seasonal or annual bias box plots at selected + regions over the selected project&experiemnt&mip over + the selected project&experiemnt&mip + themes: + - chem + realms: + - atmos + variables: + tas: + preprocessor: annual_cycle + reference_dataset: CRU + mip: Amon + ensemble: r1i1p1 + start_year: 1986 + end_year: 1999 + additional_datasets: + - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + + scripts: + clim: &Fig939_settings + script: regional_downscaling/Figure9.39.ncl + styleset: CMIP356 + fig939_season: ["DJF", "JJA", "ANN"] + fig939_region_label: ["ALAs", "CGIs", "WNAs", "CNAs", "ENAs", "CAMs", + "AMZs", "NEBs", "WSAs", "SSAs", "NEUs", "CEUs", + "MEDs", "SAHs", "WAFs", "EAFs", "SAFs", "NASs", + "WASs", "CASs", "TIBs", "EASs", "SASs", "SEAs", + "NAUs", "SAUs"] + fig939_project_MMM: ["CMIP5", "CMIP3"] + fig939_experiment_MMM: ["historical", "20c3m"] + fig939_mip_MMM: ["Amon", "A1"] + fig939_MMM: true + fig939_YMin: -11 + fig939_YMax: 8 + + regional_downscaling_Fig939pr: + description: Creates seasonal or annual bias box plots at selected + regions over the selected project&experiemnt&mip over + the selected project&experiemnt&mip + themes: + - chem + realms: + - atmos + variables: + pr: + preprocessor: annual_cycle_pr + reference_dataset: CRU + mip: Amon + ensemble: r1i1p1 + start_year: 1986 + end_year: 1999 + additional_datasets: + - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + + scripts: + clim: + script: regional_downscaling/Figure9.39.ncl + styleset: CMIP356 + fig939_season: ["ONDJFM", "AMJJAS", "ANN"] + fig939_region_label: ["ALAs", "CGIs", "WNAs", "CNAs", "ENAs", "CAMs", + "AMZs", "NEBs", "WSAs", "SSAs", "NEUs", "CEUs", + "MEDs", "SAHs", "WAFs", "EAFs", "SAFs", "NASs", + "WASs", "CASs", "TIBs", "EASs", "SASs", "SEAs", + "NAUs", "SAUs"] + fig939_project_MMM: ["CMIP5", "CMIP3"] + fig939_experiment_MMM: ["historical", "20c3m"] + fig939_mip_MMM: ["Amon", "A1"] + fig939_MMM: true + fig939_mode: true + fig939_YMin: -100 + fig939_YMax: 300 + + + # ========================================================================== + # Chapter 9 - Figure940 + # ========================================================================== + regional_downscaling_Fig940tas: + description: Creates annual cycle regional plots for individual models + and mumltimodel over the selected project&experiemnt&mip. + themes: + - chem + realms: + - atmos + variables: + tas: + preprocessor: clima_nomask + reference_dataset: CRU + mip: Amon + ensemble: r1i1p1 + start_year: 1986 + end_year: 1999 + additional_datasets: + - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + scripts: + clim: &Fig940_settings + script: regional_downscaling/Figure9.40.ncl + styleset: CMIP356 + fig940_season: ["DJF", "JJA", "ANN"] + fig940_region_label: ["Arctic_land", "Arctic_sea", "Antarctic_land", + "Antarctic_sea", "Caribbean", + "WesternIndianOcean", + "NorthernIndianOcean", "NorthernTropicalPacific", + "EquatorialTropicalPacific", + "SouthernTropicalPacific", "World_land", + "World_sea", "World"] + fig940_project_MMM: ["CMIP5", "CMIP3"] + fig940_experiment_MMM: ["historical", "20c3m"] + fig940_mip_MMM: ["Amon", "A1"] + fig940_MMM: true + fig940_YMin: -12 + fig940_YMax: 6 + + regional_downscaling_Fig940pr: + description: Creates annual cycle regional plots for individual models + and mumltimodel over the selected project&experiemnt&mip. + themes: + - chem + realms: + - atmos + variables: + pr: + preprocessor: clima_nomask_pr + reference_dataset: CRU + mip: Amon + ensemble: r1i1p1 + start_year: 1986 + end_year: 1999 + additional_datasets: + - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + scripts: + clim: + <<: *Fig940_settings + fig940_mode: true + fig940_season: ["ONDJFM", "AMJJAS", "ANN"] + fig940_YMin: -100 + fig940_YMax: 150 + + + + # ========================================================================== + # Chapter 9 - Figure941 + # ========================================================================== + regional_downscaling_Fig941: + description: + themes: + - chem + realms: + - atmos + variables: + tas: + preprocessor: regr + reference_dataset: CRU + mip: Amon + ensemble: r1i1p1 + start_year: 1961 + end_year: 1999 + additional_datasets: + - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + scripts: + clim: &Fig941_settings + script: regional_downscaling/Figure9.41.ncl + fig941_region_label: ["MEDs"] + styleset: CMIP356 diff --git a/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figures_938_941_cmip6.yml b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figures_938_941_cmip6.yml new file mode 100644 index 0000000000..f679af0a8c --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_flato13ipcc_figures_938_941_cmip6.yml @@ -0,0 +1,367 @@ +# ESMValTool +# recipe_flato13ipcc_figures_938_941_cmip6.yml +--- +documentation: + title: IPCC AR5, chap. 9 diagnostics to reproduce regional figures 9.38-9.41 + unsing CMIP6 data + description: | + Reproducing selected figures from IPCC AR5, chap. 9 (Flato et al., 2013) + 9.38, 9.39, 9.40, 9.41. + Differences to the IPCC version: + - CMIP6 instead of CMIP3 data + - CRU data version 4.02 instead of 3.10 + - Not exactly the same CMIP5 models and version. + + authors: + - cionni_irene + + maintainer: + - weigel_katja + + references: + - flato13ipcc + - seneviratne12ipcc + + projects: + - crescendo + +datasets: + - {dataset: ACCESS1-0, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: ACCESS1-3, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: BNU-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CCSM4, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CESM1-BGC, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CESM1-CAM5, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CESM1-FASTCHEM, project: CMIP5, exp: historical} + - {dataset: CESM1-WACCM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CMCC-CESM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CMCC-CM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CMCC-CMS, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CNRM-CM5-2, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CNRM-CM5, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CSIRO-Mk3-6-0, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: FGOALS-g2, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GFDL-CM3, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GFDL-ESM2G, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GFDL-ESM2M, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GISS-E2-H-CC, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GISS-E2-H, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GISS-E2-R-CC, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GISS-E2-R, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: HadGEM2-CC, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: HadGEM2-ES, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: inmcm4, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MIROC4h, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MIROC5, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MIROC-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, project: CMIP5, exp: historical} + - {dataset: MPI-ESM-LR, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MPI-ESM-P, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: NorESM1-M, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: NorESM1-ME, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: BCC-CSM2-MR, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-ESM1, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {dataset: CAMS-CSM1-0, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {dataset: CanESM5, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {dataset: CESM2-WACCM, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn, institute: NCAR} + - {dataset: CNRM-CM6-1, project: CMIP6, exp: historical, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, project: CMIP6, exp: historical, ensemble: r1i1p1f2, grid: gr} + - {dataset: E3SM-1-0, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gr} + - {dataset: EC-Earth3-Veg, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gr} + - {dataset: GFDL-CM4, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GFDL-ESM4, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-G, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {dataset: GISS-E2-1-H, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, project: CMIP6, exp: historical, ensemble: r1i1p1f3, grid: gn} + - {dataset: IPSL-CM6A-LR, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gr} + - {dataset: MIROC6, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, project: CMIP6, exp: historical, ensemble: r1i1p1f2, grid: gn} + - {dataset: MPI-ESM1-2-HR, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {dataset: NESM3, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn} + - {dataset: SAM0-UNICON, project: CMIP6, exp: historical, ensemble: r1i1p1f1, grid: gn} + + +preprocessors: + annual_cycle: + regrid: + target_grid: reference_dataset + scheme: linear + climate_statistics: + operator: mean + period: month + mask_landsea: + fx_variables: null + mask_out: sea + mask_fillvalues: + threshold_fraction: 0.95 + annual_cycle_pr: + regrid: + target_grid: reference_dataset + scheme: linear + climate_statistics: + operator: mean + period: month + mask_landsea: + fx_variables: null + mask_out: sea + mask_fillvalues: + threshold_fraction: 0.66 + + clima_nomask: + regrid: + target_grid: reference_dataset + scheme: linear + climate_statistics: + operator: mean + period: month + mask_fillvalues: + threshold_fraction: 0.95 + clima_nomask_pr: + regrid: + target_grid: reference_dataset + scheme: linear + climate_statistics: + operator: mean + period: month + mask_fillvalues: + threshold_fraction: 0.66 + regr: + regrid: + target_grid: reference_dataset + scheme: linear + +diagnostics: + + # ========================================================================== + # Chapter 9 - Figure938 + # ========================================================================== + regional_downscaling_Fig938tas: + description: Creates annual cycle regional plots for individual models + and mumltimodel over the selected project&experiemnt&mip + themes: + - chem + realms: + - atmos + variables: + tas: + preprocessor: annual_cycle + reference_dataset: ERA-Interim + mip: Amon + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} + - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + scripts: + clim: &Fig938_settings + script: regional_downscaling/Figure9.38.ncl + styleset: CMIP356 + fig938_region_label: ["WNA", "ENA", "CAM", "TSA", "SSA", "EUM", "NAF", + "CAF", "SAF", "NAS", "CAS", "EAS", "SAS", "SEA", + "AUS"] + fig938_project_MMM: ["CMIP5", "CMIP6"] + fig938_experiment_MMM: ["historical", "historical"] + fig938_mip_MMM: ["Amon", "Amon"] + fig938_colors_MMM: ["red", "blue"] + fig938_refModel: ERA-Interim + fig938_MMM: true + fig938_diff: false + + + regional_downscaling_Fig938pr: + description: Creates annual cycle regional plots for individual models + and mumltimodel over the selected project&experiemnt&mip + themes: + - chem + realms: + - atmos + variables: + pr: + preprocessor: annual_cycle_pr + reference_dataset: ERA-Interim + mip: Amon + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} + - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + scripts: + clim: + <<: *Fig938_settings + + # ========================================================================== + # Chapter 9 - Figure939 + # ========================================================================== + regional_downscaling_Fig939tas: + description: Creates seasonal or annual bias box plots at selected + regions over the selected project&experiemnt&mip over + the selected project&experiemnt&mip + themes: + - chem + realms: + - atmos + variables: + tas: + preprocessor: annual_cycle + reference_dataset: CRU + mip: Amon + ensemble: r1i1p1 + start_year: 1980 + end_year: 2005 + additional_datasets: + - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + + scripts: + clim: &Fig939_settings + script: regional_downscaling/Figure9.39.ncl + styleset: CMIP356 + fig939_season: ["DJF", "JJA", "ANN"] + fig939_region_label: ["ALAs", "CGIs", "WNAs", "CNAs", "ENAs", "CAMs", + "AMZs", "NEBs", "WSAs", "SSAs", "NEUs", "CEUs", + "MEDs", "SAHs", "WAFs", "EAFs", "SAFs", "NASs", + "WASs", "CASs", "TIBs", "EASs", "SASs", "SEAs", + "NAUs", "SAUs"] + fig939_project_MMM: ["CMIP5", "CMIP6"] + fig939_experiment_MMM: ["historical", "historical"] + fig939_mip_MMM: ["Amon", "Amon"] + fig939_MMM: true + fig939_YMin: -11 + fig939_YMax: 8 + + regional_downscaling_Fig939pr: + description: Creates seasonal or annual bias box plots at selected + regions over the selected project&experiemnt&mip over + the selected project&experiemnt&mip + themes: + - chem + realms: + - atmos + variables: + pr: + preprocessor: annual_cycle_pr + reference_dataset: CRU + mip: Amon + ensemble: r1i1p1 + start_year: 1980 + end_year: 2005 + additional_datasets: + - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + + scripts: + clim: + script: regional_downscaling/Figure9.39.ncl + styleset: CMIP356 + fig939_season: ["ONDJFM", "AMJJAS", "ANN"] + fig939_region_label: ["ALAs", "CGIs", "WNAs", "CNAs", "ENAs", "CAMs", + "AMZs", "NEBs", "WSAs", "SSAs", "NEUs", "CEUs", + "MEDs", "SAHs", "WAFs", "EAFs", "SAFs", "NASs", + "WASs", "CASs", "TIBs", "EASs", "SASs", "SEAs", + "NAUs", "SAUs"] + fig939_project_MMM: ["CMIP5", "CMIP6"] + fig939_experiment_MMM: ["historical", "historical"] + fig939_mip_MMM: ["Amon", "Amon"] + fig939_MMM: true + fig939_mode: true + fig939_YMin: -100 + fig939_YMax: 300 + + # ========================================================================== + # Chapter 9 - Figure940 + # ========================================================================== + regional_downscaling_Fig940tas: + description: Creates annual cycle regional plots for individual models + and mumltimodel over the selected project&experiemnt&mip. + themes: + - chem + realms: + - atmos + variables: + tas: + preprocessor: clima_nomask + reference_dataset: ERA-Interim + mip: Amon + ensemble: r1i1p1 + start_year: 1980 + end_year: 2005 + additional_datasets: + # - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} + scripts: + clim: &Fig940_settings + script: regional_downscaling/Figure9.40.ncl + styleset: CMIP356 + fig940_season: ["DJF", "JJA", "ANN"] + fig940_region_label: ["Arctic_land", "Arctic_sea", "Antarctic_land", + "Antarctic_sea", "Caribbean", + "WesternIndianOcean", + "NorthernIndianOcean", "NorthernTropicalPacific", + "EquatorialTropicalPacific", + "SouthernTropicalPacific", "World_land", + "World_sea", "World"] + fig940_project_MMM: ["CMIP5", "CMIP6"] + fig940_experiment_MMM: ["historical", "historical"] + fig940_mip_MMM: ["Amon", "Amon"] + fig940_MMM: true + fig940_YMin: -12 + fig940_YMax: 6 + + regional_downscaling_Fig940pr: + description: Creates annual cycle regional plots for individual models + and mumltimodel over the selected project&experiemnt&mip. + themes: + - chem + realms: + - atmos + variables: + pr: + preprocessor: clima_nomask_pr + reference_dataset: GPCP-SG + mip: Amon + ensemble: r1i1p1 + start_year: 1980 + end_year: 2005 + additional_datasets: + - {dataset: GPCP-SG, project: OBS, project: obs4MIPs, level: L3, version: v2.2, tier: 1} + # - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + scripts: + clim: + <<: *Fig940_settings + fig940_mode: true + fig940_season: ["ONDJFM", "AMJJAS", "ANN"] + fig940_YMin: -100 + fig940_YMax: 150 + + + # ========================================================================== + # Chapter 9 - Figure941 + # ========================================================================== + regional_downscaling_Fig941: + description: + themes: + - chem + realms: + - atmos + variables: + tas: + preprocessor: regr + reference_dataset: CRU + mip: Amon + ensemble: r1i1p1 + start_year: 1961 + end_year: 2000 + additional_datasets: + - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + scripts: + clim: &Fig941_settings + script: regional_downscaling/Figure9.41.ncl + fig941_region_label: ["MEDs"] + styleset: CMIP356 diff --git a/esmvaltool/recipes/ipccwg1ar5ch9/recipe_weigel21gmd_figures_13_16.yml b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_weigel21gmd_figures_13_16.yml new file mode 100644 index 0000000000..f8500b5547 --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar5ch9/recipe_weigel21gmd_figures_13_16.yml @@ -0,0 +1,240 @@ +# ESMValTool +# recipe_weigel21gmd_figures_13_16.yml +--- +documentation: + title: Figures from Weigel et al. (2021), + similar but reduces version of IPCC AR5, chap. 9 + regional figures 9.38-9.41 only containing CMIP5 data. + + description: | + Reproducing figures from Weigel et al. (2021) based on + the analysis shown in IPCC AR5, chap. 9 (Flato et al., 2013) + 9.38, 9.39, 9.40, 9.41. + Data sets comented out were part of the original publication but are + currently not available on ESGF. + + authors: + - cionni_irene + + maintainer: + - weigel_katja + + references: + - flato13ipcc + - seneviratne12ipcc + - weigel2021gmd + + projects: + - crescendo + +datasets: + - {dataset: ACCESS1-0, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: ACCESS1-3, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: bcc-csm1-1-m, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: BNU-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CCSM4, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CESM1-BGC, project: CMIP5, exp: historical, ensemble: r1i1p1} + # - {dataset: CESM1-CAM5-1-FV, project: CMIP5, exp: historical} + - {dataset: CESM1-CAM5, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CESM1-FASTCHEM, project: CMIP5, exp: historical} + - {dataset: CESM1-WACCM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CMCC-CESM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CMCC-CM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CMCC-CMS, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CNRM-CM5-2, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CNRM-CM5, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: CSIRO-Mk3-6-0, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: FGOALS-g2, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GFDL-CM3, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GFDL-ESM2G, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GFDL-ESM2M, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GISS-E2-H-CC, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GISS-E2-H, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GISS-E2-R-CC, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: GISS-E2-R, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: HadGEM2-CC, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: HadGEM2-ES, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: inmcm4, project: CMIP5, exp: historical, ensemble: r1i1p1} + # - {dataset: IPSL-CM5A-LR, project: CMIP5, exp: historical, ensemble: r1i1p1} + # - {dataset: IPSL-CM5A-MR, project: CMIP5, exp: historical, ensemble: r1i1p1} + # - {dataset: IPSL-CM5B-LR, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MIROC4h, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MIROC5, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MIROC-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MIROC-ESM-CHEM, project: CMIP5, exp: historical} + - {dataset: MPI-ESM-LR, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MPI-ESM-MR, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MPI-ESM-P, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: MRI-CGCM3, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: NorESM1-M, project: CMIP5, exp: historical, ensemble: r1i1p1} + - {dataset: NorESM1-ME, project: CMIP5, exp: historical, ensemble: r1i1p1} + + +preprocessors: + annual_cycle: + regrid: + target_grid: reference_dataset + scheme: linear + climate_statistics: + operator: mean + period: month + mask_landsea: + fx_variables: null + mask_out: sea + mask_fillvalues: + threshold_fraction: 0.95 + + clima_nomask: + regrid: + target_grid: reference_dataset + scheme: linear + climate_statistics: + operator: mean + period: month + mask_fillvalues: + threshold_fraction: 0.95 + regr: + regrid: + target_grid: reference_dataset + scheme: linear + +diagnostics: + + # ========================================================================== + # Chapter 9 - Figure938 + # ========================================================================== + regional_downscaling_Fig938: + description: Creates annual cycle regional plots for individual models + and multimodel over the selected project&experiemnt&mip. + themes: + - chem + realms: + - atmos + variables: + tas: + preprocessor: annual_cycle + reference_dataset: ERA-Interim + mip: Amon + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, + tier: 3} + scripts: + clim: &Fig938_settings + script: regional_downscaling/Figure9.38.ncl + styleset: CMIP5 + fig938_region_label: ["WNA", "ENA", "CAM", "TSA", "SSA", "EUM", "NAF", + "CAF", "SAF", "NAS", "CAS", "EAS", "SAS", "SEA", + "AUS"] + fig938_project_MMM: ["CMIP5"] + fig938_experiment_MMM: ["historical"] + fig938_mip_MMM: ["Amon"] + fig938_colors_MMM: ["red"] + fig938_refModel: ERA-Interim + fig938_MMM: true + fig938_diff: true + + # ========================================================================== + # Chapter 9 - Figure939 + # ========================================================================== + regional_downscaling_Fig939: + description: Creates seasonal or annual bias box plots at selected + regions over the selected project&experiemnt&mip. + themes: + - chem + realms: + - atmos + variables: + tas: + preprocessor: annual_cycle + reference_dataset: ERA-Interim + mip: Amon + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, + tier: 3} + + scripts: + clim: &Fig939_settings + script: regional_downscaling/Figure9.39.ncl + styleset: CMIP5 + fig939_season: ["DJF", "JJA", "ANN"] + fig939_region_label: ["ALAs", "CGIs", "WNAs", "CNAs", "ENAs", "CAMs", + "AMZs", "NEBs", "WSAs", "SSAs", "NEUs", "CEUs", + "MEDs", "SAHs", "WAFs", "EAFs", "SAFs", "NASs", + "WASs", "CASs", "TIBs", "EASs", "SASs", "SEAs", + "NAUs", "SAUs"] + fig939_project_MMM: ["CMIP5"] + fig939_experiment_MMM: ["historical"] + fig939_mip_MMM: ["Amon"] + fig939_MMM: true + + # ========================================================================== + # Chapter 9 - Figure940 + # ========================================================================== + regional_downscaling_Fig940: + description: Creates annual cycle regional plots for individual models + and multimodel over the selected project&experiemnt&mip. + themes: + - chem + realms: + - atmos + variables: + pr: + preprocessor: clima_nomask + reference_dataset: CRU + mip: Amon + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + additional_datasets: + - {dataset: CRU, project: OBS, type: reanaly, version: TS4.02, tier: 2} + scripts: + clim: &Fig940_settings + script: regional_downscaling/Figure9.40.ncl + styleset: CMIP5 + fig940_season: ["DJF", "JJA", "ANN"] + fig940_region_label: ["Arctic_land", "Arctic_sea", "Antarctic_land", + "Antarctic_sea", "Caribbean", + "WesternIndianOcean", + "NorthernIndianOcean", "NorthernTropicalPacific", + "EquatorialTropicalPacific", + "SouthernTropicalPacific", "World_land", + "World_sea", "World"] + fig940_project_MMM: ["CMIP5"] + fig940_experiment_MMM: ["historical"] + fig940_mip_MMM: ["Amon"] + fig940_MMM: true + + # ========================================================================== + # Chapter 9 - Figure941 + # ========================================================================== + regional_downscaling_Fig941: + description: Creates ranked modelled versus reference data set + regional mean temperature plots. + themes: + - chem + realms: + - atmos + variables: + tas: + preprocessor: regr + reference_dataset: ERA-Interim + mip: Amon + ensemble: r1i1p1 + start_year: 1979 + end_year: 2000 + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, + tier: 3} + scripts: + clim: &Fig941_settings + script: regional_downscaling/Figure9.41.ncl + fig941_region_label: ["MEDs"] + styleset: CMIP5 diff --git a/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_atmosphere.yml b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_atmosphere.yml index e5f360765a..316f24bcb5 100644 --- a/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_atmosphere.yml +++ b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_atmosphere.yml @@ -696,7 +696,7 @@ diagnostics: end_year: 2014 additional_datasets: *models_cmip6_historical additional_datasets: - - {dataset: ERA5, project: native6, type: reanaly, version: '1', tier: 3} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} scripts: fig_3_3: script: ipcc_ar6/model_bias.ncl @@ -724,7 +724,7 @@ diagnostics: end_year: 2004 additional_datasets: *models_cmip5_historical additional_datasets: - - {dataset: ERA5, project: native6, type: reanaly, version: '1', tier: 3} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} scripts: fig_3_3: script: ipcc_ar6/model_bias.ncl diff --git a/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_19.yml b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_19.yml new file mode 100644 index 0000000000..41731ba420 --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_19.yml @@ -0,0 +1,136 @@ +# ESMValTool +# recipe_ipccwg1ar6ch3_fig_3_19.yml +--- +documentation: + + title: IPCC AR6 WG1 Chapter 3 Fig. 3.19 + + description: | + Producing Fig. 3.19 in the IPCC Working Group I Contribution to the Sixth + Assessment Report: Chapter 3 + + authors: + - bock_lisa + - eyring_veronika + + maintainer: + - bock_lisa + + projects: + - ipcc_ar6 + + references: + - eyring21ipcc + + +datasets: + # CMIP6 + - {dataset: ACCESS-CM2, grid: gn, institute: CSIRO-ARCCSS} + - {dataset: ACCESS-ESM1-5, grid: gn, institute: CSIRO} + - {dataset: AWI-CM-1-1-MR, grid: gn} + - {dataset: AWI-ESM-1-1-LR, grid: gn} + - {dataset: BCC-CSM2-MR, grid: gn} + - {dataset: BCC-ESM1, grid: gn} + - {dataset: CAMS-CSM1-0, grid: gn} + - {dataset: CanESM5, grid: gn} + - {dataset: CanESM5-CanOE, ensemble: r1i1p2f1, grid: gn} + - {dataset: CAS-ESM2-0, institute: CAS, grid: gn} + - {dataset: CESM2, grid: gn} + - {dataset: CESM2-FV2, grid: gn, institute: NCAR} + - {dataset: CESM2-WACCM, grid: gn, institute: NCAR} + - {dataset: CESM2-WACCM-FV2, grid: gn, institute: NCAR} + - {dataset: CIESM} + - {dataset: CMCC-CM2-HR4, grid: gn} + - {dataset: CMCC-CM2-SR5, grid: gn} + - {dataset: CMCC-ESM2, ensemble: r1i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2} + - {dataset: E3SM-1-0} + - {dataset: E3SM-1-1-ECA, institute: E3SM-Project} + - {dataset: EC-Earth3} + - {dataset: EC-Earth3-AerChem} + - {dataset: EC-Earth3-CC} + - {dataset: EC-Earth3-Veg} + - {dataset: EC-Earth3-Veg-LR} + - {dataset: FGOALS-f3-L} + - {dataset: FGOALS-g3, grid: gn} + - {dataset: GFDL-CM4, grid: gr1} + - {dataset: GFDL-ESM4, grid: gr1} + - {dataset: GISS-E2-1-G, grid: gn} + - {dataset: GISS-E2-1-G-CC, grid: gn} + - {dataset: GISS-E2-1-H, grid: gn} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn} + - {dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3, grid: gn} + - {dataset: IITM-ESM, grid: gn} + - {dataset: INM-CM4-8, grid: gr1} + - {dataset: INM-CM5-0, grid: gr1} + - {dataset: IPSL-CM5A2-INCA} + - {dataset: IPSL-CM6A-LR} + - {dataset: KACE-1-0-G} + - {dataset: KIOST-ESM, grid: gr1} + - {dataset: MCM-UA-1-0, grid: gn} + - {dataset: MIROC6, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: MPI-ESM-1-2-HAM, grid: gn} + - {dataset: MPI-ESM1-2-HR, grid: gn} + - {dataset: MPI-ESM1-2-LR, grid: gn} + - {dataset: MRI-ESM2-0, grid: gn} + - {dataset: NESM3, grid: gn} + - {dataset: NorCPM1, grid: gn, institute: NCC} + - {dataset: NorESM2-LM, grid: gn, institute: NCC} + - {dataset: NorESM2-MM, grid: gn, institute: NCC} + - {dataset: SAM0-UNICON, grid: gn} + - {dataset: TaiESM1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + + +preprocessors: + zonal: + regrid: + target_grid: 2x2 + scheme: linear + extract_levels: + scheme: linear + levels: reference_dataset + zonal_statistics: + operator: mean + mask_fillvalues: + threshold_fraction: 0.95 + + +diagnostics: + + # ********************************************************************** + # IPCC WGI AR6, chap. 3 + # Sect. 3.3 + # Fig. 3.19 + # ********************************************************************** + # Longterm mean and trend of the zonal wind + # ********************************************************************** + + fig_3_19: + description: Longterm mean and trend zonal wind + themes: + - atmDyn + realms: + - atmos + variables: + ua: + preprocessor: zonal + reference_dataset: ERA5 + project: CMIP6 + mip: Amon + exp: historical + grid: gr + ensemble: r1i1p1f1 + start_year: 1985 + end_year: 2014 + additional_datasets: + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + scripts: + clim: + script: ipcc_ar6/zonal_westerly_winds.ncl + e13fig12_exp_MMM: "historical" + e13fig12_season: "DJF" + e13fig12_multimean: True diff --git a/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_a.yml b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_a.yml new file mode 100644 index 0000000000..20b0402a23 --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_a.yml @@ -0,0 +1,886 @@ +# ESMValTool +# recipe_ipccwg1ar6ch3_fig_3_42_a.yml +--- +documentation: + + title: IPCC AR6 WG1 Chapter 3 Fig. 3.42a + + description: | + Producing Fig. 3.42a in the IPCC Working Group I + Contribution to the Sixth Assessment Report: Chapter 3 + Processing of CMIP3 models currently works only in serial mode, due to + an issue in the input data still under investigation. To run the recipe + set: max_parallel_tasks: 1 in the config-user.yml file. + + authors: + - bock_lisa + - eyring_veronika + + maintainer: + - bock_lisa + + references: + - eyring21ipcc + + projects: + - ipcc_ar6 + + +preprocessors: + + pp850_1x1: + extract_levels: + levels: 85000 + scheme: linear + regrid: + target_grid: 1x1 + scheme: linear + mask_fillvalues: + threshold_fraction: 0.95 + + pp500_1x1: + extract_levels: + levels: 50000 + scheme: linear + regrid: + target_grid: 1x1 + scheme: linear + mask_fillvalues: + threshold_fraction: 0.95 + + pp400_1x1: + extract_levels: + levels: 40000 + scheme: linear + regrid: + target_grid: 1x1 + scheme: linear + mask_fillvalues: + threshold_fraction: 0.95 + + pp200_1x1: + extract_levels: + levels: 19900 + scheme: linear + regrid: + target_grid: 1x1 + scheme: linear + mask_fillvalues: + threshold_fraction: 0.95 + + ppNOLEV1: + regrid: + target_grid: reference_dataset + scheme: linear + mask_fillvalues: + threshold_fraction: 0.95 + + ppNOLEV1x1: + regrid: + target_grid: 1x1 + scheme: linear + mask_fillvalues: + threshold_fraction: 0.95 + + +datasets: + # CMIP3 + - &cmip3 {dataset: cccma_cgcm3_1, institute: CCCMA, project: CMIP3, mip: A1, + modeling_realm: atm, exp: 20c3m, frequency: mo, ensemble: run1} + - {<<: *cmip3, dataset: cccma_cgcm3_1_t63, institute: CCCMA} + - {<<: *cmip3, dataset: csiro_mk3_0, institute: CSIRO} + - {<<: *cmip3, dataset: gfdl_cm2_0, institute: GFDL} + - {<<: *cmip3, dataset: gfdl_cm2_1, institute: GFDL} + - {<<: *cmip3, dataset: giss_model_e_h, institute: NASA} + - {<<: *cmip3, dataset: giss_model_e_r, institute: NASA} + - {<<: *cmip3, dataset: iap_fgoals1_0_g, institute: LASG} + - {<<: *cmip3, dataset: inmcm3_0, institute: INM} + - {<<: *cmip3, dataset: ipsl_cm4, institute: IPSL} + - {<<: *cmip3, dataset: miroc3_2_hires, institute: NIES} + - {<<: *cmip3, dataset: miroc3_2_medres, institute: NIES} + - {<<: *cmip3, dataset: mpi_echam5, institute: MPIM} + - {<<: *cmip3, dataset: mri_cgcm2_3_2a, institute: MRI} + - {<<: *cmip3, dataset: ncar_ccsm3_0, institute: NCAR} + - {<<: *cmip3, dataset: ncar_pcm1, institute: NCAR} + - {<<: *cmip3, dataset: ukmo_hadcm3, institute: UKMO} + # CMIP5 + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CM} + - {dataset: CNRM-CM5} + - {dataset: CSIRO-Mk3-6-0} + - {dataset: FGOALS-g2} + - {dataset: FIO-ESM} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: HadGEM2-AO} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + # CMIP6 + - &cmip6 {dataset: ACCESS-CM2, grid: gn, + ensemble: r1i1p1f1, project: CMIP6} + - {<<: *cmip6, dataset: ACCESS-ESM1-5, institute: CSIRO} + - {<<: *cmip6, dataset: AWI-CM-1-1-MR} + - {<<: *cmip6, dataset: AWI-ESM-1-1-LR} + - {<<: *cmip6, dataset: BCC-CSM2-MR} + - {<<: *cmip6, dataset: CAMS-CSM1-0} + - {<<: *cmip6, dataset: CanESM5} + - {<<: *cmip6, dataset: CanESM5-CanOE, ensemble: r1i1p2f1} + - {<<: *cmip6, dataset: CESM2} + - {<<: *cmip6, dataset: CESM2-FV2, institute: NCAR} + - {<<: *cmip6, dataset: CESM2-WACCM, institute: NCAR} + - {<<: *cmip6, dataset: CESM2-WACCM-FV2, institute: NCAR} + - {<<: *cmip6, dataset: CIESM, grid: gr} + - {<<: *cmip6, dataset: CMCC-CM2-HR4} + - {<<: *cmip6, dataset: CMCC-CM2-SR5} + - {<<: *cmip6, dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {<<: *cmip6, dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {<<: *cmip6, dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg-LR, grid: gr} + - {<<: *cmip6, dataset: FGOALS-f3-L, grid: gr} + - {<<: *cmip6, dataset: FGOALS-g3} + - {<<: *cmip6, dataset: GFDL-CM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G} + - {<<: *cmip6, dataset: GISS-E2-1-H} + - {<<: *cmip6, dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3} + - {<<: *cmip6, dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3} + - {<<: *cmip6, dataset: IITM-ESM} + - {<<: *cmip6, dataset: INM-CM4-8, grid: gr1} + - {<<: *cmip6, dataset: INM-CM5-0, grid: gr1} + - {<<: *cmip6, dataset: IPSL-CM6A-LR, grid: gr} + - {<<: *cmip6, dataset: MIROC6} + - {<<: *cmip6, dataset: MIROC-ES2L, ensemble: r1i1p1f2} + - {<<: *cmip6, dataset: MPI-ESM-1-2-HAM} + - {<<: *cmip6, dataset: MPI-ESM1-2-LR} + - {<<: *cmip6, dataset: MPI-ESM1-2-HR} + - {<<: *cmip6, dataset: MRI-ESM2-0} + - {<<: *cmip6, dataset: NESM3} + - {<<: *cmip6, dataset: NorCPM1, institute: NCC, ensemble: r10i1p1f1} + - {<<: *cmip6, dataset: NorESM2-LM, institute: NCC} + - {<<: *cmip6, dataset: NorESM2-MM, institute: NCC} + - {<<: *cmip6, dataset: SAM0-UNICON} + - {<<: *cmip6, dataset: TaiESM1} + - {<<: *cmip6, dataset: UKESM1-0-LL, ensemble: r1i1p1f2} + + +diagnostics: + + # ********************************************************************** + # IPCC WGI AR6, chap. 3 + # Sect. 3.8 + # Fig. 3.42a + # ********************************************************************** + # Perfmetrics of atmosphere vars for CMIP3, CMIP5, CMIP6 + # ********************************************************************** + + tas: &perf_diag + description: Calculate space-time root mean square error + variables: + tas: &perf_var + preprocessor: ppNOLEV1x1 + mip: Amon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + reference_dataset: ERA5 + alternative_dataset: NCEP-NCAR-R1 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} + scripts: + grading: &grading_settings + script: perfmetrics/main.ncl + # Plot type ('cycle', 'zonal', 'latlon', 'cycle_latlon', 'cycle_zonal') + plot_type: cycle_latlon + # Time average ('opt' argument of time_operations.ncl) + time_avg: monthlyclim + # Region ('global', 'trop', 'nhext', 'shext') + region: global + # Plot standard deviation ('all', 'none', 'ref_model' or dataset name) + plot_stddev: ref_model + # Plot legend in a separate file + legend_outside: true + # Plot style + styleset: CMIP5 + # Calculate grading + calc_grading: true + # Metric ('RMSD', 'BIAS', taylor') + metric: [RMSD] + # Normalization ('mean', 'median', 'centered_median', 'none') + normalization: [centered_median] + + + ts: + <<: *perf_diag + variables: + ts: + <<: *perf_var + reference_dataset: ESACCI-SST + alternative_dataset: HadISST + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ESACCI-SST, project: OBS, type: sat, + version: L4-GHRSST-SSTdepth-OSTIA-GLOB, tier: 2, start_year: 1992} + - {dataset: HadISST, project: OBS, type: reanaly, version: 1, tier: 2} + + + pr: + <<: *perf_diag + variables: + pr: + <<: *perf_var + preprocessor: ppNOLEV1 + reference_dataset: GPCP-SG + alternative_dataset: GHCN + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: GPCP-SG, project: obs4MIPs, level: L3, version: v2.3, tier: 1} + - {dataset: GHCN, project: OBS, type: ground, version: 1, tier: 2} + + + zg500: + <<: *perf_diag + variables: + zg: + <<: *perf_var + preprocessor: pp500_1x1 + reference_dataset: ERA5 + alternative_dataset: NCEP-NCAR-R1 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} + + + psl: + <<: *perf_diag + variables: + psl: + <<: *perf_var + preprocessor: ppNOLEV1 + reference_dataset: JRA-55 + alternative_dataset: ERA5 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: JRA-55, project: ana4mips, type: reanalysis, tier: 1} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + + + lwcre: + <<: *perf_diag + variables: + lwcre: + preprocessor: ppNOLEV1 + reference_dataset: CERES-EBAF + derive: true + force_derivation: false + mip: Amon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + additional_datasets: + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: FGOALS-s2} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-8, + tier: 1, start_year: 2001, end_year: 2015} + + + swcre: + <<: *perf_diag + variables: + swcre: + reference_dataset: CERES-EBAF + derive: true + force_derivation: false + preprocessor: ppNOLEV1 + mip: Amon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + additional_datasets: + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: FGOALS-s2} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-8, + tier: 1, start_year: 2001, end_year: 2015} + + + rlut: + <<: *perf_diag + variables: + rlut: + reference_dataset: CERES-EBAF + preprocessor: ppNOLEV1 + mip: Amon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-8, + tier: 1, start_year: 2001, end_year: 2015} + + + hus400: + <<: *perf_diag + variables: + hus: + <<: *perf_var + preprocessor: pp400_1x1 + reference_dataset: AIRS + alternative_dataset: ERA5 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R-CC} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: AIRS, project: obs4MIPs, level: L3, + version: RetStd-v5, tier: 1, start_year: 2003, end_year: 2010} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + + + rsut: + <<: *perf_diag + variables: + rsut: + reference_dataset: CERES-EBAF + preprocessor: ppNOLEV1 + mip: Amon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-8, + tier: 1, start_year: 2001, end_year: 2015} + + + ua200: + <<: *perf_diag + variables: + ua: + <<: *perf_var + preprocessor: pp200_1x1 + reference_dataset: ERA5 + alternative_dataset: NCEP-NCAR-R1 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} + + + va850: + <<: *perf_diag + variables: + va: + <<: *perf_var + preprocessor: pp850_1x1 + reference_dataset: ERA5 + alternative_dataset: NCEP-NCAR-R1 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} + + + ua850: + <<: *perf_diag + variables: + ua: + <<: *perf_var + preprocessor: pp850_1x1 + reference_dataset: ERA5 + alternative_dataset: NCEP-NCAR-R1 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} + + + va200: + <<: *perf_diag + variables: + va: + <<: *perf_var + preprocessor: pp200_1x1 + reference_dataset: ERA5 + alternative_dataset: NCEP-NCAR-R1 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} + + + ta850: + <<: *perf_diag + variables: + ta: + <<: *perf_var + preprocessor: pp850_1x1 + reference_dataset: ERA5 + alternative_dataset: NCEP-NCAR-R1 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} + + + ta200: + <<: *perf_diag + variables: + ta: + <<: *perf_var + preprocessor: pp200_1x1 + reference_dataset: ERA5 + alternative_dataset: NCEP-NCAR-R1 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2} + + + ### COLLECT METRICS ######################################################### + collect: + description: Wrapper to collect and plot previously calculated metrics + scripts: + RMSD: + script: perfmetrics/collect.ncl + ancestors: ['*/grading*'] + metric: RMSD + label_bounds: [-0.5, 0.5] + label_scale: 0.1 + disp_values: false + cm_interval: [2, 241] + no_labelbar: true + project_order: ['CMIP3', 'CMIP5', 'CMIP6'] + caption: "Relative model performance" + # Sort diagnostics in a specific order (name = 'diagnositic'-'region') + diag_order: ['hus400-global', 'zg500-global', + 'va200-global', 'va850-global', + 'ua200-global', 'ua850-global', + 'ta200-global', 'ta850-global', + 'ts-global', 'psl-global', + 'lwcre-global', 'swcre-global', + 'rlut-global', 'rsut-global', + 'pr-global', 'tas-global'] + diag_label: ['Specific Humidity 400 hPa', 'Geopotential Height 500 hPa', + 'Northward Wind 200 hPa', 'Northward Wind 850 hPa', + 'Eastward Wind 200 hPa', 'Eastward Wind 850 hPa', + 'Temperature 200h Pa', 'Temperature 850h Pa', + 'Surface Temperature', 'Sea Level Pressure', + 'TOA Longwave Cloud Radiative Effect', + 'TOA Shortwave Cloud Radiative Effect', + 'TOA Outgoing Longwave Radiation', + 'TOA Outgoing Shortwave Radiation', + 'Precipitation', 'Near-Surface Temperature'] diff --git a/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_b.yml b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_b.yml new file mode 100644 index 0000000000..27cf66f255 --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_b.yml @@ -0,0 +1,1692 @@ +# ESMValTool +# recipe_ipccwg1ar6ch3_fig_3_42_b.yml +--- +documentation: + + title: IPCC AR6 WG1 Chapter 3 Fig. 3.42b + + description: | + Producing Fig. 3.42b in the IPCC Working Group I + Contribution to the Sixth Assessment Report: Chapter 3 + + authors: + - bock_lisa + - gier_bettina + + maintainer: + - bock_lisa + + references: + - eyring21ipcc + + projects: + - ipcc_ar6 + + +preprocessors: + + pp_1x1: + regrid: + target_grid: 1x1 + scheme: linear + mask_fillvalues: + threshold_fraction: 0.95 + + ppNOLEV1: + regrid: + target_grid: reference_dataset + scheme: linear + mask_fillvalues: + threshold_fraction: 0.95 + + ppNOLEV2: + regrid: + target_grid: reference_dataset + scheme: linear + mask_fillvalues: + threshold_fraction: 0.95 + + +diagnostics: + + # ********************************************************************** + # IPCC WGI AR6, chap. 3 + # Sect. 3.8 + # Fig. 3.42b + # ********************************************************************** + # Perfmetrics of land vars for CMIP3, CMIP5, CMIP6 + # ********************************************************************** + + sm: + description: Soil moisture + themes: + - phys + realms: + - land + variables: + sm: + short_name: sm + preprocessor: ppNOLEV1 + reference_dataset: ESACCI-SOILMOISTURE + mip: Lmon + derive: true + force_derivation: false + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 1980 + end_year: 2005 + additional_datasets: + # CMIP5 + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CNRM-CM5} + - {dataset: CNRM-CM5-2} + - {dataset: CSIRO-Mk3-6-0} + - {dataset: FGOALS-g2} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + # CMIP6 + - {dataset: ACCESS-CM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: ACCESS-ESM1-5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CanESM5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CanESM5-CanOE, grid: gn, ensemble: r1i1p2f1, project: CMIP6} + - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-ESM2-1, grid: gr, ensemble: r7i1p1f2, project: CMIP6} + - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1-ECA, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3-Veg, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: IPSL-CM6A-LR, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MIROC-ES2L, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + - {dataset: MPI-ESM-1-2-HAM, grid: gn, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: MPI-ESM1-2-HR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MPI-ESM1-2-LR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NorCPM1, grid: gn, ensemble: r1i1p1f1, institute: NCC, + project: CMIP6} + - {dataset: NorESM2-LM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: NorESM2-MM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: UKESM1-0-LL, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + # OBS + - {dataset: ESACCI-SOILMOISTURE, project: OBS, type: sat, + version: L3S-SSMV-COMBINED-v4.2, tier: 2, start_year: 1980} + scripts: + grading: &grading_settings + script: perfmetrics/main.ncl + # Plot type ('cycle', 'zonal', 'latlon', 'cycle_latlon', 'cycle_zonal') + plot_type: cycle_latlon + # Time average ('opt' argument of time_operations.ncl) + time_avg: monthlyclim + # Region ('global', 'trop', 'nhext', 'shext') + region: global + # Plot standard deviation ('all', 'none', 'ref_model' or dataset name) + calc_grading: true + # Metric ('RMSD', 'BIAS', taylor') + metric: [RMSD] + # Normalization ('mean', 'median', 'centered_median', 'none') + normalization: [centered_median] + + + nbp: + description: | + surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon + _due_to_all_land_processes + themes: + - phys + realms: + - land + variables: + nbp: + short_name: nbp + preprocessor: ppNOLEV1 + reference_dataset: JMA-TRANSCOM + mip: Lmon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 1986 + end_year: 2005 + additional_datasets: + # CMIP5 + - {dataset: BNU-ESM} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM, ensemble: r2i1p1} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + # CMIP6 + - {dataset: ACCESS-ESM1-5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CanESM5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CanESM5-CanOE, grid: gn, ensemble: r1i1p2f1, project: CMIP6} + - {dataset: CESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CESM2-FV2, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM-FV2, grid: gn, ensemble: r1i1p1f1, + institute: NCAR, project: CMIP6} + - {dataset: CMCC-ESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CNRM-ESM2-1, grid: gr, ensemble: r7i1p1f2, project: CMIP6} + - {dataset: E3SM-1-1-ECA, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3-CC, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: EC-Earth3-Veg, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3-Veg-LR, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: GFDL-ESM4, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: GISS-E2-1-G, ensemble: r9i1p5f1, grid: gn, project: CMIP6} + - {dataset: GISS-E2-1-H, ensemble: r4i1p5f1, grid: gn, project: CMIP6} + - {dataset: INM-CM4-8, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: INM-CM5-0, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: IPSL-CM6A-LR, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MIROC-ES2L, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + - {dataset: MPI-ESM-1-2-HAM, grid: gn, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: MPI-ESM1-2-LR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MRI-ESM2-0, grid: gn, ensemble: r1i2p1f1, project: CMIP6} + - {dataset: NorCPM1, grid: gn, ensemble: r1i1p1f1, institute: NCC, + project: CMIP6} + - {dataset: NorESM2-LM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: NorESM2-MM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: UKESM1-0-LL, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + # OBS + - {dataset: JMA-TRANSCOM, project: OBS, type: reanaly, + version: 2018, tier: 3, start_year: 1986} + scripts: + grading: + <<: *grading_settings + + + gpp: + description: Carbon Mass Flux out of Atmosphere due to Gross Primary + themes: + - phys + realms: + - land + variables: + gpp: + short_name: gpp + preprocessor: ppNOLEV2 + reference_dataset: MTE + alternative_dataset: FLUXCOM + mip: Lmon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 1982 + end_year: 2005 + additional_datasets: + # CMIP5 + - {dataset: bcc-csm1-1} + - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM, ensemble: r2i1p1} + - {dataset: CMCC-CESM} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + # CMIP6 + - {dataset: ACCESS-ESM1-5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CanESM5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CanESM5-CanOE, grid: gn, ensemble: r1i1p2f1, project: CMIP6} + - {dataset: CESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CESM2-WACCM, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-ESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-ESM2-1, grid: gr, ensemble: r7i1p1f2, project: CMIP6} + - {dataset: E3SM-1-1-ECA, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3-CC, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: EC-Earth3-Veg, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3-Veg-LR, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: GISS-E2-1-G-CC, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: INM-CM4-8, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: INM-CM5-0, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: IPSL-CM6A-LR, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: KIOST-ESM, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: MIROC-ES2L, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + - {dataset: MPI-ESM-1-2-HAM, grid: gn, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: MPI-ESM1-2-HR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MPI-ESM1-2-LR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MRI-ESM2-0, grid: gn, ensemble: r1i2p1f1, project: CMIP6} + - {dataset: NorCPM1, grid: gn, ensemble: r1i1p1f1, institute: NCC, + project: CMIP6} + - {dataset: NorESM2-LM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: NorESM2-MM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: UKESM1-0-LL, grid: gn, ensemble: r2i1p1f2, project: CMIP6} + # OBS + - {dataset: MTE, project: OBS, type: reanaly, + version: May12, tier: 3, start_year: 1982} + - {dataset: FLUXCOM, project: OBS, type: reanaly, + version: ANN-v1, tier: 3} + scripts: + grading: + <<: *grading_settings + + + lai: + description: Leaf Area Index + themes: + - phys + realms: + - land + variables: + lai: + short_name: lai + preprocessor: ppNOLEV1 + reference_dataset: LAI3g + mip: Lmon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 1981 + end_year: 2005 + additional_datasets: + # CMIP5 + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM, ensemble: r2i1p1} + - {dataset: CMCC-CESM} + - {dataset: FIO-ESM} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + # CMIP6 + - {dataset: ACCESS-ESM1-5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f2, grid: gn, project: CMIP6} + - {dataset: CanESM5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CanESM5-CanOE, grid: gn, ensemble: r1i1p2f1, project: CMIP6} + - {dataset: CESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CESM2-WACCM, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CIESM, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-ESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-ESM2-1, grid: gr, ensemble: r7i1p1f2, project: CMIP6} + - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1-ECA, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3-CC, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: EC-Earth3-Veg, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3-Veg-LR, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: GISS-E2-1-G-CC, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: INM-CM4-8, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: INM-CM5-0, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: IPSL-CM6A-LR, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: KIOST-ESM, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: MIROC-ES2L, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + - {dataset: MPI-ESM-1-2-HAM, grid: gn, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: MPI-ESM1-2-HR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MPI-ESM1-2-LR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MRI-ESM2-0, grid: gn, ensemble: r1i2p1f1, project: CMIP6} + - {dataset: NorESM2-LM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: NorESM2-MM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: UKESM1-0-LL, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + # OBS + - {dataset: LAI3g, project: OBS, type: reanaly, + version: 1_regridded, tier: 3, start_year: 1981} + scripts: + grading: + <<: *grading_settings + + + fgco2: + description: | + surface_downward_mass_flux_of_carbon_dioxide_expressed _as_carbon + themes: + - phys + realms: + - ocnBgchem + variables: + fgco2: + short_name: fgco2 + preprocessor: ppNOLEV2 + reference_dataset: Landschuetzer2016 + alternative_dataset: JMA-TRANSCOM + mip: Omon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 1986 + end_year: 2005 + additional_datasets: + # CMIP5 + - {dataset: CanESM2} + - {dataset: CESM1-BGC} + - {dataset: CMCC-CESM} + - {dataset: CNRM-CM5} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R-CC} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-ME} + # CMIP6 + - {dataset: ACCESS-ESM1-5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CanESM5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CanESM5-CanOE, grid: gn, ensemble: r1i1p2f1, project: CMIP6} + - {dataset: CESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CESM2-FV2, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM-FV2, grid: gn, ensemble: r1i1p1f1, + institute: NCAR, project: CMIP6} + - {dataset: CMCC-ESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CNRM-ESM2-1, grid: gn, ensemble: r7i1p1f2, project: CMIP6} + - {dataset: EC-Earth3-CC, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: INM-CM4-8, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: INM-CM5-0, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: IPSL-CM5A2-INCA, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: IPSL-CM6A-LR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MIROC-ES2L, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + - {dataset: MPI-ESM-1-2-HAM, grid: gn, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: MPI-ESM1-2-HR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MPI-ESM1-2-LR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MRI-ESM2-0, grid: gn, ensemble: r1i2p1f1, project: CMIP6} + - {dataset: NorCPM1, grid: gn, ensemble: r1i1p1f1, institute: NCC, + project: CMIP6} + - {dataset: NorESM2-LM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: NorESM2-MM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: UKESM1-0-LL, grid: gn, ensemble: r2i1p1f2, project: CMIP6} + # OBS + - {dataset: Landschuetzer2016, project: OBS, type: clim, + version: v2016, tier: 2} + - {dataset: JMA-TRANSCOM, project: OBS, type: reanaly, version: 2018, + tier: 3, start_year: 1986} + scripts: + grading: + <<: *grading_settings + + + et: + description: total_evapotranspiration + themes: + - phys + realms: + - land + variables: + et: + short_name: et + preprocessor: ppNOLEV1 + reference_dataset: LandFlux-EVAL + mip: Lmon + derive: true + force_derivation: false + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 1990 + end_year: 2005 + additional_datasets: + # CMIP5 + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CM} + - {dataset: CMCC-CMS} + - {dataset: CNRM-CM5} + - {dataset: CNRM-CM5-2} + - {dataset: CSIRO-Mk3-6-0} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: FGOALS-g2} + - {dataset: FIO-ESM} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {dataset: HadGEM2-AO} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + # CMIP6 + - {dataset: ACCESS-CM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: ACCESS-ESM1-5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: AWI-CM-1-1-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CanESM5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CanESM5-CanOE, grid: gn, ensemble: r1i1p2f1, project: CMIP6} + - {dataset: CESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CESM2-FV2, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM-FV2, grid: gn, ensemble: r1i1p1f1, + institute: NCAR, project: CMIP6} + - {dataset: CIESM, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-ESM2-1, grid: gr, ensemble: r7i1p1f2, project: CMIP6} + - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1-ECA, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3-Veg-LR, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: FIO-ESM-2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: IITM-ESM, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: INM-CM4-8, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: INM-CM5-0, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: IPSL-CM6A-LR, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MCM-UA-1-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MIROC-ES2L, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + - {dataset: MPI-ESM-1-2-HAM, grid: gn, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: MPI-ESM1-2-HR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MPI-ESM1-2-LR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NorCPM1, grid: gn, ensemble: r1i1p1f1, institute: NCC, + project: CMIP6} + - {dataset: NorESM2-LM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: NorESM2-MM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: UKESM1-0-LL, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + # OBS + - {dataset: LandFlux-EVAL, project: OBS, type: reanaly, + version: Oct13, tier: 3, start_year: 1990} + scripts: + grading: + <<: *grading_settings + + + rlus: + description: surface upwelling longwave flux in air + themes: + - phys + realms: + - atmos + variables: + rlus: + short_name: rlus + preprocessor: ppNOLEV1 + reference_dataset: CERES-EBAF + mip: Amon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 2001 + end_year: 2005 + additional_datasets: + # CMIP5 + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CM} + - {dataset: CMCC-CMS} + - {dataset: CNRM-CM5} + - {dataset: CNRM-CM5-2} + - {dataset: CSIRO-Mk3-6-0} + - {dataset: FGOALS-g2} + - {dataset: GFDL-CM2p1} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + # CMIP6 + - {dataset: ACCESS-CM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: ACCESS-ESM1-5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: AWI-CM-1-1-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CanESM5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CanESM5-CanOE, grid: gn, ensemble: r1i1p2f1, project: CMIP6} + - {dataset: CESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CESM2-FV2, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM-FV2, grid: gn, ensemble: r1i1p1f1, + institute: NCAR, project: CMIP6} + - {dataset: CIESM, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-ESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-ESM2-1, grid: gr, ensemble: r7i1p1f2, project: CMIP6} + - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1-ECA, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3-AerChem, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: EC-Earth3-CC, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: EC-Earth3-Veg-LR, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: FIO-ESM-2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: GISS-E2-1-G-CC, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: IITM-ESM, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: INM-CM4-8, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: INM-CM5-0, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: IPSL-CM5A2-INCA, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: IPSL-CM6A-LR, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: KIOST-ESM, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MIROC-ES2L, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + - {dataset: MPI-ESM-1-2-HAM, grid: gn, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: MPI-ESM1-2-HR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MPI-ESM1-2-LR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NorCPM1, grid: gn, ensemble: r1i1p1f1, institute: NCC, + project: CMIP6} + - {dataset: NorESM2-LM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: NorESM2-MM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: UKESM1-0-LL, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + # OBS + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, + version: Ed2-8, tier: 1, start_year: 2001, end_year: 2005} + scripts: + grading: + <<: *grading_settings + + + rlds: + description: surface_downwelling_longwave_flux_in_air + themes: + - phys + realms: + - atmos + variables: + rlds: + short_name: rlds + preprocessor: ppNOLEV1 + reference_dataset: CERES-EBAF + mip: Amon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 2001 + end_year: 2005 + additional_datasets: + # CMIP5 + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CM} + - {dataset: CMCC-CMS} + - {dataset: CNRM-CM5} + - {dataset: CNRM-CM5-2} + - {dataset: CSIRO-Mk3-6-0} + - {dataset: FGOALS-g2} + - {dataset: GFDL-CM2p1} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {dataset: HadGEM2-AO} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + # CMIP6 + - {dataset: ACCESS-CM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: ACCESS-ESM1-5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: AWI-CM-1-1-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CanESM5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CanESM5-CanOE, grid: gn, ensemble: r1i1p2f1, project: CMIP6} + - {dataset: CESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CESM2-FV2, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM-FV2, grid: gn, ensemble: r1i1p1f1, + institute: NCAR, project: CMIP6} + - {dataset: CIESM, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-ESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-ESM2-1, grid: gr, ensemble: r7i1p1f2, project: CMIP6} + - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1-ECA, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3-AerChem, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: EC-Earth3-CC, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: EC-Earth3-Veg-LR, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: FIO-ESM-2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: GISS-E2-1-G-CC, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: IITM-ESM, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: INM-CM4-8, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: INM-CM5-0, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: IPSL-CM5A2-INCA, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: IPSL-CM6A-LR, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: KIOST-ESM, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MIROC-ES2L, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + - {dataset: MPI-ESM-1-2-HAM, grid: gn, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: MPI-ESM1-2-HR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MPI-ESM1-2-LR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NorCPM1, grid: gn, ensemble: r1i1p1f1, institute: NCC, + project: CMIP6} + - {dataset: NorESM2-LM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: NorESM2-MM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: UKESM1-0-LL, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + # OBS + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, + version: Ed2-8, tier: 1, start_year: 2001, end_year: 2005} + scripts: + grading: + <<: *grading_settings + + + rsus: + description: surface_upwelling_shortwave_flux_in_air + themes: + - phys + realms: + - atmos + variables: + rsus: + short_name: rsus + preprocessor: ppNOLEV1 + reference_dataset: CERES-EBAF + mip: Amon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 2001 + end_year: 2005 + additional_datasets: + # CMIP5 + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CM} + - {dataset: CMCC-CMS} + - {dataset: CNRM-CM5} + - {dataset: CNRM-CM5-2} + - {dataset: CSIRO-Mk3-6-0} + - {dataset: FGOALS-g2} + - {dataset: GFDL-CM2p1} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + # CMIP6 + - {dataset: ACCESS-CM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: ACCESS-ESM1-5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: AWI-CM-1-1-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CanESM5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CanESM5-CanOE, grid: gn, ensemble: r1i1p2f1, project: CMIP6} + - {dataset: CESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CESM2-FV2, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM-FV2, grid: gn, ensemble: r1i1p1f1, + institute: NCAR, project: CMIP6} + - {dataset: CIESM, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-ESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-ESM2-1, grid: gr, ensemble: r7i1p1f2, project: CMIP6} + - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1-ECA, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3-AerChem, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: EC-Earth3-CC, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: EC-Earth3-Veg-LR, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: FIO-ESM-2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: GISS-E2-1-G-CC, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: IITM-ESM, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: INM-CM4-8, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: INM-CM5-0, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: IPSL-CM5A2-INCA, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: IPSL-CM6A-LR, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: KIOST-ESM, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MIROC-ES2L, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + - {dataset: MPI-ESM-1-2-HAM, grid: gn, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: MPI-ESM1-2-HR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MPI-ESM1-2-LR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NorCPM1, grid: gn, ensemble: r1i1p1f1, institute: NCC, + project: CMIP6} + - {dataset: NorESM2-LM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: NorESM2-MM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: UKESM1-0-LL, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + # OBS + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, + version: Ed2-8, tier: 1, start_year: 2001, end_year: 2005} + scripts: + grading: + <<: *grading_settings + + + rsds: + description: surface_downwelling_shortwave_flux_in_air + themes: + - phys + realms: + - atmos + variables: + rsds: + short_name: rsds + preprocessor: ppNOLEV1 + reference_dataset: CERES-EBAF + mip: Amon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 2001 + end_year: 2005 + additional_datasets: + # CMIP5 + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CM} + - {dataset: CMCC-CMS} + - {dataset: CNRM-CM5} + - {dataset: CNRM-CM5-2} + - {dataset: CSIRO-Mk3-6-0} + - {dataset: FGOALS-g2} + - {dataset: GFDL-CM2p1} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {dataset: HadGEM2-AO} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + # CMIP6 + - {dataset: ACCESS-CM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: ACCESS-ESM1-5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: AWI-CM-1-1-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CanESM5, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CanESM5-CanOE, grid: gn, ensemble: r1i1p2f1, project: CMIP6} + - {dataset: CESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CESM2-FV2, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM, grid: gn, ensemble: r1i1p1f1, institute: NCAR, + project: CMIP6} + - {dataset: CESM2-WACCM-FV2, grid: gn, ensemble: r1i1p1f1, + institute: NCAR, project: CMIP6} + - {dataset: CIESM, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-ESM2, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr, project: CMIP6} + - {dataset: CNRM-ESM2-1, grid: gr, ensemble: r7i1p1f2, project: CMIP6} + - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1-ECA, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3-AerChem, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: EC-Earth3-CC, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: EC-Earth3-Veg-LR, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: FIO-ESM-2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: GISS-E2-1-G-CC, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: IITM-ESM, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: INM-CM4-8, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: INM-CM5-0, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: IPSL-CM5A2-INCA, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: IPSL-CM6A-LR, grid: gr, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: KACE-1-0-G, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: KIOST-ESM, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MIROC-ES2L, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + - {dataset: MPI-ESM-1-2-HAM, grid: gn, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: MPI-ESM1-2-HR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MPI-ESM1-2-LR, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NorCPM1, grid: gn, ensemble: r1i1p1f1, institute: NCC, + project: CMIP6} + - {dataset: NorESM2-LM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: NorESM2-MM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: UKESM1-0-LL, grid: gn, ensemble: r1i1p1f2, project: CMIP6} + # OBS + - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, + version: Ed2-8, tier: 1, start_year: 2001, end_year: 2005} + scripts: + grading: + <<: *grading_settings + + + hfds: + description: surface_downward_heat_flux_in_sea_water + themes: + - phys + realms: + - ocean + variables: + hfds: + short_name: hfds + preprocessor: ppNOLEV1 + reference_dataset: ERA-Interim + mip: Omon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + grid: gr + additional_datasets: + # CMIP5 + - {dataset: CMCC-CM} + - {dataset: CNRM-CM5} + - {dataset: CSIRO-Mk3-6-0} + - {dataset: EC-EARTH, ensemble: r1i1p1} + - {dataset: FGOALS-g2} + - {dataset: FIO-ESM} + - {dataset: GFDL-ESM2G} + - {dataset: inmcm4} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + # CMIP6 + - {dataset: ACCESS-CM2, institute: CSIRO-ARCCSS, grid: gn, + ensemble: r1i1p1f1, project: CMIP6} + - {dataset: ACCESS-ESM1-5, institute: CSIRO, grid: gn, + ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CanESM5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CanESM5-CanOE, ensemble: r1i1p2f1, grid: gn, project: CMIP6} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: CESM2-WACCM-FV2, institute: NCAR, ensemble: r1i1p1f1, + grid: gn, project: CMIP6} + - {dataset: CIESM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-ESM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gn, project: CMIP6} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gn, project: CMIP6} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gn, project: CMIP6} + - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1, institute: E3SM-Project, ensemble: r1i1p1f1, + grid: gr, project: CMIP6} + - {dataset: E3SM-1-1-ECA, institute: E3SM-Project, ensemble: r1i1p1f1, + grid: gr, project: CMIP6} + - {dataset: EC-Earth3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: EC-Earth3-AerChem, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: EC-Earth3-CC, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: EC-Earth3-Veg, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: EC-Earth3-Veg-LR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: FIO-ESM-2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: IPSL-CM6A-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MPI-ESM1-2-HR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NorCPM1, grid: gn, institute: NCC, ensemble: r10i1p1f1, + project: CMIP6} + - {dataset: NorESM2-LM, grid: gn, institute: NCC, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: NorESM2-MM, grid: gn, institute: NCC, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: TaiESM1, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn, project: CMIP6} + # OBS + - {dataset: ERA-Interim, project: OBS6, type: reanaly, + version: 1, tier: 3} + scripts: + grading: + <<: *grading_settings + + + siconc: + description: Sea ice concentration + themes: + - phys + realms: + - ocean + variables: + sic: + short_name: sic + preprocessor: pp_1x1 + reference_dataset: HadISST + exp: historical + ensemble: r1i1p1 + start_year: 1980 + end_year: 1999 + additional_datasets: + # CMIP5 + - &cmip5 {dataset: ACCESS1-0, mip: OImon, project: CMIP5} + - {<<: *cmip5, dataset: ACCESS1-3} + - {<<: *cmip5, dataset: BNU-ESM} + - {<<: *cmip5, dataset: CanCM4} + - {<<: *cmip5, dataset: CanESM2} + - {<<: *cmip5, dataset: CCSM4} + - {<<: *cmip5, dataset: CESM1-BGC} + - {<<: *cmip5, dataset: CESM1-CAM5} + - {<<: *cmip5, dataset: CESM1-CAM5-1-FV2} + - {<<: *cmip5, dataset: CESM1-FASTCHEM} + - {<<: *cmip5, dataset: CESM1-WACCM} + - {<<: *cmip5, dataset: CMCC-CM} + - {<<: *cmip5, dataset: CMCC-CMS} + - {<<: *cmip5, dataset: CNRM-CM5} + - {<<: *cmip5, dataset: CNRM-CM5-2} + - {<<: *cmip5, dataset: CSIRO-Mk3-6-0} + - {<<: *cmip5, dataset: EC-EARTH, ensemble: r6i1p1} + - {<<: *cmip5, dataset: FGOALS-g2} + - {<<: *cmip5, dataset: FIO-ESM} + - {<<: *cmip5, dataset: GFDL-CM2p1} + - {<<: *cmip5, dataset: GFDL-CM3} + - {<<: *cmip5, dataset: GFDL-ESM2G} + - {<<: *cmip5, dataset: GFDL-ESM2M} + - {<<: *cmip5, dataset: GISS-E2-H, ensemble: r1i1p2} + - {<<: *cmip5, dataset: GISS-E2-H-CC} + - {<<: *cmip5, dataset: GISS-E2-R, ensemble: r1i1p2} + - {<<: *cmip5, dataset: GISS-E2-R-CC} + - {<<: *cmip5, dataset: HadCM3} + - {<<: *cmip5, dataset: HadGEM2-AO} + - {<<: *cmip5, dataset: HadGEM2-CC} + - {<<: *cmip5, dataset: HadGEM2-ES} + - {<<: *cmip5, dataset: inmcm4} + - {<<: *cmip5, dataset: IPSL-CM5A-LR} + - {<<: *cmip5, dataset: IPSL-CM5A-MR} + - {<<: *cmip5, dataset: IPSL-CM5B-LR} + - {<<: *cmip5, dataset: MIROC4h} + - {<<: *cmip5, dataset: MIROC5} + - {<<: *cmip5, dataset: MIROC-ESM} + - {<<: *cmip5, dataset: MIROC-ESM-CHEM} + - {<<: *cmip5, dataset: MPI-ESM-LR} + - {<<: *cmip5, dataset: MPI-ESM-MR} + - {<<: *cmip5, dataset: MPI-ESM-P} + - {<<: *cmip5, dataset: MRI-CGCM3} + - {<<: *cmip5, dataset: MRI-ESM1} + - {<<: *cmip5, dataset: NorESM1-M} + - {<<: *cmip5, dataset: NorESM1-ME} + - {<<: *cmip5, dataset: HadISST, project: OBS, type: reanaly, + version: 1, tier: 2} + siconc: + short_name: siconc + preprocessor: pp_1x1 + reference_dataset: HadISST + mip: SImon + exp: historical + ensemble: r1i1p1 + grid: gr + start_year: 1980 + end_year: 1999 + additional_datasets: + # CMIP6 + - {dataset: ACCESS-CM2, institute: CSIRO-ARCCSS, grid: gn, + ensemble: r1i1p1f1, project: CMIP6} + - {dataset: ACCESS-ESM1-5, institute: CSIRO, grid: gn, + ensemble: r1i1p1f1, project: CMIP6} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: CanESM5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CanESM5-CanOE, ensemble: r1i1p2f1, grid: gn, + project: CMIP6} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, + grid: gn, project: CMIP6} + - {dataset: CESM2-WACCM-FV2, institute: NCAR, ensemble: r1i1p1f1, + grid: gn, project: CMIP6} + - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: CMCC-ESM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gn, project: CMIP6} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gn, + project: CMIP6} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gn, + project: CMIP6} + - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1, institute: E3SM-Project, ensemble: r1i1p1f1, + grid: gr, project: CMIP6} + - {dataset: E3SM-1-1-ECA, institute: E3SM-Project, + ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: EC-Earth3-AerChem, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: EC-Earth3-CC, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: FIO-ESM-2-0, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gr, + project: CMIP6} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: INM-CM4-8, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: INM-CM5-0, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: IPSL-CM5A2-INCA, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: IPSL-CM6A-LR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn, project: CMIP6} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: MPI-ESM1-2-HR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NorCPM1, grid: gn, institute: NCC, ensemble: r10i1p1f1, + project: CMIP6} + - {dataset: NorESM2-MM, grid: gn, institute: NCC, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: TaiESM1, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn, + project: CMIP6} + scripts: + grading_shpolar: + <<: *grading_settings + region: shpolar + grading_nhpolar: + <<: *grading_settings + region: nhpolar + + + tos: + description: Sea Surface Temperature + themes: + - phys + realms: + - ocean + variables: + tos: + short_name: tos + preprocessor: ppNOLEV2 + reference_dataset: HadISST + alternative_dataset: ATSR + mip: Omon + project: CMIP5 + exp: historical + ensemble: r1i1p1 + grid: gr + start_year: 1980 + end_year: 1999 + additional_datasets: + # CMIP5 + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + - {dataset: bcc-csm1-1-m} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CM} + - {dataset: CMCC-CMS} + - {dataset: CNRM-CM5} + - {dataset: CNRM-CM5-2} + - {dataset: CSIRO-Mk3-6-0} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: FGOALS-g2} + - {dataset: FGOALS-s2} + - {dataset: FIO-ESM} + - {dataset: GFDL-CM2p1} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: HadCM3} + - {dataset: HadGEM2-AO} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC5} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + # CMIP6 + - {dataset: ACCESS-CM2, institute: CSIRO-ARCCSS, grid: gn, + ensemble: r1i1p1f1, project: CMIP6} + - {dataset: ACCESS-ESM1-5, institute: CSIRO, grid: gn, + ensemble: r1i1p1f1, project: CMIP6} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CanESM5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CanESM5-CanOE, ensemble: r1i1p2f1, grid: gn, project: CMIP6} + - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CESM2-FV2, institute: NCAR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: CESM2-WACCM, institute: NCAR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: CESM2-WACCM-FV2, institute: NCAR, ensemble: r1i1p1f1, + grid: gn, project: CMIP6} + - {dataset: CIESM, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CMCC-ESM2, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gn, project: CMIP6} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gn, project: CMIP6} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gn, project: CMIP6} + - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: E3SM-1-1, institute: E3SM-Project, ensemble: r1i1p1f1, + grid: gr, project: CMIP6} + - {dataset: E3SM-1-1-ECA, institute: E3SM-Project, ensemble: r1i1p1f1, + grid: gr, project: CMIP6} + - {dataset: EC-Earth3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: EC-Earth3-AerChem, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: EC-Earth3-CC, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: EC-Earth3-Veg, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: EC-Earth3-Veg-LR, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: FGOALS-g3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: FIO-ESM-2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr, project: CMIP6} + - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GISS-E2-1-G-CC, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3, grid: gn, + project: CMIP6} + - {dataset: INM-CM4-8, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: INM-CM5-0, grid: gr1, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: IPSL-CM5A2-INCA, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: IPSL-CM6A-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: KIOST-ESM, ensemble: r1i1p1f1, grid: gr1, project: CMIP6} + - {dataset: MCM-UA-1-0, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn, project: CMIP6} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r1i1p1f1, grid: gn, + project: CMIP6} + - {dataset: MPI-ESM1-2-LR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MPI-ESM1-2-HR, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: NorCPM1, grid: gn, institute: NCC, ensemble: r10i1p1f1, + project: CMIP6} + - {dataset: NorESM2-LM, grid: gn, institute: NCC, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: NorESM2-MM, grid: gn, institute: NCC, ensemble: r1i1p1f1, + project: CMIP6} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, project: CMIP6} + - {dataset: TaiESM1, grid: gn, ensemble: r1i1p1f1, project: CMIP6} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn, project: CMIP6} + # OBS + - {dataset: HadISST, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: ATSR, project: obs4MIPs, level: L3, + version: ARC-v1.1.1, tier: 1, start_year: 1997, end_year: 2011} + scripts: + grading: + <<: *grading_settings + + + ### COLLECT METRICS ######################################################### + collect: + description: Wrapper to collect and plot previously calculated metrics + scripts: + RMSD: + script: perfmetrics/collect.ncl + ancestors: ['*/grading*'] + metric: RMSD + label_bounds: [-0.5, 0.5] + label_scale: 0.1 + no_labelbar: true + disp_values: false + cm_interval: [2, 241] + project_order: ['CMIP5', 'CMIP6'] + diag_order: ['hfds-global', 'siconc-shpolar', 'siconc-nhpolar', + 'tos-global', + 'sm-global', 'nbp-global', 'lai-global', 'gpp-global', + 'fgco2-global', 'et-global', + 'rsds-global', 'rsus-global', 'rlds-global', + 'rlus-global'] + diag_label: ['Downward Heat Flux at Sea Water Surface', + 'Sea Ice Concentration - SH', + 'Sea Ice Concentration - NH', 'Sea Surface Temperature', + 'Soil Moisture', + 'Surface Net Downward Mass Flux of Carbon', + 'Leaf Area Index', 'Gross Primary Productivity', + 'Surface Downward Mass Flux of Carbon', + 'Evapotransporation', + 'Surface Downwelling Shortwave Radiation', + 'Surface Upwelling Shortwave Radiation', + 'Surface Downwelling Longwave Radiation', + 'Surface Upwelling Longwave Radiation'] diff --git a/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_43.yml b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_43.yml new file mode 100644 index 0000000000..fd7a60efe8 --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_43.yml @@ -0,0 +1,783 @@ +# ESMValTool +# recipe_ipccwg1ar6ch3_fig3_43.yml +--- +documentation: + + title: IPCC AR6 WG1 Chapter 3 Fig. 3.43 + + description: | + Producing Fig. 3.43 in the IPCC Working Group I + Contribution to the Sixth Assessment Report: Chapter 3 + + authors: + - bock_lisa + - eyring_veronika + + maintainer: + - bock_lisa + + references: + - eyring21ipcc + + projects: + - ipcc_ar6 + + +preprocessors: + + regrid_4_5: + regrid: + target_grid: 4x5 + scheme: linear + + regrid_4_5_pp200: + extract_levels: + levels: 20000 + scheme: linear + regrid: + target_grid: 4x5 + scheme: linear + + regrid_4_5_pp400: + extract_levels: + levels: 40000 + scheme: linear + regrid: + target_grid: 4x5 + scheme: linear + + regrid_4_5_pp500: + extract_levels: + levels: 50000 + scheme: linear + regrid: + target_grid: 4x5 + scheme: linear + + regrid_4_5_pp850: + extract_levels: + levels: 85000 + scheme: linear + regrid: + target_grid: 4x5 + scheme: linear + +datasets: + # CMIP3 + - &cmip3 {dataset: cccma_cgcm3_1, institute: CCCMA, project: CMIP3, + mip: A1, modeling_realm: atm, exp: 20c3m, frequency: mo, + ensemble: run1} + - {<<: *cmip3, dataset: cccma_cgcm3_1_t63, institute: CCCMA} + - {<<: *cmip3, dataset: csiro_mk3_0, institute: CSIRO} + - {<<: *cmip3, dataset: gfdl_cm2_0, institute: GFDL} + - {<<: *cmip3, dataset: gfdl_cm2_1, institute: GFDL} + - {<<: *cmip3, dataset: giss_model_e_h, institute: NASA} + - {<<: *cmip3, dataset: giss_model_e_r, institute: NASA} + - {<<: *cmip3, dataset: iap_fgoals1_0_g, institute: LASG} + - {<<: *cmip3, dataset: inmcm3_0, institute: INM} + - {<<: *cmip3, dataset: ipsl_cm4, institute: IPSL} + - {<<: *cmip3, dataset: miroc3_2_hires, institute: NIES} + - {<<: *cmip3, dataset: miroc3_2_medres, institute: NIES} + - {<<: *cmip3, dataset: mpi_echam5, institute: MPIM} + - {<<: *cmip3, dataset: mri_cgcm2_3_2a, institute: MRI} + - {<<: *cmip3, dataset: ncar_ccsm3_0, institute: NCAR} + - {<<: *cmip3, dataset: ncar_pcm1, institute: NCAR} + - {<<: *cmip3, dataset: ukmo_hadcm3, institute: UKMO} + # CMIP5 + - {dataset: ACCESS1-0} + - {dataset: ACCESS1-3} + - {dataset: bcc-csm1-1} + - {dataset: bcc-csm1-1-m} + - {dataset: BNU-ESM} + - {dataset: CCSM4} + - {dataset: CESM1-BGC} + - {dataset: CESM1-CAM5} + - {dataset: CESM1-FASTCHEM} + - {dataset: CESM1-WACCM} + - {dataset: CMCC-CM} + - {dataset: CNRM-CM5} + - {dataset: CSIRO-Mk3-6-0} + - {dataset: FGOALS-g2} + - {dataset: FIO-ESM} + - {dataset: GFDL-CM3} + - {dataset: GFDL-ESM2G} + - {dataset: GFDL-ESM2M} + - {dataset: HadGEM2-AO} + - {dataset: HadGEM2-CC} + - {dataset: HadGEM2-ES} + - {dataset: inmcm4} + - {dataset: IPSL-CM5A-LR} + - {dataset: IPSL-CM5A-MR} + - {dataset: IPSL-CM5B-LR} + - {dataset: MIROC4h} + - {dataset: MIROC5} + - {dataset: MIROC-ESM} + - {dataset: MIROC-ESM-CHEM} + - {dataset: MPI-ESM-LR} + - {dataset: MPI-ESM-MR} + - {dataset: MPI-ESM-P} + - {dataset: MRI-CGCM3} + - {dataset: MRI-ESM1} + - {dataset: NorESM1-M} + - {dataset: NorESM1-ME} + # CMIP6 + - &cmip6 {dataset: ACCESS-CM2, grid: gn, ensemble: r1i1p1f1, + project: CMIP6} + - {<<: *cmip6, dataset: ACCESS-ESM1-5, institute: CSIRO} + - {<<: *cmip6, dataset: AWI-CM-1-1-MR} + - {<<: *cmip6, dataset: AWI-ESM-1-1-LR} + - {<<: *cmip6, dataset: BCC-CSM2-MR} + - {<<: *cmip6, dataset: CAMS-CSM1-0} + - {<<: *cmip6, dataset: CanESM5} + - {<<: *cmip6, dataset: CanESM5-CanOE, ensemble: r1i1p2f1} + - {<<: *cmip6, dataset: CESM2} + - {<<: *cmip6, dataset: CESM2-FV2, institute: NCAR} + - {<<: *cmip6, dataset: CESM2-WACCM, institute: NCAR} + - {<<: *cmip6, dataset: CESM2-WACCM-FV2, institute: NCAR} + - {<<: *cmip6, dataset: CIESM, grid: gr} + - {<<: *cmip6, dataset: CMCC-CM2-HR4} + - {<<: *cmip6, dataset: CMCC-CM2-SR5} + - {<<: *cmip6, dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {<<: *cmip6, dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg-LR, grid: gr} + - {<<: *cmip6, dataset: FGOALS-f3-L, grid: gr} + - {<<: *cmip6, dataset: FGOALS-g3} + - {<<: *cmip6, dataset: GFDL-CM4, grid: gr1} + - {<<: *cmip6, dataset: GFDL-ESM4, grid: gr1} + - {<<: *cmip6, dataset: GISS-E2-1-G} + - {<<: *cmip6, dataset: GISS-E2-1-H} + - {<<: *cmip6, dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3} + - {<<: *cmip6, dataset: HadGEM3-GC31-MM, ensemble: r1i1p1f3} + - {<<: *cmip6, dataset: IITM-ESM} + - {<<: *cmip6, dataset: INM-CM4-8, grid: gr1} + - {<<: *cmip6, dataset: INM-CM5-0, grid: gr1} + - {<<: *cmip6, dataset: IPSL-CM6A-LR, grid: gr} + - {<<: *cmip6, dataset: KACE-1-0-G, grid: gr} + - {<<: *cmip6, dataset: MIROC6} + - {<<: *cmip6, dataset: MIROC-ES2L, ensemble: r1i1p1f2} + - {<<: *cmip6, dataset: MPI-ESM-1-2-HAM} + - {<<: *cmip6, dataset: MPI-ESM1-2-LR} + - {<<: *cmip6, dataset: MPI-ESM1-2-HR} + - {<<: *cmip6, dataset: MRI-ESM2-0} + - {<<: *cmip6, dataset: NESM3} + - {<<: *cmip6, dataset: NorCPM1, institute: NCC, ensemble: r10i1p1f1} + - {<<: *cmip6, dataset: NorESM2-LM, institute: NCC} + - {<<: *cmip6, dataset: NorESM2-MM, institute: NCC} + - {<<: *cmip6, dataset: SAM0-UNICON} + - {<<: *cmip6, dataset: TaiESM1} + - {<<: *cmip6, dataset: UKESM1-0-LL, ensemble: r1i1p1f2} + + +diagnostics: + + # ********************************************************************** + # IPCC WGI AR6, chap. 3 + # Sect. 3.3 + # Fig. 3.43 + # ********************************************************************** + # Centered pattern correlation + # ********************************************************************** + + tas: &corr_diag + description: Calculate pattern correlation value + variables: + tas: &var_settings + preprocessor: regrid_4_5 + reference_dataset: ERA5 + alternative_dataset: NCEP + project: CMIP5 + exp: historical + ensemble: r1i1p1 + mip: Amon + start_year: 1980 + end_year: 1999 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + scripts: + pattern_cor: &fig_pattern_cor + script: ipcc_ar6/corr_pattern.ncl + + + pr: + <<: *corr_diag + variables: + pr: + <<: *var_settings + reference_dataset: GPCP-SG + alternative_dataset: GHCN + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: GPCP-SG, project: obs4mips, level: L3, version: v2.2, tier: 1} + - {dataset: GHCN, project: OBS, type: ground, version: 1, tier: 2} + + + psl: + <<: *corr_diag + variables: + psl: + <<: *var_settings + reference_dataset: JRA-55 + alternative_dataset: ERA5 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: JRA-55, project: ana4mips, type: reanalysis, tier: 1} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + + + rlut: + <<: *corr_diag + variables: + rlut: + <<: *var_settings + reference_dataset: CERES-EBAF + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: CERES-EBAF, project: obs4mips, level: L3B, version: Ed2-8, + tier: 1, start_year: 2001, end_year: 2015} + + + rsut: + <<: *corr_diag + variables: + rsut: + <<: *var_settings + reference_dataset: CERES-EBAF + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {dataset: CERES-EBAF, project: obs4mips, level: L3B, version: Ed2-8, + tier: 1, start_year: 2001, end_year: 2015} + + + lwcre: + <<: *corr_diag + variables: + lwcre: + <<: *var_settings + reference_dataset: CERES-EBAF + derive: true + force_derivation: false + additional_datasets: + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: FGOALS-s2} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {dataset: CERES-EBAF, project: obs4mips, level: L3B, version: Ed2-8, + tier: 1, start_year: 2001, end_year: 2015} + + + swcre: + <<: *corr_diag + variables: + swcre: + <<: *var_settings + reference_dataset: CERES-EBAF + derive: true + force_derivation: false + additional_datasets: + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: FGOALS-s2} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {dataset: CERES-EBAF, project: obs4mips, level: L3B, version: Ed2-8, + tier: 1, start_year: 2001, end_year: 2015} + + + ts: + <<: *corr_diag + variables: + ts: + <<: *var_settings + reference_dataset: ESACCI-SST + alternative_dataset: HadISST + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ESACCI-SST, project: OBS, type: sat, + version: L4-GHRSST-SSTdepth-OSTIA-GLOB, tier: 2, start_year: 1992} + - {dataset: HadISST, project: OBS, type: reanaly, version: 1, tier: 2} + + + hus400: + <<: *corr_diag + variables: + hus: + <<: *var_settings + preprocessor: regrid_4_5_pp400 + reference_dataset: AIRS + alternative_dataset: ERA5 + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R-CC} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: AIRS, project: obs4mips, level: L3, + version: RetStd-v5, tier: 1, start_year: 2003, end_year: 2010} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + + + zg500: + <<: *corr_diag + variables: + zg: + <<: *var_settings + preprocessor: regrid_4_5_pp500 + reference_dataset: ERA5 + alternative_dataset: NCEP + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-1, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + + + ta200: + <<: *corr_diag + variables: + ta: + <<: *var_settings + preprocessor: regrid_4_5_pp200 + reference_dataset: ERA5 + alternative_dataset: NCEP + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + + + ta850: + <<: *corr_diag + variables: + ta: + <<: *var_settings + preprocessor: regrid_4_5_pp850 + reference_dataset: ERA5 + alternative_dataset: NCEP + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CESM1-CAM5-1-FV2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: FGOALS-s2} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: EC-Earth3, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-Veg, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + + + ua200: + <<: *corr_diag + variables: + ua: + <<: *var_settings + preprocessor: regrid_4_5_pp200 + reference_dataset: ERA5 + alternative_dataset: NCEP + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + + + ua850: + <<: *corr_diag + variables: + ua: + <<: *var_settings + preprocessor: regrid_4_5_pp850 + reference_dataset: ERA5 + alternative_dataset: NCEP + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + + + va200: + <<: *corr_diag + variables: + va: + <<: *var_settings + preprocessor: regrid_4_5_pp200 + reference_dataset: ERA5 + alternative_dataset: NCEP + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + + + va850: + <<: *corr_diag + variables: + va: + <<: *var_settings + preprocessor: regrid_4_5_pp850 + reference_dataset: ERA5 + alternative_dataset: NCEP + additional_datasets: + - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} + - {dataset: CanCM4} + - {dataset: CanESM2} + - {dataset: CMCC-CESM} + - {dataset: CMCC-CMS} + - {dataset: EC-EARTH, ensemble: r6i1p1} + - {dataset: GFDL-CM2p1} + - {dataset: GISS-E2-H, ensemble: r1i1p2} + - {dataset: GISS-E2-H-CC} + - {dataset: GISS-E2-R, ensemble: r1i1p2} + - {dataset: GISS-E2-R-CC} + - {dataset: HadCM3} + - {<<: *cmip6, dataset: BCC-ESM1} + - {<<: *cmip6, dataset: CMCC-ESM2} + - {<<: *cmip6, dataset: E3SM-1-0, grid: gr} + - {<<: *cmip6, dataset: E3SM-1-1-ECA, institute: E3SM-Project, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-AerChem, grid: gr} + - {<<: *cmip6, dataset: EC-Earth3-CC, grid: gr} + - {<<: *cmip6, dataset: GISS-E2-1-G-CC} + - {<<: *cmip6, dataset: IPSL-CM5A2-INCA, grid: gr} + - {<<: *cmip6, dataset: KIOST-ESM, grid: gr1} + - {<<: *cmip6, dataset: MCM-UA-1-0} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} + - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + + + ### COLLECT CORRELATIONS AND PLOT ########################################### + fig_3_43: + description: Wrapper to collect and plot previously calculated correlations + scripts: + cor_collect: + script: ipcc_ar6/corr_pattern_collect.ncl + ancestors: ['*/pattern_cor'] + project_order: ['CMIP3', 'CMIP5', 'CMIP6'] + diag_order: ['tas', 'pr', 'rsut', 'rlut', 'swcre', + 'lwcre', 'psl', 'ts', 'ta850', 'ta200', + 'ua850', 'ua200', 'va850', 'va200', 'zg500', 'hus400'] + labels: [' Near-Surface ~C~ Air Temperature', 'Precipitation', + 'TOA Outgoing ~C~ Shortwave ~C~ Radiation', + 'TOA Outgoing ~C~ Longwave ~C~ Radiation', + ' TOA Shortwave ~C~ Cloud Radiative ~C~ Effect', + ' TOA Longwave ~C~ Cloud Radiative ~C~ Effect', + 'Sea Level ~C~ Pressure', + ' Surface ~C~ Temperature', + 'Temperature ~C~ 850 hPa', 'Temperature ~C~ 200 hPa', + 'Eastward Wind ~C~ 850 hPa', + 'Eastward Wind ~C~ 200 hPa', + 'Northward Wind ~C~ 850 hPa', + 'Northward Wind ~C~ 200 hPa', + 'Geopotential ~C~ Height ~C~ 500 hPa', + ' Specific ~C~ Humidity ~C~ 400 hPa'] diff --git a/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_9.yml b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_9.yml new file mode 100644 index 0000000000..20d7ac6a88 --- /dev/null +++ b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_9.yml @@ -0,0 +1,836 @@ +# ESMValTool +# recipe_ipccwg1ar6ch3_fig_3_9.yml +--- +documentation: + + title: IPCC AR6 WG1 Chapter 3 Fig. 3.9 + + description: | + Producing Fig. 3.9 in the IPCC Working Group I Contribution to the Sixth + Assessment Report: Chapter 3 + To run the recipe please upload the shapefile of the AR6 reference regions + (see detailed information in the documentation of this recipe). + + authors: + - bock_lisa + - eyring_veronika + + maintainer: + - bock_lisa + + projects: + - ipcc_ar6 + + references: + - eyring21ipcc + - iturbide20essd + + +preprocessors: + + regrid_5_5: + regrid: + target_grid: 5x5 + scheme: linear + + regrid_5_5_mmm: + regrid: + target_grid: 5x5 + scheme: linear + multi_model_statistics: + span: full + statistics: [mean] + + regrid_5_5_mmm_land: + mask_landsea: + mask_out: sea + regrid: + target_grid: 5x5 + scheme: linear + multi_model_statistics: + span: full + statistics: [mean] + + regrid_5_5_land: + mask_landsea: + mask_out: sea + regrid: + target_grid: 5x5 + scheme: linear + + regrid_5_5_mmm_ocean: + mask_landsea: + mask_out: land + regrid: + target_grid: 5x5 + scheme: linear + multi_model_statistics: + span: full + statistics: [mean] + + regrid_5_5_ocean: + mask_landsea: + mask_out: land + regrid: + target_grid: 5x5 + scheme: linear + + regrid_5_5_mmm_north_america: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - Greenland/Iceland + - N.W.North-America + - N.E.North-America + - W.North-America + - C.North-America + - E.North-America + regrid: + target_grid: 5x5 + scheme: linear + multi_model_statistics: + span: full + statistics: [mean] + + regrid_5_5_north_america: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - Greenland/Iceland + - N.W.North-America + - N.E.North-America + - W.North-America + - C.North-America + - E.North-America + regrid: + target_grid: 5x5 + scheme: linear + + regrid_5_5_mmm_south_america: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - N.Central-America + - S.Central-America + - Caribbean + - N.W.South-America + - N.South-America + - N.E.South-America + - South-American-Monsoon + - S.W.South-America + - S.E.South-America + - S.South-America + regrid: + target_grid: 5x5 + scheme: linear + multi_model_statistics: + span: full + statistics: [mean] + + regrid_5_5_south_america: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - N.Central-America + - S.Central-America + - Caribbean + - N.W.South-America + - N.South-America + - N.E.South-America + - South-American-Monsoon + - S.W.South-America + - S.E.South-America + - S.South-America + regrid: + target_grid: 5x5 + scheme: linear + + regrid_5_5_mmm_europe: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - N.Europe + - West&Central-Europe + - E.Europe + - Mediterranean + regrid: + target_grid: 5x5 + scheme: linear + multi_model_statistics: + span: full + statistics: [mean] + + regrid_5_5_europe: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - N.Europe + - West&Central-Europe + - E.Europe + - Mediterranean + regrid: + target_grid: 5x5 + scheme: linear + + regrid_5_5_mmm_africa: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - Sahara + - Western-Africa + - Central-Africa + - N.Eastern-Africa + - S.Eastern-Africa + - W.Southern-Africa + - E.Southern-Africa + - Madagascar + regrid: + target_grid: 5x5 + scheme: linear + multi_model_statistics: + span: full + statistics: [mean] + + regrid_5_5_africa: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - Sahara + - Western-Africa + - Central-Africa + - N.Eastern-Africa + - S.Eastern-Africa + - W.Southern-Africa + - E.Southern-Africa + - Madagascar + regrid: + target_grid: 5x5 + scheme: linear + + regrid_5_5_mmm_asia: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - Russian-Arctic + - W.Siberia + - E.Siberia + - Russian-Far-East + - W.C.Asia + - E.C.Asia + - Tibetan-Plateau + - E.Asia + - Arabian-Peninsula + - S.Asia + - S.E.Asia + regrid: + target_grid: 5x5 + scheme: linear + multi_model_statistics: + span: full + statistics: [mean] + + regrid_5_5_asia: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - Russian-Arctic + - W.Siberia + - E.Siberia + - Russian-Far-East + - W.C.Asia + - E.C.Asia + - Tibetan-Plateau + - E.Asia + - Arabian-Peninsula + - S.Asia + - S.E.Asia + regrid: + target_grid: 5x5 + scheme: linear + + regrid_5_5_mmm_australasia: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - N.Australia + - C.Australia + - E.Australia + - S.Australia + - New-Zealand + regrid: + target_grid: 5x5 + scheme: linear + multi_model_statistics: + span: full + statistics: [mean] + + regrid_5_5_australasia: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - N.Australia + - C.Australia + - E.Australia + - S.Australia + - New-Zealand + regrid: + target_grid: 5x5 + scheme: linear + + regrid_5_5_mmm_antarctica: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - E.Antarctica + - W.Antarctica + regrid: + target_grid: 5x5 + scheme: linear + multi_model_statistics: + span: full + statistics: [mean] + + regrid_5_5_antarctica: + extract_shape: + shapefile: IPCC-Regions/IPCC-WGI-reference-regions-v4.shp + method: contains + crop: false + ids: + - E.Antarctica + - W.Antarctica + regrid: + target_grid: 5x5 + scheme: linear + + +datasets_cmip6: &cmip6_models # historical+ssp245, all ensemble members, Amon + - {dataset: ACCESS-CM2, ensemble: r(1:3)i1p1f1, grid: gn} + - {dataset: ACCESS-ESM1-5, ensemble: r(1:11)i1p1f1, grid: gn} + - {dataset: ACCESS-ESM1-5, ensemble: r19i1p1f1, grid: gn} + - {dataset: AWI-CM-1-1-MR, ensemble: r1i1p1f1, grid: gn} + - {dataset: AWI-ESM-1-1-LR, ensemble: r1i1p1f1, grid: gn, end_year: 2014} + - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-ESM1, ensemble: r(1:3)i1p1f1, grid: gn, end_year: 2014} + - {dataset: CAMS-CSM1-0, ensemble: r(1:2)i1p1f1, grid: gn} + - {dataset: CanESM5-CanOE, ensemble: r(1:3)i1p2f1, grid: gn} + - {dataset: CanESM5, ensemble: r(1:25)i1p1f1, grid: gn} + - {dataset: CanESM5, ensemble: r(1:25)i1p2f1, grid: gn} + - {dataset: CESM2, ensemble: r4i1p1f1, grid: gn} + - {dataset: CESM2, ensemble: r(10:11)i1p1f1, grid: gn} + - {dataset: CESM2-FV2, ensemble: r(1:3)i1p1f1, grid: gn, end_year: 2014} + - {dataset: CESM2-WACCM, ensemble: r(1:3)i1p1f1, grid: gn} + - {dataset: CESM2-WACCM-FV2, ensemble: r(1:3)i1p1f1, grid: gn, + end_year: 2014} + - {dataset: CIESM, ensemble: r1i1p1f1, grid: gr} + - {dataset: CMCC-CM2-HR4, ensemble: r1i1p1f1, grid: gn, end_year: 2014} + - {dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn} + - {dataset: CMCC-ESM2, ensemble: r1i1p1f1, grid: gn} + - {dataset: CNRM-CM6-1, ensemble: r(1:10)i1p1f2, grid: gr} + - {dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r(1:5)i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, ensemble: r(7:10)i1p1f2, grid: gr} + - {dataset: E3SM-1-0, ensemble: r(1:5)i1p1f1, grid: gr, end_year: 2014} + - {dataset: E3SM-1-1-ECA, ensemble: r1i1p1f1, grid: gr, end_year: 2014} + - {dataset: E3SM-1-1, ensemble: r1i1p1f1, grid: gr, end_year: 2014} + - {dataset: EC-Earth3, ensemble: r(1:2)i1p1f1, grid: gr} + - {dataset: EC-Earth3, ensemble: r4i1p1f1, grid: gr} + - {dataset: EC-Earth3, ensemble: r(6:7)i1p1f1, grid: gr} + - {dataset: EC-Earth3, ensemble: r(9:10)i1p1f1, grid: gr} + - {dataset: EC-Earth3-AerChem, ensemble: r1i1p1f1, grid: gr, end_year: 2014} + - {dataset: EC-Earth3-AerChem, ensemble: r4i1p1f1, grid: gr, end_year: 2014} + - {dataset: EC-Earth3-CC, ensemble: r1i1p1f1, grid: gr} + - {dataset: EC-Earth3-Veg, ensemble: r(1:6)i1p1f1, grid: gr} + - {dataset: EC-Earth3-Veg, ensemble: r12i1p1f1, grid: gr} + - {dataset: EC-Earth3-Veg, ensemble: r14i1p1f1, grid: gr} + - {dataset: EC-Earth3-Veg-LR, ensemble: r(1:3)i1p1f1, grid: gr} + - {dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr} + - {dataset: FGOALS-g3, ensemble: r(1:4)i1p1f1, grid: gn} + - {dataset: FIO-ESM-2-0, ensemble: r(1:3)i1p1f1, grid: gn} + - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GFDL-ESM4, ensemble: r(1:3)i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-G, ensemble: r(1:10)i1p1f2, grid: gn} + - {dataset: GISS-E2-1-G, ensemble: r(1:5)i1p3f1, grid: gn} + - {dataset: GISS-E2-1-G, ensemble: r(1:4)i1p5f1, grid: gn} + - {dataset: GISS-E2-1-G-CC, ensemble: r1i1p1f1, grid: gn, end_year: 2014} + - {dataset: GISS-E2-1-H, ensemble: r(1:10)i1p1f1, grid: gn, end_year: 2014} + - {dataset: GISS-E2-1-H, ensemble: r(1:5)i1p1f2, grid: gn, end_year: 2014} + - {dataset: GISS-E2-1-H, ensemble: r(1:5)i1p3f1, grid: gn, end_year: 2014} + - {dataset: GISS-E2-1-H, ensemble: r(1:5)i1p5f1, grid: gn, end_year: 2014} + - {dataset: HadGEM3-GC31-LL, ensemble: r(1:4)i1p1f3, grid: gn} + - {dataset: HadGEM3-GC31-MM, ensemble: r(1:4)i1p1f3, grid: gn, + end_year: 2014} + - {dataset: IITM-ESM, ensemble: r1i1p1f1, grid: gn} + - {dataset: INM-CM4-8, ensemble: r1i1p1f1, grid: gr1} + - {dataset: INM-CM5-0, ensemble: r1i1p1f1, grid: gr1} + - {dataset: IPSL-CM5A2-INCA, ensemble: r1i1p1f1, grid: gr, end_year: 2014} + - {dataset: IPSL-CM6A-LR, ensemble: r(1:6)i1p1f1, grid: gr} + - {dataset: IPSL-CM6A-LR, ensemble: r(10:11)i1p1f1, grid: gr} + - {dataset: IPSL-CM6A-LR, ensemble: r14i1p1f1, grid: gr} + - {dataset: IPSL-CM6A-LR, ensemble: r22i1p1f1, grid: gr} + - {dataset: IPSL-CM6A-LR, ensemble: r25i1p1f1, grid: gr} + - {dataset: KACE-1-0-G, ensemble: r(1:3)i1p1f1, grid: gr} + - {dataset: KIOST-ESM, ensemble: r1i1p1f1, grid: gr1} + - {dataset: MCM-UA-1-0, ensemble: r1i1p1f2, grid: gn} + - {dataset: MIROC6, ensemble: r(1:50)i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r(1:2)i1p1f2, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r4i1p1f2, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r(6:9)i1p1f2, grid: gn} + - {dataset: MPI-ESM-1-2-HAM, ensemble: r(1:3)i1p1f1, grid: gn, + end_year: 2014} + - {dataset: MPI-ESM1-2-HR, ensemble: r(1:10)i1p1f1, grid: gn, end_year: 2014} + - {dataset: MPI-ESM1-2-LR, ensemble: r(1:10)i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, ensemble: r(1:5)i1p1f1, grid: gn} + - {dataset: NESM3, ensemble: r(1:2)i1p1f1, grid: gn} + - {dataset: NorCPM1, ensemble: r(1:30)i1p1f1, grid: gn, end_year: 2014} + - {dataset: NorESM2-LM, ensemble: r(1:3)i1p1f1, grid: gn} + - {dataset: NorESM2-MM, ensemble: r(1:2)i1p1f1, grid: gn} + - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, end_year: 2014} + - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r(1:2)i1p1f2, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r4i1p1f2, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r8i1p1f2, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r13i1p1f2, grid: gn} + + +models_cmip6_hist-nat: &models_cmip6_hist-nat # hist-nat, Amon, tas + - {dataset: ACCESS-ESM1-5, grid: gn, institute: CSIRO, + ensemble: r(1:3)i1p1f1} + - {dataset: BCC-CSM2-MR, grid: gn, ensemble: r(1:3)i1p1f1} + - {dataset: CanESM5, ensemble: r(1:15)i1p1f1, grid: gn} + - {dataset: CanESM5, ensemble: r(20:25)i1p1f1, grid: gn} + - {dataset: CanESM5, ensemble: r(1:15)i1p2f1, grid: gn} + - {dataset: CanESM5, ensemble: r17i1p2f1, grid: gn} + - {dataset: CanESM5, ensemble: r(19:25)i1p2f1, grid: gn} + - {dataset: CESM2, grid: gn, ensemble: r(1:3)i1p1f1, end_year: 2014} + - {dataset: CNRM-CM6-1, ensemble: r(1:10)i1p1f2} + - {dataset: FGOALS-g3, grid: gn, ensemble: r(1:3)i1p1f1} + - {dataset: GFDL-CM4, grid: gr1, ensemble: r1i1p1f1, end_year: 2014} + - {dataset: GFDL-ESM4, grid: gr1, ensemble: r(1:3)i1p1f1} + - {dataset: GISS-E2-1-G, ensemble: r(1:5)i1p1f2, grid: gn, end_year: 2014} + - {dataset: GISS-E2-1-G, ensemble: r(1:9)i1p1f3, grid: gn, end_year: 2014} + - {dataset: GISS-E2-1-G, ensemble: r(1:5)i1p1f4, grid: gn, end_year: 2014} + - {dataset: HadGEM3-GC31-LL, ensemble: r(1:4)i1p1f3, grid: gn} + - {dataset: IPSL-CM6A-LR, ensemble: r(1:10)i1p1f1} + - {dataset: MIROC6, ensemble: r(1:4)i1p1f1, grid: gn} + - {dataset: MIROC6, ensemble: r37i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, grid: gn, ensemble: r(1:5)i1p1f1} + - {dataset: NorESM2-LM, grid: gn, institute: NCC, ensemble: r(1:3)i1p1f1} + + +models_cmip6_hist-GHG: &models_cmip6_hist-GHG # hist-GHG, Amon, tas + - {dataset: ACCESS-ESM1-5, grid: gn, institute: CSIRO, + ensemble: r(1:3)i1p1f1} + - {dataset: BCC-CSM2-MR, grid: gn, ensemble: r(1:3)i1p1f1} + - {dataset: CanESM5, grid: gn, ensemble: r(1:25)i1p1f1} + - {dataset: CanESM5, grid: gn, ensemble: r(1:25)i1p2f1} + - {dataset: CESM2, grid: gn, ensemble: r(1:3)i1p1f1, end_year: 2014} + - {dataset: CNRM-CM6-1, ensemble: r(1:10)i1p1f2} + - {dataset: FGOALS-g3, grid: gn, ensemble: r(1:3)i1p1f1} + - {dataset: GFDL-ESM4, grid: gr1, ensemble: r1i1p1f1} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r(1:5)i1p1f1, end_year: 2014} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r(1:5)i1p1f2, end_year: 2014} + - {dataset: HadGEM3-GC31-LL, ensemble: r(1:4)i1p1f3, grid: gn} + - {dataset: IPSL-CM6A-LR, ensemble: r(1:10)i1p1f1} + - {dataset: MIROC6, grid: gn, ensemble: r(1:3)i1p1f1} + - {dataset: MRI-ESM2-0, grid: gn, ensemble: r(1:5)i1p1f1} + - {dataset: NorESM2-LM, grid: gn, institute: NCC, ensemble: r(2:3)i1p1f1} + +models_cmip6_hist-aer: &models_cmip6_hist-aer # hist-aer, Amon, tas + - {dataset: ACCESS-ESM1-5, grid: gn, institute: CSIRO, + ensemble: r(1:3)i1p1f1} + - {dataset: BCC-CSM2-MR, grid: gn, ensemble: r(1:2)i1p1f1} + - {dataset: CanESM5, grid: gn, ensemble: r(1:15)i1p1f1} + - {dataset: CanESM5, grid: gn, ensemble: r(1:15)i1p2f1} + - {dataset: CESM2, grid: gn, ensemble: r1i1p1f1, end_year: 2014} + - {dataset: CESM2, grid: gn, ensemble: r3i1p1f1, end_year: 2014} + - {dataset: CNRM-CM6-1, ensemble: r(1:10)i1p1f2} + - {dataset: FGOALS-g3, grid: gn, ensemble: r(1:3)i1p1f1} + - {dataset: GFDL-ESM4, grid: gr1, ensemble: r1i1p1f1} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r(1:5)i1p1f1, end_year: 2014} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r(1:5)i1p3f1, end_year: 2014} + - {dataset: HadGEM3-GC31-LL, ensemble: r(1:4)i1p1f3, grid: gn} + - {dataset: IPSL-CM6A-LR, ensemble: r(1:10)i1p1f1} + - {dataset: MIROC6, grid: gn, ensemble: r(1:4)i1p1f1} + - {dataset: MIROC6, grid: gn, ensemble: r8i1p1f1} + - {dataset: MRI-ESM2-0, grid: gn, ensemble: r(1:5)i1p1f1} + - {dataset: NorESM2-LM, grid: gn, institute: NCC, ensemble: r(1:3)i1p1f1} + +hadcrut5: &hadcrut5 + - {dataset: HadCRUT5, project: OBS, type: ground, version: 5.0.1.0-analysis, + tier: 2} + + +diagnostics: + + # ********************************************************************** + # IPCC WGI AR6, chap. 3 + # Sect. 3.3 + # Fig 3.9 + # ********************************************************************** + # Global and continental anomalies in annual mean near-surface temperature + # ********************************************************************** + + fig_3_9_tas_anom_damip_1: &diag_tas_anom + description: Anomaly of surface temperature. + variables: + tas_historical_global: &var_tas + short_name: tas + preprocessor: regrid_5_5_mmm + mip: Amon + project: CMIP6 + exp: [historical, ssp245] + grid: gr + ensemble: r1i1p1f1 + start_year: 1850 + end_year: 2020 + additional_datasets: *cmip6_models + tas_hist-nat_global: + <<: *var_tas + exp: hist-nat + additional_datasets: *models_cmip6_hist-nat + tas_hist-GHG_global: + <<: *var_tas + exp: hist-GHG + additional_datasets: *models_cmip6_hist-GHG + tas_hist-aer_global: + <<: *var_tas + exp: hist-aer + additional_datasets: *models_cmip6_hist-aer + tasa_global: + <<: *var_tas + short_name: tasa + preprocessor: regrid_5_5 + additional_datasets: *hadcrut5 + + tas_historical_land: + <<: *var_tas + preprocessor: regrid_5_5_mmm_land + additional_datasets: *cmip6_models + tas_hist-nat_land: + <<: *var_tas + exp: hist-nat + preprocessor: regrid_5_5_mmm_land + additional_datasets: *models_cmip6_hist-nat + tas_hist-GHG_land: + <<: *var_tas + exp: hist-GHG + preprocessor: regrid_5_5_mmm_land + additional_datasets: *models_cmip6_hist-GHG + tas_hist-aer_land: + <<: *var_tas + exp: hist-aer + preprocessor: regrid_5_5_mmm_land + additional_datasets: *models_cmip6_hist-aer + tasa_land: + <<: *var_tas + short_name: tasa + preprocessor: regrid_5_5_land + additional_datasets: *hadcrut5 + + tas_historical_ocean: + <<: *var_tas + preprocessor: regrid_5_5_mmm_ocean + additional_datasets: *cmip6_models + tas_hist-nat_ocean: + <<: *var_tas + exp: hist-nat + additional_datasets: *models_cmip6_hist-nat + tas_hist-GHG_ocean: + <<: *var_tas + exp: hist-GHG + preprocessor: regrid_5_5_mmm_ocean + additional_datasets: *models_cmip6_hist-GHG + tas_hist-aer_ocean: + <<: *var_tas + exp: hist-aer + preprocessor: regrid_5_5_mmm_ocean + additional_datasets: *models_cmip6_hist-aer + tasa_ocean: + <<: *var_tas + short_name: tasa + preprocessor: regrid_5_5_ocean + additional_datasets: *hadcrut5 + scripts: + tsline: &tsline_amon + script: ipcc_ar6/tas_anom_damip.ncl + ref_start: 1850 + ref_end: 1900 + start_year: 1850 + end_year: 2020 + plot_units: "degC" + y_min: -3.5 + y_max: 4.0 + ref_mask: true + header: ["Global Ocean", "Global", "Global Land"] + title: "global" + panels: [["tas_historical_ocean", "tas_hist-nat_ocean", + "tas_hist-GHG_ocean", "tas_hist-aer_ocean"], + ["tas_historical_global", "tas_hist-nat_global", + "tas_hist-GHG_global", "tas_hist-aer_global"], + ["tas_historical_land", "tas_hist-nat_land", + "tas_hist-GHG_land", "tas_hist-aer_land"]] + reference: ["tasa_ocean", "tasa_global", "tasa_land"] + panel_figure_strings: ["a)", "b)", "c)"] + legend: ["Anthropogenic + Natural", "Natural", + "Greenhouse Gases", "Aerosols"] + + + fig_3_9_tas_anom_damip_2: + <<: *diag_tas_anom + variables: + tas_historical_north_america: + <<: *var_tas + preprocessor: regrid_5_5_mmm_north_america + additional_datasets: *cmip6_models + tas_hist-nat_north_america: + <<: *var_tas + exp: hist-nat + preprocessor: regrid_5_5_mmm_north_america + additional_datasets: *models_cmip6_hist-nat + tas_hist-GHG_north_america: + <<: *var_tas + exp: hist-GHG + preprocessor: regrid_5_5_mmm_north_america + additional_datasets: *models_cmip6_hist-GHG + tas_hist-aer_north_america: + <<: *var_tas + exp: hist-aer + preprocessor: regrid_5_5_mmm_north_america + additional_datasets: *models_cmip6_hist-aer + tasa_north_america: + <<: *var_tas + short_name: tasa + preprocessor: regrid_5_5_north_america + additional_datasets: *hadcrut5 + + tas_historical_south_america: + <<: *var_tas + preprocessor: regrid_5_5_mmm_south_america + additional_datasets: *cmip6_models + tas_hist-nat_south_america: + <<: *var_tas + exp: hist-nat + preprocessor: regrid_5_5_mmm_south_america + additional_datasets: *models_cmip6_hist-nat + tas_hist-GHG_south_america: + <<: *var_tas + exp: hist-GHG + preprocessor: regrid_5_5_mmm_south_america + additional_datasets: *models_cmip6_hist-GHG + tas_hist-aer_south_america: + <<: *var_tas + exp: hist-aer + preprocessor: regrid_5_5_mmm_south_america + additional_datasets: *models_cmip6_hist-aer + tasa_south_america: + <<: *var_tas + short_name: tasa + preprocessor: regrid_5_5_south_america + additional_datasets: *hadcrut5 + + tas_historical_europe: + <<: *var_tas + preprocessor: regrid_5_5_mmm_europe + additional_datasets: *cmip6_models + tas_hist-nat_europe: + <<: *var_tas + exp: hist-nat + preprocessor: regrid_5_5_mmm_europe + additional_datasets: *models_cmip6_hist-nat + tas_hist-GHG_europe: + <<: *var_tas + exp: hist-GHG + preprocessor: regrid_5_5_mmm_europe + additional_datasets: *models_cmip6_hist-GHG + tas_hist-aer_europe: + <<: *var_tas + exp: hist-aer + preprocessor: regrid_5_5_mmm_europe + additional_datasets: *models_cmip6_hist-aer + tasa_europe: + <<: *var_tas + short_name: tasa + preprocessor: regrid_5_5_europe + additional_datasets: *hadcrut5 + scripts: + tsline: + <<: *tsline_amon + header: ["North America", "Central and South America", + "Europe and North Africa"] + title: "america_europe" + panels: [["tas_historical_north_america", "tas_hist-nat_north_america", + "tas_hist-GHG_north_america", "tas_hist-aer_north_america"], + ["tas_historical_south_america", "tas_hist-nat_south_america", + "tas_hist-GHG_south_america", "tas_hist-aer_south_america"], + ["tas_historical_europe", "tas_hist-nat_europe", + "tas_hist-GHG_europe", "tas_hist-aer_europe"]] + reference: ["tasa_north_america", "tasa_south_america", "tasa_europe"] + panel_figure_strings: ["d)", "e)", "f)"] + legend: ["Anthropogenic + Natural", "Natural", + "Greenhouse Gases", "Aerosols"] + + + fig_3_9_tas_anom_damip_3: + <<: *diag_tas_anom + variables: + tas_historical_africa: + <<: *var_tas + preprocessor: regrid_5_5_mmm_africa + additional_datasets: *cmip6_models + tas_hist-nat_africa: + <<: *var_tas + exp: hist-nat + preprocessor: regrid_5_5_mmm_africa + additional_datasets: *models_cmip6_hist-nat + tas_hist-GHG_africa: + <<: *var_tas + exp: hist-GHG + preprocessor: regrid_5_5_mmm_africa + additional_datasets: *models_cmip6_hist-GHG + tas_hist-aer_africa: + <<: *var_tas + exp: hist-aer + preprocessor: regrid_5_5_mmm_africa + additional_datasets: *models_cmip6_hist-aer + tasa_africa: + <<: *var_tas + short_name: tasa + preprocessor: regrid_5_5_africa + additional_datasets: *hadcrut5 + + tas_historical_asia: + <<: *var_tas + preprocessor: regrid_5_5_mmm_asia + additional_datasets: *cmip6_models + tas_hist-nat_asia: + <<: *var_tas + exp: hist-nat + preprocessor: regrid_5_5_mmm_asia + additional_datasets: *models_cmip6_hist-nat + tas_hist-GHG_asia: + <<: *var_tas + exp: hist-GHG + preprocessor: regrid_5_5_mmm_asia + additional_datasets: *models_cmip6_hist-GHG + tas_hist-aer_asia: + <<: *var_tas + exp: hist-aer + preprocessor: regrid_5_5_mmm_asia + additional_datasets: *models_cmip6_hist-aer + tasa_asia: + <<: *var_tas + short_name: tasa + preprocessor: regrid_5_5_asia + additional_datasets: *hadcrut5 + + tas_historical_australasia: + <<: *var_tas + preprocessor: regrid_5_5_mmm_australasia + additional_datasets: *cmip6_models + tas_hist-nat_australasia: + <<: *var_tas + exp: hist-nat + preprocessor: regrid_5_5_mmm_australasia + additional_datasets: *models_cmip6_hist-nat + tas_hist-GHG_australasia: + <<: *var_tas + exp: hist-GHG + preprocessor: regrid_5_5_mmm_australasia + additional_datasets: *models_cmip6_hist-GHG + tas_hist-aer_australasia: + <<: *var_tas + exp: hist-aer + preprocessor: regrid_5_5_mmm_australasia + additional_datasets: *models_cmip6_hist-aer + tasa_australasia: + <<: *var_tas + short_name: tasa + preprocessor: regrid_5_5_australasia + additional_datasets: *hadcrut5 + scripts: + tsline: + <<: *tsline_amon + header: ["Africa", "Asia", "Australasia"] + title: "africa_asia" + panels: [["tas_historical_africa", "tas_hist-nat_africa", + "tas_hist-GHG_africa", "tas_hist-aer_africa"], + ["tas_historical_asia", "tas_hist-nat_asia", + "tas_hist-GHG_asia", "tas_hist-aer_asia"], + ["tas_historical_australasia", "tas_hist-nat_australasia", + "tas_hist-GHG_australasia", "tas_hist-aer_australasia"]] + reference: ["tasa_africa", "tasa_asia", "tasa_australasia"] + panel_figure_strings: ["g)", "h)", "i)"] + legend: ["Anthropogenic + Natural", "Natural", + "Greenhouse Gases", "Aerosols"] + + + fig_3_9_tas_anom_damip_4: + variables: + tas_historical_antarctica: + <<: *var_tas + start_year: 1950 + preprocessor: regrid_5_5_mmm_antarctica + additional_datasets: *cmip6_models + tas_hist-nat_antarctica: + <<: *var_tas + start_year: 1950 + exp: hist-nat + preprocessor: regrid_5_5_mmm_antarctica + additional_datasets: *models_cmip6_hist-nat + tas_hist-GHG_antarctica: + <<: *var_tas + start_year: 1950 + exp: hist-GHG + preprocessor: regrid_5_5_mmm_antarctica + additional_datasets: *models_cmip6_hist-GHG + tas_hist-aer_antarctica: + <<: *var_tas + start_year: 1950 + exp: hist-aer + preprocessor: regrid_5_5_mmm_antarctica + additional_datasets: *models_cmip6_hist-aer + tasa_antarctica: + <<: *var_tas + start_year: 1950 + short_name: tasa + preprocessor: regrid_5_5_antarctica + additional_datasets: *hadcrut5 + scripts: + tsline: + <<: *tsline_amon + ref_start: 1950 + ref_end: 2010 + header: ["Antarctica"] + title: "antarctica" + panels: [["tas_historical_antarctica", "tas_hist-nat_antarctica", + "tas_hist-GHG_antarctica", "tas_hist-aer_antarctica"]] + reference: ["tasa_antarctica"] + panel_figure_strings: ["j)"] + legend: ["Anthropogenic + Natural", "Natural", + "Greenhouse Gases", "Aerosols"] diff --git a/esmvaltool/recipes/monitor/recipe_monitor.yml b/esmvaltool/recipes/monitor/recipe_monitor.yml index 8ea9f90a0e..a37f186583 100644 --- a/esmvaltool/recipes/monitor/recipe_monitor.yml +++ b/esmvaltool/recipes/monitor/recipe_monitor.yml @@ -18,8 +18,6 @@ preprocessors: timeseries_regular: area_statistics: operator: mean - fx_variables: - areacella: climatology: climate_statistics: @@ -79,8 +77,6 @@ preprocessors: mask_out: land area_statistics: operator: mean - fx_variables: - areacello: nino3: <<: *index diff --git a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml index e55fb5c6a8..2de21f2a93 100644 --- a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml +++ b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml @@ -12,7 +12,7 @@ documentation: datasets: - - {project: CMIP6, dataset: EC-Earth3, exp: historical, ensemble: r1i1p1f1, start_year: 1979, end_year: 2014} + - {project: CMIP6, dataset: EC-Earth3, exp: historical, ensemble: r1i1p1f1, start_year: 1979, end_year: 2014, plot_label: 'EC-Earth3 historical'} # Note: plot_label currently only used by diagnostic plot_multiple_annual_cycles preprocessors: @@ -20,8 +20,17 @@ preprocessors: timeseries_regular: area_statistics: operator: mean - fx_variables: - areacella: + + annual_cycle_nh: + extract_region: + start_latitude: 0 + end_latitude: 90 + start_longitude: 0 + end_longitude: 360 + area_statistics: + operator: mean + climate_statistics: + period: monthly full_climatology: climate_statistics: @@ -66,11 +75,37 @@ diagnostics: annual_mean_kwargs: linestyle: '--' plot_kwargs: - EC-Earth3: + EC-Earth3: # = dataset since 'facet_used_for_labels' is 'dataset' by default color: C0 ERA5: color: black + plot_multiple_annual_cycles: + description: Plot annual cycles including reference datasets. + variables: + tas: + mip: Amon + preprocessor: annual_cycle_nh + grid: gr + additional_datasets: + - {project: native6, dataset: ERA5, type: reanaly, version: v1, tier: 3, start_year: 1979, end_year: 2014, plot_label: 'Reference (ERA5)'} + scripts: + plot: + <<: *plot_multi_dataset_default + facet_used_for_labels: plot_label + plots: + annual_cycle: + legend_kwargs: + loc: upper right + plot_kwargs: + 'EC-Earth3 historical': # = plot_label since 'facet_used_for_labels: plot_label' + color: C0 + 'Reference (ERA5)': + color: black + pyplot_kwargs: + title: Near-Surface Air Temperature on Northern Hemisphere + ylim: [280, 297] + plot_maps_with_references: description: Plot climatology maps including reference datasets. variables: diff --git a/esmvaltool/recipes/mpqb/recipe_mpqb_xch4.yml b/esmvaltool/recipes/mpqb/recipe_mpqb_xch4.yml index c15d4950a6..cdd61087b4 100644 --- a/esmvaltool/recipes/mpqb/recipe_mpqb_xch4.yml +++ b/esmvaltool/recipes/mpqb/recipe_mpqb_xch4.yml @@ -43,8 +43,6 @@ global_mon: &global_mon mask_multimodel: area_statistics: operator: mean - fx_variables: - areacella: monthly_statistics: operator: mean @@ -54,8 +52,6 @@ global_ann: &global_ann mask_multimodel: area_statistics: operator: mean - fx_variables: - areacella: annual_statistics: operator: mean @@ -66,8 +62,6 @@ sh_mon: &sh_mon mask_multimodel: area_statistics: operator: mean - fx_variables: - areacella: monthly_statistics: operator: mean @@ -78,8 +72,6 @@ sh_ann: &sh_ann mask_multimodel: area_statistics: operator: mean - fx_variables: - areacella: annual_statistics: operator: mean @@ -90,8 +82,6 @@ nh_mon: &nh_mon mask_multimodel: area_statistics: operator: mean - fx_variables: - areacella: monthly_statistics: operator: mean @@ -102,8 +92,6 @@ nh_ann: &nh_ann mask_multimodel: area_statistics: operator: mean - fx_variables: - areacella: annual_statistics: operator: mean diff --git a/esmvaltool/recipes/recipe_anav13jclim.yml b/esmvaltool/recipes/recipe_anav13jclim.yml index 312db1bd84..08559c2691 100644 --- a/esmvaltool/recipes/recipe_anav13jclim.yml +++ b/esmvaltool/recipes/recipe_anav13jclim.yml @@ -548,7 +548,8 @@ diagnostics: reference_dataset: HWSD plot_units: PgC additional_datasets: - - {dataset: HWSD, project: OBS, type: reanaly, version: 1.2, tier: 3, start_year: 2000, end_year: 2000} + - {dataset: HWSD, project: OBS, type: reanaly, version: 1.2, tier: 3, start_year: 2000, end_year: 2000, + supplementary_variables: [{short_name: sftlf, mip: fx}]} additional_datasets: - {dataset: BNU-ESM} - {dataset: CanESM2} @@ -611,8 +612,8 @@ diagnostics: - {dataset: IPSL-CM5A-LR} - {dataset: IPSL-CM5A-MR} - {dataset: IPSL-CM5B-LR} - - {dataset: MIROC-ESM} - - {dataset: MIROC-ESM-CHEM} + - {dataset: MIROC-ESM, supplementary_variables: [{short_name: sftlf, mip: fx, ensemble: r0i0p0}, {short_name: sftof, skip: true}]} + - {dataset: MIROC-ESM-CHEM, supplementary_variables: [{short_name: sftlf, mip: fx, ensemble: r0i0p0}, {short_name: sftof, skip: true}]} - {dataset: MPI-ESM-LR} - {dataset: MPI-ESM-MR} - {dataset: NorESM1-ME} diff --git a/esmvaltool/recipes/recipe_autoassess_landsurface_permafrost.yml b/esmvaltool/recipes/recipe_autoassess_landsurface_permafrost.yml index b11a934400..897dcd5f19 100644 --- a/esmvaltool/recipes/recipe_autoassess_landsurface_permafrost.yml +++ b/esmvaltool/recipes/recipe_autoassess_landsurface_permafrost.yml @@ -5,9 +5,6 @@ documentation: description: | Recipe that runs the Autoassess Land-surface assessment area diagnostic. Land surface area and ice masks are time independent. - Climatological files are stored externally to avoid overloading the - ESMValTool source. See /gws/nopw/j04/esmeval/autoassess_specific_files - (on JASMIN). authors: - predoi_valeriu @@ -55,7 +52,6 @@ diagnostics: obs_models: [] start: 1993/12/01 end: 2002/12/01 - climfiles_root: '/gws/nopw/j04/esmeval/autoassess_specific_files/files' # on JASMIN plot_standard: description: Wrapper to collect and plot previously calculated metrics diff --git a/esmvaltool/recipes/recipe_autoassess_radiation_rms_Amon_all.yml b/esmvaltool/recipes/recipe_autoassess_radiation_rms_Amon_all.yml deleted file mode 100644 index e4336e17fc..0000000000 --- a/esmvaltool/recipes/recipe_autoassess_radiation_rms_Amon_all.yml +++ /dev/null @@ -1,134 +0,0 @@ -# ESMValTool -# recipe_autoassess_radiation_rms_Amon_all.yml ---- -documentation: - description: | - Diagnostics of spatial RMS errors of radiation and clouds. - - authors: - - read_simon - - predoi_valeriu - - sellar_alistair - - title: Diagnostics of spatial RMS errors of radiation and clouds. - - maintainer: - - predoi_valeriu - - projects: - - cmug - -datasets: - - {dataset: MPI-ESM-LR, project: CMIP5, mip: Amon, exp: historical, ensemble: r1i1p1, start_year: 2001, end_year: 2005} - - {dataset: NorESM1-M, project: CMIP5, mip: Amon, exp: historical, ensemble: r1i1p1, start_year: 2001, end_year: 2005} - -preprocessors: - pp_rad: - regrid: - target_grid: 1x1 - scheme: linear - pp_rad_derive_var: - # use this not to overwrite variables that are used both - # for derivation and as standalone diag vars - regrid: - target_grid: 1x1 - scheme: linear - -diagnostics: - radiation_Amon_all_CERES-EBAF: - description: "CMIP5 vs CERES-EBAF" - variables: - rtnt: # TOA TOT net - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - rsnt: # TOA SW net - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - swcre: # TOA SW Cloud Radiative Effect - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - lwcre: # TOA LW Cloud Radiative Effect - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - rsns: # obs: ceres; name: Surf SW net all sky - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - rlns: # Surf LW net all sky - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - rsut: # TOA SW up all sky - preprocessor: pp_rad - rlut: # TOA LW up all sky - preprocessor: pp_rad - rsutcs: # TOA SW up clear sky - preprocessor: pp_rad - additional_datasets: - - {dataset: CERES-EBAF, project: obs4MIPs, mip: Amon, level: L3B, version: Ed2-7, start_year: 2001, end_year: 2012, tier: 1} - scripts: - autoassess_Radiation_rms_Amon_all: - script: autoassess/autoassess_radiation_rms.py - title: "Autoassess Radiation RMS Amon All (vs. CERES-EBAF)" - control_model: MPI-ESM-LR - exper_model: NorESM1-M - observational_datasets: ['CERES-EBAF'] # list of at least one element; if no OBS wanted comment out - analysis_type: lat_lon # use any of: lat_lon, zonal_mean, vertical_mean - landsea_mask: landsea.nc - - radiation_Amon_all_JRA-55: - description: "CMIP5 vs JRA-55" - variables: - rlutcs: # TOA LW up clear sky - preprocessor: pp_rad - rldscs: # Surf LW down clear sky - preprocessor: pp_rad - additional_datasets: - - {dataset: JRA-55, project: ana4mips, mip: Amon, type: reanalysis, start_year: 2001, end_year: 2005, tier: 1} - scripts: - autoassess_Radiation_rms_Amon_all: - script: autoassess/autoassess_radiation_rms.py - title: "Autoassess Radiation RMS Amon All (vs. JRA-55)" - control_model: MPI-ESM-LR - exper_model: NorESM1-M - observational_datasets: ['JRA-55'] # list of at least one element; if no OBS wanted comment out - analysis_type: lat_lon # use any of: lat_lon, zonal_mean, vertical_mean - landsea_mask: landsea.nc - - radiation_Amon_all_SSMI-MERIS: - description: "CMIP5 vs SSMI-MERIS" - variables: - prw: # Column Water vapour - preprocessor: pp_rad - additional_datasets: - - {dataset: SSMI-MERIS, project: obs4MIPs, mip: Amon, level: L3, version: v1-00, start_year: 2003, end_year: 2008, tier: 1} - scripts: - autoassess_Radiation_rms_Amon_all: - script: autoassess/autoassess_radiation_rms.py - title: "Autoassess Radiation RMS Amon All (vs. SSMI-MERIS)" - control_model: MPI-ESM-LR - exper_model: NorESM1-M - observational_datasets: ['SSMI-MERIS'] # list of at least one element; if no OBS wanted comment out - analysis_type: lat_lon # use any of: lat_lon, zonal_mean, vertical_mean - landsea_mask: landsea.nc - - radiation_Amon_all_GPCP-SG: - description: "CMIP5 vs GPCP-SG" - variables: - pr: # Precipitation - preprocessor: pp_rad - additional_datasets: - - {dataset: GPCP-SG, project: obs4MIPs, mip: Amon, level: L3, version: v2.2, start_year: 2001, end_year: 2009, tier: 1} - scripts: - autoassess_Radiation_rms_Amon_all: - script: autoassess/autoassess_radiation_rms.py - title: "Autoassess Radiation RMS Amon All (vs. GPCP-SG)" - control_model: MPI-ESM-LR - exper_model: NorESM1-M - observational_datasets: ['GPCP-SG'] # list of at least one element; if no OBS wanted comment out - analysis_type: lat_lon # use any of: lat_lon, zonal_mean, vertical_mean - landsea_mask: landsea.nc diff --git a/esmvaltool/recipes/recipe_autoassess_radiation_rms_Amon_obs.yml b/esmvaltool/recipes/recipe_autoassess_radiation_rms_Amon_obs.yml deleted file mode 100644 index f5667278f5..0000000000 --- a/esmvaltool/recipes/recipe_autoassess_radiation_rms_Amon_obs.yml +++ /dev/null @@ -1,139 +0,0 @@ -# ESMValTool -# recipe_autoassess_radiation_rms_Amon_obs.yml ---- -documentation: - description: | - Diagnostics of spatial RMS errors of radiation and clouds. - - authors: - - read_simon - - predoi_valeriu - - sellar_alistair - - title: Diagnostics of spatial RMS errors of radiation and clouds (with OBS data). - - maintainer: - - predoi_valeriu - - projects: - - cmug - -datasets: - # ESMValTool v1 has no specific models here; it says use whatever you want but no more than what Amon_all uses - - {dataset: MPI-ESM-LR, project: CMIP5, mip: Amon, exp: historical, ensemble: r1i1p1, start_year: 2001, end_year: 2005} - - {dataset: NorESM1-M, project: CMIP5, mip: Amon, exp: historical, ensemble: r1i1p1, start_year: 2001, end_year: 2005} - -preprocessors: - pp_rad: - regrid: - target_grid: 1x1 - scheme: linear - pp_rad_derive_var: - # use this not to overwrite variables that are used both - # for derivation and as standalone diag vars - regrid: - target_grid: 1x1 - scheme: linear - -diagnostics: - radiation_Amon_obs_CERES-EBAF: - description: "CMIP5 vs CERES-EBAF" - variables: - rtnt: # TOA TOT net - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - rsnt: # TOA SW net - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - swcre: # TOA SW Cloud Radiative Effect - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - lwcre: # TOA LW Cloud Radiative Effect - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - rsns: # Surf SW net all sky - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - rlns: # Surf LW net all sky - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - rsut: # TOA SW up all sky - preprocessor: pp_rad - rlut: # TOA LW up all sky - preprocessor: pp_rad - rsutcs: # TOA SW up clear sky - preprocessor: pp_rad - additional_datasets: - - {dataset: CERES-EBAF, project: obs4MIPs, mip: Amon, level: L3B, version: Ed2-7, start_year: 2001, end_year: 2012, tier: 1} - - {dataset: CERES-SYN1deg, project: OBS, mip: Amon, type: sat, version: Ed3A, start_year: 2001, end_year: 2015, tier: 3} - scripts: - autoassess_Radiation_rms_Amon_obs: - script: autoassess/autoassess_radiation_rms.py - title: "Autoassess Radiation RMS Amon All (vs. CERES-EBAF)" - control_model: MPI-ESM-LR - exper_model: NorESM1-M - observational_datasets: ['CERES-EBAF', 'CERES-SYN1deg'] # list of at least one element; if no OBS wanted comment out - analysis_type: lat_lon # use any of: lat_lon, zonal_mean, vertical_mean - landsea_mask: landsea.nc - - radiation_Amon_obs_JRA-55: - description: "CMIP5 vs JRA-55" - variables: - rlutcs: # TOA LW up clear sky - preprocessor: pp_rad - rldscs: # Surf LW down clear sky - preprocessor: pp_rad - additional_datasets: - - {dataset: JRA-55, project: ana4mips, mip: Amon, type: reanalysis, start_year: 2001, end_year: 2005, tier: 1} - - {dataset: CERES-SYN1deg, project: OBS, mip: Amon, type: sat, version: Ed3A, start_year: 2001, end_year: 2015, tier: 3} - scripts: - autoassess_Radiation_rms_Amon_obs: - script: autoassess/autoassess_radiation_rms.py - title: "Autoassess Radiation RMS Amon All (vs. JRA-55)" - control_model: MPI-ESM-LR - exper_model: NorESM1-M - observational_datasets: ['JRA-55', 'CERES-SYN1deg'] # list of at least one element; if no OBS wanted comment out - analysis_type: lat_lon # use any of: lat_lon, zonal_mean, vertical_mean - landsea_mask: landsea.nc - - radiation_Amon_obs_SSMI-MERIS: - description: "CMIP5 vs SSMI-MERIS" - variables: - prw: # Column Water vapour - preprocessor: pp_rad - additional_datasets: - - {dataset: SSMI-MERIS, project: obs4MIPs, mip: Amon, level: L3, version: v1-00, start_year: 2003, end_year: 2008, tier: 1} - - {dataset: SSMI, project: obs4MIPs, mip: Amon, level: L3, version: RSSv07r00, start_year: 1988, end_year: 2006, tier: 1} - scripts: - autoassess_Radiation_rms_Amon_obs: - script: autoassess/autoassess_radiation_rms.py - title: "Autoassess Radiation RMS Amon All (vs. SSMI-MERIS)" - control_model: MPI-ESM-LR - exper_model: NorESM1-M - observational_datasets: ['SSMI-MERIS', 'SSMI'] # list of at least one element; if no OBS wanted comment out - analysis_type: lat_lon # use any of: lat_lon, zonal_mean, vertical_mean - landsea_mask: landsea.nc - - radiation_Amon_obs_GPCP-SG: - description: "CMIP5 vs GPCP-SG" - variables: - pr: # Precipitation - preprocessor: pp_rad - additional_datasets: - - {dataset: GPCP-SG, project: obs4MIPs, mip: Amon, level: L3, version: v2.2, start_year: 2001, end_year: 2009, tier: 1} - - {dataset: TRMM-L3, project: obs4MIPs, mip: Amon, level: v7, version: 7A, start_year: 1998, end_year: 2013, tier: 1} - scripts: - autoassess_Radiation_rms_Amon_obs: - script: autoassess/autoassess_radiation_rms.py - title: "Autoassess Radiation RMS Amon All (vs. GPCP-SG)" - control_model: MPI-ESM-LR - exper_model: NorESM1-M - observational_datasets: ['GPCP-SG', 'TRMM-L3'] # list of at least one element; if no OBS wanted comment out - analysis_type: lat_lon # use any of: lat_lon, zonal_mean, vertical_mean - landsea_mask: landsea.nc diff --git a/esmvaltool/recipes/recipe_autoassess_radiation_rms_cfMon_all.yml b/esmvaltool/recipes/recipe_autoassess_radiation_rms_cfMon_all.yml deleted file mode 100644 index 40fba30d47..0000000000 --- a/esmvaltool/recipes/recipe_autoassess_radiation_rms_cfMon_all.yml +++ /dev/null @@ -1,70 +0,0 @@ -# ESMValTool -# recipe_autoassess_radiation_rms_cfMon_all.yml ---- -documentation: - description: | - Diagnostics of spatial RMS errors of radiation and clouds. - - authors: - - tsushima_yoko - - read_simon - - predoi_valeriu - - title: Diagnostics of spatial RMS errors of radiation and clouds (cfMon). - - maintainer: - - predoi_valeriu - - projects: - - cmug - -datasets: - - {dataset: MRI-CGCM3, project: CMIP5, mip: cfMon, exp: amip, ensemble: r1i1p1, start_year: 1985, end_year: 1988} - - {dataset: HadGEM2-A, project: CMIP5, mip: cfMon, exp: amip, ensemble: r1i1p1, start_year: 1985, end_year: 1988} - -preprocessors: - pp_rad_derive_var: - regrid: - target_grid: 1x1 - scheme: linear - -diagnostics: - radiation_cfMon_all_ISCCP: - description: "CMIP5 vs ISCCP Clouds" - variables: - cllmtisccp: # Low-intermediate Cloud - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - clltkisccp: # Low-thick Cloud - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - clmmtisccp: # Middle-intermediate Cloud - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - clmtkisccp: # Middle-thick Cloud - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - clhmtisccp: # High-intermediate Cloud - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - clhtkisccp: # High-thick Cloud - preprocessor: pp_rad_derive_var - derive: true - force_derivation: false - additional_datasets: - - {dataset: ISCCP, project: obs4MIPs, mip: Amon, level: L3, version: V1.0, start_year: 1985, end_year: 1988, tier: 1} - scripts: - autoassess_Radiation_rms_cfMon_all: - script: autoassess/autoassess_radiation_rms.py - title: "Autoassess Radiation RMS Amon All (vs. CERES-EBAF)" - control_model: MRI-CGCM3 - exper_model: HadGEM2-A - observational_datasets: ['ISCCP'] # list of at least one element; if no OBS wanted comment out - analysis_type: lat_lon # use any of: lat_lon, zonal_mean, vertical_mean - landsea_mask: landsea.nc - diff --git a/esmvaltool/recipes/recipe_climate_change_hotspot.yml b/esmvaltool/recipes/recipe_climate_change_hotspot.yml index 65f76ed0a6..880b9c66d1 100644 --- a/esmvaltool/recipes/recipe_climate_change_hotspot.yml +++ b/esmvaltool/recipes/recipe_climate_change_hotspot.yml @@ -52,7 +52,7 @@ cmip5_85: &cmip5_85 - {<<: *cmip5_h-rcp85, dataset: CSIRO-Mk3-6-0, ensemble: r(1:10)i1p1} - - {<<: *cmip5_h-rcp85, dataset: FGOALS-s2, ensemble: r(1:3)i1p1} + # - {<<: *cmip5_h-rcp85, dataset: FGOALS-s2, ensemble: r(1:3)i1p1} - {<<: *cmip5_h-rcp85, dataset: FIO-ESM, ensemble: r(1:3)i1p1} @@ -66,11 +66,13 @@ cmip5_85: &cmip5_85 - {<<: *cmip5_h-rcp85, dataset: GISS-E2-H-CC} - - {<<: *cmip5_h-rcp85, dataset: GISS-E2-R, ensemble: r(1:2)i1p1} + # - {<<: *cmip5_h-rcp85, dataset: GISS-E2-R, ensemble: r(1:2)i1p1} + + - {<<: *cmip5_h-rcp85, dataset: GISS-E2-R, ensemble: r1i1p1} - {<<: *cmip5_h-rcp85, dataset: GISS-E2-R-CC} - - {<<: *cmip5_h-rcp85, dataset: HadGEM2-AO} + # - {<<: *cmip5_h-rcp85, dataset: HadGEM2-AO} - {<<: *cmip5_h-rcp85, dataset: HadGEM2-ES, ensemble: r(1:4)i1p1} @@ -94,7 +96,7 @@ cmip5_85: &cmip5_85 - {<<: *cmip5_h-rcp85, dataset: MRI-CGCM3} - - {<<: *cmip5_h-rcp85, dataset: MRI-ESM1} + # - {<<: *cmip5_h-rcp85, dataset: MRI-ESM1} - {<<: *cmip5_h-rcp85, dataset: NorESM1-M} @@ -130,7 +132,7 @@ cmip5_45: &cmip5_45 - {<<: *cmip5_h-rcp45, dataset: CSIRO-Mk3-6-0, ensemble: r(1:10)i1p1} - - {<<: *cmip5_h-rcp45, dataset: FGOALS-s2, ensemble: r(1:3)i1p1} + # - {<<: *cmip5_h-rcp45, dataset: FGOALS-s2, ensemble: r(1:3)i1p1} - {<<: *cmip5_h-rcp45, dataset: FIO-ESM, ensemble: r(1:3)i1p1} @@ -202,7 +204,7 @@ cmip5_26: &cmip5_26 - {<<: *cmip5_h-rcp26, dataset: GISS-E2-R} - - {<<: *cmip5_h-rcp26, dataset: HadGEM2-AO} + # - {<<: *cmip5_h-rcp26, dataset: HadGEM2-AO} - {<<: *cmip5_h-rcp26, dataset: HadGEM2-ES, ensemble: r(1:4)i1p1} @@ -254,7 +256,8 @@ cmip6_85: &cmip6_85 ensemble: r(1:3)i1p2f1, } - - {<<: *cmip6_h-ssp585, dataset: CESM2, ensemble: r(1:2)i1p1f1} +# - {<<: *cmip6_h-ssp585, dataset: CESM2, ensemble: r(1:2)i1p1f1} + - {<<: *cmip6_h-ssp585, dataset: CESM2, ensemble: r1i1p1f1} - {<<: *cmip6_h-ssp585, dataset: CESM2-WACCM} @@ -291,15 +294,11 @@ cmip6_85: &cmip6_85 - {<<: *cmip6_h-ssp585, dataset: HadGEM3-GC31-LL, ensemble: r(1:3)i1p1f3} - - {<<: *cmip6_h-ssp585, dataset: INM-CM4-8, grid: gr} - - - {<<: *cmip6_h-ssp585, dataset: INM-CM5-0, grid: gr} - - {<<: *cmip6_h-ssp585, dataset: IPSL-CM6A-LR, grid: gr} - {<<: *cmip6_h-ssp585, dataset: KACE-1-0-G, grid: gr} - - {<<: *cmip6_h-ssp585, dataset: MCM-UA-1-0, ensemble: [r1i1p1f1, r1i1p1f2]} + - {<<: *cmip6_h-ssp585, dataset: MCM-UA-1-0, ensemble: r1i1p1f2} # ensemble: [r1i1p1f1, r1i1p1f2] changed due to ESMValCore issue 1964 - {<<: *cmip6_h-ssp585, dataset: MIROC6, ensemble: r(1:3)i1p1f1} @@ -347,8 +346,8 @@ cmip6_45: &cmip6_45 ensemble: r(1:3)i1p2f1, } - - {<<: *cmip6_h-ssp245, dataset: CAS-ESM2-0, ensemble: r1i1p1f1} - - {<<: *cmip6_h-ssp245, dataset: CAS-ESM2-0, ensemble: r3i1p1f1} + # - {<<: *cmip6_h-ssp245, dataset: CAS-ESM2-0, ensemble: r1i1p1f1} + # - {<<: *cmip6_h-ssp245, dataset: CAS-ESM2-0, ensemble: r3i1p1f1} - {<<: *cmip6_h-ssp245, dataset: CESM2, ensemble: r1i1p1f1} - {<<: *cmip6_h-ssp245, dataset: CESM2, ensemble: r4i1p1f1} @@ -392,10 +391,6 @@ cmip6_45: &cmip6_45 - {<<: *cmip6_h-ssp245, dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3} - - {<<: *cmip6_h-ssp245, dataset: INM-CM4-8, grid: gr1} - - - {<<: *cmip6_h-ssp245, dataset: INM-CM5-0, grid: gr1} - - { <<: *cmip6_h-ssp245, dataset: IPSL-CM6A-LR, @@ -417,7 +412,7 @@ cmip6_45: &cmip6_45 - {<<: *cmip6_h-ssp245, dataset: KIOST-ESM, grid: gr1} - - {<<: *cmip6_h-ssp245, dataset: MCM-UA-1-0, ensemble: [r1i1p1f1, r1i1p1f2]} + - {<<: *cmip6_h-ssp245, dataset: MCM-UA-1-0, ensemble: r1i1p1f2} # ensemble: [r1i1p1f1, r1i1p1f2] changed due to ESMValCore issue 1964 - {<<: *cmip6_h-ssp245, dataset: MIROC6, ensemble: r(1:3)i1p1f1} @@ -495,10 +490,6 @@ cmip6_26: &cmip6_26 - {<<: *cmip6_h-ssp126, dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3} - - {<<: *cmip6_h-ssp126, dataset: INM-CM4-8, grid: gr1} - - - {<<: *cmip6_h-ssp126, dataset: INM-CM5-0, grid: gr1} - - { <<: *cmip6_h-ssp126, dataset: IPSL-CM6A-LR, @@ -509,7 +500,7 @@ cmip6_26: &cmip6_26 - {<<: *cmip6_h-ssp126, dataset: KACE-1-0-G, ensemble: r(1:2)i1p1f1, grid: gr} - - {<<: *cmip6_h-ssp126, dataset: MCM-UA-1-0, ensemble: [r1i1p1f1, r1i1p1f2]} + - {<<: *cmip6_h-ssp126, dataset: MCM-UA-1-0, ensemble: r1i1p1f2} # ensemble: [r1i1p1f1, r1i1p1f2] changed due to ESMValCore issue 1964 - {<<: *cmip6_h-ssp126, dataset: MIROC6, ensemble: r(1:3)i1p1f1} diff --git a/esmvaltool/recipes/recipe_climwip_brunner2019_med.yml b/esmvaltool/recipes/recipe_climwip_brunner2019_med.yml index 20298061cd..651d78933c 100644 --- a/esmvaltool/recipes/recipe_climwip_brunner2019_med.yml +++ b/esmvaltool/recipes/recipe_climwip_brunner2019_med.yml @@ -144,7 +144,7 @@ datasets: &model_data obs_data: &obs_data # for climwip performance metrics - - {dataset: ERA5, project: native6, type: reanaly, version: '1', tier: 3} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} preprocessors: climwip_general: &general diff --git a/esmvaltool/recipes/recipe_climwip_brunner20esd.yml b/esmvaltool/recipes/recipe_climwip_brunner20esd.yml index b4fc2e0a4f..93ef0d36d5 100644 --- a/esmvaltool/recipes/recipe_climwip_brunner20esd.yml +++ b/esmvaltool/recipes/recipe_climwip_brunner20esd.yml @@ -73,7 +73,7 @@ datasets: &model_data obs_data: &obs_data # for climwip performance metrics - - {dataset: ERA5, project: native6, type: reanaly, version: '1', tier: 3} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} preprocessors: climwip_general: &general diff --git a/esmvaltool/recipes/recipe_climwip_test_basic.yml b/esmvaltool/recipes/recipe_climwip_test_basic.yml index 02e3dab3f2..8a916d3493 100644 --- a/esmvaltool/recipes/recipe_climwip_test_basic.yml +++ b/esmvaltool/recipes/recipe_climwip_test_basic.yml @@ -33,7 +33,7 @@ datasets: &model_data # a minimal selection to demonstrate functionality - {dataset: BNU-ESM, project: CMIP5, exp: [historical, rcp85], ensemble: r1i1p1} obs_data: &obs_data # for climwip performance metrics - - {dataset: ERA5, project: native6, type: reanaly, version: '1', tier: 3} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} preprocessors: climwip_general: &general diff --git a/esmvaltool/recipes/recipe_climwip_test_performance_sigma.yml b/esmvaltool/recipes/recipe_climwip_test_performance_sigma.yml index abbf186acf..efdb8701ac 100644 --- a/esmvaltool/recipes/recipe_climwip_test_performance_sigma.yml +++ b/esmvaltool/recipes/recipe_climwip_test_performance_sigma.yml @@ -63,7 +63,7 @@ datasets: &model_data # a selection of model to demonstrate functionality of th - {project: CMIP6, exp: [historical, ssp585], dataset: UKESM1-0-LL, ensemble: r(1:2)i1p1f2, grid: gn} obs_data: &obs_data # for climwip performance metrics - - {dataset: ERA5, project: native6, type: reanaly, version: '1', tier: 3} + - {dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3} preprocessors: climwip_general: &general diff --git a/esmvaltool/recipes/recipe_cox18nature.yml b/esmvaltool/recipes/recipe_cox18nature.yml index 4250d3fac9..9ec668425b 100644 --- a/esmvaltool/recipes/recipe_cox18nature.yml +++ b/esmvaltool/recipes/recipe_cox18nature.yml @@ -29,8 +29,6 @@ preprocessors: spatial_mean: area_statistics: operator: mean - fx_variables: - areacella: diagnostics: @@ -80,7 +78,7 @@ diagnostics: script: climate_metrics/psi.py diag_cox18nature: - description: Plot emergent relationship between ECS ans psi. + description: Plot emergent relationship between ECS and psi. scripts: cox18nature: script: emergent_constraints/cox18nature.py diff --git a/esmvaltool/recipes/recipe_ecs.yml b/esmvaltool/recipes/recipe_ecs.yml index 026085cc9c..02f284d295 100644 --- a/esmvaltool/recipes/recipe_ecs.yml +++ b/esmvaltool/recipes/recipe_ecs.yml @@ -27,8 +27,6 @@ preprocessors: spatial_mean: area_statistics: operator: mean - fx_variables: - areacella: CMIP5_RTNT: &cmip5_rtnt diff --git a/esmvaltool/recipes/recipe_ecs_constraints.yml b/esmvaltool/recipes/recipe_ecs_constraints.yml index def4a692a1..3655503e8a 100644 --- a/esmvaltool/recipes/recipe_ecs_constraints.yml +++ b/esmvaltool/recipes/recipe_ecs_constraints.yml @@ -74,8 +74,6 @@ preprocessors: spatial_mean: area_statistics: operator: mean - fx_variables: - areacella: tropical_mean: extract_region: @@ -85,8 +83,6 @@ preprocessors: end_longitude: 360 area_statistics: operator: mean - fx_variables: - areacella: climate_statistics: operator: mean @@ -98,8 +94,6 @@ preprocessors: end_longitude: 360 area_statistics: operator: mean - fx_variables: - areacella: climate_statistics: operator: mean diff --git a/esmvaltool/recipes/recipe_esacci_oc.yml b/esmvaltool/recipes/recipe_esacci_oc.yml index 762a421827..cf180b72a7 100644 --- a/esmvaltool/recipes/recipe_esacci_oc.yml +++ b/esmvaltool/recipes/recipe_esacci_oc.yml @@ -33,7 +33,7 @@ preprocessors: custom_order: true extract_levels: levels: 0. - scheme: nearest_horizontal_extrapolate_vertical + scheme: nearest_extrapolate climate_statistics: operator: mean regrid: diff --git a/esmvaltool/recipes/recipe_flato13ipcc.yml b/esmvaltool/recipes/recipe_flato13ipcc.yml deleted file mode 100644 index ba2e4487c2..0000000000 --- a/esmvaltool/recipes/recipe_flato13ipcc.yml +++ /dev/null @@ -1,2108 +0,0 @@ -# ESMValTool -# recipe_flato13ipcc.yml ---- -documentation: - title: IPCC AR5, chap. 9 diagnostics - - description: | - Reproducing selected figures from IPCC AR5, chap. 9 (Flato et al., 2013) - 9.2, 9.3, 9.4, 9.5, 9.6, 9.8, 9.14, 9.24, 9.26, 9.27, 9.42, 9.45a. - Processing of CMIP3 models currently works only in serial mode, due to - an issue in the input data still under investigation. This affects the - diagnostics for Fig. 9.6 in this recipe. - - authors: - - bock_lisa - - gier_bettina - - lauer_axel - - schlund_manuel - - senftleben_daniel - - zimmermann_klaus - - maintainer: - - lauer_axel - - references: - - flato13ipcc - - projects: - - embrace - - esmval - - crescendo - - -preprocessors: - - clim: - regrid: - target_grid: 2x2 - scheme: linear - mask_fillvalues: - threshold_fraction: 0.95 - multi_model_statistics: - span: overlap - statistics: [mean] - exclude: [reference_dataset] - - land_fraction_weighting: - weighting_landsea_fraction: &weighting_options - area_type: land - exclude: [ - 'bcc-csm1-1-m', - 'GCP2018', - 'inmcm4', - 'JMA-TRANSCOM', - ] - - sea_fraction_weighting: - weighting_landsea_fraction: - <<: *weighting_options - area_type: sea - regrid: - target_grid: 2x2 - scheme: linear - - spatial_mean: - area_statistics: - operator: mean - - clim_ref: - regrid: - target_grid: reference_dataset - scheme: linear - multi_model_statistics: - span: overlap - statistics: [mean] - exclude: [reference_dataset] - - clim_ref_9-3: - regrid: - target_grid: reference_dataset - scheme: linear - mask_fillvalues: - threshold_fraction: 0.95 - multi_model_statistics: - span: overlap - statistics: [mean] - exclude: [reference_dataset] - convert_units: - units: degC - - regrid_4_5: - regrid: - target_grid: 4x5 - scheme: linear - - zonal_mean: - custom_order: true - climate_statistics: - regrid: - target_grid: 1x1 - scheme: linear - zonal_statistics: - operator: mean - convert_units: - units: degC - - equatorial: - custom_order: true - climate_statistics: - regrid: - target_grid: 1x1 - scheme: linear - extract_region: - start_longitude: 0. - end_longitude: 360. - start_latitude: -5. - end_latitude: 5. - meridional_statistics: - operator: mean - convert_units: - units: degC - -diagnostics: - - # ********************************************************************** - # Flato et al. (2013) - IPCC AR5, chap. 9 - # similar to fig. 9.2 a/b/c - # ********************************************************************** - # Multi model mean, multi model mean bias, and mean absolute error - # (geographical distributions) - # ********************************************************************** - - fig09-2: - title: Fig. 9.2 (near-surface temperature) - description: IPCC AR5 Ch. 9, Fig. 9.2 (near-surface temperature) - themes: - - phys - realms: - - atmos - variables: - tas: - preprocessor: clim - reference_dataset: ERA-Interim - mip: Amon - additional_datasets: - - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, - start_year: 1986, end_year: 2005, tier: 3} - - {dataset: ACCESS1-0, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: ACCESS1-3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: bcc-csm1-1-m, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: BNU-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CCSM4, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CESM1-BGC, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: CESM1-CAM5-1-FV, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CESM1-CAM5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CESM1-FASTCHEM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CESM1-WACCM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CMCC-CESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: CMCC-CM, project: CMIP5, exp: historical, ensemble: r1i1p1, - # start_year: 1986, end_year: 2005} - # - {dataset: CMCC-CMS, project: CMIP5, exp: historical, ensemble: r1i1p1, - # start_year: 1986, end_year: 2005} - # - {dataset: CNRM-CM5-2, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CNRM-CM5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CSIRO-Mk3-6-0, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: FGOALS-g2, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GFDL-CM3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GFDL-ESM2G, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GFDL-ESM2M, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-H-CC, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: GISS-E2-H, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-R-CC, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-R, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: HadGEM2-CC, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: HadGEM2-ES, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: inmcm4, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5A-LR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5A-MR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5B-LR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: MIROC4h, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC-ESM-CHEM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-LR, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-MR, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-P, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MRI-CGCM3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: NorESM1-M, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: NorESM1-ME, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - scripts: - fig09-2: &fig-9-2_and_9-4_settings - script: clouds/clouds_bias.ncl - projection: Robinson - timemean: annualclim - plot_abs_diff: true - plot_rel_diff: false - - # *************************************************************************** - # Flato et al. (2013) - IPCC AR5, chap. 9 - # similar to fig. 9.3 - # *************************************************************************** - # Multi model mean seasonality, mean absolute seasonality, mean bias - # in seasonality, and mean bias in absolute seasonality - # *************************************************************************** - - fig09-3: - title: Fig. 9.3 (near-surface temperature) - description: Calculate seasonality of multi-model mean for tas - themes: - - phys - realms: - - atmos - variables: - tas: - preprocessor: clim_ref_9-3 - reference_dataset: ERA-Interim - project: CMIP5 - exp: historical - ensemble: r1i1p1 - mip: Amon - start_year: 1980 - end_year: 2005 - additional_datasets: - - {dataset: ACCESS1-0} - - {dataset: ACCESS1-3} - - {dataset: bcc-csm1-1} - - {dataset: bcc-csm1-1-m} - - {dataset: BNU-ESM} - - {dataset: CanCM4} - - {dataset: CanESM2} - - {dataset: CCSM4} - - {dataset: CESM1-BGC} - - {dataset: CESM1-CAM5} - - {dataset: CESM1-FASTCHEM} - - {dataset: CESM1-WACCM} - - {dataset: CMCC-CESM} - - {dataset: CMCC-CM} - - {dataset: CMCC-CMS} - - {dataset: CNRM-CM5} - - {dataset: CNRM-CM5-2} - - {dataset: FIO-ESM} - - {dataset: GFDL-CM2p1} - - {dataset: GFDL-CM3} - - {dataset: GFDL-ESM2G} - - {dataset: GFDL-ESM2M} - - {dataset: GISS-E2-H} - - {dataset: GISS-E2-H-CC} - - {dataset: GISS-E2-R} - - {dataset: GISS-E2-R-CC} - - {dataset: HadCM3} - - {dataset: HadGEM2-AO} - - {dataset: HadGEM2-CC} - - {dataset: HadGEM2-ES} - - {dataset: inmcm4} - - {dataset: IPSL-CM5A-LR} - - {dataset: IPSL-CM5A-MR} - - {dataset: IPSL-CM5B-LR} - - {dataset: MIROC-ESM} - - {dataset: MIROC-ESM-CHEM} - - {dataset: MIROC4h} - - {dataset: MIROC5} - - {dataset: MPI-ESM-LR} - - {dataset: MPI-ESM-MR} - - {dataset: MPI-ESM-P} - - {dataset: MRI-CGCM3} - - {dataset: MRI-ESM1} - - {dataset: NorESM1-M} - - {dataset: NorESM1-ME} - - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - scripts: - fig09-3: - script: ipcc_ar5/ch09_fig09_3.ncl - - # ********************************************************************** - # Flato et al. (2013) - IPCC AR5, chap. 9 - # similar to fig. 9.4 - # ********************************************************************** - # Multi model mean, multi model mean bias, mean absolute error, and - # mean relative error (geographical ditributions) - # ********************************************************************** - - fig09-4: - title: Fig. 9.4 (precipitation) - description: IPCC AR5 Ch. 9, Fig. 9.4 (precipitation) - themes: - - clouds - realms: - - atmos - variables: - pr: - preprocessor: clim - reference_dataset: GPCP-SG - mip: Amon - additional_datasets: - - {dataset: GPCP-SG, project: obs4MIPs, level: L3, version: v2.2, - start_year: 1986, end_year: 2005, tier: 1} - - {dataset: ACCESS1-0, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: ACCESS1-3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: bcc-csm1-1-m, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: BNU-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CCSM4, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CESM1-BGC, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: CESM1-CAM5-1-FV, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CESM1-CAM5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CESM1-FASTCHEM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CESM1-WACCM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CMCC-CESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: CMCC-CM, project: CMIP5, exp: historical, ensemble: r1i1p1, - # start_year: 1986, end_year: 2005} - # - {dataset: CMCC-CMS, project: CMIP5, exp: historical, ensemble: r1i1p1, - # start_year: 1986, end_year: 2005} - # - {dataset: CNRM-CM5-2, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CNRM-CM5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CSIRO-Mk3-6-0, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: FGOALS-g2, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GFDL-CM3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GFDL-ESM2G, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GFDL-ESM2M, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-H-CC, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: GISS-E2-H, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-R-CC, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-R, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: HadGEM2-CC, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: HadGEM2-ES, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: inmcm4, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5A-LR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5A-MR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5B-LR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: MIROC4h, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC-ESM-CHEM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-LR, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-MR, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-P, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MRI-CGCM3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: NorESM1-M, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: NorESM1-ME, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - scripts: - fig09-4: - <<: *fig-9-2_and_9-4_settings - plot_abs_diff: true - plot_rel_diff: true - - # ********************************************************************** - # Flato et al. (2013) - IPCC AR5, chap. 9 - # similar to fig. 9.5 - # ********************************************************************** - # Difference of multi-model mean and reference data set (geographical - # distribution, annual mean) + zonal averages of individual models - # and multi-model mean (annual means). - # ********************************************************************** - - fig09-5a: - title: Fig. 9.5a (shortwave CRE) - description: differences of multi-model mean and reference dataset - themes: - - clouds - realms: - - atmos - variables: - swcre: - preprocessor: clim - reference_dataset: CERES-EBAF - mip: Amon - derive: true - additional_datasets: - - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-7, - start_year: 2001, end_year: 2010, tier: 1} - - {dataset: ACCESS1-0, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: ACCESS1-3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: bcc-csm1-1-m, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: BNU-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CCSM4, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CESM1-BGC, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: CESM1-CAM5-1-FV, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CESM1-CAM5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CESM1-FASTCHEM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CESM1-WACCM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CMCC-CESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: CMCC-CM, project: CMIP5, exp: historical, ensemble: r1i1p1, - # start_year: 1986, end_year: 2005} - # - {dataset: CMCC-CMS, project: CMIP5, exp: historical, ensemble: r1i1p1, - # start_year: 1986, end_year: 2005} - # - {dataset: CNRM-CM5-2, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CNRM-CM5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CSIRO-Mk3-6-0, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: FGOALS-g2, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GFDL-CM3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GFDL-ESM2G, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GFDL-ESM2M, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-H-CC, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: GISS-E2-H, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-R-CC, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-R, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: HadGEM2-CC, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: HadGEM2-ES, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: inmcm4, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5A-LR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5A-MR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5B-LR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: MIROC4h, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC-ESM-CHEM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-LR, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-MR, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-P, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MRI-CGCM3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: NorESM1-M, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: NorESM1-ME, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - scripts: - fig09-5a: &fig-9-5_settings - script: clouds/clouds_ipcc.ncl - projection: Robinson - colormap: WhiteBlueGreenYellowRed - timemean: annualclim - - fig09-5b: - title: Fig. 9.5b (longwave CRE) - description: differences of multi-model mean and reference dataset - themes: - - clouds - realms: - - atmos - variables: - lwcre: - preprocessor: clim - reference_dataset: CERES-EBAF - mip: Amon - derive: true - additional_datasets: - - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-7, - start_year: 2001, end_year: 2010, tier: 1} - - {dataset: ACCESS1-0, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: ACCESS1-3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: bcc-csm1-1-m, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: BNU-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CCSM4, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CESM1-BGC, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: CESM1-CAM5-1-FV, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CESM1-CAM5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CESM1-FASTCHEM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CESM1-WACCM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CMCC-CESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: CMCC-CM, project: CMIP5, exp: historical, ensemble: r1i1p1, - # start_year: 1986, end_year: 2005} - # - {dataset: CMCC-CMS, project: CMIP5, exp: historical, ensemble: r1i1p1, - # start_year: 1986, end_year: 2005} - # - {dataset: CNRM-CM5-2, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CNRM-CM5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CSIRO-Mk3-6-0, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: FGOALS-g2, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GFDL-CM3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GFDL-ESM2G, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GFDL-ESM2M, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-H-CC, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: GISS-E2-H, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-R-CC, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-R, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: HadGEM2-CC, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: HadGEM2-ES, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: inmcm4, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5A-LR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5A-MR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5B-LR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: MIROC4h, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC-ESM-CHEM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-LR, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-MR, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-P, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MRI-CGCM3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: NorESM1-M, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: NorESM1-ME, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - scripts: - fig09-5b: - <<: *fig-9-5_settings - - fig09-5c: - title: Fig. 9.5c (net CRE) - description: differences of multi-model mean and reference dataset - themes: - - clouds - realms: - - atmos - variables: - netcre: - preprocessor: clim - reference_dataset: CERES-EBAF - mip: Amon - derive: true - additional_datasets: - - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-7, - start_year: 2001, end_year: 2010, tier: 1} - - {dataset: ACCESS1-0, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: ACCESS1-3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: bcc-csm1-1, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: bcc-csm1-1-m, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: BNU-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CanESM2, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CCSM4, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CESM1-BGC, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: CESM1-CAM5-1-FV, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CESM1-CAM5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CESM1-FASTCHEM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CESM1-WACCM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CMCC-CESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: CMCC-CM, project: CMIP5, exp: historical, ensemble: r1i1p1, - # start_year: 1986, end_year: 2005} - # - {dataset: CMCC-CMS, project: CMIP5, exp: historical, ensemble: r1i1p1, - # start_year: 1986, end_year: 2005} - # - {dataset: CNRM-CM5-2, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: CNRM-CM5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: CSIRO-Mk3-6-0, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: FGOALS-g2, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GFDL-CM3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GFDL-ESM2G, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GFDL-ESM2M, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-H-CC, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: GISS-E2-H, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-R-CC, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: GISS-E2-R, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - # - {dataset: HadGEM2-CC, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - # - {dataset: HadGEM2-ES, project: CMIP5, exp: historical, - # ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: inmcm4, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5A-LR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5A-MR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: IPSL-CM5B-LR, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: MIROC4h, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC5, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC-ESM, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MIROC-ESM-CHEM, project: CMIP5, exp: historical, - ensemble: r1i1p1, start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-LR, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-MR, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MPI-ESM-P, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: MRI-CGCM3, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: NorESM1-M, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - - {dataset: NorESM1-ME, project: CMIP5, exp: historical, ensemble: r1i1p1, - start_year: 1986, end_year: 2005} - scripts: - fig09-5c: - <<: *fig-9-5_settings - - - # *************************************************************************** - # Flato et al. (2013) - IPCC AR5, chap. 9 - # similar to fig. 9.6 - # *************************************************************************** - # Centred pattern correlations between models and observations for - # the annual mean climatology over the period 1980-1999. - # *************************************************************************** - - fig09-6_tas: - title: Fig. 9.6 (near-surface temperature) - description: Calculate pattern correlation for tas - variables: - tas: - preprocessor: regrid_4_5 - reference_dataset: ERA-Interim - alternative_dataset: NCEP - project: CMIP5 - exp: historical - ensemble: r1i1p1 - mip: Amon - field: T2Ms - start_year: 1980 - end_year: 1999 - additional_datasets: - - &cmip3 {dataset: bccr_bcm2_0, institute: BCCR, project: CMIP3, mip: A1, modeling_realm: atm, exp: 20c3m, frequency: mo, ensemble: run1} - - {<<: *cmip3, dataset: cccma_cgcm3_1, institute: CCCMA} - - {<<: *cmip3, dataset: cccma_cgcm3_1_t63, institute: CCCMA} - - {<<: *cmip3, dataset: csiro_mk3_0, institute: CSIRO} - - {<<: *cmip3, dataset: giss_aom, institute: NASA} - - {<<: *cmip3, dataset: giss_model_e_h, institute: NASA} - - {<<: *cmip3, dataset: giss_model_e_r, institute: NASA} - - {<<: *cmip3, dataset: iap_fgoals1_0_g, institute: LASG} - - {<<: *cmip3, dataset: ingv_echam4, institute: INGV} - - {<<: *cmip3, dataset: inmcm3_0, institute: INM} - - {<<: *cmip3, dataset: ipsl_cm4, institute: IPSL} - - {<<: *cmip3, dataset: miroc3_2_hires, institute: NIES} - - {<<: *cmip3, dataset: miroc3_2_medres, institute: NIES} - - {<<: *cmip3, dataset: mpi_echam5, institute: MPIM} - - {<<: *cmip3, dataset: ncar_ccsm3_0, institute: NCAR} - - {<<: *cmip3, dataset: ncar_pcm1, institute: NCAR} - - {<<: *cmip3, dataset: ukmo_hadcm3, institute: UKMO} - - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} - - - {dataset: ACCESS1-0} - - {dataset: ACCESS1-3} - - {dataset: bcc-csm1-1} - - {dataset: bcc-csm1-1-m} - - {dataset: BNU-ESM} - - {dataset: CanCM4} - - {dataset: CanESM2} - - {dataset: CCSM4} - - {dataset: CESM1-BGC} - - {dataset: CESM1-CAM5} - - {dataset: CESM1-FASTCHEM} - - {dataset: CESM1-WACCM} - - {dataset: CMCC-CESM} - - {dataset: CMCC-CM} - - {dataset: CMCC-CMS} - - {dataset: CNRM-CM5} - - {dataset: CNRM-CM5-2} - - {dataset: FIO-ESM} - - {dataset: GFDL-CM2p1} - - {dataset: GFDL-CM3} - - {dataset: GFDL-ESM2G} - - {dataset: GFDL-ESM2M} - - {dataset: GISS-E2-H} - - {dataset: GISS-E2-H-CC} - - {dataset: GISS-E2-R} - - {dataset: GISS-E2-R-CC} - - {dataset: HadCM3} - - {dataset: HadGEM2-AO} - - {dataset: HadGEM2-CC} - - {dataset: HadGEM2-ES} - - {dataset: inmcm4} - - {dataset: IPSL-CM5A-LR} - - {dataset: IPSL-CM5A-MR} - - {dataset: IPSL-CM5B-LR} - - {dataset: MIROC-ESM} - - {dataset: MIROC-ESM-CHEM} - - {dataset: MIROC4h} - - {dataset: MIROC5} - - {dataset: MPI-ESM-LR} - - {dataset: MPI-ESM-MR} - - {dataset: MPI-ESM-P} - - {dataset: MRI-CGCM3} - - {dataset: MRI-ESM1} - - {dataset: NorESM1-M} - - {dataset: NorESM1-ME} - - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} - scripts: - fig09-6_pattern_cor: &fig09_6_pattern_cor - script: ipcc_ar5/ch09_fig09_6.ncl - - fig09-6_rlut: - title: Fig. 9.6 (TOA longwave radiation) - description: Calculate pattern correlation for all-sky longwave radiation - variables: - rlut: - preprocessor: regrid_4_5 - reference_dataset: CERES-EBAF - project: CMIP5 - exp: historical - ensemble: r1i1p1 - mip: Amon - field: T2Ms - start_year: 1980 - end_year: 1999 - additional_datasets: - - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} - - {<<: *cmip3, dataset: cccma_cgcm3_1, institute: CCCMA} - - {<<: *cmip3, dataset: cccma_cgcm3_1_t63, institute: CCCMA} - - {<<: *cmip3, dataset: csiro_mk3_0, institute: CSIRO} - - {<<: *cmip3, dataset: giss_aom, institute: NASA} - - {<<: *cmip3, dataset: giss_model_e_h, institute: NASA} - - {<<: *cmip3, dataset: giss_model_e_r, institute: NASA} - - {<<: *cmip3, dataset: iap_fgoals1_0_g, institute: LASG} - - {<<: *cmip3, dataset: ingv_echam4, institute: INGV} - - {<<: *cmip3, dataset: inmcm3_0, institute: INM} - - {<<: *cmip3, dataset: ipsl_cm4, institute: IPSL} - - {<<: *cmip3, dataset: miroc3_2_hires, institute: NIES} - - {<<: *cmip3, dataset: miroc3_2_medres, institute: NIES} - - {<<: *cmip3, dataset: mpi_echam5, institute: MPIM} - - {<<: *cmip3, dataset: ncar_ccsm3_0, institute: NCAR} - - {<<: *cmip3, dataset: ncar_pcm1, institute: NCAR} - - {<<: *cmip3, dataset: ukmo_hadcm3, institute: UKMO} - - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} - - - {dataset: ACCESS1-0} - - {dataset: ACCESS1-3} - - {dataset: bcc-csm1-1} - - {dataset: bcc-csm1-1-m} - - {dataset: BNU-ESM} - - {dataset: CanCM4} - - {dataset: CanESM2} - - {dataset: CCSM4} - - {dataset: CESM1-BGC} - - {dataset: CESM1-CAM5} - - {dataset: CESM1-FASTCHEM} - - {dataset: CESM1-WACCM} - - {dataset: CMCC-CESM} - - {dataset: CMCC-CM} - - {dataset: CMCC-CMS} - - {dataset: CNRM-CM5} - - {dataset: CNRM-CM5-2} - - {dataset: FIO-ESM} - - {dataset: GFDL-CM2p1} - - {dataset: GFDL-CM3} - - {dataset: GFDL-ESM2G} - - {dataset: GFDL-ESM2M} - - {dataset: GISS-E2-H} - - {dataset: GISS-E2-H-CC} - - {dataset: GISS-E2-R} - - {dataset: GISS-E2-R-CC} - - {dataset: HadCM3} - - {dataset: HadGEM2-AO} - - {dataset: HadGEM2-CC} - - {dataset: HadGEM2-ES} - - {dataset: inmcm4} - - {dataset: IPSL-CM5A-LR} - - {dataset: IPSL-CM5A-MR} - - {dataset: IPSL-CM5B-LR} - - {dataset: MIROC-ESM} - - {dataset: MIROC-ESM-CHEM} - - {dataset: MIROC4h} - - {dataset: MIROC5} - - {dataset: MPI-ESM-LR} - - {dataset: MPI-ESM-MR} - - {dataset: MPI-ESM-P} - - {dataset: MRI-CGCM3} - - {dataset: MRI-ESM1} - - {dataset: NorESM1-M} - - {dataset: NorESM1-ME} - - - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-7, tier: 1, start_year: 2003, end_year: 2011} - scripts: - fig09-6_pattern_cor: - <<: *fig09_6_pattern_cor - - fig09-6_pr: - title: Fig. 9.6 (precipitation) - description: Calculate pattern correlation for precipitation - variables: - pr: - preprocessor: regrid_4_5 - reference_dataset: GPCP-SG - alternative_dataset: GHCN - project: CMIP5 - exp: historical - ensemble: r1i1p1 - mip: Amon - field: T2Ms - start_year: 1980 - end_year: 1999 - additional_datasets: - - {<<: *cmip3, dataset: bccr_bcm2_0, institute: BCCR} - - {<<: *cmip3, dataset: cccma_cgcm3_1, institute: CCCMA} - - {<<: *cmip3, dataset: cccma_cgcm3_1_t63, institute: CCCMA} - - {<<: *cmip3, dataset: csiro_mk3_0, institute: CSIRO} - - {<<: *cmip3, dataset: giss_aom, institute: NASA} - - {<<: *cmip3, dataset: giss_model_e_h, institute: NASA} - - {<<: *cmip3, dataset: giss_model_e_r, institute: NASA} - - {<<: *cmip3, dataset: iap_fgoals1_0_g, institute: LASG} - - {<<: *cmip3, dataset: ingv_echam4, institute: INGV} - - {<<: *cmip3, dataset: inmcm3_0, institute: INM} - - {<<: *cmip3, dataset: ipsl_cm4, institute: IPSL} - - {<<: *cmip3, dataset: miroc3_2_hires, institute: NIES} - - {<<: *cmip3, dataset: miroc3_2_medres, institute: NIES} - - {<<: *cmip3, dataset: mpi_echam5, institute: MPIM} - - {<<: *cmip3, dataset: ncar_ccsm3_0, institute: NCAR} - - {<<: *cmip3, dataset: ncar_pcm1, institute: NCAR} - - {<<: *cmip3, dataset: ukmo_hadcm3, institute: UKMO} - - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} - - - {dataset: ACCESS1-0} - - {dataset: ACCESS1-3} - - {dataset: bcc-csm1-1} - - {dataset: bcc-csm1-1-m} - - {dataset: BNU-ESM} - - {dataset: CanCM4} - - {dataset: CanESM2} - - {dataset: CCSM4} - - {dataset: CESM1-BGC} - - {dataset: CESM1-CAM5} - - {dataset: CESM1-FASTCHEM} - - {dataset: CESM1-WACCM} - - {dataset: CMCC-CESM} - - {dataset: CMCC-CM} - - {dataset: CMCC-CMS} - - {dataset: CNRM-CM5} - - {dataset: CNRM-CM5-2} - - {dataset: FIO-ESM} - - {dataset: GFDL-CM2p1} - - {dataset: GFDL-CM3} - - {dataset: GFDL-ESM2G} - - {dataset: GFDL-ESM2M} - - {dataset: GISS-E2-H} - - {dataset: GISS-E2-H-CC} - - {dataset: GISS-E2-R} - - {dataset: GISS-E2-R-CC} - - {dataset: HadCM3} - - {dataset: HadGEM2-AO} - - {dataset: HadGEM2-CC} - - {dataset: HadGEM2-ES} - - {dataset: inmcm4} - - {dataset: IPSL-CM5A-LR} - - {dataset: IPSL-CM5A-MR} - - {dataset: IPSL-CM5B-LR} - - {dataset: MIROC-ESM} - - {dataset: MIROC-ESM-CHEM} - - {dataset: MIROC4h} - - {dataset: MIROC5} - - {dataset: MPI-ESM-LR} - - {dataset: MPI-ESM-MR} - - {dataset: MPI-ESM-P} - - {dataset: MRI-CGCM3} - - {dataset: MRI-ESM1} - - {dataset: NorESM1-M} - - {dataset: NorESM1-ME} - - - {dataset: GPCP-SG, project: obs4MIPs, level: L3, version: v2.2, tier: 1} - - {dataset: GHCN, project: OBS, type: ground, version: 1, tier: 2} - scripts: - fig09-6_pattern_cor: - <<: *fig09_6_pattern_cor - - fig09-6_swcre: - title: Fig. 9.6 (shortwave CRE) - description: Calculate pattern correlation for shortwave cloud radiative effect - variables: - swcre: - preprocessor: regrid_4_5 - reference_dataset: CERES-EBAF - project: CMIP5 - exp: historical - ensemble: r1i1p1 - mip: Amon - field: T2Ms - start_year: 1980 - end_year: 1999 - derive: true - force_derivation: false - additional_datasets: - - {<<: *cmip3, dataset: cccma_cgcm3_1, institute: CCCMA} - - {<<: *cmip3, dataset: csiro_mk3_0, institute: CSIRO} - - {<<: *cmip3, dataset: giss_model_e_h, institute: NASA} - - {<<: *cmip3, dataset: giss_model_e_r, institute: NASA} - - {<<: *cmip3, dataset: iap_fgoals1_0_g, institute: LASG} - - {<<: *cmip3, dataset: inmcm3_0, institute: INM} - - {<<: *cmip3, dataset: ipsl_cm4, institute: IPSL} - - {<<: *cmip3, dataset: miroc3_2_hires, institute: NIES} - - {<<: *cmip3, dataset: miroc3_2_medres, institute: NIES} - - {<<: *cmip3, dataset: mpi_echam5, institute: MPIM} - - {<<: *cmip3, dataset: ncar_ccsm3_0, institute: NCAR} - - {<<: *cmip3, dataset: ncar_pcm1, institute: NCAR} - - {<<: *cmip3, dataset: ukmo_hadcm3, institute: UKMO} - - {<<: *cmip3, dataset: ukmo_hadgem1, institute: UKMO} - - - {dataset: ACCESS1-0} - - {dataset: ACCESS1-3} - - {dataset: bcc-csm1-1} - - {dataset: bcc-csm1-1-m} - - {dataset: BNU-ESM} - - {dataset: CanESM2} - - {dataset: CCSM4} - - {dataset: CESM1-BGC} - - {dataset: CESM1-CAM5} - - {dataset: CESM1-FASTCHEM} - - {dataset: CESM1-WACCM} - - {dataset: CMCC-CESM} - - {dataset: CMCC-CM} - - {dataset: CNRM-CM5} - - {dataset: CNRM-CM5-2} - - {dataset: FGOALS-g2} - - {dataset: FIO-ESM} - - {dataset: GFDL-CM3} - - {dataset: GFDL-ESM2G} - - {dataset: GFDL-ESM2M} - - {dataset: GISS-E2-H} - - {dataset: GISS-E2-H-CC} - - {dataset: GISS-E2-R} - - {dataset: GISS-E2-R-CC} - - {dataset: HadCM3} - - {dataset: HadGEM2-AO} - - {dataset: HadGEM2-CC} - - {dataset: HadGEM2-ES} - - {dataset: inmcm4} - - {dataset: IPSL-CM5A-LR} - - {dataset: IPSL-CM5A-MR} - - {dataset: IPSL-CM5B-LR} - - {dataset: MIROC-ESM} - - {dataset: MIROC-ESM-CHEM} - - {dataset: MIROC4h} - - {dataset: MIROC5} - - {dataset: MPI-ESM-LR} - - {dataset: MPI-ESM-MR} - - {dataset: MPI-ESM-P} - - {dataset: MRI-CGCM3} - - {dataset: MRI-ESM1} - - {dataset: NorESM1-M} - - {dataset: NorESM1-ME} - - - {dataset: CERES-EBAF, project: obs4MIPs, level: L3B, version: Ed2-7, tier: 1, start_year: 2003, end_year: 2011} - scripts: - fig09-6_pattern_cor: - <<: *fig09_6_pattern_cor - - ### COLLECT CORRELATIONS AND PLOT ########################################### - fig09-6_cor_collect: - description: Wrapper to collect and plot previously calculated correlations - scripts: - fig09-6_cor_collect: - script: ipcc_ar5/ch09_fig09_6_collect.ncl - ancestors: ['*/fig09-6_pattern_cor'] - diag_order: ['fig09-6_tas', 'fig09-6_rlut', 'fig09-6_pr'] - - - - # ********************************************************************** - # Flato et al. (2013) - IPCC AR5, chap. 9 - # similar to fig. 9.8 - # ********************************************************************** - # Time series of anomalies of annual and global surface temperature - # ********************************************************************** - - fig09-8: - title: Fig. 9.8 (near-surface temperature) - description: IPCC AR5 Ch. 9, Fig. 9.8 (near-surface temperature) - themes: - - phys - realms: - - atmos - variables: - tas: - preprocessor: clim_ref - reference_dataset: HadCRUT4 - mip: Amon - project: CMIP5 - exp: [historical, rcp45] - ensemble: r1i1p1 - start_year: 1870 - end_year: 2017 - additional_datasets: - - {dataset: ACCESS1-0} - - {dataset: ACCESS1-3} - # Historical data end year is 2012, not 2005 (overlaps with RCP4.5) - # - {dataset: bcc-csm1-1} - # Historical data end year is 2012, not 2005 (overlaps with RCP4.5) - # - {dataset: bcc-csm1-1-m} - - {dataset: BNU-ESM} - # - {dataset: CanCM4} - # - {dataset: CanESM2} - # rcp starts with year 2005 - not 2006 - # - {dataset: CCSM4} - - {dataset: CESM1-BGC} - - {dataset: CESM1-CAM5} - # - {dataset: CESM1-CAM5-1-FV2} - # no rcp45 at DKRZ - # - {dataset: CESM1-FASTCHEM} - # no historival and rcp45 from the same exp - # - {dataset: CESM1-WACCM} - # no rcp45 at DKRZ - # - {dataset: CMCC-CESM} - - {dataset: CMCC-CM} - - {dataset: CMCC-CMS} - # no rcp45 at DKRZ - # - {dataset: CNRM-CM5} - # no rcp45 at DKRZ - # - {dataset: CNRM-CM5-2} - - {dataset: CSIRO-Mk3-6-0} - # - {dataset: EC-EARTH, ensemble: r6i1p1} - # - {dataset: FGOALS-g2} - # - {dataset: FGOALS-s2} - - {dataset: FIO-ESM} - # Historical data end year is 2040, not 2005 (overlaps with RCP4.5) - # - {dataset: GFDL-CM2p1} - - {dataset: GFDL-CM3} - - {dataset: GFDL-ESM2G} - - {dataset: GFDL-ESM2M} - - {dataset: GISS-E2-H, ensemble: r1i1p2} - # Historical data end year is 2010, not 2005 (overlaps with RCP4.5) - # - {dataset: GISS-E2-H-CC} - - {dataset: GISS-E2-R, ensemble: r1i1p2} - # Historical data end year is 2010, not 2005 (overlaps with RCP4.5) - # - {dataset: GISS-E2-R-CC} - - {dataset: HadCM3} - - {dataset: HadGEM2-AO} - # dataset ends November 2005 - # - {dataset: HadGEM2-CC} - # dataset ends November 2005 - # - {dataset: HadGEM2-ES} - - {dataset: inmcm4} - - {dataset: IPSL-CM5A-LR} - - {dataset: IPSL-CM5A-MR} - - {dataset: IPSL-CM5B-LR} - # - {dataset: MIROC4h} - # Historical data end year is 2012, not 2005 (overlaps with RCP4.5) - # - {dataset: MIROC5} - - {dataset: MIROC-ESM} - - {dataset: MIROC-ESM-CHEM} - - {dataset: MPI-ESM-LR} - - {dataset: MPI-ESM-MR} - # no rcp45 at DKRZ - # - {dataset: MPI-ESM-P} - - {dataset: MRI-CGCM3} - # no rcp45 at DKRZ - # - {dataset: MRI-ESM1} - - {dataset: NorESM1-M} - - {dataset: NorESM1-ME} - - {dataset: HadCRUT4, project: OBS, type: ground, version: 1, - start_year: 1870, end_year: 2017, tier: 2} - scripts: - fig09-8: - script: ipcc_ar5/tsline.ncl - time_avg: "yearly" - ts_anomaly: "anom" - ref_start: 1961 - ref_end: 1990 - ref_mask: True - plot_units: "degC" - y_min: -1.2 - y_max: 1.5 - volcanoes: True - styleset: CMIP5 # Plot style - - # ********************************************************************** - # Flato et al. (2013) - IPCC AR5, chap. 9 - # similar to fig. 9.14 - # ********************************************************************** - # SST zonal mean and equatorial, multi model mean - # ********************************************************************** - - fig09-14: - title: Fig. 9.14 (SST) - description: | - IPCC AR5 Ch. 9, Fig. 9.14 (sst error, zonal mean and equatorial) - themes: - - phys - realms: - - ocean - variables: - tos_zm: &fig09_14_settings - project: CMIP5 - exp: historical - ensemble: r1i1p1 - mip: Omon - short_name: tos - preprocessor: zonal_mean - reference_dataset: HadISST - start_year: 1979 - end_year: 1999 - tos_eq: - <<: *fig09_14_settings - preprocessor: equatorial - additional_datasets: - - {dataset: HadISST, project: OBS, type: reanaly, version: 1, tier: 2} - - {dataset: ACCESS1-0} - - {dataset: ACCESS1-3} - - {dataset: bcc-csm1-1} - - {dataset: bcc-csm1-1-m} - - {dataset: CanCM4} - - {dataset: CanESM2} - - {dataset: CCSM4} - - {dataset: CESM1-BGC} - - {dataset: CESM1-CAM5-1-FV2} - - {dataset: CESM1-FASTCHEM} - - {dataset: CESM1-WACCM} - - {dataset: CMCC-CESM} - - {dataset: CMCC-CM} - - {dataset: CMCC-CMS} - - {dataset: CNRM-CM5} - - {dataset: CSIRO-Mk3-6-0} - - {dataset: EC-EARTH} - - {dataset: FGOALS-g2} - - {dataset: FIO-ESM} - - {dataset: GFDL-CM2p1} - - {dataset: GFDL-CM3} - - {dataset: GFDL-ESM2G} - - {dataset: GFDL-ESM2M} - - {dataset: GISS-E2-H} - - {dataset: GISS-E2-R} - - {dataset: HadCM3} - - {dataset: HadGEM2-AO} - - {dataset: HadGEM2-CC} - - {dataset: HadGEM2-ES} - - {dataset: IPSL-CM5A-LR} - - {dataset: IPSL-CM5A-MR} - - {dataset: IPSL-CM5B-LR} - - {dataset: MIROC5} - - {dataset: MPI-ESM-LR} - - {dataset: MPI-ESM-MR} - - {dataset: MPI-ESM-P} - - {dataset: NorESM1-M} - - {dataset: NorESM1-ME} - scripts: - fig09-14: - script: ipcc_ar5/ch09_fig09_14.py - - # *********************************************************************** - # Flato et al. (2013) - IPCC AR5, chap. 9 - # similar to fig. 9.24 - # *********************************************************************** - # 9.24a/b: time series of Arctic and Antarctic sea ice extent - # 9.24c/d: trend distribution of September/February Arctic/Antarctic - # sea ice extent - # *********************************************************************** - - fig09-24: - title: Fig. 9.24 (sea ice) - description: timeseries and trend distributions of sea ice extent - themes: - - seaIce - realms: - - seaIce - variables: - sic: - mip: OImon - project: CMIP5 - exp: historical - ensemble: r1i1p1 - start_year: 1960 - end_year: 2005 - additional_datasets: - - {dataset: HadISST, project: OBS, type: reanaly, version: 1, tier: 2} - areacello: - mip: fx - project: CMIP5 - exp: historical - ensemble: r0i0p0 - start_year: 1960 - end_year: 2005 - additional_datasets: - - {dataset: ACCESS1-0} - - {dataset: ACCESS1-3} - - {dataset: bcc-csm1-1} - - {dataset: bcc-csm1-1-m} - - {dataset: CanESM2} - - {dataset: CCSM4} - - {dataset: CESM1-CAM5} - - {dataset: CNRM-CM5} - - {dataset: CSIRO-Mk3-6-0} - - {dataset: FGOALS-g2} - - {dataset: GFDL-CM3} - - {dataset: GFDL-ESM2G} - - {dataset: GFDL-ESM2M} - - {dataset: inmcm4} - - {dataset: IPSL-CM5A-LR} - - {dataset: IPSL-CM5A-MR} - - {dataset: IPSL-CM5B-LR} - - {dataset: MIROC5} - - {dataset: MIROC-ESM} - - {dataset: MIROC-ESM-CHEM} - - {dataset: MPI-ESM-LR} - - {dataset: MPI-ESM-MR} - - {dataset: MRI-CGCM3} - - {dataset: MRI-ESM1} - - {dataset: NorESM1-M} - - {dataset: NorESM1-ME} - scripts: - fig09-24a: - script: seaice/seaice_tsline.ncl - # "Arctic" or "Antarctic"; entire hemisphere will be evaluated - region: "Arctic" - # A = annual mean, 3 = March, 9 = September - month: "9" - # "CMIP5", "DEFAULT" - styleset: "CMIP5" - # Plot multi-model mean & std dev - multi_model_mean: true - # Create legend label for each individual ensemble member - EMs_in_lg: false - # Fill polar hole in data with sic = 1. - fill_pole_hole: true - fig09-24b: - script: seaice/seaice_tsline.ncl - # "Arctic" or "Antarctic"; entire hemisphere will be evaluated - region: "Antarctic" - # A = annual mean, 3 = March, 9 = September - month: "3" - # "CMIP5", "DEFAULT" - styleset: "CMIP5" - # Plot multi-model mean & std dev - multi_model_mean: true - # Create legend label for each individual ensemble member - EMs_in_lg: false - # Fill polar hole in data with sic = 1. - fill_pole_hole: false - fig09-24c: - script: seaice/seaice_trends.ncl - # "Arctic" or "Antarctic"; entire hemisphere will be evaluated - region: "Arctic" - # A = annual mean, 3 = March, 9 = September - month: "9" - # Fill polar hole in data with sic = 1. - fill_pole_hole: true - fig09-24d: - script: seaice/seaice_trends.ncl - # "Arctic" or "Antarctic"; entire hemisphere will be evaluated - region: "Antarctic" - # A = annual mean, 3 = March, 9 = September - month: "2" - - # ********************************************************************** - # Flato et al. (2013) - IPCC AR5, chap. 9 - # similar to fig. 9.26 - # ********************************************************************** - # Ensemble-mean global ocean carbon uptake (top) and global land - # carbon uptake (bottom) in the CMIP5 ESMs for the historical period - # 1901-2005. - # ********************************************************************** - - fig09-26top: - title: Fig. 9.26a (carbon uptake) - variables: - fgco2: &fgco2_settings - preprocessor: sea_fraction_weighting - project: CMIP5 - mip: Omon - exp: historical - ensemble: r1i1p1 - start_year: 1901 - end_year: 2005 - reference_dataset: JMA-TRANSCOM - plot_units: PgC y-1 - additional_datasets: - # - {dataset: JMA-TRANSCOM, project: OBS, type: reanaly, version: 2018, tier: 3, start_year: 1986, end_year: 2005} - - {dataset: CanESM2} - - {dataset: CESM1-BGC} - - {dataset: GFDL-ESM2G} - - {dataset: GFDL-ESM2M} - - {dataset: HadGEM2-CC} - - {dataset: HadGEM2-ES} - - {dataset: inmcm4} - - {dataset: IPSL-CM5A-LR} - - {dataset: IPSL-CM5A-MR} - - {dataset: IPSL-CM5B-LR} - - {dataset: MIROC-ESM} - - {dataset: MIROC-ESM-CHEM} - - {dataset: MPI-ESM-LR} - - {dataset: MPI-ESM-MR} - - {dataset: NorESM1-ME} - fgco2_GCP2018: - <<: *fgco2_settings - preprocessor: default - short_name: fgco2 - additional_datasets: - - {dataset: GCP2018, project: OBS, type: reanaly, version: '1.0', tier: 2, start_year: 1959, end_year: 2005, frequency: yr} - scripts: - main_global: &fig09_26_settings - script: carbon_cycle/main.ncl - styleset: CMIP5 - region: global - legend_year_outside: false - legend_outside: false - sort: true - anav_month: true - seasonal_cycle_plot: false - errorbar_plot: false - mean_IAV_plot: false - evolution_plot: true - evolution_plot_volcanoes: false - evolution_plot_anomaly: false - evolution_plot_ref_dataset: GCP2018 - - fig09-26bottom: - title: Fig. 9.26b (carbon uptake) - variables: - nbp: - <<: *fgco2_settings - preprocessor: land_fraction_weighting - mip: Lmon - additional_datasets: &nbp_datasets - - {dataset: GCP2018, project: OBS, type: reanaly, version: '1.0', tier: 2, start_year: 1959, end_year: 2005, frequency: yr} - - {dataset: JMA-TRANSCOM, project: OBS, type: reanaly, version: 2018, tier: 3, start_year: 1986, end_year: 2005} - - {dataset: BNU-ESM} - - {dataset: CanESM2} - - {dataset: CESM1-BGC} - - {dataset: GFDL-ESM2G} - - {dataset: GFDL-ESM2M} - - {dataset: HadGEM2-CC} - - {dataset: HadGEM2-ES} - - {dataset: inmcm4} - - {dataset: IPSL-CM5A-LR} - - {dataset: IPSL-CM5A-MR} - - {dataset: IPSL-CM5B-LR} - - {dataset: MIROC-ESM} - - {dataset: MIROC-ESM-CHEM} - - {dataset: MPI-ESM-LR} - - {dataset: MPI-ESM-MR} - - {dataset: NorESM1-ME} - scripts: - main_global: - <<: *fig09_26_settings - - - # ********************************************************************** - # Flato et al. (2013) - IPCC AR5, chap. 9 - # similar to fig. 9.27 - # ********************************************************************** - # Simulation of global mean (a) atmosphere-ocean CO2 fluxes (fgCO2) - # and (b) net atmosphere-land CO2 fluxes (NBP), by ESMs for the - # period 1986-2005. - # ********************************************************************** - - fig09-27top: - title: Fig. 9.27a (CO2 fluxes) - variables: - fgco2: - <<: *fgco2_settings - start_year: 1986 - fgco2_GCP2018: - <<: *fgco2_settings - preprocessor: default - short_name: fgco2 - additional_datasets: - - {dataset: GCP2018, project: OBS, type: reanaly, version: '1.0', tier: 2, start_year: 1986, end_year: 2005, frequency: yr} - scripts: - main_global: &fig09_27_settings - <<: *fig09_26_settings - errorbar_plot: true - evolution_plot: false - - fig09-27bottom: - variables: - nbp: - <<: *fgco2_settings - preprocessor: default - mip: Lmon - start_year: 1986 - additional_datasets: *nbp_datasets - scripts: - main_global: - <<: *fig09_27_settings - - - # ********************************************************************** - # Flato et al. (2013) - IPCC AR5, chap. 9 - # similar to fig. 9.42 - # ********************************************************************** - # - # ********************************************************************** - - ecs_cmip5: - description: Calculate ECS for CMIP5 models. - themes: - - phys - realms: - - atmos - variables: - tas_rtnt: &ecs_settings - short_name: tas - preprocessor: spatial_mean - project: CMIP5 - ensemble: r1i1p1 - mip: Amon - additional_datasets: &datasets_cmip5_rtnt - - {dataset: ACCESS1-0, exp: piControl, start_year: 300, end_year: 449} - - {dataset: ACCESS1-0, exp: abrupt4xCO2, start_year: 300, end_year: 449} - - {dataset: bcc-csm1-1, exp: piControl, start_year: 160, end_year: 309} - - {dataset: bcc-csm1-1, exp: abrupt4xCO2, start_year: 160, end_year: 309} - - {dataset: bcc-csm1-1-m, exp: piControl, start_year: 240, end_year: 389} - - {dataset: bcc-csm1-1-m, exp: abrupt4xCO2, start_year: 240, end_year: 389} - - {dataset: CanESM2, exp: piControl, start_year: 2321, end_year: 2470} - - {dataset: CanESM2, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} - # Wrong start year for piControl? (branch_time = 2.) - - {dataset: CCSM4, exp: piControl, start_year: 250, end_year: 399} - - {dataset: CCSM4, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} - - {dataset: CNRM-CM5, exp: piControl, start_year: 1850, end_year: 1999} - - {dataset: CNRM-CM5, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} - - {dataset: CSIRO-Mk3-6-0, exp: piControl, start_year: 104, end_year: 253} - - {dataset: CSIRO-Mk3-6-0, exp: abrupt4xCO2, start_year: 1, end_year: 150} - - {dataset: GFDL-CM3, exp: piControl, start_year: 1, end_year: 150} - - {dataset: GFDL-CM3, exp: abrupt4xCO2, start_year: 1, end_year: 150} - - {dataset: GFDL-ESM2G, exp: piControl, start_year: 1, end_year: 150} - - {dataset: GFDL-ESM2G, exp: abrupt4xCO2, start_year: 1, end_year: 150} - - {dataset: GFDL-ESM2M, exp: piControl, start_year: 1, end_year: 150} - - {dataset: GFDL-ESM2M, exp: abrupt4xCO2, start_year: 1, end_year: 150} - - {dataset: GISS-E2-H, exp: piControl, start_year: 2660, end_year: 2809} - - {dataset: GISS-E2-H, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} - - {dataset: GISS-E2-R, exp: piControl, start_year: 4200, end_year: 4349} - - {dataset: GISS-E2-R, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} - # Experiments start at 1859-12-01 - - {dataset: HadGEM2-ES, exp: piControl, start_year: 1860, end_year: 2009} - - {dataset: HadGEM2-ES, exp: abrupt4xCO2, start_year: 1860, end_year: 2009} - - {dataset: inmcm4, exp: piControl, start_year: 2090, end_year: 2239} - - {dataset: inmcm4, exp: abrupt4xCO2, start_year: 2090, end_year: 2239} - - {dataset: IPSL-CM5B-LR, exp: piControl, start_year: 1850, end_year: 1999} - - {dataset: IPSL-CM5B-LR, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} - - {dataset: MIROC5, exp: piControl, start_year: 2100, end_year: 2249} - - {dataset: MIROC5, exp: abrupt4xCO2, start_year: 2100, end_year: 2249} - - {dataset: MIROC-ESM, exp: piControl, start_year: 1880, end_year: 2029} - - {dataset: MIROC-ESM, exp: abrupt4xCO2, start_year: 1, end_year: 150} - - {dataset: MPI-ESM-LR, exp: piControl, start_year: 1880, end_year: 2029} - - {dataset: MPI-ESM-LR, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} - - {dataset: MPI-ESM-P, exp: piControl, start_year: 1866, end_year: 2015} - - {dataset: MPI-ESM-P, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} - - {dataset: MRI-CGCM3, exp: piControl, start_year: 1891, end_year: 2040} - - {dataset: MRI-CGCM3, exp: abrupt4xCO2, start_year: 1851, end_year: 2000} - - {dataset: NorESM1-M, exp: piControl, start_year: 700, end_year: 849} - - {dataset: NorESM1-M, exp: abrupt4xCO2, start_year: 1, end_year: 150} - tas_rtmt: - <<: *ecs_settings - additional_datasets: &datasets_cmip5_rtmt - - {dataset: IPSL-CM5A-LR, exp: piControl, start_year: 1850, end_year: 1999} - - {dataset: IPSL-CM5A-LR, exp: abrupt4xCO2, start_year: 1850, end_year: 1999} - rtnt: - <<: *ecs_settings - short_name: rtnt - derive: true - additional_datasets: *datasets_cmip5_rtnt - rtmt: - <<: *ecs_settings - short_name: rtmt - additional_datasets: *datasets_cmip5_rtmt - scripts: - ecs: &ecs_script - script: climate_metrics/ecs.py - - tcr_cmip5: - description: Calculate TCR for CMIP5 models. - themes: - - phys - realms: - - atmos - variables: - 1pctCO2: &tcr_settings - short_name: tas - preprocessor: spatial_mean - project: CMIP5 - ensemble: r1i1p1 - exp: 1pctCO2 - mip: Amon - additional_datasets: - - {dataset: ACCESS1-0, start_year: 300, end_year: 439} - - {dataset: bcc-csm1-1, start_year: 160, end_year: 299} - - {dataset: bcc-csm1-1-m, start_year: 240, end_year: 379} - - {dataset: CanESM2, start_year: 1850, end_year: 1989} - - {dataset: CCSM4, start_year: 1850, end_year: 1989} - - {dataset: CNRM-CM5, start_year: 1850, end_year: 1989} - - {dataset: CSIRO-Mk3-6-0, start_year: 1, end_year: 140} - - {dataset: GFDL-CM3, start_year: 1, end_year: 140} - - {dataset: GFDL-ESM2G, start_year: 1, end_year: 140} - - {dataset: GFDL-ESM2M, start_year: 1, end_year: 140} - - {dataset: GISS-E2-H, start_year: 1850, end_year: 1989} - - {dataset: GISS-E2-R, start_year: 1850, end_year: 1989} - # Experiments starts at 1859-12-01 - - {dataset: HadGEM2-ES, start_year: 1860, end_year: 1999} - - {dataset: inmcm4, start_year: 2090, end_year: 2229} - - {dataset: IPSL-CM5A-LR, start_year: 1850, end_year: 1989} - - {dataset: IPSL-CM5B-LR, start_year: 1850, end_year: 1989} - - {dataset: MIROC5, start_year: 2200, end_year: 2339} - - {dataset: MIROC-ESM, start_year: 1, end_year: 140} - - {dataset: MPI-ESM-LR, start_year: 1850, end_year: 1989} - - {dataset: MPI-ESM-P, start_year: 1850, end_year: 1989} - - {dataset: MRI-CGCM3, start_year: 1851, end_year: 1990} - - {dataset: NorESM1-M, start_year: 1, end_year: 140} - piControl: - <<: *tcr_settings - exp: piControl - additional_datasets: - - {dataset: ACCESS1-0, start_year: 300, end_year: 439} - - {dataset: bcc-csm1-1, start_year: 160, end_year: 299} - - {dataset: bcc-csm1-1-m, start_year: 240, end_year: 379} - - {dataset: CanESM2, start_year: 2321, end_year: 2460} - - {dataset: CCSM4, start_year: 251, end_year: 390} - - {dataset: CNRM-CM5, start_year: 1850, end_year: 1989} - - {dataset: CSIRO-Mk3-6-0, start_year: 104, end_year: 243} - - {dataset: GFDL-CM3, start_year: 1, end_year: 140} - - {dataset: GFDL-ESM2G, start_year: 1, end_year: 140} - - {dataset: GFDL-ESM2M, start_year: 1, end_year: 140} - - {dataset: GISS-E2-H, start_year: 2410, end_year: 2549} - - {dataset: GISS-E2-R, start_year: 3981, end_year: 4120} - # Experiments starts at 1859-12-01 - - {dataset: HadGEM2-ES, start_year: 1860, end_year: 1999} - - {dataset: inmcm4, start_year: 2090, end_year: 2229} - - {dataset: IPSL-CM5A-LR, start_year: 1850, end_year: 1989} - - {dataset: IPSL-CM5B-LR, start_year: 1850, end_year: 1989} - - {dataset: MIROC5, start_year: 2200, end_year: 2339} - - {dataset: MIROC-ESM, start_year: 1880, end_year: 2019} - - {dataset: MPI-ESM-LR, start_year: 1880, end_year: 2019} - - {dataset: MPI-ESM-P, start_year: 1866, end_year: 2005} - - {dataset: MRI-CGCM3, start_year: 1891, end_year: 2030} - - {dataset: NorESM1-M, start_year: 700, end_year: 839} - scripts: - tcr: &tcr_script - script: climate_metrics/tcr.py - - fig09-42a_cmip5: - title: Fig. 9.42a CMIP5 (ECS vs. GMSAT) - description: Plot ECS vs. GMSAT for CMIP5 models. - themes: - - phys - realms: - - atmos - variables: - tas: - <<: *ecs_settings - additional_datasets: - - {dataset: ACCESS1-0, exp: piControl, start_year: 300, end_year: 449} - - {dataset: ACCESS1-0, exp: historical, start_year: 1961, end_year: 1990} - # Wrong start year for piControl (must be 407) - - {dataset: bcc-csm1-1, exp: piControl, start_year: 160, end_year: 299} - - {dataset: bcc-csm1-1, exp: historical, start_year: 1961, end_year: 1990} - # Wrong start year for piControl (must be 344) - - {dataset: bcc-csm1-1-m, exp: piControl, start_year: 240, end_year: 379} - - {dataset: bcc-csm1-1-m, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: CanESM2, exp: piControl, start_year: 2321, end_year: 2470} - - {dataset: CanESM2, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: CCSM4, exp: piControl, start_year: 937, end_year: 1086} - - {dataset: CCSM4, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: CNRM-CM5, exp: piControl, start_year: 2250, end_year: 2399} - - {dataset: CNRM-CM5, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: CSIRO-Mk3-6-0, exp: piControl, start_year: 81, end_year: 230} - - {dataset: CSIRO-Mk3-6-0, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: GFDL-CM3, exp: piControl, start_year: 1, end_year: 150} - - {dataset: GFDL-CM3, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: GFDL-ESM2G, exp: piControl, start_year: 162, end_year: 311} - - {dataset: GFDL-ESM2G, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: GFDL-ESM2M, exp: piControl, start_year: 162, end_year: 311} - - {dataset: GFDL-ESM2M, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: GISS-E2-H, exp: piControl, start_year: 2410, end_year: 2559} - - {dataset: GISS-E2-H, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: GISS-E2-R, exp: piControl, start_year: 3981, end_year: 4130} - - {dataset: GISS-E2-R, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: HadGEM2-ES, exp: piControl, start_year: 1860, end_year: 2009} - - {dataset: HadGEM2-ES, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: inmcm4, exp: piControl, start_year: 1850, end_year: 1999} - - {dataset: inmcm4, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: IPSL-CM5A-LR, exp: piControl, start_year: 1850, end_year: 1999} - - {dataset: IPSL-CM5A-LR, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: IPSL-CM5B-LR, exp: piControl, start_year: 1850, end_year: 1999} - - {dataset: IPSL-CM5B-LR, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: MIROC5, exp: piControl, start_year: 2411, end_year: 2560} - - {dataset: MIROC5, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: MIROC-ESM, exp: piControl, start_year: 1880, end_year: 2029} - - {dataset: MIROC-ESM, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: MPI-ESM-LR, exp: piControl, start_year: 1880, end_year: 2029} - - {dataset: MPI-ESM-LR, exp: historical, start_year: 1961, end_year: 1990} - # Parent experiment of historical is NOT piControl, but past1000 - - {dataset: MPI-ESM-P, exp: piControl, start_year: 2850, end_year: 2999} - - {dataset: MPI-ESM-P, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: MRI-CGCM3, exp: piControl, start_year: 1950, end_year: 2099} - - {dataset: MRI-CGCM3, exp: historical, start_year: 1961, end_year: 1990} - - {dataset: NorESM1-M, exp: piControl, start_year: 700, end_year: 849} - - {dataset: NorESM1-M, exp: historical, start_year: 1961, end_year: 1990} - scripts: - fig09-42a: &fig09_42a_script - script: ipcc_ar5/ch09_fig09_42a.py - ancestors: ['tas', 'ecs_cmip5/ecs'] - tas_units: celsius - save: - bbox_inches: tight - orientation: landscape - axes_functions: &axes_functions - set_title: GMSAT vs. ECS for CMIP5 models - set_xlabel: ECS / °C - set_ylabel: GMSAT / °C - set_xlim: [1.5, 6.0] - legend: - kwargs: - loc: center left - bbox_to_anchor: [1.05, 0.5] - borderaxespad: 0.0 - ncol: 2 - - fig09-42b_cmip5: - title: Fig. 9.42b CMIP5 (TCR vs. ECS) - description: Plot TCR vs. ECS for CMIP5 models. - themes: - - phys - realms: - - atmos - scripts: - fig09-42b: &fig09_42b_script - script: ipcc_ar5/ch09_fig09_42b.py - ancestors: ['ecs_cmip5/ecs', 'tcr_cmip5/tcr'] - - ecs_cmip6: - description: Calculate ECS for CMIP6 models. - themes: - - phys - realms: - - atmos - variables: - tas_rtnt: - <<: *ecs_settings - project: CMIP6 - additional_datasets: &datasets_cmip6_rtnt - # No monthly data (parent_time_units not correct) - # - {dataset: AWI-CM-1-1-MR, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 2650, end_year: 2799, mip: day} - # - {dataset: AWI-CM-1-1-MR, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999, mip: day} - - {dataset: BCC-CSM2-MR, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: BCC-CSM2-MR, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: BCC-ESM1, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: BCC-ESM1, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: CAMS-CSM1-0, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 3030, end_year: 3179} - - {dataset: CAMS-CSM1-0, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 3030, end_year: 3179} - - {dataset: CESM2, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 150} - - {dataset: CESM2, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 150} - - {dataset: CESM2-WACCM, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 150, institute: NCAR} - - {dataset: CESM2-WACCM, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 150, institute: NCAR} - - {dataset: CNRM-CM6-1, exp: piControl, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1999} - - {dataset: CNRM-CM6-1, exp: abrupt-4xCO2, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1999} - - {dataset: CNRM-ESM2-1, exp: piControl, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1999} - - {dataset: CNRM-ESM2-1, exp: abrupt-4xCO2, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1999} - - {dataset: E3SM-1-0, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 101, end_year: 250} - - {dataset: E3SM-1-0, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr, start_year: 1, end_year: 150} - # No abrupt-4xCO2 - # - {dataset: EC-Earth3, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1999} - # - {dataset: EC-Earth3, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1999} - - {dataset: EC-Earth3-Veg, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1999} - - {dataset: EC-Earth3-Veg, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1999} - # Only mixed ensemble members available, parent_time_units messed up - # - {dataset: FGOALS-f3-L, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 151, end_year: 300} - # - {dataset: FGOALS-f3-L, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 150} - # Wrong start year for piControl (must be 101) - - {dataset: GFDL-CM4, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 151, end_year: 300} - - {dataset: GFDL-CM4, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 150} - - {dataset: GFDL-ESM4, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 101, end_year: 250} - - {dataset: GFDL-ESM4, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 150} - - {dataset: GISS-E2-1-G, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 4150, end_year: 4299} - - {dataset: GISS-E2-1-G, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: GISS-E2-1-H, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 3180, end_year: 3329} - - {dataset: GISS-E2-1-H, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: HadGEM3-GC31-LL, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: HadGEM3-GC31-LL, exp: abrupt-4xCO2, ensemble: r1i1p1f3, grid: gn, start_year: 1850, end_year: 1999} - # Wrong start year for piControl (must be 2099), data withdrawn - # - {dataset: INM-CM5-0, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 2499, end_year: 2648} - # - {dataset: INM-CM5-0, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 1999} - # Not enough years for piControl run, data withdrawn - # - {dataset: INM-CM4-8, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 1947, end_year: 2096} - # - {dataset: INM-CM4-8, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 1999} - - {dataset: IPSL-CM6A-LR, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 1870, end_year: 2019} - - {dataset: IPSL-CM6A-LR, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1999} - - {dataset: MIROC6, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 3200, end_year: 3349} - - {dataset: MIROC6, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 3200, end_year: 3349} - - {dataset: MIROC-ES2L, exp: piControl, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: MIROC-ES2L, exp: abrupt-4xCO2, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: MPI-ESM1-2-HR, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: MPI-ESM1-2-HR, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: MRI-ESM2-0, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: MRI-ESM2-0, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - # parent_time_units not correct - - {dataset: NESM3, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 550, end_year: 699} - - {dataset: NESM3, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - # Issue #286 (manual copying was necessary) - - {dataset: SAM0-UNICON, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 274, end_year: 423} - - {dataset: SAM0-UNICON, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - tas_rtmt: - <<: *ecs_settings - project: CMIP6 - additional_datasets: &datasets_cmip6_rtmt - - {dataset: CanESM5, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 5201, end_year: 5350} - - {dataset: CanESM5, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: UKESM1-0-LL, exp: piControl, ensemble: r1i1p1f2, grid: gn, start_year: 1960, end_year: 2109} - - {dataset: UKESM1-0-LL, exp: abrupt-4xCO2, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1999} - rtnt: - <<: *ecs_settings - short_name: rtnt - project: CMIP6 - derive: true - additional_datasets: *datasets_cmip6_rtnt - rtmt: - <<: *ecs_settings - short_name: rtmt - project: CMIP6 - additional_datasets: *datasets_cmip6_rtmt - scripts: - ecs: - <<: *ecs_script - - tcr_cmip6: - description: Calculate TCR for all CMIP6 models. - variables: - 1pctCO2: - <<: *tcr_settings - project: CMIP6 - additional_datasets: - # No monthly data (parent_time_units not correct) - # - {dataset: AWI-CM-1-1-MR, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989, mip: day} - - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, start_year: 3030, end_year: 3169} - - {dataset: CanESM5, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 140} - - {dataset: CESM2-WACCM, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 140, institute: NCAR} - - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1989} - - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1989} - - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, start_year: 1, end_year: 140} - # No 1pctCO2 available - # - {dataset: EC-Earth3, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1989} - - {dataset: EC-Earth3-Veg, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1989} - # Only mixed ensemble members available, parent_time_units messed up - # - {dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 140} - - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 140} - - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 140} - - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f3, grid: gn, start_year: 1850, end_year: 1989} - # Data withdrawn - # - {dataset: INM-CM4-8, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 1989} - - {dataset: IPSL-CM6A-LR, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1989} - - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, start_year: 3200, end_year: 3339} - - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: MPI-ESM1-2-HR, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - # parent_time_units not correct, incorrect start year for piControl - - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1989} - piControl: - <<: *tcr_settings - project: CMIP6 - exp: piControl - additional_datasets: - # No monthly data (parent_time_units not correct) - # - {dataset: AWI-CM-1-1-MR, ensemble: r1i1p1f1, grid: gn, start_year: 2650, end_year: 2789, mip: day} - - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - - {dataset: BCC-ESM1, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - - {dataset: CAMS-CSM1-0, ensemble: r1i1p1f1, grid: gn, start_year: 3030, end_year: 3169} - - {dataset: CanESM5, ensemble: r1i1p1f1, grid: gn, start_year: 5201, end_year: 5340} - - {dataset: CESM2, ensemble: r1i1p1f1, grid: gn, start_year: 501, end_year: 640} - - {dataset: CESM2-WACCM, ensemble: r1i1p1f1, grid: gn, start_year: 70, end_year: 209, institute: NCAR} - - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1989} - - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1989} - - {dataset: E3SM-1-0, ensemble: r1i1p1f1, grid: gr, start_year: 101, end_year: 240} - # No 1pctCO2 available - # - {dataset: EC-Earth3, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1989} - - {dataset: EC-Earth3-Veg, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1989} - # Only mixed ensemble members available, parent_time_units messed up - # - {dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr1, start_year: 1, end_year: 140} - # Wrong start year (must be 101) - - {dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1, start_year: 151, end_year: 290} - - {dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1, start_year: 101, end_year: 240} - - {dataset: GISS-E2-1-G, ensemble: r1i1p1f1, grid: gn, start_year: 4150, end_year: 4289} - - {dataset: GISS-E2-1-H, ensemble: r1i1p1f1, grid: gn, start_year: 3180, end_year: 3319} - - {dataset: HadGEM3-GC31-LL, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - # Data withdrawn - # - {dataset: INM-CM4-8, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 1947, end_year: 2086} - - {dataset: IPSL-CM6A-LR, ensemble: r1i1p1f1, grid: gr, start_year: 1870, end_year: 2009} - - {dataset: MIROC6, ensemble: r1i1p1f1, grid: gn, start_year: 3200, end_year: 3339} - - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: MPI-ESM1-2-HR, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - - {dataset: MRI-ESM2-0, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1989} - # parent_time_units not correct, incorrect start year for piControl - - {dataset: NESM3, ensemble: r1i1p1f1, grid: gn, start_year: 550, end_year: 689} - - {dataset: SAM0-UNICON, ensemble: r1i1p1f1, grid: gn, start_year: 274, end_year: 413} - - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn, start_year: 1960, end_year: 2099} - scripts: - tcr: - <<: *tcr_script - - fig09-42a_cmip6: - title: Fig. 9.42a CMIP6 (ECS vs. GMSAT) - description: Plot ECS vs. GMSAT for CMIP6 models. - themes: - - phys - realms: - - atmos - variables: - tas: - <<: *ecs_settings - project: CMIP6 - additional_datasets: - - {dataset: BCC-CSM2-MR, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: BCC-CSM2-MR, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} - - {dataset: BCC-ESM1, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 2110, end_year: 2259} - - {dataset: BCC-ESM1, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} - - {dataset: CAMS-CSM1-0, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 3025, end_year: 3174} - - {dataset: CAMS-CSM1-0, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} - - {dataset: CanESM5, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 5201, end_year: 5350} - - {dataset: CanESM5, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} - - {dataset: CESM2, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 150} - - {dataset: CESM2, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} - - {dataset: CESM2-WACCM, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1, end_year: 150, institute: NCAR} - - {dataset: CESM2-WACCM, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990, institute: NCAR} - - {dataset: CNRM-CM6-1, exp: piControl, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1999} - - {dataset: CNRM-CM6-1, exp: historical, ensemble: r1i1p1f2, grid: gr, start_year: 1961, end_year: 1990} - - {dataset: CNRM-ESM2-1, exp: piControl, ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 1999} - - {dataset: CNRM-ESM2-1, exp: historical, ensemble: r1i1p1f2, grid: gr, start_year: 1961, end_year: 1990} - - {dataset: E3SM-1-0, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 101, end_year: 250} - - {dataset: E3SM-1-0, exp: historical, ensemble: r1i1p1f1, grid: gr, start_year: 1961, end_year: 1990} - - {dataset: EC-Earth3-Veg, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 2030, end_year: 2179} - - {dataset: EC-Earth3-Veg, exp: historical, ensemble: r1i1p1f1, grid: gr, start_year: 1961, end_year: 1990} - # Wrong start year (must be 101) - - {dataset: GFDL-CM4, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 151, end_year: 300} - - {dataset: GFDL-CM4, exp: historical, ensemble: r1i1p1f1, grid: gr1, start_year: 1961, end_year: 1990} - - {dataset: GFDL-ESM4, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 101, end_year: 250} - - {dataset: GFDL-ESM4, exp: historical, ensemble: r1i1p1f1, grid: gr1, start_year: 1961, end_year: 1990} - - {dataset: GISS-E2-1-G, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 4150, end_year: 4299} - - {dataset: GISS-E2-1-G, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} - - {dataset: GISS-E2-1-H, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 3180, end_year: 3329} - - {dataset: GISS-E2-1-H, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} - - {dataset: HadGEM3-GC31-LL, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: HadGEM3-GC31-LL, exp: historical, ensemble: r1i1p1f3, grid: gn, start_year: 1961, end_year: 1990} - # Wrong start year for piControl (must be 2099), data withdrawn - # - {dataset: INM-CM5-0, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 2499, end_year: 2648} - # - {dataset: INM-CM5-0, exp: historical, ensemble: r1i1p1f1, grid: gr1, start_year: 1961, end_year: 1990} - # Not enough years for piControl run - # - {dataset: INM-CM4-8, exp: piControl, ensemble: r1i1p1f1, grid: gr1, start_year: 1947, end_year: 2096} - # - {dataset: INM-CM4-8, exp: historical, ensemble: r1i1p1f1, grid: gr1, start_year: 1961, end_year: 1990} - - {dataset: IPSL-CM6A-LR, exp: piControl, ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 1999} - - {dataset: IPSL-CM6A-LR, exp: historical, ensemble: r1i1p1f1, grid: gr, start_year: 1961, end_year: 1990} - - {dataset: MIROC6, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 3200, end_year: 3349} - - {dataset: MIROC6, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} - - {dataset: MIROC-ES2L, exp: piControl, ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: MIROC-ES2L, exp: historical, ensemble: r1i1p1f2, grid: gn, start_year: 1961, end_year: 1990} - - {dataset: MPI-ESM1-2-HR, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: MPI-ESM1-2-HR, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} - - {dataset: MRI-ESM2-0, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 1999} - - {dataset: MRI-ESM2-0, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} - # parent_time_units not correct (must start in 1300) - - {dataset: NESM3, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 550, end_year: 699} - - {dataset: NESM3, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} - - {dataset: SAM0-UNICON, exp: piControl, ensemble: r1i1p1f1, grid: gn, start_year: 274, end_year: 423} - - {dataset: SAM0-UNICON, exp: historical, ensemble: r1i1p1f1, grid: gn, start_year: 1961, end_year: 1990} - - {dataset: UKESM1-0-LL, exp: piControl, ensemble: r1i1p1f2, grid: gn, start_year: 2250, end_year: 2399} - - {dataset: UKESM1-0-LL, exp: historical, ensemble: r1i1p1f2, grid: gn, start_year: 1961, end_year: 1990} - scripts: - fig09-42a: - <<: *fig09_42a_script - ancestors: ['tas', 'ecs_cmip6/ecs'] - axes_functions: - <<: *axes_functions - set_title: GMSAT vs. ECS for CMIP6 models - dataset_style: cmip6 - - fig09-42b_cmip6: - title: Fig. 9.42b CMIP6 (TCR vs. ECS) - description: Plot TCR vs. ECS for CMIP6 models. - themes: - - phys - realms: - - atmos - scripts: - fig09-42b: - <<: *fig09_42b_script - ancestors: ['ecs_cmip6/ecs', 'tcr_cmip6/tcr'] - dataset_style: cmip6 - - # *********************************************************************** - # Flato et al. (2013) - IPCC AR5, chap. 9 - # similar to fig. 9.45a - # *********************************************************************** - # Scatterplot of springtime snow-albedo effect values in climate - # change vs. springtime d(alpha_s)/d(T_s) values in the seasonal - # cycle in transient climate change experiments. - # *********************************************************************** - - fig09-45a: - title: Fig. 9.45a (snow-albedo feedback) - description: springtime snow-albedo feedback values vs. seasonal cycle - themes: - - EC - realms: - - atmos - variables: - alb: - mip: Amon - project: CMIP5 - ensemble: r1i1p1 - reference_dataset: ISCCP-FH - derive: true - additional_datasets: - - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, start_year: 1984, end_year: 2000, tier: 2} - tas: - mip: Amon - project: CMIP5 - ensemble: r1i1p1 - reference_dataset: ERA-Interim - additional_datasets: - - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, start_year: 1984, end_year: 2000, tier: 3} - rsdt: - mip: Amon - project: CMIP5 - ensemble: r1i1p1 - reference_dataset: ISCCP-FH - additional_datasets: - - {dataset: ISCCP-FH, project: OBS, type: sat, version: v0, start_year: 1984, end_year: 2000, tier: 2} - additional_datasets: - - {dataset: bcc-csm1-1, exp: historical, start_year: 1901, end_year: 2000} - - {dataset: bcc-csm1-1, exp: rcp45, start_year: 2101, end_year: 2200} - - {dataset: CanESM2, exp: historical, start_year: 1901, end_year: 2000} - - {dataset: CanESM2, exp: rcp45, start_year: 2101, end_year: 2200} - - {dataset: CCSM4, exp: historical, start_year: 1901, end_year: 2000} - - {dataset: CCSM4, exp: rcp45, start_year: 2101, end_year: 2200} - - {dataset: CNRM-CM5, exp: historical, start_year: 1901, end_year: 2000} - - {dataset: CNRM-CM5, exp: rcp45, start_year: 2101, end_year: 2200} - - {dataset: CSIRO-Mk3-6-0, exp: historical, start_year: 1901, end_year: 2000} - - {dataset: CSIRO-Mk3-6-0, exp: rcp45, start_year: 2101, end_year: 2200} - - {dataset: GFDL-CM3, exp: historical, start_year: 1901, end_year: 2000} - - {dataset: GFDL-CM3, exp: rcp45, start_year: 2101, end_year: 2200} - - {dataset: GISS-E2-H, exp: historical, start_year: 1901, end_year: 2000} - - {dataset: GISS-E2-H, exp: rcp45, start_year: 2101, end_year: 2200} - - {dataset: GISS-E2-R, exp: historical, start_year: 1901, end_year: 2000} - - {dataset: GISS-E2-R, exp: rcp45, start_year: 2101, end_year: 2200} - - {dataset: IPSL-CM5A-LR, exp: historical, start_year: 1901, end_year: 2000} - - {dataset: IPSL-CM5A-LR, exp: rcp45, start_year: 2101, end_year: 2200} - - {dataset: MIROC-ESM, exp: historical, start_year: 1901, end_year: 2000} - - {dataset: MIROC-ESM, exp: rcp45, start_year: 2101, end_year: 2200} - - {dataset: MPI-ESM-LR, exp: historical, start_year: 1901, end_year: 2000} - - {dataset: MPI-ESM-LR, exp: rcp45, start_year: 2101, end_year: 2200} - - {dataset: NorESM1-M, exp: historical, start_year: 1901, end_year: 2000} - - {dataset: NorESM1-M, exp: rcp45, start_year: 2101, end_year: 2200} - scripts: - fig09_45a: - script: emergent_constraints/snowalbedo.ncl - exp_presentday: historical - exp_future: rcp45 - legend_outside: false - xmin: -1.7 - xmax: -0.3 - ymin: -1.7 - ymax: -0.3 - styleset: "CMIP5" diff --git a/esmvaltool/recipes/recipe_gier2020bg.yml b/esmvaltool/recipes/recipe_gier2020bg.yml index 24128cd9de..8bd84937e0 100644 --- a/esmvaltool/recipes/recipe_gier2020bg.yml +++ b/esmvaltool/recipes/recipe_gier2020bg.yml @@ -7,7 +7,8 @@ # NOTE: # Commented out datasets and options reflect the exact settings used in the paper creation, # datasets commented out require additional preprocessing e.g. converting from hybrid coordinates to -# pressure coordinates, or are otherwise currently not available on the DKRZ ESGF node, but may be available on other ESGF nodes, if the user turns on automatic download in the run configuration. +# pressure coordinates, or are otherwise currently not available on the DKRZ ESGF node, +# but may be available on other ESGF nodes, if the user turns on automatic download in the run configuration. --- documentation: diff --git a/esmvaltool/recipes/recipe_impact.yml b/esmvaltool/recipes/recipe_impact.yml index 7819d1025b..8db9a34196 100644 --- a/esmvaltool/recipes/recipe_impact.yml +++ b/esmvaltool/recipes/recipe_impact.yml @@ -13,6 +13,16 @@ documentation: temperature, one can select a run with a high change and one with a low change of annual temperature, preferably both with a low bias. + Results of this recipe can be viewed interactively at + https://esmvaltool.dkrz.de/shared/esmvaltool/climate4impact/. + + Notes: + + - Bias is calcated with respect to the ERA5 reanalysis dataset over the period 1981-2015. + - Future change is calculated for 2036-2065 as compared to 1986-2015. + - Area is set to Europe (lon 0-39; lat 30-76.25) + - All data are taken from the RCP/SSP 8.5 scenario + authors: - kalverla_peter - andela_bouwe @@ -23,126 +33,136 @@ documentation: datasets: # CMIP5 - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: ACCESS1-0, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: ACCESS1-3, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: bcc-csm1-1, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: bcc-csm1-1-m, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: BNU-ESM, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: CanESM2, ensemble: r(1:5)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: CCSM4, ensemble: r(1:6)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: CESM1-BGC, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: CESM1-CAM5, ensemble: r(1:3)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: CESM1-WACCM, ensemble: r(2:4)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: CMCC-CESM, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: CMCC-CM, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: CMCC-CMS, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: CNRM-CM5, ensemble: r(1:2)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: CNRM-CM5, ensemble: r4i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: CNRM-CM5, ensemble: r6i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: CNRM-CM5, ensemble: r10i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: CSIRO-Mk3-6-0, ensemble: r(1:10)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: EC-EARTH, ensemble: r(1:2)i1p1, tag: model} - # The following dataset has an issue in the time coordinate in an old version of the dataset (which is still present on mistral) - # See https://github.com/ESMValGroup/ESMValTool/pull/2563 for details - # - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: EC-EARTH, ensemble: r6i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: EC-EARTH, ensemble: r9i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: FGOALS-g2, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: FGOALS-s2, ensemble: r(1:3)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: FIO-ESM, ensemble: r(1:3)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: GFDL-CM3, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: GFDL-ESM2G, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: GFDL-ESM2M, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-H, ensemble: r1i1p2, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-H, ensemble: r(1:2)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-H, ensemble: r(1:2)i1p3, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-H-CC, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-R, ensemble: r1i1p2, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-R, ensemble: r(1:2)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-R, ensemble: r(1:2)i1p3, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-R-CC, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: HadGEM2-AO, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: HadGEM2-CC, ensemble: r(1:3)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: HadGEM2-ES, ensemble: r(1:4)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: inmcm4, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: IPSL-CM5A-LR, ensemble: r(1:4)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: IPSL-CM5A-MR, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: IPSL-CM5B-LR, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: MIROC-ESM, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: MIROC-ESM-CHEM, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: MIROC5, ensemble: r(1:3)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: MPI-ESM-LR, ensemble: r(1:3)i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: MPI-ESM-MR, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: MRI-CGCM3, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: MRI-ESM1, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: NorESM1-M, ensemble: r1i1p1, tag: model} - - {mip: Amon, project: CMIP5, exp: [historical, rcp85], dataset: NorESM1-ME, ensemble: r1i1p1, tag: model} + - {project: CMIP5, exp: [historical, rcp85], dataset: ACCESS1-0, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: ACCESS1-3, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: bcc-csm1-1, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: bcc-csm1-1-m, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: BNU-ESM, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: CanESM2, ensemble: r(1:5)i1p1, + supplementary_variables: [{short_name: areacella, mip: fx, ensemble: r0i0p0, exp: historical}]} + - {project: CMIP5, exp: [historical, rcp85], dataset: CCSM4, ensemble: r(1:6)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: CESM1-BGC, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: CESM1-CAM5, ensemble: r(1:3)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: CESM1-WACCM, ensemble: r(2:4)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: CMCC-CESM, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: CMCC-CM, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: CMCC-CMS, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: CNRM-CM5, ensemble: r(1:2)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: CNRM-CM5, ensemble: r4i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: CNRM-CM5, ensemble: r6i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: CNRM-CM5, ensemble: r10i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: CSIRO-Mk3-6-0, ensemble: r(1:10)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: EC-EARTH, ensemble: r(1:2)i1p1} + # The EC-EARTH r6i1p1, r7i1p1, r14i1p1 have issues in the time coordinate, + # see https://github.com/ESMValGroup/ESMValTool/pull/2563 for details + - {project: CMIP5, exp: [historical, rcp85], dataset: EC-EARTH, ensemble: r(8:9)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: EC-EARTH, ensemble: r(12:13)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: FGOALS-g2, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: FGOALS-s2, ensemble: r(1:3)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: FIO-ESM, ensemble: r(1:3)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: GFDL-CM3, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: GFDL-ESM2G, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: GFDL-ESM2M, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-H, ensemble: r1i1p2} + - {project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-H, ensemble: r(1:2)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-H, ensemble: r(1:2)i1p3} + - {project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-H-CC, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-R, ensemble: r1i1p2} + - {project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-R, ensemble: r(1:2)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-R, ensemble: r(1:2)i1p3} + - {project: CMIP5, exp: [historical, rcp85], dataset: GISS-E2-R-CC, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: HadGEM2-AO, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: HadGEM2-CC, ensemble: r(1:3)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: HadGEM2-ES, ensemble: r(1:4)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: inmcm4, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: IPSL-CM5A-LR, ensemble: r(1:4)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: IPSL-CM5A-MR, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: IPSL-CM5B-LR, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: MIROC-ESM, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: MIROC-ESM-CHEM, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: MIROC5, ensemble: r(1:3)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: MPI-ESM-LR, ensemble: r(1:3)i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: MPI-ESM-MR, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: MRI-CGCM3, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: MRI-ESM1, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: NorESM1-M, ensemble: r1i1p1} + - {project: CMIP5, exp: [historical, rcp85], dataset: NorESM1-ME, ensemble: r1i1p1} # CMIP6 - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: ACCESS-CM2, ensemble: r(1:3)i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: ACCESS-ESM1-5, ensemble: r(1:10)i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: AWI-CM-1-1-MR, ensemble: r1i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CAMS-CSM1-0, ensemble: r(1:2)i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CanESM5, ensemble: r(1:25)i1p(1:2)f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CanESM5-CanOE, ensemble: r(1:3)i1p2f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CAS-ESM2-0, ensemble: r1i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CAS-ESM2-0, ensemble: r3i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CESM2, ensemble: r4i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CESM2, ensemble: r(10:11)i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CESM2-WACCM, ensemble: r(1:3)i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CIESM, ensemble: r1i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CMCC-ESM2, ensemble: r1i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CNRM-CM6-1, ensemble: r(1:6)i1p1f2, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: CNRM-ESM2-1, ensemble: r(1:5)i1p1f2, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: E3SM-1-1, ensemble: r1i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r1i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r(3:4)i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r6i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r9i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r11i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r13i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r15i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r(101:150)i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-CC, ensemble: r1i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-Veg, ensemble: r(1:4)i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-Veg, ensemble: r6i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-Veg, ensemble: r10i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-Veg, ensemble: r12i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-Veg, ensemble: r14i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-Veg-LR, ensemble: r(1:3)i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: FGOALS-g3, ensemble: r(1:4)i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: FIO-ESM-2-0, ensemble: r(1:3)i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: GISS-E2-1-G, ensemble: r1i1p5f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: GISS-E2-1-G, ensemble: r(1:5)i1p1f2, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: GISS-E2-1-G, ensemble: r(1:5)i1p3f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: HadGEM3-GC31-LL, ensemble: r(1:4)i1p1f3, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: HadGEM3-GC31-MM, ensemble: r(1:4)i1p1f3, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: IITM-ESM, ensemble: r1i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: INM-CM4-8, ensemble: r1i1p1f1, grid: gr1, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: INM-CM5-0, ensemble: r1i1p1f1, grid: gr1, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: IPSL-CM6A-LR, ensemble: r(1:4)i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: IPSL-CM6A-LR, ensemble: r6i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: IPSL-CM6A-LR, ensemble: r14i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: KACE-1-0-G, ensemble: r(1:3)i1p1f1, grid: gr, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: MCM-UA-1-0, ensemble: r1i1p1f2, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: MIROC-ES2L, ensemble: r(1:10)i1p1f2, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: MIROC6, ensemble: r(1:50)i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: MPI-ESM1-2-HR, ensemble: r(1:2)i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: MPI-ESM1-2-LR, ensemble: r(1:10)i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: MRI-ESM2-0, ensemble: r1i(1:2)p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: NESM3, ensemble: r(1:2)i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: NorESM2-MM, ensemble: r1i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: UKESM1-0-LL, ensemble: r(1:4)i1p1f2, grid: gn, tag: model} - - {mip: Amon, project: CMIP6, exp: [historical, ssp585], dataset: UKESM1-0-LL, ensemble: r8i1p1f2, grid: gn, tag: model} + - {project: CMIP6, exp: [historical, ssp585], dataset: ACCESS-CM2, ensemble: r(1:5)i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: ACCESS-ESM1-5, ensemble: r(1:40)i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: AWI-CM-1-1-MR, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: CAMS-CSM1-0, ensemble: r(1:2)i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: CanESM5, ensemble: r(1:25)i1p(1:2)f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: CanESM5-1, institute: CCCma, ensemble: r(1:10)i1p(1:2)f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: CanESM5-CanOE, ensemble: r(1:3)i1p2f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: CAS-ESM2-0, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: CAS-ESM2-0, ensemble: r3i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: CESM2, ensemble: r4i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: CESM2, ensemble: r(10:11)i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: CESM2-WACCM, ensemble: r(1:3)i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: CIESM, ensemble: r1i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: CMCC-CM2-SR5, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: CMCC-ESM2, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: CNRM-CM6-1, ensemble: r(1:6)i1p1f2, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: CNRM-CM6-1-HR, ensemble: r1i1p1f2, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: CNRM-ESM2-1, ensemble: r(1:5)i1p1f2, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: E3SM-1-0, ensemble: r(1:5)i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: E3SM-1-1, ensemble: r1i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: E3SM-1-1-ECA, ensemble: r1i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r1i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r(3:4)i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r6i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r9i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r11i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r13i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r15i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3, ensemble: r(101:150)i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-CC, ensemble: r1i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-Veg, ensemble: r(1:4)i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-Veg, ensemble: r6i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-Veg, ensemble: r10i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-Veg, ensemble: r12i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-Veg, ensemble: r14i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: EC-Earth3-Veg-LR, ensemble: r(1:3)i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: FGOALS-f3-L, ensemble: r1i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: FGOALS-g3, ensemble: r(1:4)i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: FIO-ESM-2-0, ensemble: r(1:3)i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: GFDL-CM4, ensemble: r1i1p1f1, grid: gr1} + - {project: CMIP6, exp: [historical, ssp585], dataset: GFDL-ESM4, ensemble: r1i1p1f1, grid: gr1} + - {project: CMIP6, exp: [historical, ssp585], dataset: GISS-E2-1-G, ensemble: r(1:4)i1p5f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: GISS-E2-1-G, ensemble: r(1:5)i1p1f2, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: GISS-E2-1-G, ensemble: r(1:5)i1p3f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: GISS-E2-1-H, ensemble: r(1:5)i1p1f2, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: GISS-E2-1-H, ensemble: r(1:5)i1p3f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: GISS-E2-2-G, ensemble: r(1:5)i1p3f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: HadGEM3-GC31-LL, ensemble: r(1:4)i1p1f3, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: HadGEM3-GC31-MM, ensemble: r(1:4)i1p1f3, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: IITM-ESM, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: INM-CM4-8, ensemble: r1i1p1f1, grid: gr1} + - {project: CMIP6, exp: [historical, ssp585], dataset: INM-CM5-0, ensemble: r1i1p1f1, grid: gr1} + - {project: CMIP6, exp: [historical, ssp585], dataset: IPSL-CM6A-LR, ensemble: r(1:4)i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: IPSL-CM6A-LR, ensemble: r6i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: IPSL-CM6A-LR, ensemble: r14i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: IPSL-CM6A-LR, ensemble: r33i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: KACE-1-0-G, ensemble: r(1:3)i1p1f1, grid: gr} + - {project: CMIP6, exp: [historical, ssp585], dataset: KIOST-ESM, ensemble: r1i1p1f1, grid: gr1} + - {project: CMIP6, exp: [historical, ssp585], dataset: MCM-UA-1-0, ensemble: r1i1p1f2, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: MIROC-ES2L, ensemble: r(1:10)i1p1f2, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: MIROC6, ensemble: r(1:50)i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: MPI-ESM1-2-HR, ensemble: r(1:2)i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: MPI-ESM1-2-LR, ensemble: r(1:30)i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: MRI-ESM2-0, ensemble: r1i2p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: MRI-ESM2-0, ensemble: r(1:5)i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: NESM3, ensemble: r(1:2)i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: NorESM2-MM, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: UKESM1-0-LL, ensemble: r(1:4)i1p1f2, grid: gn} + - {project: CMIP6, exp: [historical, ssp585], dataset: UKESM1-0-LL, ensemble: r8i1p1f2, grid: gn} observations: &observations - - {mip: Amon, dataset: ERA5, project: native6, type: reanaly, version: '1', tier: 3, tag: observations} + - {mip: Amon, dataset: ERA5, project: native6, type: reanaly, version: v1, tier: 3, tag: observations} preprocessors: @@ -155,8 +175,6 @@ preprocessors: end_latitude: 76.25 area_statistics: operator: mean - fx_variables: - areacella: anomalies: period: full reference: &reference_period @@ -201,24 +219,28 @@ diagnostics: variables: tas_change: short_name: tas - start_year: 1981 - end_year: 2099 + mip: Amon + tag: model + timerange: '1981/2099' preprocessor: calculate_anomalies pr_change: short_name: pr - start_year: 1981 - end_year: 2099 + mip: Amon + tag: model + timerange: '1981/2099' preprocessor: calculate_anomalies tas_bias: short_name: tas - start_year: 1981 - end_year: 2010 + mip: Amon + tag: model + timerange: '1981/2010' preprocessor: prepare_for_bias_calculation additional_datasets: *observations pr_bias: short_name: pr - start_year: 1981 - end_year: 2010 + mip: Amon + tag: model + timerange: '1981/2010' preprocessor: prepare_for_bias_calculation additional_datasets: *observations diff --git a/esmvaltool/recipes/recipe_meehl20sciadv.yml b/esmvaltool/recipes/recipe_meehl20sciadv.yml index 765fc0c44d..cd3c28b4e8 100644 --- a/esmvaltool/recipes/recipe_meehl20sciadv.yml +++ b/esmvaltool/recipes/recipe_meehl20sciadv.yml @@ -26,8 +26,6 @@ preprocessors: spatial_mean: area_statistics: operator: mean - fx_variables: - areacella: ECS_CMIP5_RTNT: &ecs_cmip5_rtnt diff --git a/esmvaltool/recipes/recipe_ocean_Landschuetzer2016.yml b/esmvaltool/recipes/recipe_ocean_Landschuetzer2016.yml index 995a493bc2..5d8be0c516 100644 --- a/esmvaltool/recipes/recipe_ocean_Landschuetzer2016.yml +++ b/esmvaltool/recipes/recipe_ocean_Landschuetzer2016.yml @@ -130,5 +130,5 @@ diagnostics: <<: *write_opts Global_Ocean_model_vs_obs: script: ocean/diagnostic_model_vs_obs.py - observational_dataset: {dataset: Landschutzer2016, project: OBS} + observational_dataset: {dataset: Landschuetzer2016, project: OBS} <<: *write_opts diff --git a/esmvaltool/recipes/recipe_perfmetrics_CMIP5.yml b/esmvaltool/recipes/recipe_perfmetrics_CMIP5.yml index 238f513907..8d77eb2da5 100644 --- a/esmvaltool/recipes/recipe_perfmetrics_CMIP5.yml +++ b/esmvaltool/recipes/recipe_perfmetrics_CMIP5.yml @@ -272,7 +272,7 @@ diagnostics: ta: preprocessor: ppALL reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -332,7 +332,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: zonal: &zonal_settings script: perfmetrics/main.ncl @@ -455,7 +456,7 @@ diagnostics: tas: preprocessor: ppNOLEV2 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -515,7 +516,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: latlon: <<: *latlon_settings @@ -686,7 +688,7 @@ diagnostics: zg: preprocessor: pp500 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -743,7 +745,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -1105,7 +1108,7 @@ diagnostics: ua: preprocessor: pp200 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -1164,7 +1167,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -1181,7 +1185,7 @@ diagnostics: va: preprocessor: pp850 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -1239,7 +1243,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -1256,7 +1261,7 @@ diagnostics: ua: preprocessor: pp850 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -1315,7 +1320,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -1332,7 +1338,7 @@ diagnostics: va: preprocessor: pp200 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -1390,7 +1396,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -1407,7 +1414,7 @@ diagnostics: ta: preprocessor: pp5 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -1467,7 +1474,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: cycle: &cycle_settings script: perfmetrics/main.ncl @@ -1496,7 +1504,7 @@ diagnostics: ta: preprocessor: pp850 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -1556,7 +1564,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: cycle: <<: *cycle_settings @@ -1579,7 +1588,7 @@ diagnostics: ta: preprocessor: pp30 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -1639,7 +1648,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: cycle: <<: *cycle_settings @@ -1656,7 +1666,7 @@ diagnostics: ta: preprocessor: pp200 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -1716,7 +1726,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: cycle: <<: *cycle_settings diff --git a/esmvaltool/recipes/recipe_perfmetrics_CMIP5_4cds.yml b/esmvaltool/recipes/recipe_perfmetrics_CMIP5_4cds.yml index db588ef036..a4bd08b6d8 100644 --- a/esmvaltool/recipes/recipe_perfmetrics_CMIP5_4cds.yml +++ b/esmvaltool/recipes/recipe_perfmetrics_CMIP5_4cds.yml @@ -195,7 +195,7 @@ diagnostics: ta: preprocessor: pp850 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -255,7 +255,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: cycle: &cycle_settings script: perfmetrics/main.ncl @@ -293,7 +294,7 @@ diagnostics: ta: preprocessor: pp200 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -353,7 +354,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: cycle: <<: *cycle_settings @@ -375,7 +377,7 @@ diagnostics: ta: preprocessor: pp30 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -435,7 +437,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: cycle: <<: *cycle_settings @@ -451,7 +454,7 @@ diagnostics: ta: preprocessor: pp5 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -511,7 +514,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: cycle: <<: *cycle_settings @@ -527,7 +531,7 @@ diagnostics: ta: preprocessor: ppALL reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -587,7 +591,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: zonal: &zonal_settings script: perfmetrics/main.ncl @@ -622,7 +627,7 @@ diagnostics: ua: preprocessor: pp850 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -681,7 +686,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -701,7 +707,7 @@ diagnostics: ua: preprocessor: pp200 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -760,7 +766,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -781,7 +788,7 @@ diagnostics: va: preprocessor: pp850 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -839,7 +846,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -859,7 +867,7 @@ diagnostics: va: preprocessor: pp200 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -917,7 +925,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -938,7 +947,7 @@ diagnostics: zg: preprocessor: pp500 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -995,7 +1004,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: grading: <<: *grading_settings @@ -1087,7 +1097,7 @@ diagnostics: tas: preprocessor: ppNOLEV2 reference_dataset: ERA-Interim - alternative_dataset: NCEP + alternative_dataset: NCEP-NCAR-R1 mip: Amon project: CMIP5 exp: historical @@ -1147,7 +1157,8 @@ diagnostics: - {dataset: NorESM1-ME} - {dataset: ERA-Interim, project: OBS6, type: reanaly, version: 1, tier: 3} - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2} scripts: latlon: &latlon_settings script: perfmetrics/main.ncl diff --git a/esmvaltool/recipes/recipe_russell18jgr.yml b/esmvaltool/recipes/recipe_russell18jgr.yml index e3e69632a8..2e070d74be 100644 --- a/esmvaltool/recipes/recipe_russell18jgr.yml +++ b/esmvaltool/recipes/recipe_russell18jgr.yml @@ -625,7 +625,7 @@ diagnostics: - {dataset: IPSL-CM5A-LR} - {dataset: IPSL-CM5A-MR} - {dataset: IPSL-CM5B-LR} - - {dataset: MIROC-ESM} # , ensemble: r3i1p1} + - {dataset: MIROC-ESM, supplementary_variables: [{short_name: sftlf, mip: fx, ensemble: r0i0p0}, {short_name: sftof, skip: true}]} # , ensemble: r3i1p1} - {dataset: MRI-ESM1} scripts: fgco2-polar: @@ -681,7 +681,7 @@ diagnostics: - {dataset: IPSL-CM5A-LR} - {dataset: IPSL-CM5A-MR} - {dataset: IPSL-CM5B-LR} - - {dataset: MIROC-ESM} # , ensemble: r3i1p1} + - {dataset: MIROC-ESM, supplementary_variables: [{short_name: sftlf, mip: fx, ensemble: r0i0p0}, {short_name: sftof, skip: true}]} # , ensemble: r3i1p1} - {dataset: MRI-ESM1} scripts: fgco2_line: @@ -710,6 +710,8 @@ diagnostics: ensemble: r1i1p1 start_year: 1986 end_year: 2005 + additional_datasets: + - {dataset: MIROC-ESM, supplementary_variables: [{short_name: sftlf, mip: fx, ensemble: r0i0p0}, {short_name: sftof, skip: true}]} # , ensemble: r3i1p1} areacello: mip: fx project: CMIP5 @@ -717,6 +719,8 @@ diagnostics: ensemble: r0i0p0 start_year: 1986 end_year: 2005 + additional_datasets: + - {dataset: MIROC-ESM} # , ensemble: r3i1p1} additional_datasets: - {dataset: bcc-csm1-1} # - {dataset: BNU-ESM} @@ -729,7 +733,6 @@ diagnostics: - {dataset: IPSL-CM5A-LR} - {dataset: IPSL-CM5A-MR} - {dataset: IPSL-CM5B-LR} - - {dataset: MIROC-ESM} # , ensemble: r3i1p1} - {dataset: MRI-ESM1} scripts: fgco2_cumulative_line: diff --git a/esmvaltool/recipes/recipe_schlund20esd.yml b/esmvaltool/recipes/recipe_schlund20esd.yml index 459f44fdbc..28d9e83375 100644 --- a/esmvaltool/recipes/recipe_schlund20esd.yml +++ b/esmvaltool/recipes/recipe_schlund20esd.yml @@ -84,8 +84,6 @@ preprocessors: spatial_mean: area_statistics: operator: mean - fx_variables: - areacella: tropical_mean: extract_region: @@ -95,8 +93,6 @@ preprocessors: end_longitude: 360 area_statistics: operator: mean - fx_variables: - areacella: climate_statistics: operator: mean @@ -108,8 +104,6 @@ preprocessors: end_longitude: 360 area_statistics: operator: mean - fx_variables: - areacella: climate_statistics: operator: mean diff --git a/esmvaltool/recipes/recipe_sea_surface_salinity.yml b/esmvaltool/recipes/recipe_sea_surface_salinity.yml index f3cc71b355..4e670eec7f 100644 --- a/esmvaltool/recipes/recipe_sea_surface_salinity.yml +++ b/esmvaltool/recipes/recipe_sea_surface_salinity.yml @@ -9,7 +9,7 @@ documentation: - vegas-regidor_javier maintainer: - - vegas-regidor_javier + - loosveldt-tomas_saskia references: - contact_authors @@ -39,8 +39,6 @@ preprocessors: - Indian Ocean area_statistics: operator: mean - fx_variables: - areacello: datasets: - &cmip6 {project: CMIP6, exp: historical, dataset: ACCESS-CM2, ensemble: r1i1p1f1, diff --git a/esmvaltool/recipes/recipe_tcr.yml b/esmvaltool/recipes/recipe_tcr.yml index 6e3ca724a9..c93fa08112 100644 --- a/esmvaltool/recipes/recipe_tcr.yml +++ b/esmvaltool/recipes/recipe_tcr.yml @@ -26,8 +26,6 @@ preprocessors: spatial_mean: area_statistics: operator: mean - fx_variables: - areacella: TCR: &tcr_script diff --git a/esmvaltool/recipes/recipe_tebaldi21esd.yml b/esmvaltool/recipes/recipe_tebaldi21esd.yml index de8563328e..1797630217 100644 --- a/esmvaltool/recipes/recipe_tebaldi21esd.yml +++ b/esmvaltool/recipes/recipe_tebaldi21esd.yml @@ -3168,25 +3168,25 @@ diagnostics: - &id894 {dataset: MPI-ESM1-2-HR, end_year: 2014, ensemble: r5i1p1f1, exp: historical, grid: gn, institute: MPI-M, start_year: 1980} - &id895 {dataset: MPI-ESM1-2-HR, end_year: 2100, ensemble: r4i1p1f1, exp: ssp370, - grid: gn, institute: MPI-M, start_year: 2015} + grid: gn, institute: DKRZ, start_year: 2015} - &id896 {dataset: MPI-ESM1-2-HR, end_year: 2100, ensemble: r9i1p1f1, exp: ssp370, - grid: gn, institute: MPI-M, start_year: 2015} + grid: gn, institute: DKRZ, start_year: 2015} - &id897 {dataset: MPI-ESM1-2-HR, end_year: 2100, ensemble: r7i1p1f1, exp: ssp370, - grid: gn, institute: MPI-M, start_year: 2015} + grid: gn, institute: DKRZ, start_year: 2015} - &id898 {dataset: MPI-ESM1-2-HR, end_year: 2100, ensemble: r10i1p1f1, exp: ssp370, - grid: gn, institute: MPI-M, start_year: 2015} + grid: gn, institute: DKRZ, start_year: 2015} - &id899 {dataset: MPI-ESM1-2-HR, end_year: 2100, ensemble: r6i1p1f1, exp: ssp370, - grid: gn, institute: MPI-M, start_year: 2015} + grid: gn, institute: DKRZ, start_year: 2015} - &id900 {dataset: MPI-ESM1-2-HR, end_year: 2100, ensemble: r3i1p1f1, exp: ssp370, - grid: gn, institute: MPI-M, start_year: 2015} + grid: gn, institute: DKRZ, start_year: 2015} - &id901 {dataset: MPI-ESM1-2-HR, end_year: 2100, ensemble: r1i1p1f1, exp: ssp370, - grid: gn, institute: MPI-M, start_year: 2015} + grid: gn, institute: DKRZ, start_year: 2015} - &id902 {dataset: MPI-ESM1-2-HR, end_year: 2100, ensemble: r2i1p1f1, exp: ssp370, - grid: gn, institute: MPI-M, start_year: 2015} + grid: gn, institute: DKRZ, start_year: 2015} - &id903 {dataset: MPI-ESM1-2-HR, end_year: 2100, ensemble: r8i1p1f1, exp: ssp370, - grid: gn, institute: MPI-M, start_year: 2015} + grid: gn, institute: DKRZ, start_year: 2015} - &id904 {dataset: MPI-ESM1-2-HR, end_year: 2100, ensemble: r5i1p1f1, exp: ssp370, - grid: gn, institute: MPI-M, start_year: 2015} + grid: gn, institute: DKRZ, start_year: 2015} - &id905 {dataset: CanESM5, end_year: 2014, ensemble: r15i1p2f1, exp: historical, grid: gn, institute: CCCma, start_year: 1980} - &id906 {dataset: CanESM5, end_year: 2014, ensemble: r22i1p1f1, exp: historical, diff --git a/esmvaltool/recipes/recipe_validation.yml b/esmvaltool/recipes/recipe_validation.yml index 22e1cce9d6..c14f714e41 100644 --- a/esmvaltool/recipes/recipe_validation.yml +++ b/esmvaltool/recipes/recipe_validation.yml @@ -48,7 +48,7 @@ diagnostics: rsut: # TOA SW up all sky preprocessor: pp_rad additional_datasets: - - {dataset: CERES-EBAF, project: obs4MIPs, mip: Amon, level: L3B, version: Ed2-7, start_year: 2001, end_year: 2012, tier: 1} + - {dataset: CERES-EBAF, project: obs4MIPs, mip: Amon, level: L3B, version: v20160610, start_year: 2001, end_year: 2012, tier: 1} scripts: lat_lon: script: validation.py diff --git a/esmvaltool/recipes/recipe_wenzel14jgr.yml b/esmvaltool/recipes/recipe_wenzel14jgr.yml index 7fdcbdbef0..cc4601ab0e 100644 --- a/esmvaltool/recipes/recipe_wenzel14jgr.yml +++ b/esmvaltool/recipes/recipe_wenzel14jgr.yml @@ -567,9 +567,9 @@ diagnostics: start_year: 1960 end_year: 2005 plot_units: K - reference_dataset: NCEP + reference_dataset: NCEP-NCAR-R1 additional_datasets: - - {dataset: NCEP, project: OBS, type: reanaly, version: 1, tier: 2, start_year: 1959, end_year: 2005}#, frequency: yr} + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, version: 1, tier: 2, start_year: 1959, end_year: 2005}#, frequency: yr} - {dataset: CanESM2, start_year: 1960 ,end_year: 2005} - {dataset: CESM1-BGC, start_year: 1960 ,end_year: 2005} - {dataset: GFDL-ESM2M, start_year: 1960 ,end_year: 2005} diff --git a/esmvaltool/recipes/recipe_wenzel16jclim.yml b/esmvaltool/recipes/recipe_wenzel16jclim.yml index 0ac3bb0f2b..6caed04a93 100644 --- a/esmvaltool/recipes/recipe_wenzel16jclim.yml +++ b/esmvaltool/recipes/recipe_wenzel16jclim.yml @@ -22,8 +22,8 @@ documentation: DATASET_ANCHOR: &datasets - - {dataset: ACCESS1-0, ensemble: r1i1p1} - - {dataset: ACCESS1-3, ensemble: r1i1p1} + - {dataset: ACCESS1-0, ensemble: r1i1p1, supplementary_variables: [{short_name: areacella, skip: true}]} + - {dataset: ACCESS1-3, ensemble: r1i1p1, supplementary_variables: [{short_name: areacella, skip: true}]} - {dataset: bcc-csm1-1, ensemble: r1i1p1} - {dataset: bcc-csm1-1-m, ensemble: r1i1p1} - {dataset: BNU-ESM, ensemble: r1i1p1} diff --git a/esmvaltool/recipes/schlund20jgr/recipe_schlund20jgr_gpp_abs_rcp85.yml b/esmvaltool/recipes/schlund20jgr/recipe_schlund20jgr_gpp_abs_rcp85.yml index bc5aad0de2..69745951a5 100644 --- a/esmvaltool/recipes/schlund20jgr/recipe_schlund20jgr_gpp_abs_rcp85.yml +++ b/esmvaltool/recipes/schlund20jgr/recipe_schlund20jgr_gpp_abs_rcp85.yml @@ -49,7 +49,7 @@ DATASET_ANCHOR_CO2: &datasets_co2 - {dataset: CanESM2} - {dataset: CESM1-BGC} - {dataset: GFDL-ESM2M} - - {dataset: HadGEM2-ES, end_year: 2004} + - {dataset: HadGEM2-ES, end_year: 2004} # missing on ESGF for co2 of esmHistorical - {dataset: MIROC-ESM} - {dataset: MPI-ESM-LR} - {dataset: NorESM1-ME} @@ -117,6 +117,7 @@ GBRT_SCRIPT: &gbrt_script max_depth: 6 n_estimators: 400 subsample: 0.5 + random_state: 31415 save_mlr_model_error: test save_propagated_errors: true seaborn_settings: *seaborn_settings @@ -138,6 +139,7 @@ LASSO_SCRIPT: &lasso_script imputation_strategy: constant mlr_model_type: lasso_cv n_jobs: -1 + random_state: 31415 save_mlr_model_error: test save_propagated_errors: true seaborn_settings: *seaborn_settings @@ -235,7 +237,6 @@ preprocessors: target_grid: 2x2 mask_landsea: &mask_sea_NE_mask mask_out: sea - fx_variables: null extract_region: &extract_region start_latitude: -60.0 end_latitude: 90.0 diff --git a/esmvaltool/recipes/schlund20jgr/recipe_schlund20jgr_gpp_change_1pct.yml b/esmvaltool/recipes/schlund20jgr/recipe_schlund20jgr_gpp_change_1pct.yml index 307d24244c..8eda376e80 100644 --- a/esmvaltool/recipes/schlund20jgr/recipe_schlund20jgr_gpp_change_1pct.yml +++ b/esmvaltool/recipes/schlund20jgr/recipe_schlund20jgr_gpp_change_1pct.yml @@ -40,7 +40,7 @@ DATASET_ANCHOR_CO2: &datasets_co2 - {dataset: CanESM2} - {dataset: CESM1-BGC} - {dataset: GFDL-ESM2M, start_year: 1861} - - {dataset: HadGEM2-ES, end_year: 2004} + - {dataset: HadGEM2-ES, end_year: 2004} # missing on ESGF for co2 of esmHistorical - {dataset: MIROC-ESM} - {dataset: MPI-ESM-LR} - {dataset: NorESM1-ME} @@ -59,7 +59,7 @@ DATASET_ANCHOR_1PCTBGC: &datasets_1pctBGC - {dataset: CESM1-BGC, start_year: 67, end_year: 76} - {dataset: GFDL-ESM2M, start_year: 67, end_year: 76} - {dataset: HadGEM2-ES, start_year: 1916, end_year: 1925} - - {dataset: MIROC-ESM, start_year: 67, end_year: 76} + - {dataset: MIROC-ESM, start_year: 67, end_year: 76} # missing on ESGF for gpp of esmFixClim1 - {dataset: MPI-ESM-LR, start_year: 1916, end_year: 1925} - {dataset: NorESM1-ME, start_year: 67, end_year: 76} diff --git a/esmvaltool/recipes/schlund20jgr/recipe_schlund20jgr_gpp_change_rcp85.yml b/esmvaltool/recipes/schlund20jgr/recipe_schlund20jgr_gpp_change_rcp85.yml index 8e6aac2dd9..f54b1ab8eb 100644 --- a/esmvaltool/recipes/schlund20jgr/recipe_schlund20jgr_gpp_change_rcp85.yml +++ b/esmvaltool/recipes/schlund20jgr/recipe_schlund20jgr_gpp_change_rcp85.yml @@ -48,7 +48,7 @@ DATASET_ANCHOR_CO2: &datasets_co2 - {dataset: CanESM2} - {dataset: CESM1-BGC} - {dataset: GFDL-ESM2M} - - {dataset: HadGEM2-ES, end_year: 2004} + - {dataset: HadGEM2-ES, end_year: 2004} # missing on ESGF for co2 of esmHistorical - {dataset: MIROC-ESM} - {dataset: MPI-ESM-LR} - {dataset: NorESM1-ME} @@ -146,6 +146,7 @@ GBRT_SCRIPT: &gbrt_script max_depth: 4 n_estimators: 50 subsample: 0.5 + random_state: 31415 save_lime_importance: true save_mlr_model_error: test save_propagated_errors: true @@ -161,6 +162,7 @@ LASSO_SCRIPT: &lasso_script imputation_strategy: mean mlr_model_type: lasso_cv n_jobs: -1 + random_state: 31415 save_lime_importance: true save_mlr_model_error: test save_propagated_errors: true @@ -258,7 +260,6 @@ preprocessors: target_grid: 2x2 mask_landsea: &mask_sea_NE_mask mask_out: sea - fx_variables: null extract_region: &extract_region start_latitude: -60.0 end_latitude: 75.0 diff --git a/esmvaltool/recipes/testing/recipe_deangelis15nat_fig1_fast.yml b/esmvaltool/recipes/testing/recipe_deangelis15nat_fig1_fast.yml index fc948c2b06..55e241bde4 100644 --- a/esmvaltool/recipes/testing/recipe_deangelis15nat_fig1_fast.yml +++ b/esmvaltool/recipes/testing/recipe_deangelis15nat_fig1_fast.yml @@ -46,17 +46,10 @@ diagnostics: <<: *spatial_mean_cmip5_r1i1p1_amon_t2ms derive: false additional_datasets: - - {dataset: GFDL-CM3, exp: piControl, start_year: 1, - end_year: 1} - - {dataset: GFDL-CM3, exp: rcp85, start_year: 2091, - end_year: 2091} + - {dataset: GFDL-CM3, exp: piControl, start_year: 1, end_year: 1} + - {dataset: GFDL-CM3, exp: rcp85, start_year: 2091, end_year: 2091} - {dataset: GFDL-CM3, exp: abrupt4xCO2, start_year: 141, end_year: 141} - - {dataset: ACCESS1-0, exp: piControl, start_year: 300, end_year: 300} - - {dataset: ACCESS1-0, exp: rcp85, start_year: 2091, end_year: 2091} - - {dataset: ACCESS1-0, exp: abrupt4xCO2, start_year: 300, end_year: 300} scripts: deangelisf1b: script: deangelis15nat/deangelisf1b.py - - diff --git a/esmvaltool/references/esdc.bibtex b/esmvaltool/references/esdc.bibtex new file mode 100644 index 0000000000..887cb1f2bf --- /dev/null +++ b/esmvaltool/references/esdc.bibtex @@ -0,0 +1,11 @@ +@article{esdc, + doi = {10.5194/esd-11-201-2020}, + url = {https://esd.copernicus.org/articles/11/201/2020/}, + year = {2020}, + volume = {11}, + number = {1}, + pages = {201--234}, + author = {Mahecha, M. D. and Gans, F. and Brandt, G. and Christiansen, R. and Cornell, S. E. and Fomferra, N. and Kraemer, G. and Peters, J. and Bodesheim, P. and Camps-Valls, G. and Donges, J. F. and Dorigo, W. and Estupinan-Suarez, L. M. and Gutierrez-Velez, V. H. and Gutwin, M. and Jung, M. and Londo\~no, M. C. and Miralles, D. G. and Papastefanou, P. and Reichstein, M.}, + title = {Earth system data cubes unravel global multivariate dynamics}, + journal = {Earth System Dynamics} +} diff --git a/esmvaltool/references/eyring21ipcc.bibtex b/esmvaltool/references/eyring21ipcc.bibtex index 9bdb6ccb83..fd73260004 100644 --- a/esmvaltool/references/eyring21ipcc.bibtex +++ b/esmvaltool/references/eyring21ipcc.bibtex @@ -1,9 +1,11 @@ @inbook{eyring21ipcc, - author={Eyring, V. and N.P. Gillett and K.M. Achuta Rao and R. Barimalala and M. Barreiro Parrillo and N. Bellouin and C. Cassou and P.J. Durack and Y. Kosaka and S. McGregor and S. Min and O. Morgenstern and Y. Sun}, - editor={Masson-Delmotte, V. and P. Zhai and A. Pirani and S.L. Connors and C. Péan and S. Berger and N. Caud and Y. Chen and L. Goldfarb and M.I. Gomis and M. Huang and K. Leitzell and E. Lonnoy and J.B.R. Matthews and T.K. Maycock and T. Waterfield and O. Yelekçi and R. Yu and B. Zhou}, + author={V. Eyring and N.P. Gillett and K.M. Achuta Rao and R. Barimalala and M. Barreiro Parrillo and N. Bellouin and C. Cassou and P.J. Durack and Y. Kosaka and S. McGregor and S. Min and O. Morgenstern and Y. Sun}, + editor={V. Masson-Delmotte and P. Zhai and A. Pirani and S.L. Connors and C. Pean and S. Berger and N. Caud and Y. Chen and L. Goldfarb and M.I. Gomis and M. Huang and K. Leitzell and E. Lonnoy and J.B.R. Matthews and T.K. Maycock and T. Waterfield and O. Yelekci and R. Yu and B. Zhou}, title={Human Influence on the Climate System}, booktitle={Climate Change 2021: The Physical Science Basis. Contribution of Working Group I to the Sixth Assessment Report of the Intergovernmental Panel on Climate Change}, year={2021}, publisher={Cambridge University Press}, - address={Cambridge, UK} + address={Cambridge, UK and New York, NY, USA}, + pages = {423--552}, + doi={10.1017/9781009157896.005} } diff --git a/esmvaltool/references/iturbide20essd.bibtex b/esmvaltool/references/iturbide20essd.bibtex new file mode 100644 index 0000000000..afec4f7c90 --- /dev/null +++ b/esmvaltool/references/iturbide20essd.bibtex @@ -0,0 +1,12 @@ +@article{https://doi.org/10.5194/essd-12-2959-2020, +author = {Iturbide, M. and Guti\'errez, J. M. and Alves, L. M. and Bedia, J. and Cerezo-Mota, R. and Cimadevilla, E. and Cofi\~no, A. S. and Di Luca, A. and Faria, S. H. and Gorodetskaya, I. V. and Hauser, M. and Herrera, S. and Hennessy, K. and Hewitt, H. T. and Jones, R. G. and Krakovska, S. and Manzanas, R. and Mart\'{\i}nez-Castro, D. and Narisma, G. T. and Nurhati, I. S. and Pinto, I. and Seneviratne, S. I. and van den Hurk, B. and Vera, C. S.}, +title = {An update of IPCC climate reference regions for subcontinental analysis of +climate model data: definition and aggregated datasets}, +journal = {Earth System Science Data}, +volume = {12}, +year = {2020}, +number = {4}, +pages = {2959--2970}, +url = {https://essd.copernicus.org/articles/12/2959/2020/}, +doi = {10.5194/essd-12-2959-2020} +} diff --git a/esmvaltool/references/jra_25.bibtex b/esmvaltool/references/jra_25.bibtex new file mode 100644 index 0000000000..cb20aa2cb7 --- /dev/null +++ b/esmvaltool/references/jra_25.bibtex @@ -0,0 +1,10 @@ +@article{jra_25, + doi = {https://doi.org/10.2151/jmsj.85.369}, + title={The JRA-25 Reanalysis}, + author={Kazutoshi ONOGI and Junichi TSUTSUI and Hiroshi KOIDE and Masami SAKAMOTO and Shinya KOBAYASHI and Hiroaki HATSUSHIKA and Takanori MATSUMOTO and Nobuo YAMAZAKI and Hirotaka KAMAHORI and Kiyotoshi TAKAHASHI and Shinji KADOKURA and Koji WADA and Koji KATO and Ryo OYAMA and Tomoaki OSE and Nobutaka MANNOJI and Ryusuke TAIRA}, + journal={Journal of the Meteorological Society of Japan. Ser. II}, + volume={85}, + number={3}, + pages={369-432}, + year={2007} +} diff --git a/esmvaltool/references/landschuetzer2020.bibtex b/esmvaltool/references/landschuetzer2020.bibtex new file mode 100644 index 0000000000..8e01e1e7ab --- /dev/null +++ b/esmvaltool/references/landschuetzer2020.bibtex @@ -0,0 +1,11 @@ +@article{landschuetzer2020, + author = {Landschützer, P. and Laruelle, G. G. and Roobaert, A. and Regnier, P.}, + doi = {10.5194/essd-12-2537-2020}, + journal = {Earth System Science Data}, + number = {4}, + pages = {2537--2553}, + title = {A uniform pCO2 climatology combining open and coastal oceans}, + url = {https://essd.copernicus.org/articles/12/2537/2020/}, + volume = {12}, + year = {2020}, +} diff --git a/esmvaltool/references/lauer22jclim.bibtex b/esmvaltool/references/lauer22jclim.bibtex new file mode 100644 index 0000000000..df981c7488 --- /dev/null +++ b/esmvaltool/references/lauer22jclim.bibtex @@ -0,0 +1,13 @@ +@article{lauer23jclim, + doi = {10.1175/JCLI-D-22-0181.1}, + url = {https://journals.ametsoc.org/view/journals/clim/36/2/JCLI-D-22-0181.1.xml}, + year = 2023, + publisher = {American Meteorological Society}, + address = {Boston MA, USA}, + volume = {36}, + number = {2}, + pages = {281-311}, + author = {Axel Lauer and Lisa Bock and Birgit Hassler and Marc Schröder and Martin Stengel}, + title = {Cloud climatologies from global climate models - a comparison of CMIP5 and CMIP6 models with satellite data}, + journal = {Journal of Climate} +} diff --git a/esmvaltool/references/mobo_dic_mpim.bibtex b/esmvaltool/references/mobo_dic_mpim.bibtex new file mode 100644 index 0000000000..126fc14ab8 --- /dev/null +++ b/esmvaltool/references/mobo_dic_mpim.bibtex @@ -0,0 +1,13 @@ +@article{mobo_dic_mpim, + author = {Keppler, L. and Landschützer, P. and Gruber, N. and Lauvset, S. K. and Stemmler, I.}, + doi = {https://doi.org/10.1029/2020GB006571}, + eprint = {https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/2020GB006571}, + journal = {Global Biogeochemical Cycles}, + keywords = {DIC, seasonal variability, neural networks, SOM-FFN, monthly climatology, NCP}, + number = {12}, + pages = {e2020GB006571}, + title = {Seasonal Carbon Dynamics in the Near-Global Ocean}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2020GB006571}, + volume = {34}, + year = {2020}, +} diff --git a/esmvaltool/references/ncep-doe-r2.bibtex b/esmvaltool/references/ncep-doe-r2.bibtex new file mode 100644 index 0000000000..74d93b4569 --- /dev/null +++ b/esmvaltool/references/ncep-doe-r2.bibtex @@ -0,0 +1,8 @@ +@article{ncep-doe-r2, + doi = {10.1175/BAMS-83-11-1631}, + url = {https://doi.org/10.1175/BAMS-83-11-1631}, + publisher = {American Meteorological Society}, + author = {Kanamitsu, M., W. Ebisuzaki, J. Woollen, S.-K. Yang, J.J. Hnilo, M. Fiorino, and G.L. Potter}, + title = {NCEP–DOE AMIP-II Reanalysis (R-2)}, + journal = {Bulletin of the American Meteorological Society} +} diff --git a/esmvaltool/references/ncep-ncar-r1.bibtex b/esmvaltool/references/ncep-ncar-r1.bibtex new file mode 100644 index 0000000000..f0504e6a0b --- /dev/null +++ b/esmvaltool/references/ncep-ncar-r1.bibtex @@ -0,0 +1,13 @@ +@article{ncep-ncar-r1, + doi = {10.1175/1520-0477(1996)077<0437:TNYRP>2.0.CO;2}, + url = {https://doi.org/10.1175/1520-0477(1996)077<0437:TNYRP>2.0.CO;2}, + year = 1996, + month = {mar}, + publisher = {American Meteorological Society}, + volume = {77}, + number = {3}, + pages = {437--471}, + author = {Kalnay, E., M. Kanamitsu, R. Kistler, W. Collins, D. Deaven, L. Gandin, M. Iredell, S. Saha, G. White, J. Woollen, Y. Zhu, M. Chelliah, W. Ebisuzaki, W. Higgins, J. Janowiak, K.C. Mo, C. Ropelewski, J. Wang, A. Leetmaa, R. Reynolds, R. Jenne, and D. Joseph}, + title = {The NCEP/NCAR 40-Year Reanalysis Project}, + journal = {Bulletin of the American Meteorological Society} +} diff --git a/esmvaltool/references/noaa-cires-20cr.bibtex b/esmvaltool/references/noaa-cires-20cr.bibtex new file mode 100644 index 0000000000..54d67ea7f3 --- /dev/null +++ b/esmvaltool/references/noaa-cires-20cr.bibtex @@ -0,0 +1,9 @@ +@article{noaa-cire-20cr, + doi = {10.1002/qj.776}, + url = {https://doi.org/10.1002/qj.776}, + publisher = {Royal Meteorological Society}, + author = {Compo, G.P., Whitaker, J.S., Sardeshmukh, P.D., Matsui, N., Allan, R.J., Yin, X., Gleason, B.E., Vose, R.S., Rutledge, G., Bessemoulin, P., Brönnimann, S., Brunet, M., Crouthamel, R.I., Grant, A.N., Groisman, P.Y., Jones, P.D., Kruk, M.C., Kruger, A.C., Marshall, G.J., Maugeri, M., Mok, H.Y., Nordli, Ø., Ross, T.F., Trigo, R.M., Wang, X.L., Woodruff, S.D. and Worley, S.J.}, + title = {The Twentieth Century Reanalysis Project}, + year = {2011} + journal = {Quarterly J. Roy. Meteorol. Soc.} +} diff --git a/esmvaltool/references/oceansoda_ethz.bibtex b/esmvaltool/references/oceansoda_ethz.bibtex new file mode 100644 index 0000000000..754ecc5638 --- /dev/null +++ b/esmvaltool/references/oceansoda_ethz.bibtex @@ -0,0 +1,11 @@ +@article{oceansoda_ethz, + author = {Gregor, L. and Gruber, N.}, + doi = {10.5194/essd-13-777-2021}, + journal = {Earth System Science Data}, + number = {2}, + pages = {777--808}, + title = {OceanSODA-ETHZ: a global gridded data set of the surface ocean carbonate system for seasonal to decadal studies of ocean acidification}, + url = {https://essd.copernicus.org/articles/13/777/2021/}, + volume = {13}, + year = {2021}, +} diff --git a/esmvaltool/references/seneviratne12ipcc.bibtex b/esmvaltool/references/seneviratne12ipcc.bibtex new file mode 100644 index 0000000000..66be640fa5 --- /dev/null +++ b/esmvaltool/references/seneviratne12ipcc.bibtex @@ -0,0 +1,53 @@ +@incollection{ WOS:000519741300006, +Author = {Seneviratne, Sonia I. and Nicholls, Neville and Easterling, David and + Goodess, Clare M. and Kanae, Shinjiro and Kossin, James and Luo, Yali + and Marengo, Jose and McInnes, Kathleen and Rahimi, Mohammad and + Reichstein, Markus and Sorteberg, Asgeir and Vera, Carolina and Zhang, + Xuebin and Rusticucci, Matilde and Semenov, Vladimir and Alexander, Lisa + V. and Allen, Simon and Benito, Gerardo and Cavazos, Tereza and Clague, + John and Conway, Declan and Della-Marta, Paul M. and Gerber, Markus and + Gong, Sunling and Goswami, B. N. and Hemer, Mark and Huggel, Christian + and van den Hurk, Bart and Kharin, Viatcheslav V. and Kitoh, Akio and + Tank, Albert M. G. Klein and Li, Guilong and Mason, Simon and McGuire, + William and van Oldenborgh, Geert Jan and Orlowsky, Boris and Smith, + Sharon and Thiaw, Wassila and Velegrakis, Adonis and Yiou, Pascal and + Zhang, Tingjun and Zhou, Tianjun and Zwiers, Francis W.}, +Editor = {{Field, CB and Barros, V and Stocker, TF and Dahe, Q and Dokken, DJ and Ebi, KL and Mastrandrea, MD and Mach, KJ and Plattner, GK and Allen, SK and Tignor, M and Midgley, PM}}, +Book-Group-Author = {{Intergov Panel Clim Chg}}, +Title = {Changes in Climate Extremes and their Impacts on the Natural Physical + Environment}, +Booktitle = {MANAGING THE RISKS OF EXTREME EVENTS AND DISASTERS TO ADVANCE CLIMATE + CHANGE ADAPTATION}, +Year = {{2012}}, +Pages = {{109-230}}, +ISBN = {{978-1-107-02506-6; 978-1-107-60780-4}}, +ResearcherID-Numbers = {{Sorteberg, Asgeir/N-8576-2015 + McInnes, Kathleen L/A-7787-2012 + Cavazos, Tereza/AAF-2253-2020 + Alexander, Lisa V/A-8477-2011 + Zhang, Xuebin/ABD-7511-2021 + van den Hurk, Bart/ABI-1654-2020 + Kanae, Shinjiro/E-5606-2010 + ZHANG, TINGJUN/AAX-3662-2020 + Benito, Gerardo/E-5456-2013 + Rusticucci, Matilde/K-5249-2017 + Hemer, Mark/M-1905-2013 + Seneviratne, Sonia/G-8761-2011 + }}, +ORCID-Numbers = {{Sorteberg, Asgeir/0000-0001-6003-9618 + McInnes, Kathleen L/0000-0002-1810-7215 + Cavazos, Tereza/0000-0003-3097-9021 + Alexander, Lisa V/0000-0002-5635-2457 + van den Hurk, Bart/0000-0003-3726-7086 + Kanae, Shinjiro/0000-0002-3176-4957 + Benito, Gerardo/0000-0003-0724-1790 + Rusticucci, Matilde/0000-0003-2588-6234 + Hemer, Mark/0000-0002-7725-3474 + Vera, Carolina/0000-0003-4032-5232 + Nicholls, Neville/0000-0002-1298-4356 + Conway, Declan/0000-0002-4590-6733 + Allen, Simon/0000-0002-4809-649X + Seneviratne, Sonia/0000-0001-9528-2917 + Goodess, Clare/0000-0002-7462-4479}}, +Unique-ID = {{WOS:000519741300006}}, +} diff --git a/esmvaltool/references/sommer17joss.bibtex b/esmvaltool/references/sommer17joss.bibtex index b3ceb98cf4..1eb4574039 100644 --- a/esmvaltool/references/sommer17joss.bibtex +++ b/esmvaltool/references/sommer17joss.bibtex @@ -1,7 +1,7 @@ @article{sommer17joss, author = {Philipp S. Sommer}, doi = {10.21105/joss.00363}, - journal = {Journal of Open Source Software} + journal = {Journal of Open Source Software}, number = {16}, pages = {363}, publisher = {The Open Journal}, diff --git a/esmvaltool/references/tcom_ch4.bibtex b/esmvaltool/references/tcom_ch4.bibtex new file mode 100644 index 0000000000..a014685d73 --- /dev/null +++ b/esmvaltool/references/tcom_ch4.bibtex @@ -0,0 +1,10 @@ +@article{tcom_ch4, + author = {Dhomse Sandip S.}, + title = {{TCOM-CH4: TOMCAT CTM and Occultation Measurements based daily zonal stratospheric methane profile dataset [1991-2021] constructed using machine-learning}}, + month = nov, + year = 2022, + publisher = {Zenodo}, + version = {1.0}, + doi = {https://doi.org/10.5281/zenodo.7293740}, + url = {https://doi.org/10.5281/zenodo.7293740}, +} diff --git a/esmvaltool/references/tcom_n2o.bibtex b/esmvaltool/references/tcom_n2o.bibtex new file mode 100644 index 0000000000..6d0048dd6e --- /dev/null +++ b/esmvaltool/references/tcom_n2o.bibtex @@ -0,0 +1,10 @@ +@article{tcom_n2o, + author = {Dhomse, Sandip}, + title = {{TCOM-N2O: TOMCAT CTM and Occultation Measurements based daily zonal stratospheric nitrous oxide profile dataset [1991-2021] constructed using machine-learning}}, + month = dec, + year = 2022, + publisher = {Zenodo}, + version = {1.0}, + doi = {https://doi.org/10.5281/zenodo.7386001}, + url = {https://doi.org/10.5281/zenodo.7386001}, +} diff --git a/esmvaltool/utils/batch-jobs/generate.py b/esmvaltool/utils/batch-jobs/generate.py new file mode 100644 index 0000000000..1ed7ffa29a --- /dev/null +++ b/esmvaltool/utils/batch-jobs/generate.py @@ -0,0 +1,280 @@ +"""Generate SLURM run scripts to run every recipe. + +To use this script, follow these steps: +1) Edit the following parameters: +- env +- mail +- submit. Try the script with false before running the jobs. +- account +- conda_path +2) If needed, edit optional parameters: +- outputs +- config_file +3) SLURM settings +This script is configured to optimize the computing +footprint of the recipe testing. It is not necessary to edit +SLURM related parameters. +4) If new memory intensive recipes have been merged since +the last release (e.g. IPCC recipes), you may to add them +to `SPECIAL_RECIPES` and/or to `ONE_TASK_RECIPES` +5) Check the generation of the batch scripts with +`submit = False`. Once the batch scripts are correct, change +to `submit = True` and rerun the script to submit all jobs +to the SLURM scheduler. +""" +import os +import subprocess +from pathlib import Path + +import esmvaltool + +# Name of the conda environment in which esmvaltool is installed +env = 'coretool26rc4' +# Mail notifications when a submitted job fails or finishes +mail = False +# Name of the conda environment in which esmvaltool is installed +submit = False +# Name of the DKRZ account in which the job will be billed +account = '' # Select a compute project to be billed +# Name of the directory in which the job outputs files) are saved. +# The outputs will be saved in /home/user/ +outputs = 'output_rc4' +# Default Levante computing partition used +partition = 'interactive' +# Default amount of memory used +memory = '64G' +# Default walltime +time = '04:00:00' +# Full path to the mambaforge/etc/profile.d/conda.sh executable +# Set the path to conda +conda_path = 'PATH_TO/mambaforge/etc/profile.d/conda.sh' +# Full path to config_file +# If none, ~/.esmvaltool/config-user.yml is used +config_file = '' + +# List of recipes that require non-default SLURM options set above +SPECIAL_RECIPES = { + 'recipe_anav13jclim': { + 'partition': '#SBATCH --partition=compute \n', + 'time': '#SBATCH --time=08:00:00 \n', + }, + 'recipe_bock20jgr_fig_6-7': { + 'partition': '#SBATCH --partition=shared \n', + 'time': '#SBATCH --time=48:00:00 \n', + 'memory': '#SBATCH --mem=50G \n', + }, + 'recipe_bock20jgr_fig_8-10': { + 'partition': '#SBATCH --partition=shared \n', + 'time': '#SBATCH --time=48:00:00 \n', + 'memory': '#SBATCH --mem=50G \n', + }, + 'recipe_check_obs': { + 'partition': '#SBATCH --partition=compute \n', + 'memory': '#SBATCH --constraint=512G \n', + }, + 'recipe_climate_change_hotspot': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_collins13ipcc': { + 'partition': '#SBATCH --partition=compute \n', + 'time': '#SBATCH --time=08:00:00 \n', + 'memory': '#SBATCH --constraint=512G \n', + }, + 'recipe_eady_growth_rate': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_ecs': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_ecs_constraints': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_extreme_index': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_eyring06jgr': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_eyring13jgr_12': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_flato13ipcc_figures_938_941_cmip6': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_ipccwg1ar6ch3_atmosphere': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_ipccwg1ar6ch3_fig_3_9': { + 'partition': '#SBATCH --partition=shared \n', + 'time': '#SBATCH --time=15:00:00 \n', + 'memory': '#SBATCH --mem=150G \n', + }, + 'recipe_ipccwg1ar6ch3_fig_3_19': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_ipccwg1ar6ch3_fig_3_42_a': { + 'partition': '#SBATCH --partition=compute \n', + 'time': '#SBATCH --time=08:00:00 \n', + 'memory': '#SBATCH --constraint=512G \n', + }, + 'recipe_ipccwg1ar6ch3_fig_3_42_b': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_ipccwg1ar6ch3_fig_3_43': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_lauer22jclim_fig3-4_zonal': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_lauer22jclim_fig5_lifrac': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_meehl20sciadv': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_mpqb_xch4': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_perfmetrics_CMIP5': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_perfmetrics_CMIP5_4cds': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_perfmetrics_land_CMIP5': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_russell18jgr': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_schlund20esd': { + 'partition': '#SBATCH --partition=compute \n', + 'time': '#SBATCH --time=08:00:00 \n', + 'memory': '#SBATCH --constraint=512G \n', + }, + 'recipe_schlund20jgr_gpp_abs_rcp85': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_schlund20jgr_gpp_change_1pct': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_schlund20jgr_gpp_change_rcp85': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_smpi': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_smpi_4cds': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_tebaldi21esd': { + 'partition': '#SBATCH --partition=compute \n', + 'time': '#SBATCH --time=08:00:00 \n', + }, + 'recipe_wenzel16jclim': { + 'partition': '#SBATCH --partition=compute \n', + }, + 'recipe_wenzel16nat': { + 'partition': '#SBATCH --partition=compute \n', + }, +} + +# These recipes either use CMIP3 input data +# (see https://github.com/ESMValGroup/ESMValCore/issues/430) +# and recipes where tasks require the full compute node memory. +ONE_TASK_RECIPES = [ + 'recipe_bock20jgr_fig_1-4', + 'recipe_bock20jgr_fig_6-7', + 'recipe_bock20jgr_fig_8-10', + 'recipe_flato13ipcc_figure_96', + 'recipe_flato13ipcc_figures_938_941_cmip3', + 'recipe_ipccwg1ar6ch3_fig_3_9', + 'recipe_ipccwg1ar6ch3_fig_3_42_a', + 'recipe_ipccwg1ar6ch3_fig_3_43', + 'recipe_check_obs', + 'recipe_collins13ipcc', + 'recipe_lauer22jclim_fig3-4_zonal', + 'recipe_lauer22jclim_fig5_lifrac', + 'recipe_smpi', + 'recipe_smpi_4cds', + 'recipe_wenzel14jgr', + ] + + +def generate_submit(): + """Generate and submit scripts.""" + 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'] + dir_recipes = Path('/'.join((esmvaltool.__path__[0], 'recipes'))) + + for recipe in Path(dir_recipes).rglob('*.yml'): + filename = f'launch_{recipe.stem}.sh' + if recipe.stem in exclude: + continue + with open(f'{filename}', 'w', encoding='utf-8') as file: + file.write('#!/bin/bash -l \n') + 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' + ) + file.write( + 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 + file.write(f'#SBATCH --partition={partition}\n') + file.write(f'#SBATCH --time={time}\n') + file.write(f'#SBATCH --mem={memory}\n') + else: + file.write(SPECIAL_RECIPES[recipe.stem]['partition']) + # Time requirements + # Special time requirements + if 'time' in SPECIAL_RECIPES[recipe.stem]: + file.write(SPECIAL_RECIPES[recipe.stem]['time']) + # Default + else: + file.write(f'#SBATCH --time={time}\n') + # Memory requirements + # Full node memory (compute partition) + if 'compute' in SPECIAL_RECIPES[recipe.stem]['partition']: + mem_req_levante = '#SBATCH --mem=0\n' + file.write(mem_req_levante) + if 'memory' in SPECIAL_RECIPES[recipe.stem]: + file.write(SPECIAL_RECIPES[recipe.stem]['memory']) + # Shared nodes (other partitions) + else: + # Special memory requirements + if 'memory' in SPECIAL_RECIPES[recipe.stem]: + file.write(SPECIAL_RECIPES[recipe.stem]['memory']) + # Default + else: + file.write(f'#SBATCH --mem={memory}\n') + if mail: + file.write('#SBATCH --mail-type=FAIL,END \n') + file.write('\n') + file.write('set -eo pipefail \n') + file.write('unset PYTHONPATH \n') + file.write('\n') + file.write(f'. {conda_path}\n') + file.write(f'conda activate {env}\n') + file.write('\n') + if not config_file: + file.write(f'esmvaltool run {str(recipe)}') + else: + file.write(f'esmvaltool run --config_file ' + f'{str(config_file)} {str(recipe)}') + if recipe.stem in ONE_TASK_RECIPES: + file.write(' --max_parallel_tasks=1') + + if submit: + subprocess.check_call(['sbatch', filename]) + + +if __name__ == '__main__': + generate_submit() diff --git a/esmvaltool/utils/batch-jobs/job_DKRZ-MISTRAL.sh b/esmvaltool/utils/batch-jobs/job_DKRZ-MISTRAL.sh deleted file mode 100755 index 7efee2a977..0000000000 --- a/esmvaltool/utils/batch-jobs/job_DKRZ-MISTRAL.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -e -############################################################################### -### BATCH SCRIPT TO RUN THE ESMVALTOOL AT DKRZ MISTRAL -### Author: Mattia Righi (DLR) -############################################################################### -#SBATCH --partition=prepost -#SBATCH --exclusive -#SBATCH --nodes=1 -#SBATCH --mem=0 -#SBATCH --time=12:00:00 -#SBATCH --mail-type=FAIL,END -#SBATCH --account=XXXXXX -#SBATCH --output=job_%j.out.log -#SBATCH --error=job_%j.err.log -############################################################################### - -# Submit job with: sbatch job_DKRZ-MISTRAL.sh - -# Input arguments -RECIPE= # e.g. recipe_perfmetrics_CMIP5.yml -CONFIG= # e.g. config-user.yml - -# Set environment -CONDAPATH= # e.g. /home/soft/miniconda3/ - -# Changes below this line should not be required -source $CONDAPATH/etc/profile.d/conda.sh -conda activate esmvaltool -conda info --envs - -esmvaltool run --config-file $CONFIG $RECIPE diff --git a/esmvaltool/utils/batch-jobs/parse_recipes_output.py b/esmvaltool/utils/batch-jobs/parse_recipes_output.py new file mode 100644 index 0000000000..a8436d3c31 --- /dev/null +++ b/esmvaltool/utils/batch-jobs/parse_recipes_output.py @@ -0,0 +1,121 @@ +""" +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. +""" +import datetime +import os + +import glob + + +# 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*" + + +def parse_slurm_output(dirname, pattern): + """ + 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. + """ + pat = os.path.join(dirname, pattern) + files = glob.glob(pat) + + return files + + +def parse_output_file(): + """ + Parse .out files in a given dir. + + 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: + lines = outfile.readlines() + for line in lines: + if "Run was successful\n" in line: + success_rec.append(fil) + elif "esmvalcore._task.DiagnosticError" in line: + diag_fail_rec.append(fil) + 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.""" + todaynow = datetime.datetime.now() + print(f"## Recipe running session {todaynow}\n") + with open("all_recipes.txt", "r", encoding='utf-8') as allrecs: + all_recs = [rec.strip() for rec in allrecs.readlines()] + + # parse different types of recipe outcomes + recipe_list, failed, missing_dat = parse_output_file() + print("### Succesfully run 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) + + +if __name__ == '__main__': + display_in_md() diff --git a/esmvaltool/utils/draft_release_notes.py b/esmvaltool/utils/draft_release_notes.py index 1812f94fa8..d00e752455 100644 --- a/esmvaltool/utils/draft_release_notes.py +++ b/esmvaltool/utils/draft_release_notes.py @@ -41,8 +41,8 @@ } PREVIOUS_RELEASE = { - 'esmvalcore': datetime.datetime(2022, 7, 15, 18), - 'esmvaltool': datetime.datetime(2022, 7, 25, 18), + 'esmvalcore': datetime.datetime(2022, 10, 13, 18), + 'esmvaltool': datetime.datetime(2022, 10, 28, 18), } @@ -184,6 +184,7 @@ def _get_pull_requests(project): state='closed', sort='updated', direction='desc', + base='main', ) return pulls diff --git a/esmvaltool/utils/recipe_filler.py b/esmvaltool/utils/recipe_filler.py index 20cea6b327..26d4666656 100755 --- a/esmvaltool/utils/recipe_filler.py +++ b/esmvaltool/utils/recipe_filler.py @@ -47,15 +47,13 @@ import os import shutil import time -import warnings from glob import glob from pathlib import Path -import yaml -from ruamel.yaml import YAML - import esmvalcore +import yaml from esmvalcore.cmor.table import CMOR_TABLES, read_cmor_tables +from ruamel.yaml import YAML logger = logging.getLogger(__name__) @@ -202,32 +200,10 @@ def read_config_user_file(config_file, folder_name, options=None): with open(config_file, 'r') as file: cfg = yaml.safe_load(file) - # DEPRECATED: remove in v2.4 - for setting in ('write_plots', 'write_netcdf'): - if setting in cfg: - msg = ( - f"Using '{setting}' in {config_file} is deprecated and will " - "be removed in ESMValCore version 2.4. For diagnostics " - "that support this setting, it should be set in the " - "diagnostic script section of the recipe instead. " - f"Remove the setting from {config_file} to get rid of this " - "warning message.") - print(f"Warning: {msg}") - warnings.warn(DeprecationWarning(msg)) - if options is None: options = dict() for key, value in options.items(): cfg[key] = value - # DEPRECATED: remove in v2.4 - if key in ('write_plots', 'write_netcdf'): - msg = ( - f"Setting '{key}' from the command line is deprecated and " - "will be removed in ESMValCore version 2.4. For diagnostics " - "that support this setting, it should be set in the " - "diagnostic script section of the recipe instead.") - print(f"Warning: {msg}") - warnings.warn(DeprecationWarning(msg)) # set defaults defaults = { @@ -243,9 +219,6 @@ def read_config_user_file(config_file, folder_name, options=None): 'profile_diagnostic': False, 'config_developer_file': None, 'drs': {}, - # DEPRECATED: remove default settings below in v2.4 - 'write_plots': True, - 'write_netcdf': True, } for key in defaults: @@ -478,11 +451,14 @@ def filter_years(files, start_year, end_year, overlap=False): def _resolve_latestversion(dirname_template): """Resolve the 'latestversion' tag.""" - if '{latestversion}' not in dirname_template: + for version_separator in ['{latestversion}', '{version}']: + if version_separator in dirname_template: + break + else: return dirname_template # Find latest version - part1, part2 = dirname_template.split('{latestversion}') + part1, part2 = dirname_template.split(version_separator) part2 = part2.lstrip(os.sep) part1_contents = glob(part1) if part1_contents: @@ -500,7 +476,7 @@ def list_all_files(file_dict, cmip_era): """ List all files that match the dataset dictionary. - Function that returnes all files that are determined by a + Function that returns all files that are determined by a file_dict dictionary; file_dict is keyed on usual parameters like `dataset`, `project`, `mip` etc; glob.glob is used to find files; speedup is achieved by replacing wildcards diff --git a/pyproject.toml b/pyproject.toml index 8b33e256d1..7b4aa557f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,3 +3,4 @@ requires = ["setuptools >= 40.6.0", "wheel", "setuptools_scm>=6.2"] build-backend = "setuptools.build_meta" [tool.setuptools_scm] +version_scheme = "release-branch-semver" diff --git a/setup.cfg b/setup.cfg index 68a885f79a..c738c5d716 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,5 @@ [tool:pytest] addopts = - --flake8 --doctest-modules --ignore=doc/sphinx/source/conf.py --cov=esmvaltool @@ -10,9 +9,6 @@ addopts = --numprocesses auto env = MPLBACKEND = Agg -flake8-ignore = - doc/sphinx/source/conf.py ALL - setup.py ALL log_level = WARNING markers = installation: test requires installation of dependencies @@ -20,6 +16,11 @@ markers = [coverage:run] parallel = true +[flake8] +exclude = + doc/sphinx/source/conf.py ALL + setup.py ALL + [pydocstyle] convention = numpy diff --git a/setup.py b/setup.py index c2b9f7daf4..3d07e755f3 100755 --- a/setup.py +++ b/setup.py @@ -20,12 +20,11 @@ # Installation dependencies # Use with pip install . to install from source 'install': [ + 'aiohttp', 'cartopy', 'cdo', 'cdsapi', - # see https://github.com/SciTools/cf-units/issues/218 - # see https://github.com/ESMValGroup/ESMValCore/issues/1655 - 'cf-units>=3.0.0,<3.1.0,!=3.0.1.post0', + 'cf-units', 'cftime', 'cmocean', 'dask', @@ -33,6 +32,7 @@ 'eofs', 'ESMPy', 'esmvalcore', + 'esmf-regrid', 'fiona', 'GDAL', 'jinja2', @@ -42,8 +42,9 @@ 'matplotlib', 'natsort', 'nc-time-axis', - 'netCDF4!=1.6.1', # github.com/ESMValGroup/ESMValCore/pull/1724 + 'netCDF4', 'numpy', + 'packaging', 'openpyxl', 'pandas', 'pyproj', @@ -61,28 +62,30 @@ 'scitools-iris', 'seaborn', 'seawater', - 'shapely', + 'shapely<2.0.0', # github.com/ESMValGroup/ESMValTool/issues/2965 'xarray', 'xesmf==0.3.0', 'xgboost>1.6.1', # github.com/ESMValGroup/ESMValTool/issues/2779 'xlsxwriter', + 'zarr', ], # Test dependencies # Execute `pip install .[test]` once and the use `pytest` to run tests 'test': [ - 'flake8<4', + 'flake8', 'pytest>=3.9,!=6.0.0rc1,!=6.0.0', 'pytest-cov>=2.10.1', 'pytest-env', - 'pytest-flake8>=1.0.6', 'pytest-html!=2.1.0', 'pytest-metadata>=1.5.1', + 'pytest-mock', 'pytest-xdist', ], # Documentation dependencies 'doc': [ 'autodocsumm>=0.2.2', - 'sphinx>=5', + 'nbsphinx', + 'sphinx>=6.1.3', 'sphinx_rtd_theme', ], # Development dependencies diff --git a/tests/integration/diag_scripts/mlr/test_custom_sklearn_functions.py b/tests/integration/diag_scripts/mlr/test_custom_sklearn_functions.py index d05966d806..f14ccb3e2e 100644 --- a/tests/integration/diag_scripts/mlr/test_custom_sklearn_functions.py +++ b/tests/integration/diag_scripts/mlr/test_custom_sklearn_functions.py @@ -640,7 +640,7 @@ def test_fit_and_score_weighted_no_weights(scorer, output): clf = LinearRegression() fit_and_score_weighted_args = [clf, X_DATA, Y_DATA, scorer, TRAIN, TEST] fit_and_score_weighted_kwargs = { - 'parameters': {'normalize': False}, + 'parameters': {'copy_X': True}, 'fit_params': None, } @@ -666,7 +666,7 @@ def test_fit_and_score_weighted_weights(scorer, output): clf = LinearRegression() fit_and_score_weighted_args = [clf, X_DATA, Y_DATA, scorer, TRAIN, TEST] fit_and_score_weighted_kwargs = { - 'parameters': {'normalize': False}, + 'parameters': {'copy_X': True}, 'fit_params': {'sample_weight': SAMPLE_WEIGHTS}, 'sample_weights': SAMPLE_WEIGHTS, } diff --git a/tests/integration/test_recipes_loading.py b/tests/integration/test_recipes_loading.py index d88d541bd1..7681fbeaf5 100644 --- a/tests/integration/test_recipes_loading.py +++ b/tests/integration/test_recipes_loading.py @@ -1,32 +1,50 @@ """Test recipes are well formed.""" from pathlib import Path -from unittest.mock import create_autospec - -import pytest -import yaml import esmvalcore import esmvalcore._config -import esmvalcore._data_finder -import esmvalcore._recipe import esmvalcore.cmor.check +import pytest +import yaml +from esmvalcore import __version__ as core_ver +from packaging import version + import esmvaltool -from .test_diagnostic_run import write_config_user_file +try: + # Since ESValCore v2.8.0 + from esmvalcore.config import CFG, _config +except ImportError: + # Prior to ESMValCore v2.8.0 + from esmvalcore._config import _config + from esmvalcore.experimental.config import CFG + + # Work around + # https://github.com/ESMValGroup/ESMValCore/issues/1579 + def clear(self): + self._mapping.clear() + + esmvalcore.experimental.config.Config.clear = clear + + +@pytest.fixture +def session(mocker, tmp_path): + mocker.patch.dict( + CFG, + auxiliary_data_dir=str(tmp_path / 'auxiliary_data_dir'), + check_level=esmvalcore.cmor.check.CheckLevels['DEFAULT'], + drs={}, + search_esgf='never', + rootpath={'default': str(tmp_path)}, + ) + session = CFG.start_session('test') + # The patched_datafinder fixture does not return the correct input + # directory structure, so make sure it is set to flat for every project + for project in _config.CFG: + mocker.patch.dict(_config.CFG[project]['input_dir'], default='/') -@pytest.fixture(scope='module') -def config_user(tmp_path_factory): - """Generate dummy config-user dict for testing purposes.""" - path = tmp_path_factory.mktemp('recipe-test') - filename = write_config_user_file(path) - # The fixture scope is set to module to avoid very slow - # test runs, as the following line also reads the CMOR tables - cfg = esmvalcore._config.read_config_user_file(filename, 'recipe_test', {}) - cfg['offline'] = True - cfg['auxiliary_data_dir'] = str(path / 'auxiliary_data_dir') - cfg['check_level'] = esmvalcore.cmor.check.CheckLevels['DEFAULT'] - return cfg + return session def _get_recipes(): @@ -40,27 +58,83 @@ def _get_recipes(): @pytest.mark.parametrize('recipe_file', RECIPES, ids=IDS) -def test_recipe_valid(recipe_file, config_user, monkeypatch): +def test_recipe_valid(recipe_file, session, mocker): """Check that recipe files are valid ESMValTool recipes.""" # Mock input files - find_files = create_autospec(esmvalcore._data_finder.find_files, - spec_set=True) - find_files.side_effect = lambda *_, **__: [ - 'test_0001-1849.nc', - 'test_1850-9999.nc', - ] - monkeypatch.setattr(esmvalcore._data_finder, 'find_files', find_files) + try: + # Since ESValCore v2.8.0 + import esmvalcore.local + module = esmvalcore.local + method = 'glob' + except ImportError: + # Prior to ESMValCore v2.8.0 + import esmvalcore._data_finder + module = esmvalcore._data_finder + method = 'find_files' + + mocker.patch.object( + module, + method, + autospec=True, + side_effect=lambda *_, **__: [ + 'test_0001-1849.nc', + 'test_1850-9999.nc', + ], + ) + + # Do not remove unexpanded supplementaries. These cannot be expanded + # because the mocked file finding above does not produce facets. + try: + import esmvalcore.dataset + except ImportError: + pass + else: + mocker.patch.object( + esmvalcore.dataset.Dataset, + '_remove_unexpanded_supplementaries', + autospec=True, + spec_set=True, + ) # Mock vertical levels - levels = create_autospec(esmvalcore._recipe.get_reference_levels, - spec_set=True) - levels.side_effect = lambda *_, **__: [1, 2] - monkeypatch.setattr(esmvalcore._recipe, 'get_reference_levels', levels) + # Account for module change after esmvalcore=2.7 + if version.parse(core_ver) <= version.parse('2.7.1'): + import esmvalcore._recipe + mocker.patch.object( + esmvalcore._recipe, + 'get_reference_levels', + autospec=True, + spec_set=True, + side_effect=lambda *_, **__: [1, 2], + ) + else: + import esmvalcore._recipe.recipe + mocker.patch.object( + esmvalcore._recipe.recipe, + 'get_reference_levels', + autospec=True, + spec_set=True, + side_effect=lambda *_, **__: [1, 2], + ) # Mock valid NCL version - ncl_version = create_autospec(esmvalcore._recipe_checks.ncl_version, - spec_set=True) - monkeypatch.setattr(esmvalcore._recipe_checks, 'ncl_version', ncl_version) + # Account for module change after esmvalcore=2.7 + if version.parse(core_ver) <= version.parse('2.7.1'): + import esmvalcore._recipe_checks + mocker.patch.object( + esmvalcore._recipe_checks, + 'ncl_version', + autospec=True, + spec_set=True, + ) + else: + import esmvalcore._recipe.check + mocker.patch.object( + esmvalcore._recipe.check, + 'ncl_version', + autospec=True, + spec_set=True, + ) # Mock interpreters installed def which(executable): @@ -70,7 +144,12 @@ def which(executable): path = None return path - monkeypatch.setattr(esmvalcore._task, 'which', which) + mocker.patch.object( + esmvalcore._task, + 'which', + autospec=True, + side_effect=which, + ) # Create a shapefile for extract_shape preprocessor if needed recipe = yaml.safe_load(recipe_file.read_text()) @@ -78,8 +157,13 @@ def which(executable): extract_shape = preproc.get('extract_shape') if extract_shape and 'shapefile' in extract_shape: filename = Path( - config_user['auxiliary_data_dir']) / extract_shape['shapefile'] + session['auxiliary_data_dir']) / extract_shape['shapefile'] filename.parent.mkdir(parents=True, exist_ok=True) filename.touch() - esmvalcore._recipe.read_recipe_file(recipe_file, config_user) + # Account for module change after esmvalcore=2.7 + if version.parse(core_ver) <= version.parse('2.7.1'): + config_user = session.to_config_user() + esmvalcore._recipe.read_recipe_file(recipe_file, config_user) + else: + esmvalcore._recipe.recipe.read_recipe_file(recipe_file, session) diff --git a/tests/system/data_simulator.py b/tests/system/data_simulator.py index 07cd395cd5..080a3871f8 100644 --- a/tests/system/data_simulator.py +++ b/tests/system/data_simulator.py @@ -6,8 +6,13 @@ import numpy as np +from esmvalcore import __version__ as core_ver from esmvalcore._config import read_config_user_file -from esmvalcore._recipe import read_recipe_file +from packaging import version +if version.parse(core_ver) <= version.parse('2.7.1'): + from esmvalcore._recipe import read_recipe_file +else: + from esmvalcore._recipe.recipe import read_recipe_file def get_input_filename(variable, rootpath, drs): diff --git a/tests/unit/cmorizers/obs/test_merra2.py b/tests/unit/cmorizers/obs/test_merra2.py new file mode 100644 index 0000000000..1502ac91e9 --- /dev/null +++ b/tests/unit/cmorizers/obs/test_merra2.py @@ -0,0 +1,338 @@ +import iris +import iris.coord_systems +import iris.fileformats +import netCDF4 +import numpy as np +import pytest +from cf_units import Unit + +from esmvaltool.cmorizers.data.formatters.datasets.merra2 import ( + _load_cube, + _extract_variable +) +from esmvaltool.cmorizers.data.utilities import read_cmor_config + + +def _create_sample_cube(): + """Create a quick CMOR-compliant sample cube.""" + coord_sys = iris.coord_systems.GeogCS(iris.fileformats.pp.EARTH_RADIUS) + cube_data = np.ones((1, 3, 2, 2)) + cube_data[0, 1, 1, 1] = 22. + time = iris.coords.DimCoord([ + 100, + ], + standard_name='time', + units=Unit('minutes since 1982-01-01 00:30:00', + calendar='gregorian')) + zcoord = iris.coords.DimCoord([0.5, 5., 50.], + long_name='vertical level', + var_name='lev', + units='hPa', + attributes={'positive': 'down'}) + lons = iris.coords.DimCoord([1.5, 2.5], + standard_name='longitude', + units='K', + coord_system=coord_sys) + lats = iris.coords.DimCoord([1.5, 2.5], + standard_name='latitude', + units='K', + coord_system=coord_sys) + coords_spec = [(time, 0), (zcoord, 1), (lats, 2), (lons, 3)] + cube = iris.cube.Cube(cube_data, dim_coords_and_dims=coords_spec) + drop_attrs = [ + 'History', 'Filename', 'Comment', 'RangeBeginningDate', + 'RangeEndingDate', 'GranuleID', 'ProductionDateTime', 'Source' + ] + for attr in drop_attrs: + cube.attributes[attr] = "cow" + drop_time_attrs = [ + 'begin_date', 'begin_time', 'time_increment', 'valid_range', 'vmax', + 'vmin' + ] + for attr in drop_time_attrs: + cube.coord('time').attributes[attr] = "1982" + cube.coord('time').attributes["valid_range"] = [50, 150] + + extra_special_attrs = [ + "Institution", + "VersionID", + "experiment_id", + "Source", + "ModelID", + "Contact", + ] + for attr in extra_special_attrs: + cube.attributes[attr] = "moose" + + return cube + + +def test_load_cube_single_var(tmp_path): + """Test loading MERRA2 cubes.""" + path_cubes = tmp_path / "cubes.nc" + cube_1 = _create_sample_cube() + cube_1.var_name = "SWTDN" + cubes = iris.cube.CubeList([cube_1]) + iris.save(cubes, str(path_cubes)) + var = { + 'short_name': 'rsut', + 'mip': 'Amon', 'raw': 'SWTDN', + 'file': 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + } + in_files = str(tmp_path / "cubes.nc") + selection = _load_cube(in_files, var) + assert np.mean(selection.data) == 2.75 + + +def test_load_cube_pairwise_vars(tmp_path): + """Test loading MERRA2 cubes.""" + path_cubes = tmp_path / "cubes.nc" + cube_1 = _create_sample_cube() + cube_1.var_name = "SWTDN" + cube_2 = _create_sample_cube() + cube_2.var_name = "SWTNT" + cubes = iris.cube.CubeList([cube_1, cube_2]) + iris.save(cubes, str(path_cubes)) + var = { + 'short_name': 'rsut', + 'mip': 'Amon', 'raw': 'SWTDN-SWTNT', + 'file': 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + } + in_files = str(tmp_path / "cubes.nc") + selection = _load_cube(in_files, var) + assert np.mean(selection.data) == 0. + + +def test_load_cube_threewise_vars(tmp_path): + """Test loading MERRA2 cubes.""" + path_cubes = tmp_path / "cubes.nc" + cube_1 = _create_sample_cube() + cube_1.var_name = "SWTDN" + cube_2 = _create_sample_cube() + cube_2.var_name = "SWTNT" + cube_3 = _create_sample_cube() + cube_3.var_name = "COW" + cubes = iris.cube.CubeList([cube_1, cube_2, cube_3]) + iris.save(cubes, str(path_cubes)) + var = { + 'short_name': 'rsut', + 'mip': 'Amon', 'raw': 'SWTDN-SWTNT-COW', + 'file': 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + } + in_files = str(tmp_path / "cubes.nc") + with pytest.raises(NotImplementedError) as exc: + _load_cube(in_files, var) + print(exc) + + +def test_load_cube_pairwise_vars_var_not_found(tmp_path): + """Test loading MERRA2 cubes.""" + path_cubes = tmp_path / "cubes.nc" + cube_1 = _create_sample_cube() + cube_1.var_name = "SWTDN" + cube_2 = _create_sample_cube() + cube_2.var_name = "SWTNT" + cubes = iris.cube.CubeList([cube_1, cube_2]) + iris.save(cubes, str(path_cubes)) + var = { + 'short_name': 'rsut', + 'mip': 'Amon', 'raw': 'COWABUNGA-CORVETTE', + 'file': 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + } + in_files = str(tmp_path / "cubes.nc") + with pytest.raises(ValueError) as exc: + _load_cube(in_files, var) + print(exc) + + +def test_load_cube_pairwise_vars_var_not_found_2(tmp_path): + """Test loading MERRA2 cubes.""" + path_cubes = tmp_path / "cubes.nc" + cube_1 = _create_sample_cube() + cube_1.var_name = "SWTDN" + cube_2 = _create_sample_cube() + cube_2.var_name = "SWTNT" + cubes = iris.cube.CubeList([cube_1, cube_2]) + iris.save(cubes, str(path_cubes)) + var = { + 'short_name': 'rsut', + 'mip': 'Amon', 'raw': 'SWTDN-CORVETTE', + 'file': 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + } + in_files = str(tmp_path / "cubes.nc") + with pytest.raises(ValueError) as exc: + _load_cube(in_files, var) + print(exc) + + +def test_load_cube_pairwise_vars_wrong_oper(tmp_path): + """Test loading MERRA2 cubes.""" + path_cubes = tmp_path / "cubes.nc" + cube_1 = _create_sample_cube() + cube_1.var_name = "SWTDN" + cube_2 = _create_sample_cube() + cube_2.var_name = "SWTNT" + cubes = iris.cube.CubeList([cube_1, cube_2]) + iris.save(cubes, str(path_cubes)) + var = { + 'short_name': 'rsut', + 'mip': 'Amon', 'raw': 'SWTDN+SWTNT', + 'file': 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + } + in_files = str(tmp_path / "cubes.nc") + with pytest.raises(NotImplementedError) as exc: + _load_cube(in_files, var) + print(exc) + + +def test_extract_variable(tmp_path): + """Test variable extraction.""" + # call is _extract_variable(in_files, var, cfg, out_dir) + path_cubes = tmp_path / "cubes.nc" + cube_1 = _create_sample_cube() + cube_1.var_name = "SWTDN" + cube_1.units = Unit('W m-2') + cubes = iris.cube.CubeList([cube_1]) + iris.save(cubes, str(path_cubes)) + var = { + 'short_name': 'rsut', + 'mip': 'Amon', 'raw': 'SWTDN', + 'file': 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + } + in_files = str(tmp_path / "cubes.nc") + cfg = read_cmor_config("MERRA2") + _extract_variable(in_files, var, cfg, tmp_path) + cmorized_data = \ + tmp_path / "OBS6_MERRA2_reanaly_5.12.4_Amon_rsut_198201-198201.nc" + cmorized_cube = iris.load_cube(str(cmorized_data)) + print(cmorized_cube, + cmorized_cube.coord("time"), + cmorized_cube.coord("latitude")) + assert cmorized_cube.coord('time').core_points()[0] == 48226. + assert cmorized_cube.attributes["raw"] == 'SWTDN' + + +def test_extract_variable_pairs(tmp_path): + """Test variable extraction.""" + path_cubes = tmp_path / "cubes.nc" + cube_1 = _create_sample_cube() + cube_1.var_name = "SWTDN" + cube_1.units = Unit('W m-2') + cube_2 = _create_sample_cube() + cube_2.var_name = "SWTNT" + cube_2.units = Unit('W m-2') + cubes = iris.cube.CubeList([cube_1, cube_2]) + iris.save(cubes, str(path_cubes)) + var = { + 'short_name': 'rsut', + 'mip': 'Amon', 'raw': 'SWTDN-SWTNT', + 'file': 'MERRA2_???.tavgM_2d_rad_Nx.{year}??.nc4' + } + in_files = str(tmp_path / "cubes.nc") + cfg = read_cmor_config("MERRA2") + _extract_variable(in_files, var, cfg, tmp_path) + cmorized_data = \ + tmp_path / "OBS6_MERRA2_reanaly_5.12.4_Amon_rsut_198201-198201.nc" + cmorized_cube = iris.load_cube(str(cmorized_data)) + print(cmorized_cube, + cmorized_cube.coord("time"), + cmorized_cube.coord("latitude")) + assert cmorized_cube.coord('time').core_points()[0] == 48226. + assert cmorized_cube.attributes["raw"] == 'SWTDN-SWTNT' + assert cmorized_cube.attributes["component_raw_1"] == "SWTDN" + assert cmorized_cube.attributes["component_raw_2"] == "SWTNT" + + # Test the existence of extra attributes + extra_special_attrs = [ + "Institution", + "VersionID", + "experiment_id", + "ModelID", + "Contact", + ] + for attr in extra_special_attrs: + assert attr in cmorized_cube.attributes + + +def test_vertical_levels(tmp_path): + """Test cases for cmorization with vertical levels.""" + path_cubes = tmp_path / "cubes.nc" + cube_1 = _create_sample_cube() + cube_1.var_name = "V" + cube_1.units = Unit('m s-1') + cube_2 = _create_sample_cube() + cube_2.var_name = "U10M" + cube_2.units = Unit('m s-1') + cube_3 = _create_sample_cube() + cube_3.var_name = "T2M" + cube_3.units = Unit('K') + cube_4 = _create_sample_cube() + cube_4.var_name = "H" + cube_4.units = Unit('m') + cube_4.coord("vertical level").units = "m" + cubes = iris.cube.CubeList([cube_1, cube_2, cube_3, cube_4]) + iris.save(cubes, str(path_cubes)) + var_1 = { + 'short_name': 'va', + 'mip': 'Amon', 'raw': 'V', + 'file': 'MERRA2_???.instM_3d_ana_Np.{year}??.nc4' + } + var_2 = { + 'short_name': 'uas', + 'mip': 'Amon', 'raw': 'U10M', + 'file': 'MERRA2_???.tavgM_2d_slv_Nx.{year}??.nc4' + } + var_3 = { + 'short_name': 'tas', + 'mip': 'Amon', 'raw': 'T2M', + 'file': 'MERRA2_???.tavgM_2d_slv_Nx.{year}??.nc4' + } + var_4 = { + 'short_name': 'zg', + 'mip': 'Amon', 'raw': 'H', + 'file': 'MERRA2_???.instM_3d_ana_Np.{year}??.nc4' + } + in_files = str(tmp_path / "cubes.nc") + cfg = read_cmor_config("MERRA2") + + # extract va + _extract_variable(in_files, var_1, cfg, tmp_path) + cmorized_data = \ + tmp_path / "OBS6_MERRA2_reanaly_5.12.4_Amon_va_198201-198201.nc" + cmorized_cube = iris.load_cube(str(cmorized_data)) + print(cmorized_cube, + cmorized_cube.coord("air_pressure")) + assert cmorized_cube.coord("air_pressure").has_bounds() + assert cmorized_cube.coord("air_pressure").units == "Pa" + np.testing.assert_array_equal(cmorized_cube.coord("air_pressure").points, + [50., 500., 5000.]) + # test unlimited time dim + with netCDF4.Dataset(str(cmorized_data), 'r') as handler: + assert handler["va"].get_dims()[0].isunlimited() + + # extract uas + _extract_variable(in_files, var_2, cfg, tmp_path) + cmorized_data = \ + tmp_path / "OBS6_MERRA2_reanaly_5.12.4_Amon_uas_198201-198201.nc" + cmorized_cube = iris.load_cube(str(cmorized_data)) + print(cmorized_cube) + np.testing.assert_array_equal(cmorized_cube.coord("height").points, + [10.]) + # test unlimited time dim + with netCDF4.Dataset(str(cmorized_data), 'r') as handler: + assert handler["uas"].get_dims()[0].isunlimited() + + # extract tas + _extract_variable(in_files, var_3, cfg, tmp_path) + cmorized_data = \ + tmp_path / "OBS6_MERRA2_reanaly_5.12.4_Amon_tas_198201-198201.nc" + cmorized_cube = iris.load_cube(str(cmorized_data)) + print(cmorized_cube) + np.testing.assert_array_equal(cmorized_cube.coord("height").points, + [2.]) + + # extract zg failed + with pytest.raises(ValueError) as exc: + _extract_variable(in_files, var_4, cfg, tmp_path) + expected_exc = "Unable to convert from 'Unit('m')' to 'Unit('Pa')'" + assert expected_exc in str(exc) diff --git a/tests/unit/diag_scripts/shared/test_iris_helpers.py b/tests/unit/diag_scripts/shared/test_iris_helpers.py index 124d2cb4fb..6663a06e81 100644 --- a/tests/unit/diag_scripts/shared/test_iris_helpers.py +++ b/tests/unit/diag_scripts/shared/test_iris_helpers.py @@ -9,7 +9,6 @@ import pytest from cf_units import Unit -from esmvaltool import ESMValToolDeprecationWarning from esmvaltool.diag_scripts.shared import iris_helpers as ih LONG_NAME = 'x' @@ -501,20 +500,3 @@ def test_unify_time_coord_no_time(cube_with_time): cube_with_time.remove_coord('time') with pytest.raises(iris.exceptions.CoordinateNotFoundError): ih.unify_time_coord(cube_with_time) - - -def test_var_name_constraint(): - """Test var_name constraint.""" - cubes_in = iris.cube.CubeList([ - iris.cube.Cube(0, var_name='a', long_name='aaa'), - iris.cube.Cube(1, var_name='a', long_name='bbb'), - iris.cube.Cube(2, var_name='b', long_name='a'), - iris.cube.Cube(3, var_name='c', long_name='aaa'), - ]) - cubes_out = cubes_in[:2].copy() - with pytest.warns(ESMValToolDeprecationWarning): - constraint = ih.var_name_constraint('a') - assert cubes_in is not cubes_out - result = cubes_in.extract(constraint) - assert cubes_in is not result - assert result == cubes_out diff --git a/tests/unit/test_naming.py b/tests/unit/test_naming.py index cd0f0dab27..eb1255a9cc 100644 --- a/tests/unit/test_naming.py +++ b/tests/unit/test_naming.py @@ -7,6 +7,7 @@ '.git', '.github', '.eggs', + 'ESMValTool.egg-info', '__pycache__', 'test-reports', } @@ -32,9 +33,10 @@ def test_windows_reserved_names(self): } for dirpath, dirnames, filenames in os.walk(self.esmvaltool_folder): - for dirname in dirnames: - if dirname in IGNORE: - dirnames.remove(dirname) + # we need to modify in-place dirnames so that we don't walk + # over the contents of the dirs that need be ignored + dirnames[:] = [dirn for dirn in dirnames if dirn not in IGNORE] + print(dirnames) error_msg = 'Reserved windows name found at {}.' \ ' Please rename it ' \ '(Windows reserved names are: {})' \ @@ -53,9 +55,10 @@ def test_avoid_casing_collisions(self): This includes folders differing from files """ for dirpath, dirnames, filenames in os.walk(self.esmvaltool_folder): - for dirname in dirnames: - if dirname in IGNORE: - dirnames.remove(dirname) + # we need to modify in-place dirnames so that we don't walk + # over the contents of the dirs that need be ignored + dirnames[:] = [dirn for dirn in dirnames if dirn not in IGNORE] + print(dirnames) self.assertEqual( len(filenames) + len(dirnames), len({name.lower() @@ -73,9 +76,10 @@ def test_no_namelist(self): exclude_paths = ['esmvaltool/diag_scripts/cvdp/cvdp'] for dirpath, dirnames, filenames in os.walk(self.esmvaltool_folder): - for dirname in dirnames: - if dirname in IGNORE: - dirnames.remove(dirname) + # we need to modify in-place dirnames so that we don't walk + # over the contents of the dirs that need be ignored + dirnames[:] = [dirn for dirn in dirnames if dirn not in IGNORE] + print(dirnames) if any([item in dirpath for item in exclude_paths]): continue self.assertFalse(