├── .gitignore ├── LICENSE ├── README.md ├── data ├── ar6 │ ├── solar_erf.csv │ ├── table_mean_thornhill_collins_orignames.csv │ └── table_std_thornhill_collins_orignames.csv ├── contrails │ ├── contrails.csv │ ├── lee2020_clean_data.csv │ └── sausen_schumann_co2.csv ├── fair-calibrate-1.4.1 │ └── aerosol_cloud.csv ├── gcp_emissions │ └── gcp_2024.csv ├── ghg_concentrations │ ├── agage │ │ ├── agage_2019-2024.csv │ │ ├── global_mean_md.txt │ │ └── global_mean_ms.txt │ ├── ar6_updated │ │ ├── ipcc_ar6_wg1.csv │ │ └── update_2019-2023.csv │ └── noaa_gml │ │ ├── NOAA_Annual_Mean_MoleFractions_with2024.xlsx │ │ ├── OCS__GCMS_flask.txt │ │ ├── ch2cl2_GCMS_flask.txt │ │ ├── ch4_annmean_gl.txt │ │ ├── co2_annmean_gl.txt │ │ ├── n2o_annmean_gl.txt │ │ ├── noaa_2024_global_mean_mixing_ratios.csv │ │ ├── pce_GCMS_flask.txt │ │ └── sf6_annmean_gl.txt ├── gmst │ ├── IGCC_GMST_1850-2024.csv │ └── Walsh_GMST_timeseries.csv ├── land_use │ ├── Irrigation_ERF_Wells_FAO.csv │ └── SARF_LCC_Ghimire2014+Ouyang2022+GCB2024.csv ├── ozone │ ├── skeie_ozone_strat.csv │ └── skeie_ozone_trop.csv ├── random_seeds.json ├── slcf_emissions │ ├── cams │ │ └── cams_world_0010.csv │ ├── ceds │ │ ├── v20210421 │ │ │ ├── BC_global_CEDS_emissions_by_sector_2021_04_21.csv │ │ │ ├── CO_global_CEDS_emissions_by_sector_2021_04_21.csv │ │ │ ├── NH3_global_CEDS_emissions_by_sector_2021_04_21.csv │ │ │ ├── NMVOC_global_CEDS_emissions_by_sector_2021_04_21.csv │ │ │ ├── NOx_global_CEDS_emissions_by_sector_2021_04_21.csv │ │ │ ├── OC_global_CEDS_emissions_by_sector_2021_04_21.csv │ │ │ └── SO2_global_CEDS_emissions_by_sector_2021_04_21.csv │ │ ├── v20240401 │ │ │ ├── BC_CEDS_global_emissions_by_sector_v2024_04_01.csv │ │ │ ├── CO_CEDS_global_emissions_by_sector_v2024_04_01.csv │ │ │ ├── NH3_CEDS_global_emissions_by_sector_v2024_04_01.csv │ │ │ ├── NMVOC_CEDS_global_emissions_by_sector_v2024_04_01.csv │ │ │ ├── NOx_CEDS_global_emissions_by_sector_v2024_04_01.csv │ │ │ ├── OC_CEDS_global_emissions_by_sector_v2024_04_01.csv │ │ │ └── SO2_CEDS_global_emissions_by_sector_v2024_04_01.csv │ │ ├── v20240708 │ │ │ ├── BC_CEDS_global_emissions_by_sector_v2024_07_08.csv │ │ │ ├── CO_CEDS_global_emissions_by_sector_v2024_07_08.csv │ │ │ ├── NH3_CEDS_global_emissions_by_sector_v2024_07_08.csv │ │ │ ├── NMVOC_CEDS_global_emissions_by_sector_v2024_07_08.csv │ │ │ ├── NOx_CEDS_global_emissions_by_sector_v2024_07_08.csv │ │ │ ├── OC_CEDS_global_emissions_by_sector_v2024_07_08.csv │ │ │ └── SO2_CEDS_global_emissions_by_sector_v2024_07_08.csv │ │ └── v20250318 │ │ │ ├── BC_CEDS_global_emissions_by_sector_v_2025_03_18.csv │ │ │ ├── CH4_CEDS_global_emissions_by_sector_v_2025_03_18.csv │ │ │ ├── CO_CEDS_global_emissions_by_sector_v_2025_03_18.csv │ │ │ ├── N2O_CEDS_global_emissions_by_sector_v_2025_03_18.csv │ │ │ ├── NH3_CEDS_global_emissions_by_sector_v_2025_03_18.csv │ │ │ ├── NMVOC_CEDS_global_emissions_by_sector_v_2025_03_18.csv │ │ │ ├── NOx_CEDS_global_emissions_by_sector_v_2025_03_18.csv │ │ │ ├── OC_CEDS_global_emissions_by_sector_v_2025_03_18.csv │ │ │ └── SO2_CEDS_global_emissions_by_sector_v_2025_03_18.csv │ ├── forster_et_al_2020 │ │ └── two_year_blip_emissions_ratios.csv │ └── indicators_2022 │ │ └── slcf_emissions_1750-2022.csv └── volcanic_stwv │ └── indicators_stwv_irf_hansen_tp.csv ├── environment.yml ├── jupytext.toml ├── notebooks ├── 01_trace-gas-global-mean.py ├── 02_invert-concentrations.py ├── 03_biomass-emissions.py ├── 04_contrails.py ├── 07_cams-slcfs.py ├── 08_slcf-emissions.py ├── 09_mls-data.py ├── 10_volcanic-forcing.py ├── 11_land-use.py ├── 12_make-forcing.py ├── 13_radiative-forcing-barchart.py ├── 14_forcing-analysis.py ├── 15_decadal-trends.py ├── temperature-plot.py └── zenith.ipynb ├── output ├── ERF_best_1750-2024.csv ├── ERF_best_DAMIP_1750-2024.csv ├── ERF_best_aggregates_1750-2024.csv ├── ERF_p05_aggregates_1750-2024.csv ├── ERF_p95_aggregates_1750-2024.csv ├── cams_2000-2025.csv ├── contrails_ERF_1930-2024.csv ├── gfed4.1s_1997-2024.csv ├── ghg_concentrations_1750-2024.csv ├── ghg_equivalent_emissions.csv ├── land_use_1750-2024.csv ├── slcf_emissions_1750-2024.csv ├── volcanic_sAOD_ERF_annual_-9500-2024.csv └── volcanic_sAOD_ERF_monthly_-950001-202412.csv └── plots ├── ERF_1750-2022.pdf ├── ERF_1750-2022.png ├── ERF_1750-2023.pdf ├── ERF_1750-2023.png ├── ERF_1750-2024.pdf ├── ERF_1750-2024.png ├── ERF_timeseries_1750-2022.pdf ├── ERF_timeseries_1750-2022.png ├── ERF_timeseries_1750-2023.pdf ├── ERF_timeseries_1750-2023.png ├── ERF_timeseries_1750-2024.pdf ├── ERF_timeseries_1750-2024.png ├── cams_ceds.pdf ├── cams_ceds.png ├── decadal_trends.pdf ├── decadal_trends.png ├── gmst.pdf ├── gmst.png ├── slcf-comparison.pdf ├── slcf-comparison.png ├── tape_recorder.png ├── volcanic_AOD.pdf ├── volcanic_AOD.png ├── volcanic_ERF.pdf └── volcanic_ERF.png /.gitignore: -------------------------------------------------------------------------------- 1 | # don't put jupyter files under version control with jupytext 2 | *.ipynb 3 | 4 | # OS junk 5 | .DS_Store 6 | 7 | # large and non-public datasets 8 | data/volcanic_aod 9 | data/contrails/OIWORLD* 10 | data/mls 11 | data/slcf_emissions/cams/*.nc 12 | data/slcf_emissions/ceds/v20250311 13 | data/slcf_emissions/merra 14 | data/era5 15 | data/slcf_emissions/gfed/*.hdf5 16 | 17 | # large output 18 | output/*.nc 19 | 20 | # Byte-compiled / optimized / DLL files 21 | __pycache__/ 22 | *.py[cod] 23 | *$py.class 24 | 25 | # C extensions 26 | *.so 27 | 28 | # Distribution / packaging 29 | .Python 30 | build/ 31 | develop-eggs/ 32 | dist/ 33 | downloads/ 34 | eggs/ 35 | .eggs/ 36 | lib/ 37 | lib64/ 38 | parts/ 39 | sdist/ 40 | var/ 41 | wheels/ 42 | pip-wheel-metadata/ 43 | share/python-wheels/ 44 | *.egg-info/ 45 | .installed.cfg 46 | *.egg 47 | MANIFEST 48 | 49 | # PyInstaller 50 | # Usually these files are written by a python script from a template 51 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 52 | *.manifest 53 | *.spec 54 | 55 | # Installer logs 56 | pip-log.txt 57 | pip-delete-this-directory.txt 58 | 59 | # Unit test / coverage reports 60 | htmlcov/ 61 | .tox/ 62 | .nox/ 63 | .coverage 64 | .coverage.* 65 | .cache 66 | nosetests.xml 67 | coverage.xml 68 | *.cover 69 | *.py,cover 70 | .hypothesis/ 71 | .pytest_cache/ 72 | 73 | # Translations 74 | *.mo 75 | *.pot 76 | 77 | # Django stuff: 78 | *.log 79 | local_settings.py 80 | db.sqlite3 81 | db.sqlite3-journal 82 | 83 | # Flask stuff: 84 | instance/ 85 | .webassets-cache 86 | 87 | # Scrapy stuff: 88 | .scrapy 89 | 90 | # Sphinx documentation 91 | docs/_build/ 92 | 93 | # PyBuilder 94 | target/ 95 | 96 | # Jupyter Notebook 97 | .ipynb_checkpoints 98 | 99 | # IPython 100 | profile_default/ 101 | ipython_config.py 102 | 103 | # pyenv 104 | .python-version 105 | 106 | # pipenv 107 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 108 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 109 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 110 | # install all needed dependencies. 111 | #Pipfile.lock 112 | 113 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 114 | __pypackages__/ 115 | 116 | # Celery stuff 117 | celerybeat-schedule 118 | celerybeat.pid 119 | 120 | # SageMath parsed files 121 | *.sage.py 122 | 123 | # Environments 124 | .env 125 | .venv 126 | env/ 127 | venv/ 128 | ENV/ 129 | env.bak/ 130 | venv.bak/ 131 | 132 | # Spyder project settings 133 | .spyderproject 134 | .spyproject 135 | 136 | # Rope project settings 137 | .ropeproject 138 | 139 | # mkdocs documentation 140 | /site 141 | 142 | # mypy 143 | .mypy_cache/ 144 | .dmypy.json 145 | dmypy.json 146 | 147 | # Pyre type checker 148 | .pyre/ 149 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Chris Smith 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Effective radiative forcing time series 2 | 3 | [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.10706344.svg)](https://doi.org/10.5281/zenodo.10706344) 4 | 5 | This repository generates the following data and plots from the Climate Indicator Project: 6 | 7 | - Greenhouse gas concentrations 1750-2024 8 | - Effective radiative forcing 1750-2024 9 | 10 | As part of the ERF time series, emissions are processed from CEDS and GFED. 11 | 12 | **Please note that 2024 data is preliminary; in many cases it is based on extrapolations and estimates. The data will not be final until IGCC 2024 is published in early summer 2025.** 13 | 14 | ![Bar plot of effective radiative forcing 1750-2024](plots/ERF_1750-2024.png) 15 | 16 | ![Line plot of time series of effective radiative forcing 1750-2024](plots/ERF_timeseries_1750-2024.png) 17 | 18 | The code also provides a probabilistic ensemble of 1000 forcing time series for the detection and attribution of climate change. 19 | 20 | Code also caculates decadal rates of ERF change and human induced warming change 21 | ![Line plot of time series of decadal rates of change in effective radiative forcing and human induced warming 1970-2023](plots/decadal_trends.png) 22 | 23 | ## Reproducibility 24 | 25 | Create a conda environment. From the top directory of the repository run 26 | 27 | ``` 28 | conda env create -f environment.yml 29 | ``` 30 | 31 | The code is a series of notebooks in the `notebooks` folder. Run the notebooks in numerical order to reproduce. 32 | 33 | All ancillary data is provided in the repository or downloaded by the code except for six volcanic, contrails, and SLCFs datasets that either require registration or are not in the public domain. See the notes in the `volcanic-forcing.ipynb`, `mls-data.ipynb`, `biomass_emissions.ipynb`, `cams-slcf.ipynb` and `contrails.ipynb` notebooks for how to obtain the data and where to download it to. Additionally, the Hunga Tonga stratospheric water vapour calculation uses offline radiative transfer simulations that are not part of the repository (but the results are included in the data). 34 | 35 | The Decadal trend plot uses data generated by the athropogenic warming repository. 36 | -------------------------------------------------------------------------------- /data/ar6/table_mean_thornhill_collins_orignames.csv: -------------------------------------------------------------------------------- 1 | Species,CO2,CH4_lifetime,Strat_H2O,Aerosol,Cloud,O3,HC,N2O 2 | CO2,2.0575541755746745,0.0,0.0,0.0,0.0,0.0,0.0,0.0 3 | CH4,0.01754907653242457,0.8444565783078388,0.05,-0.002653258068280324,0.018420861638621333,0.26673581539543734,0.0,0.0 4 | N2O,0.0,-0.03596730476876493,0.0,-0.0020904455899627967,0.04250298133962486,0.02612382400013067,0.0,0.20999999999999996 5 | HC,5.3086374003635685e-05,-0.050926763764175396,0.0,-0.00808037684430826,-0.01741925485299155,-0.16203265013389953,0.41,0.0 6 | NOx,0.0,-0.3800247113463441,0.0,-0.009165800599513847,-0.014457980890438274,0.1371023996751788,0.0,0.0 7 | VOC,0.06949065814324296,0.16246220157144559,0.0,-0.0025728561478319464,0.008883819797349297,0.20207061106315274,0.0,0.0 8 | SO2,0.0,0.0,0.0,-0.23422755465613596,-0.7037843805039116,0.0,0.0,0.0 9 | OC,0.0,0.0,0.0,-0.07214335030979308,-0.13691861085850346,0.0,0.0,0.0 10 | BC,0.0,0.0,0.0,0.14470238126666668,-0.03722743566975061,0.0,0.0,0.0 11 | NH3,0.0,0.0,0.0,-0.03376873905084049,0.0,0.0,0.0,0.0 12 | -------------------------------------------------------------------------------- /data/ar6/table_std_thornhill_collins_orignames.csv: -------------------------------------------------------------------------------- 1 | Species,CO2_sd,GHG_sd,CH4_lifetime_sd,O3_sd,O3_prime_sd,Strat_H2O_sd,Aerosol_sd,Cloud_sd,Total_sd 2 | CO2,0.24690650106896092,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.24690650106896092 3 | CH4,0.002105889183890948,0.07560000000000001,0.1239375698816548,0.036693015878959206,0.03440130910194926,0.05,0.002197484774185035,0.092580961,0.23653782548894467 4 | N2O,0.0,0.0294,0.028548253028929715,0.015462379224266737,0.0032361928065616683,0.0,0.002021268880785476,0.042168972,0.06173578439139726 5 | HC,6.370364880436282e-06,0.0574,0.03263948857036977,0.07773503902710076,0.004557535543523023,0.0,0.0019706635308544447,0.049553562,0.11658303095141336 6 | NOx,0.0,0.0,0.10771075661652788,0.0883028767894415,0.03010176917125973,0.0,0.004542521571242159,0.057188043,0.17003639034153528 7 | VOC,0.008338878977189155,0.0,0.05904146992359801,0.0571433439284174,0.015687239609833755,0.0,0.005064672628458012,0.098979375,0.13668318680833277 8 | SO2,0.0,0.0,0.0,0.0,0.0,0.0,0.22390725482763918,0.3549956267657899,0.41970984475859674 9 | OC,0.0,0.0,0.0,0.0,0.0,0.0,0.06546073509187661,0.12367612498650062,0.13993173953912447 10 | BC,0.0,0.0,0.0,0.0,0.0,0.0,0.15898366994955596,0.10032077880000001,0.18798953686220912 11 | NH3,0.0,0.0,0.0,0.0,0.0,0.0,0.004824105578691499,0.0,0.004824105578691499 12 | -------------------------------------------------------------------------------- /data/contrails/contrails.csv: -------------------------------------------------------------------------------- 1 | year,ERF_mW_m2 2 | 1930,0 3 | 1931,0.0282261541 4 | 1932,0.0564523082 5 | 1933,0.0846784623 6 | 1934,0.1129046163 7 | 1935,0.1411307704 8 | 1936,0.1693569245 9 | 1937,0.1975830786 10 | 1938,0.2258092327 11 | 1939,0.2540353868 12 | 1940,0.2822615409 13 | 1941,0.3127751132 14 | 1942,0.3486500418 15 | 1943,0.3862887508 16 | 1944,0.4298557501 17 | 1945,0.475559651 18 | 1946,0.532138624 19 | 1947,0.5870657131 20 | 1948,0.6537955159 21 | 1949,0.723801928 22 | 1950,0.8068793493 23 | 1951,0.8940416455 24 | 1952,0.990558408 25 | 1953,1.1022770574 26 | 1954,1.2248712619 27 | 1955,1.3590135507 28 | 1956,1.5111121285 29 | 1957,1.6765247347 30 | 1958,1.8620679546 31 | 1959,2.0628820404 32 | 1960,2.2925867433 33 | 1961,2.5859104805 34 | 1962,2.9275125283 35 | 1963,3.1755233138 36 | 1964,3.4137913376 37 | 1965,3.7506471979 38 | 1966,4.1788497419 39 | 1967,5.0684937819 40 | 1968,5.9014265619 41 | 1969,6.352444874 42 | 1970,6.5471007683 43 | 1971,7.6946205161 44 | 1972,8.067633595 45 | 1973,8.3098027411 46 | 1974,8.0091771855 47 | 1975,7.9911052175 48 | 1976,7.9643568747 49 | 1977,8.4104691354 50 | 1978,8.6514605867 51 | 1979,8.9427050205 52 | 1980,8.9591054936 53 | 1981,9.0018099927 54 | 1982,9.4037412987 55 | 1983,9.8450774825 56 | 1984,10.7856108636 57 | 1985,11.4315478109 58 | 1986,12.4207628803 59 | 1987,13.3416405043 60 | 1988,14.3978696607 61 | 1989,15.4119999282 62 | 1990,15.73796952 63 | 1991,15.61860144 64 | 1992,17.1824328 65 | 1993,18.74626416 66 | 1994,19.98484488 67 | 1995,21.3219864 68 | 1996,22.56056712 69 | 1997,23.6874456 70 | 1998,24.57230256 71 | 1999,26.00033904 72 | 2000,28.4529215886 73 | 2001,28.6451710588 74 | 2002,27.9327171398 75 | 2003,29.086213961 76 | 2004,32.9877473267 77 | 2005,34.8876244439 78 | 2006,36.3351498665 79 | 2007,38.2576445684 80 | 2008,39.171141766 81 | 2009,38.1841621932 82 | 2010,42.015659576 83 | 2011,44.287272474 84 | 2012,45.3966188089 85 | 2013,46.8052412781 86 | 2014,48.6894763612 87 | 2015,51.1463085638 88 | 2016,53.8837860676 89 | 2017,56.4954523558 90 | 2018,57.614920272 91 | 2019,59.3548908642 92 | 2020,32.8534574287 93 | 2021,38.3849068937 94 | 2022,54.3064376865 95 | -------------------------------------------------------------------------------- /data/contrails/lee2020_clean_data.csv: -------------------------------------------------------------------------------- 1 | year,Fuel Tg/yr,CO2 Tg/yr,distance million km,Distance factor,Scaled distance million km 2 | 1990,173.9,549.6,14371,1.17,16754 3 | 1991,168.2,531.5,14262,1.17,16627 4 | 1992,168.6,532.8,15690,1.17,18291 5 | 1993,169.5,535.7,17118,1.17,19956 6 | 1994,177.6,561.2,18249,1.17,21275 7 | 1995,181.9,574.9,19470,1.17,22698 8 | 1996,190.2,600.9,20601,1.17,24016 9 | 1997,195.9,619.2,21630,1.17,25216 10 | 1998,199.8,631.4,22438,1.17,26158 11 | 1999,206.3,651.8,23742,1.17,27678 12 | 2000,216.9,685.5,25982,1.17,30289 13 | 2001,208.7,659.4,26157,1.17,30494 14 | 2002,209.1,660.7,25507,1.17,29735 15 | 2003,209,660.3,26560,1.17,30963 16 | 2004,222.1,701.9,30122,1.17,35117 17 | 2005,233,736.4,31857,1.17,37139 18 | 2006,235.7,744.9,33179,1.17,38680 19 | 2007,242.6,766.6,34935,1.17,40727 20 | 2008,241.5,763,35769,1.17,41699 21 | 2009,229,723.6,34868,1.17,40648 22 | 2010,240.5,760.1,38366,1.17,44727 23 | 2011,247.7,782.7,40441,1.17,47145 24 | 2012,250.4,791.1,41454,1.17,48326 25 | 2013,257.5,813.6,42740,1.17,49826 26 | 2014,265.6,839.2,44460,1.17,51832 27 | 2015,280.1,885.1,46704,1.17,54447 28 | 2016,293.6,927.9,49204,1.17,57361 29 | 2017,311,982.6,51588,1.17,60141 30 | 2018,327.1,1033.7,52611,1.17,61333 31 | -------------------------------------------------------------------------------- /data/contrails/sausen_schumann_co2.csv: -------------------------------------------------------------------------------- 1 | year,aviation_emissions_teragrams_carbon 2 | 1940,7.7 3 | 1941,8.3 4 | 1942,9 5 | 1943,9.7 6 | 1944,10.5 7 | 1945,11.3 8 | 1946,12.3 9 | 1947,13.2 10 | 1948,14.3 11 | 1949,15.4 12 | 1950,16.7 13 | 1951,18 14 | 1952,19.4 15 | 1953,21 16 | 1954,22.7 17 | 1955,24.5 18 | 1956,26.5 19 | 1957,28.6 20 | 1958,30.9 21 | 1959,33.3 22 | 1960,36 23 | 1961,39.5 24 | 1962,43.5 25 | 1963,45.9 26 | 1964,48 27 | 1965,51.3 28 | 1966,55.6 29 | 1967,65.6 30 | 1968,74.3 31 | 1969,77.8 32 | 1970,78 33 | 1971,90 34 | 1972,96 35 | 1973,99.4 36 | 1974,96 37 | 1975,96.1 38 | 1976,96.4 39 | 1977,102.1 40 | 1978,105.7 41 | 1979,110.1 42 | 1980,110.9 43 | 1981,109.3 44 | 1982,110.5 45 | 1983,112 46 | 1984,119.5 47 | 1985,123.4 48 | 1986,129.9 49 | 1987,135.6 50 | 1988,141.4 51 | 1989,146.5 52 | 1990,146.9 53 | 1991,143.4 54 | 1992,142 55 | 1993,144.1 56 | 1994,150 57 | 1995,154.3 58 | -------------------------------------------------------------------------------- /data/fair-calibrate-1.4.1/aerosol_cloud.csv: -------------------------------------------------------------------------------- 1 | ,aci_scale,Sulfur,BC,OC 2 | E3SM-2-0,-1.4434847446412806,0.07152779237965555,3.762593486678216e-41,0.35181779053341433 3 | HadGEM3-GC31-LL,-0.9405797474072647,0.022223283488243886,5.954011622120533e-33,0.036741802307903706 4 | GFDL-ESM4,-13197.573317319566,2.5447188551431775e-07,2.6997817958854723e-06,6.070785160315766e-07 5 | CNRM-CM6-1,-1.4967288372651257,0.006005012835063194,0.046024954180165084,0.01113794381589312 6 | CanESM5,-0.8560318461065494,0.01992723717330367,0.394078935510329,1.2819732048501504e-16 7 | NorESM2-LM,-12953.242880881817,6.681038479792331e-07,2.927735937819934e-89,1.569532912992184e-06 8 | MRI-ESM2-0,-7.743979759747461,0.0007756472209479823,0.00411882717725342,5.9074740305796655e-27 9 | MIROC6,-1.025414282054412,0.007298450941346511,0.14851280267477046,6.270682145216392e-18 10 | IPSL-CM6A-LR,-1.2621911677299213,0.0026601996127187774,2.0107841150989397e-16,0.0018973466494468774 11 | GISS-E2-1-G,-0.5848060246778116,0.008194177545175891,1.283970666604552,2.548500249886728e-11 12 | GFDL-CM4,-4520.490500572709,1.0988175957824759e-06,5.92375242490518e-07,2.1195646249194975e-06 13 | MPI-ESM-1-2-HAM,-2.3549928851311974,0.0071809167834433136,5.470224434583641e-13,0.009751038260706868 14 | UKESM1-0-LL,-0.7226346834864495,0.03346906383355222,8.321953404435353e-37,6.452293191989667e-13 15 | -------------------------------------------------------------------------------- /data/gcp_emissions/gcp_2024.csv: -------------------------------------------------------------------------------- 1 | year,FFI,AFOLU 2 | 1750,0.00253983,0.003 3 | 1751,0.002567475,0.009 4 | 1752,0.002594205,0.015 5 | 1753,0.00262295,0.021 6 | 1754,0.002656545,0.027 7 | 1755,0.00267289,0.033 8 | 1756,0.002704671,0.039 9 | 1757,0.002754895,0.045 10 | 1758,0.002788307,0.051 11 | 1759,0.00282174,0.057 12 | 1760,0.002869632,0.063 13 | 1761,0.002933375,0.069 14 | 1762,0.002989137,0.075 15 | 1763,0.003054474,0.081 16 | 1764,0.00311053,0.087 17 | 1765,0.003177807,0.093 18 | 1766,0.003241288,0.099 19 | 1767,0.003316733,0.105 20 | 1768,0.003402548,0.111 21 | 1769,0.003488011,0.117 22 | 1770,0.003574568,0.123 23 | 1771,0.003648878,0.129 24 | 1772,0.003718206,0.135 25 | 1773,0.003768597,0.141 26 | 1774,0.003824349,0.147 27 | 1775,0.003913461,0.153 28 | 1776,0.003999488,0.159 29 | 1777,0.004082843,0.165 30 | 1778,0.004160339,0.171 31 | 1779,0.004239966,0.177 32 | 1780,0.004333713,0.183 33 | 1781,0.004430781,0.189 34 | 1782,0.00452537,0.195 35 | 1783,0.004656864,0.201 36 | 1784,0.004768311,0.207 37 | 1785,0.004903146,0.213 38 | 1786,0.005034797,0.219 39 | 1787,0.005147142,0.225 40 | 1788,0.005263709,0.231 41 | 1789,0.00542124,0.237 42 | 1790,0.005567165,0.243 43 | 1791,0.005712814,0.249 44 | 1792,0.005985048,0.255 45 | 1793,0.006085497,0.261 46 | 1794,0.006146194,0.267 47 | 1795,0.006090406,0.273 48 | 1796,0.006037493,0.279 49 | 1797,0.006028951,0.285 50 | 1798,0.006306203,0.291 51 | 1799,0.007501421,0.297 52 | 1800,0.008951515,0.303 53 | 1801,0.008729817,0.309 54 | 1802,0.011001767,0.315 55 | 1803,0.008061819,0.321 56 | 1804,0.008670627,0.327 57 | 1805,0.008529426,0.333 58 | 1806,0.008925934,0.339 59 | 1807,0.009880091,0.345 60 | 1808,0.009688261,0.351 61 | 1809,0.009916434,0.357 62 | 1810,0.010778469,0.363 63 | 1811,0.010965251,0.369 64 | 1812,0.011139335,0.375 65 | 1813,0.011246217,0.381 66 | 1814,0.01152474,0.387 67 | 1815,0.011896088,0.393 68 | 1816,0.012417188,0.399 69 | 1817,0.013448669,0.405 70 | 1818,0.014026204,0.411 71 | 1819,0.013900155,0.417 72 | 1820,0.013846363,0.423 73 | 1821,0.014208338,0.429 74 | 1822,0.014743917,0.435 75 | 1823,0.015381486,0.441 76 | 1824,0.015716058,0.447 77 | 1825,0.016575018,0.453 78 | 1826,0.016752765,0.459 79 | 1827,0.017941749,0.465 80 | 1828,0.018199178,0.471 81 | 1829,0.018097,0.477 82 | 1830,0.024287254,0.483 83 | 1831,0.022721317,0.489 84 | 1832,0.022404954,0.495 85 | 1833,0.022720782,0.501 86 | 1834,0.02422574,0.507 87 | 1835,0.026582859,0.513 88 | 1836,0.029174262,0.519 89 | 1837,0.028984558,0.525 90 | 1838,0.028887899,0.531 91 | 1839,0.029927138,0.537 92 | 1840,0.032425904,0.543 93 | 1841,0.033342125,0.549 94 | 1842,0.035313534,0.555 95 | 1843,0.036127017,0.561 96 | 1844,0.038746301,0.567 97 | 1845,0.042323527,0.573 98 | 1846,0.043040881,0.579 99 | 1847,0.046614834,0.585 100 | 1848,0.047391779,0.591 101 | 1849,0.050504376,0.597 102 | 1850,0.05372478,0.720144575 103 | 1851,0.054251787,0.769572695 104 | 1852,0.056658049,0.77988435 105 | 1853,0.059289566,0.793014093 106 | 1854,0.069606593,0.795533797 107 | 1855,0.071031619,0.785621435 108 | 1856,0.0759404,0.81028388 109 | 1857,0.076741552,0.805427085 110 | 1858,0.077933513,0.811906647 111 | 1859,0.082579742,0.829333668 112 | 1860,0.09069281,0.758962233 113 | 1861,0.095302995,0.75528421 114 | 1862,0.097159137,0.747939828 115 | 1863,0.103584849,0.738843395 116 | 1864,0.111770042,0.714713623 117 | 1865,0.118682132,0.701810485 118 | 1866,0.122561961,0.711822578 119 | 1867,0.131226503,0.701479895 120 | 1868,0.134960024,0.692865925 121 | 1869,0.143212626,0.705481707 122 | 1870,0.146321855,0.773785845 123 | 1871,0.15550671,0.779072422 124 | 1872,0.172205642,0.833109565 125 | 1873,0.182987776,0.813376272 126 | 1874,0.171578121,0.86736188 127 | 1875,0.185875541,0.890399705 128 | 1876,0.188477763,0.896118858 129 | 1877,0.192148707,0.868302513 130 | 1878,0.193681645,0.894354855 131 | 1879,0.207367465,0.89250771 132 | 1880,0.234185501,0.922575418 133 | 1881,0.242348518,0.921691985 134 | 1882,0.255973859,0.970698438 135 | 1883,0.272247423,0.949482728 136 | 1884,0.2754994,0.991334297 137 | 1885,0.277604954,0.991059195 138 | 1886,0.281826877,0.967614138 139 | 1887,0.29577716,1.007490138 140 | 1888,0.327729705,0.97336834 141 | 1889,0.327924736,1.003737088 142 | 1890,0.356602392,1.078145655 143 | 1891,0.373612338,1.135545535 144 | 1892,0.376585415,1.119496478 145 | 1893,0.371865452,1.170494323 146 | 1894,0.385243703,1.174718915 147 | 1895,0.408089203,1.17616945 148 | 1896,0.421577749,1.158464213 149 | 1897,0.441455458,1.2020653 150 | 1898,0.465600676,1.189119368 151 | 1899,0.508497649,1.21386755 152 | 1900,0.535341359,1.229829088 153 | 1901,0.55239187,1.237108585 154 | 1902,0.566266472,1.26288628 155 | 1903,0.617370679,1.254624412 156 | 1904,0.624320232,1.2770388 157 | 1905,0.665137031,1.317342845 158 | 1906,0.694455714,1.32022528 159 | 1907,0.791573329,1.29599799 160 | 1908,0.760285662,1.320642662 161 | 1909,0.791803285,1.349939267 162 | 1910,0.830602047,1.29554724 163 | 1911,0.843367392,1.317347713 164 | 1912,0.886047239,1.27898816 165 | 1913,0.959752449,1.232139017 166 | 1914,0.870574864,1.25447749 167 | 1915,0.857062373,1.24758414 168 | 1916,0.925756889,1.234349243 169 | 1917,0.968378362,1.24054938 170 | 1918,0.955154564,1.241400733 171 | 1919,0.82801293,1.223054047 172 | 1920,0.965566938,1.256419225 173 | 1921,0.847757677,1.320674313 174 | 1922,0.888226704,1.310744078 175 | 1923,1.007286494,1.33944994 176 | 1924,1.01058326,1.343149575 177 | 1925,1.02091526,1.342371828 178 | 1926,1.003659234,1.345604953 179 | 1927,1.095236732,1.355310478 180 | 1928,1.090696433,1.348251748 181 | 1929,1.170363376,1.335727297 182 | 1930,1.080266364,1.37015909 183 | 1931,0.965971708,1.415077373 184 | 1932,0.871340483,1.428330957 185 | 1933,0.91776294,1.445786565 186 | 1934,0.997867691,1.456818813 187 | 1935,1.046872967,1.435904907 188 | 1936,1.148452716,1.446663965 189 | 1937,1.227269483,1.46514269 190 | 1938,1.154372056,1.478736875 191 | 1939,1.220014922,1.462108093 192 | 1940,1.333150525,1.489720838 193 | 1941,1.364381203,1.56613063 194 | 1942,1.359859185,1.574575228 195 | 1943,1.385172817,1.56136008 196 | 1944,1.408975588,1.55523943 197 | 1945,1.170663944,1.553575873 198 | 1946,1.25779121,1.54136159 199 | 1947,1.409717655,1.538298912 200 | 1948,1.486868111,1.514818537 201 | 1949,1.420315318,1.494594877 202 | 1950,1.618516332,1.694066323 203 | 1951,1.741656336,1.790339472 204 | 1952,1.765136577,1.768037323 205 | 1953,1.815197933,1.798331875 206 | 1954,1.853037407,1.90514828 207 | 1955,2.031630949,1.944110765 208 | 1956,2.163213024,1.970387323 209 | 1957,2.234073358,1.998789435 210 | 1958,2.297267418,1.96269274 211 | 1959,2.416672802,2.113450873 212 | 1960,2.561956989,1.830242763 213 | 1961,2.56960757,1.861498605 214 | 1962,2.660285798,1.727810007 215 | 1963,2.802066651,1.681573285 216 | 1964,2.954275682,1.599023422 217 | 1965,3.086954269,1.535236493 218 | 1966,3.237621812,1.425446192 219 | 1967,3.339893362,1.474033853 220 | 1968,3.522184244,1.455350468 221 | 1969,3.755945767,1.59278707 222 | 1970,4.066354924,1.554067047 223 | 1971,4.231401397,1.396858585 224 | 1972,4.428110439,1.471222845 225 | 1973,4.662962036,1.43124242 226 | 1974,4.642759738,1.402401627 227 | 1975,4.654135543,1.380822075 228 | 1976,4.909692159,1.387600897 229 | 1977,5.048753881,1.504848328 230 | 1978,5.204500693,1.477362875 231 | 1979,5.351806848,1.27913548 232 | 1980,5.318920418,1.355767043 233 | 1981,5.191840824,1.31821517 234 | 1982,5.150408818,1.240093535 235 | 1983,5.183381668,1.305938035 236 | 1984,5.362391217,1.539051105 237 | 1985,5.543641275,1.444039308 238 | 1986,5.626354582,1.508508875 239 | 1987,5.799692849,1.457369903 240 | 1988,6.027600985,1.411295127 241 | 1989,6.109890142,1.35189318 242 | 1990,6.203326501,1.35824158 243 | 1991,6.328084454,1.35643488 244 | 1992,6.148518567,1.435046942 245 | 1993,6.210640554,1.357493797 246 | 1994,6.275367604,1.607362093 247 | 1995,6.422511739,1.48264461 248 | 1996,6.620678889,1.640975123 249 | 1997,6.659908764,2.021444815 250 | 1998,6.633126995,1.676981873 251 | 1999,6.78322262,1.63834922 252 | 2000,6.962487118,1.44574475 253 | 2001,7.015909784,1.300558948 254 | 2002,7.171634479,1.399595922 255 | 2003,7.551716646,1.65820847 256 | 2004,7.814548562,1.474886465 257 | 2005,8.082531141,1.33487545 258 | 2006,8.359278412,1.455281605 259 | 2007,8.60661682,1.253979127 260 | 2008,8.753875153,1.331959593 261 | 2009,8.60860315,1.439407263 262 | 2010,9.103685437,1.497793953 263 | 2011,9.417177434,1.440576192 264 | 2012,9.552407298,1.542545593 265 | 2013,9.6347314,1.396330582 266 | 2014,9.6752442,1.472760157 267 | 2015,9.662908562,1.509712795 268 | 2016,9.666117926,1.202579875 269 | 2017,9.822570382,1.154753955 270 | 2018,10.02467974,1.049322263 271 | 2019,10.12671339,1.033499808 272 | 2020,9.586933985,0.938590505 273 | 2021,10.09599789,0.96964621 274 | 2022,10.1784488,0.966440597 275 | 2023,10.31429277,0.989332 276 | 2024,10.39680711,1.1 277 | -------------------------------------------------------------------------------- /data/ghg_concentrations/agage/agage_2019-2024.csv: -------------------------------------------------------------------------------- 1 | ,CCl4,CFC-11,CFC-12,CH4,HCFC-22,HFC-125,HFC-134a,N2O 2 | 2019,77.36,225.95,504.62,1866.31,246.70,29.97,107.50,332.35 3 | 2020,76.36,223.77,500.72,1878.86,248.04,33.28,112.94,333.48 4 | 2021,75.41,221.45,496.73,1895.76,248.88,36.87,118.65,334.81 5 | 2022,74.57,219.13,492.98,1911.79,248.62,40.76,124.39,336.09 6 | 2023,73.75,216.53,488.93,1921.72,247.07,44.83,129.54,337.12 7 | 2024,73.07,213.96,484.74,1929.24,245.05,48.99,134.78,338.14 8 | -------------------------------------------------------------------------------- /data/ghg_concentrations/ar6_updated/update_2019-2023.csv: -------------------------------------------------------------------------------- 1 | YYYY,CFC-11,CFC-12,CFC-13,CFC-113,CFC-114,CFC-115,CFC-112,CFC-113a,CH3CCl3,CCl4,HCFC-22,HCFC-141b,HCFC-142b,HCFC-133a,H-1211,H-1301,H-2402,H-1202,CH3Br,CH3Cl,CH2Cl2,CHCl3,HFC-134a,HFC-152a,HFC-143a,HFC-125,HFC-236fa,HFC-245fa,HFC-365mfc,HFC-227ea,HFC-23,HFC-32,CF4,C2F6,C3F8,SF6,CO2,N2O,CH4,NF3,SO2F2 2 | 2019,226.2,503.1,3.3,69.8,16.0,8.7,0.4,0.9,1.6,77.9,246.8,24.37,22.24,0.43,3.28,3.32,0.40,0.013,6.49,544.2,40.6,8.8,107.6,7.1,24.0,29.4,0.2,3.1,1.1,1.6,32.4,20.0,85.5,4.85,0.68,9.95,410.07,332.1,1866.3,2.1,2.5 3 | 2020,223.9,499.0,3.3,69.2,16.0,8.7,0.4,1.0,1.4,77.0,247.9,24.49,21.95,0.43,3.14,3.32,0.40,0.013,6.70,547.5,41.0,9,113.0,7.0,25.5,32.8,0.2,3.3,1.1,1.7,33.7,21.5,86.4,4.94,0.70,10.27,412.44,333.3,1878.7,2.3,2.6 4 | 2021,221.6,495.0,3.3,68.6,16.0,8.7,0.4,1.1,1.2,76.0,248.9,24.62,21.75,0.43,3.06,3.33,0.40,0.013,6.61,545.3,41.0,9,118.8,7.2,27.1,36.3,0.2,3.6,1.1,1.9,34.9,24.9,87.4,5.03,0.72,10.65,414.70,334.6,1895.6,2.5,2.7 5 | 2022,219.3,491.4,3.4,68.1,16.0,8.8,0.4,1.2,1.1,75.0,248.7,24.62,21.44,0.43,2.96,3.33,0.40,0.013,6.55,545.6,41.0,9,124.4,7.4,29.2,40.1,0.2,3.9,1.1,2.1,35.9,27.7,88.5,5.15,0.74,11.04,417.07,335.9,1911.8,2.7,2.8 6 | 2023,217.0,487.2,3.4,67.6,16.0,8.8,0.4,1.3,1.0,73.8,247.3,24.49,21.24,0.43,2.87,3.33,0.40,0.013,6.50,548.0,41.0,9,129.5,7.6,31.2,43.5,0.2,4.2,1.2,2.3,36.9,30.5,89.0,5.20,0.76,11.39,419.23,337.0,1922.9,2.9,2.9 7 | -------------------------------------------------------------------------------- /data/ghg_concentrations/noaa_gml/NOAA_Annual_Mean_MoleFractions_with2024.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/data/ghg_concentrations/noaa_gml/NOAA_Annual_Mean_MoleFractions_with2024.xlsx -------------------------------------------------------------------------------- /data/ghg_concentrations/noaa_gml/ch4_annmean_gl.txt: -------------------------------------------------------------------------------- 1 | # -------------------------------------------------------------------- 2 | # USE OF NOAA GML DATA 3 | # 4 | # These data are made freely available to the public and the scientific 5 | # community in the belief that their wide dissemination will lead to 6 | # greater understanding and new scientific insights. To ensure that GML 7 | # receives fair credit for their work please include relevant citation 8 | # text in publications. We encourage users to contact the data providers, 9 | # who can provide detailed information about the measurements and 10 | # scientific insight. In cases where the data are central to a 11 | # publication, coauthorship for data providers may be appropriate. 12 | # 13 | # 14 | # 15 | # Contact: Xin Lan (xin.lan@noaa.gov) 16 | # 17 | # File Creation: Thu Jun 5 04:05:09 2025 18 | # 19 | # 20 | # -------------------------------------------------------------------- 21 | # 22 | # 23 | # See gml.noaa.gov/ccgg/trends/ for additional details. 24 | # 25 | # 26 | # Uncertainties in the global annual means are estimated using two 27 | # terms: The first is a bootstrap (resampling) method that varies the 28 | # sites in our network. Each pseudo-network contains the same number of 29 | # sites as our actual NOAA ESRL cooperative global air sampling network, 30 | # but some are repeated and some are excluded. The second term is a 31 | # Monte Carlo method that randomly modifies the data to account for 32 | # measurement uncertainty. In both cases, 100 globally-averaged time 33 | # series are created. Standard deviations of the annual means are 34 | # calculated, and the two terms (network and analytical) are taken in 35 | # quadrature to give the reported uncertainties. Please see Dlugokencky 36 | # et al., 1994, JGR, vol. 99, 17021-17043, for a complete discussion. 37 | # 38 | # CH4 expressed as a mole fraction in dry air, nanomol/mol, abbreviated as ppb 39 | # 40 | # NOTE: In general, the data presented for the last year are subject to change, 41 | # depending on recalibration of the reference gas mixtures used, and other quality 42 | # control procedures. Occasionally, earlier years may also change for the same 43 | # reasons. Usually these changes are minor. 44 | # 45 | 46 | # year mean unc 47 | 1984 1644.84 0.62 48 | 1985 1657.29 0.60 49 | 1986 1670.09 0.74 50 | 1987 1682.70 0.48 51 | 1988 1693.21 0.62 52 | 1989 1704.53 0.54 53 | 1990 1714.47 0.77 54 | 1991 1724.76 0.71 55 | 1992 1735.48 0.59 56 | 1993 1736.48 0.44 57 | 1994 1742.05 0.55 58 | 1995 1748.88 0.52 59 | 1996 1751.30 0.61 60 | 1997 1754.51 0.38 61 | 1998 1765.53 0.59 62 | 1999 1772.30 0.50 63 | 2000 1773.22 0.71 64 | 2001 1771.29 0.47 65 | 2002 1772.66 0.51 66 | 2003 1777.33 0.55 67 | 2004 1777.05 0.51 68 | 2005 1774.25 0.53 69 | 2006 1774.94 0.49 70 | 2007 1781.38 0.57 71 | 2008 1787.01 0.61 72 | 2009 1793.54 0.68 73 | 2010 1798.88 0.63 74 | 2011 1803.09 0.56 75 | 2012 1808.12 0.57 76 | 2013 1813.43 0.60 77 | 2014 1822.54 0.52 78 | 2015 1834.21 0.48 79 | 2016 1843.12 0.62 80 | 2017 1849.58 0.59 81 | 2018 1857.34 0.79 82 | 2019 1866.54 0.55 83 | 2020 1878.73 0.59 84 | 2021 1894.81 0.53 85 | 2022 1910.93 0.75 86 | 2023 1921.60 0.46 87 | 2024 1929.88 0.58 88 | -------------------------------------------------------------------------------- /data/ghg_concentrations/noaa_gml/co2_annmean_gl.txt: -------------------------------------------------------------------------------- 1 | # -------------------------------------------------------------------- 2 | # USE OF NOAA GML DATA 3 | # 4 | # These data are made freely available to the public and the scientific 5 | # community in the belief that their wide dissemination will lead to 6 | # greater understanding and new scientific insights. To ensure that GML 7 | # receives fair credit for their work please include relevant citation 8 | # text in publications. We encourage users to contact the data providers, 9 | # who can provide detailed information about the measurements and 10 | # scientific insight. In cases where the data are central to a 11 | # publication, coauthorship for data providers may be appropriate. 12 | # 13 | # 14 | # 15 | # Contact: Xin Lan (xin.lan@noaa.gov) 16 | # 17 | # File Creation: Thu Jun 5 03:55:17 2025 18 | # 19 | # 20 | # -------------------------------------------------------------------- 21 | # 22 | # 23 | # See gml.noaa.gov/ccgg/trends/ for additional details. 24 | # 25 | # The uncertainty in the global annual mean is estimated using a monte carlo 26 | # technique that computes 200 global annual averages, each time using a 27 | # slightly different set of measurement records from the NOAA GML cooperative 28 | # air sampling network. The reported uncertainty is the mean of the standard 29 | # deviations for each annual average using this technique. Please see 30 | # Conway et al., 1994, JGR, vol. 99, no. D11. for a complete discussion. 31 | # 32 | # CO2 expressed as a mole fraction in dry air, micromol/mol, abbreviated as ppm 33 | # 34 | # NOTE: In general, the data presented for the last year are subject to change, 35 | # depending on recalibration of the reference gas mixtures used, and other quality 36 | # control procedures. Occasionally, earlier years may also be changed for the same 37 | # reasons. Usually these changes are minor. 38 | # 39 | # year mean unc 40 | 1979 336.85 0.11 41 | 1980 338.91 0.07 42 | 1981 340.11 0.09 43 | 1982 340.86 0.03 44 | 1983 342.53 0.05 45 | 1984 344.07 0.07 46 | 1985 345.54 0.07 47 | 1986 346.97 0.08 48 | 1987 348.68 0.10 49 | 1988 351.16 0.07 50 | 1989 352.79 0.07 51 | 1990 354.05 0.06 52 | 1991 355.39 0.06 53 | 1992 356.09 0.07 54 | 1993 356.83 0.07 55 | 1994 358.33 0.08 56 | 1995 360.17 0.05 57 | 1996 361.93 0.04 58 | 1997 363.05 0.04 59 | 1998 365.70 0.05 60 | 1999 367.80 0.06 61 | 2000 368.96 0.06 62 | 2001 370.57 0.04 63 | 2002 372.58 0.04 64 | 2003 375.15 0.04 65 | 2004 376.95 0.05 66 | 2005 378.98 0.05 67 | 2006 381.15 0.05 68 | 2007 382.90 0.05 69 | 2008 385.02 0.04 70 | 2009 386.50 0.04 71 | 2010 388.75 0.06 72 | 2011 390.62 0.05 73 | 2012 392.65 0.07 74 | 2013 395.40 0.06 75 | 2014 397.34 0.05 76 | 2015 399.65 0.05 77 | 2016 403.06 0.07 78 | 2017 405.22 0.08 79 | 2018 407.61 0.07 80 | 2019 410.07 0.08 81 | 2020 412.44 0.07 82 | 2021 414.70 0.07 83 | 2022 417.08 0.08 84 | 2023 419.36 0.10 85 | 2024 422.79 0.08 86 | -------------------------------------------------------------------------------- /data/ghg_concentrations/noaa_gml/n2o_annmean_gl.txt: -------------------------------------------------------------------------------- 1 | # -------------------------------------------------------------------- 2 | # USE OF NOAA GML DATA 3 | # 4 | # These data are made freely available to the public and the scientific 5 | # community in the belief that their wide dissemination will lead to 6 | # greater understanding and new scientific insights. To ensure that GML 7 | # receives fair credit for their work please include relevant citation 8 | # text in publications. We encourage users to contact the data providers, 9 | # who can provide detailed information about the measurements and 10 | # scientific insight. In cases where the data are central to a 11 | # publication, coauthorship for data providers may be appropriate. 12 | # 13 | # 14 | # 15 | # Contact: Xin Lan (xin.lan@noaa.gov) 16 | # 17 | # File Creation: Thu Jun 5 04:06:07 2025 18 | # 19 | # 20 | # -------------------------------------------------------------------- 21 | # 22 | # 23 | # See gml.noaa.gov/ccgg/trends/ for additional details. 24 | # 25 | # 26 | # Uncertainties in the global annual means are estimated using two 27 | # terms: The first is a bootstrap (resampling) method that varies the 28 | # sites in our network. Each pseudo-network contains the same number of 29 | # sites as our actual NOAA ESRL cooperative global air sampling network, 30 | # but some are repeated and some are excluded. The second term is a 31 | # Monte Carlo method that randomly modifies the data to account for 32 | # measurement uncertainty. In both cases, 100 globally-averaged time 33 | # series are created. Standard deviations of the annual means are 34 | # calculated, and the two terms (network and analytical) are taken in 35 | # quadrature to give the reported uncertainties. Please see Dlugokencky 36 | # et al., 1994, JGR, vol. 99, 17021-17043, for a complete discussion. 37 | # 38 | # N2O expressed as a mole fraction in dry air, nanomol/mol, abbreviated as ppb 39 | # 40 | # NOTE: In general, the data presented for the last year are subject to change, 41 | # depending on recalibration of the reference gas mixtures used, and other quality 42 | # control procedures. Occasionally, earlier years may also change for the same 43 | # reasons. Usually these changes are minor. 44 | # 45 | 46 | # year mean unc 47 | 2001 316.36 0.13 48 | 2002 316.94 0.14 49 | 2003 317.62 0.13 50 | 2004 318.26 0.11 51 | 2005 318.91 0.12 52 | 2006 319.82 0.12 53 | 2007 320.44 0.12 54 | 2008 321.50 0.13 55 | 2009 322.27 0.13 56 | 2010 323.18 0.13 57 | 2011 324.21 0.12 58 | 2012 325.05 0.12 59 | 2013 325.94 0.12 60 | 2014 327.09 0.12 61 | 2015 328.17 0.13 62 | 2016 328.95 0.13 63 | 2017 329.74 0.13 64 | 2018 330.90 0.12 65 | 2019 331.88 0.12 66 | 2020 333.01 0.05 67 | 2021 334.27 0.03 68 | 2022 335.62 0.03 69 | 2023 336.69 0.03 70 | 2024 337.72 0.11 71 | -------------------------------------------------------------------------------- /data/ghg_concentrations/noaa_gml/sf6_annmean_gl.txt: -------------------------------------------------------------------------------- 1 | # -------------------------------------------------------------------- 2 | # USE OF NOAA GML DATA 3 | # 4 | # These data are made freely available to the public and the scientific 5 | # community in the belief that their wide dissemination will lead to 6 | # greater understanding and new scientific insights. To ensure that GML 7 | # receives fair credit for their work please include relevant citation 8 | # text in publications. We encourage users to contact the data providers, 9 | # who can provide detailed information about the measurements and 10 | # scientific insight. In cases where the data are central to a 11 | # publication, coauthorship for data providers may be appropriate. 12 | # 13 | # 14 | # 15 | # Contact: Xin Lan (xin.lan@noaa.gov) 16 | # 17 | # File Creation: Thu Jun 5 04:07:08 2025 18 | # 19 | # 20 | # -------------------------------------------------------------------- 21 | # 22 | # 23 | # See gml.noaa.gov/ccgg/trends/ for additional details. 24 | # 25 | # 26 | # Uncertainties in the global annual means are estimated using two 27 | # terms: The first is a bootstrap (resampling) method that varies the 28 | # sites in our network. Each pseudo-network contains the same number of 29 | # sites as our actual NOAA ESRL cooperative global air sampling network, 30 | # but some are repeated and some are excluded. The second term is a 31 | # Monte Carlo method that randomly modifies the data to account for 32 | # measurement uncertainty. In both cases, 100 globally-averaged time 33 | # series are created. Standard deviations of the annual means are 34 | # calculated, and the two terms (network and analytical) are taken in 35 | # quadrature to give the reported uncertainties. Please see Dlugokencky 36 | # et al., 1994, JGR, vol. 99, 17021-17043, for a complete discussion. 37 | # 38 | # SF6 expressed as a mole fraction in dry air, picomol/mol, abbreviated as ppt 39 | # 40 | # NOTE: In general, the data presented for the last year are subject to change, 41 | # depending on recalibration of the reference gas mixtures used, and other quality 42 | # control procedures. Occasionally, earlier years may also change for the same 43 | # reasons. Usually these changes are minor. 44 | # 45 | 46 | # year mean unc 47 | 1998 4.21 0.00 48 | 1999 4.38 0.00 49 | 2000 4.58 0.00 50 | 2001 4.78 0.00 51 | 2002 4.98 0.00 52 | 2003 5.23 0.00 53 | 2004 5.45 0.00 54 | 2005 5.67 0.00 55 | 2006 5.91 0.00 56 | 2007 6.18 0.00 57 | 2008 6.46 0.00 58 | 2009 6.75 0.00 59 | 2010 7.04 0.00 60 | 2011 7.30 0.00 61 | 2012 7.60 0.00 62 | 2013 7.91 0.00 63 | 2014 8.25 0.00 64 | 2015 8.58 0.00 65 | 2016 8.91 0.00 66 | 2017 9.26 0.00 67 | 2018 9.60 0.01 68 | 2019 9.94 0.01 69 | 2020 10.26 0.01 70 | 2021 10.63 0.01 71 | 2022 11.02 0.01 72 | 2023 11.40 0.01 73 | 2024 11.80 0.00 74 | -------------------------------------------------------------------------------- /data/gmst/IGCC_GMST_1850-2024.csv: -------------------------------------------------------------------------------- 1 | year,gmst 2 | 1850.5,-0.051569 3 | 1851.5,0.043431 4 | 1852.5,0.088431 5 | 1853.5,0.053431 6 | 1854.5,0.050931 7 | 1855.5,0.063431 8 | 1856.5,-0.021569 9 | 1857.5,-0.131569 10 | 1858.5,-0.029069 11 | 1859.5,0.058431 12 | 1860.5,-0.061569 13 | 1861.5,-0.116569 14 | 1862.5,-0.181569 15 | 1863.5,-0.029069 16 | 1864.5,-0.051569 17 | 1865.5,0.040931 18 | 1866.5,0.033431 19 | 1867.5,0.033431 20 | 1868.5,0.053431 21 | 1869.5,0.055931 22 | 1870.5,0.020931 23 | 1871.5,-0.001569 24 | 1872.5,0.025931 25 | 1873.5,0.010931 26 | 1874.5,-0.041569 27 | 1875.5,-0.014069 28 | 1876.5,-0.044069 29 | 1877.5,0.300931 30 | 1878.5,0.363431 31 | 1879.5,0.073431 32 | 1880.5,0.030931 33 | 1881.5,0.130931 34 | 1882.5,0.050931 35 | 1883.5,0.010931 36 | 1884.5,-0.129069 37 | 1885.5,-0.119069 38 | 1886.5,-0.114069 39 | 1887.5,-0.166569 40 | 1888.5,0.008431 41 | 1889.5,0.125931 42 | 1890.5,-0.156569 43 | 1891.5,-0.044069 44 | 1892.5,-0.119069 45 | 1893.5,-0.121569 46 | 1894.5,-0.124069 47 | 1895.5,-0.056569 48 | 1896.5,0.080931 49 | 1897.5,0.083431 50 | 1898.5,-0.116569 51 | 1899.5,0.025931 52 | 1900.5,0.123431 53 | 1901.5,0.078431 54 | 1902.5,-0.069069 55 | 1903.5,-0.181569 56 | 1904.5,-0.241569 57 | 1905.5,-0.061569 58 | 1906.5,0.035931 59 | 1907.5,-0.141569 60 | 1908.5,-0.176569 61 | 1909.5,-0.211569 62 | 1910.5,-0.181569 63 | 1911.5,-0.201569 64 | 1912.5,-0.124069 65 | 1913.5,-0.109069 66 | 1914.5,0.090931 67 | 1915.5,0.143431 68 | 1916.5,-0.074069 69 | 1917.5,-0.196569 70 | 1918.5,-0.056569 71 | 1919.5,0.013431 72 | 1920.5,0.045931 73 | 1921.5,0.085931 74 | 1922.5,0.000931 75 | 1923.5,0.020931 76 | 1924.5,0.020931 77 | 1925.5,0.058431 78 | 1926.5,0.195931 79 | 1927.5,0.093431 80 | 1928.5,0.095931 81 | 1929.5,-0.069069 82 | 1930.5,0.148431 83 | 1931.5,0.210931 84 | 1932.5,0.160931 85 | 1933.5,-0.001569 86 | 1934.5,0.143431 87 | 1935.5,0.103431 88 | 1936.5,0.150931 89 | 1937.5,0.298431 90 | 1938.5,0.290931 91 | 1939.5,0.283431 92 | 1940.5,0.383431 93 | 1941.5,0.363431 94 | 1942.5,0.320931 95 | 1943.5,0.363431 96 | 1944.5,0.485931 97 | 1945.5,0.365931 98 | 1946.5,0.208431 99 | 1947.5,0.260931 100 | 1948.5,0.188431 101 | 1949.5,0.178431 102 | 1950.5,0.108431 103 | 1951.5,0.255931 104 | 1952.5,0.335931 105 | 1953.5,0.395931 106 | 1954.5,0.195931 107 | 1955.5,0.148431 108 | 1956.5,0.085931 109 | 1957.5,0.308431 110 | 1958.5,0.320931 111 | 1959.5,0.300931 112 | 1960.5,0.240931 113 | 1961.5,0.318431 114 | 1962.5,0.275931 115 | 1963.5,0.305931 116 | 1964.5,0.048431 117 | 1965.5,0.155931 118 | 1966.5,0.208431 119 | 1967.5,0.243431 120 | 1968.5,0.178431 121 | 1969.5,0.323431 122 | 1970.5,0.275931 123 | 1971.5,0.158431 124 | 1972.5,0.270931 125 | 1973.5,0.408431 126 | 1974.5,0.183431 127 | 1975.5,0.243431 128 | 1976.5,0.148431 129 | 1977.5,0.460931 130 | 1978.5,0.353431 131 | 1979.5,0.430931 132 | 1980.5,0.550931 133 | 1981.5,0.598431 134 | 1982.5,0.395931 135 | 1983.5,0.575931 136 | 1984.5,0.403431 137 | 1985.5,0.398431 138 | 1986.5,0.448431 139 | 1987.5,0.583431 140 | 1988.5,0.630931 141 | 1989.5,0.520931 142 | 1990.5,0.700931 143 | 1991.5,0.683431 144 | 1992.5,0.480931 145 | 1993.5,0.528431 146 | 1994.5,0.583431 147 | 1995.5,0.735931 148 | 1996.5,0.620931 149 | 1997.5,0.760931 150 | 1998.5,0.913431 151 | 1999.5,0.665931 152 | 2000.5,0.670931 153 | 2001.5,0.818431 154 | 2002.5,0.893431 155 | 2003.5,0.885931 156 | 2004.5,0.810931 157 | 2005.5,0.958431 158 | 2006.5,0.910931 159 | 2007.5,0.923431 160 | 2008.5,0.805931 161 | 2009.5,0.935931 162 | 2010.5,1.008431 163 | 2011.5,0.885931 164 | 2012.5,0.915931 165 | 2013.5,0.943431 166 | 2014.5,1.013431 167 | 2015.5,1.160931 168 | 2016.5,1.273431 169 | 2017.5,1.180931 170 | 2018.5,1.108431 171 | 2019.5,1.235931 172 | 2020.5,1.265931 173 | 2021.5,1.108431 174 | 2022.5,1.148431 175 | 2023.5,1.438431 176 | 2024.5,1.523431 177 | -------------------------------------------------------------------------------- /data/gmst/Walsh_GMST_timeseries.csv: -------------------------------------------------------------------------------- 1 | Year,anthropogenic_p50 2 | 1850,-0.037142235413194 3 | 1851,-0.035576599463821 4 | 1852,-0.033932221308351 5 | 1853,-0.032514545693994 6 | 1854,-0.031733219698072 7 | 1855,-0.030982941947877 8 | 1856,-0.029889806360006 9 | 1857,-0.02889605499804 10 | 1858,-0.027871656417847 11 | 1859,-0.026769690774381 12 | 1860,-0.02564052566886 13 | 1861,-0.024267515353858 14 | 1862,-0.02261617295444 15 | 1863,-0.020715453103185 16 | 1864,-0.018647775612772 17 | 1865,-0.016997111216188 18 | 1866,-0.015349680371583 19 | 1867,-0.013580381311476 20 | 1868,-0.012359756883234 21 | 1869,-0.011069643776864 22 | 1870,-0.00964393010363 23 | 1871,-0.008146293554455 24 | 1872,-0.006322839902714 25 | 1873,-0.004994565621018 26 | 1874,-0.004124482977204 27 | 1875,-0.002634768281132 28 | 1876,-0.000896360602928 29 | 1877,0.00075970821199 30 | 1878,0.002597133885138 31 | 1879,0.004273793264292 32 | 1880,0.005574473179877 33 | 1881,0.006935205310583 34 | 1882,0.008524644002318 35 | 1883,0.010263722483069 36 | 1884,0.01216248087585 37 | 1885,0.014049472659826 38 | 1886,0.016260599903762 39 | 1887,0.018551114946604 40 | 1888,0.020194971933961 41 | 1889,0.022018778882921 42 | 1890,0.024075277335942 43 | 1891,0.026179115101695 44 | 1892,0.028980446048081 45 | 1893,0.031966953724623 46 | 1894,0.034307176247239 47 | 1895,0.03631876707077 48 | 1896,0.038538532331586 49 | 1897,0.040421902388334 50 | 1898,0.041998175159097 51 | 1899,0.043106444180012 52 | 1900,0.044023465365171 53 | 1901,0.045626997947693 54 | 1902,0.047707442939281 55 | 1903,0.049739306420088 56 | 1904,0.051419536396861 57 | 1905,0.052852951362729 58 | 1906,0.054339787364006 59 | 1907,0.055191652849317 60 | 1908,0.056594027578831 61 | 1909,0.059235848113894 62 | 1910,0.061395898461342 63 | 1911,0.064037714898586 64 | 1912,0.067594283074141 65 | 1913,0.070626195520163 66 | 1914,0.074279565364122 67 | 1915,0.079455116391182 68 | 1916,0.084008893370628 69 | 1917,0.087452771514654 70 | 1918,0.091217484325171 71 | 1919,0.097526996582747 72 | 1920,0.103839060664177 73 | 1921,0.110591785609722 74 | 1922,0.118533511459827 75 | 1923,0.123289750516415 76 | 1924,0.126996012032032 77 | 1925,0.131215158104897 78 | 1926,0.13464088588953 79 | 1927,0.136838395893574 80 | 1928,0.138689474761486 81 | 1929,0.140052084624767 82 | 1930,0.141798415780067 83 | 1931,0.147161976993084 84 | 1932,0.154951949417591 85 | 1933,0.161366480588913 86 | 1934,0.164761534333229 87 | 1935,0.166568525135517 88 | 1936,0.168220719695091 89 | 1937,0.170011132955551 90 | 1938,0.174107646942139 91 | 1939,0.178664539754391 92 | 1940,0.180865079164505 93 | 1941,0.182574121654034 94 | 1942,0.184318539500237 95 | 1943,0.186322855949402 96 | 1944,0.189147654175758 97 | 1945,0.194612239301205 98 | 1946,0.201536844670772 99 | 1947,0.205521288514137 100 | 1948,0.206863380968571 101 | 1949,0.208516475558281 102 | 1950,0.209515516459942 103 | 1951,0.210130575299263 104 | 1952,0.211514373123646 105 | 1953,0.212884368002415 106 | 1954,0.21499839425087 107 | 1955,0.216717681288719 108 | 1956,0.216902585327625 109 | 1957,0.216680186986923 110 | 1958,0.218436466157436 111 | 1959,0.221367129683495 112 | 1960,0.223698765039444 113 | 1961,0.225581978261471 114 | 1962,0.22853784263134 115 | 1963,0.231783954799175 116 | 1964,0.23569698035717 117 | 1965,0.240902109444141 118 | 1966,0.246498765051365 119 | 1967,0.25278802216053 120 | 1968,0.259566113352776 121 | 1969,0.267344099283218 122 | 1970,0.275133979320526 123 | 1971,0.283417817950249 124 | 1972,0.29259752035141 125 | 1973,0.304241660237312 126 | 1974,0.318340465426445 127 | 1975,0.332203584909439 128 | 1976,0.343847438693047 129 | 1977,0.355871430039406 130 | 1978,0.37084704041481 131 | 1979,0.386496320366859 132 | 1980,0.403431978821754 133 | 1981,0.422538444399834 134 | 1982,0.440433385968208 135 | 1983,0.459640836715698 136 | 1984,0.48065612912178 137 | 1985,0.499626675248146 138 | 1986,0.518922764062882 139 | 1987,0.537612622976303 140 | 1988,0.556892853975296 141 | 1989,0.578727942705154 142 | 1990,0.59952500462532 143 | 1991,0.615617573261261 144 | 1992,0.634588944911957 145 | 1993,0.656424576044083 146 | 1994,0.673243939876556 147 | 1995,0.691848224401474 148 | 1996,0.714561682939529 149 | 1997,0.730271023511887 150 | 1998,0.744063317775726 151 | 1999,0.767021244764328 152 | 2000,0.793683403730392 153 | 2001,0.817387449741364 154 | 2002,0.83530387878418 155 | 2003,0.849892061948776 156 | 2004,0.866422486305237 157 | 2005,0.88279904127121 158 | 2006,0.897714918851852 159 | 2007,0.914875912666321 160 | 2008,0.935983961820602 161 | 2009,0.959326952695847 162 | 2010,0.9821124792099 163 | 2011,1.00397334694862 164 | 2012,1.02434197664261 165 | 2013,1.04676314592361 166 | 2014,1.07092072963715 167 | 2015,1.09322266578674 168 | 2016,1.12006893157959 169 | 2017,1.14847009181976 170 | 2018,1.17441648244858 171 | 2019,1.19693931341171 172 | 2020,1.22070829868317 173 | 2021,1.24307049512863 174 | 2022,1.26796809434891 175 | 2023,1.28928873538971 176 | -------------------------------------------------------------------------------- /data/land_use/Irrigation_ERF_Wells_FAO.csv: -------------------------------------------------------------------------------- 1 | Year,Irrigation ERF 2 | 1750,0 3 | 1751,5.58E-05 4 | 1752,0.000108818 5 | 1753,0.000159181 6 | 1754,0.000206884 7 | 1755,0.000251954 8 | 1756,0.000294418 9 | 1757,0.000334304 10 | 1758,0.000371639 11 | 1759,0.000406451 12 | 1760,0.000438767 13 | 1761,0.000468615 14 | 1762,0.000496022 15 | 1763,0.000521016 16 | 1764,0.000543623 17 | 1765,0.000563872 18 | 1766,0.00058179 19 | 1767,0.000597405 20 | 1768,0.000610743 21 | 1769,0.000621832 22 | 1770,0.0006307 23 | 1771,0.000637375 24 | 1772,0.000641882 25 | 1773,0.000644251 26 | 1774,0.000644509 27 | 1775,0.000642682 28 | 1776,0.000638799 29 | 1777,0.000632887 30 | 1778,0.000624973 31 | 1779,0.000615085 32 | 1780,0.00060325 33 | 1781,0.000589495 34 | 1782,0.000573849 35 | 1783,0.000556339 36 | 1784,0.000536991 37 | 1785,0.000515834 38 | 1786,0.000492895 39 | 1787,0.000468201 40 | 1788,0.00044178 41 | 1789,0.000413659 42 | 1790,0.000383866 43 | 1791,0.000352428 44 | 1792,0.000319373 45 | 1793,0.000284728 46 | 1794,0.00024852 47 | 1795,0.000210778 48 | 1796,0.000171528 49 | 1797,0.000130797 50 | 1798,8.86E-05 51 | 1799,4.50E-05 52 | 1800,0 53 | 1801,-4.64E-05 54 | 1802,-9.41E-05 55 | 1803,-0.00014313 56 | 1804,-0.000193453 57 | 1805,-0.000245036 58 | 1806,-0.000297852 59 | 1807,-0.000351874 60 | 1808,-0.000407074 61 | 1809,-0.000463424 62 | 1810,-0.000520898 63 | 1811,-0.000579468 64 | 1812,-0.000639106 65 | 1813,-0.000699785 66 | 1814,-0.000761477 67 | 1815,-0.000824156 68 | 1816,-0.000887793 69 | 1817,-0.000952361 70 | 1818,-0.001017833 71 | 1819,-0.001084181 72 | 1820,-0.001151378 73 | 1821,-0.001219396 74 | 1822,-0.001288208 75 | 1823,-0.001357786 76 | 1824,-0.001428104 77 | 1825,-0.001499132 78 | 1826,-0.001570845 79 | 1827,-0.001643215 80 | 1828,-0.001716213 81 | 1829,-0.001789814 82 | 1830,-0.001863988 83 | 1831,-0.00193871 84 | 1832,-0.002013951 85 | 1833,-0.002089683 86 | 1834,-0.00216588 87 | 1835,-0.002242515 88 | 1836,-0.002319558 89 | 1837,-0.002396984 90 | 1838,-0.002474764 91 | 1839,-0.002552872 92 | 1840,-0.002631279 93 | 1841,-0.002709959 94 | 1842,-0.002788884 95 | 1843,-0.002868026 96 | 1844,-0.002947357 97 | 1845,-0.003026852 98 | 1846,-0.003106481 99 | 1847,-0.003186218 100 | 1848,-0.003266035 101 | 1849,-0.003345905 102 | 1850,-0.0034258 103 | 1851,-0.003505693 104 | 1852,-0.003585557 105 | 1853,-0.003665363 106 | 1854,-0.003745084 107 | 1855,-0.003824694 108 | 1856,-0.003904164 109 | 1857,-0.003983467 110 | 1858,-0.004062576 111 | 1859,-0.004141463 112 | 1860,-0.004220101 113 | 1861,-0.004298462 114 | 1862,-0.004376519 115 | 1863,-0.004454244 116 | 1864,-0.00453161 117 | 1865,-0.00460859 118 | 1866,-0.004685155 119 | 1867,-0.00476128 120 | 1868,-0.004836935 121 | 1869,-0.004912094 122 | 1870,-0.00498673 123 | 1871,-0.005060814 124 | 1872,-0.005134319 125 | 1873,-0.005207219 126 | 1874,-0.005279485 127 | 1875,-0.005351089 128 | 1876,-0.005422006 129 | 1877,-0.005492206 130 | 1878,-0.005561663 131 | 1879,-0.005630349 132 | 1880,-0.005698237 133 | 1881,-0.005765299 134 | 1882,-0.005831508 135 | 1883,-0.005896837 136 | 1884,-0.005961257 137 | 1885,-0.006024742 138 | 1886,-0.006087264 139 | 1887,-0.006148795 140 | 1888,-0.006209309 141 | 1889,-0.006268777 142 | 1890,-0.006327172 143 | 1891,-0.006384468 144 | 1892,-0.006440635 145 | 1893,-0.006495647 146 | 1894,-0.006549477 147 | 1895,-0.006602097 148 | 1896,-0.006653479 149 | 1897,-0.006703597 150 | 1898,-0.006752422 151 | 1899,-0.006799927 152 | 1900,-0.006846085 153 | 1901,-0.006890961 154 | 1902,-0.006934897 155 | 1903,-0.006978285 156 | 1904,-0.007021517 157 | 1905,-0.007064985 158 | 1906,-0.007109082 159 | 1907,-0.0071542 160 | 1908,-0.007200732 161 | 1909,-0.007249069 162 | 1910,-0.007299604 163 | 1911,-0.007352729 164 | 1912,-0.007408837 165 | 1913,-0.007468319 166 | 1914,-0.007531569 167 | 1915,-0.007598978 168 | 1916,-0.007670938 169 | 1917,-0.007747842 170 | 1918,-0.007830083 171 | 1919,-0.007918052 172 | 1920,-0.008012142 173 | 1921,-0.008112744 174 | 1922,-0.008220253 175 | 1923,-0.008335058 176 | 1924,-0.008457554 177 | 1925,-0.008588132 178 | 1926,-0.008727184 179 | 1927,-0.008875103 180 | 1928,-0.009032281 181 | 1929,-0.009199111 182 | 1930,-0.009375984 183 | 1931,-0.009563293 184 | 1932,-0.00976143 185 | 1933,-0.009970788 186 | 1934,-0.010191759 187 | 1935,-0.010424734 188 | 1936,-0.010670107 189 | 1937,-0.01092827 190 | 1938,-0.011199614 191 | 1939,-0.011484533 192 | 1940,-0.011783418 193 | 1941,-0.012097003 194 | 1942,-0.012426993 195 | 1943,-0.012775271 196 | 1944,-0.013143715 197 | 1945,-0.013534208 198 | 1946,-0.01394863 199 | 1947,-0.01438886 200 | 1948,-0.014856781 201 | 1949,-0.015354273 202 | 1950,-0.015883215 203 | 1951,-0.016443684 204 | 1952,-0.017030095 205 | 1953,-0.017635752 206 | 1954,-0.018253962 207 | 1955,-0.01887803 208 | 1956,-0.019501261 209 | 1957,-0.020116961 210 | 1958,-0.020718437 211 | 1959,-0.021298993 212 | 1960,-0.021851934 213 | 1961,-0.022370523 214 | 1962,-0.0227436 215 | 1963,-0.02303158 216 | 1964,-0.023342085 217 | 1965,-0.023630211 218 | 1966,-0.024066597 219 | 1967,-0.024440219 220 | 1968,-0.024965723 221 | 1969,-0.025360148 222 | 1970,-0.025779455 223 | 1971,-0.026287689 224 | 1972,-0.026819272 225 | 1973,-0.027521318 226 | 1974,-0.027959028 227 | 1975,-0.02846046 228 | 1976,-0.029067469 229 | 1977,-0.029577101 230 | 1978,-0.030213099 231 | 1979,-0.030704475 232 | 1980,-0.03121343 233 | 1981,-0.032025999 234 | 1982,-0.0326587 235 | 1983,-0.033135419 236 | 1984,-0.033645647 237 | 1985,-0.034198859 238 | 1986,-0.034746917 239 | 1987,-0.035189741 240 | 1988,-0.035610447 241 | 1989,-0.036079488 242 | 1990,-0.036636641 243 | 1991,-0.03703515 244 | 1992,-0.037497788 245 | 1993,-0.037837532 246 | 1994,-0.038272814 247 | 1995,-0.038801246 248 | 1996,-0.039425583 249 | 1997,-0.039845329 250 | 1998,-0.04027482 251 | 1999,-0.040698754 252 | 2000,-0.04124466 253 | 2001,-0.041960207 254 | 2002,-0.042750552 255 | 2003,-0.043562352 256 | 2004,-0.04399098 257 | 2005,-0.044328604 258 | 2006,-0.044645451 259 | 2007,-0.04500011 260 | 2008,-0.045261435 261 | 2009,-0.045673371 262 | 2010,-0.046175723 263 | 2011,-0.046638091 264 | 2012,-0.047219841 265 | 2013,-0.047695311 266 | 2014,-0.04802544 267 | 2015,-0.048414367 268 | 2016,-0.048690667 269 | 2017,-0.048995987 270 | 2018,-0.049217109 271 | 2019,-0.05 272 | 2020,-0.050549341 273 | 2021,-0.050623851 274 | 2022,-0.050749437 275 | -------------------------------------------------------------------------------- /data/ozone/skeie_ozone_strat.csv: -------------------------------------------------------------------------------- 1 | Model,1920,1930,1940,1950,1960,1970,1980,1990,2000,2007,2010,2014,2017,2020 2 | BCC-ESM1,0.0076,0.0092,0.0143,0.0239,0.0359,0.0496,0.0367,0.0085,0.0147,0.0189,0.0207,,, 3 | CESM2(CAM6),0.0252,0.0272,0.0386,0.0396,0.046,0.0552,0.0473,0.0273,0.042,0.0553,0.0603,,, 4 | CESM2(WACCM6),0.0202,0.0221,0.04,0.0346,0.0446,0.0533,0.053,0.0282,0.0468,0.0456,0.0578,,, 5 | CNRM-CM6-1,-0.0063,-0.0109,-0.0127,-0.0144,-0.0186,-0.0148,-0.0407,-0.0686,-0.1044,-0.1136,-0.1126,,, 6 | CNRM-ESM2-1,0.0204,0.0161,0.0132,0.0055,-0.0132,-0.015,-0.0639,-0.135,-0.1696,-0.1651,-0.1613,,, 7 | E3SM-1-0,0.016,0.0214,0.0227,0.0344,0.049,0.05,0.0352,-0.0003,-0.0107,-0.0027,0.0012,,, 8 | GFDL-ESM4,0.0138,0.0126,0.0226,0.0315,0.036,0.0331,0.0145,-0.0397,-0.0209,-0.0206,-0.017,,, 9 | GISS-E2-1-H,0.0182,0.0122,-0.0003,0.0248,0.0233,0.0321,0.0913,0.1171,0.0737,0.0776,0.0898,,, 10 | MRI-ESM2-0,0.0072,0.0144,0.0123,0.0198,0.032,0.057,0.0668,0.0618,0.0474,0.0403,0.0411,,, 11 | UKESM1-0-LL,0.0092,-0.0028,0.0105,-0.0015,-0.0112,-0.0323,-0.0927,-0.1823,-0.2449,-0.2611,-0.2604,,, 12 | OsloCTM3,,,,0.0355,,0.0552,0.071,0.0819,0.0876,0.1102,0.1198,0.1318,0.1294,0.1359 13 | input4MIPs,0.0064,0.0097,0.014,0.0238,0.0347,0.046,0.0268,-0.0038,0.0047,0.0035,0.0048,,, 14 | -------------------------------------------------------------------------------- /data/ozone/skeie_ozone_trop.csv: -------------------------------------------------------------------------------- 1 | Model,1920,1930,1940,1950,1960,1970,1980,1990,2000,2007,2010,2014,2017,2020 2 | BCC-ESM1,0.0502,0.0665,0.0797,0.103,0.1486,0.2012,0.2367,0.2643,0.3086,0.3347,0.3404,,, 3 | CESM2(CAM6),0.0453,0.0613,0.0831,0.1049,0.1448,0.192,0.2327,0.2712,0.3233,0.3559,0.3642,,, 4 | CESM2(WACCM6),0.0442,0.0593,0.0841,0.1003,0.1452,0.1939,0.235,0.2822,0.3318,0.3518,0.3711,,, 5 | CNRM-CM6-1,-0.0005,0.0002,-0.0002,-0.002,0.0031,0.0115,0.0184,0.0234,0.022,0.0233,0.0243,,, 6 | CNRM-ESM2-1,0.0224,0.0251,0.0282,0.0296,0.0328,0.0411,0.045,0.0425,0.0425,0.0424,0.0437,,, 7 | E3SM-1-0,0.0522,0.0688,0.0851,0.1149,0.1555,0.2002,0.2391,0.2677,0.2882,0.3003,0.3039,,, 8 | GFDL-ESM4,0.0522,0.0625,0.086,0.1096,0.1621,0.2113,0.2463,0.2733,0.3116,0.328,0.3392,,, 9 | GISS-E2-1-H,0.0493,0.0674,0.0767,0.1137,0.1479,0.185,0.2209,0.2684,0.3266,0.3593,0.366,,, 10 | MRI-ESM2-0,0.057,0.0723,0.0857,0.1096,0.1592,0.2159,0.2661,0.3122,0.332,0.3397,0.3448,,, 11 | UKESM1-0-LL,0.0336,0.0493,0.0722,0.0785,0.1089,0.1453,0.1525,0.179,0.1834,0.1948,0.1964,,, 12 | OsloCTM3,,,,0.1172,,0.2241,0.2777,0.3173,0.3527,0.3987,0.4047,0.4209,0.4117,0.4274 13 | input4MIPs,0.0525,0.0695,0.0796,0.1095,0.1534,0.1976,0.237,0.2673,0.2964,0.3023,0.3064,,, 14 | -------------------------------------------------------------------------------- /data/random_seeds.json: -------------------------------------------------------------------------------- 1 | [361787535, 3382189392, 2936150180, 707023858, 4064192102, 1788390002, 2235905516, 296712135, 3118690159, 3691123710, 1696384569, 4240128011, 3337195192, 1106334286, 3796518430, 3384880079, 1992806054, 3526279365, 2849754190, 3026320733, 3724972221, 1381204814, 3440337735, 2341271141, 4147494306, 1440023361, 897539341, 1383159302, 915094998, 2710653295, 3710668173, 4161145143, 17209298, 3196029616, 2983440619, 1105612182, 3975324576, 674532550, 1584480647, 347846400, 2036249105, 690541615, 1513724622, 614115229, 3387964837, 2905975582, 4249506239, 302133772, 314215881, 3045347396, 4115208343, 3417773759, 293019587, 278676408, 3923396599, 4224164354, 888988287, 3714531496, 1034713088, 3646379879, 4118947237, 4081908681, 998295494, 2084793049, 1028841901, 1440674586, 1630528337, 3520624406, 2521982954, 3019732657, 3415097426, 2842669650, 3219300974, 2687496376, 3467176614, 696315941, 2054447651, 1024731552, 654605298, 3703840991, 3963959750, 3978117156, 1695002140, 2826974473, 2530581334, 894281472, 229042602, 877151719, 1852098057, 593169444, 2650874869, 4143373061, 4044992984, 3097420072, 740192447, 2652760205, 3132599115, 663575175, 2697680648, 1029104775] -------------------------------------------------------------------------------- /data/slcf_emissions/forster_et_al_2020/two_year_blip_emissions_ratios.csv: -------------------------------------------------------------------------------- 1 | ,SO2,CO,VOC,NOx,BC,OC,NH3 2 | 2019,1,1,1,1,1,1,1 3 | 2020,0.822387814,0.842996346,0.876959925,0.811722045,0.81850635,0.910002366,0.979294288 4 | 2021,0.836221968,0.883730285,0.907750081,0.853272003,0.84812657,0.929537754,0.993739167 5 | 2022,0.903055262,0.949931952,0.952586639,0.949082785,0.903294471,0.960604461,1.008963597 6 | 2023,0.927413095,0.971172458,0.966157747,0.987857429,0.918435100,0.965418506,1.018889025 7 | -------------------------------------------------------------------------------- /data/volcanic_stwv/indicators_stwv_irf_hansen_tp.csv: -------------------------------------------------------------------------------- 1 | ,tropopause_net 2 | 2004.0416666666667, 3 | 2004.125, 4 | 2004.2083333333333, 5 | 2004.2916666666665, 6 | 2004.3749999999998, 7 | 2004.458333333333, 8 | 2004.5416666666663, 9 | 2004.6249999999995,-64.24562534285823 10 | 2004.7083333333328,-69.15087331563646 11 | 2004.791666666666,-60.63601636319774 12 | 2004.8749999999993,-43.87601385568081 13 | 2004.9583333333326,-34.40823678694116 14 | 2005.0416666666658,1.4771303808329606 15 | 2005.124999999999,-6.790013710916384 16 | 2005.2083333333323,-14.897338767331803 17 | 2005.2916666666656,-16.280426786658012 18 | 2005.3749999999989,-12.533471617894065 19 | 2005.4583333333321,-38.02165321708668 20 | 2005.5416666666654,-55.98781264283144 21 | 2005.6249999999986,-64.25144556849031 22 | 2005.708333333332,-69.15938170891971 23 | 2005.7916666666652,-60.638384399317545 24 | 2005.8749999999984,-43.886029698898454 25 | 2005.9583333333317,-34.4227416568215 26 | 2006.041666666665,1.4546969779522385 27 | 2006.1249999999982,-6.816202393595518 28 | 2006.2083333333314,-14.918863144614107 29 | 2006.2916666666647,-16.295750085646034 30 | 2006.374999999998,-12.547466872965657 31 | 2006.4583333333312,-38.03220632516175 32 | 2006.5416666666645,-55.996647289681675 33 | 2006.6249999999977,-64.25905024152198 34 | 2006.708333333331,-69.16009448609282 35 | 2006.7916666666642,-60.63735282830089 36 | 2006.8749999999975,-43.86924148504403 37 | 2006.9583333333308,-34.400409905917655 38 | 2007.041666666664,1.473966794035988 39 | 2007.1249999999973,-6.7935264142691665 40 | 2007.2083333333305,-14.896746394859349 41 | 2007.2916666666638,-16.276563070732863 42 | 2007.374999999997,-12.529793031583864 43 | 2007.4583333333303,-38.01491920373533 44 | 2007.5416666666636,-55.98546674582474 45 | 2007.6249999999968,-64.24907288541951 46 | 2007.70833333333,-69.15332062426893 47 | 2007.7916666666633,-60.63572884863714 48 | 2007.8749999999966,-43.87775716473851 49 | 2007.9583333333298,-34.410471822048464 50 | 2008.041666666663,1.4657161465197532 51 | 2008.1249999999964,-6.80387113125488 52 | 2008.2083333333296,-14.909539056970118 53 | 2008.2916666666629,-16.28818375758513 54 | 2008.3749999999961,-12.541006728004305 55 | 2008.4583333333294,-38.02332219170452 56 | 2008.5416666666626,-55.996761597254164 57 | 2008.624999999996,-64.24984797707648 58 | 2008.7083333333292,-69.14901960050585 59 | 2008.7916666666624,-60.622251082053566 60 | 2008.8749999999957,-43.86319722276315 61 | 2008.958333333329,-34.40127763345879 62 | 2009.0416666666622,1.4791984326267027 63 | 2009.1249999999955,-6.79801426589691 64 | 2009.2083333333287,-14.90042842111285 65 | 2009.291666666662,-16.274582827352987 66 | 2009.3749999999952,-12.522468937602127 67 | 2009.4583333333285,-38.01168346081835 68 | 2009.5416666666617,-55.98179046559349 69 | 2009.624999999995,-64.23707438547143 70 | 2009.7083333333283,-69.13904036582386 71 | 2009.7916666666615,-60.619756486713726 72 | 2009.8749999999948,-43.86350342454125 73 | 2009.958333333328,-34.40146373192786 74 | 2010.0416666666613,1.4751432963656157 75 | 2010.1249999999945,-6.795719186393654 76 | 2010.2083333333278,-14.897987424299316 77 | 2010.291666666661,-16.272934649246764 78 | 2010.3749999999943,-12.522647707615505 79 | 2010.4583333333276,-38.008829935445135 80 | 2010.5416666666608,-55.97837880291755 81 | 2010.624999999994,-64.2332846803254 82 | 2010.7083333333273,-69.13727195543106 83 | 2010.7916666666606,-60.61793794070667 84 | 2010.8749999999939,-43.8537761294788 85 | 2010.9583333333271,-34.38548972803417 86 | 2011.0416666666604,1.495625121616797 87 | 2011.1249999999936,-6.764773387883707 88 | 2011.208333333327,-14.86538468832316 89 | 2011.2916666666601,-16.254277537558806 90 | 2011.3749999999934,-12.51097391558369 91 | 2011.4583333333267,-37.99953053490711 92 | 2011.54166666666,-55.96884067952274 93 | 2011.6249999999932,-64.22500542712618 94 | 2011.7083333333264,-69.12582053084148 95 | 2011.7916666666597,-60.6033802967749 96 | 2011.874999999993,-43.839780576227184 97 | 2011.9583333333262,-34.37402711895274 98 | 2012.0416666666595,1.4998193922270389 99 | 2012.1249999999927,-6.773536816552934 100 | 2012.208333333326,-14.879804006289902 101 | 2012.2916666666592,-16.26267803110818 102 | 2012.3749999999925,-12.510074311122054 103 | 2012.4583333333258,-37.9948759020333 104 | 2012.541666666659,-55.96139662760356 105 | 2012.6249999999923,-64.2168609774019 106 | 2012.7083333333255,-69.12093811063295 107 | 2012.7916666666588,-60.6057271846002 108 | 2012.874999999992,-43.84961421716807 109 | 2012.9583333333253,-34.386488900147555 110 | 2013.0416666666586,1.486474396035618 111 | 2013.1249999999918,-6.782272888845881 112 | 2013.208333333325,-14.885822798217106 113 | 2013.2916666666583,-16.262914787446277 114 | 2013.3749999999916,-12.515412462677403 115 | 2013.4583333333248,-38.00820402100453 116 | 2013.541666666658,-55.9835750342651 117 | 2013.6249999999914,-64.24028885246526 118 | 2013.7083333333246,-69.14184870641938 119 | 2013.7916666666579,-60.6218008892308 120 | 2013.8749999999911,-43.85755964381818 121 | 2013.9583333333244,-34.3857318670544 122 | 2014.0416666666576,1.4928728859552223 123 | 2014.124999999991,-6.770116434012465 124 | 2014.2083333333242,-14.878287346038405 125 | 2014.2916666666574,-16.262294281056484 126 | 2014.3749999999907,-12.515534389287978 127 | 2014.458333333324,-38.001627073578135 128 | 2014.5416666666572,-55.97243631542918 129 | 2014.6249999999905,-64.22967095227625 130 | 2014.7083333333237,-69.1354230678547 131 | 2014.791666666657,-60.61650800072928 132 | 2014.8749999999902,-43.85782624051572 133 | 2014.9583333333235,-34.3917173871437 134 | 2015.0416666666567,1.4823488742026143 135 | 2015.12499999999,-6.7811311576610365 136 | 2015.2083333333233,-14.885745347202572 137 | 2015.2916666666565,-16.269699477979884 138 | 2015.3749999999898,-12.522007338375914 139 | 2015.458333333323,-38.010771433067674 140 | 2015.5416666666563,-55.98241242569469 141 | 2015.6249999999895,-64.23801490859171 142 | 2015.7083333333228,-69.1361620127685 143 | 2015.791666666656,-60.608641285789105 144 | 2015.8749999999893,-43.8392655417569 145 | 2015.9583333333226,-34.36729366014657 146 | 2016.0416666666558,1.5055914306882983 147 | 2016.124999999989,-6.762889617825209 148 | 2016.2083333333223,-14.876177863776803 149 | 2016.2916666666556,-16.254356065423053 150 | 2016.3749999999889,-12.505119680418687 151 | 2016.4583333333221,-37.99385177354873 152 | 2016.5416666666554,-55.97050650153 153 | 2016.6249999999886,-64.23394815732902 154 | 2016.708333333322,-69.13722539848101 155 | 2016.7916666666551,-60.62014421924039 156 | 2016.8749999999884,-43.86604948836529 157 | 2016.9583333333217,-34.398017471864705 158 | 2017.041666666655,1.486314474052051 159 | 2017.1249999999882,-6.775407546122068 160 | 2017.2083333333214,-14.874334646362655 161 | 2017.2916666666547,-16.25098459043855 162 | 2017.374999999988,-12.49800044105163 163 | 2017.4583333333212,-37.98400821756664 164 | 2017.5416666666545,-55.956415144794704 165 | 2017.6249999999877,-64.21341388897935 166 | 2017.708333333321,-69.11498137494064 167 | 2017.7916666666542,-60.598903534285114 168 | 2017.8749999999875,-43.84339409931218 169 | 2017.9583333333208,-34.3801098951142 170 | 2018.041666666654,1.5050706638664337 171 | 2018.1249999999873,-6.769348637540901 172 | 2018.2083333333205,-14.878962158355762 173 | 2018.2916666666538,-16.257903245599152 174 | 2018.374999999987,-12.506233083721526 175 | 2018.4583333333203,-37.99537064100616 176 | 2018.5416666666536,-55.965599171634295 177 | 2018.6249999999868,-64.22712364547601 178 | 2018.70833333332,-69.12346463424271 179 | 2018.7916666666533,-60.60323366172767 180 | 2018.8749999999866,-43.8478691719248 181 | 2018.9583333333198, 182 | 2019.041666666653,1.4877536429013674 183 | 2019.1249999999864,-6.777168277720193 184 | 2019.2083333333196,-14.877178685009739 185 | 2019.2916666666529,-16.25256859414509 186 | 2019.3749999999861,-12.503473088425238 187 | 2019.4583333333194,-37.98840011010057 188 | 2019.5416666666526,-55.959213436302974 189 | 2019.624999999986,-64.21985432797302 190 | 2019.7083333333192,-69.12337293031337 191 | 2019.7916666666524,-60.60069085204972 192 | 2019.8749999999857,-43.84362271390498 193 | 2019.958333333319,-34.37723531928489 194 | 2020.0416666666522,1.5083938038356735 195 | 2020.1249999999854,-6.752824839130966 196 | 2020.2083333333187,-14.855358115311873 197 | 2020.291666666652,-16.238519182629517 198 | 2020.3749999999852,-12.497188647219815 199 | 2020.4583333333185,-37.98796607034487 200 | 2020.5416666666517,-55.95833816963949 201 | 2020.624999999985,-64.21807274045321 202 | 2020.7083333333183,-69.12295643673036 203 | 2020.7916666666515,-60.60192477297127 204 | 2020.8749999999848,-43.83527560674429 205 | 2020.958333333318,-34.3632047557831 206 | 2021.0416666666513,1.513465070648266 207 | 2021.1249999999845,-6.757754075677525 208 | 2021.2083333333178,-14.85915300461619 209 | 2021.291666666651,-16.23650359716899 210 | 2021.3749999999843,-12.491262974674754 211 | 2021.4583333333176,-37.97865503930211 212 | 2021.5416666666508,-55.95412546880911 213 | 2021.624999999984,-64.21005587459987 214 | 2021.7083333333173,-69.10667328786204 215 | 2021.7916666666506,-60.58011673893367 216 | 2021.8749999999839,-43.81424860230848 217 | 2021.9583333333171,-34.350641855242486 218 | 2022.0416666666504,1.5437651730654238 219 | 2022.1249999999836,-6.65550584064701 220 | 2022.208333333317,-14.749748458098281 221 | 2022.2916666666501,-16.124167086871154 222 | 2022.3749999999834,-12.367984426852246 223 | 2022.4583333333167,-37.85361562097137 224 | 2022.54166666665,-55.82517995709452 225 | 2022.6249999999832,-64.08817042947229 226 | 2022.7083333333164,-68.98863713514609 227 | 2022.7916666666497,-60.46040561919534 228 | 2022.874999999983,-43.68912994255291 229 | 2022.9583333333162,-34.204449844202 230 | 2023.0416666666495,1.687214267498689 231 | 2023.1249999999827,-6.579082068732305 232 | 2023.208333333316,-14.695226996841939 233 | 2023.2916666666492,-16.076324139892762 234 | 2023.3749999999825,-12.32735226867075 235 | 2023.4583333333157,-37.827890551912475 236 | 2023.541666666649,-55.80918151365566 237 | 2023.6249999999823,-64.06462077971125 238 | 2023.7083333333155,-68.96874142538175 239 | 2023.7916666666488,-60.43989525194203 240 | 2023.874999999982,-43.67348047016807 241 | 2023.9583333333153,-34.20289193371866 242 | 2024.0416666666486,1.6716748856954382 243 | 2024.1249999999818,-6.603772072460032 244 | 2024.208333333315,-14.721308303753972 245 | 2024.2916666666483,-16.114405445787895 246 | 2024.3749999999816,-12.384050479530316 247 | 2024.4583333333148,-37.8622243274784 248 | 2024.541666666648,-55.83735957959266 249 | 2024.6249999999814,-64.10449910095085 250 | 2024.7083333333146,-69.00802231869699 251 | 2024.7916666666479,-60.48453693054151 252 | 2024.8749999999811,-43.71841906289683 253 | 2024.9583333333144,-34.19577493396284 254 | -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: forcing-timeseries 2 | channels: 3 | - conda-forge 4 | - chrisroadmap 5 | dependencies: 6 | - climateforcing>=0.3.0 7 | - h5py 8 | - fair==2.2.2 9 | - iris 10 | - jupyter 11 | - jupytext 12 | - matplotlib 13 | - nco 14 | - netcdf4 15 | - numpy 16 | - openpyxl 17 | - pandas 18 | - pooch 19 | - scipy 20 | - tqdm 21 | -------------------------------------------------------------------------------- /jupytext.toml: -------------------------------------------------------------------------------- 1 | formats = "ipynb,py:percent" 2 | -------------------------------------------------------------------------------- /notebooks/02_invert-concentrations.py: -------------------------------------------------------------------------------- 1 | # --- 2 | # jupyter: 3 | # jupytext: 4 | # text_representation: 5 | # extension: .py 6 | # format_name: percent 7 | # format_version: '1.3' 8 | # jupytext_version: 1.17.0 9 | # kernelspec: 10 | # display_name: Python 3 (ipykernel) 11 | # language: python 12 | # name: python3 13 | # --- 14 | 15 | # %% [markdown] 16 | # # Calculate equivalent emissions from concentration time series 17 | 18 | # %% 19 | import os 20 | 21 | import matplotlib.pyplot as pl 22 | import numpy as np 23 | import pandas as pd 24 | from fair import FAIR, __version__ 25 | from fair.interface import fill, initialise 26 | 27 | # %% 28 | # leverage fair's concentrations to emissions routines and include all minor species in concentration time series 29 | f = FAIR(temperature_prescribed=True) 30 | f.define_time(1750, 2024, 1) 31 | f.define_scenarios(["historical"]) 32 | f.define_configs(["historical"]) 33 | species = [ 34 | 'HFC-134a', 35 | 'HFC-23', 36 | 'HFC-32', 37 | 'HFC-125', 38 | 'HFC-143a', 39 | 'HFC-152a', 40 | 'HFC-227ea', 41 | 'HFC-236fa', 42 | 'HFC-245fa', 43 | 'HFC-365mfc', 44 | 'HFC-43-10mee', 45 | 'NF3', 46 | 'SF6', 47 | 'SO2F2', 48 | 'CF4', 49 | 'C2F6', 50 | 'C3F8', 51 | 'c-C4F8', 52 | 'CFC-12', 53 | 'CFC-11', 54 | 'CFC-113', 55 | 'CFC-114', 56 | 'CFC-115', 57 | 'CFC-13', 58 | 'HCFC-22', 59 | 'HCFC-141b', 60 | 'HCFC-142b', 61 | 'CH3CCl3', 62 | 'CCl4', 63 | 'CH3Cl', 64 | 'CH3Br', 65 | 'CH2Cl2', 66 | 'CHCl3', 67 | 'Halon-1211', 68 | 'Halon-1301', 69 | 'Halon-2402', 70 | 'n-C4F10', 71 | 'n-C5F12', 72 | 'n-C6F14', 73 | 'i-C6F14', 74 | 'C7F16', 75 | 'C8F18', 76 | 'CFC-112', 77 | 'CFC-112a', 78 | 'CFC-113a', 79 | 'CFC-114a', 80 | 'HCFC-133a', 81 | 'HCFC-31', 82 | 'HCFC-124' 83 | ] 84 | 85 | # %% 86 | # since we only care about back-calculated emissions and not interactions or 87 | # climate effects, treat everything as an F-gas which is inert 88 | properties = { 89 | specie: { 90 | "type": "f-gas", 91 | "input_mode": "concentration", 92 | "greenhouse_gas": True, 93 | "aerosol_chemistry_from_emissions": False, 94 | "aerosol_chemistry_from_concentration": False, 95 | } 96 | for specie in species 97 | } 98 | 99 | # %% 100 | f.define_species(species, properties) 101 | f.allocate() 102 | 103 | # %% 104 | df_conc_obs=pd.read_csv('../output/ghg_concentrations_1750-2024.csv', index_col=0) 105 | 106 | # %% 107 | for year in range(1751, 1850): 108 | df_conc_obs.loc[year, :] = np.nan 109 | df_conc_obs.sort_index(inplace=True) 110 | df_conc_obs.interpolate(inplace=True) 111 | 112 | # %% 113 | for specie in species: 114 | f.concentration.loc[ 115 | dict( 116 | timebounds=slice(1751, 2025), 117 | specie=specie, 118 | scenario="historical", 119 | config="historical", 120 | ) 121 | ] = 0.5 * ( 122 | df_conc_obs.loc[1750:2023, specie].values 123 | + df_conc_obs.loc[1751:2024, specie].values 124 | ) 125 | f.concentration.loc[ 126 | dict( 127 | timebounds=1750, 128 | specie=specie, 129 | scenario="historical", 130 | config="historical", 131 | ) 132 | ] = df_conc_obs.loc[1750, specie] 133 | 134 | # %% 135 | mol_wt = { 136 | 'HFC-134a': 102.03, 137 | 'HFC-23': 78.014, 138 | 'HFC-32': 52.023, 139 | 'HFC-125': 120.02, 140 | 'HFC-143a': 84.04, 141 | 'HFC-152a': 66.05, 142 | 'HFC-227ea': 170.03, 143 | 'HFC-236fa': 152.04, 144 | 'HFC-245fa': 134.05, 145 | 'HFC-365mfc': 148.07, 146 | 'HFC-43-10mee': 252.05, 147 | 'NF3': 71.002, 148 | 'SF6': 146.06, 149 | 'SO2F2': 102.06, 150 | 'CF4': 88.004, 151 | 'C2F6': 138.01, 152 | 'C3F8': 188.02, 153 | 'c-C4F8': 200.03, 154 | 'CFC-12': 120.91, 155 | 'CFC-11': 137.36, 156 | 'CFC-113': 187.37, 157 | 'CFC-114': 170.92, 158 | 'CFC-115': 154.46, 159 | 'CFC-13': 104.46, 160 | 'HCFC-22': 86.47, 161 | 'HCFC-141b': 116.95, 162 | 'HCFC-142b': 100.49, 163 | 'CH3CCl3': 133.4, 164 | 'CCl4': 153.8, 165 | 'CH3Cl': 50.49, 166 | 'CH3Br': 94.94, 167 | 'CH2Cl2': 84.93, 168 | 'CHCl3': 119.37, 169 | 'Halon-1211': 165.36, 170 | 'Halon-1301': 148.91, 171 | 'Halon-2402': 259.82, 172 | 'n-C4F10': 238.03, 173 | 'n-C5F12': 288.03, 174 | 'n-C6F14': 338.04, 175 | 'i-C6F14': 338.04, 176 | 'C7F16': 388.05, 177 | 'C8F18': 438.06, 178 | 'CFC-112': 203.82, 179 | 'CFC-112a': 203.82, 180 | 'CFC-113a': 187.37, 181 | 'CFC-114a': 170.92, 182 | 'HCFC-133a': 118.48, 183 | 'HCFC-31': 68.48, 184 | 'HCFC-124': 136.47 185 | } 186 | 187 | # %% 188 | lifetime = { 189 | 'HFC-134a': 14, 190 | 'HFC-23': 228, 191 | 'HFC-32': 5.4, 192 | 'HFC-125': 30, 193 | 'HFC-143a': 51, 194 | 'HFC-152a': 1.6, 195 | 'HFC-227ea': 36, 196 | 'HFC-236fa': 213, 197 | 'HFC-245fa': 7.9, 198 | 'HFC-365mfc': 8.9, 199 | 'HFC-43-10mee': 17, 200 | 'NF3': 569, 201 | 'SF6': 3200, 202 | 'SO2F2': 36, 203 | 'CF4': 50000, 204 | 'C2F6': 10000, 205 | 'C3F8': 2600, 206 | 'c-C4F8': 3200, 207 | 'CFC-12': 102, 208 | 'CFC-11': 52, 209 | 'CFC-113': 93, 210 | 'CFC-114': 189, 211 | 'CFC-115': 540, 212 | 'CFC-13': 640, 213 | 'HCFC-22': 11.9, 214 | 'HCFC-141b': 9.4, 215 | 'HCFC-142b': 18, 216 | 'CH3CCl3': 5, 217 | 'CCl4': 32, 218 | 'CH3Cl': 0.9, 219 | 'CH3Br': 0.8, 220 | 'CH2Cl2': 0.493, 221 | 'CHCl3': 0.501, 222 | 'Halon-1211': 16, 223 | 'Halon-1301': 72, 224 | 'Halon-2402': 28, 225 | 'n-C4F10': 2600, 226 | 'n-C5F12': 4100, 227 | 'n-C6F14': 3100, 228 | 'i-C6F14': 3100, 229 | 'C7F16': 3000, 230 | 'C8F18': 3000, 231 | 'CFC-112': 63.6, 232 | 'CFC-112a': 52, 233 | 'CFC-113a': 55, 234 | 'CFC-114a': 105, 235 | 'HCFC-133a': 55, 236 | 'HCFC-31': 1.2, 237 | 'HCFC-124': 5.9 238 | } 239 | 240 | # %% 241 | for specie in species: 242 | f.species_configs['molecular_weight'].loc[dict(specie=specie)] = mol_wt[specie] 243 | f.species_configs['unperturbed_lifetime'].loc[dict(specie=specie)] = np.ones(4) * lifetime[specie] 244 | f.species_configs['partition_fraction'].loc[dict(specie=specie)] = [1, 0, 0, 0] 245 | 246 | # %% 247 | m = 1 / (5.1352 * f.species_configs["molecular_weight"] / 28.97) 248 | c1 = f.concentration[0, ...] 249 | 250 | # %% 251 | m 252 | 253 | # %% 254 | for specie in species: 255 | fill(f.species_configs["baseline_concentration"], 0, specie=specie) 256 | fill(f.species_configs["baseline_emissions"], 0, specie=specie) 257 | fill(f.species_configs['forcing_reference_concentration'], 0, specie=specie) 258 | fill(f.species_configs['iirf_airborne'], 0, specie=specie) 259 | fill(f.species_configs['iirf_temperature'], 0, specie=specie) 260 | fill(f.species_configs['iirf_uptake'], 0, specie=specie) 261 | c1 = f.concentration.loc[ 262 | dict( 263 | specie=specie, 264 | timebounds=1750, 265 | scenario="historical", 266 | config="historical", 267 | ) 268 | ] 269 | m = 1 / ( 270 | 5.1352 * f.species_configs["molecular_weight"].loc[dict(specie=specie)] / 28.97 271 | ) 272 | initialise(f.airborne_emissions, c1 / m, specie=specie) 273 | initialise(f.gas_partitions, np.array([c1 / m, 0, 0, 0]), specie=specie) 274 | 275 | # %% 276 | # don't calculate warming; we have to initialise it otherwise FaIR will complain about 277 | # NaNs 278 | fill(f.temperature, 0) 279 | 280 | # %% 281 | f.calculate_concentration_per_emission() 282 | 283 | # %% 284 | f.calculate_g() 285 | 286 | # %% 287 | f.calculate_iirf0() 288 | 289 | # %% 290 | f.run(progress=False) 291 | 292 | # %% 293 | f.species_configs 294 | 295 | # %% 296 | f.emissions.squeeze().to_pandas().to_csv('../output/ghg_equivalent_emissions.csv') 297 | 298 | # %% 299 | -------------------------------------------------------------------------------- /notebooks/03_biomass-emissions.py: -------------------------------------------------------------------------------- 1 | # --- 2 | # jupyter: 3 | # jupytext: 4 | # text_representation: 5 | # extension: .py 6 | # format_name: percent 7 | # format_version: '1.3' 8 | # jupytext_version: 1.16.6 9 | # kernelspec: 10 | # display_name: Python 3 (ipykernel) 11 | # language: python 12 | # name: python3 13 | # --- 14 | 15 | # %% [markdown] 16 | # # Download and process biomass burning emissions 17 | # 18 | # Note the 2024 emissions file is preliminary and not in the public domain. This is courtesy of Guido van der Werf. 19 | 20 | # %% 21 | import os 22 | import numpy as np 23 | import pandas as pd 24 | import pooch 25 | import h5py 26 | import matplotlib.pyplot as pl 27 | 28 | # %% 29 | hashes = { 30 | 'emissions_factors': '5f68c5c4ffdb7d81d3d2fefa662dcad9dd66f2b4097350a08a045523626383b2', 31 | 1997: '997f54a532cae524757c3b35808c10ae0f71ce231c213617cb34ba4b72968bb9', 32 | 1998: '36c13cdcec4f4698f3ab9f05bc83d2307252d89b81da5a14efd8e171148a6dc0', 33 | 1999: '5d0d18b09d9a76e305522c5b46a97bf3180d9301d1d3c6bfa5a4c838fb0fa452', 34 | 2000: 'ddbeff2326dded0e2248afd85c3ec7c84a36c6919711632e717d00985cd4ad6d', 35 | 2001: '1b684bf0b348e92a5d63ea660564f01439f69c4eb88eacd46280237d51ce5815', 36 | 2002: 'dcf624961512dbb93759248bc2b75d404b3be68f1f6fdcb01f0c7dc7f11a517a', 37 | 2003: '91d61b67d04b4a32d534f5d68ae1de7929f7ea75bb9d25d3273c4d5d75bda4d3', 38 | 2004: '931e063f796bf1f7d391d3f03342d2dd2ad1b234cb317f826adfab201003f4cd', 39 | 2005: '159e7704d14089496d051546c20b644a443308eeb7d79bf338226af2b4bdc2b7', 40 | 2006: 'a69d5bf6b8fa3324c2922aac07306ec6e488a850ca4f42d09a397cee30eebd4c', 41 | 2007: '1d7f77e6f7b13cc2a8ef9d26ecb9ea3d18e70cfeb8a47e7ecb26f9613888f937', 42 | 2008: 'bd3771b9b3032d459a79c0da449fdb497cd3400e0e07a0da6b41e930fc5d3e14', 43 | 2009: '36ea9b6036cd0ff3672502c3c04180bd209ddb192f86a2e791a2b896308bc5ff', 44 | 2010: '5b2d30b5ddc3e20c38c7971faf6791b313b1bbff22e8bc2b14ca7ea9079aa12c', 45 | 2011: 'fb19c001bef26ca23d07dd8978fd998f4692bdecdec5eb86b91d4b1ffb4a9aa7', 46 | 2012: '08033c90295bbc208fac426e01809b68cef62997668085b1e096d8a61ab43e9b', 47 | 2013: 'cf5249811af4b7099f886e61125dcd15c1127b6125392fe8358d3f0bf8ddb064', 48 | 2014: 'a293b4c6e03898a0dc184a082a37435673916a02ff02c06668152dcc4d4b8405', 49 | 2015: 'c043e96a421247afbeb6580fca0bcddf8160180b14d37b13122fc3110534b309', 50 | 2016: '2f3b54ff5698ba7f7aa2bb1d4b5e5f95124c0e0db32830ed94aa04bea2cbc2a6', 51 | 2017: 'a9859da022e97853efd1ce89664f31d1e8c0cddac2f35472d1e445d019f2a927', 52 | 2018: '4c08e36c2d7b1bc7b1020a15d36421bdddc68a4cc08ee9f1069d23b49f3cf34b', 53 | 2019: '8ac86c5d35e7ddfe9dbe6d71982ea54f6ee3b5a43d9ebbef19ef2957992587e6', 54 | 2020: '83b0ba1f5080cd2d19265c05e0c66f9563ad085381541f8c75d31e69ae839b99', 55 | 2021: '5bf68b48515b04fe0dbb493c9b2b6e564a5b206da4af499ef5492e4d835516c5', 56 | 2022: '46d1e90287c0c012eb1dbb8b7aa2d0c90bfb617b5c708da3c5a8ffa26ca22abb', 57 | 2023: 'a9c90c311080e3bd2671322369e38d71a478a518777abbea17d2430fb73424ea', 58 | } 59 | 60 | files = {} 61 | for year in range(1997, 2017): 62 | files[year] = pooch.retrieve( 63 | f"https://www.geo.vu.nl/~gwerf/GFED/GFED4/GFED4.1s_{year}.hdf5", 64 | f"{hashes[year]}" 65 | ) 66 | for year in range(2017, 2024): 67 | files[year] = pooch.retrieve( 68 | f"https://www.geo.vu.nl/~gwerf/GFED/GFED4/GFED4.1s_{year}_beta.hdf5", 69 | None 70 | ) 71 | 72 | # offline 2024 from Guido 73 | files[2024] = "../data/slcf_emissions/gfed/GFED4.1s_2024_beta.hdf5" 74 | 75 | files['emissions_factors'] = pooch.retrieve( 76 | "https://www.geo.vu.nl/~gwerf/GFED/GFED4/ancill/GFED4_Emission_Factors.txt", 77 | hashes['emissions_factors'] 78 | ) 79 | 80 | efs = pd.read_csv(files['emissions_factors'], comment='#', sep=r'\s+', index_col=0, header=None) 81 | efs.columns = ['SAVA', 'BORF', 'TEMF', 'DEFO', 'PEAT', 'AGRI'] 82 | efs.index.rename('SPECIE', inplace=True) 83 | 84 | 85 | efs.loc['MEK', 'SAVA'] 86 | sources=list(efs.columns) 87 | species=list(efs.index) 88 | 89 | months = '01','02','03','04','05','06','07','08','09','10','11','12' 90 | start_year = 1997 91 | end_year = 2024 92 | 93 | 94 | """ 95 | make table with summed DM emissions for each region, year, and source 96 | """ 97 | table = np.zeros((41, end_year - start_year + 1)) # region, year 98 | 99 | for year in range(start_year, end_year+1): 100 | print(year) 101 | f = h5py.File(files[year], 'r') 102 | 103 | 104 | if year == start_year: # these are time invariable 105 | grid_area = f['/ancill/grid_cell_area'][:] 106 | 107 | emissions = np.zeros((41, 720, 1440)) 108 | for month in range(12): 109 | # read in DM emissions 110 | string = '/emissions/'+months[month]+'/DM' 111 | DM_emissions = f[string][:] 112 | for ispec, specie in enumerate(species): 113 | for isrc, source in enumerate(sources): 114 | # read in the fractional contribution of each source 115 | string = '/emissions/'+months[month]+'/partitioning/DM_'+source 116 | contribution = f[string][:] 117 | # calculate emissions as the product of DM emissions (kg DM per 118 | # m2 per month), the fraction the specific source contributes to 119 | # this (unitless), and the emission factor (g per kg DM burned) 120 | emissions[ispec, ...] += DM_emissions * contribution * efs.loc[specie, source] 121 | #print(emissions[:, 88, 0]) 122 | 123 | 124 | # fill table with total values for the globe (row 15) or basisregion (1-14) 125 | #mask = np.ones((720, 1440)) 126 | table[:, year-start_year] = np.sum(grid_area[None, ...] * emissions, axis=(1,2)) 127 | 128 | table = table / 1E12 129 | 130 | # %% 131 | species=list(efs.index) 132 | gfed41s_df = pd.DataFrame(table.T, index=range(start_year, end_year+1), columns=species) 133 | gfed41s_df['NMVOC'] = gfed41s_df.loc[:,'C2H6':'C3H6O'].sum(axis=1) + gfed41s_df.loc[:,'C2H6S':].sum(axis=1) 134 | 135 | # %% 136 | gfed41s_df 137 | 138 | # %% 139 | os.makedirs('../output/', exist_ok=True) 140 | gfed41s_df.to_csv('../output/gfed4.1s_1997-2024.csv') 141 | 142 | # %% 143 | -------------------------------------------------------------------------------- /notebooks/04_contrails.py: -------------------------------------------------------------------------------- 1 | # --- 2 | # jupyter: 3 | # jupytext: 4 | # text_representation: 5 | # extension: .py 6 | # format_name: percent 7 | # format_version: '1.3' 8 | # jupytext_version: 1.16.6 9 | # kernelspec: 10 | # display_name: Python 3 (ipykernel) 11 | # language: python 12 | # name: python3 13 | # --- 14 | 15 | # %% [markdown] 16 | # # Contrails and contrail cirrus 17 | # 18 | # Basic method follows [Lee et al. (2020)](https://www.sciencedirect.com/science/article/pii/S1352231020305689). We extend beyond the end of the Lee assessment (2018) by using: 19 | # 20 | # - Lee et al. (2020); there is a supplementary Excel dataset that details all of the calculations, including the conversion between distance travelled and contrail radiative forcing (a constant value); the nub is therefore extracting the distance travelled from post-2018 data. We have fule consumption estimates as follows: 21 | # 22 | # - Sausen and Schumann (2000) for the 1940-1970 period. 23 | # 24 | # - IEA World Oil Statistics, Edition 2024, for World region and the sum of DAVGAS, DJETGAS and DJETKERO. We use data for 1971-2022. This is paywalled data so we do not include it in the repository. It is from https://www.iea.org/data-and-statistics/data-product/oil-information#world-oil-statistics. It is put into a CSV form for reading into this repository. 25 | # 26 | # - IATA (2024), aviation fuel use, table 7 of https://www.iata.org/en/iata-repository/publications/economic-reports/global-outlook-for-air-transport-december-2024/. This data is available to 2024 as an estimate and 2025 as a projection. It could fully replace the IEA data, but we continue to use IEA to follow Lee. Annoyingly, they decide to switch from litres to gallons in 2024 (why??? nobody uses imperial units now!) 27 | 28 | # %% [markdown] 29 | # In Lee et al. (2020), contrail ERF is calculated as: 30 | # 31 | # distance (km) * scale factor (1.17) * contrail forcing per km (see below) 32 | # 33 | # The scale factor converts horizontal distance travelled to 3D distance. 34 | # 35 | # Lee et al assume a constant fuel consumption (CO2 emission per fuel burn) of 3.16 kgCO2 per kg fuel 36 | # 37 | # From Wiki (https://en.wikipedia.org/wiki/Aviation_fuel) I get 0.81 kg/L (accessed 2024-02-27) 38 | # 39 | # RPKs, ASKs and distances from https://www.airlines.org/dataset/world-airlines-traffic-and-capacity/ for 1950-2022 40 | 41 | # %% [markdown] 42 | # ## recipe 43 | # 1. read in Lee spreadsheet 44 | # 2. derive contrails per kilogram fuel burn 45 | # 3. calculate IEA factor offline and apply - read in this time series 46 | # 4. apply factor to IATA data 47 | # 5. check overlaps and construct time series 48 | 49 | # %% 50 | import numpy as np 51 | import pandas as pd 52 | import matplotlib.pyplot as pl 53 | 54 | # %% 55 | kg_co2_per_kg_fuel = 3.16 56 | 57 | # %% 58 | us_gallons_to_litres = 3.78541 59 | 60 | # %% 61 | iata = pd.DataFrame(np.array([96, 52, 62, 76, 92, 101, 107]) * 1e9 * us_gallons_to_litres, index=pd.Index(np.arange(2019, 2026), name='year'), columns=['Aviation fuel, litres']) 62 | 63 | # %% 64 | iata 65 | 66 | # %% 67 | # according to Wiki, aviation fuel has a density of around 0.81 kg/L, so convert to kilograms 68 | kg_per_litre = 0.81 69 | iata['Aviation fuel, kg'] = iata['Aviation fuel, litres'] * kg_per_litre 70 | iata['Aviation emissions, MtCO2/yr'] = iata['Aviation fuel, kg'] * kg_co2_per_kg_fuel / 1e9 71 | iata 72 | 73 | # %% 74 | iea = pd.read_csv('../data/contrails/OIWORLD-2024.csv', index_col="year") 75 | iea['Aviation fuel, kg'] = iea['Aviation fuel, kilotons'] * 1e6 76 | iea['Aviation emissions, MtCO2/yr'] = iea['Aviation fuel, kg'] * kg_co2_per_kg_fuel / 1e9 77 | iea 78 | 79 | # %% 80 | sausen_schumann = pd.read_csv('../data/contrails/sausen_schumann_co2.csv', index_col=0) 81 | 82 | # %% 83 | sausen_schumann 84 | 85 | # %% 86 | # make a column in CO2 units, which is comparible directly to Lee et al. 87 | sausen_schumann['Aviation emissions, MtCO2/yr'] = sausen_schumann['aviation_emissions_teragrams_carbon'] * 3.664 88 | sausen_schumann 89 | 90 | # %% 91 | lee2020 = pd.read_csv('../data/contrails/lee2020_clean_data.csv', index_col=0) 92 | lee2020.rename(columns={'CO2 Tg/yr': 'Aviation emissions, MtCO2/yr'}, inplace=True) 93 | 94 | # %% 95 | pl.plot(sausen_schumann['Aviation emissions, MtCO2/yr']) 96 | pl.plot(iea['Aviation emissions, MtCO2/yr']) 97 | pl.plot(lee2020['Aviation emissions, MtCO2/yr']) 98 | pl.plot(iata['Aviation emissions, MtCO2/yr']) 99 | 100 | # %% 101 | constructed_emissions = pd.DataFrame(np.ones(95)*np.nan, index=pd.Index(np.arange(1930, 2025), name='year'), columns=['MtCO2/yr']) 102 | 103 | # %% 104 | constructed_emissions.loc[1940:1970, 'MtCO2/yr'] = sausen_schumann.loc[1940:1970, 'Aviation emissions, MtCO2/yr'] 105 | constructed_emissions.loc[1971:2022, 'MtCO2/yr'] = iea.loc[1971:2022, 'Aviation emissions, MtCO2/yr'] 106 | constructed_emissions.loc[2023:2024, 'MtCO2/yr'] = iata.loc[2023:2024, 'Aviation emissions, MtCO2/yr'] 107 | constructed_emissions.loc[1930, 'MtCO2/yr'] = 0 108 | constructed_emissions.interpolate(inplace=True) 109 | 110 | # %% 111 | pl.plot(constructed_emissions) 112 | 113 | # %% 114 | pl.plot(lee2020['Scaled distance million km']/lee2020['Aviation emissions, MtCO2/yr']/ 1000) 115 | pl.title('Fuel efficiency') 116 | pl.ylabel('km / kgCO2') 117 | 118 | # %% 119 | constructed_efficiency = pd.DataFrame(np.ones(95) * np.nan, index=pd.Index(np.arange(1930, 2025), name='year'), columns=['km / kgCO2']) 120 | constructed_efficiency.loc[1990:2018, 'km / kgCO2'] = lee2020['Scaled distance million km']/lee2020['Aviation emissions, MtCO2/yr']/ 1000 121 | #constructed_efficiency[2019] = 122 | # For 2019 to 2022, take estimates of distance from https://www.airlines.org/dataset/world-airlines-traffic-and-capacity/ 123 | # scale up by 1.17 as in Lee 124 | constructed_efficiency.loc[2019, 'km / kgCO2'] = 1.17 * 56199 / iea.loc[2019, 'Aviation emissions, MtCO2/yr'] / 1000 125 | constructed_efficiency.loc[2020, 'km / kgCO2'] = 1.17 * 28013 / iea.loc[2020, 'Aviation emissions, MtCO2/yr'] / 1000 126 | constructed_efficiency.loc[2021, 'km / kgCO2'] = 1.17 * 33705 / iea.loc[2021, 'Aviation emissions, MtCO2/yr'] / 1000 127 | constructed_efficiency.loc[2022, 'km / kgCO2'] = 1.17 * 42801 / iea.loc[2022, 'Aviation emissions, MtCO2/yr'] / 1000 128 | 129 | # for 2023 and 2024, we have no better means than using 2022 data. But really, we'd expect efficiency to improve, since there were probably 130 | # fewer half-empty planes after COVID. 131 | constructed_efficiency.loc[2023:2024, 'km / kgCO2'] = constructed_efficiency.loc[2022, 'km / kgCO2'] 132 | 133 | # %% [markdown] 134 | # Now try to port this backwards 135 | # 136 | # Lee et al: "Aviation transport efficiency has improved by approximately eightfold since 1960". I know this is based on RPKs rather than actual kilometers. 137 | # 138 | # According to https://www.airlines.org/dataset/world-airlines-traffic-and-capacity/, capacity increased from about 60% in 1960 to about 80% in 2018/2019. 139 | # 140 | # So 1/3 of the improvement is due to increasing capacity, and 2/3 * 8 is due to aircraft efficiency. 141 | 142 | # %% 143 | constructed_efficiency.loc[1990, 'km / kgCO2'] / constructed_efficiency.loc[2018, 'km / kgCO2'] 144 | 145 | # %% 146 | constructed_efficiency.loc[1960, 'km / kgCO2'] = constructed_efficiency.loc[2018, 'km / kgCO2'] / (8 * 2/3) 147 | constructed_efficiency.loc[1930, 'km / kgCO2'] = constructed_efficiency.loc[1960, 'km / kgCO2'] 148 | #constructed_efficiency.loc[1989, 'km / kgCO2'] = constructed_efficiency.loc[2018, 'km / kgCO2'] * 9/16 149 | constructed_efficiency.interpolate(inplace=True) 150 | 151 | # %% 152 | pl.plot(constructed_efficiency) 153 | 154 | # %% 155 | constructed_efficiency 156 | 157 | # %% 158 | constructed_scaled_distance = pd.DataFrame(np.ones(95) * np.nan, index=pd.Index(np.arange(1930, 2025), name='year'), columns=['Scaled distance, km']) 159 | constructed_scaled_distance.loc[1930:2024, 'Scaled distance, km'] = (constructed_emissions.values * constructed_efficiency.values).squeeze() * 1e9 160 | pl.plot(constructed_scaled_distance) 161 | 162 | # %% 163 | lee_conversion_km_to_contrail_erf = 9.3595037832885E-13 # cell J73 of supplementary Excel, divide by 1000 to convert milliwatts to watts 164 | 165 | # %% 166 | # Do we keep the 2018 value in Lee (0.0574) by scaling this, or use the slightly newer data from IEA? TBF it is the same to 3 d.p. 167 | constructed_scaled_distance.loc[2018, 'Scaled distance, km'] * lee_conversion_km_to_contrail_erf 168 | 169 | # %% 170 | # contrail forcing ERF 171 | contrails_erf = pd.DataFrame(np.ones(95) * np.nan, index=pd.Index(np.arange(1930, 2025), name='year'), columns=['Contrails ERF, W/m2']) 172 | contrails_erf.loc[1930:2024, 'Contrails ERF, W/m2'] = (constructed_scaled_distance * lee_conversion_km_to_contrail_erf).values.squeeze() 173 | 174 | pl.plot(contrails_erf) 175 | 176 | # %% 177 | contrails_erf.to_csv('../output/contrails_ERF_1930-2024.csv') 178 | 179 | # %% 180 | -------------------------------------------------------------------------------- /notebooks/07_cams-slcfs.py: -------------------------------------------------------------------------------- 1 | # --- 2 | # jupyter: 3 | # jupytext: 4 | # text_representation: 5 | # extension: .py 6 | # format_name: percent 7 | # format_version: '1.3' 8 | # jupytext_version: 1.16.6 9 | # kernelspec: 10 | # display_name: Python 3 (ipykernel) 11 | # language: python 12 | # name: python3 13 | # --- 14 | 15 | # %% [markdown] 16 | # # Process CAMS SLCF emissions and compare them to CEDS 17 | # 18 | # Attempt to compare the datasets (page 21 of https://atmosphere.copernicus.eu/sites/default/files/publications/CAMS261_2021SC1_D6.1.2-2022_202306_Docu_v1_APPROVED_Ver1.pdf) 19 | # 20 | # Things in CAMS that are not in CEDS: 21 | # - agricultural waste burning in their sectoral totals 22 | # - the EDGAR sector "nfe" is part of industrial processes in CAMS, and according to the document is not included in CEDS. Because it is not separated out in CAMS, we can't isolate it from the total. However, nfe stands for non-ferrous metal production (https://essd.copernicus.org/preprints/essd-2023-306/essd-2023-306.pdf), which should correspond to CEDS sectors 2C3 and 2C4. 23 | # 24 | # Things in CEDS that are not in CAMS: 25 | # - aviation; this is a separate dataset CAMS-GLOB-AIR. However, it doesn't seem that reliable, since there is no dip in emissions for COVID. The dataset also ends in 2022. 26 | # - section 6 emissions ("Other"); but they seem to be zero for every species in CEDS 27 | # - According to the comparison on p21 of the CAMS document, international shipping is not included in CAMS-GLOB-ANT. But looking at the 2019-2020 jump in SO2 and the shipping totals, I believe it is. So I'll treat CAMS as if it (now at least) includes international shipping 28 | # 29 | # **Therefore, my hypothesis is for the fairest, most reliable, most consistent comparison that we should compare total minus aviation in CEDS to total minus agricultural waste burning in CAMS.** 30 | # 31 | # From this comparison, we see that there is still quite a lot of disagreement between the datasets; but we use CAMS to extend CEDS by taking the ratio of CAMS in 2024 to 2023. 32 | # 33 | # **CEDS 2023 is now available and public-ish: the data is from Steve Smith's dropbox; Zenodo DOI will be forthcoming** 34 | # 35 | # I'm using the processed data from ScenarioMIP prepared by Marco Gambarini (the totals are basically identical to doing the following steps, but Marco has retained the sectoral detail). Marco adds aviation in, so I take it back out. This file is processed by the IIASA Emissions Historical time series at 36 | # 37 | # https://github.com/iiasa/emissions_harmonization_historical/blob/main/notebooks/0150_CAMS.py 38 | # 39 | # Unfortunately there doesn't seem to be a way to automate downloads of CAMS data, so if you want to grab it: 40 | # 41 | # - https://eccad.sedoo.fr/#/data 42 | # - select CAMS-GLOB_ANT v6.2 43 | # - select species 44 | # - select Sum Sectors and Agricultural Waste Burning 45 | 46 | # %% 47 | import numpy as np 48 | import pandas as pd 49 | import matplotlib.pyplot as pl 50 | 51 | import warnings 52 | 53 | # %% 54 | species = ['SO2', 'BC', 'OC', 'NMVOC', 'NOx', 'NH3', 'CO', 'CH4', 'N2O'] 55 | 56 | # %% 57 | cams_raw_df = pd.read_csv('../data/slcf_emissions/cams/cams_world_0010.csv') 58 | cams_raw_df 59 | 60 | # %% 61 | # Take out agricultural waste burning (in GFED, double counting) and aviation (not complete time series) from Marco's data 62 | cams_df = pd.DataFrame() 63 | for specie in species: 64 | cams_df[specie] = ( 65 | cams_raw_df[cams_raw_df['variable'].str.contains(f'|{specie}|', regex=False)].loc[:, '2000':].sum() - 66 | cams_raw_df[cams_raw_df['variable']==f'Emissions|{specie}|Agricultural Waste Burning'].loc[:, '2000':].sum() - 67 | cams_raw_df[cams_raw_df['variable']==f'Emissions|{specie}|Aviation'].loc[:, '2000':].sum() 68 | ) 69 | 70 | # we know that cams NOx is NO units so put in NO2 units 71 | cams_df['NOx'] = cams_df['NOx'] * 46.006 / 30.006 72 | cams_df 73 | 74 | # %% 75 | # cams_df = pd.DataFrame() 76 | # species_subs = {specie: specie for specie in species} 77 | # species_subs['NMVOC'] = 'NMV' 78 | # with warnings.catch_warnings(): 79 | # warnings.simplefilter('ignore') 80 | # emissions_annual = {} 81 | # for specie in species: 82 | # emissions_monthly = pd.read_csv(f'../data/slcf_emissions/cams/cams-glob-ant-anthro-{species_subs[specie].lower()}.csv', parse_dates=['Date']) 83 | 84 | # cams_df[specie] = ( 85 | # emissions_monthly.groupby(emissions_monthly.Date.dt.year)[' Sum Sectors'].sum() - 86 | # emissions_monthly.groupby(emissions_monthly.Date.dt.year)[' Agricultural waste burning'].sum() 87 | # ) 88 | 89 | # # we know that cams NOx is NO units so put in NO2 units 90 | # cams_df['NOx'] = cams_df['NOx'] * 46.006 / 30.006 91 | # cams_df 92 | 93 | # %% 94 | ceds_df = pd.DataFrame(columns = species, index=np.arange(2000, 2024, dtype=int)) 95 | ceds_no_aviation_df = pd.DataFrame(columns = species, index=np.arange(2000, 2024, dtype=int)) 96 | 97 | for specie in species: 98 | df_ceds_in = pd.read_csv( 99 | f'../data/slcf_emissions/ceds/v20250318/{specie}_CEDS_global_emissions_by_sector_v_2025_03_18.csv' 100 | ) 101 | total = df_ceds_in.sum()['X2000':].values 102 | aviation = df_ceds_in[df_ceds_in['sector'].isin(('1A3ai_International-aviation', '1A3aii_Domestic-aviation'))].sum()['X2000':].values 103 | ceds_df.loc[:, specie] = 0.001 * total 104 | ceds_no_aviation_df.loc[:, specie] = 0.001 * (total - aviation) 105 | 106 | # %% 107 | ceds_df 108 | 109 | # %% 110 | ceds_no_aviation_df 111 | 112 | # %% 113 | fig, ax = pl.subplots(3, 3, figsize=(9, 9)) 114 | for ispec, specie in enumerate(species): 115 | irow = ispec // 3 116 | icol = ispec % 3 117 | # ax[irow,icol].plot(np.arange(2000, 2026), cams_df.loc[:, specie], label='CAMS') 118 | ax[irow,icol].plot(np.arange(2000, 2026), cams_df.loc[:, specie], label="CAMS (excl. AIR & AWB)") 119 | # ax[irow,icol].plot(np.arange(2000, 2023), ceds_df.loc[:, specie], label='CEDS') 120 | ax[irow,icol].plot(np.arange(2000, 2024), ceds_no_aviation_df.loc[:, specie], label='CEDS (excl. AIR)') 121 | if specie in ['BC', 'OC']: 122 | ax[irow,icol].plot(np.arange(2000, 2026), 1.4 * cams_df.loc[:, specie], label='CAMS * 1.4') 123 | if specie in ['NH3']: 124 | ax[irow,icol].plot(np.arange(2000, 2026), 17/14 * cams_df.loc[:, specie], label='CAMS * 17/14') 125 | ax[irow,icol].set_title(specie) 126 | ax[irow,icol].set_ylim(0, 1.05 * np.max((cams_df.loc[:, specie].max(), ceds_df.loc[:, specie].max()))) 127 | ax[irow,icol].legend(); 128 | pl.tight_layout() 129 | pl.savefig('../plots/cams_ceds.png') 130 | pl.savefig('../plots/cams_ceds.pdf') 131 | 132 | # %% 133 | cams_df.to_csv('../output/cams_2000-2025.csv') 134 | 135 | # %% 136 | -------------------------------------------------------------------------------- /notebooks/08_slcf-emissions.py: -------------------------------------------------------------------------------- 1 | # --- 2 | # jupyter: 3 | # jupytext: 4 | # text_representation: 5 | # extension: .py 6 | # format_name: percent 7 | # format_version: '1.3' 8 | # jupytext_version: 1.16.6 9 | # kernelspec: 10 | # display_name: Python 3 (ipykernel) 11 | # language: python 12 | # name: python3 13 | # --- 14 | 15 | # %% [markdown] 16 | # # SLCF emissions 17 | # 18 | # Fossil and industrial from CEDS (1750-2022), from CEDS v2024.07.08, available at https://doi.org/10.5281/zenodo.12803197 19 | # 20 | # Extend with CAMS for 2023 and 2024 based on CAMS ratio to 2022 emissions. For the fairest comparison, exclude aviation from CEDS when doing the scaling. **May also be some other sectoral mismatches we're not aware of - should probably keep in touch with Lara on this** 21 | # 22 | # Biomass burning from GFED (1997-2024), extended backwards to 1750 using BB4CMIP **TODO: replace with the CMIP7 pipeline**, which is part of the CMIP6 database and taken here from RCMIP. We need to convert the unit of NOx emissions from biomass to NO2 from the RCMIP data, as GFED reports in units of NO. 23 | 24 | # %% 25 | import os 26 | import numpy as np 27 | import pandas as pd 28 | import pooch 29 | import h5py 30 | import matplotlib.pyplot as pl 31 | 32 | # %% 33 | species = ['BC', 'OC', 'SO2', 'NOx', 'CO', 'NMVOC', 'NH3', 'CH4', 'N2O'] 34 | 35 | # %% 36 | slcf_df = pd.DataFrame(columns = species, index=np.arange(1750, 2025, dtype=int)) 37 | ceds_df = pd.DataFrame(columns = species, index=np.arange(1750, 2024, dtype=int)) 38 | ceds_no_aviation_df = pd.DataFrame(columns = species, index=np.arange(1750, 2024, dtype=int)) 39 | 40 | # %% 41 | first_ceds_year = {specie: 1750 for specie in species} 42 | first_ceds_year['CH4'] = 1970 43 | first_ceds_year['N2O'] = 1970 44 | for specie in species: 45 | df_ceds_in = pd.read_csv( 46 | f'../data/slcf_emissions/ceds/v20250318/{specie}_CEDS_global_emissions_by_sector_v_2025_03_18.csv' 47 | ) 48 | total = df_ceds_in.sum()[f'X{first_ceds_year[specie]}':].values 49 | aviation = df_ceds_in[df_ceds_in['sector'].isin(('1A3ai_International-aviation', '1A3aii_Domestic-aviation'))].sum()[f'X{first_ceds_year[specie]}':].values 50 | ceds_df.loc[first_ceds_year[specie]:, specie] = 0.001 * total 51 | ceds_no_aviation_df.loc[first_ceds_year[specie]:, specie] = 0.001 * (total - aviation) 52 | 53 | # %% 54 | ceds_df 55 | 56 | # %% 57 | ceds_no_aviation_df 58 | 59 | # %% 60 | gfed41s_df = pd.read_csv('../output/gfed4.1s_1997-2024.csv', index_col=0) 61 | 62 | # %% 63 | gfed41s_df 64 | 65 | # %% 66 | cams_df = pd.read_csv('../output/cams_2000-2025.csv', index_col=0) 67 | cams_df 68 | 69 | # %% 70 | rcmip_emissions_file = pooch.retrieve( 71 | url="doi:10.5281/zenodo.4589756/rcmip-emissions-annual-means-v5-1-0.csv", 72 | known_hash="md5:4044106f55ca65b094670e7577eaf9b3", 73 | ) 74 | 75 | # RCMIP 76 | rcmip_in_df = pd.read_csv(rcmip_emissions_file) 77 | 78 | # %% 79 | gfed_convert = {specie: 1 for specie in species} 80 | gfed_convert['NOx'] = 46.006/30.006 # molecular weight ratio of NO2 to NO 81 | rcmip_specie = {specie: specie for specie in species} 82 | rcmip_specie['NMVOC'] = 'VOC' 83 | rcmip_specie['SO2'] = 'Sulfur' 84 | 85 | # %% 86 | # here we keep aviation in CEDS, and out of CAMS, but this assumes that aviation scales with other sectors 87 | # it is a small fraction of the total, so is not an assumption that will cause big problems 88 | cams_df.loc[2023:] / cams_df.loc[2022] * ceds_df.loc[2022] 89 | 90 | # %% 91 | gfed41s_df.loc[2024, specie] * gfed_convert[specie] 92 | 93 | # %% 94 | for specie in species: 95 | rcmip_df = rcmip_in_df.loc[ 96 | (rcmip_in_df['Scenario']=='historical')& 97 | (rcmip_in_df['Region']=='World')& 98 | (rcmip_in_df['Variable'].str.startswith(f'Emissions|{rcmip_specie[specie]}|')), 99 | :] 100 | #ceds_rcmip = [f'Emissions|{rcmip_specie}|MAGICC AFOLU|Agriculture', f'Emissions|{rcmip_specie}|MAGICC Fossil and Industrial'] 101 | uva_rcmip = [ 102 | f'Emissions|{rcmip_specie[specie]}|MAGICC AFOLU|Agricultural Waste Burning', 103 | f'Emissions|{rcmip_specie[specie]}|MAGICC AFOLU|Forest Burning', 104 | f'Emissions|{rcmip_specie[specie]}|MAGICC AFOLU|Grassland Burning', 105 | f'Emissions|{rcmip_specie[specie]}|MAGICC AFOLU|Peat Burning' 106 | ] 107 | 108 | 109 | slcf_df.loc[first_ceds_year[specie]:1996, specie] = ( 110 | ceds_df.loc[first_ceds_year[specie]:1996, specie] + ( 111 | rcmip_df.loc[rcmip_df['Variable'].isin(uva_rcmip), f'{first_ceds_year[specie]}':'1996'] 112 | .interpolate(axis=1) 113 | .sum() 114 | .values. 115 | squeeze() * gfed_convert[specie] 116 | ) 117 | ) 118 | 119 | slcf_df.loc[1997:2023, specie] = ( 120 | ceds_df.loc[1997:2023, specie] + 121 | gfed41s_df.loc[1997:2023, specie].values.squeeze() * gfed_convert[specie] 122 | ) 123 | 124 | # assume emissions for 2024 in CEDS based on 2023 CEDS/CAMS ratio applied to 2024 in CAMS 125 | slcf_df.loc[2024, specie] = ( 126 | cams_df.loc[2024, specie] / cams_df.loc[2023, specie] * ceds_df.loc[2023, specie] + 127 | gfed41s_df.loc[2024, specie] * gfed_convert[specie] 128 | ) 129 | 130 | # %% 131 | fig, ax = pl.subplots(3, 3, figsize=(9, 9)) 132 | for ispec, specie in enumerate(species): 133 | irow = ispec // 3 134 | icol = ispec % 3 135 | ax[irow,icol].plot(slcf_df.loc[2000:2024, specie]) 136 | ax[irow,icol].set_title(specie) 137 | 138 | # %% 139 | slcf_df 140 | 141 | # %% 142 | os.makedirs('../output', exist_ok=True) 143 | slcf_df.to_csv('../output/slcf_emissions_1750-2024.csv') 144 | 145 | # %% 146 | -------------------------------------------------------------------------------- /notebooks/09_mls-data.py: -------------------------------------------------------------------------------- 1 | # --- 2 | # jupyter: 3 | # jupytext: 4 | # text_representation: 5 | # extension: .py 6 | # format_name: percent 7 | # format_version: '1.3' 8 | # jupytext_version: 1.16.6 9 | # kernelspec: 10 | # display_name: Python 3 (ipykernel) 11 | # language: python 12 | # name: python3 13 | # --- 14 | 15 | # %% [markdown] 16 | # # Prepare and understand MLS stratospheric water vapour 17 | # 18 | # We will use this as estimate for Hunga Tonga positive forcing. 19 | # 20 | # To obtain the data, go to https://search.earthdata.nasa.gov/search?q=MLS%20H2O&fi=MLS&fl=3%2B-%2BGridded%2BObservations. Select the MLS/Aura Level 3 Monthly Binned Water Vapor (H2O) Mixing Ratio on Assorted Grids V005 (ML3MBH2O). Download this data to ../data/mls. 21 | # 22 | # **update 13.02.2025: 2024 data not yet ready on monthly basis, but daily data available, should use this?** 23 | # 24 | # We are missing day 127 and day 366 25 | 26 | # %% 27 | from netCDF4 import Dataset 28 | import matplotlib.pyplot as pl 29 | import numpy as np 30 | import glob 31 | from fair.earth_params import mass_atmosphere 32 | import xarray as xr 33 | 34 | # %% 35 | data = np.ones((21*12, 39)) * np.nan 36 | 37 | # %% 38 | for year in range(2004, 2024): 39 | nc = Dataset(glob.glob(f'../data/mls/MLS-Aura_L3MB-H2O_*_{year}.nc')[0]) 40 | data[(year-2004)*12:(year-2004)*12+12, :] = nc.groups['H2O PressureZM'].variables['value'][:, 10:49, 15:30].mean(axis=2) 41 | plev = nc.groups['H2O PressureZM'].variables['lev'][10:49] 42 | nc.close() 43 | 44 | # %% 45 | data_2024 = np.ones((366, 39)) * np.nan 46 | for day in range(1, 367): 47 | if day in [127, 366]: 48 | continue 49 | nc = Dataset(glob.glob(f'../data/mls/MLS-Aura_L3DB-H2O_*_2024d{day:03}.nc')[0]) 50 | data_2024[day-1, :] = nc.groups['H2O PressureZM'].variables['value'][0, 10:49, 15:30].mean(axis=1) 51 | plev = nc.groups['H2O PressureZM'].variables['lev'][10:49] 52 | nc.close() 53 | 54 | # %% 55 | data_2024[data_2024==0] = np.nan 56 | 57 | # %% 58 | month_length = np.array([31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]) 59 | month_bounds = np.concat(([0], np.cumsum(month_length))) 60 | month_start = month_bounds[:-1] 61 | month_end = month_bounds[1:] 62 | month_end 63 | 64 | # %% 65 | for month in range(12): 66 | data[240+month, :] = np.nanmean(data_2024[month_start[month]:month_end[month], :], axis=0) 67 | 68 | # %% 69 | X, Y = np.meshgrid(np.arange(2004+1/24, 2025, 1/12), plev) 70 | 71 | # %% 72 | data[data==0] = np.nan 73 | 74 | # %% 75 | fig, ax = pl.subplots(figsize=(7, 3)) 76 | pl.contourf( 77 | np.arange(2004+1/24, 2025, 1/12), 78 | plev[:], 79 | data.T 80 | ) 81 | ax = pl.gca() 82 | ax.set_ylim(ax.get_ylim()[::-1]) 83 | ax.set_xlim(2004, 2025) 84 | ax.set_ylabel("Pressure (hPa)") 85 | ax.set_xticks(np.arange(2004, 2026, 3)) 86 | 87 | pl.colorbar(label="water vapour volume mixing ratio") 88 | pl.savefig('../plots/tape_recorder.png'); 89 | 90 | # %% 91 | pl.contourf( 92 | np.arange(2024+1/724, 2025, 1/366), 93 | plev[:], 94 | data_2024.T 95 | ) 96 | ax = pl.gca() 97 | ax.set_ylim(ax.get_ylim()[::-1]) 98 | ax.set_xlim(2024, 2025) 99 | pl.colorbar() 100 | 101 | # %% 102 | plev 103 | 104 | # %% 105 | plev_bounds = 0.5 * (plev[1:] + plev[:-1]) 106 | plev_bounds = np.append(plev_bounds, [0]) 107 | 108 | # %% 109 | plev_bounds 110 | 111 | # %% 112 | era5_plev = np.array([125, 100, 70, 50, 30, 20, 10, 7, 5, 3, 2, 1]) 113 | era5_plev_bounds = 0.5 * (era5_plev[1:] + era5_plev[:-1]) 114 | era5_plev_bounds = np.append(era5_plev_bounds, [0]) 115 | era5_plev_bounds 116 | 117 | # %% 118 | # weighting fractions 119 | (112.5-plev_bounds[1]) / (plev_bounds[0] - plev_bounds[1]) # 10 into 100 hPa 120 | (85 - plev_bounds[3]) / (plev_bounds[2] - plev_bounds[3]) # 12 into 70 hPa (rest into 100 hPa) 121 | (60 - plev_bounds[5]) / (plev_bounds[4] - plev_bounds[5]) # 14 into 50 hPa (rest into 70 hPa) 122 | (40 - plev_bounds[7]) / (plev_bounds[6] - plev_bounds[7]) # 16 into 30 hPa (rest into 50 hPa) 123 | (25 - plev_bounds[9]) / (plev_bounds[8] - plev_bounds[9]) # 18 into 20 hPa (rest into 30 hPa) 124 | (15 - plev_bounds[12]) / (plev_bounds[11] - plev_bounds[12]) # 21 into 10 hPa (rest into 20 hPa) 125 | (8.5 - plev_bounds[15]) / (plev_bounds[14] - plev_bounds[15]) # 24 into 7 hPa (rest into 10 hPa) 126 | (6 - plev_bounds[17]) / (plev_bounds[16] - plev_bounds[17]) # 26 into 5 hPa (rest into 7 hPa) 127 | (4 - plev_bounds[19]) / (plev_bounds[18] - plev_bounds[19]) # 28 into 3 hPa (rest into 5 hPa) 128 | (2.5 - plev_bounds[21]) / (plev_bounds[20] - plev_bounds[21]) # 30 into 2 hPa (rest into 3 hPa) 129 | (1.5 - plev_bounds[24]) / (plev_bounds[23] - plev_bounds[24]) # 33 into 1 hPa (rest into 2 hPa) 130 | 131 | # %% 132 | weighting_fractions = np.zeros((38, 11)) 133 | weighting_fractions[0, 0] = (112.5-plev_bounds[1]) / (plev_bounds[0] - plev_bounds[1]) 134 | weighting_fractions[1, 0] = 1 135 | weighting_fractions[2, 0] = 1 - (85 - plev_bounds[3]) / (plev_bounds[2] - plev_bounds[3]) 136 | weighting_fractions[2, 1] = (85 - plev_bounds[3]) / (plev_bounds[2] - plev_bounds[3]) 137 | weighting_fractions[3, 1] = 1 138 | weighting_fractions[4, 1] = 1 - (60 - plev_bounds[5]) / (plev_bounds[4] - plev_bounds[5]) 139 | weighting_fractions[4, 2] = (60 - plev_bounds[5]) / (plev_bounds[4] - plev_bounds[5]) # 14 into 50 hPa (rest into 70 hPa) 140 | weighting_fractions[5, 2] = 1 141 | weighting_fractions[6, 2] = 1 - (40 - plev_bounds[7]) / (plev_bounds[6] - plev_bounds[7]) 142 | weighting_fractions[6, 3] = (40 - plev_bounds[7]) / (plev_bounds[6] - plev_bounds[7]) # 16 into 30 hPa (rest into 50 hPa) 143 | weighting_fractions[7, 3] = 1 144 | weighting_fractions[8, 3] = 1 - (25 - plev_bounds[9]) / (plev_bounds[8] - plev_bounds[9]) 145 | weighting_fractions[8, 4] = (25 - plev_bounds[9]) / (plev_bounds[8] - plev_bounds[9]) # 18 into 20 hPa (rest into 30 hPa) 146 | weighting_fractions[9, 4] = 1 147 | weighting_fractions[10, 4] = 1 148 | weighting_fractions[11, 4] = 1 - (15 - plev_bounds[12]) / (plev_bounds[11] - plev_bounds[12]) 149 | weighting_fractions[11, 5] = (15 - plev_bounds[12]) / (plev_bounds[11] - plev_bounds[12]) # 21 into 10 hPa (rest into 20 hPa) 150 | weighting_fractions[12, 5] = 1 151 | weighting_fractions[13, 5] = 1 152 | weighting_fractions[14, 5] = 1 - (8.5 - plev_bounds[15]) / (plev_bounds[14] - plev_bounds[15]) 153 | weighting_fractions[14, 6] = (8.5 - plev_bounds[15]) / (plev_bounds[14] - plev_bounds[15]) # 24 into 7 hPa (rest into 10 hPa) 154 | weighting_fractions[15, 6] = 1 155 | weighting_fractions[16, 6] = 1 - (6 - plev_bounds[17]) / (plev_bounds[16] - plev_bounds[17]) 156 | weighting_fractions[16, 7] = (6 - plev_bounds[17]) / (plev_bounds[16] - plev_bounds[17]) # 26 into 5 hPa (rest into 7 hPa) 157 | weighting_fractions[17, 7] = 1 158 | weighting_fractions[18, 7] = 1 - (4 - plev_bounds[19]) / (plev_bounds[18] - plev_bounds[19]) 159 | weighting_fractions[18, 8] = (4 - plev_bounds[19]) / (plev_bounds[18] - plev_bounds[19]) # 28 into 3 hPa (rest into 5 hPa) 160 | weighting_fractions[19, 8] = 1 161 | weighting_fractions[20, 8] = 1 - (2.5 - plev_bounds[21]) / (plev_bounds[20] - plev_bounds[21]) 162 | weighting_fractions[20, 9] = (2.5 - plev_bounds[21]) / (plev_bounds[20] - plev_bounds[21]) # 30 into 2 hPa (rest into 3 hPa) 163 | weighting_fractions[21, 9] = 1 164 | weighting_fractions[22, 9] = 1 165 | weighting_fractions[23, 9] = 1 - (1.5 - plev_bounds[24]) / (plev_bounds[23] - plev_bounds[24]) 166 | weighting_fractions[23, 10] = (1.5 - plev_bounds[24]) / (plev_bounds[23] - plev_bounds[24]) # 33 into 1 hPa (rest into 2 hPa) 167 | weighting_fractions[24:, 10] = 1 168 | 169 | 170 | import pandas as pd 171 | pd.DataFrame(weighting_fractions, index=np.arange(11, 49), columns = era5_plev[1:]) 172 | 173 | # %% [markdown] 174 | # ## Need to conservatively regrid this to ERA5's plev / lon / lat 175 | # 176 | # - Start from VMR in MLS, convert to MMR (specific humidity) 177 | # - Calculate actual mass of water vapour in each cell on MLS pressure levels 178 | # - Use the lookup table of mapping MLS pressure levels to ERA5 pressure levels to calculate mass of water in each ERA5 cell 179 | # - Convert back to specific humidity 180 | 181 | # %% 182 | data = np.ma.masked_all((21*12, 38, 72, 45)) * np.nan 183 | data 184 | 185 | # %% 186 | for year in range(2004, 2024): 187 | nc = Dataset(glob.glob(f'../data/mls/MLS-Aura_L3MB-H2O_*_{year}.nc')[0]) 188 | data[(year-2004)*12:(year-2004)*12+12, ...] = nc.groups['H2O PressureGrid'].variables['value'][:, 11:49, ...] 189 | plev = nc.groups['H2O PressureGrid'].variables['lev'][10:49] 190 | lat = nc.groups['H2O PressureGrid'].variables['lat'][:] 191 | lon = nc.groups['H2O PressureGrid'].variables['lon'][:] 192 | lat_bnds = nc.groups['H2O PressureGrid'].variables['lat_bnds'][:] 193 | lon_bnds = nc.groups['H2O PressureGrid'].variables['lon_bnds'][:] 194 | nc.close() 195 | 196 | # %% 197 | data_2024 = np.ma.masked_all((366, 38, 72, 45)) * np.nan 198 | for day in range(1, 367): 199 | if day in [127, 366]: 200 | continue 201 | nc = Dataset(glob.glob(f'../data/mls/MLS-Aura_L3DB-H2O_*_2024d{day:03}.nc')[0]) 202 | data_2024[day-1, :] = nc.groups['H2O PressureGrid'].variables['value'][0, 11:49, ...] 203 | nc.close() 204 | 205 | # %% 206 | for month in range(12): 207 | data[240+month, ...] = np.ma.mean(data_2024[month_start[month]:month_end[month], ...], axis=0) 208 | 209 | # %% 210 | # data[data==0] = np.nan 211 | 212 | # %% 213 | era5_data = np.ma.masked_all((21*12, 11, 72, 45)) 214 | era5_h2o_mass = np.ma.masked_all((21*12, 11, 72, 45)) 215 | 216 | # %% 217 | mass_atmosphere # slice 218 | 219 | # %% 220 | p_top = 0 221 | p_bottom = 112.5 222 | mass_slice = (p_bottom-p_top)/1000 * mass_atmosphere 223 | 224 | # %% 225 | era5_plevthick = -np.diff(era5_plev_bounds) 226 | era5_plevthick 227 | 228 | # %% 229 | # era5_mass = era5_plevthick * mass_atmosphere # how much does the stratospheric slice weigh in kg 230 | 231 | # %% 232 | plev 233 | 234 | # %% 235 | plev_bounds = 0.5 * (plev[:-1] + plev[1:]) 236 | plev_bounds = np.append(plev_bounds, [0]) 237 | plev_bounds 238 | 239 | # %% 240 | plev_diff = -np.diff(plev) 241 | plev_thick = 0.5 * (plev_diff[1:] + plev_diff[:-1]) 242 | plev_thick = np.append(plev_thick, 0.5 * (plev[-2] + plev[-1])) 243 | plev_thick 244 | 245 | # %% 246 | lon_lat_weight = np.diff(np.sin(np.radians(lat_bnds))).squeeze() / 2 / 72 247 | 248 | # %% 249 | # mass of water vapour at each cell 250 | mass_h2o = (plev_thick[None, :, None, None] / 1000 * mass_atmosphere * lon_lat_weight * data) * 18.015 / 28.97 251 | # the last ratio is VMR to MMR 252 | mass_h2o.shape 253 | 254 | # %% 255 | mass_h2o.sum(axis=(1,2,3)) # in kg 256 | mass_h2o.sum(axis=(1,2,3))/1e9 # in Tg 257 | 258 | # %% 259 | pl.plot(mass_h2o.sum(axis=(1,2,3))/1e9) 260 | 261 | # %% 262 | # climatology 263 | mass_h2o_20042021 = np.ma.masked_all((12)) 264 | for month in range(12): 265 | mass_h2o_20042021[month] = np.nanmean(mass_h2o[month:216:12].sum(axis=(1,2,3))/1e9) 266 | 267 | # %% 268 | mass_h2o_2022 = np.ma.masked_all(12) 269 | for month in range(12): 270 | mass_h2o_2022[month] = mass_h2o[month+216].sum()/1e9 271 | 272 | # %% 273 | mass_h2o_2023 = np.ma.masked_all(12) 274 | for month in range(12): 275 | mass_h2o_2023[month] = mass_h2o[month+228].sum()/1e9 276 | 277 | # %% 278 | mass_h2o_2024 = np.ma.masked_all(12) 279 | for month in range(12): 280 | mass_h2o_2024[month] = mass_h2o[month+240].sum()/1e9 281 | 282 | # %% 283 | mass_h2o_2022 284 | 285 | # %% 286 | mass_h2o_2023 287 | 288 | # %% 289 | mass_h2o_2024 290 | 291 | # %% 292 | (mass_h2o_2022 - mass_h2o_20042021) 293 | 294 | # %% 295 | (mass_h2o_2023 - mass_h2o_20042021) 296 | 297 | # %% 298 | (mass_h2o_2024 - mass_h2o_20042021) 299 | 300 | # %% 301 | weighting_fractions.shape 302 | 303 | # %% 304 | era5_plev 305 | 306 | # %% 307 | for ilev in range(11): 308 | era5_h2o_mass[:, ilev, ...] = np.sum(mass_h2o * weighting_fractions[:, ilev][None, :, None, None], axis=1) 309 | 310 | # %% 311 | # Then I need to convert this back to a mass mixing ratio for socrates 312 | 313 | # %% 314 | pl.plot(era5_h2o_mass.sum(axis=(1,2,3))/1e9) 315 | 316 | # %% 317 | # climatology 318 | era5_h2o_mass_20042021 = np.ma.masked_all((12)) 319 | for month in range(12): 320 | era5_h2o_mass_20042021[month] = np.nanmean(era5_h2o_mass[month:216:12].sum(axis=(1,2,3))/1e9) 321 | 322 | era5_h2o_mass_2022 = np.ma.masked_all(12) 323 | for month in range(12): 324 | era5_h2o_mass_2022[month] = era5_h2o_mass[month+216].sum()/1e9 325 | 326 | era5_h2o_mass_2023 = np.ma.masked_all(12) 327 | for month in range(12): 328 | era5_h2o_mass_2023[month] = era5_h2o_mass[month+228].sum()/1e9 329 | 330 | era5_h2o_mass_2024 = np.ma.masked_all(12) 331 | for month in range(12): 332 | era5_h2o_mass_2024[month] = era5_h2o_mass[month+240].sum()/1e9 333 | 334 | # %% 335 | era5_h2o_mass_2022 - era5_h2o_mass_20042021 336 | 337 | # %% 338 | era5_h2o_mass_2023 - era5_h2o_mass_20042021 339 | 340 | # %% 341 | era5_h2o_mass_2024 - era5_h2o_mass_20042021 342 | 343 | # %% 344 | era5_h2o_mass 345 | 346 | # %% 347 | # convert back to MMR in each cell 348 | 349 | era5_data = 1000 * era5_h2o_mass / era5_plevthick[None, :, None, None] / (mass_atmosphere * lon_lat_weight) 350 | #mass_h2o = (plev_thick[None, :, None, None] / 1000 * mass_atmosphere * lon_lat_weight * data) * 18.015 / 28.97 351 | 352 | era5_data 353 | 354 | # %% 355 | X, Y = np.meshgrid(np.arange(2004+1/24, 2025, 1/12), era5_plev[1:]) 356 | 357 | # %% 358 | pl.contourf( 359 | np.arange(2004+1/24, 2025, 1/12), 360 | era5_plev[1:], 361 | era5_data[..., 15:30].mean(axis=(2,3)).T 362 | ) 363 | ax = pl.gca() 364 | ax.set_ylim(ax.get_ylim()[::-1]) 365 | pl.colorbar() 366 | 367 | # %% 368 | # climatology 369 | era5_data_20042021 = np.ma.masked_all((12, 11, 72, 45)) 370 | for month in range(12): 371 | era5_data_20042021[month, ...] = np.nanmean(era5_data[month:216:12, ...], axis=0) 372 | 373 | era5_data_2022 = np.ma.masked_all((12, 11, 72, 45)) 374 | for month in range(12): 375 | era5_data_2022[month, ...] = era5_data[month+216, ...] 376 | 377 | era5_data_2023 = np.ma.masked_all((12, 11, 72, 45)) 378 | for month in range(12): 379 | era5_data_2023[month, ...] = era5_data[month+228, ...] 380 | 381 | era5_data_2024 = np.ma.masked_all((12, 11, 72, 45)) 382 | for month in range(12): 383 | era5_data_2024[month, ...] = era5_data[month+228, ...] 384 | 385 | # %% 386 | era5_ds = xr.Dataset( 387 | data_vars = dict( 388 | h2o_mmr = (["time", "plev", "lat", "lon"], era5_data.transpose(0,1,3,2)) 389 | ), 390 | coords=dict( 391 | lon=lon, 392 | lat=lat, 393 | time=np.arange(252), 394 | plev = era5_plev[1:] 395 | ), 396 | ) 397 | 398 | # %% 399 | era5_ds.to_netcdf('../output/MLS_H2O.nc') 400 | 401 | # %% 402 | lon 403 | 404 | # %% 405 | lat 406 | 407 | # %% 408 | -------------------------------------------------------------------------------- /notebooks/10_volcanic-forcing.py: -------------------------------------------------------------------------------- 1 | # --- 2 | # jupyter: 3 | # jupytext: 4 | # text_representation: 5 | # extension: .py 6 | # format_name: percent 7 | # format_version: '1.3' 8 | # jupytext_version: 1.16.6 9 | # kernelspec: 10 | # display_name: Python 3 (ipykernel) 11 | # language: python 12 | # name: python3 13 | # --- 14 | 15 | # %% [markdown] 16 | # # Volcanic forcing 17 | # 18 | # Use the AR6 process for volcanic forcing with updates: 19 | # - replace Toohey & Sigl (eVolv v2) with Sigl et al. (HolVol) which extends back to 9500 BC. We use the full "pre-industrial" (9500 BC to 1749 AD) as the average background sAOD to reference zero forcing to. 20 | # - use CMIP7 1750-2023 21 | # - ues GloSSAC v2.2.2 until the end of 2023 22 | # - Extend forwards to 2023 past the end of GlossAC using sAOD from OMPS LP, following the use of this dataset in https://www.nature.com/articles/s43247-022-00580-w#Sec11 **note that at present July 2024 is missing** 23 | # - 2023 update to GloSSAC is coming and may replace the OMPS LP data if it arrives in time 24 | # 25 | # This notebook requires large datasets that need registration to obtain so cannot be downloaded by the code: 26 | # 27 | # - Download data from: https://download.pangaea.de/dataset/928646/files/HolVol_SAOD_-9500_1900_v1.0.nc Put this in '../data/volcanic_aod/HolVol_SAOD_-9500_1900_v1.0.nc' 28 | # - Download data from: https://asdc.larc.nasa.gov/project/GloSSAC/GloSSAC_2.22. Click "Get Dataset". Put this in '../data/volcanic_aod/GloSSAC_V2.22.nc' 29 | # - Download data from: https://omps.gesdisc.eosdis.nasa.gov/data/SNPP_OMPS_Level3/OMPS_NPP_LP_L3_AER_MONTHLY.1/. Obtain every *.h5 file in every annual sub-directory from 2013 to 2024. Put these files in '../data/volcanic_aod/SNPP_OMPS_Level3/ 30 | # 31 | # In addition, we require estimates of the stratospheric water vapour injection from Hunga Tonga. The MLS data is processed in notebook 09, taken and run in the offline radiative transfer code, and implemented back here. 32 | # 33 | # For bonus points we should consider stratospheric water vapour in historical eruptions, though this is not easy to get. 34 | 35 | # %% 36 | import glob 37 | 38 | from netCDF4 import Dataset 39 | import numpy as np 40 | import matplotlib.pyplot as pl 41 | import pandas as pd 42 | from pooch import retrieve 43 | import scipy.stats 44 | import h5py 45 | 46 | # %% 47 | df_stwv = pd.read_csv('../data/volcanic_stwv/indicators_stwv_irf_hansen_tp.csv', index_col=0) 48 | 49 | # %% 50 | pl.rcParams['figure.figsize'] = (10/2.54, 10/2.54) 51 | pl.rcParams['font.size'] = 11 52 | pl.rcParams['font.family'] = 'Arial' 53 | pl.rcParams['ytick.direction'] = 'in' 54 | pl.rcParams['ytick.minor.visible'] = True 55 | pl.rcParams['ytick.major.right'] = True 56 | pl.rcParams['ytick.right'] = True 57 | pl.rcParams['xtick.direction'] = 'in' 58 | pl.rcParams['xtick.minor.visible'] = True 59 | pl.rcParams['xtick.major.top'] = True 60 | pl.rcParams['ytick.major.left'] = True 61 | pl.rcParams['xtick.top'] = True 62 | pl.rcParams['figure.dpi'] = 150 63 | pl.rcParams['axes.spines.top'] = True 64 | pl.rcParams['axes.spines.bottom'] = True 65 | 66 | # %% 67 | # -9500 to 1900 68 | nc = Dataset('../data/volcanic_aod/HolVol_SAOD_-9500_1900_v1.0.nc') 69 | aod550_evolv = nc.variables['aod550'][:] 70 | lat_evolv = nc.variables['lat'][:] 71 | time_evolv = nc.variables['time'][:] 72 | nc.close() 73 | time_evolv[-51*12] 74 | 75 | # %% 76 | lat_evolv_bnds = np.concatenate([[90], 0.5*(lat_evolv[1:]+lat_evolv[:-1]), [-90]]) 77 | weights = -np.squeeze(np.diff(np.sin(np.radians(lat_evolv_bnds)))) 78 | aod_evolv = np.zeros((len(time_evolv))) 79 | for i in range(len(time_evolv)): 80 | aod_evolv[i] = np.average(aod550_evolv[i,:],weights=weights) 81 | 82 | # %% 83 | # 1979 to 2023 from GloSSAC 84 | nc = Dataset('../data/volcanic_aod/GloSSAC_V2.22.nc') 85 | data_glossac = nc.variables['Glossac_Aerosol_Optical_Depth'][:] 86 | lat_glossac = nc.variables['lat'][:] 87 | trp_hgt_glossac = nc.variables['trp_hgt'][:] # lat, month 88 | alt_glossac = nc.variables['alt'][:] 89 | nc.close() 90 | data_glossac[0,0,:] 91 | 92 | # %% 93 | lat_glossac_bnds = np.concatenate(([-90], 0.5*(lat_glossac[1:]+lat_glossac[:-1]), [90])) 94 | weights_glossac = np.diff(np.sin(np.radians(lat_glossac_bnds))) 95 | 96 | # Glossac is at 525 nm. -2.33 Angstrom exponent from Kovilakam et al 2020, https://essd.copernicus.org/articles/12/2607/2020/essd-12-2607-2020.html 97 | angstrom = (550/525)**(-2.33) 98 | 99 | months_glossac = 12*(2024-1979) 100 | aod_glossac = np.zeros(months_glossac) 101 | for i in range(months_glossac): 102 | aod_glossac[i] = np.average(data_glossac[i,:,2],weights=weights_glossac)*angstrom 103 | 104 | # %% 105 | # 1750 to 2023 from CMIP7 106 | cmip7_file = retrieve( 107 | 'https://esgf-data2.llnl.gov/thredds/fileServer/user_pub_work/input4MIPs/CMIP6Plus/CMIP/uoexeter/UOEXETER-CMIP-1-3-0/atmos/mon/ext/gnz/v20250127/ext_input4MIPs_aerosolProperties_CMIP_UOEXETER-CMIP-1-3-0_gnz_175001-202312.nc', 108 | known_hash='d95814c1859a6d5a96bb986e6e4395dfeed2aedd18d256de5ba8f425356c8187', 109 | progressbar=True 110 | ) 111 | # cmip6_file = '../data/volcanic_aod/CMIP_1850_2014_extinction_550nm_strat_only_v3.nc' 112 | 113 | # %% 114 | nc = Dataset(cmip7_file) 115 | 116 | # %% 117 | nc.variables['wavelength'][7] 118 | 119 | # %% 120 | nc.variables 121 | 122 | # %% 123 | nc.variables['ext'][:, :, :, 7] 124 | 125 | # %% 126 | ext_cmip7 = nc.variables['ext'][:, :, :, 7].transpose((0,2,1)) * 1000 # time, height, lat; convert per m to per km 127 | lev_cmip7 = nc.variables['height'][:] 128 | lat_cmip7 = nc.variables['lat'][:] 129 | time_cmip7 = nc.variables['time'][:] 130 | nc.close() 131 | 132 | # %% 133 | time_cmip7 134 | 135 | # %% 136 | lev_cmip7.shape 137 | 138 | # %% 139 | lat_cmip7_bnds = np.concatenate(([-90], 0.5*(lat_cmip7[1:]+lat_cmip7[:-1]), [90])) 140 | weights = np.diff(np.sin(np.radians(lat_cmip7_bnds))) 141 | months_cmip7 = 12*(2024-1750) 142 | tax = np.zeros(months_cmip7) 143 | aod_cmip7 = np.zeros(months_cmip7) 144 | # for i in range(0,months_cmip7,12): 145 | # gl_mn_aod = np.average( 146 | # np.sum( 147 | # np.mean(ext_cmip7[i:i+12,...], axis=0) * 0.5, axis=0), 148 | # weights=weights 149 | # ) # 0.5 is thickness in km 150 | 151 | for i in range(months_cmip7): 152 | aod_cmip7[i] = np.average(np.nansum(ext_cmip7[i,...] * 0.5, axis=0), weights=weights) 153 | 154 | # %% 155 | pl.plot(aod_cmip7) 156 | np.sum(np.isnan(aod_cmip7)) 157 | 158 | # %% 159 | months_omps = 12 * (2025-2013) 160 | aod_omps = np.zeros(months_omps) 161 | aod_omps_unscaled = np.zeros(months_omps) 162 | 163 | # %% 164 | # 745 nm band is index 3, and is the most reliable 165 | 166 | # rather than try to estimate an Angstrom exponent, I will scale the timeseries to Glossac. 167 | 168 | for i in range(months_omps): 169 | year = (i)//12 + 2013 170 | month = ((i-12)%12)+1 171 | # missing dataset 172 | if year==2024 and month==7: 173 | continue 174 | filename = glob.glob('../data/volcanic_aod/SNPP_OMPS_Level3/OMPS-NPP_LP-L3-AER-MONTHLY_v1.0_%4dm%02d01_*.h5' % (year, month))[0] 175 | h5 = h5py.File(filename) 176 | lat_omps = h5['/']['Latitude'][:] 177 | lat_omps_bnds = np.concatenate(([-90], 0.5*(lat_omps[1:]+lat_omps[:-1]), [90])) 178 | weights = np.diff(np.sin(np.radians(lat_omps_bnds))) 179 | data = h5['/']['StratColumn'][:] 180 | data[data==-999] = np.nan 181 | aod_omps_unscaled[i] = np.nansum(data[:,:,3] * weights * np.ones((24, 36)))/((weights * np.ones((24, 36)))[~np.isnan(data[:,:,3])].sum()) 182 | 183 | # fill in july 2024 as an average of june and august 184 | aod_omps_unscaled[-6] = np.mean((aod_omps_unscaled[-5], aod_omps_unscaled[-7])) 185 | 186 | # %% 187 | #aod_omps = aod_glossac[-108:].mean()/aod_omps_unscaled[:108].mean() * aod_omps_unscaled 188 | # calculate scaling factor between OMPS and GloSSAC for the overlap period 2013-2022 189 | aod_omps = aod_glossac[-(months_omps-12):].mean()/aod_omps_unscaled[:(months_omps-12)].mean() * aod_omps_unscaled 190 | 191 | # %% 192 | # eVolv -9500 to 1749 = 135 000 months 193 | # CMIP7 1750 to 2023 = 3288 months 194 | # OMPS 2024 = 12 months 195 | # sum = 138 300 months 196 | aod = np.concatenate((aod_evolv[:135000], aod_cmip7, aod_omps[-12:])) 197 | len(aod) 198 | 199 | # %% 200 | pl.plot(np.arange(2013+1/24, 2024, 1/12), aod_cmip7[-132:], label='CMIP7 (550 nm)') 201 | pl.plot(np.arange(2013+1/24, 2024, 1/12), aod_glossac[-(months_omps-12):], label='GloSSAC v2.2.2 (550 nm)') 202 | pl.plot(np.arange(2013+1/24, 2025, 1/12), aod_omps_unscaled, label='OMPS LP (745 nm)') 203 | pl.plot(np.arange(2013+1/24, 2025, 1/12), aod_omps, label='OMPS LP scaled') 204 | pl.ylabel('sAOD') 205 | pl.legend() 206 | #pl.plot(aod[-120:]) 207 | 208 | # %% 209 | ## crossfade 210 | #aod[135000:135612] = (1-np.linspace(0,1,612))*aod_evolv[135000:135612]+np.linspace(0,1,612)*aod_cmip7[:612] # 51 years holvol to cmip7 211 | #aod[138276:138288] = (1-np.linspace(0,1,12))*aod_cmip7[-12:] + np.linspace(0, 1, 12)*aod_omps[-24:-12] # 1 year cmip7 to omps 212 | 213 | # %% 214 | pl.plot(np.arange(1745+1/24,1801+1/24,1/12), aod_evolv[134940:135612], label='HolVol') 215 | pl.plot(np.arange(1750+1/24,1805+1/24,1/12), aod_cmip7[:660], label='CMIP7') 216 | pl.plot(np.arange(1745+1/24,1805+1/24,1/12), aod[134940:135660], label='blended') 217 | pl.legend() 218 | 219 | # %% 220 | pl.plot(np.arange(1979+1/24,2024+1/24,1/12), aod_glossac, label='GloSSAC v2.2.2 (1979-2023)', lw=0.5) 221 | pl.plot(np.arange(1975+1/24,2024+1/24,1/12), aod_cmip7[-588:], label='CMIP6 (1850-2023)', lw=0.5) 222 | pl.plot(np.arange(2013+1/24,2025+1/24,1/12), aod_omps, label='OMPS (2013-2024)', lw=0.5) 223 | pl.plot(np.arange(1975+1/24,2025+1/24,1/12), aod[-600:], label='Combined', zorder=-2, color='k') 224 | pl.title('Stratospheric aerosol optical depth') 225 | pl.ylabel("AOD") 226 | pl.xlim(1975, 2025) 227 | pl.ylim(0, 0.12) 228 | pl.tight_layout() 229 | pl.legend(frameon=False, fontsize=8) 230 | pl.tight_layout() 231 | pl.savefig('../plots/volcanic_AOD.png') 232 | pl.savefig('../plots/volcanic_AOD.pdf') 233 | 234 | # %% 235 | erf_sulf = -20 * (aod - np.mean(aod[:(11262*12)])) 236 | erf_h2o = np.zeros_like(erf_sulf) 237 | 238 | for im, month in enumerate(range(216, 252)): 239 | mod12 = month%12 240 | erf_h2o[-36+im] = (df_stwv.iloc[month]-df_stwv.iloc[mod12:18*12:12].mean()) 241 | 242 | 243 | erf = erf_sulf + erf_h2o 244 | 245 | # %% 246 | pl.plot(np.arange(1975+1/24,2025+1/24,1/12), erf_sulf[-(12*50):], label='AOD', color='skyblue') 247 | pl.plot(np.arange(2021+23/24,2025,1/12), erf_h2o[-37:], label='H$_2$O', color='green') 248 | pl.plot(np.arange(2021+23/24,2025,1/12), erf[-37:], label='AOD + H$_2$O', color='purple') 249 | pl.title('Volcanic effective radiative forcing') 250 | pl.xlim(1975, 2025) 251 | pl.ylim(-2.1, 0.4) 252 | pl.ylabel('W m$^{-2}$, relative to 9500 BCE to 1749 CE') 253 | pl.axhline(0, ls=':', color='k') 254 | pl.legend(frameon=False) 255 | pl.tight_layout() 256 | pl.savefig('../plots/volcanic_ERF.png') 257 | pl.savefig('../plots/volcanic_ERF.pdf') 258 | 259 | # %% 260 | months = np.arange(-9500+1/24,2025,1/12) 261 | df = pd.DataFrame( 262 | data=np.vstack([aod, erf_sulf, erf_h2o, erf]).T, 263 | index=months, 264 | columns=['stratospheric_AOD', 'ERF_sulfate', 'ERF_H2O', 'volcanic_ERF'] 265 | ) 266 | df.index.name = 'year' 267 | df.to_csv('../output/volcanic_sAOD_ERF_monthly_-950001-202412.csv') 268 | 269 | # %% 270 | years = np.arange(-9500 + 0.5, 2025) 271 | aod_ann = np.zeros(len(aod)//12) 272 | sul_ann = np.zeros(len(erf)//12) 273 | h2o_ann = np.zeros(len(erf)//12) 274 | erf_ann = np.zeros(len(erf)//12) 275 | for i in range(0, len(months), 12): 276 | aod_ann[i//12] = np.mean(aod[i:i+12]) 277 | sul_ann[i//12] = np.mean(erf_sulf[i:i+12]) 278 | h2o_ann[i//12] = np.mean(erf_h2o[i:i+12]) 279 | erf_ann[i//12] = np.mean(erf[i:i+12]) 280 | df = pd.DataFrame(data=np.vstack([aod_ann, sul_ann, h2o_ann, erf_ann]).T, index=years, columns=['stratospheric_AOD', 'ERF_sulfate', 'ERF_H2O', 'volcanic_ERF']) 281 | df.index.name = 'year' 282 | df.to_csv('../output/volcanic_sAOD_ERF_annual_-9500-2024.csv') 283 | 284 | # %% 285 | df 286 | 287 | # %% 288 | pl.plot(df.volcanic_ERF) 289 | 290 | # %% 291 | -------------------------------------------------------------------------------- /notebooks/11_land-use.py: -------------------------------------------------------------------------------- 1 | # --- 2 | # jupyter: 3 | # jupytext: 4 | # text_representation: 5 | # extension: .py 6 | # format_name: percent 7 | # format_version: '1.3' 8 | # jupytext_version: 1.16.6 9 | # kernelspec: 10 | # display_name: Python 3 (ipykernel) 11 | # language: python 12 | # name: python3 13 | # --- 14 | 15 | # %% [markdown] 16 | # # Land use forcing 17 | # 18 | # Land use albedo: new data from Thomas Gasser based on HYDE-LUH 19 | # 20 | # Irrigation: from Chris Wells, based on FAO water withdrawal data, scaled to IPCC AR6 assessment for 2019 based on Sherwood et al (2018) 21 | 22 | # %% 23 | import numpy as np 24 | import pandas as pd 25 | import matplotlib.pyplot as pl 26 | from scipy.stats import linregress 27 | 28 | # %% 29 | df_landuse = pd.read_csv('../data/land_use/SARF_LCC_Ghimire2014+Ouyang2022+GCB2024.csv', index_col=0) 30 | 31 | # %% 32 | pl.plot(df_landuse) 33 | 34 | # %% 35 | # Take Thomas' suggestion of scaling the LUH1 data to the IPCC assessment, then using this scaling factor to adjust the LUH2/GCB time series. 36 | # actually no since we don't have 2005 in this dataset - let's scale LUH2 to AR6 37 | 38 | # %% 39 | df_landuse.columns 40 | 41 | # %% 42 | df_landuse.loc[2019, 'LUH2-GCB2024'] 43 | 44 | # %% 45 | pl.plot(-0.15 / df_landuse.loc[2005, 'LUH2-GCB2024'] * df_landuse['LUH2-GCB2024']) 46 | 47 | # %% 48 | df_landuse['LUH2-GCB2024_rescaled'] = -0.15 / df_landuse.loc[2004, 'LUH2-GCB2024'] * df_landuse['LUH2-GCB2024'] 49 | 50 | # %% 51 | # estimate 2024 based on persistence 52 | df_landuse 53 | 54 | # %% 55 | df_landuse.loc[2024, 'LUH2-GCB2024_rescaled'] = df_landuse.loc[2023, 'LUH2-GCB2024_rescaled'] 56 | 57 | # %% 58 | df_landuse 59 | 60 | # %% 61 | pl.plot(df_landuse) 62 | 63 | # %% 64 | df_irr = pd.read_csv('../data/land_use/Irrigation_ERF_Wells_FAO.csv', index_col=0) 65 | df_irr 66 | 67 | # %% 68 | lr = linregress(df_irr.loc[2013:].index, df_irr.loc[2013:, "Irrigation ERF"]) 69 | 70 | # %% 71 | pl.plot(df_irr.loc[2013:]) 72 | pl.plot(np.arange(2013, 2025), lr.slope * np.arange(2013, 2025) + lr.intercept) 73 | 74 | # %% 75 | df_irr.loc[2023, "Irrigation ERF"] = lr.slope * 2023 + lr.intercept 76 | df_irr.loc[2024, "Irrigation ERF"] = lr.slope * 2024 + lr.intercept 77 | 78 | # %% 79 | pl.plot(df_irr) 80 | 81 | # %% 82 | df_landuse.loc[1750:2024, 'irrigation'] = df_irr.values 83 | 84 | # %% 85 | df_landuse['total'] = df_landuse['LUH2-GCB2024_rescaled'] + df_landuse['irrigation'] 86 | 87 | # %% 88 | df_landuse 89 | 90 | # %% 91 | pl.plot(df_landuse['total']) 92 | 93 | # %% 94 | df_landuse.loc[1750:, ['LUH2-GCB2024_rescaled', 'irrigation', 'total']].to_csv('../output/land_use_1750-2024.csv') 95 | 96 | # %% 97 | df_landuse.loc[1750:, ['LUH2-GCB2024_rescaled', 'irrigation', 'total']] 98 | 99 | # %% 100 | -------------------------------------------------------------------------------- /notebooks/13_radiative-forcing-barchart.py: -------------------------------------------------------------------------------- 1 | # --- 2 | # jupyter: 3 | # jupytext: 4 | # text_representation: 5 | # extension: .py 6 | # format_name: percent 7 | # format_version: '1.3' 8 | # jupytext_version: 1.17.0 9 | # kernelspec: 10 | # display_name: Python 3 (ipykernel) 11 | # language: python 12 | # name: python3 13 | # --- 14 | 15 | # %% [markdown] 16 | # # The Radiative Forcing Barchart™ 17 | # 18 | # An IPCC classic since 2007. Maybe earlier. 19 | # 20 | # Create a combined figure including the time history. 21 | 22 | # %% 23 | import matplotlib.pyplot as pl 24 | import numpy as np 25 | import pandas as pd 26 | from tqdm.auto import tqdm 27 | import xarray as xr 28 | from matplotlib import gridspec 29 | 30 | import os 31 | 32 | # %% 33 | ds = xr.load_dataset('../output/ERF_ensemble.nc') 34 | 35 | # %% 36 | variables = list(ds.keys()) 37 | 38 | # %% 39 | df = pd.read_csv('../output/ERF_best_1750-2024.csv', index_col=0) 40 | 41 | # %% 42 | SAMPLES = 100000 43 | 44 | # %% [markdown] 45 | # ## Non-aggregated variables 46 | 47 | # %% 48 | best = {} 49 | unc = {} 50 | 51 | for variable in [ 52 | 'CO2', 53 | 'CH4', 54 | 'N2O', 55 | 'aerosol-radiation_interactions', 56 | 'aerosol-cloud_interactions', 57 | 'O3', 58 | 'contrails', 59 | 'land_use', 60 | 'BC_on_snow', 61 | 'H2O_stratospheric', 62 | 'solar', 63 | 'volcanic' 64 | ]: 65 | best[variable] = df[variable].values.squeeze() 66 | unc[variable] = np.percentile(ds[variable], (5, 95), axis=1) 67 | 68 | # %% [markdown] 69 | # ## Aggregated variables 70 | 71 | # %% 72 | best['aerosol'] = np.zeros((275)) 73 | best['nonco2wmghg'] = np.zeros((275)) 74 | best['halogen'] = np.zeros((275)) 75 | best['anthro'] = np.zeros((275)) 76 | best['total'] = np.zeros((275)) 77 | best['minor'] = np.zeros((275)) 78 | 79 | for variable in tqdm(variables): 80 | best['total'] = best['total'] + df[variable].values 81 | if variable not in ['solar', 'volcanic']: 82 | best['anthro'] = best['anthro'] + df[variable].values 83 | if variable not in [ 84 | 'solar', 'volcanic', 'aerosol-radiation_interactions', 'aerosol-cloud_interactions', 85 | 'O3', 'H2O_stratospheric', 'contrails', 'BC_on_snow', 'land_use', 'CO2' 86 | ]: 87 | best['nonco2wmghg'] = best['nonco2wmghg'] + df[variable].values 88 | if variable not in ['CH4', 'N2O']: 89 | best['halogen'] = best['halogen'] + df[variable].values 90 | if variable in ['H2O_stratospheric', 'contrails', 'BC_on_snow', 'land_use']: 91 | best['minor'] = best['minor'] + df[variable].values 92 | if variable in ['aerosol-radiation_interactions', 'aerosol-cloud_interactions']: 93 | best['aerosol'] = best['aerosol'] + df[variable].values 94 | 95 | # %% 96 | aerosol = np.zeros((275, SAMPLES)) 97 | nonco2wmghg = np.zeros((275, SAMPLES)) 98 | halogen = np.zeros((275, SAMPLES)) 99 | anthro = np.zeros((275, SAMPLES)) 100 | total = np.zeros((275, SAMPLES)) 101 | minor = np.zeros((275, SAMPLES)) 102 | 103 | for variable in tqdm(variables): 104 | total = total + ds[variable] 105 | if variable not in ['solar', 'volcanic']: 106 | anthro = anthro + ds[variable] 107 | if variable not in [ 108 | 'solar', 'volcanic', 'aerosol-radiation_interactions', 'aerosol-cloud_interactions', 109 | 'O3', 'H2O_stratospheric', 'contrails', 'BC_on_snow', 'land_use', 'CO2' 110 | ]: 111 | nonco2wmghg = nonco2wmghg + ds[variable] 112 | if variable not in ['CH4', 'N2O']: 113 | halogen = halogen + ds[variable] 114 | if variable in ['H2O_stratospheric', 'contrails', 'BC_on_snow', 'land_use']: 115 | minor = minor + ds[variable] 116 | if variable in ['aerosol-radiation_interactions', 'aerosol-cloud_interactions']: 117 | aerosol = aerosol + ds[variable] 118 | 119 | # %% 120 | df_best = pd.DataFrame(best, index=np.arange(1750.5, 2025)) 121 | df_best.to_csv('../output/ERF_best_aggregates_1750-2024.csv') 122 | 123 | # %% 124 | unc['aerosol'] = np.percentile(aerosol, (5, 95), axis=1) 125 | unc['nonco2wmghg'] = np.percentile(nonco2wmghg, (5, 95), axis=1) 126 | unc['halogen'] = np.percentile(halogen, (5, 95), axis=1) 127 | unc['anthro'] = np.percentile(anthro, (5, 95), axis=1) 128 | unc['total'] = np.percentile(total, (5, 95), axis=1) 129 | unc['minor'] = np.percentile(minor, (5, 95), axis=1) 130 | 131 | # %% 132 | df_p05 = pd.DataFrame({key: value[0] for key, value in unc.items()}, index=np.arange(1750.5, 2025)) 133 | df_p05.to_csv('../output/ERF_p05_aggregates_1750-2024.csv') 134 | df_p05 = pd.DataFrame({key: value[1] for key, value in unc.items()}, index=np.arange(1750.5, 2025)) 135 | df_p05.to_csv('../output/ERF_p95_aggregates_1750-2024.csv') 136 | 137 | # %% 138 | pl.rcParams['figure.figsize'] = (18/2.54, 10/2.54) 139 | pl.rcParams['font.size'] = 11 140 | pl.rcParams['font.family'] = 'Arial' 141 | pl.rcParams['xtick.direction'] = 'out' 142 | pl.rcParams['xtick.minor.visible'] = True 143 | pl.rcParams['ytick.major.left'] = True 144 | pl.rcParams['ytick.major.size'] = 0 145 | pl.rcParams['xtick.top'] = True 146 | pl.rcParams['figure.dpi'] = 150 147 | 148 | # %% 149 | gs = gridspec.GridSpec(1,2, width_ratios=[5,1]) 150 | ax = pl.subplot(gs[0,0]) 151 | 152 | #hot = ['#de2d26','#fc9274','#fee0d2'] 153 | hot = ['#cc404a','#ed8037','#ecd151'] 154 | cool=['#304fbf','#369ce8'] 155 | 156 | ax.barh(0, best['CO2'][-1], color=hot[0], xerr=abs(best['CO2'][-1]-unc['CO2'][:,-1])[:,None], capsize=3, lw=1, edgecolor='k', zorder=3) 157 | ax.barh(-1, best['CH4'][-1], color=hot[0], lw=1, edgecolor='k', zorder=3) 158 | ax.barh(-1, best['N2O'][-1], color=hot[1], left=best['CH4'][-1], lw=1, edgecolor='k', zorder=3) 159 | ax.barh(-1, best['halogen'][-1], color=hot[2], left=best['CH4'][-1]+best['N2O'][-1], xerr=abs(best['nonco2wmghg'][-1]-unc['nonco2wmghg'][:,-1])[:,None], capsize=3, lw=1, edgecolor='k', zorder=3) 160 | ax.barh(-2, best['O3'][-1], xerr=abs(best['O3'][-1]-unc['O3'][:,-1])[:,None], color=hot[0], capsize=3, lw=1, edgecolor='k', zorder=3) 161 | ax.barh(-3, best['H2O_stratospheric'][-1], color=hot[0], xerr=abs(best['H2O_stratospheric'][-1]-unc['H2O_stratospheric'][:,-1])[:,None], capsize=3, lw=1, edgecolor='k', zorder=3) 162 | ax.barh(-4, best['land_use'][-1], color=cool[0], xerr=abs(best['land_use'][-1]-unc['land_use'][:,-1])[:,None], capsize=3, lw=1, edgecolor='k', zorder=3) 163 | ax.barh(-4, best['BC_on_snow'][-1], color=hot[0], xerr=abs(best['BC_on_snow'][-1]-unc['BC_on_snow'][:,-1])[:,None], capsize=3, lw=1, edgecolor='k', zorder=3) 164 | ax.barh(-5, best['contrails'][-1], color=hot[0], xerr=abs(best['contrails'][-1]-unc['contrails'][:,-1])[:,None], capsize=3, lw=1, edgecolor='k', zorder=3) 165 | ax.barh(-6, best['aerosol-radiation_interactions'][-1], color=cool[0], lw=1, edgecolor='k', zorder=3) 166 | ax.barh(-6, best['aerosol-cloud_interactions'][-1], color=cool[1], left=best['aerosol-radiation_interactions'][-1], xerr=abs(best['aerosol'][-1]-unc['aerosol'][:,-1])[:,None], capsize=3, lw=1, edgecolor='k', zorder=3) 167 | ax.barh(-7, best['anthro'][-1], color=hot[0], xerr=abs(best['anthro'][-1]-unc['anthro'][:,-1])[:,None], capsize=3, lw=1, edgecolor='k', zorder=3) 168 | ax.barh(-8, best['solar'][-1], color=hot[0], xerr=abs(best['solar'][-1]-unc['solar'][:,-1])[:,None], capsize=3, lw=1, edgecolor='k', zorder=3) 169 | 170 | ax.text(1.6, -1, 'CH$_4$',ha='center',va='center', color=hot[0]) 171 | ax.text(2.07, -1,'N$_2$O',ha='center',va='center', color=hot[1], bbox=dict(facecolor='w', boxstyle='square,pad=0.0', lw=0)) 172 | ax.text(2.34, -1, 'Halogens', va='center', color=hot[2], bbox=dict(facecolor='w', boxstyle='square,pad=0.0', lw=0)) 173 | ax.text(-0.38,-4, 'Land use', va='center', ha='right', color=cool[0], bbox=dict(facecolor='w', boxstyle='square,pad=0.0', lw=0)) 174 | ax.text(0.26, -4, 'Light absorbing particles on\nsnow and ice', va='center', ha='left', color=hot[0], bbox=dict(facecolor='w', boxstyle='square,pad=0.0', lw=0)) 175 | ax.text(0.1, -6, 'Aerosol-cloud', va='center', ha='left', color=cool[1], bbox=dict(facecolor='w', boxstyle='square,pad=0.0', lw=0)) 176 | ax.text(1.55, -6, 'Aerosol-radiation', va='center', ha='left', color=cool[0], bbox=dict(facecolor='w', boxstyle='square,pad=0.0', lw=0)) 177 | 178 | ax.set_ylim(-8.5,0.5) 179 | ax.axvline(0, color='k', lw=0.6) 180 | ax.axhline(-6.5, color='k', lw=0.6) 181 | ax.axhline(-7.5, color='k', lw=0.6) 182 | ax.set_yticks(np.arange(-8,1)); 183 | #ax.set_xticks(np.arange(-2,4.2,1)); 184 | ax.set_xlim(-2.2,3.81) 185 | ax.set_xlabel('Effective radiative forcing (W m$^{-2}$)') 186 | ax.set_title('') 187 | ax.set_yticklabels(['Carbon dioxide','Other well-mixed\ngreenhouse gases','Ozone','Stratospheric\nwater vapour', 'Albedo', 'Contrails & aviation-\ninduced cirrus', 'Aerosols','Total anthropogenic', 'Solar'][::-1]); 188 | ax.set_title('(a) Effective radiative forcing from 1750 to 2024') 189 | 190 | 191 | # values 192 | ax_values = pl.subplot(gs[0,1]) 193 | ax_values.text(0.5,0,'{:.2f} [{:.2f} to {:.2f}]'.format(best['CO2'][-1], unc['CO2'][0,-1], unc['CO2'][1,-1]), ha='center', va='center', size=9) 194 | ax_values.text(0.5,-0.6,'{:.2f} [{:.2f} to {:.2f}]'.format(best['CH4'][-1], unc['CH4'][0,-1], unc['CH4'][1,-1]), ha='center', va='center', size=9, color=hot[0]) 195 | ax_values.text(0.5,-1.0,'{:.2f} [{:.2f} to {:.2f}]'.format(best['N2O'][-1], unc['N2O'][0,-1], unc['N2O'][1,-1]), ha='center', va='center', size=9, color=hot[1]) 196 | ax_values.text(0.5,-1.4,'{:.2f} [{:.2f} to {:.2f}]'.format(best['halogen'][-1], unc['halogen'][0,-1], unc['halogen'][1,-1]), ha='center', va='center', size=9, color=hot[2]) 197 | ax_values.text(0.5,-2,'{:.2f} [{:.2f} to {:.2f}]'.format(best['O3'][-1], unc['O3'][0,-1], unc['O3'][1,-1]), ha='center', va='center', size=9) 198 | ax_values.text(0.5,-3,'{:.2f} [{:.2f} to {:.2f}]'.format(best['H2O_stratospheric'][-1], ( unc['H2O_stratospheric'][0,-1] if abs(unc['H2O_stratospheric'][0,-1]) > 0.005 else abs(unc['H2O_stratospheric'][0,-1]) ), unc['H2O_stratospheric'][1,-1]), ha='center', va='center', size=9) 199 | ax_values.text(0.5,-3.8,'{:.2f} [{:.2f} to {:.2f}]'.format(best['land_use'][-1], unc['land_use'][0,-1], unc['land_use'][1,-1]), ha='center', va='center', size=9, color=cool[0]) 200 | ax_values.text(0.5,-4.2,'{:.2f} [{:.2f} to {:.2f}]'.format(best['BC_on_snow'][-1], ( unc['BC_on_snow'][0,-1] if abs(unc['BC_on_snow'][0,-1]) > 0.005 else abs(unc['BC_on_snow'][0,-1]) ), unc['BC_on_snow'][1,-1]), ha='center', va='center', size=9, color=hot[0]) 201 | ax_values.text(0.5,-5,'{:.2f} [{:.2f} to {:.2f}]'.format(best['contrails'][-1], unc['contrails'][0,-1], unc['contrails'][1,-1]), ha='center', va='center', size=9) 202 | ax_values.text(0.5,-5.8,'{:.2f} [{:.2f} to {:.2f}]'.format(best['aerosol-radiation_interactions'][-1], unc['aerosol-radiation_interactions'][0,-1], unc['aerosol-radiation_interactions'][1,-1] if abs(unc['aerosol-radiation_interactions'][1,-1]) > 0.005 else abs(unc['aerosol-radiation_interactions'][1,-1]) ), ha='center', va='center', size=9, color=cool[0]) 203 | ax_values.text(0.5,-6.2,'{:.2f} [{:.2f} to {:.2f}]'.format(best['aerosol-cloud_interactions'][-1], unc['aerosol-cloud_interactions'][0,-1], unc['aerosol-cloud_interactions'][1,-1]), ha='center', va='center', size=9, color=cool[1]) 204 | ax_values.text(0.5,-7,'{:.2f} [{:.2f} to {:.2f}]'.format(best['anthro'][-1], unc['anthro'][0,-1], unc['anthro'][1,-1]), ha='center', va='center', size=9) 205 | ax_values.text(0.5,-8,'{:.2f} [{:.2f} to {:.2f}]'.format(best['solar'][-1], unc['solar'][0,-1], unc['solar'][1,-1]), ha='center', va='center', size=9) 206 | ax_values.set_title('ERF (W m$^{-2}$)', size=9) 207 | 208 | ax_values.set_xlim(0,1) 209 | ax_values.set_ylim(-8.5, 0.5) 210 | ax_values.spines['left'].set_visible(False) 211 | ax_values.spines['right'].set_visible(False) 212 | ax_values.spines['bottom'].set_visible(False) 213 | ax_values.spines['top'].set_visible(False) 214 | ax_values.set_yticklabels([]) 215 | ax_values.set_xticks([]); 216 | 217 | pl.tight_layout() 218 | os.makedirs('../plots', exist_ok=True) 219 | pl.savefig('../plots/ERF_1750-2024.png') 220 | pl.savefig('../plots/ERF_1750-2024.pdf') 221 | 222 | # %% 223 | pl.rcParams['figure.figsize'] = (18/2.54, 9/2.54) 224 | pl.rcParams['font.size'] = 11 225 | pl.rcParams['font.family'] = 'Arial' 226 | pl.rcParams['xtick.direction'] = 'out' 227 | pl.rcParams['xtick.minor.visible'] = True 228 | pl.rcParams['ytick.minor.visible'] = True 229 | pl.rcParams['ytick.right'] = True 230 | pl.rcParams['xtick.top'] = True 231 | pl.rcParams['figure.dpi'] = 150 232 | pl.rcParams['ytick.major.size'] = 3 233 | 234 | # %% 235 | fig, ax = pl.subplots() 236 | 237 | year = np.arange(1750, 2025) 238 | 239 | species = ['CO2', 'CH4', 'N2O', 'halogen', 'O3', 'aerosol', 'minor', 'volcanic', 'solar', 'total'] 240 | 241 | colors = { 242 | 'CO2': '#7f0089', 243 | 'CH4': '#ad5e00', 244 | 'N2O': '#008e83', 245 | 'halogen': '#0070c0', 246 | 'aerosol': '#66665f', 247 | 'O3': '#e5da47', 248 | 'minor': '#c0f080', 249 | 'anthro' : '#000000', 250 | 'volcanic': '#006000', 251 | 'solar': '#d0a070', 252 | 'total': '#000000' 253 | } 254 | 255 | labels = { 256 | 'CO2': 'Carbon dioxide (CO$_2$)', 257 | 'CH4': 'Methane (CH$_4$)', 258 | 'N2O': 'Nitrous oxide (N$_2$O)', 259 | 'halogen': 'Halogenated gases', 260 | 'aerosol': 'Tropospheric aerosols', 261 | 'O3': 'Ozone (O$_3$)', 262 | 'minor': 'Other anthropogenic', 263 | 'anthro' : 'Total anthropogenic', 264 | 'volcanic': 'Volcanic', 265 | 'solar': 'Solar', 266 | 'total': 'Total' 267 | } 268 | 269 | for specie in species: 270 | ax.plot(year, best[specie], color=colors[specie], lw=1, label=labels[specie]) 271 | 272 | ax.fill_between(np.arange(2020, 2025), -5, 5, color="#e0e0e0") 273 | 274 | ax.fill_between(year, unc['anthro'][0,:], unc['anthro'][1,:], color=colors['anthro'], alpha=0.3, lw=0, label='Total anthropogenic 90% range') 275 | ax.plot(year, best['anthro'], color=colors['anthro'], lw=2, label=labels['anthro']) 276 | 277 | ax.plot(0, 0, color='None', lw=0, label='\n') 278 | ax.plot(0, 0, color='None', lw=0, label='\n') 279 | 280 | 281 | ax.axhline(0, color='k', ls=':', lw=1) 282 | ax.set_xlim(1750,2024) 283 | ax.set_ylim(-2.5, 4) 284 | 285 | ax.legend(ncol=2, fontsize=7, frameon=False) 286 | 287 | ax.set_title('(b) Time evolution of effective radiative forcing 1750-2024') 288 | ax.set_ylabel('W m$^{-2}$') 289 | 290 | pl.tight_layout() 291 | os.makedirs('../plots', exist_ok=True) 292 | pl.savefig('../plots/ERF_timeseries_1750-2024.png') 293 | pl.savefig('../plots/ERF_timeseries_1750-2024.pdf') 294 | 295 | # %% 296 | ds.close() 297 | -------------------------------------------------------------------------------- /notebooks/14_forcing-analysis.py: -------------------------------------------------------------------------------- 1 | # --- 2 | # jupyter: 3 | # jupytext: 4 | # text_representation: 5 | # extension: .py 6 | # format_name: percent 7 | # format_version: '1.3' 8 | # jupytext_version: 1.17.0 9 | # kernelspec: 10 | # display_name: Python 3 (ipykernel) 11 | # language: python 12 | # name: python3 13 | # --- 14 | 15 | # %% [markdown] 16 | # # Forcing reporting, analysis and processing 17 | # 18 | # Take the raw ERF probablistic ensemble and produce output needed by the DAMIP folks. 19 | # 20 | # 1000 ensemble members of the 100,000: 21 | # - all forcings 22 | # - natural 23 | # - well-mixed GHGs (does not include ozone or stratospheric water vapour) 24 | # - other anthropogenic 25 | # 26 | # Stratospheric water vapour is not included in WMGHGs, as it appears the intention in DAMIP was to exclude it. From [Gillett et al. (2016)](https://gmd.copernicus.org/articles/9/3685/2016/gmd-9-3685-2016.pdf) (original emphasis): 27 | # 28 | # "**hist-GHG**: These historical greenhouse-gas-only simulations resemble the historical simulations but instead are forced by *well-mixed* greenhouse gas changes only, similarly to the CMIP5 historicalGHG experiment. historical, hist-nat,and hist-GHG will allow the attribution of observed climate change to natural, greenhouse gas, and other anthropogenic components. Models with interactive chemistry schemes should either turn off the chemistry or use a preindustrial climatology of stratospheric and tropospheric ozone in their radiation schemes." 29 | # 30 | # Stratospheric water vapour from methane oxidation would only be produced in models with interactive chemistry, therefore the intention appears to be to exclude it from the definition of WMGHG. 31 | 32 | # %% 33 | import matplotlib.pyplot as pl 34 | import numpy as np 35 | import pandas as pd 36 | from tqdm.auto import tqdm 37 | import xarray as xr 38 | import json 39 | 40 | # %% 41 | ds = xr.load_dataset('../output/ERF_ensemble.nc') 42 | 43 | # %% 44 | variables = list(ds.keys()) 45 | 46 | # %% 47 | df = pd.read_csv('../output/ERF_best_1750-2024.csv', index_col=0) 48 | 49 | # %% 50 | SAMPLES = 100000 51 | 52 | # %% [markdown] 53 | # ## Non-aggregated statistics 54 | # 55 | # 2011, 2019 and 2024 56 | 57 | # %% 58 | for variable in [ 59 | 'CO2', 60 | 'CH4', 61 | 'N2O', 62 | 'aerosol-radiation_interactions', 63 | 'aerosol-cloud_interactions', 64 | 'O3', 65 | 'contrails', 66 | 'land_use', 67 | 'BC_on_snow', 68 | 'H2O_stratospheric', 69 | 'solar', 70 | 'volcanic', 71 | ]: 72 | print(variable, np.percentile(ds[variable].loc[dict(time=2024)], (5, 50, 95)), df.loc[2024, variable]) 73 | 74 | # %% 75 | # pick 1000 for export 76 | with open('../data/random_seeds.json') as f: 77 | seeds = json.load(f) 78 | 79 | # %% 80 | np.random.seed(seeds[99]) 81 | subset = np.random.choice(np.arange(SAMPLES), 1000, replace=False) 82 | 83 | # %% [markdown] 84 | # ## Aggregated categories 85 | # 86 | # and also individual categories for further DAMIP work 87 | 88 | # %% 89 | total_best = np.zeros((275)) 90 | natural_best = np.zeros((275)) 91 | aerosol_best = np.zeros((275)) 92 | wmghg_best = np.zeros((275)) 93 | other_ant_best = np.zeros((275)) 94 | halogen_best = np.zeros((275)) 95 | 96 | for variable in tqdm(variables): 97 | #print(variable) 98 | total_best = total_best + df[variable] 99 | if variable in ['solar', 'volcanic']: 100 | natural_best = natural_best + df[variable] 101 | elif variable not in [ 102 | 'aerosol-radiation_interactions', 'aerosol-cloud_interactions', 103 | 'O3', 'H2O_stratospheric', 'contrails', 'BC_on_snow', 'land_use' 104 | ]: 105 | wmghg_best = wmghg_best + df[variable] 106 | else: 107 | other_ant_best = other_ant_best + df[variable] 108 | if variable not in ['solar', 'volcanic', 'aerosol-radiation_interactions', 'aerosol-cloud_interactions', 109 | 'O3', 'H2O_stratospheric', 'contrails', 'BC_on_snow', 'land_use', 'CO2', 'CH4', 'N2O']: 110 | halogen_best = halogen_best + df[variable] 111 | if variable in ['aerosol-radiation_interactions', 'aerosol-cloud_interactions']: 112 | aerosol_best = aerosol_best + df[variable] 113 | type(total_best) 114 | 115 | # %% 116 | df_out = pd.concat( 117 | [ 118 | total_best, natural_best, total_best-natural_best, wmghg_best, other_ant_best 119 | ], axis=1 120 | ) 121 | df_out.columns = ['total', 'natural', 'anthropogenic', 'wmghgs', 'other_ant'] 122 | df_out.to_csv('../output/ERF_best_DAMIP_1750-2024.csv') 123 | 124 | # %% 125 | # aggregated 126 | total = np.zeros((275, SAMPLES)) 127 | natural = np.zeros((275, SAMPLES)) 128 | aerosol = np.zeros((275, SAMPLES)) 129 | wmghg = np.zeros((275, SAMPLES)) 130 | other_ant = np.zeros((275, SAMPLES)) 131 | halogen = np.zeros((275, SAMPLES)) 132 | 133 | # individual 134 | co2 = ds['CO2'] 135 | ch4 = ds['CH4'] 136 | n2o = ds['N2O'] 137 | o3 = ds['O3'] 138 | ari = ds['aerosol-radiation_interactions'] 139 | aci = ds['aerosol-cloud_interactions'] 140 | contrails = ds['contrails'] 141 | land_use = ds['land_use'] 142 | bc_snow = ds['BC_on_snow'] 143 | h2o_strat = ds['H2O_stratospheric'] 144 | solar = ds['solar'] 145 | volcanic = ds['volcanic'] 146 | 147 | for variable in tqdm(variables): 148 | #print(variable) 149 | total = total + ds[variable] 150 | if variable in ['solar', 'volcanic']: 151 | natural = natural + ds[variable] 152 | elif variable not in [ 153 | 'aerosol-radiation_interactions', 'aerosol-cloud_interactions', 154 | 'O3', 'H2O_stratospheric', 'contrails', 'BC_on_snow', 'land_use' 155 | ]: 156 | wmghg = wmghg + ds[variable] 157 | else: 158 | other_ant = other_ant + ds[variable] 159 | if variable not in ['solar', 'volcanic', 'aerosol-radiation_interactions', 'aerosol-cloud_interactions', 160 | 'O3', 'H2O_stratospheric', 'contrails', 'BC_on_snow', 'land_use', 'CO2', 'CH4', 'N2O']: 161 | halogen = halogen + ds[variable] 162 | if variable in ['aerosol-radiation_interactions', 'aerosol-cloud_interactions']: 163 | aerosol = aerosol + ds[variable] 164 | 165 | # %% [markdown] 166 | # ## Show shape matters 167 | 168 | # %% 169 | pl.plot(np.arange(1750, 2025), aerosol[:, :7]); 170 | 171 | # %% 172 | print('halogen', np.percentile(halogen[-1,:], (5, 50, 95)), halogen_best[2024]) 173 | 174 | # %% 175 | print('total: ', np.percentile(total[-1, :], (5, 50, 95))) 176 | print('anthropogenic:', np.percentile(total[-1, :]-natural[-1, :], (5, 50, 95))) 177 | print('natural: ', np.percentile(natural[-1, :], (5, 50, 95))) 178 | print('aerosol: ', np.percentile(aerosol[-1, :], (5, 50, 95))) 179 | print('wmghg: ', np.percentile(wmghg[-1, :], (5, 50, 95))) 180 | print('other_ant: ', np.percentile(other_ant[-1, :], (5, 50, 95))) 181 | 182 | # %% 183 | print('total: ', np.percentile(total[-1, subset], (5, 50, 95))) 184 | print('anthropogenic:', np.percentile(total[-1, subset]-natural[-1, subset], (5, 50, 95))) 185 | print('natural: ', np.percentile(natural[-1, subset], (5, 50, 95))) 186 | print('aerosol: ', np.percentile(aerosol[-1, subset], (5, 50, 95))) 187 | print('wmghg: ', np.percentile(wmghg[-1, subset], (5, 50, 95))) 188 | print('other_ant: ', np.percentile(other_ant[-1, subset], (5, 50, 95))) 189 | 190 | # %% 191 | # aggregated 192 | xr.Dataset( 193 | { 194 | 'total': total[:, subset], 195 | 'natural': natural[:, subset], 196 | 'wmghg': wmghg[:, subset], 197 | 'other_ant': other_ant[:, subset] 198 | } 199 | ).to_netcdf('../output/ERF_DAMIP_1000.nc') 200 | 201 | # %% 202 | # individual 203 | xr.Dataset( 204 | { 205 | 'co2': co2[:, subset], 206 | 'ch4': ch4[:, subset], 207 | 'n2o': n2o[:, subset], 208 | 'halogen': halogen[:, subset], 209 | 'o3': o3[:, subset], 210 | 'aerosol-radiation_interactions': ari[:, subset], 211 | 'aerosol-cloud_interactions': aci[:, subset], 212 | 'contrails': contrails[:, subset], 213 | 'land_use': land_use[:, subset], 214 | 'bc_snow': bc_snow[:, subset], 215 | 'h2o_strat': h2o_strat[:, subset], 216 | 'solar': solar[:, subset], 217 | 'volcanic': volcanic[:, subset] 218 | } 219 | ).to_netcdf('../output/ERF_DAMIP_1000_full.nc') 220 | 221 | # %% 222 | ds.close() 223 | 224 | # %% 225 | -------------------------------------------------------------------------------- /notebooks/15_decadal-trends.py: -------------------------------------------------------------------------------- 1 | # --- 2 | # jupyter: 3 | # jupytext: 4 | # text_representation: 5 | # extension: .py 6 | # format_name: percent 7 | # format_version: '1.3' 8 | # jupytext_version: 1.17.0 9 | # kernelspec: 10 | # display_name: Python 3 (ipykernel) 11 | # language: python 12 | # name: python3 13 | # --- 14 | 15 | # %% 16 | import pandas as pd 17 | import matplotlib.pyplot as plt 18 | import numpy as np 19 | 20 | # %% 21 | # Read in the CSV file with the ERF data 22 | erf_df = pd.read_csv('../output/ERF_best_aggregates_1750-2024.csv') 23 | 24 | # %% 25 | erf_df = erf_df.rename(columns={'Unnamed: 0': 'Year'}) 26 | 27 | # %% 28 | # Set the 'Year' column as the index 29 | erf_df.set_index('Year', inplace=True) 30 | 31 | # %% 32 | rolling_mean = erf_df.rolling(window=10).mean() 33 | 34 | # %% 35 | erf_trend = (rolling_mean - rolling_mean.shift(10)) 36 | 37 | # %% 38 | y=erf_trend['anthro'].values 39 | x=erf_trend.index.values 40 | 41 | # %% 42 | # Read in the CSV file with the temperature data 43 | GWI_df = pd.read_csv('../data/gmst/Walsh_GMST_timeseries.csv', index_col=0) 44 | GWI_df 45 | 46 | # %% 47 | rolling_mean_GWI = GWI_df.rolling(window=10).mean() 48 | GWI_trend = (rolling_mean_GWI - rolling_mean_GWI.shift(10)) 49 | y_GWI=GWI_trend['anthropogenic_p50'].values 50 | x_GWI=GWI_trend.index.values+0.5 51 | 52 | # %% 53 | # Create a figure and axis object 54 | fig, ax1 = plt.subplots() 55 | 56 | # Create a twin axis object 57 | ax2 = ax1.twinx() 58 | 59 | # Plot each series on its respective axis 60 | ax2.plot(x,y,marker='o', linestyle='None',label='effective radiative forcing trend') 61 | ax2.plot(x[-5:], y[-5:], marker='o', color='red',linestyle='None') 62 | 63 | ax1.plot(x_GWI,y_GWI,marker='+', linestyle='None',label='human-induced warming trend') 64 | ax1.plot(x_GWI[-4:], y_GWI[-4:], marker='+', color='red',linestyle='None') 65 | 66 | # Add axis labels and legend 67 | ax1.set_xlabel('End year of decade') 68 | ax2.set_ylabel('ERF trend (Wm$^{-2}$decade$^{-1}$)') 69 | ax1.set_ylabel('Temperature trend ( °C decade$^{-1}$)') 70 | 71 | ax1.legend(loc='best') 72 | ax2.legend(loc='center right') 73 | plt.title('Decadal trends') 74 | plt.xlim([1970,2025]) 75 | 76 | # Show the plot 77 | plt.show() 78 | fig.savefig('../plots/decadal_trends.png') 79 | fig.savefig('../plots/decadal_trends.pdf') 80 | 81 | # %% 82 | -------------------------------------------------------------------------------- /notebooks/temperature-plot.py: -------------------------------------------------------------------------------- 1 | # --- 2 | # jupyter: 3 | # jupytext: 4 | # text_representation: 5 | # extension: .py 6 | # format_name: percent 7 | # format_version: '1.3' 8 | # jupytext_version: 1.17.0 9 | # kernelspec: 10 | # display_name: Python 3 (ipykernel) 11 | # language: python 12 | # name: python3 13 | # --- 14 | 15 | # %% [markdown] 16 | # # Temperature plot 17 | # 18 | # Make the figure of the GMST anomalies 19 | 20 | # %% 21 | import matplotlib.pyplot as pl 22 | import numpy as np 23 | import pandas as pd 24 | 25 | import os 26 | 27 | # %% 28 | os.makedirs('../plots', exist_ok=True) 29 | 30 | # %% 31 | df_gmst = pd.read_csv('../data/gmst/IGCC_GMST_1850-2024.csv') 32 | 33 | # %% 34 | df_gmst 35 | 36 | # %% 37 | #df_gmst.index#.rolling(10).mean() 38 | 39 | # %% 40 | df_gmst_10=df_gmst.rolling(10).mean() 41 | 42 | # %% 43 | pl.rcParams['figure.figsize'] = (12/2.54, 9/2.54) 44 | pl.rcParams['font.size'] = 11 45 | pl.rcParams['font.family'] = 'Arial' 46 | pl.rcParams['xtick.direction'] = 'in' 47 | pl.rcParams['xtick.minor.visible'] = True 48 | pl.rcParams['xtick.top'] = True 49 | pl.rcParams['ytick.direction'] = 'in' 50 | pl.rcParams['ytick.right'] = True 51 | pl.rcParams['ytick.minor.visible'] = True 52 | pl.rcParams['xtick.top'] = True 53 | pl.rcParams['figure.dpi'] = 150 54 | 55 | # %% 56 | pl.plot(df_gmst.year, df_gmst.gmst, lw=1, color='r') 57 | pl.plot(df_gmst_10.year, df_gmst_10.gmst, lw=2.5, color='k') 58 | pl.xlim(1850, 2025) 59 | pl.ylabel('Temperature anomaly\nrelative to 1850-1900 (°C)') 60 | pl.tight_layout() 61 | pl.savefig('../plots/gmst.png') 62 | pl.savefig('../plots/gmst.pdf') 63 | 64 | # %% 65 | -------------------------------------------------------------------------------- /notebooks/zenith.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "id": "0", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "from numpy.polynomial.legendre import leggauss\n", 11 | "import numpy as np\n", 12 | "import cftime\n", 13 | "import datetime\n", 14 | "from climateforcing.solar.solar_position import cos_mean_solar_zenith_angle, modified_julian_date\n", 15 | "from tqdm.auto import tqdm\n", 16 | "import matplotlib.pyplot as pl" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": null, 22 | "id": "1", 23 | "metadata": {}, 24 | "outputs": [], 25 | "source": [ 26 | "leggauss(10)" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": null, 32 | "id": "2", 33 | "metadata": {}, 34 | "outputs": [], 35 | "source": [ 36 | "cftime.datetime(2014, 1, 1, 0, 30)" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": null, 42 | "id": "3", 43 | "metadata": {}, 44 | "outputs": [], 45 | "source": [ 46 | "lat = np.arange(-88, 90, 4)\n", 47 | "lon = np.arange(-177.5, 180, 5)" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "id": "4", 54 | "metadata": {}, 55 | "outputs": [], 56 | "source": [ 57 | "cos_sza = np.ones((365*24, 45, 72)) * np.nan\n", 58 | "lit = np.ones((365*24, 45, 72)) * np.nan\n", 59 | "date = cftime.datetime(2014, 1, 1, 0, 30)\n", 60 | "for ihour in tqdm(range(365*24)):\n", 61 | " cos_sza[ihour, ...], lit[ihour, ...] = (cos_mean_solar_zenith_angle(modified_julian_date(date), 1, lat, lon))\n", 62 | " date = date + datetime.timedelta(hours=1)" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": null, 68 | "id": "5", 69 | "metadata": {}, 70 | "outputs": [], 71 | "source": [ 72 | "pl.hist(cos_sza[:, 22, :].ravel()[cos_sza[:, 22, :].ravel()>0], bins=25)" 73 | ] 74 | } 75 | ], 76 | "metadata": { 77 | "kernelspec": { 78 | "display_name": "Python 3 (ipykernel)", 79 | "language": "python", 80 | "name": "python3" 81 | }, 82 | "language_info": { 83 | "codemirror_mode": { 84 | "name": "ipython", 85 | "version": 3 86 | }, 87 | "file_extension": ".py", 88 | "mimetype": "text/x-python", 89 | "name": "python", 90 | "nbconvert_exporter": "python", 91 | "pygments_lexer": "ipython3", 92 | "version": "3.12.2" 93 | } 94 | }, 95 | "nbformat": 4, 96 | "nbformat_minor": 5 97 | } 98 | -------------------------------------------------------------------------------- /output/cams_2000-2025.csv: -------------------------------------------------------------------------------- 1 | ,SO2,BC,OC,NMVOC,NOx,NH3,CO,CH4,N2O 2 | 2000,97.80993189999998,3.369285319,7.731116132500001,119.76787528000001,108.21881361785776,42.76551042496501,511.93821057,302.2405879784001,7.6453447290000005 3 | 2001,96.53099040000001,3.3357819049999997,7.6277926715,119.73563232,107.58414688782875,43.04530512665,496.16437642999995,301.8826981517,7.6847132935 4 | 2002,94.08571321000002,3.3558153969999993,7.611735643999999,120.36108657,107.23031913298999,44.292608118859995,486.57353545500007,301.9236150495,7.783901037000001 5 | 2003,94.11774872500001,3.462597896,7.744413247999999,122.46642877,108.64765130389489,44.69747836908,480.80508954999993,310.9923025282,7.910805121 6 | 2004,96.69080034000001,3.5317744810000002,7.931731578,125.78677166,111.52411854698936,45.82574822042001,480.37927631000014,318.87235981649997,8.179876298 7 | 2005,98.25289533000002,3.6033817689999994,8.085164809,128.17063252,111.75817092580816,45.436980327019995,477.03838237,324.42977176999995,8.290077183600001 8 | 2006,100.82381332,3.695867993,8.158809485,129.75940605,112.77197869658134,46.60368102295,475.6565027260001,330.72803183799994,8.452367386 9 | 2007,102.23158333999999,3.8324802004999996,8.23300084,130.65107512,114.63199502101644,47.246294920400004,476.40390146,333.832621758,8.631502416499998 10 | 2008,101.62738066,3.857735831,8.346499801000002,131.76384758999998,111.72350835780281,47.21044782928,476.409751166,340.28999112400004,8.552294400600001 11 | 2009,100.71399778999998,3.9945690290000004,8.48593325,131.10708094,109.85436391001807,48.5411247125,471.91125216999995,338.324776239,8.570865909 12 | 2010,103.06875731699999,4.131749522499999,8.658674197500003,134.38461655,112.12908115338932,48.91378230733999,483.49689003000003,344.624443458,8.6761474496 13 | 2011,106.35816714,4.240888624000001,8.782438415999998,136.80760777999998,114.8943090561301,49.80218664547,494.231220336,351.5104644584999,8.909678687 14 | 2012,106.73047458,4.2993133740000005,8.821626617,140.57859092,116.20081800440447,50.39486200834999,508.42621494499997,357.190467195,9.008709339 15 | 2013,106.06268096500001,4.353427376000001,8.815537239,142.51938751,116.64779643764116,51.02601049874,518.74676053,358.311069401,9.1558467363 16 | 2014,106.29067552000001,4.300118186000001,8.811394227999996,143.6802098,117.10331725870226,50.67595734355,521.0754099200001,361.158369641,9.170567716299997 17 | 2015,104.22884921,4.209456648999999,8.741662880000002,145.63721680999998,117.82301179619144,51.29631367801001,520.321660755,363.163188634,9.244182610000001 18 | 2016,101.16273036000001,4.030628919,8.563231059,145.36594262000003,115.45655740363594,51.516170028415,507.01641884,365.78155349499997,9.3251091044 19 | 2017,99.738846714,4.045058195999999,8.492463896,145.74835397,115.00204420382188,51.46301095820001,502.45410337,369.76063457299995,9.3916777786 20 | 2018,101.10149311,4.033510911,8.576017099999998,146.32328796999997,115.83194137204096,51.20770727319,500.66132049,372.778107225,9.396384068999998 21 | 2019,98.422296088,4.013279010000001,8.545525218,145.87602715,114.78901495864828,51.418441542985,493.172002465,373.44661557100005,9.391964403000001 22 | 2020,84.27350280499999,3.8534153250000003,8.477627558,138.62153064999998,103.59183281213825,51.715491176804,462.563857585,375.4360403563001,9.179668213700001 23 | 2021,85.99697284000001,3.9597741479999997,8.335863036,145.0995637,111.79968127517498,51.853011909195,484.8605099999999,374.868577121,9.578618086499999 24 | 2022,84.21772653999999,3.942899697,8.307404544999999,144.76982497,111.40679799262148,52.07483144750599,481.06635203999997,375.55790172800005,9.597783417999999 25 | 2023,82.62110184299999,3.9267603829999995,8.2736885565,144.46665818000002,110.43118482131256,52.299374525135,477.38341507999996,376.2859073190001,9.618160461599999 26 | 2024,81.45862849,3.922994144,8.266787611000003,144.59215593000002,109.81668575803171,52.63254679623,475.220456495,378.0182705855,9.666141623000001 27 | 2025,80.08061593000001,3.8986162080000004,8.211203285,143.96043779,108.70289438906553,52.75688075078,470.6529896199999,377.80638644600003,9.662554762000001 28 | -------------------------------------------------------------------------------- /output/contrails_ERF_1930-2024.csv: -------------------------------------------------------------------------------- 1 | year,"Contrails ERF, W/m2" 2 | 1930,0.0 3 | 1931,2.937649503980207e-05 4 | 1932,5.875299007960414e-05 5 | 1933,8.81294851194062e-05 6 | 1934,0.00011750598015920828 7 | 1935,0.00014688247519901036 8 | 1936,0.0001762589702388124 9 | 1937,0.00020563546527861448 10 | 1938,0.00023501196031841656 11 | 1939,0.00026438845535821864 12 | 1940,0.0002937649503980207 13 | 1941,0.00031665572575371065 14 | 1942,0.0003433616303353488 15 | 1943,0.0003700675349169871 16 | 1944,0.0004005885687245737 17 | 1945,0.0004311096025321603 18 | 1946,0.0004692608947916435 19 | 1947,0.0005035970578251783 20 | 1948,0.0005455634793106099 21 | 1949,0.0005875299007960414 22 | 1950,0.0006371265807333694 23 | 1951,0.0006867232606706976 24 | 1952,0.0007401350698339742 25 | 1953,0.0008011771374491474 26 | 1954,0.0008660343342902688 27 | 1955,0.0009347066603573385 28 | 1956,0.001011009244876305 29 | 1957,0.0010911269586212197 30 | 1958,0.001178874930818031 31 | 1959,0.0012704380322407906 32 | 1960,0.0013734465213413951 33 | 1961,0.0015943870759349563 34 | 1962,0.0018521067767464348 35 | 1963,0.0020558658099780105 36 | 1964,0.002256146030571421 37 | 1965,0.002524779764488635 38 | 1966,0.002859447803304211 39 | 1967,0.0035189056772834074 40 | 1968,0.004150011071431089 41 | 1969,0.004517669383005407 42 | 1970,0.0047018920548368625 43 | 1971,0.0057512755412596405 44 | 1972,0.006269230401864882 45 | 1973,0.006703181111706907 46 | 1974,0.006701916167820751 47 | 1975,0.0069279517460029815 48 | 1976,0.007147722716002166 49 | 1977,0.007806080324634447 50 | 1978,0.008297506903962979 51 | 1979,0.00885555169071483 52 | 1980,0.009153712562243607 53 | 1981,0.00918618662002758 54 | 1982,0.009582558690155143 55 | 1983,0.01000816290109608 56 | 1984,0.010930144928115067 57 | 1985,0.01154296276613418 58 | 1986,0.012489887694995646 59 | 1987,0.01335221249692986 60 | 1988,0.014333367369620483 61 | 1989,0.015255774483701863 62 | 1990,0.015698128545883424 63 | 1991,0.015588582353270049 64 | 1992,0.017215561025579997 65 | 1993,0.018826640289323515 66 | 1994,0.020049252665336418 67 | 1995,0.02140845421290216 68 | 1996,0.022660503347743798 69 | 1997,0.023816113946755146 70 | 1998,0.024777870039626698 71 | 1999,0.026278263590150456 72 | 2000,0.028357315061956573 73 | 2001,0.029015767727746347 74 | 2002,0.028468965603090476 75 | 2003,0.029491774355165735 76 | 2004,0.033543080113722444 77 | 2005,0.03523594045218897 78 | 2006,0.03670171176134459 79 | 2007,0.0385779032007973 80 | 2008,0.03934634571362298 81 | 2009,0.03828785283990747 82 | 2010,0.04241342880001756 83 | 2011,0.044480985940404755 84 | 2012,0.04543668506525151 85 | 2013,0.04680793860950402 86 | 2014,0.0487056992115037 87 | 2015,0.05118985232969666 88 | 2016,0.05379030652845202 89 | 2017,0.05631054971779991 90 | 2018,0.056835523856832444 91 | 2019,0.061541386114692544 92 | 2020,0.030675970199307505 93 | 2021,0.036909062776841445 94 | 2022,0.04686974620713812 95 | 2023,0.051360314613640594 96 | 2024,0.056384693217148917 97 | -------------------------------------------------------------------------------- /output/gfed4.1s_1997-2024.csv: -------------------------------------------------------------------------------- 1 | ,DM,C,CO2,CO,CH4,NMHC,H2,NOx,N2O,PM2.5,TPM,TPC,OC,BC,SO2,C2H6,CH3OH,C2H5OH,C3H8,C2H2,C2H4,C3H6,C5H8,C10H16,C7H8,C6H6,C8H10,Toluene_lump,Higher_Alkenes,Higher_Alkanes,CH2O,C2H4O,C3H6O,NH3,C2H6S,HCN,HCOOH,CH3COOH,MEK,CH3COCHO,HOCH2CHO,NMVOC 2 | 1997,6058.807067497134,3031.9920364072027,10095.256767529914,587.7749720978711,35.78176768393315,20.67546366484461,14.395117079079537,18.032902304612026,1.2182885947526172,49.85370742853101,65.8458829758735,26.313013121466962,23.972785624461782,2.295710794726763,2.9112892323299655,4.4313925797993114,16.70319590667968,0.19379095082050363,0.8110869543837511,1.5416997601228974,7.301709028026566,6.726581906812752,1.7554004674651418,1.2618705383258408,2.2293826240408716,4.444715411929828,0.38102931738709406,6.389004014509305,1.2528178208362377,0.5498506442048208,7.192682683005881,7.533706376365162,2.8636133278519926,6.010926613550285,0.009514365692478152,9.949765094198348,2.52609080351071,26.643206648318756,2.0480894421357765,4.422929159272911,2.9611695046632507,122.12429533035987 3 | 1998,5951.100422437405,2892.896746689611,9808.624436956972,473.471633750808,19.868628945740284,24.93929979711847,12.528247593407336,19.06380122765738,1.2935322599649814,50.78769823489417,64.40652293876795,26.14984191639848,23.502211313608957,2.6003996061128025,3.247318722560131,4.858819456362222,10.573666959419684,0.19208795660535732,0.9427515579585398,1.606113515364112,5.8896820097004285,4.7848351823516335,0.5828806133323423,2.10311360238217,1.044741711045354,2.1053496441085437,0.35529674299577796,3.2147156920789213,1.217259433290758,0.6790521072955996,6.88590121649055,4.927354830436285,2.0491589733223914,6.168595662533822,0.010950381962636804,3.4517384471857646,2.425341045168068,21.95784708686274,1.7165145719212638,4.344303308379303,2.694129725230775,90.6136057712512 4 | 1999,4565.160521829026,2226.751704319693,7589.79063250656,341.7676559354739,13.783159196175797,18.02643660333804,9.253932603222754,15.618348487777297,0.9308523729116945,36.550752083900655,46.37259784092623,17.958783152860924,15.99477725024028,1.9252341024424402,2.350961742506066,3.3819560353417155,7.503990744664732,0.13943610941551768,0.6213456547101462,1.2137128656750245,4.329027265258764,3.6214565804920564,0.4138322543799797,1.1265416888821713,0.676856885262357,1.3615491840595997,0.21224415078962805,2.062130580726287,0.8457889000713231,0.4341454898188018,4.82599373883691,3.588978881267938,1.3460113477278481,3.943619752296692,0.00771002370836428,2.443353630271135,1.6471594590996517,16.64818908817298,1.2396362310712534,3.3325671809351918,1.8302386655735985,64.85385263621298 5 | 2000,3891.616247928907,1894.8677290111104,6463.77914974315,288.3000609702284,11.282861573067205,15.934389861432875,7.710767017981739,13.432886495367823,0.7977902077931135,31.010043389834788,39.2023975793705,15.072075275335735,13.389758804707833,1.6496037212754933,2.017833559265753,2.929466209761218,6.242057855156609,0.11679118848609872,0.5435099662567813,1.0146914852378304,3.6677147891318134,3.068358264902821,0.33186225871219777,0.9683588714484533,0.5424309882872823,1.105436215640559,0.17565885431755224,1.6726561866649603,0.7151480003187705,0.38680553934647155,4.05388722523099,2.9245764316591885,1.0963875310965219,3.3992440305725755,0.0065151531734286795,1.946222210409196,1.3819977990209649,14.291762754570154,1.0489029480417498,2.840879860988101,1.5219363482749402,54.594014936134656 6 | 2001,4024.6039497452225,1962.1216089315492,6703.63252201149,292.5083541698738,11.330660308049238,16.35394399212584,7.73666996392662,14.246406804375274,0.812260698963038,31.22859309338985,39.28005423954886,14.769681735401623,13.066641065919764,1.6687024932662589,2.0495552983973235,2.955547212430369,6.31628567865719,0.11610199317959796,0.5369924537026154,1.0190423469798071,3.753613128856276,3.2229695975983352,0.3507244496630852,0.84547060223943,0.5379949864557857,1.1180527618275689,0.15772075254510393,1.6618514947699778,0.7041322154815857,0.3787289525069937,3.9724032775371594,2.919478199768373,1.0446300888721014,3.2785000163435707,0.006425641025831356,2.094023337774855,1.32608565187809,14.944778790265023,1.0451626878788276,2.93796088331401,1.465756116116413,55.431933301324406 7 | 2002,4790.487781822474,2343.587852910576,7924.142735834384,394.0310251377588,18.117316158866316,19.557709526782507,10.025549854244089,15.339865371903672,1.026758663551978,40.32215029929177,51.09295677190644,20.694493468315027,18.66318978074334,1.9939471477663193,2.575594314063782,3.8117836934025893,9.298793922605674,0.15277700649970646,0.7275613316594322,1.2338645711446325,4.922965910876706,4.218915471574552,0.6540639529408441,1.5666638757605946,1.0161249563644548,2.079113367319971,0.27061658404222516,3.0722700689303815,0.9559700829614233,0.5166054622893429,5.370091348381199,4.20709102263548,1.6966047268621223,4.737740729392602,0.008638143003273343,3.950699163143793,1.8299638564114182,18.493309715104726,1.3542363129414716,3.4970560807304065,2.111078130719514,77.01685875830591 8 | 2003,4525.248732412143,2199.935439809155,7451.358768223707,364.527079277352,15.361827430031033,19.976664641003747,9.176755475508232,14.325180573148296,1.0057091367915003,39.45167288936936,49.39224582303213,20.636164846914987,18.66781586832393,1.9341769684729673,2.5974806880619994,3.786946391474429,8.114761561895834,0.15130813077353159,0.7475778858415301,1.1561359191207785,4.543834626302696,3.788474931131185,0.4728406829454788,1.9188729196350889,0.8467658964593503,1.762478903895371,0.2700226844517178,2.6374962637130133,0.9305651948172973,0.5441795343089025,5.160938225775612,3.600555117150332,1.551967456611484,4.6942881167625545,0.009134165198068015,3.0506075958984438,1.7108606455004798,16.944033209565173,1.2074967646431267,3.303431574660863,2.0268890366125145,70.2381753183823 9 | 2004,4525.774739453978,2213.0012941158707,7514.519175853264,354.47819767816236,15.55734608500457,17.277542298170193,9.590344421531046,15.0990632823182,0.9291922352220189,36.49262139621277,46.72382170482356,18.08641081745429,16.1356177168652,1.9126701893822426,2.279545674351502,3.3962032438793957,8.186373134191982,0.13698792959031753,0.623969818709731,1.2259621964319878,4.451026384987057,3.7338117741487458,0.520083873898943,1.0408576680681272,0.8063249802539559,1.6019398077323286,0.23153897789780253,2.4131502614935916,0.8639285096212109,0.4327942693929668,4.961604162521022,3.921283227664249,1.4854899993499544,4.162358158572813,0.007257729719221018,2.9452726190898266,1.7652881485828837,16.92173736920924,1.3231297169176957,3.3038155598014045,1.9150277389986983,68.21485910215233 10 | 2005,4610.130977649653,2252.472716291269,7656.746531062152,356.42169665986734,15.356295479518787,17.64025419072363,9.76833852029146,15.533263403777227,0.9360058352799462,36.781190197514626,47.285377781741026,18.062263464350913,16.054453266213248,1.9686225260476142,2.2925880825778817,3.4298704902365875,8.169772671607188,0.13798025931030955,0.6291668694122845,1.2602637695334151,4.4880544163678655,3.72268777173634,0.5014656612028966,0.9716906262538647,0.7718885883334017,1.516274576553608,0.23162315416662926,2.3053109423367846,0.8749393119642082,0.43951425172085695,5.049846479947079,3.9501610386146044,1.4768978590931565,4.213470070323987,0.007210937398438408,2.735834712433584,1.819492152406627,17.135271382078603,1.370013678998782,3.365395613684245,1.935186347645166,68.29581356303652 11 | 2006,4480.907557270608,2207.3855917081496,7433.165379957566,386.0047731340984,19.63765673477799,17.76601142340142,9.754084486471042,14.17254945678412,0.9209218827776133,37.00341885229345,47.907263417664375,19.089311588823296,17.21845786469439,1.8368486351519675,2.3103815364882916,3.4232652899981875,9.768921081839022,0.1438639547675196,0.6508603053801858,1.1525869430198235,4.842442235148398,4.205636626970311,0.8239601404111448,1.239000524036756,1.129616725930981,2.259833739638174,0.258865009362901,3.3187115107412537,0.9053494358210739,0.4671295916476018,5.149476877046706,4.420123132232113,1.720829498326544,4.39807571500346,0.00777031114674473,4.66380729878775,1.778089509333963,18.036783205962973,1.3775363648704968,3.271062516807543,2.0364980482195554,77.05201987744772 12 | 2007,4516.320343820195,2202.978864472415,7507.120125734108,338.8597654299884,13.80945252482902,17.02227604279083,9.559410856624787,15.37043662724928,0.9096772870872478,35.997084208116604,46.25295260028858,17.681616866705536,15.694527008845785,1.9476922024324614,2.2488308484778368,3.300445466317073,7.50405034034645,0.13703313661373479,0.6005089034261225,1.2644071098916654,4.267698706813297,3.469657588157425,0.3965330370404379,0.9587738664162276,0.6583330451265355,1.2716142609373615,0.2224636550291477,1.9740961972404114,0.8511415732927267,0.41494645527262397,4.943788928331089,3.746856673385721,1.3935903881660696,3.9949605122795893,0.007222536626746033,2.1516176626479147,1.7747434212930122,16.21714112717016,1.3155049489621107,3.296913850988743,1.8862290422627175,64.02531192175553 13 | 2008,3833.4339434120875,1862.892979248875,6339.892493632174,291.94706314192894,11.61565697040823,16.870457387359263,7.543553135062129,12.940022813231272,0.805927360979863,31.27596885941967,39.527266244161765,15.471397364643005,13.789783329090282,1.6512465004357393,2.061345727703636,3.0406777226060293,6.390948097504127,0.11775313502489294,0.5868401836266756,0.9749332715775098,3.709457676561797,3.0778833746064658,0.3575500568630205,1.1652078931987098,0.5772049441129488,1.1875643372947173,0.1908471402469526,1.793850180957535,0.7352303217928884,0.4341197940397975,4.122147582564857,2.8639053359261286,1.1287151381976206,3.660666440474882,0.006767824106645736,2.0595398106521694,1.4061489557847566,14.395674844708141,1.0584682984468872,2.798406778690824,1.5566323393529173,55.73647503844501 14 | 2009,3793.7705072836256,1862.5406873987924,6311.001752005872,304.972415264598,14.208308725540553,15.115414358216196,7.81511808959179,12.672361481125197,0.768035248770859,30.30872829194365,38.79169741698072,15.036024284970278,13.456070997801554,1.5495850851034356,1.9337128113510083,2.8196524866708534,7.324331688900504,0.1158944744442619,0.5230851016392666,0.961744110321265,3.8678227226024418,3.370616646787114,0.5579373319977831,0.8993359698159455,0.7737679801676852,1.5673765271693207,0.18386356485594704,2.3003343753202126,0.7151710721980378,0.37178245644375946,4.053686217110116,3.3300463777338525,1.2453299913058997,3.3846861946170375,0.006300147833808914,3.2075674154099287,1.3717230957779005,14.842089203293936,1.0828338416458112,2.769452470317049,1.5577454767428427,59.81949074650555 15 | 2010,4411.047407997328,2150.4931242747384,7318.483639573535,336.3086541912686,13.881326425232002,16.84491333631835,9.400528291884994,14.77204365399599,0.9039974580663431,35.76591187533585,45.873272753895094,17.80553194051288,15.857505170028015,1.9101539274594879,2.2353665210146656,3.300978934384729,7.482897694770647,0.136011457050933,0.6087791486222123,1.2350307422423359,4.215884614642833,3.418625124553235,0.3993160422662517,1.0652440975586714,0.6796760438073612,1.3215610992250848,0.23035931048704342,2.0465475403674365,0.8501731136881756,0.42299494522790476,4.918914779582859,3.7029691813864165,1.4145684082150554,4.062623948549327,0.0072637645619952175,2.208070010940637,1.7669788689358006,15.893251194475042,1.2910184173626218,3.22006460783805,1.8930217450131415,63.73020088720648 16 | 2011,3836.3443615360143,1872.0435302487615,6371.465787235359,292.3341381446884,12.113906559636735,15.526816070052465,7.606172228532227,13.082982122815864,0.79910343009135,30.81181165162733,38.7251545808977,15.047746989701283,13.426842893725928,1.5890578683170296,1.9992537378850734,2.9253642251931096,6.5166341311368114,0.1143131379831236,0.5404845260461608,0.9772860271896064,3.7036246218047695,3.1881721434474644,0.39505344062185366,0.9858234332869817,0.6246184367516178,1.2968468417060488,0.17513887465074895,1.9179983086368875,0.7046352777193808,0.37921170927109643,3.9592894795042177,2.98427124912073,1.1304263518650493,3.3880316499009253,0.006387466139179951,2.4199384314284105,1.3339278360518425,14.43453222102272,1.01820589397385,2.800531383921291,1.5023565942909969,56.03507204276394 17 | 2012,4204.62059959578,2047.409307503851,6940.209866530922,335.76068371901266,14.303831786954635,17.88994675807266,8.506187894842608,13.587532126862527,0.9221548841210138,35.762263973124305,44.76308111813484,18.291132115378524,16.486588558742376,1.7717160683538702,2.3310020799096485,3.4425801143466996,7.5449265987789875,0.13394434843742797,0.664063233906043,1.0713409984735565,4.196243329230823,3.55928614963698,0.4574858694930036,1.5317302556871766,0.7835240385709894,1.6350410272446885,0.23356857953450338,2.4273578710419135,0.8345539612135827,0.47520672151344473,4.64024016735528,3.3714355730380143,1.397950123887021,4.2010491983944585,0.007842771892249491,2.9103421127331894,1.5595529125360745,15.898841093946713,1.127327446327017,3.069373037704917,1.8102603697697484,64.78401870630003 18 | 2013,3638.6608592897514,1773.262079505118,6024.374677787171,283.2223178841653,11.826983570338,15.154475065890523,7.298413050523954,12.070459568331529,0.7762383518974862,30.156718341341083,37.8666985539929,15.145533365479436,13.590405719573253,1.5258618545340654,1.9644357996907507,2.8703353786496106,6.313386241794192,0.11343113503565225,0.5439636741347971,0.9315016491333383,3.564020943895238,3.0278025970650293,0.37620576236155817,1.1553847754880557,0.6258440058671241,1.2982011915786396,0.185671331248521,1.9310598912067303,0.6986124365264831,0.38677040959248893,3.909768959635144,2.8670065146677763,1.1417480630605361,3.4205592722654146,0.006526859277690738,2.347440292534836,1.3117038449398832,13.644403534567886,0.9702101948029888,2.6562224272815183,1.5053118635986278,54.38253397794434 19 | 2014,4174.013230016619,2044.587176143866,6899.533738772726,350.9149926224012,16.672451233511392,17.223443938359555,8.852776133369117,13.182394495486704,0.8927845735992236,35.29683709256418,44.991180697776905,18.271178774254235,16.498061241890518,1.741374127144219,2.245729702503847,3.3396973135315244,8.46492677109774,0.13480471843585098,0.6440935756813246,1.072268926726368,4.382661485715211,3.7531009505731068,0.6314531499506075,1.3916047483964065,0.9480879598608863,1.9276660341589562,0.24574528698117204,2.8468110509666724,0.8493232276029733,0.4630760033385486,4.77702500604195,3.801569597890747,1.5403552316841846,4.239207757525307,0.007593236636273267,3.726061903168187,1.637234445032404,16.362886826293128,1.2188362239584096,3.047029657912131,1.887014300567089,69.10092763220186 20 | 2015,4646.545757971489,2289.834782927853,7683.83347129672,415.1578087288291,21.758939810673706,18.221523999768316,10.373742779589607,14.139547929480873,0.9906819488262747,39.58025741148364,51.028641561705605,20.832621035462708,18.896146786606543,1.9019337609625506,2.441979178770115,3.698188202353573,10.651459870694188,0.15145269827244726,0.7096736347876575,1.2034727566781873,5.149467788556112,4.489138940424946,0.9112706810678154,1.471754234458896,1.2942479750597233,2.6057326578020463,0.2961013302275282,3.8170898507763087,0.9734216147758357,0.503312012782243,5.510383791840912,4.795303251101381,1.9334715604159045,4.887450355881964,0.008210518585873783,5.276907681048967,1.9270385372492107,18.91597667145339,1.4498029876242429,3.391978403319187,2.222954173363965,83.35781182472053 21 | 2016,3840.86407259996,1869.292788000396,6355.635872221804,296.01120662250366,12.101311871418693,15.680626560560052,7.874398495061568,12.748103625269525,0.8156033018633392,31.771964953109517,40.1372014044024,15.925042498914426,14.24909294827287,1.6443515846349994,2.0412668987470677,3.017446355308992,6.525587471805432,0.1191563375972869,0.5699273402175611,1.0209455195966213,3.7130165989656403,3.077897716848766,0.35501205090938165,1.154273733674037,0.6183234086836419,1.257553046052012,0.2016997581777601,1.9049150998634243,0.7440709806384498,0.4037220889735091,4.210264301510056,3.0573370943650517,1.2138148039802361,3.663747454294266,0.006703827258246267,2.1366642608399546,1.4612353660229216,14.135372337978687,1.063875323422409,2.80383077299797,1.621614622380597,56.39426021806865 22 | 2017,3828.579809703505,1860.5699638182707,6326.59080675853,294.7159669704863,11.77298980006853,16.463200988358615,7.660319416691336,12.638309434044261,0.8219036783619156,32.13891234562595,40.38682521780407,16.309322052089044,14.637669433756104,1.6411987384177877,2.1113943427218462,3.0654231101338305,6.3988703114566725,0.12263198976152781,0.5913815970268451,0.9920668515406139,3.7071484231869114,3.069668919022195,0.3388262471835897,1.3454339849810824,0.6050322066959934,1.248245844721254,0.20375587401660794,1.8872122189085783,0.7508999265114803,0.42786876486197983,4.205524170747029,2.9176073982139377,1.1919292568377575,3.6943486697568693,0.0072016456653949314,2.114635466899321,1.4114276821732987,14.086354565702223,1.022162205403926,2.7948632610835578,1.6172479934275472,56.12341991616316 23 | 2018,3716.675231177748,1806.5116942442833,6130.280245068046,293.0352626985278,12.041403559755926,16.236517142744574,7.395006746104642,12.041327613689509,0.81941224728576,31.811746984006028,39.67048838695721,16.327627640809567,14.723408177249695,1.575442261876086,2.1001956912276154,3.0680168177958906,6.4380954747753085,0.12015519571542373,0.5972009624640869,0.9404557534122442,3.66844483523642,3.0890909222055165,0.3632695150851,1.4500294285881614,0.6511293095502185,1.368670088559424,0.20583019736233724,2.03953189247535,0.7394436499556372,0.4313444351206055,4.094132564704429,2.854672252532805,1.202368946781041,3.7127535279504635,0.007196394721615397,2.372984508762498,1.3537935332127133,13.902862876650234,0.9698373193761354,2.713172918759755,1.5911225006862943,56.23285229448925 24 | 2019,4586.915950706334,2241.510484979684,7561.247426346214,387.2599357362881,17.845272290613913,20.094941683578963,9.700832250965039,13.985250671536024,0.9978947172312185,40.68728551591839,51.72380525856214,22.05718975567514,20.078210771248536,1.945982462702544,2.661197747487604,3.7485985980792047,9.091621898965482,0.16550882573975453,0.7513804030302743,1.1850238747831774,4.820509752278209,4.014034656045175,0.6310325540247893,2.104331947462904,1.023863112785373,2.0742822751047494,0.29892312875372384,3.1022574754203527,0.9871775372989899,0.552658591758088,5.52477312133307,4.070582965969842,1.7569907099633983,4.788205069530384,0.010038045512578126,3.893478275995532,1.7928333336139142,17.373924942230477,1.274590900972063,3.348448644015627,2.20637306195016,75.80323863308692 25 | 2020,4026.6330704034685,1957.5428096668868,6649.182379816427,314.0748946988334,12.701785509935217,17.55221951987911,8.235941182149775,12.985470494692047,0.8591187822380993,34.56906758759958,43.78449015726001,18.10188881554847,16.322364778448627,1.7483321674364773,2.278388960833726,3.207718834125286,6.8469703398800785,0.13842899495233285,0.6311429187042109,1.0660158441163934,3.941119879575358,3.1863245407606935,0.362255649609788,1.6218228019875593,0.6572303621192815,1.323902944142447,0.23324648462827338,2.031525665801959,0.8234200861914773,0.46274030037988767,4.64017988161101,3.1689558745910658,1.3296261386900048,3.9458782580319194,0.008311188387541758,2.23439331842958,1.531376200825804,14.54507786423706,1.0869347160009855,2.9394421413945313,1.8033713162643994,59.821534287407005 26 | 2021,4390.330798584568,2122.620215054806,7155.939145111968,371.7348681872602,15.581665373398788,21.576725314607568,8.846051966856868,12.843029696201894,1.0585812189851103,41.56592489580235,51.34607543812713,22.891835778779292,20.94007510146678,1.9223994914981457,2.8048816865747326,4.100603036778514,8.14815996141557,0.16111128908771108,0.8560102789326532,1.0896063482179004,4.56644156196995,3.7390955833721473,0.44432188025484304,2.7058665832798163,0.9185812060681214,1.9581327821615178,0.31955166619792125,2.932126270385144,0.9931336748185047,0.6411310999084623,5.38252025447731,3.401080524939145,1.6766278994316486,5.2939076838253065,0.01050993284579846,3.1592094956077,1.732158922370957,16.499088663350292,1.1287071625761658,3.2049414829667366,2.170202164628372,71.93891972604291 27 | 2022,3325.4116191046874,1617.239030704219,5499.451423974562,255.8303667724825,10.329886056262033,13.930469035714182,6.76310668625966,11.011019449270307,0.7066791862610362,27.67320609890062,34.95417947354585,13.96661821624641,12.50949002600331,1.4302018932705227,1.7955260985484123,2.6267204886900917,5.599457894684698,0.10519598590242389,0.5019376644374263,0.8779357086090438,3.215033968239455,2.6494106550689476,0.2992067677867929,1.0738276500912305,0.5253201464531343,1.0691336707657504,0.1766123891836924,1.624614653397637,0.6499622582579787,0.36039120025026705,3.668481523615569,2.6018788232421395,1.0450119732194068,3.189561520589619,0.006031965474578245,1.8052974182401518,1.2567064470151015,12.20475944682668,0.9130567409582401,2.4275504819464198,1.410971037275201,48.69450695963205 28 | 2023,5227.831467278073,2524.2395441128856,8431.58705302971,485.53409154613826,22.17435818155097,27.318300009908356,10.757198052551516,13.743035851335769,1.37605565847537,53.207874220602356,64.9887967364667,30.367763701752608,28.049605464107877,2.287864228364043,3.586388635244514,5.457157894040323,11.118430637992812,0.19998263242368858,1.1748043994039912,1.2391104305216951,5.856085114598158,4.8892522177278925,0.7027798728429351,4.003310435855165,1.429714443176869,3.096566324261338,0.45604724850537415,4.562537494175129,1.2879629737871365,0.8851901721002913,6.827172810847369,4.357259922539744,2.345312288703155,7.38909134125634,0.013502412083094347,5.10074062232971,2.2090775642657716,20.73734109606336,1.3653391457500919,3.8163169711129936,2.848598955102299,95.9795940802104 29 | 2024,5169.498305804806,2507.711991183212,8456.234357938389,436.729966928129,19.062476756549053,22.829544151313417,10.941705149379974,15.437132834389503,1.215989341325984,47.26195298573367,58.95945008025453,25.369917366916717,23.07889601058104,2.253054560472725,3.053918538680127,4.637014179591729,9.854290832172996,0.1762529452536664,0.9311095314341327,1.35687062193045,5.340425397786579,4.393990294979633,0.5642380730744111,2.5375120834955287,1.1020797917059095,2.296474336283342,0.36214037512496766,3.4465996126643974,1.1323248693049686,0.6725940183771614,6.259588399117144,4.368916780965709,2.0031678776481354,6.0573392457271975,0.010658234385044221,3.7303952505537596,2.160995798444035,19.462443930211652,1.44204597784622,3.7737337632375083,2.5256563117114674,84.54151928730053 30 | -------------------------------------------------------------------------------- /output/land_use_1750-2024.csv: -------------------------------------------------------------------------------- 1 | year,LUH2-GCB2024_rescaled,irrigation,total 2 | 1750,0.0,0.0,0.0 3 | 1751,-0.00016941737420101424,5.58e-05,-0.00011361737420101424 4 | 1752,-0.0003388353155576002,0.000108818,-0.00023001731555760018 5 | 1753,-0.0005082818768811596,0.000159181,-0.00034910087688115956 6 | 1754,-0.0006777028548886664,0.000206884,-0.00047081885488866644 7 | 1755,-0.0008471455117069578,0.000251954,-0.0005951915117069579 8 | 1756,-0.0010165547787720547,0.000294418,-0.0007221367787720546 9 | 1757,-0.0011859765992301092,0.000334304,-0.0008516725992301092 10 | 1758,-0.0013554202146371685,0.000371639,-0.0009837812146371685 11 | 1759,-0.0015248390056046579,0.000406451,-0.001118388005604658 12 | 1760,-0.0017015535734778095,0.000438767,-0.0012627865734778094 13 | 1761,-0.0018855549549558724,0.000468615,-0.0014169399549558725 14 | 1762,-0.0020695717323629035,0.000496022,-0.0015735497323629034 15 | 1763,-0.0022535702530021816,0.000521016,-0.0017325542530021816 16 | 1764,-0.002437567748038008,0.000543623,-0.001893944748038008 17 | 1765,-0.002621569500551058,0.000563872,-0.002057697500551058 18 | 1766,-0.002805575974367723,0.00058179,-0.002223785974367723 19 | 1767,-0.0029895685477628895,0.000597405,-0.0023921635477628894 20 | 1768,-0.003173579860082603,0.000610743,-0.002562836860082603 21 | 1769,-0.0033575864666089634,0.000621832,-0.0027357544666089632 22 | 1770,-0.0035610801786677758,0.0006307,-0.0029303801786677757 23 | 1771,-0.00378413025038834,0.000637375,-0.00314675525038834 24 | 1772,-0.004007158488534416,0.000641882,-0.0033652764885344164 25 | 1773,-0.0042301841932672665,0.000644251,-0.0035859331932672663 26 | 1774,-0.004453218115212798,0.000644509,-0.0038087091152127976 27 | 1775,-0.004676222196037968,0.000642682,-0.0040335401960379675 28 | 1776,-0.004899264855426526,0.000638799,-0.004260465855426526 29 | 1777,-0.005122278489036654,0.000632887,-0.004489391489036654 30 | 1778,-0.005345322449592924,0.000624973,-0.004720349449592924 31 | 1779,-0.005568357729995504,0.000615085,-0.004953272729995503 32 | 1780,-0.005781895013996854,0.00060325,-0.005178645013996853 33 | 1781,-0.005985972359626741,0.000589495,-0.005396477359626741 34 | 1782,-0.006190050028714,0.000573849,-0.005616201028713999 35 | 1783,-0.006394111530246609,0.000556339,-0.0058377725302466085 36 | 1784,-0.0065981921718882815,0.000536991,-0.006061201171888282 37 | 1785,-0.006802275039920161,0.000515834,-0.006286441039920161 38 | 1786,-0.007006338904348978,0.000492895,-0.0065134439043489775 39 | 1787,-0.007210419208246561,0.000468201,-0.006742218208246561 40 | 1788,-0.0074144811773362955,0.00044178,-0.006972701177336295 41 | 1789,-0.007618559324144516,0.000413659,-0.007204900324144516 42 | 1790,-0.00784836326120321,0.000383866,-0.007464497261203211 43 | 1791,-0.008103866500911999,0.000352428,-0.007751438500911999 44 | 1792,-0.008359364024814077,0.000319373,-0.008039991024814078 45 | 1793,-0.008614864696497158,0.000284728,-0.008330136696497159 46 | 1794,-0.00887034919781067,0.00024852,-0.00862182919781067 47 | 1795,-0.009125866472487757,0.000210778,-0.008915088472487757 48 | 1796,-0.00938137746532234,0.000171528,-0.009209849465322339 49 | 1797,-0.00963688260780316,0.000130797,-0.00950608560780316 50 | 1798,-0.009892386463179156,8.86e-05,-0.009803786463179157 51 | 1799,-0.010147893401811598,4.5e-05,-0.010102893401811598 52 | 1800,-0.010462109773340587,0.0,-0.010462109773340587 53 | 1801,-0.010835055956559658,-4.64e-05,-0.010881455956559658 54 | 1802,-0.01120800172714215,-9.41e-05,-0.01130210172714215 55 | 1803,-0.011580936269092961,-0.00014313,-0.011724066269092961 56 | 1804,-0.011953878185046056,-0.000193453,-0.012147331185046056 57 | 1805,-0.012326816337159305,-0.000245036,-0.012571852337159305 58 | 1806,-0.01269975819045092,-0.000297852,-0.012997610190450919 59 | 1807,-0.013072684468846947,-0.000351874,-0.013424558468846947 60 | 1808,-0.013445628279794723,-0.000407074,-0.013852702279794724 61 | 1809,-0.013818569745932367,-0.000463424,-0.014281993745932368 62 | 1810,-0.014207938750320146,-0.000520898,-0.014728836750320147 63 | 1811,-0.014613691324690656,-0.000579468,-0.015193159324690656 64 | 1812,-0.015019474347665998,-0.000639106,-0.015658580347666 65 | 1813,-0.015425264088898596,-0.000699785,-0.016125049088898596 66 | 1814,-0.015831046671048815,-0.000761477,-0.016592523671048815 67 | 1815,-0.01623681936974173,-0.000824156,-0.01706097536974173 68 | 1816,-0.01664258104206508,-0.000887793,-0.017530374042065082 69 | 1817,-0.01704836064623896,-0.000952361,-0.01800072164623896 70 | 1818,-0.0174541420913255,-0.001017833,-0.0184719750913255 71 | 1819,-0.01785990629982238,-0.001084181,-0.01894408729982238 72 | 1820,-0.01831231346455122,-0.001151378,-0.019463691464551222 73 | 1821,-0.018811359159219672,-0.001219396,-0.020030755159219673 74 | 1822,-0.019310383160706587,-0.001288208,-0.020598591160706586 75 | 1823,-0.01980940726967154,-0.001357786,-0.02116719326967154 76 | 1824,-0.02030844614678285,-0.001428104,-0.02173655014678285 77 | 1825,-0.020807474368026116,-0.001499132,-0.022306606368026116 78 | 1826,-0.021306507741618536,-0.001570845,-0.022877352741618538 79 | 1827,-0.021805541738581284,-0.001643215,-0.023448756738581284 80 | 1828,-0.022304554488506163,-0.001716213,-0.024020767488506164 81 | 1829,-0.02280358707772383,-0.001789814,-0.02459340107772383 82 | 1830,-0.023407486024095158,-0.001863988,-0.02527147402409516 83 | 1831,-0.024116220658664953,-0.00193871,-0.026054930658664953 84 | 1832,-0.024824944497883195,-0.002013951,-0.026838895497883195 85 | 1833,-0.02553368608824679,-0.002089683,-0.027623369088246794 86 | 1834,-0.026242404718179218,-0.00216588,-0.028408284718179216 87 | 1835,-0.026951144671660876,-0.002242515,-0.029193659671660876 88 | 1836,-0.027659868128226302,-0.002319558,-0.0299794261282263 89 | 1837,-0.028368596883883154,-0.002396984,-0.030765580883883155 90 | 1838,-0.029077337800550985,-0.002474764,-0.031552101800550986 91 | 1839,-0.029786074601976357,-0.002552872,-0.03233894660197636 92 | 1840,-0.030468707756601085,-0.002631279,-0.033099986756601085 93 | 1841,-0.03112522231371399,-0.002709959,-0.03383518131371399 94 | 1842,-0.031781755805207416,-0.002788884,-0.034570639805207415 95 | 1843,-0.03243828143327548,-0.002868026,-0.03530630743327548 96 | 1844,-0.03309480220399915,-0.002947357,-0.03604215920399915 97 | 1845,-0.03375133017866683,-0.003026852,-0.036778182178666824 98 | 1846,-0.034407870073978344,-0.003106481,-0.037514351073978346 99 | 1847,-0.03506439605811466,-0.003186218,-0.038250614058114654 100 | 1848,-0.035720926683707944,-0.003266035,-0.038986961683707945 101 | 1849,-0.0363774724451827,-0.003345905,-0.0397233774451827 102 | 1850,-0.037341395482068385,-0.0034258,-0.040767195482068384 103 | 1851,-0.03861278304994692,-0.003505693,-0.04211847604994692 104 | 1852,-0.039884147117507616,-0.003585557,-0.04346970411750762 105 | 1853,-0.04115552334383032,-0.003665363,-0.044820886343830316 106 | 1854,-0.042426894566128734,-0.003745084,-0.04617197856612874 107 | 1855,-0.04369827304977979,-0.003824694,-0.04752296704977979 108 | 1856,-0.04496964276730884,-0.003904164,-0.04887380676730884 109 | 1857,-0.046241012376700835,-0.003983467,-0.05022447937670083 110 | 1858,-0.0475123930571916,-0.004062576,-0.0515749690571916 111 | 1859,-0.04878375785521426,-0.004141463,-0.052925220855214256 112 | 1860,-0.04979907806964097,-0.004220101,-0.054019179069640974 113 | 1861,-0.050558326760813045,-0.004298462,-0.05485678876081305 114 | 1862,-0.05131755063746036,-0.004376519,-0.05569406963746036 115 | 1863,-0.052076779128200364,-0.004454244,-0.05653102312820037 116 | 1864,-0.05283602738389438,-0.00453161,-0.05736763738389438 117 | 1865,-0.05359527235444174,-0.00460859,-0.05820386235444174 118 | 1866,-0.054354507749601114,-0.004685155,-0.05903966274960111 119 | 1867,-0.05511375126988089,-0.00476128,-0.05987503126988089 120 | 1868,-0.05587299681109492,-0.004836935,-0.06070993181109492 121 | 1869,-0.05663222610647789,-0.004912094,-0.06154432010647789 122 | 1870,-0.05794270772318943,-0.00498673,-0.06292943772318943 123 | 1871,-0.05980441979544497,-0.005060814,-0.06486523379544497 124 | 1872,-0.06166613022353739,-0.005134319,-0.0668004492235374 125 | 1873,-0.06352785638156258,-0.005207219,-0.06873507538156258 126 | 1874,-0.06538958071977168,-0.005279485,-0.07066906571977168 127 | 1875,-0.06725130522990697,-0.005351089,-0.07260239422990697 128 | 1876,-0.06911304073414201,-0.005422006,-0.07453504673414202 129 | 1877,-0.07097476369163888,-0.005492206,-0.07646696969163888 130 | 1878,-0.0728364667552495,-0.005561663,-0.0783981297552495 131 | 1879,-0.07469818270104339,-0.005630349,-0.0803285317010434 132 | 1880,-0.0762812572568413,-0.005698237,-0.0819794942568413 133 | 1881,-0.07758566152505895,-0.005765299,-0.08335096052505896 134 | 1882,-0.07889005542572458,-0.005831508,-0.08472156342572458 135 | 1883,-0.08019447538708002,-0.005896837,-0.08609131238708002 136 | 1884,-0.08149888600917343,-0.005961257,-0.08746014300917343 137 | 1885,-0.0828032808733219,-0.006024742,-0.0888280228733219 138 | 1886,-0.0841076979536424,-0.006087264,-0.09019496195364239 139 | 1887,-0.0854121011433043,-0.006148795,-0.0915608961433043 140 | 1888,-0.08671652262381296,-0.006209309,-0.09292583162381296 141 | 1889,-0.08802092661548168,-0.006268777,-0.09428970361548168 142 | 1890,-0.08930706946258654,-0.006327172,-0.09563424146258655 143 | 1891,-0.09057499560814491,-0.006384468,-0.09695946360814492 144 | 1892,-0.09184291980348223,-0.006440635,-0.09828355480348223 145 | 1893,-0.09311084030534482,-0.006495647,-0.09960648730534483 146 | 1894,-0.0943787477014779,-0.006549477,-0.1009282247014779 147 | 1895,-0.09564665552569124,-0.006602097,-0.10224875252569124 148 | 1896,-0.09691456083383058,-0.006653479,-0.10356803983383059 149 | 1897,-0.09818246432939529,-0.006703597,-0.10488606132939529 150 | 1898,-0.09945040095734244,-0.006752422,-0.10620282295734243 151 | 1899,-0.10071831059352082,-0.006799927,-0.10751823759352082 152 | 1900,-0.10224318749121322,-0.006846085,-0.10908927249121322 153 | 1901,-0.10402504845346293,-0.006890961,-0.11091600945346293 154 | 1902,-0.10580694865169597,-0.006934897,-0.11274184565169597 155 | 1903,-0.10758880875362564,-0.006978285,-0.11456709375362564 156 | 1904,-0.10937065660108514,-0.007021517,-0.11639217360108514 157 | 1905,-0.11115253774104092,-0.007064985,-0.11821752274104091 158 | 1906,-0.11293438853410258,-0.007109082,-0.12004347053410258 159 | 1907,-0.11471625008325877,-0.0071542,-0.12187045008325877 160 | 1908,-0.11649810463607366,-0.007200732,-0.12369883663607366 161 | 1909,-0.11827996840632712,-0.007249069,-0.12552903740632712 162 | 1910,-0.11942166951301933,-0.007299604,-0.12672127351301932 163 | 1911,-0.11992318005890257,-0.007352729,-0.12727590905890257 164 | 1912,-0.12042470697148146,-0.007408837,-0.12783354397148144 165 | 1913,-0.12092622938811,-0.007468319,-0.12839454838810999 166 | 1914,-0.12142773698156939,-0.007531569,-0.12895930598156938 167 | 1915,-0.12192927279826465,-0.007598978,-0.12952825079826466 168 | 1916,-0.1224307901461209,-0.007670938,-0.1301017281461209 169 | 1917,-0.12293229330025507,-0.007747842,-0.13068013530025507 170 | 1918,-0.12343381822015483,-0.007830083,-0.13126390122015483 171 | 1919,-0.12393534571028447,-0.007918052,-0.13185339771028448 172 | 1920,-0.12471733818631851,-0.008012142,-0.13272948018631853 173 | 1921,-0.1257798186770472,-0.008112744,-0.13389256267704722 174 | 1922,-0.12684228003859246,-0.008220253,-0.13506253303859247 175 | 1923,-0.12790475343034077,-0.008335058,-0.13623981143034078 176 | 1924,-0.12896722290171816,-0.008457554,-0.13742477690171817 177 | 1925,-0.13002969854952812,-0.008588132,-0.13861783054952811 178 | 1926,-0.13109216814077604,-0.008727184,-0.13981935214077604 179 | 1927,-0.13215461950632496,-0.008875103,-0.14102972250632495 180 | 1928,-0.1332171037174697,-0.009032281,-0.1422493847174697 181 | 1929,-0.13427955239716047,-0.009199111,-0.14347866339716048 182 | 1930,-0.13526739264454085,-0.009375984,-0.14464337664454086 183 | 1931,-0.13618063509299805,-0.009563293,-0.14574392809299805 184 | 1932,-0.13709388647927107,-0.00976143,-0.14685531647927105 185 | 1933,-0.1380071185815587,-0.009970788,-0.1479779065815587 186 | 1934,-0.13892034186584215,-0.010191759,-0.14911210086584215 187 | 1935,-0.13983356402548483,-0.010424734,-0.15025829802548482 188 | 1936,-0.14074679288118955,-0.010670107,-0.15141689988118956 189 | 1937,-0.14166002108826464,-0.01092827,-0.15258829108826463 190 | 1938,-0.14257327096210093,-0.011199614,-0.15377288496210093 191 | 1939,-0.1434865091666177,-0.011484533,-0.1549710421666177 192 | 1940,-0.14356373276776344,-0.011783418,-0.15534715076776343 193 | 1941,-0.1428050072219238,-0.012097003,-0.1549020102219238 194 | 1942,-0.1420462934791065,-0.012426993,-0.1544732864791065 195 | 1943,-0.14128758319395793,-0.012775271,-0.15406285419395793 196 | 1944,-0.14052884705284852,-0.013143715,-0.15367256205284852 197 | 1945,-0.13977010468818601,-0.013534208,-0.153304312688186 198 | 1946,-0.13901138325956117,-0.01394863,-0.15296001325956116 199 | 1947,-0.1382526539257558,-0.01438886,-0.1526415139257558 200 | 1948,-0.13749393701114468,-0.014856781,-0.1523507180111447 201 | 1949,-0.13673520827206972,-0.015354273,-0.15208948127206973 202 | 1950,-0.13686224715152082,-0.015883215,-0.15274546215152082 203 | 1951,-0.13800173921675468,-0.016443684,-0.1544454232167547 204 | 1952,-0.13911818367347548,-0.017030095,-0.15614827867347547 205 | 1953,-0.14006990406311118,-0.017635752,-0.15770565606311118 206 | 1954,-0.14113266876283578,-0.018253962,-0.15938663076283577 207 | 1955,-0.14224387318867862,-0.01887803,-0.1611219031886786 208 | 1956,-0.1431714606117384,-0.019501261,-0.1626727216117384 209 | 1957,-0.1439743912121583,-0.020116961,-0.1640913522121583 210 | 1958,-0.14417278264051558,-0.020718437,-0.1648912196405156 211 | 1959,-0.143737234187353,-0.021298993,-0.165036227187353 212 | 1960,-0.1434520510538705,-0.021851934,-0.16530398505387048 213 | 1961,-0.14347581278586155,-0.022370523,-0.16584633578586155 214 | 1962,-0.14407263812835985,-0.0227436,-0.16681623812835986 215 | 1963,-0.1447311971885183,-0.02303158,-0.1677627771885183 216 | 1964,-0.14499095265791873,-0.023342085,-0.16833303765791874 217 | 1965,-0.14531808451476833,-0.023630211,-0.16894829551476834 218 | 1966,-0.14540535195435464,-0.024066597,-0.16947194895435463 219 | 1967,-0.14650117832826332,-0.024440219,-0.1709413973282633 220 | 1968,-0.14901692545509,-0.024965723,-0.17398264845508998 221 | 1969,-0.15085753261990836,-0.025360148,-0.17621768061990836 222 | 1970,-0.15186803674514351,-0.025779455,-0.17764749174514352 223 | 1971,-0.15220684824830616,-0.026287689,-0.17849453724830616 224 | 1972,-0.15224300785605335,-0.026819272,-0.17906227985605336 225 | 1973,-0.15291619759511224,-0.027521318,-0.18043751559511223 226 | 1974,-0.15347911281013862,-0.027959028,-0.18143814081013862 227 | 1975,-0.1535606558435135,-0.02846046,-0.1820211158435135 228 | 1976,-0.15364635661462772,-0.029067469,-0.18271382561462773 229 | 1977,-0.15458224094876377,-0.029577101,-0.18415934194876377 230 | 1978,-0.15584965833237674,-0.030213099,-0.18606275733237673 231 | 1979,-0.15615364275875024,-0.030704475,-0.18685811775875025 232 | 1980,-0.15656985944523127,-0.03121343,-0.18778328944523126 233 | 1981,-0.15715910742498002,-0.032025999,-0.18918510642498002 234 | 1982,-0.15753134233326468,-0.0326587,-0.1901900423332647 235 | 1983,-0.1582215106705247,-0.033135419,-0.1913569296705247 236 | 1984,-0.15873955798534908,-0.033645647,-0.19238520498534908 237 | 1985,-0.1589453386428304,-0.034198859,-0.1931441976428304 238 | 1986,-0.1590615062668827,-0.034746917,-0.1938084232668827 239 | 1987,-0.1592836818710311,-0.035189741,-0.1944734228710311 240 | 1988,-0.1594936033452316,-0.035610447,-0.1951040503452316 241 | 1989,-0.15919818386076146,-0.036079488,-0.19527767186076145 242 | 1990,-0.15881687425602276,-0.036636641,-0.19545351525602275 243 | 1991,-0.15785023434645434,-0.03703515,-0.19488538434645436 244 | 1992,-0.15653515708840252,-0.037497788,-0.19403294508840252 245 | 1993,-0.15597017388561488,-0.037837532,-0.19380770588561488 246 | 1994,-0.1553721193070667,-0.038272814,-0.19364493330706672 247 | 1995,-0.15450118415068823,-0.038801246,-0.1933024301506882 248 | 1996,-0.15424473458327187,-0.039425583,-0.19367031758327186 249 | 1997,-0.1544357835681106,-0.039845329,-0.1942811125681106 250 | 1998,-0.1544150276131636,-0.04027482,-0.1946898476131636 251 | 1999,-0.1545398631438458,-0.040698754,-0.1952386171438458 252 | 2000,-0.1545473151256485,-0.04124466,-0.1957919751256485 253 | 2001,-0.15356402423255014,-0.041960207,-0.19552423123255014 254 | 2002,-0.15190257966910467,-0.042750552,-0.19465313166910467 255 | 2003,-0.1505708689543872,-0.043562352,-0.1941332209543872 256 | 2004,-0.15,-0.04399098,-0.19399097999999998 257 | 2005,-0.1494991243753968,-0.044328604,-0.1938277283753968 258 | 2006,-0.14815767424869797,-0.044645451,-0.19280312524869797 259 | 2007,-0.14675410150408388,-0.04500011,-0.1917542115040839 260 | 2008,-0.14594561286375174,-0.045261435,-0.19120704786375176 261 | 2009,-0.1451431214359951,-0.045673371,-0.19081649243599508 262 | 2010,-0.14401739391186885,-0.046175723,-0.19019311691186885 263 | 2011,-0.14260400726347863,-0.046638091,-0.18924209826347863 264 | 2012,-0.14155004105083158,-0.047219841,-0.18876988205083156 265 | 2013,-0.14164992655176825,-0.047695311,-0.18934523755176824 266 | 2014,-0.14160341212716207,-0.04802544,-0.18962885212716207 267 | 2015,-0.14114103317204027,-0.048414367,-0.18955540017204026 268 | 2016,-0.1411874692958737,-0.048690667,-0.1898781362958737 269 | 2017,-0.14111054461264613,-0.048995987,-0.19010653161264612 270 | 2018,-0.14086248078365343,-0.049217109,-0.19007958978365344 271 | 2019,-0.14063316505480075,-0.05,-0.19063316505480077 272 | 2020,-0.14061834306749474,-0.050549341,-0.19116768406749474 273 | 2021,-0.1407904542782709,-0.050623851,-0.19141430527827089 274 | 2022,-0.14085306424282756,-0.050749437,-0.19160250124282757 275 | 2023,-0.14088355509749706,-0.051312817733333294,-0.19219637283083035 276 | 2024,-0.14088355509749706,-0.05167948441212111,-0.19256303950961817 277 | -------------------------------------------------------------------------------- /plots/ERF_1750-2022.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/ERF_1750-2022.pdf -------------------------------------------------------------------------------- /plots/ERF_1750-2022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/ERF_1750-2022.png -------------------------------------------------------------------------------- /plots/ERF_1750-2023.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/ERF_1750-2023.pdf -------------------------------------------------------------------------------- /plots/ERF_1750-2023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/ERF_1750-2023.png -------------------------------------------------------------------------------- /plots/ERF_1750-2024.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/ERF_1750-2024.pdf -------------------------------------------------------------------------------- /plots/ERF_1750-2024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/ERF_1750-2024.png -------------------------------------------------------------------------------- /plots/ERF_timeseries_1750-2022.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/ERF_timeseries_1750-2022.pdf -------------------------------------------------------------------------------- /plots/ERF_timeseries_1750-2022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/ERF_timeseries_1750-2022.png -------------------------------------------------------------------------------- /plots/ERF_timeseries_1750-2023.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/ERF_timeseries_1750-2023.pdf -------------------------------------------------------------------------------- /plots/ERF_timeseries_1750-2023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/ERF_timeseries_1750-2023.png -------------------------------------------------------------------------------- /plots/ERF_timeseries_1750-2024.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/ERF_timeseries_1750-2024.pdf -------------------------------------------------------------------------------- /plots/ERF_timeseries_1750-2024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/ERF_timeseries_1750-2024.png -------------------------------------------------------------------------------- /plots/cams_ceds.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/cams_ceds.pdf -------------------------------------------------------------------------------- /plots/cams_ceds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/cams_ceds.png -------------------------------------------------------------------------------- /plots/decadal_trends.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/decadal_trends.pdf -------------------------------------------------------------------------------- /plots/decadal_trends.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/decadal_trends.png -------------------------------------------------------------------------------- /plots/gmst.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/gmst.pdf -------------------------------------------------------------------------------- /plots/gmst.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/gmst.png -------------------------------------------------------------------------------- /plots/slcf-comparison.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/slcf-comparison.pdf -------------------------------------------------------------------------------- /plots/slcf-comparison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/slcf-comparison.png -------------------------------------------------------------------------------- /plots/tape_recorder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/tape_recorder.png -------------------------------------------------------------------------------- /plots/volcanic_AOD.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/volcanic_AOD.pdf -------------------------------------------------------------------------------- /plots/volcanic_AOD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/volcanic_AOD.png -------------------------------------------------------------------------------- /plots/volcanic_ERF.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/volcanic_ERF.pdf -------------------------------------------------------------------------------- /plots/volcanic_ERF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClimateIndicator/forcing-timeseries/3ae20edad8ea7c47bb8a3b87d72068e6f9ec1917/plots/volcanic_ERF.png --------------------------------------------------------------------------------