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 : test26.c 22 * 23 * - Description : lecture de mailles de type MED_POLYEDRE 24 * dans le maillage MED du fichier test25.med 25 * 26 *****************************************************************************/ 27 28 #include <med.h> 29 #define MESGERR 30 #include <med_utils.h> 31 32 #ifdef DEF_LECT_ECR 33 #define MODE_ACCES MED_LECTURE_ECRITURE 34 #elif DEF_LECT_AJOUT 35 #define MODE_ACCES MED_LECTURE_AJOUT 36 #else 37 #define MODE_ACCES MED_CREATION 38 #endif 39 40 int main (int argc, char **argv) 41 42 43 { 44 med_err ret = 0; 45 med_idt fid; 46 char maa[MED_TAILLE_NOM+1]; 47 med_int nmaa,i,mdim,npoly,j; 48 char desc[MED_TAILLE_DESC+1]; 49 med_int taille,nf,np; 50 med_int taille2,nf2,np2; 51 med_int *conn, *conn2, *indexf, *indexf2, *num, *fam; 52 med_int *indexp, *indexp2; 53 char *nom; 54 char tmp[MED_TAILLE_PNOM+1]; 55 int ind1, ind2,k,nfaces,nnoeuds,l; 56 med_maillage type; 57 58 /* Ouverture du fichier test25.med en lecture seule */ 59 fid = MEDouvrir("test25.med",MED_LECTURE); 60 if (fid < 0) { 61 MESSAGE("Erreur a l'ouverture du fichier test25.med"); 62 return -1; 63 } 64 printf("Ouverture du fichier test25.med \n"); 65 66 /* Lecture du nombre de maillages */ 67 nmaa = MEDnMaa(fid); 68 if (nmaa < 0) { 69 MESSAGE("Erreur a lecture du nombre de maillage"); 70 return -1; 71 } 72 printf("Nombre de maillages = %d\n",nmaa); 73 74 for (i=0;i<nmaa;i++) 75 if (ret == 0) { 76 77 /* Lecture des infos sur le maillage */ 78 if (MEDmaaInfo(fid,i+1,maa,&mdim,&type,desc) < 0) { 79 MESSAGE("Erreur a lecture des infos sur le maillage"); 80 return -1; 81 } 82 printf("maillage %d de nom [%s] et de dimension : %d \n",i+1,maa,mdim); 83 84 /* Combien de mailles polyedres en mode nodal */ 85 if ((npoly = MEDnEntMaa(fid,maa,MED_CONN,MED_MAILLE,MED_POLYEDRE,MED_NOD)) < 0) { 86 MESSAGE("Erreur a lecture du nombre de maille MED_POLYEDRE en mode nodal"); 87 return -1; 88 } 89 printf("Nombre de mailles polyedres : %d \n",npoly); 90 91 /* Quelle taille pour le tableau des connectivites et d'indexation 92 en mode MED_NOD */ 93 if (MEDpolyedreInfo(fid,maa,MED_NOD,&nf,&taille) < 0) { 94 MESSAGE("Erreur a lecture des infos sur les polyedres"); 95 return -1; 96 } 97 printf("Taille a allouer pour la connectivite nodale des polyedres : %d \n",taille); 98 printf("Taille a allouer pour le tableau d'indexation des faces : %d \n",nf); 99 100 /* Quelle taille pour le tableau des connectivites et d'indexation 101 en mode MED_DESC */ 102 if (MEDpolyedreInfo(fid,maa,MED_DESC,&nf2,&taille2) < 0) { 103 MESSAGE("Erreur a la lecture des infos sur les polyedres"); 104 return -1; 105 } 106 printf("Taille a allouer pour la connectivite descendante des polyedres : %d \n",taille2); 107 printf("Taille a allouer pour le tableau d'indexation des types de faces : %d \n",nf2); 108 109 /* Allocation memoire : 110 * - tableau indexp et indexp2 : npoly + 1 111 * - tableau indexf et indexf2 : nf et nf2 112 * - tableau des connectivites : consize 113 * - tableaux numeros et numeros de familles : npoly 114 * - tableau des noms : MED_TAILLE_PNOM*npoly + 1 115 */ 116 indexp = (med_int *) malloc(sizeof(med_int)*(npoly+1)); 117 indexp2 = (med_int *) malloc(sizeof(med_int)*(npoly+1)); 118 indexf = (med_int *) malloc(sizeof(med_int)*nf); 119 indexf2 = (med_int *) malloc(sizeof(med_int)*nf2); 120 conn = (med_int *) malloc(sizeof(med_int)*taille); 121 conn2 = (med_int *) malloc(sizeof(med_int)*taille2); 122 num = (med_int *) malloc(sizeof(med_int)*npoly); 123 fam = (med_int *) malloc(sizeof(med_int)*npoly); 124 nom = (char *) malloc(sizeof(char)*MED_TAILLE_PNOM*npoly+1); 125 126 /* Lecture de la connectivite des mailles polyedres en mode nodal */ 127 if (MEDpolyedreConnLire(fid,maa,indexp,npoly+1,indexf,nf,conn,MED_NOD) < 0) { 128 MESSAGE("Erreur a lecture de la connectivite nodale des polyedres"); 129 ret = -1; 130 } 131 printf("Lecture de la connectivite des mailles MED_POLYEDRE en mode nodal \n"); 132 133 /* Lecture de la connectivite des mailles polyedres en mode descendant */ 134 if (ret == 0) { 135 if (MEDpolyedreConnLire(fid,maa,indexp2,npoly+1,indexf2,nf2,conn2,MED_DESC) < 0) { 136 MESSAGE("Erreur a lecture de la connectivite descendante des polyedres"); 137 ret = -1; 138 } 139 printf("Lecture de la connectivite des mailles MED_POLYEDRE en mode descendant \n"); 140 } 141 142 /* Lecture noms */ 143 if (ret == 0) { 144 if (MEDnomLire(fid,maa,nom,npoly,MED_MAILLE,MED_POLYEDRE) < 0) { 145 MESSAGE("Erreur a lecture des noms des polyedres"); 146 ret = -1; 147 } 148 printf("Lecture des noms des mailles MED_POLYEDRE \n"); 149 } 150 151 /* Lecture des numeros */ 152 if (ret == 0) { 153 if (MEDnumLire(fid,maa,num,npoly,MED_MAILLE,MED_POLYEDRE) < 0) { 154 MESSAGE("Erreur a lecture des numeros des polyedres"); 155 ret = -1; 156 } 157 printf("Lecture des numeros des mailles MED_POLYEDRE \n"); 158 } 159 160 /* Lecture des numeros de familles */ 161 if (ret == 0) { 162 if (MEDfamLire(fid,maa,fam,npoly,MED_MAILLE,MED_POLYEDRE) < 0) { 163 MESSAGE("Erreur a lecture des numeros de famille des polyedres"); 164 ret = -1; 165 } 166 printf("Lecture des numeros de familles des mailles MED_POLYEDRE \n"); 167 } 168 169 if (ret == 0) { 170 printf("Affichage des resultats \n"); 171 for (j=0;j<npoly;j++) { 172 printf(">> Maille MED_POLYEDRE %d : \n",j+1); 173 printf("---- Connectivite nodale ----- : \n"); 174 nfaces = *(indexp+j+1) - *(indexp+j); 175 /* ind1 = indice dans "indexf" pour acceder aux numeros des faces */ 176 ind1 = *(indexp+j) - 1; 177 for (k=0;k<nfaces;k++) { 178 /* ind2 = indice dans "conn" pour acceder au premier noeud de la face */ 179 ind2 = *(indexf+ind1+k) - 1; 180 nnoeuds = *(indexf+ind1+k+1) - *(indexf+ind1+k); 181 printf(" - Face %d : [ ", k+1); 182 for (l=0;l<nnoeuds;l++) 183 printf(" %d ",*(conn+ind2+l)); 184 printf(" ] \n"); 185 } 186 printf("---- Connectivite descendante ----- : \n"); 187 nfaces = *(indexp2+j+1) - *(indexp2+j); 188 /* ind1 = indice dans "conn2" pour acceder aux numeros des faces */ 189 ind1 = *(indexp2+j) - 1; 190 for (k=0;k<nfaces;k++) 191 printf(" - Face %d de numero : %d et de type %d \n", k+1,*(conn2+ind1+k),*(indexf2+ind1+k)); 192 strncpy(tmp,nom+j*MED_TAILLE_PNOM,MED_TAILLE_PNOM); 193 tmp[MED_TAILLE_PNOM] = '\0'; 194 printf("---- Nom ----- : %s \n",tmp); 195 printf("---- Numero ----- : %d \n",*(num+j)); 196 printf("---- Numero de famille ----- : %d \n",*(fam+j)); 197 } 198 } 199 200 /* liberation de la memoire */ 201 free(indexp); 202 free(indexp2); 203 free(indexf); 204 free(indexf2); 205 free(conn); 206 free(conn2); 207 free(num); 208 free(fam); 209 free(nom); 210 } 211 212 /* Fermeture du fichier */ 213 if (MEDfermer(fid) < 0) { 214 MESSAGE("Erreur a fermeture du fichier"); 215 return -1; 216 } 217 printf("Fermeture du fichier \n"); 218 219 return ret; 220 }