Académique Documents
Professionnel Documents
Culture Documents
Cours de Fortran
Cours de Fortran
CLAIRE MICHAUT
Claire.Michaut@obspm.fr
LUTH Observatoire de Paris
5, place Jules Janssen - 92195 Meudon Cedex
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Historique ........................................................................................................................6
II
II.A.1
Le programme principal............................................................................................................................9
II.A.2
II.A.3
Les modules.............................................................................................................................................13
II.B
II.B.1
Le format .................................................................................................................................................15
II.B.2
II.B.3
Commentaires..........................................................................................................................................16
II.B.4
II.C
II.C.1
II.C.2
II.C.3
II.C.4
II.D
II.D.1
Les tableaux.............................................................................................................................................20
II.D.2
II.D.3
II.E
III
III.A
III.B
III.C
III.D
La boucle DO .............................................................................................................................. 29
III.D.1
III.D.2
III.D.3
III.E
IV
Le schma FORALL.................................................................................................................. 31
Les tableaux...............................................................................................................32
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
IV.A
IV.A.1
IV.A.2
IV.B
IV.C
IV.C.1
IV.C.2
IV.C.3
IV.C.4
Les pointeurs..................................................................................................................46
V.A
Introduction................................................................................................................................. 46
V.A.1
Dfinition: ......................................................................................................................................... 46
V.A.2
V.B
V.C
V.C.1
VI
VI.A
VII
En argument de procdure...................................................................................................................... 49
VI.A.2
VI.A.3
VII.A
VII.A.1
VII.A.2
VII.A.3
VII.B
VII.B.1
VII.B.2
VII.B.3
VII.C
VII.D
VII.D.1
VII.D.2
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
VIII
VIII.A
VIII.A.1
VIII.B
VIII.B.1
VIII.C
Linstruction inquire............................................................................................................. 76
VIII.C.2
VIII.D
Linstruction namelist........................................................................................................... 77
VIII.D.1
Dclaration .........................................................................................................................................78
VIII.D.2
Usage ..................................................................................................................................................78
IX
ANNEXE ...................................................................................................................80
IX.A
IX.A.1
Manipulation de bits...........................................................................................................................80
IX.A.2
IX.A.3
IX.A.4
IX.B
IX.C
IX.D
IX.E
Bibliographie .............................................................................................................................. 86
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
HISTORIQUE
Au dbut de l'informatique, le fait de programmer se rvlait fastidieux et peu fiable. Puis apparut
une codification directe des instructions machines, connue sous le nom de code assembleur. Dans les
annes 50, il devint vident quune nouvelle tape dans les techniques de programmation devait tre
franchie.
Cest pourquoi, lanne 1954 voit natre le projet du premier langage symbolique par John Backus
de la socit IBM; Mathematical Formula Translating System dit FORTRAN. Ce langage permet pour
la premire fois lutilisateur de se concentrer sur le problme rsoudre et non sur les instructions de
la machine.
1956- Premier manuel de rfrence qui dfinit le FortranI. Les noms de variables ont jusqu six
caractres et linstruction FORMAT est introduite.
1957- Le FortranII fait son apparition ainsi que les premiers compilateurs commerciaux. Les
sous-programmes et fonctions sont accepts et deviennent compilables indpendamment les uns des
autres.
1958- la fin de lanne, le FortranIII est disponible, mais reste interne la compagnie IBM.
Certaines des nouveauts implantes sont le type logique, les paramtres de procdures.
1962- Le FortranIV est n et restera le langage informatique des scientifiques pendant seize ans.
Il apporte les dclarations de type explicites et linstruction dinitialisation DATA. Entre temps, les
autres constructeurs dveloppent leur compilateur; il faut bientt tablir une norme.
1966- Cration de la norme ANSI (American National Standards Institutes), le FortranIV est
rebaptis Fortran66.
1978- La norme Fortran 77 (ou Fortran V) modernise le langage, car cest la fin des cartes
perfores. On lui doit le type caractre, de meilleures entres/ sorties, un dbut de programmation
structure et des fonctions prdfinies portant un nom gnrique.
Dans le milieu des annes 80, la reconversion Fortran 77 tait bien engage alors que Fortran 66
perdait considrablement du terrain.
Aprs 30 ans d'existence, Fortran n'est plus le seul langage de programmation disponible, mais il
est rest prdominant dans le domaine du calcul numrique l'usage des chercheurs, des techniciens et
des ingnieurs. Dans le but de maintenir le langage correctement jour, le Comit technique X3J3
accrdit par l'ANSI a labor une nouvelle norme.
1991- La norme internationale ISO/ANSI Fortran90 apparat dote dinnovations changeant
profondment le langage. Le Fortran devient modulaire, il permet un calcul vectoriel et un contrle de
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
la prcision numrique. De plus il devient plus fiable grce aux blocs interfaces et soriente vers une
programmation objet.
1995- Les caractristiques dprcies ou obsoltes forment le Fortran 95 et il admet une structure
vectorielle supplmentaire (FORALL) et quelques autres amliorations.
2002- Fin des travaux pour la norme Fortran 2000, publication prvue pour fin 2004 pour la
norme ISO.
Fortran 2005: Correction de Fortran 2000 et probablement dernire norme Fortran.
Plus tard, va-t-on vers un langage F, FOO, F++?
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
II
II.A
De faon trs gnrale, la taille des programmes que lon est amen dvelopper aujourdhui
devient considrable. Les ordinateurs sont de plus en plus puissants, ils sont alors de plus en plus
sollicits dans la vie courante. Et lexigence de lutilisateur na plus de limite. Quant aux chercheurs et
leurs dsirs, rien ne saurait les dcourager, pas mme des dizaines de milliers de lignes de calculs. Or,
ds que lon envisage un travail un tant soit peu ambitieux, on a de plus en plus souvent besoin de
comptences multiples. Cest--dire que les programmes sont dvelopps par plusieurs personnes, qui
hormis le langage informatique commun ne parlent pas forcment le mme jargon technique.
Cest pourquoi, nous avons besoin dun langage structur et dun langage modulaire. La structure
permet une bonne lisibilit dun programme, donc une bonne comprhension et une matrise du codage.
Cest--dire que lon rsout effectivement le problme donn et pas un ersatz qui fonctionne dans 97%
des cas, voire moins! La modularit permet de rpondre aux besoins du Gnie Logiciel. Les modules
fonctionnent quasiment comme des botes noires, ce qui permet dincorporer dans un programme des
parties indpendantes les unes des autres et ne ncessitant pas forcment aux autres dveloppeurs de
prendre connaissance de leur contenu. Il suffit de connatre le nom dappel des procdures dont on a
besoin.
La notion dobjet est plus forte encore, et on les manipule alors compltement comme des botes
noires. Lobjet ralise lui-mme lencapsulation de ses donnes et empche tout accs depuis
lextrieur.
En rcapitulant, Fortran 90 facilite la manipulation des structures (objet de type driv), en offrant
les possibilits suivantes.
Il permet de dfinir des fonctions de manipulation de ces structures:
surcharge des oprateurs +, -, * ,
de nouveaux oprateurs en les associant aux fonctions correspondantes,
autres fonctions ou procdures agissant sur ces structures;
Il permet d'encapsuler le type et les fonctions oprant sur les objets de ce type dans un module
spar. Ce qui permettra d'y accder facilement (USE<module>) en diminuant les sources
d'erreurs, dans toutes les units de programme en ayant besoin;
Il permet de rendre prive les composantes de la structure. Si la dfinition du type se fait dans
un module spar (encapsulation), seules les fonctions ou procdures internes au module ont
accs aux composantes prives (PRIVATE) et peuvent les modifier (scurit).
Sans tre un vrai langage orient objet, Fortran 90 fournit ainsi des extensions objet bien utiles
pour la structuration du programme et sa fiabilit.
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Les procdures externes peuvent tre crites dans des modules, elles deviennent internes au
module. Un module peut contenir des procdures, des dclarations, des affectations de variables, des
types drivs et des blocs interfaces.
Les mots cls sont:
II.A.1
Le programme principal
Le programme principal est une unit de compilation, mais il a la particularit dtre la seule qui
soit excutable. Donc il est la seule qui soit totalement obligatoire. Le programme principal prend
toujours la forme suivante:
PROGRAM nom_du_programme
[instructions de spcification]
[instructions excutables]
CONTAINS
[procdures internes]
END PROGRAM nom_du_programme
L'instruction PROGRAM est facultative, mais conseille. L'instruction END qui gnre l'arrt du
programme est obligatoire. Les instructions de spcification sont des instructions de dclaration, des
dfinitions de type, des blocs INTERFACE. L'instruction CONTAINS indique la prsence d'une ou
plusieurs procdures.
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple II.1
PROGRAM ETOILE
USE DONNEES
IMPLICIT NONE
REAL :: r1, u1, T1
r1 = 1.e-3 ; u1 = 45000. ; T1 = 55635.
r1 = G * u1 * T1
PRINT*,"r1 vaut ", r1
END PROGRAM ETOILE
a) Les sous-programmes
Les sous-programmes, dfinis par le mot-cl SUBROUTINE, dfinissent une action au moyen de
toutes les instructions du langage, dont lappel prend lui-mme la forme et lapparence dune instruction
du langage. La syntaxe gnrale dun sous-programme est la suivante:
b) Les fonctions
Les fonctions, dfinis par le mot-cl FUNCTION, calculent une valeur au moyen de toutes les
instructions du langage, dont lappel prend place au sein dune expression. La syntaxe gnrale dune
fonction est la suivante:
10
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
m = m + 1
n = n + 1
END DO
IF (PRESENT(hmn)) THEN
! Calcul des poids pour linterpolation des donnees.
hm = TT - TeV(m) ; hm1 = TeV(m+1) - TT
hn = rr - rho(n) ; hn1 = rho(n+1) - rr
Vol = (hm + hm1) * (hn + hn1)
hmn(1) = hm * hn / Vol
hmn(2) = hm1 * hn / Vol
hmn(3) = hm * hn1 / Vol
hmn(4) = hm1 * hn1 / Vol
END IF
END SUBROUTINE LOCATE
11
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple II.3
Dans certains cas particuliers, on a besoin quune procdure puisse sappeler elle-mme.
Dordinaire, cette structure de programmation est impossible. Cest pourquoi, il faut tout dabord avertir
le compilateur de ce mode de fonctionnement: on utilise lattribut RECURSIVE devant le nom de la
procdure, quelle soit un sous-programme ou bien une fonction. Attention toutefois au temps de calcul,
qui peut devenir prohibitif, lors de plusieurs appels rcursifs successifs !
Syntaxe gnrale:
u1 = 1; u2 = 3 ; un = 3un1 un2
12
n3
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple II.4
II.A.3
Les modules
Un module est une unit de compilation qui a pour fonction de mettre disposition, aux autres
units de compilation, des ressources logicielles comme des constantes, des variables, des types et des
procdures. Cest une abstraction des donnes et des procdures quil encapsule, ralisant ainsi une
bote noire pour lutilisateur et favorisant la maintenance des applications. Le module nest pas
excutable, il ny a que le programme principal qui le soit. La forme gnrale dun module est la
suivante:
MODULE nom_du_module
[instructions de spcification]
[CONTAINS
[procdures globales]]
[procdures internes]]
END MODULE [nom_du_module]
13
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple II.5
MODULE DONNEES
IMPLICIT NONE
REAL, PARAMETER :: Rgaz = 8.314e7
CONTAINS
SUBROUTINE INIT (r1, u1, T1)
IMPLICIT NONE
REAL, INTENT(IN) :: r1, u1, T1
REAL :: gam, Mach
gam = 5./3.
! Mach = u1/Csound ; nombre de Mach
Mach = u1 * sqrt(131/(gam*Rgaz*T1))
WRITE (6,*) "Le nombre de Mach est de ", Mach
END SUBROUTINE INIT
END MODULE DONNEES
a) Accs aux ressources dun module
Laccs aux ressources dun module se fait grce linstruction use nom_module. Cette ligne
dinstruction se place toujours en tte de lunit utilisatrice, avant le bloc dclaratif et permet
limportation de lintgralit du module dans cette unit de compilation.
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
II.B
FORMAT ET SYNTAXE
II.B.1
Le format
En Fortran 90, on utilisera de prfrence le format libre, qui est une nouveaut de cette norme. Les
lignes ont une longueur maximale de 132 caractres. On peut coder plusieurs instructions sur une mme
ligne en les sparant par un point-virgule ;. Une instruction peut scrire sur plusieurs lignes en
utilisant le caractre de continuation esperluette &. Une chane de caractres crite sur plusieurs
lignes doit tre prcde du & en plus de celui de continuation de la ligne prcdente.
Exemple II.6
II.B.2
Un identificateur est compos dune suite de caractres, limite 31, choisis parmi les lettres (non
accentues), de chiffres (sauf en premire position) et du caractre espace soulign:_.
Lidentificateur sert nommer les objets que le programmateur veut manipuler. Le compilateur ne
distingue pas les majuscules des minuscules, mais on peut toutefois sen servir par soucis de lisibilit.
Exemple II.8: identificateurs autoriss
clight
Nom_de_famille
TypeOfGas
M2
Exemple II.9: identificateurs non autoriss
Nom de famille
TypeOfGas
2M
En Fortran 90, il nexiste pas de mots rservs, on peut donc utiliser des mots cls du langage
comme identificateur. Dans lidal, mieux vaut viter de le faire, pour limiter les risques de confusion.
Un espace est ncessaire entre identificateurs, mots cls et nombres.
15
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
II.B.3
Commentaires
II.B.4
Chanes de caractres
Les chanes de caractres sont encadres par des cotes simples ou doubles ". Elles
neutralisent leffet de tous les autres signes ou mots cls.
Exemple II.11
II.C
Comme toute information stocke en mmoire est code en binaire, il faut une cl pour connatre
la reprsentation initiale de tel ou tel octet. Ainsi une chane de caractres, un nombre ou une valeur
logique peuvent avoir dans labsolu la mme reprsentation binaire, suivant le codage utilis. Cest
pourquoi, nous devons annoncer quel type dobjets nous manipulons, pour diffrencier leur codage
binaire. Le Fortran 90 prvoit cinq types de bases et des combinaisons.
16
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
II.C.1
On voit que lon peut initialiser les variables lors de leur dclaration. Toute variable initialise
devient permanente, elle reoit donc implicitement lattribut save.
II.C.2
Dclaration de constantes
Ces objets reoivent lattribut parameter, et doivent obligatoirement tre initialiss lors de leur
dclaration. Il devient alors interdit de changer leur valeur dans une instruction.
17
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
IMPLICIT NONE
avant tout bloc de dclaration. Ce qui oblige le programmateur dclarer explicitement chaque variable.
La dclaration laide du mot cl TYPE sert crer des types drivs dfinis par le
programmateur. Nous verrons ce point ultrieurement, dans le chapitre II.D.
II.C.3
Les types de base en Fortran 90 sont en fait des noms gnriques renfermant chacun un certain
nombre de sous-types que l'on peut slectionner l'aide du mot cl KIND, lors de la dclaration des
objets. Pour chaque type prdfini correspond un sous-type par dfaut, cest la simple prcision en
gnral.
Les diffrentes valeurs du paramtre KIND sont dpendantes du systme utilis et elles
correspondent au nombre d'octets dsirs pour coder l'objet dclar. Pour les chanes de caractres,
KIND sert indiquer combien doctets sont ncessaires pour coder chaque caractre! Cest utile dans
des alphabets complexes.
Dans une dclaration, on indique soit directement le nombre doctets, soit on donne un exemple du
sous-type dsir.
Exemple II.12
REAL (KIND=8) :: x
rel cod sur 8 octets:
double prcision pour la plupart des calculateurs,
et simple prcision sur Cray C90, par exemple.
INTEGER (KIND=2) :: k entier cod sur 2 octets.
En donnant le sous-type directement en exemple, au lieu du nombre doctets.
Exemple II.13
18
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple II.14
123456_2
34.567005678001_8
2_fleur
ou bien
Exemple II.15
INTEGER, PARAMETER::
123456_deux
34.567005678001_huit
deux_fleur
II.C.4
deux = 2, huit = 8
entier cod sur 2 octets
rel cod sur 8 octets
chane de caractres, chacun cod
sur 2 octets
Cette fonction retourne un paramtre de sous-type qui permet de reprsenter les entiers n, en
fonction de ltendue choisie laide de lentier m, tels que:
SELECTED_INT_KIND(30)
SELECTED_INT_KIND(10)
SELECTED_INT_KIND(10)
retourne -1
retourne 8
retourne 4
b) selected_real_kind (p, r)
Cette fonction reoit au moins un des deux arguments p et m qui sont respectivement la prcision
et l'tendue choisies. Elle renvoie un paramtre de sous-type qui permet de reprsenter les rels
rpondant cette prcision, tels que:
19
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple II.17
SELECTED_REAL_KIND(2,30)
SELECTED_REAL_KIND(20,30)
SELECTED_REAL_KIND(10,10)
SELECTED_REAL_KIND(40,10)
SELECTED_REAL_KIND(20,5000)
c)
retourne
retourne
retourne
retourne
retourne
4
16
8
4
-2
range et precision
RANGE(1234567890)
RANGE(123456.7890)
PRECISION(1.234567890)
II.D
retourne 9
retourne 37
retourne 6
AUTRES TYPES
Dans un souci de fiabilit dans lexcution et lutilisation dun programme, ou une partie, on est
amen dfinir un ensemble de variables. Le fait de les ranger ainsi sous un mme nom de type et dans
un seul type prvient derreurs de manipulation de ces variables et facilite leur dclaration. Les tableaux
sont dj des objets qui regroupent en ensemble de variables, mais cest un cas particulier qui impose
que toutes ces variables soient strictement du mme type.
Dans le cas dobjets plus complexes, regroupant des donnes (champs ou composantes) de
diffrents types, nous allons dfinir un type driv (ou structure) qui tend les types prdfinis, et qui
permet de manipuler ces objets globalement. Chaque composante est identifie par son nom, elle peut
tre soit de type intrinsque soit galement de type driv.
II.D.1
Les tableaux
Un tableau est un ensemble de variables qui sont toutes du mme type, il peut tre prdfini ou de
type driv. Chacune des variables est repre par un indice numrique. La forme dclarative gnrale
est la suivante:
20
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Dans le paragraphe consacr aux tableaux et leur manipulation, nous reviendrons sur les formes
dclaratives des tableaux de taille dynamique.
II.D.2
type nom_type
bloc_declaratif_des_champs
end type nom_type
Restriction du bloc dclaratif:
Lattribut PARAMETER nest pas autoris au niveau dun champ.
Lattribut ALLOCATABLE est interdit au niveau dun champ.
Lattribut POINTER est autoris au niveau dun champ, mais pas TARGET.
Linitialisation dun champ nest possible quen Fortran 95.
Attention:
Un objet de type driv est toujours considr comme un scalaire, mme si un champ possde
lattribut DIMENSION.
Les tableaux dobjets de type drivs sont autoriss et ils peuvent bnficier de lattribut
ALLOCATABLE.
Dfinition multiple de la structure: si le type driv n'est pas dfini de manire unique, par
exemple lorsque la structure est passe en argument de procdure, lattribut SEQUENCE est
obligatoire. Il assure un stockage en mmoire dans le mme ordre des composantes en
mmoire.
21
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
c)
Exemples
Par exemple, un vtrinaire voudrait crer un type driv animal, dans lequel seraient recenss
la race, lge, la couleur et ltat de vaccination de ses patients.
Exemple II.19
TYPE animal
CHARACTER (LEN=20) :: race
REAL :: age
CHARACTER (LEN=15) :: couleur
LOGICAL, DIMENSION(8) :: vacc
END TYPE animal
Il peut ensuite manipuler globalement lobjet animal, ou bien accder chacun de ses champs,
grce loprateur %.
Pour dclarer de nouveaux animaux, il utilise la forme suivante:
Exemple II.20
ponpon%race = chat_de_gouttiere
ponpon%age = 12
ponpon%couleur = noir
ponpon%vacc = (/.true.,.false., .true., .true.,&
.false. ,.false., .true., .true./)
II.D.3
Fortran 90 nest pas un langage orient objet, proprement parl, mais il sen rapproche, car il
possde des extensions objet qui accroissent la fiabilit des programmes et procurent un confort de
programmation. En fait, il lui manque quelques notions, comme la hirarchie de types drivs avec
hritage. La norme Fortran 2000 les prvoit.
Fortran 90 facilite cependant la manipulation des structures (objets de type driv), car il permet:
la dfinition dautres fonctions de manipulation des structures, comme:
la surcharge des oprateurs +, -, * ,
de nouveaux oprateurs en les associant aux fonctions correspondantes,
des autres fonctions ou procdures agissant sur ces structures.
d'encapsuler le type et les fonctions oprant sur les objets de ce type, dans un module spar.
Ce qui permettra d'y accder facilement, avec linstruction USE nom_module
de rendre prives les composantes interne dune structure, avec linstruction PRIVATE.
22
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
II.E
Fortran 90 possde une librairie trs complte de fonctions sur les scalaires. On trouvera bien sr
toutes les fonctions mathmatiques habituelles sur les entiers, les rels, et les complexes. Nous ne
prsenterons pas ces fonctions dans ce cours.
De plus Fortran 90 possde des fonctions:
de manipulation de bits;
de manipulation de chanes de caractres;
de conversion de type;
dinterrogation sur les variables;
des fonctions intrinsques lies lutilisation de tableaux (voir le Chapitre IV.C).
Ces fonctions sont nommes et expliques tout au long du cours, suivant le sujet dvelopp.
23
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
24
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
III
STRUCTURES DE CONTRLE
lorigine, les instructions dun programme sont squentielles: elles sont excutes au fur et
mesure de leur ordre dapparition. Mais rapidement, un programme plus labor a besoin dune
souplesse de contrle: dans tel cas faire ceci, par contre dans tels autre cas faire cela, le refaire n fois,
etc. On a donc besoin dinstructions pour faire des choix et des boucles.
Le programme sera alors crit comme une suite de blocs. Un bloc peut-tre contenu dans un autre,
mais seulement au niveau infrieur. Il ny a pas dimbrication possible, sur le mme niveau de priorit.
Ces suites de blocs forment le langage structur et augmentent la lisibilit du programme.
Un bloc est compos dune instruction initiale contenant le mot cl de la structure, de mots cls
intermdiaires et est ferm par un END mot cl de la structure.
Les mots cls dfinissant les blocs sont:
III.A
LE CHOIX AVEC IF
IF (expression_logique) THEN
bloc1
ELSE
bloc2
END IF
Avec ses variantes:
IF (expression_logique1) THEN
bloc1
ELSE IF (expression_logique2) THEN
bloc2
END IF
25
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Ou plus directement:
IF (expression_logique) THEN
bloc1
END IF
Et encore plus simple, en une seule phrase:
IF (expression_logique)
bloc1
Le bloc IF peut tre tiquet, comme les autres structures prsentes dans la suite. Dans ce cas,
ltiquette doit tre rpte au niveau du END, sa suite. Ltiquette est un identifiant de la structure,
cest--dire un nom; lorsquelle est optionnelle, elle augmente la lisibilit du programme ou bien elle
est rendue obligatoire par la logique du programme. La syntaxe est la suivante:
III.B
Cest une construction compltement nouvelle en Fortran, elle permet de faire un choix multiple,
sans expression logique, car le test porte sur une valeur unique de la variable.
La syntaxe gnrale est la suivante:
26
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
CASE DEFAULT
bloc default
END SELECT [nom]
O val1, val2.. sont des valeurs que peut prendre la variable selectionne var.
Le cas par dfaut englobe tous ceux qui nont pas t explicitement mentionns, il est optionnel.
Exemple III.2
27
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple III.3
III.C
WHERE (expression_logique)
bloc1
ELSEWHERE
bloc2
END WHERE
Remarque: Les blocs dinstructions bloc1 et bloc2 ne peuvent agir que sur des affectations
concernant des tableaux. Dans le membre de droite des instructions, les tableaux sont obligatoirement
conformant avec celui de lexpression logique.
28
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
En Fortran 95, la syntaxe dun bloc WHERE stend grce lajout de filtre de choix logique
ELSEWHERE(filtre), de faon identique au bloc IF, ELSE IF, ELSE, END IF; de plus il peut tre
tiquet comme les structures prcdentes. Le bloc WHERE scrit alors sous la forme suivante:
ELSEWHERE
bloc3
END WHERE [nom]
III.D
LA BOUCLE DO
Trs souvent en programmation, nous avons besoin de reproduire un grand nombre de fois les
mmes instructions. La boucle DO sert alors itrer.
La syntaxe gnrale est la suivante:
III.D.1
Si davance, on sait combien de fois, on a besoin de faire la mme srie doprations, on utilise un
compteur entier.
Le nombre ditrations est le plus grand nombre entre (int2 + int3 int1) / int3 et 0.
Exemple III.4
DO num = 1, 300
T(num) = dx * num + y
END DO
29
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
alenvers: DO i = 201, 2, -1
ux = (i - 1) * 5.e-3
Tx = FUNTEMP (u1, ux, T1, Tx, GT)
fonction
RT = FUNREST (u1, ux, T1, Tx, GT)
fonction
PRINT*, ux, Tx, RT
END DO alenvers
III.D.2
! appel de
! appel de
Dans ce cas, on ne connat pas davance le nombre ditrations, mais on connat plutt un domaine
dans lequel on veut que la srie de calculs soit excut. Ce domaine est dfini par une expression
logique et litration continue tant que cette expression est VRAIE.
Structure gnrale de la boucle DO WHILE:
DO WHILE (eof == 0)
READ (unit=65, iostat=eof), x, y, z
END DO
30
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
III.D.3
On peut aussi construire des boucles, qui sont priori infinies, mais dans laquelle on insre une
clause de sortie. Bien entendu, aucune boucle infinie nest concevable, il faut linterrompre par un
moyen ou un autre.
Pour cela on utilise linstruction EXIT:
III.E
LE SCHMA FORALL
Dun point de vue algorithmique, le schma FORALL remplace certaines boucles DO. Mais pour
le compilateur, il facilite la paralllisation de cette partie de code. La syntaxe du schma FORALL est la
suivante:
31
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
IV
IV.A
LES TABLEAUX
Un tableau est un ensemble d'lments ayant mme type et mme valeur de paramtre de soustype. Il est dfini par son type, son rang, ses tendues, son profil, sa taille. Un tableau peut contenir
jusqu' 7 dimensions.
IV.A.1
Lallocation statique
Il suffit de prciser le type du tableau, puis l'attribut dimension lors de la dclaration en indiquant
uniquement l'tendue de chaque dimension.
IV.A.2
Lallocation dynamique
On parle dallocation dynamique lorsque lon a pas dfini au pralable ltendue du tableau. Il se
peut, en effet, que cette donne ne soit pas connue lors de lcriture du programme, par contre elle le
deviendra pendant lexcution du programme. Ce phnomne est frquemment rencontr lorsquon lit
des donnes dans un fichier gnr par un autre programme. En Fortran 90, nous avons alors la
possibilit de grer de faon dynamique la mmoire alloue un tableau. Il existe pour cela deux
manires distinctes: soit le passage en argument dun tableau, et de sa dimension, dans une procdure,
soit lallocation directe de mmoire.
32
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
33
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
SUBROUTINE SOLVER
IMPLICIT NONE
INTEGER :: npas
REAL, ALLOCATABLE, DIMENSION(:) :: Prad, Frad
ALLOCATE (Prad(npas), Frad(npas), stat = ok)
IF (ok > 0) THEN
PRINT*,"Il y a un probleme d'allocation dans
SOLVER"
STOP
END IF
READ (18,*) Prad, Frad
allocated (array)
Elle renvoie la valeur logique .TRUE. si le tableau allouable array est allou, sinon la valeur
.FALSE..
34
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
IV.B
b) Globale
Attention toutefois la simplicit de lcriture, car bien quelle allge les lignes de programme, il
ne faut pas oublier que derrire un simple identifiant peut se cacher un tableau monstrueux! Dun autre
ct, cette criture compacte fait ressortir lessentiel de la programmation et vite bien des erreurs sur
les bornes et dimensions de tableaux.
Exemple IV.2
tab = 100.
Chacun des 4 lments du tableau tab prend la valeur 100.
Exemple IV.3
tab1 = 100.
tab2 = 2 + tab1
Chacun des 4 lments du tableau tab2 prend la valeur 102.
Exemple IV.4
INTEGER :: i
REAL, DIMENSION(4) :: tab1, tab2=(/1,2,3,4)/)
tab1 = (/10.,15.,20.,25./)
tab2 = tab2 * tab1
Chacun des 4 lments du tableau tab2 prend respectivement la valeur 10; 30; 60; 100.
35
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple IV.5
INTEGER :: i
REAL, DIMENSION(4) :: tab1, tab2=(/ (i, i=1,4)/)
INTEGER :: i
REAL, DIMENSION(4) :: tab1, tab2=(/ (i, i=1,4)/)
Par section
On peut aussi faire rfrence une partie d'un tableau appele section de tableau. Le sous-tableau
ainsi dfini est aussi un tableau.
Les indices sont donns soit par une suite arithmtique lorsqu'on a une section rgulire du tableau
initial, soit par un vecteur dindices, lorsquon veut extraire une section non rgulire.
La section rgulire prend une forme typique: b_inf: b_sup: inc
O b_inf et b_sup sont respectivement les indices infrieure et suprieure de la section choisie, et
inc est un entier qui reprsente lincrment. Par dfaut inc vaut 1. Cest le mme principe que dans la
boucle DO avec clause itrative.
Exemple IV.7
INTEGER :: i
REAL, DIMENSION(20) :: tab1 = (/ (i, i=1,20)/)
REAL, DIMENSION(5) ::
tab2(:) = tab1(1:20:4)
36
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
De plus, on peut combiner les diffrentes manipulations possibles, en voici un certain nombre
dexemples.
Exemple IV.8
37
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
IV.C
Fortran 90 propose toute une gamme de fonctions intrinsques qui offre lavantage de simplifier
lutilisation des tableaux. Nous distinguerons les fonctions passives qui renvoient seulement une
information sur le tableau des fonctions actives qui modifient le tableau.
Dans la suite, on utilisera comme argument les mots suivants:
array qui dsigne le tableau sur lequel on applique la fonction;
vect qui dsigne un vecteur;
mask qui dsigne un tableau dexpressions logiques conformant au tableau array;
dim qui restreint la fonction sappliquer la dimension mentionne.
IV.C.1
shape(array)
Cette fonction retourne un tableau d'entiers de rang 1 qui contient le profil du tableau array.
Exemple IV.12
tab1= 4 50 36
7 28 9
38
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
maxloc (tab1)
minloc (tab1)
lbound (tab1)
ubound (tab1)
size (tab1)
shape(tab1)
donne
donne
donne
donne
donne
donne
(/2, 2/)
(/2, 3/)
(/-1, 1/)
(/1, 3/)
9
(/3, 3/)
allocated (array)
Cette fonction fournit la valeur .TRUE. si le tableau array, dclar avec allocatable, est allou
et la valeur .FALSE. sinon.
IV.C.2
Les fonctions de rduction renvoient soit un scalaire soit un tableau dun rang infrieur celui
pass en argument.
39
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple IV.14
40
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple IV.18
41
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple IV.21
1 3 5 7
tab1=
2 4 6 8
1 2 3 7
et tab2=
5 6 4 8
SUM(tab1)
PRODUCT(tab1, MASK=tab1<6)
SUM(tab2, DIM=2)
PRODUCT(tab2, DIM=2, MASK=tab2>4)
IV.C.3
donne
donne
donne
donne
36
120
(/13, 23/)
(/7, 240/)
a) La fonction merge
merge (array1, array2, mask)
Cette fonction fabrique un tableau, partir des deux tableaux conformants et de mme type array1
et array2, en fonction des critres imposs par le masque. Si la valeur du masque est vrai, on utilise
llment de array1, si la valeur du masque est faux on utilise llment de array2.
Exemple IV.23
1 2 3
tab1= 4 5 6
7 8 9
10 20 30
et tab2= 40 50 60
70 80 90
42
10 20 30
tab1= 40 5 6
7 8 9
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
b) La fonction reshape
reshape (array, shape [, pad] [, order]))
Cette fonction construit un tableau, partir des lments du tableau array, et dont le profil est
donn par le tableau d'entiers positifs de rang 1 shape. Lattribut optionnel pad est un tableau du mme
type de array, dont les lments seront utiliss si la taille de shape est suprieure celle de array.
Exemple IV.24
donne 2 5 8 11
3 6 9 12
c) Les fonctions pack et unpack
pack (array, mask [, vector])
Cette fonction construit un tableau de rang 1, en compressant les valeurs du tableau array, suivant
les critres du masque. Si le vecteur optionnel vector est prsent, le rsultat aura la taille de vector.
1 4 7 10
On a tab1= 2 5 8 11
3 6 9 12
vect1 = (/ (i, i=-12,-1) /)
PACK (tab1, MASK=tab1<10, VECTOR=vect1)
donne
(/1, 2, 3, 4, 5, 6, 7, 8, 9, -3, -2, -1 /)
d) La fonction spread
spread (array, dim, n)
Cette fonction cre un nouveau tableau en dupliquant n fois les valeurs du tableau array, le long de
la dimension mentionne. Le rsultat est un tableau dun rang suprieur array.
43
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Attention: shift est un entier positif, pour un dcalage vers les indices dcroissants (on effectue i =
i-shift), ou un entier ngatifs, pour un dcalage vers les indices croissants. Par dfaut dim est 1.
1 4 7 10
On a tab1= 2 5 8 11
3 6 9 12
CSHIFT (tab1, SHIFT=2, DIM=1)
donne
3 6 9 12
1 4 7 10
2 5 8 11
IV.C.4
44
0 1 4 7
0 2 5 8
0 3 6 9
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
b) matrice transpose
transpose (matrix)
Cette fonction renvoie la matrice transpose du tableau matrix.
45
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
V.A
LES POINTEURS
INTRODUCTION
V.A.1
Dfinition:
Le pointeur est un objet qui peut dsigner des objets diffrents au cours de l'excution d'un
programme, il reoit lattribut POINTER. Il agit comme un alias et est du mme type que les objets
quil pointe. L'objet dsign par le pointeur est appel la cible du pointeur, il doit recevoir lattribut
TARGET. Pour assigner un objet un pointeur, on utilise le symbole de la double flche matrialise
pas les caractres: =>. Un pointeur a aussi le droit dtre valoriser vers un autre pointeur.
La notion de pointeur est surtout utile dans le contexte de lallocation dynamique de mmoire.
V.A.2
Exemple V.1
V.B
46
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Note: en Fortran 95, on peut forcer un pointeur ltat nul, lors de sa dclaration.
c)
On a vu que loprateur => sert valoriser le pointeur. Le pointeur prend alors la valeur de la
cible.
Loprateur = sert affecter une valeur, mais attention lorsque les oprandes sont des
pointeurs, laffectation porte sur la cible et non sur le pointeur.
47
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
V.C
LALLOCATION DYNAMIQUE
Linstruction ALLOCATE, que nous avons dj vu pour lallocation dynamique de mmoire des
tableaux, sert aussi associer un pointeur et lui allouer de la mmoire. Linstruction DEALLOCATE
sert librer la mmoire, comme pour un tableau.
Notes:
Dans ce cas, lespace allou na pas de nom et la seule faon dy accder est dutiliser le
pointeur. Le pointeur est lalias direct du chemin qui mne cette mmoire.
Aprs linstruction DEALLOCATE, le pointeur est dans ltat nul.
On ne peut pas excuter linstruction DEALLOCATE sur un pointeur dont ltat est
indtermin.
On peut aussi faire de lallocation dynamique de mmoire pour des variables, par
lintermdiaire de pointeurs.
Exemple V.2: tri de chane de caractres
MODULE CHAINE
END MODULE CHAINE
PROGRAM TRI_CHAINE
IMPLICIT NONE
CHARACTER (LEN=80), DIMENSION(:), TARGET :: chaine
CHARACTER (LEN=80), DIMENSION(:), POINTER :: ptr_ch
CHARACTER (LEN=80), POINTER :: ptr_int
INTEGER :: num, i
LOGICAL :: fini
PRINT*, Quel est le nombre de chaines ?
READ(*,*) num
ALLOCATE(chaine(num), ptr_ch(num))
lis : DO i = 1, num
PRINT*, Donnez votre message :
READ(*,*) chaine(i)
ptr_ch(i) => chaine(i)
END DO
48
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
tri_tous : DO
fini = .TRUE.
tri_chacun : DO i = 1, num-1
IF (chaine(i) > chaine(i+1)) THEN
fini = .FALSE.
ptr_int
=> ptr_ch(i)
ptr_ch(i)
=> ptr_ch(i+1)
ptr_ch(i+1) => ptr_int
END IF
END DO tri_chacun
IF (fini) EXIT
END DO tri_tous
END PROGRAM TRI_CHAINE
Dans lexemple prcdent, on aurait pu faire le mme tri laide dun tableau ALLOCATABLE,
la place du tableau de pointeurs. Nanmoins, il parat que le temps dexcution dun programme est
amlior dans le cas de tableaux de grandes tailles et de longues chanes de caractres! Car la gestion
de la mmoire diffre dans ces deux cas.
V.C.1
En argument de procdure
49
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
c)
Si un argument en appel de procdure a l'attribut TARGET, tout pointeur l'ayant pour cible au
moment de lappel, devient indfini au retour de la procdure. De faon gnrale, la norme ne garantit
pas la conservation de lassociation du pointeur entre sa cible passe en argument dappel de procdure
et la cible correspondante en argument muet.
50
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
51
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
VI
VI.A
CONTRLE DE VISIBILIT
Il est souvent souhaitable que lintgralit des ressources dun module ne soit pas accessible par
les autres units de programme. En effet, lorsquon dfinit un module, on souhaite faire partager un
certain nombre de variables, de dfinitions de type, de procdures, via linstruction use nom_module;
mais pour des besoins spcifiques ce module, on est en droit de dfinir des ressources propres ce
module.
Les ressources non visibles depuis lextrieur sont dites prives (private).
Tandis que les ressources visibles depuis lextrieur sont dites publiques (public).
MODULE PARAM
IMPLICIT NONE
INTEGER, DIMENSION(:) :: par
PRIVATE
! tout le module devient priv.
REAL :: x, y
INTEGER :: i, j
END MODULE PARAM
b) Les attributs PUBLIC et PRIVATE
Si lon veut rendre public ou priv nimporte quel objet dun module (ou dune procdure), on lui
affecte soit lattribut PUBLIC ou soit lattribut PRIVATE, directement lors de sa dclaration.
52
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Syntaxe gnrale:
MODULE INIT
IMPLICIT NONE
INTEGER, DIMENSION(:) :: par
PRIVATE
! rend lenvironnement priv.
REAL :: x, y
INTEGER :: i, j
REAL, DIMENSION(:), PUBLIC :: vect
! rend public le tableau vect, donc exportable.
PUBLIC :: lect
CONTAINS
SUBROUTINE lect (x,y)
VI.A.2
On parle de type driv semi-priv lorsquun type driv, dfini au chapitre II.D.2, est public, mais
dont toutes les composantes sont prives. Son intrt est de permettre au dveloppeur de modifier la
structure du type driv, sans affecter les autres units de programme qui lutilisent.
Les attributs PUBLIC et PRIVATE s'appliquent aux types drivs, comme pour les autres types de
variables.
Alors un type driv est soit:
transparent: il est public et ses composantes sont aussi publiques;
semi-priv: il est public et ses composantes sont toutes prives;
ou priv.
53
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple VI.1
MODULE BASE
TYPE STAR
PRIVATE
INTEGER :: num
REAL, DIMENSION(:), POINTER:: lambda
END TYPE STAR
END MODULE BASE
Dans cet exemple, de dfinition dun type semi-priv, seules des procdures internes au module
base peuvent accder aux champs de la variable de type star.
Exemple VI.2
MODULE BASE
TYPE STAR
PRIVATE
INTEGER :: num
REAL, DIMENSION(:), POINTER:: lambda
END TYPE STAR
CONTAINS
FUNCTION VALOR(b1, b2)
IMPLICIT NONE
TYPE (STAR) :: b1, b2
b1%num = b2%num - 1
valor = (b1%lambda + b2%lambda) / 2.
VI.A.3
De la mme manire que lon peut rendre priv certaines ressources dun module, on peut limiter
laccs aux ressources dun module, lors de linstruction USE, dans lunit utilisatrice.
Syntaxe gnrale:
54
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple VI.3
MODULE PARAM
IMPLICIT NONE
INTEGER, DIMENSION(:) :: par
REAL :: x, y
INTEGER :: i, j
END MODULE PARAM
PROGRAM MACHINE
USE PARAM, ONLY : x, y
! seules ces 2 variables sont accessibles
MODULE PARAM
IMPLICIT NONE
INTEGER, DIMENSION(:) :: par
REAL :: x, y
INTEGER :: i, j
END MODULE PARAM
PROGRAM MACHINE
USE PARAM, ONLY : x=>varx, y=>vary
55
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
VII
VII.A
CONTRLE DE COHRENCE
Exemple VII.1
56
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
57
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple VII.2
58
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple VII.3
59
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
! Appels corrects
CALL EVALDIM (x, y)
CALL EVALDIM (x, y, min=eps)
CALL EVALDIM (min=eps, max=hug, a=x, b=y)
CALL EVALDIM (min=eps, prec=mic, a=x, b=y)
CALL EVALDIM (x, y, eps, hug)
CALL EVALDIM (x, y, max=hug, prec=mic)
VII.B
INTERFACE DE PROCDURE
interface
procedure nom_procedure (list_arg)
bloc dclaratif de list_arg
end procedure nom_procedure
end interface
o le bloc dclaratif est une duplication de la partie dclarative de la procdure.
60
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
PROGRAM CHOC
IMPLICIT NONE
REAL :: rr1, uu1, TT1, rr2, uu2, TT2
REAL, EXTERNAL :: FuncGas
INTERFACE
SUBROUTINE STRUCT (r1, u1, T1, r2, u2, T2, FuncGas, TG)
REAL, INTENT(IN) :: r1, u1, T1, r2, u2, T2
REAL, EXTERNAL :: FuncGas
CHARACTER(LEN=2), INTENT(IN) :: TG
END SUBROUTINE STRUCT
END INTERFACE
61
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Integre_choc : DO n = 1, nstep
rr = f(1,1) * r1 ; TT = f(3,1) * T1
IF (rr>rho(nmax) .or. TT>TeV(mmax) ) THEN
EXIT Integre_choc
END IF
CALL RUNGEKUTTA (z, h, f, 3, n, FuncGas)
END DO Integre_choc
MODULE INTERHYDRO
INTERFACE
SUBROUTINE STRUCT (r1, u1, T1, r2, u2, T2,&
FuncGas, TG)
REAL, INTENT(IN) :: r1, u1, T1, r2, u2, T2
REAL, EXTERNAL :: FuncGas
CHARACTER(LEN=2), INTENT(IN) :: TG
END SUBROUTINE STRUCT
END INTERFACE
END MODULE INTERHYDRO
62
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
PROGRAM CHOC
USE INTERHYDRO
! Insertion de linterface
IMPLICIT NONE
REAL :: rr1, uu1, TT1, rr2, uu2, TT2
REAL, EXTERNAL :: FuncGas
Integre_choc : DO n = 1, nstep
rr = f(1,1) * r1 ; TT = f(3,1) * T1
IF (rr>rho(nmax) .or. TT>TeV(mmax) ) THEN
EXIT Integre_choc
END IF
CALL RUNGEKUTTA (z, h, f, 3, n, FuncGas)
END DO Integre_choc
63
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple VII.7
MODULE INTERHYDRO
CONTAINS
SUBROUTINE STRUCT (r1, u1, T1, r2, u2, T2, FuncGas, TG)
IMPLICIT NONE
REAL, INTENT(IN) :: r1, u1, T1, r2, u2, T2
REAL, EXTERNAL :: FuncGas
CHARACTER(LEN=2), INTENT(IN) :: TG
INTEGER, PARAMETER :: nvar = 3, nstep = 1e4
REAL, DIMENSION(nvar, 2) :: f
INTEGER :: n, i, j, k, jm, km, count
REAL :: rr, uu, TT, z, z0, h
Integre_choc : DO n = 1, nstep
rr = f(1,1) * r1 ; TT = f(3,1) * T1
IF (rr>rho(nmax) .or. TT>TeV(mmax) ) THEN
EXIT Integre_choc
END IF
CALL RUNGEKUTTA (z, h, f, 3, n, FuncGas)
END DO Integre_choc
64
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
VII.C
INTERFACE GNRIQUE
Le bloc interface peut servir aussi regrouper une famille de procdure, sous un mme nom. La
procdure sera appele dans une unit de programme par son nom de famille, ou nom gnrique. La
procdure qui sera rellement utilise lors de lappel est choisie pas le compilateur en fonction des
instructions du bloc interface. Le bloc interface doit alors possder un nom, qui sera le nom gnrique
des procdures concernes.
65
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Syntaxe gnrale:
interface nom_generique
procedure nom1 (list_arg1)
bloc declaratif de nom1
end procedure nom1
procedure nom2 (list_arg2)
bloc declaratif de nom2
end procedure nom2
INTERFACE moyenne
FUNCTION moy_int (tab_int)
INTEGER, DIMENSION(:) :: tab_int
END FUNCTION moy_int
FUNCTION moy_real (tab_real)
REAL, DIMENSION(:) :: tab_real
END FUNCTION moy_real
FUNCTION moy_comp (tab_comp)
COMPLEX, DIMENSION(:) :: tab_comp
END FUNCTION moy_comp
END INTERFACE moyenne
Dans cet exemple, la fonction moyenne accepte en argument un tableau de rang1 soit dentiers,
soit de rels, soit de complexes. La moyenne sera effectivement calcule en faisant appel la fonction
correspondant au type de largument donn.
VII.D
La notion de surcharge des oprateurs prdfinis par le langage est propre aux langages orients
objets. On entend par surcharge dun oprateur: un largissement de son champ dapplication. Il faut,
66
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
bien entendu, dfinir les nouvelles oprations entre les objets. La surcharge d'un oprateur impose de
respecter sa nature et les rgles de priorit prcdemment dfinie dans le langage.
Habituellement, un oprateur retourne une valeur, construite en fonction des expressions donnes.
On emploie alors des procdures de type FUNCTION pour surcharger les oprateurs. Toutefois, une
exception est faite pour loprateur daffectation = qui ne retourne aucune valeur, il faut donc
utiliser une procdure de type SUBROUTINE, pour surcharger cet oprateur.
On dfinit la surcharge dun oprateur grce un bloc INTERFACE.
Remarque: en gnral, la surcharge est dfinie dans un module.
Remarque: Certains oprateurs ont dj fait l'objet d'une surcharge au sein du langage.
end interface
ou:
end interface
Remarque: Les arguments de la fonction, associe un oprateur pour sa sur-dfinition, doivent
avoir lattribut intent(in).
67
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple VII.9
MODULE TYPMAT
TYPE MAT_INT
INTEGER :: lin, row
INTEGER :: DIMENSION(:,:), POINTER :: ptr_mat
EN TYPE MATRICE
END MODULE TYPMAT
INTERFACE OPERATOR (*)
FUNCTION MULT(a, b)
USE TYPMAT
TYPE (mat_int), INTENT (IN) :: a, b
TYPE (mat_int) :: mult
END FUNCTION MULT
END INTERFACE
TYPE (mat_int) FUNCTION MULT(a, b)
USE TYPMAT
TYPE (mat_int) , INTENT (IN) :: a, b
INTEGER, TARGET, PRIVATE :: i, j
INTEGER :: ok
i = a%lin ; j = b%row
mult%lin = i ; mult%row = j
ALLOCATE(mult%ptr_mat(i,j), stat=ok)
IF (ok > 0) THEN
PRINT*, Erreur dallocation de mult
STOP 120
END IF
mult%ptr_mat = MATMUL(a%ptr_mat, b%ptr_mat)
END FUNCTION MULT
68
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
OPERATOR, se reporter donc lexemple prcdent. Par contre, on utilisera une procdure de type
subroutine pour sur dfinir laffectation.
Syntaxe gnrale:
end interface
Remarque: Les arguments de la subroutine, associe loprateur = pour sa sur-dfinition,
doivent avoir respectivement:
lattribut intent(out) ou intent(inout), pour le premier argument, qui est loprande de
gauche;
lattribut intent(in), pour le second argument, qui est loprande de droite.
69
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
70
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
INTEGER :: n, k
CHARACTER (LEN=10), PRIVATE :: name = 'graphX.out'
INTEGER, PRIVATE :: iname = 0
DO k = 1, n
iname = iname + 1
WRITE(name(6:6),'(i1)') iname
EN DO
b) le format
Pour crire un format denregistrement, il faut connatre quelques rgles: on prcise le type
denregistrement, le nombre total de caractres, le nombre de chiffres significatifs pour les nombres
dcimaux..., puis on peut affiner le format avec des espaces
Les descripteurs de types:
a: pour une chane de caractres;
l: pour une valeur logique;
i: pour un nombre entier;
f: pour un nombre dcimal;
e: pour un rel en notation scientifique;
Ensuite, on donne le nombre de caractres directement: a3, par exemple.
Lors de lutilisation de formats identiques, les uns la suite des autres, on peut multiplier les
formats directement avec un nombre de fois: 4a3, par exemple, pour crire 4 fois une chane de 3
caractres. Pour des format plus complexes, on se sert de parenthses et on opre une distribution
comme pour la multiplication. Par exemple: 4(a3, i2)
71
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
On peut sauter des caractres, avec lidentifiant x: 4(a3, 1x, i2). Ainsi, on saute 1 caractre entre la
chane de 3 caractres et lentier 2 chiffres; le tout est rpt 4 fois. En criture, cela revient laisser
un espace.
On peut se positionner dans la mmoire tampon, avec le descripteur t. Pour cela, on indique aussi
lemplacement sur lequel on veut pointer. Par exemple: t20, veut dire se placer sur le 20ime caractre de
la ligne.
Le caractre / indique daller une nouvelle ligne.
On peut aussi appliquer un facteur dchelle, sur les nombres rels, laide de lidentifiant p. Par
exemple, 3p devant les autres descripteurs, multiplie par 103 la mantisse et diminue lexposant de 3.
Ces descripteurs de format sont les plus couramment utiliss, mais la liste des descripteurs nest
pas, ici, exhaustive, ni mme leurs effets. Pour plus de dtails, il faut se rfrer un manuel complet du
langage Fortran.
Exemple VIII.2
le numro de lenregistrement
Ce paramtre (rec) ne sert que dans les fichiers accs direct et repre le numro de
lenregistrement. Cest donc une valeur entire.
d) lindicateur derreurs
On utilise le paramtre iostat, pour grer les erreurs denregistrement. Ce paramtre peut prendre
plusieurs valeurs, de type entier:
il est nul, lorsquil ny a aucune erreur;
il est ngatif lorsque lerreur est gnre par un fin:
de fichier (end),
ou denregistrement (eor), dans les accs squentiels formats, sans
avancement du pointeur (advance = no);
il est positif dans les autres cas derreurs.
e)
Les trois paramtres err, end et eor reoivent chacun une tiquette, qui renvoie linstruction
correspondante, en fonction des besoins. Ainsi, le programmateur peut dcider de la suite du
programme, lorsque des erreurs surgissent dans la lecture ou lcriture denregistrement, lorsquune fin
de fichier, ou bien une fin denregistrement, sont respectivement rencontres.
72
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
END DO
Par dfaut, lors de lexcution dune instruction dentre/ sortie, le pointeur dun fichier passe
lenregistrement suivant. Toutefois, on peut prciser que le pointeur reste sur le dernier enregistrement,
avec le paramtre advance.
advance = no spcifie que le pointeur reste sur place;
advance = yes spcifie que le pointeur avance lenregistrement suivant (cest le dfaut).
Dans le cas denregistrement statique (advance = no), le format doit toujours tre fix.
73
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
g) longueur denregistrement
Dans le cas o une fin denregistrement est dtecte, le paramtre size permet de rcuprer la
longueur de lenregistrement. Ce paramtre ne sapplique qu une instruction de lecture statique
(advance = no), et donc formates.
OPEN (unit=20)
READ(20, fmt=12) var
b) nom du fichier
On affecte, au paramtre file, une chane de caractres qui est le nom du fichier ouvrir.
74
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple VIII.6
status
Ce paramtre peut recevoir une de ces cinq affectations: new, old, unknown, replace, scratch.
new: si le fichier doit tre cr.
old: si le fichier doit dj exister.
unknown: statut inconnu qui dpend de lenvironnement.
replace: si le fichier existe dj lors de louverture, il sera dtruit et dans tous les cas un
nouveau fichier sera cr.
scratch: indique qu'un fichier anonyme sera cr et connect l'unit spcifie via le
paramtre unit. La dure de vie de ce fichier sera soit le temps d'excution du programme, soit
le temps s'coulant jusqu' la fermeture de cette unit.
d) vocation du fichier
Le paramtre action peut recevoir les attributs read, write, readwrite.
read: toute tentative d'criture est interdite.
write: toute tentative de lecture est interdite.
readwrite: les oprations de lecture et d'criture sont autorises.
e)
Pour prciser le type daccs un fichier, on affecte la paramtre access des attributs sequentiel ou
direct. Laccs squentiel tant laccs par dfaut.
Exemple VIII.7
dtection derreurs
75
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
asis: permet de conserver la position du pointeur de fichier. Il est utile lorsqu'on veut modifier
certaines caractristiques du fichier, tout en restant positionn au mme endroit.
append: le pointeur du fichier sera positionn la fin du fichier.
i)
On spcifie le type des enregistrements, contenus dans un fichier, laide du paramtre form, qui
reoit ainsi les attributs formatted ou unformatted. Par dfaut, les enregistrements sont formats.
j)
La paramtre recl spcifie la longueur dun enregistrement pour laccs direct, sinon prcise la
longueur maximale dun enregistrement pour laccs squentiel.
k) blank
Ce paramtre ne sutilise que dans le cas denregistrements formats. Il peut prendre les attributs
null, ou zero.
null: on ne tient pas compte des espaces, comme si il nexistaient pas.
zero: on remplace les espaces par des 0.
l)
pad
76
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Syntaxe gnrale:
INTEGER
:: longueur
...
INQUIRE (IOLENGTH=longueur) nom, adresse, tel
...
OPEN (1, FILE='repertoire', RECL=longueur, &
FORM='unformatted')
...
WRITE(1) nom, adresse, tel
77
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
VIII.D.1 Dclaration
La dclaration d'un tel groupe se fait par une instruction de spcification namelist avant toute
instruction excutable, dont la forme est:
VIII.D.2 Usage
Dans une instruction READ ou WRITE, la liste nomme sera dsigne par le spcificateur nml.
Exemple VIII.9
78
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
79
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
IX
IX.A
ANNEXE
IX.A.1
Manipulation de bits
Les variables i, j, n, m, utilises sont toutes des valeurs entires. On rappelle que les bits dun
nombre sont numrots de gauche droite et comment avec le bit 0.
iand (i, j)
ieor (i, j)
ior (i, j)
Ces trois fonctions renvoient respectivement un entier du mme nombre de bits que i, form par le
rsultat des trois oprations logiques: ET, OU exclusif, OU inclusif, effectues bit bit entre les entiers
i et j.
ishft(120,2)
ishftc(134678, 8)
donne 480
donne 34477568
not (i)
Cette fonction fait le complment 1 (ou complment logique) des bits de lentier i; elle retourne
un entier du mme nombre de bits que i.
btest (i, n)
Cette fonction renvoie .TRUE. si le nime bit du nombre entier i est 1, sinon .FALSE. si
il est 0.
80
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
ibset (i, n)
ibclr (i, n)
Ces deux fonctions retournent un entier identique i, avec respectivement le nime bit 1 et le
nime bit 0.
ibits (i, n, m)
Cette fonction extrait m bits de lentier i, partir du nime bit; puis les dcale vers la droite pour
former un entier du mme type que i (les autres bits de gauche sont mis 0).
IX.A.2
digit(x)
Cette fonction admet un argument x entier ou rel et renvoie un entier gal au nombre de chiffres
significatifs de x:
epsilon (x)
Cette fonction renvoie un rel avec mme paramtre de sous-type que x qui est presque
ngligeable compar 1.
huge (x)
Cette fonction admet un paramtre x entier ou rel et renvoie la plus grande valeur reprsentable
dans le sous-type de x (limite d'overflow).
tiny(x)
Cette fonction admet un paramtre x rel et renvoie la plus petite valeur positive non nulle
reprsentable dans le sous-type de x (limite d'underflow).
maxexponent (x)
Cette fonction admet un paramtre x rel et renvoie l'entier reprsentant le plus grand exposant
possible dans le sous-type de x.
81
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
minexponent (x)
Cette fonction admet un paramtre x rel et renvoie l'entier reprsentant le plus petit exposant
possible dans le sous-type de x.
exponent (x)
Cette fonction renvoie un entier gal l'exposant de la reprsentation numrique de x (0 si x est
gal 0)
fraction (x)
Cette fonction renvoie un rel qui est gal la mantisse de la reprsentation numrique de x.
nearest(x, s)
Cette fonction renvoie un rel ayant le mme paramtre de sous-type que x, gal au nombre
exactement reprsentable en machine le plus proche de x dans la direction indique par l'argument s.
spacing (x)
Cette fonction renvoie un rel ayant le mme paramtre de sous-type que x, gal l'espacement
absolu des nombres de mme paramtre de sous-type que x dans le voisinage de x.
IX.A.3
a) Avec conversion
ceiling (a)
Cette fonction renvoie le plus petit entier du type par dfaut qui est suprieur ou gal a.
floor (a)
Cette fonction renvoie le plus grand entier du type par dfaut qui est infrieur ou gal a.
b) Sans conversion
modulo (a,p)
Cette fonction renvoie a modulo p pour a et p soit tous les deux rels soit tous les deux entiers.
82
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
IX.A.4
a) Conversion entier-caractre
achar (i)
Cette fonction renvoie le caractre dont le code ASCII est spcifi par l'argument i.
iachar (c)
Cette fonction renvoie le code ASCII correspondant au caractre c.
ichar (c)
Cette fonction renvoie un entier qui reprsente le numro du caractre c dans la table laquelle
appartient c (ASCII/EBCDIC)
adjustr (string)
Cette fonction cale droite la chane de caractre STRING.
len_trim
Cette fonction renvoie un entier qui reprsente la longueur de chane de caractre STRING (sans
compter les caractres blancs la fin).
83
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
repeat (string, n)
Cette fonction permet la formation d'une chane de caractres par concatnation de n fois la chane
string.
trim(string)
Cette fonction renvoie la chane de caractres string sans les blancs ventuels situs sa fin.
IX.B
Ce sous-programme gnre dans harvest un nombre (ou des nombres) pseudo alatoire, dans
l'intervalle [0,1[; harvest doit tre de type rel et peut tre un tableau.
84
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
IX.C
Ce sous-programme retourne dans les variables caractres date et time la date et l'heure en temps
d'horloge murale. L'cart par rapport au temps universel est fourni optionnellement par zone. values est
un vecteur d'entiers rcuprant les informations prcdentes sous forme d'entiers.
85
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
IX.D
SITES INTRESSANTS
IX.E
BIBLIOGRAPHIE
86