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),
}
print(f"Mean 1.5°C scenario: {temp_scenarios['1.5°C']['global_temp_ch_2071-2100_preindustrial'].mean()}")
print(f"Median 1.5°C scenario: {temp_scenarios['1.5°C']['global_temp_ch_2071-2100_preindustrial'].median()}")
print(f"Num. o. Realizations, 1.5°C scenario: {len(temp_scenarios['1.5°C']['global_temp_ch_2071-2100_preindustrial'])}")
Mean 1.5°C scenario: 1.5638484251326987 Median 1.5°C scenario: 1.5794275401255526 Num. o. Realizations, 1.5°C scenario: 11
print(f"Mean 2.7°C scenario: {temp_scenarios['2.7°C']['global_temp_ch_2071-2100_preindustrial'].mean()}")
print(f"Median 2.7°C scenario: {temp_scenarios['2.7°C']['global_temp_ch_2071-2100_preindustrial'].median()}")
print(f"Num. o. Realizations, 2.7°C scenario: {len(temp_scenarios['2.7°C']['global_temp_ch_2071-2100_preindustrial'])}")
Mean 2.7°C scenario: 2.714388064170389 Median 2.7°C scenario: 2.719225061829237 Num. o. Realizations, 2.7°C scenario: 14
print(f"Mean 4°C scenario: {temp_scenarios['4°C']['global_temp_ch_2071-2100_preindustrial'].mean()}")
print(f"Median 4°C scenario: {temp_scenarios['4°C']['global_temp_ch_2071-2100_preindustrial'].median()}")
print(f"Num. o. Realizations, 4°C scenario: {len(temp_scenarios['4°C']['global_temp_ch_2071-2100_preindustrial'])}")
Mean 4°C scenario: 4.06414554264626 Median 4°C scenario: 4.081606729021759 Num. o. Realizations, 4°C scenario: 9
The 2.7°C target is well represented by the selection of climate models, since both median and mean are less than 1% off the target temperature level, and/even though we have the largest number of realizations (14). Next best is the 4°C scenario, where we have about 2% deviation for median and mean, but also the smallest number of realizations (9). Finally for the 1.5°C scenario, the median and mean over the 11 realizations deviate by about 5% from the target temperature. This is not ideal, but still within a reasonable range. Thus we do not need to further reduce the number of realizations for any of the target temperatures by reducing the ranges. This is good, since otherwise we would loose realization members.
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 = ['djankuat','kyzylsu']
# 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_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_CCSM4_rcp85.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_MPI-ESM-LR_rcp85.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_CNRM-CM5_rcp85.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_NorESM2-MM_ssp585.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_BCC-CSM2-MR_ssp585.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_FGOALS-f3-L_ssp585.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_CESM2-WACCM_ssp370.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_CESM2_ssp370.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_EC-Earth3-Veg_ssp370.nc djankuat: combining data for 4°C File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_CNRM-CM5_rcp45.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_CSIRO-Mk3-6-0_rcp45.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_IPSL-CM5A-LR_rcp45.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_CCSM4_rcp60.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-CM3_rcp26.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_ACCESS-CM2_ssp126.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_CanESM5_ssp126.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_CAMS-CSM1-0_ssp370.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_CESM2-WACCM_ssp534-over.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_IPSL-CM6A-LR_ssp534-over.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_MRI-ESM2-0_ssp245.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_BCC-CSM2-MR_ssp245.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_FGOALS-f3-L_ssp245.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_MRI-ESM2-0_ssp434.nc djankuat: combining data for 2.7°C File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-ESM2G_rcp45.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_NorESM1-M_rcp26.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_MPI-ESM-LR_rcp26.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_CCSM4_rcp26.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_MPI-ESM1-2-HR_ssp126.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-ESM4_ssp126.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_INM-CM4-8_ssp126.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_INM-CM5-0_ssp126.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_CAMS-CSM1-0_ssp126.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-ESM4_ssp119.nc File already downloaded: basin_djankuat_run_hydro_w5e5_gcm_merged_bc_2000_2019_MRI-ESM2-0_ssp119.nc djankuat: combining data for 1.5°C File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_CCSM4_rcp85.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_MPI-ESM-LR_rcp85.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_CNRM-CM5_rcp85.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_NorESM2-MM_ssp585.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_BCC-CSM2-MR_ssp585.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_FGOALS-f3-L_ssp585.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_CESM2-WACCM_ssp370.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_CESM2_ssp370.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_EC-Earth3-Veg_ssp370.nc kyzylsu: combining data for 4°C File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_CNRM-CM5_rcp45.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_CSIRO-Mk3-6-0_rcp45.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_IPSL-CM5A-LR_rcp45.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_CCSM4_rcp60.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-CM3_rcp26.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_ACCESS-CM2_ssp126.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_CanESM5_ssp126.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_CAMS-CSM1-0_ssp370.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_CESM2-WACCM_ssp534-over.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_IPSL-CM6A-LR_ssp534-over.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_MRI-ESM2-0_ssp245.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_BCC-CSM2-MR_ssp245.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_FGOALS-f3-L_ssp245.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_MRI-ESM2-0_ssp434.nc kyzylsu: combining data for 2.7°C File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-ESM2G_rcp45.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_NorESM1-M_rcp26.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_MPI-ESM-LR_rcp26.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_CCSM4_rcp26.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_MPI-ESM1-2-HR_ssp126.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-ESM4_ssp126.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_INM-CM4-8_ssp126.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_INM-CM5-0_ssp126.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_CAMS-CSM1-0_ssp126.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_GFDL-ESM4_ssp119.nc File already downloaded: basin_kyzylsu_run_hydro_w5e5_gcm_merged_bc_2000_2019_MRI-ESM2-0_ssp119.nc kyzylsu: 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[1]]['1.5°C']
<xarray.Dataset> Size: 5MB
Dimensions: (time: 101, rgi_id: 15, gcm_scenario: 11,
month_2d: 12)
Coordinates:
* time (time) float64 808B 2e+03 ... 2.1e+03
* rgi_id (rgi_id) <U14 840B 'RGI60-13.18354' ... 'RG...
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 67kB 1...
area (time, rgi_id, gcm_scenario) float32 67kB 2...
on_area (time, rgi_id, gcm_scenario) float32 67kB 2...
off_area (time, rgi_id, gcm_scenario) float32 67kB 1...
melt_off_glacier (time, rgi_id, gcm_scenario) float32 67kB 5...
melt_on_glacier (time, rgi_id, gcm_scenario) float32 67kB 3...
... ...
melt_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 800kB ...
melt_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 800kB ...
liq_prcp_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 800kB ...
liq_prcp_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 800kB ...
runoff_monthly (time, month_2d, rgi_id, gcm_scenario) float32 800kB ...
runoff (time, rgi_id, gcm_scenario) float32 67kB 3...
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: Kyzylsu
basin_area_km2: 163.77544445766563
glaciers_in_basin: 15
glacierised_area_perc: 22.407510552954765
glacierised_area_km2: 36.69799999999999First, a basin and a temperature scenario must be selected. From there we have access to all variables for the indexes of time in years, time in months (for the monthly data), glacier (rgi_id) and climate model scenario (gcm_scenario). The variables are: volume, area, runoff and monthly runoff. Additionally there are variables split up for on and off the glacier, namely: area, melt, monthly melt, liquid precipitation. Time units are given in either months or years, area units are given in m$^2$, volume in m$^3$ and mass (melt, precipitation, runoff) in kg. Melt, precipitation and runoff are also available at monthly timesteps.
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[0]
ds_all[basin_example]['1.5°C'].sel(rgi_id=not_nan_rgi_ids_all[basin_example])
<xarray.Dataset> Size: 2MB
Dimensions: (time: 101, rgi_id: 6, gcm_scenario: 11,
month_2d: 12)
Coordinates:
* time (time) float64 808B 2e+03 ... 2.1e+03
* rgi_id (rgi_id) <U14 336B 'RGI60-12.00126' ... 'RG...
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 27kB 2...
area (time, rgi_id, gcm_scenario) float32 27kB 1...
on_area (time, rgi_id, gcm_scenario) float32 27kB 1...
off_area (time, rgi_id, gcm_scenario) float32 27kB 3...
melt_off_glacier (time, rgi_id, gcm_scenario) float32 27kB 6...
melt_on_glacier (time, rgi_id, gcm_scenario) float32 27kB 3...
... ...
melt_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 320kB ...
melt_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 320kB ...
liq_prcp_off_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 320kB ...
liq_prcp_on_glacier_monthly (time, month_2d, rgi_id, gcm_scenario) float32 320kB ...
runoff_monthly (time, month_2d, rgi_id, gcm_scenario) float32 320kB ...
runoff (time, rgi_id, gcm_scenario) float32 27kB 4...
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: Djankuat
basin_area_km2: 12.448876467563624
glaciers_in_basin: 6
glacierised_area_perc: 22.556252424196114
glacierised_area_km2: 2.808for temp_level in temp_scenarios:
for i in basin_ids:
if ds_all[i][temp_level].sel(rgi_id=not_nan_rgi_ids_all[i]) == ds_all[i][temp_level]:
print(f"No exclusions for {i} and {temp_level}")
else:
print(f"Exclusions in {i} and {temp_level}")
No exclusions for djankuat and 4°C No exclusions for kyzylsu and 4°C No exclusions for djankuat and 2.7°C No exclusions for kyzylsu and 2.7°C No exclusions for djankuat and 1.5°C No exclusions for kyzylsu and 1.5°C
Luckily, no glaciers had to be excluded. Therefor we can continue with the same dataset as before.
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)
The Djankuat basin is located in the North Caucasus in Russia, close to the georgian border. The climate is moderate continental to high alpine.
The Kyzylsu basin is located in central Tajikistan. The climate is semi-arid continental, with the driest months usually being August and September. The glaciers are winter-accumulation type glaciers.
basin_names = ['Djankuat', 'Kyzylsu']
basin_areas = [12.448876467563624, 163.77544445766563]
glacierized_area_fractions = [22.556252424196114, 22.407510552954765]
print(f"{basin_names[0]} basin area: {basin_areas[0]:.1f} km^2")
print(f"{basin_names[0]} basin glacierized area fraction: {glacierized_area_fractions[0]:.1f} %")
print(f"{basin_names[1]} basin area: {basin_areas[1]:.1f} km^2")
print(f"{basin_names[1]} basin glacierized area fraction: {glacierized_area_fractions[1]:.1f} %")
Djankuat basin area: 12.4 km^2 Djankuat basin glacierized area fraction: 22.6 % Kyzylsu basin area: 163.8 km^2 Kyzylsu basin glacierized area fraction: 22.4 %
The glacierized area fractions are nearly identical for both basins, but the Kyzylsu basin is more than ten times larger than Djankuat basin.
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).
def plot_glacier_volume(basin_index, basin_names, glacierized_area_fractions):
basin_id = basin_ids[basin_index]
colors = {'1.5°C': 'blue', '2.7°C': 'green', '4°C': 'red'}
fig, ax = plt.subplots(figsize=(14, 5))
for temp_level in temp_scenarios:
vol = ds_all[basin_id][temp_level].volume.sum(dim='rgi_id') * 10**(-9) # volume in km^3
median = vol.median(dim='gcm_scenario')
p17 = vol.quantile(0.17, dim='gcm_scenario')
p83 = vol.quantile(0.83, dim='gcm_scenario')
# Plot median line
median.plot(ax=ax, label=temp_level, color=colors[temp_level])
# Plot interquartile range as shaded area
ax.fill_between(median.time, p17, p83, color=colors[temp_level], alpha=0.3)
ax.set_title(f"Total Glacier Volume Evolution in {basin_names[basin_index]} Basin (Glacierized Area Fraction: {glacierized_area_fractions[basin_index]:.1f}%)")
ax.set_xlabel("Year")
ax.set_ylabel("Total Glacier Volume [km$^3$]")
ax.set_ylim(0,)
ax.legend()
plt.tight_layout()
plt.show()
def plot_glacier_area(basin_index, basin_names, glacierized_area_fractions):
basin_id = basin_ids[basin_index]
colors = {'1.5°C': 'blue', '2.7°C': 'green', '4°C': 'red'}
fig, ax = plt.subplots(figsize=(14, 5))
for temp_level in temp_scenarios:
area = ds_all[basin_id][temp_level].area.sum(dim='rgi_id') * 10**(-6) # area in km^2
median = area.median(dim='gcm_scenario')
p17 = area.quantile(0.17, dim='gcm_scenario')
p83 = area.quantile(0.83, dim='gcm_scenario')
# Plot median line
median.plot(ax=ax, label=temp_level, color=colors[temp_level])
# Plot interquartile range as shaded area
ax.fill_between(median.time, p17, p83, color=colors[temp_level], alpha=0.3)
ax.set_title(f"Total Glacier Area Evolution in {basin_names[basin_index]} Basin (Glacierized Area Fraction: {glacierized_area_fractions[basin_index]:.1f}%)")
ax.set_xlabel("Year")
ax.set_ylabel("Total Glacier Area [km$^2$]")
ax.legend()
ax.set_ylim(0,)
plt.tight_layout()
plt.show()
# Plot Volume for both basins
plot_glacier_volume(0, basin_names, glacierized_area_fractions)
plot_glacier_volume(1, basin_names, glacierized_area_fractions)
# Plot Area for both basins
plot_glacier_area(0, basin_names, glacierized_area_fractions)
plot_glacier_area(1, basin_names, glacierized_area_fractions)
- What do you observe when comparing the different scenarios within each basin?
- Do the two basins react similarly or differently?
- Is there a noticeable difference in the behavior between glacier area and volume?
Your answers here:
Comparing the different scenarios within each basin:
For the Djankuat basin, there is no large difference between the scenarios. The glaciers are already melting very quickly under current climate conditions and the different scenarios don't seem to differ significantly in the beginning. Around 2050, the glaciers reach an equilibrium in the 1.5°C scenario, and around 2070 also for the 2.7°C scenario. By the same time, the 4°C scenario precicts that all ice will have molten.
The Kyzylsu Basin behaves somewhat similar. The scenarios start to diverge around 2050, but then the 1.5°C scenario is the only one, where the glaciers in the basin reach an equilibrium until the end of the projections. Especially the 4°C scenario still shows a strong downward trend. Putting the projections aside, it is remarkable that from 2000 to 2020, there was little ice volume loss and maybe even a slight increase in glacier area in the Kyzylsu basin. This phenomenon of a recent positive trend in glacier mass balance in High Mountain Asia has been observed in the Karakoram and Pamir mountains. As it goes against the worldwide trend of glacier retreat, it has been named the "Pamir-Karakoram Anomaly" (e.g. Farinotti et al. 2020).
Comparing the reactions of the two basins:
The reactions of the two basins seem to be quite different: Whereas at Djankuat there will be hardly any ice left by the end of the century, the Kyzylsu Basin will still have about 50% in the 2.7°C scenario. The reason is that the scales are so different: The absolute predicted melt is actually at lot larger at Kyzylsu, but since also its initial mass is so much larger, it looks as if the melt wasn't as significant.
Comparing the differences between glacier area and volume evolution:
For both basins, the volume decreases faster and further than the area. Also, the 1.5°C projection for the total Djankuat glacier area shows interesting positive spikes. Maybe a few of the single run predict a positive mass balance in some of the years.
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.
# since the very last runoff values (for the year 2000) seem to be zero across all scenarios and both
# basins, i will remove the values for this year:
# Remove last time step from all basins and temperature scenarios
for basin in ds_all:
for scenario in ds_all[basin]:
ds = ds_all[basin][scenario]
# Slice off the last time index
ds_all[basin][scenario] = ds.sel(time=slice(None, ds.time.values[-2]))
# Total runoff for all temperature scenarios in one plot (showing median and interquartile range)
def plot_total_runoff(basin_index, basin_names, glacierized_area_fractions):
basin_id = basin_ids[basin_index]
colors = {'1.5°C': 'blue', '2.7°C': 'green', '4°C': 'red'}
fig, ax = plt.subplots(figsize=(14, 5))
for scenario in temp_scenarios:
runoff = ds_all[basin_id][scenario].runoff.sum(dim='rgi_id') * 1e-9
median = runoff.median(dim='gcm_scenario')
p17 = runoff.quantile(0.17, dim='gcm_scenario')
p83 = runoff.quantile(0.83, dim='gcm_scenario')
median.plot(ax=ax, label=scenario, color=colors[scenario])
ax.fill_between(median.time, p17, p83, color=colors[scenario], alpha=0.3)
ax.set_title(f"Total Runoff in {basin_names[basin_index]} Basin (Glacierized Area Fraction: {glacierized_area_fractions[basin_index]:.1f}%)")
ax.set_xlabel("Year")
ax.set_ylabel("Runoff [Mt]")
ax.legend()
ax.set_xlim(2000,2100)
plt.tight_layout()
plt.show()
# make plots
plot_total_runoff(0,basin_names,glacierized_area_fractions)
plot_total_runoff(1,basin_names,glacierized_area_fractions)
# Runoff components (only median), one plot per temperature scenario
def plot_runoff_components(basin_index, basin_names, glacierized_area_fractions):
components = {
'Melt on Glacier': 'melt_on_glacier',
'Melt off Glacier': 'melt_off_glacier',
'Liq. Precip. on Glacier': 'liq_prcp_on_glacier',
'Liq. Precip. off Glacier': 'liq_prcp_off_glacier'
}
colors = sns.color_palette('rocket', 4)
basin_id = basin_ids[basin_index]
for temp_level in temp_scenarios:
ds = ds_all[basin_id][temp_level]
df_components = {}
for label, var in components.items():
data = ds[var].sum(dim='rgi_id').median(dim='gcm_scenario') * 1e-9 # Convert to Mt
df_components[label] = data
# Create a DataFrame for area plot
df_runoff = pd.DataFrame({label: da.values for label, da in df_components.items()}, index=data.time.values)
# Plot stacked area chart
fig, ax = plt.subplots(figsize=(12, 6))
df_runoff.plot.area(ax=ax, color=colors)
ax.set_xlabel("Year")
ax.set_ylabel("Runoff (Mt)")
ax.set_title(f"Runoff Components in {basin_names[basin_index]} Basin ({temp_level} Scenario, Glacierized Area Fraction: {glacierized_area_fractions[basin_index]:.1f}%)")
ax.legend(loc='upper right')
ax.set_xlim(2000,2100)
plt.tight_layout()
plt.show()
# make plots
plot_runoff_components(0, basin_names, glacierized_area_fractions)
plot_runoff_components(1, basin_names, glacierized_area_fractions)
# Monthly runoff (median only), as a 2D plot (x-axis: Months, y-axis: Years), one plot per temperature
# scenario
def plot_monthly_runoff_2d(basin_index, basin_names, glacierized_area_fractions):
basin_id = basin_ids[basin_index]
cmap = 'Blues'
for scenario in temp_scenarios:
# Sum across RGI IDs, convert kg to Mt
runoff = ds_all[basin_id][scenario]['runoff_monthly'].sum(dim='rgi_id') * 1e-9
runoff = runoff.rolling(time=31, center=True, min_periods=1).mean() # smoothing the data
median = runoff.median(dim='gcm_scenario')
# Extract coordinates
years = ds_all[basin_id][scenario]['calendar_year'].values
months = ds_all[basin_id][scenario]['calendar_month_2d'].values
# Reshape to 2D array: (years, months)
runoff_2d = xr.DataArray(
median,
coords=[years, months],
dims=["year", "month"]
)
# Plot
runoff_2d.clip(0).plot(
cmap=cmap,
cbar_kwargs={'label': 'Runoff [Mt]'}
)
plt.title(f"Monthly Runoff (Median) in {basin_names[basin_index]} Basin\n"
f"({scenario} Scenario, Glacierized Area Fraction: {glacierized_area_fractions[basin_index]:.1f}%)")
plt.xlabel("Month")
plt.ylabel("Year")
plt.tight_layout()
plt.show()
# make plots
plot_monthly_runoff_2d(0, basin_names, glacierized_area_fractions)
plot_monthly_runoff_2d(1, basin_names, glacierized_area_fractions)
def plot_annual_runoff_boxplot(basin_index, basin_names, glacierized_area_fractions, years, ylim):
basin_id = basin_ids[basin_index]
for scenario in temp_scenarios:
fig, ax = plt.subplots(figsize=(4, 4))
box_data = []
labels = []
for year in years:
data = ds_all[basin_id][scenario].runoff.sum(dim='rgi_id') * 1e-9
slice = data.sel(time=year)
# Get list of values across GCM scenarios
values = slice.values # should be an array over 'gcm_scenario'
box_data.append(values)
labels.append(str(year))
# Plot boxplot
ax.boxplot(box_data, tick_labels=labels, patch_artist=True,
boxprops=dict(facecolor='turquoise', color='black'),
medianprops=dict(color='black'),
whiskerprops=dict(color='black'),
capprops=dict(color='black'),
flierprops=dict(marker='o', markerfacecolor='gray', markersize=5, linestyle='none'))
ax.set_title(f"Annual Runoff Snapshots in {basin_names[basin_index]} Basin \n({scenario} Scenario, Glacierized Area Fraction: {glacierized_area_fractions[basin_index]:.1f}%)")
ax.set_ylabel("Runoff [Mt]")
ax.set_ylim(ylim)
plt.tight_layout()
plt.show()
# Call the new boxplot version
years = [2020, 2060, 2090]
ylim = [[4,18],[40,120]]
plot_annual_runoff_boxplot(0, basin_names, glacierized_area_fractions, years, ylim[0])
plot_annual_runoff_boxplot(1, basin_names, glacierized_area_fractions, years, ylim[1])
- What do you observe when comparing the different scenarios within each basin?
- Do the two basins react similarly or differently?
- Can you identify any evidence of peak water?
Comparing Different Scenarios within each basin:
For the Djankuat Basin, the total runoff is very similar between the different scenarios. Only the 4°C scenario shows slightly lower values towards the end of the century and also a higher interannual variability than the other two. The components analysis does not show large differences between the scenarios, except that in the 1.5°C scenario, we still have some melt and precipitation on the glaciers towards the end of the prediction timespan. In the other two scenarios the glaciers nearly completely melt. The monthly runoff shows a shift over the years of the month with the maximum runoff to earlier in summer. This shift is most pronounced in the 4°C scenario, where towards the second half of the century, there is hardly any runoff in August anymore. In the annual runoff boxplots, the most striking difference between the scenarios is the spread of the single climate scenarios. In the original analysis of the median and mean over all realizations, the 4°C scenario had the median and mean which were closest to the target temperature. But in the runoff data it shows the largest spread and variability. The reason might be that it combines the largest number of realizations, so the likelyhood of having outliers is larger. In terms of forecasting this is actually a good thing, since this way the spread is a closer representation of the actual uncertainty in the climate.
In the Kyzylsu basin, the total runoff shows differences between the scenarios in both magnitude and timing of peak water. The 1.5°C scenario reaches peak water around 2030, whereas the 2.7 and 4°C scenarios reach peak water around 2050 and 2060 respectively. The magnitude of total runoff at the end of the century is also staggered accordingly, the highest runoff belonging to the scenario with the latest peak water and vice versa. The runoff components mostly only differ in the way that from colder to warmer scenarios, the the ratio of the components off the glacier vs on the glacier increases, according to the reduction of glacier area with increased melting. The months with peak runoff hardly change for any of the scenarios over the years in Kyzylsu basin. This is likely due to the fact that glacier melt is the dominant contribution to annual runoff over the simulation period, due to the comparatively large ice mass. Finally in the boxplots, we see the largest spread again for the 4°C scenario and can also perceive the shift of peak water across the scenarios.
Comparing the reaction of the basins:
On the basis of the large ice mass difference between the two basins, we can observe and explain quite a few differences in the plot. Whereas at Djankuat, peak water was just about reached at the start of the simulation, at Kyzylsu it comes a lot later. Thus the different temperature scenarios show a timeshift in peakwater, which leads to different magnitudes of peak water towards the end of the century. At Djankuat, a near-complete melting happens very quickly across the scenarios, which explains why runoff doesn't vary much. Accordingly, the principal runoff components at Djankuat are those off the glacier, whereas at Kyzylsu it is dominated by melt on the glacier. And since at Djankuat we eventually loose nearly all ice, it shows a significant shift of the main runoff season, while at Kyzylsu it is only very marginal.
Evidence of peak water:
The best evidence of peak water is the total runoff plot for the Kyzylsu basin. Here we can see distinct maxima in annual runoff, as well as a timeshift between these maxima according to temperature scenario. The latter observation can be explained by the counteraction of increased melt and reduced glacier area. Once the rising temperatures can't balance the decreasing area available for melt anymore, peak water is reached and runoff starts to decrease. More extreme temperature scenarios can uphold the strong melt for a longer time period, thus the timeshift. At Djankuat basin, we can assume that peak meltwater is reached just around the start of the simulation in 2020. Therefore there are no temporal differences between the different scenarios.
Contextualize your results with the literature¶
Contextualizing the results for Djankuat Basin:
According to Rets et al. (2019), who published measurement results from Djankuat glacier (which is the largest in the basin), the glacier mass balance was negative every year from 2006 to 2017 (see also: Popovnin et al. (2024)) and also the glacier area decreased by nearly 10% from 2007 to 2017. In our results however, we can see a small increase in ice volume in the year 2010 or 2011, which means that the overall basin mass balance must have been positive in that year. Also the decrease in area was less then 10% over the 2007-2017 period. One explanation for these discrepancies could be that, as the Djankuat glacier reaches the lowest altitude with its tongue, it is most affected by the warming and thus its mass balance is more negative than that of the other glaciers in the basin.
A different study by Verhaegen et al. (2020) acutally also modelled the glacier evolution up to 2100, but again only for Djankuat glacier and not the whole basin. Overall, their scenarios agree with ours on a "rapid decline of the glacier length and surface area in the following decade". But in general they predicted less glacier area loss in their respective scenarios and their 4.5°C scenario (RCP 8.5) does not predict a complete disappearence of the glacier, in contrary to our 4°C scenario, which predicts the loss of all glaciers in the basin. One reason for this discrepancy might be that Verhaegen et al. used a supraglacial debris cover model. They found that a widespread supraglacial debris cover significantly delays glacier retreat, which is coherent with Rezepkin and Popovnin (2018), as well as Verhaegen et al. (2023). Thus one should use (create?) a OGGM module for debris cover modelling to improve results.
Furthermore, Verhaegen et al. (2020) found that the Djankuat glacier will reach its peak water discharge point around 2020, which confirms our results, and that towards the end of the modelling period, the runoff volume temporarily stabilizes in the RCP 6.0 (2.7°C) and RCP 8.5 (4.5°C) scenarios due to a mass balance–elevation feedback. We did not recognize this before in our data, but it could be that this was also the case in our simulations. More specifically, there is a slight plateau in the "melt on glacier" runoff component between 2050 and 2060, best visible in the 4°C scenario.
Overall our projections for the Djankuat basin seem to not be totally off of other modelling attempts, but efforts to assimilate the results could still be made. Especially the implementation of a debris cover model in OGGM could likely be important.
Contextualizing the results for Kyzylsu Basin:
Unfortunately, very little research has been made on the Kyzylsu glacier basin. Two interesting papers bring up the factor of evaporative flux partitioning: As it was shown by Fugger et al. (2024), 28% of the total water throughput are lost through evaporation. Additionally at higher elevations, snow sublimation plays an important role (Buri 2023). Therefore simulations should consider sublimation and other evaporative fluxes, as otherwise the water balance estimates can be incorrect. This is important for us, as we did not account for these water mass losses in our runoff estimates, which thus might overestimate the true values.
Additionally, there is the topic of the Pamir-Karakoram-Anomaly, which was mentioned before. As the worldwide glacier shrinkage is one of the clearest indicators of ongoing climate change, there are regions in which glaciers respond differently. Specifically the Karakoram has exhibited near-stable to slightly positive glacier mass balances, increased ice flow velocities, stable or advancing glacier termini, and frequent glacier surges over the past two decades. Known as the Karakoram Anomaly, this unusual glacier behavior also extends into adjacent regions such as the Western Kun Lun and Pamir. Whether this anomaly will persist is uncertain, but given the substantial warming projected under current climate scenarios, it appears unlikely (Farinotti 2020). Jouberton et al. (2025) confirm that the Pamir-Karakoram Anomaly also extended to Kyzylsu basin by stating, that glacier mass loss had only been observed at Kyzylsu from 2018 onwards. This fits the values from our spin-up run, which show even a slight increase in the glacier area from 2000 to 2020. Also the projections agree with the statement by Farinotti et al., that due to the ongoing warming, the phenomenon will not persist and ice melt will gain the upper hand.
Jouberton et al. (2025) also observed the runoff trend at the Kyzylsu catchment and found that it had been slightly negative (-2.5%/dec) from 1970 to 2023. This is surprising, since our simulation show a strong increase by about 15%/dec from 2000 to 2020. As mentioned before, we did not account for evaporation and sublimation, which was done by Jouberton et al., but it would be surprising if this made such a substantial difference.
Overall, our modelling seems to reflect basic patterns on which also other researcher agree on, but there are substantial differences. An effort should be made to include evaporative water fluxes in the runoff scheme to improve accuracy.
References¶
Buri, P., Fatichi, S., Shaw, T. E., Miles, E. S., McCarthy, M. J., Fyffe, C. L., … Pellicciotti, F. (2023). Land Surface Modeling in the Himalayas: On the Importance of Evaporative Fluxes for the Water Balance of a High-Elevation Catchment. Water Resources Research, 59(10), e2022WR033841. doi:10.1029/2022WR033841
Farinotti, D., Immerzeel, W. W., de Kok, R. J., Quincey, D. J., & Dehecq, A. (2020). Manifestations and mechanisms of the Karakoram glacier Anomaly. Nature Geoscience, 13(1), 8–16. doi:10.1038/s41561-019-0513-5
Fugger, S., Shaw, T. E., Jouberton, A., Miles, E. S., Buri, P., McCarthy, M., … Pellicciotti, F. (2024). Hydrological regimes and evaporative flux partitioning at the climatic ends of high mountain Asia. Environmental Research Letters, 19(4), 044057. doi:10.1088/1748-9326/ad25a0
Jouberton, A., E. Shaw, T., Miles, E., Kneib, M., Fugger, S., McCarthy, M., … Pellicciotti, F. (2025). Reconstructing the water balance of selected glacierized catchments in High Mountain Asia since 197. doi:10.5194/egusphere-egu25-10423
Popovnin, V., Gubanov, A., Lisak, V., & Toropov, P. (2024). Recent Mass Balance Anomalies on the Djankuat Glacier, Northern Caucasus. Atmosphere, 15(1). doi:10.3390/atmos15010107
Rets, E. P., Popovnin, V. V., Toropov, P. A., Smirnov, A. M., Tokarev, I. V., Chizhova, J. N., … Kornilova, E. D. (2019). Djankuat glacier station in the North Caucasus, Russia: a database of glaciological, hydrological, and meteorological observations and stable isotope sampling results during 2007--2017. Earth System Science Data, 11(3), 1463–1481. doi:10.5194/essd-11-1463-2019
Rezepkin, A. A., & Popovnin, V. V. (2018). Influence of the surface moraine on the state of Djankuat Glacier (Central Caucasus) by 2025. Ice and Snow, 58(3), 307–321. doi:10.15356/2076-6734-2018-3-307-321
Verhaegen, Y., Huybrechts, P., Rybak, O., & Popovnin, V. V. (2020). Modelling the evolution of Djankuat Glacier, North Caucasus, from 1752 until 2100 CE. The Cryosphere, 14(11), 4039–4061. doi:10.5194/tc-14-4039-2020
Verhaegen, Y., Rybak, O., Popovnin, V., & Huybrechts, P. (2023). Quantifying supraglacial debris-related melt-altering effects on the Djankuat Glacier, Russian Federation, Part 1: comparison of surface energy and mass fluxes over clean and debris-covered ice. doi:10.22541/essoar.167810334.49773219/v1