Changes between Initial Version and Version 1 of Branches/Assimilation/Implementation


Ignore:
Timestamp:
2013-03-27T12:29:57+01:00 (11 years ago)
Author:
mmaipsl
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Branches/Assimilation/Implementation

    v1 v1  
     1 
     2== Utlisation d'ORCHIDEE pour l'assimilation == 
     3 
     4== 1. Contexte == 
     5 
     6Pour l'assimiltion des données avec le modèle ORCHIDEE (e.g., carbone, flux de surface,  etc..), le différentiateur automatique TAF est utilisé.  
     7TAF ne permettant pas la dérivation des sources de la version standard d'ORCHIDEE, un travail préalable important a été effectué. Ce travail permet de rendre le  
     8code ORCHIDEE compatible à TAF. En effet, pour TAF, un modèle (ici ORCHIDEE) doit lui être passé comme une fonction/subroutine ayant pour arguments d'entrée  
     9le nombre de paramètres pour lesquels on cherche à calculer les sensibilités (on appelera par la suite les paramètres à optimiser), le vecteur décrivant les valeurs de ces paramètres et en  
     10sortie la fonction coût calculée sur les variables auxquelles dépendent ces paramètres. Afin donc de rendre ORCHIDEE compatible pour TAF et aussi de minimiser  
     11ces développements lors de nouvelles mises à jour d'ORCHIDEE, nous avons:  
     12 -  crée de nouveaux drivers/modules qui permetlent de gérer les paramètres  
     13 -  mis au format les subroutines/fonctions d'ORCHIDEE standard pour TAF de façon automatique à partir d'un script shell.  
     14 
     15  
     16L'objectif de ce document est de lister dans un premier temps (point 2 ci-après) les actions qu'un utilisateur aura à effectuer pour mettre au format une version d'ORCHIDEE pour TAF, autrement dit pour  
     17la génération des codes dérivés (i.e., tangent linéaire et adjoint) pour l'assimilation. Ensuite, nous décrivons en détails les nouveaux drivers/modules  
     18développés ainsi que les différentes étapes pour la mise au format automatique du code ORCHIDEE standard respectivelment aux points 3 et 4.  
     19Enfin, nos questions et réflexions pour une amélioration de cette procédure de la mise en compatibilité du code ORCHIDEE pour TAF sont présentées au point 5. 
     20 
     21 
     22 
     23== 2. Actions pour la mise au format d'ORCHIDEE pour l'assimilation ==  
     24 
     25 
     26== ''2.1: Note importante''   == 
     27Pour la mise au format d'ORCHIDEE pour TAF, les modules d'initialisation/allocation dans les répertoires sechiba (i.e., sechiba_init_alloc.f90) et stomate (stomate_init_alloc.f90) d'ORCHIDEE sont automatiquement générés. 
     28La création automatique de ces deux modules permet de considérer aisément toutes mises à jour d'ORCHIDEE pour l'assimilation sans un travail supplémentaire important. Pour la création de ces modules d'initialisation/alloctaion,  
     29nous avons mis dans chaque module dans ces répertoires après la commande CONTAINS, la liste des subroutines/fonctions qui ont un lien avec les fichiers d'initislisation.  
     30La nomemclature adoptée est donnée ci-après pour le cas de la subroutine routing.f90 dans ORCHIDEE/src_sechiba: 
     31{{{ 
     32! List of subroutines for initialization : 
     33!- routing_init 
     34!- routing_clear 
     35!- routing_diagnostic_p 
     36!- routing_diagnostic 
     37!- routing_basins_p 
     38!- routing_basins 
     39!- routing_getgrid 
     40!- routing_sortcoord 
     41!- routing_findbasins 
     42!- routing_simplify 
     43!- routing_cutbasin 
     44!- routing_hierarchy 
     45!- routing_findrout 
     46!- routing_globalize 
     47!- routing_linkup 
     48!- routing_fetch 
     49!- routing_truncate 
     50!- routing_killbas 
     51!- routing_names 
     52!- routing_irrigmap 
     53}}} 
     54    
     55Il faut noter que désormais les tags/trunk d'ORCHIDEE comprennent déjà cette liste. Ainsi, s'il y a des ajouts de subroutines/fonctions dans de nouveaux modules d'ORCHIDEE qui ont un lien  
     56avec les modules d'initialisation/allocation, il faut les ajouter à liste existante ou créer cette liste dans les nouveaux modules concernés.  
     57 
     58 
     59 
     60== '' 2.2: Mise au format d'ORCHIDEE pour TAF et/ou exécution des codes obtenus '' ==  
     61 L'utilsateur doit exécuter les commandes décrites dans les 3 étapes suivantes pour avoir un code mis au format pour l'assimilation.  
     62 
     63    === Etape 1 : Chargement des routines d’ORCHIDEE/IOIPSL/TAF pertinents pour l’optimisation === 
     64 
     65       - lancer la commande model dans le répertoire util pour le code ORCHIDEE que vous souhaitez utiliser pour l'assimilation. On note $model-name cette configuration (Tapez model -h pour avoir la liste  
     66des modèles disponibles). Lancer donc: 
     67  
     68        {{{ 
     69        util> model -h $model-name 
     70        }}}    
     71       - Récupérer le tags d'IOIPSL que vous souhaitez    
     72       - Récupérer le tags/trunk d'ORCHIDEE que vous souhaitez          
     73       - Récupèrer éventuellement un tag/trunk d'ORCHIDEE_OL. Seul le fichier weather.f90 sera utilisé. 
     74           - Déplacer le fichier weather.f90 dans le répertoire ASSIMILATION (EK: A faire automatiquement par makeorchidee_fcm ???) 
     75       - Mettre le répertoire NETCDF contenant les fichiers NetCDF dont TAF a besoin dans le répertoire ASSIMILATION (EK: comment faire pour avoir ce répertoire pour tout le monde !!!!) 
     76  
     77 
     78 === Etape 2: Mise au format du tag/trunk d'ORCHIDEE pour TAF  === 
     79    Deux principales taches sont effectuées par un script shell '''makeorchidee_fcm''': 
     80        - la mise au format du tags/trunk d'ORCHIDEE pour TAF  
     81        - le regroupement de tous les codes (i.e., ORCHIDEE, IOPSL), les nouveaux drivers/modules crées pour TAF et la subroutine weather.f90 dans ORCHIDEE_OL dans le répertoire ASSIMILATION  
     82  
     83   Pour cela, il faut:  
     84     - Aller dans le répertoire ORCHIDEE et exécuter:  
     85      {{{ 
     86      ORCHIDEE> makeorchidee_fcm -[d]optim  
     87      }}}  
     88     avec [d] pour debug.[[BR]] 
     89      Le script makeorchidee_fcm qui est décrit plus en détails au point 4) :  
     90        - Crée un répertoire de travail temporaire modeles_optim_temp à partir du répertoire ASSIMILATION  
     91        - Met le répertoire ORCHIDEE dans modeles_optim_temp 
     92        - Crée les fichiers d'initialisation/allocation dans ORCHIDEE/src_sechiba et ORCHIDEE/src_stomate    
     93        - Met dans le répertoire ASSIMILATION toutes les sources de tous les répertoires d'ORCHIDEE dans modeles_optim_temp   
     94        - Met dans le répertoire ASSIMILATION toutes les sources du répertoire IOPSL  
     95 
     96 
     97=== Etape 3 : Application de TAF pour la dérivation des codes ===  
     98Toutes les sources des codes pour l'assimilation sont désormais dans le répertoire ASSIMILATION.  
     99Se placer dans le répertoire ASSIMILATION pour effectuer la différentiation souhaitée.On note tangent linéaire (TL), tangent linéaire vectoriel (VTL), et adjoint (AD). Assurez-vous que vous avez le droit d'exécuter le script staf de TAF pertinent pour la différentiation. 
     100Dans le cas échéant, contacter la personne en charge du code pour l'assimilation pour faire le nécessaire. 
     101Le Makefile dans le répertoire ASSIMILATION permet d'effectuer ces actions ci-dessous (pour détails, l'éditer): 
     102    - Si vous souhaitez avoir juste les codes dérivés par TAF pour: 
     103         - le tangent linéaire TL dont les sources portent l'extension _tl.f90, lancer:    
     104           {{{ 
     105           gmake ctl 
     106           }}} 
     107         - le tangent vectoriel VTL dont les sources portent l'extension _vtl.f90, lancer: 
     108           {{{ 
     109           gmake cvtl 
     110           }}} 
     111         - l'adjoint AD dont les sources portent l'extension _ad.f90, lancer : 
     112           {{{ 
     113           gmake cadj  (n'existe pas encore!!!) 
     114           }}} 
     115           Les codes dérivés sont mis dans le répertoire spécifique relatif à la différentiation que vous souhaitez faire: 
     116            - TANGEANT pour les codes TL avec extension _tl.f90  
     117            - TANGEANT_VTL pour les cdoes VTL avec extension _vtl.f90  
     118            - ADJOINT pour les codes AD avec extension _ad.f90  
     119         
     120 
     121   - Si voulez compiler les codes d'ORCHIDEE mis au format TAF en mode direct (i.e., l'exécutable doit donner les mêmes résultats que le code ORCHIDEE standard), lancer: 
     122    {{{ 
     123    gmake  
     124    }}} 
     125     L'exécutable s'appelle orchidee_tl et se trouve dans le répertoire bin  
     126 
     127 
     128   - Si vous souhaitez générer à la fois les codes dérivés par TAF et/ou les compiler pour: 
     129         - le tangeant linéaire TL (exécutable orchidee_tl mis dans le répertoire bin et les codes dérivés sont (ou seront mis) dans TANGEANT)), lancer:  
     130          {{{ 
     131          gmake tl  
     132          }}}   
     133         - le tangent vectoriel VTL (exécutable orchidee_vtl dans le répertoire bin et les codes dérivés sont (ou seront mis dans TANGEANT_VTL)), lancer:  
     134         {{{ 
     135         gmake vtl 
     136         }}} 
     137         - l'adjoint AD (exécutable orchidee_adj !!! dans le répertoire bin), lancer:  
     138         {{{ 
     139         gmake adj  ( n'existe pas encore !!!) 
     140         }}} 
     141 
     142        Pour plus détails, voir le Makefile dans le répertoire ASSIMILATION 
     143 
     144  
     145 
     146== 3. Description des nouveaux drivers/modules pertinents pour la dérivation du code d'ORICHIDEE par TAF et son exécution == 
     147 
     148Le logiciel TAF n’est pas capable de générer les codes dérivés d’ORCHIDEE sans une mise au format du code ORCHIDEE au préalable. Comme mentionné au poin 1., il faut passer 
     149à TAF une subroutine/fonction appelée e.g., model(n,x,f) avec n et x les arguments d'entrée et f étant l'argurment de sortie. On note:  
     150n, le nombre de paramètres pour lesquels on veut calculer les sensibilités,  x, le vecteur décrivant les valeurs des paramètres  et f, la fonction coût construite sur les variables  
     151du modèle auxquelles dépendent ces paramètres.  
     152  
     153Pour ORCHIDEE, nous avons développé le modèle model(n,x,f) à passer à TAF en se basant sur le programme principal d'ORCHIDEE dim2_driver.f90 et qui s'appelle:  
     154{{{ 
     155model.f90  (EK: A changer de nom ou OK??? ) 
     156}}} 
     157  La subroutine model.f90 permet d'effectuer grosso modo les opérations suivantes: 
     158    - Allocation et/ou initialisation de la plupart des variables SAVE d'ORCHIDEE à partir du module:      
     159    {{{ 
     160    init_model.f90 ( A voir si on modifie ce nom !!) 
     161    }}} 
     162    - Simulation d'ORCHIDEE en bouclant sur le temps par appel à:   
     163    {{{ 
     164    intersurf_main_2D du module intersurf.f90  
     165    }}} 
     166   - Calcul de la fonction coût à la fin de la boucle de temps à partir du module:  
     167    {{{ 
     168    mo_cost.f90 
     169    }}} 
     170 
     171La subroutine model.f90 que l'on doit passer à TAF doit avoir au moins en entrée n le nombre de paramètres à optimiser et leurs valeurs  
     172mises dans un vecteur x. Le code ORCHIDEE dans sa forme standard n'est pas conçue de cette façon. En effet, les paramètres sont utilisés en dur dans  
     173les différéntes subroutines/fonctions du modèle. Nous avons donc crée de nouveaux modules qui permettent d'avoir des informations sur les paramètres nécessaires  
     174à fournir à model.f90. Ces modules qui sont décrits ci-après et qui sont mis dans le répertoire ASSIMILATION, permettent: 
     175 - d'avoir des informations sur le dimensionnement de la simulation du modèle ORCHIDEE, i.e., dimensions temporelle et spatiale 
     176 - d'avoir des informations sur le nombre de paramètres d'ORCHIDEE à optimiser   
     177 - de mettre les valeurs des paramètres d'ORCHIDEE avec leurs noms spécifiques dans un vecteur  
     178 - de remettre les valeurs des paramètres mis dans le vecteur aux noms des paramètres tels que décrits dans ORCHIDEE  
     179 
     180Les modules relatifs à ces opérations ci-dessus sont décrites aux points a-c. D'autres modules qui sont plus spécifiques soit pour TAF ou pour  
     181la compilation du code mis au format TAF sont détaillés au point d. Il faut également noter que certains de ces modules ont été développés par François Delage et Cedric Bacour (i.e., *_optim.f90) 
     182 
     183 
     184 
     185a) Informations sur le dimensionnement de la simulation d'ORCHIDEE 
     186 
     187Nous avons créé un nouveau module basé sur le module readdim2.f90 d'ORCHIDEE standard. Ce nouveau module s'appelle: 
     188{{{ 
     189mo_process.f90   (nom sans doute à changer !!!) 
     190}}} 
     191 
     192 
     193b) Informations sur les paramètres d'ORCHIDEE à optimiser 
     194 
     195Les modules suivants ont été développés pour: 
     196  - l'initialisation des constantes et des paramètres pour l'optimisation 
     197  {{{ 
     198  constantes_optim.f90 
     199  parameters_optim.f90  
     200  }}} 
     201  - l'interfaçage des paramètres à optimiser avec le code d'ORCHIDEE    
     202  {{{ 
     203   interface_optim.f90    
     204  }}} 
     205 
     206c) Information sur le nombre de paramètres et la mise en vecteur des paramètres pour TAF/ORCHIDEE (vice/versa) 
     207 
     208Pour l'accès au nombre de paramètres, la mise en vecteur de leurs valeurs, nous avons développé le module suivant:  
     209{{{ 
     210paramtransfo.f90 
     211}}} 
     212Ce module permet également de remettre les valeurs des paramètres du vecteur aux noms des paramètres dans ORCHIDEE. 
     213 
     214 
     215d) Autres modules pour l'exécution d'ORCHIDEE mis au format pour TAF [[BR]] 
     216Pour la construction des exécutables du code ORCHIDEE mis au format pour TAF en mode direct et/ou des codes dérivés (i.e., TL, VTL, AD),  
     217nous avons développé de nouveaux modules:  
     218 
     219 - Appel des subroutines/fonctions pour les initialisations des paramètres (nombre et vecteur) par   
     220{{{ 
     221initparam.f90 
     222}}} 
     223 
     224 
     225 - Compilation des différents codes: 
     226    - Code direct, i.e., ORCHIDEE standard mis au format pour TAF:  
     227    {{{ 
     228     direct.f90 
     229    }}} 
     230    - Code tangeant linéaire (TL): 
     231    {{{ 
     232      tangeant.f90 
     233    }}} 
     234    - Code tangent linéaire vectoriel (VTL): 
     235    {{{ 
     236    tangeant_vtl.f90 
     237    }}}  
     238    - Code adjoint  
     239    {{{ 
     240    adjoint.f90  (N'existe pas encore !!!=) 
     241    }}} 
     242  
     243 
     244== 4. Description de la mise en format automatique du code ORCHIDEE pour l'assimilation par le script makeorchidee_fcm  == 
     245  
     246Dans le but de profiter des développements futurs d’ORCHIDEE pour l’assimilation des données, nous avons développé des outils de transformation (scripts shell)  
     247pour la mise au format automatique du code d’ORCHIDEE pour TAF. La démarche pour cette mise au format se fait en trois étapes suivantes et ces différentes  
     248étapes sont effectuées en une seule fois par l'utilisateur par le ancement du sccript makeorchidee_fcm dans le répertoire ORCHIDEE (voir point 2.2):  
     249{{{ 
     250ORCHIDEE> makeorchidee_fcm -[d]optim  
     251}}} 
     252Toutes les opérations effecutées par ce script sont détaillées en trois étapes: 
     253 
     254=== Etape 1 : Chargement des routines d’ORCHIDEE/IOIPSL/TAF pertinents pour l’optimisation que l'on veut réaliser  === 
     255  - Crée un répertoire de travail temporaire modeles_optim_temp à partir du répertoire ASSIMILATION 
     256  - Met le répertoire d’ORCHIDEE dans le répertoire modeles_optim_temp  
     257 
     258 
     259=== Etape 2 : Préparation des routines d’ORCHIDEE pour la mise au format pour TAF  === 
     260 
     261makeorchidee_fcm se place dans modeles_optim_temp: 
     262 - configure le Makefile pour enlever les pré-compilations PARALLEL et ASSIMIL (EK: Pas clair si c'est fait ici !!) 
     263 - Crée les modules d’allocation/initialisation dans les répertoires où existe un fichier init_alloc. Ce nouveau fichier s’appelle ${rep}_init_alloc.f90 (par exemple sechiba_init_alloc.f90) et la procédure pour sa création est décrite dans l'étape suivante 3 :  
     264  
     265 
     266===  Etape 3 : Création des routines pour TAF ===  
     267 
     268Boucler sur le/les fichiers sources de chaque répertoire deux fois avec deux scripts awk  
     269 - script 1 : ASSIMILATION/TOOLS/variables.awk  
     270    - Avant IMPLICIT NONE :  
     271      - Garder les USE dans le fichier $rep_init_alloc  ( => à voir ... ) 
     272    - Entre IMPLICIT NONE et CONTAINS : 
     273      - Garder les INTERFACE. Gestion particulière ? En effet, TAF n’arrive pas à les gérer proprement sans l’utilisation de directives. En particulier, la gestion des INTERFACE des codes IOIPSL se fait via le fichier taf_directives.f90 qui est inclus dans model.f90 et dans le Makefile dans ASSIMILATION 
     274      - Couper les variables globales SAVE. Mettre ces variables dans le fichier $rep_init_alloc.Il faut noter que pour l’assimilation, toutes ces variables sont désormais PUBLIC.      
     275    - Couper les variables SAVE locales (dans les subroutines/fonctions) dans les fichiers $rep_init_alloc du répertoire traité. 
     276    - Mettre ces variables dans le fichier $rep_init_alloc. Aussi, toutes ces variables sont désormais PUBLIC. 
     277     Attention à se conformer à la règle de programmation pour éviter la redondance !!!. (EK: Pour cela, on pourrait remplacer les variables locales "var" par $nommodule_nomfonction_var). En effet, on met des variables "var" locales à une fonction "nomfonction" depuis un module "nommodule" en SAVE global dans $rep_init_alloc. Le risque ici c'est d'avoir des noms $nommodule_nomfonction_var trop longs !!! 
     278    - Ajouter CONTAINS à la suite dans le fichier $rep_init_alloc        
     279 
     280 - script 2 : ASSIMILATION/TOOLS/subroutines.awk 
     281   - Lire la phrase " List of subroutines for initialization :" » et construire un tableau init_functions qui lit chaque ligne commençant par "!-". Voir un exemple de cette liste pour routing.f90 au point 2.1. 
     282   - Couper les fonctions init dans init_alloc pour inclusion dans $rep_init_alloc 
     283   - Gérer/simplifier les appels du module d'optimisation depuis intersurf.f90 (A discuter ???) 
     284   - Retravailler les parties driver/readdim2.f90 pour rendre plus rapide cette partie pour l'initialisation (EK ???)  
     285   - Copier toutes les  sources de modeles_optim_temp dans le répertoire ASSIMILATION  
     286   - Supprimer modeles_optim_temp   
     287 
     288 
     289 == 5. Questions et Réflexions ==  
     290   - Il faudra dans les tags/trunk ORCHIDEE : construire et maintenir de la liste des subroutines/fonctions d’initialisation par module (pas d'autres implications des développeurs "standard"  
     291     pour conserver les optimisations dans les futures développements)  
     292  
     293    
     294   - Gestion des « includes » des directives TAF: Il faut noter que cela se fait dans model.f90 et dans le Makefile du répertoire ASSIMILATION. Néanmoins, les directives TAF doivent être spécifiques à chaque version d'ORCHIDEE pour l’optimisation et aussi à la version de IOIPSL. Ce n'est pas simple de gérer automatiquement ces directives TAF parce qu'on n'a pas trouvé de façon claire les raisons pour lesquelles certaines variables SAVE ou fonctions/subroutines ne sont pas analysées par TAF. Pour l'instant, nous gérons ces directives à la main dans le fichier taf_directives.f90 et ceci en fonction des problèmes rencontrés lors de l'exécution des codes dérivés générés par TAF. On pourrait faire une gestion automatique en appliquant des directives à toutes les fonctions/subroutines dans le fichier taf_directives.f90 !!! A titre d'exemple, voici ci-après les directives pour le cas simple de la subroutine ymds2ju du module calendar.f90 de la librairie IOIPSL. Il faut noter que sans ces directives, TAF ne considère pas l'appel de la subroutine ymds2ju dans le code dérivé e.g., model_tl.f90. On note les numéros des arguments d'entrée de la subroutine dans la commande INPUT et dans OUTPUT ceux des arguments de sortie. Enfin, la commande REQUIRED permet de dire à TAF de considérer cette subroutine lors de la génération des codes dérivés. Après une analyse approfondie de ce cas, nous n'avons pas compris les raisons pour lesquelles TAF ne considère pas cette subroutine dans le code dérivé model_tl.f90. Pour plus de détails sur les directives TAF, il faut consulter la documentation d'utilisation du logiciel qui est fourni.  
     295{{{ 
     296!$TAF SUBROUTINE calendar::ymds2ju INPUT  = 1,2,3,4 
     297!$TAF SUBROUTINE calendar::ymds2ju OUTPUT = 5 
     298!$TAF SUBROUTINE calendar::ymds2ju REQUIRED 
     299}}}   
     300 
     301   - Gestion de l’interdépendance des USE: On considère actuellement tous les USE dans chaque modules/subroutines/fonctions. Dans la configuration actuelle, il y peut avoir une redondance des USE. En effet, un module appelant déjà un USE est appelé en USE avec les appels des USE qui sont dans ce module. A titre d'exemple, le module iopsl appelle en USE certains modules et souvent le module ioipsl est appelé en USE avec certains des modules de iopsl. Difficile à gérer automatiquement, mais cela peut être géré lors de la programmation !! 
     302               
     303   - Gestion des INTERFACE: TAF n'arrive pas à les gérer donc on les gère à la main dans le fichier taf_directives.f90 ou on considère directement dans le code ORCHIDEE la subroutine/fonction qui est effectivement utilisée pour l'assimilation. A titre d'exemple, on a remplacé l'INTERFACE suivante: 
     304    {{{ 
     305    INTERFACE intersurf_main 
     306    MODULE PROCEDURE intersurf_main_2d, intersurf_main_1d, intersurf_gathered, intersurf_gathered_2m 
     307    END INTERFACE 
     308    }}} 
     309     par l'expression suivante ou la subroutine intersurf_main_2d qui est principalement utilisée dans model.f90 lors de l'assimilation est rendue PUBLIC: 
     310    {{{ 
     311   PUBLIC :: intersurf_main_2d, stom_define_history, intsurf_time, intsurf_restart,l_first_intersurf 
     312    }}} 
     313        
     314  
     315   - les sources NetCDF: TAF a besoin de certaines sources NEtCDF. On met ces sources dans le répertoire ASSIMILTION/NETCDF tel que décrit au point 2.2. Pour leurs utilisations par TAF, voir le Makefile dans le répertoire ASSIMILATION. Voici la liste de ces sources: 
     316    {{{ 
     317    netcdf_attributes.f90 
     318    netcdf_dims.f90 
     319    netcdf_expanded_modif.f90 
     320    netcdf.f90 
     321    netcdf_overloads.f90 
     322    netcdf_text_variables_modif.f90 
     323    netcdf_visibility.f90 
     324    netcdf_constants.f90 
     325    netcdf_expanded.f90 
     326    netcdf_externals.f90 
     327    netcdf_file.f90 
     328    netcdf_text_variables.f90 
     329    netcdf_variables.f90 
     330    typeSizes.f90 
     331    }}}   
     332   Comment gérer ces sources NetCDF? Les commettre ?? 
     333 
     334   - Gestion de  la liste des modules. La faire dans le AA_make du répertoire ASSIMILATION ? 
     335   - Conformité aux règles de programmation ??? 
     336   - Unicité des variables dans les différents modules ??? 
     337 
     338 
     339 
     340== 6. Autres ==  
     341Afin de pouvoir appeler model.f90 plusieurs fois dans une boucle FORTRAN et ceci dans la perspective d'une optimisation dans un environnement FORTRAN, des adapations on été faites dans les sources de IOIPSL. Ces adapations qui sont déjà dans le tags/trunk d'IOIPSL ont été principalement effectuées dans: 
     342les modules suivants: 
     343{{{ 
     344histcom.f90    
     345flincom.f90 
     346}}} 
     347 
     348Cela a permis de fermer les fichiers et de reinitialiser les variables liées à ces fichiers à la fin d'un appel de la subroutine model.f90. Ceci est obtenu par appel des subroutines histclo et flinclo à la fin de model.f90. Il faut noter que histclo et flinclo sont dans les modules histcom.f90 et flincom.f90, respectivement.  
     349Commentaires EK; Martial, n'hésite pas à y ajouter d'autres adaptations effectuées.  
     350 
     351[[BR]] 
     352[[BR]] 
     353 
     354