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