Sommaire
I. Introduction
Dans un code informatique, quand des données numériques ont besoin d'être modifiées pour lancer plusieurs simulations, plutôt que d'écrire ces données en "dur" dans le code, de les modifier et de recompiler le code à chaque simulation, la méthode habituelle consiste à passer par un fichier de commande qui est lu par le code pendant l'exécution.
Cependant les données numériques écrites dans le fichier de commande doivent être écrites toujours dans le même ordre et, de plus, pour un nombre important de variables modifiables, il peut être parfois difficile de s'y retrouver.
Voici donc une méthode qui consiste à passer par un fichier de commande organisé sous forme de cartes qui peuvent être tout aussi bien modifiées que commentées.
II. Exemple de fichier de commande
Voici un exemple de fichier de commande que nous désirons mettre en place ; supposons que notre programme traite de données de population:
#HABITANTS
295012
#ENFANTS
1098
Nous aimerions pouvoir organiser les données dans l'ordre que l'on veut (mettre éventuellement le nombre d'enfants avant le nombre total d'habitants) et éventuellement ajouter des cartes pouvant être commentées à l'aide d'un caractère quelconque (dans l'exemple suivant seule la dernière carte HABITANTS non commentée par ! sera lue).
Par exemple:
#ENFANTS
1567
!#HABITANTS
124590
!#HABITANTS
290745
#HABITANTS
104968
III. Fonction permettant de chercher la carte voulue
Voici la fonction qui permet de lire les cartes et de sélectionner celle qui nous intéresse:
FUNCTION CHERCHER_CARTE(CARTE_CHERCHEE,INFO)
IMPLICIT NONE
CHARACTER*(*), INTENT(IN) :: CARTE_CHERCHEE
INTEGER, INTENT(OUT) :: INFO
!! LOCALES !!
CHARACTER*100 :: CARTE
REWIND(66)
DO
READ(66,210,ERR=200,END=200) CARTE
IF(CARTE(1:1).EQ.'#') THEN
CARTE = CARTE(2:100)
IF(TRIM(CARTE).EQ.TRIM(CARTE_CHERCHEE)) THEN
INFO=0
RETURN
END IF
END IF
END DO
200 CONTINUE
INFO=-1
210 FORMAT(A100)
RETURN
END FUNCTION CHERCHER_CARTE
IV. Fonction permettant de lire la carte voulue
La fonction précédente retourne
INFO=-1 si la carte n'est pas trouvée et
INFO=0 si la carte est trouvée.
Pour lire le nombre d'habitants, par exemple, il suffit de lancer la fonction suivante:
FUNCTION LIRE_NOMBRE_HABITANTS(NOMBRE_HABITANTS)
INTEGER, INTENT(OUT) :: NOMBRE_HABITANTS
!! LOCALES !!
CHARACTER*(*) :: CARTE
INTEGER :: INFO
CARTE='HABITANTS'
CALL CHERCHER_CARTE(CARTE,INFO)
IF(INFO.EQ.0) THEN
READ(66,*,ERR=123,END=123) NOMBRE_HABITANTS
ELSE
WRITE(*,*) 'La carte ', TRIM(CARTE), ' n''a pas été trouvée, vous devez'
WRITE(*,*) 'l''inclure dans le fichier de commandes.'
STOP
END IF
RETURN
123 CONTINUE
WRITE(*,*) 'Erreur pendant la lecture du nombre d''habitants dans la carte'
WRITE(*,*) TRIM(CARTE), ' du fichier de commandes.'
STOP
END FUNCTION LIRE_NOMBRE_HABITANTS
V. Source
Cette méthode est tirée des codes Fortran de Francis Collino, CERFACS.
Publié par
Sacabouffe -
Dernière mise à jour le 19 novembre 2009 à 14:01 par marlalapocket