#include "hdf5.h" #include "h5test.h" #include "string.h" #include "stdlib.h" /* temporary, will delete */ #define CORDER_ITER_STOP 3 #define NUM_DSETS_WITH_COORDS 43 #define DSET_NAME_LENGTH 80 #define SPACE1_RANK 2 #define MERGE1_RANK 3 typedef struct { H5_iter_order_t order; /* Direction of iteration */ unsigned ncalled; /* # of times callback is entered */ unsigned nskipped; /* # of links skipped */ int stop; /* # of iterations to stop after */ int64_t curr; /* Current creation order value */ size_t max_visit; /* Size of "visited link" flag array */ hbool_t *visited; /* Pointer to array of "visited link" flags */ } link_iter_info_t; static herr_t add_string_attr(hid_t obj_id, const char* attr_name, const char *attr_value); static herr_t add_attribute_cb(hid_t loc_id, const char *name, const H5A_info_t *linfo, void *opdata); /* Link iteration operator function */ /* For detecting and reporting failures */ #define CHECK(ret, val, where) do { \ if ((ret) == (val)) { \ fprintf(stderr, "*** UNEXPECTED RETURN from %s is %ld at line %4d " \ "in %s\n", where, (long)(ret), (int)__LINE__, __FILE__); \ H5Eprint2(H5E_DEFAULT, stdout); \ } \ } while(0) /* Print the current location on the standard output stream. */ #define AT() printf (" at %s:%d in %s()...\n", \ __FILE__, __LINE__, FUNC); #define TEST_ERROR {H5_FAILED(); AT(); goto error;} /* Alias for dataset names */ #define SCIENCE_DATA "/ScienceData" #define COVARIANCE "/ScienceData/Data/covarianceCoeff" #define FILENAME "temp.h5" #define ATTR_NAME_LEN 80 #define DS_RANK 1 /* Attribute Rank & Dimensions */ #define ATTR_RANK 1 #define ATTR_DIM 1 #define NX 5 #define NY 8 #define LAST 2 static int print_attr(hid_t dataset, const char *attr_name, const H5A_info_t *linfo, void *opdata) { fprintf(stderr, "--attribute: %s\n", attr_name); return 0; error: return(-1); } /* end of print_attr */ /**************************************************************************** * Function: merge_datasets * Description: Replace the dataset old_name with a new dataset new_name. *****************************************************************************/ static herr_t merge_datasets(hid_t file, const char *merged_ds_name, const char *ds1_name, const char *ds2_name) { hid_t dset1 = FAIL; hid_t dset2 = FAIL; hid_t merged_dataset = FAIL; hid_t dtype = FAIL; hid_t dspace = FAIL; hid_t dcpl = FAIL; hid_t merged_space = FAIL; hid_t new_dataset = FAIL; hsize_t orig_dim[2], merged_dim[3]; hsize_t start[3], count[3]; hssize_t num_elems = 0; uint16_t data_out[2][NX][NY]; uint16_t *ptr = NULL; int rank = 2; int ii, jj, kk; void *ds1_buf = NULL; void *ds2_buf = NULL; size_t type_size = 0; herr_t ret = SUCCEED; /* Open dataset old dataset and get its datatype */ if ((dset1 = H5Dopen2(file, ds1_name, H5P_DEFAULT)) < 0) TEST_ERROR if ((dset2 = H5Dopen2(file, ds2_name, H5P_DEFAULT)) < 0) TEST_ERROR if ((dtype = H5Dget_type(dset1)) < 0) TEST_ERROR if ((dcpl = H5Dget_create_plist(dset1)) < 0) TEST_ERROR if ((type_size = H5Tget_size(dtype)) < 0) TEST_ERROR /* Create dataspace for new dataset */ if ((dspace = H5Dget_space(dset1)) < 0) TEST_ERROR /* Get the size for buffer */ if ((num_elems = H5Sget_simple_extent_npoints(dspace)) < 0) TEST_ERROR rank = H5Sget_simple_extent_ndims(dspace); ret = H5Sget_simple_extent_dims(dspace, orig_dim, NULL); fprintf(stderr, "size to be allocated: %d\n", num_elems * type_size); /* Allocate buffer for dataset values */ if ((ds1_buf = malloc(num_elems * type_size + 1)) < 0) TEST_ERROR if ((ds2_buf = malloc(num_elems * type_size + 1)) < 0) TEST_ERROR if ((ret = H5Dread(dset1, dtype, dspace, H5S_ALL, H5P_DEFAULT, ds1_buf)) < 0) TEST_ERROR if ((ret = H5Dread(dset2, dtype, dspace, H5S_ALL, H5P_DEFAULT, ds2_buf)) < 0) TEST_ERROR /* Create dataspace for the merged dataset */ merged_dim[0] = 2; merged_dim[1] = orig_dim[0]; merged_dim[2] = orig_dim[1]; if ((merged_space = H5Screate_simple(3, merged_dim, NULL)) < 0) TEST_ERROR /* Create new dataset */ merged_dataset = H5Dcreate2(file, merged_ds_name, dtype, merged_space, H5P_DEFAULT, dcpl, H5P_DEFAULT); if (merged_dataset < 0) TEST_ERROR /* * Define hyperslab in the merged dataset for the first slice. */ start[0] = 0; start[1] = 0; start[2] = 0; count[0] = 1; count[1] = orig_dim[0]; count[2] = orig_dim[1]; ret = H5Sselect_hyperslab (merged_space, H5S_SELECT_SET, start, NULL, count, NULL); CHECK(ret, FAIL, "H5Sselect_hyperslab"); /* Write the first plane */ ret = H5Dwrite(merged_dataset, dtype, dspace, merged_space, H5P_DEFAULT, ds1_buf); if (ret < 0) TEST_ERROR start[0] = 1; start[1] = 0; start[1] = 0; count[0] = 1; count[1] = orig_dim[0]; count[2] = orig_dim[1]; ret = H5Sselect_hyperslab (merged_space, H5S_SELECT_SET, start, NULL, count, NULL); CHECK(ret, FAIL, "H5Sselect_hyperslab"); /* Write the second plane */ ret = H5Dwrite(merged_dataset, dtype, dspace, merged_space, H5P_DEFAULT, ds2_buf); if (ret < 0) TEST_ERROR if ((ret = H5Dclose(merged_dataset)) < 0) TEST_ERROR { hid_t dataset = FAIL; if ((dataset = H5Dopen2(file, "Brightness_Temperature_89.0GHz-A", H5P_DEFAULT)) < 0) TEST_ERROR HDmemset(data_out, 0, 2*NX*NY*sizeof(uint16_t)); fprintf(stderr, "make sure data_out is wipled out\n"); for (kk = 0; kk < 2; kk++) for (ii = 0; ii < NX; ii++) { for (jj = 0; jj < NY; jj++) fprintf(stderr, " %d ", data_out[kk][ii][jj]); fprintf(stderr, "\n"); } start[0] = 0; start[1] = 0; start[2] = 0; count[0] = 2; count[1] = orig_dim[0]; count[2] = orig_dim[1]; ret = H5Sselect_hyperslab (merged_space, H5S_SELECT_SET, start, NULL, count, NULL); CHECK(ret, FAIL, "H5Sselect_hyperslab"); if ((ret = H5Dread(dataset, dtype, merged_space, merged_space, H5P_DEFAULT, data_out)) < 0) TEST_ERROR for (kk = 0; kk < 2; kk++) for (ii = 0; ii < NX; ii++) { for (jj = 0; jj < NY; jj++) fprintf(stderr, " %d ", data_out[kk][ii][jj]); fprintf(stderr, "\n"); } /* start[0] = 1; start[1] = 0; start[2] = 0; count[0] = 1; count[1] = orig_dim[0]; count[2] = orig_dim[1]; ret = H5Sselect_hyperslab (merged_space, H5S_SELECT_SET, start, NULL, count, NULL); CHECK(ret, FAIL, "H5Sselect_hyperslab"); if ((ret = H5Dread(dataset, dtype, merged_space, merged_space, H5P_DEFAULT, data_out)) < 0) TEST_ERROR for (ii = 0; ii < NX; ii++) { for (jj = 0; jj < NY; jj++) fprintf(stderr, " %d ", data_out[1][ii][jj]); fprintf(stderr, "\n"); } */ if ((ret = H5Dclose(dataset)) < 0) TEST_ERROR } #if 0 /* Copy current attributes from old dataset to new dataset */ /* copy_attribute(dataset, new_dataset); */ ret = H5Dwrite(new_dataset, dtype, dspace, H5S_ALL, H5P_DEFAULT, buf); if (ret < 0) TEST_ERROR #endif /* Close IDs */ if ((ret = H5Sclose(dspace)) < 0) TEST_ERROR if ((ret = H5Tclose(dtype)) < 0) TEST_ERROR if ((ret = H5Dclose(dset1)) < 0) TEST_ERROR if ((ret = H5Dclose(dset2)) < 0) TEST_ERROR /* if ((ret = H5Dclose(merged_dataset)) < 0) TEST_ERROR */ return(0); error: H5E_BEGIN_TRY { H5Sclose(dspace); H5Tclose(dtype); H5Dclose(dset1); H5Dclose(dset2); H5Dclose(merged_dataset); } H5E_END_TRY; return(-1); } hid_t create_dataset(hid_t file, const char* ds_name, uint16_t first_val) { hid_t dataset; /* Dataset ID */ hid_t dspace; /* Dataspace ID */ hsize_t dims1[] = {NX, NY}; hsize_t start[SPACE1_RANK]; /* Starting location of hyperslab */ hsize_t stride[SPACE1_RANK]; /* Stride of hyperslab */ hsize_t count[SPACE1_RANK]; /* Element count of hyperslab */ uint16_t *wbuf, /* buffer to write to disk */ *rbuf, /* buffer read from disk */ *tbuf, /* temporary buffer pointer */ *tbuf2; /* temporary buffer pointer */ uint16_t inbuf[NX][NY]; int ii, jj; /* Counters */ herr_t ret; /* Generic return value */ for(ii = 0; ii < NX; ii++) for(jj = 0; jj < NY; jj++) { inbuf[ii][jj] = first_val * 10 + jj; fprintf(stderr, "inbuf[%d][%d] = %d\n", ii, jj, inbuf[ii][jj]); } /* Create dataspace for dataset */ dspace = H5Screate_simple(SPACE1_RANK, dims1, NULL); CHECK(dspace, FAIL, "H5Screate_simple"); /* Create a dataset */ dataset = H5Dcreate2(file, ds_name, H5T_STD_U16LE, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(dataset, FAIL, "H5Dcreate2"); /* Write data to the new dataset */ ret = H5Dwrite(dataset, H5T_STD_U16LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, inbuf); CHECK(ret, FAIL, "H5Dwrite"); /* End access to the dataset and release resources used by it. */ ret = H5Dclose(dataset); CHECK(ret, FAIL, "H5Dclose"); /* Terminate access to the data space. */ ret = H5Sclose(dspace); CHECK(ret, FAIL, "H5Sclose"); } #if 0 { /* Create dataspace for writing buffer */ sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); CHECK(sid2, FAIL, "H5Screate_simple"); /* Select 2x3x3 count with a stride of 2x4x3 & 1x2x2 block hyperslab for disk dataset */ /* start[0] = 0; start[1] = 0; start[2] = 0; stride[0] = 2; stride[1] = 4; stride[2] = 3; count[0] = 2; count[1] = 3; count[2] = 3; block[0] = 1; block[1] = 2; block[2] = 2; */ start[0] = 0; start[1] = 0; count[0] = NX; count[1] = NY; ret = H5Sselect_hyperslab(dspace, H5S_SELECT_SET, start, NULL, count, NULL); CHECK(ret, FAIL, "H5Sselect_hyperslab"); /* Select 4x2 count with a stride of 5x5 & 3x3 block hyperslab for memory dataset */ start[0] = 1; start[1] = 1; stride[0] = 5; stride[1] = 5; count[0] = 4; count[1] = 2; block[0] = 3; block[1] = 3; ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); CHECK(ret, FAIL, "H5Sselect_hyperslab"); /* Write selection to disk */ ret = H5Dwrite(dataset, H5T_NATIVE_USHORT, sid2, dspace, xfer_plist, wbuf); CHECK(ret, FAIL, "H5Dwrite"); /* Close memory dataspace */ ret = H5Sclose(sid2); CHECK(ret, FAIL, "H5Sclose"); /* Create dataspace for reading buffer */ sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); CHECK(sid2, FAIL, "H5Screate_simple"); /* Select 3x4 count with a stride of 4x4 & 2x3 block hyperslab for memory dataset */ start[0]=0; start[1]=0; stride[0]=4; stride[1]=4; count[0]=3; count[1]=4; block[0]=2; block[1]=3; ret = H5Sselect_hyperslab(sid2,H5S_SELECT_SET,start,stride,count,block); CHECK(ret, FAIL, "H5Sselect_hyperslab"); /* Read selection from disk */ ret=H5Dread(dataset,H5T_NATIVE_USHORT,sid2,dspace,xfer_plist,rbuf); CHECK(ret, FAIL, "H5Dread"); /* Sort the locations into the proper order */ HDqsort(loc1, (size_t)72, sizeof(size_t), compare_size_t); HDqsort(loc2, (size_t)72, sizeof(size_t), compare_size_t); /* Compare data read with data written out */ for(i=0; i<72; i++) { tbuf=wbuf+loc1[i]; tbuf2=rbuf+loc2[i]; if(*tbuf!=*tbuf2) { printf("%d: hyperslab values don't match!, loc1[%d]=%d, loc2[%d]=%d\n",__LINE__,i,(int)loc1[i],i,(int)loc2[i]); printf("wbuf=%p, tbuf=%p, rbuf=%p, tbuf2=%p\n",(void *)wbuf,(void *)tbuf,(void *)rbuf,(void *)tbuf2); TestErrPrintf("*tbuf=%u, *tbuf2=%u\n",(unsigned)*tbuf,(unsigned)*tbuf2); } /* end if */ } /* end for */ /* Close memory dataspace */ ret = H5Sclose(sid2); /* Close disk dataspace */ ret = H5Sclose(dspace); CHECK(ret, FAIL, "H5Sclose"); /* Close Dataset */ ret = H5Dclose(dataset); CHECK(ret, FAIL, "H5Dclose"); /* Close file */ ret = H5Fclose(file); CHECK(ret, FAIL, "H5Fclose"); /* Free memory buffers */ HDfree(wbuf); HDfree(rbuf); } #endif /* Main program */ int main() { hid_t file = FAIL; hid_t group_Data = FAIL; hid_t group_Geo = FAIL; hid_t dim_scale = FAIL; hid_t dataset = FAIL, dtype = FAIL; hid_t new_dataset = FAIL; hid_t cptype = FAIL; hid_t dcpl = FAIL; hsize_t dim, max_dim; hsize_t dimu[1], max_dimu[1]; herr_t ret = SUCCEED; int ii, jj; /* Create file */ file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(file, FAIL, "H5Fcreate"); ret = create_dataset(file, "Brightness Temperature (89.0GHz-A,H)", 10); ret = create_dataset(file, "Brightness Temperature (89.0GHz-A,V)", 30); ret = merge_datasets(file, "Brightness_Temperature_89.0GHz-A", "Brightness Temperature (89.0GHz-A,H)", "Brightness Temperature (89.0GHz-A,V)"); if ((ret = H5Fclose(file)) < 0) TEST_ERROR return(0); error: H5E_BEGIN_TRY { H5Fclose(file); H5Dclose(dim_scale); } H5E_END_TRY; return(-1); } /* main */