      1 /*************************************************************************
      2 * COPYRIGHT (C) 1999 - 2007  EDF R&D, CEA/DEN
      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 #define MESGERR
     29 #include <med_utils.h>
     30
     31 #ifdef DEF_LECT_ECR
     32 #define MODE_ACCES MED_LECTURE_ECRITURE
     33 #elif DEF_LECT_AJOUT
     34 #define MODE_ACCES MED_LECTURE_AJOUT
     35 #else
     36 #define MODE_ACCES MED_CREATION
     37 #endif
     38
     39 int main (int argc, char **argv)
     40
     41
     42 {
     43   med_err ret = 0;
     44   med_idt fid;
     45   /* la dimension du maillage */
     46   med_int mdim;
     47   /* nom du maillage de longueur maxi MED_TAILLE_NOM */
     48   char maa[MED_TAILLE_NOM+1];
     49   /* le nombre de noeuds */
     50   med_int nnoe = 0;
     51   /* table des coordonnees */
     52   med_float *coo1,*coo2;
     53   /* tables des noms et des unites des coordonnees
     54      profil : (dimension*MED_TAILLE_PNOM+1) */
     55   char nomcoo[2*MED_TAILLE_PNOM+1];
     56   char unicoo[2*MED_TAILLE_PNOM+1];
     57   /* tables des noms, numeros, numeros de familles des noeuds
     58      autant d'elements que de noeuds - les noms ont pout longueur
     59      MED_TAILLE_PNOM */
     60   char *nomnoe;
     61   med_int *numnoe;
     62   med_int *nufano;
     63   med_repere rep;
     64   med_booleen inonoe,inunoe;
     65   char str[MED_TAILLE_PNOM+1];
     66   med_int i;
     67   med_int profil[2] = { 2, 3 };
     68   char desc[MED_TAILLE_DESC+1];
     69   med_maillage type;
     70
     71   /* Ouverture du fichier "test4.med" en lecture seule */
     72   fid = MEDouvrir("test4.med",MED_LECTURE);
     73   if (fid < 0) {
     74     MESSAGE("Erreur a l'ouverture du fichier test4.med");
     75     return -1;
     76   }
     77
     78   /* Lecture des infos concernant le premier maillage */
     79   if (MEDmaaInfo(fid,1,maa,&mdim,&type,desc) < 0) {
     80     MESSAGE("Erreur a la lecture des informations sur le maillage : ");SSCRUTE(maa);
     81     return -1;
     82   } else
     83     printf("Maillage de nom : %s et de dimension : %d \n",maa,mdim);
     84
     85   /* Combien de noeuds a lire ? */
     86   nnoe = MEDnEntMaa(fid,maa,MED_COOR,MED_NOEUD,0,0);
     87   if (nnoe < 0) {
     88     MESSAGE("Erreur a la lecture du nombre de noeuds dans : ");
     89     ret = -1;
     90   } else
     91     printf("Nombre de noeuds : %d \n",nnoe);
     92
     93   /* Allocations memoires */
     94   if (nnoe > 0) {
     95     /* table des coordonnees
     96        profil : (dimension * nombre de noeuds ) */
     97     coo1 = (med_float*) calloc(nnoe*mdim,sizeof(med_float));
     98     coo2 = (med_float*) calloc(nnoe*mdim,sizeof(med_float));
     99     /* table des des numeros, des numeros de familles des noeuds
    100        profil : (nombre de noeuds) */
    101     numnoe = (med_int*) malloc(sizeof(med_int)*nnoe);
    102     nufano = (med_int*) malloc(sizeof(med_int)*nnoe);
    103     /* table des noms des noeuds
    104        profil : (nnoe*MED_TAILLE_PNOM+1) */
    105     nomnoe = (char*) malloc(MED_TAILLE_PNOM*nnoe+1);
    106   }
    107
    108   /* Lecture des composantes n°2 des coordonnees des noeuds */
    109   if (nnoe > 0) {
    110     if (MEDcoordLire(fid,maa,mdim,coo1,MED_FULL_INTERLACE,2,NULL,0,
    111                      &rep,nomcoo,unicoo) < 0) {
    112       MESSAGE("Erreur a la lecture des coordonnees des noeuds");
    113       ret = -1;
    114     } else {
    115       printf("Valeur de coo1 : ");
    116       for (i=0;i<nnoe*mdim;i++)
    117         printf("%4.2f ",coo1[i]);
    118       printf("\n");
    119     }
    120   }
    121
    122   /* Lecture des composantes n°1 des coordonnees des noeuds */
    123   if (nnoe > 0) {
    124     if (MEDcoordLire(fid,maa,mdim,coo1,MED_FULL_INTERLACE,1,NULL,0,
    125                        &rep,nomcoo,unicoo) < 0) {
    126     MESSAGE("Erreur a la lecture des coordonnees des noeuds");
    127     ret = -1;
    128     } else {
    129       printf("Valeur de coo1 : ");
    130       for (i=0;i<nnoe*mdim;i++)
    131         printf("%4.2f ",coo1[i]);
    132       printf("\n");
    133     }
    134   }
    135
    136   /* Lecture des composantes n°1 des coordonnees des noeuds du profil */
    137   if (nnoe > 0) {
    138     if (MEDcoordLire(fid,maa,mdim,coo2,MED_FULL_INTERLACE,2,profil,2,
    139                        &rep,nomcoo,unicoo) < 0) {
    140       MESSAGE("Erreur a la lecture des coordonnees des noeuds");
    141       ret = -1;
    142     } else {
    143       printf("Valeur de coo2 : ");
    144       for (i=0;i<nnoe*mdim;i++)
    145         printf("%4.2f ",coo2[i]);
    146       printf("\n");
    147     }
    148   }
    149
    150   /* Lecture des composantes n°2 des coordonnees des noeuds du profil */
    151   if (nnoe > 0) {
    152     if (MEDcoordLire(fid,maa,mdim,coo2,MED_FULL_INTERLACE,1,profil,2,
    153                        &rep,nomcoo,unicoo) < 0) {
    154       MESSAGE("Erreur a la lecture des coordonnees des noeuds");
    155       ret = -1;
    156     } else {
    157       printf("Valeur de coo2 : ");
    158       for (i=0;i<nnoe*mdim;i++) {
    159         printf("%4.2f ",coo2[i]);
    160         coo2[i] = 0.0;
    161       }
    162       printf("\n");
    163     }
    164   }
    165
    166   /* Lecture de toutes les composantes des coordonnees des noeuds du profil */
    167   if (nnoe > 0) {
    168     if (MEDcoordLire(fid,maa,mdim,coo2,MED_FULL_INTERLACE,MED_ALL,profil,2,
    169                        &rep,nomcoo,unicoo) < 0) {
    170       MESSAGE("Erreur a la lecture des coordonnees des noeuds");
    171       ret = -1;
    172     } else {
    173       printf("Valeur de coo2 : ");
    174       for (i=0;i<nnoe*mdim;i++) {
    175         printf("%4.2f ",coo2[i]);
    176         coo2[i] = 0.0;
    177       }
    178       printf("\n");
    179     }
    180   }
    181
    182   /* Lecture des composantes des coordonnees des noeuds */
    183   if (nnoe > 0) {
    184     if (MEDcoordLire(fid,maa,mdim,coo2,MED_FULL_INTERLACE,MED_ALL,NULL,0,
    185                        &rep,nomcoo,unicoo) < 0) {
    186       MESSAGE("Erreur a la lecture des coordonnees des noeuds");
    187       ret = -1;
    188     } else {
    189       printf("Valeur de coo2 : ");
    190       for (i=0;i<nnoe*mdim;i++)
    191         printf("%4.2f ",coo2[i]);
    192       printf("\n");
    193     }
    194   }
    195
    196   /* Lecture des noms des noeuds (optionnel dans un maillage MED) */
    197   if (nnoe > 0)
    198     if (MEDnomLire(fid,maa,nomnoe,nnoe,MED_NOEUD,0) < 0)
    199       inonoe = MED_FAUX;
    200     else
    201       inonoe = MED_VRAI;
    202
    203   /* Lecture des numeros des noeuds (optionnel dans un maillage MED) */
    204   if (nnoe > 0)
    205     if (MEDnumLire(fid,maa,numnoe,nnoe,MED_NOEUD,0) < 0)
    206       inunoe = MED_FAUX;
    207     else
    208       inunoe = MED_VRAI;
    209
    210   /* Lecture des numeros de familles des noeuds */
    211   if (nnoe > 0)
    212     if (MEDfamLire(fid,maa,nufano,nnoe,MED_NOEUD,0) < 0) {
    213       MESSAGE("Erreur a la lecture des numeros de famille des noeuds");
    214       ret = -1;
    215     }
    216
    217   /* Fermeture du fichier */
    218   if (MEDfermer(fid) < 0){
    219       MESSAGE("Erreur a la fermeture du fichier");
    220       ret = -1;
    221     }
    222
    223   /* Affichage des resulats */
    224   if (ret == 0 && nnoe > 0)
    225     {
    226       printf("Type de repere : %d \n",rep);
    227       printf("Nom des coordonnees : \n");
    228       for (i=0;i<mdim;i++)
    229         {
    230           strncpy(str,nomcoo+i*MED_TAILLE_PNOM,MED_TAILLE_PNOM);
    231           str[MED_TAILLE_PNOM] = '\0';
    232           printf("%s ",str);
    233         }
    234       printf("\nUnites des coordonnees : \n");
    235       for (i=0;i<mdim;i++)
    236         {
    237           strncpy(str,unicoo+i*MED_TAILLE_PNOM,MED_TAILLE_PNOM);
    238           str[MED_TAILLE_PNOM] = '\0';
    239           printf("%s ",str);
    240         }
    241       printf("\nCoordonnees des noeuds : \n");
    242       for (i=0;i<nnoe*mdim;i++)
    243         printf("%f ",*(coo2+i));
    244       if (inonoe)
    245         {
    246           printf("\nNoms des noeuds : \n");
    247           for (i=0;i<nnoe;i++)
    248             {
    249               strncpy(str,nomnoe+i*MED_TAILLE_PNOM,MED_TAILLE_PNOM);
    250               str[MED_TAILLE_PNOM] = '\0';
    251               printf(" %s ",str);
    252             }
    253         }
    254       if (inunoe)
    255         {
    256           printf("\nNumeros des noeuds : \n");
    257           for (i=0;i<nnoe;i++)
    258               printf("%d ",*(numnoe+i));
    259         }
    260       printf("\nNumeros des familles des noeuds : \n");
    261       for (i=0;i<nnoe;i++)
    262         printf("%d ",*(nufano+i));
    263       printf("\n");
    264     }
    265
    266   /* liberation memoire */
    267   if (nnoe > 0) {
    268     free(coo1);
    269     free(coo2);
    270     free(nomnoe);
    271     free(numnoe);
    272     free(nufano);
    273   }
    274
    275   return ret;
    276 }
    277
    278
    279
    280