CDO

Qu’est ce que CDO ?

La boîte à outils CDO pour Climate Data Operators est un vaste ensemble d'outils permettant de travailler sur les données des modèles climatiques et numériques. NetCDF 3/4, GRIB 1/2 et d'autres formats en IO. En dehors de cela, CDO peut être utilisé pour analyser tout type de données maillées non liées à la science du climat. CDO a des besoins en mémoire très faibles et peut traiter des fichiers plus volumineux que la mémoire physique.

Ce projet est bien évidemment opensource. Tous les infos sont disponibles ici.

Installation

CDO est disponible pour la plupart des distributions Linux mais peut aussi être installé sous Windows et MacOS via conda. Vous trouverez ci-dessous les méthodes d'installation les plus courantes en fonction de votre OS et/ou distribution.

apt-get install cdo # Linux binary Debian like
conda install cdo # Linux, MacOS, or Windows with Anaconda
conda install python-cdo # Extension Python
sudo dnf-install cdo # Newer RPM-based Linux systems like CentOS, Fedora, openSUSE, RHEL
sudo yum-install cdo # Older RPM-based Linux systems like CentOS, Fedora, openSUSE, RHEL
sudo port install cdo # MacOS MacPorts
brew install cdo  # MacOs Linux with homebrew

Plus d’infos ici, notamment si vous souhaitez compiler une certaine version !!!

Commande générique

Les opérateurs CDO s'utilisent comme des commandes shell comme les opérateurs NCO. Ils permettent de plus de réaliser des opérations statistiques (intrepolation) et de tracer des graphiques simples. Cette partie ne sera pas traiter ici mais vous pouvez aussi Ainsi, la syntaxe générale d'utilisation est la suivante:

cdo [OPTIONS] [operator] [input-file] [output-file] # une seule commande pour accèder aux opérateurs
  • OPTIONS la liste des options propres à cdo
  • operator est l'opérateur que vous souhaitez utilisé (voir la liste dessous)
  • input-file le nom du fichier netcdf d'entrée sur lequel vous souhaitez appliquer l'opération
  • output-file le nom du fichier netcdf de sortie résultat de l'opération réalisée

De plus cdo permet de chainer des opérations :

cdo  [OPTIONS] Operator1 [input-file]] [ -Operator2 [ -OperatorN ] ] [output-file]

Vous trouverez ci-dessous quelques commandes permettant d'accèder rapidement à des informations d'aide sur l'utilisation de cdo.

cdo -h  – Affiche les options de cdo
cdo --operators     – Liste les opérateurs 
cdo -h <operator>  – affiche l’aide pour l’opérateur choisi

Vous trouverez ci-dessous quelques commandes permettant d'accèder rapidement à des informations sur le fichier netcdf.

cdo -info <infile>   – liste les infos du fichier infile 
cdo -showname <infile> – liste les variables du fichier
cdo -ntime <infile> – affiche le nombre de pas de temps du fichier

Même si output-file est optionnel, nous vous conseillons d'en mettre un. En effet, la modification du netcdf d'entrée est possible mais risquée et peut générer des problèmes inattendues résultant de l'ouverture du fichier en mode READ et WRITE en même temps.

Description de quelques opérateurs

aexpr : processeur arithmétique permet de réaliser des calculs.

aexpr permet de réaliser des opérations arithmétiques sur un fichier existant pour créer une nouvelle variable. L'opérateur s'utilise comme suivant:

cdo aexpr,instr [input-file] [output-file]

L'opérateur aexpr prend une instruction instr. Les instructions s'entendent comme une ligne interprétée prenant en compte des variables du fichier netcdf et/ou scalaire liés à des opérateurs arithmétiques ou conditionnelles.

Plusieurs types d'opérateurs peuvent être utilisés:

  • Arithmetic Operators: * / % + - ^
  • Binary Operators: > >= < <= == != == || ! && <=>
  • Conditional Operator: exp1 ? exp2 : exp3

Ainsi, si les variables A et B sont contenues dans un fichier netcdf in.nc et que vous souhaitez faire la différence des deux champs:

cdo aexpr,'C=A-B'  in.nc out.nc #la variable C sera créée dans le fichier out.nc

Il est possible d'utiliser l'opérateur aexprf qui prend le chemin d'un fichier txt à la place de instr. Ce fichier peut contenir une liste d'instructions à raison d'une instruction par ligne.

setattribute : manipulation des attributs

setattribute est une opérateur permettant la manipulation des attributs du fichier netcdf qu'ils soient globaux ou liés à une variable. L'opérateur s'utilise comme suivant:

cdo setattribute,[var_nm@]att_nm[:s|d|i]=[value_attr|{[var_nm@]att_nm}]  in.nc  out.nc`

où:

  • att_nm : le nom de l'attribut à modifier, créer ou supprimer
  • var_nm : peut prendre le nom d'une variable pour un attribut local,si var_nm n'est pas définie, l'attribut sera global.
  • type_attr : le type_attr correspond au type de données défini dans les netcdf, f pour float, d pour double, l pour long integer, s pour short, c pour char et b pour Byte
  • value_attr : correspond à la valeur de l'attribut.

La valeur de var_nm est le nom de la variable contenant l'attribut (nommé att_nm) que vous souhaitez définir. Vous pouvez utiliser des caractères génériques pour définir l'attribut att_nm sur plusieurs variables. Une valeur de var_nm = '*' définira l'attribut att_nm sur toutes les variables de données. Si var_nm est manquant, alors att_nm fait référence à un attribut global.

La valeur de att_nm est le nom de l'attribut que vous souhaitez définir. Pour chaque attribut, un type chaîne (att_nm:s), double (att_nm:d) ou entier (att_nm:i) peut être défini. Par défaut, le type natif est défini.

La valeur de att_val correspond au contenu de l'attribut att_nm. att_val peut être une valeur unique ou un tableau d'éléments unidimensionnel. Le type et le nombre d'éléments d'un attribut seront détectés automatiquement à partir du contenu des valeurs. Un attribut att_nm déjà existant sera écrasé ou supprimé si att_val est omis. Alternativement, les valeurs d'un attribut existant peuvent être utilisées, cet attribut doit alors être placé entre accolades {[var_nm@]att_nm}.

select,seltimestep,sellonlatbox : opérateurs de sous-sélections de variables et/ou sur des dimensions

Les opérateurs de selection sont nombreux dans CDO. Nous présentons ici trois exemples select,seltimestep,sellonlatbox .

L'opérateur select permet de sélectionner une ou plusieurs variables s'utilise comme suivant:

cdo [select][param]  input-files output-file

où param correspond à une liste de nom variables séparées par des virgules. On peut aussi sélectionner des niveaux pour les variables 3D avec le mot clé level et/ou des dates avec le mot clé date input-files permet de gérer plusieurs fichiers en une seule ligne de commande et de les écrire dans output-file.

Example d'utilisation:

cdo select,name=T,U,V,level=200,500,850 infile1.nc infile2.nc infile3.nc outfile.nc

A contrario, delete peut être utiliser à la place de select pour supprimer tout ou partie d'un fichier ou de plusieurs fichiers et écrire le résultat dans un fichier de sortie. A utiliser avec modération!!!

L'opérateur seltimestep permet de sélectionner un ou plusieurs pas de temps et s'utilise comme suivant:

cdo [seltimestep][param] input-file output-file

où param correspond à une liste de pas de temps (entiers) séparés par des virgules. A la différence de select, il ne prend en compte qu'un seul fichier d'entrée.

Exemples d'utilisation:

cdo -seltimestep,3 <infile> <outfile>    # pas de temps 3
cdo -seltimestep,1,13,25 <infile> <outfile> # 3 pas de temps
cdo -seltimestep,1/12 <infile> <outfile> # de 1 à 12 en indice de pas de temps

L'opérateur seltimestep peut être remplacer par multiples opérateurs permettant la sélection d'année,mois, jours...etc . L'utilisateur pourra se référer à la documentation pour plus d'informations.

L'opérateur sellonlatbox permet de sélectionner un sous-échantillon spatial et s'utilise comme suivant:

cdo [sellonlatbox][param] input-file output-file

où param correspond à une liste de coorodnées en degrées séparées par des virgules et sous le format lonmin/lonmax/latmin/latmax. A la différence de select, il ne prend en compte qu'un seul fichier d'entrée. Cet opérateur peut aussi être utiliser pour réarrange des données en longitude. Par exemple pour passer de longitude 0 à 360 degrés vers -180 to 180 degrés.

Exemples d'utilisation:

# select hémisphère nord (sous-région)
cdo -sellonlatbox,-180,180,0,90 <infile> <outfile> 
# rearrange data de longitude 0 à 360 degrés vers -180 to 180 degrés (latitude: -90 à 90 degrés sont conservées)
cdo -sellonlatbox,-180,180,-90,90 <infile> <outfile>  

copy, cat, mergetime : fusion/Concatenation de fichiers

copy,cat et mergetime permet de réaliser la concatenation de fichiers netcdf sur l'ensemble des variables ou en sous-selectionnant via l'utilisation de dimension.

cdo [copy, cat, mergetime]] input-files output-file

L'opétarur copy va copier les datasets d'entrée dans le fichier de sortie. L'opérateur cat est identique mais vient concatener les fichiers d'entrées dans un fichier de sorties existants. D'autres opérateurs de merging comme mergetime peuvent être utilisés pour limiter la concatenation à la dimension temporelle. Tous les fichiers d'entrées doivent avoir la même structure.

Travaux pratiques

Pour faire le TP, se déplacer dans le répertoir tp/nco-cdo .

cd tp/nco-cdo  # si vous êtes dans votre home directory
cd nco-cdo # si vous êtes dans le répertoire tp
cd ../nco-cdo # si vous êtes dans un sous-répertoire de tp

On va travailler sur deux fichiers ici :

  • tas_histo_one_year.nc contient des données de température du giec sur l’année 2005
  • tasdeg_rcp85_only.nc contient des données de température du giec sur l’année 2099
ncdump -h  tas_histo_one_year.nc  # voir le header
ncview tas_histo_one_year.nc # visualisation du fichier

Fonction d’aide à l’usage de cdo

cdo --operators # Liste les opérateurs
cdo -h yearsum # Aide sur un opérateur
cdo -info  tas_histo_one_year.nc # liste les pas de temps et staistiques sur les variables
cdo -showname tas_histo_one_year.nc # liste les variables
cdo -ntime  tas_histo_one_year.nc # affiche le nombre de pas de temps

Rappel : La commande de base de cdo est cdo

Le fichier de sortie est obligatoire à la différence de nco et ne peut pas etre le meme que le fichier d’entrée.

TP Equivalent à nco

  • cdo expr(aexpr) : processeur arithmétique Ex : changer l’unité d’une température
cdo aexpr,tasdeg=tas-273.15 tas_histo_one_year.nc tasdeg.nc 
  • cdo setattribute : manipuler les attributs. Les attributs sont de la forma my_var@my_attr ou my_attr pour les attributs globaux
cdo setattribute,tasdeg@units="°C" tasdeg.nc tasdeg_goodunit.nc # Ex : modifier l’unité
  • cdo setmissval : changer la valeur par défaut
cdo setmissval,999. tasdeg_goodunit.nc tasdeg_tmp.nc  # changer la valeur manquante
  • cdo setattribute : ajouter un attribut global
cdo setattribute,institution=”SIST24”  tasdeg_tmp.nc  tasdeg.nc # ajout d'un attribut global
ncdump -h  tasdeg.nc  # controler les modifications

Extraire une variable

  • on ne garde que tasdeg en °C
cdo selname,tasdeg tasdeg.nc tasdeg_only.nc # équivalent à)select mais plus restrictif

Concaténer les fichiers

  • cdo copy : concaténer sur toutes les variables
cdo copy tasdeg_only.nc tasdeg_rcp85_only.nc tasdeg_concat.nc # résultat identique avec mergetime

Opérations binaires

  • cdo [sub/add] opération binaire d'addition ou de soustraction
cdo sub tasdeg_rcp85_only.nc tasdeg_only.nc  tasdeg_sub.nc

extraitre une zone géographique

  • cdo -sellonlatbox -seldate : enchainement d'opérateurs pour la selection de date, de zone
cdo -sellonlatbox,-180,180,-20,20 -seldate,2099-08-10T00:00:00,2099-08-20T00:00:00 tasdeg_sub.nc tasdeg_sub_lat.nc # avec reprojection des données de -180 à 180 degrées.

Lien utiles

Documentation CDO : https://code.mpimet.mpg.de/projects/cdo/wiki