Fortran 95 Niveau 1

Transcription

Fortran 95 Niveau 1
Fortran 95
Niveau 1
École normale supérieure
L3 sciences de la planète
2016/2017
Lionel GUEZ
[email protected]
Laboratoire de météorologie dynamique
Bureau E224
Table des matières
●
Introduction
●
B, A, BA
●
Types, objets, déclarations
●
Affectations, expressions
●
Alternative
●
Itération
●
Tableaux
●
Fonctions intrinsèques
2/87
Introduction
3/87
Introduction
●
●
●
Fortran : Formula translator
Un des plus anciens langages de
programmation encore utilisés : créé par IBM
en 1954
Objectif : calcul scientifique
4/87
Historique (1/3)
●
1954 Fortran, première spécification du
langage, premier compilateur de Fortran
●
1957 Fortran II
●
1958 Fortran III non publié
●
1962 Fortran IV
Normalisation en 1966 par un organisme
américain : ANSI (American National Standards
Institute). La version normalisée devient
connue sous le nom « Fortran 66 ».
5/87
Historique (2/3)
●
●
●
1978 Fortran 77
Passage à une normalisation internationale :
ISO (International Standards Organization)
1991 Fortran 90 (révision majeure)
1997 Fortran 95 (révision mineure)
Compilateurs gratuits : GNU Fortran depuis
version 4.2.4 (2008), Intel Fortran (pour une
utilisation non commerciale).
Nombreux compilateurs payants.
6/87
Historique (3/3)
●
●
●
2004 Fortran 2003 (révision majeure)
Compilateur IBM XL Fortran depuis version
13.1, sortie en 2010
Compilateur Intel Fortran depuis version 16.0,
sortie en 2015
Compilateurs PGI et Cray
GNU Fortran et NAG : partiellement
2010 Fortran 2008 (révision mineure)
Compilateur Cray
? Fortran 2015 (révision mineure)
7/87
Les conséquences de l'historique
(1/3)
●
Normalisation → stabilité, évolution lente
(Tous les langages de programmation ne sont
pas normalisés. Exemples : Python, Perl…)
8/87
Les conséquences de l'historique
(2/3)
●
●
Importante accumulation de programmes et de
bibliothèques de sous-programmes depuis la
naissance de Fortran.
Doivent rester utilisables. → Les archaïsmes du
langage doivent rester licites. Les normes
successives suppriment très peu et ajoutent
beaucoup.
9/87
Les conséquences de l'historique
(3/3)
●
●
Fortran devient de plus en plus gros. Plusieurs
façons licites de programmer pour arriver à un
même résultat.
Façons de programmer à juger du point de vue
de : la concision, la sécurité, la clarté, la
performance. (Pas de conflit avec l'évolution
des normes : les meilleures façons sont bien
les plus modernes.)
10/87
Ce cours
●
Fortran 95
●
Une sélection et non une vue exhaustive
●
Sélection des fonctionnalités les plus utiles
●
Sélection d'une façon de programmer
11/87
Bibliographie (1/3)
(Du plus sélectif au plus exhaustif, du guide au
dictionnaire)
●
Lignelet, Patrice
Manuel complet du langage FORTRAN 90 et
FORTRAN 95 - Calcul intensif et génie logiciel
Publisher: Masson
Date: 1996
12/87
Bibliographie (2/3)
●
●
Metcalf, Michael; Reid, John
Fortran 90/95 Explained
Publisher: Oxford University Press
Date: 1999
Edition: 2nd
Adams, Jeanne C. et al.
Fortran 95 Handbook - Complete ISO/ANSI
Reference
Publisher: MIT Press
Date: 1997
13/87
Bibliographie (3/3)
●
Document de référence gratuit, norme Fortran
95 :
http://j3-fortran.org/doc/standing/archive/007/97-007r2/pdf/97-007r2.pdf
14/87
B, A, BA
15/87
B, A, BA (1/4)
●
●
●
Caractères du langage : ABC...Z et abc...z,
0 1 … 9, blanc souligné _
Attention : à la différence d'autres langages, en
Fortran la casse n'a pas d'importance (x et X
désignent la même variable).
Caractères spéciaux ayant un rôle : blanc = +
- * / () , . ' : ! “ % & ; < >
16/87
B, A, BA (2/4)
●
D'autres caractères spéciaux ne jouent aucun
rôle en Fortran : ~ [ ] $ etc. On ne peut les
trouver que dans des chaînes de caractères ou
des commentaires.
17/87
B, A, BA (3/4)
●
Identificateurs (noms de variables, de
programme, de procédures, etc.) choisis par le
programmeur : 1 à 31 caractères, lettres,
chiffres, _, commençant par une lettre
Par exemple :
pression, p_surface, t0
mais pas :
température
2nd_level
18/87
B, A, BA (4/4)
●
●
●
Mots-clefs et identificateurs prédéfinis du
langage : ne pas les utiliser pour autre chose.
Cf. liste de mots clefs et
liste des fonctions prédéfinies (§§ 13.11, 13.12
et 13.13) (nombreuses, > 100).
Instruction : 132 caractères maximum par ligne,
& à la fin de la ligne pour continuer à la ligne
suivante
Commentaires introduits par !
Seuls sur ligne ou à la suite d'une instruction
19/87
Notation
Dans ce cours, les crochets [ ] entourent une ligne
ou une partie de ligne facultative. Ils ne font pas
partie du langage, ils ne sont pas à écrire dans un
programme.
20/87
Structure globale d'un programme
●
●
program nom
[déclarations]
instructions exécutables
end program nom
Arrêt possible avec :
stop 1
21/87
Types, objets, déclarations
22/87
Types
types
types prédéfinis
…
types numériques
logical
character
integer real …
23/87
L'instruction implicit none
●
●
Typage automatique possible selon la première
lettre, le désactiver :
implicit none
à placer avant toute autre déclaration
program nom
implicit none
[déclarations]
instructions exécutables
end program nom
24/87
Déclaration de variables
●
●
Une ligne avec un type suivi d'une liste de
variables
Exemples :
integer i, j
real x
real u, v ! vitesse
25/87
Opérations numériques
●
●
Pour entiers (integer) et réels (real),
opérateurs relationnels :
<, <=, ==, /=, >=, >
Résultat logique
Exemple :
x = i == 3
Opérations arithmétiques : + - * / **
26/87
Type entier (1/2)
●
●
●
Constantes littérales entières : sans point
décimal
Exemple de déclaration de variable entière :
integer i
Plus grande valeur entière : huge(0)
31
(typiquement 2 )
27/87
Type entier (2/2)
●
●
/ : division euclidienne (partie entière du
quotient)
Attention :
1 / 2 vaut 0
5 / 2 vaut 2
Fonctions prédéfinies appliquables aux entiers :
abs(a) valeur absolue
mod(a, p) identique à : a – (a / p) * p
28/87
Type réel (1/2)
●
●
Constantes littérales réelles :
Sans exposant : -8.4
Avec exposant : 1e4, 64.2e-5
Exemple de déclaration de variable réelle :
real x
29/87
Type réel (2/2)
●
Plus petite valeur réelle positive non nulle :
tiny(0.) (typiquement # 10-38)
Plus grande valeur réelle :
38
huge(0.) (typiquement # 10 )
Plus petit ε tel que 1. + ε > 1. :
-7
epsilon(0.) (typiquement # 10 )
30/87
Type caractère (1/2)
●
●
Les constantes littérales de type caractère sont
entre apostrophes ou guillemets. Exemples :
'*' 'A' '9' "x = ?"
"n'est pas licite"
'Fichier "plouf.txt" créé'
Longueur d'une chaîne : nombre de caractères.
Exemples de déclaration de variable de type
caractère :
character(len=5) a
character b
31/87
Type caractère (2/2)
●
Opérateur de concaténation : //
32/87
Type logique
●
●
●
Constantes littérales logiques :
.false. .true.
Exemple de déclaration de variable logique :
logical found
Opérateurs logiques :
.not. .or. .and. .eqv. .neqv.
33/87
Attention
Les types logique et entier sont bien distincts : on
ne peut pas mettre une valeur entière à la place
d'une valeur logique (à la différence d'autres
langages, comme C ou Python).
34/87
Déclaration d'une constante
symbolique (1/2)
●
●
On ajoute l'attribut parameter sur la ligne de
déclaration pour distinguer une constante
symbolique d'une variable.
On ajoute obligatoirement la valeur sur la ligne
de déclaration d’une constante symbolique.
35/87
Déclaration d'une constante
symbolique (2/2)
●
●
Exemples :
real, parameter:: pi = 3.14159265
integer, parameter:: m = 5, n = 10
N. B. : la virgule avant parameter et le double
“ : ” sont obligatoires.
36/87
Affectations, expressions
37/87
Affectation (1/2)
●
●
variable réceptrice = expression
Exemple : n = n + 1
La variable et l'expression doivent être toutes
deux de types numériques, ou toutes deux
logiques, ou toutes deux chaînes de
caractères.
38/87
Affectation (2/2)
●
Des règles de priorité entre opérateurs
(arithmétiques avant opérateurs de
comparaison avant opérateurs logiques, / et *
avant + et -, etc.)
Parenthèses pour imposer un ordre
Exemples :
a / b / c identique à : a / (b * c)
x > y .or. i == k .and. j == l
identique à :
x > y .or. (i == k .and. j == l)
39/87
Conversions entre types
numériques (1/2)
●
●
Conversion implicite lors de l'affectation
Exemple :
integer i
real r
i = -1.9 ! reçoit -1 (troncature et non
arrondi)
r = 2 ! reçoit 2.
Conversion explicite :
floor(a) real(i)
40/87
Conversions entre types
numériques (2/2)
●
Conversion vers le type réel dans une
expression
Exemple : 1. / 2
41/87
Rappel sur la division entière
●
●
La partie entière du quotient de deux entiers
s'écrit directement en Fortran avec
l'opérateur /, sans conversion, sans appel à
floor ni à real.
Exemple :
integer i, j
Notation mathématique :
i+ j
E
2
( )
Écriture en Fortran correspondante,
simplement :
(i + j) / 2
42/87
Sous-chaînes et affectation entre
chaînes de caractères
●
●
Sous-chaîne :
v(d:f) v(d:) v(:f)
Exemples :
character(len=8) mot
mot = "aversion"
mot(2:5) vaut "vers"
mot(6:6) vaut "i"
mot(2:1) vaut ""
Affectation : chaîne expression tronquée ou
complétée avec des blancs si besoin
43/87
Affichage à l'écran
●
●
print *, liste d'expressions
print *
sans liste de valeurs pour sauter une ligne
44/87
Saisie au clavier
●
●
●
●
read *, liste de variables
Ce qui est lu est interprété automatiquement
selon le type de la variable (on n'écrit pas
comme en Python d'instruction pour convertir à
partir d'une chaîne de caractères).
Pour une variable chaîne de caractères, inutile
en général d'entrer des guillemets.
Les valeurs peuvent être entrées sur plusieurs
lignes.
45/87
L'alternative
46/87
Construction if (1/2)
if (expression logique 1) then
séquence 1
[else if (expression logique 2) then
séquence 2
…
else if (expression logique n) then
séquence n]
[else
séquence n + 1]
end if
47/87
Construction if (2/2)
●
●
Une séquence au plus est exécutée.
Les parenthèses qui entourent chaque
expression logique sont obligatoires.
48/87
L'itération
49/87
Boucle « pour » (1/2)
●
●
●
do indice = a, b[, r]
instruction
end do
indice : variable entière, ne pas la modifier à
l'intérieur de la boucle
a, b, r : expressions entières, r ≠ 0, évaluées
une seule fois à l'entrée de la boucle
Par défaut : r vaut 1
50/87
Boucle « pour » (2/2)
●
Le nombre d'itérations peut être nul, par
exemple si b < a et r == 1.
51/87
Boucle « tant que »
●
●
do while (condition)
instructions
end do
Les parenthèses qui entourent l'expression
logique sont obligatoires.
52/87
Tableaux
53/87
Définitions (1/3)
rang 0
scalaire
rang 2
rang 1
vecteur
rang 3
…
rang 7
tableaux (arrays)
54/87
taille dimension 1 :
m
Définitions (2/3)
taille dimension 2:
n
tableau a(m, n, p)
Taille totale : m ´ n ´ p
(size)
t
3:
n
sio
n
e
im
d
p
e
aill
vecteur
profil : m n p
(shape)
rang
55/87
Définitions (3/3)
●
N. B. : taille nulle autorisée (si une expression
fait intervenir des tableaux de taille nulle,
aucune opération n'est faite, il n'y a pas
d'erreur)
56/87
Déclaration d'un tableau à profil
constant (1/2)
●
●
●
Profil constant : les valeurs des dimensions
sont connues à la compilation.
Exemple :
real a(10), b(10), c(10)
Borne inférieure 1 par défaut. Possibilité de
borne inférieure quelconque. Exemple :
real x(-2:3, 5)
57/87
Déclaration d'un tableau à profil
constant (2/2)
●
Le profil peut être donné par des constantes
symboliques. Exemple :
integer, parameter:: m = 10, n = 5
real a(m,n)
58/87
Constructeur de vecteur anonyme
●
●
●
(/liste d'expressions scalaires/)
Toutes les expressions doivent être de même
type.
Exemples :
●
●
real v(3)
v = (/3.2, 4., 6.51/)
character(len=3), parameter:: &
currency(3) = (/"EUR", "FRA", &
"USD"/)
59/87
Accès à un élément de tableau
●
●
Liste d'indices
Nombre d'indices : rang du tableau
Indice : expression entière
Exemple :
t3(i * j, 1, k / i + 2)
60/87
Sous-tableau
●
●
Choix d'une progression arithmétique dans une
ou plusieurs dimensions
a:b:r
a : premier indice, par défaut la borne inférieure
b : dernier indice, par défaut la borne
supérieure
r : raison, par défaut 1, éventuellement < 0
Exemples :
t1(m:n), t1(m + n:n:-1)
mat(i, :), mat(:i, j:)
61/87
Expression tableau (1/2)
●
●
●
●
Les opérateurs prédéfinis (arithmétiques,
logiques, de comparaison, de concaténation)
s'appliquent aux tableaux
Les tableaux doivent être compatibles (anglais :
conformable) : de même profil.
En outre, un scalaire et un tableau sont
toujours considérés comme compatibles.
Résultat : tableau de même profil
62/87
Expression tableau (2/2)
●
Exemples :
●
●
Compatibilité scalaire-tableau :
mat / 2
Compatibilité entre tableaux :
mat(:, 0) * t3(:, 1, 1)
real a(5), b(5)
a == b : tableau logique
63/87
Affectation de tableau
●
●
Possibilité d'affecter à un tableau une
expression tableau compatible
Exemples :
a = a(10:1:-1)
mat = 0
a(::2) = 0.
64/87
Tableaux dynamiques (1/2)
●
●
●
●
Quand les valeurs des dimensions ne sont pas
connues à la compilation
La déclaration ne donne que le rang : utilisation
du caractère :, un par dimension
Mettre l'attribut allocatable
real, allocatable:: a(:), b(:, :)
Détermination du profil par une instruction
exécutable :
allocate(a(n:m), b(p, q))
65/87
Tableaux dynamiques (2/2)
●
Pas d'utilisation possible du tableau avant
allocate
66/87
Lecture ou écriture d'un tableau
●
Possibilité de faire référence à un tableau, et
pas seulement à des éléments de tableaux,
dans une lecture ou écriture. Exemples :
integer a(10,2), b(8)
Non seulement :
read *, a(3, 2)
print *, a(4, 1)
mais aussi possible :
read *, b
print *, a(5:, :)
67/87
Ordre des éléments de tableaux
●
●
●
Lecture ou écriture dans l'ordre des éléments
de tableau
Ordre : le premier indice varie le plus vite.
Exemple :
real a(2, 2)
a(1, 1), a(2, 1), a(1, 2), a(2, 2)
L’ordre correspond normalement à la
disposition en mémoire.
68/87
Exemple d'écriture d'un tableau
●
integer a(10,2)
print *, a(5:, :)
affiche à la suite :
a(5, 1), a(6, 1), …, a(10, 1), a(5, 2),
…
sur autant de lignes que nécessaire (selon le
compilateur)
69/87
Lecture d'un tableau
●
read *, tableau
À l’exécution du programme, l’utilisateur peut
entrer les éléments séparés par des virgules ou
des espaces ou des retours à la ligne, à sa
convenance.
70/87
Lecture d'une matrice (1/2)
●
Attention :
integer a(2, 2)
Si a représente une matrice, premier indice : de
ligne, second indice : de colonne, alors la
lecture est contre-intuitive :
read *, a
À l'exécution :
1 2 Entrée
3 4
→a(1, 1) = 1, a(2, 1) = 2, etc.
Donc a vaut 1 3
71/87
2 4
[ ]
Lecture d'une matrice (2/2)
●
Éventuellement, pour une lecture ligne par
ligne :
do i = 1, 2
read *, a(i, :)
end do
À l'exécution :
1 2 Entrée
3 4
→a vaut 1 2
3 4
[ ]
À retenir sur les tableaux
●
●
Fortran vous permet de mettre non seulement
des éléments de tableaux mais aussi des
tableaux dans les expressions, les affectations
et les entrées-sorties.
Vous gagnez en concision et en clarté en
utilisant cette possibilité au lieu d'écrire des
boucles sur les éléments.
Fonctions intrinsèques
74/87
Fonctions intrinsèques
●
Nombreuses
●
Utiles : concision, clarté, performance
●
●
Difficulté : soupçonner qu'il existe une fonction
intrinsèque adaptée, penser à l'utiliser
Conseil : lire en diagonale la liste des fonctions
intrinsèques
75/87
Fonctions intrinsèques distributives
●
●
●
●
Terme officiel en anglais : elemental
Une fonction distributive peut s'appliquer à un
scalaire et retourner un scalaire ou s'appliquer
à un tableau et retourner un tableau de même
profil
Dans le cas d'un tableau, l'opération scalaire
est distribuée sur tous les éléments du tableau
en entrée
Exemple : sin(x), sin((/x, 2*x, 3*x/))
76/87
Fonctions intrinsèques distributives
de conversion
●
int, floor, ceiling, nint, real, etc.
77/87
Fonctions intrinsèques distributives
sans conversion
●
●
●
●
abs
(sur entier ou réel)
mod, modulo
max, min
Exemple :
a vaut (/1,
b vaut (/2,
c vaut (/3,
max(a, b,
sign
2, 0, 0/)
1, 2, 3/)
1, 0, 4/)
c) vaut (/3, 2, 2, 4/)
78/87
Fonctions intrinsèques distributives
mathématiques
●
●
●
acos, asin, atan, cos, sin, tan
atan2
atan2(x, y) : argument dans ]-π, π] de x+iy
sqrt, log, log10, exp, cosh, sinh, tanh
79/87
Fonction intrinsèque distributive
merge
●
●
●
Pour fusionner deux tableaux.
merge(tsource, fsource, mask) vaut
tsource si mask est vrai et fsource sinon
tsource et fsource : même type, profils
compatibles
mask : logique, profil compatible avec tsource
et fsource
80/87
Exemple d'utilisation de merge
T = merge(land_T, sst, land_mask)
xx
x
x
x
xxx
sst
0
0
xx
xx
land_T
0
xx
x
x
x
xxx
xx
xx
81/87
Fonctions intrinsèques de réduction
de tableau (1/3)
●
●
●
Cas simple : ces fonctions appliquent une
opération à l'ensemble des éléments d'un
tableau pour produire un scalaire
(« réduction » : passage d'un tableau à un
scalaire)
Sur tableau numérique :
sum, product, minval, maxval
Sur tableau logique :
any (ou logique), all (et logique), count
(nombre de valeurs vraies)
82/87
Fonctions intrinsèques de réduction
de tableau (2/3)
[
[
1 3 5
m=
2 4 6
0 3 5
m2=
7 4 8
]
]
●
Exemples :
any(m==m2) vaut .true.
all(m==m2) vaut .false.
count(m==m2) vaut 3
sum(m) vaut 21
83/87
Fonctions intrinsèques de réduction
de tableau (3/3)
●
Appliquées à tableau vide, elles renvoient
l'élément neutre de l'opération :
sum → 0
product → 1
minval → huge(…)
maxval →- huge(…)
any →.false.
all →.true.
count → 0
84/87
Produit scalaire
●
●
●
dot_product(vector_a, vector_b)
Vecteurs de même taille, type numérique ou
logique
Si type entier ou réel :
vaut sum(vector_a * vector_b)
Si type logique :
vaut any(vector_a .and. vector_b)
85/87
Produit matriciel et transposition
●
matmul(matrix_a, matrix_b)
●
●
●
●
●
2 tableaux de rang 2 ou bien 1 tableau de rang 2 et
1 vecteur
Type numérique ou logique
Le premier indice pour un tableau de rang 2 est
interprété comme l'indice de ligne.
Contrainte sur les tailles pour que le produit
matriciel soit bien défini
transpose(matrix)
Sur un tableau de rang 2 de type quelconque
86/87
Localisation d'un extremum
●
●
minloc(array[, mask])
maxloc(array[, mask])
Résultat : vecteur des indices du premier
extremum trouvé
Exemples :
V: (/7, 6, 9, 6/)
[
8 −3 0 −5
A : 3 4 −1 2
1 5
6
4
minloc(V) vaut (/2/)
minloc(A, mask=A>-4) vaut (/1, 2/)
]
87/87