Exemples d’utilisation ====================== On supposera, dans cette partie, s’être placé dans un environnement d’application (par exemple celui d’ASTER) et avoir ouvert les bases de données associées aux classes G, V et L. On ne mentionnera que les appels aux routines JEVEUX, les déclarations et les communs Fortran sont omis. .. _RefHeading__28694355: Création et réutilisation d'un vecteur de réel ---------------------------------------------- Soit le problème suivant : on veut créer (dans la routine SUBA) un vecteur de réels contenant les coordonnées :math:`X` et :math:`Y` de :math:`\mathit{nno}` nœuds. On appellera ce vecteur ‘COORDO_XY’ et on le réutilisera dans la routine SUBB. .. code-block:: text SUBROUTINE SUBA(...) ... #include «jeveux.h» real(kind=8), pointer:: COOR(:) => null() ! - Début des instructions : (a) CALL JEMARQ( ) ! - Allocation du vecteur sur la base 'GLOBALE' : (b) CALL WKVECT ('COORDO_XY', 'G V R', 2*nno, vr=COOR) ! - "remplissage du vecteur" DO ino = 1, nno COOR( 2*(ino-1)+1) = X COOR( 2*(ino-1)+2) = Y ENDDO (c) CALL JEDEMA ( ) END SUBROUTINE SUBB(...) ... real(kind=8), pointer:: COOR(:) => null() ! - Début des instructions : (d) CALL JEMARQ ( ) ! - Récupération de l'adresse du vecteur (en lecture) : (e) CALL JEVEUO ('COORDO_XY', 'L', vr=COOR) ! - Récupération des coordonnées du 27ème noeud : X27 = COOR( 2 * 26 + 1) Y27 = COOR( 2 * 26 + 2) ... (f) CALL JEDEMA ( ) END *Commentaires :* * lignes (a), (c), (d), (e) : les routines JEMARQ/JEDEMA permettent de libérer automatiquement les objets à la fin des routines [:ref:`§4.11 <§4.11>`], * ligne (b) : * ‘G V R’ : ‘G’ : base “Globale” (base de données de l’utilisateur cf. [:ref:`§3.3 <§3.3>`]) ‘ V’ : vecteur, ‘R’ : réel, * 2*nno: longueur du vecteur * COOR: pointeur sur le segment de valeurs * ligne (e) * ‘L ’ : accès en “lecture” de l’objet (cf. [:ref:`§4.5 <§4.5>`]). Création d’un répertoire de noms et insertion de deux noms ---------------------------------------------------------- .. code-block:: text CALL JECREO ( ‘MES_NOMS’, ‘G N K8’ ) CALL JEECRA ( ‘MES_NOMS’, ‘NOMMAX’, ival=25) C CALL JECROC ( JEXNOM(‘MES_NOMS’,’NOM_1’) ) CALL JECROC ( JEXNOM(‘MES_NOMS’,’NOM_5’) ) C CALL JELIRA (‘MES_NOMS’, ‘NUTIOC’, ival=IVAL) CALL JENONU (JEXNOM(‘MES_NOMS’,’NOM_5’),NUM) CALL JENUNO (JEXNUM(‘MES_NOMS’,1),NOM) L’appel à JENONU renvoie la valeur 2 dans la variable NUM, L’appel à JENUNO renvoie la valeur ‘NOM_1’ dans la variable NOM. Collection dispersée de vecteurs d’entiers ------------------------------------------ Les objets de cette collection sont nommés dans le répertoire, géré par l’utilisateur et créé dans l’exemple précédent ; ils sont de longueur variable. .. code-block:: text CALL JECREC (‘MA_COLL’,’G V I’,’NO’,’DISPERSE’,’VARIABLE’,25) CALL JECROC ( JEXNOM (‘MA_COLL’,’NOM_13’) ) CALL JEECRA ( JEXNOM (‘MA_COLL’,’NOM_13’), ‘LONMAX’, ival=125) CALL JEECRA ( JEXNOM (‘MA_COLL’,’NOM_1’) , ‘LONMAX’, ival=250) Dans une autre routine, on utilise l’objet ‘NOM_13’ qui vient d’être créé : .. code-block:: text CALL JEVEUO ( JEXNOM (‘MA_COLL’,’NOM_13’), ‘E’, JTAB) CALL JELIRA ( JEXNOM (‘MA_COLL’,’NOM_13’), ‘LONMAX’, ival=LNOM13) C DO 10 K = 1, LNOM13 ZI ( JTAB - 1 + K ) = K 10 CONTINUE .. CALL JEDETR (JEXNOM (‘MA_COLL’,’NOM_13’)) L’attribut NUTIOC de la collection est actualisé en même temps que celui de l’objet simple ‘MES_NOMS’. La dernière instruction détruit l’objet de collection ‘NOM_13’ et le nom dans le répertoire ‘MES_NOMS’. Collection contiguë de vecteurs d’entiers ----------------------------------------- Les objets de cette collection sont nommés dans le répertoire de noms ‘MES_NOMS’, déjà utilisé pour les deux exemples précédents. Ils ont une longueur variable définie par un vecteur de longueurs ‘LONGUEURS’ géré par l’utilisateur. Dans une première routine, on crée la collection et on ajoute un objet ‘NOM_24’ .. code-block:: text CALL JECREC (‘MA_COLL’,’G V I’,’NO MES_NOMS’,’CONTIG’,’VARIABLE’,25) CALL JECROC ( JEXNOM( ‘MA_COLL’, ‘NOM_24’) ) Dans une autre routine, on définit la longueur des objets 2 à 25, égale au numéro d’insertion de l’objet : .. code-block:: text CALL JEVEUO ( ‘LONGUEURS’ , ‘E’, JTAB) C DO 10 I = 2, 25 CALL JEECRA ( JEXNUM ( ‘MA_COLL’, I ) , ‘LONMAX’, ival=I) 10 CONTINUE Dans une autre routine, on définit la longueur de l’objet 1 (égale à 50), et on accède à toute la collection pour définir la 13ième composante du premier objet : .. code-block:: text CALL JEECRA ( JEXNUM ( ‘MA_COLL’, 1 ) , ‘LONMAX’, ival=50) C CALL JEVEUO ( ‘MA_COLL’ , ‘E’, vi=TABC) K = 13 TABC( K ) = ..... Dans une autre routine, on alloue le 2ième objet pour définir toutes ses composantes : .. code-block:: text CALL JEVEUO ( JEXNUM ( ‘MA_COLL’, 2 ) , ‘E’, vi=TABOC) CALL JELIRA ( JEXNUM ( ‘MA_COLL’, 2 ) , ‘LONMAX’, ival=L2) DO 20 K = 1 , L2 TABOC( K ) = ..... 20 CONTINUE Dans une autre routine, on alloue la collection entière pour définir la première composante du 3ième objet, auquel on accède par le vecteur des longueurs cumulées : .. code-block:: text CALL JEVEUO ( ‘MA_COLL’, ‘E’, JTABC) C CALL JEVEUO ( JEXATR (‘MA_COLL’, ‘LONCUM’), ‘E’, JTABCU) C IOBJ = 3 IAD = ZI (JTABCU - 1 + IOBJ ) ZI (JTABC - 1 + IAD ) = ..... On remarquera les deux manières qui permettent de définir la longueur d’un objet de collection : * en utilisant l’appel à JEECRA * en affectant directement la valeur dans le vecteur des longueurs. La première requête à JEVEUO (dans le dernier cadre) effectue un accès à la collection contiguë globalement et renvoie donc l’adresse du premier objet, à charge pour l’utilisateur de se déplacer par rapport à cette adresse pour atteindre un objet particulier. La seconde requête permet d’accéder directement à un objet de collection et renvoie l’adresse de cet objet. Dans le dernier exemple, on récupère les longueurs cumulées des objets de la collection, ce qui permet à l’utilisateur d’accéder ainsi à n’importe quel objet, sans multiplier les requêtes JEVEUO. *Remarque :* *Dans les trois cas, tous les objets de la collection contiguë sont présents en mémoire.*