      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 : test28.c
     21  *
     22  * - Description : lecture d'un maillage structure (grille cartesienne |
     23  *                 grille polaire) dans le fichier test27.med
     24  *
     25  *****************************************************************************/
     26
     27 #include <med.h>
     28 #define MESGERR
     29 #include <med_utils.h>
     30
     31 #ifdef DEF_LECT_ECR
     32 #define MODE_ACCES MED_LECTURE_ECRITURE
     33 #elif DEF_LECT_AJOUT
     34 #define MODE_ACCES MED_LECTURE_AJOUT
     35 #else
     36 #define MODE_ACCES MED_CREATION
     37 #endif
     38
     39 int main (int argc, char **argv)
     40
     41
     42 {
     43   int i;
     44   med_err ret = 0;
     45   med_idt fid;
     46   /* la dimension du maillage */
     47   med_int mdim,axe,j;
     48   med_float *indices;
     49   med_int nind,nmaa;
     50   /* nom du maillage de longueur maxi MED_TAILLE_NOM */
     51   char maa[MED_TAILLE_NOM+1];
     52   /* composantes et unites */
     53   char comp[MED_TAILLE_PNOM+1];
     54   char unit[MED_TAILLE_PNOM+1];
     55   char desc[MED_TAILLE_DESC+1];
     56   med_maillage type_maillage;
     57   med_type_grille type;
     58   med_table quoi;
     59   med_int nnoeuds;
     60   char *comp2, *unit2;
     61   med_float *coo;
     62   med_int *structure_grille;
     63   med_repere repere;
     64
     65   /* Ouverture du fichier test17.med en lecture seule */
     66   fid = MEDouvrir("test27.med",MED_LECTURE);
     67   if (fid < 0) {
     68     MESSAGE("Erreur a l'ouverture du fichier test27.med");
     69     return -1;
     70   }
     71
     72   /* Lecture du nombre de maillage */
     73   nmaa = MEDnMaa(fid);
     74   if (nmaa < 0) {
     75     MESSAGE("Erreur a la lecture du nombre de maillage");
     76     return -1;
     77   }
     78
     79   /* On boucle sur les maillages et on ne lit que la grille cartesienne
     80      et la grille desturcutree */
     81   for (i=0;i<nmaa;i++) {
     82
     83     /* On repere le maillage qui nous interesse */
     84     if (MEDmaaInfo(fid,i+1,maa,&mdim,&type_maillage,desc) < 0) {
     85       MESSAGE("Erreur a la lecture des infos sur le maillage");
     86       return -1;
     87     }
     88     printf("Maillage de nom [%s] de dimension %d \n",maa,mdim);
     89     if (type_maillage == MED_STRUCTURE)
     90       printf("- Type : Maillage structure \n");
     91     else
     92       printf("- Type : Maillage non structure \n");
     93
     94     /* On regarde le type de la grille */
     95     if (type_maillage == MED_STRUCTURE) {
     96       if (MEDnatureGrilleLire(fid,maa,&type) < 0) {
     97         MESSAGE("Erreur a la lecture de la nature d'une grille");
     98         return -1;
     99       }
    100       if (type == MED_GRILLE_CARTESIENNE)
    101         printf("- Grille cartesienne \n");
    102       if (type == MED_GRILLE_STANDARD)
    103         printf("- Grille de-structureee \n");
    104     }
    105
    106     /* On regarde les coordonnees de la grille standard */
    107     if (type_maillage == MED_STRUCTURE && type == MED_GRILLE_STANDARD) {
    108
    109       nnoeuds = MEDnEntMaa(fid,maa,MED_COOR,MED_NOEUD,0,0);
    110       if (nnoeuds < 0) {
    111         MESSAGE("Erreur a la lecture du nombre de noeuds");
    112         return -1;
    113       }
    114       printf("Nombre de noeuds : %d \n",nnoeuds);
    115
    116       structure_grille = (med_int *) malloc(sizeof(med_int)*mdim);
    117       if (MEDstructureCoordLire(fid,maa,mdim,structure_grille) < 0) {
    118         MESSAGE("Erreur a la lecture de la structure de la grille");
    119         ret = -1;
    120       }
    121       if (ret == 0) {
    122         printf("Structure des noeuds de la grille : [ ");
    123         for (j=0;j<mdim;j++)
    124           printf(" %d ",*(structure_grille+j));
    125         printf(" ] \n");
    126         free(structure_grille);
    127       }
    128
    129       if (ret == 0) {
    130         coo = (med_float *) malloc(sizeof(med_float)*nnoeuds*mdim);
    131         comp2 = (char *) malloc(sizeof(char)*(mdim*MED_TAILLE_PNOM+1));
    132         unit2 = (char *) malloc(sizeof(char)*(mdim*MED_TAILLE_PNOM+1));
    133
    134         if (ret = MEDcoordLire(fid,maa,mdim,coo,MED_FULL_INTERLACE,MED_ALL,NULL,0,
    135                                &repere,comp2,unit2) < 0) {
    136           MESSAGE("Erreur a la lecture des coordonnees des noeuds");
    137           ret = -1;
    138         }
    139       }
    140
    141       if (ret == 0) {
    142         printf("Coordonnees : [ ");
    143         for (j=0;j<nnoeuds*mdim;j++)
    144           printf(" %f ",*(coo+j));
    145         printf(" ] \n");
    146         free(coo);
    147         free(comp2);
    148         free(unit2);
    149       }
    150     }
    151
    152     /* On regarde les coordonnees des indices de la grille cartesienne */
    153     if (type_maillage == MED_STRUCTURE && type == MED_GRILLE_CARTESIENNE)
    154       for(axe=1;axe<=mdim;axe++) {
    155         switch(axe) {
    156         case 1 :
    157           quoi = MED_COOR_IND1;
    158           break;
    159
    160         case 2 :
    161           quoi = MED_COOR_IND2;
    162           break;
    163
    164         case 3 :
    165           quoi = MED_COOR_IND3;
    166           break;
    167
    168         default :
    169           return -1;
    170         }
    171
    172         nind = MEDnEntMaa(fid,maa,quoi,MED_NOEUD,0,0);
    173         if (nind < 0) {
    174           MESSAGE("Erreur a la lecture de la taille de l'indice");
    175           return -1;
    176         }
    177         printf("Lecture de la taille de l'indice : %d \n",nind);
    178
    179           /* on lit le tableau des indices */
    180         indices = (med_float *) malloc(sizeof(med_float)*nind);
    181         if (MEDindicesCoordLire(fid,maa,mdim,indices,nind,axe,comp,unit) < 0) {
    182           MESSAGE("Erreur a lecture de indices de coordonnees");
    183           ret = -1;
    184         }
    185         if (ret == 0) {
    186           printf("Axe %s [%s] : [ ",comp,unit);
    187           for (j=0;j<nind;j++)
    188             printf(" %f ",indices[j]);
    189           printf(" ] \n");
    190           free(indices);
    191         }
    192       }
    193   }
    194
    195   /* On ferme le fichier */
    196   if (MEDfermer(fid) < 0) {
    197     MESSAGE("Erreur a la fermeture du fichier");
    198     return -1;
    199   }
    200   printf("Fermeture du fichier \n");
    201
    202   return ret;
    203 }