      1  /*************************************************************************
      2  * COPYRIGHT (C) 1999 - 2003  EDF R&D
      3  * THIS LIBRARY IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
      4  * IT UNDER THE TERMS OF THE GNU LESSER GENERAL PUBLIC LICENSE
      5  * AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION;
      6  * EITHER VERSION 2.1 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
      7  *
      8  * THIS LIBRARY IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
      9  * WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
     10  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
     11  * LESSER GENERAL PUBLIC LICENSE FOR MORE DETAILS.
     12  *
     13  * YOU SHOULD HAVE RECEIVED A COPY OF THE GNU LESSER GENERAL PUBLIC LICENSE
     14  * ALONG WITH THIS LIBRARY; IF NOT, WRITE TO THE FREE SOFTWARE FOUNDATION,
     15  * INC., 59 TEMPLE PLACE, SUITE 330, BOSTON, MA 02111-1307 USA
     16  *
     17  *************************************************************************/
     18
     19
     20  /******************************************************************************
     21   * - Nom du fichier : test5.c
     22   *
     23   * - Description : lecture des noeuds d'un maillage MED.
     24   *
     25   *****************************************************************************/
     26
     27  #include <med.h>
     28  #include <med_utils.h>
     29  #include <string.h>
     30  #include <stdlib.h>
     31
     32  int main (int argc, char **argv)
     33  {
     34    med_err ret = 0;
     35    med_idt fid;
     36    /* la dimension du maillage */
     37    med_int mdim;
     38    /* nom du maillage de longueur maxi MED_TAILLE_NOM */
     39    char maa[MED_TAILLE_NOM+1];
     40    /* le nombre de noeuds */
     41    med_int nnoe = 0;
     42    /* table des coordonnees */
     43    med_float *coo1,*coo2;
     44    /* tables des noms et des unites des coordonnees
     45       profil : (dimension*MED_TAILLE_PNOM+1) */
     46    char nomcoo[2*MED_TAILLE_PNOM+1];
     47    char unicoo[2*MED_TAILLE_PNOM+1];
     48    /* tables des noms, numeros, numeros de familles des noeuds
     49       autant d'elements que de noeuds - les noms ont pout longueur
     50       MED_TAILLE_PNOM */
     51    char *nomnoe;
     52    med_int *numnoe;
     53    med_int *nufano;
     54    med_repere rep;
     55    med_booleen inonoe,inunoe;
     56    char str[MED_TAILLE_PNOM+1];
     57    med_int i;
     58    med_int profil[2] = { 2, 3 };
     59    char desc[MED_TAILLE_DESC+1];
     60    med_maillage type;
     61
     62    /* Ouverture du fichier "test4.med" en lecture seule */
     63    fid = MEDouvrir("test4.med",MED_LECTURE);
     64    if (fid < 0) {
     65      MESSAGE("Erreur a l'ouverture du fichier test4.med");
     66      return -1;
     67    }
     68
     69    /* Lecture des infos concernant le premier maillage */
     70    if (MEDmaaInfo(fid,1,maa,&mdim,&type,desc) < 0) {
     71      MESSAGE("Erreur a la lecture des informations sur le maillage : ");SSCRUTE(maa);
     72      return -1;
     73    } else
     74      printf("Maillage de nom : %s et de dimension : %d \n",maa,mdim);
     75
     76    /* Combien de noeuds a lire ? */
     77    nnoe = MEDnEntMaa(fid,maa,MED_COOR,MED_NOEUD,0,0);
     78    if (nnoe < 0) {
     79      MESSAGE("Erreur a la lecture du nombre de noeuds dans : ");
     80      ret = -1;
     81    } else
     82      printf("Nombre de noeuds : %d \n",nnoe);
     83
     84    /* Allocations memoires */
     85    if (nnoe > 0) {
     86      /* table des coordonnees
     87         profil : (dimension * nombre de noeuds ) */
     88      coo1 = (med_float*) calloc(nnoe*mdim,sizeof(med_float));
     89      coo2 = (med_float*) calloc(nnoe*mdim,sizeof(med_float));
     90      /* table des des numeros, des numeros de familles des noeuds
     91         profil : (nombre de noeuds) */
     92      numnoe = (med_int*) malloc(sizeof(med_int)*nnoe);
     93      nufano = (med_int*) malloc(sizeof(med_int)*nnoe);
     94      /* table des noms des noeuds
     95         profil : (nnoe*MED_TAILLE_PNOM+1) */
     96      nomnoe = (char*) malloc(MED_TAILLE_PNOM*nnoe+1);
     97    }
     98
     99    /* Lecture des composantes n°2 des coordonnees des noeuds */
    100    if (nnoe > 0) {
    101      if (MEDcoordLire(fid,maa,mdim,coo1,MED_FULL_INTERLACE,2,NULL,0,
    102               &rep,nomcoo,unicoo) < 0) {
    103        MESSAGE("Erreur a la lecture des coordonnees des noeuds");
    104        ret = -1;
    105      } else {
    106        printf("Valeur de coo1 : ");
    107        for (i=0;i<nnoe*mdim;i++)
    108      printf("%4.2f ",coo1[i]);
    109        printf("\n");
    110      }
    111    }
    112
    113    /* Lecture des composantes n°1 des coordonnees des noeuds */
    114    if (nnoe > 0) {
    115      if (MEDcoordLire(fid,maa,mdim,coo1,MED_FULL_INTERLACE,1,NULL,0,
    116                 &rep,nomcoo,unicoo) < 0) {
    117      MESSAGE("Erreur a la lecture des coordonnees des noeuds");
    118      ret = -1;
    119      } else {
    120        printf("Valeur de coo1 : ");
    121        for (i=0;i<nnoe*mdim;i++)
    122      printf("%4.2f ",coo1[i]);
    123        printf("\n");
    124      }
    125    }
    126
    127    /* Lecture des composantes n°1 des coordonnees des noeuds du profil */
    128    if (nnoe > 0) {
    129      if (MEDcoordLire(fid,maa,mdim,coo2,MED_FULL_INTERLACE,2,profil,2,
    130                 &rep,nomcoo,unicoo) < 0) {
    131        MESSAGE("Erreur a la lecture des coordonnees des noeuds");
    132        ret = -1;
    133      } else {
    134        printf("Valeur de coo2 : ");
    135        for (i=0;i<nnoe*mdim;i++)
    136      printf("%4.2f ",coo2[i]);
    137        printf("\n");
    138      }
    139    }
    140
    141    /* Lecture des composantes n°2 des coordonnees des noeuds du profil */
    142    if (nnoe > 0) {
    143      if (MEDcoordLire(fid,maa,mdim,coo2,MED_FULL_INTERLACE,1,profil,2,
    144                 &rep,nomcoo,unicoo) < 0) {
    145        MESSAGE("Erreur a la lecture des coordonnees des noeuds");
    146        ret = -1;
    147      } else {
    148        printf("Valeur de coo2 : ");
    149        for (i=0;i<nnoe*mdim;i++) {
    150      printf("%4.2f ",coo2[i]);
    151      coo2[i] = 0.0;
    152        }
    153        printf("\n");
    154      }
    155    }
    156
    157    /* Lecture de toutes les composantes des coordonnees des noeuds du profil */
    158    if (nnoe > 0) {
    159      if (MEDcoordLire(fid,maa,mdim,coo2,MED_FULL_INTERLACE,MED_ALL,profil,2,
    160                 &rep,nomcoo,unicoo) < 0) {
    161        MESSAGE("Erreur a la lecture des coordonnees des noeuds");
    162        ret = -1;
    163      } else {
    164        printf("Valeur de coo2 : ");
    165        for (i=0;i<nnoe*mdim;i++) {
    166      printf("%4.2f ",coo2[i]);
    167      coo2[i] = 0.0;
    168        }
    169        printf("\n");
    170      }
    171    }
    172
    173    /* Lecture des composantes des coordonnees des noeuds */
    174    if (nnoe > 0) {
    175      if (MEDcoordLire(fid,maa,mdim,coo2,MED_FULL_INTERLACE,MED_ALL,NULL,0,
    176                 &rep,nomcoo,unicoo) < 0) {
    177        MESSAGE("Erreur a la lecture des coordonnees des noeuds");
    178        ret = -1;
    179      } else {
    180        printf("Valeur de coo2 : ");
    181        for (i=0;i<nnoe*mdim;i++)
    182      printf("%4.2f ",coo2[i]);
    183        printf("\n");
    184      }
    185    }
    186
    187    /* Lecture des noms des noeuds (optionnel dans un maillage MED) */
    188    if (nnoe > 0)
    189      if (MEDnomLire(fid,maa,nomnoe,nnoe,MED_NOEUD,0) < 0)
    190        inonoe = MED_FAUX;
    191      else
    192        inonoe = MED_VRAI;
    193
    194    /* Lecture des numeros des noeuds (optionnel dans un maillage MED) */
    195    if (nnoe > 0)
    196      if (MEDnumLire(fid,maa,numnoe,nnoe,MED_NOEUD,0) < 0)
    197        inunoe = MED_FAUX;
    198      else
    199        inunoe = MED_VRAI;
    200
    201    /* Lecture des numeros de familles des noeuds */
    202    if (nnoe > 0)
    203      if (MEDfamLire(fid,maa,nufano,nnoe,MED_NOEUD,0) < 0) {
    204        MESSAGE("Erreur a la lecture des numeros de famille des noeuds");
    205        ret = -1;
    206      }
    207
    208    /* Fermeture du fichier */
    209    if (MEDfermer(fid) < 0){
    210        MESSAGE("Erreur a la fermeture du fichier");
    211        ret = -1;
    212      }
    213
    214    /* Affichage des resulats */
    215    if (ret == 0 && nnoe > 0)
    216      {
    217        printf("Type de repere : %d \n",rep);
    218        printf("Nom des coordonnees : \n");
    219        for (i=0;i<mdim;i++)
    220      {
    221        strncpy(str,nomcoo+i*MED_TAILLE_PNOM,MED_TAILLE_PNOM);
    222            str[MED_TAILLE_PNOM] = '\0';
    223            printf("%s ",str);
    224      }
    225        printf("\nUnites des coordonnees : \n");
    226        for (i=0;i<mdim;i++)
    227      {
    228        strncpy(str,unicoo+i*MED_TAILLE_PNOM,MED_TAILLE_PNOM);
    229            str[MED_TAILLE_PNOM] = '\0';
    230            printf("%s ",str);
    231      }
    232        printf("\nCoordonnees des noeuds : \n");
    233        for (i=0;i<nnoe*mdim;i++)
    234      printf("%f ",*(coo2+i));
    235        if (inonoe)
    236      {
    237        printf("\nNoms des noeuds : \n");
    238        for (i=0;i<nnoe;i++)
    239          {
    240            strncpy(str,nomnoe+i*MED_TAILLE_PNOM,MED_TAILLE_PNOM);
    241                str[MED_TAILLE_PNOM] = '\0';
    242            printf(" %s ",str);
    243          }
    244      }
    245        if (inunoe)
    246      {
    247        printf("\nNumeros des noeuds : \n");
    248        for (i=0;i<nnoe;i++)
    249            printf("%d ",*(numnoe+i));
    250      }
    251        printf("\nNumeros des familles des noeuds : \n");
    252        for (i=0;i<nnoe;i++)
    253      printf("%d ",*(nufano+i));
    254        printf("\n");
    255      }
    256
    257    /* liberation memoire */
    258    if (nnoe > 0) {
    259      free(coo1);
    260      free(coo2);
    261      free(nomnoe);
    262      free(numnoe);
    263      free(nufano);
    264    }
    265
    266    return ret;
    267  }
    268
    269
    270
    271