diff options
author | MuQun Yang <ymuqun@hdfgroup.org> | 2001-12-13 16:16:13 (GMT) |
---|---|---|
committer | MuQun Yang <ymuqun@hdfgroup.org> | 2001-12-13 16:16:13 (GMT) |
commit | 110a52681900b62b86bfb721ff0bf85ef264d137 (patch) | |
tree | fc578c1d7782597060d632b225096e07795f7a14 /tools | |
parent | 3ca3ae97eed8db1584cd66d6dfc654c916a7ed8f (diff) | |
download | hdf5-110a52681900b62b86bfb721ff0bf85ef264d137.zip hdf5-110a52681900b62b86bfb721ff0bf85ef264d137.tar.gz hdf5-110a52681900b62b86bfb721ff0bf85ef264d137.tar.bz2 |
[svn-r4717]
Purpose:
a bug fix
a feature added
Description:
1.conversion of unlimited dimension data with the current dimensional size 0
2. Use a parameter file to control some special cases:
1) To subdivide the huge array into hyperslabs, a memory buffer size has i
to be set.
2) when current dimensional size is 0, a default chunk size can be set.
Solution:
bug fixed 1. Old approach: the current dimensional size is set to H5S_UNLIMITED, which is
a huge number. The default chunk size is set as a *FIXED* default value.
2. New approach: the current dimensional size is set to the current value 0.
Users can provide the chunk size through a parameter file.
Platforms tested:
eirene
[machines you have tested the changed version. This is absolute
important. Test it out on at least two or three different platforms
such as Big-endian-32bit (SUN/IRIX), little-endian-32(LINUX) and
64-bit (IRIX64/UNICOS/DEC-ALPHA) would be good.]
Diffstat (limited to 'tools')
-rw-r--r-- | tools/h4toh5/h4toh5sds.c | 67 |
1 files changed, 47 insertions, 20 deletions
diff --git a/tools/h4toh5/h4toh5sds.c b/tools/h4toh5/h4toh5sds.c index 6945bdb..548429b 100644 --- a/tools/h4toh5/h4toh5sds.c +++ b/tools/h4toh5/h4toh5sds.c @@ -33,6 +33,7 @@ static int convert_zerosdsunlimit(int32 file_id, int32 sds_id, hid_t h5_group, hid_t h5_dimgroup, + int32 chunk_size, int h4_attr); /*------------------------------------------------------------------------- @@ -116,13 +117,35 @@ int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int hsize_t* h5slab_count; int h4slab_count,h4slab_index; int32 slabsize; + int32 chunksize; int32 count_slabdata; hid_t slabmemspace; + FILE *fp; + int memopt; + int sdsopt_flag = 1; + + memopt = 0; + if((fp= fopen("parafile","r"))==NULL){/*ignore the parameter file */ + printf("coming here\n"); + sdsopt_flag = 0; + memopt = 0; + chunksize = HDF4_CHUNKSIZE; + } + + if(sdsopt_flag !=0) { + fscanf(fp,"%d",&memopt); + while(fgetc(fp)!='\n'); + fscanf(fp,"%d",&slabsize); + while(fgetc(fp)!='\n'); + fscanf(fp,"%d",&chunksize); + fclose(fp); + } /* if(memsize <=0) slabsize = -1;*/ - if(MEMOPT != 0) + if(memopt == 1) slabsize = SLABSIZE*1000000; else slabsize = 0; + special_code = -1; /* zeroing out the memory for sdsname and sdslabel.*/ @@ -145,7 +168,7 @@ int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int } if(sds_empty !=0) { if(sds_dimsizes[0]==0) { - if(convert_zerosdsunlimit(file_id,sds_id,h5_group,h5_dimgroup,h4_attr)==FAIL){ + if(convert_zerosdsunlimit(file_id,sds_id,h5_group,h5_dimgroup,chunksize,h4_attr)==FAIL){ printf("cannot convert unlimited dimension SDS with 0.\n"); return FAIL; } @@ -467,7 +490,7 @@ int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int return FAIL; } - if(count_sdsdata*h4memsize <= slabsize || MEMOPT==0) { + if(count_sdsdata*h4memsize <= slabsize || MEMOPT!= 1) { sds_data = malloc(h4memsize*count_sdsdata); @@ -523,6 +546,7 @@ int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int } else { + /* obtain the number of hyperslab per dimension. */ NUM_HSLAB_PERD= get_numslab_perD(h4memsize*count_sdsdata,slabsize,sds_rank); h4slab_start = calloc(sds_rank,sizeof(int32)); @@ -533,18 +557,29 @@ int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int h5slab_offset = calloc(sds_rank,sizeof(hsize_t)); h5slab_count = calloc(sds_rank,sizeof(hsize_t)); + /* Initialize the hyperslab parameter. */ for ( i =0;i<sds_rank;i++) { h4slab_start[i] =0; h4slab_stop[i] = 0; h4slab_stride[i] =1; h4slab_dims[i] = h5ceil(sds_dimsizes[i],NUM_HSLAB_PERD); - printf("h4slab_dims[%d]%d\n",i,h4slab_dims[i]); } + h4slab_count = -1; + + /* total number of hyperslab is equal to pow(NUM_HSLAB_PERD,sds_rank)-1, + At first, all other dimensions are fixed, only the first dimension + (the most frequently changing dimension) changes its starting point + and ending point. + After the first dimension moves to the end of its dimension, + the second dimension starts to change. So we use "mod fuction" to check the which + dimension we are heading to. */ + while(h4slab_count != pow(NUM_HSLAB_PERD,sds_rank)-1){ h4slab_count++; h4slab_index = -1; for (i=0;i<sds_rank;i++){ + /* check the current location of the slab. */ if((h4slab_count%pow(NUM_HSLAB_PERD,(i+1)))==0){ h4slab_index = i; } @@ -560,8 +595,6 @@ int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int h4slab_stop[i] = h4slab_start[i]+h4slab_dims[i]; if(h4slab_stop[i]>sds_dimsizes[i]) h4slab_stop[i] = sds_dimsizes[i]; - printf("h4slab_start[%d] %d\n",i,h4slab_start[i]); - printf("h4slab_stop[%d] %d\n",i,h4slab_stop[i]); } count_slabdata = 1; for(i=0;i<sds_rank;i++){ @@ -569,7 +602,6 @@ int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int h4slab_edges[i] = h4slab_stop[i]-h4slab_start[i]; } count_slabdata = count_slabdata*h4memsize; - printf("count_slabdata %d\n",count_slabdata); sds_data = malloc(count_slabdata); if(sds_data == NULL) { printf("error in allocating memory. \n"); @@ -588,7 +620,6 @@ int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int free(sds_data); return FAIL; } - printf("after SDread data\n"); write_plist = H5Pcreate(H5P_DATASET_XFER); /* bufsize = h4memsize; for(i=0;i<sds_rank;i++) @@ -616,10 +647,6 @@ int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int H5Sselect_hyperslab(h5d_sid,H5S_SELECT_SET,h5slab_offset,NULL,h5slab_count,NULL); if (H5Dwrite(h5dset,h5_memtype,slabmemspace,h5d_sid,write_plist, (void *)sds_data)<0) { - - /* printf("before writing \n"); - if (H5Dwrite(h5dset,h5_memtype,h5d_sid,h5d_sid,H5P_DEFAULT, - (void *)sds_data)<0) { */ printf("failed to write data into hdf5 dataset"); printf(" converted from SDS.\n"); H5Sclose(h5d_sid); @@ -633,7 +660,6 @@ int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int free(chunk_dims); return FAIL; } - printf("after writing hdf5 \n"); free(sds_data); h4slab_start[0] = h4slab_start[0]+h4slab_dims[0]; @@ -1886,10 +1912,11 @@ uint16 get_SDref(int32 file_id,uint16 tag,int32 sds_ref){ } static int convert_zerosdsunlimit(int32 file_id, - int32 sds_id, - hid_t h5_group, - hid_t h5_dimgroup, - int h4_attr) { + int32 sds_id, + hid_t h5_group, + hid_t h5_dimgroup, + int32 chunk_size, + int h4_attr) { int32 sds_dtype; @@ -1949,7 +1976,7 @@ static int convert_zerosdsunlimit(int32 file_id, if(SDisrecord(sds_id)){ max_h5dims[0] = H5S_UNLIMITED; - h5dims[0] = H5S_UNLIMITED; + /* h5dims[0] = 0;*/ } /* convert hdf4 data type to hdf5 data type. */ @@ -2075,7 +2102,7 @@ static int convert_zerosdsunlimit(int32 file_id, for(i=0;i<sds_rank;i++){ chunk_dims[i] = (hsize_t)(sds_dimsizes[i]); if(sds_dimsizes[0] == 0) - chunk_dims[0] = (hsize_t)DEF_CHUNKSIZE; + chunk_dims[0] = (hsize_t)chunk_size; } if(H5Pset_chunk(create_plist, sds_rank, chunk_dims)<0) { printf("failed to set up chunking information for "); @@ -2126,7 +2153,7 @@ static int convert_zerosdsunlimit(int32 file_id, } if(access_id == FAIL) { - chunk_dims[0] = (hsize_t)DEF_CHUNKSIZE; + chunk_dims[0] = (hsize_t)chunk_size; for(i=1;i<sds_rank;i++) chunk_dims[i] = h5dims[i]; if(H5Pset_chunk(create_plist, sds_rank, chunk_dims)<0) { |