Académique Documents
Professionnel Documents
Culture Documents
Fortran
Violaine Louvet1 , trs inspire du cours de lIDRIS ralis par Anne
Fouilloux et Patrick Corde
1
CNRS/ICJ
Rabat, 9-12/04/2012
Fortran
Rabat, 9-12/04/2012
1 / 105
1
2
3
4
5
6
Gnralits
Dclarations & variables
Oprateurs et expressions
Structures de contrles
Tableaux
Gestion de la mmoire
7
8
9
10
11
12
Fortran
Rabat, 9-12/04/2012
2 / 105
Gnralits
Gnralits
Unit de programme
Excution
Syntaxe
Exercice
Gestion de la mmoire
Procdures
Entres-Sorties
10
Fonctions intrinsques
11
Pointeurs
12
Travaux pratiques
Structures de contrles
Tableaux
Fortran
Rabat, 9-12/04/2012
3 / 105
Gnralits
Historique
Langage compil (par opposition interprt)
Evolution :
I
I
I
I
I
I
I
1958 : Fortran II
1966 : Fortran IV
1977 : Fortran 77
1994 : Norme Fortran 90
1997 : Norme Fortran 95
2004 : Norme Fortran 2003
2010 : Norme Fortran 2008
Contenu du cours
Nous verrons ici essentiellement les lments de la norme 2003. La norme
2008 introduit notamment des notions avances de programmation objet qui ne
seront pas abordes.
Fortran
Rabat, 9-12/04/2012
3 / 105
Gnralits
Unit de programme
de type subroutine
de type function
les modules
les block data
Fortran
Rabat, 9-12/04/2012
4 / 105
Gnralits
Excution
Compilation / Excution
Excution
Processus (en anglais, process) : programme en cours dexcution :
I
I
Fortran
Rabat, 9-12/04/2012
5 / 105
Gnralits
Excution
Processus / Thread
Processus
Un processus a son propre espace mmoire, sa propre pile quil ne
partage pas avec les autres
les processus sont plus lourds que les threads crer : en gnral, 100
fois plus rapides crer quun processus
les processus sont rellement indpendants
Fortran
Rabat, 9-12/04/2012
6 / 105
Gnralits
Excution
Processus / Thread
2 processus
1 thread par processus
1 processus
3 threads par processus
Contexte
On se place ici dans le cadre dune programmation squentielle : un seul
processus. Les prochains cours aborderont des concepts diffrents :
Plusieurs processus
Plusieurs threads
voir les deux la fois
Violaine Louvet (CNRS/ICJ)
Fortran
Rabat, 9-12/04/2012
7 / 105
Gnralits
Syntaxe
Elments syntaxiques
Fortran
Rabat, 9-12/04/2012
8 / 105
Gnralits
Exercice
Exercice
PROGRAM MAIN ;INTEGER : : d e g r e e s f a h r e n h e i t&
, d e g r e e s c e n t i g r a d e ;READ ,&
d e g r e e s f a h r e n h e i t ; d e g r e e s c e n t i g r a d e&
=5( d e g r e e s f a h r e n h e i t 32)/9 ;PRINT ,&
degreesCENtiGrAde ;END
Fortran
Rabat, 9-12/04/2012
9 / 105
Gnralits
Dclarations & variables
Identificateurs
Types du fortran
Prcision des nombres
Kind
Chane de caractres
Implicit none
Constantes et initialisations
Exercice
Oprateurs et expressions
Structures de contrles
Tableaux
Gestion de la mmoire
Procdures
Entres-Sorties
10
Fonctions intrinsques
11
Pointeurs
12
Travaux pratiques
Fortran
Rabat, 9-12/04/2012
10 / 105
Identificateurs
Identificateurs
Donne un nom :
I
I
I
une variable
une constante
une procdure
Rgles suivre :
I
I
I
I
Exemples
Matrix
matrix
mesh_size
nx0
Fortran
Rabat, 9-12/04/2012
10 / 105
Types du fortran
Types du fortran
Le type dune variable dtermine :
le nombre doctets rserver en mmoire
un mode de reprsentation interne
lensemble des valeurs admissibles
lensemble des oprateurs qui peuvent lui tre appliqus
Types prdfinis
INTEGER entier
CHARACTER caractre
LOGICAL deux valeurs, .TRUE. ou .FALSE.
REAL rel simple prcision
DOUBLE PRECISION rel double prcision
COMPLEX complexe simple prcision
Fortran
Rabat, 9-12/04/2012
11 / 105
4 octets
8 octets
16 octets
Fortran
Rabat, 9-12/04/2012
12 / 105
Fortran
Rabat, 9-12/04/2012
13 / 105
Kind
Utilisation de KIND
Exemples
r e a l ( kind =8)
i n t e g e r ( kind =2)
: : x ! r e e l double p r e c i s i o n
: : i ! e n t i e r code s u r 2 o c t e t s , i n t e g e r normal s u r 4
Exemples
n = 23564_4
! e n t i e r sur 4 octets
x = 12.87976543245_8 ! r e e l s u r 8 o c t e t s
Fortran
Rabat, 9-12/04/2012
14 / 105
Kind
Fonction KIND
Renvoie la valeur entire qui correspond au sous-type de largument
spcifi
Exemples
kind ( 1 . 0 )
! v a l e u r associee au soust y p e r e e l s i m p l e p r e c i s i o n
kind ( 1 . 0 d0 ) ! v a l e u r associee au soust y p e r e e l double p r e c i s i o n
r e a l ( kind=kind ( 1 . d0 ) )
: : x ! d e c l a r e x comme r e e l double p r e c i s i o n
! q u e l l e que s o i t l a machine u t i l i s e e
Remarque
Les types dfinis via cette fonction KIND sont assurs dtre portables au
niveau de la compilation.
Fortran
Rabat, 9-12/04/2012
15 / 105
Chane de caractres
Chane de caractres
Pour dclarer une chane de caractres on prcise sa longueur. Si elle
nest pas indique elle est gale 1.
Exemples
CHARACTER( len=n )
CHARACTER
: : ch_car
:: c
Manipulation de chanes
LEN_TRIM(string) : longueur (entier) de la chane dbarrasse de ses blancs de fin
TRIM(string) : dbarrasse string de ses blancs de fin
LGE(string_a, string_b) : VRAI si string_a suprieure ou = string_b (Lexically
Greater or Equal), et les variantes LGT, LLE, LLT (on peut aussi utiliser >=, >,<=,
<).
ADJUSTL(string) : dbarrasse string de ses blancs de tte (cadrage gauche) et
complte droite par des blancs. Idem avec ADJUSTR droite.
Violaine Louvet (CNRS/ICJ)
Fortran
Rabat, 9-12/04/2012
16 / 105
Implicit none
Par dfaut, les variables dont lidentificateur commence par les caractres
I N sont de type INTEGER.
Toutes les autres sont de type REAL.
Linstruction IMPLICIT NONE change cette rgle car elle impose
lutilisateur la dclaration de chaque variable.
Cette instruction est vivement recommande car elle permet la dtection
dun certain nombre derreurs la compilation.
IMPLICIT NONE se place avant les dclarations des variables.
Linstruction ne sapplique qu lunit de programme qui la contient.
Fortran
Rabat, 9-12/04/2012
17 / 105
Constantes et initialisations
Constantes littrales
Une constante relle simple prcision doit obligatoirement comporter :
I
I
Exemples
x = 0.
y = 1.0
z = 1.6e04
d = 2 . 7 d3
zero = 0 . d0
c p l x = ( 1 . 3 2 e3, 4 . 3 )
CHARACTER (LEN=10) : : ch
ch = " Bonjour " ; ch ( 4 : 7 ) = " s o i r "
Fortran
Rabat, 9-12/04/2012
18 / 105
Constantes et initialisations
Initialisations
Une initialisation pourra seffectuer au moyen de linstruction DATA
I
Exemples
REAL
INTEGER
DATA
LOGICAL
a,b,c
n
a , b , n / 1 . 0 , 2.0 , 17/
: : f l a g = .TRUE.
Fortran
Rabat, 9-12/04/2012
19 / 105
Constantes et initialisations
Constantes symboliques
Exemples
INTEGER , PARAMETER
: : n = 1000
DOUBLE PRECISION
: : PI , ZERO
PARAMETER ( PI = 3.14159265d0 , ZERO = 0 . d0 )
Fortran
Rabat, 9-12/04/2012
20 / 105
OK
CHARACTER : : name
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
CHARACTER(LEN=5) : : town = "Glasgow"
CHARACTER(LEN=*) : : town = "Glasgow"
CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"
INTEGER : : pi = +22/7
LOGICAL : : wibble = .TRUE.
CHARACTER(LEN=*), PARAMETER : : "Bognor"
REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2
LOGICAL(LEN=12) : : frisnet
CHARACTER(LEN=6) : : you_know = yknow"
CHARACTER(LEN=6) : : you_know = "yknow"
INTEGER : : ia ib ic id
DOUBLE PRECISION : : pattie = +1.0D0
DOUBLE PRECISION : : pattie = -1.0E-0
REAL : : poie = 4.*atan(1.)
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
CHARACTER(LEN=5) : : town = "Glasgow"
CHARACTER(LEN=*) : : town = "Glasgow"
CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"
INTEGER : : pi = +22/7
LOGICAL : : wibble = .TRUE.
CHARACTER(LEN=*), PARAMETER : : "Bognor"
REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2
LOGICAL(LEN=12) : : frisnet
CHARACTER(LEN=6) : : you_know = yknow"
CHARACTER(LEN=6) : : you_know = "yknow"
INTEGER : : ia ib ic id
DOUBLE PRECISION : : pattie = +1.0D0
DOUBLE PRECISION : : pattie = -1.0E-0
REAL : : poie = 4.*atan(1.)
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
OK
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
CHARACTER(LEN=5) : : town = "Glasgow"
CHARACTER(LEN=*) : : town = "Glasgow"
CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"
INTEGER : : pi = +22/7
LOGICAL : : wibble = .TRUE.
CHARACTER(LEN=*), PARAMETER : : "Bognor"
REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2
LOGICAL(LEN=12) : : frisnet
CHARACTER(LEN=6) : : you_know = yknow"
CHARACTER(LEN=6) : : you_know = "yknow"
INTEGER : : ia ib ic id
DOUBLE PRECISION : : pattie = +1.0D0
DOUBLE PRECISION : : pattie = -1.0E-0
REAL : : poie = 4.*atan(1.)
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
OK
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
CHARACTER(LEN=5) : : town = "Glasgow"
CHARACTER(LEN=*) : : town = "Glasgow"
CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"
INTEGER : : pi = +22/7
LOGICAL : : wibble = .TRUE.
CHARACTER(LEN=*), PARAMETER : : "Bognor"
REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2
LOGICAL(LEN=12) : : frisnet
CHARACTER(LEN=6) : : you_know = yknow"
CHARACTER(LEN=6) : : you_know = "yknow"
INTEGER : : ia ib ic id
DOUBLE PRECISION : : pattie = +1.0D0
DOUBLE PRECISION : : pattie = -1.0E-0
REAL : : poie = 4.*atan(1.)
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
OK
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
CHARACTER(LEN=5) : : town = "Glasgow"
CHARACTER(LEN=*) : : town = "Glasgow"
CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"
INTEGER : : pi = +22/7
LOGICAL : : wibble = .TRUE.
CHARACTER(LEN=*), PARAMETER : : "Bognor"
REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2
LOGICAL(LEN=12) : : frisnet
CHARACTER(LEN=6) : : you_know = yknow"
CHARACTER(LEN=6) : : you_know = "yknow"
INTEGER : : ia ib ic id
DOUBLE PRECISION : : pattie = +1.0D0
DOUBLE PRECISION : : pattie = -1.0E-0
REAL : : poie = 4.*atan(1.)
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
OK
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
CHARACTER(LEN=5) : : town = "Glasgow"
CHARACTER(LEN=*) : : town = "Glasgow"
CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"
INTEGER : : pi = +22/7
LOGICAL : : wibble = .TRUE.
CHARACTER(LEN=*), PARAMETER : : "Bognor"
REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2
LOGICAL(LEN=12) : : frisnet
CHARACTER(LEN=6) : : you_know = yknow"
CHARACTER(LEN=6) : : you_know = "yknow"
INTEGER : : ia ib ic id
DOUBLE PRECISION : : pattie = +1.0D0
DOUBLE PRECISION : : pattie = -1.0E-0
REAL : : poie = 4.*atan(1.)
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
OK
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
OK
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
OK
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
REAL : : a = 1., b = 2
LOGICAL(LEN=12) : : frisnet
CHARACTER(LEN=6) : : you_know = yknow"
CHARACTER(LEN=6) : : you_know = "yknow"
INTEGER : : ia ib ic id
DOUBLE PRECISION : : pattie = +1.0D0
DOUBLE PRECISION : : pattie = -1.0E-0
REAL : : poie = 4.*atan(1.)
OK
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
LOGICAL(LEN=12) : : frisnet
CHARACTER(LEN=6) : : you_know = yknow"
CHARACTER(LEN=6) : : you_know = "yknow"
INTEGER : : ia ib ic id
DOUBLE PRECISION : : pattie = +1.0D0
DOUBLE PRECISION : : pattie = -1.0E-0
REAL : : poie = 4.*atan(1.)
OK
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
LOGICAL(LEN=12) : : frisnet
OK
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
OK
LOGICAL(LEN=12) : : frisnet
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
OK
LOGICAL(LEN=12) : : frisnet
OK
INTEGER : : ia ib ic id
DOUBLE PRECISION : : pattie = +1.0D0
DOUBLE PRECISION : : pattie = -1.0E-0
REAL : : poie = 4.*atan(1.)
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
OK
LOGICAL(LEN=12) : : frisnet
OK
INTEGER : : ia ib ic id
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
OK
LOGICAL(LEN=12) : : frisnet
OK
INTEGER : : ia ib ic id
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
OK
LOGICAL(LEN=12) : : frisnet
OK
INTEGER : : ia ib ic id
OK
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
OK
LOGICAL(LEN=12) : : frisnet
OK
INTEGER : : ia ib ic id
OK
OK
CHARACTER : : name
OK
CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a
BOOLEAN : : loji
DOUBLE : : X
OK
OK
OK
LOGICAL(LEN=12) : : frisnet
OK
INTEGER : : ia ib ic id
OK
Exercice
Statut
variable
variable
variable
constant
constant
constant
Type
integer
real
character ( 20 lettres)
character
logical
real
Fortran
Valeur initiale
<votre ville>
<est-elle au Maroc ?>
sin(0.5) = 0.47942554
Rabat, 9-12/04/2012
22 / 105
Exercice
Statut
variable
variable
variable
constant
constant
constant
Type
integer
real
character ( 20 lettres)
character
logical
real
Valeur initiale
<votre ville>
<est-elle au Maroc ?>
sin(0.5) = 0.47942554
INTEGER feet
Fortran
Rabat, 9-12/04/2012
22 / 105
Exercice
Statut
variable
variable
variable
constant
constant
constant
Type
integer
real
character ( 20 lettres)
character
logical
real
Valeur initiale
<votre ville>
<est-elle au Maroc ?>
sin(0.5) = 0.47942554
INTEGER feet
REAL : : miles
Fortran
Rabat, 9-12/04/2012
22 / 105
Exercice
Statut
variable
variable
variable
constant
constant
constant
Type
integer
real
character ( 20 lettres)
character
logical
real
Valeur initiale
<votre ville>
<est-elle au Maroc ?>
sin(0.5) = 0.47942554
INTEGER feet
REAL : : miles
CHARACTER(LEN=20) : : town
Fortran
Rabat, 9-12/04/2012
22 / 105
Exercice
Statut
variable
variable
variable
constant
constant
constant
Type
integer
real
character ( 20 lettres)
character
logical
real
Valeur initiale
<votre ville>
<est-elle au Maroc ?>
sin(0.5) = 0.47942554
INTEGER feet
REAL : : miles
CHARACTER(LEN=20) : : town
CHARACTER(LEN=*), PARAMETER : : home_town = Lyon
Fortran
Rabat, 9-12/04/2012
22 / 105
Exercice
Statut
variable
variable
variable
constant
constant
constant
Type
integer
real
character ( 20 lettres)
character
logical
real
Valeur initiale
<votre ville>
<est-elle au Maroc ?>
sin(0.5) = 0.47942554
INTEGER feet
REAL : : miles
CHARACTER(LEN=20) : : town
CHARACTER(LEN=*), PARAMETER : : home_town = Lyon
LOGICAL, PARAMETER : : in_ma = .FALSE.
Fortran
Rabat, 9-12/04/2012
22 / 105
Exercice
Statut
variable
variable
variable
constant
constant
constant
Type
integer
real
character ( 20 lettres)
character
logical
real
Valeur initiale
<votre ville>
<est-elle au Maroc ?>
sin(0.5) = 0.47942554
INTEGER feet
REAL : : miles
CHARACTER(LEN=20) : : town
CHARACTER(LEN=*), PARAMETER : : home_town = Lyon
LOGICAL, PARAMETER : : in_ma = .FALSE.
REAL, PARAMETER : : sin_half = 0.47942554
Fortran
Rabat, 9-12/04/2012
22 / 105
Oprateurs et expressions
Gnralits
Dclarations & variables
Oprateurs et expressions
Structures de contrles
Tableaux
Procdures
Entres-Sorties
10
Fonctions intrinsques
11
Pointeurs
12
Travaux pratiques
Gestion de la mmoire
Fortran
Rabat, 9-12/04/2012
23 / 105
Oprateurs et expressions
Oprateurs arithmtiques
Le type dune expression arithmtique dpend des types de ses
oprandes. Dans le cas doprateurs binaires :
I
Exemples
99/100
! v a u t 0 , INTEGER
99./100
! v a u t 0 . 9 9 , REAL
9 9 . / 1 0 0 d0 ! v a u t 0.99 d0 , DOUBLE PRECISION
Fortran
Rabat, 9-12/04/2012
23 / 105
Oprateurs et expressions
Attention
d = 1 . d0 + 5 . 0 . 5
Fortran
Rabat, 9-12/04/2012
24 / 105
Oprateurs et expressions
! ch = BONJOUR
Fortran
Rabat, 9-12/04/2012
25 / 105
Structures de contrles
Gnralits
Dclarations & variables
Oprateurs et expressions
Structures de contrles
Tests
Itrations
Exercice
Tableaux
Gestion de la mmoire
Procdures
Entres-Sorties
10
Fonctions intrinsques
11
Pointeurs
12
Travaux pratiques
Fortran
Rabat, 9-12/04/2012
26 / 105
Structures de contrles
Tests
IF
[ nom_bloc : ] I F ( expr1 ) THEN
...
ELSE I F ( expr2 ) THEN
...
ELSE
...
END I F [ nom_bloc ]
nom_bloc est une tiquette facultative : si elle est prsente elle doit figurer
au niveau de linstruction END IF et peut apparatre la suite des
ventuelles instructions ELSE, ELSE IF.
Fortran
Rabat, 9-12/04/2012
26 / 105
Structures de contrles
Tests
SELECT CASE
[ nom_bloc : ] SELECT CASE ( expr )
CASE ( l i s t e 1 ) [ nom_bloc ]
...
CASE ( l i s t e 2 ) [ nom_bloc ]
...
[CASE DEFAULT [ nom_bloc ] ]
...
END SELECT [ nom_bloc ]
Fortran
Rabat, 9-12/04/2012
27 / 105
Structures de contrles
Itrations
DO
[ nom_bloc : ] DO ( c o n t r o l e _ d e _ b o u c l e )
...
END DO [ nom_bloc ]
Fortran
Rabat, 9-12/04/2012
28 / 105
Structures de contrles
Itrations
Exemples
INTEGER
somme, n , i
DOUBLE PRECISION x , x l a s t , t o l
...
somme = 0
DO i =1 ,n , 2
somme = somme + i
END DO
DO
xlast = x
x = ...
I F (ABS( x x l a s t ) / x < t o l ) EXIT
END DO
Fortran
Rabat, 9-12/04/2012
29 / 105
Structures de contrles
Itrations
DO WHILE
[ nom_bloc : ] DO WHILE ( expr )
...
END DO [ nom_bloc ]
Fortran
Rabat, 9-12/04/2012
30 / 105
Structures de contrles
Itrations
CYCLE
[ nom_bloc : ] DO
...
I F ( expr ) CYCLE
END DO [ nom_bloc ]
Fortran
Rabat, 9-12/04/2012
31 / 105
Structures de contrles
Exercice
Exercice
Ecrire un programme qui calcule les racines dun polynme du second degr
donn par 3 coefficients a, b, et c.
f (x) = a2 x + bx + c
a pour racine :
b2 4ac
2a
Une donne de a = 0, b = 0, c = 0 doit terminer le programme. Utiliser une
variable intermdiaire pour tester la nullit dun nombre.
x=
program Q u a d r a t i c
...
PRINT , " Type i n a , b and c ( 0 , 0 , 0 w i l l t e r m i n a t e ) "
READ , a , b , c
...
end program Q u a d r a t i c
Fortran
Rabat, 9-12/04/2012
32 / 105
Structures de contrles
Exercice
Solution
program Q u a d r a t i c
i m p l i c i t none
real : : a , b , c , root1 , root2
r e a l : : b_sq , ac4 , s q r t _ t h i n g
r e a l , parameter : : eps = 0.0000001
do
p r i n t , " t y p e i n a , b and c ( 0 , 0 , 0 w i l l t e r m i n a t e ) "
read , a , b , c
i f ( abs ( a+b+c ) < eps ) e x i t
b_sq = b2
ac4 = 4ac
i f ( b_sq > ac4 ) then
s q r t _ t h i n g = s q r t ( b_sqac4 )
r o o t 1 = (b+ s q r t _ t h i n g ) / ( 2 a )
r o o t 2 = (bs q r t _ t h i n g ) / ( 2 a )
p r i n t , " t h e r e a l r o o t s are " , r o o t 1 , r o o t 2
e l s e i f ( abs ( b_sq ac4 ) < eps ) then
r o o t 1 = (b ) / ( 2 a )
p r i n t , " t h e r e i s one r e a l r o o t which i s " , r o o t 1
else
p r i n t , " t h e r e are no r e a l r o o t s "
end i f
end do
end program Q u a d r a t i c
Violaine Louvet (CNRS/ICJ)
Fortran
Rabat, 9-12/04/2012
33 / 105
Tableaux
Gnralits
Oprateurs et expressions
Structures de contrles
Tableaux
Dclaration
Quelques dfinitions
Ordre des lments
Initialisation
Manipulation de tableaux
Sections de tableaux
Fonctions intrinsques
Violaine Louvet (CNRS/ICJ)
Gestion de la mmoire
Procdures
Entres-Sorties
10
Fonctions intrinsques
11
Pointeurs
12
Travaux pratiques
Fortran
Rabat, 9-12/04/2012
34 / 105
Tableaux
Dclaration
: : tab
Exemples
REAL, DIMENSION (1 :5 ,1 :5 ,1 :5)
INTEGER , DIMENSION (10 :1)
:: R
:: S
Fortran
Rabat, 9-12/04/2012
34 / 105
Tableaux
Quelques dfinitions
Fortran
Rabat, 9-12/04/2012
35 / 105
Tableaux
(1, 1) (2, 1)
(1, 1) (1, 2)
(1, n)
(2, 1) (2, 2)
(2, n)
(m, 1)(m, 2)
(m, n)
Fortran
(1, n) (2, n)
... (m, n)
Rabat, 9-12/04/2012
36 / 105
Tableaux
Initialisation
: : X = 3.
Fortran
Rabat, 9-12/04/2012
37 / 105
Tableaux
Manipulation de tableaux
Les tableaux peuvent tre utiliss en tant quoprandes dans une expression
Exemples
REAL, DIMENSION ( 4 :0 ,0 :2) : : B
REAL, DIMENSION ( 5 , 3 )
:: C
REAL, DIMENSION ( 0 : 4 , 0 : 2 )
:: D
...
B = C D B 2
B = SIN (C) + COS(D)
Important
La valeur dune expression tableau est entirement value avant dtre
affecte. Les deux exemples ci-dessous ne sont pas du tout quivalents :
do i =1 ,20
t a b ( i ) = t a b (21 i )
end do
r e a l , dimension ( 2 0 ) : : t a b
t a b ( : ) = t a b (20 :1 : 1)
les expressions tableaux sont en fait des notations vectorielles ce qui facilite
leur vectorisation puisque contrairement aux boucles, elles vitent au
compilateur le contrle des dpendances.
Violaine Louvet (CNRS/ICJ)
Fortran
Rabat, 9-12/04/2012
38 / 105
Tableaux
Sections de tableaux
Attention
La notation dgnre sous la forme : correspond ltendue de la dimension
considre.
Violaine Louvet (CNRS/ICJ)
Fortran
Rabat, 9-12/04/2012
39 / 105
Tableaux
Fonctions intrinsques
Exemples
A=
integer , &
dimension ( 2 :27 ,0 :49) : : t
SHAPE( t )
! ( / 30 ,50 / )
UBOUND( t ) ! ( / 27 ,49 / )
UBOUND( t ( : , : ) ) ! ( / 30 ,50 / )
LBOUND( t , dim =2) ! 0
1
2
MINVAL ( ( / 1 , 4 ,
MAXVAL( ( / 1 , 4 ,
MAXVAL( A , dim =2)
MINVAL ( A , dim =1)
Fortran
3
4
5
6
9 /) )
! 1
9 /) )
! 9
! (/ 5, 6 /)
! (/ 1, 3, 5 /)
Rabat, 9-12/04/2012
40 / 105
Tableaux
Fonctions intrinsques
1
2
3
4
5
6
3
B= 2
1
6
3
2
1
1
4
2
V = 4
1
Exemples
PRODUCT( ( / 2 ,5 , 6 / ) )
! 60
SUM( ( / 2 ,5 , 6 / ) )
! 1
PRODUCT( A , dim =1) ! ( / 2 ,12 ,30 / )
SUM( A , dim =2) ! ( / 9 ,12 / )
DOT_PRODUCT( ( / 2,3,1 / ) , ( / 6 ,3 ,3 / ) ) = 0
MATMUL( B , V) = ( / 29 , 7, 10 / )
Fortran
Rabat, 9-12/04/2012
41 / 105
Tableaux
Equivalent
:: a
do i = 1 , 10
i f ( a ( i ) > 0 . ) then
a ( i ) = log ( a ( i ) )
else
a( i ) = 1.
end i f
end do
Fortran
Rabat, 9-12/04/2012
42 / 105
Tableaux
Exercice
Exercice 1
INTEGER , DIMENSION( 1 :1 ,3 ,2) : : A
Exercice 2
REAL, DIMENSION( 1 0 0 , 1 0 0 )
: : A, B, C
Fortran
Rabat, 9-12/04/2012
43 / 105
Tableaux
Exercice
Exercice 1
INTEGER , DIMENSION( 1 :1 ,3 ,2) : : A
Exercice 2
REAL, DIMENSION( 1 0 0 , 1 0 0 )
: : A, B, C
Fortran
Rabat, 9-12/04/2012
43 / 105
Tableaux
Exercice
Exercice 1
INTEGER , DIMENSION( 1 :1 ,3 ,2) : : A
Exercice 2
REAL, DIMENSION( 1 0 0 , 1 0 0 )
: : A, B, C
Fortran
Rabat, 9-12/04/2012
43 / 105
Tableaux
Exercice
Exercice 1
INTEGER , DIMENSION( 1 :1 ,3 ,2) : : A
Exercice 2
REAL, DIMENSION( 1 0 0 , 1 0 0 )
: : A, B, C
Fortran
Rabat, 9-12/04/2012
43 / 105
Tableaux
Exercice
Exercice 1
INTEGER , DIMENSION( 1 :1 ,3 ,2) : : A
Exercice 2
REAL, DIMENSION( 1 0 0 , 1 0 0 )
: : A, B, C
Fortran
Rabat, 9-12/04/2012
43 / 105
Tableaux
Exercice
Exercice 1
INTEGER , DIMENSION( 1 :1 ,3 ,2) : : A
Exercice 2
REAL, DIMENSION( 1 0 0 , 1 0 0 )
: : A, B, C
Fortran
Rabat, 9-12/04/2012
43 / 105
Gestion de la mmoire
Gnralits
Oprateurs et expressions
Structures de contrles
Tableaux
Gestion de la mmoire
Modes dallocation
Tableaux automatiques
Tableaux dynamiques
Exercice
7
Procdures
Entres-Sorties
10
Fonctions intrinsques
11
Pointeurs
12
Travaux pratiques
Fortran
Rabat, 9-12/04/2012
44 / 105
Gestion de la mmoire
Modes dallocation
Fortran
Rabat, 9-12/04/2012
44 / 105
Gestion de la mmoire
Modes dallocation
Rcursivit infinie
Variables trop grandes : par exemple tableau de grande dimension non allou
dynamiquement
Prvention / Debuggage
Eviter les tableaux implicites (sans prcision des dimensions) dans les
procdures
Utiliser des debuggers comme valgrind pour dterminer lendroit du
dpassement mmoire
Violaine Louvet (CNRS/ICJ)
Fortran
Rabat, 9-12/04/2012
45 / 105
Gestion de la mmoire
Tableaux automatiques
Il est possible de dfinir au sein dune procdure des tableaux dont la taille
varie dun appel lautre. Ils sont allous dynamiquement lentre de la
procdure et librs sa sortie de faon implicite. Pour cela ces tableaux
seront dimensionns laide dexpressions entires non constantes.
Exemple
subroutine echange ( a , b , t a i l l e )
integer , dimension ( : , : )
: : a,b
integer
: : taille
integer , dimension ( s i z e ( a , 1 ) , s i z e ( a , 2 ) )
r e a l , dimension ( t a i l l e ) : : V
:: C
C = a
a = b
b = C
...
end subroutine echange
Important
Fortran
Rabat, 9-12/04/2012
46 / 105
Gestion de la mmoire
Tableaux dynamiques
Fortran
Rabat, 9-12/04/2012
47 / 105
Gestion de la mmoire
Tableaux dynamiques
Fortran
Rabat, 9-12/04/2012
48 / 105
Gestion de la mmoire
Exercice
Exercice
crire un programme permettant de valoriser une matrice de n lignes et m
colonnes (n et m ntant connus quau moment de lexcution) de la faon
suivante :
les lignes de rang pair seront constitues de lentier 1,
les lignes de rang impair seront constitues des entiers successifs 1, 2, 3,
...
1 2 3 4
1 1 1 1
5 6 7 8
Imprimer la matrice obtenue ligne par ligne afin de vrifier son contenu.
Fortran
Rabat, 9-12/04/2012
49 / 105
Gestion de la mmoire
program m a t r i x
i m p l i c i t none
integer
: : n ,m
integer
: : err , i , j , k
integer , dimension ( : , : ) , a l l o c a t a b l e
Exercice
: : mat
50 / 105
Dfinition et dclaration de
structures
Symbole % daccs un champ
Modules
Exercice
Gnralits
Oprateurs et expressions
Procdures
Structures de contrles
Entres-Sorties
Tableaux
10
Fonctions intrinsques
Gestion de la mmoire
11
Pointeurs
12
Travaux pratiques
Fortran
Rabat, 9-12/04/2012
51 / 105
:: a
Fortran
Rabat, 9-12/04/2012
51 / 105
: : matr
Fortran
Rabat, 9-12/04/2012
52 / 105
Modules
Modules
Un module est une unit de programme particulire introduite en Fortran
90 pour encapsuler entre autres :
I
I
Quel que soit le nombre daccs (USE) au mme module, les entits ainsi
dfinies sont uniques.
Doit tre compil sparment avant de pouvoir tre utilis. Le compilateur
cre pour chaque fichier source :
I
I
Fortran
Rabat, 9-12/04/2012
53 / 105
Modules
:: a
contains
subroutine YSMcreate ( matr ,m)
type (YSM)
: : matr
integer
:: m
...
end subroutine YSMcreate
end module YSM_mod
Fortran
Rabat, 9-12/04/2012
54 / 105
Exercice
Exercice
Fortran
Rabat, 9-12/04/2012
55 / 105
Exercice
module MyComplexMod
i m p l i c i t none
type MyComplex
r e a l ( kind=kind ( 1 . d0 ) )
end type
: : xr , x i
: : yc1 , yc2
yc1%x r = 1 . ; yc1%x i = 0 . 5
yc2%x r =2.6 ; yc2%x i = 1 . 3
end program Complex
Fortran
Rabat, 9-12/04/2012
56 / 105
Procdures
Gnralits
Oprateurs et expressions
Structures de contrles
Procdures
Arguments
Attributs INTENT et OPTIONAL
Dure de vie et visibilit des
identificateurs
Subroutines et functions
Interface explicite
Exercice
Entres-Sorties
10
Fonctions intrinsques
11
Pointeurs
12
Travaux pratiques
Tableaux
Gestion de la mmoire
Types drivs et modules
Fortran
Rabat, 9-12/04/2012
57 / 105
Procdures
Arguments
Les traitements rptitifs sont dfinis une seule fois laide dune unit de
programme de type procdure (SUBROUTINE ou FUNCTION).
Les diffrentes valeurs ncessaires au traitement sont transmises via des variables
appeles arguments dappel (actual-arguments). La procdure appele rcupre
les valeurs quon lui a transmises via des variables appeles arguments muets
(dummy-arguments).
En Fortran le passage de ces valeurs seffectue par rfrence :
I les adresses des arguments dappel sont transmises la procdure appele,
I dans la procdure appele, les arguments muets sont des alias des
arguments dappel
Argument de type chane de caractres
Lorsquune chane de caractres est transmise en argument, Fortran passe
galement sa longueur de faon implicite.
Dans la procdure appele, celle-ci peut tre rcupre laide de la fonction
intrinsque LEN.
La dclaration de la chane de caractres au sein de la procdure appele est faite
en spcifiant le caractre * la place de la longueur.
La procdure appele fait alors rfrence une chane de caractres taille
implicite (assumed-size string).
Violaine Louvet (CNRS/ICJ)
Fortran
Rabat, 9-12/04/2012
57 / 105
Procdures
Arguments
Fortran
Rabat, 9-12/04/2012
58 / 105
Procdures
Arguments
Attention
Fortran
Rabat, 9-12/04/2012
59 / 105
Procdures
Arguments
cest une copie contigu en mmoire qui est passe par le compilateur,
largument muet correspondant de la procdure ne doit pas avoir la vocation
INTENT(inout) ou INTENT(out) ; autrement dit, en retour de la procdure, il
ny a pas mise--jour du tableau pre de la section irrgulire.
Fortran
Rabat, 9-12/04/2012
60 / 105
Procdures
Arguments
Fortran
Rabat, 9-12/04/2012
61 / 105
Procdures
F
I
Exemple
r e a l , dimension ( : ) , i n t e n t ( i n ) : : v e c t
integer , optional , i n t e n t ( out ) : : rg_max
.....
i f ( p r e s e n t ( rg_max ) ) then . . .
Fortran
Rabat, 9-12/04/2012
62 / 105
Procdures
Fortran
Rabat, 9-12/04/2012
63 / 105
Procdures
Subroutines et functions
Fortran
Rabat, 9-12/04/2012
64 / 105
Procdures
Interface explicite
Fortran
Rabat, 9-12/04/2012
65 / 105
Procdures
Interface explicite
5 possibilits :
1
Fortran
Rabat, 9-12/04/2012
66 / 105
Procdures
Interface explicite
Exemple
program inout
i m p l i c i t none
integer , parameter
: : n =5
integer
: : rgmax =0 , c o n t r o l =0
r e a l , dimension ( n ) : : v = ( / 1 . , 2 . , 4 0 . , 3 . , 4 . / )
real
: : vmax , vmin
! Bloc i n t e r f a c e
i n t e r f a c e subroutine maxmin ( vect , v_max , v_min , c t l , rg_max )
r e a l , dimension ( : ) , i n t e n t ( i n )
: : vect
r e a l , i n t e n t ( out )
: : v_max , v_min
integer , optional , i n t e n t ( out )
: : rg_max
integer , i n t e n t ( inout )
: : ctl
end subroutine maxmin
end i n t e r f a c e
!
.......
c a l l maxmin ( v , vmax , vmin , c o n t r o l , rgmax )
.......
end program inout
Fortran
Rabat, 9-12/04/2012
67 / 105
Procdures
Interface explicite
:
:
:
:
:
:
:
:
vect
v_max , v_min
rg_max
ctl
v_max = MAXVAL( v e c t )
v_min = MINVAL ( v e c t )
ctl = 1
i f ( p r e s e n t ( rg_max ) ) then
rg_max = MAXLOC( vect , DIM =1)
ctl = 2
endif
p r i n t , " T a i l l e v e c t e u r v i a s i z e : " , SIZE ( v e c t )
p r i n t , " P r o f i l v e c t e u r v i a shape : " , SHAPE( v e c t )
end subroutine maxmin
Fortran
Rabat, 9-12/04/2012
68 / 105
Procdures
Interface explicite
Fortran
Rabat, 9-12/04/2012
69 / 105
Procdures
Exercice
Exercice
Fortran
Rabat, 9-12/04/2012
70 / 105
Procdures
module MyComplexMod
...
contains
function a d d i t i o n ( yc1 , yc2 )
type ( MyComplex ) , i n t e n t ( i n )
type ( MyComplex )
Exercice
: : yc1 , yc2
: : addition
yc1%x r = 1 . ; yc1%x i = 0 . 5
yc2%x r =2.6 ; yc2%x i = 1 . 3
yc3= a d d i t i o n ( yc1 , yc2 )
p r i n t , Complex = ( , yc3%xr , , , yc3%x i , )
...
end program Complex
Violaine Louvet (CNRS/ICJ)
Fortran
Rabat, 9-12/04/2012
71 / 105
Entres-Sorties
Gnralits
Oprateurs et expressions
Structures de contrles
Tableaux
Procdures
Entres-Sorties
Introduction
Accs squentiel
Formats
Accs direct
Inquire
Units standards
Exercice
10
Fonctions intrinsques
11
Pointeurs
12
Travaux pratiques
Gestion de la mmoire
Types drivs et modules
Fortran
Rabat, 9-12/04/2012
72 / 105
Entres-Sorties
Introduction
Fortran
Rabat, 9-12/04/2012
72 / 105
Entres-Sorties
Accs squentiel
On dit quun fichier est squentiel lorsquil est ncessaire davoir trait les
enregistrements prcdents celui auquel on dsire accder.
Pour un fichier en lecture le paramtre IOSTAT de linstruction READ permet
notamment de grer la fin de fichier ; celui-ci fait rfrence une variable
entire qui est valorise lissue de la lecture comme suit :
0 si la lecture sest bien droule ;
une valeur positive si une erreur sest produite ;
une valeur ngative si la fin de fichier ou une fin denregistrement a t
rencontre.
Fichier binaire
Fichier dans lequel on stocke les informations telles quelles sont reprsentes
en mmoire. Cest au moment de louverture du fichier que lon indique le type
de fichier traiter.
Fortran
Rabat, 9-12/04/2012
73 / 105
Entres-Sorties
Accs squentiel
Exemple
r e a l , dimension ( 2 0 0 )
: : tab
integer
: : i , ios
real
:: r
open ( UNIT=1 , FILE= data_bin_seq ,FORM= unformatted , &
ACCESS= sequential ,ACTION= read , POSITION= rewind , IOSTAT= i o s )
i f ( i o s / = 0 ) stop pb a l o u v e r t u r e
read ( u n i t =1 , i o s t a t = i o s ) tab , i , r
do w h i l e ( i o s == 0 )
...
read ( u n i t =1 , i o s t a t = i o s ) tab , i , r
end do
c l o s e ( u n i t =1)
Ouverture du fichier de nom data_bin_seq, fichier binaire squentiel, quon veut lire
depuis le dbut (rewind).
Fichier connect lunit logique 1.
En cas derreur louverture, en labsence du mot cl iostat, le programme
sinterrompt. Si le mot-cl est prcis :
I si la valeur est 0, tout sest bien pass
I sinon, une erreur sest produite
I le mme mot-cl est utilis pour linstruction read.
Violaine Louvet (CNRS/ICJ)
Fortran
Rabat, 9-12/04/2012
74 / 105
Entres-Sorties
Formats
tab , i , r
Fortran
Rabat, 9-12/04/2012
75 / 105
Entres-Sorties
Formats
S0. XXXXXXXXX
{z
} ESXX
|
d
|
I
{z
w
S0. XXXXXXXXX
|
{z
} DSXX
d
{z
w
Fortran
Rabat, 9-12/04/2012
76 / 105
Entres-Sorties
Formats
la virgule (,)
le blanc (espace)
Fortran
Rabat, 9-12/04/2012
77 / 105
Entres-Sorties
Accs direct
Le rang de lenregistrement que lon dsire traiter doit tre spcifi laide
du paramtre REC= de linstruction READ/WRITE.
Un enregistrement ne peut pas tre dtruit mais par contre il peut tre
rcrit.
Fortran
Rabat, 9-12/04/2012
78 / 105
Entres-Sorties
Accs direct
Exemple
open ( u n i t =1 , f i l e = d a t a _ b i n _ d i r e c t , access= d i r e c t ,
action = read , status = o l d , r e c l = 400 )
n = 100
read ( u n i t =1 , rec=n , i o s t a t = i o s ) t a b
&
Fortran
Rabat, 9-12/04/2012
79 / 105
Entres-Sorties
Inquire
Fortran
Rabat, 9-12/04/2012
80 / 105
Entres-Sorties
Inquire
Exemple
logical existe
character ( len =3)
: : form
character ( len =10)
: : acces
inquire ( f i l e = data_txt_seq , exist= e x i s t e )
i f ( e x i s t e ) then
open ( u n i t =1 , f i l e = d a t a _ t x t _ s e q , p o s i t i o n = rewind , &
action = read , i o s t a t = i o s )
i f ( i o s / = 0 ) then ! e r r e u r o u v e r t u r e
...
else
i n q u i r e ( u n i t =1 , formatted=form , access=acces )
endif
close ( 1 )
end i f
Fortran
Rabat, 9-12/04/2012
81 / 105
Entres-Sorties
Units standards
Fortran
Rabat, 9-12/04/2012
82 / 105
Entres-Sorties
Exercice
Exercice
Ecrire un programme initialisant une matrice et la stockant sur un fichier
binaire
Ecrire un programme relisant ce fichier binaire et lui appliquant une
transformation partir dun choix de lutilisateur appliqu chaque
lment de la matrice sous la forme y = f (x) :
I
I
I
I
identit
carr
racine
logarithme
Fortran
Rabat, 9-12/04/2012
83 / 105
Fonctions intrinsques
Gnralits
Dclarations & variables
Oprateurs et expressions
Structures de contrles
Tableaux
Gestion de la mmoire
Procdures
Entres-Sorties
10
Fonctions intrinsques
Mesure de temps, nombres
alatoires
Exercice
11
Pointeurs
12
Travaux pratiques
Fortran
Rabat, 9-12/04/2012
84 / 105
Fonctions intrinsques
Fortran
Rabat, 9-12/04/2012
84 / 105
Fonctions intrinsques
Fortran
Rabat, 9-12/04/2012
85 / 105
Fonctions intrinsques
Exercice
Calcul de
Complter le programme qui calcule le nombre partir de lalgorithme
suivant :
Z 1
4
=
f (x)dx with f (x) =
1 + x2
0
i 12
1X
=
f (xi ) with xi =
n
n
i=1
Remarque
CPU time : Temps pendant lequel le CPU est actif pour lexcution. Cela
ne prend donc pas en compte notamment les temps dattente des I/O.
Elapsed time : Ces temps dattente sont inclus.
CPU time < elapsed time
Violaine Louvet (CNRS/ICJ)
Fortran
Rabat, 9-12/04/2012
86 / 105
Pointeurs
Gnralits
Oprateurs et expressions
Structures de contrles
Tableaux
Gestion de la mmoire
Procdures
Entres-Sorties
Violaine Louvet (CNRS/ICJ)
10
Fonctions intrinsques
11
Pointeurs
Dfinitions
Dclaration
Symbole =>
Symbole = appliqu aux
pointeurs
Allocation dynamique de
mmoire
Fonction NULL() et instruction
NULLIFY
Fonction intrinsque
ASSOCIATED
Passage dun pointeur en
argument de procdure
12
Travaux pratiques
Fortran
Rabat, 9-12/04/2012
87 / 105
Pointeurs
Dfinitions
Remarque
Pour ceux connaissant la notion de pointeur (type langage C), le pointeur
Fortran 90 peut tre vu comme une abstraction de niveau suprieur en ce sens
quil interdit la manipulation directe dadresse.
chaque pointeur Fortran 90 est associ un descripteur interne contenant
les caractristiques (type, rang, tat, adresse de la cible, et mme le pas
dadressage en cas de section rgulire, etc.).
Pour toute rfrence ce pointeur, lindirection est faite pour vous, do la
notion d alias .
Fortran
Rabat, 9-12/04/2012
87 / 105
Pointeurs
Dclaration
Exemple
real , pointer
integer , dimension ( : ) , p o i n t e r
character ( len =80) , p o i n t e r
: : p1
: : p2
: : p4 ( : )
Attention
p4 nest pas un tableaux de pointeurs !
Cest en fait un pointeur susceptible dtre ultrieurement associ un tableau
de rang 1 et de type chane de caractres . Prfrer lcriture :
character ( len =80) , dimension ( : ) , p o i n t e r
Fortran
: : p4
Rabat, 9-12/04/2012
88 / 105
Pointeurs
Symbole =>
Cible : cest un objet point. Cet objet devra avoir lattribut target lors de sa
dclaration.
integer , t a r g e t
:: i
Remarque
p1 et p2 tant deux pointeurs, p2 => p1 implique que p1 prend ltat de p2
(indfini, nul ou associ la mme cible).
Fortran
Rabat, 9-12/04/2012
89 / 105
Pointeurs
Attention
lorsque les oprandes du symbole = sont des pointeurs, laffectation seffectue
sur les cibles et non sur les pointeurs.
Exemple
integer , p o i n t e r : : p t r 1 , p t r 2
integer , t a r g e t
: : i1 , i 2
i1 = 1 ; i2 = 2
p t r 1 => i 1 ; p t r 2 => i 2
ptr2 = ptr1
! equivalent a " i2 = i1 "
print , ptr2
Fortran
Rabat, 9-12/04/2012
90 / 105
Pointeurs
Exemple
i m p l i c i t none
integer , dimension ( : , : ) , p o i n t e r
integer
read ( , ) n
ALLOCATE( p ( n , n ) )
print , p
DEALLOCATE ( p )
:: p
:: n
Fortran
Rabat, 9-12/04/2012
91 / 105
Pointeurs
Au dbut dun programme un pointeur nest pas dfini : son tat est
indtermin.
La fonction intrinsque NULL permet de forcer un pointeur ltat nul (y
compris lors de sa dclaration).
r e a l , p o i n t e r , dimension ( : )
...
p1 = > NULL ( )
...
: : p1 = > NULL ( )
: : p1 , p2
Fortran
Rabat, 9-12/04/2012
92 / 105
Pointeurs
ASSOCIATED(p) : vrai si p est associ une cible, faux si p est ltat nul
ASSOCIATED(p1, p2) : vrai si p1 et p2 sont alias de la mme cible, faux sinon
ASSOCIATED(p1, c) : vrai si p1 est alias de la cible c faux sinon
Fortran
Rabat, 9-12/04/2012
93 / 105
Pointeurs
Fortran
Rabat, 9-12/04/2012
94 / 105
Travaux pratiques
Gnralits
Dclarations & variables
Oprateurs et expressions
Structures de contrles
Tableaux
Procdures
Entres-Sorties
10
Fonctions intrinsques
11
Pointeurs
12
Travaux pratiques
Gestion de la mmoire
Fortran
Rabat, 9-12/04/2012
95 / 105
Travaux pratiques
Problme tudi
On souhaite rsoudre lquation aux drives partielles suivante
u=g
sur
x(i)
ba
(nx + 2 points)
nx + 1
xi = a + ihx , i = 0, , nx + 1
Fortran
Rabat, 9-12/04/2012
95 / 105
Travaux pratiques
Domaine discrtis
hy
hx
points intrieurs
Violaine Louvet (CNRS/ICJ)
points extrieurs
Fortran
Rabat, 9-12/04/2012
96 / 105
Travaux pratiques
Fortran
Rabat, 9-12/04/2012
97 / 105
Travaux pratiques
Fortran
Rabat, 9-12/04/2012
97 / 105
Travaux pratiques
u(xi , yj ) =
2u
2u
(xi , yj )
(xi , yj )
2
x
y 2
Fortran
Rabat, 9-12/04/2012
97 / 105
Travaux pratiques
Fortran
Rabat, 9-12/04/2012
97 / 105
Travaux pratiques
Fortran
Rabat, 9-12/04/2012
98 / 105
Travaux pratiques
Fortran
Rabat, 9-12/04/2012
99 / 105
Travaux pratiques
Systme linaire Ax = b
A1
A2
A=
A2
A1
..
.
A2
..
.
..
.
..
.
A2
0
A1
A2
0
..
.
0
avec
A1 =
2
hx2
2
hy2
h12
..
h12
..
.
0
..
.
+ h22
y
..
.
..
.
0
..
.
A2
A1
2
hx2
h12
x
..
.
h12
x
0
..
2
hx2
h12
x
Fortran
0
..
.
0
2
hy2
h12
2
hx2
2
hy2
Rabat, 9-12/04/2012
100 / 105
Travaux pratiques
Systme linaire Ax = b
A1
A2
A=
A2
A1
..
.
A2
..
.
..
.
..
.
A2
0
A1
A2
h12
0
0
..
.
h12
y
..
.
..
.
0
..
.
0
h12
h12
0
..
.
0
avec
..
A2 =
0
..
.
A2
A1
..
.
0
..
.
..
.
y
Fortran
Rabat, 9-12/04/2012
100 / 105
Travaux pratiques
Systme linaire Ax = b
b=
g(x1 ,y0 )
hy2
x
g(x1 ,y0 )
f (x2 , y1 )+ h2
y
f (x1 , y1 )+ g(xh02,y1 ) +
..
.
f (xi , yj )
..
.
f (xnx , yny )+
g(xnx +1 ,yny )
hx2
Fortran
g(xnx ,yny +1 )
hy2
Rabat, 9-12/04/2012
101 / 105
Travaux pratiques
Stockage de la matrice A
Fortran
Rabat, 9-12/04/2012
102 / 105
Travaux pratiques
Exemple CSR
10 0 0 0
A= 3 9 0 0
0 7 8 7
val = [10, 3, 9, 7, 8, 7]
col_ind = [0, 0, 1, 1, 2, 3]
row_ptr = [0, 1, 3, 6]
Fortran
Rabat, 9-12/04/2012
103 / 105
Travaux pratiques
Rsolution du systme
Fortran
Rabat, 9-12/04/2012
104 / 105
Travaux pratiques
Travaux pratiques
Fortran
Rabat, 9-12/04/2012
105 / 105