4. Sous-programmes fournis et utilisation#
4.1. Préliminaires#
Dans ce chapitre, on désigne par :
nom_os un nom d’objet simple
nom_co un nom de collection
nom_oc un nom d’objet de collection
num_oc un numéro d’objet de collection
Lors de la description des arguments des routines, on précise le type de chaque argument et s’il doit être fourni en entrée (in) ou récupéré en sortie (out). Les arguments modifiés sont signalés par (var).
4.2. Les fonctions d’accès pour les objets de collection#
L’accès aux objets JEVEUX et aux objets de collection s’effectue par nom. Dans le cas d’une collection nommée, il est nécessaire de passer, comme argument, un des deux groupes d’informations :
le nom de la collection et le nom de l’objet de collection,
le nom de collection et le numéro d’ordre de l’objet de collection dans le répertoire.
Pour limiter le nombre de routines utilisateur et uniformiser les arguments d’appel, on a introduit des fonctions de type Fortran CHARACTER *32. Celles-ci renvoient une chaîne de caractères composée du nom de collection et d’un suffixe interprétable par le progiciel. Elles affectent un commun qui assure le transfert vers la routine appelée du nom d’objet de collection, du numéro d’ordre dans le répertoire. Afin de bien synchroniser l’appel avec le nom de collection et l’affectation du commun, il est obligatoire d’appeler ces fonctions dans les arguments des routines concernées.
Remarque :
Ces fonctions ne doivent être utilisées que lors de l’appel d’une routine de requête sur un objet.
Fonctions de type CHARACTER*32 (à déclarer dans tout sous-programme d’appel) :
Les trois fonctions suivantes doivent être appelées uniquement comme argument des routines agissant sur des objets de collection
CHARACTER*32 FUNCTION JEXNOM (nom,nom_oc)
in |
nom |
K2 |
nom de répertoire ou de collection |
in |
nom_oc |
K* |
nom d’objet de collection. |
CHARACTER*32 FUNCTION JEXNUM (nom,num_oc)
in |
nom |
K24 |
nom de répertoire ou de collection |
in |
num_ocv |
I |
numéro d’objet de collection. |
Exemple d’utilisation :
CALL JEVEUO(JEXNUM(NOMCO,NUMO),’L’,vx=TABL)
Dans le cas d’une collection contiguë, une fonction de type Fortran CHARACTER*32 est utilisée pour accéder au vecteur des longueurs cumulées.
Ce vecteur d’entiers contient \(n+1\) valeurs pour une collection de \(n\) objets : la composante \({V}_{i}\) de ce vecteur fournit l’adresse relative de l’objet \(i\) dans le segment de valeurs de la collection ; la longueur de cet objet est obtenue par la différence \({V}_{i+1}–{V}_{i}\) .
CHARACTER*32 FUNCTION JEXATR (nom_co,arg)
in |
nom_co |
K24 |
nom de collection |
in |
arg |
K8 |
‘LONCUM’ “LONUTI”, “LONMAX” |
De la même façon, l’argument LONUTI, respectivement LONMAX, permet d’accéder au vecteur des longueurs utilisées, respectivement maximum, par une simple requête du type:
CALL JEVEUO(JEXATR(nom_co,”LONUTI”),”L”,vi=LUTI).
Notation : on désignera, à partir de maintenant, un nom d’objet JEVEUX, ou un appel à l’une de ces fonctions au sein des arguments d’une routine par nom_o.
4.3. La création des descripteurs#
Le descripteur d’un objet simple ou d’une collection est créé en général par plusieurs appels. Le premier appel permet de créer le descripteur en définissant le nom de l’objet JEVEUX, et en indiquant les valeurs des attributs obligatoires (non modifiables ultérieurement) :
la classe de rattachement,
le genre,
le type.
Dans le cas d’une collection, on doit définir en plus :
l’accès,
le stockage,
le mode de définition de la longueur,
le nombre maximum d’objets.
4.3.1. Création du descripteur d’objet simple#
SUBROUTINE JECREO (nom_os,lis_at)
in |
nom_os |
K24 |
nom d’objet simple. |
in |
lis_at |
K* |
texte définissant CLAS GENR TYPEet si besoin LTYP, lorsqu’elle est fournie, la longueur du type doit être collée au type. |
Par exemple : ‘G V K16’. Le premier caractère doit être non blanc, au moins un blanc sépare chaque valeur d’attribut ; les majuscules sont obligatoires.
4.3.2. Création du descripteur de collection#
SUBROUTINE JECREC (nom_co,lis_at,acces,stock,modlon,nmaxoc)
in |
nom_co |
K24 |
nom de collection |
in |
lis_at |
K* |
texte définissant CLAS GENR TYPEet si besoin LTYP, lorsqu’elle est fournie, la longueur du type doit être collée au type. |
in |
acces |
K* |
‘NO’ : collection nommée avec répertoire interne (noms de 8 caractères au maximum), objets de collection créés par nom et accessibles ensuite par nom ou par numéro. ‘NU’ : collection numérotée séquentiellement, les objets de collection sont accessibles uniquement par numéro. |
in |
stock |
K* |
mode de stockage de la collection : ‘CONTIG’ objets de collection contigus dans le segment de valeurs, ‘DISPERSE’ objets de collection indépendants les uns des autres. |
in |
modlon |
K* |
mode de définition de la longueur des objets de collection ‘CONSTANT’ : tous les objets de la collection sont de longueur identique ; ‘VARIABLE’ : chaque objet de la collection peut avoir une longueur différente. |
in |
nmaxoc |
I |
nombre maximum d’objets de la collection. |
Remarques :
Il n’est plus autorisé de créer des collections s’appuyant sur un répertoire de noms créé par ailleurs et pouvant être partagé.
Il n’est plus autorisé de créer des collections s’appuyant sur un vecteur de longueur créé par ailleurs et pouvant être partagé.
4.3.3. Affectation d’un attribut (après création du descripteur)#
Il est souvent nécessaire de compléter l’affectation des attributs du descripteur (définition de la longueur d’un vecteur, de la longueur totale d’une collection , …).
SUBROUTINE JEECRA (nom_o,nom_at,ival=ival,cval=cval)
in |
nom_o |
K24 |
nom d’objet JEVEUX |
in |
nom_at |
K* |
nom d’attribut (cf. annexe 2 : liste des attributs). |
in |
ival |
I |
valeur entière pour un attribut de type entier. |
in |
cval |
K* |
texte pour un attribut de type CHARACTER. |
Remarque :
Les deux arguments ival et cval sont facultatifs, cval doit être différent de la chaîne vide. Les deux arguments peuvent être fournis lors de l’appel à la routine avec ou sans l’identificateur respectif «ival=» et «cval=».
CALL JEECRA (nom_o, ‘DOCU’, cval=‘JPJP’)
CALL JEECRA (nom_o, ‘LONMAX’, ival=500)
4.4. Insertion d’un nom dans un répertoire ou création d’un objet de collection#
C’est la même routine qui est utilisée pour créer un nom d’objet de collection et pour insérer un nom dans un objet simple de genre répertoire.
SUBROUTINE JECROC ( JEXNOM(nom_o,nom) )
in |
nom_o |
K24 |
nom d’objet simple de genre répertoire, ou nom de collection nommée |
in |
nom |
K* |
nom d’objet à insérer dans le répertoire, ou nom d’objet de collection |
SUBROUTINE JECROC ( JEXNUM(nom_co,num_oc) )
in |
nom_co |
K24 |
nom de collection |
in |
num_oc |
I |
numéro d’objet de collection |
Remarque :
Pour une collection numérotée, cet appel actualise l’attribut NUTIOC .
4.5. La requête d’allocation#
C’est par l’intermédiaire de la routine JEVEUO que l’utilisateur récupère un pointeur sur le segment de valeurs. Alternativement, la routine JEVEUO permet également de récupérer une adresse relative par rapport à une variable Z * mesurée dans la longueur du type de l’objet JEVEUX.
Cela lui permet ensuite d’utiliser le segment de valeurs associé. Lors de cet appel si le segment de valeurs n’est pas présent en mémoire, le progiciel effectue une allocation dynamique. Si l’objet JEVEUX n’a pas d’image sur disque, le segment de valeurs est initialisé suivant le type de l’objet (zéro ou blanc). Dans le cas contraire on récupère sur disque les valeurs précédentes. On appelle usage la condition d’accès (‘E’ ou ‘L’) au segment de valeurs. Le segment de valeurs reste alloué avec l’usage affecté tant que l’utilisateur n’a pas effectué de nouvelle requête et tant que l’appel à JEDEMA au bon niveau n’a pas été effectué. Une requête en écriture sur un objet alloué en lecture en modifiera l’usage. Une requête en lecture sur un objet alloué en écriture n’affectera pas l’usage.
SUBROUTINE JEVEUO (nom_o,cel,jtab,vi,vr,…,vk80)
in |
nom_o |
K24 |
accès au segment de valeurs défini par : nom_os: objet simple, nom_co: collection contiguë, JEXNOM (nom_co, nom_oc) : objet de collection nommée, JEXNUM (nom_co, num_oc): objet de collection numérotée, JEXATR (nom_co, ‘LONCUM’)vecteur des longueurs cumulées de collection contiguë. |
in |
cel |
K*1 |
condition d’accès ou usage du segment de valeurs, ‘E’en lecture/écriture (permet de modifier le segment de valeurs), ‘L’en lecture (pas de modification du segment de valeurs). |
out |
jtab |
I |
adresse de la première valeur de l’objet dans le tableau Fortran associé à la variable Z* correspondant au type de l’objet |
out |
vi |
I |
Tableau d’entiers |
out |
vr |
R |
Tableau de réels |
… |
|||
out |
vk80 |
K80 |
Tableau de character*80 |
Les arguments de sortie sont tous des arguments facultatifs et ils s’excluent mutuellement.
On préconise d’utiliser préférentiellement les arguments: vl, vi, vi4, vr, vc, vk8, vk16, vk32 et vk80. Chaque argument est adapté au type de l’objet: LOGICAL, INTEGER, …
L’argument jtab rend une «adresse» dans un tableau mis en COMMON : ZI, ZR, …. Son usage rend la programmation en général moins lisible.
Remarque :
La requête JEVEUO est interdite sur les objets de genre répertoire.
4.5.1. Utilisation des arguments vi, vr, …, vk80#
Exemple:
character(len=24):: obj_coor
real(kind=8), pointer:: coordo(:) => null()
call jeveuo(obj_coor, “L”, vr=coordo)
! kième valeur du vecteur coordo:
x=coordo(k)
4.5.2. Utilisation de l’argument jtab#
Exemple:
character(len=24):: obj_coor
integer:: jcoor
call jeveuo(obj_coor, “L”, jcoor)
! kième valeur du vecteur coordo:
x=zr(jcoor-1+k)
COMMON de référence
La requête d’allocation JEVEUO avec l’argument de sortie jtab retourne l’“adresse” de l’objet dans un tableau mis en COMMON : ZI, ZR, ….
La correspondance entre le type fortran de l’objet et le COMMON de référence qui lui correspond est donnée par le tableau suivant :
type fortran |
COMMON |
nom de la variable |
I |
IVARJE |
ZI |
S |
I4VAJE |
ZI4 |
R |
RVARJE |
ZR |
C |
CVARJE |
ZC |
L |
LVARJE |
ZL |
K8 |
KVARJE |
ZK8 |
K16 |
KVARJE |
ZK16 |
K24 |
KVARJE |
ZK24 |
K32 |
KVARJE |
ZK32 |
K80 |
KVARJE |
ZK80 |
Le bloc de déclarations ci-dessous doit donc être inséré dans toute routine voulant lire ou écrire dans un objet jeveux :
C --------- DEBUT DECLARATIONS NORMALISEES JEVEUX --------------------
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)
C --------- FIN DECLARATIONS NORMALISEES JEVEUX --------------------
4.6. La requête d’allocation permanente au cours d’une commande#
JEVEUT permet d’allouer des objets JEVEUX en leur affectant une marque différente de la marque courante valant -1. Les objets ne seront pas affectés par les appels à JEDEMA mais devront être libérés explicitement par un appel à JELIBZ.
La syntaxe d’appel est identique à celle de JEVEUO.
4.7. La requête d’allocation permanente au cours de l’exécution#
Cette requête est exclusivement réservée au Superviseur. JEVEUS permet d’allouer des objets JEVEUX en leur affectant une marque différente de la marque courante valant -3. Ils ne seront libérés qu’en fin d’exécution.
La syntaxe d’appel est identique à celle de JEVEUO.
4.8. Surcouche de création et allocation d’un objet de genre vecteur#
WKVECT est une surcouche JEVEUX permettant d’allouer un vecteur (création et présence en mémoire), elle permet « l’économie » de l’appel à trois sous-programmes JEVEUX.
SUBROUTINE WKVECT (nom_os,lis_at,long,jtab,vi,vr,…,vk80)
in |
nom_os |
K24 |
nom d’objet simple |
in |
lis_at |
K* |
texte définissant CLAS GENR TYPE LTYP, GENRvaut ici obligatoirement V. |
in |
long |
I |
valeur entière associée à l’attribut LONMAX, longueur du vecteur. |
out |
jtab |
I |
adresse de la première valeur de l’objet dans le tableau Fortran associé à la variable Z* correspondant au type du vecteur. |
out |
vi |
I |
Tableau d’entiers |
out |
vr |
R |
Tableau de réels |
… |
|||
out |
vk80 |
K80 |
Tableau de character*80 |
L’allocation de l’objet est effectuée par défaut en tant que premier écrivain (cel=’E’).
Remarques :
Les argumentsde sortie : jtab, vi, vr, …, vk80 s’excluent mutuellement.
Aucun objet de nom nom_os ne doit exister dans les bases (sous peine d’arrêt du programme).
Exemple d’utilisation :
Allocation sur la base VOLATILE (V) d’un vecteur de travail (V) de REAL*8 (R) de longueur 100 ; le nom du tableau est &&OP000.TAMPON.
real(kind=8), pointer:: VTRAV => null()
CALL WKVECT (‘&&OP000.TAMPON’, ‘V V R’, 100, vr=VTRAV)
Lorsqu'il n'est pas nécessaire de disposer d'un accès nommé, pour allouer un vecteur de travail utilisé au sein d'une routine, il est possible de faire appel aux macros as_allocate et as_deallocate.
4.9. Alternative à l’allocation d’objets de travail#
Bien qu’il soit possible d’allouer des objets de travail à l’aide de JEVEUX au sein d’une routine, cet usage n’est pas toujours pertinent. Si les zones allouées ne sont utilisée que temporairement, ou bien de taille ne nécessitant pas de déchargement sur disque, il est plus avantageux de faire appel aux fonction as_allocateet as_deallocate. Ces dernières enrobent les fonctions standard et permettent d’appeler les mécanismes de déchargement des objets JEVEUX afin de libérer de la mémoire. Elles communiquent à tout instant le volume de mémoire allouée ou libérée, toutes les allocations dynamiques dans le Fortran doivent impérativement passer par ce mécanisme. Ces utilitaires (macro commande) permettent d’allouer et de désallouer un vecteur des différents types gérés par JEVEUX. Ces deux macros utilisent des arguments optionnels.
AS_ALLOCATE (size=size, vl=vl, vi=vi, vi4=vi4, vr=vr, vc=vc, vk8=vk8, vk16=v16, vk24=vk24, vk32=vk32, vk80=vk80)
in |
size |
I |
longueur du vecteur à allouer |
in/out |
vx |
L,I,I4,C,Kx |
vecteur dans le type souhaité |
Cette macro permet d’allouer un vecteur, qui doit être déclaré sous le modèle ci-dessous. Les différents arguments sont tous optionnels, il est bien sûr nécessaire de fournir la longueur du vecteur.
integer, pointer:: tab_para(:) => null()
AS_ALLOCATE(vi=tab_para, size=1958)
AS_DEALLOCATE (vl=vl, vi=vi, vi4=vi4, vr=vr, vc=vc, vk8=vk8, vk16=v16, vk24=vk24, vk32=vk32, vk80=vk80)
in |
vx |
L,I,I4,C,Kx |
vecteur dans le type souhaité |
Cette macro permet de libérer le vecteur dont le nom est passé en argument et de restituer la mémoire en informant le gestionnaire JEVEUX.
4.10. Surcouche d’agrandissement d’un objet de genre vecteur#
SUBROUTINE JUVECA (nom_os,long)
in |
nom_os |
K24 |
nom d’objet simple |
in |
long |
I |
nouvelle valeur associée à l’attribut LONMAX, longueur du vecteur. |
Cette routine permet de modifier la taille d’un objet simple de genre vecteur. Le nouveau vecteur est affecté à la même classe que l’ancien.
Remarques :
L’objet doit être en mémoire (appel à JEVEUO préalable),
L’attribut LONUTI est affecté à la même valeur que LONMAX ,
Les valeurs sont recopiées,
4.11. Les recopies d’objets JEVEUX#
4.11.1. Recopie d’un objet JEVEUX (objet simple, collection ou objet de collection) :#
SUBROUTINE JEDUPO (nom_in,nom_clo,nom_ou,dup_co)
in |
nom_in |
K24 |
nom de l’objet JEVEUXà recopier |
in |
nom_clo |
K1 |
nom de la classe de l’objet réceptacle (≠ ‘ ‘) |
in |
nom_ou |
K24 |
|
in |
dup_co |
L |
utilisé uniquement pour les collections si les classes sont différentes, si =.TRUE.: on recopie les pointeurs externes à une collection, si =.FALSE.: on conserve les pointeurs externes |
Remarque :
L’objet réceptacle est détruit s’il existe auparavant.
4.11.2. Recopie d’un ensemble d’objets JEVEUX:#
Au lieu de travailler sur un seul objet, il est possible de fournir à certaines routines une chaîne de caractères servant à sélectionner les objets JEVEUX dont le nom contient cette chaîne.
SUBROUTINE JEDUPC (nom_cli,souchi,ipos,nom_clo,soucho,dup_co)
in |
nom_cli |
K1 |
nom de la classe des objets à recopier |
in |
souchi |
K* |
chaîne de caractères à identifier dans les noms d’objets |
in |
ipos |
I |
position dans les noms de la chaîne à identifier |
in |
nom_clo |
K1 |
nom de la classe des objets réceptacles |
in |
soucho |
K* |
chaîne à substituer dans noms origines pour obtenir le nom de l’objet JEVEUXréceptacle |
in |
dup_co |
L |
utilisé uniquement pour les collections si les classes sont différentes, si =.TRUE.: on recopie les pointeurs externes à une collection, si =.FALSE.: on conserve les pointeurs externes |
4.12. Les requêtes de libération#
Ces requêtes conduisent à une écriture sur disque (différée ou non) suivant la condition d’accès choisie lors de la requête d’allocation et les règles de libération [§2.3] :
On appelle libération l’arrêt de la requête en cours sur un objet JEVEUX :
fin d’une écriture, avec écriture différée sur disque,
fin de lecture, qui n’implique aucune écriture sur disque.
Les libérations sont effectuées lors de l’appel à JEDEMA. Les appels à la routine JELIBE sont en règle générale prohibés.
Remarque :
L’accès en lecture permet d’éviter les écritures sur disque en fin d’usage (gain de temps).
Gestion des accès :
Les autorisations d’accès affectées lors du premier appel à JEVEUO en lecture ou en écriture sont gérées à l’aide de la routine suivante :
SUBROUTINE JEMARQ ()
JEMARQ incrémente la valeur de la marque courante. Son appel est obligatoire dans toute unité de programme chargeant en mémoire des objets JEVEUX.
Libération implicite de tous les objets chargés dans une unité de programmation
SUBROUTINE JEDEMA ()
JEDEMA libère tous les objets affectés de la marque courante et décrémente la valeur de la marque courante. Son appel est obligatoire dans toute unité de programme chargeant en mémoire des objets JEVEUX.
Libération d’un objet JEVEUX ou d’un objet de collection dispersée :
SUBROUTINE JELIBE (nom_o)
in |
nom_o |
K24 |
nom d’objet JEVEUX(objet simple, collection ou objet de collection dispersée) |
Son appel est tolérée dans certaines conditions.
Libération de l’ensemble d’objets JEVEUX :
SUBROUTINE JELIBZ ()
L’appel à cette routine provoque la libération de l’ensemble des objets JEVEUX qui ont été chargés en mémoire par un appel à JEVEUT (ils sont affectés d’une marque valant -1).
4.13. Les requêtes d’existence#
Les requêtes d’existence permettent de vérifier l’existence du descripteur d’un objet JEVEUX ou d’un objet de collection, mais aussi la présence d’un nom dans un répertoire. Elles permettent aussi de récupérer le numéro d’ordre d’un nom dans un répertoire de noms.
Existence d’un objet JEVEUX ou d’un objet de collection :
SUBROUTINE JEEXIN (nom_o,iret)
in |
nom_o |
K24 |
nom d’objet JEVEUX |
out |
iret |
I |
code retour de la routine \(\mathit{iret}=0\) le descripteur de l’objet n’existe pas, \(\mathit{iret}\mathrm{\ne }0\) le descripteur existe |
4.14. Le passage du numéro d’ordre au nom et vice versa#
Obtention du numéro d’ordre à partir du nom :
SUBROUTINE JENONU (JEXNOM(nom_o,nom),num)
in |
nom_o |
K24 |
nom de collection ou d’objet simple de genre répertoire |
in |
nom |
K* |
nom d’objet de collection ou nom |
out |
num |
I |
num= numéro de l’objet correspondant au nom nom |
Remarques :
Si le nom cherché ne figure pas dans le répertoire, le numéro renvoyé est 0.
Cet appel est inutile dans le cas d’une collection numérotée.
Obtention du nom à partir du numéro d’ordre :
SUBROUTINE JENUNO (JEXNUM(nom_o,num),nom)
in |
nom_o |
K24 |
nom de collection ou d’objet simple de genre répertoire |
in |
num |
I |
numéro d’ordre d’insertion |
out |
nom |
K |
nom = nom de l’objet correspondant au numéro num |
Remarques :
Si le numéro cherché ne figure pas dans le répertoire, le nom renvoyé est blanc.
Cet appel est impossible dans le cas d’une collection numérotée.
Si le numéro cherché est supérieur au nombre d’objets numérotés stocké, la routine s’arrête en erreur.
4.15. La destruction des descripteurs#
Il est possible de détruire le descripteur d’un objet JEVEUX et par extension le nom et les attributs d’un objet de collection. Cette destruction s’accompagne de la destruction du ou des segments de valeurs associés présents en mémoire et rend inaccessibles ceux présents sur disque.
SUBROUTINE JEDETR (nom_o)
in |
nom_o |
K24 |
nom d’objet JEVEUX(objet simple, collection ou objet de collection nommée) |
La place libérée dans le catalogue ou le répertoire de noms devient immédiatement réutilisable pour un autre descripteur. La place, éventuellement utilisée sur disque, ne sera récupérable que par une opération de « retassage » du fichier.
Remarques :
Il n’est pas possible de détruire un objet de collection numérotée,
pour une collection nommée, la destruction d’un objet actualise l’attribut NUTIOC .
Dans le cas d’un objet simple de type répertoire de noms, il n’est pas possible de détruire un
point d’entrée dans le répertoire, l’appel à cette fonction détruit complètement l’objet JEVEUX .
On peut aussi utiliser la routine suivante pour détruire un ensemble de descripteurs.
SUBROUTINE JEDETC (nom_cl,souch,ipos)
in |
nom_cl |
K1 |
nom de la classe ou ‘ ‘ pour traiter toutes les classes ouvertes. |
in |
souch |
K* |
chaîne de caractères à identifier dans l’ensemble des noms contenus dans le répertoire d’une ou plusieurs classes. |
in |
ipos |
I |
position dans le nom de la chaîne à identifier. |
On recherche tous les descripteurs dont le nom contient la sous chaîne souch à la position ipos dans les classes définies par le paramètre nom_cl et on détruit les descripteurs ainsi repérés.
Il est préférable d’utiliser la routine JEDETR lorsque l’on connaît explicitement le nom des objets à détruire, l’appel dans une boucle ou dans une routine de bas niveau peut se révéler très coûteux.
4.16. La récupération de la taille des zones de mémoire disponible#
SUBROUTINE JEDISP (nbp,lplace)
in |
nbp |
I |
nombre de positions cherchées. |
in |
lplace |
V_I |
taille en unité d’adressage des différentes zones disponibles. |
JEDISP renvoie, par ordre décroissant dans le vecteur d’entiers \(\mathit{lplace}\) , la taille des \(\mathit{nbp}\) plus grands segments de valeurs disponibles pour une allocation (JEVEUO), à l’instant de l’appel. Les valeurs obtenues restent valides sous la condition du seul usage des requêtes d’allocation concernant des segments de valeurs de longueurs inférieures ou égales.
Ainsi \(\mathit{lplace}(1)\) renvoie la taille du plus gros objet que l’on pourrait allouer, \(\mathit{lplace}(2)\) celle du plus gros objet que l’on pourrait allouer après avoir utilisé la zone correspondante à \(\mathit{lplace}(1)\) .
Remarque :
L’allocation d’une collection peut entraîner le chargement en mémoire des objets attributs et rendre ainsi caduques les valeurs obtenues par JEDISP .
4.17. Les consultations#
Lecture d’un attribut d’un objet JEVEUXou d’un objet de collection
SUBROUTINE JELIRA (nom_o,nom_at,ival=ival,cval=cval)
in |
nom_o |
K24 |
nom d’objet JEVEUX |
in |
nom_at |
K* |
nom d’attribut (cf. annexe 2 : liste des attributs accessibles) |
out |
ival |
I |
valeur entière pour un attribut de type entier. |
out |
cval |
K* |
texte pour un attribut de type caractère. |
Remarques :
Outre les attributs décrits au [§2], il est possible de récupérer avec la valeur XOUS le type d’objet JEVEUX associé au descripteur, « S » objet simple, « X » collection.
Les deux arguments ival et cval sont facultatifs. Les deux arguments peuvent être fournis lors de l’appel à la routine avec ou sans l’identificateur respectif «ival=» et «cval=».
Lecture de la valeur de la marque courante
SUBROUTINE JEVEMA (marque)
out |
marque |
I |
valeur de la marque courante |
Recherche de la liste des noms de descripteurs présents dans une classe
SUBROUTINE JELSTC (nom_cl,souch,ipos,nbmax,l_nom,nbval)
in |
nom_cl |
K1 |
nom de la classe ou ‘ ‘ pour traiter toutes les classes ouvertes. |
in |
souch |
K* |
chaîne de caractères à identifier dans l’ensemble des noms contenus dans le répertoire d’une classe. |
in |
ipos |
I |
position dans le nom de la chaîne à identifier. |
in |
nbmax |
I |
dimension du vecteur de K24fourni ci-dessous |
var |
l_nom |
V_K24 |
vecteur contenant la liste des identificateurs répondant au critère de recherche |
out |
nbval |
I |
nombre maximum d’identificateurs répondant au critère de recherche \(\mathit{nbval}=-\mathit{nbval}\) si \(\mathit{nbval}>\mathit{nbmax}\) |
4.18. Les impressions#
Plusieurs routines permettent d’imprimer le contenu d’un objet JEVEUX ou d’un objet de collection, d’imprimer les attributs, d’imprimer l’état de la mémoire gérée par JEVEUX (objets présents, position, taille, etc.), d’imprimer le catalogue d’une classe, ou de consulter l’état d’une base de données.
SUBROUTINE JEIMPO (unit,nom_o,param,cmess)
Impression du contenu d’un objet JEVEUX ou d’un objet de collection
in |
unit |
I |
Numéro d’unité logique associée au fichier d’impression, au sein de Code_Aster on utilisera 6 (‘MESSAGE’) ou 8 (‘RESULTAT’) |
in |
nom_o |
K24 |
nom d’objet JEVEUX |
in |
param |
K* |
non utilisé actuellement (blanc ‘ ‘ obligatoire) |
in |
cmess |
K* |
texte apparaissant en commentaire à l’impression |
SUBROUTINE JEIMPA (unit,nom_o,cmess)
Impression de tous les attributs d’un objet JEVEUX ou d’un objet de collection
in |
unit |
I |
Numéro d’unité logique associée au fichier d’impression, au sein de Code_Aster on utilisera 6 (‘MESSAGE’) ou 8 (‘RESULTAT’) |
in |
nom_o |
K24 |
nom d’objet JEVEUX |
in |
cmess |
K* |
texte apparaissant en commentaire à l’impression |
SUBROUTINE JEIMPR (unit,nom_cl,cmess)
Impression du catalogue
in |
unit |
I |
Numéro d’unité logique associée au fichier d’impression, au sein de Code_Aster on utilisera 6 (‘MESSAGE’) ou 8 (‘RESULTAT’) |
in |
nom_cl |
K1 |
nom de classe ou ‘ ‘ pour traiter toutes les classes ouvertes |
in |
cmess |
K* |
texte apparaissant en commentaire à l’impression |
SUBROUTINE JEIMPM (unit)
Impression de l’état de la zone mémoire gérée par JEVEUX
in |
unit |
I |
Numéro d’unité logique associée au fichier d’impression, au sein de Code_Aster on utilisera 6 (‘MESSAGE’) ou 8 (‘RESULTAT’) |
La routine JEIMPM permet d’éditer le contenu de zone mémoire gérée au moment de l’appel. Voici dans l’ordre la signification des valeurs apparaissant à l’impression :
nom en abrégé de la classe associé à l’objet,
Gbase GLOBALE,
Vbase VOLATILE,
identificateur de collection, si ce dernier vaut 0, c’est un objet simple,
identificateur d’objet simple ou bien numéro d’objet de collection,
niveau d’appel dans la pile JEMARQ/JEDEMA
adresse mémoire du segment de valeur,
usage du segment de valeur, vaut Uou X,
longueur en unité d’adressage (entier 8 octets en 64 bits) du segment de valeurs,
statut du segment de valeur, vaut D ou A,
nom de l’objet, suivi éventuellement du numéro d’objet de collection.
Les combinaisons possibles du statut et de l’usage d’un segment de valeurs, ainsi que leur signification sont les suivantes :
U D: segment de valeurs utilisé, en accès en écriture et éventuellement en lecture. Il devra être déchargé sur disque.
U A: segment de valeurs utilisé, en accès en lecture. Il ne sera pas déchargé sur disque.
X D: segment de valeurs inutilisé, déchargeable : il devra être déchargé sur disque. Une requête en écriture ou en lecture sur l’objet associé renvoie directement sa position sans mouvement mémoire et sans accès disque. Sa position peut être récupérée à tout moment pour placer un nouveau segment de valeurs au prix d’un accès disque (origine : U D).
X A: segment de valeurs inutilisé, amovible. Une requête en écriture ou en lecture sur l’objet associé renvoie directement sa position sans mouvement mémoire et sans accès disque. Sa position peut être récupérée à tout moment pour placer un nouveau segment de valeurs sans accès disque (origine : U A).
Exemple d’impression obtenue :
CL- --NUM-- -MA- ---------IADY--------- -U- - LON UA - -S- ------------- NOM --------------
|G| 0| 1| -2| 118073808|U| 11| D| ________GLOBALE ________$$CARA
|G| 0| 2| -2| 120752752|U| 4000| D| ________GLOBALE ________$$IADD
|G| 0| 3| -2| 118553440|U| 251| D| ________GLOBALE ________$$GENR
|G| 0| 4| -2| 118533472|U| 251| D| ________GLOBALE ________$$TYPE
|G| 0| 5| -2| 118559216|U| 1001| D| ________GLOBALE ________$$DOCU
|G| 0| 6| -2| 120784832|U| 2000| D| ________GLOBALE ________$$ORIG
|G| 0| 7| -2| 120800912|U| 8004| D| ________GLOBALE ________$$RNOM
|G| 0| 8| -2| 120865024|U| 2000| D| ________GLOBALE ________$$LTYP
|G| 0| 9| -2| 120881104|U| 2000| D| ________GLOBALE ________$$LONG
|G| 0| 10| -2| 120897184|U| 2000| D| ________GLOBALE ________$$LONO
|G| 0| 11| -2| 120913264|U| 2000| D| ________GLOBALE ________$$DATE
|G| 0| 12| -2| 120929344|U| 2000| D| ________GLOBALE ________$$LUTI
|G| 0| 13| -2| 120945424|U| 3203| D| ________GLOBALE ________$$HCOD
|G| 0| 14| -2| 46912496128016|U| 188742| D| ________GLOBALE ________$$USADI
|G| 0| 15| -2| 118578720|U| 62914| D| ________GLOBALE ________$$ACCE
|G| 0| 16| -2| 118002208|U| 4000| D| ________GLOBALE ________$$MARQ
|G| 0| 17| -2| 118034288|U| 2000| D| ________GLOBALE ________$$INDI
|G| 0| 18| -2| 119082112|U| 102400| D| ________GLOBALE ________$$TLEC
|G| 0| 19| -2| 119901392|U| 102400| D| ________GLOBALE ________$$TECR
|G| 0| 20| -2| 120720672|U| 4000| D| ________GLOBALE ________$$IADM
|G| 0| 21| 0| 93362960|X| 21| D| &FOZERO .PROL
|G| 0| 22| 0| 98181600|X| 2| D| &FOZERO .VALE
|G| 0| 23| 0| 108074656|X| 1| D| &&_NUM_CONCEPT_UNIQUE
|G| 0| 24| 0| 123411680|X| 5010| D| &&SYS.KRESU
|G| 0| 25| 0| 88929024|X| 11| D| &CATA.ACOUSTIQUE
…
SUBROUTINE JEIMPD (unit,nom_cl,cmess)
Impression de la liste des objets JEVEUX présents dans une base de données :
in |
unit |
I |
Numéro d’unité logique associée au fichier d’impression, au sein de Code_Aster on utilisera 6 (‘MESSAGE’) ou 8 (‘RESULTAT’) |
in |
nom_cl |
K1 |
nom de classe ou ‘ ‘ pour traiter toutes les classes ouvertes |
in |
cmess |
K* |
texte apparaissant en commentaire à l’impression |
SUBROUTINE JEPRAT (unit, nom, nom_at, param, cmess)
Cette routine édite le catalogue des objets JEVEUX présents sur disque.
in |
unit |
I |
Numéro d’unité logique associée au fichier d’impression, au sein de Code_Aster on utilisera 6 (‘MESSAGE’) ou 8 (‘RESULTAT’) |
in |
nom |
K24 |
nom d’objet JEVEUX ou nom de classe précédée du caractère $ |
in |
nom_at |
K8 |
nom de l’attribut ou suffixe de l’objet système à imprimer. nom_at prend ses valeurs parmi la liste suivante : pour une collection $$DESO, $$IADD, $$IADM, $$PEPL, $$NOM, $$REEL, $$LONG, $$LONO, $$LUTI, $$NUM. pour toute une classe $$CARA, $$IADD, $$GENR, $$TYPE, $$DOCU, $$ORIG, $$RNOM, $$LTYP, $$LONG, $$LONO, $$DATE, $$LUTI, $$HCOD, $$USADI, $$ACCE, $$MARQ, $$TLEC, $$TECR, $$IADM |
in |
param |
K* |
non utilisé actuellement (blanc ‘ ‘ obligatoire) |
in |
cmess |
K* |
texte apparaissant en commentaire à l’impression |
Remarque :
Cette routine est un utilitaire réservé à l’assistance.
4.19. Les utilitaires#
Les utilitaires suivants ont été écrits pour copier ou pour réinitialiser des parties d’objets simples ou des objets de collection.
Remise à zéro ou à blanc suivant le type de l’objet JEVEUX.
SUBROUTINE JERAZO (nom_o, n , i1)
in |
nom_o |
K24 |
nom d’objet JEVEUX |
in |
n |
I |
nombre de valeurs à réinitialiser |
in |
I1 |
I |
indice dans le vecteur de la première valeur à réinitialiser |
4.20. Un utilitaire de déverminage#
Un mauvais usage de l’adresse renvoyée par la routine JEVEUO peut conduire à un écrasement mémoire, et notamment à la destruction du chaînage des segments de valeurs. Le programmeur peut dans ce cas essayer de localiser la routine provocant l’écrasement en instrumentant son code source avec des appels à JXVERI. Cette routine contrôle les entiers présents de part et d’autre de chaque segment de valeurs : lors d’un débordement ces valeurs sont en général écrasées. L’écrasement amont correspond à l’entier situé juste devant la première valeur du segment de valeurs. L’écrasement aval correspond à l’entier situé juste derrière la dernière valeur du segment de valeurs.
SUBROUTINE JXVERI (cfic,cmess)
in |
cfic |
K* |
texte définissant le nom local du fichier d’impression, au sein de Code_Aster on utilisera ‘MESSAGE’ ou ‘RESULTAT’ |
in |
cmess |
K* |
texte apparaissant en commentaire à l’impression |
Cette routine émet un message indiquant l’intégrité ou non du chaînage lors qu’il existe, ou lors de l’écrasement des identificateurs situés de part et d’autre des valeurs.
4.21. Les routines d’initialisation utilisées par le superviseur#
L’utilisation d’objets JEVEUX n’est possible qu’après l’initialisation qui nécessite de définir :
le nombre maximum de bases de données, que l’on pourra gérer simultanément,
la taille de la zone mémoire gérée par JEVEUX, qui sera allouée dynamiquement.
Cette initialisation est obligatoirement réalisée par le superviseur au sein des commandes DEBUT ou POURSUITE à l’aide de la routine JEDEBU, qui crée, automatiquement, tous les objets système nécessaires :
SUBROUTINE JEDEBU (nbases,lzone,cmess,cvig,idebug)
in |
nbases |
I |
nombres maximum de bases de données simultanées (≤5) |
in |
lzone |
I |
taille de la mémoire allouée en unité d’adressage |
in |
cmess |
K* |
nom local du fichier d’impression des messages d’erreur |
in |
cvig |
K* |
non utilisé |
in |
idebug |
I |
utilisé pour un fonctionnement en mode debug \(\mathit{idebug}=0\) mode de fonctionnement normal \(\mathit{idebug}=1\) debugJEVEUXenclenché |
Lorsque l’application JEVEUX est initialisée, il importe d’ouvrir les classes d’objets sur lesquelles on souhaite travailler. Pour ouvrir une classe, il est nécessaire de préciser ses caractéristiques : présence ou non d’un fichier associé, nom de la classe, nom de la base de données associée, caractéristiques du fichier, etc … En mode DEBUG le fonctionnement du gestionnaire de mémoire est modifié, les déchargements sur disque ne sont plus différés et la place mémoire occupée par un segment de valeurs est positionné à une valeur indéfinie. Ce mode de fonctionnement est utilisé pour déverminer du code : l’usage d’une adresse correspondant à un segment de valeurs libéré provoque un arrêt brutal.
SUBROUTINE JEINIF (stin,stout,nom_bas,nom_cl,nmax,nbloc,lbloc)
in |
stin |
K* |
texte définissant le statut en début de travail : ’DUMMY’ pas de fichier associé ’DEBUT’ initialisation ou remise à zéro d’une classe existante ’POURSUIT’ récupération du contenu d’une classe existante |
in |
stout |
K* |
texte définissant le statut en fin de travail : ’SAUVE’ sauvegarde sur fichier en fin d’application ’DETRUIT’ destruction de la classe en fin d’application |
in |
nom_bas |
K* |
nom local de la base de données (exemple : ‘GLOBALE’, ‘VOLATILE’) |
in |
nom_cl |
K1 |
nom de la classe associée (exemple : ‘G’, ‘V’) |
in |
nmax |
I |
nombre maximum de noms d’objets JEVEUXdans la classe |
in |
nbloc |
I |
nombre maximum d’enregistrements du fichier d’accès direct associé |
in |
lbloc |
I |
longueur des enregistrements du fichier d’accès direct associé |
Remarque :
Une classe peut être ouverte ou fermée à tout moment, jusqu’à concurrence du nombre maximum de classes gérables simultanément.
Pour fermer une classe, en cours d’application :
SUBROUTINE JELIBF (cond,nom_cl)
in |
cond |
K* |
texte permettant de surcharger la valeur de stoutdéfinie dans JEINIF ’SAUVE’ avec sauvegarde immédiate sur fichier ’DETRUIT’ avec destruction immédiate |
in |
nom_cl |
K* |
nom de la classe à fermer (exemple : ‘G’, ‘V’) |
Enfin, il est obligatoire de faire appel à la routine de clôture de l’application qui effectue la fermeture de toutes les classes encore ouvertes après sauvegarde des objets JEVEUX et des catalogues présents en mémoire et arrête l’application par l’instruction Fortran STOP. Cette routine est appelée au sein de la commande FIN par le superviseur.
SUBROUTINE JEFINI (cond)
in |
cond |
K8 |
condition de clôture : ’NORMAL’ sauvegarde suivant la valeur de stout définie dans JEINIF ’ERREUR’ sauvegarde des classes ouvertes, pour éventuelle analyse ultérieure |
Remarques :
C’est le seul STOP utilisable dans toute l’application pour pouvoir réutiliser les bases de données.
un utilisateur doit appeler cette routine pour arrêter son application après détection d’une erreur avec cond = ‘ERREUR’ ,
Au sein de Code_Aster un arrêt avec la condition cond = ‘ERREUR’ n’autorise pas la mise à jour de la base GLOBALE dans le répertoire de l’utilisateur, les concepts créés n’ayant pas été validés.
SUBROUTINE JETASS (nom_cl)
in |
nom_cl |
K1 |
nom de la classe associée (exemple : ‘G’, ‘V’) |
Cette routine est destinée à récupérer les enregistrements devenus inutilisés à la suite de la destruction des objets JEVEUX associés. Cela ne concerne que les gros objets, c’est à dire ceux qui nécessitent au moins un enregistrement du fichier d’accès direct. Le seul effet est de réordonner séquentiellement les enregistrements, la récupération effective de la place doit ensuite être effectuée en recopiant le début du fichier d’accès direct, seul le superviseur d’Aster peut effectuer cette action.
4.22. Les routines de sauvegarde et de relecture utilisées par le superviseur#
La base GLOBALE permet de sauvegarder et de relire sur une même plate-forme les objets Jeveux obtenu lors d’une exécution. Ce fichier binaire, composé d’un ou plusieurs sous-fichiers est adhérent à la plate-forme d’exécution (système d’exploitation 32 ou 64 bits). Il est possible, à l’aide des deux routines suivantes, d’enregistrer le contenu complet au format HDF et de le relire indépendemment du type de plate-forme.
SUBROUTINE JEIMHD (fichdf,nom_cl)
in |
fichdf |
K* |
nom local du fichier HDF à créer |
in |
nom_cl |
K1 |
nom de la classe associée (exemple : ‘G’, ‘V’) |
SUBROUTINE JELIHD (nom_bas,fichdf,nom_cl)
in |
nom_bas |
K* |
nom local de la base de données (exemple : ‘GLOBALE’, ‘VOLATILE’) |
in |
fichdf |
K* |
nom local du fichier HDF à relire |
in |
nom_cl |
K1 |
nom de la classe associée (exemple : ‘G’, ‘V’) |
4.23. Routines d’interrogation pour le superviseur#
SUBROUTINE JELIAD (nom_cl, numr, nboct)
in |
nom_cl |
K1 |
nom de la classe associée (exemple : ‘G’, ‘V’) |
out |
numr |
I |
numéro de l’enregistrement |
out |
nboct |
I |
nombre d’octets avant l’enregistrement |
Cette routine renvoie le numéro de l’enregistrement contenant l’objet système $$RNOMdans la base considérée. Ce répertoire de noms étant une caractéristique de la base, le superviseur utilise cette propriété pour «identifier» la base et faire des vérifications de cohérence en poursuite.