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 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041  
00042 
00043 
00044 void  _MEDdatasetNumLire231(int dummy,...) {
00045 
00046   va_list params;
00047 
00048   med_idt              pere; 
00049   char                *nom; 
00050   med_type_champ       type;
00051   med_mode_switch interlace;
00052   med_size        nbdim,fixdim,psize,*pfltab; 
00053   med_mode_profil pflmod;
00054   med_int         ngauss,nbelem;
00055   med_lecture_profil pflcmp;
00056   unsigned char   *val;
00057   med_err         *fret; 
00058 
00059   med_idt    dataset, dataspace = 0, memspace = 0;
00060   med_size   start_mem[1],start_data[1],*pflmem=0,*pfldsk=0;
00061   med_size   stride[1],count[1],pcount[1],size[1],pflsize[1];
00062   med_err    ret;
00063   int        i,j,index,type_hdf;
00064   hid_t      datatype;
00065   size_t     typesize;
00066   int        dim, firstdim, dimutil, lastdim;
00067 
00068   va_start(params,dummy);
00069   pere      = va_arg(params,med_idt);
00070   nom       = va_arg(params,char *);
00071   type      = va_arg(params,med_type_champ);
00072   interlace = va_arg(params,med_mode_switch);
00073   nbdim     = va_arg(params,med_size);
00074   fixdim    = va_arg(params,med_size); 
00075   psize     = va_arg(params,med_size);
00076   pflmod    = va_arg(params,med_mode_profil);
00077   pflcmp    = va_arg(params,med_lecture_profil);
00078   pfltab    = va_arg(params,med_size *);
00079   ngauss    = va_arg(params,med_int);
00080   nbelem    = va_arg(params,med_int);
00081   val       = va_arg(params,  unsigned char *);
00082   fret      = va_arg(params,  med_err *);
00083 
00084 
00085   
00086   if ( fixdim > nbdim  ) 
00087     goto Fail;
00088  
00089   switch(type)
00090     {
00091     case MED_FLOAT64 :
00092       type_hdf = H5T_NATIVE_DOUBLE;
00093       break;
00094 
00095     case MED_INT32 :
00096       type_hdf = H5T_NATIVE_INT;
00097       break;
00098 
00099     case MED_INT64 :
00100       type_hdf = H5T_NATIVE_LONG;
00101       break;
00102 
00103     default :
00104       goto Fail;
00105     }
00106 
00107   
00108   if ((dataset = H5Dopen(pere,nom)) < 0)
00109     goto Fail;
00110 
00111   
00112   if ( (datatype  = H5Dget_type(dataset )) < 0) goto Fail;
00113   if ( (typesize  = H5Tget_size(datatype)) == 0) goto Fail;
00114   size[0] = H5Dget_storage_size(dataset) / typesize; 
00115   if ( H5Tclose(datatype) < 0) goto Fail;
00116 
00117   
00118   if ((dataspace = H5Screate_simple(1,size,NULL)) < 0)
00119     goto Fail;
00120   
00121   switch(interlace)
00122     {
00123     case MED_FULL_INTERLACE :
00124 
00125       
00126       if ( fixdim != MED_ALL) 
00127         { 
00128           firstdim = fixdim-1;
00129           lastdim  = fixdim;
00130           dimutil  = 1;
00131         } else  {
00132           firstdim = 0;
00133           lastdim = nbdim;
00134           dimutil  = nbdim; 
00135         }
00136 
00137       count [0] = (*size)/(nbdim);
00138       
00139 
00140       
00141       if ( psize == MED_NOPF ) {  
00142 
00143         
00144         if ( (memspace = H5Screate_simple (1, size, NULL)) <0)
00145           goto Fail;
00146 
00147         stride[0] = nbdim;  
00148 
00149         for (dim=firstdim; dim < lastdim; dim++) {
00150                   
00151           start_mem[0] = dim;
00152           if ( (ret = H5Sselect_hyperslab (memspace, H5S_SELECT_SET, start_mem, stride, 
00153                                            count, NULL)) <0)
00154             goto Fail;
00155           
00156           start_data[0] = dim*count[0];
00157           if ( (ret = H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, start_data, NULL, 
00158                                            count, NULL)) <0)
00159             goto Fail;
00160           
00161           if ((ret = H5Dread(dataset,type_hdf,memspace,dataspace,
00162                              H5P_DEFAULT, val)) < 0)
00163             goto Fail;
00164         }
00165         
00166       } else {
00167 
00168         pflsize [0] = psize*ngauss*nbdim;
00169         pcount  [0] = psize*ngauss*dimutil;
00170         pflmem     = (med_size *) malloc (sizeof(med_size)*pcount[0]);
00171         pfldsk     = (med_size *) malloc (sizeof(med_size)*pcount[0]);
00172         
00173         switch(pflmod) { 
00174         case MED_GLOBAL :
00175 
00176           
00177           if ( (memspace = H5Screate_simple (1, size, NULL)) <0)
00178             goto Fail;
00179 
00180           for (dim=firstdim; dim < lastdim; dim++) {
00181               
00182             for (i=0; i < psize; i++)              
00183               for (j=0; j < ngauss; j++) {         
00184                 index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
00185                 pflmem[index] = (pfltab[i]-1)*ngauss*nbdim + j*nbdim+dim;
00186                 pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;       
00187               }
00188           }
00189             
00190           if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pflmem ) ) <0) 
00191             goto Fail;
00192             
00193           if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0) 
00194             goto Fail;
00195             
00196           break;
00197         
00198         case MED_COMPACT :
00199         
00200           
00201           
00202            
00203             
00204           if ( (memspace = H5Screate_simple (1, pflsize, NULL)) <0)
00205             goto Fail;
00206             
00207           for (dim=firstdim; dim < lastdim; dim++) {
00208               
00209             for (i=0; i < psize; i++)              
00210               for (j=0; j < ngauss; j++) {         
00211                 index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
00212                 pflmem[index] = i*ngauss*nbdim + j*nbdim+dim;
00213                 pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;       
00214               }       
00215           }
00216             
00217           if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pflmem ) ) <0) 
00218             goto Fail;
00219             
00220           if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0) 
00221             goto Fail;
00222             
00223           break;
00224 
00225         default :
00226           goto Fail;
00227         }
00228         
00229         if ((ret = H5Dread(dataset,type_hdf,memspace,dataspace,H5P_DEFAULT, val)) < 0)
00230           goto Fail;
00231         
00232         free(pflmem);
00233         free(pfldsk);
00234       }
00235       
00236       break;
00237       
00238     case MED_NO_INTERLACE :
00239 
00240       
00241 
00242       count[0] = (*size)/nbdim;
00243       
00244       if ( psize == MED_NOPF ) {  
00245         
00246         if ( fixdim != MED_ALL) 
00247           start_data[0] = (fixdim-1)*count[0];
00248         else {
00249           count[0] = *size;
00250           start_data[0] =  0;
00251         };
00252         
00253         if ( (ret = H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, start_data, NULL, 
00254                                          count, NULL)) <0)
00255           goto Fail;
00256         
00257         if ((ret = H5Dread(dataset,type_hdf,dataspace,dataspace,
00258                            H5P_DEFAULT, val)) < 0)
00259           goto Fail;
00260         
00261       } else {
00262 
00263         if ( fixdim != MED_ALL) 
00264           { 
00265             firstdim = fixdim-1;
00266             lastdim  = fixdim;
00267             dimutil  = 1;
00268           } else        {
00269             firstdim = 0;
00270             lastdim  = nbdim;
00271             dimutil  = nbdim; 
00272           }
00273 
00274         pflsize [0] = psize*ngauss*nbdim;      
00275         pcount  [0] = psize*ngauss*dimutil; 
00276              
00277         pfldsk      = (med_size *) malloc(sizeof(med_size)*pcount[0]);
00278         
00279         switch(pflmod)
00280           { 
00281           case MED_GLOBAL :
00282             
00283             for (dim=firstdim; dim < lastdim; dim++) {
00284               
00285               for (i=0; i < psize; i++)              
00286                 for (j=0; j < ngauss; j++) { 
00287                   index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
00288                   pfldsk[index] = dim*count[0]+(pfltab[i]-1)*ngauss+j;      
00289                 }
00290             }
00291             
00292             if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0) 
00293               goto Fail;
00294             
00295             if ((ret = H5Dread(dataset,type_hdf,dataspace,dataspace,H5P_DEFAULT, val)) < 0)
00296               goto Fail;
00297               
00298             break;
00299             
00300           case MED_COMPACT :
00301             
00302             
00303             
00304              
00305 
00306             if ( (memspace = H5Screate_simple (1, pflsize, NULL)) <0)
00307               goto Fail;
00308 
00309             
00310             pflmem     = (med_size *) malloc (sizeof(med_size)*pcount[0]);
00311             
00312             
00313 
00314             index = 0;
00315             for (dim=firstdim; dim < lastdim; dim++) {
00316               for (i=0; i < psize; i++)              
00317                 for (j=0; j < ngauss; j++) {
00318                   
00319                   
00320                   
00321                   pflmem[index] = ( (dim*psize) + i )*ngauss + j;
00322                   pfldsk[index] = dim*count[0]  + (pfltab[i]-1)*ngauss+j;
00323                   index++;          
00324                 }
00325             }
00326             
00327             if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, pcount[0], HDF5_SELECT_BUG pflmem ) ) <0) 
00328               goto Fail;
00329             
00330             if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,pcount[0], HDF5_SELECT_BUG pfldsk ) ) <0) 
00331               goto Fail;
00332             
00333             if ((ret = H5Dread(dataset,type_hdf,memspace,dataspace,H5P_DEFAULT, val)) < 0)
00334               goto Fail;
00335             
00336             free(pflmem);
00337 
00338             break;
00339             
00340           default :
00341             goto Fail;
00342             
00343           }
00344         
00345         free(pfldsk);
00346         
00347       };
00348       
00349       break;
00350       
00351     default :
00352       goto Fail;
00353     }
00354   
00355   
00356 
00357   if (memspace) 
00358     if ((ret = H5Sclose(memspace)) < 0)
00359       goto Fail;
00360 
00361   if ((ret = H5Sclose(dataspace)) < 0)
00362     goto Fail;
00363   
00364   if ((ret = H5Dclose(dataset)) < 0)
00365     goto Fail;
00366 
00367  Success:
00368   va_end(params);
00369   *fret=0;
00370   return;
00371 
00372  Fail:
00373   va_end(params);
00374   *fret = -1;
00375   return;
00376 }