Suiv.: 5 Utilitaires divers
Sup.: Structures de Données
Préc.: 4.1 Utilisation
Index
Table des matières
Le programmeur doit connaître la représentation interne des SD, ainsi que les utilitaires qui les manipulent.
Une SD est un ensemble de tableaux, présents en mémoire centrale ou non. La signification des informations contenues dans ces tableaux dépend du type de la SD (partie iii). Ainsi, une SD de type NOPO contient un maillage, une SD de type MUA contient une matrice ``profil'', etc...
Cette section décrit les noms de ces tableaux et leurs contenus respectifs.
Lorsqu'il est présent en mémoire centrale, un tableau faisant partie d'une SD est un tableau dynamique. Son nom est formé de quatre caractères :
Par exemple, lorsqu'une SD de type MAIL et de niveau 0 est lue en mémoire centrale, 22 tableaux dynamiques sont présents : MA00, MA01, ..., MA09, MA0A, MA0B, ..., MA0L.
Les noms, adresses et longueurs de tous ces tableaux sont contenus dans un tableau unique, dont le nom se termine par le caractère pour-cent (dans notre exemple, MA0%).
En outre, le programmeur a la possibilité de créer des tableaux associés à la SD. Ces derniers sont repérés par le tableau de rang 1 (voir ci-dessous) et sont gérés par les différents utilitaires en même temps que les autres tableaux. Ceci permet le transfert d'informations entre des modules spécifiques.
Quel que soit le type de la SD, la signification des tableaux %, 0 et 1 est toujours identique. Celle des autres tableaux présente quelques similitudes. La description de tous ces tableaux est donnée ci-dessous.
Ce tableau est utile lorsque la SD est en mémoire centrale.
Il contient 1 + 3 n entiers,
où n est le nombre de tableaux dynamiques qui forment la SD
(sans compter le tableau % et les tableaux associés).
Certains de ces entiers contiennent en
fait 4 caractères, codés à l'aide de l'utilitaire
ICHAR4 (p. ).
La description suivante donne,
pour chaque entier,
son identificateur Fortran traditionnel,
sa taille et son contenu.
Ce tableau contient 32 entiers :
Si NTASD = 0 (cf. ``Tableau 0''), ce tableau est absent. Sinon, il occupe 22x NTASD entiers et contient le descriptif des tableaux associés à la SD :
Ce tableau contient des informations générales (exemples : nombre d'éléments, nombre de degrés de liberté, tailles des tableaux qui suivent, ...).
Ces tableaux contiennent soit des ``pointeurs'' vers les tableaux suivants, soit des valeurs proprement dites (exemples : coordonnées des points d'un maillage, coefficients d'une matrice, ...).
Le nombre et le contenu des tableaux associés est tout à fait dépendant du programmeur.
Lors de la programmation d'un nouveau module, un certain nombre d'utilitaires sont nécessaires à la manipulation des SD.
D'une manière générale, un module lit des SDE, alloue des tableaux en vue de constituer des SDS, appelle un algorithme, et écrit des SDS (section 1.7.2). Les opérations de manipulation des SD sont réalisées à l'aide des utilitaires INICSD, SDREST et SDSAUV.
Lors de la création d'une nouvelle SD, les utilitaires COPISD, COTASD et INTAB0 peuvent aussi être appelés.
Tous ces utilitaires manipulent à la fois le tableau % de la SD considérée (section 4.2.1) et une copie de ce tableau. Le premier est un tableau dynamique dont le nom est contenu dans la variable NC et l'adresse dans la variable IC. Le second se trouve dans un tableau Fortran classique, déclaré par le programmeur, appelé traditionnellement NZ. Dans la suite, ces deux tableaux sont appelés respectivement le tableau % et le tableau NZ.
|
SUBROUTINE COPISD(
,
,
,
,
,
,
,
,
)
INTEGER M(*), NTAB, NI1, NC1, IC1, NI2, NC2, IC2
CHARACTER*4 TYSD
Cet utilitaire copie les NTAB premiers tableaux de la SD 1 vers la SD 2.
Soit n le nombre total de tableaux de la SD 1
(la partie iii de ce guide donne le nombre total de tableaux
d'une SD de type donné).
Si , la copie est totale.
Si
, la copie est partielle.
SUBROUTINE COTASD(
,
,
,
,
,
)
INTEGER M(*), NTAC, NBTASD, NTAB1, IATAB1, LTAB1
Cet utilitaire crée les tableaux associés à une SD. Il alloue NTAC tableaux associés, les lit en format libre, et crée le tableau 1 de la SD.
NBTASD est le nombre total de tableaux associés. NTAC est égal à NBTASD sauf cas exceptionnel où les tableaux sont associés par programme.
NTAB1, IATAB1, LTAB1 sont respectivement le nom, l'adresse et la longueur du tableau 1 de la SD.
SUBROUTINE INICSD(
,
,
,
,
,
,
)
INTEGER M(*), NI, NZ(LZ), LZ, NC, IC
CHARACTER*4 TYSD
Cet utilitaire initialise le tableau NZ d'une SDS, c'est-à-dire :
SUBROUTINE INTAB0(
,
,
,
)
CHARACTER*4 TYSD
INTEGER NI, NBTASD, NTAB0(32)
Cet utilitaire initialise les 32 éléments du tableau NTAB0, tableau 0 d'une nouvelle SD ayant NBTASD tableaux associés.
SUBROUTINE SDREST(
,
,
,
,
,
,
,
)
INTEGER M(*), NF, NI, NZ(LZ), LZ, NC, IC
CHARACTER*4 TYSD
Cet utilitaire restaure une SDE, c'est-à-dire :
Dans certains cas, SDREST ne lit que les premiers tableaux de la SD (cf. section ``SD de catégorie 1 ou 2'' ci-dessous).
SUBROUTINE SDSAUV(
,
,
,
,
,
,
,
,
)
INTEGER M(*), NF, NI, NZ(LZ), LZ, NC, IC, NMO
CHARACTER*4 TYSD
Cet utilitaire sauvegarde une SDS, c'est-à-dire :
Dans certains cas, SDSAUV n'écrit que les premiers tableaux de la SD (cf. section ``SD de catégorie 1 ou 2'' ci-dessous).
L'allure générale d'un module qui transforme une SDE AMAT en une SDS MUA est la suivante :
SUBROUTINE TAMMUA(M, NFAMAT, NIAMAT, NFMUA, NIMUA) C --- M : SUPER-TABLEAU C --- NFAMAT, NIAMAT : FICHIER ET NIVEAU DE LA SDE AMAT C --- NFMUA, NIMUA : FICHIER ET NIVEAU DE LA SDS MUA INTEGER M(*) INTEGER NZMUA(19),NZAMAT(22) CHARACTER KINFO*80, CHAR4*4 1000 FORMAT(1X,78('&')/' MODULE TAMMUA : ',20A4/1X,78('&')) C --- IMPRIMER LE TITRE IMPRIM = IINFO('I') IMPRE = IINFO('BAVARD') IF (IMPRE.NE.0) WRITE (IMPRIM,1000) KINFO('TITRE') C --- RESTAURER LA SDE AMAT CALL SDREST(M,'AMAT',NFAMAT,NIAMAT,NZAMAT,22,NCAMAT,ICAMAT) C --- OBTENIR LES ADRESSES UTILES IAMA0 = NZAMAT(3) IAMA1 = NZAMAT(6) IAMA2 = NZAMAT(9) ... C --- ALLOUER LES TABLEAUX DE LA SDS MUA CALL INICSD(M,'MUA ',NIMUA,NZMUA,19,NCMUA,ICMUA) NZMUA(4) = 32 CALL READRE(1,CHAR4(NZMUA(2)),NZMUA(3),NZMUA(4),M,NRET) ... C --- APPELER L'ALGORITHME CALL ALGO(M(IAMA2), M(NZMUA(3)), ...) C --- SAUVEGARDER DE LA SDS MUA CALL SDSAUV(M,'MUA ',NFMUA,NIMUA,NZMUA,19,NCMUA,ICMUA,I) END SUBROUTINE ALGO(AMA2, MUA0, ...) C --- ALGORITHME APPELE PAR LE MODULE TAMMUA INTEGER AMA2(10), MUA0(32), ... NTDL = AMA2(1) NTY = AMA2(2) NOE = AMA2(8) MUA0(32) = ... ... END
Une astuce répandue, mais déconseillée, consiste à ajouter des instructions COMMON et EQUIVALENCE. Exemple :
C ASTUCE DECONSEILLEE !!! INTEGER NZMUA(19) COMMON /ALMUA/ NEMUA, & NMUA0, IAMUA0, LMUA0, NMUA1, IAMUA1, LMUA1, & NMUA2, IAMUA2, LMUA2, NMUA3, IAMUA3, LMUA3, & NMUA4, IAMUA4, LMUA4, NMUA5, IAMUA5, LMUA5 EQUIVALENCE (NZMUA(1), NEMUA)
L'instruction EQUIVALENCE permet d'écrire NMUA0, IAMUA0, LMUA0, ... plutôt que NZMUA(2), NZMUA(3), NZMUA(4), ... Mais cette écriture ne montre pas clairement que le tableau NZMUA est modifié lui aussi.
L'instruction COMMON /ALMUA/ permet à tout sous-programme d'accéder au tableau NZMUA. Mais, lorsque plusieurs SD de même type sont en jeu, le tableau NZ peut être écrasé involontairement, et de plus il devient impossible de paralléliser le programme.
Il existe en fait deux catégories de SD :
Pour les SD de catégorie 2, le fonctionnement des utilitaires
SDREST (p. )
et SDSAUV (p.
)
est légèrement différent :