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  * - Nom du fichier : test30.c
 21  *
 22  * - Description : lecture des joints d'un maillage MED.
 23  *
 24  *****************************************************************************/
 25 
 26 #include <med.h>
 27 #define MESGERR
 28 #include <med_utils.h>
 29 
 30 #ifdef DEF_LECT_ECR
 31 #define MODE_ACCES MED_LECTURE_ECRITURE
 32 #elif DEF_LECT_AJOUT
 33 #define MODE_ACCES MED_LECTURE_AJOUT
 34 #else
 35 #define MODE_ACCES MED_CREATION
 36 #endif
 37 
 38 int afficheCorres(med_idt fid, char *maa, char *jnt,
 39                  med_entite_maillage typ_ent_local,   med_geometrie_element typ_geo_local,
 40                  med_entite_maillage typ_ent_distant, med_geometrie_element typ_geo_distant,
 41                  char *type);
 42 
 43 int main (int argc, char **argv)
 44 
 45 
 46 {
 47   med_err ret = 0;
 48   med_idt fid;
 49   char maa[MED_TAILLE_NOM+1],maa_dist[MED_TAILLE_NOM+1];
 50   med_int mdim;
 51   med_int njnt,ncor,ndom,nc;
 52   char jnt[MED_TAILLE_NOM+1],corr[MED_TAILLE_NOM+1];
 53   char des[MED_TAILLE_DESC+1];
 54   med_entite_maillage typ_ent_local,typ_ent_distant;
 55   med_geometrie_element typ_geo_local,typ_geo_distant;
 56 
 57   int i,j,k;
 58   med_maillage type;
 59 
 60   if (argc != 2) {
 61     MESSAGE("Il faut passer un fichier MED en paramètre");
 62     return -1;
 63   }
 64 
 65   /* Ouverture du fichier passe en argument en lecture seule */
 66   if ((fid = MEDouvrir(argv[1],MED_LECTURE)) < 0) {
 67     MESSAGE("Erreur a l'ouverture du fichier : "); SSCRUTE(argv[1]);
 68     return -1;
 69   }
 70 
 71   /* Lecture des infos sur le premier maillage */
 72   if (MEDmaaInfo(fid,1,maa,&mdim,&type,des) < 0) {
 73     MESSAGE("Erreur a lecture des infos sur le 1er maillage");
 74     return -1;
 75   }
 76   printf("Maillage de nom %s et de dimension %d \n",maa,mdim);
 77 
 78   /* Lecture du nombre de joints */
 79   if ((njnt = MEDnJoint(fid,maa)) < 0) {
 80     MESSAGE("Erreur a la lecture du nombre de joints");
 81     return -1;
 82   }
 83   printf("Nombre de joints : %d \n",njnt);
 84 
 85   /* Lecture de tous les joints du maillage */
 86   if (njnt > 0)
 87     for (i = 0;i<njnt;i++) {
 88       printf("Joint numero : %d \n",i+1);
 89 
 90       /* Lecture des infos sur le joints */
 91       if (MEDjointInfo(fid,maa,i+1,jnt,des,&ndom,maa_dist) < 0) {
 92         MESSAGE("Erreur a la lecture du joint d'indice");
 93         ISCRUTE(i+1);
 94         return -1;
 95       }
 96       printf("Nom du joint: %s \n",jnt);
 97       printf("Description du joint      : %s \n",des);
 98       printf("Domaine en regard         : %d \n",ndom);
 99       printf("Maillage distant          : %s \n",maa_dist);
100 
101 
102 
103       /* lecture des correspondances une par une 
104          en connaissant leur type a priori */
105 
106       /* Lecture de la correspondance Noeud Noeud */
107       afficheCorres(fid,maa,jnt,MED_NOEUD,0,MED_NOEUD,0,"noeud/noeud");
108 
109       /* Lecture de la correspondance Noeud Maille */
110       afficheCorres(fid,maa,jnt,MED_NOEUD,0,MED_MAILLE,MED_TRIA3,"noeud/TRIA3");
111 
112 
113       /* lecture des correspondances une par une 
114          sans connaitre leur type a priori 
115          -> utilisation de la fonction MEDjointTypeCorres */
116 
117       ncor=1;
118 
119       while (MEDjointTypeCorres(fid,maa,jnt,ncor,
120                                 &typ_ent_local,&typ_geo_local,&typ_ent_distant,&typ_geo_distant)>=0) {
121 
122         /* Lecture de la correspondance Noeud Noeud */
123         afficheCorres(fid,maa,jnt,typ_ent_local,typ_geo_local,typ_ent_distant,typ_geo_distant,"noeud/noeud");
124 
125         ncor++;
126       }
127 
128 
129 
130     }
131 
132   /* Fermeture du fichier */
133   if (MEDfermer(fid) < 0) {
134     MESSAGE("Erreur a la fermeture du fichier ");
135     return -1;
136   }
137 
138   return ret;
139 }
140 
141 
142 
143 
144 int afficheCorres(med_idt fid, char *maa, char *jnt,
145                  med_entite_maillage typ_ent_local,   med_geometrie_element typ_geo_local,
146                  med_entite_maillage typ_ent_distant, med_geometrie_element typ_geo_distant,
147                  char *type)
148 {
149   med_int nc;
150   med_int *cortab;
151   int k,ncor,ret=0;
152 
153   if ((nc = MEDjointnCorres(fid,maa,jnt,typ_ent_local,typ_geo_local,typ_ent_distant,typ_geo_distant)) < 0) {
154     MESSAGE("Erreur a la lecture des infos sur le nombre d'entite en regard de type");
155     SSCRUTE(type);
156     return -1;
157   }
158 
159   printf("nb de couples d'entites en regard %s: %d \n",type,nc);
160 
161   if (nc > 0) {
162     cortab = (med_int*) malloc(sizeof(med_int)*nc*2);
163     if (ret =MEDjointLire(fid,maa,jnt,cortab,nc*2,
164                          typ_ent_local,typ_geo_local,typ_ent_distant,typ_geo_distant) < 0) {
165       MESSAGE("Erreur a la lecture des correspondances sur ");
166       SSCRUTE(type);
167       ret = -1;
168     }
169     if (ret == 0)
170       for (k=0;k<nc;k++)
171         printf("Correspondance %d : %d et %d \n",k+1,*(cortab+2*k),
172                *(cortab+2*k+1));
173     free(cortab);
174   }
175   return ret;
176 }
177