wiki:UserList/BilanDidier

Version 26 (modified by dsolyga, 8 years ago) (diff)

--

Liste des développements réalisés

Voici la liste de mes travaux :

  • Réorganisation de stomate( juin-septembre 2010) : travail consistant à calquer l'organisation des modules de stomate sur l'organisation des modules de sechiba
    • encapsulation des variables restartées dand les modules où elles sont définies. Actuellement, toutes les variables sont définies dans stomate alors que certaines variables ne sont utilisées que dans un module.
    • création d'une routine init dans chaque module pour l'initialisation des variables
    • j'avais updaté la liste des variables par rapport à ma version de travail originelle (ORCHIDEE AR5 juin 2010)
    • J'explique ce travail sur la page suivante :voir CleanOrchidee
    • Avec le recul, je ne suis pas très satisfait de ce travail. Il est à reprendre et à actualiser. La version est sur le serveur SVN (branche Restruct_Stomate)
    • C'est un travail qui n'est pas spécialement difficile mais long. Les test à faire sont triviaux (comparaison de fichiers restart).
    • QUESTION : Est-ce que le but est bien de supprimer le module stomate_io ?
  • Développement de l'externalisation des paramètres du modèle (septembre 2010 - Avril 2011 puis maintenance jusqu'en mai 2012) :
    • implémentée dans le tag 1.9.6.
    • Outils : script python permettant de construire une carte avec X pfts à partir de la classification de Olson. Il s'agit d'une mise à jour du script de Martial et Nathalie de 2006. Il utilise la librairie CDAT2. Problème : il est utilisable uniquement sur Obelix et n'est donc pas portable. Voir http://forge.ipsl.jussieu.fr/orchidee/browser/trunk/TOOLS/GENERATE_VEGET_MAP
    • J'avais reformaté les etiquettes pour les paramètres dans le code (ajout de Config units) afin qu'ils soient interprétables par un script shell et gawk.
      Ces 2 scripts permettent de génerer 2 fichiers texte orchidee.default et orchidee_wiki. orchidee_wiki génère un fichier texte au format wiki permettant de mettre à jour la page suivante Documentation/OrchideeParameters . Attention, seuls les Config Help écrits sur plusieurs lignes sont gérés. Les autres rubriques doivent tenir obligatoirement sur une ligne.http://forge.ipsl.jussieu.fr/orchidee/browser/trunk/TOOLS/TOOLS_PARAMETERS
    • Tous les scripts sont documentés : il y a un fichier README pour chacun des 2 scripts.
  • Spatialisation :
    • Travail jamais effectué. Il y a eu d'autres priorités, par conséquent pas le temps pour faire la liste des paramètres. Avec la nouvelle hydrologie, c'est peut-être le bon moment pour y réfléchir. Je peux ouvrir un ticket.
    • J'ai écrit un document en août 2011 sur la spatialisation de dpu_cste (maintenant dpu_max) et vcmax_opt. Voir le document suivant en français format doc format pdf
    • J'ai également une version d'ORCHIDEE basée sur la révision 300 de la branche ORCHIDEE-EXT où j'avais ajouté une dimension supplémentaire à dpu_cste et à vcmax_opt. Elle est présente sous le serveur svn dans mon dossier personnel sous le nom TEST_SPATIALIZATION_JULY_2011.
    • Nicolas Viovy a spatialisé la profondeur de sol et vcmax dans sa version (ainsi que le sla).
  • Spin-up (avril-juin 2011 puis novembre 2011-juilet 2012) :
    • Implémentation réalisée. Permet d'accélerer la convergence des pools de carbone du sol.
    • Travail entièrement documenté : voir Branches/AccelerationSpinup pour la description du développement, la présentation donnée lors de la réunion ORCHIDEE-DEV du 05/07/2012 SPINUP_final_presentation et le document technique de septembre 2012 SPINUP_technical_documentation
    • Extension de la méthode lors des prochains merges : la méthode doit être retravaillée pour le merge avec FM et avec l'azote. Pour FM, il faut rajouter 2 pools de litière et donc augmenter la taille des matrices.
    • Extension de la méthode pour FM et la branche azote : branches/AccelerationSpinup/ExtensionMethod?
    • Si l'écriture des fichiers stomate_Cforcing.nc et stomate_forcing.nc doit être supprimé, il faut toujours pouvoir lire dans le .def le paramètre FORCESOIL_NB_YEAR (::nbyear dans stomate.f90). Ce paramètre est utilisé pour calculer la période de résolution.
  • Performances du modèle :
    • Mon travail sur les performances du modèle se trouvent ici : ParallelismPerformances
    • Tutoriel sur l'utilisation de vampirtrace ici HowTo/OrchideeVampir.
    • Conclusion : les performances d'ORCHIDEE sont correctes jusqu'à 64 processeurs (CRU-NCEP, 0.5°). Pour NCC (1°), l'optimal est 32 processeurs. Pour les forçages intermédiaires, choisir 48 processeurs.
    • Suggestion : une réflexion est à envisager sur le nombre de variables à sortir ou au moins sur le niveau des sorties des variables. Dans un premier temps, on pourrait mettre à 1 les variables nécessaires pour réaliser un spin-up.
  • Cours :
    • J'ai regroupé les dernières versions des fichiers odp sur le DODS dans le dossier WIKI/ORCHIDEE_COURSE.
    • Il y a 5 tutoriels : deux donnés lors des formations ORCHIDEE, un sur les tickets, un quick start guide et le cours SVN.
    • SVN : J'ai remis à jour mon cours en essayant de merger la présentation de Josefine donnée lors de la réunion DEV du 13/11/2012. (voir SVN_course)
    • Quick start guide : écrit avec Sebastiaan et Josefine. Permet d'installer et de lancer ORCHIDEE avec libigcm pour la première fois. (voir quick_start_guide_ORCHIDEE)
    • Formation ORCHIDEE : cours sur la configuration OOL_SEC_STO et libigcm sur Obelix (voir Config_ORCHIDEE)
    • Formation ORCHIDEE sur les sites web et le management du code (Code_and_doc_ORCHIDEE)
    • le tutoriel sur les tickets est accessible sur la page HowTo

  • Maintenance des configurations :
    • Le passage à libigcm 2.0 pour les configurations d'ORCHIDEE s'est fait un peu dans la douleur.
    • Les configurations du trunk actuel, dont le spinup fonctionnent avec toutes les versions de libigcm (rétro-compatibilité)
    • A l'avenir, s'assurer de se tenir au courant de l'évolution de libigcm
  • Tâches secondaires :
    • Compilation ORCHIDEE avec gfortran (pour installation personnelle sur pc portable)
    • Synchronisation de la branche MERGE-OCN avec le trunk pour avoir une version avec l'azote la moins divergente possible. Proposition :intégrer la dimension supplémentaire des variables de carbone dans le trunk (pas de changements dans les résultats). Il s'agit d'ajouter une dimension supplémentaire aux variables suivantes : bm_sapl, litter, bm_to_litter, turnover_daily, turnover_littercalc, turnover_longterm, bm_to_littercalc and biomass.
    • Compilation avec le lf95 sur Obelix : je n'ai mis à jour le script depuis la réorganisation des sources. Le compilateur lf95 est utilisé pour la branche Assimilation. Il est assez strict donc utile pour débugguer. Voir :http://forge.ipsl.jussieu.fr/orchidee/browser/trunk/TOOLS/COMPILATION_LF95.
  • TO DO :
    • Ajouter flowchart et équations pour l'externalisation et le spin-up
    • Tickets : #7, #10, #14, #23, #28, #29, #34, #39
    • écrire documentation sur les entrées-sorties (umbrella documentation)
  • Travaux non effectués :
    • Lecture par paquets des fichiers de forçage : Martial a codé dans sa version personnelle la lecture par paquets des fichiers de forçage. Cette version est basée sur la version 1.9.5.2 et le portage sur le trunk actuel nécessite du travail (à cause de l'interpolation journalière). J'ai testé un peu le code et il y a un problème avec les fichiers de restart. J'ai archivé mes tests avec Vampir sous Curie, sur mon $WORKDIR dans MY_WORKS/PERFORMANCES_IO_ORCHIDEE_IMPROVEMENTS_TESTS/RESULTS (prendre l'archive TEST_LECTURE_PAQUETS_FORCING_MM.tar).

Liste des versions dans mon dossier personnel SVN :

  • Il existe 3 versions d'ORCHIDEE dans mon dossier personnel.
    • MERGE_FORESTRY : basée sur la branche MERGE-OCN (trunk + dimension supplémentaire pour les variables du carbone). Cette version intègre la branche orchidee_FM.
    • TEST_NEW_EXTERNALIZATION : basée sur une relative ancienne version du trunk. Utilisée pour améliorer l'externalisation (lecture des paramètres sous la forme beach%vcmax_opt par exemple). Problème pour l'interfacer avec setvar_p.
    • TEST_SPATIALIZATION_JULY_2011 : basée sur une ancienne révision de la branche ORCHIDEE_EXT. Utilisée pour modifier les dimensions de vcmax et dpu_cste (maintenant dpu_max).

  • Sur l'intégration de forest management dans le trunk :
    • j'ai externalisé les paramètres propres à FM et renommé certains paramètres PFTs (voir le paragraphe suivant)
    • ajout du flag FOREST_MANAGEMENT
    • Prise en compte des commentaires de Valentin (cf stomate_forestry de la branche orchidee_FM) + prise en compte du point de Toon (cf FMCleanUp) + prise en compte des remarques de Fabienne (idem FMCleanUp)

Externalisation Forest management :

J'ai fait la liste des paramètres PFT pour forest management. Avec Nicolas (Viovy), nous avons renommé certains paramètres qui n'étaient pas très explicites (comme a, c, d, etc). Voici la liste des nouveaux noms (concerne le module forestry) :

Ancien nom Nouveau nom
a fm_allo_a
c fm_allo_c
d fm_allo_d
p fm_allo_p
q fm_allo_q
a0 allo_crown_a0
a1 allo_crown_a1
a2 allo_crown_a2

Voilà la liste complète des paramètres PFTs :

  !
  ! Forest Management
  !
  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: fm_allo_a_mtc = &
  & (/ undef,   19.42,   19.42,     9.3,   19.42,   19.42,   9.3,  &        
  &    19.42,     9.3,   undef,   undef,   undef,   undef   /)   
    
  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: fm_allo_c_mtc = &
  & (/ undef,    0.11,   0.11,     0.35,   0.11,    0.11,   0.35,  &        
  &    0.11,     0.35,   undef,   undef,   undef,   undef   /)     
  
  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: fm_allo_d_mtc = &
  & (/ undef,    0.13,   0.13,     0.3,   0.13,    0.13,   0.3,  &        
  &    0.13,     0.3,   undef,   undef,   undef,   undef   /)     
  
  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: fm_allo_p_mtc = &
  & (/ undef,    0.75,   0.75,     0.69,   0.75,    0.75,   0.69,  &        
  &    0.75,     0.69,   undef,   undef,   undef,   undef   /) 
      
  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: fm_allo_q_mtc = &
  & (/ undef,    -0.12,   -0.12,     -0.32,   -0.12,    -0.12,   -0.32,  &        
  &    -0.12,    -0.32,    undef,    undef,   undef,    undef   /)
       
  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: allo_crown_a0_mtc = &
  & (/   undef,   -0.7602,   -0.7602,     -1.019,   -0.7602,   -0.7602,   -1.019,  &        
  &    -0.7602,    -1.019,     undef,      undef,     undef,      undef   /) 
  
  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: allo_crown_a1_mtc = &
  & (/   undef,   0.6672,   0.6672,     0.887,   0.6672,   0.6672,   0.887,  &        
  &    0.6672,     0.887,     undef,      undef,     undef,      undef   /)   

  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: allo_crown_a2_mtc = &
  & (/   undef,   0.12646,   0.12646,     0.188,   0.12646,   0.12646,   0.188,  &        
  &    0.12646,     0.188,     undef,      undef,     undef,      undef   /)   

  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: h_first_mtc = &
  & (/   0.0,   10.0,   10.0,   10.0,   10.0,   10.0,  10.0,   &
  &     10.0,   10.0,    0.0,    0.0,    0.0,    0.0   /)

  LOGICAL, PARAMETER, DIMENSION(nvmc) :: plantation_mtc = & 
  & (/  .FALSE.,  .FALSE.,  .FALSE.,  .FALSE.,  .FALSE.,  .FALSE.,  .FALSE.,  &
  &     .FALSE.,  .FALSE.,  .FALSE.,  .FALSE.,  .FALSE.,  .FALSE.  /)

  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: nmaxtrees_mtc = & 
  & (/  10000.,  10000.,  10000.,  10000.,  10000.,  10000.,  10000.,  &
  &     10000.,  10000.,  10000.,  10000.,  10000.,  10000.  /)

  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: dens_target_mtc =  &
  & (/   0.0,   100.0,   100.0,   200.0,   100.0,   100.0,   200.0,  &
  &    100.0,   200.0,     0.0,     0.0,     0.0,     0.0   /) 

  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: branch_ratio_mtc =  & 
  & (/  0.0,   0.38,   0.38,   0.25,   0.38,   0.38,   0.25,  & 
  &    0.38,   0.25,    0.0,    0.0,    0.0,    0.0 /)

  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: frac_growthresp_mtc = &
  &(/  0.28,   0.28,   0.28,   0.28,   0.28,   0.28,   0.28, &
  &    0.28,   0.28,   0.28,   0.28,   0.28,   0.28 /) 

  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: pipe_density_mtc = &      !! Density (gC/m3) (source: AFOCEL 2006
  &(/   0.0,   3.e5,   3.e5,   2.e5,   3.e5,   3.e5,   2.e5,  &
  &    3.e5,  2.e5,    2.e5,   2.e5,   2.e5,   2.e5  /)  

  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: decl_factor_mtc = &
  & (/     0.0,   0.0005,   0.0005,   0.0007,   0.0005,   0.0005,   0.0009, & 
  &    0.00075,   0.0005,      1.0,      1.0,      1.0,      1.0 /)    

  REAL(r_std), PARAMETER, DIMENSION(nvmc) :: opt_factor_mtc = & 
  & (/  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  &
  &     1.0,  1.0,  1.0,  1.0,  1.0,  1.0  /)

Le bout de code est disponible dans mon répertoire perso, dans le dossier MERGE_PHENO_SPIN_OMP.
Voilà la liste pour les paramètres de l'azote (fait rapidement) :

  ! CN ratio of leaves if nitrogen is not calculated dynamically
  REAL(r_std), SAVE, DIMENSION(nvm)                  :: cn_leaf_prescribed
  cn_leaf_prescribed(2:nvm) = &
 & (/         25.,       25.,       42.,       25.,       25.,     42.,  &
 &                     25.,       25.,      25.,       25.,      25.,     25.   /)

  ! minimum CN ratio of leaves in dynamic mode
  REAL(r_std), SAVE, DIMENSION(nvm)                        :: cn_leaf_min
  cn_leaf_min(2:nvm) =   &
 & (/         16.,       16.,       28.,       16.,       16.,     28.,  & 
 &                     16.,       16.,       16.,      16.,      16.,     16.   /)

  ! maximum CN ratio of leaves in dynamic mode 
  REAL(r_std), SAVE, DIMENSION(nvm)                        :: cn_leaf_max 
  cn_leaf_max(2:nvm) =   &
 & (/         45.,       45.,       75.,       45.,       45.,     75.,  & 
 &                     45.,       45.,       45.,      45.,      45.,     45.   /)

!!$  ! leaf CN parameter for allocation
!!$  REAL(r_std), DIMENSION(nvm)                        :: cn_leaf_crit 

  ! CN of "wood" for allocation relative to leaf CN
  REAL(r_std), DIMENSION(nvm)                        :: fcn_wood
  fcn_wood(2:nvm) = &
 & (/        .145,      .145,      .145,      .145,      .145,    .145,  & 
 &                    .145,       .145,       .86,      .86,      .86,     .86   /)

  ! CN of "root" for allocation relative to leaf CN
  REAL(r_std), DIMENSION(nvm)                        :: fcn_root
  fcn_root(2:nvm) = &
 & (/         .86,       .86,       .86,       .86,       .86,     .86,  & 
 &                     .86,       .86,       .86,      .86,      .86,     .86   /)

!!$  ! size of reserve in standard allocation (frac times LAI)
!!$  REAL(r_std), DIMENSION(nvm)                        :: reserve_frac 

  ! root conductance for water [units?], c.f. Hickler et al., 2006
  REAL(r_std), DIMENSION(nvm)                        :: k_root
  k_root(2:nvm) = & 
 & (/           4.,       4.,        4.,        4.,         4.,     4.,  & 
 &                      4.,        4.,         4.,      4.,       4.,     4.    /)*1.e-7

  ! sapwood specific conductance for water [units], c.f. Hickler et al., 2006
  REAL(r_std), DIMENSION(nvm)                        :: k_sap

  k_sap(2:nvm) = & 
 & (/          30.,      30.,        30.,       30.,        30.,     30.,  & 
 &                      30.,        30.,        .1,      .1,       .1,     .1    /)*1.e-4 * 0.67 

  ! root to sapwood tradeoff parameter (calculated from the above parameters)
  REAL(r_std), DIMENSION(nvm)                        :: c0_alloc  

  ! leaf to sapwood area at zero height and no water stress (calculated from the above parameters)
  REAL(r_std), DIMENSION(nvm)                        :: k_latosa_zero

! relative photosynthetic capacity of plant functional types (fraction)
! for CEXCHANGE (Friend and Kiang, 2005) photsynthesis calculations 
  REAL(r_std), DIMENSION(nvm),SAVE :: &  
 &  nf_fix = (/ 1.0, 1.1, 1.5, 0.75, 1.1, 1.5, 0.75, 1.5, 1.5, 1.5, 0.5, 1.5, 0.5 /) 
! minimum conductance associated with cuticular transpiration (m/s)
! for CEXCHANGE (Friend and Kiang, 2005) photsynthesis calculations 
  REAL(r_std), DIMENSION(nvm),SAVE :: & 
 &  gs_min = (/ 0.00006, 0.00006, 0.00006, 0.00003, 0.00006, 0.00006, & 
 &                  0.00003, 0.00006, 0.00003, 0.00006, 0.00006, 0.00006, 0.00006 /)    
! maximum conductance associated with full stomatal overture (m/s)
! for CEXCHANGE (Friend and Kiang, 2005) photsynthesis calculations 
  REAL(r_std), DIMENSION(nvm),SAVE :: & 
 &  gs_max = (/ 0.006, 0.006, 0.006, 0.006, 0.006, 0.006, & 
 &                  0.006, 0.006, 0.006, 0.006, 0.01, 0.006, 0.01 /)
! slope of gs response to photosynthesis at CO2 saturation
! for CEXCHANGE (Friend and Kiang, 2005) photsynthesis calculations 
  REAL(r_std), DIMENSION(nvm),SAVE :: & 
 &  gsslope_fix = (/ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.5, 1., 1.5 /)

  ! below this lai, the carbohydrate reserve is used
!!  REAL(r_std), DIMENSION(nvm)                               :: lai_happy

    ! pft parameters
    REAL(r_std), DIMENSION(nvm) :: max_soil_n_bnf = &
    &  (/ 0.0, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 2., 2., 2., 2. /)

!!$    ! Kompensation point of CN on nitrogen uptake
!!$    REAL(r_std), DIMENSION(nvm) :: up_b 
!!$    REAL(r_std), DIMENSION(nvm) :: up_m 
!!$    REAL(r_std), DIMENSION(nvm) :: Kcn 
!!$    REAL(r_std), DIMENSION(nvm,2) :: vmax_uptake

A faire :Il y a également la liste des paramètres de l'assimilation à faire que je n'ai pas eu le temps d'effectuer. Il faut faire un travail de convergence des noms. Voir Branches/Assimilation.

Suggestions, remarques

  • Simplification du code : on peut éliminer quelques paramètres redondants comme maint_resp_slope, pheno_gdd_cri et senescence_temp. Par exemple, maint_resp_slope est défini comme ceci :
  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION(:,:) :: maint_resp_slope  !! slope of maintenance respiration coefficient 
                                                                      !! (1/K, 1/K^2, 1/K^3), used in the code

    maint_resp_slope(:,1) = maint_resp_slope_c(:)              
    maint_resp_slope(:,2) = maint_resp_slope_b(:)
    maint_resp_slope(:,3) = maint_resp_slope_a(:)

On l'utilise dans l'équation suivante dan stomate_npp et stomate_resp :

       slope(:) = maint_resp_slope(j,1) + tl(:) * maint_resp_slope(j,2) + &
            tl(:)*tl(:) * maint_resp_slope(j,3)

alors que l'on pourrait utiliser directement maint_resp_slope_a, maint_resp_slope_b et maint_resp_slope_c :

       slope(:) = maint_resp_slope_c(j) + tl(:) * maint_resp_slope_b(j) + &
            tl(:)*tl(:) * maint_resp_slope_a(j)
  • Documentation : Martial a converti en latex les documents techniques que Fabienne et lui avaient écrits. Ils sont disponibles dans sa version personnelle sur svn. Il faudrait qu'ils soient mis à jour.
  • Tickets à créer : spatialisation, lecture fichier CO2 par les scripts, ajout des flags liés aux COV dans sechiba.card.