      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   * - Nom du fichier : test13.c
     21   *
     22   * - Description : lecture des equivalences d'un maillage MED.
     23   *
     24   *****************************************************************************/
     25
     26  #include <med.h>
     27  #include <med_utils.h>
     28  #include <stdio.h>
     29  #include <string.h>
     30  #include <stdlib.h>
     31
     32  /* On prend en compte tous les types de mailles concernees
     33     par les equivalences */
     34  #define MED_NBR_MAILLE_EQU 8
     35
     36  int main (int argc, char **argv)
     37  {
     38    med_err ret = 0;
     39    med_idt fid;
     40    char maa[MED_TAILLE_NOM+1];
     41    med_int mdim;
     42    med_int nequ,ncor;
     43    med_int *cor;
     44    char equ[MED_TAILLE_NOM+1];
     45    char des[MED_TAILLE_DESC+1];
     46    med_geometrie_element typmai[MED_NBR_GEOMETRIE_MAILLE+1] = {MED_POINT1,MED_SEG2,
     47                                    MED_SEG3,MED_TRIA3,
     48                                    MED_TRIA6,MED_QUAD4,
     49                                    MED_QUAD8,MED_POLYGONE};
     50    med_geometrie_element typfac[MED_NBR_GEOMETRIE_FACE+1] = {MED_TRIA3,MED_TRIA6,
     51                                  MED_QUAD4,MED_QUAD8,
     52                                  MED_POLYGONE};
     53    med_geometrie_element typare[MED_NBR_GEOMETRIE_ARETE] = {MED_SEG2,MED_SEG3};
     54    int i,j,k;
     55    med_maillage type;
     56
     57    if (argc != 2) {
     58      MESSAGE("Il faut passer un fichier MED en paramètre");
     59      return -1;
     60    }
     61
     62    /* Ouverture du fichier passe en argument en lecture seule */
     63    if ((fid = MEDouvrir(argv[1],MED_LECTURE)) < 0) {
     64      MESSAGE("Erreur a l'ouverture du fichier : "); SSCRUTE(argv[1]);
     65      return -1;
     66    }
     67
     68    /* Lecture des infos sur le premier maillage */
     69    if (MEDmaaInfo(fid,1,maa,&mdim,&type,des) < 0) {
     70      MESSAGE("Erreur a lecture des infos sur le 1er maillage");
     71      return -1;
     72    }
     73    printf("Maillage de nom %s et de dimension %d \n",maa,mdim);
     74
     75    /* Lecture du nombre d'equivalence */
     76    if ((nequ = MEDnEquiv(fid,maa)) < 0) {
     77      MESSAGE("Erreur a la lecture du nombre d'equivalence");
     78      return -1;
     79    }
     80    printf("Nombre d'equivalences : %d \n",nequ);
     81
     82    /* Lecture de toutes les equivalences du maillage */
     83    if (nequ > 0)
     84      for (i = 0;i<nequ;i++) {
     85        printf("Equivalence numero : %d \n",i+1);
     86
     87        /* Lecture des infos sur l'equivalence */
     88        if (MEDequivInfo(fid,maa,i+1,equ,des) < 0) {
     89          MESSAGE("Erreur a la lecture de l'equivalence d'indice");
     90          ISCRUTE(i+1);
     91          return -1;
     92        }
     93        printf("Nom de l'equivalence: %s \n",equ);
     94        printf("Description de l'equivalence : %s \n",des);
     95
     96        /* Lecture des correspondances sur les differents types d'entites */
     97
     98        /* Les noeuds */
     99        if ((ncor = MEDnCorres(fid,maa,equ,MED_NOEUD,0)) < 0) {
    100          MESSAGE("Erreur a la lecture du nombre de correspondance sur les noeuds");
    101          return -1;
    102        }
    103        printf("Il y a %d correspondances sur les noeuds \n",ncor);
    104        if (ncor > 0) {
    105          cor = (med_int*) malloc(sizeof(med_int)*ncor*2);
    106          if (MEDequivLire(fid,maa,equ,cor,ncor,MED_NOEUD,0) < 0) {
    107              MESSAGE("Erreur a la lecture des correspondances sur les noeuds");
    108              ret = -1;
    109          }
    110        if (ret == 0)
    111          for (j=0;j<ncor;j++)
    112              printf("Correspondance %d : %d et %d \n",j+1,*(cor+2*j),
    113              *(cor+2*j+1));
    114          free(cor);
    115        }
    116
    117        /* Les mailles : on ne prend pas en compte les mailles 3D */
    118        if (ret == 0)
    119          for (j=0;j<MED_NBR_MAILLE_EQU;j++) {
    120
    121              if ((ncor = MEDnCorres(fid,maa,equ,MED_MAILLE,typmai[j])) < 0) {
    122                  MESSAGE("Erreur a la lecture du nombre de correspondance sur les mailles : ");
    123                  ISCRUTE(typmai[j]);
    124                  return -1;
    125              }
    126              printf("Il y a %d correspondances sur les mailles %d \n",ncor,
    127              typmai[j]);
    128              if (ncor > 0) {
    129                  cor = (med_int*) malloc(sizeof(med_int)*ncor*2);
    130                  if (MEDequivLire(fid,maa,equ,cor,ncor,MED_MAILLE,
    131                       typmai[j]) < 0) {
    132                      MESSAGE("Erreur a la lecture des correspondances sur les mailles : ");
    133                      ISCRUTE(typmai[j]);
    134                      ret = -1;
    135              }
    136              if (ret == 0)
    137                  for (k=0;k<ncor;k++)
    138                      printf("Correspondance %d : %d et %d \n",k+1,*(cor+2*k),
    139                      *(cor+2*k+1));
    140                  free(cor);
    141        }
    142      }
    143
    144        /* Les faces */
    145        if (ret == 0)
    146          for (j=0;j<MED_NBR_GEOMETRIE_FACE+1;j++) {
    147              if ((ncor = MEDnCorres(fid,maa,equ,MED_FACE,typfac[j])) < 0) {
    148                  MESSAGE("Erreur a la lecture du nombre de correspondance sur les faces : ");
    149                  ISCRUTE(typfac[j]);
    150          return -1;
    151          }
    152          printf("Il y a %d correspondances sur les faces %d \n",ncor,
    153               typfac[j]);
    154          if (ncor > 0) {
    155              cor = (med_int*) malloc(sizeof(med_int)*ncor*2);
    156              if (MEDequivLire(fid,maa,equ,cor,ncor,MED_FACE,
    157                       typfac[j]) < 0) {
    158                  MESSAGE("Erreur a la lecture des correspondances sur les faces : ");
    159                  ISCRUTE(typfac[j]);
    160                  ret = -1;
    161              }
    162              if (ret == 0)
    163                  for (k=0;k<ncor;k++)
    164                      printf("Correspondance %d : %d et %d \n",k+1,*(cor+2*k),
    165                          *(cor+2*k+1));
    166                  free(cor);
    167              }
    168          }
    169
    170        /*  Les aretes */
    171        if (ret == 0)
    172          for (j=0;j<MED_NBR_GEOMETRIE_ARETE;j++) {
    173              if ((ncor = MEDnCorres(fid,maa,equ,MED_ARETE,typare[j])) < 0) {
    174                  MESSAGE("Erreur a la lecture du nombre de correspondance sur les aretes : ");
    175                  ISCRUTE(typare[j]);
    176                  return -1;
    177              }
    178              printf("Il y a %d correspondances sur les aretes %d \n",ncor,
    179                  typare[j]);
    180              if (ncor > 0) {
    181                  cor = (med_int*) malloc(sizeof(med_int)*ncor*2);
    182              if (MEDequivLire(fid,maa,equ,cor,ncor,MED_ARETE,
    183                         typare[j]) < 0) {
    184                  MESSAGE("Erreur a la lecture des correspondances sur les faces : ");
    185                  ISCRUTE(typare[j]);
    186                  ret = -1;
    187              }
    188              if (ret == 0)
    189                  for (k=0;k<ncor;k++)
    190                      printf("Correspondance %d : %d et %d \n",k+1,*(cor+2*k),
    191                          *(cor+2*k+1));
    192                  free(cor);
    193              }
    194          }
    195
    196      }
    197
    198    /* Fermeture du fichier */
    199    if (MEDfermer(fid) < 0) {
    200      MESSAGE("Erreur a la fermeture du fichier ");
    201      return -1;
    202    }
    203
    204    return ret;
    205  }