Documente Academic
Documente Profesional
Documente Cultură
Lauren e Viry
CCH
2
Table des matieres
1 Introdu
tion 11
1.1 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2 Nouveautes de la norme Fortran90 . . . . . . . . . . . . . . . . . . . . . . . 12
1.3 Cara
teristiques obsoletes de la norme Fortran90 . . . . . . . . . . . . . . . 13
1.4 Evolution vers la norme Fortran95 . . . . . . . . . . . . . . . . . . . . . . . 13
1.5 Cara
teristiques obsoletes de la norme Fortran95 . . . . . . . . . . . . . . . 14
1.6 Cara
teristiques supprimees de la norme Fortran95 . . . . . . . . . . . . . . 14
2 Generalites 15
2.1 Elements syntaxiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.1 Les identi
ateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.2 Formats du
ode sour
e . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.3 Commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.4 Con
ept de type en Fortran 90 . . . . . . . . . . . . . . . . . . . . . 17
2.1.5 Variables s
alaires : De
laration . . . . . . . . . . . . . . . . . . . . . 17
2.1.6 Initialisation a la de
laration . . . . . . . . . . . . . . . . . . . . . . 19
2.1.7 Con
ept de sous-type : pre
ision des nombres . . . . . . . . . . . . . 19
2.1.8 Constantes litterales d'un type intrinseque . . . . . . . . . . . . . . . 20
2.1.9 Fon
tions intrinseques liees au sous-type . . . . . . . . . . . . . . . . 21
3
4
TABLE DES MATIERES
4 Types derives 35
4.1 Introdu
tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2 Denition et de
laration de stru
ture . . . . . . . . . . . . . . . . . . . . . . 35
4.2.1 Denition du type PERSONNE . . . . . . . . . . . . . . . . . . . . . 35
4.2.2 De
laration d'un objet de type PERSONNE . . . . . . . . . . . . . . 36
4.2.3 Tableau de type derive . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3 Constru
teur de stru
ture . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3.1 Constante litterale de type PERSONNE . . . . . . . . . . . . . . . . 36
TABLE DES MATIERES 5
4.3.2 Initialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.4 Operateur d'a
es a une
omposante . . . . . . . . . . . . . . . . . . . . . . 37
4.5 Operateurs sur des objets de type derive . . . . . . . . . . . . . . . . . . . . 37
4.6 Attribut SEQUENCE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.7 Type derive et pro
edures . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.8 Quelques limites d'utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.9 Type derive - Langage oriente objet . . . . . . . . . . . . . . . . . . . . . . 41
5 Extensions tableaux 43
5.1 Introdu
tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.1.1 Denition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.1.2 De
laration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2 Sto
kage en memoire d'un tableau . . . . . . . . . . . . . . . . . . . . . . . 44
5.3 Constru
teur de tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.4 Manipulation de tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.4.1 Manipulation globale d'un tableau . . . . . . . . . . . . . . . . . . . 46
5.4.2 Manipulation de se
tions de tableaux . . . . . . . . . . . . . . . . . 46
5.5 Tableau en argument de pro
edure . . . . . . . . . . . . . . . . . . . . . . . 47
5.5.1 Tableau a prol impli
ite . . . . . . . . . . . . . . . . . . . . . . . . 47
5.5.2 Se
tion de tableau en argument de pro
edure . . . . . . . . . . . . . 49
5.5.3 Tableau de taille nulle . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.6 Gestion de memoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.6.1 Tableaux automatiques . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.6.2 tableaux dynamiques(allo
atable, prol diere) . . . . . . . . . . . . 52
5.7 Instru
tion et
onstru
tion WHERE . . . . . . . . . . . . . . . . . . . . . . 53
5.8 Fon
tions intrinseques sur les tableaux . . . . . . . . . . . . . . . . . . . . . 54
6
TABLE DES MATIERES
6 Pointeurs 59
6.1 Introdu
tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.2 De
laration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.3 Etat d'un point pointeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.3.1 Denitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.3.2 Fon
tion intrinseque : ASSOCIATED . . . . . . . . . . . . . . . . . 60
6.4 Allo
ation dynamique de memoire . . . . . . . . . . . . . . . . . . . . . . . 60
6.5 Instru
tion NULLIFY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.6 Pointeurs dans les ae
tations et les expressions . . . . . . . . . . . . . . . . 61
6.6.1 Operateur "=" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.6.2 Ae
tation de pointeur : operateur "=>" . . . . . . . . . . . . . . . 62
6.6.3 Attribut TARGET . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.6.4 Ae
tation de pointeur sur une
omposante de stru
ture . . . . . . . 63
6.7 Argument de pro
edure de type pointeur . . . . . . . . . . . . . . . . . . . . 64
6.8 Resultat d'une fon
tion de type pointeur . . . . . . . . . . . . . . . . . . . . 65
6.9 Tableaux de pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.9.1 Denition - De
laration . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.9.2 Tableaux utilises
omme alias . . . . . . . . . . . . . . . . . . . . . . 66
7 Interfa
e 69
7.1 Interfa
e de pro
edure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
7.1.1 Denition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
7.1.2 Erreurs non dete
tees a la
ompilation :
as d'une interfa
e impli
ite 70
7.1.3 Interfa
e "expli
ite" : pro
edure interne . . . . . . . . . . . . . . . . 71
7.1.4 Interfa
e "expli
ite" : blo
interfa
e . . . . . . . . . . . . . . . . . . 71
7.1.5 Interfa
e "expli
ite" : module . . . . . . . . . . . . . . . . . . . . . . 72
TABLE DES MATIERES 7
8 Contr^ole de visibilite 85
8.1 Introdu
tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
8.2 Attributs PRIVATE et PUBLIC . . . . . . . . . . . . . . . . . . . . . . . . 85
8.3 Contr^ole de visibilite : type derive . . . . . . . . . . . . . . . . . . . . . . . 87
8.4 Type derive semi-prive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8.5 Parametre ONLY de l'instru
tion USE . . . . . . . . . . . . . . . . . . . . . 89
8
TABLE DES MATIERES
Introdu tion
1.1 Historique
On forma alors une equipe dirigee par John Ba
kus de la so
ite IBM, en vue de
developper un langage de programmation simple a
omprendre et aussi e
a
e, ou presque
qu'un langage d'assemblage. Ce f^ut la naissan
e du langage Fortran (FORmula TRANslation).
Les programmeurs etaient soulages (presque ! !) du fardeau que representait l'usage de l'as-
sembleur et pouvaient se
on
entrer sur leur probleme.
11
12 CHAPITRE 1. INTRODUCTION
par la publi
ation d'une nouvelle norme, en 1978,
onnue sous le nom de Fortran 77. La
periode de transition entre les deux normes fut plus longue qu'elle n'aurait d^u l'^etre, du
fait de retards dans la sortie des nouveaux
ompilateurs et les deux normes
oexisterent
longtemps.
Dans le milieu des annees 80, la re
onversion a Fortran 77 etait bien engagee alors que
Fortran 66 perdait
onsiderablement du terrain.
Apres 30 ans d'existen
e, Fortran n'est plus le seul langage de programmation dispo-
nible sur les ordinateurs. Il est reste predominant dans le domaine du
al
ul numerique a
l'usage des
her
heurs, des te
hni
iens et des ingenieurs. Dans le but de maintenir le langage
orre
tement a jour, le Comite te
hnique X3J3 a
redite par l'ANSI a elabore une nouvelle
norme
onnue sous le nom de Fortran 90.
IF arithmetique.
Bran
hement sur une instru
tion ENDIF depuis l'exterieur.
Variation de la syntaxe d'une bou
le DO
{ Partage d'une m^eme instru
tion par plusieurs bou
les DO.
{ Fins de bou
le DO autres que CONTINUE ou ENDDO.
{ Variables d'indi
e et instru
tions de
ontr^ole reels simple ou double pre
ision.
Instru
tion ASSIGN et l'instru
tion GOTO assigne.
ASSIGN d'une etiquette de FORMAT.
Instru
tion RETURN multiple.
Instru
tion PAUSE.
Des
ripteur d'edition H.
tribuees.
{ Instru
tion et
onstru
tion FORALL,
{ les attributs PURE et ELEMENTAL pour les pro
edures sans eet de bord,
{ la fon
tion intrinseque NULL() pour for
er un pointeur a l'etat non asso
ie,
{ fon
tion utilisateur dans les expressions de spe
i
ation,
{ extension de la
onstru
tion WHERE : blo
s imbriques,
{ fon
tion intrinseque CPU TIME,
{ liberation des tableaux dynamiques lo
aux n'ayant pas l'attribut SAVE,
{ initialisation par defaut pour les objets de type derive,
{ extension des fon
tions intrinseques CEILING, FLOOR,MAXLOC, MINLOC,
{ Commentaire dans les spe
i
ations de NAMELIST,
{ modi
ations pour s'adapter a IEEE 754/854.
Generalites
Les noms utilises pour designer les dierentes entites sont des suites de 1 a 31
a-
ra
teres alphanumeriques (lettres,
hires, "unders
ore") dont le premier doit ^etre
une lettre.
On ne distingue pas les minus
ules et les majus
ules.
Il n'y a pas de mot reserve en Fortran 90. Dans l'absolu, on peut utiliser les mots-
les
omme REAL, INTEGER, IF ...
omme identi
ateurs. Ce qui n'est pas
onseille au
regard de la lisibilite du
ode.
Exemples :
a
A_thing
X1
REAL
TIME_OF_FLIGHT
{ Noms non valides :
15
16 ERALIT
CHAPITRE 2. GEN
ES
{ les instru
tions d'un programme sont e
rites sur des lignes d'au plus 132
ara
teres.
{ les
ara
teres blan
s en t^ete de ligne ne sont pas signi
atifs.
{ Il est possible de
oder plusieurs instru
tions sur la m^eme ligne.
{ Une instru
tion peut ^etre
odee sur plusieurs lignes, on utilisera alors le
ara
tere
esperluette "&".
{ Lors de la
oupure d'une
ha^ne de
ara
teres, la suite de la
ha^ne de
ara
teres doit
^etre pre
edee par "&".
Exemples :
Format xe :
Le format xe de Fortran 90
orrespond a l'an
ien format du Fortran 77 ave
deux
extensions :
{ plusieurs instru
tions possibles sur une m^eme ligne,
{ nouvelle forme de
ommentaire (voir plus loin).
Son prin
ipal inter^et est d'assurer la
ompatibilite ave
Fortran 77.
2.1.3 Commentaires
Fortran 90 ore la possibilite d'inserer des
ommentaires dans les instru
tions. Le
hamp
de
ommentaire devra
ommen
er par le
ara
tere " !", et se termine a la n de la ligne.
Quelques regles :
{ toute ligne dont le premier
ara
tere autre que le
ara
tere blan
est " ! " est
onsidere
omme un
ommentaire,
{ un
ommentaire peut
ontenir n'importe quel
ara
tere en parti
ulier "&". Par
onsequent,
un
ommentaire ne peut avoir de suite,
2.1. ELEMENTS SYNTAXIQUES 17
{ une ligne ommentaire peut ^etre inter alee entre des lignes suites.
Attention :
C Commentaire Fortran 77
Commentaire Fortran 77
? Commentaire Fortran 77
ne sont pas des
ommentaires en Fortran 90 (format libre) et provoquent des erreurs a la
ompilation.
Exemples :
! on lit l'exposant
read*,x
! on lit la base
read*,y
if (y <= 0) then ! Cas d'erreur
print*,'la base y doit etre positive'
else
z=y**x ! On
al
ule la puissan
e
end if ! fin de la bou
le if (y <= 0)
Exemples :
integer nb
ol,nblign
real val1,val2
integer,save ::
ompteur
integer,parameter :: n=5
double pre
ision a(100)
double pre
ision,dimension(100) :: a
omplex,dimension(-1:3,0:5) ::
real, dimension(:),pointer :: ptr
Il est possible d'initialiser une variable au moment de sa de
laration. L'initialisation est
obligatoire lorsque l'objet a l'attribut parameter.
Exemples :
real somme=0.
integer, parameter :: n=5
integer,dimension(3) :: nbr=(/1,6,3/)
Attention :
En Fortran 77 toute variable initialisee n'est permanente que si l'attribut save ou pa-
rameter a ete spe
ie pour
ette variable, ou bien si la
ompilation a ete faite en mode
stati
.
Par
ontre en Fortran 90, toute variable initialisee a la de
laration re
oit impli
itement
l'attribut save.
Les types intrinseques en Fortran 90 sont en fait des noms generiques renfermant
ha
un
un
ertain nombre de sous-types que l'on peut sele
tionner a l'aide du parametre KIND
lors de la de
laration des objets.
Ce parametre est un mot-
le a valeur entiere qui designe le sous-type souhaite pour un
type donne.
Les dierentes valeurs du parametre KIND sont dependantes du systeme utilise. Elles
orrespondent en general, au nombre d'o
tets desires pour
oder l'objet de
lare. L'ordre de
grandeur et la pre
ision sont garantis si l'on spe
ie un parametre de sous-type.
A
haque type
orrespond un sous-type par defaut, sele
tionne en l'absen
e du parametre
KIND dans la de
laration :
'est par exemple, la simple pre
ision pour les reels.
En
e qui
on
erne les
ha^nes de
ara
teres,
ette valeur indique le nombre d'o
tets utilises
pour
oder
haque
ara
tere.
Exemples :
20 ERALIT
CHAPITRE 2. GEN
ES
Exemples :
{ entiers :
1 ! sous-type par defaut
-999 ! sous-type par defaut
72
{ reels :
1.0 ! sous-type reel simple pre
ision
1.d0 ! sous-type reel double pre
ision
1.0 8
integer, parameter : : styp=4
275.2 styp
{
omplexe :
(1.,3.2) ! sous-type par defaut
(1,.99E-2)
(1.0,3.7 4)
{
ara
tere :
'une table' ! sous-type par defaut
'unetable' ! sous-type par defaut
'Il dit "bonjour"' ! sous-type par defaut
1 'prenom'
2 'prenom'
integer,parameter : : kanji=2
kanji ' '
L'alphabet "kanji"
ontient plus de
ara
teres qu'il n'est possible d'en
oder sur un
seul o
tet.
{ logique
2.1. ELEMENTS SYNTAXIQUES 21
Fortran 90 fournit des fon
tions intrinseques qui permettent de rendre portable les
hoix de pre
isions et d'etendue faits dans un programme.
sele
ted int kind(r) : re
oit en argument un entier r et retourne un parametre de sous-
type permettant de representer les entiers n tels que :
10r < n < 10r
Elle retourne -1 si au
un parametre de sous-type ne repond a la demande.
Exemples :
sele
ted real kind(p,r) : Re
oit deux arguments p et r qui sont respe
tivement la
pre
ision et l'etendue desirees et renvoie un parametre de sous-type permettant
de representer les reels repondant a la demande. Un seul de
es deux arguments est
obligatoire.
Exemples :
a=sele
ted_real_kind(8)
b=sele
ted_real_kind(9,99)
integer, parameter :: pre
= &
sele
ted_int_kind(12,50)
real(kind=pre
),save :: x
real(pre
), save :: x
x=234.56_pre
En outre, il existe deux fon
tions d'interrogation qui retournent respe
tivement la pre
ision
et l'etendue d'une entite reelle.
range(a) : re
oit un entier ou un reel et retourne pour le sous-type asso
ie la valeur
minimale r telle que :
j
entier j < 10r
10 r
< j
r eel j < 10
r
pre
ision(a) : re
oit un reel et retourne la pre
ision de
imale ( nombre de
hires signi-
atifs de
imaux) pour le sous-type asso
ie.
Exemples :
range(5_2)
range(1.0d0)
range(1._8)
pre
ision(1.0)
pre
ision(1.0d0)
[PROGRAM nom-programme
[instru
tions de spe
i
ation
[instru
tions exe
utables
[CONTAINS
pro
edures internes
END [ PROGRAM [nom-programme
{ L'instru
tion PROGRAM est fa
ultative (
onseillee)
{ L'instru
tion END qui genere l'arr^et du programme est la seule instru
tion non fa-
ultative. Si elle
ontient un
hamp nom-programme, il devra
orrespondre a
elui
present dans l'instru
tion PROGRAM. Elle peut ^etre etiquetee et ^etre la
ible d'une
instru
tion de bran
hement (a eviter).
{ Les instru
tions de spe
i
ation peuvent ^etre des instru
tions de de
laration, des
denitions de type, des blo
s INTERFACE.
{ L'instru
tion CONTAINS indique la presen
e d'une ou plusieurs pro
edures.
La pro
edure externe est appelee depuis une autre unite de programme. Elle a une forme
similaire a
elle du programme prin
ipal.
24 ERALIT
CHAPITRE 2. GEN
ES
program jeu
....
all battre
all distribuer
all jouer
all affi
her
end program jeu
2.2.4 Module
La forme generale d'un module est la suivante :
Exemple :
module etat
integer,dimension(52) ::
artes
end module etat
instru
tion-subroutine
[instru
tions de spe
i
ation
[instru
tions exe
utables
END SUBROUTINE [nom-de-fon
tion
{ Une pro
edure interne ne peut pas
ontenir de pro
edure interne.
26 ERALIT
CHAPITRE 2. GEN
ES
{ Une pro
edure interne a a
es a toutes les entites de l'unite h^ote, elle peut en parti-
ulier appeler toutes les pro
edures internes.
Chapitre 3
27
28 ^
CHAPITRE 3. STRUCTURE DE CONTROLE
instru
tion nale. La nouvelle syntaxe de la
onstru
tion DO elimine l'instru
tion CONTI-
NUE etiquetee.
Exemple :
do i=j+4,m,l(j)**2
somme=somme+a(i)
enddo
Exemple :
3.2. CONSTRUCTION DO 29
somme=0.; i=1
vrai: do while (tab(i) >= 0.)
somme=somme+sqrt(tab(i))
enddo vrai
Exemple :
read(unit=11,iostat=eof) a
do while (eof ==0)
...
read(unit=11,iostat=eof) a
...
enddo
Lorsque "expression-logique" est absente, on est en presen
e d'une bou
le innie. Il faut
un moyen pour sortir de
ette bou
le.
L'instru
tion EXIT permet de sortir d'une
onstru
tion DO.
EXIT [nom
[nom : est optionnel et permet de spe
ier la
onstru
tion dont on veut sortir
dans le
as de plusieurs
onstru
tions emboitees.
Exemple :
do
read*,nombre
if ( nombre == 0) exit
somme=somme+nombre
enddo
30 ^
CHAPITRE 3. STRUCTURE DE CONTROLE
L'instru
tion CYCLE transfere le
ontr^ole de l'exe
ution a l'instru
tion ENDDO de la
onstru
tion DO
on
ernee.
CYCLE [nom
Exemple :
do
read*,nombre
if ( eof /= 0) exit
if ( x <= 0.)
y
le
somme=somme+log(x)
enddo
Exemple1 :
impli
it none
integer :: i,l,m
real,dimension(10) :: tab
real :: som,som_max,res
!
som=0.0
som_max=1567.
exter: do i=1,n
read*,m,tab(1:m)
do i=1,m
all
al
ul(tab(i),res)
if (res < 0.)
y
le
somme=somme+res
if (somme > som_max) exit exter
enddo
enddo exter
3.2. CONSTRUCTION DO 31
Exemple2 :
b1: do i=1,n
do j=1,m
all sp(i+j,r)
if ( r < 0.)
y
le b1
enddo
enddo b1
Mais ATTENTION a :
do i=1,n
...
if(i .eq. j) exit
...
enddo
l : valeur de l'indi
e a la sortie de la bou
le.
si n 0 la bou
le n'est pas exe
utee.
l=1
si n j la sortie de bou
le intervient au niveau de l'instru
tion IF.
32 ^
CHAPITRE 3. STRUCTURE DE CONTROLE
l=j
si 0 n < j la bou
le est ee
tuee n fois.
l=n+1
Cet exemple indique a quel point il faut utiliser ave
pre
autions les indi
es de bou
le
a l'exterieur de la bou
le.
Exemples :
sele
t
ase(nombre)
ase(:-1) ! valeurs stri
tement negatives
n_sign=-1
ase(0)
n_sign=0
ase(1:) ! valeurs stri
tement positives
n_sign=1
end sele
t
3.3. CONSTRUCTION CASE 33
...
sele
t
ase(
h)
ase('
','d','e')
type_
h=.true.
ase('i':'n')
type_int=.true.
ase default
type_real=.true.
end sele
t
Types derives
Pour utiliser un objet de type derive, la premiere etape onsiste a denir e type derive.
Exemple :
35
36
CHAPITRE 4. TYPES DERIV
ES
TYPE PERSONNE
CHARACTER(LEN=16) : : NOM
REAL : : AGE
INTEGER,DIMENSION(3) : : DESCRIP
END TYPE
TYPE(PERSONNE) : : PERS
TYPE(PERSONNE),DIMENSION(3) : : TABPERS
...
4.3.2 Initialisation
integer,dimension(3) :: tabdes
type(personne),dimension(2) :: tpers
...
tpers(1)=personne('arsene',67.,(/1,15,154/))
...
tabdes=(/2,7,120/)
4.4. OPERATEUR A
D'ACCES UNE COMPOSANTE 37
tpers(2)=personne('eugenie',,80.,tabdes)
...
Exemple :
type(personne) :: vous
type(personne),dimension(2) :: tper
Exemple :
type(personne) :: vous,moi,frere
...
vous=frere ! valide
frere%age=vous%age + 7.
! differen
e d'age entre "vous" et "moi"
diff=vous%age - moi%age
38
CHAPITRE 4. TYPES DERIV
ES
TYPE STOCKAGE
SEQUENCE
INTEGER :: I
REAL :: A(0:999)
END TYPE
Une telle pratique peut ^etre sour
e d'erreur et n'ore au
un avantage de plus par rap-
port a une denition unique du type derive dans un module et a son utilisation a l'aide
d'une asso
iation par module (USE).
Ne denir qu'une seule fois un type derive est de loin la meilleure methode
pour eviter un grand nombre d'erreurs.
Si le type derive n'est pas deni de maniere unique via un module (maladroit), le type
de l'argument ee
tif et le type de l'argument formel doivent :
{ posseder tous les deux l'attribut SEQUENCE,
e qui assure un sto
kage dans le m^eme
ordre des
omposantes en memoire.
{ avoir le m^eme nom et la m^eme nature de
omposantes. Mais ils peuvent avoir des
noms de type dierents.
4.7. TYPE DERIV ET PROCEDURES
E 39
Exemple :
program identifi
ation
impli
it none
!
type personne
sequen
e
hara
ter(len=16) ::nom
real :: age
integer,dimension(3) ::des
rip
end type
!
type(personne),external :: mise_a_jour
type(personne) ::identif
!
identif=personne('arsene',15,(/10,25,247/))
!
identif=mise_a_jour(identif,1990,1997)
!
stop
end
!
fun
tion mise_a_jour(identif,annee1,annee2)
impli
it none
integer :: i,annee1,annee2
type pers
sequen
e
hara
ter(len=16) ::nom
real :: age
integer,dimension(3) ::des
rip
end type
type(pers) :: identif,mise_a_jour
!
mise_a_jour%age=identif%age+(annee2-annee1)
end fun
tion mise_a_jour
Programmation
onseillee : Une seule denition, dans un module, du type PERSONNE.
module mod_pers
type personne
hara
ter(len=16) ::nom
real :: age
integer,dimension(3) ::des
rip
40
CHAPITRE 4. TYPES DERIV
ES
end type
end module mod_pers
!
program identifi
ation
use mod_pers
impli
it none
!
type(personne),external :: mise_a_jour
type(personne) ::identif
!
identif=personne('arsene',15,(/10,25,247/))
!
identif=mise_a_jour(identif,1990,1997)
!
stop
end
!
fun
tion mise_a_jour(identif,annee1,annee2)
use mod_pers
impli
it none
integer :: i,annee1,annee2
type(personne) :: identif,mise_a_jour
!
mise_a_jour%age=identif%age+(annee2-annee1)
end fun
tion mise_a_jour
Sans ^etre un vrai langage oriente objet, Fortran 90 fournit ainsi des extensions objet bien
utiles pour la stru
turation du programme et sa abilite.
42
CHAPITRE 4. TYPES DERIV
ES
Chapitre 5
Extensions tableaux
43
44 CHAPITRE 5. EXTENSIONS TABLEAUX
Exemples :
1. real,dimension(-5 :4,0 :2) : : x
x est de rang 2, de prol(10,3)
2. real,dimension(0 :9,3) : : y
y est de rang 2, de prol(10,3)
Exemples :
{ (/2,7,5,1 /)
{ (/ ( I, I=1,4) /) qui produit (/ 1,2,3,4 /)
{ (/( I, I=2,8,2) /) qui produit (/ 2,4,6,8 /)
{ (/ ( I*I,I=1,4) /) qui produit (/ 1,4,9,16 /)
{ embo^tement de bou
les DO impli
ites
(/ (( I, I=1,3), J=1,2) /) qui produit (/ 1,2,3,1,2,3 /)
{
onstru
teur de stru
ture a l'interieur de
onstru
teur de tableaux (et inversement).
Exemples :
reshape(sour
e=(/ 1,2,3,4,5,6 /)), shape=(/ 2,3 /))
e qui donne : !
1 3 5
2 4 6
46 CHAPITRE 5. EXTENSIONS TABLEAUX
Exemples :
real,dimension(3,4) :: a,b
real,dimension(-1:1,-3:0) ::
,d
b=1.
=b.
a=b+1.
d=a(:,:) + b(:,:) +
(:,:)
{ un ve
teur d'indi
es lorsqu'on a une suite quel
onque d'indi
es du tableau initial.
L'ensemble des elements est deni par un ve
teur d'indi
es dont tous les elements
sont des entiers.
Exemples :
A(IPOINT) ! IPOINT est un tableau d'entiers
A(/1,7,3,2/) ! se
tion du tableau A
onstitue des elements A(1),A(7),A(3),A(2)
! dans
et ordre
Une m^eme valeur peut apparaitre plusieurs fois dans un ve
teur d'indi
e, on parlera
de se
tion non-univoque
Une se
tion non-univoque ne doit pas apparaitre dans la partie gau
he d'une instru
-
tion d'ae
tation.
Exemples :
A(/1,7,3,7/)=(/1,2,3,4/) ! illegal
Lorsque l'on passe un tableau en argument d'une pro
edure, il est souhaitable qu'argument
formel et argument ee
tif aient m^eme prol.
En Fortran77, la solution etait de transmettre les etendues des dimensions
omme argu-
ments supplementaires (Si le tableau etait de dimension r, les etendues des r-1 premieres
dimensions susaient, la derniere n'intervenant pas dans le
al
ul d'adresse).
Pour
ela, il faut que l'interfa
e soit expli
ite (voir dans le
hap^tre "Interfa
e" les
dierentes methodes pour denir une interfa
e expli
ite). Ce qui signie que le
ompilateur
onnait un
ertain nombre de renseignements au moment de l'appel de la pro
edure (type
de pro
edure, proprietes des arguments et du resultat dans le
as d'une fon
tion) et qu'il
48 CHAPITRE 5. EXTENSIONS TABLEAUX
Un tableau passe de
ette maniere en argument d'une pro
edure s'appelle un tableau a
prol impli
ite (assumed-shape array).
Exemple :
program stat
integer,parameter :: n=100
real,dimension(n) :: x
real :: moy,std
integer ::
tl
! Definition de l'interfa
e du sous-programme stat
interfa
e
subroutine stat(x,n,moy,std,
tl)
real,dimension(:,:) :: x
real :: moy,std
integer :: n,
tl
end subroutine stat
end interfa
e
...
all stat(x,n,moy,std,
tl)
...
end program stat
subroutine stat(x,n,moy,std,
tl)
real,dimension(:,:) :: x
real :: moy,std
integer :: n,
tl
...
print*,size(x,1),size(x,2)
end subroutine stat
On est dans le
as d'une interfa
e expli
ite, les
ara
teristiques du tableau "x" sont
onnues a l'interieur du sous-programme stat.
Remarque :
Dans le
as d'un tableau a prol impli
ite, pour le
ompilateur xlf90 du SP2, il y
a egalement transmission de la liste des bornes inferieures et superieures des indi
es du
tableau.
5.5. TABLEAU EN ARGUMENT DE PROCEDURE 49
Attention :
Si elle
onstitue un ensemble de valeurs non
ontigues en memoire, le
ompilateur devra
au prealable
opier
ette se
tion dans un tableau d'elements
ontigus passe a la pro
edure,
puis en n de traitement le re
opier dans la se
tion initiale...
Exemple :
program tab_se
t
impli
it none
real,dimension(100,100) ::a1,a2
integer :: i
integer ::
1,
2,
3
! interfa
e du sous-programme sub1
interfa
e
subroutine sub1(x)
impli
it none
real,dimension(:,:) :: x
end subroutine sub1
end interfa
e
! interfa
e du sous-programme sub2
interfa
e
subroutine sub2(x)
impli
it none
real,dimension(:,:) :: x
end subroutine sub2
end interfa
e
a1=1.;a2=a1
all system_
lo
k(
ount=
1)
do i=1,100
all sub1(a1(30:70,20:50))
enddo
all system_
lo
k(
ount=
2)
do i=1,100
50 CHAPITRE 5. EXTENSIONS TABLEAUX
all sub2(a2)
enddo
all system_
lo
k(
ount=
3)
print*,'temps sub1=',
2-
1,' temps sub2=',
3-
2
end program tab_se
t
!
! sous-programme sub1
!
subroutine sub1(x)
impli
it none
real,dimension(:,:) :: x
x=x*2.
end subroutine sub1
!
! sous-programme sub2
!
subroutine sub2(x)
real,dimension(:,:) :: x
x(30:70,20:50)=x(30:70,20:50)*2.0
end subroutine sub2
do i=1,n
x(i)=b(i)/a(i,i)
b(i+1:n)=b(i+1:n) - a(i+1:n,i)*x(i)
enddo
Une pro edure peut avoir besoin de tableaux lo aux de taille variable.
Exemple :
subroutine permute(a,b)
real,dimension(:,:) :: a,b ! tableaux a profil impli
ite
real,dimension(size(a)) :: travail ! le profil varie a
haque appel
travail=a
a=b
b=travail
end subroutine permute
Les tableaux dont les de
larations varient et qui ne sont pas des arguments formels sont
appeles des "tableaux automatiques" (automati
-arrays). Ils
onstituent un
as parti-
ulier de la
ategorie plus generale des objets automatiques.
Ces tableaux sont dimensionnes a l'aide d'expressions non
onstantes obtenues a partir
de variables entieres passees en arguments formels ou a l'aide de la fon
tion intrinseque size
appliquee a des tableaux passes egalement en argument.
Ils sont alloues dynamiquement a l'entree de la pro
edure et liberes de fa
on impli
ite a
la sortie.
Les
ha^nes de
ara
teres a longueur variable sont aussi une autre o
asion de
reer des
objets automatiques.
Exemple :
subroutine exemple(mot1)
hara
ter(len=*) :: mot1
hara
ter(len=len(mot1)) :: mot2
...
52 CHAPITRE 5. EXTENSIONS TABLEAUX
Remarque :
Dans les deux exemples pre
ites, l'interfa
e de la pro
edure devra ^etre expli
ite
REAL,DIMENSION( :, :),ALLOCATABLE : : A
Un tel tableau est appelle tableau a prol diere (deferred-shape-array) et il a le
statut de "non en
ore alloue".
{ Son allo
ation s'ee
tuera par une instru
tion ALLOCATE a laquelle on indiquera
les bornes de ses dimensions.
ALLOCATE(A(N,N-1))
Le tableau re
upere alors le statut "alloue".
{ Un tableau alloue qui n'a plus d'utilite peut ^etre "desalloue" au moyen d'une instru
-
tion DEALLOCATE.
DEALLOCATE(A)
Il re
upere le statut "non en
ore alloue".
{ La fon
tion intrinseque allo
ated permet d'interroger le systeme pour savoir si un
tableau est alloue ou non.
Exemple :
real,dimension(:,:),allo
atable :: a
...
read*,n,m
if ( .not. allo
ated(a) ) then
allo
ate(a(n,m),stat=err)
endif
if (err =/ 0) then
5.7. INSTRUCTION ET CONSTRUCTION WHERE 53
real,dimension(100) :: a
....
! Operation sur les elements stri
tement positifs de a
where (a > 0.) a=1./a
....
Blo
WHERE :
Une m^eme instru
tion expression-logique-tableau peut ^etre utilisee pour plusieurs ta-
bleaux de m^eme prol.
WHERE ( expression-logique-tableau)
ae
tation-de-tableaux
ELSEWHERE
ae
tation-de-tableaux
END WHERE
Exemple :
54 CHAPITRE 5. EXTENSIONS TABLEAUX
Remarque :
Si l'une des ae
tations modie expression-logique-tableau,
'est la valeur obtenue
pour
ette expression lors de l'entree dans l'instru
tion WHERE qui reste en vigueur
omme masque de
ontr^ole.
Interrogation
Redu tion
allo
ated(array) : Renvoie la valeur logique .TRUE. si le tableau allouable array est
alloue, sinon la valeur .FALSE.
shape(sour
e) : Renvoie un tableau d'entiers de rang 1 qui
ontient le prol du tableau
ou du s
alaire sour
e.
size(array[,dim) : Renvoie la taille totale du tableau array ou l'etendue le long de la
dimension dim
56 CHAPITRE 5. EXTENSIONS TABLEAUX
merge(tsour
e,fsour
e,mask) : Dans sa fon
tion prin
ipale, permet de fusionner les
tableaux tsour
e et fsour
e sous le
ontr^ole du tableau
mask.
pa
k(array,mask[,ve
tor) : Renvoie un tableau de rang un,
ontenant les elements
de array
orrespondant aux elements de valeur .TRUE.
de mask.
spread(sour
e,dim,n
opies) : renvoie un tableau de m^eme type et de m^eme parametre
de sous-type que sour
e et de rang augmente d'une unite.
unpa
k(ve
tor,mask,eld) : De
ompa
te le tableau ve
tor de rang un sous le
ontr^ole
du tableau logique mask. eld est de m^eme prol que
mask ou un s
alaire
ontenant les valeurs absentes du
tableau
ompa
te ve
tor.
reshape(sour
e,shape) : renvoie un tableau dont le prol est donne par le tableau
d'entiers de rang un shape, et dont le type et le parametre
de sous-type sont
eux du tableau sour
e.
Transposition de matri es
Pointeurs
Le pointeur est un objet qui pourra designer des objets dierents au
ours de l'exe
ution
d'un programme. L'objet designe par le pointeur est appele la
ible du pointeur.
Exemple :
On
onsidere la pro
edure qui
al
ule le produit AX ou A est une matri
e et X est un
ve
teur.
Supposons que X et A sont des objets qui ont la
apa
ite de designer des objets dierents
de m^eme type en
ours de programme. Considerons alors les etapes ne
essaires au
al
ul de
W=BCZ ou B et C sont des matri
es et Z est un ve
teur.
{ 1ere etape
X pointe sur la
ible Z
A pointe sur la
ible C
La pro
edure
al
ule Y=AX=CZ
{ 2eme etape
X pointe sur la
ible Y
A pointe sur la
ible B
La pro
edure
al
ule W=AX=BY
59
60 CHAPITRE 6. POINTEURS
Exemple :
real,pointer :: age
hara
ter,pointer :: nom
real,pointer,dimension(:,:) :: a
Remarque :
Dans le
as d'un tableau, seul le rang (le nombre de dimensions) doit ^etre de
lare et les
bornes prennent les valeurs de l'objet designe par le pointeur.
Exemple :
real,pointer :: pr
...
allo
ate(pr)
! traitement sur pr
...
deallo
ate(pr)
end
Remarques :
{ L'espa
e alloue par l'instru
tion ALLOCATE n'a pas de nom, on y a
ede par l'in-
termediaire du pointeur.
{ Apres l'exe
ution de l'instru
tion DEALLOCATE le pointeur passe a l'etat desasso
ie.
{ L'instru
tion DEALLOCATE appliquee a un pointeur dont l'etat est indetermine
provoque une erreur.
Les donnees sont
opiees depuis la
ible asso
iee au terme de droite vers la
ible asso
iee
au terme de gau
he.
Exemple :
real,pointer :: ptr1,ptr2,ptr3
allo
ate(ptr1,ptr2,ptr3)
ptr1=4.
ptr1=ptr2
ptr3=3*ptr2+ptr1
....
real,pointer :: ptr
real :: a,b
b=2
allo
ate(ptr)
ptr=b
a=ptr
...
Le pointeur situe a gau
he pointe sur une nouvelle
ible. On distingue deux
as :
{ la
ible est une variable non-pointeur : elle devra posseder l'attribut TARGET.
Exemple :
real,dimension(4,4),target :: tab0
real,dimension(:,:),pointer :: tab
...
tab0=4.
tab=>tab0
...
{ la
ible est un pointeur : la
ible du terme de droite devient la
ible du pointeur
de gau
he. C'est une simple
opie de pointeur.
Exemple :
real,dimension(:,:),pointer :: tab0,tab
6.6. POINTEURS DANS LES AFFECTATIONS ET LES EXPRESSIONS 63
...
allo
ate(tab0(4,4))
tab0=1.
tab=>tab0
...
Remarques :
{ Le type, le parametre de type et le rang du pointeur et de la
ible sont identiques.
{ Si la
ible est un tableau, il donne son prol et ses limites au pointeur.
Remarque :
C'est l'etape d'optimisation du
ompilateur qui justie
et attribut. Le
ompilateur saura
qu'une variable qui n'est ni un pointeur, ni une
ible ne peut ^etre atteinte par un pointeur.
! Initialisation de
ourant:
! Affe
tation de pointeur entre
ourant%suivant et premier
ourant=maillon(1,1,premier)
!
ourant devient le premier de la liste
premier =>
ourant
=) Ne essite d'une spe i ation expli ite dans un blo d'interfa e
Un argument ee
tif de type pointeur peut ^etre asso
ie a un argument formel non-
pointeur.
=) l'argument ee
tif doit ^etre asso
ie a une
ible.
C'est
ette
ible qui sera passee en parametre.
Exemple :
real,pointer,dimension(:,:) :: a
...
allo
ate(a(80,80))
all find(a)
...
subroutine find(
)
real,dimension(:,:) ::
...
Si un argument formel a l'attribut pointeur, on ne peut le de
larer ave
l'attribut
INTENT. Cela provient de l'ambiguite portant sur le fait de savoir si l'intention
d'usage porte sur la
ible ou l'etat d'asso
iation du pointeur.
Argument dote de l'attribut TARGET
{ si l'argument a l'attribut TARGET, tout pointeur l'ayant pour
ible devient indeni
au retour de la pro
edure.
6.8. RESULTAT D'UNE FONCTION DE TYPE POINTEUR 65
Exemple :
real,pointer,dimension(:) :: y
real,dimension(100) :: x
...
y =>
ompa
te(x)
...
fun
tion
ompa
te(x)
real,pointer,dimension(:) ::
ompa
te
real,dimension(:) :: x
! elimine les repetitions dans x
..... ! determine le nombre N
allo
ate(
ompa
te(N))
... !
opie les valeurs
onservees de x dans
ompa
te
end fun
tion
ompa
te
Remarques :
{ Dans la fon
tion, le pointeur devient "asso
ie"
{ Un appel de fon
tion retournant un pointeur gure habituellement dans une ae
ta-
tion de pointeur (partie droite d'une ae
tation de pointeur).
Exemple :
{ de
laration de la matri
e triangulaire (n,n)
type ligne
real,dimension(:),pointer :: r
end type
...
type(ligne),dimension(n) :: s,t
{ allo
ation de la memoire ne
essaire au sto
kage des elements non nuls de la matri
e.
do i=1,n
! allo
ation de la ligne i
allo
ate(t(i)%r(1:i))
enddo
{ L'ae
tation s=t est equivalente a l'ae
tation de pointeur sur les
omposantes
des objets de type ligne :
s(i)%r ) t(i)%r
Exemple :
real,dimension(m,n) :: table
real,dimension(:,:),pointer :: fenetre
...
fenetre => table(p1,q1) ! se
tion du tableau table
...
! modifi
ation des dimensions de fenetre
fenetre => table(p2,q2) ! autre se
tion du tableau table
...
Remarque : Cette fa
ilite des pointeurs sur des tableaux permet egalement d'indexer ou
de se
tionner des tableaux
omposantes de stru
ture.
Interfa e
69
70 CHAPITRE 7. INTERFACE
7.1.2 Erreurs non dete tees a la ompilation : as d'une interfa e impli ite
program stat
impli
it none
integer ::i,n
real,dimension(:),allo
atable ::v
real :: x,
tl,moy,std
integer,dimension(20) :: w
allo
ate(v(n))
v=5.
x=10
!
! Argument
onstante numerique: erreur de type sur la
onstante
all statuni(v,x,n,moy,std,7)
!
! Arguments inverses:
ore dump a l'exe
ution
all statuni(x,v,n,moy,std,
tl)
!
! Argument omis: erreur dans les resultats
all statuni(v,n,moy,std,
tl)
!
! Erreur de type: w ve
teur d'entiers
all statuni(w,x,n,moy,std,
tl)
!
! Un argument en trop
all statuni(v,x,n,moy,std,
tl,y)
!
end program stat
!
subroutine statuni(v,x,n,moy,std,
tl)
impli
ite none
real,dimension(:) :: v
real :: x,moy,std,
tl
integer :: n
moy=0.
std=0.
do i=1,n
moy=moy+v(i)
enddo
! Reste de la pro
edure
!
end subroutine statuni
7.1. INTERFACE DE PROCEDURE 71
Remarque :
Un
ertain nombre d'erreurs possibles sont
ontr^olees par l'instru
tion "impli
it none",
on verra que le blo
interfa
e est un moyen supplementaire pour dete
ter un maximum
d'erreurs a la
ompilation.
La solution de la pro
edure interne, si elle est simple, presente des in
onvenients :
{ La pro
edure interne est non visible a l'exterieur,
{ la programmation est moins modulaire.
Fortran 90 permet de spe
ier l'interfa
e d'une pro
edure dans la pro
edure appelante par
l'intermediaire d'un "blo
d'interfa
e".
INTERFACE
orps-interfa
e
END INTERFACE
ou
orps-interfa
e est une dupli
ation de la partie de
larative de la pro
edure a laquelle on
ajoute l'instru
tion END INTERFACE.
Exemple :
program stat
impli
it none
72 CHAPITRE 7. INTERFACE
integer ::i
real,dimension(:),allo
atable ::v
real :: x,
tl,moy,std
!
interfa
e
subroutine statuni(v,x,n,moy,std,
tl)
real,dimension(:) :: v
real :: x,moy,std,
tl
integer :: n
end subroutine statuni
end interfa
e
!
allo
ate(v(n))
v=5.
x=10
all statuni(v,x,n,moy,std,
tl)
...
end program stat
In
onvenient : Ne
essite de dupliquer le blo
d'interfa
e dans toutes les pro
edures
appelant la pro
edure
on
ernee.
Pour ameliorer la abilite generale, il faut inserer le m^eme blo
interfa
e dans les unites
de programme faisant referen
e a la pro
edure
on
ernee.
Le module et l'instru tion USE permettant l'a es a son ontenu jouera e r^ole.
Rappels :
Le module est une unite de programme introduite par Fortran 90 pour en
apsuler :
{ les donnees, les stru
tures et les types derives,
{ les blo
s d'interfa
e,
{ les pro
edures.
Deux methodes d'utilisation du module pour realiser une interfa
e expli
ite.
{ module ave
blo
d'interfa
e,
{ module ave
pro
edure.
7.1. INTERFACE DE PROCEDURE 73
{ Les pro
edures "intrinseques" ont toujours des interfa
es expli
ites,
{ pro
edure interne,
{ presen
e d'un blo
d'interfa
e dans la pro
edure appelante,
{ la pro
edure appelante a
ede au module
ontenant la pro
edure appelee (USE),
{ la pro
edure appelante a
ede au module
ontenant le blo
d'interfa
e de la pro
edure
appelee (USE).
l'attribut INTENT peut ^etre spe
ie pour un argument formel qui n'est ni une pro
edure,
ni un pointeur. Cela permet un
ontr^ole plus n de l'usage des arguments formels.
Exemple :
real,dimension(:),intent(in) :: ve
t
ou
real,dimension(:) :: ve
t
intent(in) :: ve
t
Exemple :
real,optional,dimension(:),intent(out) :: ve t
{ Il est re
ommande d'utiliser le passage par mot-
le pour les arguments optionnels,
{ les arguments positionnels doivent pre
eder
eux a mot-
le.
{ parmi les arguments positionnels, seul le dernier pourra ^etre optionnel et omis.
Exemple :
si
tl est optionnel
all statuni(v=ve
t,x=xx,n=nb1,moy=xm,std=xs,
tl=err)
all statuni(ve
t,xx,nb1,moy=xm,std=xs,
tl=err)
all statuni(v,x,n,moy=xm,std=xs)
En Fortran 90, une pro
edure passee en argument doit ^etre une pro
edure externe ou
une pro
edure de module.
ERIQUE
7.3. INTERFACE GEN 77
Le
hoix de la pro
edure a exe
uter est fait par le
ompilateur en fon
tion du nombre
et du type des arguments.
Cette notion existait deja en fortran 77, mais elle etait limitee aux pro edures intrinseques.
7.3.2 Exemple
Denition d'une fon
tion generique t s'appliquant a un tableau f qui pourra ^etre un
tableau 1D ou 2D.
On a deux sous-programmes :
{ t1r lorsque f est un tableau 1D,
{ t2r lorsque f est un tableau 2D.
En general, la sur
harge est denie dans un module.
78 CHAPITRE 7. INTERFACE
subroutine fft2r(f,isign)
real,dimension(:,:),intent(inout) :: f ! tableau 2D
integer,intent(in) :: isign
! reste de la pro
edure ...
end subroutine fft2r
!
module fft_mod
interfa
e fft
subroutine fft1r(f,isign)
real,dimension(:),intent(inout) :: f ! tableau 1D
integer,intent(in) :: isign
end subroutine fft1r
!
subroutine fft2r(f,isign)
real,dimension(:,:),intent(inout) :: f ! tableau 2D
integer,intent(in) :: isign
end subroutine fft2r
end interfa
e
end module fftr_mod
!
! programme appelant:
! ------------------
program fourier
use fftr_mod
impli
it none
real,dimension(10) :: f1
real,dimension(10,10) :: f2 1
integer :: isign1,isign2
isign1=0;isign2=0
all fft(f1,isign1)
! ....
all fft(f2,isign2)
! ....
end program fourier
7.4. SURCHAGE D'OPERATEURS 79
module fftr_mod
interfa
e fft
module pro
edure fft1r,fft2r
end interfa
e
!
ontains
!
subroutine fft1r(f,isign)
real,dimension(:),intent(inout) :: f ! tableau 1D
integer,intent(in) :: isign
! ... reste de la pro
edure
end subroutine fft1r
subroutine fft2r(f,isign)
real,dimension(:,:),intent(inout) :: f ! tableau 2D
integer,intent(in) :: isign
! ... reste de la pro
edure
end subroutine fft2r
!
end module fftr_mod
La sur
harge d'un operateur impose de respe
ter sa nature (binaire ou unaire) et les regles
de priorite pre
edemment denie dans le langage.
80 CHAPITRE 7. INTERFACE
On emploie des pro
edures de type fon
tion pour sur
harger un operateur a l'ex
eption
de l'operateur d'ae
tation qui
onstruit une expression ne retournant au
une valeur.
Dans
e
as,
'est une pro
edure de type subroutine qui sera utilisee.
Certains operateurs ont deja fait l'objet d'une sur harge au sein du langage.
La denition de l'operateur "=" se fera dans un module. Le sous-programme qui denit
l'assignation pourra ^etre un sous-programme externe ou interne au module. On preferera
ette derniere methode.
ontains
!
fun
tion p
_mult(a,b)
type(private_
omplex),intent(in) :: a,b
type(private_
omplex),intent(out) :: p
_mult
! reste de la pro
edure ....
end fun
tion p
_mult
!
subroutine p
_assign(a,b)
impli
it none
type(private_
omplex),intent(out) :: a
type(private_
omplex),intent(in) :: b
! reste de la pro
edure
end subroutine p
_assign
Programme appelant
------------------
program appel
use mod_private_
omplex
impli
it none
real :: ra,ima,rb,imb
type(private_
omplex) :: a,b,
,d
7.4. SURCHAGE D'OPERATEURS 83
!
all init(a,ra,ima)
all init(b,rb,imb)
!
=a*b
=2*
d=
!
end program appel
7.4.4 Remarques
Lors de la sur
harge d'un operateur autre que l'operateur d'ae
tation, le ou les arguments
de la fon
tion asso
iee doivent avoir l'attribut intent(in).
Lors de la sur
harge de l'operateur d'ae
tation, le 1er argument doit avoir l'attribut
intent(out) ou intent(inout) et le 2eme l'attribut intent(in).
84 CHAPITRE 7. INTERFACE
Chapitre 8
Contr^
ole de visibilite
Les ressour es non exportables sont dites privees, les autres sont dites publiques.
85
86 ^
CHAPITRE 8. CONTROLE
DE VISIBILITE
La presen
e des attributs PUBLIC ou PRIVATE dans les instru
tions de de
laration
de type dans le module.
REAL,PUBLIC : : X,Y
INTEGER, PRIVATE : : U,V
des instru
tions PUBLIC ou PRIVATE qui ont la forme :
PUBLIC [[ : : liste de ressour
es
PRIVATE [[ : : liste de ressour
es
ou liste de ressour
es : liste de variables nommees, de noms de pro
edures non in-
trinseques, de pro
edures non generiques, de types derives, de
onstantes nommees ou
de listes nommees (namelist).
Exemple :
module stat
private
integer,publi
:: n ! publi
real,publi
,dimension(:),allo
atable :: x,y !publi
real :: adx,ady !prives
publi
:: moyenne,std,s
ontains
subroutine somme(s,x,n) ! privee
...
end subroutine somme
subroutine moyenne(s,n) ! publique
...
end subroutine moyenne
end module stat
Remarques :
^
8.3. CONTROLE : TYPE DERIV
DE VISIBILITE
E 87
{ Les attributs PUBLIC et PRIVATE ne peuvent apparaitre qu'a l'interieur d'un mo-
dule,
{ une instru
tion PUBLIC ou PRIVATE sans argument ne peut apparaitre qu'une seule
fois dans un module,
{ si une pro
edure a un identi
ateur generique, l'a
essibilite a son nom spe
ique est
independante de l'a
essibilite a son nom generique,
{ une entite dont le type a ete deni ave
l'attribut PRIVATE ne peut pas posseder
l'attribut PUBLIC,
{ si une pro
edure a un argument formel ou un resultat ave
un attribut PRIVATE, la
pro
edure doit ^etre munie de l'attribut PRIVATE.
Les
omposantes de
e type etant privees, il est ne
essaire de fournir dans le module qui
le denit des fon
tions qui permettent d'y a
eder ou de les modier.
Exemple :
!
type private_
omplex
private
real :: reel,imaginaire
end type private_
omplex
!
! sur
harge de l'operateur *
interfa
e operator(*)
module pro
edure p
_mult
end interfa
e
!
ontains
!
subroutine p
_init(a,rl,imag)
impli
it none
type(private_
omplex),intent(out) :: a
real,intent(in) :: rl,imag
!
a%reel=rl ; a%imaginaire=imag
end subroutine p
_init
!
subroutine p
_display(a,
)
impli
it none
type(private_
omplex),intent(in) :: a
hara
ter*(*) ::
!
print*,
,a%reel,a%imaginaire
end subroutine p
_display
!
fun
tion p
_mult(a,b)
impli
it none
type(private_
omplex),intent(in) :: a,b
type(private_
omplex) ::p
_mult
!
p
_mult%reel=a%reel*b%reel - a%imaginaire*b%imaginaire
p
_mult%imaginaire=a%reel*b%imaginaire + a%imaginaire*b%reel
end fun
tion p
_mult
!
end module mod_private_
omplex
Programme appelant
--------------------
8.5. PARAMETRE ONLY DE L'INSTRUCTION USE 89
program appel_p
use mod_private_
omplex
!
impli
it none
type(private_
omplex) :: a,b,
!
all p
_init(a,3.,-6.)
all p
_init(b,1.,7.)
!
=a*b
!
all p
_display(a,"private_
omplex a")
all p
_display(b,"private_
omplex b")
all p
_display(
,"private_
omplex a*b")
!
stop
end
sur un re
tangle Nous integrons en x pour une valeur donnee de y. Pour
ela, on e
rit
une fon
tion en Fortran dans un module de telle sorte que la valeur de x soit obtenue par
passage d'argument et y etant une
omposante des donnees du module, par asso
iation
d'h^ote de
e module.
{ E
riture du module
module fun
real :: yval
real,dimension(2) :: xbornes,ybornes
ontains
fun
tion f(xval)
real :: f,xval
f=... ! expression en fon
tion de xval et yval
end fun
tion
end module fun
91
92
CHAPITRE 9. PROCEDURE
RECURSIVE
! al ule de l'integrale
surfa e=integre(fy,ybornes)
Exemple :
re
ursive fun
tion fa
torielle(n) result(res)
integer res,n
!
if (n .eq. 1) then
res=1
9.2. CLAUSE RESULT 93
else
res=n*fa
torielle(n-1)
end if
end
En l'absen
e le la
lause RESULT, le nom de la fon
tion est utilise pour nommer le resultat,
et par
onsequent
e nom n'est plus disponible pour un appel re
ursif de la fon
tion.
94
CHAPITRE 9. PROCEDURE
RECURSIVE
Chapitre 10
95
96 SUR LES E/S
CHAPITRE 10. NOUVEAUTES
quer le spe
i
ateur optionnel "ADVANCE = express-advan
e " dans l'instru
tion
READ ou WRITE ou :
Si une instru
tion d'E/S sans depla
ement essaie de transferer des donnees au
dela de la n de l'enregistrement en
ours :
{ Le parametre IOSTAT prend une valeur stri
tement negative.
{ Si le spe
i
ateur "EOR=etiq-n-enregistr" est present, le
ontr^ole de l'exe
ution du
programme sera transfere a l'instru
tion spe
iee par "etiq-n-enregistr".
{ Pour le
ontr^ole de
e pro
essus, on dispose egalement du spe
i
ateur SIZE=taille.
La valeur de la variable taille est egale au nombre de
ara
teres ee
tivement lus.
Exemple : (Cours Fortran 90 IDRIS)
program entree_sortie
integer,parameter :: dim_a=5, dim_b=3
hara
ter(4) :: a(dim_a)=(/"aaaa","bbbb","
", &
"dddd","eeee"/)
hara
ter(3) :: b(dim_b)=(/"fff", &
"ggg","hhh"/)
hara
ter(len=1) ::
do
do
read(*,'(a)',advan
e="no",eor=1,end=2)
write(*,'(a)',advan
e="no")
enddo
1 write(*,'(a)',advan
e="yes")
enddo
!
2 do i=1,dim_a
write(*,'(a)',advan
e="no")a(i)
enddo
write(*,'(" ")',advan
e="no")
10.3. INSTRUCTION NAMELIST 97
do i=1,dim_b
write(*,'(a)',advan
e="no")b(i)
enddo
write(*,'(a)',advan
e="yes")
end program entree_sortie
Remarques :
{ Lorsque ni le spe
i
ateur IOSTAT, ni le spe
i
ateur EOR ne sont utilises, le
programme se termine lorsqu'une
ondition de "n d'enregistrement" se produit.
{ Les E/S sans depla
ement ne peuvent ^etre utilisees pour les listes nommees (name-
list) ou des E/S dirigees par des listes.
La de
laration d'un tel groupe se fait par une instru
tion de spe
i
ation
NAMELIST avant toute instru
tion exe
utable.
/nom-namelist/ liste-nom-de-variable
nom-namelist est le nom qui sera donne au groupe pour son usage ulterieur.
Remarques :
{ Il est possible de
ompleter l'enumeration de la liste dans la m^eme unite de portee.
{ Si une variable a l'attribut PUBLIC, au
une variable dans la liste nommee ne peut
avoir l'attribut PRIVATE.
98 SUR LES E/S
CHAPITRE 10. NOUVEAUTES
10.3.2 Usage
Dans une instru
tion READ ou WRITE, la liste nommee sera designee par le spe
i
ateur
NML.
Exemple :
integer :: taille=2
hara
ter(len=4) ::
ouleur(3)=(/' red','pink','blue'/)
namelist / vetement/taille,
ouleur
...
write(*,nml=vetement)
La sortie sera:
INQUIRE(IOLENGTH=longueur) olist
ou longueur est une variable s
alaire de type entier par defaut, utilisee pour determiner
la longueur de la liste de sortie non formattee "olist".
Cette longueur pourra ^etre utilisee pour determiner la "bonne" valeur a fournir au
spe
i
ateur RECL=r
l d'une instru
tion OPEN a venir.
Exemple :
integer :: longueur
...
inquire(IOLENGTH=longueur) nom,titre,age,adresse,tel
...
open(1,FILE='test',RECL=longueur,FORM='UNFORMATTED')
...
write(1) nom,titre,age,adresse,tel
10.5. NOUVEAUX SPECIFICATEURS D'INSTRUCTIONS 99
De nouveaux spe i ateurs ont ete ajoutes aux instru tions OPEN et INQUIRE
PAD : pad
ou pad
est une expression de type
ara
tere qui prend la valeur :
{ YES : un enregistrement d'entree formattee est
omplete par des blan
s.
{ NO : un enregistrement d'entree formattee doit ^etre susamment long pour la liste
d'entree, sauf si le spe
i
ateur ADVANCE='NO' est present ou si un mot
le du
type EOR= ou IOSTAT= est present.
100 SUR LES E/S
CHAPITRE 10. NOUVEAUTES
type
haine
integer :: longueur
hara
ter(len=20) :: mot
end type
haine
type(
haine) :: texte
...
read(*,'(I2,A)') texte
102 SUR LES E/S
CHAPITRE 10. NOUVEAUTES
Chapitre 11
103
104
CHAPITRE 11. QUELQUES NOUVELLES FONCTIONS INTRINSEQUES
nearest(x,s) : renvoie un reel ayant le m^eme parametre de sous-type que x, egal au nombre
exa
tement representable en ma
hine le plus pro
he de x dans la dire
tion indiquee
par l'argument s.
spa
ing(x) : renvoie un reel ayant le m^eme parametre de sous-type que x, egal a l'espa
e-
ment absolu des nombres de m^eme parametre de sous-type que x dans le voisinage de
x.
range(x) :
.f.
hap^tre ??
pre
ision(x) :
.f.
hap^tre ??
s
an(
hain,set[,ba
k) : renvoie un entier qui represente le numero du premier
ara
tere
de
hain ou apparait l'un des
ara
teres de set ou 0 sinon. ba
k est optionnel et permet
de trouver la derniere o
uren
e.
verify(
hain,set[,ba
k) : renvoie un entier qui represente le numero du premier
ara
tere
de
hain ne gurant pas dans set ou 0 sinon. ba
k est optionnel, s'il est egal a .true.,
la re
her
he se fait depuis la n de
hain.
(
ount max). De
es informations il est fa
ile d'evaluer le temps CPU
onsomme par
une portion de programme.
Compilation
{ Les
ompilateurs xlf et f77 assurent une
ompatibilite maximum ave
le langage
Fortran 77.
{ Le
ompilateur xlf90 assure une
onforman
e a la norme Fortran 90.
Il est possible de s'adapter a une denition du langage Fortran en spe
iant les options de
ompilation appropriees.
XL Fortran : Optimisation
Le
ompilateur XL Fortran pour AIX Version 4 fournit 5 types d'options pouvant ^etre
utiliser pour augmenter les performan
es de la plupart des programmes.
107
108
CHAPITRE 11. QUELQUES NOUVELLES FONCTIONS INTRINSEQUES
Le RISC system/6000 in
lut trois types d'ar
hite
tures de pro
esseurs : Power (pwr),
Powerp
(pp
), Power2 (pwr2).
On utilise les options -qar
h et -qtune pour spe
ier le type d'ar
hite
ture uti-
lisee.
-qar
h=pwr2 : le programme s'exe
ute uniquement sur ar
hite
ture POWER2
-qar
h=pwr2 -qtune : le programme s'exe
ute essentiellement sur ar
hite
ture POWER2
Par defaut, le programme est adapte au sous-ensemble d'instru
tions
ommunes aux
trois ar
hite
tures.
Sele
tionner les sous-options appropriees de -q
oat et les options asso
iees.
-q
oat=
{ hssngl : a
elere l'arithmetique simple pre
ision. Continue a gerer les debordements.
{ hs
t : a
elere l'arithmetique simple pre
ision. Cette option genere des erreurs
lorsqu'un resultat simple pre
ision ee
tue un debordement.
{
int : a
elere la
onversion "
oating-point-to-integer" en eliminant la re-
her
he de debordement.
{ rsqrt : laisse le
ompilateur
al
uler l'inverse de la ra
ine
aree d'un nombre.
La division par une ra
ine
arree est rempla
ee par la multipli
ation par l'in-
verse de la ra
ine
arree.
Re
ommandations :
Suivant le
ontexte, utilisez les options de
ompilation suivantes pour augmenter les
performan
es de votre programme.
Sur des ar
hite
tures Power et Power2
{ Variables en simple pre
ision, on preserve la pre
ision.
Cette option ne peut ^etre utilisee que lorsque que le programme s'exe
ute sur un
seul RISC 6000. Les informations (taille du
a
he, taille de la ligne du
a
he, type de
a
he,...) fournies par
ette option aide le
ompilateur a s'adapter a l'ar
hite
ture de
la memoire de la ma
hine.