| 106 | |
| 107 | |
| 108 | |
| 109 | |
| 110 | === 16/12/2019: MISE À JOUR === |
| 111 | === Les deux points à ajouter l'ont été:=== |
| 112 | * Possibilté 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 en valorisant la clef booléenne tracs_merge à FALSE plutôt qu'à TRUE. Cette clef est un paramètre "en dur" de readTracFiles_Mod.f90 pour l'instant. À reporter sans les fichiers de configuration *.def éventuellement. |
| 113 | * Gestion de base de données OK: |
| 114 | - En l'état, par mesure de simplicité (discuté avec Laurent Fairhead), on ne lit qu'une section de type "traceur" par fichier (on pourra en lire plusieurs si nécessaire), du nom de la clef "type_trac". Exemple: type_trac=lmdz,inca: on lit les sections "&lmdz" et "&inca" respectivement dans "tracer_lmdz.def" et "tracer_inca.def", puis on les fusionne. |
| 115 | - L'ancienne gestion de traceurs n'existe plus que pour INCA (un seul fichier nommé "traceur.def"). |
| 116 | - Chaque fichier est lu sous la forme d'une composante de type dérivé "db" (pour database) stockée dans dBase (la base de données privée): |
| 117 | {{{ |
| 118 | TYPE db !--- Type for tracers sections |
| 119 | CHARACTER(LEN=128) :: name |
| 120 | TYPE(tr), ALLOCATABLE :: trac(:) |
| 121 | END TYPE db |
| 122 | TYPE(db), ALLOCATABLE, TARGET, SAVE :: dBase(:) !--- Private sections database |
| 123 | }}} |
| 124 | La section "default" est stockée comme un "traceur virtuel" du même nom. |
| 125 | Les autres traceurs sont stockés à la suite, décompactés (phases, parents, enfants) et vérifiés. |
| 126 | On procède ensuite à la fusion ou au cumul en fonction de la valeur de "tracs_merge". |
| 127 | /!\ La fusion n'est pas effectuée sur les sections "default": chaque section ne sert qu'à déterminer les valeurs par défaut de la liste de traceurs du même fichier tracer_*.def. |
| 128 | Le résultat finale est stocké dans la variable publique "tracers": |
| 129 | {{{ |
| 130 | TYPE(tr), ALLOCATABLE, TARGET, SAVE :: tracers(:) !--- Public tracers list |
| 131 | }}} |
| 132 | Chaque composante est de type "tr": |
| 133 | {{{ |
| 134 | TYPE tr |
| 135 | CHARACTER(LEN=128) :: name = '' !--- Name |
| 136 | CHARACTER(LEN=128) :: prnt = '' !--- Parent name |
| 137 | CHARACTER(LEN=128) :: lnam = '' !--- Long name (with adv. scheme) |
| 138 | CHARACTER(LEN=16) :: type = 'tracer' !--- Type (so far: 'tracer'/'tag') |
| 139 | CHARACTER(LEN=16) :: phas = 'g' !--- Phase ('g'as/'l'iquid/'s'olid) |
| 140 | INTEGER :: hadv = 10 !--- Horizontal advection scheme used |
| 141 | INTEGER :: vadv = 10 !--- Vertical advection scheme used |
| 142 | INTEGER :: iadv = 10 !--- Advection scheme used |
| 143 | INTEGER :: igen = 1 !--- Generation number (<=1) |
| 144 | INTEGER :: iparnt = 0 !--- Parent index |
| 145 | INTEGER, ALLOCATABLE :: ichild(:) !--- Childs index |
| 146 | CHARACTER(LEN=128), ALLOCATABLE :: key(:) !--- Keys string list |
| 147 | CHARACTER(LEN=128), ALLOCATABLE :: val(:) !--- Corresponding values string list |
| 148 | END TYPE tr |
| 149 | }}} |
| 150 | Après fusion ou cumul, la base dBase n'est plus utile ; elle n'est donc pas accessible en externe. |
| 151 | Par contre, tracers(:) l'est. On peut l'interroger via quelques outils visibles dans readTracFiles. |
| 152 | Le principal est la commande getKey(tra, keyn, val, def_val, t), qui permet de récupérer la valeur d'une clef associée à un traceur: |
| 153 | - "tra" indique le traceur, soit son indice dans la liste "tracers(:)", soit son nom. |
| 154 | - "keyn" indique le nom de la clef voulue. |
| 155 | - "val" est le résultat (chaîne, entier ou réel ; routine générique). |
| 156 | - on peut indiquer dans def_val une valeur par défaut, au cas oùm rien ne soit trouvé (donc aucune valeur spécifiéer dans le fichier *.def, ni aucune valeur dans la section "default" pour cette clef). |
| 157 | - par défaut, on va chercher l'information dans "traceurs", mais "t" permet d'aller la chercher dans un autre vecteur de type "tr" (surtout utile en interne quand on manipule dBase). |
| 158 | On peut aussi créer un alias (pointeur) vers un traceur particulier (aliasTracer) ou obtenir les indices d'un ou plusieurs traceurs (idxTracer). |
| 159 | - À noter que le module "strings_mod.f90" contient des outils couramment utiles pour les chaînes et les affichages, en particulier un équivalent de "find" dans matlab (indices d'un ou plusieurs éléments dans un vecteur), ou une routine d'affichage "propre" de tableaux (chaînes, entiers ou réels). |
| 160 | |
| 161 | '''SUITE PROBABLE''': |
| 162 | * 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. |
| 163 | * 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). |