mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-11-27 07:30:33 +08:00
140 lines
4.4 KiB
C
140 lines
4.4 KiB
C
/* This is part of the netCDF package.
|
|
Copyright 2018 University Corporation for Atmospheric Research/Unidata
|
|
See COPYRIGHT file for conditions of use.
|
|
|
|
Test HDF5 compound types.
|
|
Ed Hartnett
|
|
*/
|
|
|
|
#include "h5_err_macros.h"
|
|
#include <hdf5.h>
|
|
|
|
#define FILE_NAME "tst_h_wrt_cmp.h5"
|
|
#define DIM1_LEN 3
|
|
#define COMPOUND_NAME "cmp"
|
|
#define VAR_NAME "var"
|
|
|
|
int
|
|
main()
|
|
{
|
|
hid_t fileid, access_plist, spaceid, typeid;
|
|
hid_t datasetid;
|
|
hsize_t dims[1];
|
|
char dummy[] = " ";
|
|
struct s1
|
|
{
|
|
unsigned char c1;
|
|
double d;
|
|
} data[DIM1_LEN];
|
|
int i;
|
|
|
|
/* Initialize our data space. This is required to keep valgrind
|
|
* happy. It makes no difference to the execution of the
|
|
* program. */
|
|
for (i = 0; i < DIM1_LEN; i++)
|
|
memcpy((void *)(&data[i]), (void *)dummy, sizeof(struct s1));
|
|
|
|
/* Now init our values. */
|
|
for (i = 0; i < DIM1_LEN; i++)
|
|
{
|
|
data[i].c1 = 126;
|
|
data[i].d = -9999999;
|
|
}
|
|
|
|
printf("\n*** Checking HDF5 compound types (even more so).\n");
|
|
printf("*** Checking packing of HDF5 compound types...");
|
|
{
|
|
/* Open file and create group. */
|
|
if ((access_plist = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
|
|
if (H5Pset_fclose_degree(access_plist, H5F_CLOSE_STRONG)) ERR;
|
|
if ((fileid = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT,
|
|
access_plist)) < 0) ERR;
|
|
|
|
/* Create a simple compound type. */
|
|
if ((typeid = H5Tcreate(H5T_COMPOUND, sizeof(struct s1))) < 0) ERR;
|
|
if (H5Tinsert(typeid, "c1", HOFFSET(struct s1, c1), H5T_NATIVE_UCHAR) < 0) ERR;
|
|
if (H5Tinsert(typeid, "d", HOFFSET(struct s1, d), H5T_NATIVE_DOUBLE) < 0) ERR;
|
|
if (H5Tcommit1(fileid, COMPOUND_NAME, typeid) < 0) ERR;
|
|
|
|
/* Create a space. */
|
|
dims[0] = DIM1_LEN;
|
|
if ((spaceid = H5Screate_simple(1, dims, dims)) < 0) ERR;
|
|
|
|
/* Create a dataset of this compound type. */
|
|
if ((datasetid = H5Dcreate1(fileid, VAR_NAME, typeid, spaceid,
|
|
H5P_DEFAULT)) < 0) ERR;
|
|
|
|
/* Write some data. */
|
|
if (H5Dwrite(datasetid, typeid, H5S_ALL, H5S_ALL, H5P_DEFAULT,
|
|
data) < 0) ERR;
|
|
|
|
/* Release all resources. */
|
|
if (H5Pclose(access_plist) < 0) ERR;
|
|
if (H5Tclose(typeid) < 0) ERR;
|
|
if (H5Sclose(spaceid) < 0) ERR;
|
|
if (H5Fclose(fileid) < 0) ERR;
|
|
}
|
|
SUMMARIZE_ERR;
|
|
printf("*** Checking packing of HDF5 compound types...");
|
|
{
|
|
/* Open file. */
|
|
if ((access_plist = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
|
|
if (H5Pset_fclose_degree(access_plist, H5F_CLOSE_STRONG)) ERR;
|
|
if ((fileid = H5Fopen(FILE_NAME, H5F_ACC_RDONLY, access_plist)) < 0) ERR;
|
|
|
|
/* Open dataset. */
|
|
if ((datasetid = H5Dopen1(fileid, VAR_NAME)) < 0) ERR;
|
|
|
|
/* Check space. */
|
|
if ((spaceid = H5Dget_space(datasetid)) < 0) ERR;
|
|
if (H5Sget_simple_extent_ndims(spaceid) != 1) ERR;
|
|
if (H5Sget_simple_extent_npoints(spaceid) != DIM1_LEN) ERR;
|
|
|
|
/* Get type. */
|
|
if ((typeid = H5Dget_type(datasetid)) < 0) ERR;
|
|
|
|
/* Read the data. */
|
|
if (H5Dread(datasetid, typeid, H5S_ALL, H5S_ALL, H5P_DEFAULT,
|
|
data) < 0) ERR;
|
|
|
|
/* Check the data. */
|
|
for (i=0; i<DIM1_LEN; i++)
|
|
if (data[i].c1 != 126 || data[i].d != -9999999) ERR;
|
|
|
|
/* Release all resources. */
|
|
if (H5Fclose(fileid) < 0) ERR;
|
|
}
|
|
SUMMARIZE_ERR;
|
|
printf("*** Checking packing of HDF5 compound types...");
|
|
{
|
|
/* Open file. */
|
|
if ((access_plist = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
|
|
if (H5Pset_fclose_degree(access_plist, H5F_CLOSE_STRONG)) ERR;
|
|
if ((fileid = H5Fopen(FILE_NAME, H5F_ACC_RDONLY, access_plist)) < 0) ERR;
|
|
|
|
/* Open dataset. */
|
|
if ((datasetid = H5Dopen1(fileid, VAR_NAME)) < 0) ERR;
|
|
|
|
/* Check space. */
|
|
if ((spaceid = H5Dget_space(datasetid)) < 0) ERR;
|
|
if (H5Sget_simple_extent_ndims(spaceid) != 1) ERR;
|
|
if (H5Sget_simple_extent_npoints(spaceid) != DIM1_LEN) ERR;
|
|
|
|
/* Get type. */
|
|
if ((typeid = H5Dget_type(datasetid)) < 0) ERR;
|
|
|
|
/* Read the data. */
|
|
if (H5Dread(datasetid, typeid, H5S_ALL, H5S_ALL, H5P_DEFAULT,
|
|
data) < 0) ERR;
|
|
|
|
/* Check the data. */
|
|
for (i=0; i<DIM1_LEN; i++)
|
|
if (data[i].c1 != 126 || data[i].d != -9999999) ERR;
|
|
|
|
/* Release all resources. */
|
|
if (H5Fclose(fileid) < 0) ERR;
|
|
}
|
|
SUMMARIZE_ERR;
|
|
FINAL_RESULTS;
|
|
}
|