• Aucun résultat trouvé

FORTRAN 90/95

Dans le document Introduction `a l’Analyse Num´erique (Page 164-168)

LeFortran90est la nouvelle version du language de programmationFortran77, largement utilis´e pour les calculs scientifiques. Les instructions deFortran77sont pour la plupart encore valables enFortran90.

Compiler

L’extension pour un programme en Fortran 90 est ”.f90”. Pour compiler un programme taperf90 nom.f90et ensuitea.outpour l’ex´ecuter.

D´ecoupage des lignes en zones

La longueur de la ligne est de 132 caract`eres, et commence d`es la premi`ere colonne. Tout ce qui est `a droite d’un ”!” est en commentaire. Pour continuer une ligne sur la ligne suivante, terminer la premi`ere par un ”&”. Pour ´ecrire plusieurs instructions sur une mˆeme ligne, les s´eparer par des ”;”.

Structure d’un programme

program exemple

zone de d\’eclaration des variables ...

instructions ex\’ecutables ...

end program exemple

subroutine et function ...

Un programme peut appeler des sous-programmes qui sont dessubroutineou desfunction. Voir la s´erie 1 pour des exemples de la structure et de l’utilisation des sous-routines et des fonctions.

Types de donn´ees

Fortran90contient 5 types intrins`eques:

1. Types num´eriques: integer,realetcomplex. 2. Types non num´eriques:characteretlogical.

Il est possible de d´efinir de nouveaux types de donn´ees `a partir des types intrins`eques. Aux 5 types intrins`eques sont associ´es un entier non n´egatif appel´e le “kind type parameter”(d´epend du syst`eme et indique en g´en´eral le nombre de bytes utilis´es pour stocker une valeur). Quand celui-ci n’est pas sp´ecif´e, c’est la valeur par d´efaut qui est utilis´ee.

Exemples:

1. real (kind=8) :: x ! x est de type r´eel double pr´ecision sur sun (ultra), simple pr´ecision sur Cray. La double pr´ecision correspond `a un type pr´ed´efini qui donne environ 15 chiffres significatifs, la simple pr´ecision o`u pr´ecision r´eelle par d´efaut en donne environ 7.

2. integer, parameter :: dp=kind(1.d0)! le param`etredp(constante litt´erale) prend la valeur de kind qui correspond `a la double pr´ecision.

real (kind=dp) :: x ! x est de type r´eel double pr´ecision (d´efini ci-dessus) 3. real :: x! x est de type r´eel par d´efault (simple pr´ecision)

4. integer, parameter :: q=select real kind(15,60) ! choisi q de sorte quereal (kind=q) poss`ede au moins 15 chiffres significatifs et une ´etendue ´egale o`u sup´erieure `a10−60,1060(pour autant que le compilateur en question supporte cette pr´ecision). C’est donc une fac¸on ind´ependante du compilateur de d´efinir des sous-types num´eriques. 5. 1234 ! constante de type ‘‘entier’’

1234. ! constante de type ‘‘r\’eel’’

1234._dp! constante de type ‘‘dp’’ (pr\’ealablement d\’efini)

Entr´ees et Sorties

1. read(5,*) x ! lit un caract`ere et l’assigne `a la variablex. L’´etiquette 5 indique que le caract`ere est lu du clavier.

2. read(8,*) x ! comme ci-dessus, sauf que l’´etiquette 8 indique que le caract`ere est lu dans le fichier avec l’´etiquette 8 (la lecture se fait de fac¸on s´equentielle en commenc¸ant par la premi`ere valeur du fichier).

3. write(6,*) x! ´ecrit le contenu de la variablex`a l’ ´ecran

4. write(8,*) x! ´ecrit le contenu de la variablexdans le fichier avec l’´etiquette 8 5. write(6,*) ’valeur de x’! ´ecrit les charact`eres entre apostrophes `a l’´ecran

Remarque: L’´etoile * (format par d´efaut) dans la description ci-dessus peut-ˆetre remplac´ee par un descripteur de format (voir les sorties format´ees).

Affectation des variables

L’op´eration d’affectation des variables est la suivante: variable r´eceptrice=expression source

D´eclaration de param`etres et initialisations

1. integer, parameter :: n=20! d´efini un param`etre entier et lui assigne la valeur 20. Cette assignation est d´efinitive et ne peut plus ˆetre chang´ee dans le programme.

2. real(kind=dp) :: rn=20! d´efini une variable rn r´eelle de type dpet lui donne

20comme valeur initiale. Cette assignation peut-ˆetre chang´ee dans le programme. On peut aussi d´eclarerrncomme variablereal(kind=dp)et l’initialiser dans le programme.

Op´erateurs et fonctions

+ , - , * , / , ** (exponentiation)

Op´erations arithm´etiques

Lors de calculs arithm´etiques avec des constantes ou des variables, il est souvent dangereux de m´elanger dans une mˆeme expression plusieurs types num´eriques. Pour l’assignation

variable=expression,

o`u variable est une variable num´erique et expression est une expression num´erique, si

expressionn’est pas du mˆeme type quevariable, expressionva ˆetre converti dans le type devariable. Cette conversion peut donner lieu `a des pertes de pr´ecision. Lors d’op´erations arithm´etiques m´elangeant plusieurs types num´eriques, les “types moins pr´ecis” sont convertis dans le “type le plus pr´ecis” de l’expression.

Exemples:

1. integer :: i,j

integer, parameter :: dp=kind(1.d0) real(kind=dp) :: a,b

a=1;b=3;i=1;j=3

write(6,*) a/b,a/j,i/j real(kind=dp) :: a,b

r´esultats:0.33333333333333331, 0.33333333333333331, 0

Pour a/b les entiers sont convertis en dp (de fac¸on exacte) et le calcul est effectu´e en precisiondp. Poura/jle contenu de la variable enti`erejest converti (de fac¸on exacte) en

dpet le calcul est effectu´e en precisiondp. Pouri/jle calcul est fait en division enti`ere et le r´esultat est faux.

2. integer, parameter :: dp=kind(1.d0)

real(kind=dp) :: a,b a=1.123456789;b=1.123456789_dp write(6,*) a,b write(6,*) a/b,a-b a=1.123456789_dp;b=1.123456789 write(6,*) a/b,a-b a=1.123456789_dp;b=1.123456789_dp write(6,*) a/b,a-b r´esultats:1.1234568357467651, 1.123456789 1.0000000416097581, 4.67467651255049077E-8 0.99999995839024369, -4.67467651255049077E-8 1., 0.E+0

L’expressiona=1.123456789m´elange le mode r´eeldppouraet le mode r´eel simple pr´ecision (pr´ecision r´eelle par d´efaut) pour la constante 1.123456789. Lors de la conversion on perd 3 chiffres significatifs. Ceci explique pourquoi toutes les op´erations arithm´etiques ci-dessus m´elangeant plusieurs types num´eriques (except´e la derni`ere) donnent des r´esultats faux.

Les sorties format´ees

Exemples:

1. write(6,i5) 123456 ! ´ecrit l’entier 123456 (“i” pour “integer”) dans un champ de 5 charact`eres

2. write(6,f10.5) 1.23456 ! ´ecrit le r´eel 1.23456 dans un champ de 10 charact`eres dont 5 sont r´eserv´es pour la partie d´ecimale.

Ces instructions peuvent ´egalement s’´ecrire

1. write(6,100) 123456

100 format(i5)

2. write(6,100) 1.23456

100 format(f10.5)

Remarque: L’´etiquette 6 dans la description ci-dessus peut-ˆetre remplac´ee par un label indiquant une autre sortie, par exemple une sortie fichier (voir “fichiers”).

Les fichiers

Ecriture des r´esultats dans un fichier:

open(8,file=’fich1’)

ouvre un fichier fich1 et lui assigne l’´etiquette 8

write(8,*) a

´ecrit dans le fichier avec l’´etiquette 8 la valeur de a

read(8,*) a

lit dans le fichier avec l’´etiquette 8 la valeur de a.

Remarque: Le format par d´efaut dans la description ci-dessus peut-ˆetre remplac´e par un format sp´ecifi´e par l’utilisateur (voir “sorties format´ees”).

Structures de contrˆoles

1. if(expression-logique) then traitements else traitements end if 2. dovariable=i,n,m traitements end do

o`u i,n,m sont des entiers. La boucle se fait de i `a n avec un pas m. 3. do while(expression-logique)

traitements

Les op´erateurs de comparaison

> : plus grand que;

>= : plus grand ou ´egal `a; == : ´egal;

/= : diff´erent de;

<= : plus petit ou ´egal `a;

< : plus petit que.

Les tableaux

Exemple de d´eclaration:

real,dimension(2,3):: tabr1,tabr2

d´eclare un tableau2×3`a valeurs r´eelles.

Remarque: Il est permis de cr´eer des nouveaux tableaux `a l’int´erieur des fonctions et des sous-routines.

Allocation dynamique:

Pour d´eclarer un tableau `a deux dimensions, mais dont la taille n’est pas connue au d´ebut du programme:

real,dimension(:,:),allocatable:: tabdyn1

et plus loin dans le programme:

n1=4;n2=8

allocate(tabdyn(n1,n2))

R´ef´erences

1. Programmer en Fortran 90de Claude Delannoy. 2. Fortran 90 explainedde M.Metcalf et J.Reid. 3. Et sur l’internet:

4. www-curri.u-strasbg.fr/DOCtechnique/fortran.htm 5. http://perso.wanadoo.fr/jean-pierre.moreau/fortran.html 6. http://csep1.phy.ornl.gov:80/CSEP/PL/PL.html

Dans le document Introduction `a l’Analyse Num´erique (Page 164-168)

Documents relatifs