Changes between Version 7 and Version 8 of TravailTraceur


Ignore:
Timestamp:
Jan 10, 2020, 7:56:36 PM (4 years ago)
Author:
dcugnet
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • TravailTraceur

    v7 v8  
    4242&default
    4343# Note: currently, the 2 recognized types are "tracer" and "tag"
    44 type_trac=lmdz parent=air hadv=10 vadv=10 phases=g type=tracer
     44parent=air hadv=10 vadv=10 phases=g type=tracer
    4545&lmdz
    4646blue,red                     parent=H[2]HO,H2O type=tag   # tagging tracer of gen 1&2 tracers
     
    110110=== 16/12/2019: MISE À JOUR ===
    111111=== Les deux points à ajouter l'ont été:===
    112  * Possibilité de cumuler plutôt que fusionner des sections de traceurs. Le nom de section est alors ajouté en suffixe (avant l'éventuel suffixe de phase) pour permettre de distinguer les différents traceurs homonymes. Activation avec tracs_merge=.FALSE. (.TRUE. par défaut), paramètre "en dur" de readTracFiles_Mod.f90, qui peut être transformé si nécessaire en clef de fichier de configuration *.def.
     112 * Possibilité de cumuler plutôt que fusionner des sections de traceurs. Le nom de section est alors ajouté en suffixe (avant l'éventuel suffixe de phase) pour permettre de distinguer les différents traceurs homonymes. Activation avec tracs_merge=.FALSE. (.TRUE. par défaut), paramètre "en dur" de readTracFiles_Mod.f90, qui peut être transformé si nécessaire en clef de fichier de configuration *.def. NB: Abandon de l'inclusion de cette clef dans la clef "trac_type", qui était assez lourde.
    113113 * Gestion de base de données:
    114114  - Le parseur peut gérer plusieurs sections de traceurs par fichier, mais par mesure de simplicité (question tranchée avec Laurent Fairhead), on n'en lit qu'une, en fonction de la clef "type_trac". \\
     
    158158 - "def_val" est une valeur par défaut, au cas où la clef n'apparaîtrait pas dans le fichier tracer_*.def, ni dans la section de traceurs, ni dans la section "default".
    159159 - "t" est la base de données (vecteur de type "tr") dans laquelle chercher l'information (par défaut "tracers(:)"). Cela ne sert en principe qu'en interne pour manipuler "dBase(:)".
    160 Parmi les autres outils, on trouve '''aliasTracer''' pour créer un pointeur de traceur en fonction de son nom et '''idxTracer''' pour obtenir le(s) indice(s) d'un ou plusieurs traceurs.
     160Parmi les autres outils, on trouve '''aliasTracer()''' pour créer un pointeur de traceur en fonction de son nom et '''idxTracer()''' pour obtenir le(s) indice(s) d'un ou plusieurs traceurs.
    161161 - À noter que le module "strings_mod.f90" regroupe des outils couramment utiles pour les chaînes et les affichages, en particulier un équivalent du "find" de matlab (indices d'un ou plusieurs éléments dans un vecteur) et une routine d'affichage "propre" de tableaux (chaînes, entiers ou réels).
    162162
    163163'''SUITE PROBABLE''':
    164  * L'inclusion d'un pointeur de tableau réel en tant que nouvelle composante du type dérivé "tr" permet d'obtenir des raccourcis documentés vers les traceurs (utile notamment pour l'eau) tout en les laissant rangés comme avant (pas de pénalité numérique). A discuter.
    165  * Ces objets "tr" incluent, de manière plus ordonnée, donc pratique il me semble, les différents indices gérant les différentes générations. À rediscuter avec Camille, notamment pour savoir comment ranger la partie "initialisation" (les valeurs par défaut - coefficients de fractionnement par exemple - utiles pour les isotopes et leur initialisation, seraient assez à leur place dans les fichiers tracer_*.def sous forme de clefs).
     164
     165 * Il n'est pas nécessaire de substituer aux principaux tableaux (**qx** et **tr_seri** notamment) des types dérivés **tr** étendus par ajout d'une composante tableau: on peut conserver le tableau lui-même inchangé, tout en disposant du descripteur associé (de type **tr**), accessible par indice (numéro de traceur dans **qx** ou **tr_seri**) ou par nom de traceur (utilisation de **idxTracer()**).
     166Ces descripteurs présentent l'avantage de regrouper en une seule variable vectorielle les informations utiles pour tous les traceurs.
     167
     168 * De nombreuses variables possèdent un pendant isotopique (souvent repéré par un **x** additionnel dans le préfixe) ; les opérations s'appliquant à ces variables comme à leurs descendantes forçent pour l'instant la création explicite de ces descendantes ainsi que la duplication des lignes de code correspondant aux opérations en question.
     169L'utilisation d'un pointeur semble toute indiquée. Par exemple, pour **q_seri** étendue à ses isotopes, pour l'exemple donné plus haut, il faudrait pouvoir écrire:
     170{{{
     171q_seri => qx(:,:,[1,(k,k=10:21)])
     172}}}
     173Cette extension de la fonction **aliasTracer()** est hélas illicite en fortran: un pointeur ne peut être associé à des sections non contigües d'un tableau.
     174Abandonner le classement des traceurs dans **qx** par génération croissante pourrait résoudre le problème, mais rendrait l'organisation bien moins claire (resterait aussi à savoir comment ranger les traceurs de tagging).
     175Il semble préférable de se contenter de définir **q_seri** (et les autres variables analogues) sous la forme d'un objet de type dérivé muni d'une composante contenant le vecteur d'indices des traceurs de **qx** requis. Les opérations répétées sur la variable principale et ses variables isotopiques le sont par simple bouclage sur ce vecteur d'indices.
     176On définit donc le type dérivé suivant:
     177{{{
     178TYPE tr2
     179  REAL,   ALLOCATABLE :: v(:,:,:)
     180  INTEGER ALLOCATABLE :: iq(:)
     181END TYPE tr2
     182}}}
     183Dans le cas de **q_seri**:
     184{{{
     185TYPE(tr2) :: q_seri
     186q_seri = defVar('H2O-g')
     187}}}
     188La fonction **defVar** encapsule les opérations nécessaires:
     189{{{
     190TYPE(tr2) FUNCTION defVar(name) RESULT(out)
     191  CHARACTER(LEN=*), INTENT(IN) :: name
     192  INTEGER :: ix, n
     193  ix = idxTracer(name)
     194  out%iq = [ix, tracers(ix)%ichild(:)]
     195  out%v  = [ ( qx(:,:,out%iq(k)), k=1, SIZE(out(:), DIM=1) ) ]
     196END FUNCTION defVar
     197}}}
     198On peut envisager d'ajouter un second argument à defVar: la génération maximale (2 dans l'exemple ci-dessus).
     199La boucle typique pour une opération agissant sur une grandeur de génération 1 et ses dérivés isotopiques prend alors la forme (exemple pour **q_seri**):
     200{{{
     201  DO k=1,SIZE(t_seri%iq, DIM=1)
     202    Opérations sur  t_seri%v(:,:,t_seri%iq(k))
     203  END DO
     204}}}
     205Si l'objectif est d'agir directement sur des composantes de **qx**, sans création d'une variable spécifique **t_seri%v(:,:,:)**, il suffit de remplacer **t_seri%v(:,:,t_seri%iq(k))** par **qx(:,:,iq(k))**, où **iq(:)** est le vecteur d'undices non encapsulé dans un type dérivé.
     206
     207 * Ajout de caractéristiques des isotopes dans le fichier **tracer_*.def** directement, en tant que clefs supplémentaires, accessibles grâce à la routine **getKey()**.
     208Notamment, **tnat** et **alpha_ideal** me semblent ici plus à leur place qu'en dur dans le code.
     209L'exemple donné plus haut devient:
     210
     211{{{
     212&version=1.0
     213&default
     214# Note: currently, the 2 recognized types are "tracer" and "tag"
     215parent=air hadv=10 vadv=10 phases=g type=tracer
     216&lmdz
     217blue,red parent=H[2]HO,H2O type=tag             # Tagging tracer of gen 1&2 tracers
     218H2O      phases=g   hadv=14 vadv=14             # Water vapour
     219water    parent=H2O tnat=1.0        alpha=1.0   # [1]H[1]H[16]O ~ H2O total
     220H2[18]O  parent=H2O tnat=2.00052e-3 alpha=1.006 # [1]H[1]H[18]O
     221H[2]HO   parent=H2O tnat=1.5576e-4  alpha=1.01  # [1]H[2]H[16]O
     222H[3]HO   parent=H2O tnat=0.         alpha=1.0   # [1]H[3]H[16]O
     223yellow   parent=H[3]HO     type=tag             # Tagging tracer for single isotope
     224H2O      phases=ls                              # H2O in liquid and solid phases
     225}}}
     226
     227Deux remarques:
     228
     229 1) On perd l'avantage de la factorisation en fonction des parents à cause de ces paramètres ; on pourrait le garder avec cette convention:
     230{{{
     231water,H2[18]O,H[2]HO,H[3]HO  parent=H2O tnat=1.0,2.00052e-3,1.5576e-4,0. alpha=1.0,1.006,1.01,1.0
     232}}}
     233mais ça n'est pas très lisible. Tant que le nombre d'isotopes n'est pas excessif, l'inconvénient de cette perte me semble mineur.
     234
     235 2) Un fichier **tracer_*.def** ne contenant pas nécessairement tous les isotopes utilisables, et ne constitue pas une base de données complète pour des paramètres tels que **tnat** et **alpha_ideal**.
     236On peut pallier à ce défaut par exemple:
     237  - en créant une base de données séparée sous la forme de sections supplémentaires ; exemple:
     238{{{
     239&tnat
     240water,1.0   H2[17]O,4.E-5   H2[18]O,2.00052e-3   H[2]HO,1.5576e-4   H[3]HO,0.
     241&alpha
     242water,1.0   H2[17]O,1.003   H2[18]O,1.006        H[2]HO,1.01        H[3]HO,1.0
     243}}}
     244Ça me semble relativement peu lisible...
     245 - en ajoutant une clef "activate" pour indiquer lorsqu'un traceur/isotope est ou n'est pas activé:
     246{{{
     247&version=1.0
     248&default
     249type_trac=lmdz parent=air hadv=10 vadv=10 phases=g type=tracer activate=y
     250&lmdz
     251H2O      phases=g   hadv=14 vadv=14                         # vapour water
     252H2O      phases=l                                           # liquid water
     253water    parent=H2O tnat=1.0        alpha=1.0               # [1]H[1]H[16]O ~ H2O total
     254H2[17]O  parent=H2O tnat=4.E-5      alpha=1.003  activate=n # [1]H[1]H[17]O
     255H2[18]O  parent=H2O tnat=2.00052e-3 alpha=1.006             # [1]H[1]H[18]O
     256H[2]HO   parent=H2O tnat=1.5576e-4  alpha=1.01              # [1]H[2]H[16]O
     257H[3]HO   parent=H2O tnat=0.         alpha=1.0               # [1]H[3]H[16]O
     258}}}
     259Ça me semble un peu lourd, et on ne sait pas au premier coup d'œil ce qui est vraiment utilisé dans le modèle.
     260La solution initiale (pas de base de données complète dans tout fichier **tracer_*.def** concernant des paramètres supplémentaires du type **tnat** ou **alpha_ideal**) semble donc préférable.
     261À discuter.