Règles de programmation FORTRAN

Transcription

Règles de programmation FORTRAN
Version
default
Code_Aster
Titre : Règles de programmation FORTRAN
Responsable : Jacques PELLET
Date : 04/01/2011 Page : 1/12
Clé : D2.02.01
Révision : 5003
Règles de programmation FORTRAN
Résumé :
Ce document présente les règles retenues par l’équipe de Développement d’Aster (EDA) pour l’écriture des
routines du code en FORTRAN 77.
On peut distinguer deux sortes de règles :
•
•
les règles issues du livre “FORTRAN 77 Guide pour l’écriture de programmes portables” (F.
FICHEUX-VAPNE et Coll). Pour ces règles, nous avons parfois modifié l’énoncé en transformant
un conseil en règle,
les règles résultant de l’expérience acquise pendant les premières années du projet. Ces dernières
règles sont parfois dictées par des choix techniques stratégiques : par exemple, la gestion de la
mémoire (JEVEUX) dispense souvent de l’usage du COMMON. Ces dernières règles ont donc une
portée moins générale que les premières.
Le respect de ces règles a deux objectifs principaux :
•
•
assurer une bonne portabilité du code,
assurer une bonne lisibilité (et donc maintenabilité) du texte source.
Manuel de développement
Document diffusé sous licence GNU FDL (http://www.gnu.org/copyleft/fdl.html)
Fascicule d2.02 : Règles de développement
Code_Aster
Titre : Règles de programmation FORTRAN
Responsable : Jacques PELLET
Version
default
Date : 04/01/2011 Page : 2/12
Clé : D2.02.01
Révision : 5003
Table des matières
1 Introduction..........................................................................................................................................3
2 Règles retenues..................................................................................................................................3
2.1 Présentation..................................................................................................................................4
2.2 Norme ANSI..................................................................................................................................4
2.3 Exceptions à la norme...................................................................................................................4
2.4 Éléments lexicaux.........................................................................................................................5
2.5 Objets du langage.........................................................................................................................5
2.6 Initialisation – assignation.............................................................................................................5
2.7 Structures de contrôle...................................................................................................................6
2.8 Unités de programme....................................................................................................................6
2.9 Entrées – sorties...........................................................................................................................7
2.10 Problèmes d'inter-compilation.....................................................................................................7
3 Quelques explications.........................................................................................................................8
3.1 Alphabet........................................................................................................................................8
3.2 Déclaration des types flottants......................................................................................................8
3.3 Fonctions intrinsèques..................................................................................................................9
3.4 COMMON...................................................................................................................................10
3.5 Entrées – Sorties.........................................................................................................................11
Bibliographie........................................................................................................................................12
Manuel de développement
Document diffusé sous licence GNU FDL (http://www.gnu.org/copyleft/fdl.html)
Fascicule d2.02 : Règles de développement
Version
default
Code_Aster
Titre : Règles de programmation FORTRAN
Responsable : Jacques PELLET
1
Date : 04/01/2011 Page : 3/12
Clé : D2.02.01
Révision : 5003
Introduction
Le but de ce document est de présenter l’ensemble des règles retenues par l’équipe de
Développement d’Aster (EDA) pour l’écriture des routines FORTRAN du code.
Le respect de ces règles a deux objectifs :
•
•
assurer une bonne portabilité du code,
assurer une bonne lisibilité (et donc maintenabilité) des sources.
Il est évident qu’il ne suffit pas de respecter ces règles pour atteindre le deuxième objectif. Celui-ci
nécessite également des règles de présentation [D9.03.01] et surtout des efforts de la part de chaque
programmeur pour se faire comprendre.
Remarques :
Il est tout aussi clair que ces règles ne concernent que les aspects du langage utilisé et que
d’autres règles doivent être appliquées concernant la programmation (émission des messages
d’erreur, utilisation de JEVEUX , usage des structures de données, etc.) ou le développement
(présentation, documentation, validation, etc.). Ces règles sont présentées dans le Manuel de
Descriptif Informatique et le Manuel d'administration.
Notons tout de suite le caractère impératif de ces règles. Il ne s’agit pas de conseils vertueux. Chaque
règle est écrite de façon à ce que l’on puisse dire sans ambiguïté si elle est respectée ou non : il n’y a
rien de qualitatif. Les développeurs du code Aster doivent les respecter. Nous verrons que la première
règle énoncée (la plus importante) est le respect de la norme ANSI. L’outil de compilation actuel
d’Aster (ifort) permet de vérifier facilement son application. D’autres règles sont vérifiées par l’AGLA
[D2.01.02] nous indiquerons systématiquement entre parenthèses le code-retour émis lorsqu’il est non
nul (2 ou 4). Le code retour (2) permet à l’administrateur des sources d’Aster (ASA) de contrôler les
exceptions aux règles. Le code retour (4) interdit la restitution des sources . Pour les règles dont la
vérification automatique est moins facile, la “sanction” se fera a posteriori : la procédure d’évolution des
sources permet en effet de retrouver facilement l’identité d’un éventuel développeur négligent.
Le livre qui nous a servi de base pour ce document est le livre “FORTRAN77 Guide pour l’écriture de
programmes portables” [1] réalisé sous la direction de F. FICHEUX-VAPNE. Nous en avons conservé
le plan : éléments lexicaux, ..., entrées-sorties. Nous avons retenu :
•
•
18 conseils de portabilité,
22 conseils méthodologiques.
Le respect de la norme, que nous avons institué en règle n° 1 remplace 33 conseils du livre.
Les conseils du livre ont été érigés en règles, parfois en modifiant leur énoncé : “utiliser ... avec
prudence” → “ne pas utiliser ...”.
A ces règles, nous avons ajouté quelques règles qui nous sont propres et qui résultent de l’expérience
acquise par l’équipe de Développement pendant les cinq premières années du Projet.
Dans ce document, nous avons essayé d’expliquer (au moins partiellement) les raisons du choix de
ces règles. Ceci n’est pas toujours facile à faire. Pour cela, nous renvoyons à [1] pour les règles
provenant de ce livre, et nous faisons des renvois à certains paragraphes d’explication pour les règles
qui nous sont propres.
Terminons cette introduction en disant que, contrairement à une idée répandue, FORTRAN n’est pas un
langage “évident”. Certains éléments du langage sont des “survivances” d’anciennes versions du
langage. Ces éléments ne sont souvent plus compris des “jeunes” programmeurs. Le lecteur curieux
pourra lire avec profit le livre “Fortran 77” de H. KATZAN [3] pour bien comprendre ce qu’est le
FORTRAN77 de la norme ANSI.
Manuel de développement
Document diffusé sous licence GNU FDL (http://www.gnu.org/copyleft/fdl.html)
Fascicule d2.02 : Règles de développement
Version
default
Code_Aster
Titre : Règles de programmation FORTRAN
Responsable : Jacques PELLET
2
Règles retenues
2.1
Présentation
Date : 04/01/2011 Page : 4/12
Clé : D2.02.01
Révision : 5003
Les règles sont numérotées. Pour les règles issues de [1]. nous avons conservé la même
numérotation que celle du livre, ce qui permet de s’y référer plus facilement, en particulier pour
comprendre le pourquoi de cette règle. Les règles supplémentaires que nous nous sommes données
sont notées A-i.
A-i
ième règle Aster,
P-i
ième conseil de portabilité [1],
M-i
ième conseil de méthodologique [1].
En général, chaque règle est suivie de l’explicitation des exceptions à cette règle (quand elles
existent).
Rappel :
Le code retour de l’ AGLA ( asrest/asverif ) est écrit entre parenthèses lorsqu’il est non nul :
(2) ou (4).
Quelques termes du Code_Aster
JEVEUX
gestionnaire de mémoire du Code_Aster,
SUPERVISEUR “programme principal” qui enchaîne (et supervise) les différentes commandes
du logiciel,
2.2
Norme ANSI
•
2.3
A-1
→ Respecter la norme FORTRAN77 ANSI. [2]. C’est évidemment la règle la
plus importante.
Exceptions à la norme
Les exceptions au respect de la norme ANSI sont :
•
•
•
•
•
•
•
A-2 → Utiliser les déclarations REAL*8 et COMPLEX*16 (cf. §3.2).
A-3 → Il est permis de faire ZK8(I) = ZK8(J) si ZK8 est un tableau de chaînes de
caractères.
A-4 → Il est permis d’utiliser les fonctions hors norme :
• IAND, IOR sur le type INTEGER,
• DIMAG et DCONJG et DCMPLX pour le type COMPLEX*16 (cf. §3.3).
A-5 → Les minuscules et certains caractères spéciaux ne sont permis que pour certaines
unités de programme (cf. § 3.1) [2].
A-6 → Il est interdit d’utiliser le FORMAT d’impression des variables binaires hors norme
Z, B, O, etc… sauf pour la routine JJIMPO [2] pour faire le “dump” de la mémoire.
A-7 → Il est permis à JEVEUX de mettre en équivalence des variables de type caractère
et de type non-caractère [2]. (cf. aussi A-13)
A-40 → Il est permis de passer en argument une expression de type caractère du style
'chaîne'//arg(1:n) où arg est un argument de longueur inconnue.
Exemple
SUBROUTINE AAAAAA (C)
CHARACTER*(*) C
Manuel de développement
Document diffusé sous licence GNU FDL (http://www.gnu.org/copyleft/fdl.html)
Fascicule d2.02 : Règles de développement
Version
default
Code_Aster
Titre : Règles de programmation FORTRAN
Responsable : Jacques PELLET
Date : 04/01/2011 Page : 5/12
Clé : D2.02.01
Révision : 5003
CALL UTMESS(...,'TOTO'//C(1:4),....)
•
•
2.4
Éléments lexicaux
•
•
•
•
•
•
•
•
•
2.5
A-41 → Il est interdit d’utiliser les constantes données sous forme binaire pour les types
non flottants. Exception routine DEFVEM [2].
A-44 → Il est interdit sauf à JEVEUX [2] de mettre en équivalence un vecteur de longueur
1 avec une variable déclarée en COMMON.
P.I.6 → Inscrire les commentaires dans des lignes commentaires comportant en première colonne
un C à l’exclusion de tout autre caractère [4].
A-49 → Les lignes blanches sont acceptées.
P.I.8 → Ne pas insérer de commentaires entre des lignes suites (0), ni avant les en têtes
FUNCTION, SUBROUTINE, ni après END [4].
M.I.2 → Ne pas utiliser de mots-clés comme identificateurs : IF, END, CALL, GOTO, …
M.I.3 → Ne pas mettre de blancs à l’intérieur des identificateurs, des mots-clés (sauf pour GO TO,
END IF, et ELSE IF) et des constantes sauf celles de type caractère.
M.I.5 → Ne pas couper en fin de ligne les mots-clés, les identificateurs et les constantes.
A-29 → Utiliser le & comme caractère de continuation des cartes suites.
A-30 → Couper les lignes à poursuivre de façon à ce que l’instruction soit syntaxiquement
incorrecte sans les cartes suites. Par exemple en terminant les lignes à suivre par : ‘,’ ‘//’ ‘+’ ‘-’
‘/’ etc…
A-39 → Donner à chaque unité de programme un nom ayant 6 caractères (5 à la rigueur).
Objets du langage
•
•
•
•
•
•
•
P.II.3 → Ne pas mettre de blancs à l’intérieur d’une constante littérale de type arithmétique ou
logique.
P.II.6 → Ne comparer que des expressions arithmétiques de même type.
P.II.8 → N’utiliser les opérateurs de comparaison .LT., .LE., .GT. et .GE. sur des chaînes de
caractères que pour comparer entre elles des chaînes composées uniquement de chiffres ou
des chaînes composées uniquement de lettres.
P.II.9 → Utiliser seulement les fonctions intrinsèques LGE, LGT, LLE et LLT pour comparer selon
l’ordre du code ASCII des chaînes composées à la fois de lettres, de chiffres et de caractères
spéciaux.
A-2 → (Rappel) Utiliser les déclarations REAL*8 et COMPLEX*16.
A-8 → Ne pas utiliser les déclarations REAL, COMPLEX et DOUBLE PRECISION [4].
A-31 → Toutes les routines doivent comporter l’instruction [4] :
IMPLICIT REAL*8 [A-H] [O-Z] ou
IMPLICIT NONE
Ceux qui restitueront du FORTRAN avec IMPLICIT NONE seront mieux considérés que les autres.
•
•
•
•
A-32 → Les variables locales non utilisées doivent être détruites.
A-33 → Les instructions mises en commentaires doivent être détruites.
A-35 → Les étiquettes ne doivent apparaître que devant l’instruction CONTINUE ou
FORMAT [4].
A-36 → Utiliser : A**2 à la place de A*A ou de A**2.D0
Manuel de développement
Document diffusé sous licence GNU FDL (http://www.gnu.org/copyleft/fdl.html)
Fascicule d2.02 : Règles de développement
Code_Aster
Titre : Règles de programmation FORTRAN
Responsable : Jacques PELLET
2.6
Version
default
Date : 04/01/2011 Page : 6/12
Clé : D2.02.01
Révision : 5003
Initialisation – assignation
P.III.1 →Utiliser seulement des expressions entières comme valeurs initiale, finale et
comme pas d’une boucle DO implicite.
M.III.6 → Ne pas utiliser l’instruction ASSIGN.
A-45 → Toutes les constantes numériques (plus petit nombre flottant, etc…) et
mathématiques ( π , 2π , etc…) doivent être initialisées par appel à une fonction
ENVIMA [D6.01.01]. Si celui-ci semble insuffisant émettre un rapport d’anomalie.
A-46 → Il est inutile et peu lisible d’utiliser des variables pour manipuler des constantes
numériques simples. Par exemple, ce qu’il ne faut pas faire :
•
•
•
•
REAL*8 ZERO,UN
DATA ZERO,UN/0.D0,1.D0/
X = ZERO
MU2 = E / (UN+NU)
Ce qu'il faut faire :
X = 0.D0
MU2 = E/(1.D0+NU)
A-47 → Toutes les constantes flottantes doivent comporter le ‘.’ et le ‘D’ [4] (cf. §3.2).
•
2.7
Structures de contrôle
P.IV.1 → N’utiliser que des expressions de type entier comme paramètres et compteur de
boucle.
P.IV.2 → Ne pas modifier le compteur de boucle dans le corps de la boucle.
P.IV.7 → Ne pas utiliser l’instruction PAUSE.
M.IV.1 → Terminer chaque boucle DO par une instruction CONTINUE.
P.IV.4 → Utiliser systématiquement l’instruction CONTINUE, en particulier comme
dernière instruction des structures de contrôle en ayant soin, lorsque ces structures
sont imbriquées, d’attribuer un CONTINUE à chacune.
A-9 → Ne pas utiliser le GO TO calculé. Exceptions : routines TE0000, EX0000, EX0100,
OPSEXE.
A-9 → Ne pas utiliser le GO TO assigné.
A-10 → Ne pas utiliser le IF arithmétique.
A-11 → Ne pas utiliser l’instruction STOP sauf pour les routines JEFINI, JVFINM,
JVVTAM [2].
A-34 → Les blocs IF vide sont interdits.
A-38 → Les blocs IF et les boucles DO doivent être indentés de deux caractères.
•
•
•
•
•
•
•
•
•
•
•
Exemple :
C
100
DO 100 I=1,N
X(I) = 0.D0
CONTINUE
IF(Y.LT.0.D0) THEN
Z=1.D0
ELSE
Z=2.D0
ENDIF
Manuel de développement
Document diffusé sous licence GNU FDL (http://www.gnu.org/copyleft/fdl.html)
Fascicule d2.02 : Règles de développement
Version
default
Code_Aster
Titre : Règles de programmation FORTRAN
Responsable : Jacques PELLET
2.8
Date : 04/01/2011 Page : 7/12
Clé : D2.02.01
Révision : 5003
Unités de programme
•
•
•
•
•
P.V.4 → Ne pas utiliser les fonctions intrinsèques CHAR et ICHAR [4] (cf. A-15).
Exceptions :
• JEVEUX : JEDEBU, JJVERN [2].
P.V.9 → N’utiliser qu’un seul type pour les variables d’un COMMON donné. (cf. §3.4).
P.V.12 → Utiliser l’instruction SAVE à chaque fois que la rémanence est souhaitée.
M.V.3 → Ne pas utiliser les fonctions intrinsèques comme arguments de sous programme.
M.V.8 → Terminer une fonction externe par END sans coder de RETURN. Donc ne pas
utiliser RETURN [4]. Il n’est pas interdit cependant d’utiliser :
9999
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
GOTO 9999
...
CONTINUE
END
M.V.9 → Ne pas définir de fonctions externes ayant le même nom que des fonctions
intrinsèques.
M.V.12 → Ne pas utiliser dans un sous-programme les retours optionnels de sous
programmes.
M.V.13 → Ne pas utiliser l’instruction ENTRY.
M.V.16 → Ne pas utiliser d’arguments de la forme *étiq (cf. M.V.12).
M.V.17 → Ne pas utiliser de BLOCK DATA [4].
M.V.20 → Ne pas utiliser l’ordre DIMENSION : il est plus simple de déclarer la dimension
avec le type [4].
M.V.21 → Ne définir qu’un commun pour chaque instruction COMMON et n’utiliser qu’une
seule instruction COMMON par commun.
M.V.22 → Pour des objets appartenant à un commun, utiliser les mêmes noms dans
toutes les unités de programme où celui-ci apparaît.
M.V.23 → Ne pas utiliser le commun blanc (commun sans nom).
M.V.27 → Utiliser la notation ‘*’ pour coder la borne supérieure de la dernière dimension
d’un tableau utilisé comme argument formel lorsque cette borne est inconnue du
sous-programme.
M.V.28 → Noter ‘*’ la longueur d’une chaîne de caractères utilisée comme argument
formel [4].
A-12 → Ne pas utiliser l’instruction PROGRAM. Exception : routine aster.
A-13 → Ne pas utiliser l’instruction EQUIVALENCE (sauf pour les routines JEVEUX
d‘UTILICRA) [4] (cf. aussi A-7).
A-14 → Ne pas utiliser l’instruction INTRINSIC [4].
A-15 → N’utiliser que les fonctions intrinsèques autorisées (cf. §3.3) [4].
A-21 → L’usage du COMMON est réservé à des utilisations très particulières (cf. §3.4 )
A-26 →Limiter à 300 le nombre de lignes d’une routine [2].
A-27 → Limiter à 15 le nombre d’arguments d’une routine [2].
A-28 → Conserver si possible l’identificateur des arguments de la routine appelée dans la
routine appelante.
A-42 → N’utiliser l’instruction EXTERNAL qu’en cas de nécessité : lorsque la routine
“externe” est passée en argument.
A-43 → Ne pas faire appel à des bibliothèques externes mises à part BLAS et LAPACK
Manuel de développement
Document diffusé sous licence GNU FDL (http://www.gnu.org/copyleft/fdl.html)
Fascicule d2.02 : Règles de développement
Version
default
Code_Aster
Titre : Règles de programmation FORTRAN
Responsable : Jacques PELLET
2.9
Date : 04/01/2011 Page : 8/12
Clé : D2.02.01
Révision : 5003
Entrées – sorties
•
•
•
•
•
•
•
•
•
•
•
•
P.VI.4 → Lors d’un READ ou d’un WRITE, préciser l’unité logique choisie, en paramétrant
son numéro (variable entière). Ne pas utiliser l’astérisque.
P.VI.6 → La valeur du code retour IOSTAT dépend du calculateur. La norme indique
seulement qu’elle sera nulle si tout s’est bien passé, positive s’il y a eu erreur,
négative si une fin de fichier a été rencontrée. N’utiliser que cette propriété.
P.VI.7 → Utiliser seulement des expressions de type entier pour les valeurs initiale, finale
et pour la valeur du pas des boucles DO implicites dans les listes d’entrée-sortie.
P.VI.8 → Donner toujours une liste d’entrée-sortie dans les ordres de lecture et d’écriture
et ne pas utiliser le format vide.
P.VI.18 → Dans une instruction FORMAT, ne pas utiliser les spécifications d’édition, T, TL
et TR.
M.VI.2 → Ne pas utiliser l’instruction PRINT.
M.VI.5 → Ne pas utiliser le descripteur nHh1...hn mais ‘h1h2...hn’.
A-16 →Ne pas utiliser l’instruction OPEN
A-17 → Ne pas utiliser l’instruction BACKSPACE.
A-18 → Ne pas utiliser l’instruction INQUIRE.
A-19 → Ne pas utiliser l’instruction CLOSE.
A-20 → Ne pas utiliser l’instruction ENDFILE.
2.10 Problèmes d'inter-compilation
•
•
•
•
A-22 → Utiliser le même type et la même longueur pour une variable mise en COMMON
dans toutes les routines qui l’utilisent [4].
A-23 → Appeler les routines avec le bon nombre d’arguments [4].
A-24 → Ne pas appeler une routine avec un argument du type CHARACTER de longueur
différente que celui attendu par le programme appelé [4].
Règle pour les routines ayant un argument formel de type CHARACTER
• utiliser la déclaration CHARACTER*(*) (M-V-28),
• recopier si nécessaire les arguments CHARACTER*(*) dans des
variables locales.
A-25 → Ne pas appeler une routine avec des arguments d’un type différent de celui
qu’elle attend. Notamment ne pas appeler une routine avec un argument complexe si
celle-ci attend deux arguments réels et inversement [4].
3
Quelques explications
3.1
Alphabet
Certaines routines utilisent des caractères “interdits” (par la norme).
•
•
•
Le superviseur doit pouvoir lire les caractères autorisés dans le langage de commandes
d’Aster :
• minuscules
• %, &, !, _.
JEVEUX utilise : $ et &.
Les routines imprimant des lignes de “commandes UNIX” utilisent : $, | (“pipe” UNIX),\.
Résumé des exceptions concernant l’alphabet :
Soit : N = {caractères autorisés par la norme}
= {AB...Z01...9”blanc”=+-*/(),.’:$}
caractères autorisés : N -{$} +{&}
Manuel de développement
Document diffusé sous licence GNU FDL (http://www.gnu.org/copyleft/fdl.html)
toutes les routines
Fascicule d2.02 : Règles de développement
Version
default
Code_Aster
Titre : Règles de programmation FORTRAN
Responsable : Jacques PELLET
Date : 04/01/2011 Page : 9/12
Clé : D2.02.01
Révision : 5003
caractères autorisés : N +{&}
JEVEUX
caractères autorisés : N -{$} + {minuscules, %, &, !, _}
SUPERVISEUR
caractères autorisés : N+{I,\}
impressions UNIX
Remarque:
Les commentaires n’utilisent que les caractères autorisés par la norme.
3.2
Déclaration des types flottants
Ce problème est lié à la double exigence suivante :
permettre des calculs avec une précision jugée raisonnable : 14 chiffres significatifs,
être portable sur des machines dont le REAL est de longueur 32 bits.
•
•
Malheureusement ces exigences ne sont pas compatibles avec la norme.
La “solution” choisie pour ce problème est détaillée dans la note HI-75/94/068/A “Le problème des
nombres flottants en FORTRAN77”.
Solution retenue :
Les seuls ordres de déclaration autorisés sont :
•
IMPLICIT NONE
)
IMPLICIT REAL*8 [A-H] [O-Z] )
LOGICAL
INTEGER
REAL*8
COMPLEX*16
CHARACTER*…
au
choix
Sinon code retour (4)
Écrire les constantes en double précision.
•
Sinon code retour (4)
REAL*8 R1, R2
COMPLEX*16 C1, C2
R1 = 1.D0/3.D0
C1 = (3.D0, 4.D0)
Il est donc interdit d'écrire :
R1
R1
C1
C1
3.3
=
=
=
=
1./3.
1.E3/3.E3
(0.,1.)
(0.E0,1.E2)
Fonctions intrinsèques
Les fonctions intrinsèques du langage : sinus, cosinus, racine_carrée, valeur_absolue, ... ont pour la
plupart d’entre elles une forme générique (i.e. indépendante du type de leurs arguments). Ce sont ces
fonctions génériques qu’il faut utiliser pour assurer la portabilité.
Manuel de développement
Document diffusé sous licence GNU FDL (http://www.gnu.org/copyleft/fdl.html)
Fascicule d2.02 : Règles de développement
Version
default
Code_Aster
Titre : Règles de programmation FORTRAN
Responsable : Jacques PELLET
Date : 04/01/2011 Page : 10/12
Clé : D2.02.01
Révision : 5003
Exemple : fonction racine_carrée
REAL
nom spécifique : SQRT
DOUBLE PRECISION
nom spécifique : DSQRT
COMPLEX
nom spécifique : CSQRT
Nom générique : SQRT
De la même façon, la conversion de type doit se faire de manière générique. Par exemple, la
conversion en entier (troncature) :
Spécifique :
INT
REAL
INTEGER
IFIX
REAL
INTEGER
IDINT
DOUBLE PRECISION
INTEGER
Nom générique : INT
Les fonctions intrinsèques retenues (Cf note HI-75/94/068/A) sont :
•
Fonctions de la norme FORTRAN
→ Conversions de type :
INT
DBLE
→ Fonctions arithmétiques génériques
AINT
SIGN
EXP
ANINT
DIM
LOG
NINT
MAX
LOG10
ABS
MIN
MOD
SQRT
→ Fonctions trigonométriques génériques
SIN
ATAN
COS
ATAN2
TAN
SINH
ASIN
COSH
ACOS
TANH
→ Fonctions particulières au type character
CHAR
•
ICHAR
LEN
INDEX
Fonctions hors norme à utiliser
→ Conversions de type :
DCMPLX
→ Fonctions particulières au type complexe
DBLE
DIMAG
DCONJG
→ Fonctions particulières au type integer
IOR
IAND
Manuel de développement
Document diffusé sous licence GNU FDL (http://www.gnu.org/copyleft/fdl.html)
Fascicule d2.02 : Règles de développement
Version
default
Code_Aster
Titre : Règles de programmation FORTRAN
Responsable : Jacques PELLET
3.4
Date : 04/01/2011 Page : 11/12
Clé : D2.02.01
Révision : 5003
COMMON
Le gestionnaire de mémoire JEVEUX permet aux routines du code de s’échanger des données
structurées en minimisant le nombre des arguments : on transmet le nom de la structure de données.
L’utilisation de COMMON n’est donc pas recommandée dans Aster. Il n’est pourtant pas interdit de les
utiliser. Cette utilisation doit cependant rester limitée à des “paquetages” de routines bien identifiés.
L’usage de COMMON n’est pas de limiter le nombre des arguments passés aux routines. L’utilisation
est justifiée :
pour des raisons de performances et uniquement pour les routines d’utilisation générale
(CALCUL, JEVEUX, SUPERVISEUR, lecture des CATALOGUES),
pour le passage des paramètres aux routines utilisées en EXTERNAL.
L’utilisation même de JEVEUX est impossible sans les “COMMON JEVEUX” (cf. [D6.02.01] ). Pour
ceux-ci, on utilisera toujours la même séquence de déclarations (recopiée de routine en routine) :
C
C --C
C ---
DEBUT DECLARATIONS NORMALISEES JEVEUX ----------------------CHARACTER*32
JEXNUM, JEXNOM, JEXR8, JEXATR
INTEGER
ZI
COMMON / IVARJE / ZI (1)
REAL*8
ZR
COMMON / RVARJE / ZR (1)
COMPLEX*16
ZC
COMMON / CVARJE / ZC (1)
LOGICAL
ZL
COMMON / LVARJE / ZL (1)
CHARACTER*8
ZK8
CHARACTER*16
ZK16
CHARACTER*24
ZK24
CHARACTER*32
ZK32
CHARACTER*80
ZK80
COMMON / KVARJE / ZK8(1), ZK16(1), ZK24(1), ZK32(1), ZK80(1)
INTEGER*4
ZI4
COMMON / I4VAJE / ZI4 (1)C
FIN DECLARATIONS NORMALISEES JEVEUX -------------------------
Pour les autres COMMON nous adopterons la règle de dénomination suivante :
COMMON TxyzPP où T est un caractère qui indique le type des variables du COMMON :
I
INTEGER
R REAL*8
L
LOGICAL
C COMPLEX*16
L
LOGICAL
K CHARACTER
S INTEGER*4
Il est prudent de séparer dans des COMMON différents les variables de types différents : réels, entiers,
… Cela limite le risque d'avoir des variables mal alignées.
La norme Fortran77 interdisait le mélange des variables numériques avec des variables CHARACTER.
Il ne semble plus que ce soit le cas pour la norme Fortran90.
Manuel de développement
Document diffusé sous licence GNU FDL (http://www.gnu.org/copyleft/fdl.html)
Fascicule d2.02 : Règles de développement
Version
default
Code_Aster
Titre : Règles de programmation FORTRAN
Responsable : Jacques PELLET
Date : 04/01/2011 Page : 12/12
Clé : D2.02.01
Révision : 5003
PP est une paire de caractères qui identifie à la fois un “paquet” de communs et le paquetage des
routines qui utilisent ce paquet.
xyz sont trois caractères libres permettant de différencier les communs d’un même paquet.
Exemples de ce qui pourrait être fait :
PP = ‘JE’ : COMMON nécessaires à JEVEUX
PP = ‘CA’ : COMMON nécessaires à la routine CALCUL,
PP = ‘LC’ : COMMON nécessaires à la routine NMCOMP,
3.5
Entrées – Sorties
Les entrées/sorties du code sont en principe faites par un nombre restreint de routines :
lecture/écriture sur les bases de données Aster (fichiers d’accès direct) : JEVEUX.
lecture formatée :
• le superviseur est chargé de la lecture du fichier de commandes,
• seules les commandes LIRE_XXXX (XXXX = MAILLAGE, FONCTION, ...) et les
commandes d’interfaçage PRE_XXXX (XXXX = GIBI, IDEAS, …) sont autorisées à
lire sur des fichiers externes. Pour cela, la seule instruction autorisée est le READ
formaté.
écriture formatée :
• émissions de messages sur les fichiers ERREUR, MESSAGE, RESULTAT : paquetage
des routines U2MESS, U2MESI, ... (cf. [D6.04.01] ),
• écriture de résultats : commandes IMPR_XXXX (XXXX = RESU, FONCTION, ...),
• écriture d’informations dans les fichiers RESULTAT ou MESSAGE (mot clé IMPR de
certaines commandes).
•
•
•
.
Résumé des instructions autorisées :
U2MESS(...)
toutes routines.
READ(nfic, fmt)
Commandes LIRE_XXXX
WRITE(nfic, fmt)
Commandes IMPR_XXXX et mot clé IMPR
accès direct
JEVEUX
Bibliographie
[1]
FORTRAN77 - Guide pour l’écriture de programmes portables sous la direction de F.
Ficheux-Vapné - Éditions Eyrolles Collection de le Direction des Études et Recherches
d’Électricité de France
[2]
Norme FORTRAN77 - ANSI X3.9-1978
[3]
FORTRAN77 - Harry Katzan - Van Nostrand Reinhold Company 1978
Manuel de développement
Document diffusé sous licence GNU FDL (http://www.gnu.org/copyleft/fdl.html)
Fascicule d2.02 : Règles de développement