00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <med.h>
00026 #define MESGERR 1
00027 #include "med_utils.h"
00028 #include <string.h>
00029
00030 #ifdef DEF_LECT_ECR
00031 #define MODE_ACCES MED_LECTURE_ECRITURE
00032 #elif DEF_LECT_AJOUT
00033 #define MODE_ACCES MED_LECTURE_AJOUT
00034 #else
00035 #define MODE_ACCES MED_CREATION
00036 #endif
00037
00038 #ifndef USER_INTERLACE
00039 #define USER_INTERLACE MED_FULL_INTERLACE
00040 #endif
00041
00042 #define USER_MODE MED_COMPACT
00043
00044 med_err getFieldsOn(med_idt fid, char * nomcha, med_type_champ typcha, med_int ncomp,
00045 med_entite_maillage entite, med_mode_switch stockage);
00046
00047 int main (int argc, char **argv)
00048
00049
00050 {
00051 med_err ret,lret;
00052 med_idt fid;
00053 char * fichier = NULL;
00054 char maa[MED_TAILLE_NOM+1]="";
00055 char desc[MED_TAILLE_DESC+1]="";
00056 char pflname[MED_TAILLE_NOM+1]="",nomlien[MED_TAILLE_NOM+1]="";
00057 char locname[MED_TAILLE_NOM+1]="";
00058 char * lien = NULL;
00059 char *comp= NULL, *unit= NULL;
00060 char nomcha [MED_TAILLE_NOM+1]="";
00061 med_int mdim,ncomp,ncha,npro,nln,pflsize,*pflval,nval;
00062 med_int ngauss,nloc;
00063 int t1,t2,t3;
00064 med_type_champ typcha;
00065 med_maillage type;
00066 med_geometrie_element type_geo;
00067 med_float *refcoo, *gscoo, *wg;
00068 int i,j;
00069
00070 if (argc != 2) {
00071 MESSAGE("Aucun nom de fichier precise, fichier test10.med utilise ");
00072 fichier = "test10.med";
00073 } else {
00074 fichier = argv[1];
00075 };
00076
00077
00078
00079 if ((fid = MEDouvrir(fichier,MED_LECTURE)) < 0){
00080 MESSAGE("Erreur a l'ouverture du fichier : ");SSCRUTE(fichier);
00081 return -1;
00082 }
00083
00084 ret = 0;
00085
00086
00087 if ( MEDmaaInfo(fid,1,maa,&mdim,&type,desc) < 0 ) {
00088 MESSAGE("Erreur a la lecture des informations sur le maillage : ");
00089 SSCRUTE(maa);ISCRUTE(mdim);ISCRUTE_int(type);SSCRUTE(desc);
00090 return -1;
00091 }
00092
00093 printf("Maillage de nom |%s| et de dimension "IFORMAT" \n",maa,mdim);
00094
00095
00096 if ((ncha = MEDnChamp(fid,0)) < 0) {
00097 MESSAGE("Impossible de lire le nombre de champs : ");ISCRUTE(ncha);
00098 return ncha;
00099 }
00100
00101 printf("Nombre de champs : "IFORMAT" \n",ncha);
00102
00103
00104 for (i =0;i<ncha;i++) {
00105 lret = 0;
00106 printf("\nChamp numero : %d \n",i+1);
00107
00108
00109 if ((ncomp = MEDnChamp(fid,i+1)) < 0) {
00110 MESSAGE("Erreur a la lecture du nombre de composantes : "); ISCRUTE(ncomp);
00111 ret = -1; continue;
00112 }
00113
00114
00115 comp = (char*) malloc(ncomp*MED_TAILLE_PNOM+1);
00116 EXIT_IF(comp == NULL,NULL,NULL);
00117 unit = (char*) malloc(ncomp*MED_TAILLE_PNOM+1);
00118 EXIT_IF(unit == NULL,NULL,NULL);
00119
00120 if ( MEDchampInfo(fid,i+1,nomcha,&typcha,comp,unit,ncomp) < 0 ) {
00121 MESSAGE("Erreur a la demande d'information sur les champs : ");
00122 ISCRUTE_int(i+1);SSCRUTE(nomcha);ISCRUTE_int(typcha);SSCRUTE(comp);SSCRUTE(unit);
00123 ISCRUTE(ncomp);
00124 ret = -1; continue;
00125 }
00126
00127 printf("Nom du champ : |%s| de type %d\n",nomcha,typcha);
00128 printf("Nom des composantes : |%s|\n",comp);
00129 printf("Unites des composantes : |%s| \n",unit);
00130
00131 free(comp);
00132 free(unit);
00133
00134
00135 lret = getFieldsOn(fid, nomcha, typcha, ncomp, MED_NOEUD, USER_INTERLACE );
00136
00137 if (lret == 0) lret = getFieldsOn(fid, nomcha, typcha, ncomp, MED_MAILLE, USER_INTERLACE );
00138 else { MESSAGE("Erreur a la lecture des champs aux noeuds "); ret = -1; continue;}
00139
00140 if (lret == 0) lret = getFieldsOn(fid, nomcha, typcha, ncomp, MED_FACE,USER_INTERLACE);
00141 else { MESSAGE("Erreur a la lecture des champs aux mailles "); ret = -1; continue;}
00142
00143 if (lret == 0) lret = getFieldsOn(fid, nomcha, typcha, ncomp, MED_ARETE,USER_INTERLACE);
00144 else {MESSAGE("Erreur a la lecture des champs aux faces "); ret = -1; continue;}
00145
00146 if (lret == 0) lret = getFieldsOn(fid, nomcha, typcha, ncomp, MED_NOEUD_MAILLE,USER_INTERLACE);
00147 else {MESSAGE("Erreur a la lecture des champs aux aretes"); ret = -1; continue;}
00148
00149 if (lret != 0) {MESSAGE("Erreur a la lecture des champs aux noeuds des mailles "); ret = -1;};
00150 }
00151
00152
00153
00154 npro = MEDnProfil(fid);
00155
00156 printf("\nNombre de profils stockes : "IFORMAT"\n\n",npro);
00157 for (i=1 ; i <= npro ; i++ ) {
00158 if ( MEDprofilInfo(fid, i, pflname, &nval) < 0) {
00159 MESSAGE("Erreur a la demande d'information sur le profil n° : "); ISCRUTE_int(i);
00160 ret = -1;continue;
00161 }
00162 printf("\t- Profil n°%i de nom |%s| et de taille "IFORMAT"\n",i,pflname,nval);
00163 pflval = (med_int*) malloc(sizeof(med_int)*nval);
00164 if ( MEDprofilLire(fid, pflval, pflname) < 0) {
00165 MESSAGE("Erreur a la lecture des valeurs du profil : ");
00166 SSCRUTE(pflname);
00167 ret = -1;
00168 } else {
00169 printf("\t");
00170 for (j=0;j<nval;j++) printf(" "IFORMAT" ",*(pflval+j));
00171 printf("\n\n");
00172 }
00173 free(pflval);
00174 }
00175
00176
00177 nln = MEDnLien(fid);
00178
00179 printf("\nNombre de liens stockes : "IFORMAT"\n\n",nln);
00180 for (i=1 ; i <= nln ; i++ ) {
00181 if ( MEDlienInfo(fid, i, nomlien, &nval) < 0) {
00182 MESSAGE("Erreur a la demande d'information sur le lien n° : "); ISCRUTE_int(i);
00183 ret = -1;continue;
00184 }
00185 printf("\t- Lien n°%i de nom |%s| et de taille "IFORMAT"\n",i,nomlien,nval);
00186
00187 lien = malloc((nval+1)*sizeof(char));
00188 EXIT_IF(lien == NULL,NULL,NULL);
00189
00190 if ( MEDlienLire(fid, lien, nomlien) < 0 ) {
00191 MESSAGE("Erreur a la lecture du lien : ");
00192 SSCRUTE(nomlien);SSCRUTE(lien);
00193 ret = -1;
00194 } else {
00195 lien[nval] = '\0';
00196 printf("\t\t|%s|\n\n",lien);
00197 }
00198 free(lien);
00199 }
00200
00201
00202 nloc = MEDnGauss(fid);
00203
00204 printf("\nNombre de localisations stockees : "IFORMAT"\n\n",nloc);
00205 for (i=1 ; i <= nloc ; i++ ) {
00206 if ( MEDgaussInfo(fid, i, locname, &type_geo, &ngauss) < 0) {
00207 MESSAGE("Erreur a la demande d'information sur la localisation n° : "); ISCRUTE_int(i);
00208 ret = -1;continue;
00209 }
00210 printf("\t- Loc. n°%i de nom |%s| et nbr. de pts de GAUSS "IFORMAT"\n",i,locname,ngauss);
00211 t1 = (type_geo%100)*(type_geo/100);
00212 t2 = ngauss*(type_geo/100);
00213 t3 = ngauss;
00214 refcoo = (med_float *) malloc(sizeof(med_float)*t1 );
00215 gscoo = (med_float *) malloc(sizeof(med_float)*t2 );
00216 wg = (med_float *) malloc(sizeof(med_float)*t3 );
00217
00218 if ( MEDgaussLire(fid, refcoo, gscoo, wg, USER_INTERLACE, locname ) < 0) {
00219 MESSAGE("Erreur a la lecture des valeurs de la localisation : ");
00220 SSCRUTE(locname);
00221 ret = -1;
00222 } else {
00223 printf("\t Coordonnees de l'element de reference de type %i :\n\t\t",type_geo);
00224 for (j=0;j<t1;j++) printf(" %f ",*(refcoo+j));
00225 printf("\n");
00226 printf("\t Localisation des points de GAUSS : \n\t\t");
00227 for (j=0;j<t2;j++) printf(" %f ",*(gscoo+j));
00228 printf("\n");
00229 printf("\t Poids associes aux points de GAUSS :\n\t\t");
00230 for (j=0;j<t3;j++) printf(" %f ",*(wg+j));
00231 printf("\n\n");
00232 }
00233 free(refcoo);
00234 free(gscoo);
00235 free(wg);
00236 }
00237
00238
00239
00240 if ( MEDfermer(fid) < 0) return -1;
00241
00242 return ret;
00243 }
00244
00245 med_err getFieldsOn(med_idt fid, char * nomcha, med_type_champ typcha, med_int ncomp,
00246 med_entite_maillage entite, med_mode_switch stockage) {
00247
00248 int j,k,l,m,n,nb_geo;
00249 med_int nbpdtnor=0,pflsize,*pflval,ngauss=0,ngroup,*vale=NULL,nval;
00250 med_int numdt=0,numo=0,lnsize,nbrefmaa;
00251 med_float *valr=NULL,dt=0.0;
00252 med_err ret=0;
00253 med_booleen local;
00254 char pflname [MED_TAILLE_NOM+1]="";
00255 char locname [MED_TAILLE_NOM+1]="";
00256 char * lien = NULL;
00257 char maa_ass [MED_TAILLE_NOM+1]="";
00258 char dt_unit [MED_TAILLE_PNOM+1]="";
00259
00260
00261 med_geometrie_element * type_geo;
00262 med_geometrie_element typ_noeud[1] = { MED_NONE };
00263 med_geometrie_element typmai[MED_NBR_GEOMETRIE_MAILLE+2] = {MED_POINT1, MED_SEG2, MED_SEG3, MED_TRIA3,
00264 MED_QUAD4, MED_TRIA6,MED_QUAD8, MED_TETRA4,
00265 MED_PYRA5, MED_PENTA6, MED_HEXA8, MED_TETRA10,
00266 MED_PYRA13, MED_PENTA15, MED_HEXA20,
00267 MED_POLYGONE, MED_POLYEDRE};
00268 med_geometrie_element typfac[MED_NBR_GEOMETRIE_FACE+1] = {MED_TRIA3,MED_TRIA6,
00269 MED_QUAD4,MED_QUAD8,
00270 MED_POLYGONE};
00271 med_geometrie_element typare[MED_NBR_GEOMETRIE_ARETE] = {MED_SEG2,MED_SEG3};
00272
00273 char ** AFF;
00274
00275 switch (entite) {
00276 case MED_NOEUD :
00277 type_geo = typ_noeud;
00278 nb_geo = 1;
00279 AFF = MED_GEOMETRIE_NOEUD_AFF;
00280 break;
00281 case MED_MAILLE :
00282 case MED_NOEUD_MAILLE :
00283 type_geo = typmai;
00284 nb_geo = MED_NBR_GEOMETRIE_MAILLE+2;
00285 AFF = MED_GEOMETRIE_MAILLE_AFF;
00286 break;
00287 case MED_FACE :
00288 type_geo = typfac;
00289 nb_geo = MED_NBR_GEOMETRIE_FACE+1;
00290 AFF = MED_GEOMETRIE_FACE_AFF;
00291 break;
00292 case MED_ARETE :
00293 type_geo = typare;
00294 nb_geo = MED_NBR_GEOMETRIE_ARETE;
00295 AFF = MED_GEOMETRIE_ARETE_AFF;
00296 break;
00297 }
00298
00299
00300 for (k=0;k<nb_geo;k++) {
00301
00302
00303 nbpdtnor = MEDnPasdetemps(fid,nomcha,entite,type_geo[k]);
00304 if (nbpdtnor < 1 ) continue;
00305
00306 for (j=0;j<nbpdtnor;j++) {
00307
00308 if ( MEDpasdetempsInfo(fid,nomcha,entite,type_geo[k],
00309 j+1, &ngauss, &numdt, &numo, dt_unit,
00310 &dt, maa_ass, &local, &nbrefmaa) <0) {
00311 MESSAGE("Erreur a la demande d'information sur (pdt,nor) : ");
00312 ISCRUTE(numdt); ISCRUTE(numo);
00313 ret = -1; continue;
00314 };
00315
00316 printf("\n +Pas de Temps n."IFORMAT" (%f) [%s], n. d'ordre "IFORMAT", avec "IFORMAT" pts de gauss sur le maillage par defaut.\n",numdt,dt,dt_unit,numo,ngauss);
00317
00318 printf("\tLe maillage par defaut est : |%s|, sur un total de : "IFORMAT" maillages associes\n",
00319 maa_ass, nbrefmaa);
00320
00321
00322 if ( !local ) {
00323
00324 if ( (lnsize=MEDnValLien(fid,maa_ass) ) < 0 ) {
00325 MESSAGE("Erreur a la lecture de la taille du lien : ");
00326 SSCRUTE(maa_ass);
00327 ret = -1;
00328 } else {
00329
00330 lien = malloc(lnsize*sizeof(char)+1);
00331 EXIT_IF(lien == NULL,NULL,NULL);
00332 if ( MEDlienLire(fid, lien, maa_ass) < 0 ) {
00333 MESSAGE("Erreur a la lecture du lien : ");
00334 SSCRUTE(maa_ass);SSCRUTE(lien);
00335 ret = -1;
00336 } else {
00337 printf("\tLe maillage |%s| est porte par un fichier distant |%s|\n",maa_ass,lien);
00338 }
00339 free(lien);
00340 }
00341 }
00342
00343
00344
00345 if ( (nbrefmaa = MEDnChampRef(fid,nomcha,entite,type_geo[k],numdt,numo) ) < 0 ) {
00346 MESSAGE("Erreur a la demande du nombre de maillages references par le champ : ");
00347 SSCRUTE(nomcha);
00348 ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
00349 SSCRUTE(MED_ENTITE_MAILLAGE_AFF[(int)entite]);SSCRUTE(AFF[k]);
00350 ISCRUTE(numdt); ISCRUTE(numo);
00351 ret = -1; continue;
00352 };
00353
00354 for (l=0;l<nbrefmaa;l++) {
00355
00356 if ( MEDchampRefInfo(fid,nomcha,entite,type_geo[k],
00357 l+1,numdt, numo, maa_ass, &local, &ngauss) <0 ) {
00358 MESSAGE("Erreur a la demande d'information sur le maillage utilise par le champ n° : ");
00359 SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
00360 ISCRUTE_int(l+1);ISCRUTE(numdt); ISCRUTE(numo);SSCRUTE(maa_ass);
00361 ret = -1; continue;
00362 };
00363
00364
00365 if ((nval = MEDnVal(fid,nomcha,entite,type_geo[k],numdt,numo,maa_ass,USER_MODE)) <= 0) {
00366 MESSAGE("Erreur a la lecture du nombre de valeurs du champ : ");
00367 SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
00368 ISCRUTE(numdt);ISCRUTE(numo);SSCRUTE(maa_ass);ISCRUTE_int(USER_MODE);
00369 ret = -1; continue;
00370 };
00371
00372
00373 printf("\t- Il y a "IFORMAT" valeurs en mode %i. Chaque entite %s\
00374 de type geometrique %s associes au maillage |%s| a "IFORMAT" pts de gauss \n",
00375 nval,USER_MODE,MED_ENTITE_MAILLAGE_AFF[(int)entite],AFF[k],maa_ass,ngauss);
00376
00377
00378 if ( !local ) {
00379
00380 if ( (lnsize=MEDnValLien(fid,maa_ass) ) < 0 ) {
00381 MESSAGE("Erreur a la lecture de la taille du lien : ");
00382 SSCRUTE(maa_ass);
00383 ret = -1;
00384 } else {
00385
00386 lien = malloc(lnsize*sizeof(char) + 1);
00387 EXIT_IF(lien == NULL,NULL,NULL);
00388
00389 if ( MEDlienLire(fid, lien, maa_ass) < 0 ) {
00390 MESSAGE("Erreur a la lecture du lien : ");
00391 SSCRUTE(maa_ass);SSCRUTE(lien);
00392 ret = -1;
00393 } else {
00394 lien[lnsize] = '\0';
00395 printf("\tLe maillage |%s| est porte par un fichier distant |%s|\n",maa_ass,lien);
00396 }
00397 free(lien);
00398 }
00399 }
00400
00401
00402 if (typcha == MED_FLOAT64) {
00403
00404 valr = (med_float*) calloc(ncomp*nval,sizeof(med_float));
00405 EXIT_IF(valr == NULL,NULL,NULL);
00406 if ( MEDchampLire(fid,maa_ass,nomcha,(unsigned char*)valr,stockage,MED_ALL,locname,
00407 pflname,USER_MODE,entite,type_geo[k],numdt,numo) < 0 ) {
00408 MESSAGE("Erreur a la lecture du nombre de valeurs du champ : ");
00409 SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
00410 ISCRUTE(numdt);ISCRUTE(numo);SSCRUTE(maa_ass);
00411 ret = -1;
00412 };
00413
00414 } else {
00415
00416 vale = (med_int*) calloc(ncomp*nval,sizeof(med_int));
00417 EXIT_IF(vale == NULL,NULL,NULL);
00418 if ( MEDchampLire(fid,maa_ass,nomcha,(unsigned char*)vale,stockage,MED_ALL,locname,
00419 pflname,USER_MODE,entite,type_geo[k],numdt,numo) < 0 ) {
00420 MESSAGE("Erreur a la lecture des valeurs du champ : ");
00421 SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
00422 ISCRUTE(numdt);ISCRUTE(numo);SSCRUTE(maa_ass);
00423 ret = -1;
00424 };
00425
00426 }
00427
00428 if ( ngauss > 1 )
00429 printf("\t- Modèle de localisation des points de Gauss de nom |%s|\n",locname);
00430
00431 if (entite == MED_NOEUD_MAILLE)
00432 ngroup = type_geo[k] % 100;
00433 else
00434 ngroup = ngauss;
00435
00436 switch (stockage) {
00437
00438 case MED_FULL_INTERLACE :
00439 printf("\t- Valeurs :\n\t");
00440 for (m=0;m<nval/ngroup;m++) {
00441 printf("|");
00442 for (n=0;n<ngroup*ncomp;n++)
00443 if (typcha == MED_FLOAT64)
00444 printf(" %f ",*(valr+(m*ngroup*ncomp)+n));
00445 else
00446 printf(" "IFORMAT" ",*(vale+(m*ngroup*ncomp)+n));
00447
00448 }
00449 break;
00450
00451
00452 case MED_NO_INTERLACE :
00453 printf("\t- Valeurs :\n\t");
00454 for (m=0;m<ncomp;m++) {
00455 printf("|");
00456 for (n=0;n<nval;n++)
00457 if (typcha == MED_FLOAT64)
00458 printf(" %f ",*(valr+(m*nval)+n));
00459 else
00460 printf(" "IFORMAT" ",*(vale+(m*nval)+n));
00461 }
00462 break;
00463 }
00464
00465 printf("|\n");
00466 if (typcha == MED_FLOAT64) {
00467 if ( valr ) {free(valr);valr = NULL;}}
00468 else
00469 if (vale) { free(vale);vale = NULL; }
00470
00471
00472 if (strcmp(pflname,MED_NOPFL) == 0 )
00473 printf("\t- Profil : MED_NOPFL\n");
00474 else {
00475
00476 if ( (pflsize = MEDnValProfil(fid,pflname)) <0 ) {
00477 MESSAGE("Erreur a la lecture du nombre de valeurs du profil : ");
00478 SSCRUTE(pflname);
00479 ret = -1; continue;
00480 }
00481
00482 printf("\t- Profil : |%s| de taille "IFORMAT"\n",pflname,pflsize);
00483
00484 pflval = (med_int*) malloc(sizeof(med_int)*pflsize);
00485 EXIT_IF(pflval == NULL,NULL,NULL);
00486 if ( MEDprofilLire(fid,pflval,pflname) <0) {
00487 MESSAGE("Erreur a la lecture des valeurs du profil : ");
00488 SSCRUTE(pflname);
00489 ret = -1;
00490 }
00491 printf("\t");
00492 for (m=0;m<pflsize;m++) printf(" "IFORMAT" ",*(pflval+m));
00493 printf("\n");
00494 free(pflval);
00495
00496 }
00497
00498 }
00499 }
00500 }
00501
00502 return ret;
00503 }
00504