Académique Documents
Professionnel Documents
Culture Documents
CoursF95CMichaut PDF
CoursF95CMichaut PDF
CLAIRE MICHAUT
Claire.Michaut@obspm.fr
LUTH Observatoire de Paris
5, place Jules Janssen - 92195 Meudon Cedex
I Historique ........................................................................................................................6
IV Les tableaux...............................................................................................................32
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
V Les pointeurs..................................................................................................................46
V.A Introduction................................................................................................................................. 46
V.A.1 Dfinition: ......................................................................................................................................... 46
V.A.2 Dclaration dun pointeur et dune cible........................................................................................... 46
4
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
IX ANNEXE ...................................................................................................................80
5
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
I 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.
6
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.
7
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
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:
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.
8
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.
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.
9
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
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:
SUBROUTINE nom_du_sous-programme [(arguments)]
[instructions de spcification]
[instructions excutables]
[CONTAINS
[procdures internes]]
END SUBROUTINE [nom_du_sous-programme]
Les sous-programmes sont appeles, depuis une autre procdure (ou programme principal), avec
linstruction CALLnom_du_sous-programme[(arguments)].
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
Les fonctions sont appeles directement laide de leur nom propre et de leurs arguments, depuis
une autre procdure (ou programme principal). On peut dclarer leur type avant linstruction
FUNCTION.
Exemple II.2
SUBROUTINE LOCATE (rr, TT, m, n, hmn)
IMPLICIT NONE
REAL, INTENT(IN) :: rr, TT
INTEGER, INTENT(OUT) :: m, n
REAL, OPTIONAL, DIMENSION(4), INTENT(OUT) :: hmn
REAL:: hm, hn, hm1, hn1, Vol
m = 1; n = 1
DO
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
11
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple II.3
REAL FUNCTION ZMOY (rr, TT)
IMPLICIT NONE
REAL, INTENT(IN) :: rr, TT
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:
recursive subroutine nom_proc (list_arg)
recursive function nom_proc (list_arg) result (nom_res)
Remarque: dans le cas dune fonction, on est oblig dutiliser un nom de rsultat diffrent du nom
de la fonction, dfini laide du mot cl RESULT.
Les fonctions rcursives peuvent tre, par exemple, trs utiles pour traiter des suites
mathmatiques, qui par dfinition, sont construites en rfrence au rang infrieur. Ainsi pour calculer la
suite arithmtique:
u1 = 1; u2 = 3 ; un = 3un1 un2 n3
12
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple II.4
RECURSIVE FUNCTION SUITE (n) RESULT (u)
INTEGER, INTENT (IN) :: n
INTEGER :: u
SELECT CASE (n)
CASE (1)
u = 1
CASE (2)
u = 3
CASE DEFAULT
u = 3 * suite (n-1) - suite (n-2)
END SELECT
END FUNCTION SUITE
Remarque: Le mot-cl RESULT peut tre utilis dans toutes les fonctions pour dfinir le nom du
rsultat, quelles soient rcursives ou non. Le type du rsultat est toujours celui de la fonction.
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
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.
PROGRAM (ou SUBROUTINE, FUNCTION)
USE Nom_de_Module1
USE Nom_de_Module2
IMPLICIT NONE
END PROGRAM (ou SUBROUTINE, FUNCTION)
Pour des raisons de lisibilit dun programme, ou bien de compatibilit de plusieurs procdures, il
est parfois souhaitable de renommer les entits importes. On utilise la double flche qui est aussi le
symbole daffectation des pointeurs.
USE Nom1_de_Module => Nom2, ONLY: var1 => xy, var2
14
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
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
rr = rho_init ; uu = Cshock ; TT = Temp
PRINT*, "Dans ce calcul le flux final est ",
& Frad, "et l'opacite est ",
& KRoss
Exemple II.7
PRINT*, "Dans ce calcul le flux final et&
&lopacite sont ", Frad,
& KRoss
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.
15
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
II.B.3 Commentaires
Un commentaire commence par le caractre point dexclamation! et se termine par la fin de
ligne. Donc, il est possible d'insrer des commentaires aprs des instructions, sur une mme ligne, mais
pas avant.
Exemple II.10
! gam: rapport des capacites de pression & volume
! constants: Cp / Cv.
gam = 5. / 3.
! Mach = u1/Csound ; nombre de Mach
Mach = u1 * sqrt(AtW/(gam*Rgaz*T1)) !adimensionne
PRINT*, "Le nombre de Mach est de ", Mach
gM2 = gam*Mach*Mach ! adimensionne
Exemple II.11
! Le point dexclamation est utilise comme tel
! dans une chaine de caracteres. dans ce cas
PRINT*, "Le nombre de Mach est grand! "
"Llphant est + grand que la souris."
3 * plus souvent
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.
logical, character, integer, real, double precision
complex, type
Il est possible de dfinir de nouveaux types de donnes partir d'un groupe de donnes appartenant
des types intrinsques, laide de la dclaration type. Nous verrons ce point ultrieurement.
De plus on distingue les constantes, les variables scalaires, les vecteurs et tableaux au moyen
dattributs. Ces attributs servent spcifier ce que le programmateur souhaite faire de ces donnes
dclares et permettent un contrle de la bonne utilisation de ces donnes.
16
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Nous expliquerons leur signification au fur et mesure de leur introduction dans les diffrents
chapitre du cours.
On voit que lon peut initialiser les variables lors de leur dclaration. Toute variable initialise
devient permanente, elle reoit donc implicitement lattribut save.
Toutefois, certains programmateurs auront recours au typage par dfaut. On commence par une
dclaration du type:
IMPLICIT REAL (a-h, o-z)
Ainsi tous les identificateurs commenant par une lettre de cet ensemble alphabtique (de a h ou
de o z) seront automatiquement considrs comme des rels. Sauf, si une dclaration contraire est
faite. Cette mthode de dclaration est pratique au commencement, car moins fastidieuse. Mais elle est
source dinnombrables erreurs! Par exemple, elle ne dtecte pas les fautes de frappe, pourtant si
nombreuses. Le Fortran 90 est justement un langage dvelopp dans le but de prvenir au maximum des
erreurs de programmation, donc il est absurde de se passer de cet atout.
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.
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.
Exemple II.13
REAL, (KIND = KIND(1.d0)):: x
rel double prcision quelque soit la machine utilise.
Une autre manire de prciser le sous-type dsir lors de l'criture des variables est de leur ajouter
un suffixe pour les constantes numriques, ou bien un prfixe pour les chane de caractres, qui contient
la valeur du sous-type choisi. On insre le caractre _ entre la variable et le suffixe ou prfixe.
18
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple II.14
123456_2 entier cod sur 2 octets
34.567005678001_8 rel cod sur 8 octets
2_fleur chane de caractres, chacun cod
sur 2 octets
ou bien
Exemple II.15
INTEGER, PARAMETER:: deux = 2, huit = 8
123456_deux entier cod sur 2 octets
34.567005678001_huit rel cod sur 8 octets
deux_fleur chane de caractres, chacun cod
sur 2 octets
a) selected_int_kind (m)
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:
-10m < n < 10m
Exemple II.16
SELECTED_INT_KIND(30) retourne -1
SELECTED_INT_KIND(10) retourne 8
SELECTED_INT_KIND(10) 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:
10-r < |x| < 10r
La fonction renvoie:
-1 si la prcision demande n'est pas disponible;
19
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple II.17
SELECTED_REAL_KIND(2,30) retourne 4
SELECTED_REAL_KIND(20,30) retourne 16
SELECTED_REAL_KIND(10,10) retourne 8
SELECTED_REAL_KIND(40,10) retourne 4
SELECTED_REAL_KIND(20,5000) retourne -2
c) range et precision
La prcision dun rel (nombre significatif de chiffres derrire la virgule) est connue avec la
fonction PRECISION.
Exemple II.18
RANGE(1234567890) retourne 9
RANGE(123456.7890) retourne 37
PRECISION(1.234567890) retourne 6
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.
Un tableau peut avoir une taille statique, dans ce cas, sa dimension est explicitement crite lors de
la dclaration. Ou bien il a une taille dynamique, cest--dire quelle sera dfinie en fonction de
lexcution du programme, dans ce cas, la dimension est suggre par le caractre deux-points :.
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.
CHARACTER (LEN=8), DIMENSION (15):: mois
INTEGER, DIMENSION (12,31):: jour
LOGICAL, DIMENSION (2) :: reponse = (/.true.,.false./)
REAL, DIMENSION (:,:,:) :: position
INTEGER, DIMENSION(4), PRIVATE :: hmn
REAL, DIMENSION (:), ALLOCATABLE :: TeV, rho
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.
Pour utiliser des variables du type driv prcdemment dfini, on dclare simplement:
type (nom_type) [,liste_attributs] :: nom_var
Pour accder aux champs de lobjet que nous venons de dfinir, nous utiliserons le caractre pour
cent %. Pour le reste des oprations, la structure ainsi dfinie se manipule comme nimporte quelle
variable.
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 %.
Exemple II.20
TYPE (animal):: ponpon, rox, roucky
Exemple II.21
ponpon%race = chat_de_gouttiere
ponpon%age = 12
ponpon%couleur = noir
ponpon%vacc = (/.true.,.false., .true., .true.,&
.false. ,.false., .true., .true./)
Fortran 90 facilite cependant la manipulation des structures (objets de type driv), car il permet:
la dfinition dautres fonctions de manipulation des structures, comme:
d'encapsuler le type et les fonctions oprant sur les objets de ce type, dans un module spar.
22
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
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 conversion de type;
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
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.
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
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:
nom : IF (expression_logique) THEN
bloc1
END IF nom
Exemple III.1
stab = f(1,2) * f(2,2)
IF (stab >= 1.01) THEN
ecart = stab - 1.
h = 0.5 * h
ELSE IF (stab <= 0.99) THEN
ecart = 1. - stab
h = 0.5 * h
ELSE
count = count + 1
z = z + h
f(3,1) = f(1,2)
END IF
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.
26
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
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
SELECT CASE (K)
CASE (1) ! On integre en montant.
PRINT*,"Integration directe : "
h = Long*1.2 / REAL(nstep)
f(1,1) = 1. ; f(2,1) = 1.5 ; f(3,1) = 0.
z = 0.
nom_fichier1 = name
END SELECT
27
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple III.3
element: SELECT CASE (AtN)
! AtN : n atomique - AtW : Poids atomique
CASE (1:9)
elmt = 'trop_leger' ; AtW = 0.
CASE (12)
elmt = 'magnesium' ; AtW = 24.305
CASE (14)
elmt = 'silicium' ; AtW = 34.855
CASE (18)
elmt = 'argon' ; AtW = 39.948
CASE (47)
elmt = 'argent' ; AtW = 107.868
CASE (54)
elmt = 'xenon' ; AtW = 131.29
CASE DEFAULT
elmt = non_utilise ; AtW = 0.
END SELECT element
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.
WHERE (tab1 > 0.)
tab2 = SQRT (tab1)
ELSEWHERE
tab2 = 0.
END WHERE
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:
[nom:] WHERE (expression_logique1)
bloc1
ELSEWHERE (expression_logique2)
bloc2
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.
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
Exemple III.5
alenvers: DO i = 201, 2, -1
ux = (i - 1) * 5.e-3
Tx = FUNTEMP (u1, ux, T1, Tx, GT) ! appel de
fonction
RT = FUNREST (u1, ux, T1, Tx, GT) ! appel de
fonction
PRINT*, ux, Tx, RT
END DO alenvers
Exemple III.6
Integre_choc : DO WHILE (n < nstep)
rr = f(1,1) * r1 ; TT = f(3,1) * T1
CALL RUNGEKUTTA (z, h, f, 3, n, Gas)
n = z / h
END DO Integre_choc
Cette clause de contrle est assez souvent utilise pour lire les donnes dun fichier dont on ne sait
pas le nombre denregistrement. On utilise pour cela le marqueur de fin de fichier eof, associ au
paramtre iostat. Nous verrons plus loin, avec les accs de fichiers et les entres-sorties, comment
on procde. Mais le boucle prend la forme suivante:
Exemple III.7
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
Pour altrer le droulement dune boucle, il est possible de forcer lexcution du programme
passer la boucle suivante, avec linstruction CYCLE.
[nom:] DO [bloc de contrle]
bloc1
IF (expression_logique) CYCLE [nom]
bloc2
END DO [nom]
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:
[nom:] FORALL (bloc de contrle [, bloc de contrle]
[, filtre])
bloc
END FORALL [nom]
Le bloc de contrle est une commande sur les indices dun ou plusieurs tableaux. Si plusieurs
plages dindices sont dfinies laide de plusieurs blocs de contrle, le domaine doit tre rectangulaire.
Cest--dire que chaque commande sur les indices ne doit pas dpendre des autres indices. La
construction des tableaux, ainsi que leur manipulation est dtaille dans le chapitre suivant.
Exemple III.8
FORALL (i=3:10, j=2:5) mat(i,j) = 12
Exemple III.9
FORALL (i=1:n, j=1:m, mat1>0)
mat2(i,j) = log(mat1(i,j))
END FORALL
31
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
IV LES TABLEAUX
Un tableau est un ensemble d'lments ayant mme type et mme valeur de paramtre de sous-
type. Il est dfini par son type, son rang, ses tendues, son profil, sa taille. Un tableau peut contenir
jusqu' 7 dimensions.
Le rang (rank) d'un tableau est son nombre de dimensions.
L'tendue du tableau dans une dimension est le nombre d'lments dans cette dimension.
Le profil (shape) d'un tableau est un vecteur de rang 1 et d'tendue le rang du tableau et dont
chaque lment contient l'tendue dans la dimension correspondante.
La taille (size) du tableau est le produit des tendues sur toutes les dimensions.
Dans le chapitre II.D, nous avons voqu la dclaration des tableaux. Distinguons les tableaux qui
ont une allocation statique de ceux qui ont une allocation dynamique.
O b_inf1, b_sup1 sont des entiers qui dlimitent ltendue de la premire dimension du tableau
nom_tab. Il sont respectivement lindice minimum et lindice maximum. Il en va de mme pour la
seconde dimension avec les entiers b_inf2, b_sup2.
32
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
libration de la mmoire.
Avec passage en argument de la taille, la syntaxe gnrale se prsente sous la forme suivante:
SUBROUTINE nom (arg1, n1, arg2, n2 )
IMPLICIT NONE
INTEGER :: n1, n2
type, DIMENSION (n1) :: arg1
type, DIMENSION (n2) :: arg2
Sans passage de la taille en argument, la syntaxe gnrale se prsente sous la forme suivante:
SUBROUTINE nom (arg1, arg2, )
IMPLICIT NONE
type, DIMENSION (:) :: arg1
type, DIMENSION (:) :: arg2
Pour connatre ltendue des tableaux, on a recourt linstruction SIZE. Mais, dans ce cas,
lutilisation dune interface explicite est obligatoire, sinon le compilateur ne peut pas dtecter des
erreurs potentielles dans la manipulation de ces tableaux. Nous reviendrons sur ce point lorsque nous
verrons la notion dINTERFACE.
Pour gnrer dynamiquement des tableaux et librer la mmoire au moment opportun, Fortran 90
possde linstruction ALLOCATE et DEALLOCATE. Au pralable, le tableau considr devra tre
dclar avec lattribut ALLOCATABLE.
33
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Lutilisation du paramtre stat est optionnel, cest un contrle du bon droulement de lallocation
ou de la libration de la mmoire. Lorsque lallocation (ou la libration) sest correctement effectue,
linstruction ALLOCATE (ou DEALLOCATE) renvoie pour la variable entire ok la valeur 0, sinon ok
prend une valeur suprieure 0.
Exemple IV.1
SUBROUTINE SOLVER
IMPLICIT NONE
INTEGER :: npas
REAL, ALLOCATABLE, DIMENSION(:) :: Prad, Frad
Il existe en plus une fonction qui permet de sassurer que la mmoire du tableau que lon manipule
est alloue ou non:
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
a) Gnralits
Linitialisation dun tableau au moment de sa dclaration est permise laide dun constructeur de
tableaux. Cest un vecteur de scalaires born par les signes (/ et /) .
Remarque importe: la valeur dune expression faisant intervenir un tableau est entirement
value avant son affectation.
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
REAL, DIMENSION(4) :: tab
tab = 100.
Exemple IV.3
REAL, DIMENSION(4) :: tab1, tab2, tab3
tab1 = 100.
tab2 = 2 + tab1
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)/)
tab1 = 100. ; tab2 = tab2 * tab1
Chacun des 4 lments du tableau tab2 prend respectivement la valeur 100; 200; 300; 400.
On peut aussi repr par le caractre : ltendue du tableau. La notation est alors plus lourde,
mais permet au dveloppeur de ne pas oublier quil manipule un tableau n dimension ce moment.
Pour reprendre lexemple prcdent, on peut crire sous la forme suivante.
Exemple IV.6
INTEGER :: i
REAL, DIMENSION(4) :: tab1, tab2=(/ (i, i=1,4)/)
tab1(:) = 100. ; tab2(:) = tab2(:) * tab1(:)
Dans le cas de tableau plusieurs dimension, on mentionnera chacune des dimensions par :.
REAL, DIMENSION(4,16) :: tab1, tab2
tab2(:) = 20. / tab1(:,:)
c) 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.
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
! on slectionne les lments de la ligne 2
! et des colonnes de 4 8
tab1(2,4:8)
La section quelconque prend la forme dun vecteur dindices: (/i1, i2, i3/), a laide du
constructeur de vecteurs.
Exemple IV.9
! on slectionne les lments des lignes 1, 5 et 19
! et des colonnes de 4, 5 et 10
tab1((/1,5,19/), (/4,5,10/))
On peut aussi affecter directement une section avec lidentifiant dun vecteur.
Exemple IV.10
INTEGER, DIMENSION(4) :: vect_ind = (/3,6,7,9/)
tab1(vect_ind, (/4,5,10/))
Lorsquun sous-tableau est constitu dlments rpts, il ne peut pas recevoir une nouvelle
affectation, donc il ne peut tre plac gauche dune expression.
Exemple IV.11
INTEGER, DIMENSION(4) :: vect_ind = (/3,6,3,9/)
INTEGER, DIMENSION(10) :: tab1
INTEGER, DIMENSION(4) :: tab2
! on peut ecrire :
tab2 = tab1(vect_ind)
! mais il est interdit dcrire :
tab1(vect_ind) =
37
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
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.
Ces fonctions retournent respectivement un tableau d'entiers du type par dfaut et de rang 1 qui
contient la liste des bornes infrieures du tableau array (ou de la dimension dim mentionne) et la liste
des bornes suprieures du tableau array (ou de la dimension dim mentionne).
Cette fonction retourne la taille totale du tableau array ou l'tendue le long de la dimension dim.
shape(array)
Cette fonction retourne un tableau d'entiers de rang 1 qui contient le profil du tableau array.
Exemple IV.12
INTEGER, DIMENSION(-1:1,3) :: tab1
15 2 35
tab1= 4 50 36
7 28 9
38
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
allocated (array)
Cette fonction fournit la valeur .TRUE. si le tableau array, dclar avec allocatable, est allou
et la valeur .FALSE. sinon.
Cette fonction renvoie la valeur logique .TRUE., si tous les lments, pris un par un, rpondent
aux critres du masque, sinon la valeur .FALSE.. Si dim est prcis, la fonction renvoie un tableau
qui contient les valeurs logiques .TRUE. ou .FALSE. suivant que les lments de cette
dimension rpondent aux critres du masque.
Exemple IV.13
tab1(1,:) = (/1, 3, 5, 7/) ; tab2(1,:) = (/1, 2, 3, 4/)
tab1(2,:) = (/2, 4, 6, 8/) ; tab2(2,:) = (/5, 6, 7, 8/)
! reduction globale
ALL (tab1==tab2) donne .false.
ALL (tab1/=tab2) donne .false.
! reduction par colonne
ALL (tab1/=tab2, dim = 1)
donne /(.false., .true., .true., .false./)
! reduction par ligne
ALL (tab1/=tab2, dim = 2)
donne /(.false., .false./)
Si on a dj des tableaux de variables logiques, on les utiliser directement dans linstruction ALL.
39
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple IV.14
tab1(1,:) = (/.true., .true., .true., .true./)
ALL (tab1) donne .true.
Exemple IV.15
REAL, DIMENSION (5,10) :: tab1, tab2
IF (ALL(tab1) >= 0) THEN
tab2 = SQRT (tab1)
END IF
Cette fonction renvoie la valeur logique .TRUE., si au moins un des lments, pris un par un,
rpondent aux critres du masque, sinon la valeur .FALSE.. Si dim est prcis, la fonction renvoie
un tableau qui contient les valeurs logiques .TRUE. ou .FALSE. suivant que les lments de
cette dimension rpondent aux critres du masque.
Exemple IV.16
tab1(1,:) = (/1, 3, 5, 7/) ; tab2(1,:) = (/1, 2, 3, 7/)
tab1(2,:) = (/2, 4, 6, 8/) ; tab2(2,:) = (/5, 6, 4, 8/)
! reduction globale
ANY (tab1==tab2) donne .true.
ALL (tab1/=tab2) donne .true.
! reduction par colonne
ALL (tab1/=tab2, dim = 1)
donne /(.true., .true., .true., .false./)
! reduction par ligne
ALL (tab1/=tab2, dim = 2)
donne /(.true., .true./)
Si on a dj des tableaux de variables logiques, on les utiliser directement dans linstruction ALL.
Exemple IV.17
tab1(1,:) = (/.true., .true., .false., .true./)
ANY (tab1) donne .true.
40
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple IV.18
REAL, DIMENSION (5,10) :: tab1, tab2
IF (ANY(tab1) <= 0) THEN
PRINT*, On ne peut pas calculer la racine carree.
EXIT
END IF
b) La fonction count
count(mask [, dim])
Cette fonction compte le nombre doccurrences qui prennent la valeur logique .TRUE., suivant
les critres du masque. Si dim est prcis, la fonction renvoie un tableau dentiers contenant le nombre
doccurrences VRAI.
Exemple IV.19
tab1(1,:) = (/1, 3, 5, 7/) ; tab2(1,:) = (/1, 2, 3, 7/)
tab1(2,:) = (/2, 4, 6, 8/) ; tab2(2,:) = (/5, 6, 4, 8/)
! compte global
COUNT (tab1==tab2) donne 3
COUNT (tab1/=tab2) donne 5
! compte par colonne
COUNT (tab1/=tab2, dim = 1) donne /(1, 2, 2, 0/)
! compte par ligne
COUNT (tab1/=tab2, dim = 2) donne /(2, 3/)
Si on a dj des tableaux de variables logiques, on les utiliser directement dans linstruction ALL.
Exemple IV.20
tab1(1,:) = (/.true., .true., .false., .true./)
COUNT (tab1) donne 3
Note: Si le tableau est de taille nulle, le rsultat est respectivement le plus grand nombre positif et
ngatif disponible sur l'ordinateur.
41
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple IV.21
tab1(1,:) = (/1, 3, 5, 7/) ; tab2(1,:) = (/1, 2, 3, 7/)
tab1(2,:) = (/2, 4, 6, 8/) ; tab2(2,:) = (/5, 6, 4, 8/)
! reduction globale
MAXVAL (tab1) donne 8
! reduction partielle, par colonne
MINVAL (tab1,DIM=1,MASK=tab1>1) donne (/2, 3, 5, 7/)
Ces fonctions calculent respectivement la somme et le produit des lments d'un tableau de
nombres; ou suivant la dimension indique et selon les critres du masque, sil est prcis.
Exemple IV.22
1 3 5 7 1 2 3 7
tab1= et tab2=
2 4 6 8 5 6 4 8
SUM(tab1) donne 36
PRODUCT(tab1, MASK=tab1<6) donne 120
SUM(tab2, DIM=2) donne (/13, 23/)
PRODUCT(tab2, DIM=2, MASK=tab2>4) donne (/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 10 20 30
tab1= 4 5 6 et tab2= 40 50 60
7 8 9 70 80 90
MERGE (tab1, tab2, tab1>4)
10 20 30
donne tab1= 40 5 6
7 8 9
42
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
RESHAPE ( (/(i, i=1,12)/), (/3, 4/))
1 4 7 10
donne 2 5 8 11
3 6 9 12
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.
unpack (vector, mask [, field])
Cette fonction est assez symtrique de la prcdente. Elle construit un tableau de rang suprieur
1, en dcompressant les valeurs du vecteur vector, suivant les critres du masque. Si le tableau optionnel
field est prsent, les valeurs de field, qui sont du mme type que celle de vector, seront utilises lorsque
le masque contient une valeur fausse. Le rsultat aura le profil du masque et le type du vecteur.
Exemple IV.25
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.
Cette fonction opre un dcalage circulaire sur les lments du tableau array, le long de la
dimension indique, dautant dindices que shift indique.
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.
Cette fonction agit comme la prcdente, mais donne en plus la possibilit de remplacer les
lments perdus la frontire par des lments de remplissage donns par le tableau boundary.
Note: Si boundary nest pas prsent, les valeurs de remplissage par dfaut dpendent du type du
tableau array:
pour un INTEGER, la valeur par dfaut est 0;
pour un REAL, " " 0.0;
pour un COMPLEX, " " (0.0,0.0);
pour un LOGICAL, " " .FALSE.;
pour un CHARACTER, " " un chane compose de blancs.
Exemple IV.26
1 4 7 10
On a tab1= 2 5 8 11
3 6 9 12
CSHIFT (tab1, SHIFT=2, DIM=1)
3 6 9 12
donne 1 4 7 10
2 5 8 11
EOSHIFT (tab1, SHIFT=-1, DIM=2)
0 1 4 7
donne 0 2 5 8
0 3 6 9
44
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
b) matrice transpose
transpose (matrix)
45
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
V LES POINTEURS
V.A 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.
Et pour affecter targ comme cible de ptr (ou pour valoriser le pointeur): ptr => targ.
Remarque: pour dclarer un tableau de pointeurs, seul son rang (le nombre de dimensions) doit
tre dclar et ses bornes prendront les valeurs de l'objet point.
Exemple V.1
REAL, POINTER :: ptr1
INTEGER, DIMENSION(:,:), POINTER :: ptr2
! attention ptr3 nest pas un tableau de pointeurs.
COMPLEX, POINTER :: ptr3(:)
nul: il ne pointe sur rien, cest--dire quil nest pas lalias dune variable,
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.
REAL, POINTER:: ptr => NULL()
a) La fonction nullify
b) La fonction associated
Ltat dun pointeur peut tre connu grce la fonction intrinsque ASSOCIATED, dont la
syntaxe gnrale est la suivante:
associated (pointer [, pointer] [, target])
associated (pointer)
Cette fonction renvoie .TRUE., si pointer est associ une cible, sil est dans ltat nul, la
fonction renvoie FALSE..
Cette fonction renvoie .TRUE., si pointer1 et pointer2 sont associs la mme cible, sinon elle
renvoie FALSE.. Remarque: si pointer1 et pointer2 sont tous les deux dans ltat nul, elle renvoie
FALSE..
Cette fonction renvoie .TRUE., si pointer est associ la cible target, sinon elle renvoie
FALSE..
Attention: le pointeur ne doit pas tre dans ltat indtermin pour utiliser cette fonction!
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
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.
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.
Dans ce cas, le pointeur figure obligatoirement dans lappel de la procdure et nest pas forcment
associ au moment de lappel. Linformation relle qui passe dans la procdure est le descripteur du
pointeur: cest--dire son adresse, ses dimensions
Remarques:
Linterface doit tre explicite, pour que le compilateur sache que la procdure possde en
Dans ce cas, le pointeur est obligatoirement associ avant lappel de la procdure. Cest alors
linformation concernant la cible qui passe dans la procdure, cest--dire son adresse. On se retrouve
alors dans un cas habituel de passage de variables dans un appel de procdure.
49
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
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 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).
On a souvent intrt rendre prives certaines ressources dun module, cela vite les risques de
conflits avec les ressources dun autre module.
Une autre faon de restreindre lutilisation des ressources dun module est dinsrer linstruction
only nom_var, lors de laccs un module, dans linstruction use nom_module (voir plus haut
chapitreII.A.3a)).
Le mode par dfaut est le mode public. Les instructions PUBLIC et PRIVATE, sans argument,
permettent de changer le mode. Un telle instruction ne peut apparatre quune seule fois dans un
module et affecte lensemble du module.
MODULE PARAM
IMPLICIT NONE
INTEGER, DIMENSION(:) :: par
PRIVATE ! tout le module devient priv.
REAL :: x, y
INTEGER :: i, j
END MODULE PARAM
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:
type, private:: var
type, public :: var
Attention toutefois ne pas confondre le fonctionnement des attributs PRIVATE et PUBLIC, avec
celui des instructions PRIVATE et PUBLIC, malgr leur similitude.
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)
! cette procdure est publique.
END SUBROUTINE lect
FUNCTION dict (vect)
! cette procdure est prive.
END FUNCTION dict
END MODULE INIT
Les attributs PUBLIC et PRIVATE s'appliquent aux types drivs, comme pour les autres types de
variables.
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.
END FUNCTION VALOR
END MODULE BASE
Syntaxe gnrale:
USE nom_module, ONLY: list_var
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
END PROGRAM MACHINE
Il est aussi possible de renommer des ressources dun module, si les noms proposs par le module
ne conviennent pas lunit utilisatrice: par exemple lorsquun de ces noms est dj affect! Pour
renommer, on utilise loprateur daffectation =>, identique celui des pointeurs.
Syntaxe gnrale:
USE nom_module, ONLY: old_var=>new_var, old_vec=>new_vec
Exemple VI.4
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
END PROGRAM MACHINE
55
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Pour spcifier cette vocation tre un paramtre dentre ou de sortie de procdure, on utilise
lattribut INTENT, qui peut tre in, out ou inout.
Syntaxe gnrale:
procedure nom_proc (arg1, arg2, , argn)
type, INTENT(in) :: list_arg1
(et/ou)
type, INTENT(out) :: list_arg2
(et/ou)
type, INTENT(inout) :: list_arg3
O list_arg1, list_arg2 et list_arg3 sont des listes de variables prises parmi les arguments de la
procdure.
Exemple VII.1
SUBROUTINE INIT (r1, u1, T1)
IMPLICIT NONE
REAL, INTENT(IN) :: r1, u1, T1
REAL :: Mach, Miso, Mrad, Mcon
56
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Dans lexemple prcdent, les arguments r1, u1 et T1 sont dclars avec lattribut INTENT(IN), la
procdure init ne peut donc pas modifier leur valeur. Il est interdit dcrire: r1=, u1=, ou
T1=.
57
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple VII.2
SUBROUTINE LECTURE (rr, uu, TT)
IMPLICIT NONE
REAL, INTENT(OUT) :: rr, uu, TT
Dans lexemple prcdent, les arguments rr, uu et TT sont dclars avec lattribut intent(out), la
procdure lecture doit donc leur fournir une valeur.
Syntaxe gnrale:
type, optional [, attributs] :: var
58
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple VII.3
SUBROUTINE LECTURE (rr, uu, TT, AtN)
IMPLICIT NONE
REAL, INTENT(OUT) :: rr, uu, TT
REAL, OPTIONAL, INTENT(OUT):: AtN
IF (PRESENT(AtN)) THEN
READ(12,'(11x,i2)') AtN
WRITE(6,*) 'Atomic number: ', AtN
END IF
CLOSE (12)
Exemple VII.4
REAL SUBROUTINE EVALDIM (a, b, n, min, max, prec)
REAL, INTENT (IN), DIMENSION(n) :: a, b
REAL, INTENT (OUT), OPTIONAL :: min, max, prec
END SUBROUTINE EVALDIM
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)
les arguments de la procdure (arguments formels), avec leur type et leurs attributs,
Par dfaut, on est dans le cas d'une interface implicite: les arguments affectifs 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: il y a donc un contrle de cohrence. Cest donc une interface explicite, mais
qui limite la visibilit de la procdure, depuis lextrieur.
Dans le cas de procdures externes, la compilation de lunit appelante et de la procdure se
fait sparment et les arguments sont passs par adresse. Alors, le contrle de cohrence entre
arguments effectifs et arguments muet nexiste pas la compilation. De nombreuses erreurs,
lors de lexcution du programme, sont possibles et souvent difficiles dtectes.
Cest pourquoi, on a recours une interface explicite, laide dun bloc interface. Ainsi, le
compilateur connat toutes les informations ncessaires l'interface entre lunit appelante et la
procdure.
60
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Exemple VII.5
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
CALL STRUCT (rr1, uu1, TT1, rr2, uu2, TT2, FuncGas,
GP)
END PROGRAM CHOC
SUBROUTINE STRUCT (r1, u1, T1, r2, u2, T2, FuncGas, TG)
IMPLICIT NONE
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
END SUBROUTINE STRUCT
Linconvnient, dans ce cas, est quil est ncessaire de dupliquer le bloc interface dans toutes les
units de programme appelant la procdure concerne. Or lintrt dune procdure externe, avec bloc
interface, est justement dtre utilisable, avec cohrence, par toute autre unit de programme. On
privilgiera alors lcriture du bloc interface au sein dun module.
crire un module qui contient la procdure externe: cest une excellente solution!
On reprend lexemple prcdent, mais la dclaration du bloc interface se fait grce un module,
nomm interhydro.
Exemple VII.6
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
CALL STRUCT (rr1, uu1, TT1, rr2, uu2, TT2, FuncGas,
GP)
END PROGRAM CHOC
SUBROUTINE STRUCT (r1, u1, T1, r2, u2, T2, FuncGas, TG)
IMPLICIT NONE
On reprend nouveau lexemple prcdent, mais cette fois-ci le module sert encapsuler la
procdure, qui devient une procdure interne au module grce au mot cl contains. Linterface de
procdure est connue vie linstruction use nom_module.
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
64
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
a) Linterface explicite
Une interface de procdure est dite explicite dans les cinq cas suivants:
appel de procdures intrinsques: elles ont toujours des interfaces explicites:
accs au module, via linstruction use, contenant le bloc interface de la procdure externe;
Le long du cours, on a dj mentionn des cas o linterface doit tre explicite, sinon le
compilateur ne peut pas savoir si le programme est cohrent ou non. On rencontre dix situations de ce
type:
utilisation dune fonction valeur tableau,
utilisation dune fonction valeur pointeur,
utilisation dune fonction valeur chane de caractres dont la longueur est dtermine
dynamiquement,
utilisation dune procdure gnrique,
argument optionnel,
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
procedure nomn (list_argn)
bloc declaratif de nomn
end procedure nomn
end interface
Exemple VII.8
INTERFACE moyenne
FUNCTION moy_int (tab_int)
INTEGER, DIMENSION(:) :: tab_int
END FUNCTION moy_int
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.
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.
Remarque: Certains oprateurs ont dj fait l'objet d'une surcharge au sein du langage.
On indique loprateur que lon veut surcharger, entre parenthses, la suite du mot cl
OPERATOR:
si, cest un oprateur existant, on utilise directement son signe;
si, on cre un nouvel oprateur, on utilise un identifiant, plac entre les caractres ..
Syntaxe gnrale:
interface operator (*) (ou autre signe)
function nom_fun (list_arg)
bloc dclaratif avec intent (in)
end function nom_fun
end interface
ou:
interface operator (.nom_op.)
function nom_fun (list_arg)
bloc dclaratif avec intent (in)
end function nom_fun
end interface
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
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
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:
interface assignment (=)
subroutine nom_fun (list_arg)
bloc dclaratif avec intent(out)
puis intent (in)
end subroutine nom_fun
end interface
69
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Le langage Fortran dispose d'un ensemble de possibilits en matire d'entre/ sortie (E/S)
particulirement riches.
Les instructions gnrales dentre/ sortie sont les instructions de lecture et dcriture: READ,
WRITE et PRINT. On distingue les entres/ sortie accs directes des entres/ sortie squentielles.
Laccs squentiel permet de traiter les enregistrements dans lordre dans lequel ils
70
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
a) lunit
Lorsquon veut accder un fichier, on donne au paramtre unit la valeur entire qui repre le
fichier. Le numro didentification du fichier est dfini son ouverture (voir linstruction OPEN ci-
aprs).
Lorsquon veut accder une variable du type chane de caractres, on affecte au paramtre unit le
nom de la variable.
Exemple VIII.1
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
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.
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
FORMAT (val1 = , 1p, f7.4, 1x, val2 = , i3)
FORMAT (Les resultats sont : , 3(e12.4, 2x, f8.3))
FORMAT (t12, 3(e12.4, 2x, f8.3), 3x, i20)
c) 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;
de fichier (end),
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
Exemple VIII.3: tiquettes dinstruction
CHARACTER (LEN=4) :: nom
DO
READ (15, i4, err=105, end=106) nom
END DO
105 PRINT*,erreur a la lecture ; STOP 222
106 PRINT*,on a fini !
Note : Le paramtre iostat permet aussi dorienter le programme si une erreur apparat, ou si une
fin de fichier est dtecte. Lintrt est de permettre une programmation plus structure que celle de
lexemple prcdent.
Exemple VIII.4
CHARACTER (LEN=4) :: nom
INTEGER :: dem
DO
READ (15, i4, iostat=dem) nom
IF (dem > 0) THEN
PRINT*,erreur a la lecture ; STOP 222
ELSE
PRINT*,on a fini ! ; EXIT
END IF
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.
READ (12, fmt=405, advance = no, size = l, eor=106) var
106 PRINT*, longueur , l
a) lunit logique
On repre un fichier par un numro, en affectant une valeur au paramtre unit. Tant que le fichier
reste ouvert, il est identifi par ce numro dans les instructions dentre/ sortie du reste programme.
Exemple VIII.5
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
OPEN (unit=20, file=fich_res)
c) status
Ce paramtre peut recevoir une de ces cinq affectations: new, old, unknown, replace, scratch.
new: si le fichier doit tre cr.
replace: si le fichier existe dj lors de louverture, il sera dtruit et dans tous les cas un
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
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
OPEN (unit=20, file=fich_res, action=write,&
acces=direct)
f) dtection derreurs
On affecte une tiquette au paramtre err. En cas derreur dtectes, le programme excute les
instructions contenues partir de ltiquette. (Voir Exemple VIII.3: tiquettes dinstruction.)
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.
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.
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.
l) pad
Cest un instruction dinterrogation sur les paramtres dun fichiers. Elle renvoie donc une valeur
logique .TRUE. ou .FALSE. Elle possde des paramtres trs proches de ceux de linstruction
open: position, delim, action, pad ont la mme signification et les mmes valeurs que pour l'instruction
open.
76
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Syntaxe gnrale:
inquire (unit, file, iostat, err,
opened, exist, number, named, name,
read, write, readwrite, action, access, direct,
position, form, recl, nextrec, blank, pad, delim)
Ces paramtres reoivent chacun les attributs yes, no ou unknown.; ils indiquent respectivement
si la lecture, lcriture et la lecture et lcriture, dans un fichier, sont autorises ou non, ou
indtermines.
Note: cette longueur peut tre utilise pour dterminer la valeur fournir au spcificateur recl lors
d'une prochaine instruction open.
Exemple VIII.8
INTEGER :: longueur
...
INQUIRE (IOLENGTH=longueur) nom, adresse, tel
...
OPEN (1, FILE='repertoire', RECL=longueur, &
FORM='unformatted')
...
WRITE(1) nom, adresse, tel
L'instruction namelist permet de lier un ensemble de variables dans un seul groupe, afin de
faciliter les oprations d'entre/sortie.
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:
namelist /nom_namelist/ liste_var
Remarques:
Il est possible de complter l'numration de la liste dans la mme unit de porte.
Si une variable a l'attribut PUBLIC, aucune variable dans la liste nomme ne peut avoir
l'attribut PRIVATE.
Les champs doivent tre des variables dfinies la compilation, donc pas de paramtres de
VIII.D.2 Usage
Dans une instruction READ ou WRITE, la liste nomme sera dsigne par le spcificateur nml.
Exemple VIII.9
INTEGER, DIMENSION(5) :: age = (/6, 7, 8, 9, 10/)
CHARACTER (LEN=3) :: classe(5)=(/'cp','ce1','ce2',
'cm1','cm2'/)
CHARACTER (LEN=15) :: maitre(5) =
NAMELIST /ecole/ age, classe, maitre
...
READ(*, nml=ecole)
! lit des donnes sous la forme suivante:
&ECOLE maitre(4) = Mme Grosso /
&ECOLE maitre(2) = M. Chaduiron /
...
WRITE(*, nml= ecole)
! gnre les lignes suivantes :
&ECOLE AGE = 6, 7, 8, 9, 10, CLASSE = cpce1ce2cm1cm2
MAITRE = M. Chaduiron Mme Grosso
/
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 ANNEXE
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.
Ces fonctions procdent un dcalage vers la gauche, ou vers la droite, du nombre de bits indiqu
par shift. Lorsque shift est positif, on dcale vers la gauche, lorsque shift est ngatif, on dcale vers la
droite. La fonction ishft remplie les bits manquants par des 0, tandis que la fonction ishftc opre une
permutation circulaire. Elles renvoient toutes les deux un entier du mme nombre de bits que lentier i.
Exemple IX.1
ishft(120,2) donne 480
ishftc(134678, 8) 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).
mvbits est un sous-programme, dons on lappelle avec un call), il est construit sur le mme
principe que la fonction ibits. Il extrait m bits de lentier i, partir du nime bit; puis les place la
njime position de lentier j.
Cette fonction admet un argument x entier ou rel et renvoie un entier gal au nombre de chiffres
significatifs de x:
le nombre de chiffres binaires de la mantisse si x est rel
le nombre de chiffres binaires de stockage (hors bit de signe) si x est un entier.
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)
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.
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
a) Conversion entier-caractre
achar (i)
Cette fonction renvoie le caractre dont le code ASCII est spcifi par l'argument i.
iachar (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)
len_trim
Cette fonction renvoie un entier qui reprsente la longueur de chane de caractre STRING (sans
compter les caractres blancs la fin).
Cette fonction renvoie un entier qui reprsente le numro du premier caractre de string o
apparat l'un des caractres de set ou 0 sinon. back est optionnel et permet de trouver la dernire
occurrence.
Cette fonction renvoie un entier qui reprsente le numro du premier caractre de string ne
figurant pas dans set ou 0 sinon. back est optionnel, s'il est gal .TRUE., la recherche se fait depuis
la fin de string.
83
cole doctorale dAstronomie et dAstrophysique dle-de-France - Cours de Fortran 90/ 95 - Claire Michaut
Ces fonctions renvoient la valeur .TRUE., respectivement si stringa est aprs ou avant stringb
(ou au mme niveau) dans la table ASCII, sinon .FALSE..
Ces fonctions renvoient la valeur .TRUE., respectivement si stringa est strictement aprs ou
avant stringb dans la table ASCII, sinon .FALSE..
Remarque: en cas d'ingalit de longueur, la chane la plus courte sera complte blanc sur sa
droite.
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.
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
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
http://consult.cern.ch/cnl/215/node28.html
http://cch.loria.fr/documentation/documents/F95
IX.E BIBLIOGRAPHIE
86