2. Gestion des objets#
2.1. Les attributs#
2.1.1. Généralités#
Les attributs auxquels l’utilisateur a accès sont, à deux exceptions près, non modifiables directement.
Ils sont affectés lors de la création du descripteur (par exemple le type) puis figés jusqu’à destruction de ce descripteur. Le système gère en plus des attributs qui évoluent au cours de l’application (par exemple l’adresse mémoire du segment de valeurs).
On distingue trois catégories d’attributs pour les objets JEVEUX :
les attributs génériques : classe, genre, type, …
les attributs de collection.
les attributs des objets de collection.
Tous les attributs sont consultables à tout moment par l’utilisateur. Dans la suite du document, pour chaque attribut, on indique :
le nom symbolique par lequel on peut le consulter,
le type Fortran de chaque attribut avec les conventions suivantes :
Code |
Type |
Déclaration Fortran |
I |
entier |
INTEGER |
S |
entier |
INTEGER*4 |
R |
réel |
REAL*8 |
C |
complexe |
COMPLEX*16 |
L |
logique |
LOGICAL |
Ki |
caractère |
CHARACTER*i |
K* |
chaîne |
CHARACTER*(*) |
2.1.2. Les attributs génériques#
Attributs affectés par l’utilisateur (non modifiables après création du descripteur) :
CLAS |
K1 |
classe de rattachement de l’objet à une base de données |
GENR |
K1 |
genre de l’objet : - Evariable simple - Vvecteur, - Nrépertoire de noms de type K8, K16ou K24. |
TYPE |
K1 |
type Fortran de l’objet : I,R,C,Lou K |
LTYP |
I |
longueur du type : géré automatiquement pour les types I, R, Cet L, - normalisé pour les caractères aux valeurs 8, 16, 24, 32 et 80 |
longueur de l’objet : LONMAX NOMMAX |
I I |
nombre de composantes de l’objet de genre V nombre de noms maximum de l’objet de genre N |
Attributs modifiables à tout moment par l’utilisateur :
Ces attributs ne sont pas indispensables au fonctionnement du progiciel. Ils permettent à l’utilisateur de compléter la description des objets JEVEUX qu’il manipule.
LONUTI |
I |
nombre de composantes de l’objet de genre Vutilisées |
DOCU |
K4 |
quatre caractères libres laissés à l’utilisateur |
Attributs affectés et gérés par le système et consultables par l’utilisateur :
Ces attributs sont décrits à titre d’information, il peuvent être consultés lors de la mise au point d’une application (recherche d’erreur, …).
NOMUTI |
I |
nombre de noms de l’objet de genre Neffectivement utilisés |
DATE |
I |
entier comportant le mois, le jour, l’année, l’heure et les minutes de l’exécution du travail ayant effectué la dernière modification du segment de valeurs (dernier déchargement sur la base de données) |
IADM |
I |
adresse mémoire : position relative dans la mémoire JEVEUX du segment de valeurs et adresse du pointeur vers la zone mémoire allouée dynamiquement (stockés dans 2 entiers pour chaque objet) |
IADD |
I |
adresse disque : contient le numéro de l’enregistrement du segment de valeurs dans la base de données et la position relative dans l’enregistrement (stockés dans 2 entiers pour chaque objet) |
LONO |
I |
longueur en unité d’adressage de l’objet (place occupée par le segment de valeurs mesurée en longueur du type) |
USAGE |
K16 |
usage d’un objet JEVEUX: contient à la fois une information sur l’usage en écriture ou en lecture, l’état (déchargeable, amovible, …) du segment de valeurs lorsqu’il est présent en mémoire et les marques déposées lors de la première requête en lecture et en écriture |
Ces derniers ne sont utilisés que de façon interne à JEVEUX.
2.1.3. Les attributs de collection#
Attributs communs affectés par l’utilisateur ou gérés par le système :
Les attributs communs (CLAS, GENR, TYPE, LTYP, DOCU, etc.) aux objets de collection sont accessibles de la même façon que les attributs d’un objet simple et répondent aux mêmes règles.
Attribut affecté et géré par le système et consultable par l’utilisateur :
NUTIOC |
I |
nombre d’objets effectivement créés dans la collection |
Remarque :
Cet attribut est actualisé uniquement lors de l’appel de la routine de création d’objet de collection JECROC .
Attributs affectés par l’utilisateur et non modifiables :
ACCES |
K* |
type d’accès : NOMMEou NUMEROTE(voir l’affectation de cet attribut par JECREC) |
STOCKAGE |
K* |
Mode de stockage des valeurs : - CONTIG: tous les objets sont contigus dans le segment de valeurs - DISPERSE: les objets sont archivés au fur et à mesure des besoins |
MODELONG |
K* |
Mode de définition de la longueur des objets de collection : - CONSTANT: tous les objets sont de même longueur (attribut de longueur de l’objet de référence) - VARIABLE: chaque objet peut avoir une longueur différente |
LONT |
I |
longueur totale d’une collection contiguë |
NMAXOC |
I |
nombre maximum d’objets de la collection |
2.1.4. Les attributs des objets de collection#
Les règles de nom d’attribut des objets de collection sont les mêmes que pour les objets simples.
2.2. Les bases de données associées#
A chaque classe il est possible d’associer une base de données sur disque. Cette possibilité n’est nullement obligatoire : on peut travailler sans écriture et lecture sur disque (ce qui peut conduire à saturer la mémoire disponible et à l’arrêt de l’application).
Le nombre de classes sur lequel on peut travailler simultanément est limité à 5. Il est possible d’ouvrir ou de fermer une classe à tout moment au cours de l’application.
L’ouverture d’une base de données préexistante permet de récupérer l’ensemble des informations stockées sur cette dernière. En fin de travail, il est possible de détruire une classe entière.
Une base de données est un fichier d’accès direct ; elle est définie par :
un nom de classe (K1),
un nom local du fichier (K8),
une longueur de bloc,
un nombre de blocs.
Remarque :
Dans le Code_Aster, toutes les classes sont associées à des bases cf § 3.3 L’environnement du Code_Aster.
2.3. L’accès aux valeurs#
L’utilisateur accède aux valeurs d’un objet JEVEUX par une adresse relative dans un tableau défini par une des variables Fortran de référence du type convenable. Ces variables de référence (ZI, ZR, …) sont placées dans des communs normalisés confer [D2.06.01] : Usage Jeveux « Libération des segments de valeurs et notion de marque ».
Remarque :
L’adresse renvoyée reste valide tant que l’utilisateur n’a pas déclaré qu’il n’utilisait plus l’objet.
ZR (LR)1èrecomposante des valeurs de l’objet de type réel
ZK16(LK16 - 1 + I)ièmecomposante des valeurs de l’objet K16
2.4. Notions de gestion de la mémoire#
L’accès aux objets JEVEUX s’effectue par nom. Ces noms sont stockés dans un objet simple de genre répertoire de noms accessible uniquement par le progiciel et géré par une méthode d’adressage associatif.
Pour ordonner une application, l’utilisateur doit regrouper les objets JEVEUX dans une ou plusieurs classes ouvertes au préalable. A chaque classe est associé un catalogue : c’est l’ensemble constitué du répertoire de noms et des attributs des objets JEVEUX de la classe. La classe est l’un des attributs défini à la création du descripteur d’un objet JEVEUX. La recherche du nom s’effectue parmi toutes les classes ouvertes à cet instant
Remarque :
Un nom ne peut donc figurer plus d’une fois parmi l’ensemble des classes ouvertes.
A chaque classe, il est possible d’associer un fichier d’accès direct (ou base de données), qui contiendra en fin d’application, les descripteurs et les segments de valeurs de tous les objets JEVEUX de la classe. Ce type de fichier permet d’accéder rapidement aux différents enregistrements, un index décrivant la position de chacun d’entre eux.
Les échanges entre la mémoire centrale et les bases de données associées aux classes sont entièrement pris en charge par le progiciel. Quand la mémoire centrale est saturée (qu’il n’est plus possible de s’allouer une zone dynamiquement), celui-ci décharge ou détruits les segments de valeurs déclarés inutilisés. En fin d’application, tous les objets JEVEUX présents en mémoire sont déchargés dans la base de données associée, ainsi que les catalogues (objets simples « système »), ce qui permet les réutilisations ultérieures.
Le fichier d’accès direct ne sera valide que si l’index a été actualisé lors de la fermeture, il est donc indispensable d’arrêter proprement l’application en passant par la routine JEFINI. Tout segment de valeurs en mémoire est encadré par huit entiers (quatre devant, quatre derrière) permettant de gérer le segment de valeurs, d’indiquer son usage (libre, utilisé en lecture, déchargeable, ….), de stocker l’identificateur associé, et d’assurer une protection partielle aux débordements (le progiciel contrôle l’intégrité des valeurs contenues par ces entiers lors de toute requête).
2.5. Les requêtes d’utilisation des objets#
Le progiciel JEVEUX fournit différents sous-programmes et fonctions permettant de gérer tous les objets. On distingue les différentes requêtes suivantes :
la création du descripteur d’un objet JEVEUXou d’un objet de collection,
l’allocation de l’objet : recherche de place en mémoire pour le segment de valeurs associé, initialisation des valeurs ou relecture sur la base de données, enfin fourniture à l’unité de programme appelante d’une adresse relative du segment de valeurs par rapport à une variable de référence Z* . Cette allocation peut être formulée en lecture seulement ou en lecture/écriture ;
la consultation du descripteur qui permet de récupérer dynamiquement la valeur d’un attribut ;
les impressions du descripteur, du segment de valeurs, du catalogue ou de l’état de la mémoire gérée par JEVEUX;
la libération qui met fin à l’allocation de l’objet et rend le ou les segment de valeurs inutilisés ;
la destruction du descripteur et du segment de valeurs d’un objet JEVEUXou d’un objet de collection.
2.6. Les particularités des collections#
Le dimensionnement d’une collection dépend de son type. Pour chaque type, on décrit ci dessous le mode de définition du ou des segment(s) de valeurs associés.
2.6.1. Collection contiguë de longueur variable#
On définit :
soit la longueur totale du segment de valeurs par l’attribut LONT(longueur totale) de la collection. On peut dans ce cas créer la collection et définir (sans ordre particulier) ultérieurement la longueur de chaque objet avant de l’utiliser ;
soit la longueur de tout ou partie des objets de la collection en donnant le vecteur des longueurs géré par l’utilisateur, ou en actualisant l’attribut de longueur pour chaque objet, la longueur totale du segment de valeurs sera calculée par le progiciel.
Remarques :
Il est conseillé de définir la longueur de tous les objets d’une collection contiguë avant la première requête d’allocation en mémoire,
La longueur du segment de valeurs LONT est figée lors de la première requête d’allocation en mémoire,
Une collection contiguë de longueur variable ne peut donc être agrandie après le premier accès,
tous les objets créés dans une collection contiguë sont gérés ensemble,
Le segment de valeurs associé peut être utilisé comme un vecteur de valeurs en ignorant le découpage en objets de collection.
2.6.2. Collection contiguë de longueur constante#
On définit la longueur commune à tous les objets de collection ; la longueur du segment de valeurs sera égale au produit de la longueur constante par le nombre maximum d’objets de la collection.
Attention : lorsque l’on fait le JEECRA du LONMAX de la collection, il faut indiquer la longueur d’un seul élément de la collection et non pas la longueur totale.
2.6.3. Collection dispersée de longueur variable#
On définit :
le majorant du nombre d’objets,
la longueur de chaque objet, au fur et à mesure des besoins et sans ordre particulier, avant l’allocation de l’objet.
Remarque :
L’encombrement effectif de ce type de collection est limité à la longueur cumulée des objets effectivement créés.
Remarque :
Pour une collection dispersée, on peut utiliser un objet (dont la longueur a été définie) avant d’avoir fini de définir l’ensemble des objets.
2.6.4. Collection dispersée de longueur constante#
On définit :
le majorant du nombre d’objets,
la longueur commune à tous les objets.
2.6.5. Les concepts de base#
Objet JEVEUX :
Le progiciel JEVEUX permet de gérer deux types de structures de données accessibles par nom au sein de l’application. L’usage a voulu que l’on appelle ces structures de données objets JEVEUX. Par définition, un objet JEVEUX est :
soit un objet simple,
soit une collection d’objets.
Un objet JEVEUX est l’ensemble constitué par un descripteur et un ou plusieurs segment(s) de valeurs.
Descripteur :
Un descripteur est un ensemble d’informations constitué d’un nom et de différents attributs. Le descripteur permet d’accéder, à partir du nom, au(x) segment(s) de valeurs de l’objet JEVEUX. Les attributs décrivent la structure de l’objet JEVEUX.
Nom :
Un nom est constitué d’une suite de caractères alphanumériques limitée à 24 caractères (au nom est associé, par une table et une fonction de codage, un entier permettant d’accéder à l’objet par adressage associatif).
Attribut :
Les attributs sont les paramètres (en nombre fixe pour les objets simples) permettant de définir et de décrire la structure de données (variable, tableau). Par exemple le type des valeurs et la longueur du tableau font partie de l’ensemble des attributs.
Segment de valeurs :
Un segment de valeurs est une suite continue de mots ou d’octets (suivant l’unité d’adressage de la machine) utilisée pour stocker des valeurs en mémoire centrale ou en mémoire auxiliaire (fichier).
Remarque :
Sauf exception (les répertoires de noms), un segment de valeurs est une suite de valeurs de même type.
2.7. La libération des segments de valeurs#
Une requête d’accès en lecture ou en écriture sur un segment de valeurs associé à un objet JEVEUX provoque un chargement en mémoire du contenu du segment de valeurs associé. Lorsque l’on gère un espace mémoire fini, il arrive un moment où il n’est plus possible de trouver de place pour charger un nouvel objet. Il faut alors provoquer des déchargements sur disque ou bien éliminer des segments de valeurs devenus inutiles. Ce mécanisme ne peut être totalement pris en charge par JEVEUX : le programmeur doit avoir au préalable indiqué les objets concernés. Mais certaines précautions doivent être observées : plusieurs unités de programme peuvent utiliser simultanément une même adresse mémoire associée à un objet. La mise en mémoire d’un segment de valeurs s’accompagne de l’affectation d’une marque entière qui mesure le niveau de profondeur dans les appels de sous-programmes pour chaque nouvelle requête. La libération ne peut s’effectuer que si le niveau d’appel à cet instant est identique à la marque associée au segment de valeurs. On appelle marque courante le niveau d’appel en cours. La mise en œuvre de ce mécanisme impose une règle d’usage de JEVEUX très stricte : toute routine qui appelle JEVEUO ou WKVECT doit effectuer un appel à JEMARQ comme première instruction exécutable et un appel à JEDEMA comme dernière instruction exécutable. La routine JEMARQ permet d’actualiser la valeur de la marque courante, en l’incrémentant de 1, affectée à tous les segments de valeurs chargés ultérieurement. La routine JEDEMA libère tous les segments de valeurs associés à la marque courante puis décrémente cette dernière.
Certaines configurations tolèrent des exceptions à cette règle : il s’agit par exemple de boucles sur des blocs de matrices. Il est alors nécessaire de libérer au fur et à mesure les objets, c’est la routine JELIBE qui est utilisée dans ce cas.
Il est parfois nécessaire de disposer en permanence ou tout du long d’une commande du Code_Aster de certains objets (pour le Superviseur d’exécution, le matériau codé), des requêtes spécifiques sont utilisées, qui affectent une marque spéciale.
La valeur de la marque courante peut être consultée à tout instant à l’aide de la routine JEVEMA.