Vous êtes-vous déjà demandé quel sera l’effet du changement climatique sur l’aridité ? Non ? Pourtant l’aridité détermine largement votre environnement : la végétation, l’agriculture, les paysages… Connaitre son évolution est donc crucial pour anticiper les effets du changement climatique et s’y préparer, mais ce n’est pas évident :
Le réchauffement du climat a des effets contradictoires sur la ressource en eau : augmentation de l’évaporation et augmentation des précipitations, et de nombreux aléas locaux, comme le relief, viennent perturber ces tendances globales.
A l’occasion de la 26e Journée mondiale de lutte contre la désertification et la sécheresse, nous vous proposons d’apprendre à évaluer l’évolution de l’aridité d’un territoire avec Python à partir de projections climatiques accessibles librement.
Pour cela nous allons voir comment :
Calculer un indice d’aridité simple,
Accéder à des projections climatiques au format NetCDF,
Ouvrir et traiter ces données avec xarray,
Représenter les résultats sur une carte.
Évaluer l’aridité d’un climat : l’indice de Martonne
Contrairement à ce que l’on pourrait penser, l’aridité d’un climat ne dépend pas seulement des précipitations. La température va aussi jouer un rôle en entrainant l’évaporation d’une part plus ou moins importante de l’eau reçue.
Dans ce tutoriel, nous allons évaluer l’aridité à partir d’une indice simple tenant compte de ces deux variables : l’indice de Martonne.
Cet indice a été introduit en 1926 par le géographe français Emmanuel de Martonne. Il s’écrit tout simplement :
I = P/(T+10)
Où P est le cumul annuel de précipitations en millimètres et T la température moyenne en degrés Celsius.
Selon Martonne, cet indice permet de distinguer quatre grands types de climats :
Les climats arides avec un indice inférieur à 10 : sous ces climats l’eau liquide et la végétation sont presque inexistants. Le Sahel, par exemple, a généralement un indice de Martonne compris entre 5 et 10 alors que les déserts ont un indice inférieur à 5.
Entre 10 et 20, les climats semi-arides : les cours d’eaux permanents sont rares mais la végétation est plus présente avec souvent des steppes ou des savanes. Des cultures sont envisageables mais seulement avec une irrigation ou des pratiques adaptées.
Entre 20 et 30, les climats semi-humides : on y trouve des cultures mais l’irrigation reste souvent utile,
Au-delà de 30, les climats humides : les rivières ne se tarissent presque jamais, l’agriculture n’est pas irriguée et c’est au contraire le drainage qui peut être nécessaire.
Accéder aux projections climatiques
Nous allons évaluer l’évolution de l’indice de Martonne sur le territoire français entre une période de référence comprise entre 1971 et 2000 et la fin du XXIe siècle. Il faut donc savoir comment la température et les précipitations vont évoluer en France. Ces informations peuvent nous être fournies par des modèles climatiques.
Un modèle climatique est un proche cousin d’un modèle météorologique avec une différence majeure : son objectif n’est pas de prévoir la météo qu’il fera à un moment précis dans le futur mais de donner une météo possible — on parle alors de projection plutôt que de prévision.
Il existe plusieurs dizaines de modèles climatiques dont les résultats sont accessibles librement par divers canaux. Nous allons utiliser www.drias-climat.fr qui propose de nombreuses données pour la France.
Une fois sur le site, vous pouvez accéder aux projections en cliquant sur l’onglet “Données et produits”. Vous serez alors invité à vous connecter ou à créer un compte (gratuit). Lorsque c’est fait, vous arrivez sur un écran assez austère :
Pour commencer, cliquez sur l’onglet “Simulations au format NetCDF” au dessus de l’arborescence.
Cliquez ensuite sur “Simulation EURO-CORDEX 2014” dans le dossier Simulations climatiques atmosphériques\Scénarios RCP\Métropole\DONNEES CORRIGEES. Un tableau apparait dans la partie droite de l’écran :
Chaque ligne de ce tableau correspond à un modèle climatique et les colonnes vous permettent de choisir d’une part les hypothèses d’émissions de gaz à effet de serre et d’autres part les variables qui vous intéressent.
Dans le cadre de ce tutoriel nous n’allons utiliser qu’un seul modèle (donc une seule ligne) :
EUROCORDEX / IPSL / IPSL-CM5A / WFR331F. Il s’agit de projections issues d’un modèle français, le CM5A-Moyenne Résolution de l’Institut Pierre Simon Laplace, dont la résolution spatiale a été améliorée grâce à l’utilisation d’un modèle météorologique.
Dans la ligne correspondante, sélectionnez les 3 scénarios disponibles : Hist qui est une reconstruction du passé par le modèle climatique destinée à servir de référence, RCP4.5, un scénario d’émissions relativement modérées, et RCP8.5 qui correspond à des émissions élevées. Ensuite sélectionnez les deux variables qui nécessaires pour calculer l’indice de Martonne : la température moyenne tas et les précipitations pr.
Vous verrez alors apparaitre sous le tableau les liens pour télécharger les 6 fichiers correspondants. Vous n’avez plus qu’à faire un clic droit, “Enregistrer la cible du lien sous…” et à attendre (assez longtemps) que le téléchargement se termine.
Jouons un peu avec des fichiers .nc et Xarray
Les données que vous venez de télécharger sont sous un format peu connu du grand public mais très employé en climatologie. Il s’agit de NetCDF. Certains outils comme Panoply permettent de les ouvrir et de les explorer facilement.
Voyons comment utiliser ces fichiers avec Python. Nous n’allons utiliser que 3 libraries : matplotlib, datetime et Xarray qui nous permettra d’ouvrir et de traiter nos NetCDF.
import matplotlib.pyplot as plt
import xarray as xr
from datetime import date
Commençons par ouvrir un fichier, par exemple la projection de température entre 2006 et 2100 pour le scénario RCP4.5 :
import matplotlib.pyplot as plt
import xarray as xr
from datetime import date
file_path = "tas_metro_IPSL_IPSL-IPSL-CM5A-MR_WRF331F_rcp4.5_QT_2006-2100_cor.nc"
#L'utilisation d'une fonction pour l'ouverture et le traitement des données permet
#de s'assurer que l'on encombre pas la mémoire avec des données intermédiaires :
def load(file_path, var):
return DS[var]
da = load(file_path, "tas")
Quelques explications s’imposent : da est un DataArray, c’est-à-dire une matrice à 2 dimensions ou plus. Dans notre cas, il y a 3 dimensions : deux coordonnées géographiques (i et j) et le temps (time). Les valeurs contenues dans la matrice sont les valeurs de la variable étudiée.
DS est un dataset, c’est-à-dire un dictionnaire de datarray. La fonction load est destinée à ouvrir un dataset et récupérer le dataarray qui nous intéresse (dans ce cas la température, tas) tout en s’assurant que le dataset, qui peut être très lourd, ne reste pas en mémoire.
Nous avons donc maintenant da, un dataarray contenant l’évolution des températures journalières pour la France métropolitaine entre 2006 et 2100.
On peut extraire une partie du datarray en sélectionnant les coordonnées qui nous intéressent avec .sel(). Prenons, par exemple, le premier point de la grille :
da = da.sel(i=1, j=1)
On va également limiter la période de temps entre 2020 et 2100, pour cela on va encore utiliser .sel() avec slice() pour définir un intervalle :
debut = date(2020, 1, 1)
fin = date(2100, 12, 31)
da = da.sel(time = slice(debut, fin))
Étape suivante : un changement d’unité. La température est fournie en degrés Kelvin, la formule de Martonne utilise des Celcius. Pour se ramener de l’un à l’autre, il suffit de soustraire 273.15 :
da = da - 273.15
Enfin on va rééchantilloner afin d’obtenir les températures moyennes annuelles plutôt que journalières. Cela se fait en une simple ligne :
da = da.resample(time = "1Y").mean(dim = "time")
Reprenons ces différentes étapes et visualisons l’évolution des températures pour cette projection :
#Sélection du premier point de la grille
da = da.sel(i=1, j=1)
#Sélection de l'horizon de temps à étudier
debut = date(2020, 1, 1)
fin = date(2100, 12, 31)
da = da.sel(time = slice(debut, fin))
#Conversion Kelvin -> Celcius
da = da - 273.15
#Calcul des températures moyennes annuelles
da = da.resample(time = "1Y").mean(dim = "time")
#Visualisation des résultats
fig, ax = plt.subplots(figsize = (12, 6))
da.plot(ax = ax,
color = 'r')
ax.set_title("Température moyenne annuelle pour le 1er point de la grille\n(projection IPSL CM5A-MR WRF331F, scénario RCP4.5)")
ax.set_xlabel("Temps")
ax.set_ylabel("Température (°C)")
Et voilà le résultat :
Notez que, comme on l’a dit plus haut, il s’agit de projection pas de prévision : ce n’est pas parce que cette projection nous donne une température de 12.090474°C en 2050 qu’il fera en moyenne 12.090474°C en 2050. C’est seulement un résultat possible. Si on veut avoir une idée de ce qu’il peut se passer en 2050, il faut regarder un nombre suffisant de résultats, généralement 30 années comme pour le calcul des normales climatiques.
Pour prendre une analogie simple, imaginez que vous vouliez prévoir le résultat d’un jet de dé. Vous le jetez une fois, vous obtenez 6. Évidemment ça ne signifie pas que vous obtiendrait toujours 6, pris seul ce résultat ne signifie pas grand chose. Mais si vous jetez votre dé un nombre suffisant de fois, disons 30, vous vous apercevrez que les résultats sont compris entre 1 et 6 et que le résultat moyen est quelque part entre 3 et 4. C’est à peu près ce que l’on essaie de faire avec des projections climatiques.
Calcul de l’indice de Martonne
Maintenant que nous avons vu les bases de l’utilisation des NetCDF avec Xarray, nous pouvons calculer l’évolution de l’indice de Martonne sur l’ensemble du territoire.
Nous allons commencer par calculer l’indice de Martonne sur les 30 dernières années du XXIe siècle dans le scénario RCP4.5. La première étape consiste à ouvrir les projections de température à les traiter comme précédemment :
#Ouverture des températures
file_tas = "tas_metro_IPSL_IPSL-IPSL-CM5A-MR_WRF331F_rcp4.5_QT_2006-2100_cor.nc"
tas = load(file_tas, "tas")
#Sélection de la période à étudier
debut = date(2071, 1, 1)
fin = date(2100, 12, 31)
tas = tas.sel(time = slice(debut, fin))
#Conversion Kelvin-Celcius
tas = tas - 273.15
#Calcul des températures moyennes annuelles
tas = tas.resample(time='1Y').mean(dim = 'time')
On fait à peu près la même chose pour les précipitations :
#Ouverture des précipitations
file_pr = "pr_metro_IPSL_IPSL-IPSL-CM5A-MR_WRF331F_rcp4.5_QT_2006-2100_cor.nc"
pr = load(file_pr, "pr")
#Sélection de la période à étudier
pr = pr.sel(time = slice(debut, fin))
#Calcul des cumuls annuels
pr = pr.resample(time='1Y').sum(dim = 'time')
Cette fois il n’est pas nécessaire de convertir l’unité puisque la projection est fournie directement en millimètres et comme on cherche le cumul de précipitation annuel et non la moyenne, on utilise .sum() au lieu de .mean() lors du rééchantillonnage.
Il ne nous reste plus qu’à appliquer la formule de Martonne :
martonne = pr / (tas + 10)
On se retrouve avec un dataarray contenant une projection de l’indice de Martonne annuel entre 2071 et 2100 pour tous les points du territoire. Prenons-en la moyenne temporelle :
martonne = martonne.mean(dim = 'time')
On peut visualiser ces données :
fig, ax = plt.subplots(figsize = (10, 8))
martonne.plot(ax = ax,
cmap = 'Spectral',
vmin=0,
vmax=60,
levels = 13)
ax.set_title("Indice de Martonne 2071-2100\n(projection IPSL CM5A-MR WRF331F, scénario RCP4.5)")
#Suppression des axes
ax.set_axis_off()
Et voilà le résultat :
On voit que les massifs montagneux sont très humides alors que la côte méditerranéenne, les bassins de la Garonne et de la Loire et, dans une moindre mesure, l’Alsace, la Beauce et l’Ile de France ont un climat plus aride.
Généralisation et interprétation
Bien sur l’interprétation de ce résultat serait plus intéressante si on pouvait le comparer à une référence et à ce qui se passerait avec des émissions plus élevées. On va donc recommencer l’opération avec nos autres jeux de données mais pour nous simplifier la vie, nous allons d’abord réunir tous le traitement des données dans une fonction :
def indice_martonne(file_tas, file_pr, debut, fin):
'''
Fonction prenant :
file_tas (str) : chemin vers une NetCDF contenant une projection de température
file_pr (str) : chemin vers une NetCDF contenant une projection de précipitation
debut (datetime.date) : date de début de la période à étudier
fin (datetime.date) : date de fin de la période à étudie
Renvoyant :
martonne : un dataarray contenant l'indice de martonne annuel
moyen sur la période comprise entre début et fin
'''
#Ouverture et traitement de la température
tas = load(file_tas, "tas")
tas = tas.sel(time = slice(debut, fin))
tas = tas - 273.15
tas = tas.resample(time='1Y').mean(dim = 'time')
#Ouverture et traitement des précipitations
pr = load(file_pr, "pr")
pr = pr.sel(time = slice(debut, fin))
pr = pr.resample(time='1Y').sum(dim = 'time')
#Calcul de l'indice de Martonne
martonne = pr / (tas + 10)
martonne = martonne.mean(dim = 'time')
return martonne
On peut désormais obtenir facilement l’indice de Martonne, par exemple pour la période de référence :
#Projections à utiliser
tas_ref = "tas_metro_IPSL_IPSL-IPSL-CM5A-MR_WRF331F_histo_QT_1971-2005_cor.nc"
pr_ref = "pr_metro_IPSL_IPSL-IPSL-CM5A-MR_WRF331F_histo_QT_1971-2005_cor.nc"
#Date de début et de fin de la période à étudier
debut_ref = date(1971, 1, 1)
fin_ref = date(2000, 12, 31)
martonne_ref = indice_martonne(tas_ref, pr_ref, debut_ref, fin_ref)
Grâce à cette fonction et moyennant quelques étapes graphiques que nous de détaillerons pas ici, on arrive à un résultat comme celui-ci :
Grâce à Python et Xarray, il n’a fallu que quelques lignes de code et un temps de calcul qui vous permet à peine d’aller chercher un café pour convertir 12Go de projections climatiques en une carte détaillée de l’aridité du territoire français à la fin XXIe siècle !
La comparaison entre la fin du XXe siècle et la fin du XXIe siècle permet de mieux comprendre ce qu’il se passe. Dans le scénario d’émissions modérées, le climat devient notablement plus aride sur les massifs montagneux et en Occitanie. Sur le reste du territoire, il y a peu de changements.
Dans le scénario d’émissions élevées, l’évolution est beaucoup plus contrastée. L’aridification est très marquée dans le sud de la France en particulier sur les Alpes, les Pyrénées, le Massif Central et en Corse, le nord de l’Espagne quant à lui devient quasi-désertique. Le climat des autres régions change aussi sensiblement mais dans le sens inverse. Il est évident qu’une telle évolution aurait des impacts économiques, environnementaux et humains majeurs.
A propos : Callendar est une start-up spécialisée dans le développement de solutions innovantes pour l’évaluation des risques climatiques. Conscients du défi que représente l’adaptation au changement climatique, nous nous efforçons de partager notre expertise au travers d’outils gratuits ou de tutoriels comme celui-ci.