Vous êtes sur la page 1sur 156

Rappels de programmation

Fortran
Violaine Louvet1 , trs inspire du cours de lIDRIS ralis par Anne
Fouilloux et Patrick Corde
1

CNRS/ICJ

Rabat, 9-12/04/2012

Violaine Louvet (CNRS/ICJ)

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

Violaine Louvet (CNRS/ICJ)

7
8
9
10
11
12

Fortran

Types drivs et modules


Procdures
Entres-Sorties
Fonctions intrinsques
Pointeurs
Travaux pratiques

Rabat, 9-12/04/2012

2 / 105

Gnralits

Gnralits
Unit de programme
Excution
Syntaxe
Exercice

Gestion de la mmoire

Types drivs et modules

Procdures

Entres-Sorties

10

Fonctions intrinsques

11

Pointeurs

12

Travaux pratiques

Dclarations & variables


Oprateurs et expressions

Structures de contrles

Tableaux

Violaine Louvet (CNRS/ICJ)

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.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

3 / 105

Gnralits

Unit de programme

Un programme source Fortran est compos de parties indpendantes


appeles units de programme (scoping unit) :
le programme principal
les sous-programmes :
I
I

de type subroutine
de type function

les modules
les block data

Organisation des units de programme


Chaque unit comprend une partie dclarative (dclaration des variables
locales, ...) suivie dune partie comportant des instructions excutables.
Idalement, elles peuvent tre dans des fichiers spars.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

4 / 105

Gnralits

Excution

Compilation / Excution

Rappel : compilation/dition de liens


On compile les fichiers contenant les diffrentes units de programme
Eventuellement, on cre une bibliothque avec les fichiers objets gnrs
Lditions de liens permet de gnrer lexcutable partir des fichiers objet
ou des bibliothques crs la compilation

Excution
Processus (en anglais, process) : programme en cours dexcution :
I
I

Un ensemble dinstructions excuter (un programme)


Un espace dadressage en mmoire vive

Violaine Louvet (CNRS/ICJ)

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

Processus lger / Thread


Les threads partagent le mme espace mmoire
les threads peuvent se partager des informations facilement
les threads doivent eux-mmes faire attention ne pas se marcher sur les
pieds : il ny a pas de protection entre les threads dun mme processus
Les threads ont peu dinformations propres

Violaine Louvet (CNRS/ICJ)

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

En format libre, les lignes peuvent tre de longueur quelconque, maximale


de 132 caractres.
Depuis Fortran 90, on oublie le format fixe !
On peut coder plusieurs instructions sur la mme ligne en les sparant
avec ;
On peut coder une instruction sur plusieurs lignes en utilisant le caractre
de continuation &
I

Cas particulier de la chane de caractres :


print *, "Discretization error &
&for poisson solver : ",err

Le caractre ! indique que ce qui suit est un commentaire

Violaine Louvet (CNRS/ICJ)

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

Reformatter ce code correctement (de faon lisible)


Compiler, excuter
Que fait-il ?

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

9 / 105

Dclarations & variables

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

Violaine Louvet (CNRS/ICJ)

Tableaux

Gestion de la mmoire

Types drivs et modules

Procdures

Entres-Sorties

10

Fonctions intrinsques

11

Pointeurs

12

Travaux pratiques

Fortran

Rabat, 9-12/04/2012

10 / 105

Dclarations & variables

Identificateurs

Identificateurs
Donne un nom :
I
I
I

une variable
une constante
une procdure

Rgles suivre :
I

I
I
I

suite de caractres alphanumriques (lettres non accentues, chiffres,


underscore)
une lettre en premier caractre
longueur limite 31 caractres
pas de distinction majuscule/minuscule (case insensitive)

Exemples
Matrix
matrix
mesh_size
nx0

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

10 / 105

Dclarations & variables

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

11 / 105

Dclarations & variables

Prcision des nombres

Prcision des nombres


Simple prcision
Double prcision
Quadruple prcision

4 octets
8 octets
16 octets

7 chiffres dcimaux significatifs


15 chiffres dcimaux significatifs
34 chiffres significatifs

Les types prdfinis en Fortran 90 sont en fait des noms gnriques


renfermant chacun un certain nombre de variantes ou sous-types que lon
peut slectionner laide du paramtre KIND lors de la dclaration des
objets.
Ce paramtre est un mot-cl valeur entire. Cette valeur dsigne la
variante souhaite pour un type donn.
Les diffrentes valeurs du paramtre KIND sont dpendantes du systme
utilis. Elles correspondent, en gnral, au nombre doctets dsirs pour
coder lobjet dclar.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

12 / 105

Dclarations & variables

Prcision des nombres

Rappel darithmtique flottante


Les nombres rels sont reprsents de faon approximative en mmoire
(reprsentation en virgule flottante), avec la convention standardise de la
forme m 2e , o m est la mantisse, 1 m 2 et e lexposant.
Certains rels sont par dfinition impossibles reprsenter en numration
classique : 1/3, ...
La reprsentation en un nombre fixe doctets oblige le processeur faire
appel des approximations afin de reprsenter les rels.
Le degr de prcision de la reprsentation par virgule flottante des rels
est directement proportionnel au nombre de bits allou la mantisse, alors
que le nombre de bits allou lexposant conditionnera lamplitude de
lintervalle des nombres reprsentables.
Plusieurs proprits de larithmtique (associativit, distributivit,...) ne
sont plus valides en arithmtique flottante !

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

13 / 105

Dclarations & variables

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

On peut indiquer le sous-type dsir lors de lcriture des constantes en


les suffixant (pour les constantes numriques) ou de les prfixant (pour les
constantes chanes de caractres) par la valeur du sous-type laide du
caractre _ .

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

14 / 105

Dclarations & variables

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.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

15 / 105

Dclarations & variables

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

Dclarations & variables

Implicit none

Instruction 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.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

17 / 105

Dclarations & variables

Constantes et initialisations

Constantes littrales
Une constante relle simple prcision doit obligatoirement comporter :
I
I

soit le point dcimal, mme sil ny a pas de chiffres aprs la virgule


soit le caractre E pour la notation en virgule flottante

Une constante double precision doit obligatoirement tre crite en virgule


flottante, le E tant remplac par un D
Une constante de type COMPLEX est obtenue en combinant deux
constantes relles entre parenthses spares par une virgule
Une constante chane de caractres est une suite de caractres encadre
par le dlimiteur ou "

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 "

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

18 / 105

Dclarations & variables

Constantes et initialisations

Initialisations
Une initialisation pourra seffectuer au moyen de linstruction DATA
I

les variables initialises par ce moyen hritent de lattribut SAVE : leur


emplacement mmoire est permanent

Fortran permet dinitialiser une variable lors de sa dclaration laide du


symbole =
I
I

Dans ce cas, les caractres : : sont obligatoires


Ces variables hritent aussi de lattribut SAVE

Exemples
REAL
INTEGER
DATA
LOGICAL

a,b,c
n
a , b , n / 1 . 0 , 2.0 , 17/
: : f l a g = .TRUE.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

19 / 105

Dclarations & variables

Constantes et initialisations

Constantes symboliques

Lattribut PARAMETER permet de donner un nom symbolique une


constante littrale

Exemples
INTEGER , PARAMETER
: : n = 1000
DOUBLE PRECISION
: : PI , ZERO
PARAMETER ( PI = 3.14159265d0 , ZERO = 0 . d0 )

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

20 / 105

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x
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.)

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

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.)

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

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.)

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

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.)

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1

OK

Non, on ne peut pas avoir -1 dans un identificateur

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.)

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1

OK

Non, on ne peut pas avoir -1 dans un identificateur

INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

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.)

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1

OK

Non, on ne peut pas avoir -1 dans un identificateur

INTEGER : : 1a
BOOLEAN : : loji

Non, un identificateur ne peut pas commencer par un nombre


Non, type boolean nexiste pas : utiliser logical

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.)

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

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.)

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

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, town= Glasg

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

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.)

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

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

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

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

OK, la valeur de pi sera 3 car cest un entier

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"


INTEGER : : pi = +22/7
LOGICAL : : wibble = .TRUE.

OK

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

OK, la valeur de pi sera 3 car cest un entier

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"


INTEGER : : pi = +22/7
LOGICAL : : wibble = .TRUE.

OK

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

OK, la valeur de pi sera 3 car cest un entier

Non, pas de nom de variable

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"


INTEGER : : pi = +22/7
LOGICAL : : wibble = .TRUE.

OK

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

OK, la valeur de pi sera 3 car cest un entier

Non, pas de nom de variable


OK

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"


INTEGER : : pi = +22/7
LOGICAL : : wibble = .TRUE.

OK

CHARACTER(LEN=*), PARAMETER : : "Bognor"


REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2

Non, pas de nom de variable


OK

OK si pye est un PARAMETER

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, la valeur de pi sera 3 car cest un entier

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"


INTEGER : : pi = +22/7
LOGICAL : : wibble = .TRUE.

OK

CHARACTER(LEN=*), PARAMETER : : "Bognor"


REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2

Non, pas de nom de variable


OK

OK si pye est un PARAMETER


OK, la valeur de b est 2.0

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, la valeur de pi sera 3 car cest un entier

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"


INTEGER : : pi = +22/7
LOGICAL : : wibble = .TRUE.

OK

CHARACTER(LEN=*), PARAMETER : : "Bognor"


REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2

Non, pas de nom de variable


OK

OK si pye est un PARAMETER


OK, la valeur de b est 2.0

LOGICAL(LEN=12) : : frisnet

Non, pas de LEN dans LOGICAL

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, la valeur de pi sera 3 car cest un entier

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"


INTEGER : : pi = +22/7

OK

OK, la valeur de pi sera 3 car cest un entier

LOGICAL : : wibble = .TRUE.

OK

CHARACTER(LEN=*), PARAMETER : : "Bognor"


REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2

OK si pye est un PARAMETER


OK, la valeur de b est 2.0

LOGICAL(LEN=12) : : frisnet

Non, pas de LEN dans LOGICAL

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.)

Non, pas de nom de variable


OK

Non, problmes dans les dlimiteurs

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"


INTEGER : : pi = +22/7

OK

OK, la valeur de pi sera 3 car cest un entier

LOGICAL : : wibble = .TRUE.

OK

CHARACTER(LEN=*), PARAMETER : : "Bognor"


REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2

Non, pas de nom de variable


OK

OK si pye est un PARAMETER


OK, la valeur de b est 2.0

LOGICAL(LEN=12) : : frisnet

Non, pas de LEN dans LOGICAL

CHARACTER(LEN=6) : : you_know = yknow"

Non, problmes dans les dlimiteurs

CHARACTER(LEN=6) : : you_know = "yknow"

OK

INTEGER : : ia ib ic id
DOUBLE PRECISION : : pattie = +1.0D0
DOUBLE PRECISION : : pattie = -1.0E-0
REAL : : poie = 4.*atan(1.)

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"


INTEGER : : pi = +22/7

OK

OK, la valeur de pi sera 3 car cest un entier

LOGICAL : : wibble = .TRUE.

OK

CHARACTER(LEN=*), PARAMETER : : "Bognor"


REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2

Non, pas de nom de variable


OK

OK si pye est un PARAMETER


OK, la valeur de b est 2.0

LOGICAL(LEN=12) : : frisnet

Non, pas de LEN dans LOGICAL

CHARACTER(LEN=6) : : you_know = yknow"

Non, problmes dans les dlimiteurs

CHARACTER(LEN=6) : : you_know = "yknow"

OK

INTEGER : : ia ib ic id

Non, enlever les espaces ou mettre des virgules

DOUBLE PRECISION : : pattie = +1.0D0


DOUBLE PRECISION : : pattie = -1.0E-0
REAL : : poie = 4.*atan(1.)

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"


INTEGER : : pi = +22/7

OK

OK, la valeur de pi sera 3 car cest un entier

LOGICAL : : wibble = .TRUE.

OK

CHARACTER(LEN=*), PARAMETER : : "Bognor"


REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2

Non, pas de nom de variable


OK

OK si pye est un PARAMETER


OK, la valeur de b est 2.0

LOGICAL(LEN=12) : : frisnet

Non, pas de LEN dans LOGICAL

CHARACTER(LEN=6) : : you_know = yknow"

Non, problmes dans les dlimiteurs

CHARACTER(LEN=6) : : you_know = "yknow"

OK

INTEGER : : ia ib ic id

Non, enlever les espaces ou mettre des virgules

DOUBLE PRECISION : : pattie = +1.0D0


DOUBLE PRECISION : : pattie = -1.0E-0
REAL : : poie = 4.*atan(1.)

OK, les : : sont obligatoires cause de linitialisation

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"


INTEGER : : pi = +22/7

OK

OK, la valeur de pi sera 3 car cest un entier

LOGICAL : : wibble = .TRUE.

OK

CHARACTER(LEN=*), PARAMETER : : "Bognor"


REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2

Non, pas de nom de variable


OK

OK si pye est un PARAMETER


OK, la valeur de b est 2.0

LOGICAL(LEN=12) : : frisnet

Non, pas de LEN dans LOGICAL

CHARACTER(LEN=6) : : you_know = yknow"

Non, problmes dans les dlimiteurs

CHARACTER(LEN=6) : : you_know = "yknow"

OK

INTEGER : : ia ib ic id

Non, enlever les espaces ou mettre des virgules

DOUBLE PRECISION : : pattie = +1.0D0

OK, les : : sont obligatoires cause de linitialisation

DOUBLE PRECISION : : pattie = -1.0E-0

OK

REAL : : poie = 4.*atan(1.)

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"


INTEGER : : pi = +22/7

OK

OK, la valeur de pi sera 3 car cest un entier

LOGICAL : : wibble = .TRUE.

OK

CHARACTER(LEN=*), PARAMETER : : "Bognor"


REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2

Non, pas de nom de variable


OK

OK si pye est un PARAMETER


OK, la valeur de b est 2.0

LOGICAL(LEN=12) : : frisnet

Non, pas de LEN dans LOGICAL

CHARACTER(LEN=6) : : you_know = yknow"

Non, problmes dans les dlimiteurs

CHARACTER(LEN=6) : : you_know = "yknow"

OK

INTEGER : : ia ib ic id

Non, enlever les espaces ou mettre des virgules

DOUBLE PRECISION : : pattie = +1.0D0

OK, les : : sont obligatoires cause de linitialisation

DOUBLE PRECISION : : pattie = -1.0E-0

OK

REAL : : poie = 4.*atan(1.)

Ces dclarations sont-elles ou non correctes ? Pourquoi ?


ReAl : : x

OK

CHARACTER : : name

OK

CHARACTER(LEN=10) : : name
REAL : : var-1
INTEGER : : 1a

Non, un identificateur ne peut pas commencer par un nombre

BOOLEAN : : loji
DOUBLE : : X

OK

Non, on ne peut pas avoir -1 dans un identificateur

Non, type boolean nexiste pas : utiliser logical


Non, le type correct est double precision

CHARACTER(LEN=5) : : town = "Glasgow"

OK, town= Glasg

CHARACTER(LEN=*) : : town = "Glasgow"

Non, on ne peut pas avoir len(*) pour un non-PARAMETER

CHARACTER(LEN=*), PARAMETER : : city = "Glasgow"


INTEGER : : pi = +22/7

OK

OK, la valeur de pi sera 3 car cest un entier

LOGICAL : : wibble = .TRUE.

OK

CHARACTER(LEN=*), PARAMETER : : "Bognor"


REAL, PARAMETER : : pye = 22.0/7.0
REAL : : two_pie = pye*2
REAL : : a = 1., b = 2

Non, pas de nom de variable


OK

OK si pye est un PARAMETER


OK, la valeur de b est 2.0

LOGICAL(LEN=12) : : frisnet

Non, pas de LEN dans LOGICAL

CHARACTER(LEN=6) : : you_know = yknow"

Non, problmes dans les dlimiteurs

CHARACTER(LEN=6) : : you_know = "yknow"

OK

INTEGER : : ia ib ic id

Non, enlever les espaces ou mettre des virgules

DOUBLE PRECISION : : pattie = +1.0D0

OK, les : : sont obligatoires cause de linitialisation

DOUBLE PRECISION : : pattie = -1.0E-0

OK

REAL : : poie = 4.*atan(1.)

Non, on ne peut pas utiliser atan dans linitialisation

Dclarations & variables

Exercice

Dclarer les objets suivants


Nom
feet
miles
town
home_town
in_ma
sin_half

Statut
variable
variable
variable
constant
constant
constant

Violaine Louvet (CNRS/ICJ)

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

Dclarations & variables

Exercice

Dclarer les objets suivants


Nom
feet
miles
town
home_town
in_ma
sin_half

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

22 / 105

Dclarations & variables

Exercice

Dclarer les objets suivants


Nom
feet
miles
town
home_town
in_ma
sin_half

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

22 / 105

Dclarations & variables

Exercice

Dclarer les objets suivants


Nom
feet
miles
town
home_town
in_ma
sin_half

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

22 / 105

Dclarations & variables

Exercice

Dclarer les objets suivants


Nom
feet
miles
town
home_town
in_ma
sin_half

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

22 / 105

Dclarations & variables

Exercice

Dclarer les objets suivants


Nom
feet
miles
town
home_town
in_ma
sin_half

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.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

22 / 105

Dclarations & variables

Exercice

Dclarer les objets suivants


Nom
feet
miles
town
home_town
in_ma
sin_half

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

22 / 105

Oprateurs et expressions

Gnralits
Dclarations & variables
Oprateurs et expressions
Structures de contrles
Tableaux

Types drivs et modules

Procdures

Entres-Sorties

10

Fonctions intrinsques

11

Pointeurs

12

Travaux pratiques

Gestion de la mmoire

Violaine Louvet (CNRS/ICJ)

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

si les 2 oprandes sont du mme type alors lexpression arithmtique


rsultante sera de ce type.
si les deux oprandes ne sont pas du mme type alors lexpression
arithmtique sera value dans le type le plus fort relativement la hirarchie
suivante :
INTEGER < REAL < DOUBLE PRECISION < COMPLEX

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

23 / 105

Oprateurs et expressions

Attention
d = 1 . d0 + 5 . 0 . 5

Variable d dclare en DOUBLE PRECISION.


La sous-expression 5.**0.5 est value dans le type REAL car les oprandes de
loprateur ** le sont.
Le reste de lvaluation seffectue ensuite dans le type DOUBLE PRECISION
le rsultat tant finalement stock dans la variable d.
Cette variable d bien que du type DOUBLE PRECISION hrite dun calcul qui a
commenc dans le type REAL, do une perte de prcision. Cela peut induire par la
suite des comportements inattendus lors de lvaluation dexpressions dans lesquelles
figurent cette variable.
En conclusion, lors de lcriture dexpressions avec prsence de constantes relles que
lon dsire valuer en DOUBLE PRECISION, il est impratif dcrire ces constantes
dans ce type.
d = 1 . d0 +5. d0 0.5 d0

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

24 / 105

Oprateurs et expressions

Oprateurs relationnels, logiques, concatnation


Oprateurs relationnels
.LT., <, .LE., <=, .EQ., ==, .NE., /=, .GT., >, .GE. >=
Admettent des oprandes de type INTEGER, REAL ou CHARACTER
Seuls les oprateurs == et/= peuvent sappliquer des COMPLEX
Oprateurs logiques
.NOT., .AND., .OR., .EQV., .NEQV.
Les oprandes doivent tre des expressions de type LOGICAL
Oprateur de concatnation
Nadmet que des expressions de type CHARACTER
La chane rceptrice est plus grande que celle affecte, elle est complte laide
du caractre espace
CHARACTER( len =10)
: : ch
ch = BON / / JOUR
Violaine Louvet (CNRS/ICJ)

! 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

Violaine Louvet (CNRS/ICJ)

Gestion de la mmoire

Types drivs et modules

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.

Violaine Louvet (CNRS/ICJ)

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 ]

nom_bloc est une tiquette,


expr est une expression de type INTEGER, LOGICAL ou CHARACTER,
liste1, liste2 sont des listes de constantes du mme type que expr.

Violaine Louvet (CNRS/ICJ)

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 ]

nom_bloc est une tiquette,


controle_de_boucle dfinit les conditions dexcution et darrt de la boucle
[ nom_bloc : ] DO
...
I F ( expr ) EXIT
END DO [ nom_bloc ]

expr expression de type LOGICAL


La condition IF peut tre remplace par une instruction SELECT CASE

Violaine Louvet (CNRS/ICJ)

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

29 / 105

Structures de contrles

Itrations

DO WHILE
[ nom_bloc : ] DO WHILE ( expr )
...
END DO [ nom_bloc ]

nom_bloc est une tiquette,


expr est une expression de type scalaire logique
Le corps de la boucle est excut tant que lexpression est vraie
Exemples
...
eps
= 1 . d08
e r r o r = 1 0 . d0
DO WHILE ( e r r o r > eps )
...
! e f f e c t u e une i t e r a t i o n quelconque
error = . . .
! c a l c u l de l e r r e u r
END DO

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

30 / 105

Structures de contrles

Itrations

CYCLE
[ nom_bloc : ] DO
...
I F ( expr ) CYCLE
END DO [ nom_bloc ]

CYCLE permet dabandonner le traitement de litration courante et de


passer la suivante
La condition IF peut tre remplace par une instruction SELECT CASE
Exemples
...
somme = 0
n = 0
DO
n = n + 1
I F ( n /22 .NE. n ) CYCLE
somme = somme + n
I F ( n > 1000) EXIT
END DO

Violaine Louvet (CNRS/ICJ)

! somme des n e n t i e r s p a i r s < 1000

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

Violaine Louvet (CNRS/ICJ)

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

Dclarations & variables

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)

Instruction et bloc WHERE


Exercice
6

Gestion de la mmoire

Types drivs et modules

Procdures

Entres-Sorties

10

Fonctions intrinsques

11

Pointeurs

12

Travaux pratiques

Fortran

Rabat, 9-12/04/2012

34 / 105

Tableaux

Dclaration

Un tableau est un ensemble dlments de mme type contigus en mmoire.


Pour dclarer un tableau, il est recommand dutiliser lattribut DIMENSION :
TYPE, DIMENSION ( expr1 , expr2 , . . . )

: : tab

un nombre de dimensions maximal de 7


expri indique ltendue du tableau sous la forme :
I
I

dune constante entire, dans ce cas la borne infrieure est 1


dune expression de la forme const1 :const2, indiquant les bornes infrieures
et suprieures.

Exemples
REAL, DIMENSION (1 :5 ,1 :5 ,1 :5)
INTEGER , DIMENSION (10 :1)

Violaine Louvet (CNRS/ICJ)

:: R
:: S

Fortran

Rabat, 9-12/04/2012

34 / 105

Tableaux

Quelques dfinitions

Le rang (rank) dun tableau est son nombre de dimensions.


Le nombre dlments dans une dimension sappelle ltendue (extent) du
tableau dans cette dimension.
Le profil (shape) dun tableau est un vecteur dont chaque lment est
ltendue du tableau dans la dimension correspondante.
La taille (size) dun tableau est le produit des lments du vecteur
correspondant son profil.
Deux tableaux sont dits conformants sils ont le mme profil.
Exemples
! de rang 1 , de p r o f i l ( 1 5 ) , de t a i l l e 15
REAL, DIMENSION ( 1 5 )
:: X
! de rang 2 , de p r o f i l ( 5 , 3 ) , de t a i l l e 15
REAL, DIMENSION ( 1 : 5 , 1 : 3 )
:: Y
! de rang 2 , de p r o f i l ( 5 , 3 ) , de t a i l l e 15
REAL, DIMENSION ( 1 :3 ,0 :2)
:: Z
! Y e t Z conformants

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

35 / 105

Tableaux

Ordre des lments

En mmoire la notion de tableau nexiste pas : les lments sont rangs


les uns la suite des autres.
Pour accder ces lments, dans lordre mmoire, Fortran fait dabord
varier le premier indice, puis le second et ainsi de suite.

(1, 1) (2, 1)

Violaine Louvet (CNRS/ICJ)

(1, 1) (1, 2)

(1, n)

(2, 1) (2, 2)

(2, n)

(m, 1)(m, 2)

(m, n)

... (m, 1) (1, 2) (2, 2)

... (m, 2) ...

Fortran

(1, n) (2, n)

... (m, n)

Rabat, 9-12/04/2012

36 / 105

Tableaux

Initialisation

Fortran permet de manipuler globalement lensemble des lments dun


tableau. On pourra alors utiliser le symbole = comme pour linitialisation
dune variable scalaire.
Exemples
REAL, DIMENSION ( 1 0 0 )

: : X = 3.

Un constructeur de vecteur est un vecteur de scalaires dont les valeurs


sont encadres par les caractres (/ et /) :
Exemples
REAL, DIMENSION ( 4 ) : : h e i g h t s = ( / 5 . 1 0 , 5 . 6 , 4 . 0 , 3 . 6 / )
INTEGER , DIMENSION ( 1 0 ) : : i n t s = ( / 100 , ( i , i = 1 , 8 ) , 100 / )

Violaine Louvet (CNRS/ICJ)

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

Sections rgulires : ensemble dlments dont les indices forment une


progression arithmtique
Une section de tableau est aussi un tableau
Exemples
A( : )
! tableau global
A( 3 : 9 )
! A ( 3 ) a A ( 9 ) par pas de 1
A(8 :3 , 1) ! A ( 8 ) a A ( 3 ) par pas de 1

Sections irrgulires : accder des lments quelconques par lintermdiaire


dun vecteur dindices. Il sagit en fait dune indexation indirecte
Exemples
integer , dimension ( 1 0 , 9 ) : : t a b
tab ( ( / 3 , 5 , 8 / ) , ( / 1 , 5 , 7 / ) ) = 1

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

SHAPE(source) : retourne le profil du tableau pass en argument


SIZE(array[,dim]) : retourne la taille ou ltendue de la dimension dim
UBOUND(array[,dim]), LBOUND(array[,dim]) : retourne les bornes
suprieures/infrieures de chacune des dimensions (ou celle indique par dim)
MINVAL(array,dim[,mask]) ou MINVAL((array[,mask]), MAXVAL(array,dim[,mask])
ou MAXVAL((array[,mask]) : plus petite ou plus grand lment du tableau
Exemples

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

Violaine Louvet (CNRS/ICJ)


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

PRODUCT(array,dim[,mask]) ou PRODUCT(array[mask]) : produit de tous les


lments du tableau
SUM(array,dim[,mask]) ou SUM(array[mask]) : somme de tous les lments du
tableau
DOT_PRODUCT(vector_a,vector_b) : produit scalaire
MATMUL(matrix_a,matrix_b) : produit matriciel

A=

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 / )

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

41 / 105

Tableaux

Instruction et bloc WHERE

Linstruction WHERE permet deffectuer des affectations de type tableau par


lintermdiaire dun filtre (masque logique)
[ nom_bloc : ] WHERE ( mask )
...
ELSE WHERE [ nom_bloc ]
...
END WHERE [ nom_bloc ]

O mask est une expression logique retournant un tableau de logiques.


Exemples
r e a l , dimension ( 1 0 )
...
WHERE ( a > 0 . )
a = log ( a )
ELSE WHERE
a = 1.
END WHERE

Violaine Louvet (CNRS/ICJ)

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

Ligne de code pour :


rcuprer le nombre dlments de A
Le profil de A
la borne infrieure de la deuxime dimension
la borne suprieure de la troisime dimension

Exercice 2
REAL, DIMENSION( 1 0 0 , 1 0 0 )

: : A, B, C

Quelle diffrence entre C=MATMUL(A,B) et C=A*B ?

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

43 / 105

Tableaux

Exercice

Exercice 1
INTEGER , DIMENSION( 1 :1 ,3 ,2) : : A

Ligne de code pour :


rcuprer le nombre dlments de A SIZE(A)
Le profil de A
la borne infrieure de la deuxime dimension
la borne suprieure de la troisime dimension

Exercice 2
REAL, DIMENSION( 1 0 0 , 1 0 0 )

: : A, B, C

Quelle diffrence entre C=MATMUL(A,B) et C=A*B ?

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

43 / 105

Tableaux

Exercice

Exercice 1
INTEGER , DIMENSION( 1 :1 ,3 ,2) : : A

Ligne de code pour :


rcuprer le nombre dlments de A SIZE(A)
Le profil de A SHAPE(A)
la borne infrieure de la deuxime dimension
la borne suprieure de la troisime dimension

Exercice 2
REAL, DIMENSION( 1 0 0 , 1 0 0 )

: : A, B, C

Quelle diffrence entre C=MATMUL(A,B) et C=A*B ?

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

43 / 105

Tableaux

Exercice

Exercice 1
INTEGER , DIMENSION( 1 :1 ,3 ,2) : : A

Ligne de code pour :


rcuprer le nombre dlments de A SIZE(A)
Le profil de A SHAPE(A)
la borne infrieure de la deuxime dimension LBOUND(A,2) vaut 1
la borne suprieure de la troisime dimension

Exercice 2
REAL, DIMENSION( 1 0 0 , 1 0 0 )

: : A, B, C

Quelle diffrence entre C=MATMUL(A,B) et C=A*B ?

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

43 / 105

Tableaux

Exercice

Exercice 1
INTEGER , DIMENSION( 1 :1 ,3 ,2) : : A

Ligne de code pour :


rcuprer le nombre dlments de A SIZE(A)
Le profil de A SHAPE(A)
la borne infrieure de la deuxime dimension LBOUND(A,2) vaut 1
la borne suprieure de la troisime dimension UBOUND(A,3) vaut 2

Exercice 2
REAL, DIMENSION( 1 0 0 , 1 0 0 )

: : A, B, C

Quelle diffrence entre C=MATMUL(A,B) et C=A*B ?

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

43 / 105

Tableaux

Exercice

Exercice 1
INTEGER , DIMENSION( 1 :1 ,3 ,2) : : A

Ligne de code pour :


rcuprer le nombre dlments de A SIZE(A)
Le profil de A SHAPE(A)
la borne infrieure de la deuxime dimension LBOUND(A,2) vaut 1
la borne suprieure de la troisime dimension UBOUND(A,3) vaut 2

Exercice 2
REAL, DIMENSION( 1 0 0 , 1 0 0 )

: : A, B, C

Quelle diffrence entre C=MATMUL(A,B) et C=A*B ?


I

le premier effectue une multiplication matricielle, le second une multiplication


lment par lment

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

43 / 105

Gestion de la mmoire

Gnralits

Dclarations & variables

Oprateurs et expressions

Structures de contrles

Tableaux

Gestion de la mmoire
Modes dallocation
Tableaux automatiques

Violaine Louvet (CNRS/ICJ)

Tableaux dynamiques
Exercice
7

Types drivs et modules

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

Trois modes dallocation mmoire :


Allocation statique :
Lespace mmoire ncessaire est spcifie dans le code source. Lors de
lexcution, aucune allocation na lieu. Avantage au niveau des
performances : on vite les cots de lallocation dynamique lexcution,
la mmoire statique est immdiatement utilisable.
Allocation sur la pile :
La pile (stack en anglais) est utilise pour stocker des variable locales
une fonction et pour passer des paramtres cette fonction. La mmoire
alloue dans la pile est toujours phmre et sera libre la sortie de la
fonction.
Allocation sur le tas :
Le tas (heap en anglais) est utilis lors de lallocation dynamique de
mmoire durant lexcution dun programme, la demande de celui-ci par
le biais de fonctions dallocation (malloc, new en C/C++, allocate en
Fortran).

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

44 / 105

Gestion de la mmoire

Modes dallocation

Problmes lis la mmoire :


Dbordement de pile (stack overflow) : Bug du programme qui crit
lextrieur de lespace allou la pile, crasant ainsi des informations
ncessaires au processus.
I
I

Rcursivit infinie
Variables trop grandes : par exemple tableau de grande dimension non allou
dynamiquement

Dbordement de tas (heap overflow) : Bug du programme qui crit


lextrieur de lespace allou au tas
I
I

Ecriture en dehors des bornes dun tableau allou dynamiquement


...

En gnral, provoque un arrt du programme sur une Segmentation Fault

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

Pour pouvoir excuter ce sous-programme, linterface doit tre explicite


un tableau automatique ne peut tre initialis
Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

46 / 105

Gestion de la mmoire

Tableaux dynamiques

Apport intressant de la norme Fortran 90 : allocation dynamique de mmoire.


On spcifie lattribut ALLOCATABLE au moment de la dclaration du tableau. Un
tel tableau sappelle tableau profil diffr (deffered-shape-array).
Son allocation seffectue grce linstruction ALLOCATE laquelle on indiquera le
profil dsir.
Linstruction DEALLOCATE permet de librer lespace mmoire allou.
La fonction intrinsque ALLOCATED permet dinterroger le systme pour savoir si
un tableau est allou ou non.
Exemple
r e a l , dimension ( : , : ) , ALLOCATABLE : : a
integer
: : n ,m, e t a t
read , n , m
i f ( . n o t . ALLOCATED( a ) ) then
ALLOCATE ( a ( n ,m) , s t a t = e t a t )
i f ( e t a t / = 0 ) then
p r i n t , " E r r e u r a l l o c a t . t a b l e a u a " ; stop 4
end i f
end i f
...
DEALLOCATE ( a )
Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

47 / 105

Gestion de la mmoire

Tableaux dynamiques

Il nest pas possible de rallouer un tableau dj allou. Il devra tre libr


auparavant.
Un tableau local allou dynamiquement dans une unit de programme a
un tat indtermin la sortie (RETURN/END) de cette unit sauf dans
les cas suivants :
I
I

lattribut SAVE a t spcifi pour ce tableau,


une autre unit de progr. encore active a visibilit par use association sur ce
tableau dclar dans un module,
cette unit de progr. est interne. De ce fait (host association), lunit hte peut
encore y accder.

Violaine Louvet (CNRS/ICJ)

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.

Violaine Louvet (CNRS/ICJ)

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

p r i n t , " E n t r e z l e nombre de l i g n e s : "


read ( , ) n
p r i n t , " E n t r e z l e nombre de colonnes : "
read ( , )m
!
a l l o c a t e ( mat ( n ,m) , s t a t = e r r )
i f ( e r r / = 0 ) then
print , " Erreur d a l l o c a t i o n "
stop 4
endif
! Remplissage des l i g n e s de rang p a i r avec l e n t i e r 1
mat (2 : n : 2 , : ) = 1
! Remplissage des l i g n e s de rang i m p a i r avec l e s e n t i e r s 1 , 2 , . . .
k=1
do i =1 ,n , 2
do j =1 ,m
mat ( i , j )= k
k = k+1
end do
end do
! On imprime l a m a t r i c e obtenue apres r e m p l i s s a g e
do i = 1 , n
p r i n t , mat ( i , : )
end do
d e a l l o c a t e ( mat )
end program
atrix
Violaine Louvetm(CNRS/ICJ)
Fortran
Rabat, 9-12/04/2012

50 / 105

Types drivs et modules

Dfinition et dclaration de
structures
Symbole % daccs un champ
Modules
Exercice

Gnralits

Dclarations & variables

Oprateurs et expressions

Procdures

Structures de contrles

Entres-Sorties

Tableaux

10

Fonctions intrinsques

Gestion de la mmoire

11

Pointeurs

Types drivs et modules

12

Travaux pratiques

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

51 / 105

Types drivs et modules

Dfinition et dclaration de structures

Tableau : objet regroupant des donnes de mme type repres par


un/des indices numriques.
Ncessit de dfinir un objet composite (structure de donnes) regroupant
des donnes (champs ou composantes) htrognes. Chaque champ est
identifi par son nom. Sa dclaration ncessite la dfinition pralable du
type driv tendant les types prdfinis.
Exemple : stockage Yale Sparse Matrix
type YSM
integer
: : nn ,m
r e a l , dimension ( : ) , a l l o c a t a b l e
integer , dimension ( : )
: : ia
integer , dimension ( : )
: : ja
end type YSM
...
type (YSM)
: : matr
...

Violaine Louvet (CNRS/ICJ)

:: a

Fortran

Rabat, 9-12/04/2012

51 / 105

Types drivs et modules

Symbole % daccs un champ

Le symbole % permet daccder un champ dune structure de


donne.
I
I
I

matr : structure de donnes de type driv YSM


matr%nn : champ nn de la structure matr
matr%ia : tableau dynamique dentiers

Exemple : matrice tridiagonale


type (YSM)

: : matr

matr%m = 100 ! nbre de l i g n e s de l a m a t r i c e


matr%nn = 3( matr%m2)+4 ! nbre d elements non n u l s
a l l o c a t e ( matr%i a ( matr%m+ 1 ) , matr%j a ( matr%nn ) )

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

52 / 105

Types drivs et modules

Modules

Modules
Un module est une unit de programme particulire introduite en Fortran
90 pour encapsuler entre autres :
I
I

des donnes et des dfinitions de types drivs,


des procdures (aprs linstruction CONTAINS)

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

un fichier objet de mme nom suffix par .o,


autant de fichiers nom_module.mod quil y a de modules

Si un module fait appel (USE) dautres modules, ces derniers doivent


avoir t prcdemment compils

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

53 / 105

Types drivs et modules

Modules

Exemple : stockage Yale Sparse Matrix


module YSM_mod
type YSM
integer
: : nn ,m
r e a l , dimension ( : ) , a l l o c a t a b l e
integer , dimension ( : )
: : ia
integer , dimension ( : )
: : ja
end type YSM

:: a

contains
subroutine YSMcreate ( matr ,m)
type (YSM)
: : matr
integer
:: m
...
end subroutine YSMcreate
end module YSM_mod

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

54 / 105

Types drivs et modules

Exercice

Exercice

Construire un module MyComplexMod contenant un type driv


MyComplex compos de deux rels
Crer un programme (dans un autre fichier) initiant 2 nombres complexes
de type MyComplex
Compiler, tester

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

55 / 105

Types drivs et modules

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

end module MyComplexMod


program Complex
use MyComplexMod
i m p l i c i t none
type ( MyComplex )

: : yc1 , yc2

yc1%x r = 1 . ; yc1%x i = 0 . 5
yc2%x r =2.6 ; yc2%x i = 1 . 3
end program Complex

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

56 / 105

Procdures

Gnralits

Dclarations & variables

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

Violaine Louvet (CNRS/ICJ)

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

Argument de type tableau

Lorsque lon transmet un tableau en argument il est commode de


transmettre galement ses dimensions afin de pouvoir dclarer largument
muet correspondant au sein de la procdure appele
Lorsquun tableau est pass en argument cest ladresse de son premier
lment qui est transmise.
De faon gnrale, supposons que lon dispose dun tableau tab 2
dimensions constitu de n lignes et m colonnes. Ladresse de llment
tab(i,j) est :
@tab(i, j) = @tab(1, 1) + [n (j 1) + (i 1)] taille(element)
Le nombre de colonnes m nintervient pas dans ce calcul.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

58 / 105

Procdures

Arguments

Attention

Dune faon gnrale, si le tableau dclar dans la procdure est de rang


r, seules les r-1 premires dimensions sont ncessaires car la dernire
nintervient pas dans le calcul dadresses
On peut mettre un * la place de la dernire dimension.
A lexcution de la procdure, les tendues de chaque dimension, hormis
la dernire, seront connues mais, la taille du tableau ne ltant pas, cest
au dveloppeur de sassurer quil ny a pas de dbordement.
Ce type de tableau est dit taille implicite (assumed-size-array).

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

59 / 105

Procdures

Arguments

Section de tableau non contigu en argument dune procdure

Une section de tableau peut tre passe en argument dune procdure.


Si elle constitue un ensemble de valeurs non contigus en mmoire, le
compilateur peut tre amen copier au pralable cette section dans un
tableau dlments contigus pass la procdure, puis en fin de
traitement le recopier dans la section initiale ...
En fait, cette copie (copy incopy out) na pas lieu si les conditions
suivantes sont ralises :
I
I

la section passe est rgulire,


largument muet correspondant est profil implicite (ce qui ncessite que
linterface soit explicite).

Sections non rgulires en argument de procdures :


I
I

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.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

60 / 105

Procdures

Arguments

Argument de type procdure

Une procdure peut tre transmise une autre procdure. Il est


ncessaire de la dclarer dans la procdure appelante avec lattribut
EXTERNAL ou INTRINSIC si elle est intrinsque (cest--dire fournie par
le compilateur).

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

61 / 105

Procdures

Attributs INTENT et OPTIONAL

Un meilleur contrle par le compilateur de la cohrence des arguments est


possible en Fortran 90 deux conditions :
1

amliorer la visibilit de la fonction appele. Par exemple, en la dfinissant


comme interne (CONTAINS). On parle alors dinterface explicite .
prciser la vocation des arguments muets de faon pouvoir contrler
plus finement lusage qui en est fait. Pour ce faire, Fortran 90 a prvu :
I

lattribut INTENT dun argument :


F
F

F
I

INTENT(in) : entre seulement ;


INTENT(out) : sortie seulement (dans la procdure, largument muet doit tre
dfini avant toute rfrence cet argument) ;
INTENT(inout) : entre et sortie.

lattribut OPTIONAL pour dclarer certains arguments comme optionnels et


pouvoir tester leur prsence ventuelle dans la liste des arguments dappel
(fonction intrinsque PRESENT).

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 . . .

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

62 / 105

Procdures

Dure de vie et visibilit des identificateurs

On appelle dure de vie dun identificateur le temps pendant lequel il


existe en mmoire.
Il est visible sil existe en mmoire et est accessible.
Par dfaut, une variable a une dure de vie limite celle de lunit de
programme dans laquelle elle a t dfinie.
lattribut SAVE permet de prolonger la dure de vie celle de lexcutable :
on parle alors de variable permanente ou statique.
Dans une unit de programme linstruction SAVE sans spcification de
liste de variables indique que toutes les variables de cette unit sont
permanentes.
Une compilation effectue en mode static force la prsence de linstruction
SAVE dans toutes les units de programme, ce qui implique que toutes les
variables sont permanentes.
Par contre si elle est faite en mode stack, les variables permanentes sont :
I
I

celles pour lesquelles lattribut SAVE a t prcis,


celles initialises la dclaration (via linstruction DATA ou laide du signe
= ).

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

63 / 105

Procdures

Subroutines et functions

Lappel dune procdure de type SUBROUTINE seffectue laide de


linstruction CALL suivie du nom de la procdure appeler avec la liste
des arguments dappels entre parenthses.
Au sein de celle-ci, linstruction return permet de forcer le retour la
procdure appelante.
Un autre moyen de transmettre des valeurs une unit de programme est
lutilisation dune procdure de type FUNCTION.
la diffrence dune SUBROUTINE, une FUNCTION retourne une valeur ;
celle-ci est donc type. De plus, son appel seffectue en indiquant
uniquement son nom suivi entre parenthses de la liste des arguments
dappels.
Au sein de la fonction, linstruction return sert transmettre la procdure
appelante la valeur retourner. Celle-ci nest ncessaire que dans le cas
o on dsire effectuer ce retour avant la fin de la dfinition de la fonction.
Dans la procdure appelante, lexpression correspondante lappel de la
fonction est remplace par la valeur retourne.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

64 / 105

Procdures

Interface explicite

Une interface de procdure est constitue des informations ncessaires


permettant la communication entre plusieurs units de programmes :
I
I

type de la procdure : function ou subroutine


arguments de la procdure (arguments formels), avec leur type et leurs
attributs
proprits du rsultat dans le cas dune fonction.

Par dfaut, interface implicite : les arguments de lappel de la procdure


sont dfinis dans lunit de programme appelant, et les arguments muets
de la procdure sont dfinis dans la procdure.
Dans le cas dune procdure interne, la compilation de lunit appelante et
de la procdure se fait ensemble : contrle de cohrence. Interface
explicite avec une visibilit limite de la procdure.
Dans le cas de procdures externes, la compilation de lunit appelante et
de la procdure se fait sparment, les arguments sont passs par
adresse : pas de contrle de cohrence entre les arguments dappel et les
arguments muets. Ncessit dune interface explicite.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

65 / 105

Procdures

Interface explicite

5 possibilits :
1

procdures intrinsques (Fortran 77 et Fortran 95),

procdures internes (CONTAINS),

prsence du bloc interface dans la procdure appelante,

la procdure appelante accde (USE) au module contenant le bloc


interface de la procdure appele,

la procdure appelante accde (USE) au module contenant la procdure


appele.

Violaine Louvet (CNRS/ICJ)

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

67 / 105

Procdures

Interface explicite

Exemple, suite, dans une autre unit de programme


subroutine maxmin ( vect , v_max , v_min , c t l , rg_max )
i m p l i c i t none
r e a l , dimension ( : ) , i n t e n t ( i n )
r e a l , i n t e n t ( out )
integer , optional , i n t e n t ( out )
integer , i n t e n t ( inout )

:
:
:
:

:
:
:
:

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

68 / 105

Procdures

Interface explicite

Intrt des interfaces explicites :


la transmission du profil et de la taille des tableaux profil implicite et la
possibilit de les rcuprer via les fonctions SHAPE et SIZE,
la possibilit de contrler la vocation des arguments en fonction des
attributs INTENT et OPTIONAL, en particulier linterdiction de passer en
argument dappel une constante (type PARAMETER ou numrique) si
largument muet correspondant a la vocation OUT ou INOUT,
la possibilit de tester labsence des arguments optionnels (fonction
PRESENT),
la dtection des erreurs lies la non cohrence des arguments dappel et
des arguments muets (type, attributs et nombre) ; consquence frquente
dune faute de frappe, de loubli dun argument non optionnel ou de
linterversion de deux arguments.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

69 / 105

Procdures

Exercice

Exercice

A partir du module MyComplexMod, ajouter les fonctions addition, soustraction,


multiplication et division entre 2 nombres complexes :
(a + bi) + (x + yi) = (a + x) + (b + y )i
(a + bi) (x + yi) = (a x) + (b y )i
(a + bi) (x + yi) = (a x b y ) + (a y + b x)i
(a + bi)
(a + bi) (x yi)
=
(x + yi)
x2 + y2

Violaine Louvet (CNRS/ICJ)

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

a d d i t i o n%x r = yc1%x r +yc2%x r


a d d i t i o n%x i = yc1%x i +yc2%x i
end function a d d i t i o n
...
end module MyComplexMod
program Complex
use MyComplexMod
i m p l i c i t none
type ( MyComplex )

: : yc1 , yc2 , yc3

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

Dclarations & variables

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

72 / 105

Entres-Sorties

Introduction

Lexploitation dun fichier au sein dun programme ncessite au pralable son


ouverture qui, en Fortran, est faite au moyen de linstruction OPEN.
Cette instruction permet notamment :
de connecter le fichier un numro dunit logique : cest celui-ci que lon
indiquera par la suite pour toute opration de lecture-criture,
de spcifier le mode dsir : lecture, criture ou lecture-criture,
dindiquer le mode daccs au fichier : squentiel ou direct.
Si louverture du fichier est fructueuse, des lectures-critures pourront tre
lances laide des instructions READ/WRITE par lintermdiaire du numro
dunit logique. Une fois le traitement du fichier termin, on le fermera au
moyen de linstruction CLOSE.

Violaine Louvet (CNRS/ICJ)

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.

Violaine Louvet (CNRS/ICJ)

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

Une opration de conversion est ncessaire au sein des instructions


READ/WRITE (paramtre FMT) car dans un fichier texte (non binaire), les
donnes sont stockes sous forme de caractres.
Descripteur I pour le type INTEGER,
Descripteurs F, E pour le type REAL,
Descripteur L pour le type LOGICAL,
Descripteur A pour le type CHARACTER.
Exemple
WRITE ( UNIT = 1 , FMT = " (10 F8 . 4 , I3 , F6 . 3 ) " )

tab , i , r

10F8.4 : criture des 10 lments du tableau tab. Chacun a un gabarit de


8 caractres avec 4 chiffres en partie dcimale
I3 : criture de lentier i sur 3 caractres
F6.3 : criture du rel r sur 6 caractres avec 3 chiffres en partie dcimale

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

75 / 105

Entres-Sorties

Formats

Format rel : de forme gnrale : Fw.d, Ew.d ou bien Dw.d.


Le nombre rel lire peut tre soit en notation virgule fixe, soit
exponentielle avec, dans ce dernier cas, lexposant prfix de la lettre E ou
D.
Avec les formats Ew.d ou bien Dw.d, en criture, on obtiendra les motifs :
I

S0. XXXXXXXXX
{z
} ESXX
|
d

|
I

{z
w

S0. XXXXXXXXX
|
{z
} DSXX
d

{z
w

avec S : position pour le signe

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

76 / 105

Entres-Sorties

Formats

En Fortran il existe un format implicite appel format libre (list-directed


formatting). Dans linstruction READ/WRITE, on spcifie alors le caractre
* la place du format.
Dans ce contexte, les enregistrements sont interprts comme une suite
de valeurs spares par des caractres appels sparateurs. Cest le type
des variables auxquelles ces valeurs vont tre affectes qui dtermine la
conversion effectuer.
Les caractres interprts comme des sparateurs sont :
I
I

la virgule (,)
le blanc (espace)

Une chane de caractres contenant un caractre sparateur doit tre


dlimite soit par des quotes () soit par des guillemets (").
En entre, plusieurs valeurs identiques peuvent tre regroupes laide
dun facteur de rptition sous la forme n*valeur.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

77 / 105

Entres-Sorties

Accs direct

A la diffrence dun fichier squentiel, il est possible daccder un


enregistrement dun fichier accs direct sans avoir trait les prcdents.
Chaque enregistrement est repr par un numro qui est son rang dans le
fichier.
Leur taille est fixe.
Au sein de linstruction OPEN :
I

le paramtre RECL= est obligatoire, sa valeur indique la taille des


enregistrements (en caractres pour les fichiers textes, dpend du processeur
pour les fichiers binaires),
Si le paramtre FORM nest pas prcis, cest la valeur unformatted qui est
prise en compte.

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.

Violaine Louvet (CNRS/ICJ)

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

&

Le fichier dont le nom est data_bin_direct est connect lunit logique


numro 1
Cest un fichier binaire accs direct (ACCESS="direct" et paramtre
FORM absent donc considr gal unformatted).
Chaque enregistrement fait 400 octets (RECL=400)
On accde lenregistrement de rang n (qui vaut 100)
Le paramtre IOSTAT de linstruction READ permet de rcuprer ltat de
la lecture dans lentier ios : une valeur non nulle positive signale une erreur
du type enregistrement inexistant par exemple.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

79 / 105

Entres-Sorties

Inquire

Linstruction dinterrogation INQUIRE permet de rcuprer un certain


nombre dinformations concernant un fichier ou un numro dunit logique.
Elle permet par exemple de tester si un fichier existe, sil est connect et
dans ce cas de connatre les valeurs des paramtres positionns lors de
son ouverture via OPEN.
Cette interrogation peut tre faite en indiquant soit le numro dunit
logique soit le nom du fichier.

Violaine Louvet (CNRS/ICJ)

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

Les variables form et acces prendront respectivement les valeurs YES et


SEQUENTIAL (si le fichier existe)

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

81 / 105

Entres-Sorties

Units standards

Les fichiers associs au clavier et lcran dune session interactive sont


pr-connects en gnral aux numros dunits logiques 5 et 6
respectivement : en lecture pour le premier, en criture pour le second.
Dans un souci de portabilit, on prfrera utiliser dans les instructions
READ/WRITE le caractre * la place du numro de lunit logique
pour rfrencer lentre standard (READ) ou la sortie standard (WRITE).
Cest la valeur par dfaut du paramtre UNIT.
Linstruction PRINT remplace linstruction WRITE dans le cas o celui-ci
nest pas prcis.

Violaine Louvet (CNRS/ICJ)

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

83 / 105

Fonctions intrinsques

Gnralits
Dclarations & variables
Oprateurs et expressions

Structures de contrles

Tableaux

Gestion de la mmoire

Violaine Louvet (CNRS/ICJ)

Types drivs et modules

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

Mesure de temps, nombres alatoires

CPU_TIME(time) : sous-progr. retournant dans le rel time le temps CPU


en secondes (ou rel < 0 si indisponible). Par diffrence entre deux appels,
il permet dvaluer la consommation CPU dune section de code.
DATE_AND_TIME(date,time,zone,values) : sous-programme retournant
dans les variables (de type caractres) date et time, la date et lheure en
temps dhorloge murale. Lcart par rapport au temps universel est
retourn optionnellement dans zone. Toutes ces informations sont aussi
stockes sous forme dentiers dans le vecteur values.
SYSTEM_CLOCK(count,count_rate,count_max) : sous-programme
retournant dans des variables entires la valeur du compteur de priodes
dhorloge (count), le nombre de priodes/sec. (count_rate) et la valeur
maximale de ce compteur (count_max)
RANDOM_NUMBER(harvest) : sous-progr. retournant un/plusieurs
nombres pseudo-alatoires compris entre 0. et 1. dans un scalaire/tableau
rel pass en argument (harvest).
RANDOM_SEED(size,put,get) : sous-programme permettant de
r-initialiser une srie de nombres alatoires. Tous les arguments sont
optionnels.
Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

84 / 105

Fonctions intrinsques

Mesure de temps, nombres alatoires

Exemple : valuation du temps CPU et du temps dhorloge (elapsed time)


INTEGER : : c p t _ i n i t ,& ! Val . i n i t . compteur p e r i o d e s h o r l o g e
c p t _ f i n , & ! Val . f i n a l e compteur p e r i o d e s h o r l o g e
cpt_max , & ! Val . maximale du compteur d h o r l o g e
freq ,
& ! Nb . de p e r i o d e s d h o r l o g e par seconde
cpt
! Nb . de p e r i o d e s d h o r l o g e du code
REAL
: : temps_elapsed , t1 , t2 , t_cpu
...
! Initialisations
CALL SYSTEM_CLOCK(COUNT_RATE= f r e q , COUNT_MAX=cpt_max )
CALL SYSTEM_CLOCK(COUNT= c p t _ i n i t )
CALL CPU_TIME ( TIME= t 1 )
. . . ! < < P a r t i e du code a e v a l u e r > >
CALL CPU_TIME ( TIME= t 2 )
CALL SYSTEM_CLOCK(COUNT= c p t _ f i n )
!
cpt = c p t _ f i n c p t _ i n i t
I F ( c p t _ f i n < c p t _ i n i t ) c p t = c p t + cpt_max
temps_elapsed = REAL( c p t ) / f r e q
t_cpu = t 2 t 1
!
p r i n t , " Temps elapsed = " , temps_elapsed , " sec . "
p r i n t , " Temps CPU = " , t_cpu , " sec . "

Violaine Louvet (CNRS/ICJ)

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

Evaluation du temps de calcul grce aux fonctions intrinsques

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

Dclarations & variables

Oprateurs et expressions

Structures de contrles

Tableaux

Gestion de la mmoire

Types drivs et modules

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

En C, Pascal : variable contenant ladresse dobjets


En Fortran 90 : alias dobjets
Tout pointeur Fortran a un tat parmi les suivants :
1

Indfini : sa dclaration en tte de programme

Nul : alias daucun objet

Associ : alias dun objet (cible)

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 .

Violaine Louvet (CNRS/ICJ)

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

Violaine Louvet (CNRS/ICJ)

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

Le symbole => sert valoriser un pointeur.


integer , t a r g e t
:: n
integer , p o i n t e r : : p t r 1 , p t r 2
n = 10
p t r 1 => n
p t r 2 => p t r 1
n = 20
print , ptr2
! output : ?

Remarque
p1 et p2 tant deux pointeurs, p2 => p1 implique que p1 prend ltat de p2
(indfini, nul ou associ la mme cible).

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

89 / 105

Pointeurs

Symbole = appliqu aux 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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

90 / 105

Pointeurs

Allocation dynamique de mmoire

Linstruction ALLOCATE permet dassocier un pointeur et dallouer


dynamiquement de la mmoire.

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

Lespace allou na pas de nom, on y accde par lintermdiaire du


pointeur
Pour librer la place alloue on utilise linstruction DEALLOCATE
Aprs lexcution de linstruction DEALLOCATE le pointeur passe ltat
nul.
Linstruction DEALLOCATE applique un pointeur dont ltat est
indtermin provoque une erreur
Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

91 / 105

Pointeurs

Fonction NULL() et instruction NULLIFY

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 ( )

Linstruction NULLIFY permet de forcer un pointeur ltat nul :


real , pointer
n u l l i f y ( p1 )
n u l l i f y ( p2 )

: : p1 , p2

Si deux pointeurs p1 et p2 sont alias de la mme cible, NULLIFY(p1) force


le pointeur p1 ltat nul, par contre le pointeur p2 reste alias de sa cible.
Si p1 est ltat nul, linstruction p2 => p1 force p2 ltat nul.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

92 / 105

Pointeurs

Fonction intrinsque ASSOCIATED

Il nest pas possible de comparer des pointeurs, cest la fonction


intrinsque ASSOCIATED qui remplit ce rle :
I
I
I

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

Le deuxime argument optionnel peut tre au choix une cible ou un


pointeur
Le pointeur ne doit pas tre dans ltat indtermin
Si p1 et p2 sont ltat nul alors ASSOCIATED(p1,p2) renvoie faux.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

93 / 105

Pointeurs

Passage dun pointeur en argument de procdure

Largument muet na pas lattribut pointer :


I
I

le pointeur doit tre associ avant lappel


cest ladresse de la cible associe qui est passe

Largument muet a lattribut pointer :


I
I
I

le pointeur nest pas ncessairement associ avant lappel


cest ladresse du descripteur du pointeur qui est passe
linterface doit tre explicite (pour que le compilateur sache que largument
muet a lattribut pointer)
si le pointeur pass est associ un tableau avant lappel, les bornes
infrieures/suprieures de chacune de ses dimensions sont transmises la
procdure ; elles peuvent alors tre rcupres via les fonctions
UBOUND/LBOUND

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

94 / 105

Travaux pratiques

Gnralits
Dclarations & variables
Oprateurs et expressions
Structures de contrles
Tableaux

Types drivs et modules

Procdures

Entres-Sorties

10

Fonctions intrinsques

11

Pointeurs

12

Travaux pratiques

Gestion de la mmoire

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

95 / 105

Travaux pratiques

Problme tudi
On souhaite rsoudre lquation aux drives partielles suivante

u = f dans = [a, b] [c, d]

u=g

sur

Discrtisation de lintervalle [a, b] suivant laxe des x


hx

x(i)

ba
(nx + 2 points)
nx + 1
xi = a + ihx , i = 0, , nx + 1

Discrtisation de lintervalle [c, d] suivant laxe des y


d c
(ny + 2 points)
ny + 1
y (j) = yj = c + jhy , j = 0, , ny + 1
hy

Violaine Louvet (CNRS/ICJ)

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

Mthode des diffrences finies

u(xi+1 , yj ) 2u(xi , yj ) + u(xi1 , yj )


2u
(xi , yj ) =
+ O(hx2 )
x 2
hx2

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

97 / 105

Travaux pratiques

Mthode des diffrences finies

u(xi+1 , yj ) 2u(xi , yj ) + u(xi1 , yj )


2u
(xi , yj ) =
+ O(hx2 )
x 2
hx2
u(xi , yj+1 ) 2u(xi , yj ) + u(xi , yj1 )
2u
(xi , yj ) =
+ O(hy2 )
2
y
hy2

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

97 / 105

Travaux pratiques

Mthode des diffrences finies

u(xi+1 , yj ) 2u(xi , yj ) + u(xi1 , yj )


2u
(xi , yj ) =
+ O(hx2 )
2
x
hx2
u(xi , yj+1 ) 2u(xi , yj ) + u(xi , yj1 )
2u
+ O(hy2 )
(xi , yj ) =
y 2
hy2

u(xi , yj ) =

Violaine Louvet (CNRS/ICJ)

2u
2u
(xi , yj )
(xi , yj )
2
x
y 2

Fortran

Rabat, 9-12/04/2012

97 / 105

Travaux pratiques

Mthode des diffrences finies

u(xi+1 , yj ) 2u(xi , yj ) + u(xi1 , yj )


2u
(xi , yj ) =
+ O(hx2 )
x 2
hx2
u(xi , yj+1 ) 2u(xi , yj ) + u(xi , yj1 )
2u
+ O(hy2 )
(xi , yj ) =
2
y
hy2
u(xi , yj )

Violaine Louvet (CNRS/ICJ)

u(xi+1 ,yj )+2u(xi ,yj )u(xi1 ,yj )


hx2
u(xi ,yj+1 )+2u(xi ,yj )u(xi ,yj1 )
+
hy2

Fortran

Rabat, 9-12/04/2012

97 / 105

Travaux pratiques

Mthode des diffrences finies


i

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

98 / 105

Travaux pratiques

Mthode des diffrences finies


i

Violaine Louvet (CNRS/ICJ)

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

Violaine Louvet (CNRS/ICJ)

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

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

100 / 105

Travaux pratiques

Systme linaire Ax = b

b=

Violaine Louvet (CNRS/ICJ)

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

On utilisera un stockage creux appel CSR (compressed sparse row). Sa


structure de donnes peut tre reprsente par
val : tableau reprsentant les valeurs non nulles de la matrice.
col_ind : tableau reprsentant les indices des colonnes o on trouve les
valeurs non nulles.
row_ptr : liste des indices o commence chacune des lignes .

Violaine Louvet (CNRS/ICJ)

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]

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

103 / 105

Travaux pratiques

Rsolution du systme

mthode itrative : gradient conjugu

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

104 / 105

Travaux pratiques

Travaux pratiques

A partir des sources proposes, structurer le rpertoire de faon classique


(src, test) et crer les fichiers CMakeLists.txt qui permettront de compiler le
programme.

Crer le type driv CSR.

Dfinir les bonnes tendues de tableaux pour la dfinition des conditions


aux limites (routine setDirichlet).

Calculer le rsidu dans la routine du gradient conjugu partir des


fonctions intrinsques.

Compiler et tester le code


Ajouter lappel la fonction C++ vtkTools.cxx pour la sortie graphique de la
solution.

Violaine Louvet (CNRS/ICJ)

Fortran

Rabat, 9-12/04/2012

105 / 105