You are on page 1of 243

Programmer en Fortran 90

Cdric Vandenbem Laboratoire de Physique du Solide Centre de Recherche en Physique de la Matire et Rayonnement cedric.vandenbem@fundp.ac.be

http://perso.fundp.ac.be/~cvandenb/

Table des matires


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Gnralits sur le Fortran 90 Les types de donnes Les expressions et linstruction daffectation Les instructions de contrle Les tableaux Les oprations de lecture et dcriture Les procdures Les modules Les structures ou types drivs La librairie graphique DFLIB Les procdures : Notions avances Les modules : Notions avances Les pointeurs Notions doptimisation Excution en lignes de commandes
2

Rfrences
o Livres :
C. Delannoy, Programmer en Fortran 90 Guide Complet, 2nd Edition (Eyrolles, 1997) S. J. Chapman, Fortran 95/2003 for Scientists and Engineers, 3rd Edition (McGraw Hill, 2007) N. Dubesset et J. Vignes, Le Fortran Le langage normalis (Technip, 1991)

o Cours :
A. Mayer, Cours de programmation : Fortran 90, http://perso.fundp.ac.be/~amayer

Chapitre 1. Gnralits sur le Fortran 90

Exemple de programme en Fortran 90

Structure dun programme (1)


o Instructions de dclaration:
program <Nom du programme> : : Instructions de dclaration :

Dclaration des objets utiliss Informations utiles la compilation Toujours prcder les instructions excutables

: : Instructions excutables : end program <Nom du programme>

o Instructions excutables:
Oprations mathmatiques Lecture/criture de fichiers Appel des sous-programmes

Structure dun programme (2)

Instructions excutables

Instructions de dclaration

Rgles dcriture : les noms de variables


o Ils dsignent les diffrents objets manipuls par le programme o Ils sont composs dune suite de caractres alphanumriques dont
le premier est une lettre et limit 31 caractres

o En ce qui concerne les lettres:


Le caractre soulign (_) est considr comme une lettre
valeur_totale _total valeur_2 _8

Le Fortran ne distingue pas les majuscules des minuscules sauf dans les chanes de caractres.
Racine racine 'Racine' 'racine'
8

Rgles dcriture : Format libre (1)


o Longueur des lignes : 132 caractres o Des espaces peuvent tre introduits entre les lments de langage
integer::n,resultat,p1 integer :: n, resultat, p1

o Les instructions multiples


La fin de ligne sert de sparation naturelle entre deux instructions
print *, 'donnez un nombre' read *, n

Mais, il est possible de placer plusieurs instructions sur une mme ligne en les sparant par ;
print *, 'donnez un nombre' ;read *, n
9

Rgles dcriture : Format libre (2)


o Instructions sur plusieurs lignes
Une ligne termine par & se poursuit sur la ligne suivante. Le & peut tre reproduit sur la ligne suivante.
integer::n,resultat integer :: n, & resultat integer :: n, & & resultat

Pour les chanes de caractres, il doit tre rpt!


print *, 'Hello world' print *, 'Hello & &world'
10

Rgles dcriture : Format libre (3)


o Commentaires
Le ! signifie que le reste de la ligne est considr comme un commentaire

11

Rgles dcriture : Format fixe (1)


o Intrt :
Compatibilit avec des anciens programmes.

o Format :
Le format fixe correspond au format du fortran 77 avec 2 extensions:
o Les instructions multiples o La nouvelle forme de commentaires

Format Fortran 77:


o Une ligne contient 72 caractres (au-del, ce nest pas considr par le compilateur) o Dcoupage en zone:
Zone tiquette (colonne 1 5) Zone instruction (colonne 7 72) Colonne suite (colonne 6)

o Un commentaire commence par C en colonne 1

Format fixe : Extension du fichier .f Format libre : Extension du fichier .f90


12

Rgles dcriture : Format fixe (2)

13

Rgles dcriture : Format fixe (3)


o La notion de sparateur nexiste plus
Lespace est sans signification
doi = 1, nrac d oi = 1,n rac do i = 1,nrac

o Incompatibilits des deux formats


Il faut prciser, lors de la compilation, le format employ. Il est possible de faire de la compilation spare , trs utile pour rcuprer des routines crites en Fortran 77.

14

Chapitre 2. Les types de donnes

Les diffrents types


o Integer :
Nombres entiers Valeurs positives ou ngatives entre des limites qui dpendent de la machine

o Real :
Nombres rels Valeurs positives ou ngatives, ayant une partie fractionnaire, entre des limites qui dpendent de la machine

o Complex :
Nombres complexes composs dune partie relle et dune partie imaginaire, toutes deux de type rel

o Logical
Valeurs boolennes ou logiques ne prenant que deux valeurs: vrai (true) ou faux (false)

o Character :
Chanes dun ou plusieurs caractres
16

Le type INTEGER
o Reprsentation des nombres entiers relatifs (complment 2 ) o Limite en fonction de la machine
16 bits (2 octets): -32.768 i 32.767 32 bits (4 octets): -2.147.483.648 i 2.147.483.647

o Pour introduire une constante entire, il suffit de lcrire sous sa forme dcimale habituelle avec ou sans signe:
+533 48 -2894

o Il est galement possible de lcrire en base 2, 8 ou 16:


B'0110101110' O'025472' ZFA0FA'
17

Le type REAL : Reprsentation en mmoire


o Virgule flottante normalise
Le nombre A se dcompose sous la forme: A = m*bc tel que 1/b m < 1
o m est la mantisse (nombre algbrique partie entire et partie dcimale) o b est la base du systme de numrotation (systme binaire) o c est lexposant ou caractristique (nombre algbrique entier)
-123.135 = +84.0 = -0.123135 +0.84 102 103

o Erreur de troncature
Utilisateur : entres/sorties en base dcimale Ordinateur : travail en base binaire Le type REAL donne une reprsentation approche des nombres rels!
18

Le type REAL : Limite de reprsentation


o Rel simple prcision
Motif binaire de la forme : s e e e e m m m m

8 23 Nombre reprsent : r = s1.m 2e-127 32 bits (4 octets): 1.2 10-38 |x| 3.4 1038 Prcision : 7 chiffres significatifs

o Rel double prcision


Motif binaire de la forme: s e e 11 e e m m 52 m m

Nombre reprsent : r = s1.m 2e-1023 64 bits (8 octets): 2.2 10-308 |x| 1.8 10308 Prcision : 16 chiffres significatifs

19

Le type REAL : Notation des constantes


o Les constantes de type rel scrivent indiffremment suivant lune des deux notations:
Dcimale (doit comporter obligatoirement un .)
12.43 -0.38 .38 4. -.27

Exponentielle (utilisation de la lettre e, le . peut tre absent)


4.25E4 0.54e-2 48e13 48.e13 4.25e+4 425e2 5.4e-3 48.0e13

o En double prcision (codage 8 octets), les constantes scrivent obligatoirement sous forme exponentielle en utilisant la lettre d la place de e.
4.25D4 4.25d+4 425d2
20

Les types implicites


o Fortran 90 ne rend pas obligatoire les dclarations des types des variables. Fortran attribue implicitement un type une variables non dfinies en fonction de la premire lettre:
I, J, K, L, M, N reprsentent des types INTEGER Les autres reprsentent des types REAL

o Plus nfaste quutile


integer :: nbre = 5, k k = nbr + 1

nbr au lieu de nbre ne sera pas dtect par le compilateur

o Solution : Supprimer les types implicites


implicit none
21

Le Type COMPLEX
o Pour Fortran, un nombre complexe est un couple de nombres rels. o En mmoire, le type complex est reprsent par deux nombres de type real. o Les constantes de type complex
(2.5,3.e2) ( partie_reelle, partie_imaginaire ) (0.,1.) 2,5 + 300i i

o Lassignation
variable = cmplx(variable_r,variable_i)

complex :: z real :: x,y z = cmplx(x,y)


22

Le type LOGICAL

23

Dclaration des variables numriques et logiques (1)


<type> [ [,<attribut(s)>] :: ] <variable> [=<value>]

o Type:
INTEGER[([KIND=] variante)] REAL[([KIND=] variante)] COMPLEX[([KIND=] variante)] LOGICAL[([KIND=] variante)] DOUBLE PRECISION

o Attribut:
parameter, public, private, pointer, target, allocatable, optional, save, external, intrinsic, intent, dimension

o Si <attribut(s)> ou =<value>, le :: est obligatoire


24

Dclaration des variables numriques et logiques (2)

integer :: nbre = 5, k real a real :: c,d,e interger, parameter :: maxat=100 integer,parameter :: at_xyz=3*maxat real,dimension(3) :: a_vec,b_vec

logical :: converged=.FALSE. complex(kind=4) :: z=(1.0,0.1)

25

Les expressions constantes


o Fortran permet de dfinir une constante symbolique , un symbole auquel on attribue une valeur qui ne pourra tre modifie par le programme
<type>, parameter :: <variable(s)> = <value>

interger, parameter :: n1=50, n2=120 integer,parameter :: nbv=abs(n1-n2)+1

o Conseill:
si la variable ne change pas lors de lexcution du programme pour rendre un code plus lisible (pi, deux_pi, ) pour rendre un code plus facile modifier (dimension dune matrice)

26

Les types de donnes paramtriss (1)


o Ils assurent la portabilit de la prcision numrique o Les compilateurs supportent au moins deux sortes de rels, identifis par un nombre entier (nombre doctets utiliss pour la reprsentation de ces rels)
real(kind=4) :: x !simple prcision real(kind=8) :: y !double prcision

o Le kind de constantes littrales se note par exemple 3.5_8 o RQ : tous les compilateurs ne codent pas forcment la simple et la double prcision avec kind=4 et kind=8
27

Les types de donnes paramtriss (2)


o Pour faciliter la conversion de tout un programme dun kind vers un autre, on dfinit
integer,parameter :: r=4 real(kind=r) :: x,y=2._r

o Dtermination propre dun kind:


selected_int_kind(r): valeur de la premire sorte dentiers disponibles capables de reprsenter les entiers de -10r 10r (r=range) selected_real_kind(p,r): valeur de la premire sorte de rels disponibles capables de reprsenter les rels ayant au moins p chiffres dcimaux significatifs (p=precision) de -10r 10r (r=range) Si la prcision nest pas disponible, les fonctions retournent la valeur -1
28

Les types de donnes paramtriss (3)


o Exemple:
x et y ont 15 chiffres significatifs et peuvent prendre des valeurs comprises entre -1070 et 1070

integer,parameter :: r=selected_real_kind(15,70) real(kind=r) :: x,y=2._r

29

Dclaration du Type CHARACTER


character[(len=<longueur>)] [,<attribut(s)>] [::] <variable> [=<value>]

o Longueur:
Expression entire ou * (dduction par le compilateur de la longueur)
character(len=10) :: nom character :: oui_ou_non character(len=5) :: ville='Namur' character(len=8) :: town='Namur' !Padded right character(len=8) :: capitale='Bruxelles' !Truncated character(len=*),parameter :: lang='F90' !Assumed length

30

Le type CHARACTER : Exemples

31

Chapitre 3. Les expressions et linstruction daffectation

Introduction
o Linstruction daffectation se prsente sous la forme:
<variable> = <expression>

o Expression peut faire intervenir


des oprateurs comme la division entire, lexponentiation, plusieurs oprateurs et, donc, des problmes de priorit des variables de types diffrents, ce qui engendre des conversions implicites une variable ayant un type diffrent du rsultat fourni par lexpression engendre des conversions forces La valeur dune expression est entirement value avant dtre affecte
33

Expressions arithmtiques : Oprateurs usuels


o Quatre oprateurs dyadiques :
Addition : + Soustraction : Multiplication : * Division : / (Pas de division par zro!)

o Un oprateur monadique :
Oppos : -

Le rsultat de la division entre deux entiers est un entier (partie entire du quotient exact).
5/2 = 2 7/5 = 1 -8/3 = -2

34

Expressions arithmtiques : Oprateur dexponentiation


o Il se note : ** o Il correspond lopration mathmatique ab = a**b o Pour r entier positif:
xr = x*x*x*x (r fois) x-r = 1/xr

o Pour r rel quelconque:


xr = er Log x pour x 0 Ce nest qu lexcution quon obtient un message derreur si x < 0!

35

Expressions arithmtiques : Priorits relatives

o Ordre des oprations


Exponentiation Multiplication et division (gauche droite) Addition et soustraction

o En cas de doute, utiliser les parenthses!

36

Expressions arithmtiques : Conversion implicite


o Fortran autorise que les oprations dyadiques (+,-,*,/) portent sur des oprandes de types diffrents. Le compilateur met en place des conversions implicites o Respect de la hirarchie:
integer -> real -> complex simple precision -> double precision integer :: n,p real(kind=4) :: x,y real(kind=8) :: z n + x real x * y + z double precision x + n / p real (div.=int)
37

x + real(n)/real(p)

Expressions arithmtiques : Conversion force


o Fortran accepte que la variable soit dun type diffrent que celui de lexpression (<variable> = <expression>) Conversion de lexpression dans le type de la variable o Hirarchie non respecte

integer :: n=5,p=10,q real(kind=4) :: x=0.5,y=1.25 y = n + p p = x + y y = x / p

15.

0.05
38

Nombres complexes : Oprateurs usuels

complex(kind=4) :: z real(kind=4) :: x=0.,y=1. z = cmplx(x,y) real(z) imag(z) conjg(z) abs(z) !partie relle !partie imaginaire !complexe conjugu !module !assignation simple prcision (SP)

39

Anciens noms des fonctions intrinsques


o En Fortran 90, beaucoup de procdures sont gnriques (un mme nom peut dsigner plusieurs procdures) o La fonction abs est gnrique (dpend de la variable). Dans les anciennes versions de Fortran, elle scrit
Nom spcifique iabs abs dabs cabs cdabs Type de largument INTEGER(4) REAL(4) REAL(8) COMPLEX(4) COMPLEX(8) Type du rsultat INTEGER(4) REAL(4) REAL(8) REAL(4) REAL(8)

o Rgle :
a (ou rien) real, d double precision, i integer, c complex
40

Expressions logiques : les comparaisons (1)


o Comparaison des expressions numriques avec une valeur logique pour rsultat
Ancienne notation .LT. .LE. .GT. .GE. .EQ. .NE. Nouvelle notation < <= > >= == /= signification inferieur infrieur ou gal suprieur suprieur ou gal gal diffrent de

o Seuls == et /= sappliquent deux oprandes complexes.

41

Expressions logiques : les comparaisons (2)


o Encore et toujours la troncature

42

Expressions logiques : Oprateurs logiques

43

Chanes de caractres : Oprateurs intrinsques


o Il existe deux types doprateurs:
Concatnation (mise bout--bout de deux chanes) : // Comparaison

o Fortran distingue les minuscules des majuscules (ordre voir code ASCII).

44

Chanes de caractres : Codage ASCII


o Conversion entier/caractre :
<character> = achar(<entier>) <entier> = iachar(<character>)

45

Chanes de caractres : Sous-chanes (1)


o Manipulation dune partie forme de caractres conscutifs dune chane:
Variable_chane([debut]:[fin])

debut et fin : expression de type integer Si debut absent: 1 par dfaut Si fin absent : longueur de la chane par dfaut
mot = bonjour print *, mot(2:6) print *, mot(:3) print *, mot(4:) mot(2:2) = a print *, mot(1:5) banjo onjou bon jour

46

Chanes de caractres : Sous-chanes (2)


o Exemples
Supprimer la premire lettre du mot
mot(1:lmot-1) = mot(2:lmot) mot(lmot:lmot) = ' '

Afficher le caractre correspondant un chiffre


character(len=10), parameter :: chiffres = 0123456789 integer :: i print *, chiffre(i+1,i+1)

47

Chanes de caractres : Autres oprations (1)

trim(<variable_chane>) len(<variable_chane>) len_trim(<variable_chane>) trim(adjustl(<variable_chane>)) index(<var1_chane>,<var2_chane>)

!suppression blancs de fin !longueur de variable_chane !equivalent len(trim(<v_c>))) !cadrage gauche (r droite)+ !suppression blancs de fin !recherche une sous-chane

48

Chanes de caractres : Autres oprations (2)

49

Chapitre 4. Les instructions de contrle

Introduction
o Lintrt dun programme provient essentiellement de la possibilit deffectuer :
des choix (comportement diffrent suivant les circonstances) des boucles (rptition dun ensemble donn dinstructions)

o Fortran 90 est un langage structur disposant des structures suivantes :


choix simple et alternatives en cascade avec linstruction if choix multiple avec linstruction select case rptition avec linstruction do.

o La notion de branchement nest pas absente du Fortran 90 via


les branchements inconditionnels : exit, cycle et goto
51

Linstruction IF : Choix simple


if (<exp_logique>) then else end if ! instructions excutes si exp_logique est fausse ! instructions excutes si exp_logique est vraie

o Remarques:
la partie introduite par le mot cl else peut ne pas exister on peut crire end if ou endif on peut donner un nom linstruction if (imbrications longues)
ordre: if (a.lt.b) then print *, croissant else ordre print *, non croissant end if ordre

on peut imbriquer plusieurs blocs if

52

Linstruction IF : Alternatives en cascade

if (<exp_log1>) then ! instr. exc. si exp_log1 est vraie

else if (<exp_log2>) then ! instr. exc. si exp_log1 est fausse et exp_log2 est vraie

else if (<exp_log3>) then ! else ! instr. exc. si exp_log1, exp_log2 et exp_log3 sont fausses ! instr. exc. si exp_log1, exp_log2 sont fausses et exp_log3 est ! vraie

end if

53

Linstruction IF : Cas particulier dalternative


o Simplification de linstruction if si
pas de partie else la partie then ne comporte quune seule instruction
if (x.gt.max) then max = x end if if (x.gt.max) max = x

54

Linstruction IF : Synthse (1)


[<nom> :] if (<exp_log>) then bloc [ else if (<exp_log>) then [<nom>] bloc ] [ else [<nom>] bloc ] end if [<nom>]

o exp_log : expression de type LOGICAL o nom : identificateur o bloc : ensemble dinstructions simples et/ou structures

55

Linstruction IF : Synthse (2)

if (<exp_log>) inst_simple

o exp_log : expression de type LOGICAL o inst_simple : instruction simple excutable diffrente dun autre if simple ou de end

56

Linstruction SELECT CASE : Exemple introductif


o Instruction utile pour choisir entre diffrents blocs dinstructions, en fonction de la valeur dune expression.
integer :: i select case(i) case(0) !sexcute si i=0

case(:-1) !sexcute si i<=-1

Il faut viter tout recouvrement entre les diffrentes possibilits proposes!

case(1,5:10) !sexcute si i=1 ou 5<=i<=10

case default !sexcute dans tous les autres cas end select
57

Linstruction SELECT CASE : Synthse


[<nom> :] select case (<exp_scal>) [ case (<slecteur>) [<nom>] bloc ] [ case default bloc ] end select [<nom>]

o exp_scal : expression scalaire de type INTEGER, LOGICAL, CHARACTER o slecteur : liste compose de 1 ou plusieurs lments de la forme
valeur intervalle de la forme [valeur1]:valeur2 ou valeur1:[valeur2]
58

Linstruction DO : Boucle avec compteur (1)


[<nom> :] do <var> = <dbut>, <fin> [, <incrment>] bloc end do [<nom>]

o var : variable de type INTEGER o dbut, fin, incrment : expressions de type INTEGER
si incrment est omis, il est pris par dfaut gal 1.

o Remarques :
var doit tre dclare dans le programme mme si elle napparat pas dans bloc (variable de contrle qui compte les tours) var ne doit pas tre modifie dans le bloc rgit par la boucle Si fin < dbut, incrment est un entier ngatif (sinon le programme nentre pas dans la boucle)
59

Linstruction DO : Boucle avec compteur (2)

integer :: i do i = 1, 5 print *, 'i= ',i end do i= 1 i= 2 i= 3 i= 4 i= 5

integer :: i do i = 5, 1, -2 print *, 'i= ',i end do i= 5 i= 3 i= 1

do i = 1, 5, 2 print *, 'i= ',i end do

i= 1 i= 3 i= 5

do i = 5, 1 print *, 'i= ',i end do

60

Linstruction DO : La boucle tant que


o Rptition conditionnelle (rptition dans laquelle la poursuite est rgie par une condition)
[<nom> :] do while (<exp_log>) bloc end do [<nom>]

o exp_log : expression de type LOGICAL o Remarques :


exp_log doit tre dfinie avant de commencer lexcution de la boucle Arrt de la boucle si la condition (teste au dbut de chaque itration) savre fausse.

61

Linstruction DO : boucle infinie

[<nom> :] do bloc end do [<nom>]

Besoin dinstructions qui modifient le droulement de la boucle

62

Linstruction EXIT : sortie anticipe de boucle (1)


o Linstruction permet de sortir dune boucle (nimporte quel type) et le programme reprend la ligne qui suit le END DO.
do if (.not.<exp_log>) exit end do do while (<exp_log>) end do

63

Linstruction EXIT : sortie anticipe de boucle (2)


o Boucles imbriques :
Sortie par dfaut : boucle la plus intrieure Sortie un niveau suprieur : utiliser le nom de la boucle
do do if (.not.<exp_log>) exit end do end do bc1 do do if (.not.<exp_log>) exit bc1 end do end do bc1

64

Linstruction CYCLE : Bouclage anticip


o Linstruction permet de rompre le droulement dune boucle (nimporte quel type) et le programme reprend la ligne qui suit le DO.
do do if (.not.<exp_log>) cycle end do end do

65

Linstruction GOTO : Redirection (1)


o Linstruction provoque un branchement un emplacement quelconque dun programme :
goto etiquette

o etiquette : nombre entier (sans signe) de 1 5 chiffres (non nul) qui doit figurer devant linstruction laquelle on souhaite se brancher
do if (.not.<exp_log>) goto 10 end do 10
66

Linstruction GOTO : Redirection (2)


o A utiliser le moins souvent possible (lisibilit du programme)

67

Linstruction STOP : Arrt du programme


o Linstruction permet larrt de lexcution du programme nimporte o (surtout ailleurs que end)
do do if (.not.<exp_log>) then print *,problme insurmontable stop end if end do end do
68

Chapitre 5. Les tableaux

Notions gnrales
o Les tableaux englobent les notions de
vecteur (tableau 1-D) matrice (tableau 2-D) grille (tableau 3-D et plus)

o On peut les gnrer de manire


statique (rservation de la mmoire au moment de la dclaration) dynamique (rservation de la mmoire pendant lexcution)

o Les tableaux sont traits comme


des listes de valeurs par certaines fonctions des matrices au sens mathmatique par dautres

70

Dclaration statique dun tableau


o Vecteur
real :: vecteur(3) real :: vecteur(1:3) real, dimension(1:3) :: vecteur real, dimension(-1:1) :: vecteurb

integer,parameter :: n=3 real,dimension(1:n) :: vecteur

o Tableau 4 dimensions
integer,parameter :: n=3 real,dimension(1:n,1:n,-n:n,0:2*n) :: tab1

71

Remarques (1)
o Les lments sont
utiliss comme nimporte quelle autre variable de son type (expression ou affectation)
n = t(3)*5 + 3 t(1) = 2*k + 5

de nimporte quel type (INTEGER, LOGICAL, REAL, COMPLEX, CHARACTER)

o Les indices prennent la forme de nimporte quelle expression arithmtique de type INTEGER.
t(3*p-1)

o Attention au dbordement dindices (pas forcment dtect la compilation).


72

Remarques (2)
o Terminologie :
Le rang (rank) dun tableau est le nombre de dimensions du tableau (maximum 7) Ltendue (extend) dun tableau dans une de ses dimensions est le nombre dlments dans cette dimension La taille (size) est le produit des tendues dans chacune des dimensions Le profil ou forme (shape) est la liste des tendues
real,dimension(-1:1,10,0:4) :: t real,dimension(-1:5,0:9) :: tab1 real,dimension(7,2:11) :: tab2 rang : 3 tendue : 3, 10, 5 taille : 150 profil : (3,10,5)
73

Tableaux de mme profil (7,10)

Ordre dans la mmoire


o Le premier indice varie le premier en mmoire, ensuite le second, etc.
integer,parameter :: n=3 real,dimension(1:n,1:n) :: matrice

matrice(1,1) matrice(2,1) matrice(3,1) matrice(1,2) matrice(2,2) matrice(3,2) matrice(1,3) matrice(2,3) matrice(3,3)


74

efficace
do j=1,n do i=1,n u=matrice(i,j) end do end do do i=1,n

inefficace

do j=1,n u=matrice(i,j) end do end do

Construction de tableaux : Array constructor


o On peut dfinir le contenu dun tableau une dimension en utilisant un constructeur (array constructor) :
real, dimension(1:5) :: vecteur = (/ 2., 4., 6., 8., 10. /)

o Utilisation dexpressions dans un constructeur de tableau :


real, dimension(1:5) :: vecteur real :: n,p vecteur = (/ 3., n, n+p, 8.*p, p-n /)

o Utilisation de listes boucle implicite


real, dimension(1:5) :: vecteur integer :: i vecteur = (/ (2.*i, i = 1,5) /) !(2., 4., 6., 8., 10.) vecteur = (/ 2., (2.*i, i = 2,4), 10. /) !(2., 4., 6., 8., 10.) vecteur = (/ (i, 2.*i, i= 1,2), 10. /) !(1. ,2. ,2. ,4. ,10.)
75

Construction de tableaux : la fonction RESHAPE (1)


o RESHAPE permet de fabriquer un tableau de profil donn, partir dun tableau une dimension.
le premier argument contient la liste des valeurs utiliser. le second argument donne la forme de la matrice
integer, dimension(3,2) :: t t = reshape((/ 1., 2., 3, 4., 5., 6. /), (/3,2/))

1. 4. t = 2. 5. 3. 6.

o Modification de lordre de remplissage


t = reshape((/ 1., 2., 3, 4., 5., 6. /), (/3,2/), order=(/2,1/))

1. 2. t = 3. 4. 5. 6.

Remplissage o le 2nd argument varie en premier et le 1er argument varie en second

76

Construction de tableaux : la fonction RESHAPE (2)


o Remplissage par dfaut (cas o le premier argument ne spcifie pas tous les lments de la matrice) :
integer, dimension(3) :: t1 = (/ (i, i = 1,3) /) integer, dimension(3,2) :: t2 t2 = reshape( t1, (/3,2/), order=(/2,1/), pad=(/0./))

1. 2. t 2 = 3. 0. 0. 0.
t2 = reshape( t1, (/3,2/), order=(/2,1/), pad=(/0., 1./))

1. 2. t 2 = 3. 0. 1. 0.

77

Oprations sur les tableaux : Affectation


o Affectation dun seul lment
real, dimension(3,2) :: mat1 mat1(1,2) = 1.

o Affectation collective
real, dimension(1:3,1:2) :: mat1 real, dimension(-1:1,0:1) :: mat2 mat1 = 1. mat1 = mat2(0,0) mat1 = mat2 !possible si mat1 et mat2 sont de mme profil

78

Oprations sur les tableaux : les expressions


Les expressions entre tableaux doivent impliquer des tableaux de mme profil.

o Oprateurs intrinsques (+ - * / **) :


Le rsultat correspond un tableau dont chaque lment la valeur et le type de lopration entre lments pris individuellement
real, dimension(1:3,1:3) :: mat1 real, dimension(0:2,-1:1) :: mat2 real, dimension(0:2) :: vec mat1(:,1) = mat2(0,:) + vec mat1 = mat1*mat2 !Ceci nest pas un produit matriciel

o Fonctions lmentaires :
Oprations ralises en prenant chaque lment individuellement
mat1 = exp(mat2) !Ceci nest pas lexponentiel dune matrice
79

Les sections : Sections rgulires dun vecteur


o Adressage de sections de tableaux en utilisant un indexage du type ([<dbut>] : [<fin>] [: <incrment>]) o Section continue
integer, dimension(10) :: v integer, dimension(5) :: w w = v(:5) + v(6:) w = v(1:5) + v(3:7) + v(5:9)

o Section non continue


v(1:9:2) = w v(10:2:-2) = w

80

Les sections : Sections de tableaux


o On peut tendre les notions vues prcdemment chaque dimension dun tableau
integer, dimension(4,5) :: t t(1:2,:3) = t(1,1) t(1,2) t(1,3) t(2,1) t(2,2) t(2,3) t(1:4:2,1:5) t(1,1) t(1,2) t(1,3) t(1,4) t(1,5) t(3,1) t(3,2) t(3,3) t(3,4) t(3,5) t(:2,:2) t(:,1) t(::2,1) !Premier bloc (2x2) de t !Premire colonne de t !1 lment sur 2 de la premire colonne de t
81

Les sections : Vecteurs dindices


o Adressage des lments dun tableau en utilisant comme indice un vecteur dentiers
integer, dimension(1:3) :: ind = (/ 1, 4, 7 /) real, dimension(10,10) :: t t(ind, 5) = t(1,5);t(4,5);t(7,5) t(ind,ind) t(1,1) t(1,4) t(1,7) t(4,1) t(4,4) t(4,7) t(7,1) t(7,4) t(7,7)

82

Les sections : Synthse

<tableau(specif1, specif2, , specifn)>

o specifi est une des trois possibilits suivantes :


indice (expression entire) indication de section rgulire de la forme [<deb>] : [<fin>] [: <pas>] vecteur dindices (tableau dentiers une dimension)

83

Dclaration dynamique dun tableau (1)


o Rservation/Libration dune quantit despace mmoire au moment o cest ncessaire
integer :: n real,dimension(:),allocatable :: vec real,dimension(:,:),allocatable :: mat n = 3 allocate(vec(1:n),mat(1:n,1:n)) !Allouer les tableaux if (allocated(vec)) print *, 'vec allou' !Tester allocation if (allocated(mat)) print *, 'mat allou' deallocate(vec,mat) ! Librer la mmoire

o Gestion des erreurs


allocate(vec(1:n),stat=ierr) !ierr dclar comme INTEGER if (ierr.ne.0) print *, 'Erreur'

Erreur si tableau dj allou ou mmoire insuffisante


84

Dclaration dynamique dun tableau (2)

85

100. 10. mat = 0.1 0. o Possibilit de soumettre une excution daffectation de tableau une condition qui sera teste pour chaque lment du tableau (intrt : conserver une criture globale) 2. 1. mat = where(mat.gt.0.) mat = log10(mat) 1. 0.
where(mat.gt.0.) mat = log10(mat) elsewhere mat = -100. end where

Linstruction WHERE

1. 2. mat = 1. 100.

Le masque conditionnant le WHERE et les tableaux concerns doivent avoir le mme profil.
86

Oprations sur les tableaux : Fonctions intrinsques (1)


o Remarques prliminaires :
Les fonctions peuvent parfois prsenter deux arguments optionnels
o dim : la fonction sapplique pour la dimension dim o mask : la fonction sapplique quaux lments du tableau pour lesquels llment correspondant de mask a la valeur vrai.

o Fonctions logiques
all
all(<mask>)

1. 4. 7. mat = 2. 5. 8. 3. 6. 9.

o fournit la valeur vrai si tous les lments du tableau logique mask ont la valeur vrai (ou si mask est de taille zro) o option : dim
if (all(mat.ge.0)) print *, Tous les lments sont positifs all(mat.ge.5., dim = 1) all(mat.ge.5., dim = 2) (/ F, F, T /) (/ F, F, F /)
87

Oprations sur les tableaux : Fonctions intrinsques (2)


o Fonctions logiques (suite)
any
any(<mask>)

o fournit la valeur vrai si au moins un des lments du tableau logique mask a la valeur vrai o option : dim

count

count(<mask>)

o fournit le nombre (entier) dlments du tableau logique mask a la valeur

vrai
o option : dim

count(mat.ge.0) 9

1. 4. 7. mat = 2. 5. 8. 3. 6. 9.
88

Oprations sur les tableaux : Fonctions intrinsques (3)


o Fonctions de recherche dextrema
1. 4. 7. maxval (minval) mat = 2. 5. 8. maxval(<array>) 3. 6. 9. o fournit la plus grande (petite) valeur du tableau array.
o option : dim, mask
maxval(mat) maxval(mat,dim = 1) maxval(mat,dim = 2) maxval(mat,mat.lt.5.) 9. (/ 3., 6., 9. /) (/ 7., 8., 9. /) 4.

maxloc (minloc)
maxloc(<array>)

o fournit les indices relatifs la plus grande (petite) valeur de array. o option : mask
maxloc(mat) minloc(mat) (/ 3,3 /) (/ 1,1 /)
89

Oprations sur les tableaux : Fonctions intrinsques (4)


o Fonctions dinterrogation
1. 4. 7. lbound (ubound) mat = 2. 5. 8. lbound(<array>) 3. 6. 9. o Fournit la borne infrieure (suprieure) du tableau array.
o option : dim
lbound(mat) lbound(mat,dim = 1) (/ 1,1 /) 1

size
size(<array>)

o Fournit la taille du tableau array. Si dim est prsent, donne ltendue o option : dim
size(mat) size(mat,dim = 1) 9 3

shape
shape(<array>)

o Fournit un tableau dentiers de rang 1 correspondant au profil de array.

90

Oprations sur les tableaux : Fonctions intrinsques (5)


o Oprations matricielles et vectorielles
dot_product (produit scalaire)
dot_product(<vec1>,<vec2>)

o vec1, vec2 : tableaux de rang 1, de mme taille et de types numriques ou logiques [any(vec1.and.vec2)]

matmul (produit matriciel)


matmul(<mat1>,<mat2>)

o mat1, mat2 : tableaux de rang 1 ou 2 et de types numriques ou logiques o Respect des contraintes mathmatiques habituelles du produit matriciel, cd en termes de profil (m,n)*(n,p) = (m,p), (m,n)*(n) = (m)

transpose (transpose)
transpose(<mat1>)

o mat1 : tableaux de rang 2 et de type quelconque.


91

Oprations sur les tableaux : Fonctions intrinsques (6)


o Fonctions sur les valeurs des lments
product (sum)
product(<array>)

1. 4. 7. mat = 2. 5. 8. 3. 6. 9.

o fournit le produit (la somme) des valeurs des lments du tableau array. o rsultat du mme type que les lments (INTEGER, REAL, COMPLEX) o option : dim
sum(mat) sum(mat,dim = 1) sum(mat,dim = 2) 45. (/ 6., 15., 24. /) (/ 12., 15., 18. /)

product(mat) product(mat,dim = 1) product(mat,dim = 2)

362880. (/ 6., 120., 504. /) (/ 28., 80., 162. /)


92

Oprations sur les tableaux : Fonctions intrinsques (7)


o Fonctions de transformation
pack
pack(<array>, <mask> [, <vector>])

o extrait certaines valeurs du tableau array. o vector dcide de la longueur du rsultat o rsultat sous forme dun tableau de rang 1
pack(mat,mat.ge.5.) pack(mat,mat.ge.5.,(/1./)) pack(mat,mat.ge.5.,(/1., 1./))

1. 4. 7. mat = 2. 5. 8. 3. 6. 9.

(/ 5., 6., 7., 8., 9. /) (/ 5. /) (/ 5., 6. /)

reshape
o changement de forme (cfr prcdemment)

93

Chapitre 6. Les oprations de lecture et dcriture

Introduction
o Les ordres dentre/sortie permettent de transfrer des informations entre la mmoire centrale et les units priphriques (terminal, clavier, disque, imprimante,) o Les oprations dentre/sortie engendrent des conversions caractres alphanumriques/binaires
Mmoire centrale Reprsentation binaire Lecture Information sous forme de caractres Ecriture

Ecran ou assimil

Clavier
95

Syntaxe gnrale
o Lecture
read(priphrique, format [,options]) liste read format , liste

o Ecriture
write(priphrique, format [,options]) liste print format , liste

o Remarques :
les deuximes formes de syntaxe correspondent lentre et la sortie dites standard (en gnral lcran) <options> reprend lensemble des arguments qui permettent une gestion des erreurs, un contrle du changement de ligne,
96

Entres-sorties standards : Ecriture en format libre

print *, Energie totale = , Etot, eV write(*,*) Energie totale = , Etot, eV

o Le * associ au format indique linstruction dcriture de formater automatiquement les donnes. (Ex: donnes numriques crites avec toutes leurs dcimales reprsentes en machine) o Le * associ au priphrique (write) correspond la sortie standard.

97

Entres-sorties standards : Lecture en format libre


read *, title, nb, x read(*,*) title, nb, x

o Le * signifie que la conversion des donnes vers leur reprsentation machine doit se faire automatiquement. o Les donnes dentre doivent tre spares
par des espaces ou des virgules ou des fins de ligne ( viter)

o Les chanes de caractres se notent entre apostrophes (') ou entre guillemets (")
98

Les formats : Introduction


o Motivations :
Lecture : adaptation des donnes existantes non adaptes un format libre Ecriture : prsentation des rsultats

o Le format se prsente comme une liste de descripteurs :


(i3,f5.3)

o Deux manires de donner le format dentre/sortie :


dans une instruction part, dote dune tiquette
write(*,1000) liste 1000 format <liste_descripteur>

dans linstruction dentre/sortie elle-mme


write(*,<liste_descripteur>) liste
99

Les formats : Descripteur des entiers


Iw

o w : nombre de caractres o Lecture :


w caractres sont lus, y compris le signe ventuel et des espaces (interprts comme zro) devant. n p
^42^^23 read(*,(i3,i4)) n,p ^124547 ^-3^^-456 42 12 -3 23 4547 -4

o Ecriture :

Impression de la valeur entire justifie droite dans les w caractres, avec le signe ventuel et des blancs pour complter le champ w.
n 5 write(*,(i3,i4)) n,p -122 -23 p 23 45 4521 ^^5^^23 ***^^45 -234521
100

Les formats : Descripteur des rels (sans exposant)


Fw.d

o w : nombre de caractres (chiffres, point dcimal, signe, blancs) o d : nombre de chiffre dcimaux

Valeur interprte 4.86 -5.23 4.25

Format f4.1 f5.2 f10.2

Ecriture ^4.9 -5.23 ^^^^^^4.25

101

Les formats : Descripteur des rels (avec exposant)


Ew.d

o w : nombre de caractres (chiffres, point dcimal, signe, exposant, blancs) o d : nombre de chiffre dcimaux o Attention : w d+6
Valeur interprte 0.0123456 -47.678 4.25 Format e13.6 e12.4 e12.3 Ecriture ^0.123456E-01 ^-0.4768E+02 ^^^^0.425E01

o Remarques :
Gw.d choix automatique entre Fw.d et Ew.d Exposant plus de deux chiffres : Ew.dEe avec e nombre de chiffres de lexposant

102

Les formats : Descripteur des logiques

Lw

o w-1 blancs suivis de la lettre T pour une valeur .true. ou F pour une valeur .false.
test .true. write(*,(l5)) test .false. ^^^^T ^^^^F

103

Les formats : Descripteur pour caractres


Aw

o Si w > longueur de chane : blancs ajouts en tte o Si w < longueur de chane : seuls les w premiers caractres sont crits o Si w est absent : la longueur de chane fixe la longueur du champ de sortie
Chane nom nom nom Format a a5 a2 Ecriture nom ^^nom no

o Chane de caractres dans le format : reproduction telle quelle.


integer :: i=9 write(*,(valeur de i=, i2)) i Valeur^de^i=^9
104

Les formats : Descripteurs de mise en page


o Introduction des espaces :
nX

ignore (lecture) ou saute (criture) les n caractres qui suivent


x = 2.5 write(*,(f6.2,3x,f5.3)) x,y ^^2.50^^^8.250 y = 8.25

o Positionnement dans le tampon :


Tc n = 5 p = 23

permet de se positionner au caractre de rang c


write(*,'(t10,'n=',i4,t20,'p=', i3) ') n,p write(*,'(t20,'n=',i4,t3,'p=', i3) ') n,p

^^^^^^^^^n=^^^5^^^^p=^23 ^^p=^23^^^^^^^^^^^^n=^^^5
105

Les formats : Remarques


o Erreurs de descripteurs
Erreur non dtecte par le compilateur (Ex: valeur entire dcrite par le descripteur F)

o Ecriture sans retour la ligne :


write(*,'(i4,i5,$)') n,p write(*,'(i4,i5)', advance= 'no') n,p

o Descripteur de changement de ligne :


write(*,'(i4,/,i5)') n,p

o Rptition dun descripteur :


x = 132 write(*,'(2i4)') n,p ^132^456 y = 456
106

Les fichiers : Introduction


o Stockage des donnes ( enregistrements ) sur le disque. o Gnralement, on donne une extension .dat, .txt, .out, o Ils sont crs par des diteurs de texte (Notepad, Emacs, Compaq Visual Studio,) o Fichier est dit
Format si les donnes sont stockes sous forme de caractres alphanumriques Non format si les donnes sont stockes sous forme binaire

o Accessibilit :
Squentiel : lecture de tous les enregistrements prcdents Direct : Ordre de lecture/criture indique lenregistrement traiter.
107

Les fichiers : ouverture et cration dun fichier (1)


o Exploiter un fichier au sein dun programme ncessite son ouverture. En Fortran, on utilise linstruction open.
open(10,file='result.dat') !Forme compacte

open(10,file='result.dat',status='old') !Forme avec option

o Linstruction permet :
de connecter le nom de fichier un numro dunit logique (numro repris par la suite pour toute opration de lecture/criture) de spcifier le mode dsir : lecture, criture ou les deux dindiquer le mode de transfert (avec ou sans formatage) dindiquer le mode daccs (squentiel ou direct) de grer les erreurs douverture

108

Les fichiers : ouverture et cration dun fichier (2)


open([unit=]<num_unite> [,file=<nom_fichier>] [,status=<tat>] & [,access=<accs>] [,iostat=<result>] [,err=tiquette] & [,form=<format>] [,action=<action>] [,position=<pos>] & [,recl=<long_enreg>])

o num_unite :
numro dunit logique qui dsigne le fichier dans la suite du programme (constante ou variable entire)

o nom_fichier :
chane ou variable de type CHARACTER spcifiant le nom du fichier

o tat :
UNKNOWN (dfaut), OLD , NEW , SCRATCH ou REPLACE

o accs :
SEQUENTIAL (dfaut) ou DIRECT

o result :
variable entire qui contiendra le code erreur ventuel (valeur nulle si aucune erreur)
109

Les fichiers : ouverture et cration dun fichier (3)


open([unit=]<num_unite> [,file=<nom_fichier>] [,status=<tat>] & [,access=<accs>] [,iostat=<result>] [,err=tiquette] & [,form=<format>] [,action=<action>] [,position=<pos>] & [,recl=<long_enreg>])

o tiquette :
tiquette de renvoie linstruction excuter en cas derreur

o format :
FORMATTED (dfaut) ou UNFORMATTED spcifiant le mode dcriture, caractres ASCII ou binaire.

o action :
READWRITE (dfaut), READ ou WRITE

o position : (uniquement pour fichier squentiel)


ASIS (dfaut pas de modification de position si fichier dj connect , REWIND (dbut de fichier), APPEND (fin de fichier)

o long_enreg : (obligatoire si accs direct)


constante entire donnant la longueur en bytes de lenregistrement
110

Les fichiers : Lecture (1)


o Syntaxe de base :

read([unit=]<num_unite>, [fmt=]<liste_descripteurs>) <liste>

read(10,(2g15.6)) x,y read(10,*) x,y read(numfich,fmt=*) x,y,chaine read(unit=20,fmt=(a)) chaine

111

Les fichiers : Lecture (2)


o Gestion des erreurs :
Le paramtre iostat
read(10,(2g15.6),iostat=ierr) x,y

o ierr est un entier ngatif : fin de fichier ou fin denregistrement o ierr est un entier positif : toute autre erreur (enregistrement insuffisant, fichier devenu inaccessible,) o ierr est nul : aucune erreur

Les paramtres end,err,eor


read(10,(2g15.6),end=999,eor=888) x,y Paramtre end err eor Evnement fin de fichier erreur (autre que fin de fichier ou enregistrement) fin denregistrement
112

Les fichiers : Lecture (3)

113

Les fichiers : Ecriture


o Syntaxe de base
write([unit=]<num_unite>, [fmt=]<liste_descripteurs>) <liste>

write(10,(2g15.6)) x,y write(10,*) x,y write(numfich,fmt=*) x,y,chaine write(unit=20,fmt=(a)) chaine

o Gestion des erreurs avec les paramtres iostat et err (voir lecture)

114

Les fichiers : Les oprations de positionnement


o Remonter au dbut du fichier :
rewind([unit=]<num_unite> [,iostat=<result>] [,err=tiquette])

o Remonter dun enregistrement dans le fichier :


backspace([unit=]<num_unite> [,iostat=<result>] [,err=tiquette])

115

Les fichiers : lecture/criture non formate


open(10,file=result.dat,form=unformatted) write(10,*) x,y read(10,*) x,y

o Utilisation des lectures/critures non formates pour des fichiers destins tre relus par lordinateur. o Avantages :
Gain de place sur le disque Gain de temps (pas besoin de conversion binaire alphanumrique) Maintien de la prcision des variables numriques (sauf troncature)

o Dsavantage :
Lecture/criture sur un mme type de machine
116

Les fichiers : Lecture/criture en accs direct (1)


o Ds louverture du fichier, on spcifie la longueur en octets de chaque enregistrement (par exemple, 4 pour un rel simple prcision ou longueur de la chane) avec largument recl.
open(10,file=result.dat,access=direct,recl=4)

o Les read et write peuvent accder chaque enregistrement directement avec largument rec qui spcifie le numro de lenregistrement
write(10,rec=n) x read(10,rec=n) x

Tous les enregistrements doivent tre de mme taille !


117

Les fichiers : Lecture/criture en accs direct (2)

118

Les fichiers : Les fichiers internes


o Fortran 90 offre la possibilit de coder ou dcoder de linformation suivant un format. Ceci fait intervenir un tampon denregistrement (variable de type CHARACTER). o Utilit :
Effectuer des conversions numrique chane de caractres Conversion en nombre
character(len=9) :: buf = 123456789 integer :: n real :: x read(buf,(i3,f6.2)) n,x n=123, x=4567.89

Conversion en chane
character(len=80) :: tab real :: x=3.54 write(tab,("x : ",f8.3)) x write(*,*) tab x : 3.540
119

Les fichiers : Linstruction INQUIRE (1)


o Linstruction inquire permet de connatre les valeurs des arguments lis un fichier ou une unit logique (formatage, accs, oprations autorises). o Linstruction possde des arguments ayant des noms identiques ou voisins ceux de linstruction open, avec la diffrence quelle en fournit la valeur.
inquire(file='input_field.txt',exist=exists) if (.not. exists) then write(*,*) 'Error - Missing file - input_field.txt' stop end if open(10,file='input_field.txt')
120

Les fichiers : Linstruction INQUIRE (2)


o Linstruction inquire permet aussi dobtenir la longueur de lenregistrement que fournirait (en non format) une liste donne :

inquire(iolength=long) x,(t(i), i=1,5),p

long contient la taille occupe par linformation correspondant la liste

121

Les fichiers : fermeture

close([unit=]<num_unite> [,iostat=<result>] [,err=tiquette] & [,status=<tat>])

o tat :
KEEP (dfaut conserve le fichier en conflit avec scratch de open) ou DELETE (efface le fichier, utile si le programme ne sest pas droul comme prvu)

122

Chapitre 7. Les procdures

Introduction
o Fortran permet de scinder un programme en plusieurs parties :
Facilit de comprhension Possibilit dviter des squences dinstructions rptitives Possibilit de partager des outils communs

o Deux sortes de procdures


Les fonctions
o Entre : un ou plusieurs arguments o Sortie : rsultat unique (utilisable dans une expression)

Les sous-routines
o Entre : un ou plusieurs arguments o Sortie : un ou plusieurs arguments

124

Procdures internes ou externes


o Procdure dite
externe si spare de toute autre unit de programme interne si dfinie lintrieur dune unit de programme
o compile en mme temps que la procdure hte o permet le partage dinformations (arguments + variables globales)
program main contains end program main Procdures externes tant compltement indpendantes du programme principal (rien en commun!)
125

Instructions de dclaration et instructions excutables du programme principal Procdures internes ayant accs toutes les variables du programme principal (sauf si noms identiques)

Variables locales ou globales (1)


o Les procdures internes ont accs toutes les variables de la procdure hte,
program main integer :: i=5 call Sousroutine stop contains subroutine Sousroutine integer :: j=3 print *,i,j end subroutine Sousroutine end program main 5 3
126

i est une variable du programme principal. Les procdures internes y ont accs => Variable globale

j est une variable de la procdure interne. Le programme principal ny a pas accs => Variable locale

Variables locales ou globales (2)


o , sauf celles qui sont dclares avec un nom identique dans la procdure interne. La variable globale est masque!
program main integer :: i=5 call Sousroutine stop contains subroutine Sousroutine integer :: i=3 print *,i end subroutine Sousroutine end program main 3 Cest le i local qui est imprim
127

i est une variable du programme principal. Les procdures internes y ont accs (sauf si utilisation dun nom identique) i est une variable de la procdure interne. Ce i est indpendant du i dclar dans le programme principal.

Les sous-routines : Syntaxe gnrale


o Structure dune sous-routine :
subroutine <nom> [(<dummy_arg1> [,<dummy_arg2>,,<dummy_argn>])] : Instructions de dclaration des dummy arguments : Instructions de dclaration des variables locales

: Instructions excutables

end subroutine <nom>

o Appel dune sous-routine :


call <nom> [(<actual_arg1> [,<actual_arg2>,,<actual_argn>])]

Il y a autant de <actual_arg> que de <dummy_arg>. Dans le cas de variables, les arguments sont de mmes type et kind. Les dummy_arg peuvent tre des variables, des chanes, des tableaux, des pointeurs, des noms de procdures Il est possible de sortir dune sous-routine grce linstruction return 128

Les sous-routines : Exemple (sous-routine interne)

129

Les sous-routines : Exemple (sous-routine externe)

130

Les sous-routines : Utilisation avance du CALL


o Arguments positionnels :
Mettre simplement les actual arguments dans le mme ordre que les dummy arguments
call trinome(3.,a,b,c,res)

o Arguments mot cl :
Rappeler le nom des dummy arguments dans linstruction call Avantage : on peut modifier lordre des arguments
call trinome(x=3., a=a, b=b, c=c, y=res) call trinome(y=res, a=a1, b=a2, c=a3, x=3.)

o Remarque :
On peut mlanger les deux mthodes. Le principe est que ds quun argument est donn avec son keyword, les arguments suivants doivent ltre galement
131

Les fonctions : Introduction


o Une fonction est une procdure appele lintrieur dune expression et dont le rsultat est utilis dans cette expression

132

Les fonctions : Remarques


o Les dummy arguments dune fonction doivent tre dclars comme ceux dune sous-routine. o Il est ncessaire de spcifier le type et le kind dune fonction. o Une fonction peut tre interne ou externe o Il est possible de sortir dune fonction tout moment grce linstruction return

133

Les diffrentes sortes dargument


o Les dummy arguments qui sont des variables ou des tableaux peuvent tre dclars avec lattribut intent :
INTENT(IN) : largument est un argument dentre dont la valeur est utilise par la procdure mais dont la valeur ne doit pas tre modifie. INTENT(OUT) : largument est un argument de sortie dont la procdure doit attribuer une valeur mais ne jamais lutiliser. INTENT(INOUT) : largument est la fois un argument dentre et un argument de sortie.
subroutine test(x,y,z) real,intent(in) :: x real,intent(out) :: y real,intent(inout) :: z y = 2.*x z = z+y end subroutine test
134

Lutilisation de lattribut INTENT est vivement conseill pour fiabiliser les codes

Les interfaces : Motivation


o Fiabiliser les appels de procdures
call optimist(5.25) end program Aucun diagnostic la compilation. Lors de lexcution, la sousroutine recevra le motif binaire de 5.25 en type rel et il linterprtera comme un entier => Erreur assure!

subroutine test(n) integer,intent(in) :: n

o Transmettre des tableaux de taille quelconque o Transmettre des procdures o

A dcouvrir ultrieurement!

135

Les interfaces : exemple

Le nom des actual arguments ne doit pas ncessairement tre le mme que celui des dummy arguments.
136

Lattribut SAVE (1)


o Si lon souhaite quune variable locale conserve sa valeur dun appel lautre de la sous-routine, on peut lui donner lattribut save. Certains compilateurs le font automatiquement.
integer,save :: n

o On peut par ailleurs, au moment de la spcification de cette variable locale, lui donner une valeur initiale.
integer,save :: n = 0

o Cette valeur initiale est utilise lors du premier appel de la sous-routine. Aux appels suivants, la valeur de cette variable peut avoir chang.
137

Lattribut SAVE (2)

138

Procdures internes ou externes ?


o Avantages dune procdure interne :
Pas ncessaire de construire une interface. La procdure interne a accs toutes les variables de la procdure hte (sauf si utilisation de noms identiques). Il nest donc pas ncessaire de passer les variables globales en argument.

o Dsavantges dune procdure interne :


Risque important de modifier accidentellement les variables de la procdure hte (variables globales masques). La procdure interne nest accessible que par la procdure hte qui la contient. Pour une utilisation par plusieurs procdures, il faut absolument crer des procdures externes. Il est recommand de construire a priori des procdures externes, sauf sil y a un avantage indniable faire autrement.
139

Chapitre 8. Les modules

Notions gnrales
o Un module est une unit de programme indpendante qui peut contenir diffrents lments :
des des des des dclarations sur la prcision utilise (simple ou double prcision) instructions de dclaration (constantes ou variables partages) interfaces de procdures procdures
program <Nom du programme> module <Nom du module> : : Instructions de dclaration : contains : : Instructions excutables : end module <Nom du module> : : Instructions excutables : end program <Nom du programme>
141

use <Nom du module> : : Instructions de dclaration :

Module pour la prcision utilise


o On peut dfinir le type de prcision utilis (simple ou double prcision) dans un module.
module kinds integer,parameter :: r=8 end module kinds !double prcision

o On utilisera ensuite ce module en faisant use kinds.


program main use kinds real(kind=r) :: x,y real(kind=r) :: z = 1.02548_r end program main
142

Module de constantes : Utilisation


o Un module permet de dfinir des constantes, des variables ayant lattribut parameter.
module const_fond real(kind=8),parameter :: em ec = 9.10953d-31, &

= 1.602189d-19, &

hbar = 1.054589d-34, & pi end module const_fond = 3.141592654d0

o Utilisation
Tout le module : use const_fond Certaines constantes : use const_fond, only: em,ec Certaines constantes renommes : use const_fond, only: masse => em
Le em du module const_fond est alors connu sous le nom masse dans la procdure qui utilise le module.
143

Module de constantes : Exemple

144

Module de donnes partages : Utilisation


o Un module peut contenir des donnes (variables, tableaux,) qui seront utilises par plusieurs procdures. Il est vivement recommand de spcifier lattribut save.
module datas real(kind=8),save :: rayon,hauteur end module datas

o Utilisation
Tout le module : use datas Certaines donnes : use datas, only: rayon

o Largument save assure que les donnes prservent leur valeur lors du passage travers diffrentes procdures.
145

Module de donnes partages : Exemple

146

Module avec des interfaces : Utilisation


o Un module peut rassembler les interfaces de toutes les procdures rencontres dans un projet. Il suffit de construire un seul exemplaire de ces interfaces, mme si les procdures sont utilises plusieurs reprises dans le projet.
module list_int interface function masse(rho) use kinds real(kind=r):: masse real(kind=r),intent(in) :: rho end function masse end interface end module list_int
147

o Utilisation :
Tout le module : use list_int Certaines procdures (pref.) : use list_int, only: masse

Module avec des interfaces : Exemple

148

Module de procdures : Utilisation


o Un module peut encapsuler des procdures. Il est, ds lors, inutile de crer des interfaces.
module procedures

contains function masse(rho) use kinds real(kind=r):: masse real(kind=r),intent(in) :: rho end function masse end module procedures 1. Il est possible de mettre plusieurs procdures. 2. Un module de procdures peut contenir des procdures internes.

o Utilisation :
Toutes les procdures : use procedures Certaines procdures : use procedures, only: masse
149

Module de procdures : Exemple

150

Dpendance entre modules

Dpendance interdite : Un module qui sappelle lui-mme directement ou indirectement

151

Chapitre 9. Les structures (ou types drivs)

Motivation
o La structure (type driv) permet de dsigner sous un seul nom un ensemble de valeurs pouvant tre de types diffrents.

o Laccs chaque lment de la structure (champ) se fera, non plus par indication de position, mais par son nom au sein de la structure.

153

Dclaration dune structure


o Pour dfinir des variables de type structure, il faut procder en deux tapes :
Dfinir laide des dclarations appropries, les types des diffrents champs:
type atom character(len=2) :: symbol integer :: Z real :: A end type atom

Dclarer ( classiquement ) une ou plusieurs variables du nouveau type ainsi cr


type(atom) :: carbon, silicium, germanium, tin, lead

o Remarque :
Possible de dclarer des constantes de type structures
154

Utilisation de structures
o Utilisation par champs :
Chaque champs dune structure peut tre manipul comme nimporte quelle variable du type correspondant (real, complex, character,).
carbon%symbol = C print *, carbon%Z read *, carbon%A silicium%Z = carbon%Z + 8

o Utilisation globale :
carbon = atom(C,6,12.0107) print *, carbon read *, silicium

155

Imbrication de structures (1/3)


o Structure comportant des tableaux ou des chanes de caractres

type pers character(len=16) :: nom integer,dimension(3) :: qtes end type pers type(pers) :: employe = pers(Durand, (/2,5,3/)) print *,employe%nom(1:3) print *,employe%qtes(2) Dur 5

156

Imbrication de structures (2/3)


o Structure comportant une autre structure
type point real :: x_coord, y_coord end type point type cercle real :: rayon type(point) :: centre end type cercle

type(cercle) :: rond rond%centre%x_coord = 5.0

157

Imbrication de structures (3/3)


o Tableaux de structures
type atom character(len=2) :: symbol integer :: Z real :: A end type atom type(atom),dimension(1:118) :: PeriodicTable PeriodicTable(1) = atom(H,1,1.0079) PeriodicTable(8)%symbol = O PeriodicTable(8)%Z = 8 PeriodicTable(8)%A = 15.999 print *,PeriodicTable(1)%symbol read *,PeriodicTable(6)
158

Exemple

159

Chapitre 10. La librairie graphique DFLIB

Introduction
o La librairie DFLIB permet de raliser des graphiques avec Fortran 90. o Il est ncessaire pour cela de crer un projet du type Fortran Standard Graphics or QuickWin Application et de choisir QuickWin (multiple windows). o Lappel la librairie se fait comme un module :
use dflib

161

Comprendre les systmes de coordonnes :


o Coordonnes du Texte o Coordonnes graphiques
Coordonnes physiques Coordonnes Viewport Coordonnes Window

162

Systme de coordonnes : Texte et physique


o Les coordonnes du texte :
Lignes : de 1 25 Colonnes : de 1 80 Position : (ligne , colonne) (0,0) Ligne 1 Colonne 1

o Les coordonnes physiques :


x : 0 639 pixels y : 0 479 pixels Position : (x,y) o x,y sont des INTEGER(kind=2) Ligne 1 Colonne 80

Ligne 25 y Colonne 1

Rq : Valeurs donnes pour un cran 640x480

163

Systme de coordonnes : Changement dorigine


o On peut modifier lorigine du sytme de coordonnes avec la sous-routine setvieworg, dont les deux premiers arguments sont des INTEGER(kind=2) :
call setvieworg(50_2,100_2,xy)

xy contient en sortie les coordonnes physiques de lancienne origine. A la premire utilisation, ce serait (0,0). xy doit tre dclar comme
type(xycoord) :: xy

Le type xycoord est dfini dans la librairie dflib.

164

Systmes de coordonnes : Clipping region


o On peut dfinir une rgion de dcoupage (clipping region), lextrieur de laquelle il est interdit de dessiner par lintermdiaire de la routine setcliprgn.
call setcliprgn(30_2,30_2,609_2,449_2)

165

Systmes de coordonnes : Viewport


o La Viewport est la rgion de lcran o lon dessine en ralit. La routine setviewport change cette rgion. Elle a le mme effet que stevieworg et setcliprgn combines.
call setviewport(0_2,0_2,100_2,300_2)

La fentre de reprsentation est restreinte au rectangle sous-tendu par les points (0,0) et (100,300) par rapport au systme physique.

Rq : Lorigine est place au coin suprieur gauche de la fentre

166

Systmes de coordonnes : Coordonnes relles (1/2)


o La commande setwindow permet de changer lchelle de la viewport en associant des valeurs relles aux limites de la fentre de reprsentation.
dummy2 = setwindow(finvert,xmin,ymin,xmax,ymax)

finvert
o Variable de type LOGICAL o Direction de laxe y. Si .true., laxe y augmente du bas de la fentre vers le haut (comme les coordonnes cartsiennes).

xmin,ymin
o variable de type REAL(kind=8) o Coordonnes du coin infrieur gauche

xmax,ymax
o variable de type REAL(kind=8) o Coordonnes du coin suprieur droit

dummy2
o variable muette de type INTEGER(kind=2) o Diffrent de zro pour sortie normale
167

Systmes de coordonnes : Coordonnes relles (2/2)

dummy2 = setwindow(.true.,1.0_8,-50._8,12._8,450._8)

168

Effacer lcran
o Effacer tout lcran :
call clearscreen($Gclearsreen)

o Effacer la viewport :
call clearscreen($Gviewport)

169

Initialisation

170

Changer la couleur
o Couleur de base :
dummy2 = setcolor(color)

dummy2 et color sont de type INTEGER(kind=2) color correspond des valeurs prdfinies prises entre 0 et 16.

o Couleur selon le code RGB :


dummy2 = setcolorrgb(color)

dummy2 est de type INTEGER(kind=2) color, de type INTEGER(kind=4) prend la valeur #B|G|R o B, G et R reprsentent les niveaux de bleu, vert et rouge en hexadcimal (valeurs comprises entre 00 et FF).
integer(kind=4) :: blue, green, red, color color = red + 256*green + 256*256*blue
171

red, green, blue [0,255]

Changer la couleur du fond dcran


o Couleur de base :
dummy2 = setbkcolor(color)

dummy2 et color sont de type INTEGER(kind=2) color correspond des valeurs prdfinies prises entre 0 et 16.

o Couleur selon le code RGB :


dummy2 = setbkcolorrgb(color)

dummy2 est de type INTEGER(kind=2) color, de type INTEGER(kind=4) prend la valeur #B|G|R o B, G et R reprsentent les niveaux de bleu, vert et rouge en hexadcimal (valeurs comprises entre 00 et FF).

172

Relier deux points en coordonnes physiques


o Pour relier les points (x1,y1) et (x2,y2) en coordonnes physiques, les instructions suivantes sont ncessaires :
integer(kind=2) :: dummy2, x1, y1, x2, y2 type(xycoord) :: xy call moveto(x1,y1,xy) dummy2 = lineto(x2,y2)

o moveto sert dfinir le point de dpart. o lineto relie alors (x1,y1) au point suivant. On peut continuer utiliser lineto tant quil y a des points relier. xy conserve chaque fois le dernier point atteint.
173

Relier deux points en coordonnes relles


o Pour relier les points (wx1,wy1) et (wx2,wy2) en coordonnes physiques, les instructions suivantes sont ncessaires :
integer(kind=2) :: dummy2 real(kind=8) :: wx1, wy1, wx2, wy2 type(wxycoord) :: wxy call moveto_w(x1,y1,xy) dummy2 = lineto_w(x2,y2)

o moveto_w sert dfinir le point de dpart. o lineto_w relie alors (wx1,wy1) au point suivant. On peut continuer utiliser lineto_w tant quil y a des points relier. wxy conserve chaque fois le dernier point atteint.
174

Dessiner un rectangle
o En coordonnes physiques :
dummy2 = rectangle(control,x1,y1,x2,y2)

o En coordonnes relles :
dummy2 = rectangle_w(control,wx1,wy1,wx2,wy2)

o Remarques :
Control
o $Gfillinterior pour remplir lintrieur du rectangle o $Gborder pour ne dessiner que le contour

Les quatre derniers arguments de chaque commande dfinissent les deux coins opposs du rectangle.

175

Dessiner une ellipse


o En coordonnes physiques :
dummy2 = ellipse(control,x1,y1,x2,y2)

o En coordonnes relles :
dummy2 = ellipse_w(control,wx1,wy1,wx2,wy2)

o Remarques :
Control
o $Gfillinterior pour remplir lintrieur de la forme o $Gborder pour ne dessiner que le contour

Les quatre derniers arguments de chaque commande dfinissent les deux extrmits de lellipse.

176

Ecriture du texte en mode graphique

integer(kind=2) :: dummy2, x1, y1 real(kind=8) :: wx1, wy1 type(xycoord) :: xy type(wxycoord) :: wxy dummy2 = initializefonts() dummy2 = setfonts('t''modern''h14w9') call setcolor(15) call moveto(x1,y1,xy) call moveto_w(wx1,wy1,wxy) call outgtext(''I Like Fortran 90'') !pos en coord. physiques !pos en coord. relles !Sortie du texte !initialiser les fonts !choisir la font !choisir la couleur

177

Exemple

178

Chapitre 11. Les procdures : Notions avances

Tableaux transmis en argument : Introduction


o Un tableau peut apparatre en argument dune procdure. Il faut pouvoir connatre le profil au sein de la procdure. Deux situations sont envisageables:
Le profil du tableau est connu lorsque lon crit la procdure. Le profil du tableau nest pas connu lorsque lon crit la procdure :
o dclarer le tableau de profil implicite (profil transmis automatiquement) o transmettre en argument le tableau et ses tendues

180

Tableaux transmis en argument : Profil connu (1/2)


o La premire manire dutiliser des tableaux comme arguments dune procdure consiste donner leurs dimensions explicitement.
function produit_scalaire(vec1,vec2) real,dimension(1:3),intent(in) :: vec1,vec2 real :: produit_scalaire

produit_scalaire = sum(vec1*vec2)

end function produit_scalaire

La procdure qui appelle cette fonction doit fournir comme actual arguments des tableaux ou des sections de tableaux ayant le mme type, le mme kind et le mme profil que les dummy arguments.
181

Tableaux transmis en argument : Profil connu (2/2)


o Remarques :
Il est permis dutiliser des vector subscripts pour dfinir les sections de tableaux condition que la procdure ne les modifie pas. Que se passe-t-il si le profil est diffrent de celui attendu?
o Si linterface de la procdure est disponible lors de la compilation (procdure interne ou bloc interface), on obtient un diagnostic de compilation o Dans le cas contraire, aucun diagnostic de compilation ne peut tre espr. Le risque est que la procdure travaille avec des lments du tableau non situs lemplacement voulu.

Tableaux allocation dynamique comme actual arguments. Ils doivent cependant :


o tre allous avant lappel la procdure o tre traits de la mme manire quun tableau statique.

Les dummy arguments dune procdure ne peuvent avoir lattribut allocatable.

182

Tableaux transmis en argument : Profil explicite


o La deuxime manire dutiliser des tableaux comme arguments dune procdure consiste transmettre leurs dimensions via les arguments de la procdure.
function produit_scalaire(vec1,vec2,n) integer,intent(in) :: n real,dimension(1:n),intent(in) :: vec1,vec2 real :: produit_scalaire real,dimension(1:2*n) :: temp produit_scalaire = sum(vec1*vec2)

end function produit_scalaire

o Le n peut tre utilis pour dfinir des variables locales.


183

Tableaux transmis en argument : Profil implicite (1/2)


o La manire la plus souple dutiliser des tableaux comme arguments dune procdure consiste laisser leurs dimensions libres.
function produit_scalaire(vec1,vec2) real,dimension(:),intent(in) :: vec1,vec2 real :: produit_scalaire

produit_scalaire = sum(vec1*vec2)

end function produit_scalaire

Pour utiliser une procdure recevant en argument un tableau de profil implicite, linterface doit tre connue!
184

Tableaux transmis en argument : Profil implicite (2/2)


o Rcupration de ltendue au sein de la procdure
Possible avec linstruction size

function produit_scalaire(vec1,vec2) real,dimension(:),intent(in) :: vec1,vec2 real :: produit_scalaire real,dimension(1:2*size(vec1)) :: temp produit_scalaire = sum(vec1*vec2) end function produit_scalaire

185

Tableaux transmis en argument : Exemple

186

Les chanes de caractres transmises en argument (1/2)


o Fortran 90 accepte quun argument de type chane de caractres possde une longueur indtermine quon indique par le caractre *. La longueur effective de la chane sera dtermine lors de lappel.
function mise_en_forme(chaine) character(len=*),intent(in) :: chaine character(len=len(chaine)+4) :: mise_en_forme La longueur de la chane de caractres peut tre rcupre de cette manire.

mise_en_forme = trim(adjustl(chaine))//'.dat'

end function mise_en_forme

187

Les chanes de caractres transmises en argument (2/2)

188

Fonctions fournissant un tableau en rsultat (1/2)


o Le rsultat dune fonction peut tre un tableau o Les dimensions du tableau sont soit :
des constantes des valeurs transmises explicitement via les arguments de la fonction des valeurs transmises implicitement par la procdure qui fait appel cette fonction
function transform(vecteur) real,dimension(:),intent(in) :: vecteur real,dimension(1:size(vecteur)) :: transform integer :: i do i = 1,size(vecteur) transform(i) = i*vecteur(i) end do end function transform
189

Fonctions fournissant un tableau en rsultat (2/2)

190

Procdures transmises en argument (1/3)


o Notion dargument procdure
subroutine sousroutine(x,y,proc) x = 3.0 + proc(y) end subroutine sousroutine call sousroutine(a,b,fc)

o Il faut faire savoir au compilateur que fc est effectivement une procdure. Il existe deux dmarches :
introduire la dclaration : external fc (Fortran 77) dclarer linterface de fc (Fortran 90). Par cette voie, on dclare que fc est une fonction mais on prcise aussi la nature de ses arguments (plus grande fiabilit du code).

191

Procdures transmises en argument (2/3)


function integ(xi,xf,n,f) implicit none real,intent(in) :: xi,xf integer,intent(in) :: n interface function f(x) real,intent(in) :: x real :: f end function f end interface real :: integ real :: dx integer :: i dx = (xf-xi)/real(n) integ = dx*(0.5*(f(xi)+f(xf)) + sum( (/(f(xi+i*dx), i=1,n-1)/) )) end function integ
192

Linterface de la fonction integ doit reprendre cet ensemble de dclarations


function f(x) real,intent(in) :: x real :: f f = x*sin(x) end function f

Procdures transmises en argument (3/3)

Intrinsic indique au compilateur que sin est la fonction intrinsque connue du Fortran

193

Arguments optionnels (1/2)


o Par un mcanisme appropri, il est possible la procdure
de savoir si un tel argument lui a ou non t fourni lors de lappel, et, de prendre les dispositions ncessaires

o Les arguments optionnels sont dclars avec lattribut optional. o Linstruction present valeur logique permet de savoir si largument optionnel est prsent dans lappel la procdure.
function y(x,n) real,intent(in) :: x integer,intent(in),optional :: n real :: y integer :: n$ n$ = 1 if (present(n)) n$ = n y = x**n$ end function y
194

Arguments optionnels (2/2)

if (.not.present(deb)) deb = 1

Incorrect car deb est dclar avec lattribut intent(in)


195

Procdures rcursives
o On peut avoir besoin de raliser des procdures rcursives :
rcursivit directe : une procdure comporte au moins un appel ellemme, rcursivit croise : une procdure appelle une autre procdure qui, son tour, appelle la premire (cycle pouvant comporter plus de 2 proc.).
recursive function fac(n) result(res) integer,intent(in) :: n integer :: res if (n.le.1) then res = 1 then res = fac(n-1)*n end if end function fac Obligatoire dans le cas de fonctions.

Les fonctions rcursives sont peu efficaces


196

Chapitre 12. Les modules : Notions avances

Procdures gnriques : Principe


o Si lon considre une fonction prdfinie telle que abs, on constate quelle peut recevoir indiffremment un argument de type integer ou un argument de type real (Chap3, p40). La fonction est dite gnrique.
A un nom unique correspondent plusieurs fonctions chacune portant un nom et une interface spcifiques.

o Cette possibilit de regrouper sous un seul nom toute une famille de procdures peut sappliquer des procdures dfinies par le dveloppeur. o La dmarche sera :
dfinir les diffrentes procdures de la famille crire un bloc dinterfaces particulier qui spcifie le nom gnrique et les interfaces des diffrentes procdures de la famille. Cette tape sera mise en uvre par lintermdiaire de module.
198

Procdures gnriques : Interfaces gnriques (1/2)


interface sin_card function sin_card_sp(x) real(kind=4),intent(in) :: x real(kind=4) :: sin_card_sp end function sin_card_sp function sin_card_dp(x) real(kind=8),intent(in) :: x real(kind=8) :: sin_card_dp end function sin_card_dp end interface sin_card version double prcision version simple prcision nom gnrique

o Cette interface peut tre incluse dans la procdure qui utilise sin_card ou dans un module list_interface.
use list_interface, only: sin_card
199

Procdures gnriques : Interfaces gnriques (2/2)

200

Procdures gnriques : Procdures de module (1/3)


module module_sin_card interface sin_card module procedure sin_card_sp, sin_card_dp end interface sin_card contains function sin_card_sp(x) real(kind=4),intent(in) :: x real(kind=4) :: sin_card_sp end function sin_card_sp function sin_card_dp(x) real(kind=8),intent(in) :: x real(kind=8) :: sin_card_dp end function sin_card_dp end module module_sincard
201

nom gnrique

version simple prcision

version double prcision

Procdures gnriques : Procdures de module (2/3)


o On fait ensuite rfrence ce module avec linstruction
use module_sin_card

o Les noms gnriques peuvent concider avec le nom de fonctions intrinsques du Fortran (overloading). o Les procdures regroupes sous un nom commun doivent toutes tre des sous-routines ou toutes tre des fonctions.

202

Procdures gnriques : Procdures de module (3/3)

203

Dfinition doprateurs : Principe


o En Fortran 90, il devient possible de :
donner une signification tout symbole opratoire existant (+,,*,/,<,>,.and.,) lorsquil porte sur des types diffrents de ceux pour lesquels il est dj dfini. crer de nouveaux oprateurs (de la forme .op. o op dsigne une suite quelconque de caractres).

o Dans les deux cas, on utilise le mme mcanisme, savoir quon dfinit une fonction gnrique de nom operator (op), op dsignant loprateur concern (+, *, .and., .plus.,) avec :
deux arguments (intent(in)), sil sagit dun oprateur deux oprandes un argument (intent(in)) sil sagit dun oprateur un oprande.

204

Dfinition doprateurs : Implmentation


module module_cross interface operator (.cross.) module procedure cross end interface contains function cross(vec1,vec2) use kinds real(kind=r),dimension(1:3),intent(in) :: vec1,vec2 real(kind=r),dimension(1:3) :: cross cross(1) = vec1(2)*vec2(3) vec1(3)*vec2(3) cross(2) = vec1(3)*vec2(1) vec1(1)*vec2(3) cross(3) = vec1(1)*vec2(2) vec1(2)*vec2(1) end function cross end module module_cross
205

nom de loprateur nom de la fonction qui implmente loprateur

Dfinition de la fonction cross qui implmente loprateur .cross.

Dfinition doprateurs : Utilisation


o Pour utiliser loprateur .cross., il suffit alors dcrire
use module_cross

o Il faut noter que .cross. correspond au nom de loprateur et cross au nom de la fonction qui limplmente. Le choix de ces noms est indpendant. o De manire similaire ce qui a t vu prcdemment, on peut dfinir un cross_sp et un cross_dp pour traiter la simple et la double prcision. Loprateur .cross. devient alors un oprateur gnrique pour ces deux cas de figure.

206

Dfinition doprateurs : Exemple

207

Dfinition doprateurs : Extension doprateurs (1/2)


o On insistera nouveau sur le fait quon peut tendre la porte doprateurs intrinsques du Fortran.

o Par contre, on ne peut jamais remplacer des cas de figure dj implments.

o Par exemple, on peut tendre la porte de loprateur + pour traiter des structures composites, mais il nest pas permis de redfinir laction du + entre deux nombres rels.

208

Dfinition doprateurs : Extension doprateurs (2/2)

209

Surdfinition de laffectation
o Il est galement possible dtendre la porte du signe daffectation (=) ou de crer ses propres oprations daffectations. o On utilise pour cela un bloc dinterface assignment (=). o Ici aussi, il nest pas permis de redfinir des cas dj implments.

210

Privatisation des ressources dun module


o Par dfaut, toutes les variables dfinies dans un module sont accessibles par les procdures qui y font appel. o On peut donner certaines variables lattribut private. Leur valeur nest alors utilisable que dans le module. Ces variables ne servent qu dfinir dautres variables contenues dans le module.
module atomic_units use kinds real(kind=r),parameter,private :: ec = 1.602189E-19_r, & em = 9.10953E-31_r, & hbar = 1.054589E-34_r, & eps0 = 8.85418782E-12_r, & real(kind=r),parameter :: rBohr = 4._r*pi*eps0*hbar**2/(em*ec**2) end module atomic_units
211

Chapitre 13. Les pointeurs

Notion de pointeurs
o Dfinition :
Un pointeur ne contient pas de donnes mais pointe vers une variable (scalaire ou tableau) o la donne est stocke, une cible. En Fortran, le pointeur est un alias contrairement au Pascal ou C o le pointeur indique ladresse mmoire de lobjet. Un pointeur na pas de stockage initial (rservation mmoire). La rservation est tablie quand le programme sexcute.

o Etats dun pointeur :


Indfini A la dclaration en tte de programme Nul Alias daucun objet Associ Alias dun objet appel cible

213

Dclaration des pointeurs et des cibles


o Les pointeurs et les cibles doivent tre dclars avec le mme type, le mme kind et le mme rang. o En ce qui concerne les attributs :
Les pointeurs reoivent lattribut : pointer Les cibles reoivent lattribut : target
integer,pointer :: p1 real(kind=r),dimension(:),pointer :: p2 character(len=80),dimension(:),pointer :: p3 type boite integer :: i character(len=5) :: t end type type(boite),pointer :: p4 integer, target :: n
214

Symbole => (1/2)


o Le symbole => sert affecter une valeur un pointeur.
p1 => p2 p1 prend ltat de p2

215

Symbole => (2/2)


1 4 7 10 20

M M M M 1 L L L L L L L L i a= M M M M M M M M 10
p(3)

216

Symbole = appliqu aux pointeurs


o Lorsque les deux oprandes de = sont des pointeurs, laffectation seffectue sur les cibles et non sur les pointeurs.

217

Allocation dynamique de la mmoire


o Linstruction allocate permet dassocier un pointeur et dallouer dynamiquement de la mmoire. o Linstruction deallocate permet de librer la place alloue.
character(len=80),pointer :: p character(len=80) :: ch1, ch2 if (ch1.gt.ch2) then allocate(p) p = ch1 ch1 = ch2 ch2 = p deallocate(p) end if
218

Interrogation et comparaison de pointeurs


o Il nest pas possible de comparer des pointeurs, cest la fonction intrinsque associated qui remplit ce rle
associated(<pointeur1> [,<pointeur2>]) associated(<pointeur>,<cible>)

vrai si p est associ une cible associated(p) faux si p est ltat nul

associated(p1,p2)

vrai si p1 et p2 sont associs la mme cible

associated(p1,c)

vrai si p1 est alias de c

219

Instruction NULLIFY
o Au dbut dun programme un pointeur nest pas dfini, son tat est indtermin. Linstruction nullify permet de forcer un pointeur ltat nul.
real,pointer :: p1,p2 nullify(p1) nullify(p2)

o Remarques :
Si deux pointeurs p1 et p2 sont alias de la mme cible, nullify(p1) force le pointeur p1 ltat nul, par contre le pointeur p2 reste alias de sa cible. Si p1 est ltat nul, linstruction p2 => p1 force p2 ltat nul.

220

Chapitre 14. Notions lmentaires doptimisation

Motivation
o Loptimisation est la pratique qui consiste gnralement rduire :
le temps dexcution dune fonction, lespace occup par les donnes et le programme.

o On peut optimiser plusieurs niveaux un programme :


Algorithme : choisir un algorithme de complexit infrieure au sens mathmatique et des structures de donnes adaptes. Cours dapproche numrique Bac3 Langage : ordonner au mieux les instructions et utiliser les bibliothques disponibles.

o Rgle 0 :
Loptimisation (Langage) ne doit intervenir quune fois que le

programme fonctionne et rpond aux spcifications fonctionnelles.


222

Mesurer le temps dexcution (1/2)


o Avant de commencer loptimisation, il faut savoir mesurer la vitesse du code.
program main real(kind=4) :: time1,time2 call cpu_time(time1) call cpu_time(time2) print *, temps execution (s) : , time2-time1 end program main

223

Mesurer le temps dexcution (2/2)

224

Comment acclrer un programme ?


o Au niveau langage, on peut se tenir trois grands principes :
Choisir les options de compilation Minimiser le nombre doprations Grer de manire optimale laccs la mmoire

225

Choix des options de compilation (1/3)


o Les compilateurs sont souvent capable de faire des optimisations locales. o Avec Developer Studio, deux possibilits :
Aller dans Build\Set Active Configuration Choisir Release plutt que Debug. Aller dans Project\Settings\Fortran\Category:Optimizations o des options plus avances sy trouvent.

226

Choix des options de compilation (2/3)

227

Choix des options de compilation (3/3)

228

Minimisation des oprations (1/2)


o Le deuxime grand principe consiste :
Nettoyer les boucles Sortir des boucles les calculs qui peuvent tre raliss en dehors de celles-ci. Dfinir des variables intermdiaires Dfinir des variables contenant des sommes ou des produits partiels plutt que reproduire inutilement le calcul de ces quantits.

Lobjectif est de rduire le temps CPU.

229

Minimisation des oprations (2/2)

230

Gestion de laccs la mmoire (1/2)


o Le troisime grand principe consiste accder aux lments dun tableau dans leur ordre naturel.
matrice(1,1) matrice(2,1) matrice(3,1) matrice(1,2) matrice(2,2) matrice(3,2) matrice(1,3) matrice(2,3) matrice(3,3) do j=1,n do i=1,n u=matrice(i,j) end do end do do i=1,n do j=1,n u=matrice(i,j) end do end do

efficace

inefficace

Lobjectif est de rduire le temps daccs la mmoire.


231

Gestion de laccs la mmoire (2/2)


Ecriture Ax = 0.0 do i = 1,n do j =1,n Ax(i) = Ax(i)+A(i,j)*x(j) end do end do Ax = matmul(A,x) Ax = 0.0 do j = 1,n do i =1,n Ax(i) = Ax(i)+A(i,j)*x(j) end do end do Ax = 0.0 do j =1,n Ax(:) = Ax(:)+A(:,j)*x(j) end do Debug Release

n = 8000

1.20 s

0.91 s

1.04 s

0.89 s

0.86 s

0.31 s

0.74 s

0.31 s
232

Chapitre 15. Excution en lignes de commandes

Ouvrir une fentre dinvite de commandes


o Sous Windows :
Dmarrer\(Tous les)Programmes\Accessoires\Invite de commandes Dmarrer\Excuter cmd

234

Instructions de base DOS


o c:, d:, : changer de disque o cd : changer de rpertoire
cd dir1 : aller dans le rpertoire dir1 cd dir1\dir2 : aller dans le rpertoire dir1, ensuite dans le rpertoire dir2 cd .. : remonter dun niveau dans larborescence des rpertoires

o o o o o o

dir : affiche le contenu du rpertoire courant mkdir : crer un rpertoire copy : copier des fichiers move : dplacer des fichiers ou des rpertoires del : effacer des fichiers help : obtenir laide sur les instructions disponibles et leurs options (Exemple : help, help dir)
235

Excution : Rpertoire courant


o On peut lancer un excutable en lignes de commandes en crivant son nom. Cet excutable doit se trouver dans le rpertoire courant.

236

Excution : Rpertoire indiqu par PATH (1/3)


o On peut lancer un excutable en lignes de commandes en crivant son nom. Cet excutable doit se trouver dans le rpertoire indiqu par la variable denvironnement PATH.

237

Excution : Rpertoire indiqu par PATH (2/3)


o Pour modifier cette variable denvironnement:
Poste de Travail\[clic droit]\Proprits Avanc Variables denvironnement Slectionner PATH Modifier

238

Excution : Rpertoire indiqu par PATH (3/3)


o Vous pouvez indiquer dans le Developer Studio le rpertoire destin recevoir lexcutable.
Project\Settings\Link\Output file name :

239

Rcupration darguments (1/2)


o Nombre darguments :
<result> = nargs()

Result :
o variable de type INTEGER(4) qui retourne le nombre darguments en incluant la commande elle-mme. Par exemple, nargs retourne 4 pour PROG g c a

o Argument de la ligne de commande :


call getarg(<n>,<buffer> [,<status>])

n:
o variable de type INTEGER(2) qui donne la position de la commande rechercher. La commande elle-mme est largument 0.

buffer :
o variable de type CHARECTER(*) qui donne largument recherch.

status :
o variable de type INTEGER(2) qui donne le nombre de caractres de largument. En cas derreur, status vaut -1.
240

Rcupration darguments (2/2)

241

Appel de commandes DOS en Fortran


o Linstruction call system("<commande>") permet dexcuter des commandes DOS en Fortran.
call system(" dir > fichier.dat")

call system ("Graph.exe")

242

Fin

243

You might also like