Suiv.: 4.2 Programmation
Sup.: Structures de Données
Préc.: Structures de Données
Index
Table des matières
L'appel d'un module est généralement de la forme :
CALL MODULE(M, NF1, NI1, NF2, NI2, ...)
Ainsi, chaque SD est désignée par deux entiers NF, NI :
Par ailleurs, certains utilitaires peuvent être appelés à l'extérieur des modules : IMtysd, NOFOSD, TUERSD.
Cette section précise ces différentes notions.
Cette section décrit
les cas et
,
puis donne des indications sur l'option à choisir.
Par convention, signifie que la SD est en mémoire
centrale.
Plus précisément :
Par convention, signifie que la SD est en mémoire
secondaire (fichier disque).
Plus précisément :
Le signe de NF spécifie le mode d'accès :
pour un fichier en accès séquentiel,
pour un fichier en accès direct.
(
Pour une SDS en accès direct, appeler auparavant
l'utilitaire DEFDIR (p.
).)
Certains modules offrent ainsi le choix entre ces deux modes
d'accès, mais la plupart ne traitent que l'accès séquentiel.
Dans tous les cas, la valeur absolue donne le numéro
d'unité du fichier. Le fichier doit être préalablement ouvert
par un appel à OUVRIR ou OUVRIS (section 1.6).
Quel que soit le numéro de fichier NF, une SD doit être
présente en mémoire centrale pour être manipulée.
Elle est alors identifiée par son
numéro de niveau, qui est un entier compris entre 0 et 36.
( Cette limitation est due à l'utilitaire
NUMALP (p.
).)
Le but est d'obtenir le maillage d'un disque D par ``recollement'' de trois secteurs A, B, C (figure 4.1).
Figure: Disque D formé de trois secteurs A, B, C
Les trois secteurs A, B, C et le disque D à créer sont décrits
par des SD de type NOPO.
Supposons que les fichiers correspondants soient déjà ouverts
avec les numéros respectifs NFA, NFB, NFC,
NFD.
Supposons aussi qu'un module appelé RECOL( Le
véritable module de recollement de Modulef
a pour nom RECOLC et nécessite un plus grand nombre de
paramètres.)
recolle les maillages contenus dans deux SDE X et Y,
et crée une SDS Z :
SUBROUTINE RECOL(M, NFX, NIX, NFY, NIY, NFZ, NIZ)
Une première solution est de lire la SD A avec le niveau 1, de lire la SD B avec le niveau 2, et de créer par recollement une SD de niveau 3. Cette dernière est recollée avec la SD C de niveau 4, créant ainsi la SD D cherchée, de niveau 5 :
...
CALL RECOL(M, NFA, 1, NFB, 2, 0, 3)
CALL RECOL(M, 0, 3, NFC, 4, NFD, 5)
...
Après ces deux appels, cinq SD résident simultanément
en mémoire centrale, repérées par leurs numéros de niveaux
1, 2, 3, 4, 5.
Si la taille du super-tableau est insuffisante, il est préférable
de détruire les SD devenues inutiles
(utilitaire TUERSD, p. ) :
...
CALL RECOL(M, NFA, 1, NFB, 2, 0, 3)
CALL TUERSD(..., 1, ...)
CALL TUERSD(..., 2, ...)
CALL RECOL(M, 0, 3, NFC, 4, NFD, 5)
...
En fait, le numéro de niveau ne sert qu'à distinguer deux SD de même type : si deux SD de types différents résident simultanément en mémoire centrale, elles peuvent avoir le même niveau.
Ainsi, dans l'exemple précédent, les SD sont du même type NOPO. Il serait possible d'utiliser dans le même programme une SD MAIL de même niveau (1 à 5).
De nombreux modules permettent de donner le même numéro de niveau pour une SDE et une SDS de même type. Dans ce cas, la SDE est écrasée et remplacée par la SDS.
L'utilisateur peut imprimer une SD ( IMtysd), formater une SD ( NOFOSD), ou libérer de l'espace-mémoire ( TUERSD).
|
SUBROUTINE IMtysd(
,
,
,
)
INTEGER M(*), NF, NI, IMPRE
Cet utilitaire imprime le contenu des tableaux d'une SD.
IMPRE est un taux d'impression compris entre 0 et 10 :
IMPRE = 0 n'imprime aucun tableau,
IMPRE = 1 imprime le tableau 2,
IMPRE = 2 imprime en plus le tableau 0,
IMPRE = 3 imprime en plus le tableau 1 et les ``petits'' tableaux,
IMPRE = 4 imprime en plus les tableaux associés,
IMPRE = 5 à 8 imprime en plus les 10 premières variables des ``gros'' tableaux,
IMPRE = 9 à 10 imprime entièrement tous les tableaux,
Le processeur IMAGXX détermine le type de la SD et appelle l'utilitaire d'impression adéquat ( IMNOPO, IMMUA, IMB, ...).
SUBROUTINE NOFOSD(
,
,
,
,
,
,
)
INTEGER M(*)
REAL XM(*)
DOUBLE PRECISION DM(*)
INTEGER NF1, NF2, NI, NOPT
En règle générale, les SD sont sauvegardées sur des fichiers
``non formatés''( Mot-clé Fortran UNFORMATTED,
c'est-à-dire binaire.)
plutôt que
``formatés''(
Mot-clé Fortran FORMATTED,
c'est-à-dire ASCII.).
Ce choix est plus performant, mais peut poser
des problèmes lorsque le même fichier est utilisé par des
ordinateurs différents (exemple : poste de travail pour le pré-
et post-traitement, et super-ordinateur pour les calculs).
La solution adoptée consiste à utiliser des fichiers intermédiaires formatés. Plus précisément, pour transférer des SD d'un ordinateur A vers un ordinateur B incompatible avec le premier, la marche à suivre est la suivante :
1. Formater les SD de l'ordinateur A.
2. Transférer les SD formatées de l'ordinateur A vers l'ordinateur B.
3. Déformater les SD sur l'ordinateur B.
Les opérations de formatage et de déformatage sont réalisées par le préprocesseur NOFOXX, qui appelle l'utilitaire NOFOSD :
SUBROUTINE TUERSD(
,
,
,
)
INTEGER M(*), NI, NOPT
CHARACTER*4 TYSD
Cet utilitaire libère la place-mémoire occupée par une SD.
Si , les tableaux associés sont gardés.
Si , les tableaux associés sont détruits.