00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <med.h>
00020 #include <med_config.h>
00021 #include <med_outils.h>
00022
00023 #include <string.h>
00024 #include <stdlib.h>
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 med_err
00051 MEDchampLire(med_idt fid,char *maa, char *cha, unsigned char *val,med_mode_switch interlace,med_int numco,
00052 char * locname, char *profil, med_mode_profil pflmod,
00053 med_entite_maillage type_ent, med_geometrie_element type_geo,
00054 med_int numdt, med_int numo)
00055
00056 {
00057 med_err ret=-1;
00058 med_idt gid=0, datagroup1=0, datagroup2=0,datagroup3=0;
00059 med_int ncomp=0, chtype=0, ngauss=0, i=0, pfluse=0, nbelem = 0;
00060 char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2]="",nomdatagroup2[2*MED_MAX_PARA+1]="";
00061 char tmp1[MED_TAILLE_NOM_ENTITE+1]="", pfltmp[MED_TAILLE_NOM+1]="";
00062 char chemin[MED_TAILLE_CHA+MED_TAILLE_NOM+1]="";
00063 med_size psize=0;
00064 med_int *pfltabtmp=0;
00065 med_size *pfltab=0;
00066 char _tmpmaa[MED_TAILLE_NOM+1]="";
00067 char *_maa=maa;
00068
00069
00070
00071 _MEDmodeErreurVerrouiller();
00072 if (MEDcheckVersion(fid) < 0) return -1;
00073
00074
00075
00076
00077
00078 strcpy(chemin,MED_CHA);
00079 strcat(chemin,cha);
00080 if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0)
00081 goto ERROR;
00082
00083
00084
00085 if (_MEDattrEntierLire(gid,MED_NOM_NCO,&ncomp) < 0)
00086 goto ERROR;
00087
00088
00089
00090
00091
00092 if (_MEDnomEntite(nomdatagroup1,type_ent) < 0)
00093 goto ERROR;
00094 if ( type_ent != MED_NOEUD ) {
00095 if (_MEDnomGeometrie30(tmp1,type_geo) < 0)
00096 goto ERROR;
00097 strcat(nomdatagroup1,".");
00098 strcat(nomdatagroup1,tmp1);
00099 }
00100 datagroup1 = 0;
00101 if ( (datagroup1 = _MEDdatagroupOuvrir(gid,nomdatagroup1)) < 0 )
00102 goto ERROR;
00103
00104
00105
00106
00107 sprintf(nomdatagroup2,"%*li%*li",MED_MAX_PARA,(long ) numdt,MED_MAX_PARA,(long ) numo);
00108
00109 datagroup2 = 0;
00110 if ( (datagroup2 = _MEDdatagroupOuvrir(datagroup1,nomdatagroup2)) < 0)
00111 goto ERROR;
00112
00113
00114
00115
00116
00117 if ( ! strcmp(maa,MED_NOREF) ) {
00118 if (_MEDattrStringLire(datagroup2,MED_NOM_MAI,MED_TAILLE_NOM,_tmpmaa) < 0)
00119 goto ERROR;
00120 _maa=_tmpmaa;
00121 }
00122 datagroup3 = 0;
00123 if ( (datagroup3 = _MEDdatagroupOuvrir(datagroup2,_maa)) < 0 )
00124 goto ERROR;
00125
00126
00127
00128
00129
00130
00131
00132 if (_MEDattrStringLire(datagroup3,MED_NOM_PFL,MED_TAILLE_NOM,pfltmp) < 0)
00133 goto ERROR;
00134
00135 if ( (pfluse = (strcmp(pfltmp,MED_NOPFLi) && strcmp(pfltmp,""))) )
00136 {
00137 strcpy(profil,pfltmp);
00138 if ( (i = MEDnValProfil(fid,profil)) < 0 )
00139 goto ERROR;
00140 else
00141 psize = i;
00142
00143 pfltabtmp = (med_int *) malloc (sizeof(med_int)*psize);
00144 pfltab = (med_size *) malloc (sizeof(med_size)*psize);
00145 if (MEDprofilLire(fid,pfltabtmp,profil) < 0)
00146 goto ERROR;
00147 for (i=0;i<psize;i++)
00148 pfltab[i] = (med_size) pfltabtmp[i];
00149
00150 }
00151 else {
00152 psize = MED_NOPF;
00153 strcpy(profil,MED_NOPFL);
00154 }
00155
00156
00157
00158 if (_MEDattrEntierLire(datagroup3,MED_NOM_NGA,&ngauss) < 0) {
00159 MESSAGE("Erreur à la lecture de l'attribut MED_NOM_NGA : ");
00160 ISCRUTE(ngauss);goto ERROR;
00161 };
00162
00163
00164 if ( _MEDattrStringLire(datagroup3,MED_NOM_GAU,MED_TAILLE_NOM,locname) < 0) {
00165 MESSAGE("Erreur à la lecture de l'attribut MED_NOM_GAU : ");
00166 SSCRUTE(locname); goto ERROR;
00167 }
00168
00169
00170 if ( ! strcmp(locname,MED_NOGAUSSi))
00171 strcpy(locname,MED_NOGAUSS);
00172
00173
00174 if (_MEDattrEntierLire(datagroup3,MED_NOM_NBR,&nbelem) < 0) {
00175 MESSAGE("Erreur à la lecture de l'attribut MED_NOM_NBR : ");
00176 ISCRUTE(nbelem);goto ERROR;
00177 };
00178
00179
00180
00181
00182
00183
00184 if (_MEDattrEntierLire(gid,MED_NOM_TYP,&chtype) < 0)
00185 goto ERROR;
00186
00187 switch(chtype)
00188 {
00189 case MED_FLOAT64 :
00190 if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_FLOAT64,
00191 interlace,ncomp,numco,
00192 psize,pflmod,MED_PFL_COMPACT,pfltab,ngauss,nbelem,val)< 0)
00193 goto ERROR;
00194 break;
00195
00196 case MED_INT32 :
00197 #if defined(HAVE_F77INT64)
00198 if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_INT64,
00199 interlace,ncomp,numco,
00200 psize,pflmod,MED_PFL_COMPACT,pfltab,ngauss,nbelem,val)< 0)
00201 goto ERROR;
00202 #else
00203 if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_INT32,
00204 interlace,ncomp,numco,
00205 psize,pflmod,MED_PFL_COMPACT,pfltab,ngauss,nbelem,val)< 0)
00206 goto ERROR;
00207 #endif
00208 break;
00209
00210 case MED_INT64 :
00211 #if defined(HAVE_F77INT64)
00212 if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_INT64,
00213 interlace,ncomp,numco,
00214 psize,pflmod,MED_PFL_COMPACT,pfltab,ngauss,nbelem,val)< 0)
00215 goto ERROR;
00216 #else
00217 goto ERROR;
00218 #endif
00219 break;
00220
00221 default :
00222 goto ERROR;
00223 }
00224
00225
00226
00227
00228
00229 ret = 0;
00230
00231 ERROR:
00232
00233 if ( pfluse ) { free(pfltab); free(pfltabtmp);}
00234
00235 if (datagroup3>0) if (_MEDdatagroupFermer(datagroup3) < 0) {
00236 MESSAGE("Impossible de fermer le datagroup : ");
00237 ISCRUTE_int(datagroup3); ret = -1;
00238 }
00239
00240 if (datagroup2>0) if (_MEDdatagroupFermer(datagroup2) < 0) {
00241 MESSAGE("Impossible de fermer le datagroup : ");
00242 ISCRUTE_int(datagroup2); ret = -1;
00243 }
00244
00245 if (datagroup1>0) if (_MEDdatagroupFermer(datagroup1) < 0) {
00246 MESSAGE("Impossible de fermer le datagroup : ");
00247 ISCRUTE_int(datagroup1); ret = -1;
00248 }
00249
00250 if (gid>0) if (_MEDdatagroupFermer(gid) < 0) {
00251 MESSAGE("Impossible de fermer le datagroup : ");
00252 ISCRUTE_id(gid); ret = -1;
00253 }
00254
00255 return ret;
00256 }
00257
00258
00259
00260