      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