summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorMuQun Yang <ymuqun@hdfgroup.org>2001-12-13 16:16:13 (GMT)
committerMuQun Yang <ymuqun@hdfgroup.org>2001-12-13 16:16:13 (GMT)
commit110a52681900b62b86bfb721ff0bf85ef264d137 (patch)
treefc578c1d7782597060d632b225096e07795f7a14 /tools
parent3ca3ae97eed8db1584cd66d6dfc654c916a7ed8f (diff)
downloadhdf5-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.c67
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) {