wiki:Cmorisation

Cmor-isation des fichiers


Outils adaptés à IPSLCM5A pour Cmoriser

Sébastien a mis en place un ensemble de script permettant de cmoriser facilement les TS sorties du modèle couplé IPSLCM5A. L'ensemble des scripts fonctionne sur cesium et est disponible sur le compte p86cmip5. Il y a trois répertoires à récupérer :

CMOR_TABLES

  • Tables/ --> contient les tables officielles de CMIP5
  • create_from_CMIP5_tables.bash --> script pour créer les tables de correspondances IPSL/IPCC
  • EMPTY/ --> répertoire créé par le script précédent. Contient les tables de correspondances IPSL/IPCC à compléter
  • FULL/ --> répertoire EMPTY/ mais cette fois-ci complété avec les noms et les unités des variables IPSL. Voir plus bas la description des différentes colonnes du fichier table.def
  • EXPERIMENT/ --> contient un sous répertoire pour chaque experiment_id qui lui même contient le config.def définissant les metadata de l'expérience à cmoriser.

table.def

Table.def contient plusieurs colonnes

#
# Nom IPSL | unites IPSL  | sens  |     nom IPCC     |   table IPCC  |        realm       |    cell_methods 
#          |              |positif|                  |               |                    |                 

Les colonnes "nom IPCC", "table IPCC3", "realm" et "cell_methods" sont déjà complétées. Les informations ayant servis à les créer proviennent de la table officielle CMIP5 (dans CMOR_TABLES/Tables/). Il ne reste que les colonnes "Nom IPSL" et "unites IPSL" à remplir. Si la variable n'existe pas dans le modèle il faut laisser la ligne vide. Dans la deuxième colonne si l'unité est SI (système international) et différente de celle attendue par Cmor, alors la conversion sera faite automatiquement par la librairie Cmor.

Attention : Si l'unité n'est pas reconnue par Cmor le programme plante

config.def

Pour connaître les différents experiment_id autorisé, ainsi que les forçages autorisé il faut se référer à la table officielle (dans CMOR_TABLES/Tables/)

CMOR_CONVERTER_v3

Il contient le code fortran ts2ipcc qui sera utilisé pour appeler la librairie Cmor. Ce code nécessite pour tourner :

  • un fichier netcdf avec la time serie de la variable à cmoriser
  • un fichier config.def pointant entre autre vers la table officielle
  • un fichier table.def de correspondance IPSL/IPCC
  • un fichier netcdf décrivant la grille dans le cas où l'on utilise NEMO

Pour compiler le code il suffit d'utiliser la commande "gmake"

CMIP5_CMOR2_SCRIPTS

Il contient les scripts de lancement de la chaine :

  • launch_*.job --> soumet le job CMORizeIt.job
  • CMORizeIt.job --> lit les tables pour définir quelles variables vont être cmorisées et prépare le répertoire de travail.
  • IPSL-DRSrc --> fichier qui pour chaque type de table (CMIP5_fx, ACCMIP_fixed etc...) donne des renseignements sur la fréquence des sorties, et sur la fréquence d'écriture cmor.

Au final deux répertoires seront ajoutés :

  • OutScript --> contiendra le journal de sortie de CMORizeIt (pour afficher correctement les messages en couleur, utiliser 'less -r fichier_de_retour_du_job_CMORizeIt' )
  • OutCmor --> contiendra le journal de sortie de ts2ipcc

Description du job CMORizeIt.job

  • initialisation de différentes variables
  • déclaration du path de libIGCM
  • source fichier IPSL-DRSrc dans lequel pour chaque type de table sont déclarées les variables ipsl_freq_path, cmor_frequency et ipsl_freq_file
  • ipsl_freq_path = [TS_MO, TS_DA, TS_HF, TS_YR] --> noms des répertoires dans lesquels sont stockés les différents Time Series créées avec libIGCM
  • cmor_frequency = [yr, mon, day, da, 6hr, 3hr, subhr, fx] --> fréquences standard définies par cmor
  • ipsl_freq_file = [1M, 1Y, 1D] --> nomenclature libIGCM lors de la création des fichiers de sorties (ex: abrupt4xCO22_18500101_19491231_1M_iwcon.nc)
  • création des répertoires de RUN . En batch RUN_DIR_PATH créé un répertoire temporaire sur le tmp, en interactif on peut le renommer (par exemple $SCRATCHDIR/CMORizeIt). Attention cependant dans ce cas là, si vous lancez plusieurs job ils s'écraseront les uns les autres.
  • copie dans le répertoire de RUN du config.def, de la table.def et de la grille (les grilles ORCA sont nécessaires lorsque l'on tourne avec NEMO)
  • mise à jour du config.def à partir des variables déclarée plus haut (avec la commande CMOR_sed). Utile lorsque l'on veut utiliser le même config.def pour plusieurs tables.
  • Repère la liste des variables déclarée dans la colonne IPSL
    liste_var=$( cat table.def | grep -v \# | grep -v ^" "| awk -F\| '{print $1}' )
    
  • Boucle sur les différentes variables :
    • pour chacune d'entre elles on va trouver le nom cmor de cette variable avec la commande
      cmor_var=$( cat table.def | grep -v \# | grep ^"${var} " | awk -F\| '{print $4}' )
      
    • et son modèle avec la commande
      cmor_realm=$( cat table.def | grep -v \# | grep ^"${var} " | awk -F\| '{print $6}' | awk "-F " '{print $1}' )
      
    • établie la correspondance entre les modèles cmor et les composantes libIGCM
      ex : 
          [ ${cmor_realm} = atmos ]     && ipsl_comp=ATM
      
    • définition du cmor_path qui est la nomenclature sous laquelle seront stockés les fichiers finaux.
    • définition du ipsl_path qui pointe vers le répertoire Analyse/ contenant les TS à cmoriser.
    • Boucle sur ipsl_freq_path (rappel les différents type de TS) et pour chacun on teste le cmor_frequency.
      • Si cmor_frequency = fx on va analyser le fichier LMDZ96x95x39.nc (qui contient les variables aire et phis), sinon on va chercher la TS correspondant à la variable.
      • On appelle ce fichier (LMDZ96x95x39 ou TS) candidat. Si il y a plusieurs variables définies dans la table, candidat est alors une liste de fichiers TS.
      • Si cmor_frequency n'est pas fx on analyse le nom du candidat pour connaître la date de début et la date de fin de la période (yearBeg, monthBeg, yearEnd, monthEnd)
      • on définit cmor_file qui sera le nom du fichier final à la norme Cmor (contient le nom du modèle, la fréquence, le nom du répertoire parent, la date de début et la date de fin de la période étudiée)
      • candidat devient data.nc qui sera le fichier d'entrée de ts2ipcc
      • Si la variable à cmoriser est en 3D il faut récupérer la TS de psol qui sera renommée pression.nc et utilisée également par ts2ipcc
  • pour finir on lance ts2ipcc
            if [ ${cmor_frequency} = "fx" ]; then
                ./ts2ipcc data.nc ${var} > ${POST_DIR}/${OutFile} 2>&1
            elif [ ${cmor_frequency} = "yr" ]; then
                cdo -settime,12:00 -setday,2 -setmon,7 -settunits,seconds data.nc data2.nc
                ncrename -d time,time_counter -v time,time_counter data2.nc
                mv data2.nc data.nc
                CMOR_sed config.def force_timebnds true
                ./ts2ipcc data.nc > ${POST_DIR}/${OutFile} 2>&1
            else
                ./ts2ipcc data.nc > ${POST_DIR}/${OutFile} 2>&1
            fi
    

A vérifier avant de se lancer

  • bien vérifier les experiment id autorisé (table officielle)
  • vérifier dans ts2ipcc la variable calendar qui peut valoir 360_day ou noleap. Elle doit correspondre à ce qu'il y avait dans le config.card de votre simulation
  • il faut avoir l'environnement adapté en chargeant par exemple ~p86cmip5/.basrhc_cesium
  • si vos fichiers sont en 19 niveaux vous devez modifier ts2ipcc en décommentant les valeurs de a et b pour le 19 levels et en commentant celles pour le 39 levels.
  • installer l'environnement cmor en sourçant le fichier ~p86cmip5/.bashrc_cesium

Pour Cmoriser autre chose que des TS

C'est tout à fait possible mais :

  • il faut modifier CMORizeIt pour qu'il appelle ts2ipcc avec le nom de la variable à cmoriser si il y en a plusieurs dans le fichier data.nc
  • il faut modifier ipsl_path dans CMORizeIt pour qu'il aille chercher vos fichiers
  • il faut modifier CMORizeIt pour qu'il n'aille pas chercher de fichier psol si cette variable est également dans data.nc
  • il faut modifier ts2ipcc pour que la variable ps soit lue dans data.nc et non pas dans pression.nc

Petit bug dans ts2ipcc ?

Actuellement la conversion d'unité pour cmor est appelée avec l'unité lue dans le fichier netcdf et non pas l'unité lue dans la table de correspondance IPSL/IPCC. Pour changer cela il faut modifier l'appel à cmor_variable :

il devient : 

  cmorvarid = cmor_variable(                        &
       table_entry=TRIM(ipcc_name(index_table)),    &
       units=TRIM(ipsl_units(index_table)),                           &
!      units=TRIM(units),
       !axis_ids=(/ ilon, ilat /),                  &
       !axis_ids=axis_ids,                          &
       !axis_ids=(/ grid_id, itim /),               &
       axis_ids=axis_ids_final,                     &
       missing_value=missing_value,                 &
       positive = TRIM(ipsl_pos(index_table)),      &
       original_name=TRIM(varname))

Conversion d'unités ?

Si vous voulez connaître les conversions d'unités réalisables par cmor vous pouvez utiliser l'outil udunits. Voilà un exemple d'utilisation (après avoir vérifier avec la commande module list que vous l'avez bien installé)

p86cozic@cesium21:/scratch/cont003/p86cozic/CMORizeIt6> udunits2 
udunits2: Using default XML database
You have: g 
You want: mole m-3 s-1
udunits2: Units are not convertible
You have: g       
You want: kg
    1 g = 0.001 kg
    x/kg = 0.001*(x/g)
You have: mole m-3 s-1
You want: mole m-3 month-1
    1 mole m-3 s-1 = 2.62974e+06 (mole m-3 month-1)
    x/(mole m-3 month-1) = 2.62974e+06*(x/(mole m-3 s-1))

Changement d'unité à l'aide d'un facteur de conversion

Le code ts2ipcc permet de faire une conversion d'unité par un facteur de conversion. Il faut dans ce cas là ajouter l'unité

  IF ( units == 'mol-C/L' )      units='mol l-1'

et définir le facteur de conversion

  IF ( TRIM(varname) == 'PO4' ) THEN
     factor=1./122.0
  ENDIF

Attention si le code a été modifié lors de l'appel de cmor_variable pour qu'il tienne compte des unités déclarées dans table.def il faut peut être zapper l'ajout d'unité décrit ci-dessus mais mettre un test lors de l'appel de cmor_variable pour que si un facteur a été définit l'appel se fasse avec les anciens arguments.

Pages web et Infos diverses

  • Web Cmor
  • version la plus à jour des tables CMIP5
  • Si on veut la liste des tables de correspondance entre variables IPSL et tables CMOR :
    ls ~/CMOR_TABLES/CMIP5/FULL/table* | cut -d. -f3 | xargs
    
            CMIP5_3hr CMIP5_6hrLev CMIP5_6hrPlev CMIP5_aero CMIP5_Amon
            CMIP5_cf3hr CMIP5_cfDay CMIP5_cfMon CMIP5_cfOff CMIP5_cfSites
            CMIP5_day CMIP5_fx CMIP5_LImon CMIP5_Lmon CMIP5_Oclim
            CMIP5_OImon CMIP5_Omon CMIP5_Oyr
    

Short English Version

1) First we start by the table: /home/cont003/p86cmip5/CMOR_TABLES/CMIP5/Tables : the official CMIP5 tables /home/cont003/p86cmip5/CMOR_TABLES/CMIP5/create_from_CMIP5_tables.bash : a script that will build empty correspondence table /home/cont003/p86cmip5/CMOR_TABLES/CMIP5/EMPTY : results from the previous script /home/cont003/p86cmip5/CMOR_TABLES/CMIP5/FULL : full correspondence table making the link between ipsl variable name and cmip5 variable name /home/cont003/p86cmip5/CMOR_TABLES/CMIP5/EXPERIMENTS: where you describe your metadata experiment

2) Second we have a fortran code: /home/cont003/p86cmip5/CMOR_CONVERTER_v3/ts2IPCC.f90 /home/cont003/p86cmip5/CMOR_CONVERTER_v3/Makefile

This code need :

  • one file containing a time series of a single variable
  • a config.def describing metadata of the experiment and pointing the original CMIP5 table
  • a table.def describing correspondence between ipsl and cmip5 variable names
  • grid description file in case of NEMO processing

3) End a script to drive all this: /home/cont003/p86cmip5/CMIP5_CMOR2_SCRIPTS/launch_piControl2.job /home/cont003/p86cmip5/CMIP5_CMOR2_SCRIPTS/CMORizeIt.job

The first launch the second one, and adapt config.def. The second one is the more interesting to look at. He can run standalone.

/home/cont003/p86cmip5/CMIP5_CMOR2_SCRIPTS/OutScript : contains each script outputs (doing multiple cmor execution) /home/cont003/p86cmip5/CMIP5_CMOR2_SCRIPTS/OutCmor : contains outputs for each cmor execution

Netcdf results can be found on cesium: /scratch/cont003/p86cmip5/CMIP5

Last modified 12 years ago Last modified on 11/10/11 16:08:33