Introduction à Fortran

Structure

program main
Declaration variables
Initialisation des parametres
Commandes / calculs
end

Types de variables

Entiers : integer i, ou integer*2 i (simple precision) ; integer*4 i (double precision)
Reels : real a, ou real*4 a (simple pr´ecision) ; real*8 a (double precision)
Complexes : complex z, ou complex*8 z (simple pr´ecision) ; complex*16 z (double precision)
Chaines de caract`eres : character nom*n
N.B.: n peu ˆetre le nombre de charact`eres de la chaˆıne (ex. : character nom*4 pour nom=toto), ou bien n=1 si la chaˆıne n’est pas sp´ecifi´ee.
Le nombre apr`es ‘*’ repr´esente le nombre de byte (octets) occup´es en m´emoire par une variable. Ainsi, un r´eel a` double pr´ecision occupe 8B, alors qu’un complexe occupe 16B. Un charact`ere occupe, quant a` lui, 1B, voil`a pourquoi il faut sp´ecifier la longuer de la chaˆıne de charact`eres.
Des variables “sp´eciales” :
Vecteurs : real*8 t r(n) (vecteur de n el´ements r´eels `a double pr´ecision), ou integer*4 t i(n) (vecteur de n entiers)
Matrices : complex*16 m c(m,n) (matrice de m × n el´ements complexes)
Param`etres : ce sont des variables (d’un des types mentionn´es) qui peuvent ˆetre partag´ees entre subroutines et fonctions (voir apr`es). Elles doivent ˆetre d´eclar´ees, selon leur type, dans toute subroutine/fonction les uti-lisant, et doivent ˆetre initialis´ees lors de leur d´eclaration en tant que param`etre. N.B.: Leur valeur ne peut pas ˆetre chang´ee.
Ex. : parameter (PI=3.141593, PI2=2*PI)
Common : ce sont aussi des variables (d’un des types mentionn´es) qui peuvent ˆetre partag´ees entre subroutines et fonctions. Leur valeur, cependant, peut ˆetre chang´ee par toute subroutine/fonction les utilisant.
Ex. : common /com/a,b
N.B.: Implicitement, les variables d´ebutant par les lettre i, j, k, l, m et n sont de type entier et les autres sont de type r´eels, tous de simple pr´ecision. Pour ´eviter toute erreur, il vaut mieux annuler ces d´eclarations implicites par la ligne
implicit none
au d´ebut du code.

Opérateurs

Affectations
integer i,j
character*4 nom
i=2
j=5
nom=’chat’ ! attention v´erifier que nom a bien 4 lettres …
Permutations
temp=a
a=b
b=temp
Op´erateurs arithm´etiques
+, -, *, / et ** pour la puissance
Op´erations sur vecteurs et matrices
Depuis Fortran90 il est possible d’effectuer des op´erations directement sur les vecteurs et sur parties de matrices (comme en Matlab).
Ex. : Si en Fortran77 il fallait impl´ementer une boucle pour sommer deux vecteurs A et B, en Fortran90 il suffit de faire C = A+B.
Les op´erations sur matrices ne sont pas g´er´ees directement. En revanche, on peut op´erer sur des colonnes, ou des lignes, d’une matrice, ce qui correspond a` op´erer sur des vecteur.
Ex. : C = A( :,1)*B( :,2) g´en`ere un vecteur C qui est le produit el´ement-par-el´ement de la premi`ere colonne de la matrice 1 et de la deuxi`eme colonne de la matrice B.
Casting
Il faut faire attention aux types des variables lorsqu’on effectue une op´eration entre elles. Si deux variables sont du mˆeme type le r´esultat de l’op´eration est lui aussi du mˆeme type. Ex. : 3/5 donne 0, donc un integer.
Si les types ne sont pas les mˆemes, le r´esultat prend le type “sup´erieur”.
Ex. : 3.2/5 donne 0.64, c’est-`a-dire un real.
On peut cependant forcer le type du r´esultat par un casting des op´erands. Ex. : float(3)/5 ou 3/float(5) donnent le mˆeme r´esultat que 3.0/5 ou 3/5.0.
Faire tr`es attention a` ce que le r´esultat d’une op´eration soit du mˆeme type que la variable `a laquelle il va ˆetre affect´.
Ex. : a = 3.0/5 donne a=0 si a est un integer, alors que a=0.0 si a avait et´ d´efini comme un real (nonobstant le casting). Pour que le r´esultat soit correct, il faut donc que 1) a soit un real et que 2) il y ait un casting des op´erands du type 3.0/5 ou float(3)/5

Lecture / écriture

Pour ´ecrire : WRITE(*,*) ’Entrer la valeur de a’
Pour lire : READ(*,*) a
program permutation
implicit none
integer*4 a,b,temp
write(*,*) ’entrer la valeur de a’
read(*,*) a
write(*,*) ’entrer la valeur de b’
read(*,*) b
temp=a
a=b
b=temp
write(*,*) ’La nouvelle valeur de a est :’, a,
& ’La nouvelle valeur de b est :’, b
end
N.B.: Dans (*,*) le premier param`etre repr´esente le canal de sortie pour l’´ecriture, le second indique le format d’´ecriture.
Dans ce cas, *,* veut dire ´ecriture `a l’´ecran et format libre. Autrement, il est par exemple possible d’´ecrire dans un fichier avec un write(1,*), ou 1 est le num´ero associ´e `a un tel fichier (voir apr`es).

Boucles

Boucle conditionnelle IF

– IF / ELSE / END if (condition) then
instructions1 else
instructions2 endif
– IF / ELSEIF / END if (condition1) then
instructions1 elseif (condition2) then
instructions2

endif
Identificateurs logiques : .eq. (=), .ne. (=), .gt. (>), .ge. (>), .le. (<), .lt. (6), .and., .or., .not.
program division
real*4 a,b,c
write(*,*) ’entrer la valeur de a et b’
real(*,*) a,b
if (b .eq. 0) then
write(*,*) ’Division impossible !’
else
c=a/b
write(*,*) ’Le resultat est :’, c
endif
end

Compteur boucle DO

do i=d´ebut,fin,pas
instructions
enddo
N.B.: Par d´efaut pas=1. Dans tous les ca, il doit ˆetre un entier, positif ou n´egatif.
program factoriel
integer n,i
integer*4 fact
write(*,*) ’Entrer la valeur de n’
read(*,*) n
fact=1
do i=2,n
fact=fact*i
enddo
write(*,*) ’Factoriel de n vaut :’,fact
end

Boucle DO WHILE

do while (condition)
instructions
enddo

Fichiers

Ouverture : open(unit=num, file=’nom’, status=’statut’)
avec num : num´ero donn´e au fichier, ’nom’ : nom du fichier, statut : ’old’ ou ’new’
N.B.: num=5 : clavier ; num=6 : ´ecran
Lecture : read(num,*)
Ecriture´ : write(num,*)
Fermeture : close(num)

Cours gratuitTélécharger le cours complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *