55#define TESTFILE "bzip2.nc"
64static size_t dimsize = DIMSIZE;
65static size_t chunksize = CHUNKSIZE;
66static size_t actualdims = NDIMS;
68static size_t actualproduct = 1;
69static size_t chunkproduct = 1;
71static size_t dims[NDIMS];
72static size_t chunks[NDIMS];
76static int ncid, varid;
77static int dimids[NDIMS];
78static float* array = NULL;
79static float* expected = NULL;
80static unsigned int filterid = 0;
81static unsigned int* params = NULL;
84static void init(
int argc,
char** argv);
85static int test_bzip2(
void);
86static int verifychunks(
void);
90fprintf(stderr, "Sorry! Unexpected result, %s, line: %d\n", \
91 __FILE__, __LINE__); \
96check(
int err,
int line)
99 fprintf(stderr,
"fail (%d): %s\n",line,
nc_strerror(err));
106#define CHECK(x) check(x,__LINE__)
118 size_t chunksizes[NDIMS];
119 memset(chunksizes,0,
sizeof(chunksizes));
123 fprintf(stderr,
"bad chunk store\n");
127 for(i=0;i<actualdims;i++) {
128 if(chunksizes[i] != chunks[i]) {
129 fprintf(stderr,
"bad chunk size: %d\n",i);
145 printf(
"data comparison: |array|=%ld\n",(
unsigned long)actualproduct);
146 for(i=0;i<actualproduct;i++) {
147 if(expected[i] != array[i]) {
148 printf(
"mismatch: array[%d]=%f expected[%d]=%f\n",
149 i,array[i],i,expected[i]);
156 printf(
"no data errors\n");
157 if(actualproduct <= 1)
169 unsigned int level = BZIP2_LEVEL;
172 printf(
"\n*** Testing API: bzip2 compression.\n");
175 memset(array,0,
sizeof(
float)*actualproduct);
184 for(i=0;i<actualdims;i++) {
186 snprintf(dimname,
sizeof(dimname),
"dim%d",i);
187 CHECK(
nc_def_dim(ncid, dimname, dims[i], &dimids[i]));
205 if(nparams != 1 || level != BZIP2_LEVEL) {
206 printf(
"test_filter: filter def/inq mismatch\n");
210 printf(
"show parameters for bzip2: level=%u\n",level);
212 printf(
"show chunks:");
213 for(i=0;i<actualdims;i++)
214 printf(
"%s%ld",(i==0?
" chunks=":
","),(
unsigned long)chunks[i]);
221 for(i=0;i<actualproduct;i++)
222 expected[i] = (
float)i;
231 printf(
"\n*** Testing API: bzip2 decompression.\n");
234 memset(array,0,
sizeof(
float)*actualproduct);
249 params = (
unsigned int*)malloc(
sizeof(
unsigned int)*nparams);
255 printf(
"Bzip2 id mismatch: %d\n",filterid);
258 if(nparams != 1 && params != NULL && params[0] != BZIP2_LEVEL) {
259 printf(
"Compression parameter mismatch\n");
268 CHECK(nc_get_var_float(ncid, varid, array));
272 return (compare() ==
NC_NOERR ? 0 : 1);
279init(
int argc,
char** argv)
285 for(i=0;i<NDIMS;i++) {
287 chunks[i] = chunksize;
289 actualproduct *= dims[i];
290 chunkproduct *= chunks[i];
294 array = (
float*)calloc(1,
sizeof(
float)*actualproduct);
295 expected = (
float*)calloc(1,
sizeof(
float)*actualproduct);
300main(
int argc,
char **argv)
EXTERNL int nc_close(int ncid)
Close an open netCDF dataset.
EXTERNL int nc_create(const char *path, int cmode, int *ncidp)
Create a new netCDF file.
EXTERNL int nc_set_fill(int ncid, int fillmode, int *old_modep)
Change the fill-value mode to improve write performance.
EXTERNL int nc_enddef(int ncid)
Leave define mode.
EXTERNL int nc_open(const char *path, int mode, int *ncidp)
Open an existing netCDF file.
EXTERNL int nc_def_dim(int ncid, const char *name, size_t len, int *idp)
Define a new dimension.
EXTERNL const char * nc_strerror(int ncerr)
Given an error number, return an error message.
EXTERNL int nc_inq_varid(int ncid, const char *name, int *varidp)
Find the ID of a variable, from the name.
EXTERNL int nc_put_var(int ncid, int varid, const void *op)
Write an entire variable with one call.
EXTERNL int nc_inq_var_filter_info(int ncid, int varid, unsigned int id, size_t *nparams, unsigned int *params)
Find the param info about filter (if any) associated with a variable and with specified id.
EXTERNL int nc_inq_var_filter(int ncid, int varid, unsigned int *idp, size_t *nparams, unsigned int *params)
Find the first filter (if any) associated with a variable.
EXTERNL int nc_inq_var_chunking(int ncid, int varid, int *storagep, size_t *chunksizesp)
Get the storage and (for chunked variables) the chunksizes of a variable.
EXTERNL int nc_def_var(int ncid, const char *name, nc_type xtype, int ndims, const int *dimidsp, int *varidp)
Define a new variable.
EXTERNL int nc_def_var_chunking(int ncid, int varid, int storage, const size_t *chunksizesp)
Define storage and, if chunked storage is used, chunking parameters for a variable.
Main header file for the C API.
#define NC_NETCDF4
Use netCDF-4/HDF5 format.
#define NC_EFILTER
Filter operation failed.
#define NC_CLOBBER
Destroy existing file.
#define NC_FLOAT
single precision floating point number
#define NC_NOWRITE
Set read-only access for nc_open().
#define NC_ENOMEM
Memory allocation (malloc) failure.
#define NC_CHUNKED
In HDF5 files you can set storage for each variable to be either contiguous or chunked,...
#define NC_ESTORAGE
Can't specify both contiguous and chunking.
#define NC_NOFILL
Argument to nc_set_fill() to turn off filling of data.
#define NC_EINVAL
Invalid Argument.
#define NC_NOERR
No Error.
EXTERNL int nc_def_var_filter(int ncid, int varid, unsigned int id, size_t nparams, const unsigned int *parms)
Define a new variable filter Assumes HDF5 format using unsigned ints.
#define NC_EBADCHUNK
Bad chunksize.
#define NC_ENOFILTER
Filter not defined on variable.
#define NC_EBADDIM
Invalid dimension id or name.