Académique Documents
Professionnel Documents
Culture Documents
Fa Q Fortran
Fa Q Fortran
Bienvenue sur la FAQ fortran, elle essayera de donner une réponse aux questions de
base du FORTRAN. Je tiens à souligner que cette FAQ ne garantit en aucun cas que les
informations qu'elle propose sont exactes ; les auteurs font le maximum, mais l'erreur
est humaine. Cette FAQ ne prétend pas non plus être complète, des cours et une listes
de livres sont donnés dans la FAQ et sur développez.com .
Ont contribué à cette FAQ :
-3-
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
-4-
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Fortran 77
• g77 : disponnible dans toutes les distribution linux et dans cygwin.
Fortran 90/95...2003
•
gfortran : disponnible dans les distributions linux ou ici
•
g95 : disponnible ici
•
ifort : Le compilateur de intel. Il est disponnible gratuitement pour un usage non commercial.
•
ftn95 : Le compilateur de Silverfrost.
•
absoft : lien.
•
lahey : lien.
•
xlf90 : Le compilateur pour les machines IBM : lien.
•
pgf : Le compilateur Portland pour Fortran.
•
pathf : Le compilateur Pathscale pour fortran.
-5-
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Le format fixe
123456
PROGRAM bonjour
c une ligne de commentaire commence par un c
c les instructions
write(*,*)"bonjour"
c fin du programme
END PROGRAM bonjour
Depuis Fortran 90 le format libre est disponnible qui est plus souple. Cependant beaucoup de programme sont encore
écrit en format fixe ou dans un mélange des deux. Voici les principales caractéristiques du format libre :
La structure générale du code est ensuite assez classique. Voici le fameux programme bonjour écrit en format libre :
Le format libre
PROGRAM bonjour
! une ligne de commentaire commence par un !
! les instructions
write(*,*)"bonjour"
! fin du programme
-6-
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Le format libre
END PROGRAM bonjour
Pour arrêter un programme avant la fin du code, on utilise l'instruction stop. Celle-ci stoppera l'éxécution. Il est possible
de faire suivre l'instruction stop d'un message qui s'affichera lors de l'arrêt du programme. Cela peut être utile pour
débeuguer un programme, par exemple :
L'instruction pause, permet de faire une pause dans l'exécution du programme sans pour autant l'arréter complètement.
En format fixe
PROGRAM ligne
write(*,*)"blablablablablabla",
* "et reblablabla"
-7-
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
En format fixe
!23456
A partir du fortran90, qui utilise le format libre, il suffit de placer un & à la fin de la ligne pour indiquer qu'elle continue
à la ligne suivante. Voici un exemple :
PROGRAM ligne
write(*,*)"blablablablablabla", &
"et reblablabla"
-8-
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
! variables incorectes
2var ! les variables doivent commencer par une lettres
var-top ! pas de tiret
var*top ! pas d'étoile
var+top ! pas de plus
état ! pas de lettre accentuée
12345678910abcdefghijklmnopqrstuvwxyz_ ! trop de caractères
ATTENTION : Fortran ne prend pas en compte la casse des caractères. Ainsi Vect VECT et vect sont les mêmes
variables.
Chacun de ces types de variables peut être un scalaire (un seul nombre), ou une liste de nombres. On parle alors de
variables indicées. Celles-ci peuvent avoir un seul indice (liste, vecteurs ...) ou plusieurs indices (matrices, tenseur ect ...).
-9-
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Contrairement aux réels simples précisions, les réels doubles précisions sont stockés sur 8 octets, soit 64 bits. De cette
manière la gamme des nombres pouvant être enregistrés dans un réel double précision est plus étandue que celle pouvant
être enregistre dans un réel simple précision. Elle s'étend environ de 10-308 à 10+308 et donne des chiffres avec une
précision d'environ 10-15 soit 15 chiffres significatifs.
- 10 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
! le nombre pi
double precision,parameter::pi=acos(-1.d0)
! remarque : l'utilisation d'une fonction ici n'est pas acceptée par tous les compilateurs
- 11 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
write(*,*)n,r,d
Pour calculer ces valeurs il faut savoir comment sont enregistrés les nombres dans la mémoire de l'ordinateur. Les
nombres entier sont généralement enregistrés sur 32 bits. Les nombres sont enregistrés en base 2 et chaque bit peut
prendre la valeur 1 ou 0. Le premier bit est un bit de signe donc on utilise 31 bits pour enregistrer la valeur absolue du
nombre. Le dernier bit correspond à 20, l'avant dernier à 21 ect ... L'entier le plus grand que l'on peut enregistrer en
base 2 correspond au nombre pour lequel on a placé un 1 dans les 31 bits réservés.
Les nombres réels sont enregistrés sous forme scientifques 1.2345 E +123, en base 2. Les réels simples précisions sont
enregistrés sur 32 bits et les réels doubles précisions sur 64 bits. Comme pour les entiers le dernier bit est pour le signe.
Puis, suivant que l'on est en double ou simple précision, on a 52bits ou 23 bits pour enregistrer la mantisse qui est la
partie devant l'exposant et 11bits ou 8bits pour enregistrer l'exposant. Dans l'exposant il y a également un bit pour le
signe de l'exposant ce qui ramène le nombre à 10bits pour les réels doubles précisions et 7bits pour les simples précisions.
- 12 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Avec 10bits l'exposant maximum pour un double précision est de 1023. Comme le nombre est stocké en base 2, la
mantisse est multipliée au maximum par 21023 (et pas 101023). La gamme de nombres pouvant être enregistrée en réel
double précision est donc entre 10-308 et 10+308.
Avec 7bits l'exposant maximum pour un simple précision est de 127. La gamme de nombres pouvant être enregistrée
en réel simple précision est donc entre 10-38 et 10+38.
L'instruction suivante définit que toutes les variables qui commencent par une lettre entre i et n inclu soient de type
integer et que les autres soient de type real (on remarquera que i et n sont les deux premières lettres de integer). On peut
définir un type implicite pour les double précision en remplaçant real par double precision dans l'instruction suivante.
La commande implicit none est une nouveauté du FORTRAN90 et divise la communauté des utilisateurs de FORTRAN.
Certains considèrent que la déclaration implicite des variables simplifie et limite grandement la déclaration des
variables. D'autres trouvent que la déclaration implicite est dangereuse et rend plus difficle la lecture d'un programme.
Nous ne trancherons pas sur cette question ici, à chacun de faire son choix.
- 13 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
- 14 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Si on a une seule condition et une seule instruction, on peut également utiliser le If logique dont la syntaxe est :
Syntaxe du If logique
If ( condition ) instruction à réaliser si condition est vrai
Il est dangereux d'écrire une condition d'égalité entre des réels. En effet, les nombres réels sont soumis à un arrondi du à
leur enregistrement sur un nombre limité de bits. Il s'en suit que la manipulation des réels peut conduire à l'introduction
d'erreur numérique. Celle-ci sont généralement suffisament faible pour ne pas perturber les résultats mais aboutissent
au fait que 2 réels ne sont, en pratique, jamais égaux car ils n'ont pas été arrondis de la même manière.
! on affecte 1 à la variable i
i = 1
- 15 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Opérateur Effet
condition1 .AND. condition2 condition1 ET condition2
condition1 .OR. condition2 condition1 OU condition2
.NOT. condition1 L'inverse de condition1
Do i=debut,fin,pas
! instructions
Enddo
- 16 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Do i=1,20,1
som = som + 1
Enddo
write(*,*)"somme :",som
Les éléments définissant le debut, la fin et le pas de la boucle peuvent être des expressions arithmétiques entières.
Il est possible de ne pas définir de compteur et de faire une boucle infinie. Il faut alors ajouter une instruction de sortie
à l'intérieur de la boucle en utilisant la commande exit
Do i=1,10,1
! instructions
If( condition ) exit ! si condition est vrai on sort de la boucle
Enddo
Exemple
Do i=1,10,1
If( condition ) cycle ! si condition est vrai on passe à l'itération suivante
! instructions
Enddo
- 17 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
- 18 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
On spécifie où est ce qu'on doit écrire en donnant le numéro logique de la sortie à utiliser. Par exemple, 6 désigne l'écran.
On spécifie comment est ce qu'on doit écrire en donnant le format faire un lien vers format.
Les étoiles désignes les valeurs par défaut. La sortie standard de la commande write est l'écran, Le format étoile est
un format standard qui dépend des compilateurs. En général, les numéros logiques de 1 à 10 sont réservés et désignent
divers périfériques de l'ordinateur (par exemple 6 est l'écran). Les nombres suivants peuvent être attribué à des fichiers
ou d'autres périfériques.
Si l'on souhaite écrire plusieurs variables ou chaînes de caractères, on les sépare par une virgule.
a = 2.0
b = 4.0
c = 6.0
On spécifie où est ce qu'on doit lire en donnant le numéro logique de l'entrée à utiliser. Par exemple, 5 désigne le clavier.
On spécifie comment est ce qu'on doit lire en donnant le format dans lequel est écrit ce que l'on souhaite lire. faire
un lien vers format.
- 19 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
La structure précédente contenant un write-read-write est vivement recommandée car elle permet de vérifier ce que
l'on a lu.
Pour lire plusieurs variables en même temps, on les sépare par une virgule. Dans l'exemple suivant, l'utilisateur devra
saisir son nom puis tapper "Entrée", puis saisir son prénom et tapper "Entrée".
write(*,*)"coucou"
read(5,*)entier
read(*,*)entier
On peut utiliser l'option err dans l'instruction read pour renvoyé l'exécution du programme à une certaine ligne du
code repérée par une étiquette s'il y a une erreur de lecture. Dans ce cas il est nécessaire d'utiliser le format fixe.
- 20 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
write(*,*)"entrer un entier"
read(*,"(i5)",err=100)entier ! lecture avec un format i5
write(*,"(i5)")entier ! écriture avec un format i5
Avec iostat
On peut utiliser l'option iostat dans l'instruction read qui permet d'enregistrer dans un entier un nombre qui permet
d'indentifier s'il y a une erreur et de quel type. La valeur de l'entier dépend du compilateur mais son signe est normalisé.
Si l'entier est nul, il n'y a pas d'erreur. Dans le cas de la lecture d'un fichier, une valeur négative signifie que l'on a
atteint la fin du fichier. Une valeur positive signifie toujours une erreur.
write(*,*)"entrer un entier"
read(*,"(i5)",iostat=io)entier ! lecture avec un format i5
If( io /= 0 ) Then
write(*,"(i5)")entier ! écriture avec un format i5
Else
STOP "erreur de lecture"
Endif
Opérateurs mathématiques
PROGRAM calcul
implicit none
integer::i,j,som,sous,prod,div,pui
i = 2
j = 3
! addition de i et j
som = i + j
! soustraction de i et j
sous = i - j
- 21 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Opérateurs mathématiques
! multiplication de i et j
prod = i * j
! division de i et j
div = i / j
! i puissance j
pui = i ** j
- 22 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
En FORTRAN, on peut créer soit des fichiers formatés (ASCII) soit des fichiers binaires et lire ou écrire sur ces deux
types de fichiers. Pour cela on spécifie lors de l'ouverture du fichier de quel type il est avec l'option form.
Par défaut, si l'on ne précise pas l'option form dans l'instruction open les fichiers sont formatés (ASCII).
- 23 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
De façon imagée, on peut assimiler une lecture à accès séquentiel à la lecture d'une cassette vidéo (il faut lire le début
de la cassette avant de lire la partie qui nous intéresse) ; on peut assimiler une lecture à accès direct à la lecture d'un
CD ou DVD sur lequel on lit directement la musique ou le chapitre que l'on souhaite.
Les enregistrement des fichiers à accès direct ont une taille fixe qui est déterminée à l'ouverture du fichier. Celle des
fichiers à accès séquentiel peut varier d'un enregistrement à l'autre. Si la taille des enregistrement varie beaucoup d'une
ligne à l'autre, il s'ensuit qu'un fichier séquentiel est généralement plus léger qu'un fichier direct.
On précise le type d'accès aux enregistrements du fichier par l'option acces de l'instruction open. Dans le cas d'un accès
direct il faut également préciser la longueur des enregistrements par l'option recl qui est un entier correspondant au
nombre de caractères pour les fichiers ASCII.
! exemples
open( 11, file="monfichier")
open( 23, file=fichier) ! où fichier est une variable chaine de caractère
open( i, file="monfichier) ! où i est un entier ou une exepression arithmétique
Par défaut les fichiers sont des fichiers ASCII (formatés) et à accès séquentiel. Voici une syntaxe plus complète de
l'instruction open. Pour connaître l'ensemble des options consulter l'un des cours disponibles.
- 24 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
! exemples
close(11)
close(i)
close(2*i + 1)
- 25 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
! existe = .true.
write(*,*)"le fichier existe"
ElseIf( .NOT. existe) Then
! existe = .false.
write(*,*)"le fichier n'existe pas"
STOP
Endif
i=0
Do
read(10,*,end=1000)var1,var2
i = i + 1
Enddo
1000 write(*,*)"la lecture a atteind la fin du fichier"
write(*,*)"le nombre de ligne est : ",i
Lors de la lecture d'un fichier, on peut rajouter dans l'instruction read l'option iostat=entier. Si la fin du fichier est
atteinte, entier prendra une valeur négative. La valeur dépend du compilateur on testera donc simplement le signe.
i=0
Do
read(10,*,iostat=io)var1,var2
If( io < 0 ) exit
i = i + 1
Enddo
write(*,*)"la lecture a atteind la fin du fichier"
- 26 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
- 27 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Une chaîne de caractères a une certaine longueur, donnée lors de sa déclaration (le paramètre len). Elle ne peut
pas contenir plus de caractères que le nombre indiqué lors de sa déclaration. Si la chaîne de caracères que l'on
veut enregistrer dans une variable est plus longue que la longueur de la variable, seuls les premiers caractères sont
enregistrés. Si la chaîne de caractères que l'on veut enregistrer dans une variable est plus courte que la longueur de la
variable les caractères manquants sont complétés par des espaces (peut dépendre du compilateur).
Exemples
character(len=4)::courte
character(len=20)::longue
courte = "bonjour"
! la variable courte ne contient que "bonj"
longue = "bonjour"
! la variable longue contient "bonjour "
Utilisation de len
character(len=100)::mot
integer::long
! longueur de mot
long = len(mot)
mot = "bonjour"
! dans mot on a mis la chaine de caractères "bonjour" pour connaitre la longueur
! de cette chaine on doit en premier supprimer les blancs en bout de chaine
! on utilise trim
long = len( trim( mot ) )
! dans ce cas long = 7 qui est la taille de bonjour
- 28 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Cette fonction peut être très utile par exemple pour repérer une ligne dans un fichier où est inscrit un repère.
! ouverture du fichier
open(10,file="resultats",action="read")
! recherche du repère
Do
ligne = ""
read(10,"(a)")ligne
k = index( ligne , "repere" )
! si k n'est pas 0 c'est que ligne contient "repere"
If( k /= 0 ) exit
Enddo
k=1234
write(num,"(i4)")k
! * * * * * * * * *
L'écriture dans une variable chaîne de caractère par rapport à une simple affectation présente l'intérêt que l'on peut
choisir le format dans lequel on écrit.
- 29 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
write(*,*)chaine,"XX"
! résultats :bonjour XX
write(*,*)trim(chaine),"XX"
! résultats :bonjourXX
Attention, fortran complète les automatiquement les chaînes de caractères par des espaces, donc si on remplace
le contenu d'une variable chaîne de caractère par son contenu en ayant supprimé les espaces ils sont rajoutés
automatiquement pour compléter la longueur de la variable chaîne de caractères.
chaine = "bonjour"
! chaine contient "bonjour "
chaine = trim(chaine)
! comme les caractères manquants sont complétés par des espaces
! chaine contient toujours "bonjour "
courte = trim(chaine)
! courte contient "bonjour"
La fonction trim est très utile pour écrire des noms de fichier dans une variable chaîne de caractères car elle permet
d'avoir des noms de fichier sans espaces.
- 30 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
C'est variables sont, par exemple, des listes (variables à un indices) ou des tableaux (variables à 2 indices) ect ... Elles
sont très largement utilisée dans les programmes.
Pour ce qui est de la dimension, depuis Fortran90 on a deux possibilités : une déclaration statique ou dynamique. Dans
une déclaration statique, la dimension de la variable est donnée au départ et est fixée pour le reste du programme. A
l'exécution du programme une zone mémoire dont la taille dépend de la dimension est réservée pour toute la durée
de l'exécution.
Déclaration statique
! une liste d'entier
integer,dimension(1:10)::liste
On remarque que lorsqu'on donne la dimension d'une liste ou d'un tableaun, on peut préciser les valeurs min et max
des indices. Ceux-ci ne commencent pas forcément à 1 ou 0. Dans le troisième exemple on ne donne que la dimension,
10, l'indice commence alors à 1.
Dans une déclaration dynamique, on ne précise que le nombre d'indices souhaités. Puis, pendant l'exécution, on alloue,
avec la commande allocate, la mémoire nécessaire au moment ou on a besoin de la variable. On peut ensuite libérer la
zone mémoire lorsqu'on n'en a plus besoin, avec la commande deallocate.
Déclaration dynamique
! une liste d'entier
integer,dimension(:),allocatable::liste
- 31 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Déclaration dynamique
deallocate( tableau(:,:) )
L'intérêt d'allouer les variables indicées de façon dynamique est de n'utiliser que la mémoire nécessaire au moment où
on en a besoin. De plus, on peut calculer la dimension d'une variable indicée dans le programme et avoir une variable
indicée de la dimension souhaitée.
Remarque : Dans les sous programmes la déclaration dynamique est impossible, sauf dans le cas des modules.
Dans le cas de la déclaration statique, l'utilisation des paramètres pour déclarer les dimensions des variables est utile.
Comment agir sur tout ou une partie d'une variable indicée ? (Fortran90)
Auteurs : Germain Salvato-Vallverdu ,
En fortran77, pour agir sur plusieurs éléments d'une variable indicée, il faut écrire une instruction pour chaque élément
ou écrire une boucle. Le fortran90 permet d'agir sur plusieurs éléments en une seule instructions.
affectation multiple
integer,parameter::ndim=10
integer,dimension(1:ndim)::liste
double precision,dimension(ndim,ndim)::matrice
- 32 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Remarque : Il n'est pas nécessaire de préciser les : entre parenthèses, le nom de la variable est suffisant. Cependant par
un souci de clarté et de lisibilité du programme il est préférable de l'écrire.
Exemple d'opérations
double precision,dimension(3)::u,v,w,x
! ou encore
w(:) = 3.d0*u(:) - 0.5d0*v(:) + 2.d0*x(:)
La multiplication ou division de variables indicées ayant un sens particulier (produit scalaire, produit de matrice), des
fonctions spéciales sont disponibles.
Remarque : Il n'est pas nécessaire de préciser les : entre parenthèses, le nom de la variable est suffisant. Cependant par
un souci de clarté et de lisibilité du programme il est préférable de l'écrire.
Exemple de somme
integer,parameter::ndim=10
double precision,dimension(ndim)::liste
double precision,dimension(ndim,ndim)::matrice
double precision::somme
! normalisation de liste
liste(:) = liste(:) / sqrt( sum( ( liste(:) )**2 ) )
Exemple de produit
integer,parameter::ndim=10
- 33 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Exemple de produit
double precision,dimension(ndim)::liste
double precision,dimension(ndim,ndim)::matrice
double precision::produit
Exemple de produit
integer,parameter::ndim=3
double precision,dimension(ndim,ndim)::A,tA
Produit de matrices
integer,parameter::ndim=3
double precision,dimension(ndim,ndim)::A,B,P
double precision,dimension(ndim)::X,Y
! Matrice vecteur
Y(:) = matmult( A(:,:) , X(:) )
ATTENTION : Comme dans un produit de matrice, le nombre de colonnes du premier argument de matmult doit être
égal au nombre de lignes du second argument.
- 34 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Les fonctions
Voyons un exemple simple d'une fonction et de son appel. Une fonction est, par exemple, de la forme f(x) = a*x + b.
Voici un programme qui utilise cette fonction :
Un exemple de fonction
PROGRAM test_function
! programme principal
implicit none
integer::i
real::f,a,b,x,y
a = 1.d0
b = 2.d0
x=0.d0
Do i=1,100
x = x + 0.1d0
write(*,*)x,f(a,b,x) ! appel de la fonction
Enddo
! autre exemple
x=0.d0
Do i=1,100
x = x + 0.1d0
y = f(a,b,x) ! appel de la fonction
write(*,*)x,y
Enddo
! * * * * * * * * * * * *
FUNCTION f(a,b,x)
implicit none
real,intent(in)::a,b,x
real::f ! dans une fonction son nom est déclaré
f = a*x + b ! quelque part dans une fonction on doit assigner une valeur à f
END FUNCTION f
Les subroutines
- 35 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Pour continuer l'exemple précédent, on peut programmer une subroutine qui va lire les paramètres a et b de la fonction
f(a,b,x).
Un Exemple de subroutine
PROGRAM test_function
! programme principal
! la subroutine n'est pas déclarée
implicit none
integer::i
real::a,b,f,x
x = 0.d0
Do i=1,100
x = x + 0.1d0
write(*,*)x,f(a,b,x)
Enddo
! * * * * * * * * * * * * * *
SUBROUTINE lec(a,b)
implicit none
real,intent(out)::a,b ! on précise que a et b sont des argument de sortie
write(*,*)"entrer a et b"
read(*,*)a,b
write(*,*)"a = ",a
write(*,*)"b = ",b
! * * * * * * * * * * * * * *
FUNCTION f(a,b,x)
implicit none
real,intent(in)::a,b,x
real::f ! dans une fonction son nom est déclaré
f = a*x + b ! quelque part dans une fonction on doit assigner une valeur à f
END FUNCTION f
Les arguments entrants ne peuvent pas être modifiés dans la subroutine. Une subroutine doit assigner une valeur à
un argument sortant.
- 36 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
L'entier correspond à la place de l'argument. Par exemple, dans notre cas, 1 correspond à p1, 2 à p2 et 3 à p3. La valeur
0 permet de récupérer le nom du programme. Ceci peut être mis à profit pour si l'exécutable est enregistré sous des
noms différents afin d'avoir une exécution différente selon le nom du programme. Les paramètres p1, p2 ou p3 sont
enregistrés dans une variable de type chaîne de caractères. Voici un exemple d'utilisation :
call getarg(2,parm)
read(parm,*)p2
call getarg(3,parm)
read(parm,*)p3
En fortran toutes les variables déclarées au début d'un programme principal, d'une fonction ou d'une subroutine sont
des variables locales. Ainsi si l'on déclare un entier i dans 3 sous programme, ces 3 variables i seront associées à 3 zones
mémoires différentes et indépendantes.
Pour utiliser des variables globales, communes à plusieurs sous programmes, on utilise les common (fortran77) ou des
module (fortran90).
- 37 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
ne doivent pas être modifié), sortant (ils viennent de la subroutine vers le programme appelant et doivent être assignés)
ou les deux.
Exemple d'arguments
PROGRAM test_arg
implicit none
integer::a,b,c
a = 2
c = 1
call sub(a,b,c)
! * * * * * * *
SUBROUTINE sub(a,b,c)
! il n'est pas nécessaire que les arguments aient le même nom, seule la position est importante
! mais ça facilite la lecture du programme
implicit none
integer,intent(in)::a ! a n'est pas modifiable
integer,intent(out)::b ! b doit être assigné
integer,intent(inout)::c ! c peut être modifié
b = a + c
c = c + 1
Il n'est pas obligatoire de préciser l'intent, cela peut cependant éviter certaines erreurs et facilite la lecture du
programme.
Comment utiliser un common pour partager des variables entre sous programmes (F77) ?
Auteurs : Germain Salvato-Vallverdu ,
Le common permet de déclarer un zone mémoire commune dans laquelle seront enregistrées des variables. Elles seront
accessibles par tous les sous programmes dans lesquels le common est déclaré. Reprenons l'exemple utilisé par les
arguments pour comparer.
PROGRAM test_arg
implicit none
integer::a,b,c
common /arg/ a,b,c ! je déclare le common
a = 2
c = 1
call sub
! * * * * * * *
- 38 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
b = a + c
c = c + 1
Il n'est plus nécessaire de donner les variables a,b et c en argument de la subroutine sub car elles sont accessibles par
l'intermédiaire du common.
Dans ce cas les variables de la zone commune sont toutes modifiables par la subroutine, pour préciser un intent il faut
utiliser les paramètres.
Pour ne pas avoir à reécrire dans chaque sous programme le common, il était courant d'inclure un fichier qui contenait
les variables du common. Ceci avait également l'avantage de ne pas avoir à modifier tous les common dans tous les sous
programmes à chaque modification. Voici un exemple :
Utilisation de include
PROGRAM test_arg
implicit none
include "arg"
a = 2
c = 1
call sub
! * * * * * * *
SUBROUTINE sub
implicit none
include "arg"
b = a + c
c = c + 1
! * * * * * * * * * * * * * * *
!contenu du fichier arg
integer::a,b,c
common /arg/ a,b,c
Comment utiliser un module pour partager des variables entre sous programmes (F90) ?
Auteurs : Germain Salvato-Vallverdu ,
Les modules sont la grande nouveauté du fortran 90 et apporte au fortran un soupçon de programmation orientée
objet. L'utilisation des modules pour partager des variables entre des sous programmes n'est qu'une infime partie de
ce qu'ils apportent. Dans ce cas, leur utilisation est similaire à celle du common. On va créer un module, dans lequel
seront déclarées des variables qui seront disponnibles dans tous les sous programmes qui utilisent le module.
- 39 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
! * * * * * * *
PROGRAM test_arg
USE arg
implicit none
a = 2
c = 1
call sub
! * * * * * * *
SUBROUTINE sub
USE arg
implicit none
b = a + c
c = c + 1
L'utilisation d'un module apporte cependant une contrainte. Ils doivent être compilés avant le programme principal.
Plusieurs solutions sont possibles :
• Lors de la compilation placer le nom du module en premier, par exemple : ifort module.f90 program.f90
• Si le programme est court et que tous les sous programmes et modules sont dans un même fichier, placer les
modules en premier, en tête du fichier dans l'ordre qu'ils apparaissent. Puis compiler simplement le fichier
comme un programme normal.
• Compilez à l'avance vos modules (s'arréter à la compilation, création de l'objet). Puis lors de la compilation du
programme ajouter les .o des modules.
Pour les compilateurs ifort, g95 ou gfortran, la compilation (création de l'objet) se fait en ajoutant l'option -c.
Il est possible de n'utiliser qu'une partie d'un module avec l'instruction only. On va ainsi sélectionner les variables qui
seront accessibles et celles qui ne le seront pas. Voici un exemple :
Utilisation de only
MODULE arg
implicit none
integer::a,b,c
double precision::x
END MODULE arg
! * * * * * * *
PROGRAM test_arg
USE arg, only : a,c ! seuls a et c sont utiles
implicit none
a = 2
c = 1
- 40 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Utilisation de only
call sub
! * * * * * * *
SUBROUTINE sub
USE arg, only : a,b,c ! seuls a b et c sont utiles
implicit none
b = a + c
c = c + 1
- 41 -
Copyright © 2008 Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble
de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à
300 000 E de dommages et intérêts.
http://fortran.developpez.com/faq/