Sources
-
Rajouter des sorties
- Je veux rajouter des sorties dans la physique. Comment faire suite à la réorganisation des routines histdef/histwrite/phys_output_*?
Les sorties n'ont pas fondamentalement changées, on a juste ajouté une surcouche pour pouvoir choisir les sorties à faire plus facilement. Cela se fait toujours en 2 étapes, une de définition (qui se fait maintenant dans phys_output_mod.F90) et une d'écriture (dans phys_output_write.h). L'ajout principal, c'est la définition d'une nouvelle structure associée à chaque variable à sortir. Cette structure est de type "5 entiers, 1 variable caractère" (voir la définition de ctrl_out au début de phys_output_mod.F90) qui correspondent aux différents niveaux de sorties que l'on souhaite pour la variable à sortir et au nom que l'on veut lui donner dans les fichier de sortie. Par exemple, pour la variable snow, on a défini un drapeau
o_snow = ctrl_out((/ 1, 1, 10, 1, 10 /),'snow')
qui veut dire que la variable s'appellera 'snow' dans les fichiers hist??? et qu'elle sera sortie à partir du niveau (celui qui est défini par lev_hist??? dans physiq.def)
1 dans le fichier histmth
1 histday
10 histhf
1 histins
10 histLES
Ceci permet, en fait, de contrôler le niveau de sortie des variables directement dans un fichier output.def. Par exemple, la variable topswai est normalement sortie à partir du niveau 4 dans histmth et 10 dans les autres. Si on sortir cette variable dans tous les fichiers histoire sans recompiler les sources, on rajoute la ligne
flag_topswai = 1, 1, 1, 1, 1
dans le fichier output.def.
Donc pour rajouter des variables de sortie, on définit une politique de sortie de la variable et son petit nom dans une nouvelle structure (que je te suggère de nommer o_qque_chose et qu'on rajoute au début de phys_output_mod.F90 dans la partie déclaration) et ensuite on rajoute les lignes
CALL histdef2d(...)
qu'il faut dans phys_output_mod.F90
et les blocs
IF (o_???flag(iff)<=lev_files(iff)) THEN
CALL histwrite_phy(...)
ENDIF
qu'il faut dans phys_output_write.h
(en se basant sur la variable snow, par exemple)Enfin, ne pas oublier de modifier les fichiers *xml pour les sorties XIOS (voir la Faq suivante)
-
J'ai rajouté une variable dans les sorties. Comment la rajouter dans les xml pour les sorties XIOS?
Vous venez de rajouter une variable de sortie en modifiant les fichiers:
- libf/phylmd/phys_output_ctrlout_mod.F90
- libf/phylmd/phys_output_write_mod.F90
N'oubliez surtout pas de modifier les fichiers *xml contrôlant les sorties sous XIOS car si vous ne le faites pas, dès que les sorties XIOS seront activées, le modèle plantera (vous demanderez en fait à XIOS de sortir une variable qu'il ne connaît pas).
Il faut définir votre variable dans le fichier DefLists/field_def_lmdz.xml puis l'inclure dans les fichiers DefLists/file_def_hist*xml si vous voulez effectivement la sortir dans les fichiers histoire.
Par exemple, vous avez défini la variable ocond dans phylmd/phys_output_ctrlout_mod.F90:
TYPE(ctrl_out), SAVE :: o_ocond = ctrl_out((/ 2, 3, 4, 10, 10, 10, 11, 11, 11 /), & 'ocond', 'Condensed water', 'kg/kg', (/ ('', i=1, 9) /))
Il vous faut alors rajouter la ligne
<field id="ocond" long_name="Condensed water" unit="kg/kg" />
dans DefLists/field_def_lmdz.xml. Attention, les variables sont regroupés par ensemble de variables 2D et 3D
Puis, pour que la variable soit effectivement écrite dans le fichier histmth.nc, par exemple, vous rajoutez la ligne
<field field_ref="ocond" level="2" />
dans le fichier DefLists/file_def_histmth_lmdz.xml où level correspond au niveau de sortie de la variable pour le fichier histmth. A priori, vous mettez les mêmes niveaux que ceux que vous avez défini dans phys_output_ctrlout_mod.F90