Programmer en Fortran
Fortran 90 et ses évolutions Fortran 95, 2003 et 2008
Claude Delannoy
Eyrolles
I. Généralités sur Fortran 901
1 - Présentation par l'exemple de quelques instructions de Fortran 902
1.1 Un exemple de programme en Fortran 902
1.2 Structure générale d'un programme en Fortran 903
1.3 Déclarations de type3
1.4 Pour écrire des informations : l'instruction print4
1.5 Pour faire une répétition : l'instruction do5
1.6 Pour lire des informations : l'instruction read6
1.7 Pour faire des choix : l'instruction if6
1.8 Différences avec Fortran 777
2 - Quelques règles d'écriture
8
2.1 Les identificateurs8
2.2 Les mots-clés9
2.3 Le « format libre »9
2.4 Les commentaires12
2.5 Le « format fixe »13
II. Les types de base de Fortran : Integer, Real, Double précision et logical15
1 - La notion de type
16
2 - Le type integer
17
3 - Le type real
18
3.1 La représentation en mémoire du type real18
3.2 Notation des constantes de type réel19
4 - Le type double précision
20
5 - Le type logical
21
6 - Le typage implicite des variables
23
III. Les expressions et l'instruction d'affectation25
1 - Les expressions arithmétiques
26
1.1 Les opérateurs arithmétiques usuels26
1.2 L'opérateur d'élévation à la puissance : **27
1.3 Les priorités relatives28
1.4 Les expressions mixtes : les conversions implicites30
1.5 Les conversions forcées par une affectation31
2 - Les expressions logiques
33
2.1 Les comparaisons33
2.2 Les opérateurs logiques34
3 - Les expressions constantes
36
3.1 Notion de constante symbolique36
3.2 Notion d'expression constante36
3.3 Utilisation d'une expression constante37
Exercices
38
IV. Les instructions de contrôle41
1 - L'instruction if structure
42
1.1 Réalisation d'une alternative (ou choix simple)43
1.2 Bloc, instruction simple et instruction structurée44
1.3 Les alternatives imbriquées45
1.4 L'instruction else if46
1.5 Syntaxe de l'instruction if48
2 - Un cas particulier d'alternative : l'instruction « if logique »
49
3 - L'instruction select case
50
3.1 Exemple d'instruction select case50
3.2 D'une manière générale52
3.3 Syntaxe de l'instruction select case53
4 - La boucle avec compteur
55
4.1 Introduction55
4.2 Syntaxe de la boucle avec compteur (do)56
4.3 Rôle précis de la boucle avec compteur56
5 - La boucle « tant que » : l'instruction do while58
5.1 Exemple d'introduction de l'instruction do while58
5.2 Syntaxe de l'instruction do while60
6 - Pour modifier le déroulement d'une boucle : les instructions exit et cycle
61
6.1 Sortie anticipée de boucle : l'instruction exit61
6.2 Bouclage anticipé : l'instruction cycle64
7 - La structure de boucle infinie : l'instruction do
65
7.1 Introduction65
7.2 Syntaxe66
7.3 Exemples66
8 - Les instructions go to et stop
67
8.1 L'instruction go to et la notion d'étiquette67
8.2 L'instruction stop69
Exercices71
V. Les tableaux73
1 - Declaration et utilisation classique d'un tableau a une dimension
74
1.1 Exemple introductif74
1.2 D'une manière générale75
2 - Les tableaux à plusieurs dimensions
78
2.1 Déclaration et utilisation de tableaux à plusieurs dimensions78
2.2 Rang, étendue, taille et profil d'un tableau78
2.3 Remarque à propos des déclarations de tableaux en Fortran 7779
3 - Les opérations globales relatives aux tableaux
80
3.1 Affectation collective d'une valeur à tous les éléments d'un tableau80
3.2 Les « expressions tableau »82
3.3 Application des fonctions élémentaires à un tableau87
3.4 Les fonctions portant sur des tableaux88
4 - Construction et initialisation de tableaux
88
4.1 Construction de tableaux à une dimension89
4.2 Initialisation de tableaux à une dimension93
4.3 Construction et initialisation de tableaux à plusieurs dimensions94
5 - Les sections de tableau
95
5.1 Sections régulières d'un tableau à une dimension96
5.2 Section quelconque d'un tableau à une dimension à l'aide d'un vecteur d'indices100
5.3 Sections de tableaux à plusieurs dimensions103
5.4 Les sections de tableaux en général104
5.5 Exemples104
6 - L'Instruction Where
106
6.1 Introduction106
6.2 Syntaxe de l'instruction where107
6.3 Quelques commentaires108
7 - Entrées-sorties de tableaux
109
7.1 Dans une liste, un nom de tableau est équivalent à la liste de tous ses éléments109
7.2 Cas des sections de tableaux110
7.3 D'une manière générale110
7.4 Utilisation de listes implicites111
Exercices
112
VI. Les entrées-sorties standards115
1 - Le format libre en lecture
116
1.1 Ecriture des informations116
1.2 Séparation des informations117
1.3 On peu omettre des informations118
1.4 On peut mettre des informations « en facteur »119
2 - Le format libre en écriture
119
3 - Utilisation d'un format dans une instruction d'entrée-sortie
120
4 - Les principaux descripteurs de format en écriture
121
4.1 Pour écrire des entiers : le descripteur Iw121
4.2 Pour écrire des réels en notation flottante : le descripteur Fw.d122
4.3 Pour écrire des réels en notation exponentielle : le descriteur Ew.d122
4.4 Pour introduire des libellés dans le format123
4.5 Pour introduire des espaces : le descripteur wX124
4.6 Pour écrire des valeurs logiques : le descripteur Lw124
4.7 Pour se « positionner » dans le « tampon » : le descripteur Tp124
4.8 Pour « changer de ligne » : le descripteur /126
4.9 Attention aux erreurs de descripteurs127
4.10 Cas particulier de certains périphériques d'impression127
5 - Les principaux descripteurs de format en lecture
128
5.1 Lecture d'entiers : le descripteur Iw128
5.2 Lecture de réels : les descripteurs Fw.d et Ew.d129
5.3 Pour « sauter » des informations : le descripteur wX130
5.4 Pour se positionner dans le « tampon » : le descripteur Tp130
5.5 Pour lire une nouvelle ligne : le descripteur /131
5.6 Cas des espaces figurant à l'intérieur d'une donnée131
5.7 Quand on fournit trop ou trop peu d'informations132
6 - La syntaxe des instructions d'entrées-sorties (première forme)
132
7 Le format d'une manière générale
133
7.1 Utilisation de facteur de répétition de descripteurs134
7.2 Règles de correspondance entre le format et la liste134
Exercices
138
VII. Les sous-programmes et les fonctions141
1 - Notion de procédure externe
143
1.1 Exemple de définition d'un sous-programme externe144
1.2 Exemple d'utilisation145
1.3 Mise en oeuvre146
2 - Notion de procédure interne
147
2.1 Exemple de sous-programme interne147
2.2 La notion de variable globale148
2.3 Quelques règles concernant les procédures internes150
3 - Les différentes sortes d'arguments en fortran 90
151
4 - Les interfaces
153
4.1 Une première motivation pour l'utilisation d'interfaces : fiabiliser les appels de procédures153
4.2 Comment utiliser une interface154
4.3 D'une manière générale155
5 - Les fonctions
155
5.1 Exemple de définition d'une fonction156
5.2 Exemple d'utilisation d'une fonction157
5.3 La fonction comme cas particulier du sous-programme158
6 - Cas des tableaux transmis en argument
159
6.1 Tableau de profil connu160
6.2 Tableau de profil ajustable161
6.3 Cas des sections de tableaux165
7 - Les variables locales sont gérées de manière « automatique »
165
7.1 Notion de variable automatique ou statique165
7.2 Initialisation de variables locales167
7.3 Cas des tableaux automatiques168
8 - Fonctions fournissant un tableau en résultat
170
9 - Les arguments à mot clé et les arguments optionnels
172
9.1 Les arguments à mot clé172
9.2 Les arguments optionnels173
10 - Transmission d'une procédure en argument
176
10.1 Notion d'argument procédure176
10.2 Exemple : calcul numérique d'intégrale177
11 - Restrictions concernant les arguments effectifs
180
11.1 Nature des arguments effectifs180
11.2 Type des arguments effectifs181
12 - Les procédures récursives
181
Exercices
183
VIII. Les chaînes de caractères185
1 - Exemple d'introduction
186
2 - Déclaration et utilisation de chaînes
187
2.1 Déclaration de variables de type chaîne187
2.2 Ecriture des constantes de type chaîne188
2.3 Affectation entre chaînes189
2.4 Comparaisons entre chaînes190
2.5 Chaînes et initialisations191
3 - Entrées-sorties de chaînes
192
3.1 Entrées-sorties en format libre192
3.2 Entrées-sorties avec un format : les descripteur A et Aw193
4 - Les sous-chaînes
194
4.1 Notion de sous-chaîne194
4.2 La sous-chaîne en général194
4.3 En cas de recoupement195
4.4 Exemples196
5 - Opérations réalisables avec des chaînes
197
5.1 La concaténation, et la fonction trim197
5.2 Longueur d'une chaîne : les fonctions len et len_trim198
5.3 Recherche d'une sous-chaîne dans une chaîne : la fonction index199
6 - Transmission de chaînes en argument
200
6.1 Argument muet de longueur fixe200
6.2 Argument muet de taille variable201
7 - Les chaînes automatiques
202
8 - Fonction fournissant une chaîne en résultat
203
9 - Tableaux de chaînes
205
9.1 Notion de tableau de chaînes205
9.2 Construction et initialisation de tableaux de chaînes205
9.3 Tableaux ajustables et chaînes variables206
Exercices207
IX. Les structures (ou types dérivés)209
1 - Déclaration d'une structure
210
2 - Utilisation de structures
210
2.1 Utilisation des champs d'une structure211
2.2 Utilisation globale d'une structure211
3 - Construction et initialisation de structures
212
4 - Imbrication de structures
214
4.1 Structure comportant des tableaux ou des chaînes de caractères214
4.2 Tableaux de structures215
5 - Structures et procédures
217
5.1 Transmission d'une structure en argument217
5.2 Transmission en argument d'un tableau de structures219
5.3 Fonction fournissant un résultat de type structure220
Exercices
221
X. La gestion dynamique et les pointeurs223
1 - Les tableaux dynamiques
224
1.1 Introduction224
1.2 Exemple d'utilisation d'un tableau dynamique225
1.3 D'une manière générale226
1.4 Tableaux automatiques et tableaux dynamiques230
2 - Présentation de la notion de pointeur dans le cas de variables simples
231
2.1 Premier exemple231
2.2 Deuxième exemple233
3 - Pointeurs sur des chaînes
235
3.1 Premier exemple235
3.2 Application : tri de chaînes236
4 - Pointeurs sur des structures
237
5 - Pointeurs sur des tableaux
238
5.1 Exemple238
5.2 D'une manière générale239
6 - Récapitulatif : affectation d'une valeur à un pointeur
241
7 - Pointeurs et gestion dynamique
241
7.1 Premier exemple242
7.2 Pour permuter deux chaînes243
7.3 Syntaxe générale des instructions allocate et deallocate244
7.4 L'instruction nullify et la fonction associated244
8 - Pointeurs et procédures
246
9 - Exemple d'application de la gestion dynamique : la liste chaînée
249
Exercices
252
XI. Les modules et la généricité255
1 - Notion de module
256
1.1 Premier exemple de module : définition d'un type256
1.2 Deuxième exemple de module : définition d'une procédure258
1.3 Troisième exemple de module : partage de données259
1.4 Dépendances entre modules260
1.5 Procédures internes aux procédures de module261
1.6 Contrôle de l'accès aux ressources du module262
1.7 La syntaxe générale de l'instruction use263
1.8 Privatisation de certaines ressources d'un module263
2 - Les procédures génériques
265
2.1 Le principe265
2.2 Exemple de mise en oeuvre, sans utiliser un module266
2.3 Exemple de mise en oeuvre avec un module267
2.4 D'une manière générale269
3 - Surdéfinition d'opérateurs
270
3.1 Le principe270
3.2 Exemples270
3.3 Priorités des opérateurs surdéfinis273
4 - Surdéfinition de l'affectation
273
5 - Exemples d'utilisation de modules
275
5.1 Bibliothèques de procédures275
5.2 Création d'un type abstrait de données276
5.3 Exemple de type abstrait : nombres rationnels277
5.4 Création d'objets279
XII. Les fichiers281
1 - Généralités
282
1.1 Notion d'enregistrement282
1.2 Accès séquentiel et accès direct282
1.3 Entrées-sorties formatées ou non formatées283
1.4 Numéro d'unité associé à un fichier284
2 - Les entrées-sorties séquentielles non formatées
285
2.1 Exemple de création d'un fichier séquentiel non formaté285
2.2 Exemple de lecture d'un fichier séquentiel non formaté289
3 - Les entrées-sorties séquentielles formatées
292
3.1 Les entrées-sorties séquentielles formatées usuelles292
3.2 Les entrées-sorties standards295
3.3 Pour n'accéder qu'à une partie d'enregistrement : le paramètre advance296
4 - L'accès direct
299
4.1 Création d'un fichier non formaté à accès direct299
4.2 Utilisation d'un fichier non formaté à accès direct302
5 - Gestion des erreurs dans les instructions d'entrées-sorties
303
5.1 Le paramètre iostat304
5.2 Les paramètres end, err et eor304
5.3 Exemples de gestion de fichier avec prise en compte des erreurs305
5.4 Exemple de lecture conversationnelle avec gestion des erreurs308
6 - Les fichiers internes
309
6.1 Notion de fichier interne309
6.2 Exemples310
6.3 D'une manière générale310
7 - Syntaxe générale des instructions d'entrées-sorties
311
8 - Les instructions open et close
313
8.1 L'instruction open313
8.2 L'instruction close36
9 - L'instruction inquire
317
10 - Les instructions de Positionnement à l'intérieur d'un fichier319
Annexe A : Les procédures intrinsèques de fortran 90321
1 - Les fonctions d'interrogation utilisables pour tous les types
322
2 - Les fonctions numériques
322
2.1 Les fonctions numériques élémentaires322
2.2 Les fonctions numériques d'interrogation329
2.3 Les fonctions numériques de transformation330
3 - Les fonctions relatives aux chaînes
331
3.1 Les fonctions élémentaires relatives aux chaînes331
3.2 Les fonctions d'interrogation relatives aux chaînes333
3.3 Les fonctions de transformation relatives aux chaînes334
4 - La fonction logique élémentaire : logicial
334
5 - Les fonctions de manipulation de bits
334
5.1 La fonction d'interrogation : bit_size334
5.2 Les fonctions élémentaires de manipulation de bits335
5.3 Le sous-programme élémentaire : mvbits336
6 - Les fonctions relatives aux tableaux
337
6.1 Les fonctions de multiplication de vecteurs et de matrices337
6.2 Les fonctions de transformation qui réduisent les tableaux338
6.3 Les fonctions d'interrogation relatives aux tableaux340
6.4 Les fonctions de construction et de manipulation de tableaux341
7 - Procédures diverses
345
7.1 La fonction transfer345
7.2 Les sous-programmes non élémentaires346
Annexe B : Les variantes des types de base349
1. Généralités349
2. Déclaration des variables350
3. Notation des constantes350
4. Les variantes du type integer351
5. Les variantes du type real351
6. Les variables du type complex352
7. Les variantes du type logical352
8. Les variantes du type character352
Annexe C : le type complex353
1. Constantes de type complex353
2. Entrées-sorties de complexes354
3. Les opérateurs354
4. Les expressions mixtes354
5. Conversions forcées par affectation354
6. Les fonctions usuelles relatives aux complexes355
7. Les variantes du type complex355
8. Exemple récapitulatif355
Annexe D : Les descripteurs de format357
1. Les descripteurs numeriques
358
1.1 Règles générales concernant la lecture358
1.2 Les descripteurs actifs relatifs aux entiers358
1.3 Les descripteurs actifs relatifs aux réels358
1.4 Les descripteurs passifs d'édition de signe359
1.5 Les descripteurs passifs de facteur d'échelle360
1.6 Les descripteurs passifs relatifs aux espaces en lecture360
2 - Les descripteurs logiques
361
3 - Les descripteurs pour les chaînes de caractères
361
4 - Les autres descripteurs passifs
362
4.1 Les descripteurs agissant sur le pointeur du tampon362
4.2 Le descripteur de changement d'enregistrement :/362
4.3 Le descripteur de fin d'exploitation d'un format «:»362
Tableau recapitulatif363
Annexe E : Les priorités des opérateurs364
Annexe F : Les instructions de déclaration365
I - La forme fortran 90 de la déclaration des variables
366
II - Les autres formes de déclarations
368
2.1 Déclaration par attribut368
2.2 Cas des dimensions de tableaux369
2.3 Cas des chaînes369
III - Typage implicite
370
Annexe G : ordre des instructions372
Annexe H : La programmation orientée objet avec Fortran 2003373
1. Le concept d'objet : association de procédures à un type
373
1.1 Introduction373
1.2 Présentation du mécanisme sur un exemple374
1.3 Constructeur de classe377
1.4 Objets transmis en argument d'une méthode379
1.5 Action sur l'argument implicite fourni à une méthode : pass380
1.6 Les différentes façon d'attacher une méthode à un type381
2 - L'héritage
383
2.1 Le mécanisme384
2.2 Redéfinition de méthodes386
2.3 Quelques règles389
3 - Le polymorphisme
389
3.1 Exemple introductif390
3.2 Les variables polymorphiques en Fortran391
3.3 Une autre situation exploitant le polymorphisme392
3.4 Polymorphisme universel395
4 - L'instruction select type
396
5 - Les classes abstraites et les méthodes retardées
397
Annexe I : Fortran 95, 2003, 2008401
1. La boucle forall pour les tableaux
401
1.1 L'instruction forall401
1.2 La construction forall402
2 - Amélioration de la gestion dynamique
403
2.1 Tableaux dynamiques en argument muet403
2.2 Variables dynamiques404
3 - Amélioration concernant les pointeurs
408
3.1 Pointeurs de procédures408
3.2 Amélioration des pointeurs sur des tableaux410
4 - Les types paramètres
411
5 - Amélioration des entrées-sorties412
5.1 Types dérivés412
5.2 Entrées-sorties asynchrones412
5.3 Entrées-sorties en mode « stream » (flux)412
6 - Interopérabilité avec le langage C
413
7 - Diverses autres fonctionnalités
413
7.1 Standard IEE et gestion des exceptions413
7.2 Structure de bloc413
7.3 Co-tableaux414
7.4 Sous-modules414
Annexe J : Les instructions obsoletes
415
1- L'instruction équivalence415
2- L'instruction common416
3- L'instruction data417
4- L'instruction block data418
5- L'instruction go to calcule418
6- Anciens noms de procédures intrinsèques419
7- La directive include420
8- L'instruction if arithmétique420
9- Instructions assign et go to assigne420
10- L'instruction namelist421
Correction des exercices
423
Index
445