User Tools

Site Tools


dfe11:fortran

Ce qu'il faut savoir en Fortran pour éditer le code

Le Fortran est largement utilisé pour la modélisation en DFG et plus généralement pour le calcul scientifique. De nombreux manuels existent sur le web, par exemple celui très simple de Stanford. Le Fortran est devenu un langage très évolué (orienté objet, interfacé avec le C, …) mais on se contente ici de la syntaxe de base de la norme Fortran 90.

Dans la pratique, pour modifier les quelques morceaux du code permettant de définir votre propre configuration, il suffira de s'inspirer des exemples et de quelques copier/coller.

Attention tout de même au type des variables en fortran : une variable commençant par i, j, l, m ou n est un entier (INTEGER), sinon c'est un réel (REAL). Les autres types doivent être déclarés explicitement. Pour être parfaitement rigoureux, on faudrait utiliser la directive IMPLICIT NONE qui impose de déclarer toutes les variables du code.

Attention aussi à la structure des lignes dans un fichier fortran : un ! sur la ligne permet d'introduire un commentaire: tout ce qui se trouve à droite du ! est ignoré par le compilateur. Le caractère & à la fin d'une ligne indique que l'instruction se poursuit à la ligne suivante.

Par souci de lisibilité, on utilise les majuscules pour les mots clefs du fortran et les minuscules pour les instructions de l'utilisateur et on indente les lignes dans les blocs

IF (condition) THEN
    instruction
ENDIF

ou les boucles

DO indice = debut,fin,pas
  instruction
ENDDO

Le code utilise le préprocesseur cpp du langage C. C'est une façon simple d'inclure des portions de code dans un fichier ou d'activer telle ou telle portion de code en fonction des clefs cpp choisies pour une simulation. Les instructions cpp sont des lignes commençant par #. Voir la ligne FFLAGS = … dans le fichier makefile, dans laquelle sont définies les clefs cpp actives. Si la clef n'est pas sur la ligne alors elle n'est pas active.

Dans l'exemple suivant, si la clef cpp windStress est active, alors la tension de vent zonale (selon l'axe des x) est une sinusoïde qui dépend de la latitude. Si la clef n'est pas active (! defined, le ! signifiant not), le vent est nul.

#if ! defined windStress
      taux(:,:) = 0.0
      tauy(:,:) = 0.0
#else
      aux = - 2. * pi / (gphif(1,jpjm1) - gphif(1,1))
      taux(:,:) = 0.0005 * sin(aux * (gphif(:,:) - gphif(:,1)))
      tauy(ji,jj) = 0.0
#endif
dfe11/fortran.txt · Last modified: 2020/05/04 09:36 (external edit)