fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
CHECK(fid1, FAIL, "H5Fcreate");
/* Create dataspace for datasets */
sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
CHECK(sid1, FAIL, "H5Screate_simple");
/* Create a datatype to refer to */
tid1 = H5Tarray_create(H5T_NATIVE_INT, ARRAY1_RANK, tdims1, NULL);
CHECK(tid1, FAIL, "H5Tarray_create");
tid1 = H5Tarray_create2(H5T_NATIVE_INT, ARRAY1_RANK, tdims1);
CHECK(tid1, FAIL, "H5Tarray_create2");
dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
CHECK(dataset, FAIL, "H5Dcreate2");
/* Write dataset to disk */
ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
CHECK(ret, FAIL, "H5Dwrite");
tid1 = H5Dget_type (dataset);
CHECK(tid1, FAIL, "H5Dget_type");
/* Check the array rank */
ndims = H5Tget_array_ndims(tid1);
VERIFY(ndims, ARRAY1_RANK, "H5Tget_array_ndims");
/* Get the array dimensions */
ret = H5Tget_array_dims(tid1, rdims1, NULL);
CHECK(ret, FAIL, "H5Tget_array_dims");
ret = H5Tget_array_dims2(tid1, rdims1);
CHECK(ret, FAIL, "H5Tget_array_dims2");
/* Check the array dimensions */
for(i = 0; i < ndims; i++)
if(rdims1[i] != tdims1[i]) {
TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%d, tdims1[%d]=%d\n", (int)i, (int)rdims1[i], (int)i, (int)tdims1[i]);
/* Read dataset from disk */
ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata);
hid_t type; /* Datatype ID */
hsize_t tdims1[] = {ARRAY1_DIM1};
herr_t ret; /* Generic return value */
/* Create a datatype to refer to */
type = H5Tarray_create(H5T_IEEE_F32BE, ARRAY1_RANK, tdims1, NULL);
CHECK(type, FAIL, "H5Tarray_create");
type = H5Tarray_create2(H5T_IEEE_F32BE, ARRAY1_RANK, tdims1);
CHECK(type, FAIL, "H5Tarray_create2");
size=H5Tget_precision(type);
CHECK(size, FAIL, "H5Tget_precision");
CHECK(size, FAIL, "H5Tget_size");
CHECK(size, FAIL, "H5Tget_ebias");
fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
CHECK(fid, FAIL, "H5Fcreate");
/* Create dataspace for datasets */
sid = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
CHECK(sid, FAIL, "H5Screate_simple");
/* Create a datatype to refer to */
tid = H5Tarray_create(H5T_NATIVE_INT, ARRAY2_RANK, tdims2, NULL);
CHECK(tid, FAIL, "H5Tarray_create");
tid = H5Tarray_create2(H5T_NATIVE_INT, ARRAY2_RANK, tdims2);
CHECK(tid, FAIL, "H5Tarray_create2");
dataset = H5Dcreate2(fid, "Dataset1", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
CHECK(dataset, FAIL, "H5Dcreate2");
/* Write dataset to disk */
ret = H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
CHECK(ret, FAIL, "H5Dwrite");
tid = H5Dget_type (dataset);
CHECK(tid, FAIL, "H5Dget_type");
/* Check the array rank */
ndims = H5Tget_array_ndims(tid);
VERIFY(ndims, ARRAY2_RANK, "H5Tget_array_ndims");
/* Get the array dimensions */
ret = H5Tget_array_dims(tid, rdims2, NULL);
CHECK(ret, FAIL, "H5Tget_array_dims");
ret = H5Tget_array_dims2(tid, rdims2);
CHECK(ret, FAIL, "H5Tget_array_dims2");
/* Check the array dimensions */
for(i = 0; i < ndims; i++)
if(rdims2[i] != tdims2[i]) {
TestErrPrintf("Array dimension information doesn't match!, rdims2[%d]=%d, tdims2[%d]=%d\n", (int)i, (int)rdims2[i], (int)i, (int)tdims2[i]);
/* Read dataset from disk */
ret = H5Dread(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata);
fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
CHECK(fid, FAIL, "H5Fcreate");
/* Create dataspace for datasets */
sid = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
CHECK(sid, FAIL, "H5Screate_simple");
/* Create a 2-D datatype to refer to */
tid2 = H5Tarray_create(H5T_NATIVE_INT, ARRAY3_RANK, tdims2, NULL);
CHECK(tid2, FAIL, "H5Tarray_create");
tid2 = H5Tarray_create2(H5T_NATIVE_INT, ARRAY3_RANK, tdims2);
CHECK(tid2, FAIL, "H5Tarray_create2");
/* Create a 1-D datatype to refer to */
tid1 = H5Tarray_create(tid2, ARRAY1_RANK, tdims1, NULL);
CHECK(tid1, FAIL, "H5Tarray_create");
tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
CHECK(tid1, FAIL, "H5Tarray_create2");
dataset = H5Dcreate2(fid, "Dataset1", tid1, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
CHECK(dataset, FAIL, "H5Dcreate2");
/* Write dataset to disk */
ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
CHECK(ret, FAIL, "H5Dwrite");
/* Get the 1-D datatype */
tid1 = H5Dget_type(dataset);
CHECK(tid1, FAIL, "H5Dget_type");
/* Check the 1-D array rank */
ndims1 = H5Tget_array_ndims(tid1);
VERIFY(ndims1, ARRAY1_RANK, "H5Tget_array_ndims");
/* Get the 1-D array dimensions */
ret = H5Tget_array_dims(tid1, rdims1, NULL);
CHECK(ret, FAIL, "H5Tget_array_dims");
ret = H5Tget_array_dims2(tid1, rdims1);
CHECK(ret, FAIL, "H5Tget_array_dims2");
/* Check the array dimensions */
for(i = 0; i < ndims1; i++)
if(rdims1[i] != tdims1[i]) {
TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%d, tdims1[%d]=%d\n", (int)i, (int)rdims1[i], (int)i, (int)tdims1[i]);
/* Get the 2-D datatype */
tid2 = H5Tget_super(tid1);
CHECK(tid2, FAIL, "H5Tget_super");
/* Check the 2-D array rank */
ndims2 = H5Tget_array_ndims(tid2);
VERIFY(ndims2, ARRAY3_RANK, "H5Tget_array_ndims");
/* Get the 2-D array dimensions */
ret = H5Tget_array_dims(tid2, rdims2, NULL);
CHECK(ret, FAIL, "H5Tget_array_dims");
ret = H5Tget_array_dims2(tid2, rdims2);
CHECK(ret, FAIL, "H5Tget_array_dims2");
/* Check the array dimensions */
for(i = 0; i < ndims2; i++)
if(rdims2[i] != tdims2[i]) {
TestErrPrintf("Array dimension information doesn't match!, rdims2[%d]=%d, tdims2[%d]=%d\n", (int)i, (int)rdims2[i], (int)i, (int)tdims2[i]);
/* Read dataset from disk */
ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata);
/* Insert integer field */
ret = H5Tinsert(tid2, "i", HOFFSET(s1_t, i), H5T_NATIVE_INT);
CHECK(ret, FAIL, "H5Tinsert");
ret = H5Tinsert(tid2, "f", HOFFSET(s1_t, f), H5T_NATIVE_FLOAT);
CHECK(ret, FAIL, "H5Tinsert");
/* Create an array datatype to refer to */
tid1 = H5Tarray_create(tid2, ARRAY1_RANK, tdims1, NULL);
CHECK(tid1, FAIL, "H5Tarray_create");
tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
CHECK(tid1, FAIL, "H5Tarray_create2");
/* Close compound datatype */
CHECK(ret, FAIL, "H5Tclose");
dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
CHECK(dataset, FAIL, "H5Dcreate2");
/* Write dataset to disk */
tid1 = H5Dget_type(dataset);
CHECK(tid1, FAIL, "H5Dget_type");
/* Check the array rank */
ndims = H5Tget_array_ndims(tid1);
VERIFY(ndims,ARRAY1_RANK,"H5Tget_array_ndims");
/* Get the array dimensions */
ret = H5Tget_array_dims(tid1, rdims1, NULL);
CHECK(ret, FAIL, "H5Tget_array_dims");
ret = H5Tget_array_dims2(tid1, rdims1);
CHECK(ret, FAIL, "H5Tget_array_dims2");
/* Check the array dimensions */
for(i = 0; i < ndims; i++)
if(rdims1[i] != tdims1[i]) {
TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%d, tdims1[%d]=%d\n", (int)i, (int)rdims1[i], (int)i, (int)tdims1[i]);
/* Get the compound datatype */
tid2 = H5Tget_super (tid1);
/* Create a compound datatype to refer to */
tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t));
CHECK(tid2, FAIL, "H5Tcreate");
/* Insert integer field */
ret = H5Tinsert (tid2, "i", HOFFSET(s1_t,i), H5T_NATIVE_INT);
CHECK(ret, FAIL, "H5Tinsert");
/* Create an array of floats datatype */
tid3 = H5Tarray_create(H5T_NATIVE_FLOAT, ARRAY1_RANK, tdims1, NULL);
CHECK(tid3, FAIL, "H5Tarray_create");
tid3 = H5Tarray_create2(H5T_NATIVE_FLOAT, ARRAY1_RANK, tdims1);
CHECK(tid3, FAIL, "H5Tarray_create2");
/* Insert float array field */
ret = H5Tinsert(tid2, "f", HOFFSET(s1_t, f), tid3);
CHECK(ret, FAIL, "H5Tinsert");
/* Close array of floats field datatype */
CHECK(ret, FAIL, "H5Tclose");
/* Create an array datatype to refer to */
tid1 = H5Tarray_create(tid2, ARRAY1_RANK, tdims1, NULL);
CHECK(tid1, FAIL, "H5Tarray_create");
tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
CHECK(tid1, FAIL, "H5Tarray_create2");
/* Close compound datatype */
CHECK(ret, FAIL, "H5Tclose");
dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
CHECK(dataset, FAIL, "H5Dcreate2");
/* Write dataset to disk */
tid1 = H5Dget_type (dataset);
CHECK(tid1, FAIL, "H5Dget_type");
/* Check the array rank */
ndims=H5Tget_array_ndims(tid1);
VERIFY(ndims,ARRAY1_RANK,"H5Tget_array_ndims");
/* Get the array dimensions */
ret = H5Tget_array_dims(tid1, rdims1, NULL);
CHECK(ret, FAIL, "H5Tget_array_dims");
ret = H5Tget_array_dims2(tid1, rdims1);
CHECK(ret, FAIL, "H5Tget_array_dims2");
/* Check the array dimensions */
if(rdims1[i]!=tdims1[i]) {
TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%d, tdims1[%d]=%d\n",(int)i,(int)rdims1[i],(int)i,(int)tdims1[i]);
/* Get the compound datatype */
tid2 = H5Tget_super (tid1);
/* Get the 2nd field's class */
mclass=H5Tget_class(mtid);
VERIFY(mclass, H5T_ARRAY, "H5Tget_class");
/* Check the array rank */
ndims=H5Tget_array_ndims(mtid);
VERIFY(ndims,ARRAY1_RANK,"H5Tget_array_ndims");
/* Get the array dimensions */
ret = H5Tget_array_dims(mtid, rdims1, NULL);
CHECK(ret, FAIL, "H5Tget_array_dims");
ret = H5Tget_array_dims2(mtid, rdims1);
CHECK(ret, FAIL, "H5Tget_array_dims2");
/* Check the array dimensions */
if(rdims1[i]!=tdims1[i]) {
TestErrPrintf("Nested array dimension information doesn't match!, rdims1[%d]=%d, tdims1[%d]=%d\n",(int)i,(int)rdims1[i],(int)i,(int)tdims1[i]);
/* Check the nested array's datatype */
/* Create dataspace for datasets */
sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
CHECK(sid1, FAIL, "H5Screate_simple");
/* Create a compound datatype to refer to */
tid2 = H5Tvlen_create(H5T_NATIVE_UINT);
CHECK(tid2, FAIL, "H5Tcreate");
/* Create an array datatype to refer to */
tid1 = H5Tarray_create(tid2, ARRAY1_RANK, tdims1, NULL);
CHECK(tid1, FAIL, "H5Tarray_create");
tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
CHECK(tid1, FAIL, "H5Tarray_create2");
CHECK(ret, FAIL, "H5Tclose");
dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
CHECK(dataset, FAIL, "H5Dcreate2");
/* Write dataset to disk */
tid1 = H5Dget_type (dataset);
CHECK(tid1, FAIL, "H5Dget_type");
/* Check the array rank */
ndims=H5Tget_array_ndims(tid1);
VERIFY(ndims,ARRAY1_RANK,"H5Tget_array_ndims");
/* Get the array dimensions */
ret = H5Tget_array_dims(tid1, rdims1, NULL);
CHECK(ret, FAIL, "H5Tget_array_dims");
ret = H5Tget_array_dims2(tid1, rdims1);
CHECK(ret, FAIL, "H5Tget_array_dims2");
/* Check the array dimensions */
if(rdims1[i]!=tdims1[i]) {
TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%d, tdims1[%d]=%d\n",(int)i,(int)rdims1[i],(int)i,(int)tdims1[i]);
/* Get the VL datatype */
tid2 = H5Tget_super (tid1);
fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
CHECK(fid1, FAIL, "H5Fcreate");
/* Create dataspace for datasets */
sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
CHECK(sid1, FAIL, "H5Screate_simple");
/* Create the nested array datatype to refer to */
tid3 = H5Tarray_create(H5T_NATIVE_UINT, ARRAY1_RANK, tdims1, NULL);
CHECK(tid3, FAIL, "H5Tcreate");
tid3 = H5Tarray_create2(H5T_NATIVE_UINT, ARRAY1_RANK, tdims1);
CHECK(tid3, FAIL, "H5Tarray_create2");
/* Create a VL datatype of 1-D arrays to refer to */
tid2 = H5Tvlen_create(tid3);
CHECK(tid2, FAIL, "H5Tcreate");
/* Close nested array datatype */
CHECK(ret, FAIL, "H5Tclose");
/* Create an array datatype to refer to */
tid1 = H5Tarray_create(tid2, ARRAY1_RANK, tdims1, NULL);
CHECK(tid1, FAIL, "H5Tarray_create");
tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
CHECK(tid1, FAIL, "H5Tarray_create2");
CHECK(ret, FAIL, "H5Tclose");
dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
CHECK(dataset, FAIL, "H5Dcreate2");
/* Write dataset to disk */
tid1 = H5Dget_type (dataset);
CHECK(tid1, FAIL, "H5Dget_type");
/* Check the array rank */
ndims=H5Tget_array_ndims(tid1);
VERIFY(ndims,ARRAY1_RANK,"H5Tget_array_ndims");
/* Get the array dimensions */
ret = H5Tget_array_dims(tid1, rdims1, NULL);
CHECK(ret, FAIL, "H5Tget_array_dims");
ret = H5Tget_array_dims2(tid1, rdims1);
CHECK(ret, FAIL, "H5Tget_array_dims2");
/* Check the array dimensions */
if(rdims1[i]!=tdims1[i]) {
TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%d, tdims1[%d]=%d\n",(int)i,(int)rdims1[i],(int)i,(int)tdims1[i]);
/* Get the VL datatype */
tid2 = H5Tget_super (tid1);
/* Get the nested array datatype's class */
mclass=H5Tget_class(tid3);
VERIFY(mclass, H5T_ARRAY, "H5Tget_class");
/* Check the array rank */
ndims=H5Tget_array_ndims(tid3);
VERIFY(ndims,ARRAY1_RANK,"H5Tget_array_ndims");
/* Get the array dimensions */
ret = H5Tget_array_dims(tid3, rdims1, NULL);
CHECK(ret, FAIL, "H5Tget_array_dims");
ret = H5Tget_array_dims2(tid3, rdims1);
CHECK(ret, FAIL, "H5Tget_array_dims2");
/* Check the array dimensions */
if(rdims1[i]!=tdims1[i]) {
TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%d, tdims1[%d]=%d\n",(int)i,(int)rdims1[i],(int)i,(int)tdims1[i]);
/* Check the array's base type */
/* Create the memory data type */
/* --------------------------- */
type = H5Tcreate(H5T_COMPOUND, sizeof(CmpField));
CHECK(type, FAIL, "H5Tcreate");
/* Add members to the compound data type */
/* -------------------------------------- */
for ( i = 0; i < dtsinfo.nsubfields; i++)
array_dt = H5Tarray_create(dtsinfo.datatype[i], ndims[i], dima, NULL);
CHECK(array_dt, FAIL, "H5Tarray_create");
array_dt = H5Tarray_create2(dtsinfo.datatype[i], ndims[i], dima);
CHECK(array_dt, FAIL, "H5Tarray_create2");
status = H5Tinsert (type, dtsinfo.name[i], dtsinfo.offset[i], array_dt);
CHECK(status, FAIL, "H5Tinsert");
status = H5Tclose(array_dt);
CHECK(status, FAIL, "H5Tclose");
fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT);
CHECK(fid, FAIL, "H5Fopen");
dataset = H5Dopen2(fid, FIELDNAME, H5P_DEFAULT);
CHECK(dataset, FAIL, "H5Dopen2");
type = H5Tcreate(H5T_COMPOUND, sizeof(fld_t));
CHECK(type, FAIL, "H5Tcreate");
array_dt = H5Tarray_create(H5T_NATIVE_FLOAT, 1, dima, NULL);
CHECK(array_dt, FAIL, "H5Tarray_create");
array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, 1, dima);
CHECK(array_dt, FAIL, "H5Tarray_create2");
status = H5Tinsert (type, "Two", HOFFSET(fld_t, b), array_dt);
CHECK(status, FAIL, "H5Tinsert");
/* Initialize the data to overwrite */
/* -------------------------------- */
for (i=0; i< LENGTH; i++)
for (j = 0; j < ALEN; j++)
cf[i].b[j]=fld[i].b[j] = (float)1.313;
/* Verify datatype class */
mclass=H5Tget_class(mtid);
VERIFY(mclass, H5T_ARRAY, "H5Tget_class");
/* Check the array rank */
ndims=H5Tget_array_ndims(mtid);
VERIFY(ndims,ARRAY1_RANK,"H5Tget_array_ndims");
/* Get the array dimensions */
ret = H5Tget_array_dims(mtid, rdims1, NULL);
CHECK(ret, FAIL, "H5Tget_array_dims");
ret = H5Tget_array_dims2(mtid, rdims1);
CHECK(ret, FAIL, "H5Tget_array_dims2");
/* Check the array dimensions */
if(rdims1[i]!=tdims1[i]) {
TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%d, tdims1[%d]=%d\n",(int)i,(int)rdims1[i],(int)i,(int)tdims1[i]);
/* Check the array's base datatype */
/* Verify datatype class */
mclass=H5Tget_class(mtid);
VERIFY(mclass, H5T_ARRAY, "H5Tget_class");
/* Check the array rank */
ndims=H5Tget_array_ndims(mtid);
VERIFY(ndims,ARRAY1_RANK,"H5Tget_array_ndims");
/* Get the array dimensions */
ret = H5Tget_array_dims(mtid,rdims1, NULL);
CHECK(ret, FAIL, "H5Tget_array_dims");
ret = H5Tget_array_dims2(mtid, rdims1);
CHECK(ret, FAIL, "H5Tget_array_dims2");
/* Check the array dimensions */
if(rdims1[i]!=tdims1[i]) {
TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%d, tdims1[%d]=%d\n",(int)i,(int)rdims1[i],(int)i,(int)tdims1[i]);
/* Check the array's base datatype */