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 #include <hdf5.h>
00023 
00024 
00025 #ifdef TRACEPFL
00026 #define tracepfl(x) x
00027 #else
00028 #define tracepfl(x)
00029 #endif
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052  
00053 
00054 
00055 void  _MEDdatasetNumLire232(int dummy,...) {
00056 
00057   va_list params;
00058 
00059   med_idt              pere; 
00060   char                *nom; 
00061   med_type_champ       type;
00062   med_mode_switch interlace;
00063   med_size        nbdim,fixdim,psize,*pfltab;
00064   med_mode_profil pflmod;
00065   med_int         ngauss,nbelem;
00066   med_lecture_profil pflcmp;
00067   unsigned char   *val;
00068   med_err         *fret; 
00069 
00070   med_idt    dataset, dataspace = 0, memspace = 0;
00071   med_size   start_mem[1],start_data[1],*pflmem=0,*pfldsk=0;
00072   med_size   stride[1],count[1],pcount[1],size[1],pflsize[1];
00073   med_err    ret;
00074   int        i,j,index,type_hdf;
00075   hid_t      datatype;
00076   size_t     typesize;
00077   int        dim, firstdim, dimutil, lastdim;
00078   med_size   sizencmp[1];
00079 
00080   va_start(params,dummy);
00081   pere      = va_arg(params,med_idt);
00082   nom       = va_arg(params,char *);
00083   type      = va_arg(params,med_type_champ);
00084   interlace = va_arg(params,med_mode_switch);
00085   nbdim     = va_arg(params,med_size);
00086   fixdim    = va_arg(params,med_size); 
00087   psize     = va_arg(params,med_size);
00088   pflmod    = va_arg(params,med_mode_profil);
00089   pflcmp    = va_arg(params,med_lecture_profil);
00090   pfltab    = va_arg(params,med_size *);
00091   ngauss    = va_arg(params,med_int);
00092   nbelem    = va_arg(params,med_int);
00093   val       = va_arg(params,  unsigned char *);
00094   fret      = va_arg(params,  med_err *);
00095 
00096 
00097   
00098   if ( fixdim > nbdim  )
00099     goto Fail;
00100 
00101   switch(type)
00102     {
00103     case MED_FLOAT64 :
00104       type_hdf = H5T_NATIVE_DOUBLE;
00105       break;
00106 
00107     case MED_INT32 :
00108       type_hdf = H5T_NATIVE_INT;
00109       break;
00110 
00111     case MED_INT64 :
00112       type_hdf = H5T_NATIVE_LONG;
00113       break;
00114 
00115     default :
00116       goto Fail;
00117     }
00118 
00119   
00120   if ((dataset = H5Dopen(pere,nom)) < 0)
00121     goto Fail;
00122 
00123   
00124   if ( (datatype  = H5Dget_type(dataset )) < 0) goto Fail;
00125   if ( (typesize  = H5Tget_size(datatype)) == 0) goto Fail;
00126 #if 1
00127   {
00128   hid_t   space;
00129   hsize_t   sizespace[H5S_MAX_RANK];
00130   hsize_t   maxsizespace[H5S_MAX_RANK];
00131   int       ndims;
00132 
00133   space = H5Dget_space(dataset);
00134   ndims = H5Sget_simple_extent_dims(space, sizespace, maxsizespace);
00135   H5Sclose(space);
00136   size[0] = sizespace[0];
00137   }
00138 #else
00139   size[0] = H5Dget_storage_size(dataset) / typesize;
00140 #endif
00141   if ( H5Tclose(datatype) < 0) goto Fail;
00142 
00143 
00144   
00145   if ( psize != MED_NOPF) {
00146     if ( pflcmp == MED_PFL_COMPACT ) {
00147       if (size[0] != psize * ngauss * nbdim)
00148         goto Fail;
00149     }
00150   }
00151 
00152   
00153   if ((dataspace = H5Screate_simple(1,size,NULL)) < 0)
00154     goto Fail;
00155 
00156   switch(interlace) {
00157     case MED_FULL_INTERLACE :
00158 
00159       
00160       if ( fixdim != MED_ALL) {
00161             firstdim = fixdim-1;
00162             lastdim  = fixdim;
00163             dimutil  = 1;
00164           }
00165       else      {
00166             firstdim = 0;
00167             lastdim = nbdim;
00168             dimutil  = nbdim;
00169           }
00170 
00171       count [0] = (*size)/(nbdim);
00172       
00173 
00174       
00175       if ( psize == MED_NOPF ) {
00176 
00177         tracepfl(printf("%s branche 1 : %lld\n", __FILE__, fixdim));
00178 
00179             
00180             if ( (memspace = H5Screate_simple (1, size, NULL)) <0)
00181               goto Fail;
00182 
00183             stride[0] = nbdim;
00184 
00185             for (dim=firstdim; dim < lastdim; dim++) {
00186                   
00187               start_mem[0] = dim;
00188               if ( (ret = H5Sselect_hyperslab (memspace, H5S_SELECT_SET, start_mem, stride,
00189                                            count, NULL)) <0)
00190                 goto Fail;
00191           
00192               start_data[0] = dim*count[0];
00193               if ( (ret = H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, start_data, NULL,
00194                                            count, NULL)) <0)
00195                 goto Fail;
00196           
00197               if ((ret = H5Dread(dataset,type_hdf,memspace,dataspace,
00198                              H5P_DEFAULT, val)) < 0)
00199                 goto Fail;
00200             }
00201 
00202       }
00203       else {
00204 
00205             pflsize [0] = psize*ngauss*nbdim;
00206             pcount  [0] = psize*ngauss*dimutil;
00207             pflmem     = (med_size *) malloc (sizeof(med_size)*pcount[0]);
00208             pfldsk     = (med_size *) malloc (sizeof(med_size)*pcount[0]);
00209         
00210             switch(pflmod) { 
00211               case MED_GLOBAL :
00212 
00213             tracepfl(printf("%s branche 2 : %lld - %d\n", __FILE__, fixdim, pflcmp));
00214 
00215                 
00216             if (pflcmp == MED_PFL_COMPACT)
00217               sizencmp[0] = nbelem * nbdim;
00218             else
00219               sizencmp[0] = size[0];
00220             if ( (memspace = H5Screate_simple (1, sizencmp, NULL)) <0)
00221               goto Fail;
00222 
00223                 for (dim=firstdim; dim < lastdim; dim++) {
00224               
00225                   for (i=0; i < psize; i++)              
00226                     for (j=0; j < ngauss; j++) {
00227                           index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
00228                           pflmem[index] = (pfltab[i]-1)*ngauss*nbdim + j*nbdim+dim;
00229                           if (pflcmp == MED_PFL_COMPACT)
00230                             pfldsk[index] = dim*count[0] + i*ngauss+j;
00231                           else
00232                             pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;
00233                     }
00234                 }
00235             
00236                 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pflmem ) ) <0)
00237                   goto Fail;
00238             
00239                 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0)
00240                   goto Fail;
00241 
00242                 break;
00243         
00244               case MED_COMPACT :
00245 
00246             tracepfl(printf("%s branche 3 : %lld - %d\n", __FILE__, fixdim, pflcmp));
00247 
00248                 
00249                 
00250                 
00251             
00252                 if ( (memspace = H5Screate_simple (1, pflsize, NULL)) <0)
00253                   goto Fail;
00254 
00255                 for (dim=firstdim; dim < lastdim; dim++) {
00256               
00257                   for (i=0; i < psize; i++)              
00258                     for (j=0; j < ngauss; j++) {
00259                           index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
00260                           pflmem[index] = i*ngauss*nbdim + j*nbdim+dim;
00261                           if (pflcmp == MED_PFL_COMPACT)
00262                             pfldsk[index] = dim*count[0] + i*ngauss+j;
00263                           else
00264                             pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;
00265                     }
00266                 }
00267             
00268                 if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pflmem ) ) <0)
00269                   goto Fail;
00270             
00271                 if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0)
00272                   goto Fail;
00273 
00274                 break;
00275 
00276               default :
00277                 goto Fail;
00278             }
00279         
00280             if ((ret = H5Dread(dataset,type_hdf,memspace,dataspace,H5P_DEFAULT, val)) < 0)
00281               goto Fail;
00282 
00283             free(pflmem);
00284             free(pfldsk);
00285       }
00286       
00287       break;
00288       
00289     case MED_NO_INTERLACE :
00290 
00291       
00292 
00293       count[0] = (*size)/nbdim;
00294 
00295       if ( psize == MED_NOPF ) {
00296         
00297         tracepfl(printf("%s branche 4 : %d\n", __FILE__, fixdim));
00298 
00299             if ( fixdim != MED_ALL)
00300               start_data[0] = (fixdim-1)*count[0];
00301             else {
00302               count[0] = *size;
00303               start_data[0] =  0;
00304             };
00305         
00306             if ( (ret = H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, start_data, NULL,
00307                                          count, NULL)) <0)
00308               goto Fail;
00309 
00310             if ((ret = H5Dread(dataset,type_hdf,dataspace,dataspace,
00311                            H5P_DEFAULT, val)) < 0)
00312               goto Fail;
00313 
00314       }
00315       else {
00316 
00317             if ( fixdim != MED_ALL) {
00318               firstdim = fixdim-1;
00319               lastdim  = fixdim;
00320               dimutil  = 1;
00321             }
00322         else    {
00323               firstdim = 0;
00324               lastdim  = nbdim;
00325               dimutil  = nbdim;
00326             }
00327 
00328             pflsize [0] = psize*ngauss*nbdim;   
00329             pcount  [0] = psize*ngauss*dimutil; 
00330             
00331             pfldsk      = (med_size *) malloc(sizeof(med_size)*pcount[0]);
00332         
00333             switch(pflmod) { 
00334               case MED_GLOBAL :
00335             
00336             tracepfl(printf("%s branche 5 : %lld - %d\n", __FILE__, fixdim, pflcmp));
00337 
00338                 if ( pflcmp == MED_PFL_COMPACT ) {
00339                   pflmem     = (med_size *) malloc (sizeof(med_size)*pcount[0]);
00340                   sizencmp[0] = nbelem * nbdim;
00341               if ( (memspace = H5Screate_simple (1, sizencmp, NULL)) <0)
00342                     goto Fail;
00343                 }
00344 
00345                 for (dim=firstdim; dim < lastdim; dim++) {
00346 
00347                   for (i=0; i < psize; i++)              
00348                         for (j=0; j < ngauss; j++) {
00349                           index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
00350                           if ( pflcmp == MED_PFL_COMPACT ) {
00351                             pflmem[index] = dim*nbelem+(pfltab[i]-1)*ngauss+j;
00352                             pfldsk[index] = dim*count[0] + i*ngauss+j;
00353                           }
00354                           else {
00355                             pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;
00356                           }
00357                         }
00358                 }
00359                 
00360                 if ( pflcmp == MED_PFL_COMPACT ) {
00361                   if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pflmem ) ) <0)
00362                     goto Fail;
00363 
00364                   if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0)
00365                     goto Fail;
00366 
00367                   if ((ret = H5Dread(dataset,type_hdf,memspace,dataspace,H5P_DEFAULT, val)) < 0)
00368                     goto Fail;
00369 
00370                   free(pflmem);
00371             }
00372             else {
00373 
00374                   if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0)
00375                     goto Fail;
00376 
00377                   if ((ret = H5Dread(dataset,type_hdf,dataspace,dataspace,H5P_DEFAULT, val)) < 0)
00378                     goto Fail;
00379                 }
00380 
00381                 break;
00382             
00383               case MED_COMPACT :
00384             
00385             tracepfl(printf("%s branche 6 : %lld - %d\n", __FILE__, fixdim, pflcmp));
00386 
00387                 if ( pflcmp == MED_PFL_NON_COMPACT ) {
00388               
00389                   
00390                   
00391 
00392                   if ( (memspace = H5Screate_simple (1, pflsize, NULL)) <0)
00393                     goto Fail;
00394 
00395                   
00396                   pflmem     = (med_size *) malloc (sizeof(med_size)*pcount[0]);
00397                 }
00398             
00399                 
00400 
00401                 index = 0;
00402                 for (dim=firstdim; dim < lastdim; dim++) {
00403                   for (i=0; i < psize; i++)              
00404                         for (j=0; j < ngauss; j++) {
00405                           
00406                           
00407                           
00408                           if ( pflcmp == MED_PFL_NON_COMPACT ) {
00409                     pflmem[index] = ( (dim*psize) + i )*ngauss + j;
00410                             pfldsk[index] = dim*count[0]  + (pfltab[i]-1)*ngauss+j;
00411                           }
00412                   else {
00413                     pfldsk[index] = dim*count[0] + i*ngauss+j;
00414                   }
00415                           index++;
00416                         }
00417                 }
00418             
00419                 if ( pflcmp == MED_PFL_NON_COMPACT ) {
00420               if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pflmem ) ) <0)
00421                     goto Fail;
00422 
00423                   if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0)
00424                     goto Fail;
00425 
00426                   if ((ret = H5Dread(dataset,type_hdf,memspace,dataspace,H5P_DEFAULT, val)) < 0)
00427                     goto Fail;
00428 
00429                   free(pflmem);
00430                 }
00431             else {
00432                   if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0)
00433                     goto Fail;
00434 
00435                   if ((ret = H5Dread(dataset,type_hdf,dataspace,dataspace,H5P_DEFAULT, val)) < 0)
00436                     goto Fail;
00437             }
00438 
00439                 break;
00440             
00441               default :
00442                 goto Fail;
00443             
00444             }
00445         
00446             free(pfldsk);
00447         
00448       };
00449       
00450       break;
00451       
00452     default :
00453       goto Fail;
00454   }
00455   
00456   
00457 
00458   if (memspace)
00459     if ((ret = H5Sclose(memspace)) < 0)
00460       goto Fail;
00461 
00462   if ((ret = H5Sclose(dataspace)) < 0)
00463     goto Fail;
00464 
00465   if ((ret = H5Dclose(dataset)) < 0)
00466     goto Fail;
00467 
00468  Success:
00469   va_end(params);
00470   *fret=0;
00471   return;
00472 
00473  Fail:
00474   va_end(params);
00475   *fret = -1;
00476   return;
00477 }