diff options
author | Pedro Vicente Nunes <pvn@hdfgroup.org> | 2006-10-25 20:38:28 (GMT) |
---|---|---|
committer | Pedro Vicente Nunes <pvn@hdfgroup.org> | 2006-10-25 20:38:28 (GMT) |
commit | 9d94440384d20ab09297b8c451dfbda051ed6b17 (patch) | |
tree | 83c66c31c30c19b0935e3f70d90cacbe027d3bd1 /tools/h5diff/h5diffgentest.c | |
parent | ea1047de515e12e651e65c1b88c40b1c713f0b06 (diff) | |
download | hdf5-9d94440384d20ab09297b8c451dfbda051ed6b17.zip hdf5-9d94440384d20ab09297b8c451dfbda051ed6b17.tar.gz hdf5-9d94440384d20ab09297b8c451dfbda051ed6b17.tar.bz2 |
[svn-r12815]
1) added a new parameter to the h5diff function diff_array that contains
the beginning position of the hyperslab, so that the total position in
the array is printed correctly when reading by hyperslabs.
2) added a new test to h5diff that reads and diffs by hyperslabs. The
test reads a 1GB dataset, from which a 1KB hyperslab was written with
differences .
3) added the generation of 2 files to the generator program to test the
h5diff hyperslab read.
4) changed the h5diff binary pre-generated file names to be more
descriptive (e.g, instead of file1.h5, made it h5diff_basic1.h5)
5) changed the name of the h5repack options text file to info.h5repack
Diffstat (limited to 'tools/h5diff/h5diffgentest.c')
-rw-r--r-- | tools/h5diff/h5diffgentest.c | 2131 |
1 files changed, 1080 insertions, 1051 deletions
diff --git a/tools/h5diff/h5diffgentest.c b/tools/h5diff/h5diffgentest.c index 1f78b68..e283043 100644 --- a/tools/h5diff/h5diffgentest.c +++ b/tools/h5diff/h5diffgentest.c @@ -20,7 +20,7 @@ /*------------------------------------------------------------------------- * Program: h5diffgentest * - * Purpose: generate files for h5diff testting + * Purpose: generate files for h5diff testing * * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu * @@ -29,17 +29,19 @@ *------------------------------------------------------------------------- */ - +#define FILE1 "h5diff_basic1.h5" +#define FILE2 "h5diff_basic2.h5" +#define FILE3 "h5diff_types.h5" +#define FILE4 "h5diff_dtypes.h5" +#define FILE5 "h5diff_attr1.h5" +#define FILE6 "h5diff_attr2.h5" +#define FILE7 "h5diff_dset1.h5" +#define FILE8 "h5diff_dset2.h5" +#define FILE9 "h5diff_hyper1.h5" +#define FILE10 "h5diff_hyper2.h5" #define UIMAX 4294967295u /*Maximum value for a variable of type unsigned int */ #define STR_SIZE 3 -#define FILE1 "file1.h5" -#define FILE2 "file2.h5" -#define FILE3 "file3.h5" -#define FILE4 "file4.h5" -#define FILE5 "file5.h5" -#define FILE6 "file6.h5" -#define FILE7 "file7.h5" -#define FILE8 "file8.h5" +#define GBLL ((unsigned long_long) 1024 * 1024 *1024 ) #define MY_LINKCLASS 187 @@ -63,77 +65,119 @@ const H5L_class_t UD_link_class[1] = {{ /*------------------------------------------------------------------------- - * Function: write_attr + * prototypes + *------------------------------------------------------------------------- + */ + +/* tests called in main() */ +static int test_basic(const char *fname1,const char *fname2); +static int test_types(const char *fname); +static int test_datatypes(const char *fname); +static int test_attributes(const char *fname,int make_diffs); +static int test_datasets(const char *fname,int make_diffs); +static int test_hyperslab(char *fname,int make_diffs); +/* called by test_attributes() and test_datasets() */ +static void write_attr_in(hid_t loc_id,const char* dset_name,hid_t fid,int make_diffs); +static void write_dset_in(hid_t loc_id,const char* dset_name,hid_t fid,int make_diffs); +static void gen_datareg(hid_t fid,int make_diffs); +/* utilities */ +static int write_attr(hid_t loc_id,int rank,hsize_t *dims,const char *name,hid_t tid,void *buf); +static int write_dset(hid_t loc_id,int rank,hsize_t *dims,const char *name,hid_t tid,void *buf); + + +/*------------------------------------------------------------------------- + * Function: main * - * Purpose: utility function to write an attribute in LOC_ID + * Purpose: main program * *------------------------------------------------------------------------- */ -static -int write_attr(hid_t loc_id, - int rank, - hsize_t *dims, - const char *attr_name, - hid_t tid, - void *buf) -{ - hid_t aid; - hid_t sid; - herr_t status; - /* Create a buf space */ - sid = H5Screate_simple(rank,dims,NULL); +int main(void) +{ + test_basic (FILE1,FILE2); + test_types (FILE3); + test_datatypes(FILE4); - /* Create the attribute */ - aid = H5Acreate(loc_id,attr_name,tid,sid,H5P_DEFAULT); + /* generate 2 files, the second call creates a similar file with differences */ + test_attributes(FILE5,0); + test_attributes(FILE6,1); - /* Write the buf */ - if ( buf ) - status = H5Awrite(aid,tid,buf); + /* generate 2 files, the second call creates a similar file with differences */ + test_datasets(FILE7,0); + test_datasets(FILE8,1); - /* Close */ - status = H5Aclose(aid); - status = H5Sclose(sid); - return status; + /* generate 2 files, the second call creates a similar file with differences */ + test_hyperslab(FILE9,0); + test_hyperslab(FILE10,1); + return 0; } /*------------------------------------------------------------------------- - * Function: write_dset + * Function: test_basic * - * Purpose: utility function to create and write a dataset in LOC_ID + * Purpose: basic tests * *------------------------------------------------------------------------- */ + static -int write_dset( hid_t loc_id, - int rank, - hsize_t *dims, - const char *dset_name, - hid_t tid, - void *buf ) +int test_basic(const char *fname1, + const char *fname2) { - hid_t did; - hid_t sid; + + hid_t fid1, fid2; + hid_t gid1, gid2, gid3; herr_t status; + hsize_t dims[2] = { 3,2 }; - /* Create a buf space */ - sid = H5Screate_simple(rank,dims,NULL); + /* Test */ + double data1[3][2] = {{1,1},{1,1},{1,1}}; + double data2[3][2] = {{1,1.1},{1.01,1.001},{1.0001,1}}; + double data3[3][2] = {{100,110},{100,100},{100,100}}; + double data4[3][2] = {{110,100},{90,80},{140,200}}; + int data5[3][2] = {{100,100},{100,100},{100,100}}; + int data6[3][2] = {{101,102},{103,104},{150,200}}; + unsigned long_long data7[3][2] = {{100,100},{100,100},{100,100}}; + unsigned long_long data8[3][2] = {{101,102},{103,104},{150,200}}; - /* Create a dataset */ - did = H5Dcreate(loc_id,dset_name,tid,sid,H5P_DEFAULT); +/*------------------------------------------------------------------------- + * Create two files + *------------------------------------------------------------------------- + */ - /* Write the buf */ - if ( buf ) - status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf); + fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - /* Close */ - status = H5Dclose(did); - status = H5Sclose(sid); + /* Create groups */ + gid1 = H5Gcreate(fid1, "g1", 0); + gid2 = H5Gcreate(fid2, "g1", 0); + gid3 = H5Gcreate(fid2, "g2", 0); - return status; -} + write_dset(gid1,2,dims,"dset1",H5T_NATIVE_DOUBLE,data1); + write_dset(gid2,2,dims,"dset2",H5T_NATIVE_DOUBLE,data2); + write_dset(gid1,2,dims,"dset3",H5T_NATIVE_DOUBLE,data3); + write_dset(gid2,2,dims,"dset4",H5T_NATIVE_DOUBLE,data4); + write_dset(gid2,2,dims,"dset1",H5T_NATIVE_DOUBLE,data2); + /* relative (int) */ + write_dset(gid1,2,dims,"dset5",H5T_NATIVE_INT,data5); + write_dset(gid1,2,dims,"dset6",H5T_NATIVE_INT,data6); + /* relative (unsigned long_long) */ + write_dset(gid1,2,dims,"dset7",H5T_NATIVE_ULLONG,data7); + write_dset(gid1,2,dims,"dset8",H5T_NATIVE_ULLONG,data8); +/*------------------------------------------------------------------------- + * Close + *------------------------------------------------------------------------- + */ + status = H5Gclose(gid1); + status = H5Gclose(gid2); + status = H5Gclose(gid3); + status = H5Fclose(fid1); + status = H5Fclose(fid2); + return status; +} /* @@ -141,902 +185,463 @@ int write_dset( hid_t loc_id, # # Common usage # ############################################################################## - # 1.0 - -h - -# 1.1 - file1.h5 file2.h5 g1/dset1 g1/dset2 - -# 1.2 - file1.h5 file2.h5 -n 2 g1/dset1 g1/dset2 - -# 1.3 - file1.h5 file2.h5 -d 5 g1/dset3 g1/dset4 - -# 1.4 - file1.h5 file2.h5 -p 0.05 g1/dset3 g1/dset4 - -# 1.5 - file1.h5 file2.h5 -r g1/dset1 g1/dset2 - -# 1.6 - file1.h5 file2.h5 - -# ############################################################################## -# # basic types -# ############################################################################## - -# 2.0 - file3.h5 file3.h5 dset group - -# 2.1 - file3.h5 file3.h5 dset link +TOOLTEST h5diff_10.txt -h -# 2.2 - file3.h5 file3.h5 dset type - -# 2.3 - file3.h5 file3.h5 group group - -# 2.4 - file3.h5 file3.h5 type type - -# 2.5 - file3.h5 file3.h5 link link - - -# ############################################################################## -# # Dimensions -# ############################################################################## - -# 4.0 - file5.h5 file5.h5 dset1 dset2 - -# 4.1 - file5.h5 file5.h5 dset3 dset4 - -# 4.2 - file5.h5 file5.h5 dset5 dset6 - - -# ############################################################################## -# # Dataset types -# ############################################################################## - -# 5.0 - file6.h5 file6.h5 dset0a dset0b - -# 5.1 - file6.h5 file6.h5 dset1a dset1b - -# 5.2 - file6.h5 file6.h5 dset2a dset2b - -# 5.3 - file6.h5 file6.h5 dset3a dset4b - -# 5.4 - file6.h5 file6.h5 dset4a dset4b - -# 5.5 - file6.h5 file6.h5 dset5a dset5b - -# 5.6 - file6.h5 file6.h5 dset6a dset6b - -# 5.7 - file6.h5 file6.h5 dset7a dset7b - -# 5.8 - file6.h5 file6.h5 dset8a dset8b - -# ############################################################################## -# # Error messages -# ############################################################################## - - -# 6.0: Check if the command line number of arguments is less than 3 - h5diff_test1.h5 - -# 6.1: Check for invalid options - h5diff_test1.h5 h5diff_test2.h5 -x - -# ############################################################################## -# # -d -# ############################################################################## - -# 6.2: no value - file1.h5 file2.h5 -d g1/dset3 g1/dset4 - -# 6.3: negative value - file1.h5 file2.h5 -d -4 g1/dset3 g1/dset4 - -# 6.4: zero - file1.h5 file2.h5 -d 0 g1/dset3 g1/dset4 - -# 6.5: non number - file1.h5 file2.h5 -d u g1/dset3 g1/dset4 - -# 6.6: hexadecimal - file1.h5 file2.h5 -d 0x1 g1/dset3 g1/dset4 - -# 6.7: string - file1.h5 file2.h5 -d "1" g1/dset3 g1/dset4 - -# 6.8: repeated option - file1.h5 file2.h5 -d 1 -d 2 g1/dset3 g1/dset4 - -# 6.9: number larger than biggest difference - file1.h5 file2.h5 -d 200 g1/dset3 g1/dset4 - -# 6.10: number smaller than smallest difference - file1.h5 file2.h5 -d 1 g1/dset3 g1/dset4 - - -# ############################################################################## -# # -p -# ############################################################################## +# 1.1 normal mode +TOOLTEST h5diff_11.txt file1.h5 file2.h5 +# 1.2 normal mode with objects +TOOLTEST h5diff_12.txt file1.h5 file2.h5 g1/dset1 g1/dset2 -# 6.11: no value - file1.h5 file2.h5 -p g1/dset3 g1/dset4 +# 1.3 report mode +TOOLTEST h5diff_13.txt file1.h5 file2.h5 -r -# 6.12: negative value - file1.h5 file2.h5 -p -4 g1/dset3 g1/dset4 +# 1.4 report mode with objects +TOOLTEST h5diff_14.txt file1.h5 file2.h5 -r g1/dset1 g1/dset2 -# 6.13: zero - file1.h5 file2.h5 -p 0 g1/dset3 g1/dset4 +# 1.5 with -d +TOOLTEST h5diff_15.txt file1.h5 file2.h5 -r -d 5 g1/dset3 g1/dset4 -# 6.14: non number - file1.h5 file2.h5 -p u g1/dset3 g1/dset4 +# 1.6 with -p +TOOLTEST h5diff_16.txt file1.h5 file2.h5 -r -p 0.05 g1/dset3 g1/dset4 -# 6.15: hexadecimal - file1.h5 file2.h5 -p 0x1 g1/dset3 g1/dset4 +# 1.7 verbose mode +TOOLTEST h5diff_17.txt file1.h5 file2.h5 -v -# 6.16: string - file1.h5 file2.h5 -p "0.21" g1/dset3 g1/dset4 +# 1.8 quiet mode +TOOLTEST h5diff_18.txt file1.h5 file2.h5 -q -# 6.17: repeated option - file1.h5 file2.h5 -p 0.21 -p 0.22 g1/dset3 g1/dset4 +# 1.9.1 with -p (int) +TOOLTEST h5diff_191.txt file1.h5 file1.h5 -v -p 0.02 g1/dset5 g1/dset6 -# 6.18: number larger than biggest difference - file1.h5 file2.h5 -p 2 g1/dset3 g1/dset4 - -# 6.19: number smaller than smallest difference - file1.h5 file2.h5 -p 0.005 g1/dset3 g1/dset4 - - - -# ############################################################################## -# # -n -# ############################################################################## - - -# 6.20: no value - file1.h5 file2.h5 -n g1/dset3 g1/dset4 - -# 6.21: negative value - file1.h5 file2.h5 -n -4 g1/dset3 g1/dset4 - -# 6.22: zero - file1.h5 file2.h5 -n 0 g1/dset3 g1/dset4 - -# 6.23: non number - file1.h5 file2.h5 -n u g1/dset3 g1/dset4 - -# 6.24: hexadecimal - file1.h5 file2.h5 -n 0x1 g1/dset3 g1/dset4 - -# 6.25: string - file1.h5 file2.h5 -n "2" g1/dset3 g1/dset4 - -# 6.26: repeated option - file1.h5 file2.h5 -n 2 -n 3 g1/dset3 g1/dset4 - -# 6.27: number larger than biggest difference - file1.h5 file2.h5 -n 200 g1/dset3 g1/dset4 - -# 6.28: number smaller than smallest difference - file1.h5 file2.h5 -n 1 g1/dset3 g1/dset4 - -# ############################################################################## -# # non valid files -# ############################################################################## - - file1.h6 file2.h6 +# 1.9.2 with -p (unsigned long_long) +TOOLTEST h5diff_192.txt file1.h5 file1.h5 -v -p 0.02 g1/dset7 g1/dset8 */ - /*------------------------------------------------------------------------- - * Function: gen_datareg - * - * Purpose: generate a dataset region and its reference + * Function: test_types * - * Date: April 19, 2006 + * Purpose: Compare different HDF5 types (H5G_obj_t): + * H5G_DATASET, H5G_TYPE, H5G_GROUP, H5G_LINK, H5G_UDLINK * *------------------------------------------------------------------------- */ - static -void gen_datareg(hid_t fid, - int make_diffs /* flag to modify data buffers */) +int test_types(const char *fname) { - /* data dataset */ - hid_t did1; /* dataset ID */ - hid_t sid1; /* dataspace ID */ - hsize_t dims1[2] = {10,10};/* dimensions */ - int *buf; /* dataset buffer */ - /* reference dataset */ - hid_t did2; /* dataset ID */ - hid_t sid2; /* dataspace ID */ - hsize_t dims2[] = {2}; /* 2 references */ - hdset_reg_ref_t *rbuf; /* buffer for write the references */ - hsize_t start[10]; /* starting location of hyperslab */ - hsize_t count[10]; /* element count of hyperslab */ - hsize_t coord[5][2]; /* coordinates for point selection */ - herr_t status; - int i; - - /* allocate the buffer for write the references */ - rbuf=calloc(2,sizeof(hdset_reg_ref_t)); - - /* allocate the buffer for write the data dataset */ - buf=malloc(10*10*sizeof(int)); - - for (i=0; i<10*10; i++) - { - buf[i]=i; - } - /* create the data dataset */ - sid1 = H5Screate_simple(2,dims1,NULL); - did1 = H5Dcreate(fid,"dsetref",H5T_NATIVE_INT,sid1,H5P_DEFAULT); - status = H5Dwrite(did1,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf); - - /* create the reference dataset */ - sid2 = H5Screate_simple(1,dims2,NULL); - did2 = H5Dcreate(fid,"refreg",H5T_STD_REF_DSETREG,sid2,H5P_DEFAULT); - - /* create the references */ - /* select hyperslab for first reference */ - - start[0]=2; start[1]=2; - count[0]=6; count[1]=6; - if (make_diffs) + hid_t fid1; + hid_t gid1; + hid_t gid2; + hid_t tid1; + hid_t tid2; + herr_t status; + hsize_t dims[1]={1}; + typedef struct s1_t { - start[0]=0; start[1]=0; - count[0]=3; count[1]=3; - } - - status = H5Sselect_hyperslab(sid1,H5S_SELECT_SET,start,NULL,count,NULL); - H5Sget_select_npoints(sid1); - - /* store first dataset region */ - status = H5Rcreate(&rbuf[0],fid,"dsetref",H5R_DATASET_REGION,sid1); - - /* select sequence of five points for second reference */ - coord[0][0]=6; coord[0][1]=9; - coord[1][0]=2; coord[1][1]=2; - coord[2][0]=8; coord[2][1]=4; - coord[3][0]=1; coord[3][1]=6; - coord[4][0]=2; coord[4][1]=8; - if (make_diffs) + int a; + float b; + } s1_t; + typedef struct s2_t { - coord[1][0]=3; coord[1][1]=3; - coord[3][0]=2; coord[3][1]=5; - coord[4][0]=1; coord[4][1]=7; - } - H5Sselect_elements(sid1,H5S_SELECT_SET,5,(const hsize_t **)coord); - H5Sget_select_npoints(sid1); - - /* store second dataset region */ - H5Rcreate(&rbuf[1],fid,"dsetref",H5R_DATASET_REGION,sid1); - - /* write */ - status = H5Dwrite(did2,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,rbuf); - - /* close, free memory buffers */ - status = H5Dclose(did1); - status = H5Sclose(sid1); - status = H5Dclose(did2); - status = H5Sclose(sid2); - free(rbuf); - free(buf); - -} + int a; + } s2_t; /*------------------------------------------------------------------------- - * Function: write_dset_in - * - * Purpose: write datasets in LOC_ID - * + * Create one file *------------------------------------------------------------------------- */ -static -void write_dset_in(hid_t loc_id, - const char* dset_name, /* for saving reference to dataset*/ - hid_t fid, - int make_diffs /* flag to modify data buffers */) -{ - /* Compound datatype */ - typedef struct s_t - { - char a; - double b; - } s_t; - - typedef enum - { - RED, - GREEN - } e_t; - - hid_t did; - hid_t sid; - hid_t tid; - hid_t dcpl; - herr_t status; - int val, i, j, k, n; - float f; - int fillvalue=2; - - /* create 1D attributes with dimension [2], 2 elements */ - hsize_t dims[1]={2}; - char buf1[2][STR_SIZE]= {"ab","de"}; /* string */ - char buf2[2]= {1,2}; /* bitfield, opaque */ - s_t buf3[2]= {{1,2},{3,4}}; /* compound */ - hobj_ref_t buf4[2]; /* reference */ - e_t buf45[2]= {RED,GREEN}; /* enum */ - hvl_t buf5[2]; /* vlen */ - hsize_t dimarray[1]={3}; /* array dimension */ - int buf6[2][3]= {{1,2,3},{4,5,6}}; /* array */ - int buf7[2]= {1,2}; /* integer */ - float buf8[2]= {1,2}; /* float */ - - /* create 2D attributes with dimension [3][2], 6 elements */ - hsize_t dims2[2]={3,2}; - char buf12[6][STR_SIZE]= {"ab","cd","ef","gh","ij","kl"}; /* string */ - char buf22[3][2]= {{1,2},{3,4},{5,6}}; /* bitfield, opaque */ - s_t buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}}; /* compound */ - hobj_ref_t buf42[3][2]; /* reference */ - hvl_t buf52[3][2]; /* vlen */ - int buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}}; /* array */ - int buf72[3][2]= {{1,2},{3,4},{5,6}}; /* integer */ - float buf82[3][2]= {{1,2},{3,4},{5,6}}; /* float */ - - /* create 3D attributes with dimension [4][3][2], 24 elements */ - hsize_t dims3[3]={4,3,2}; - char buf13[24][STR_SIZE]= {"ab","cd","ef","gh","ij","kl","mn","pq", - "rs","tu","vw","xz","AB","CD","EF","GH", - "IJ","KL","MN","PQ","RS","TU","VW","XZ"}; /* string */ - char buf23[4][3][2]; /* bitfield, opaque */ - s_t buf33[4][3][2]; /* compound */ - hobj_ref_t buf43[4][3][2]; /* reference */ - hvl_t buf53[4][3][2]; /* vlen */ - int buf63[24][3]; /* array */ - int buf73[4][3][2]; /* integer */ - float buf83[4][3][2]; /* float */ - + fid1 = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /*------------------------------------------------------------------------- - * 1D + * H5G_DATASET *------------------------------------------------------------------------- */ + write_dset(fid1,1,dims,"dset",H5T_NATIVE_INT,0); /*------------------------------------------------------------------------- - * H5T_STRING + * H5G_GROUP *------------------------------------------------------------------------- */ - - - if (make_diffs) - { - for (i=0; i<2; i++) - for (j=0; j<2; j++) - { - buf1[i][j]='z'; - } - } - - - tid = H5Tcopy(H5T_C_S1); - status = H5Tset_size(tid,STR_SIZE); - write_dset(loc_id,1,dims,"string",tid,buf1); - status = H5Tclose(tid); + gid1 = H5Gcreate(fid1, "g1", 0); + status = H5Gclose(gid1); + gid2 = H5Gcreate(fid1, "g2", 0); + status = H5Gclose(gid2); /*------------------------------------------------------------------------- - * H5T_BITFIELD + * H5G_TYPE *------------------------------------------------------------------------- */ - if (make_diffs) - { - for (i=0; i<2; i++) - buf2[i]=buf2[1]=0; - } - - tid = H5Tcopy(H5T_STD_B8LE); - write_dset(loc_id,1,dims,"bitfield",tid,buf2); - status = H5Tclose(tid); + /* create and commit datatype 1 */ + tid1 = H5Tcreate (H5T_COMPOUND, sizeof(s1_t)); + H5Tinsert(tid1, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT); + H5Tinsert(tid1, "b", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT); + H5Tcommit(fid1, "t1", tid1); + H5Tclose(tid1); + /* create and commit datatype 2 */ + tid2 = H5Tcreate (H5T_COMPOUND, sizeof(s2_t)); + H5Tinsert(tid2, "a", HOFFSET(s2_t, a), H5T_NATIVE_INT); + H5Tcommit(fid1, "t2", tid2); + H5Tclose(tid2); /*------------------------------------------------------------------------- - * H5T_OPAQUE + * H5G_LINK *------------------------------------------------------------------------- */ - if (make_diffs) - { - for (i=0; i<2; i++) - { - buf3[i].a=0; buf3[i].b=0; - } - } - - tid = H5Tcreate(H5T_OPAQUE, 1); - status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */ - write_dset(loc_id,1,dims,"opaque",tid,buf2); - status = H5Tclose(tid); + status = H5Glink(fid1, H5L_TYPE_SOFT, "g1", "l1"); + status = H5Glink(fid1, H5L_TYPE_SOFT, "g2", "l2"); /*------------------------------------------------------------------------- - * H5T_COMPOUND + * H5G_UDLINK *------------------------------------------------------------------------- */ - - - if (make_diffs) - { - for (i=0; i<2; i++) - { - buf45[i]=GREEN; - } - } - - tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t)); - H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR); - H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE); - write_dset(loc_id,1,dims,"compound",tid,buf3); - status = H5Tclose(tid); + H5Lcreate_external("filename", "objname", fid1, "ext_link", H5P_DEFAULT, H5P_DEFAULT); + H5Lregister(UD_link_class); + H5Lcreate_ud(fid1, "ud_link", MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT); /*------------------------------------------------------------------------- - * H5T_REFERENCE (H5R_OBJECT object reference) + * Close *------------------------------------------------------------------------- */ - /* Create references to dataset */ - if (dset_name) - { - status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,-1); - status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,-1); - write_dset(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4); - } + status = H5Fclose(fid1); + return status; +} -/*------------------------------------------------------------------------- - * H5T_REFERENCE (H5R_DATASET_REGION dataset region reference) - *------------------------------------------------------------------------- - */ - gen_datareg(fid,make_diffs); +/* -/*------------------------------------------------------------------------- - * H5T_ENUM - *------------------------------------------------------------------------- - */ - tid = H5Tcreate(H5T_ENUM, sizeof(e_t)); - H5Tenum_insert(tid, "RED", (val = 0, &val)); - H5Tenum_insert(tid, "GREEN", (val = 1, &val)); - write_dset(loc_id,1,dims,"enum",tid,buf45); - status = H5Tclose(tid); +# ############################################################################## +# # not comparable types +# ############################################################################## -/*------------------------------------------------------------------------- - * H5T_VLEN - *------------------------------------------------------------------------- - */ +# 2.0 +TOOLTEST h5diff_20.txt file3.h5 file3.h5 -v dset g1 - /* Allocate and initialize VL dataset to write */ +# 2.1 +TOOLTEST h5diff_21.txt file3.h5 file3.h5 -v dset l1 - buf5[0].len = 1; - buf5[0].p = malloc( 1 * sizeof(int)); - ((int *)buf5[0].p)[0]=1; - buf5[1].len = 2; - buf5[1].p = malloc( 2 * sizeof(int)); - ((int *)buf5[1].p)[0]=2; - ((int *)buf5[1].p)[1]=3; +# 2.2 +TOOLTEST h5diff_22.txt file3.h5 file3.h5 -v dset t1 - if (make_diffs) - { - ((int *)buf5[0].p)[0]=0; - ((int *)buf5[1].p)[0]=0; - ((int *)buf5[1].p)[1]=0; - } +# ############################################################################## +# # compare groups, types, links (no differences and differences) +# ############################################################################## - sid = H5Screate_simple(1,dims,NULL); - tid = H5Tvlen_create(H5T_NATIVE_INT); - did = H5Dcreate(loc_id,"vlen",tid,sid,H5P_DEFAULT); - status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf5); - assert(status>=0); - status = H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf5); - assert(status>=0); - status = H5Dclose(did); - status = H5Tclose(tid); - status = H5Sclose(sid); +# 2.3 +TOOLTEST h5diff_23.txt file3.h5 file3.h5 -v g1 g1 -/*------------------------------------------------------------------------- - * H5T_ARRAY - *------------------------------------------------------------------------- - */ +# 2.4 +TOOLTEST h5diff_24.txt file3.h5 file3.h5 -v t1 t1 - if (make_diffs) - { - for (i=0; i<2; i++) - for (j=0; j<3; j++) - { - buf6[i][j]=0; - } - } +# 2.5 +TOOLTEST h5diff_25.txt file3.h5 file3.h5 -v l1 l1 - tid = H5Tarray_create(H5T_NATIVE_INT, 1, dimarray, NULL); - write_dset(loc_id,1,dims,"array",tid,buf6); - status = H5Tclose(tid); +# 2.6 +TOOLTEST h5diff_26.txt file3.h5 file3.h5 -v g1 g2 + +# 2.7 +TOOLTEST h5diff_27.txt file3.h5 file3.h5 -v t1 t2 + +# 2.8 +TOOLTEST h5diff_28.txt file3.h5 file3.h5 -v l1 l2 +*/ /*------------------------------------------------------------------------- - * H5T_INTEGER and H5T_FLOAT + * Function: test_datatypes + * + * Purpose: test dataset datatypes + * *------------------------------------------------------------------------- */ +static +int test_datatypes(const char *fname) +{ - if (make_diffs) - { - for (i=0; i<2; i++) - { - buf7[i]=0; - buf8[i]=0; - } - } + hid_t fid1; + hsize_t dims[2]={3,2}; + herr_t status; + char buf1a[3][2] = {{1,1},{1,1},{1,1}}; + char buf1b[3][2] = {{1,1},{3,4},{5,6}}; + short buf2a[3][2] = {{1,1},{1,1},{1,1}}; + short buf2b[3][2] = {{1,1},{3,4},{5,6}}; + int buf3a[3][2] = {{1,1},{1,1},{1,1}}; + int buf3b[3][2] = {{1,1},{3,4},{5,6}}; + long buf4a[3][2] = {{1,1},{1,1},{1,1}}; + long buf4b[3][2] = {{1,1},{3,4},{5,6}}; + float buf5a[3][2] = {{1,1},{1,1},{1,1}}; + float buf5b[3][2] = {{1,1},{3,4},{5,6}}; + double buf6a[3][2] = {{1,1},{1,1},{1,1}}; + double buf6b[3][2] = {{1,1},{3,4},{5,6}}; - write_dset(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7); - write_dset(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8); + /*unsigned/signed test + signed char -128 to 127 + unsigned char 0 to 255 + */ + char buf7a[3][2] = {{-1,-128},{-1,-1},{-1,-1}}; + unsigned char buf7b[3][2] = {{1,128},{1,1},{1,1}}; + /* long_long test */ + long_long buf8a[3][2] = {{1,1},{1,1},{1,1}}; + long_long buf8b[3][2] = {{1,1},{3,4},{5,6}}; + unsigned long_long buf9a[3][2] = {{1,1},{1,1},{1,1}}; + unsigned long_long buf9b[3][2] = {{1,1},{3,4},{5,6}}; + + unsigned int buf10a[3][2] = {{UIMAX,1},{1,1},{1,1}}; + unsigned int buf10b[3][2] = {{UIMAX-1,1},{3,4},{5,6}}; -/*------------------------------------------------------------------------- - * 2D - *------------------------------------------------------------------------- - */ /*------------------------------------------------------------------------- - * H5T_STRING + * Create a file *------------------------------------------------------------------------- */ - - if (make_diffs) - { - memset(buf12, 'z', sizeof buf12); - } - - - tid = H5Tcopy(H5T_C_S1); - status = H5Tset_size(tid,STR_SIZE); - write_dset(loc_id,2,dims2,"string2D",tid,buf12); - status = H5Tclose(tid); + fid1 = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /*------------------------------------------------------------------------- - * H5T_BITFIELD + * Check for different storage order. Give a warning if they are different *------------------------------------------------------------------------- */ - - if (make_diffs) - { - memset(buf22,0,sizeof buf22); - } - - tid = H5Tcopy(H5T_STD_B8LE); - write_dset(loc_id,2,dims2,"bitfield2D",tid,buf22); - status = H5Tclose(tid); + write_dset(fid1,2,dims,"dset0a",H5T_STD_I16LE,buf2a); + write_dset(fid1,2,dims,"dset0b",H5T_STD_I32LE,buf3b); /*------------------------------------------------------------------------- - * H5T_OPAQUE + * Check H5T_NATIVE_CHAR *------------------------------------------------------------------------- */ - tid = H5Tcreate(H5T_OPAQUE, 1); - status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */ - write_dset(loc_id,2,dims2,"opaque2D",tid,buf22); - status = H5Tclose(tid); + write_dset(fid1,2,dims,"dset1a",H5T_NATIVE_CHAR,buf1a); + write_dset(fid1,2,dims,"dset1b",H5T_NATIVE_CHAR,buf1b); /*------------------------------------------------------------------------- - * H5T_COMPOUND + * Check H5T_NATIVE_SHORT *------------------------------------------------------------------------- */ - - if (make_diffs) - { - memset(buf32,0,sizeof buf32); - } - - tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t)); - H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR); - H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE); - write_dset(loc_id,2,dims2,"compound2D",tid,buf32); - status = H5Tclose(tid); + write_dset(fid1,2,dims,"dset2a",H5T_NATIVE_SHORT,buf2a); + write_dset(fid1,2,dims,"dset2b",H5T_NATIVE_SHORT,buf2b); /*------------------------------------------------------------------------- - * H5T_REFERENCE (H5R_OBJECT object reference) + * Check H5T_NATIVE_INT *------------------------------------------------------------------------- */ - /* Create references to dataset */ - if (dset_name) - { - for (i = 0; i < 3; i++) { - for (j = 0; j < 2; j++) { - status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,-1); - } - } - write_dset(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42); - } + write_dset(fid1,2,dims,"dset3a",H5T_NATIVE_INT,buf3a); + write_dset(fid1,2,dims,"dset3b",H5T_NATIVE_INT,buf3b); /*------------------------------------------------------------------------- - * H5T_ENUM + * Check H5T_NATIVE_LONG *------------------------------------------------------------------------- */ - - tid = H5Tcreate(H5T_ENUM, sizeof(e_t)); - H5Tenum_insert(tid, "RED", (val = 0, &val)); - H5Tenum_insert(tid, "GREEN", (val = 1, &val)); - write_dset(loc_id,2,dims2,"enum2D",tid,0); - status = H5Tclose(tid); + write_dset(fid1,2,dims,"dset4a",H5T_NATIVE_LONG,buf4a); + write_dset(fid1,2,dims,"dset4b",H5T_NATIVE_LONG,buf4b); /*------------------------------------------------------------------------- - * H5T_VLEN + * Check H5T_NATIVE_FLOAT *------------------------------------------------------------------------- */ - -/* Allocate and initialize VL dataset to write */ - n=0; - for (i = 0; i < 3; i++) { - for (j = 0; j < 2; j++) { - int l; - buf52[i][j].p = malloc((i + 1) * sizeof(int)); - buf52[i][j].len = i + 1; - for (l = 0; l < i + 1; l++) - if (make_diffs)((int *)buf52[i][j].p)[l] = 0; - else ((int *)buf52[i][j].p)[l] = n++; - } - } - - sid = H5Screate_simple(2,dims2,NULL); - tid = H5Tvlen_create(H5T_NATIVE_INT); - did = H5Dcreate(loc_id,"vlen2D",tid,sid,H5P_DEFAULT); - status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf52); - assert(status>=0); - status = H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf52); - assert(status>=0); - status = H5Dclose(did); - status = H5Tclose(tid); - status = H5Sclose(sid); + write_dset(fid1,2,dims,"dset5a",H5T_NATIVE_FLOAT,buf5a); + write_dset(fid1,2,dims,"dset5b",H5T_NATIVE_FLOAT,buf5b); /*------------------------------------------------------------------------- - * H5T_ARRAY + * Check H5T_NATIVE_DOUBLE *------------------------------------------------------------------------- */ - if (make_diffs) - { - memset(buf62,0,sizeof buf62); - } - - - tid = H5Tarray_create(H5T_NATIVE_INT, 1, dimarray, NULL); - write_dset(loc_id,2,dims2,"array2D",tid,buf62); - status = H5Tclose(tid); + write_dset(fid1,2,dims,"dset6a",H5T_NATIVE_DOUBLE,buf6a); + write_dset(fid1,2,dims,"dset6b",H5T_NATIVE_DOUBLE,buf6b); /*------------------------------------------------------------------------- - * H5T_INTEGER, write a fill value + * H5T_NATIVE_CHAR and H5T_NATIVE_UCHAR *------------------------------------------------------------------------- */ - - if (make_diffs) - { - memset(buf72,0,sizeof buf72); - memset(buf82,0,sizeof buf82); - } - - - dcpl = H5Pcreate(H5P_DATASET_CREATE); - status = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillvalue); - sid = H5Screate_simple(2,dims2,NULL); - did = H5Dcreate(loc_id,"integer2D",H5T_NATIVE_INT,sid,dcpl); - status = H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf72); - status = H5Pclose(dcpl); - status = H5Dclose(did); - status = H5Sclose(sid); + write_dset(fid1,2,dims,"dset7a",H5T_NATIVE_CHAR,buf7a); + write_dset(fid1,2,dims,"dset7b",H5T_NATIVE_UCHAR,buf7b); /*------------------------------------------------------------------------- - * H5T_FLOAT + * H5T_NATIVE_LLONG *------------------------------------------------------------------------- */ - write_dset(loc_id,2,dims2,"float2D",H5T_NATIVE_FLOAT,buf82); - + write_dset(fid1,2,dims,"dset8a",H5T_NATIVE_LLONG,buf8a); + write_dset(fid1,2,dims,"dset8b",H5T_NATIVE_LLONG,buf8b); /*------------------------------------------------------------------------- - * 3D + * H5T_NATIVE_ULLONG *------------------------------------------------------------------------- */ + write_dset(fid1,2,dims,"dset9a",H5T_NATIVE_ULLONG,buf9a); + write_dset(fid1,2,dims,"dset9b",H5T_NATIVE_ULLONG,buf9b); + /*------------------------------------------------------------------------- - * H5T_STRING + * H5T_NATIVE_INT *------------------------------------------------------------------------- */ - if (make_diffs) - { - memset(buf13,'z',sizeof buf13); - } + write_dset(fid1,2,dims,"dset10a",H5T_NATIVE_UINT,buf10a); + write_dset(fid1,2,dims,"dset10b",H5T_NATIVE_UINT,buf10b); - tid = H5Tcopy(H5T_C_S1); - status = H5Tset_size(tid,STR_SIZE); - write_dset(loc_id,3,dims3,"string3D",tid,buf13); - status = H5Tclose(tid); /*------------------------------------------------------------------------- - * H5T_BITFIELD + * Close *------------------------------------------------------------------------- */ + status = H5Fclose(fid1); + return status; +} +/* +# ############################################################################## +# # Dataset datatypes +# ############################################################################## - n=1; - for (i = 0; i < 4; i++) { - for (j = 0; j < 3; j++) { - for (k = 0; k < 2; k++) { - if (make_diffs) buf23[i][j][k]=0; - else buf23[i][j][k]=n++; - } - } - } +# 5.0 +TOOLTEST h5diff_50.txt file4.h5 file4.h5 -v dset0a dset0b +# 5.1 +TOOLTEST h5diff_51.txt file4.h5 file4.h5 -v dset1a dset1b - tid = H5Tcopy(H5T_STD_B8LE); - write_dset(loc_id,3,dims3,"bitfield3D",tid,buf23); - status = H5Tclose(tid); +# 5.2 +TOOLTEST h5diff_52.txt file4.h5 file4.h5 -v dset2a dset2b -/*------------------------------------------------------------------------- - * H5T_OPAQUE - *------------------------------------------------------------------------- - */ - tid = H5Tcreate(H5T_OPAQUE, 1); - status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */ - write_dset(loc_id,3,dims3,"opaque3D",tid,buf23); - status = H5Tclose(tid); +# 5.3 +TOOLTEST h5diff_53.txt file4.h5 file4.h5 -v dset3a dset4b -/*------------------------------------------------------------------------- - * H5T_COMPOUND - *------------------------------------------------------------------------- - */ +# 5.4 +TOOLTEST h5diff_54.txt file4.h5 file4.h5 -v dset4a dset4b - n=1; - for (i = 0; i < 4; i++) { - for (j = 0; j < 3; j++) { - for (k = 0; k < 2; k++) { - if (make_diffs) { - buf33[i][j][k].a=0; - buf33[i][j][k].b=0; - } - else { - buf33[i][j][k].a=n++; - buf33[i][j][k].b=n++; - } - } - } - } +# 5.5 +TOOLTEST h5diff_55.txt file4.h5 file4.h5 -v dset5a dset5b +# 5.6 +TOOLTEST h5diff_56.txt file4.h5 file4.h5 -v dset6a dset6b - tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t)); - H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR); - H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE); - write_dset(loc_id,3,dims3,"compound3D",tid,buf33); - status = H5Tclose(tid); +# 5.7 +TOOLTEST h5diff_57.txt file4.h5 file4.h5 -v dset7a dset7b -/*------------------------------------------------------------------------- - * H5T_REFERENCE (H5R_OBJECT object reference) - *------------------------------------------------------------------------- - */ - /* Create references to dataset */ - if (dset_name) - { - for (i = 0; i < 4; i++) { - for (j = 0; j < 3; j++) { - for (k = 0; k < 2; k++) - status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,-1); - } - } - write_dset(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43); - } +# 5.8 (region reference) +TOOLTEST h5diff_58.txt file7.h5 file8.h5 -v refreg +*/ /*------------------------------------------------------------------------- - * H5T_ENUM + * Function: test_attributes + * + * Purpose: test attributes + * *------------------------------------------------------------------------- */ +static +int test_attributes(const char *file, + int make_diffs /* flag to modify data buffers */) +{ + hid_t fid; + hid_t did; + hid_t gid; + hid_t root_id; + hid_t sid; + hsize_t dims[1]={2}; + herr_t status; - tid = H5Tcreate(H5T_ENUM, sizeof(e_t)); - H5Tenum_insert(tid, "RED", (val = 0, &val)); - H5Tenum_insert(tid, "GREEN", (val = 1, &val)); - write_dset(loc_id,3,dims3,"enum3D",tid,0); - status = H5Tclose(tid); + /* Create a file */ + if ((fid = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0) + return -1; + + /* Create a 1D dataset */ + sid = H5Screate_simple(1,dims,NULL); + did = H5Dcreate(fid,"dset",H5T_NATIVE_INT,sid,H5P_DEFAULT); + status = H5Sclose(sid); + assert(status>=0); + + /* Create groups */ + gid = H5Gcreate(fid,"g1",0); + root_id = H5Gopen(fid, "/"); /*------------------------------------------------------------------------- - * H5T_VLEN + * write a series of attributes on the dataset, group, and root group *------------------------------------------------------------------------- */ - /* Allocate and initialize VL dataset to write */ - n=0; - for (i = 0; i < 4; i++) { - for (j = 0; j < 3; j++) { - for (k = 0; k < 2; k++) { - int l; - buf53[i][j][k].p = malloc((i + 1) * sizeof(int)); - buf53[i][j][k].len = i + 1; - for (l = 0; l < i + 1; l++) - if (make_diffs)((int *)buf53[i][j][k].p)[l] = 0; - else ((int *)buf53[i][j][k].p)[l] = n++; - } - } - } + write_attr_in(did,"dset",fid,make_diffs); + write_attr_in(gid,NULL,0,make_diffs); + write_attr_in(root_id,NULL,0,make_diffs); - sid = H5Screate_simple(3,dims3,NULL); - tid = H5Tvlen_create(H5T_NATIVE_INT); - did = H5Dcreate(loc_id,"vlen3D",tid,sid,H5P_DEFAULT); - status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf53); + + /* Close */ + status = H5Dclose(did); assert(status>=0); - status = H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf53); + status = H5Gclose(gid); assert(status>=0); - status = H5Dclose(did); - status = H5Tclose(tid); - status = H5Sclose(sid); + status = H5Gclose(root_id); + assert(status>=0); + + /* Close file */ + status = H5Fclose(fid); + assert(status>=0); + return status; +} + /*------------------------------------------------------------------------- - * H5T_ARRAY + * Function: test_datasets + * + * Purpose: Check all HDF5 classes + * H5T_INTEGER, H5T_FLOAT + * H5T_TIME, H5T_STRING, H5T_BITFIELD, H5T_OPAQUE, H5T_COMPOUND, H5T_REFERENCE, + * H5T_ENUM, H5T_VLEN, H5T_ARRAY + * *------------------------------------------------------------------------- */ +static +int test_datasets(const char *file, + int make_diffs /* flag to modify data buffers */) +{ + hid_t fid; + hid_t did; + hid_t gid; + hid_t sid; + hsize_t dims[1]={2}; + herr_t status; + int buf[2]={1,2}; - - n=1; - for (i = 0; i < 24; i++) { - for (j = 0; j < (int)dimarray[0]; j++) { - if (make_diffs) buf63[i][j]=0; - else buf63[i][j]=n++; - } + if (make_diffs) + { + memset(buf,0,sizeof buf); } - tid = H5Tarray_create(H5T_NATIVE_INT, 1, dimarray, NULL); - write_dset(loc_id,3,dims3,"array3D",tid,buf63); - status = H5Tclose(tid); + /* Create a file */ + if ((fid = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0) + return -1; + + /* Create a 1D dataset */ + sid = H5Screate_simple(1,dims,NULL); + did = H5Dcreate(fid,"dset",H5T_NATIVE_INT,sid,H5P_DEFAULT); + status = H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf); + status = H5Sclose(sid); + assert(status>=0); + + /* Create a group */ + gid = H5Gcreate(fid,"g1",0); /*------------------------------------------------------------------------- - * H5T_INTEGER and H5T_FLOAT + * write a series of datasets on the group *------------------------------------------------------------------------- */ - n=1; f=1; - for (i = 0; i < 4; i++) { - for (j = 0; j < 3; j++) { - for (k = 0; k < 2; k++) { - if (make_diffs) { - buf73[i][j][k]=0; - buf83[i][j][k]=0; - } - else { - buf73[i][j][k]=n++; - buf83[i][j][k]=f++; - } - } - } - } - write_dset(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73); - write_dset(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83); -} + write_dset_in(gid,"/dset",fid,make_diffs); + /* Close */ + status = H5Dclose(did); + assert(status>=0); + status = H5Gclose(gid); + assert(status>=0); + /* Close file */ + status = H5Fclose(fid); + assert(status>=0); + return status; +} /*------------------------------------------------------------------------- * Function: write_attr_in @@ -1859,8 +1464,6 @@ position bitfield3D of </g1> bitfield3D of </g1> difference [ 3 2 1 ] 48 0 48 */ - - tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t)); H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR); H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE); @@ -2044,446 +1647,872 @@ etc write_attr(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83); } + + /*------------------------------------------------------------------------- - * Function: test_dsetall + * Function: write_dset_in * - * Purpose: Check all HDF5 classes - * H5T_INTEGER, H5T_FLOAT - * H5T_TIME, H5T_STRING, H5T_BITFIELD, H5T_OPAQUE, H5T_COMPOUND, H5T_REFERENCE, - * H5T_ENUM, H5T_VLEN, H5T_ARRAY + * Purpose: write datasets in LOC_ID * *------------------------------------------------------------------------- */ static -int test_dsetall(const char *file, - int make_diffs /* flag to modify data buffers */) +void write_dset_in(hid_t loc_id, + const char* dset_name, /* for saving reference to dataset*/ + hid_t fid, + int make_diffs /* flag to modify data buffers */) { - hid_t fid; + /* Compound datatype */ + typedef struct s_t + { + char a; + double b; + } s_t; + + typedef enum + { + RED, + GREEN + } e_t; + hid_t did; - hid_t gid; hid_t sid; - hsize_t dims[1]={2}; + hid_t tid; + hid_t dcpl; herr_t status; - int buf[2]={1,2}; + int val, i, j, k, n; + float f; + int fillvalue=2; + + /* create 1D attributes with dimension [2], 2 elements */ + hsize_t dims[1]={2}; + char buf1[2][STR_SIZE]= {"ab","de"}; /* string */ + char buf2[2]= {1,2}; /* bitfield, opaque */ + s_t buf3[2]= {{1,2},{3,4}}; /* compound */ + hobj_ref_t buf4[2]; /* reference */ + e_t buf45[2]= {RED,GREEN}; /* enum */ + hvl_t buf5[2]; /* vlen */ + hsize_t dimarray[1]={3}; /* array dimension */ + int buf6[2][3]= {{1,2,3},{4,5,6}}; /* array */ + int buf7[2]= {1,2}; /* integer */ + float buf8[2]= {1,2}; /* float */ + + /* create 2D attributes with dimension [3][2], 6 elements */ + hsize_t dims2[2]={3,2}; + char buf12[6][STR_SIZE]= {"ab","cd","ef","gh","ij","kl"}; /* string */ + char buf22[3][2]= {{1,2},{3,4},{5,6}}; /* bitfield, opaque */ + s_t buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}}; /* compound */ + hobj_ref_t buf42[3][2]; /* reference */ + hvl_t buf52[3][2]; /* vlen */ + int buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}}; /* array */ + int buf72[3][2]= {{1,2},{3,4},{5,6}}; /* integer */ + float buf82[3][2]= {{1,2},{3,4},{5,6}}; /* float */ + + /* create 3D attributes with dimension [4][3][2], 24 elements */ + hsize_t dims3[3]={4,3,2}; + char buf13[24][STR_SIZE]= {"ab","cd","ef","gh","ij","kl","mn","pq", + "rs","tu","vw","xz","AB","CD","EF","GH", + "IJ","KL","MN","PQ","RS","TU","VW","XZ"}; /* string */ + char buf23[4][3][2]; /* bitfield, opaque */ + s_t buf33[4][3][2]; /* compound */ + hobj_ref_t buf43[4][3][2]; /* reference */ + hvl_t buf53[4][3][2]; /* vlen */ + int buf63[24][3]; /* array */ + int buf73[4][3][2]; /* integer */ + float buf83[4][3][2]; /* float */ + + +/*------------------------------------------------------------------------- + * 1D + *------------------------------------------------------------------------- + */ + +/*------------------------------------------------------------------------- + * H5T_STRING + *------------------------------------------------------------------------- + */ + if (make_diffs) { - memset(buf,0,sizeof buf); + for (i=0; i<2; i++) + for (j=0; j<2; j++) + { + buf1[i][j]='z'; + } } - /* Create a file */ - if ((fid = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0) - return -1; - - /* Create a 1D dataset */ - sid = H5Screate_simple(1,dims,NULL); - did = H5Dcreate(fid,"dset",H5T_NATIVE_INT,sid,H5P_DEFAULT); - status = H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf); - status = H5Sclose(sid); - assert(status>=0); - /* Create a group */ - gid = H5Gcreate(fid,"g1",0); + tid = H5Tcopy(H5T_C_S1); + status = H5Tset_size(tid,STR_SIZE); + write_dset(loc_id,1,dims,"string",tid,buf1); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * write a series of datasets on the group + * H5T_BITFIELD *------------------------------------------------------------------------- */ - write_dset_in(gid,"/dset",fid,make_diffs); - - /* Close */ - status = H5Dclose(did); - assert(status>=0); - status = H5Gclose(gid); - assert(status>=0); + if (make_diffs) + { + for (i=0; i<2; i++) + buf2[i]=buf2[1]=0; + } - /* Close file */ - status = H5Fclose(fid); - assert(status>=0); - return status; -} + tid = H5Tcopy(H5T_STD_B8LE); + write_dset(loc_id,1,dims,"bitfield",tid,buf2); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * Function: test_basic - * - * Purpose: Basic review tests - * + * H5T_OPAQUE *------------------------------------------------------------------------- */ -static -int test_basic(const char *file1, - const char *file2) -{ - hid_t fid1, fid2; - hid_t gid1, gid2, gid3; - herr_t status; - hsize_t dims[2] = { 3,2 }; + if (make_diffs) + { + for (i=0; i<2; i++) + { + buf3[i].a=0; buf3[i].b=0; + } + } - /* Test */ - double data1[3][2] = {{1,1},{1,1},{1,1}}; - double data2[3][2] = {{1,1.1},{1.01,1.001},{1.0001,1}}; - double data3[3][2] = {{100,110},{100,100},{100,100}}; - double data4[3][2] = {{110,100},{90,80},{140,200}}; - int data5[3][2] = {{100,100},{100,100},{100,100}}; - int data6[3][2] = {{101,102},{103,104},{150,200}}; - unsigned long_long data7[3][2] = {{100,100},{100,100},{100,100}}; - unsigned long_long data8[3][2] = {{101,102},{103,104},{150,200}}; + tid = H5Tcreate(H5T_OPAQUE, 1); + status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */ + write_dset(loc_id,1,dims,"opaque",tid,buf2); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * Create two files + * H5T_COMPOUND *------------------------------------------------------------------------- */ - fid1 = H5Fcreate (file1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - fid2 = H5Fcreate (file2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - /* Create groups */ - gid1 = H5Gcreate(fid1, "g1", 0); - gid2 = H5Gcreate(fid2, "g1", 0); - gid3 = H5Gcreate(fid2, "g2", 0); + if (make_diffs) + { + for (i=0; i<2; i++) + { + buf45[i]=GREEN; + } + } - write_dset(gid1,2,dims,"dset1",H5T_NATIVE_DOUBLE,data1); - write_dset(gid2,2,dims,"dset2",H5T_NATIVE_DOUBLE,data2); - write_dset(gid1,2,dims,"dset3",H5T_NATIVE_DOUBLE,data3); - write_dset(gid2,2,dims,"dset4",H5T_NATIVE_DOUBLE,data4); - write_dset(gid2,2,dims,"dset1",H5T_NATIVE_DOUBLE,data2); + tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t)); + H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR); + H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE); + write_dset(loc_id,1,dims,"compound",tid,buf3); + status = H5Tclose(tid); - /* relative (int) */ - write_dset(gid1,2,dims,"dset5",H5T_NATIVE_INT,data5); - write_dset(gid1,2,dims,"dset6",H5T_NATIVE_INT,data6); - /* relative (unsigned long_long) */ - write_dset(gid1,2,dims,"dset7",H5T_NATIVE_ULLONG,data7); - write_dset(gid1,2,dims,"dset8",H5T_NATIVE_ULLONG,data8); +/*------------------------------------------------------------------------- + * H5T_REFERENCE (H5R_OBJECT object reference) + *------------------------------------------------------------------------- + */ + /* Create references to dataset */ + if (dset_name) + { + status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,-1); + status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,-1); + write_dset(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4); + } /*------------------------------------------------------------------------- - * Close + * H5T_REFERENCE (H5R_DATASET_REGION dataset region reference) *------------------------------------------------------------------------- */ - status = H5Gclose(gid1); - status = H5Gclose(gid2); - status = H5Gclose(gid3); - status = H5Fclose(fid1); - status = H5Fclose(fid2); - return status; -} + + gen_datareg(fid,make_diffs); /*------------------------------------------------------------------------- - * Function: test_basic - * - * Purpose: Compare different HDF5 types (H5G_obj_t): - * H5G_DATASET, H5G_TYPE, H5G_GROUP, H5G_LINK, H5G_UDLINK - * + * H5T_ENUM *------------------------------------------------------------------------- */ -static -int test_types(const char *file1, - const char UNUSED *file2) -{ + tid = H5Tcreate(H5T_ENUM, sizeof(e_t)); + H5Tenum_insert(tid, "RED", (val = 0, &val)); + H5Tenum_insert(tid, "GREEN", (val = 1, &val)); + write_dset(loc_id,1,dims,"enum",tid,buf45); + status = H5Tclose(tid); - hid_t fid1; - hid_t gid1; - hid_t gid2; - hid_t tid1; - hid_t tid2; - herr_t status; - hsize_t dims[1]={1}; - typedef struct s1_t - { - int a; - float b; - } s1_t; - typedef struct s2_t +/*------------------------------------------------------------------------- + * H5T_VLEN + *------------------------------------------------------------------------- + */ + + /* Allocate and initialize VL dataset to write */ + + buf5[0].len = 1; + buf5[0].p = malloc( 1 * sizeof(int)); + ((int *)buf5[0].p)[0]=1; + buf5[1].len = 2; + buf5[1].p = malloc( 2 * sizeof(int)); + ((int *)buf5[1].p)[0]=2; + ((int *)buf5[1].p)[1]=3; + + if (make_diffs) { - int a; - } s2_t; + ((int *)buf5[0].p)[0]=0; + ((int *)buf5[1].p)[0]=0; + ((int *)buf5[1].p)[1]=0; + } + + sid = H5Screate_simple(1,dims,NULL); + tid = H5Tvlen_create(H5T_NATIVE_INT); + did = H5Dcreate(loc_id,"vlen",tid,sid,H5P_DEFAULT); + status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf5); + assert(status>=0); + status = H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf5); + assert(status>=0); + status = H5Dclose(did); + status = H5Tclose(tid); + status = H5Sclose(sid); /*------------------------------------------------------------------------- - * Create one file + * H5T_ARRAY *------------------------------------------------------------------------- */ - fid1 = H5Fcreate (file1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + if (make_diffs) + { + for (i=0; i<2; i++) + for (j=0; j<3; j++) + { + buf6[i][j]=0; + } + } + + tid = H5Tarray_create(H5T_NATIVE_INT, 1, dimarray, NULL); + write_dset(loc_id,1,dims,"array",tid,buf6); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * H5G_DATASET + * H5T_INTEGER and H5T_FLOAT *------------------------------------------------------------------------- */ - write_dset(fid1,1,dims,"dset",H5T_NATIVE_INT,0); + + if (make_diffs) + { + for (i=0; i<2; i++) + { + buf7[i]=0; + buf8[i]=0; + } + } + + write_dset(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7); + write_dset(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8); + /*------------------------------------------------------------------------- - * H5G_GROUP + * 2D *------------------------------------------------------------------------- */ - gid1 = H5Gcreate(fid1, "g1", 0); - status = H5Gclose(gid1); - gid2 = H5Gcreate(fid1, "g2", 0); - status = H5Gclose(gid2); /*------------------------------------------------------------------------- - * H5G_TYPE + * H5T_STRING *------------------------------------------------------------------------- */ - /* create and commit datatype 1 */ - tid1 = H5Tcreate (H5T_COMPOUND, sizeof(s1_t)); - H5Tinsert(tid1, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT); - H5Tinsert(tid1, "b", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT); - H5Tcommit(fid1, "t1", tid1); - H5Tclose(tid1); - /* create and commit datatype 2 */ - tid2 = H5Tcreate (H5T_COMPOUND, sizeof(s2_t)); - H5Tinsert(tid2, "a", HOFFSET(s2_t, a), H5T_NATIVE_INT); - H5Tcommit(fid1, "t2", tid2); - H5Tclose(tid2); + if (make_diffs) + { + memset(buf12, 'z', sizeof buf12); + } + + + tid = H5Tcopy(H5T_C_S1); + status = H5Tset_size(tid,STR_SIZE); + write_dset(loc_id,2,dims2,"string2D",tid,buf12); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * H5G_LINK + * H5T_BITFIELD *------------------------------------------------------------------------- */ - status = H5Glink(fid1, H5L_TYPE_SOFT, "g1", "l1"); - status = H5Glink(fid1, H5L_TYPE_SOFT, "g2", "l2"); + + if (make_diffs) + { + memset(buf22,0,sizeof buf22); + } + + tid = H5Tcopy(H5T_STD_B8LE); + write_dset(loc_id,2,dims2,"bitfield2D",tid,buf22); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * H5G_UDLINK + * H5T_OPAQUE *------------------------------------------------------------------------- */ - H5Lcreate_external("filename", "objname", fid1, "ext_link", H5P_DEFAULT, H5P_DEFAULT); - H5Lregister(UD_link_class); - H5Lcreate_ud(fid1, "ud_link", MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT); + tid = H5Tcreate(H5T_OPAQUE, 1); + status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */ + write_dset(loc_id,2,dims2,"opaque2D",tid,buf22); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * Close + * H5T_COMPOUND *------------------------------------------------------------------------- */ - status = H5Fclose(fid1); - return status; -} + + if (make_diffs) + { + memset(buf32,0,sizeof buf32); + } + + tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t)); + H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR); + H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE); + write_dset(loc_id,2,dims2,"compound2D",tid,buf32); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * Function: test_native - * - * Purpose: test datasets datatypes - * + * H5T_REFERENCE (H5R_OBJECT object reference) *------------------------------------------------------------------------- */ -static -int test_native(const char *file1, - const char UNUSED *file2) -{ + /* Create references to dataset */ + if (dset_name) + { + for (i = 0; i < 3; i++) { + for (j = 0; j < 2; j++) { + status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,-1); + } + } + write_dset(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42); + } - hid_t fid1; - hsize_t dims[2]={3,2}; - herr_t status; - char buf1a[3][2] = {{1,1},{1,1},{1,1}}; - char buf1b[3][2] = {{1,1},{3,4},{5,6}}; - short buf2a[3][2] = {{1,1},{1,1},{1,1}}; - short buf2b[3][2] = {{1,1},{3,4},{5,6}}; - int buf3a[3][2] = {{1,1},{1,1},{1,1}}; - int buf3b[3][2] = {{1,1},{3,4},{5,6}}; - long buf4a[3][2] = {{1,1},{1,1},{1,1}}; - long buf4b[3][2] = {{1,1},{3,4},{5,6}}; - float buf5a[3][2] = {{1,1},{1,1},{1,1}}; - float buf5b[3][2] = {{1,1},{3,4},{5,6}}; - double buf6a[3][2] = {{1,1},{1,1},{1,1}}; - double buf6b[3][2] = {{1,1},{3,4},{5,6}}; +/*------------------------------------------------------------------------- + * H5T_ENUM + *------------------------------------------------------------------------- + */ - /*unsigned/signed test - signed char -128 to 127 - unsigned char 0 to 255 - */ - char buf7a[3][2] = {{-1,-128},{-1,-1},{-1,-1}}; - unsigned char buf7b[3][2] = {{1,128},{1,1},{1,1}}; + tid = H5Tcreate(H5T_ENUM, sizeof(e_t)); + H5Tenum_insert(tid, "RED", (val = 0, &val)); + H5Tenum_insert(tid, "GREEN", (val = 1, &val)); + write_dset(loc_id,2,dims2,"enum2D",tid,0); + status = H5Tclose(tid); - /* long_long test */ - long_long buf8a[3][2] = {{1,1},{1,1},{1,1}}; - long_long buf8b[3][2] = {{1,1},{3,4},{5,6}}; - unsigned long_long buf9a[3][2] = {{1,1},{1,1},{1,1}}; - unsigned long_long buf9b[3][2] = {{1,1},{3,4},{5,6}}; +/*------------------------------------------------------------------------- + * H5T_VLEN + *------------------------------------------------------------------------- + */ - unsigned int buf10a[3][2] = {{UIMAX,1},{1,1},{1,1}}; - unsigned int buf10b[3][2] = {{UIMAX-1,1},{3,4},{5,6}}; +/* Allocate and initialize VL dataset to write */ + n=0; + for (i = 0; i < 3; i++) { + for (j = 0; j < 2; j++) { + int l; + buf52[i][j].p = malloc((i + 1) * sizeof(int)); + buf52[i][j].len = i + 1; + for (l = 0; l < i + 1; l++) + if (make_diffs)((int *)buf52[i][j].p)[l] = 0; + else ((int *)buf52[i][j].p)[l] = n++; + } + } + sid = H5Screate_simple(2,dims2,NULL); + tid = H5Tvlen_create(H5T_NATIVE_INT); + did = H5Dcreate(loc_id,"vlen2D",tid,sid,H5P_DEFAULT); + status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf52); + assert(status>=0); + status = H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf52); + assert(status>=0); + status = H5Dclose(did); + status = H5Tclose(tid); + status = H5Sclose(sid); /*------------------------------------------------------------------------- - * Create a file + * H5T_ARRAY *------------------------------------------------------------------------- */ - fid1 = H5Fcreate (file1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + if (make_diffs) + { + memset(buf62,0,sizeof buf62); + } + + + tid = H5Tarray_create(H5T_NATIVE_INT, 1, dimarray, NULL); + write_dset(loc_id,2,dims2,"array2D",tid,buf62); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * Check for different storage order. Give a warning if they are different + * H5T_INTEGER, write a fill value *------------------------------------------------------------------------- */ - write_dset(fid1,2,dims,"dset0a",H5T_STD_I16LE,buf2a); - write_dset(fid1,2,dims,"dset0b",H5T_STD_I32LE,buf3b); + + if (make_diffs) + { + memset(buf72,0,sizeof buf72); + memset(buf82,0,sizeof buf82); + } + + + dcpl = H5Pcreate(H5P_DATASET_CREATE); + status = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillvalue); + sid = H5Screate_simple(2,dims2,NULL); + did = H5Dcreate(loc_id,"integer2D",H5T_NATIVE_INT,sid,dcpl); + status = H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf72); + status = H5Pclose(dcpl); + status = H5Dclose(did); + status = H5Sclose(sid); /*------------------------------------------------------------------------- - * Check H5T_NATIVE_CHAR + * H5T_FLOAT *------------------------------------------------------------------------- */ - write_dset(fid1,2,dims,"dset1a",H5T_NATIVE_CHAR,buf1a); - write_dset(fid1,2,dims,"dset1b",H5T_NATIVE_CHAR,buf1b); + + write_dset(loc_id,2,dims2,"float2D",H5T_NATIVE_FLOAT,buf82); + /*------------------------------------------------------------------------- - * Check H5T_NATIVE_SHORT + * 3D *------------------------------------------------------------------------- */ - write_dset(fid1,2,dims,"dset2a",H5T_NATIVE_SHORT,buf2a); - write_dset(fid1,2,dims,"dset2b",H5T_NATIVE_SHORT,buf2b); /*------------------------------------------------------------------------- - * Check H5T_NATIVE_INT + * H5T_STRING *------------------------------------------------------------------------- */ - write_dset(fid1,2,dims,"dset3a",H5T_NATIVE_INT,buf3a); - write_dset(fid1,2,dims,"dset3b",H5T_NATIVE_INT,buf3b); + + if (make_diffs) + { + memset(buf13,'z',sizeof buf13); + } + + tid = H5Tcopy(H5T_C_S1); + status = H5Tset_size(tid,STR_SIZE); + write_dset(loc_id,3,dims3,"string3D",tid,buf13); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * Check H5T_NATIVE_LONG + * H5T_BITFIELD *------------------------------------------------------------------------- */ - write_dset(fid1,2,dims,"dset4a",H5T_NATIVE_LONG,buf4a); - write_dset(fid1,2,dims,"dset4b",H5T_NATIVE_LONG,buf4b); + + + n=1; + for (i = 0; i < 4; i++) { + for (j = 0; j < 3; j++) { + for (k = 0; k < 2; k++) { + if (make_diffs) buf23[i][j][k]=0; + else buf23[i][j][k]=n++; + } + } + } + + + tid = H5Tcopy(H5T_STD_B8LE); + write_dset(loc_id,3,dims3,"bitfield3D",tid,buf23); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * Check H5T_NATIVE_FLOAT + * H5T_OPAQUE *------------------------------------------------------------------------- */ - write_dset(fid1,2,dims,"dset5a",H5T_NATIVE_FLOAT,buf5a); - write_dset(fid1,2,dims,"dset5b",H5T_NATIVE_FLOAT,buf5b); + tid = H5Tcreate(H5T_OPAQUE, 1); + status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */ + write_dset(loc_id,3,dims3,"opaque3D",tid,buf23); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * Check H5T_NATIVE_DOUBLE + * H5T_COMPOUND *------------------------------------------------------------------------- */ - write_dset(fid1,2,dims,"dset6a",H5T_NATIVE_DOUBLE,buf6a); - write_dset(fid1,2,dims,"dset6b",H5T_NATIVE_DOUBLE,buf6b); + n=1; + for (i = 0; i < 4; i++) { + for (j = 0; j < 3; j++) { + for (k = 0; k < 2; k++) { + if (make_diffs) { + buf33[i][j][k].a=0; + buf33[i][j][k].b=0; + } + else { + buf33[i][j][k].a=n++; + buf33[i][j][k].b=n++; + } + } + } + } + + + tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t)); + H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR); + H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE); + write_dset(loc_id,3,dims3,"compound3D",tid,buf33); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * H5T_NATIVE_CHAR and H5T_NATIVE_UCHAR + * H5T_REFERENCE (H5R_OBJECT object reference) *------------------------------------------------------------------------- */ - - write_dset(fid1,2,dims,"dset7a",H5T_NATIVE_CHAR,buf7a); - write_dset(fid1,2,dims,"dset7b",H5T_NATIVE_UCHAR,buf7b); + /* Create references to dataset */ + if (dset_name) + { + for (i = 0; i < 4; i++) { + for (j = 0; j < 3; j++) { + for (k = 0; k < 2; k++) + status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,-1); + } + } + write_dset(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43); + } /*------------------------------------------------------------------------- - * H5T_NATIVE_LLONG + * H5T_ENUM *------------------------------------------------------------------------- */ - write_dset(fid1,2,dims,"dset8a",H5T_NATIVE_LLONG,buf8a); - write_dset(fid1,2,dims,"dset8b",H5T_NATIVE_LLONG,buf8b); + tid = H5Tcreate(H5T_ENUM, sizeof(e_t)); + H5Tenum_insert(tid, "RED", (val = 0, &val)); + H5Tenum_insert(tid, "GREEN", (val = 1, &val)); + write_dset(loc_id,3,dims3,"enum3D",tid,0); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * H5T_NATIVE_ULLONG + * H5T_VLEN *------------------------------------------------------------------------- */ - write_dset(fid1,2,dims,"dset9a",H5T_NATIVE_ULLONG,buf9a); - write_dset(fid1,2,dims,"dset9b",H5T_NATIVE_ULLONG,buf9b); + /* Allocate and initialize VL dataset to write */ + n=0; + for (i = 0; i < 4; i++) { + for (j = 0; j < 3; j++) { + for (k = 0; k < 2; k++) { + int l; + buf53[i][j][k].p = malloc((i + 1) * sizeof(int)); + buf53[i][j][k].len = i + 1; + for (l = 0; l < i + 1; l++) + if (make_diffs)((int *)buf53[i][j][k].p)[l] = 0; + else ((int *)buf53[i][j][k].p)[l] = n++; + } + } + } + + sid = H5Screate_simple(3,dims3,NULL); + tid = H5Tvlen_create(H5T_NATIVE_INT); + did = H5Dcreate(loc_id,"vlen3D",tid,sid,H5P_DEFAULT); + status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf53); + assert(status>=0); + status = H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf53); + assert(status>=0); + status = H5Dclose(did); + status = H5Tclose(tid); + status = H5Sclose(sid); /*------------------------------------------------------------------------- - * H5T_NATIVE_INT + * H5T_ARRAY *------------------------------------------------------------------------- */ - write_dset(fid1,2,dims,"dset10a",H5T_NATIVE_UINT,buf10a); - write_dset(fid1,2,dims,"dset10b",H5T_NATIVE_UINT,buf10b); + n=1; + for (i = 0; i < 24; i++) { + for (j = 0; j < (int)dimarray[0]; j++) { + if (make_diffs) buf63[i][j]=0; + else buf63[i][j]=n++; + } + } + + tid = H5Tarray_create(H5T_NATIVE_INT, 1, dimarray, NULL); + write_dset(loc_id,3,dims3,"array3D",tid,buf63); + status = H5Tclose(tid); /*------------------------------------------------------------------------- - * Close + * H5T_INTEGER and H5T_FLOAT *------------------------------------------------------------------------- */ - status = H5Fclose(fid1); - return status; + n=1; f=1; + for (i = 0; i < 4; i++) { + for (j = 0; j < 3; j++) { + for (k = 0; k < 2; k++) { + if (make_diffs) { + buf73[i][j][k]=0; + buf83[i][j][k]=0; + } + else { + buf73[i][j][k]=n++; + buf83[i][j][k]=f++; + } + } + } + } + write_dset(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73); + write_dset(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83); } /*------------------------------------------------------------------------- - * Function: test_attr + * Function: gen_datareg * - * Purpose: test attributes + * Purpose: generate a dataset region and its reference + * + * Date: April 19, 2006 * *------------------------------------------------------------------------- */ + static -int test_attr(const char *file, - int make_diffs /* flag to modify data buffers */) +void gen_datareg(hid_t fid, + int make_diffs /* flag to modify data buffers */) { - hid_t fid; - hid_t did; - hid_t gid; - hid_t root_id; - hid_t sid; - hsize_t dims[1]={2}; - herr_t status; + /* data dataset */ + hid_t did1; /* dataset ID */ + hid_t sid1; /* dataspace ID */ + hsize_t dims1[2] = {10,10};/* dimensions */ + int *buf; /* dataset buffer */ + /* reference dataset */ + hid_t did2; /* dataset ID */ + hid_t sid2; /* dataspace ID */ + hsize_t dims2[] = {2}; /* 2 references */ + hdset_reg_ref_t *rbuf; /* buffer for write the references */ + hsize_t start[10]; /* starting location of hyperslab */ + hsize_t count[10]; /* element count of hyperslab */ + hsize_t coord[5][2]; /* coordinates for point selection */ + herr_t status; + int i; - /* Create a file */ - if ((fid = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0) - return -1; + /* allocate the buffer for write the references */ + rbuf=calloc(2,sizeof(hdset_reg_ref_t)); - /* Create a 1D dataset */ - sid = H5Screate_simple(1,dims,NULL); - did = H5Dcreate(fid,"dset",H5T_NATIVE_INT,sid,H5P_DEFAULT); - status = H5Sclose(sid); - assert(status>=0); + /* allocate the buffer for write the data dataset */ + buf=malloc(10*10*sizeof(int)); + + for (i=0; i<10*10; i++) + { + buf[i]=i; + } + + /* create the data dataset */ + sid1 = H5Screate_simple(2,dims1,NULL); + did1 = H5Dcreate(fid,"dsetref",H5T_NATIVE_INT,sid1,H5P_DEFAULT); + status = H5Dwrite(did1,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf); + + /* create the reference dataset */ + sid2 = H5Screate_simple(1,dims2,NULL); + did2 = H5Dcreate(fid,"refreg",H5T_STD_REF_DSETREG,sid2,H5P_DEFAULT); + + /* create the references */ + /* select hyperslab for first reference */ + + start[0]=2; start[1]=2; + count[0]=6; count[1]=6; + if (make_diffs) + { + start[0]=0; start[1]=0; + count[0]=3; count[1]=3; + } + + status = H5Sselect_hyperslab(sid1,H5S_SELECT_SET,start,NULL,count,NULL); + H5Sget_select_npoints(sid1); + + /* store first dataset region */ + status = H5Rcreate(&rbuf[0],fid,"dsetref",H5R_DATASET_REGION,sid1); + + /* select sequence of five points for second reference */ + coord[0][0]=6; coord[0][1]=9; + coord[1][0]=2; coord[1][1]=2; + coord[2][0]=8; coord[2][1]=4; + coord[3][0]=1; coord[3][1]=6; + coord[4][0]=2; coord[4][1]=8; + if (make_diffs) + { + coord[1][0]=3; coord[1][1]=3; + coord[3][0]=2; coord[3][1]=5; + coord[4][0]=1; coord[4][1]=7; + } + H5Sselect_elements(sid1,H5S_SELECT_SET,5,(const hsize_t **)coord); + H5Sget_select_npoints(sid1); + + /* store second dataset region */ + H5Rcreate(&rbuf[1],fid,"dsetref",H5R_DATASET_REGION,sid1); + + /* write */ + status = H5Dwrite(did2,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,rbuf); + + /* close, free memory buffers */ + status = H5Dclose(did1); + status = H5Sclose(sid1); + status = H5Dclose(did2); + status = H5Sclose(sid2); + free(rbuf); + free(buf); + +} - /* Create groups */ - gid = H5Gcreate(fid,"g1",0); - root_id = H5Gopen(fid, "/"); /*------------------------------------------------------------------------- - * write a series of attributes on the dataset, group, and root group + * Function: test_hyperslab + * + * Purpose: test diff by hyperslabs. create a dataset with 1GB dimensions + * by iterating trough 1KB hyperslabs + * *------------------------------------------------------------------------- */ +static +int test_hyperslab(char *fname, + int make_diffs /* flag to modify data buffers */) +{ + hid_t did; + hid_t fid; + hid_t f_sid; + hid_t m_sid; + hid_t tid; + hid_t dcpl; + hsize_t dims[1]={GBLL}; /* dataset dimensions */ + hsize_t hs_size[1]={GBLL/(1024*1024)}; /* hyperslab dimensions */ + hsize_t chunk_dims[1]={GBLL/1024}; /* chunk dimensions */ + hsize_t hs_start[1]; + size_t size; + size_t nelmts=(size_t)GBLL/(1024*1024); /* elements in each hyperslab */ + char fillvalue=-1; + char *buf=NULL; + int i, j, s; + char c; + + /* create */ + fid = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + if ((dcpl = H5Pcreate(H5P_DATASET_CREATE))<0) + goto out; + if (H5Pset_fill_value(dcpl, H5T_NATIVE_CHAR, &fillvalue)<0) + goto out; + if(H5Pset_chunk(dcpl, 1, chunk_dims)<0) + goto out; + if ((f_sid = H5Screate_simple(1,dims,NULL))<0) + goto out; + if ((did = H5Dcreate(fid,"big",H5T_NATIVE_CHAR,f_sid,dcpl))<0) + goto out; + if ((m_sid = H5Screate_simple(1, hs_size, hs_size))<0) + goto out; + if ((tid = H5Dget_type(did))<0) + goto out; + if ((size = H5Tget_size(tid))<=0) + goto out; + + /* create a evenly divided buffer from 0 to 127 */ + buf=(char *) HDmalloc((unsigned)(nelmts*size)); + s = 1024*1024 / 127; + for (i=0, j=0, c=0; i<1024*1024; j++, i++) + { + if ( j==s) + { + c++; + j=0; + }; - write_attr_in(did,"dset",fid,make_diffs); - write_attr_in(gid,NULL,0,make_diffs); - write_attr_in(root_id,NULL,0,make_diffs); + /* set the hyperslab values */ + HDmemset(buf, c, nelmts); + /* make a different hyperslab at this position */ + if (make_diffs && i==512*512) + { + HDmemset(buf, 0, nelmts); + } + + hs_start[0] = i * GBLL/(1024*1024); + if (H5Sselect_hyperslab (f_sid,H5S_SELECT_SET,hs_start,NULL,hs_size, NULL)<0) + goto out; - /* Close */ - status = H5Dclose(did); - assert(status>=0); - status = H5Gclose(gid); - assert(status>=0); - status = H5Gclose(root_id); - assert(status>=0); + /* write only one hyperslab */ + if ( i==512*512) + { + if (H5Dwrite (did,H5T_NATIVE_CHAR,m_sid,f_sid,H5P_DEFAULT,buf)<0) + goto out; + } + + } + free(buf); + buf=NULL; + + /* close */ + if(H5Sclose(f_sid)<0) + goto out; + if(H5Sclose(m_sid)<0) + goto out; + if(H5Pclose(dcpl)<0) + goto out; + if(H5Dclose(did)<0) + goto out; + H5Fclose(fid); + + return 0; + +out: + H5E_BEGIN_TRY { + H5Pclose(dcpl); + H5Sclose(f_sid); + H5Sclose(m_sid); + H5Dclose(did); + H5Fclose(fid); + } H5E_END_TRY; + return -1; - /* Close file */ - status = H5Fclose(fid); - assert(status>=0); - return status; } /*------------------------------------------------------------------------- - * Function: main + * Function: write_attr * - * Purpose: main program + * Purpose: utility function to write an attribute in LOC_ID * *------------------------------------------------------------------------- */ +static +int write_attr(hid_t loc_id, + int rank, + hsize_t *dims, + const char *name, + hid_t tid, + void *buf) +{ + hid_t aid; + hid_t sid; + herr_t status; + + /* Create a buf space */ + sid = H5Screate_simple(rank,dims,NULL); -int main(int UNUSED argc, const UNUSED char *argv[]) + /* Create the attribute */ + aid = H5Acreate(loc_id,name,tid,sid,H5P_DEFAULT); + + /* Write the buf */ + if ( buf ) + status = H5Awrite(aid,tid,buf); + + /* Close */ + status = H5Aclose(aid); + status = H5Sclose(sid); + return status; +} + +/*------------------------------------------------------------------------- + * Function: write_dset + * + * Purpose: utility function to create and write a dataset in LOC_ID + * + *------------------------------------------------------------------------- + */ +static +int write_dset( hid_t loc_id, + int rank, + hsize_t *dims, + const char *name, + hid_t tid, + void *buf ) { + hid_t did; + hid_t sid; + herr_t status; - test_basic (FILE1,FILE2); - test_types (FILE3,NULL); - test_native(FILE4,NULL); + /* Create a buf space */ + sid = H5Screate_simple(rank,dims,NULL); - /* generate 2 files with attribute differences */ - test_attr(FILE5,0); - test_attr(FILE6,1); + /* Create a dataset */ + did = H5Dcreate(loc_id,name,tid,sid,H5P_DEFAULT); - /* generate 2 files with all datatype differences */ - test_dsetall(FILE7,0); - test_dsetall(FILE8,1); - return 0; + /* Write the buf */ + if ( buf ) + status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf); + + /* Close */ + status = H5Dclose(did); + status = H5Sclose(sid); + + return status; } |