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