      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 : test24.c
     22   *
     23   * - Description : lecture de mailles/faces de type MED_POLYGONE
     24   *                 dans le maillage MED du fichier test23.med
     25   *
     26   *****************************************************************************/
     27
     28  #include <med.h>
     29  #include <med_utils.h>
     30  #include <stdio.h>
     31  #include <string.h>
     32  #include <stdlib.h>
     33
     34  int main (int argc, char **argv)
     35  {
     36    med_err ret = 0;
     37    med_idt fid;
     38    char maa[MED_TAILLE_NOM+1];
     39    med_int nmaa,i,mdim,npoly,j;
     40    char desc[MED_TAILLE_DESC+1];
     41    med_int taille;
     42    med_int *con, *index, *num, *fam;
     43    char *nom;
     44    char tmp[MED_TAILLE_PNOM+1];
     45    int ind1, ind2,k;
     46    med_maillage type;
     47
     48    /* Ouverture du fichier test23.med en lecture seule */
     49    fid = MEDouvrir("test23.med",MED_LECTURE);
     50    if (fid < 0) {
     51      MESSAGE("Erreur a l'ouverture du fichier test23.med");
     52      return -1;
     53    }
     54    printf("Ouverture du fichier test23.med \n");
     55
     56    /* Lecture du nombre de maillages */
     57    nmaa = MEDnMaa(fid);
     58    if (nmaa < 0) {
     59      MESSAGE("Erreur a la lecture du nombre de maillage");
     60      return -1;
     61    }
     62    printf("Nombre de maillages = %d\n",nmaa);
     63
     64    for (i=0;i<nmaa;i++) {
     65
     66      /* Infos sur le maillage */
     67      if (MEDmaaInfo(fid,i+1,maa,&mdim,&type,desc) < 0) {
     68        MESSAGE("Erreur a la lecture des infos sur le maillage");
     69        return -1;
     70      }
     71      printf("maillage %d de nom [%s] et de dimension : %d \n",i+1,maa,mdim);
     72
     73      /* Combien de mailles polygones en mode nodal */
     74      if ((npoly = MEDnEntMaa(fid,maa,MED_CONN,MED_MAILLE,MED_POLYGONE,MED_NOD)) < 0) {
     75        MESSAGE("Erreur a la lecture du nombre de mailles MED_POLYGONE");
     76        return -1;
     77      }
     78      printf("Nombre de mailles polygones en mode nodal : %d \n",npoly);
     79
     80      /* Quelle taille pour le tableau des connectivites */
     81      if (MEDpolygoneInfo(fid,maa,MED_MAILLE,MED_NOD,&taille) < 0) {
     82        MESSAGE("Erreur a la lecture des infos sur les maillaes MED_POLYGONE");
     83        return -1;
     84      }
     85      printf("Taille a allouer pour la connectivite des polygones : %d \n",taille);
     86
     87      /* Allocation memoire :
     88       *  - tableau d'index : npoly + 1
     89       *  - tableau des connectivites : taille
     90       *  - tableaux numeros et numeros de familles : npoly
     91       *  - tableau des noms : MED_TAILLE_PNOM*npoly + 1
     92       */
     93      index = (med_int *) malloc(sizeof(med_int)*(npoly+1));
     94      con = (med_int *) malloc(sizeof(med_int)*taille);
     95      num = (med_int *) malloc(sizeof(med_int)*npoly);
     96      fam = (med_int *) malloc(sizeof(med_int)*npoly);
     97      nom = (char *) malloc(sizeof(char)*MED_TAILLE_PNOM*npoly+1);
     98
     99      /* Lecture de la connectivite des mailles polygones */
    100      if (MEDpolygoneConnLire(fid,maa,index,npoly+1,con,MED_MAILLE,MED_NOD) < 0) {
    101        MESSAGE("Erreur a la lecture de la connectivite des mailles MED_POLYGONE");
    102        ret = -1;
    103      }
    104      printf("Lecture de la connectivite des mailles MED_POLYGONE en mode nodal \n");
    105
    106      /* Lecture noms */
    107      if (ret == 0) {
    108        if (MEDnomLire(fid,maa,nom,npoly,MED_MAILLE,MED_POLYGONE) < 0) {
    109          MESSAGE("Erreur a la lecture des noms des mailles MED_POLYGONE");
    110          ret = -1;
    111        }
    112        printf("Lecture des noms des mailles MED_POLYGONE \n");
    113      }
    114
    115      /* Lecture des numeros */
    116      if (ret == 0) {
    117        if (MEDnumLire(fid,maa,num,npoly,MED_MAILLE,MED_POLYGONE) < 0) {
    118          MESSAGE("Erreur a la lecture des numeros des mailles MED_POLYGONE");
    119          ret = -1;
    120        }
    121        printf("Lecture des numeros des mailles MED_POLYGONE \n");
    122      }
    123
    124      /* lecture des numeros de familles */
    125      if (ret == 0) {
    126        if (ret = MEDfamLire(fid,maa,fam,npoly,MED_MAILLE,MED_POLYGONE) < 0) {
    127          MESSAGE("Erreur a la lecture des numeros de famille des mailles MED_POLYGONE");
    128          ret = -1;
    129        }
    130        printf("Lecture des numeros de familles des mailles MED_POLYGONE \n");
    131      }
    132
    133      if (ret == 0) {
    134        printf("Affichage des resultats \n");
    135        for (j=0;j<npoly;j++) {
    136          printf(">> Maille MED_POLYGONE %d : \n",j+1);
    137          printf("---- Connectivite       ----- : [ ");
    138          ind1 = *(index+j)-1;
    139          ind2 = *(index+j+1)-1;
    140          for (k=ind1;k<ind2;k++)
    141              printf("%d ",*(con+k));
    142          printf(" ] \n");
    143          strncpy(tmp,nom+j*MED_TAILLE_PNOM,MED_TAILLE_PNOM);
    144          tmp[MED_TAILLE_PNOM] = '\0';
    145          printf("---- Nom                ----- : %s \n",tmp);
    146          printf("---- Numero             ----- : %d \n",*(num+j));
    147          printf("---- Numero de famille  ----- : %d \n",*(fam+j));
    148        }
    149      }
    150
    151      /* Liberation de la memoire */
    152      free(index);
    153      free(con);
    154      free(num);
    155      free(fam);
    156      free(nom);
    157    }
    158
    159    /* Fermeture du fichier */
    160    if (MEDfermer(fid) < 0) {
    161      MESSAGE("Erreur a la fermeture du fichier");
    162      return -1;
    163    }
    164    printf("Fermeture du fichier \n");
    165
    166    return ret;
    167  }