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  }