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