Escolar Documentos
Profissional Documentos
Cultura Documentos
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/
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
Dclaration des objets utiliss Informations utiles la compilation Toujours prcder les instructions excutables
o Instructions excutables:
Oprations mathmatiques Lecture/criture de fichiers Appel des sous-programmes
Instructions excutables
Instructions de dclaration
Le Fortran ne distingue pas les majuscules des minuscules sauf dans les chanes de caractres.
Racine racine 'Racine' 'racine'
8
Mais, il est possible de placer plusieurs instructions sur une mme ligne en les sparant par ;
print *, 'donnez un nombre' ;read *, n
9
11
o Format :
Le format fixe correspond au format du fortran 77 avec 2 extensions:
o Les instructions multiples o La nouvelle forme de commentaires
13
14
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 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
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
Nombre reprsent : r = s1.m 2e-1023 64 bits (8 octets): 2.2 10-308 |x| 1.8 10308 Prcision : 16 chiffres significatifs
19
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
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)
Le type LOGICAL
23
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
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
25
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
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
29
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
31
Introduction
o Linstruction daffectation se prsente sous la forme:
<variable> = <expression>
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
35
36
x + real(n)/real(p)
15.
0.05
38
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
o Rgle :
a (ou rien) real, d double precision, i integer, c complex
40
41
42
43
o Fortran distingue les minuscules des majuscules (ordre voir code ASCII).
44
45
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
47
!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
49
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 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
52
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
54
o exp_log : expression de type LOGICAL o nom : identificateur o bloc : ensemble dinstructions simples et/ou structures
55
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
case default !sexcute dans tous les autres cas end select
57
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
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
i= 1 i= 3 i= 5
60
61
62
63
64
65
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
67
Notions gnrales
o Les tableaux englobent les notions de
vecteur (tableau 1-D) matrice (tableau 2-D) grille (tableau 3-D et plus)
70
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
o Les indices prennent la forme de nimporte quelle expression arithmtique de type INTEGER.
t(3*p-1)
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
efficace
do j=1,n do i=1,n u=matrice(i,j) end do end do do i=1,n
inefficace
1. 4. t = 2. 5. 3. 6.
1. 2. t = 3. 4. 5. 6.
76
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
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
o Fonctions lmentaires :
Oprations ralises en prenant chaque lment individuellement
mat1 = exp(mat2) !Ceci nest pas lexponentiel dune matrice
79
80
82
83
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
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
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>)
vrai
o option : dim
count(mat.ge.0) 9
1. 4. 7. mat = 2. 5. 8. 3. 6. 9.
88
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
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>)
90
o vec1, vec2 : tableaux de rang 1, de mme taille et de types numriques ou logiques [any(vec1.and.vec2)]
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>)
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. /)
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.
reshape
o changement de forme (cfr prcdemment)
93
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
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
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
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
o w : nombre de caractres (chiffres, point dcimal, signe, blancs) o d : nombre de chiffre dcimaux
101
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
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
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
^^^^^^^^^n=^^^5^^^^p=^23 ^^p=^23^^^^^^^^^^^^n=^^^5
105
o Accessibilit :
Squentiel : lecture de tous les enregistrements prcdents Direct : Ordre de lecture/criture indique lenregistrement traiter.
107
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
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
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
111
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
113
o Gestion des erreurs avec les paramtres iostat et err (voir lecture)
114
115
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
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
118
Conversion en chane
character(len=80) :: tab real :: x=3.54 write(tab,("x : ",f8.3)) x write(*,*) tab x : 3.540
119
121
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
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
Les sous-routines
o Entre : un ou plusieurs arguments o Sortie : un ou plusieurs arguments
124
Instructions de dclaration et instructions excutables du programme principal Procdures internes ayant accs toutes les variables du programme principal (sauf si noms identiques)
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
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.
: Instructions excutables
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
129
130
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
132
133
Lutilisation de lattribut INTENT est vivement conseill pour fiabiliser les codes
A dcouvrir ultrieurement!
135
Le nom des actual arguments ne doit pas ncessairement tre le mme que celui des dummy arguments.
136
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
138
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
= 1.602189d-19, &
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
144
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
146
o Utilisation :
Tout le module : use list_int Certaines procdures (pref.) : use list_int, only: masse
148
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
150
151
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
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
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
157
Exemple
159
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
162
Ligne 25 y Colonne 1
163
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
164
165
La fentre de reprsentation est restreinte au rectangle sous-tendu par les points (0,0) et (100,300) par rapport au systme physique.
166
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
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.
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
dummy2 et color sont de type INTEGER(kind=2) color correspond des valeurs prdfinies prises entre 0 et 16.
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
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
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
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
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
180
produit_scalaire = sum(vec1*vec2)
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
182
produit_scalaire = sum(vec1*vec2)
Pour utiliser une procdure recevant en argument un tableau de profil implicite, linterface doit tre connue!
184
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
186
mise_en_forme = trim(adjustl(chaine))//'.dat'
187
188
190
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
Intrinsic indique au compilateur que sin est la fonction intrinsque connue du Fortran
193
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
if (.not.present(deb)) deb = 1
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.
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
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
200
nom gnrique
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
203
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
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
207
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
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
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.
213
215
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
217
vrai si p est associ une cible associated(p) faux si p est ltat nul
associated(p1,p2)
associated(p1,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
Motivation
o Loptimisation est la pratique qui consiste gnralement rduire :
le temps dexcution dune fonction, lespace occup par les donnes et le programme.
o Rgle 0 :
Loptimisation (Langage) ne doit intervenir quune fois que le
223
224
225
226
227
228
229
230
efficace
inefficace
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
234
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
236
237
238
239
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
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
241
242
Fin
243