Fichier de commande avec système de cartes en Fortran90

Décembre 2016


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.

A voir également :

Ce document intitulé «  Fichier de commande avec système de cartes en Fortran90  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.