Cosma Ehrngruber, Stefan Müller, Md Kawsar Hossan
Group project¶
Instructions¶
Objectives
In this final project, you should pick two glacierized basins and analyse the projected future of glaciers for different climate scenarios, and compare them to each other. For this you should use tools and knowledge you gained during the practical sessions in the last weeks.
Deadline
Please submit your project via OLAT before Monday June 17 at 00H (in the night from Monday to Tuesday).
Formal requirements
You will work in groups of two. If we are an odd number of students, one group can have three participants. (Tip: I recommend that students who have not followed a programming class to team up with students who have).
Each group will submit one (executed) jupyter notebook containing the code, plots, and answers to the questions (text in the markdown format) on OLAT. Please also submit an HTML version of the notebook. Please ensure that your HTML file is smaller than 10 MB. This helps us provide you with more detailed and readable feedback.
Each group member must contribute to the notebook. The notebook should be self-contained and the answers must be well structured. The plots must be as understandable as possible (title, units, x and y axis labels, appropriate colors…).
Please be concise in your answer. We expect a few sentences per answer at most - there is no need to write a new text book in this project! Use links and references to the literature or your class slides where appropriate.
Grading
We will give one grade per project, according to the following table (total 10 points):
- correctness of the code and the plots: content, legends, colors, units, etc. (3 points)
- quality of the answers: correctness, preciseness, appropriate use of links and references to literature or external resources (5 points)
- contextualise your findings with literature (2 points)
# Imports
import os
import urllib.request
import xarray as xr
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
International Network for Alpine Research Catchment Hydrology INARCH¶
We aim, with this group project, to contribute to the INARCH initiative. The goal of INARCH is to better understand hydrological processes in alpine cold regions, improve their prediction, diagnose their sensitivity to global change, and develop consistent measurement strategies. You can find more information on the INARCH website.
In this project, our focus will be on glacier projections from OGGM in glacierized basins of INARCH. You are expected to analyze how glaciers are evolving and how their contribution to total runoff is changing. The final outcome will be a dataset of OGGM projections for all CMIP5 and CMIP6 scenarios (which I have prepared), along with a first analysis of this dataset, this is the core of your work in the group project.
For your individual group analysis, you should compare two basins. As a whole class, we aim to ensure that each basin is covered by at least one group. The selection of basins is up to each group and should be done using the link to the spreadsheet shared in the presentation (first come, first served).
In your analysis, make sure to incorporate the background knowledge about how OGGM is working and how the data was generated, as we discussed during the practical sessions.
Selecting Temperature Scenarios for Analysis¶
To analyze how glaciers are evolving, we will group the projections by temperature warming levels, as done in a previous session. For this, you will again need the table containing the actual warming levels for each climate model realization. You can download it here and save it at the same location as this notebook.
Below is the code used to select the model realizations based on temperature targets. Our analysis focuses on three temperature goals: 1.5°C, 2.7°C, and 4.0°C, each with a tolerance of ±0.2°C.
# reading the csv file
df_warming_levels = pd.read_csv('cmip5_and_cmip6_warming_compared_to_preindustrial.csv', index_col=0)
# the function takes a target temperature and a range, e.g. 2.7+/-0.2°C
def get_models_from_temp(temp, temp_range):
pi_l = temp - temp_range # our lower temperature limit
pi_u = temp + temp_range # our higher temperature limit
# select only those which are inside of our temperature limit
pd_cmip_sel = df_warming_levels.loc[
# select all which have a larger temperature as our lower limit AND
(df_warming_levels['global_temp_ch_2071-2100_preindustrial']>=pi_l) &
# those having a smaller temperature as our higher limit
(df_warming_levels['global_temp_ch_2071-2100_preindustrial']<=pi_u)
]
return pd_cmip_sel
# define the models for each temperature goal in a dictionary
temp_scenarios = {
'4°C': get_models_from_temp(4, 0.2),
'2.7°C': get_models_from_temp(2.7, 0.2),
'1.5°C': get_models_from_temp(1.5, 0.2),
}
for i in ['4°C', '2.7°C', '1.5°C']:
print(i)
print(temp_scenarios[i].describe())
4°C
global_temp_ch_2071-2100_preindustrial
count 9.000000
mean 4.064146
std 0.098363
min 3.873557
25% 4.035788
50% 4.081607
75% 4.125652
max 4.197179
2.7°C
global_temp_ch_2071-2100_preindustrial
count 14.000000
mean 2.714388
std 0.109275
min 2.544987
25% 2.629777
50% 2.719225
75% 2.790105
max 2.870632
1.5°C
global_temp_ch_2071-2100_preindustrial
count 11.000000
mean 1.563848
std 0.108693
min 1.307174
25% 1.522301
50% 1.579428
75% 1.643263
max 1.692323
Answer
The selection of climate model realizations for each temperature target generally appears to be effective, with the average and median warming levels closely aligning with their respective targets, especially for 4°C and 2.7°C. The slight positive deviation for the 1.5°C target is minor but notable. The varying number of realizations per target reflects the availability and selection process of the models for each specific warming scenario.
Getting the Data for Your Basins¶
To begin your analysis, you need to load the glacier and runoff projection data for your assigned basins. Make sure you know which basins your group is working on (as selected in the shared spreadsheet). The data for each basin is stored in individual files, which you can load using the provided code template. You can choose where to store the data locally by setting the variable local_data_dir. By default, this will create a new folder called glacier_projection_data in the same location as your notebook.
# add here your the basin_id of your selected basins (e.g. ['basin_1', 'basin_2'])
basin_ids = ['yarla_shampo', 'salcca_sibinacocha']
# you can select here a location on your computer to store the glacier data
local_data_dir = 'glacier_projection_data'
# create the directory, if it does not exist
os.makedirs(local_data_dir, exist_ok=True)
# the url where all the data is stored
base_url = 'https://cluster.klima.uni-bremen.de/~pschmitt/teaching/cryo_in_climate/INARCH/data/'
# in this structure we will save the opened data
ds_all = {}
# Code for downloading the data, if data already downloaded this will be skipped
for basin in basin_ids:
# create a directory for each basin
basin_url = os.path.join(base_url, basin, '2100')
local_basin_dir = os.path.join(local_data_dir, basin)
os.makedirs(local_basin_dir, exist_ok=True)
ds_all[basin] = {}
for temp_level in temp_scenarios:
ds_tmp_all = []
for i, realization in temp_scenarios[temp_level].iterrows():
# depending on the CMIP, different names for scenarios
scenario_column = 'ssp' if realization['cmip'] == 'CMIP6' else 'rcp'
filename = f"basin_{basin}_run_hydro_w5e5_gcm_merged_bc_2000_2019_{realization['gcm']}_{realization[scenario_column]}.nc"
# only download if file not already downloaded
if os.path.isfile(os.path.join(local_basin_dir, filename)):
print(f"File already downloaded: {filename}")
else:
print(f"Downloading {filename}")
urllib.request.urlretrieve(
os.path.join(basin_url, filename),
os.path.join(local_basin_dir, filename))
# open individual dataset and combine gcma and scenaio in new variable
with xr.open_dataset(os.path.join(local_basin_dir, filename)) as ds:
ds_stacked = ds.stack(gcm_scenario=("gcm", "scenario"))
ds_tmp_all.append(ds_stacked)
print(f'{basin}: combining data for {temp_level}')
ds_all[basin][temp_level] = xr.combine_by_coords(ds_tmp_all, fill_value=np.nan)
File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_CCSM4_rcp85.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_MPI-ESM-LR_rcp85.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_CNRM-CM5_rcp85.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_NorESM2-MM_ssp585.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_BCC-CSM2-MR_ssp585.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_FGOALS-f3-L_ssp585.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_CESM2-WACCM_ssp370.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_CESM2_ssp370.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_EC-Earth3-Veg_ssp370.nc yarla_shampo: combining data for 4°C File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_CNRM-CM5_rcp45.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_CSIRO-Mk3-6-0_rcp45.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_IPSL-CM5A-LR_rcp45.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_CCSM4_rcp60.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-CM3_rcp26.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_ACCESS-CM2_ssp126.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_CanESM5_ssp126.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_CAMS-CSM1-0_ssp370.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_CESM2-WACCM_ssp534-over.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_IPSL-CM6A-LR_ssp534-over.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_MRI-ESM2-0_ssp245.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_BCC-CSM2-MR_ssp245.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_FGOALS-f3-L_ssp245.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_MRI-ESM2-0_ssp434.nc yarla_shampo: combining data for 2.7°C File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-ESM2G_rcp45.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_NorESM1-M_rcp26.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_MPI-ESM-LR_rcp26.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_CCSM4_rcp26.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_MPI-ESM1-2-HR_ssp126.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-ESM4_ssp126.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_INM-CM4-8_ssp126.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_INM-CM5-0_ssp126.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_CAMS-CSM1-0_ssp126.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-ESM4_ssp119.nc File already downloaded: basin_yarla_shampo_run_hydro_w5e5_gcm_merged_bc_2000_2019_MRI-ESM2-0_ssp119.nc yarla_shampo: combining data for 1.5°C File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_CCSM4_rcp85.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_MPI-ESM-LR_rcp85.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_CNRM-CM5_rcp85.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_NorESM2-MM_ssp585.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_BCC-CSM2-MR_ssp585.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_FGOALS-f3-L_ssp585.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_CESM2-WACCM_ssp370.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_CESM2_ssp370.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_EC-Earth3-Veg_ssp370.nc salcca_sibinacocha: combining data for 4°C File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_CNRM-CM5_rcp45.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_CSIRO-Mk3-6-0_rcp45.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_IPSL-CM5A-LR_rcp45.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_CCSM4_rcp60.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-CM3_rcp26.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_ACCESS-CM2_ssp126.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_CanESM5_ssp126.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_CAMS-CSM1-0_ssp370.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_CESM2-WACCM_ssp534-over.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_IPSL-CM6A-LR_ssp534-over.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_MRI-ESM2-0_ssp245.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_BCC-CSM2-MR_ssp245.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_FGOALS-f3-L_ssp245.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_MRI-ESM2-0_ssp434.nc salcca_sibinacocha: combining data for 2.7°C File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-ESM2G_rcp45.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_NorESM1-M_rcp26.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_MPI-ESM-LR_rcp26.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_CCSM4_rcp26.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_MPI-ESM1-2-HR_ssp126.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-ESM4_ssp126.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_INM-CM4-8_ssp126.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_INM-CM5-0_ssp126.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_CAMS-CSM1-0_ssp126.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-ESM4_ssp119.nc File already downloaded: basin_salcca_sibinacocha_run_hydro_w5e5_gcm_merged_bc_2000_2019_MRI-ESM2-0_ssp119.nc salcca_sibinacocha: combining data for 1.5°C
After downloading and processing the data, everything will be stored in the variable ds_all. You can access the data for a specific basin and temperature level using the syntax ds_all[basin_name][temperature_level]. Below you can find one example:
ds_all[basin_ids[0]]['1.5°C']
ds_all[basin_ids[1]]['1.5°C']
<xarray.Dataset> Size: 12MB
Dimensions: (time: 101, rgi_id: 39, gcm_scenario: 11,
month_2d: 12)
Coordinates:
* time (time) float64 808B 2e+03 ... 2.1e+03
* rgi_id (rgi_id) <U14 2kB 'RGI60-16.01011' ... 'RGI...
hydro_year (time) int64 808B 2000 2001 2002 ... 2099 2100
hydro_month (time) int64 808B 10 10 10 10 ... 10 10 10 10
calendar_year (time) int64 808B 2000 2001 2002 ... 2099 2100
calendar_month (time) int64 808B 1 1 1 1 1 1 ... 1 1 1 1 1 1
* month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
calendar_month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
* gcm_scenario (gcm_scenario) object 88B MultiIndex
* gcm (gcm_scenario) <U13 572B 'CAMS-CSM1-0' ... ...
* scenario (gcm_scenario) <U6 264B 'ssp126' ... 'rcp26'
Data variables: (12/14)
volume (time, rgi_id, gcm_scenario) float32 173kB ...
area (time, rgi_id, gcm_scenario) float32 173kB ...
on_area (time, rgi_id, gcm_scenario) float32 173kB ...
off_area (time, rgi_id, gcm_scenario) float32 173kB ...
melt_off_glacier (time, rgi_id, gcm_scenario) float32 173kB ...
melt_on_glacier (time, rgi_id, gcm_scenario) float32 173kB ...
... ...
melt_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
melt_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
liq_prcp_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
liq_prcp_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
runoff_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
runoff (time, rgi_id, gcm_scenario) float32 173kB ...
Attributes:
description: OGGM model output
oggm_version: 1.6.1.dev26+gf8a1745
calendar: 365-day no leap
creation_date: 2025-05-07 20:14:15
bias_correction: bc_2000_2019
basin_name: Salcca-Sibinacocha
basin_area_km2: 1150.7452077516787
glaciers_in_basin: 39
glacierised_area_perc: 7.714218525701308
glacierised_area_km2: 88.771Dimensions and Coordinates¶
The dataset is multi-dimensional, structured around:
- time: Spanning 101 entries, covering years from 2000 to 2100 (e.g.,
calendar_yearfrom 2000 to 2099). - rgi_id: 39 entries, identifying specific Randolph Glacier Inventory (RGI) regions (e.g.,
RGI60-10.011). - gcm_scenario: 11 entries, a MultiIndex combining General Circulation Models (GCMs) like
'CAMS-CSM1-0'and climate scenarios (SSPs/RCPs) like'ssp126'. - month_2d: 12 entries, representing calendar months (1 to 12).
Data Variables and Temporal Resolution¶
The dataset contains numerous float32 and float64 data variables, primarily focusing on glacier dynamics and hydrology:
- Glacier State:
volumeandarea(total glacier volume and area). - Melt and Precipitation:
melt_off_glacier,melt_on_glacier(meltwater from off-glacier and on-glacier areas).liq_prcp_off_glacier,liq_prcp_on_glacier(liquid precipitation on respective areas).- Some of these are also provided with a
month_2ddimension (e.g.,melt_off_glacier_...,liq_prcp_...).
- Runoff:
runoff_monthly(monthly total water outflow).runoff(likely annual or cumulative).
Temporal Resolution:
- Most variables (
volume,area,runoffwithout_monthly) are at an annual resolution over the 2000–2100 period. - Others, particularly those with
_monthlyin their name or themonth_2ddimension, provide data at a monthly resolution. - The presence of
nanvalues indicates missing data points.
This dataset offers a comprehensive view of glacial and hydrological changes. Its multi-dimensional structure allows for analysis across time, specific glacier regions, and various climate model/scenario combinations. The mix of annual and monthly resolutions provides flexibility for different analytical needs regarding glacier evolution, water resources, and climate impact assessments.
Common running glaciers¶
Some individual glacier projections may be missing or not available for certain scenarios. To avoid introducing errors due to differing glacier counts across scenarios, we will first extract only those glaciers that are available in all scenarios:
# in this variable the common running glaciers will be saved for each basin
not_nan_rgi_ids_all = {}
# loop through your basins
for basin in basin_ids:
not_nan_rgi_ids = None
# loop though the temperature scenarios, only glaciers which are available in all temperature scenarios are selected
for temp in temp_scenarios:
not_nan_rgi_ids_temp = ~ds_all[basin][temp].volume.isnull().any(dim=["time", "gcm_scenario"])
if not_nan_rgi_ids is None:
not_nan_rgi_ids = not_nan_rgi_ids_temp
else:
not_nan_rgi_ids &= not_nan_rgi_ids_temp
# save the working rgi_ids for each basin
not_nan_rgi_ids_all[basin] = not_nan_rgi_ids.rgi_id[not_nan_rgi_ids].values
We can now use this list of valid rgi_ids to filter our data and include only those glaciers that are available across all scenarios.
basin_example = basin_ids[1]
ds_all[basin_example]['2.7°C'].sel(rgi_id=not_nan_rgi_ids_all[basin_example]).rgi_id
<xarray.DataArray 'rgi_id' (rgi_id: 39)> Size: 2kB
array(['RGI60-16.01011', 'RGI60-16.01012', 'RGI60-16.01016', 'RGI60-16.01022',
'RGI60-16.01024', 'RGI60-16.01026', 'RGI60-16.01027', 'RGI60-16.01028',
'RGI60-16.01029', 'RGI60-16.01040', 'RGI60-16.01042', 'RGI60-16.01043',
'RGI60-16.01072', 'RGI60-16.01073', 'RGI60-16.01074', 'RGI60-16.01075',
'RGI60-16.01076', 'RGI60-16.01077', 'RGI60-16.01106', 'RGI60-16.01154',
'RGI60-16.01155', 'RGI60-16.01157', 'RGI60-16.01160', 'RGI60-16.01176',
'RGI60-16.01177', 'RGI60-16.01178', 'RGI60-16.01179', 'RGI60-16.01180',
'RGI60-16.01250', 'RGI60-16.01251', 'RGI60-16.01252', 'RGI60-16.01259',
'RGI60-16.01265', 'RGI60-16.01268', 'RGI60-16.01269', 'RGI60-16.01276',
'RGI60-16.01277', 'RGI60-16.01278', 'RGI60-16.01282'], dtype='<U14')
Coordinates:
* rgi_id (rgi_id) <U14 2kB 'RGI60-16.01011' ... 'RGI60-16.01282'
Attributes:
description: RGI glacier identifierAnswer
no glacier was lost during the filtering process in the two analysed basins
Describe your basins¶
Before starting your data analysis, take some time to explore your selected basins and do a bit of background research. You can download all basin shapefiles here to examine them more closely.
- Where are the basins located, and what are their climate conditions?
- How large is each basin, and what proportion of the area is glacierized? (Tip: check the Attribues of ds_all for the individual basins)
ds_all
{'yarla_shampo': {'4°C': <xarray.Dataset> Size: 6MB
Dimensions: (time: 101, rgi_id: 22, gcm_scenario: 9,
month_2d: 12)
Coordinates:
* time (time) float64 808B 2e+03 ... 2.1e+03
* rgi_id (rgi_id) <U14 1kB 'RGI60-13.04694' ... 'RGI...
hydro_year (time) int64 808B 2000 2001 2002 ... 2099 2100
hydro_month (time) int64 808B 4 4 4 4 4 4 ... 4 4 4 4 4 4
calendar_year (time) int64 808B 2000 2001 2002 ... 2099 2100
calendar_month (time) int64 808B 1 1 1 1 1 1 ... 1 1 1 1 1 1
* month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
calendar_month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
* gcm_scenario (gcm_scenario) object 72B MultiIndex
* gcm (gcm_scenario) <U13 468B 'BCC-CSM2-MR' ... ...
* scenario (gcm_scenario) <U6 216B 'ssp585' ... 'ssp585'
Data variables: (12/14)
volume (time, rgi_id, gcm_scenario) float32 80kB 1...
area (time, rgi_id, gcm_scenario) float32 80kB 6...
on_area (time, rgi_id, gcm_scenario) float32 80kB 6...
off_area (time, rgi_id, gcm_scenario) float32 80kB 3...
melt_off_glacier (time, rgi_id, gcm_scenario) float32 80kB 3...
melt_on_glacier (time, rgi_id, gcm_scenario) float32 80kB 5...
... ...
melt_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 960kB ...
melt_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 960kB ...
liq_prcp_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 960kB ...
liq_prcp_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 960kB ...
runoff_monthly (time, month_2d, rgi_id, gcm_scenario) float32 960kB ...
runoff (time, rgi_id, gcm_scenario) float32 80kB 9...
Attributes:
description: OGGM model output
oggm_version: 1.6.1.dev26+gf8a1745
calendar: 365-day no leap
creation_date: 2025-05-07 20:14:15
bias_correction: bc_2000_2019
basin_name: Yarla Shampo Glacier (Shannan/Lhoka)
basin_area_km2: 2260.682031759661
glaciers_in_basin: 22
glacierised_area_perc: 0.36736701063331695
glacierised_area_km2: 8.305,
'2.7°C': <xarray.Dataset> Size: 9MB
Dimensions: (time: 101, rgi_id: 22, gcm_scenario: 14,
month_2d: 12)
Coordinates:
* time (time) float64 808B 2e+03 ... 2.1e+03
* rgi_id (rgi_id) <U14 1kB 'RGI60-13.04694' ... 'RGI...
hydro_year (time) int64 808B 2000 2001 2002 ... 2099 2100
hydro_month (time) int64 808B 4 4 4 4 4 4 ... 4 4 4 4 4 4
calendar_year (time) int64 808B 2000 2001 2002 ... 2099 2100
calendar_month (time) int64 808B 1 1 1 1 1 1 ... 1 1 1 1 1 1
* month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
calendar_month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
* gcm_scenario (gcm_scenario) object 112B MultiIndex
* gcm (gcm_scenario) <U13 728B 'ACCESS-CM2' ... '...
* scenario (gcm_scenario) <U11 616B 'ssp126' ... 'ssp434'
Data variables: (12/14)
volume (time, rgi_id, gcm_scenario) float32 124kB ...
area (time, rgi_id, gcm_scenario) float32 124kB ...
on_area (time, rgi_id, gcm_scenario) float32 124kB ...
off_area (time, rgi_id, gcm_scenario) float32 124kB ...
melt_off_glacier (time, rgi_id, gcm_scenario) float32 124kB ...
melt_on_glacier (time, rgi_id, gcm_scenario) float32 124kB ...
... ...
melt_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 1MB ...
melt_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 1MB ...
liq_prcp_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 1MB ...
liq_prcp_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 1MB ...
runoff_monthly (time, month_2d, rgi_id, gcm_scenario) float32 1MB ...
runoff (time, rgi_id, gcm_scenario) float32 124kB ...
Attributes:
description: OGGM model output
oggm_version: 1.6.1.dev26+gf8a1745
calendar: 365-day no leap
creation_date: 2025-05-07 20:14:15
bias_correction: bc_2000_2019
basin_name: Yarla Shampo Glacier (Shannan/Lhoka)
basin_area_km2: 2260.682031759661
glaciers_in_basin: 22
glacierised_area_perc: 0.36736701063331695
glacierised_area_km2: 8.305,
'1.5°C': <xarray.Dataset> Size: 7MB
Dimensions: (time: 101, rgi_id: 22, gcm_scenario: 11,
month_2d: 12)
Coordinates:
* time (time) float64 808B 2e+03 ... 2.1e+03
* rgi_id (rgi_id) <U14 1kB 'RGI60-13.04694' ... 'RGI...
hydro_year (time) int64 808B 2000 2001 2002 ... 2099 2100
hydro_month (time) int64 808B 4 4 4 4 4 4 ... 4 4 4 4 4 4
calendar_year (time) int64 808B 2000 2001 2002 ... 2099 2100
calendar_month (time) int64 808B 1 1 1 1 1 1 ... 1 1 1 1 1 1
* month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
calendar_month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
* gcm_scenario (gcm_scenario) object 88B MultiIndex
* gcm (gcm_scenario) <U13 572B 'CAMS-CSM1-0' ... ...
* scenario (gcm_scenario) <U6 264B 'ssp126' ... 'rcp26'
Data variables: (12/14)
volume (time, rgi_id, gcm_scenario) float32 98kB 1...
area (time, rgi_id, gcm_scenario) float32 98kB 6...
on_area (time, rgi_id, gcm_scenario) float32 98kB 6...
off_area (time, rgi_id, gcm_scenario) float32 98kB 3...
melt_off_glacier (time, rgi_id, gcm_scenario) float32 98kB 3...
melt_on_glacier (time, rgi_id, gcm_scenario) float32 98kB 5...
... ...
melt_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 1MB ...
melt_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 1MB ...
liq_prcp_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 1MB ...
liq_prcp_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 1MB ...
runoff_monthly (time, month_2d, rgi_id, gcm_scenario) float32 1MB ...
runoff (time, rgi_id, gcm_scenario) float32 98kB 9...
Attributes:
description: OGGM model output
oggm_version: 1.6.1.dev26+gf8a1745
calendar: 365-day no leap
creation_date: 2025-05-07 20:14:15
bias_correction: bc_2000_2019
basin_name: Yarla Shampo Glacier (Shannan/Lhoka)
basin_area_km2: 2260.682031759661
glaciers_in_basin: 22
glacierised_area_perc: 0.36736701063331695
glacierised_area_km2: 8.305},
'salcca_sibinacocha': {'4°C': <xarray.Dataset> Size: 10MB
Dimensions: (time: 101, rgi_id: 39, gcm_scenario: 9,
month_2d: 12)
Coordinates:
* time (time) float64 808B 2e+03 ... 2.1e+03
* rgi_id (rgi_id) <U14 2kB 'RGI60-16.01011' ... 'RGI...
hydro_year (time) int64 808B 2000 2001 2002 ... 2099 2100
hydro_month (time) int64 808B 10 10 10 10 ... 10 10 10 10
calendar_year (time) int64 808B 2000 2001 2002 ... 2099 2100
calendar_month (time) int64 808B 1 1 1 1 1 1 ... 1 1 1 1 1 1
* month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
calendar_month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
* gcm_scenario (gcm_scenario) object 72B MultiIndex
* gcm (gcm_scenario) <U13 468B 'BCC-CSM2-MR' ... ...
* scenario (gcm_scenario) <U6 216B 'ssp585' ... 'ssp585'
Data variables: (12/14)
volume (time, rgi_id, gcm_scenario) float32 142kB ...
area (time, rgi_id, gcm_scenario) float32 142kB ...
on_area (time, rgi_id, gcm_scenario) float32 142kB ...
off_area (time, rgi_id, gcm_scenario) float32 142kB ...
melt_off_glacier (time, rgi_id, gcm_scenario) float32 142kB ...
melt_on_glacier (time, rgi_id, gcm_scenario) float32 142kB ...
... ...
melt_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
melt_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
liq_prcp_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
liq_prcp_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
runoff_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
runoff (time, rgi_id, gcm_scenario) float32 142kB ...
Attributes:
description: OGGM model output
oggm_version: 1.6.1.dev26+gf8a1745
calendar: 365-day no leap
creation_date: 2025-05-07 20:14:15
bias_correction: bc_2000_2019
basin_name: Salcca-Sibinacocha
basin_area_km2: 1150.7452077516787
glaciers_in_basin: 39
glacierised_area_perc: 7.714218525701308
glacierised_area_km2: 88.771,
'2.7°C': <xarray.Dataset> Size: 15MB
Dimensions: (time: 101, rgi_id: 39, gcm_scenario: 14,
month_2d: 12)
Coordinates:
* time (time) float64 808B 2e+03 ... 2.1e+03
* rgi_id (rgi_id) <U14 2kB 'RGI60-16.01011' ... 'RGI...
hydro_year (time) int64 808B 2000 2001 2002 ... 2099 2100
hydro_month (time) int64 808B 10 10 10 10 ... 10 10 10 10
calendar_year (time) int64 808B 2000 2001 2002 ... 2099 2100
calendar_month (time) int64 808B 1 1 1 1 1 1 ... 1 1 1 1 1 1
* month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
calendar_month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
* gcm_scenario (gcm_scenario) object 112B MultiIndex
* gcm (gcm_scenario) <U13 728B 'ACCESS-CM2' ... '...
* scenario (gcm_scenario) <U11 616B 'ssp126' ... 'ssp434'
Data variables: (12/14)
volume (time, rgi_id, gcm_scenario) float32 221kB ...
area (time, rgi_id, gcm_scenario) float32 221kB ...
on_area (time, rgi_id, gcm_scenario) float32 221kB ...
off_area (time, rgi_id, gcm_scenario) float32 221kB ...
melt_off_glacier (time, rgi_id, gcm_scenario) float32 221kB ...
melt_on_glacier (time, rgi_id, gcm_scenario) float32 221kB ...
... ...
melt_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 3MB ...
melt_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 3MB ...
liq_prcp_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 3MB ...
liq_prcp_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 3MB ...
runoff_monthly (time, month_2d, rgi_id, gcm_scenario) float32 3MB ...
runoff (time, rgi_id, gcm_scenario) float32 221kB ...
Attributes:
description: OGGM model output
oggm_version: 1.6.1.dev26+gf8a1745
calendar: 365-day no leap
creation_date: 2025-05-07 20:14:15
bias_correction: bc_2000_2019
basin_name: Salcca-Sibinacocha
basin_area_km2: 1150.7452077516787
glaciers_in_basin: 39
glacierised_area_perc: 7.714218525701308
glacierised_area_km2: 88.771,
'1.5°C': <xarray.Dataset> Size: 12MB
Dimensions: (time: 101, rgi_id: 39, gcm_scenario: 11,
month_2d: 12)
Coordinates:
* time (time) float64 808B 2e+03 ... 2.1e+03
* rgi_id (rgi_id) <U14 2kB 'RGI60-16.01011' ... 'RGI...
hydro_year (time) int64 808B 2000 2001 2002 ... 2099 2100
hydro_month (time) int64 808B 10 10 10 10 ... 10 10 10 10
calendar_year (time) int64 808B 2000 2001 2002 ... 2099 2100
calendar_month (time) int64 808B 1 1 1 1 1 1 ... 1 1 1 1 1 1
* month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
calendar_month_2d (month_2d) int64 96B 1 2 3 4 5 ... 9 10 11 12
* gcm_scenario (gcm_scenario) object 88B MultiIndex
* gcm (gcm_scenario) <U13 572B 'CAMS-CSM1-0' ... ...
* scenario (gcm_scenario) <U6 264B 'ssp126' ... 'rcp26'
Data variables: (12/14)
volume (time, rgi_id, gcm_scenario) float32 173kB ...
area (time, rgi_id, gcm_scenario) float32 173kB ...
on_area (time, rgi_id, gcm_scenario) float32 173kB ...
off_area (time, rgi_id, gcm_scenario) float32 173kB ...
melt_off_glacier (time, rgi_id, gcm_scenario) float32 173kB ...
melt_on_glacier (time, rgi_id, gcm_scenario) float32 173kB ...
... ...
melt_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
melt_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
liq_prcp_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
liq_prcp_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
runoff_monthly (time, month_2d, rgi_id, gcm_scenario) float32 2MB ...
runoff (time, rgi_id, gcm_scenario) float32 173kB ...
Attributes:
description: OGGM model output
oggm_version: 1.6.1.dev26+gf8a1745
calendar: 365-day no leap
creation_date: 2025-05-07 20:14:15
bias_correction: bc_2000_2019
basin_name: Salcca-Sibinacocha
basin_area_km2: 1150.7452077516787
glaciers_in_basin: 39
glacierised_area_perc: 7.714218525701308
glacierised_area_km2: 88.771}}
Yarla Shampo (Tibetan Plateau, Asia)¶
- Climate: Cold, high-altitude climate (-10°C to 0°C) with 500–1,000 mm annual precipitation, mostly snow during the June–September monsoon. Warming trends accelerate glacier retreat, impacting runoff.
- Size & Glacierization: Basin size estimated at 2260 km²; 0.3% is glacierized which is about 8 km². Yarla Shampo has 22 glacier in its basin and is in the southeastern Tibetan Plateau.
- Additional Facts: Part of the "Third Pole," Yarla Shampo contributes to headwaters feeding major rivers like the Brahmaputra. Glaciers in HMA lost ~19 Gt yr⁻¹ of mass from 2000–2018, affecting water security for millions downstream.
Salcca-Sibinacocha (Cordillera Vilcanota, Peru)¶
- Climate: Cold, high-altitude (-5°C to 0°C) with 800–1,000 mm precipitation, mostly during the December–March wet season from Amazon moisture. Rapid glacier retreat and erratic freezing disrupt local water cycles.
- Size & Glacierization: Basin core area 1150 km², with 7% glacierized. The Quelccaya Ice Cap, within the basin, spans ~88 km² (7.7% of the core area) but has shrunk 30% since the 1970s.
- Additional Facts: The Cordillera Vilcanota is the world’s second-largest tropical glaciated range. Quelccaya’s retreat (60 m yr⁻¹) threatens water supply for Cusco and the Amazon basin. Local communities report disrupted agricultural cycles due to climate shifts.
Summary¶
Yarla Shampo and Salcca-Sibinacocha are critical glacier basins in distinct high-altitude regions. Yarla Shampo, in the monsoon-influenced Tibetan Plateau, is a small contributor to Asia’s river systems, with a low glacierized proportion (~1–5%) and significant mass loss. Salcca-Sibinacocha, in Peru’s Cordillera Vilcanota, supports the Amazon watershed but faces rapid deglaciation, with Quelccaya Ice Cap covering ~5–10% of its ~810 km² core area. Both basins are vital for regional water resources but are increasingly vulnerable to climate-driven retreat, impacting ecosystems and communities.
Volume and area evolution¶
Analyze the volume and area evolution of all glaciers in your basin. Tip: use ds.sum(dim='rgi_id') to sum over all glaciers.
For each basin, create:
- One plot showing total glacier volume evolution (in km³) from 2020 to 2100
- One plot showing total glacier area evolution (in km²) from 2020 to 2100
Each plot should include all three temperature scenarios, displayed as the median with interquartile range (17th to 83rd percentile). The title of each plot should include the name of the basin and the glacierized area fraction (in percent).
y4 = ds_all['yarla_shampo']['4°C']
y27 = ds_all['yarla_shampo']['2.7°C']
y15 = ds_all['yarla_shampo']['1.5°C']
s4 = ds_all['salcca_sibinacocha']['4°C']
s27 = ds_all['salcca_sibinacocha']['2.7°C']
s15 = ds_all['salcca_sibinacocha']['1.5°C']
glaciers = ([y4, y27, y15, s4, s27, s15])
c = ['b','r','y']
lab = ['4°C', '2.7°C', '1.5°C']
fig, axes = plt.subplots(1, 2, figsize=(14, 6), sharey=False)
for i in range(3):
# First subplot: i = 0,1,2
x = glaciers[i].sum(dim='rgi_id').calendar_year[20:]
y = glaciers[i].sum(dim='rgi_id').volume[20:]
assert y.shape[0] == len(x)
p17 = np.percentile(y, 17, axis=1)
median = np.percentile(y, 50, axis=1)
p83 = np.percentile(y, 83, axis=1)
ax = axes[0]
ax.plot(x, median, label=f'Median {lab[i]}', color=c[i])
ax.fill_between(x, p17, p83, color=c[i], alpha=0.3)
ax.set_title("yarla_shampo")
ax.set_xlabel('Time [yrs]')
ax.set_ylabel('Volume [km$^3$]')
ax.grid(True)
# Second subplot: i+3 = 3,4,5
x2 = glaciers[i+3].sum(dim='rgi_id').calendar_year[20:]
y2 = glaciers[i+3].sum(dim='rgi_id').volume[20:]
assert y2.shape[0] == len(x2)
p17_2 = np.percentile(y2, 17, axis=1)
median_2 = np.percentile(y2, 50, axis=1)
p83_2 = np.percentile(y2, 83, axis=1)
ax2 = axes[1]
ax2.plot(x2, median_2, label=f'Median {lab[i]}', color=c[i])
ax2.fill_between(x2, p17_2, p83_2, color=c[i], alpha=0.3)
ax2.set_title("salcca_sibinacocha")
ax2.set_xlabel('Time [yrs]')
ax2.grid(True)
axes[0].legend()
axes[1].legend()
plt.tight_layout()
plt.show()
fig, axes = plt.subplots(1, 2, figsize=(14, 6), sharey=False)
for i in range(3):
# First subplot: i = 0,1,2
x = glaciers[i].sum(dim='rgi_id').calendar_year[20:]
y = glaciers[i].sum(dim='rgi_id').area[20:]
assert y.shape[0] == len(x)
p17 = np.percentile(y, 17, axis=1)
median = np.percentile(y, 50, axis=1)
p83 = np.percentile(y, 83, axis=1)
ax = axes[0]
ax.plot(x, median, label=f'Median {lab[i]}', color=c[i])
ax.fill_between(x, p17, p83, color=c[i], alpha=0.3)
ax.set_title("yarla_shampo")
ax.set_xlabel('Time [yrs]')
ax.set_ylabel('Area [km$^3$]')
ax.grid(True)
# Second subplot: i+3 = 3,4,5
x2 = glaciers[i+3].sum(dim='rgi_id').calendar_year[20:]
y2 = glaciers[i+3].sum(dim='rgi_id').area[20:]
assert y2.shape[0] == len(x2)
p17_2 = np.percentile(y2, 17, axis=1)
median_2 = np.percentile(y2, 50, axis=1)
p83_2 = np.percentile(y2, 83, axis=1)
ax2 = axes[1]
ax2.plot(x2, median_2, label=f'Median {lab[i]}', color=c[i])
ax2.fill_between(x2, p17_2, p83_2, color=c[i], alpha=0.3)
ax2.set_title("salcca_sibinacocha")
ax2.set_xlabel('Time [yrs]')
ax2.grid(True)
axes[0].legend()
axes[1].legend()
plt.tight_layout()
plt.show()
1. Observations Across Scenarios¶
For both Yarla Shampo and Salcca-Sibinacocha basins, glacier volume and area trends vary by warming scenario:
- 4°C Warming (Blue Line): Most severe retreat, with near-total loss of volume and area by 2100. In Yarla Shampo, both are nearly zero by 2090–2100. Narrow uncertainty band indicates high certainty of minimal glacier remnants.
- 2.7°C Warming (Red Line): Significant loss, but slower than 4°C. Small residual volume and area remain by 2100, with a wider uncertainty band showing varied outcomes.
- 1.5°C Warming (Yellow Line): Least severe retreat, stabilizing post-2060. Larger fractions of volume and area persist by 2100, with the widest uncertainty band reflecting greater variability.
2. Similarities and Differences Between Basins¶
- Similarities: Both basins show the same loss hierarchy: 4°C > 2.7°C > 1.5°C, with higher warming causing faster, greater decline in volume and area.
- Differences:
- Initial Size: Salcca-Sibinacocha has ~4.5×10⁹ km³ volume and ~8×10⁷ km² area, ~20x and ~10x larger than Yarla Shampo (~2.2×10⁸ km³, ~8×10⁶ km²).
- Absolute Loss: Salcca-Sibinacocha loses more absolute volume and area due to its larger size, though proportional losses may align across scenarios.
3. Glacier Area vs. Volume Behavior¶
- Faster Volume Decline: Volume decreases more rapidly early on (2020–2050) due to both horizontal retreat and vertical thinning, compared to slower area reduction.
- Persistent Area: Area stabilizes earlier or retains a higher proportion, especially in the 1.5°C scenario, as glaciers thin but maintain some footprint.
- Magnitude: Volume loss is more dramatic, reflecting the transition from thick to thin ice bodies.
Summary¶
Yarla Shampo and Salcca-Sibinacocha exhibit strong sensitivity to warming, with higher temperatures driving faster glacier loss. Salcca-Sibinacocha’s larger initial size results in greater absolute losses. Volume declines faster than area due to thinning and retreat. The 1.5°C scenario offers the best preservation potential, though with significant uncertainty.
Hydrological output¶
Analyze the hydrological output of your basins. For guidance, you can refer to the plots of this tutorial.
For each basin, create the following plots:
- Total runoff for all temperature scenarios in one plot (showing median and interquartile range)
- Runoff components (only median), one plot per temperature scenario
- Monthly runoff (median only), as a 2D plot (x-axis: Months, y-axis: Years), one plot per temperature scenario
- Annual runoff at three time steps (e.g. 2020, 2060, 2100), showing median and interquartile range, one plot per temperature scenario
The title of each plot should include the name of the basin and the glacierized area fraction (in percent), and, if needed, the temperature scenario.
r = ['melt_off_glacier', 'melt_on_glacier', 'liq_prcp_off_glacier', 'liq_prcp_on_glacier']
fig, axes = plt.subplots(1, 2, figsize=(14, 6), sharey=False)
for i in range(3):
# First subplot: i = 0,1,2
result = glaciers[i].sum(dim='rgi_id')[r].to_array(dim="variable").sum(dim="variable")
x = result.time[20:]
y = result.data[20:] * 1e-9 #convert to MT
# x = glaciers[i].sum(dim='rgi_id').calendar_year[20:]
# y = glaciers[i].sum(dim='rgi_id').area[20:]
assert y.shape[0] == len(x)
p17 = np.percentile(y, 17, axis=1)
median = np.percentile(y, 50, axis=1)
p83 = np.percentile(y, 83, axis=1)
ax = axes[0]
ax.plot(x, median, label=f'Median {lab[i]}', color=c[i])
ax.fill_between(x, p17, p83, color=c[i], alpha=0.3)
ax.set_title("yarla_shampo")
ax.set_xlabel('Time [yrs]')
ax.set_ylabel('Runoff [MT]')
ax.grid(True)
# Second subplot: i+3 = 3,4,5
result2 = glaciers[i+3].sum(dim='rgi_id')[r].to_array(dim="variable").sum(dim="variable")
x2 = result2.time[20:]
y2 = result2.data[20:] * 1e-9 #convert to MT
assert y2.shape[0] == len(x2)
p17_2 = np.percentile(y2, 17, axis=1)
median_2 = np.percentile(y2, 50, axis=1)
p83_2 = np.percentile(y2, 83, axis=1)
ax2 = axes[1]
ax2.plot(x2, median_2, label=f'Median {lab[i]}', color=c[i])
ax2.fill_between(x2, p17_2, p83_2, color=c[i], alpha=0.3)
ax2.set_title("salcca_sibinacocha")
ax2.set_xlabel('Time [yrs]')
ax2.grid(True)
axes[0].legend()
axes[1].legend()
plt.tight_layout()
plt.show()
# create the runoff dataframes
df_runoff_list = []
for i in range(6):
df = (glaciers[i].sum(dim='rgi_id')[r] * 1e-9).to_dataframe()
df = df[r][df.index.get_loc(df.index.get_level_values('time').to_series().eq(2020.0).idxmax()).start:] #get all values beginning from 2020
df_runoff_list.append(df)
dfs = df_runoff_list[:3]
component_cols = ['melt_off_glacier', 'melt_on_glacier', 'liq_prcp_off_glacier', 'liq_prcp_on_glacier']
colors = sns.color_palette("rocket", n_colors=len(component_cols))
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(16, 4), sharey=True)
for i, df in enumerate(dfs):
ax = axes[i]
df = df.reset_index()
df_median = df.groupby('time')[component_cols].median()
df_median.plot.area(ax=ax, color=colors, alpha=0.95)
ax.set_title(f'{lab[i]} yarla_shampo')
ax.set_xlabel('Year')
if i == 0:
ax.set_ylabel('Runoff (Mt)')
else:
ax.set_ylabel('')
ax.get_legend().remove()
plt.tight_layout()
# 2ND GLACIER
dfs = df_runoff_list[3:]
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(16, 4), sharey=True)
for i, df in enumerate(dfs):
ax = axes[i]
df = df.reset_index()
df_median = df.groupby('time')[component_cols].median()
df_median.plot.area(ax=ax, color=colors, alpha=0.95)
ax.set_title(f'{lab[i]} salcca_sibinacocha')
ax.set_xlabel('Year')
if i == 0:
ax.set_ylabel('Runoff (Mt)')
else:
ax.set_ylabel('')
if i == 2:
ax.legend()
else:
ax.get_legend().remove()
plt.tight_layout()
plt.show()
fig, axes = plt.subplots(2, 3, figsize=(18, 10), constrained_layout=True)
axes = axes.flatten()
for i, ds in enumerate(glaciers):
ds_sum = ds.sum(dim='rgi_id')
monthly_runoff = (ds_sum['melt_off_glacier_monthly'] +
ds_sum['melt_on_glacier_monthly'] +
ds_sum['liq_prcp_off_glacier_monthly'] +
ds_sum['liq_prcp_on_glacier_monthly'])
monthly_runoff *= 1e-9
monthly_runoff_2d = monthly_runoff.median(dim='gcm_scenario')[20:]
ax = axes[i]
monthly_runoff_2d.clip(0).plot.imshow(cmap='Blues', cbar_kwargs={'label': 'Mt'}, ax=ax)
ax.set_xlabel('Months')
ax.set_ylabel('Years')
if i < 3:
ax.set_title(f'yarla_shampo {lab[i]}')
else:
ax.set_title(f'salcca_sibinacocha {lab[i-3]}')
plt.show()
fig, axs = plt.subplots(2, 3, figsize=(18, 8))
axs = axs.flatten() # Flatten for easier indexing
for i, (ds, ax) in enumerate(zip(glaciers[:6], axs)):
ds_sum = ds.sum(dim='rgi_id')
monthly_runoff = (
ds_sum['melt_off_glacier_monthly'] +
ds_sum['melt_on_glacier_monthly'] +
ds_sum['liq_prcp_off_glacier_monthly'] +
ds_sum['liq_prcp_on_glacier_monthly']
)
monthly_runoff *= 1e-9 # Convert to Mt
y = monthly_runoff.median(dim='gcm_scenario')
# 2020
runoff_2020 = monthly_runoff.sel(time=[2020])
p17 = np.percentile(runoff_2020, 17, axis=2).reshape(12,)
p83 = np.percentile(runoff_2020, 83, axis=2).reshape(12,)
median_2020 = np.array(y.sel(time=[2020])).reshape(12,)
months = y.month_2d.values
#2060
runoff_2060 = monthly_runoff.sel(time=[2060])
p17_2060 = np.percentile(runoff_2060, 17, axis=2).reshape(12,)
p83_2060 = np.percentile(runoff_2060, 83, axis=2).reshape(12,)
median_2060 = np.array(y.sel(time=[2060])).reshape(12,)
#2099
runoff_2099 = monthly_runoff.sel(time=[2099])
p17_2099 = np.percentile(runoff_2099, 17, axis=2).reshape(12,)
p83_2099 = np.percentile(runoff_2099, 83, axis=2).reshape(12,)
median_2099 = np.array(y.sel(time=[2099])).reshape(12,)
#2100
runoff_2100 = monthly_runoff.sel(time=[2100])
p17_2100 = np.percentile(runoff_2100, 17, axis=2).reshape(12,)
p83_2100 = np.percentile(runoff_2100, 83, axis=2).reshape(12,)
median_2100 = np.array(y.sel(time=[2100])).reshape(12,)
# Plot
ax.plot(months, median_2020, label='2020 Median')
ax.plot(months, median_2060, label='2060 Median')
ax.plot(months, median_2099, label='2060 Median')
ax.plot(months, median_2100, label='2100 Median')
ax.fill_between(months, p17, p83, alpha=0.3, label='17–83 percentile')
ax.fill_between(months, p17_2060, p83_2060, alpha=0.3, label='17–83 percentile')
ax.fill_between(months, p17_2099, p83_2099, alpha=0.3, label='17–83 percentile')
ax.fill_between(months, p17_2100, p83_2100, alpha=0.3, label='17–83 percentile')
if i < 3:
ax.set_title(f'yarla_shampo {lab[i]}')
else:
ax.set_title(f'salcca_sibinacocha {lab[i-3]}')
ax.set_xlabel('Month')
if i % 3 == 0:
ax.set_ylabel('Runoff (Mt)')
if i == 5:
ax.legend()
plt.tight_layout()
plt.show()
1. Scenario Comparisons¶
Yarla Shampo Basin¶
- 4°C Scenario:
- 2020 (Blue): Seasonal runoff peak in June–August.
- 2060 (Orange): Peak shifts earlier (May–July), slightly higher magnitude, wider uncertainty band.
- 2100 (Green): Peak flattens, significantly reduced runoff, narrow uncertainty band indicating severe glacier depletion.
- 2.7°C Scenario:
- 2020 (Blue): Similar to 4°C 2020 peak.
- 2060 (Orange): Slight peak shift and magnitude increase, less pronounced than 4°C.
- 2100 (Green): Reduced but defined peak, wider uncertainty band than 4°C, suggesting more glacier remains.
- 1.5°C Scenario:
- 2020 (Blue): Similar peak to other scenarios.
- 2060 (Orange): Near-identical to 2020.
- 2100 (Green): Minimal reduction, stable runoff, wide uncertainty band indicating sustained glacier presence.
Salcca-Sibinacocha Basin¶
- General Note: Runoff ~5–10x larger than Yarla Shampo (up to 100 Mt vs. 10 Mt), broader melt season (April–November).
- 4°C Scenario:
- 2020 (Blue): Broad peak in June–August.
- 2060 (Orange): Higher, prolonged peak.
- 2100 (Green): Reduced runoff but persistent seasonal cycle, suggesting some glacier or non-glacial runoff.
- 2.7°C Scenario:
- 2020 (Blue): Similar to 4°C 2020 peak.
- 2060 (Orange): Increased peak, less dramatic than 4°C.
- 2100 (Green): Slight decline, robust seasonal peak.
- 1.5°C Scenario:
- 2020 (Blue), 2060 (Orange), 2100 (Green): Nearly identical runoff magnitude and seasonality, wide uncertainty bands, indicating high glacier stability.
2. Basin Similarities and Differences¶
- Similarities:
- Higher warming (4°C) increases runoff by 2060, then sharply declines by 2100 due to depletion.
- Lower warming (1.5°C) maintains stable runoff, indicating glacier preservation.
- Peak runoff shifts earlier under higher warming.
- Differences:
- Magnitude: Salcca-Sibinacocha’s runoff is ~5–10x larger, reflecting greater initial glacier size.
- Seasonal Pattern: Salcca-Sibinacocha has a broader melt season than Yarla Shampo’s concentrated peak.
- Resilience: Salcca-Sibinacocha sustains higher runoff volumes by 2100 under 4°C due to larger ice mass.
3. Evidence of Peak Water¶
- 4°C Scenario:
- Yarla Shampo: 2060 runoff higher than 2020, sharply lower by 2100, indicating peak water ~2060.
- Salcca-Sibinacocha: Higher, prolonged 2060 runoff, reduced by 2100, peak water ~2060.
- 2.7°C Scenario:
- Both basins show slight 2060 increase, reduced by 2100, suggesting peak water ~2060, less severe than 4°C.
- 1.5°C Scenario: No peak water; stable runoff across 2020–2100 due to preserved glacier mass.
Summary¶
Both basins show higher runoff with warming (peaking ~2060) followed by decline under 4°C and 2.7°C scenarios, with clear peak water evidence. The 1.5°C scenario ensures stable runoff, preserving glaciers. Salcca-Sibinacocha’s larger ice mass drives higher runoff volumes and a broader melt season compared to Yarla Shampo, but both follow similar qualitative trends.
Glacier Runoff Scenarios: Comparison with Scientific Literature¶
Yarla Shampo Basin (Tibetan Plateau, Asia)¶
Findings from Analysis¶
- 4°C Scenario: Runoff peaks shift earlier (May–July) and increase by 2060, then sharply decline by 2100, indicating peak water ~2060 and severe glacier depletion.
- 2.7°C Scenario: Similar but less extreme, with slight runoff increase by 2060 and moderate decline by 2100.
- 1.5°C Scenario: Stable runoff across 2020–2100, suggesting glacier preservation.
- General: Runoff peaks in June–August, with depletion linked to glacier mass loss under higher warming.
Relevant Literature¶
- Source: Zhang et al. (2012), "A modified monthly degree-day model for evaluating glacier runoff changes in China. Part I: model development," Journal of Glaciology. This study models glacier runoff in the Tibetan Plateau, including regions near Yarla Shampo, using a degree-day approach.
Comparison with Literature¶
- Similarities:
- Zhang et al. (2012) note that glacier runoff in the Tibetan Plateau peaks during warmer months (June–August), consistent with the provided analysis's 2020 baseline peak. They also project increased runoff in the near term due to enhanced melting, aligning with the 2060 peak under 4°C and 2.7°C scenarios.
- The study suggests that higher temperatures accelerate glacier mass loss, leading to reduced runoff in later decades, similar to the sharp 2100 decline in the 4°C scenario.
- Differences:
- Zhang et al. (2012) focus on broader Tibetan Plateau regions and do not specifically address Yarla Shampo, so their runoff projections are more generalized. The provided analysis indicates a specific peak water timing (~2060) for Yarla Shampo, which is not detailed in the literature due to its regional scope.
- The 1.5°C scenario’s stable runoff is less emphasized in Zhang et al., as their model assumes more significant warming impacts. Their projections suggest continued runoff decline post-2050, whereas the 1.5°C scenario in the provided analysis shows sustained runoff to 2100.
- Interpretation of Contrasts:
- The generalized approach of Zhang et al. (2012) may mask local variations at Yarla Shampo, where specific topographic or climatic factors (e.g., monsoon influence) could sustain runoff under lower warming. The provided analysis’s use of scenario-specific projections (1.5°C, 2.7°C, 4°C) offers finer resolution, highlighting preservation potential under low warming.
- Differences in peak water timing may stem from the provided analysis’s focus on Yarla Shampo’s smaller glacier size, which could respond more rapidly to warming than larger regional systems modeled by Zhang et al.
Salcca-Sibinacocha Basin (Cordillera Vilcanota, Peru)¶
Findings from Analysis¶
- 4°C Scenario: Runoff increases and extends (April–November) by 2060, then declines by 2100, with peak water ~2060, but some seasonal cycle persists.
- 2.7°C Scenario: Less dramatic increase by 2060, slight decline by 2100, with robust seasonal peak.
- 1.5°C Scenario: Stable runoff across 2020–2100, with wide uncertainty bands indicating sustained glacier mass.
- General: Larger runoff volumes (~5–10x Yarla Shampo) and broader melt season, reflecting greater initial glacier size.
Relevant Literature¶
- Source: Drenkhan et al. (2018), "The changing water cycle: The eco-hydrological consequences of shrinking glaciers in the Andes," Hydrology and Earth System Sciences. This study examines glacier runoff in the Vilcanota-Urubamba basin, including Salcca-Sibinacocha, projecting significant glacier loss and runoff changes.
Comparison with Literature¶
- Similarities:
- Drenkhan et al. (2018) project a peak water phase in the Vilcanota basin by mid-century (2040–2060), followed by a decline under high-warming scenarios, aligning with the provided analysis’s 4°C and 2.7°C scenarios peaking ~2060.
- The study notes that the Cordillera Vilcanota’s larger glaciers, like Quelccaya, sustain higher runoff volumes than smaller systems, consistent with the provided analysis’s higher runoff magnitudes (~100 Mt vs. Yarla Shampo’s ~10 Mt).
- Both highlight the broader melt season (April–November) driven by Amazon moisture, as seen in the provided analysis’s seasonal patterns.
- Differences:
- Drenkhan et al. (2018) predict that key glaciers supplying Salcca-Sibinacocha could lose >90% of their area by 2100 under high-emission scenarios, suggesting a more severe runoff decline than the provided analysis’s 4°C scenario, which retains some seasonal cycle in 2100.
- The 1.5°C scenario’s stable runoff in the provided analysis contrasts with Drenkhan et al.’s expectation of some runoff reduction even under lower warming, due to their focus on cumulative glacier loss.
- Interpretation of Contrasts:
- The provided analysis’s less severe 2100 runoff decline under 4°C may reflect model assumptions that include non-glacial runoff contributions (e.g., precipitation), which Drenkhan et al. (2018) suggest are significant in the Vilcanota basin. This could sustain the seasonal cycle despite glacier depletion.
- The stable runoff in the 1.5°C scenario may overestimate glacier preservation compared to Drenkhan et al., possibly due to differences in model sensitivity to low-warming scenarios or assumptions about precipitation compensating for reduced meltwater.
Summary¶
Both basins’ runoff trends align with existing literature in showing peak water (~2060) under higher warming (4°C, 2.7°C) followed by decline due to glacier depletion, and greater stability under 1.5°C. For Yarla Shampo, Zhang et al. (2012) support the general trend but lack site-specific detail, explaining differences in peak water timing and low-warming outcomes. For Salcca-Sibinacocha, Drenkhan et al. (2018) confirm high runoff volumes and peak water timing but suggest a more severe 2100 decline, possibly due to the provided analysis’s inclusion of non-glacial runoff. These contrasts highlight the importance of local factors (e.g., basin size, precipitation) and model assumptions in glacier runoff projections.