3. Accès aux segments de valeurs#

On accède au contenu d’un objet JEVEUX grâce à la routine jeveuo (ou wkvect).

Il y a deux types d’accès différents pour chacune de ces routines:

  • un accès par «pointeur»

  • un accès par «adresse dans une variable de référence»

Le premier accès (permis grâce à Fortran 2003) est désormais privilégié

3.1. Accès par pointeur#

Lorsque l’on veut accéder au contenu d’un objet JEVEUX, on déclare une variable locale de type «pointeur» sur un vecteur du bon type.

L’appel à jeveuo associe le pointeur à la zone mémoire occupée par l’objet (celui-ci est alors ramené en mémoire si nécessaire).

On peut alors manipuler l’objet comme un simple vecteur fortran.

Exemple: Accès en lecture aux coordonnées des nœuds du maillage:

! déclaration de la variable locale:

real(kind=8), pointer:: coordo(:) => null()

…

call jeveuo(ma//”.COORDO .VALE”, “L”, vr=coordo)

n1=size(coordo)! Accès à la longueur de l’objet (=3*nbno)

do ino=1,nbno

x=coordo(3*(ino-1)+1)

Y=coordo(3*(ino-1)+2)

…

enddo

Remarque importante:

Lors de la déclaration de la variable locale (ici: coordo), il est imposé d’initialiser le pointer à «zéro» (=> null()). Sinon, le pointeur est dans un état indéterminé.

3.2. Accès par adresse#

Les routines jeveuo et wkvect peuvent renvoyer à l’utilisateur une adresse relative dans l’un des tableaux \(\mathit{ZR}\) , \(\mathit{ZI}\) , \(\mathit{ZC}\) , ou \(\mathit{ZK}\) , (on notera par la suite \(Z?\) l’une de ces variables Fortran). Cette adresse est valide tant qu’il n’y a pas eu de libération.

La notion d’accès en écriture ou en lecture permet d’éviter le déchargement systématique sur disque du segment de valeurs et limite ainsi le nombre des entrées/sorties sur disque. Les objets accédés en lecture ne seront pas sauvegardés sur disque au moment de la libération. L’appel à WKVECT effectue une requête en écriture.

Un segment de valeurs a pu être accédé en écriture puis libéré, le gestionnaire le conserve alors en mémoire et diffère son déchargement sur disque lors d’une prochaine recherche de place. Un nouvel accès en lecture renvoie l’adresse du segment déchargeable, une modification du contenu peut donc avoir lieu à l’insu de l’utilisateur si ce dernier affecte le contenu du tableau \(Z?\) à l’adresse indiquée.

Règle d’usage :

L’utilisateur, lorsqu’il effectue un accès en lecture, ne doit pas modifier le contenu du tableau \(Z?\) à l’adresse fournie lors de la requête et doit éviter de le passer en argument d’un sous-programme dont il n’aurait pas l’entière maîtrise.

L’appel à la routine jeveuo renvoie, l’adresse de l’objet JEVEUX relative à une variable \(Z?\) du même type que l’objet JEVEUX (cette adresse est mesurée dans la longueur du type).

Le commun normalisé doit figurer dans toute unité de programme effectuant ce type d’appel.

Depuis la version NEW11.2.2 ce commun est inséré dans les sources par l’instruction:

#include «jeveux.h»

qui viendra automatiquement substituer les instructions suivantes à la compilation:

INTEGER ZI

COMMON/IVARJE/ZI(1)

INTEGER*4 ZI4

COMMON/I4VAJE/ZI4(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)

Remarque :

Ne pas modifier le nom des variables du commun de référence.

L’accès à un segment de valeurs est réalisé de la façon suivante : si \(\mathit{JTAB}\) désigne l’adresse renvoyée par la routine JEVEUO pour un objet de genre vecteur et de type \(I\) , \(\mathit{KTAB}\) celle pour un objet de type \(C\) (complexe) :

.

\(\mathit{ZI}(\mathit{JTAB})\)

est la première valeur d’un vecteur d’entiers,

\(\mathit{ZI}(\mathit{JTAB}+I-1)\)

est la \(I\) émevaleur d’un vecteur d’entiers,

\(\mathit{ZC}(\mathit{KTAB}+I-1)\)

est la \(I\) émevaleur d’un vecteur de complexes.

Les variables (JTAB) susceptibles de contenir une adresse JEVEUX et utilisées en argument des routines sous la forme ZI(JTAB), ZR(JTAB), etc, doivent toujours être initialisées à la valeur 1. Ainsi, si cette adresse n’est pas le résultat d’un appel à JEVEUO ou WKVECT, on pointera sur une valeur valide pour le premier élément au sens de l’accès à la mémoire. ZI(1), ZR(1) et ZC(1) sont initialisées avec une valeur pouvant provoquer une erreur ou une opération conduisant à NaN.