Modulefpreviousupnextcontentsindex[BIG][Normal][small]
Suiv.: 5 Utilitaires divers Sup.: Structures de Données Préc.: 4.1 Utilisation Index Table des matières


4.2 Programmation

 

Le programmeur doit connaître la représentation interne des SD, ainsi que les utilitaires qui les manipulent.

Représentation interne des SD

   

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.

Identification des tableaux d'une SD

 

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.

Le tableau

   

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. gif). La description suivante donne, pour chaque entier, son identificateur Fortran traditionnel, sa taille et son contenu.

NEtysd (1 entier) :
nombre d'enregistrements déjà lus sur disque, en accès séquentiel ou direct (peu utilisé).
Boucle i de 1 à n
N (1x4 caractères) :
nom du tableau dynamique de rang (i-1).
IA (1 entier) :
adresse dans M de ce tableau.
L (1 entier) :
longueur (en mots) de ce tableau

Fin de la boucle

Le tableau 0

 

Ce tableau contient 32 entiers :

NTITRE (20x4 caractères) :
titre de la SD (le titre rappelle à l'utilisateur le problème traité lors de la création de la SD).
NDATE (2x4 caractères) :
date de création de la SD.
NOMCRE (6x4 caractères) :
nom du créateur de la SD.
NTYSD (1x4 caractères) :
type de la SD.
NI (1 entier) :
niveau de la SD lors de sa dernière écriture (inutilisé).
NETAT (1 entier) :
``numéro d'état'' de la SD (inutilisé).
NTASD (1 entier) :
nombre de tableaux associés à la SD.

Le tableau 1

 

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 :

Boucle i de 1 à NTASD
NTAB (1x4 caractères) :
nom du tableau associé.
IATAB (1 entier) :
adresse dans M de ce tableau.
LTAB (1 entier) :
nombre de mots de ce tableau.
NTYTAB (1 entier) :
type de ce tableau.
COMTAB (18x4 caractères) :
commentaire sur le contenu de ce tableau.

Fin de la boucle

Le tableau 2

 

Ce tableau contient des informations générales (exemples : nombre d'éléments, nombre de degrés de liberté, tailles des tableaux qui suivent, ...).

Les tableaux 3, 4, ...

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, ...).

Les tableaux associés

 

Le nombre et le contenu des tableaux associés est tout à fait dépendant du programmeur.

Utilitaires nécessaires au 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.

Les notations utilisées pour les utilitaires ci-dessous
sont les notations habituelles (cf. Annexe A).

Utilitaire COPISD

  

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.

Utilitaire COTASD

  

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.

Utilitaire INICSD

  

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 :

  1. Construit l'identificateur du tableau % et cherche un tableau dynamique portant ce nom.
  2. Si le tableau existe,
    il est copié dans le tableau NZ.
    Si le tableau n'existe pas,
    le tableau NZ est initialisé de la façon suivante : les identificateurs des noms de tableaux sont construits à partir du type de la SD et de son niveau (section 4.2.1) ; les autres valeurs sont mises à zéro (adresses et longueurs).

Utilitaire INTAB0

  

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.

Utilitaire SDREST

  

SUBROUTINE SDREST( , , , , , , , )

INTEGER M(*), NF, NI, NZ(LZ), LZ, NC, IC

CHARACTER*4 TYSD

Cet utilitaire restaure une SDE, c'est-à-dire :

  1. Si NF 0,
    alloue (utilitaire READRE, p. gif) et lit (instruction READ) les tableaux de la SD.
    Si NF = 0,
    vérifie que tous les tableaux de la SD sont déjà en mémoire centrale.

  2. Met à jour les tableaux % et NZ.

Dans certains cas, SDREST ne lit que les premiers tableaux de la SD (cf. section ``SD de catégorie 1 ou 2'' ci-dessous).

Utilitaire SDSAUV

  

SUBROUTINE SDSAUV( , , , , , , , , )

INTEGER M(*), NF, NI, NZ(LZ), LZ, NC, IC, NMO

CHARACTER*4 TYSD

Cet utilitaire sauvegarde une SDS, c'est-à-dire :

  1. Si ,
    écrit (instruction WRITE) les tableaux de la SD.

  2. Alloue (utilitaire READRE, p. gif) le tableau %, et copie le tableau NZ dans ce tableau dynamique. ([note] Cette opération est réalisée par l'utilitaire SAUCSD, qui peut éventuellement être appelé directement lorsque .)

Dans certains cas, SDSAUV n'écrit que les premiers tableaux de la SD (cf. section ``SD de catégorie 1 ou 2'' ci-dessous).

Exemple : manipulation d'une SDE et d'une SDS

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

Remarque

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.

SD de catégorie 1 ou 2

 

Il existe en fait deux catégories de SD :

Catégorie 1 :
lorsque la SD est en mémoire centrale, tous ses tableaux sont présents (SD de type BDCL, FORC, GEOM, MILI, NOPO, cf. partie iii).
Catégorie 2 :
lorsque la SD est en mémoire centrale, seuls quelques tableaux peuvent être présents (SD de type AMAT, ATRI, B, COOR, MUA, TAE, TYNO, VVPR, cf. partie iii).

Pour les SD de catégorie 2, le fonctionnement des utilitaires SDREST (p. gif) et SDSAUV (p. gif) est légèrement différent :

En entrée, SDREST
ne lit que les premiers tableaux de la SD. Ces premiers tableaux contiennent des informations qui permettent de lire (instruction READ) et de manipuler les tableaux suivants.
En sortie, SDSAUV
n'écrit que les premiers tableaux de la SD. Les tableaux suivants doivent être écrits directement par l'instruction WRITE. En outre, lorsque la SD est totalement écrite, le tableau % doit être mis à jour pour rendre la SD cohérente en mémoire centrale. Cette opération est réalisée par un nouvel appel à SDSAUV, avec en paramètre NF = 0.


Modulefpreviousupnextcontentsindex[BIG][Normal][small]
Suiv.: 5 Utilitaires divers Sup.: Structures de Données Préc.: 4.1 Utilisation Index Table des matières