{ "cells": [ { "cell_type": "markdown", "id": "8d1f3060-1bba-4336-bbd0-e074a80ed0e7", "metadata": {}, "source": [ "# TerraFirma UKESM long-term stabilisation and overshoot scenarios" ] }, { "cell_type": "markdown", "id": "ae3d7093-ab76-4465-bd05-c5dfd14239e8", "metadata": {}, "source": [ "#### Steps to do\n", "- decide how the bias correction should be applied\n", " - according to Tom Mitcham: simulation years 10 to 50 of the ramp-up phase are most equal to 1975-2025 in terms of warming trend\n", " - global mean temperature is similar (+0.26°C), but there is another period (simulation year 0 to 40 which would fit better\n", " - [ ] double-check the warming trend?\n", "- [ ] create a `process_terrafirma_ukesm_data()`,\n", "- [ ] test with HEF using W5E5 or ERA5, RGI7?, regional spinup ...\n", " - do they need that we start from pre-industrial state, or would it be ok, if we just start at simulation year 30 (which would correspond best to a \"climate\" as we had around year 2000, which is around RGI/glavier volume inventory year ... I guess the problem is that their ice sheet / sea-level rise output will be relative to \"pre-industrial\", and therefore, we also need the glaciers to have the \"pre-industrial\" baseline...? \n", "- [ ] do I need to do sth. about the growing out of border issue ...https://github.com/OGGM/oggm/issues/1822 \n", " " ] }, { "cell_type": "code", "execution_count": 65, "id": "6d0764b7-cede-4d23-b4e2-82768d9b2434", "metadata": {}, "outputs": [], "source": [ "import xarray as xr\n", "xr.set_options(use_new_combine_kwarg_defaults=True)\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "7fac9731-8e55-4db6-86dc-342e81ab93bd", "metadata": {}, "source": [ "- \"esm-up2p0\" is the \"ramp-up\" phase.\n", "- \"esm-up2p0-gwl2p0\" is stabilisation at 2C \n", "- \"esm-up2p0-gwl2p0-50y-dn2p0\" is a \"ramp-down\" from the 2C stabilisation after 50 years'\n", "- \"esm-up2p0-gwl4p0\" is stabilisation at 4C\n", "- \"esm-up2p0-gwl4p0-50y-dn2p0\" is a \"ramp-down\" from the 4C stabilisation after 50 years'\n", "- \"esm-hist\" is the same model (UKESM1.2-LL) being forced through the CMIP historical forcing'\n", "- \"esm-piControl\" is the same model with pre-industrial forcing'" ] }, { "cell_type": "code", "execution_count": 66, "id": "c79ac93c-beb3-4686-b36b-947e0b53f077", "metadata": {}, "outputs": [], "source": [ "variables = ['pr','tas']\n", "period = '205001-213912'\n", "scenarios = ['hist', # same model (UKESM1.2-LL) being forced through the CMIP historical forcing\n", " 'up2p0', # ramp-up phase\n", " 'up2p0-gwl2p0', # stabilisation at 2°C\n", " 'up2p0-gwl2p0-50y-dn2p0', # \"ramp-down\" from 2C stabilisation after 50 years'\n", " 'up2p0-gwl4p0', # stabilisation at 4C\n", " \"up2p0-gwl4p0-50y-dn2p0\", # \"ramp-down\" from 4C stabilisation after 50 years'\n", " \"piControl\" # same model with pre-industrial forcing'\n", " ]" ] }, { "cell_type": "code", "execution_count": 67, "id": "0449132e-6d07-452f-806d-cdb688dc8ba8", "metadata": {}, "outputs": [], "source": [ "time_coder = xr.coders.CFDatetimeCoder(use_cftime=True)\n", "run = False\n", "if run:\n", " for var in ['pr','tas']:\n", " _dt = xr.open_mfdataset(f'terrafirma_data/raw_data/{var}_Amon_UKESM1-2-LL_esm-{scen}_r1i1p1f1_gn_*.nc', \n", " decode_times=time_coder).load()\n", " if var == 'tas':\n", " _dt['tas'] = _dt.tas\n", " _dt.tas.attrs['units'] = '°C'\n", " else:\n", " # already in correct format... \n", " assert 'kg m-2 s-1' in _dt.pr.units, 'Precip units not understood'\n", " _dt = _dt.drop_vars(['time_bnds','lat_bnds', 'lon_bnds'])\n", " y0=_dt.time.dt.year.values[0]\n", " y1=_dt.time.dt.year.values[-1]\n", " _dt.to_netcdf(f'terrafirma_data/{var}_Amon_UKESM1-2-LL_esm-{scen}_r1i1p1f1_gn.nc')" ] }, { "cell_type": "code", "execution_count": 91, "id": "6f34a523-934c-41df-9114-a6e6d19dc386", "metadata": {}, "outputs": [], "source": [ "run = False\n", "if run:\n", " for var in ['pr','tas']:\n", " time_coder = xr.coders.CFDatetimeCoder(use_cftime=True)\n", " global_var_mean_dict = {}\n", " for scen in scenarios:\n", " _dt = xr.open_dataset(f'terrafirma_data/{var}_Amon_UKESM1-2-LL_esm-{scen}_r1i1p1f1_gn.nc',\n", " decode_times=time_coder).groupby('time.year').mean().load()\n", " ### check the global mean temperature and precipitation time series\n", " # weighted average over latitudes\n", " if var == 'tas':\n", " _dt[var] = _dt[var]-273.15\n", " weight = np.cos(np.deg2rad(_dt.lat))\n", " weight = weight / weight.sum()\n", " global_var_mean_dict[scen] = (_dt.mean(dim='lon') * weight).sum(dim='lat')\n", " keys = list(global_var_mean_dict.keys())\n", " vals = list(global_var_mean_dict.values())\n", "\n", " ds_global_var_mean = xr.concat(vals, dim=\"scenario\", join='outer')\n", " ds_global_var_mean = ds_global_var_mean.assign_coords(scenario=keys)\n", " ds_global_var_mean.to_netcdf(f'terrafirma_global_annual_mean_{var}_scenarios.nc')\n", "ds_global_tas_mean = xr.open_dataset('terrafirma_global_annual_mean_tas_scenarios.nc')\n", "ds_global_pr_mean = xr.open_dataset('terrafirma_global_annual_mean_pr_scenarios.nc')\n", "\n", "ds_w5e5 = xr.open_dataset('/home/www/oggm/climate/gswp3-w5e5/unflattened/monthly/gswp3-w5e5_obsclim_tas_global_monthly_1901_2019.nc')\n", "ds_w5e5 = ds_w5e5.groupby('time.year').mean().load()\n", "ds_w5e5['tas'] = ds_w5e5['tas'] -273.15\n", "weight = np.cos(np.deg2rad(ds_w5e5.lat))\n", "weight = weight / weight.sum()\n", "ds_global_tas_mean_w5e5 = (ds_w5e5.mean(dim='lon') * weight).sum(dim='lat')" ] }, { "cell_type": "code", "execution_count": 93, "id": "efdea528-12f3-44d4-9ccd-6ebe1506de08", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 45kB\n",
       "Dimensions:   (scenario: 7, year: 695)\n",
       "Coordinates:\n",
       "  * scenario  (scenario) <U22 616B 'hist' 'up2p0' ... 'piControl'\n",
       "  * year      (year) int64 6kB 1850 1851 1852 1853 1854 ... 2541 2542 2543 2544\n",
       "    height    float64 8B ...\n",
       "Data variables:\n",
       "    tas       (scenario, year) float64 39kB ...
" ], "text/plain": [ " Size: 45kB\n", "Dimensions: (scenario: 7, year: 695)\n", "Coordinates:\n", " * scenario (scenario) \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 17kB\n",
       "Dimensions:  (time: 1428)\n",
       "Coordinates:\n",
       "  * time     (time) datetime64[ns] 11kB 1901-01-01 1901-02-01 ... 2019-12-01\n",
       "Data variables:\n",
       "    tas      (time) float32 6kB 11.64 12.03 12.67 13.7 ... 14.89 13.75 13.23
" ], "text/plain": [ " Size: 17kB\n", "Dimensions: (time: 1428)\n", "Coordinates:\n", " * time (time) datetime64[ns] 11kB 1901-01-01 1901-02-01 ... 2019-12-01\n", "Data variables:\n", " tas (time) float32 6kB 11.64 12.03 12.67 13.7 ... 14.89 13.75 13.23" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds_global_tas_mean_w5e5" ] }, { "cell_type": "code", "execution_count": 87, "id": "737c347f-758b-41f0-ac8c-ad79ae75d125", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.37814055952857206 0.3314687672223995 0.8765755454417312\n" ] } ], "source": [ "# standard deviation up2p0 ramp-up \n", "std_ref_period_up2p0 = ds_global_tas_mean.sel(scenario='up2p0').sel(year=slice(1850,1889)).std().tas.values\n", "# standard deviation historical \n", "std_ref_period_hist = ds_global_tas_mean.sel(scenario='hist').sel(year=slice(1975,2014)).std().tas.values\n", "print(std_ref_period_hist, std_ref_period_up2p0, 'std up2p0 vs historical', std_ref_period_up2p0/std_ref_period_hist)" ] }, { "cell_type": "code", "execution_count": 88, "id": "daea9754-f9b5-4264-9276-57a2befa3465", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 1GB\n",
       "Dimensions:  (time: 1428, lat: 360, lon: 720)\n",
       "Coordinates:\n",
       "  * time     (time) datetime64[ns] 11kB 1901-01-01 1901-02-01 ... 2019-12-01\n",
       "  * lat      (lat) float32 1kB 89.75 89.25 88.75 88.25 ... -88.75 -89.25 -89.75\n",
       "  * lon      (lon) float32 3kB -179.8 -179.2 -178.8 -178.2 ... 178.8 179.2 179.8\n",
       "Data variables:\n",
       "    tas      (time, lat, lon) float32 1GB ...\n",
       "Attributes:\n",
       "    title:                     GSWP3-W5E5 observational climate input data fo...\n",
       "    institution:               Potsdam Institute for Climate Impact Research ...\n",
       "    project:                   Inter-Sectoral Impact Model Intercomparison Pr...\n",
       "    contact:                   ISIMIP cross-sectoral science team <info@isimi...\n",
       "    summary:                   GSWP3 v1.09 bias-adjusted to W5E5 v2.0 with IS...\n",
       "    references:                Kim (2017) <https://doi.org/10.20783/DIAS.501>...\n",
       "    postprocessing_date:       2022-05-12\n",
       "    postprocessing_scientist:  lilian.schuster@student.uibk.ac.at\n",
       "    postprocessing_actions:    using xarray: ds = xr.open_mfdataset(gswp3-w5e...
" ], "text/plain": [ " Size: 1GB\n", "Dimensions: (time: 1428, lat: 360, lon: 720)\n", "Coordinates:\n", " * time (time) datetime64[ns] 11kB 1901-01-01 1901-02-01 ... 2019-12-01\n", " * lat (lat) float32 1kB 89.75 89.25 88.75 88.25 ... -88.75 -89.25 -89.75\n", " * lon (lon) float32 3kB -179.8 -179.2 -178.8 -178.2 ... 178.8 179.2 179.8\n", "Data variables:\n", " tas (time, lat, lon) float32 1GB ...\n", "Attributes:\n", " title: GSWP3-W5E5 observational climate input data fo...\n", " institution: Potsdam Institute for Climate Impact Research ...\n", " project: Inter-Sectoral Impact Model Intercomparison Pr...\n", " contact: ISIMIP cross-sectoral science team ...\n", " postprocessing_date: 2022-05-12\n", " postprocessing_scientist: lilian.schuster@student.uibk.ac.at\n", " postprocessing_actions: using xarray: ds = xr.open_mfdataset(gswp3-w5e..." ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a960a6b4-6865-4fe2-bd67-cd5b1c68ade6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 69, "id": "ab3e01eb-16fd-431a-b525-8a259aa76bae", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "linear fit slope °C/year: 0.028984237786977774 , Theil–Sen slope °C/year: 0.030282438500246388\n" ] } ], "source": [ "tas_ann_hist_ref = ds_global_tas_mean.sel(scenario='hist').sel(year=slice(1975,2014)).tas\n", "from scipy.stats import linregress\n", "from scipy.stats import theilslopes\n", "\n", "tas_ann = tas_ann_hist_ref\n", "t = tas_ann.year\n", "y = tas_ann.values\n", "res = linregress(t, y) \n", "ts = theilslopes(y, t)\n", "ref_period_1975_2014_linear_fit_slope = res.slope\n", "ref_period_1975_2014_theil_sen_slope = ts[0]\n", "print(\"linear fit slope °C/year:\", res.slope, \", Theil–Sen slope °C/year:\", ts[0])\n", "#print(\"95% CI lower:\", ts[2])\n", "#print(\"95% CI upper:\", ts[3])\n", "ref_period_1975_2014 = ds_global_tas_mean.sel(scenario='hist').tas.sel(year=slice(1975,2014)).mean()" ] }, { "cell_type": "code", "execution_count": 70, "id": "850f7707-020f-478b-8533-f7498a36d6bf", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'tas' (year: 290)> Size: 2kB\n",
       "array([13.661966, 13.743564, 13.805403, ..., 19.755408, 19.778811, 19.862972])\n",
       "Coordinates:\n",
       "  * year      (year) int64 2kB 1850 1851 1852 1853 1854 ... 2136 2137 2138 2139\n",
       "    height    float64 8B ...\n",
       "    scenario  <U22 88B 'up2p0'
" ], "text/plain": [ " Size: 2kB\n", "array([13.661966, 13.743564, 13.805403, ..., 19.755408, 19.778811, 19.862972])\n", "Coordinates:\n", " * year (year) int64 2kB 1850 1851 1852 1853 1854 ... 2136 2137 2138 2139\n", " height float64 8B ...\n", " scenario \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'year' ()> Size: 8B\n",
       "array(39.)\n",
       "Coordinates:\n",
       "    height   float64 8B 1.5
" ], "text/plain": [ " Size: 8B\n", "array(39.)\n", "Coordinates:\n", " height float64 8B 1.5" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rolling_40yr_ramp = ds_global_tas_mean.sel(scenario='up2p0').tas.rolling(year=40, center=False).mean().dropna(dim='year') - ref_period_1975_2014\n", "year_match = np.abs(rolling_40yr_ramp).idxmin()\n", "year_match-1850\n", "# when just checking the global average temperature using 1850 to 1889 works best," ] }, { "cell_type": "markdown", "id": "ce2b0828-0854-4239-8e0c-813b8f9b2193", "metadata": {}, "source": [ "- In my opinion, year 0 to 40 of the ramp up scenario (up2p0) fits best to the historical 1975-2014 period in terms of both, the warming trend and the global mean temperature. However, according to the paper it is year 10 to 50. " ] }, { "cell_type": "markdown", "id": "a2a628ac-292b-4399-895a-b94124b5aba3", "metadata": {}, "source": [ "----\n", "- Tom Mitcham: the years 10-50 of the \"ramp-up\" is nearest to the years 1975-2015 of the \"esm-hist\" simulation, at least when comparing global average warming across a set time-period compared to the pre-industrial simulation.\n", "- referred paper: \"We therefore compare the evolution of the UKESM1.2 CMIP6 historical runs and the TIPMIP ramp-up runs over a common GMSAT space, namely for the 40-year period of observed warming from 0.2°C to 1.0°C and the same 40-year warming period in the ramp-up run. This equates to 1975 to 2015 in the historical runs and years 10 to 50 of the TIPMIP ramp-up.\"\n", "---" ] }, { "cell_type": "code", "execution_count": 99, "id": "b747662d-27d5-4131-aa17-913e3d982b97", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'year' ()> Size: 8B\n",
       "array(1889.)\n",
       "Coordinates:\n",
       "    height   float64 8B 1.5
" ], "text/plain": [ " Size: 8B\n", "array(1889.)\n", "Coordinates:\n", " height float64 8B 1.5" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "code", "execution_count": 21, "id": "55711846-95f4-4fe7-a4a0-92a3881461b3", "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'ds_global_tas_mean' is not defined", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mNameError\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[21]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m scen \u001b[38;5;129;01min\u001b[39;00m scenarios: \n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m plt.plot(\u001b[43mds_global_tas_mean\u001b[49m.sel(scenario=scen).year, \n\u001b[32m 3\u001b[39m ds_global_tas_mean.sel(scenario=scen)-ref_period_1975_2014,\n\u001b[32m 4\u001b[39m label=scen)\n\u001b[32m 5\u001b[39m plt.plot(np.arange(\u001b[32m1850\u001b[39m,\u001b[32m1890\u001b[39m,\u001b[32m1\u001b[39m),\n\u001b[32m 6\u001b[39m ds_global_tas_mean.sel(scenario=\u001b[33m'\u001b[39m\u001b[33mhist\u001b[39m\u001b[33m'\u001b[39m).sel(year=\u001b[38;5;28mslice\u001b[39m(\u001b[32m1975\u001b[39m,\u001b[32m2014\u001b[39m))-ref_period_1975_2014, color=\u001b[33m'\u001b[39m\u001b[33mgrey\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 7\u001b[39m plt.axhline(\u001b[32m0\u001b[39m, lw=\u001b[32m2\u001b[39m, color=\u001b[33m'\u001b[39m\u001b[33mgrey\u001b[39m\u001b[33m'\u001b[39m)\n", "\u001b[31mNameError\u001b[39m: name 'ds_global_tas_mean' is not defined" ] } ], "source": [ "for scen in scenarios: \n", " plt.plot(ds_global_tas_mean.sel(scenario=scen).year, \n", " ds_global_tas_mean.sel(scenario=scen)-ref_period_1975_2014,\n", " label=scen)\n", "plt.plot(np.arange(1850,1890,1),\n", " ds_global_tas_mean.sel(scenario='hist').sel(year=slice(1975,2014))-ref_period_1975_2014, color='grey')\n", "plt.axhline(0, lw=2, color='grey')\n", "plt.legend(title = 'Scenarios', bbox_to_anchor=(1, 1.02))\n", "plt.ylabel('Global warming (rel. to 1975-2014)')\n", "plt.savefig('terrafirma_global_warming_scenarios.png')" ] }, { "cell_type": "code", "execution_count": null, "id": "487b3282-e609-4425-9af6-8eef2a085b48", "metadata": {}, "outputs": [], "source": [ "for scen in scenarios: \n", " plt.plot(ds_global_pr_mean.sel(scenario=scen).year, \n", " ds_global_pr_mean.sel(scenario=scen)-ref_period_1975_2014,\n", " label=scen)\n", "plt.plot(np.arange(1850,1890,1),\n", " ds_global_pr_mean.sel(scenario='hist').sel(year=slice(1975,2014))-ref_period_1975_2014,\n", " color='grey')\n", "plt.axhline(0, lw=2, color='grey')\n", "plt.legend(title = 'Scenarios', bbox_to_anchor=(1, 1.02))\n", "plt.ylabel('Global average precipitation (kg m-2 year-1)')\n", "plt.savefig('terrafirma_global_mean_precipiation_scenarios.png')" ] }, { "cell_type": "code", "execution_count": 73, "id": "58a86ef1-af21-4fa1-8ffd-f0e8b9557747", "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'global_pr_mean_dict' is not defined", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mNameError\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[73]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m scen \u001b[38;5;129;01min\u001b[39;00m scenarios: \n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m plt.plot(\u001b[43mglobal_pr_mean_dict\u001b[49m[scen].year, \n\u001b[32m 3\u001b[39m global_pr_mean_dict[scen], \u001b[38;5;66;03m# unit is kg m-2 s-1 --> *60 * 60*24*365.25 (kg m-2 year-1)\u001b[39;00m\n\u001b[32m 4\u001b[39m label=scen)\n\u001b[32m 5\u001b[39m plt.plot(np.arange(\u001b[32m1850\u001b[39m,\u001b[32m1890\u001b[39m,\u001b[32m1\u001b[39m),\n\u001b[32m 6\u001b[39m global_tas_mean_dict[\u001b[33m'\u001b[39m\u001b[33mhist\u001b[39m\u001b[33m'\u001b[39m].sel(year=\u001b[38;5;28mslice\u001b[39m(\u001b[32m1975\u001b[39m,\u001b[32m2014\u001b[39m))-ref_period_1975_2014, color=\u001b[33m'\u001b[39m\u001b[33mgrey\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 7\u001b[39m plt.axhline(\u001b[32m0\u001b[39m, lw=\u001b[32m2\u001b[39m, color=\u001b[33m'\u001b[39m\u001b[33mgrey\u001b[39m\u001b[33m'\u001b[39m)\n", "\u001b[31mNameError\u001b[39m: name 'global_pr_mean_dict' is not defined" ] } ], "source": [ "for scen in scenarios: \n", " plt.plot(global_pr_mean_dict[scen].year, \n", " global_pr_mean_dict[scen], # unit is kg m-2 s-1 --> *60 * 60*24*365.25 (kg m-2 year-1)\n", " label=scen)\n", "plt.plot(np.arange(1850,1890,1),\n", " global_tas_mean_dict['hist'].sel(year=slice(1975,2014))-ref_period_1975_2014, color='grey')\n", "plt.axhline(0, lw=2, color='grey')\n", "plt.legend(title = 'Scenarios', bbox_to_anchor=(1, 1.02))\n", "plt.ylabel('Global average precipitation (kg m-2 year-1)')\n", "plt.savefig('terrafirma_global_mean_precipiation_scenarios.png')" ] }, { "cell_type": "code", "execution_count": null, "id": "a937dc4d-1d40-4e66-8b69-a241ea0b52ed", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:oggm_env_2025]", "language": "python", "name": "conda-env-oggm_env_2025-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.14" } }, "nbformat": 4, "nbformat_minor": 5 }