Add szip support via libaec

This commit is contained in:
Dennis Heimbigner 2017-08-27 13:35:20 -06:00
parent 5085df7595
commit ed44fd7306
20 changed files with 227 additions and 84 deletions

2
cf
View File

@ -1,6 +1,6 @@
#!/bin/bash
#NB=1
DB=1
#DB=1
#X=-x
FAST=1

View File

@ -95,7 +95,15 @@ HDF5 and zlib packages are available from the <a href="http://www.hdfgroup.org/d
### Optional: szip support {#op_szip_support}
*Optionally*, you can also build netCDF-4 with the szip library (a.k.a. szlib). If building with szlib, get szip 2.0 or later. NetCDF cannot create szipped data files, but can read HDF5 data files that have used szip. To determine whether license restrictions on the use of szip apply to your situation, see the <a href="http://www.hdfgroup.org/doc_resource/SZIP/">web page on szip compression in HDF products</a>.
*Optionally*, you can also build netCDF-4 with the szip library (a.k.a. szlib). If building with szlib, get szip 2.0 or later. Technically, we mean that
the HDF5 library is built with szip support. The netcdf build will then
inherit szip support from the HDF5 library.
If you intend to write files with szip compression, then we suggest that you
use [libaec](https://gitlab.dkrz.de/k202009/libaec.git)
to avoid patent problems. That library can be used as a
drop-in replacement for the standard szip library.
If you plan to use the standard szip library,
then determine whether license restrictions on the use of szip apply to your situation. See the <a href="http://www.hdfgroup.org/doc_resource/SZIP/">web page on szip compression in HDF products</a>.
If `make check` fails for either `zlib` or `HDF5`, the problem must be resolved before the netCDF-4 installation can continue. For HDF5 problems, see the <a href="http://www.hdfgroup.org/services/support.html">HDF5 help services</a>.

View File

@ -126,7 +126,6 @@ NC4_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
int *shufflep, int *deflatep, int *deflate_levelp,
int *fletcher32p, int *contiguousp, size_t *chunksizesp,
int *no_fill, void *fill_valuep, int *endiannessp,
int *options_maskp, int *pixels_per_blockp,
unsigned int* idp, size_t* nparamsp, unsigned int* params
);

View File

@ -179,9 +179,6 @@ typedef struct NC_VAR_INFO
int deflate_level;
nc_bool_t shuffle; /* True if var has shuffle filter applied */
nc_bool_t fletcher32; /* True if var has fletcher32 filter applied */
nc_bool_t szip; /* True if var has szip filter applied */
int options_mask;
int pixels_per_block;
size_t chunk_cache_size, chunk_cache_nelems;
float chunk_cache_preemption;
#ifdef USE_HDF4

View File

@ -245,7 +245,6 @@ int (*inq_var_all)(int ncid, int varid, char *name, nc_type *xtypep,
int *shufflep, int *deflatep, int *deflate_levelp,
int *fletcher32p, int *contiguousp, size_t *chunksizesp,
int *no_fill, void *fill_valuep, int *endiannessp,
int *options_maskp, int *pixels_per_blockp,
unsigned int* idp, size_t* nparamsp, unsigned int* params
);
@ -400,7 +399,6 @@ NCDISPATCH_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
int *shufflep, int *deflatep, int *deflate_levelp,
int *fletcher32p, int *contiguousp, size_t *chunksizesp,
int *no_fill, void *fill_valuep, int *endiannessp,
int *options_maskp, int *pixels_per_blockp,
unsigned int* idp, size_t* nparamsp, unsigned int* paramsp
);
extern int

View File

@ -14,6 +14,11 @@
#include <netcdf.h>
/* Must match values in <H5Zpublic.h> */
#ifndef H5Z_FILTER_SZIP
#define H5Z_FILTER_SZIP 4
#endif
#if defined(__cplusplus)
extern "C" {
#endif

View File

@ -2391,7 +2391,6 @@ NCD2_inq_var_all(int ncid, int varid, char *name, nc_type* xtypep,
int* shufflep, int* deflatep, int* deflate_levelp,
int* fletcher32p, int* contiguousp, size_t* chunksizesp,
int* no_fill, void* fill_valuep, int* endiannessp,
int* options_maskp, int* pixels_per_blockp,
unsigned int* idp, size_t* nparamsp, unsigned int* params
)
{
@ -2403,7 +2402,6 @@ NCD2_inq_var_all(int ncid, int varid, char *name, nc_type* xtypep,
shufflep, deflatep, deflate_levelp,
fletcher32p, contiguousp, chunksizesp,
no_fill, fill_valuep, endiannessp,
options_maskp, pixels_per_blockp,
idp,nparamsp,params
);
return THROW(ret);

View File

@ -135,7 +135,6 @@ NCD2_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
int *shufflep, int *deflatep, int *deflate_levelp,
int *fletcher32p, int *contiguousp, size_t *chunksizesp,
int *no_fill, void *fill_valuep, int *endiannessp,
int *options_maskp, int *pixels_per_blockp,
unsigned int* idp, size_t* nparamsp, unsigned int* params
);
@ -145,7 +144,6 @@ NC3_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
int *shufflep, int *deflatep, int *deflate_levelp,
int *fletcher32p, int *contiguousp, size_t *chunksizesp,
int *no_fill, void *fill_valuep, int *endiannessp,
int *options_maskp, int *pixels_per_blockp,
unsigned int* idp, size_t* nparamsp, unsigned int* params
);

View File

@ -23,8 +23,10 @@ static void rcorder(NClist* rc);
static char* rcreadline(char**);
static int rcsearch(const char* prefix, const char* rcname, char** pathp);
static void rctrim(char* text);
static void storedump(char* msg, NClist* triples);
static int rcsetinfocurlflag(NCD4INFO*, const char* flag, const char* value);
#ifdef D4DEBUG
static void storedump(char* msg, NClist* triples);
#endif
/* Define default rc files and aliases, also defines search order*/
static char* rcfilenames[] = {".daprc",".dodsrc",NULL};
@ -97,7 +99,9 @@ rcorder(NClist* rc)
}
}
}
#ifdef D4DEBUG
storedump("reorder:",rc);
#endif
}
@ -506,6 +510,7 @@ NCD4_rclookup(char* key, char* hostport)
return (triple == NULL ? NULL : triple->value);
}
#ifdef D4DEBUG
static void
storedump(char* msg, NClist* triples)
{
@ -523,6 +528,7 @@ storedump(char* msg, NClist* triples)
}
fflush(stderr);
}
#endif
/**
* Prefix must end in '/'

View File

@ -427,7 +427,6 @@ NCD4_inq_var_all(int ncid, int varid, char *name, nc_type* xtypep,
int* shufflep, int* deflatep, int* deflate_levelp,
int* fletcher32p, int* contiguousp, size_t* chunksizesp,
int* no_fill, void* fill_valuep, int* endiannessp,
int* options_maskp, int* pixels_per_blockp,
unsigned int* idp, size_t* nparamsp, unsigned int* params
)
{
@ -441,7 +440,6 @@ NCD4_inq_var_all(int ncid, int varid, char *name, nc_type* xtypep,
shufflep, deflatep, deflate_levelp,
fletcher32p, contiguousp, chunksizesp,
no_fill, fill_valuep, endiannessp,
options_maskp, pixels_per_blockp,
idp, nparamsp, params);
return (ret);
}

View File

@ -20,7 +20,6 @@ NCDISPATCH_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
int *shufflep, int *deflatep, int *deflate_levelp,
int *fletcher32p, int *contiguousp, size_t *chunksizesp,
int *no_fill, void *fill_valuep, int *endiannessp,
int *options_maskp, int *pixels_per_blockp,
unsigned int* idp, size_t* nparamsp, unsigned int* params
)
{
@ -34,8 +33,6 @@ NCDISPATCH_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
contiguousp, chunksizesp,
no_fill, fill_valuep,
endiannessp,
options_maskp,
pixels_per_blockp,
idp, nparamsp, params);
}

View File

@ -6,6 +6,7 @@ Research/Unidata. See COPYRIGHT file for more info.
*/
#include "ncdispatch.h"
#include "netcdf_filter.h"
/** \name Learning about Variables
@ -122,7 +123,7 @@ nc_inq_var(int ncid, int varid, char *name, nc_type *xtypep,
TRACE(nc_inq_var);
return ncp->dispatch->inq_var_all(ncid, varid, name, xtypep, ndimsp,
dimidsp, nattsp, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL,NULL,NULL);
}
@ -295,8 +296,6 @@ nc_inq_var_deflate(int ncid, int varid, int *shufflep, int *deflatep,
NULL, /*nofillp*/
NULL, /*fillvaluep*/
NULL, /*endianp*/
NULL, /*optionsmaskp*/
NULL, /*pixelsp*/
NULL,NULL,NULL
);
}
@ -304,12 +303,11 @@ nc_inq_var_deflate(int ncid, int varid, int *shufflep, int *deflatep,
/** \ingroup variables
Learn the szip settings of a variable.
This function returns the szip settings for a variable. NetCDF does
not allow variables to be created with szip (due to license problems
with the szip library), but we do enable read-only access of HDF5
files with szip compression.
This function returns the szip settings for a variable.
With the introduction of general filter support,
szip inquiry is converted to use the filter interface.
This is a wrapper for nc_inq_var_all().
This is a wrapper for nc_inq_var_filter().
\param ncid NetCDF or group ID, from a previous call to nc_open(),
nc_create(), nc_def_grp(), or associated inquiry functions such as
@ -327,15 +325,22 @@ here. \ref ignored_if_null.
\returns ::NC_EBADID Bad ncid.
\returns ::NC_ENOTNC4 Not a netCDF-4 file.
\returns ::NC_ENOTVAR Invalid variable ID.
\returns ::NC_EFILTER Variable is not szip encoded
*/
int
nc_inq_var_szip(int ncid, int varid, int *options_maskp, int *pixels_per_blockp)
{
NC* ncp;
unsigned int id;
size_t nparams;
unsigned int params[2];
int stat = NC_check_id(ncid,&ncp);
if(stat != NC_NOERR) return stat;
TRACE(nc_inq_var_szip);
return ncp->dispatch->inq_var_all(
/* Verify id and nparams */
stat = ncp->dispatch->inq_var_all(
ncid, varid,
NULL, /*name*/
NULL, /*xtypep*/
@ -351,9 +356,39 @@ nc_inq_var_szip(int ncid, int varid, int *options_maskp, int *pixels_per_blockp)
NULL, /*nofillp*/
NULL, /*fillvaluep*/
NULL, /*endianp*/
options_maskp, /*optionsmaskp*/
pixels_per_blockp, /*pixelsp*/
NULL, NULL, NULL);
&id,
&nparams,
NULL
);
if(stat != NC_NOERR) return stat;
if(id != H5Z_FILTER_SZIP || nparams != 2)
return NC_EFILTER; /* not szip or bad # params */
/* Get params */
stat = ncp->dispatch->inq_var_all(
ncid, varid,
NULL, /*name*/
NULL, /*xtypep*/
NULL, /*ndimsp*/
NULL, /*dimidsp*/
NULL, /*nattsp*/
NULL, /*shufflep*/
NULL, /*deflatep*/
NULL, /*deflatelevelp*/
NULL, /*fletcher32p*/
NULL, /*contiguousp*/
NULL, /*chunksizep*/
NULL, /*nofillp*/
NULL, /*fillvaluep*/
NULL, /*endianp*/
&id,
&nparams,
params
);
if(stat != NC_NOERR) return stat;
/* Param[0] should be options_mask, Param[1] should be pixels_per_block */
if(options_maskp) *options_maskp = (int)params[0];
if(pixels_per_blockp) *pixels_per_blockp = (int)params[1];
return NC_NOERR;
}
/** \ingroup variables
@ -399,8 +434,6 @@ nc_inq_var_fletcher32(int ncid, int varid, int *fletcher32p)
NULL, /*nofillp*/
NULL, /*fillvaluep*/
NULL, /*endianp*/
NULL, /*optionsmaskp*/
NULL, /*pixelsp*/
NULL, NULL, NULL
);
}
@ -474,7 +507,7 @@ nc_inq_var_chunking(int ncid, int varid, int *storagep, size_t *chunksizesp)
TRACE(nc_inq_var_chunking);
return ncp->dispatch->inq_var_all(ncid, varid, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, storagep,
chunksizesp, NULL, NULL, NULL, NULL, NULL,
chunksizesp, NULL, NULL, NULL,
NULL, NULL, NULL);
}
@ -524,8 +557,6 @@ nc_inq_var_fill(int ncid, int varid, int *no_fill, void *fill_valuep)
no_fill, /*nofillp*/
fill_valuep, /*fillvaluep*/
NULL, /*endianp*/
NULL, /*optionsmaskp*/
NULL, /*pixelsp*/
NULL, NULL, NULL
);
}
@ -574,8 +605,6 @@ nc_inq_var_endian(int ncid, int varid, int *endianp)
NULL, /*nofillp*/
NULL, /*fillvaluep*/
endianp, /*endianp*/
NULL, /*optionsmaskp*/
NULL, /*pixelsp*/
NULL, NULL, NULL);
}
@ -659,8 +688,6 @@ nc_inq_var_filter(int ncid, int varid, unsigned int* idp, size_t* nparamsp, unsi
NULL, /*nofillp*/
NULL, /*fillvaluep*/
NULL, /*endianp*/
NULL, /*optionsmaskp*/
NULL, /*pixelsp*/
idp, nparamsp, params);
}
@ -705,7 +732,6 @@ NC_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
int *shufflep, int *deflatep, int *deflate_levelp,
int *fletcher32p, int *contiguousp, size_t *chunksizesp,
int *no_fill, void *fill_valuep, int *endiannessp,
int *options_maskp, int *pixels_per_blockp,
unsigned int* idp, size_t* nparamsp, unsigned int* params
)
{
@ -719,8 +745,6 @@ NC_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
contiguousp, chunksizesp,
no_fill, fill_valuep,
endiannessp,
options_maskp,
pixels_per_blockp,
idp,nparamsp,params);
}

View File

@ -35,7 +35,6 @@ static int NC3_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
int *shufflep, int *deflatep, int *deflate_levelp,
int *fletcher32p, int *contiguousp, size_t *chunksizesp,
int *no_fill, void *fill_valuep, int *endiannessp,
int *options_maskp, int *pixels_per_blockp,
unsigned int* idp, size_t* nparamsp, unsigned int* params
);
@ -196,7 +195,6 @@ NC3_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
int *shufflep, int *deflatep, int *deflate_levelp,
int *fletcher32p, int *contiguousp, size_t *chunksizesp,
int *no_fill, void *fill_valuep, int *endiannessp,
int *options_maskp, int *pixels_per_blockp,
unsigned int* idp, size_t* nparamsp, unsigned int* params
)
{
@ -208,7 +206,6 @@ NC3_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
if(contiguousp) *contiguousp = NC_CONTIGUOUS;
if(no_fill) *no_fill = 1;
if(endiannessp) return NC_ENOTNC4;
if(options_maskp) return NC_ENOTNC4;
if(idp) return NC_ENOTNC4;
if(nparamsp) return NC_ENOTNC4;
if(params) return NC_ENOTNC4;

View File

@ -1691,14 +1691,6 @@ read_var(NC_GRP_INFO_T *grp, hid_t datasetid, const char *obj_name,
var->deflate_level = cd_values[0];
break;
case H5Z_FILTER_SZIP:
var->szip = NC_TRUE;
if (cd_nelems != CD_NELEMS_SZIP)
BAIL(NC_EHDFERR);
var->options_mask = cd_values[0];
var->pixels_per_block = cd_values[1];
break;
default:
var->filterid = filter;
var->nparams = cd_nelems;

View File

@ -1625,16 +1625,21 @@ var_create_dataset(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var, nc_bool_t write_dimid
if (H5Pset_deflate(plistid, var->deflate_level) < 0)
BAIL(NC_EHDFERR);
} else if(var->filterid) {
/* Handle szip case here */
if(var->filterid == H5Z_FILTER_SZIP) {
int options_mask;
int bits_per_pixel;
if(var->nparams != 2)
BAIL(NC_EFILTER);
options_mask = (int)var->params[0];
bits_per_pixel = (int)var->params[1];
if(H5Pset_szip(plistid, options_mask, bits_per_pixel) < 0)
BAIL(NC_EFILTER);
} else {
if(H5Pset_filter(plistid, var->filterid, H5Z_FLAG_MANDATORY, var->nparams, var->params) < 0)
BAIL(NC_EFILTER);
}
/* Szip? NO! We don't want anyone to produce szipped netCDF files! */
/* #ifdef USE_SZIP */
/* if (var->options_mask) */
/* if (H5Pset_szip(plistid, var->options_mask, var->bits_per_pixel) < 0) */
/* BAIL(NC_EHDFERR); */
/* #endif */
}
/* If the user wants to fletcher error correcton, set that up now. */
if (var->fletcher32)
@ -1661,7 +1666,7 @@ var_create_dataset(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var, nc_bool_t write_dimid
* has not specified chunksizes, use contiguous variable for
* better performance. */
if(!var->shuffle && !var->deflate && !var->options_mask &&
if(!var->shuffle && !var->deflate &&
!var->fletcher32 && (var->chunksizes == NULL || !var->chunksizes[0])) {
#ifdef USE_HDF4
NC_HDF5_FILE_INFO_T *h5 = grp->nc4_info;

View File

@ -672,7 +672,6 @@ NC4_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
int *shufflep, int *deflatep, int *deflate_levelp,
int *fletcher32p, int *contiguousp, size_t *chunksizesp,
int *no_fill, void *fill_valuep, int *endiannessp,
int *options_maskp, int *pixels_per_blockp,
unsigned int* idp, size_t* nparamsp, unsigned int* params
)
{
@ -752,13 +751,6 @@ NC4_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
*shufflep = (int)var->shuffle;
if (fletcher32p)
*fletcher32p = (int)var->fletcher32;
/* NOTE: No interface for returning szip flag currently (but it should never
* be set).
*/
if (options_maskp)
*options_maskp = var->options_mask;
if (pixels_per_blockp)
*pixels_per_blockp = var->pixels_per_block;
if (idp)
*idp = var->filterid;
@ -1081,7 +1073,7 @@ nc_inq_var_chunking_ints(int ncid, int varid, int *contiguousp, int *chunksizesp
retval = NC4_inq_var_all(ncid, varid, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, contiguousp, cs, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL);
NULL, NULL, NULL, NULL, NULL);
/* Copy from size_t array. */
if (*contiguousp == NC_CHUNKED)
@ -1195,7 +1187,18 @@ NC4_def_var_filter(int ncid, int varid, unsigned int id, size_t nparams, const u
if (var->created)
return NC_ELATEDEF;
if(0) {
#ifdef HAVE_H5Z_SZIP
if(id == H5Z_FILTER_SZIP) {
if(nparams != 2)
return NC_EFILTER; /* incorrect no. of parameters */
}
#else /*!HAVE_H5Z_SZIP*/
if(id == H5Z_FILTER_SZIP)
return NC_EFILTER; /* Not allowed */
#endif
#if 0
{
unsigned int fcfg = 0;
herr_t herr = H5Zget_filter_info(id,&fcfg);
if(herr < 0)
@ -1204,6 +1207,8 @@ NC4_def_var_filter(int ncid, int varid, unsigned int id, size_t nparams, const u
|| (H5Z_FILTER_CONFIG_DECODE_ENABLED & fcfg) == 0)
return NC_EFILTER;
}
#endif /*0*/
var->filterid = id;
var->nparams = nparams;
var->params = NULL;

View File

@ -1157,7 +1157,7 @@ NCP_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
int *shufflep, int *deflatep, int *deflate_levelp,
int *fletcher32p, int *contiguousp, size_t *chunksizesp,
int *no_fill, void *fill_valuep, int *endiannessp,
int *options_maskp, int *pixels_per_blockp)
unsigned int* idp, size_t* nparamsp, unsigned int* params)
{
int status;
NC* nc;

View File

@ -1,23 +1,25 @@
# Test c output
T=tst_misc
T=tst_szip
#CMD=valgrind --leak-check=full
CMD=gdb --args
#PAR=1
SZIP=1
CFLAGS=-Wall -Wno-unused-variable -Wno-unused-function -g -O0 -I.. -I../include
CFLAGS = -Wall -Wno-unused-variable -Wno-unused-function -g -O0 -I.. -I../include
LDFLAGS = ../liblib/.libs/libnetcdf.a -L/usr/local/lib -lhdf5_hl -lhdf5 -lz -ldl -lcurl -lm
ifdef PAR
CC=mpicc
#CC=/usr/local/bin/mpicc
LDFLAGS=../liblib/.libs/libnetcdf.a -L/usr/local/lib -lhdf5_hl -lhdf5 -lz -ldl -lcurl -lpnetcdf -lmpich -lm
LDFLAGS += -lmpich
else
CC=gcc
#LDFLAGS=../liblib/.libs/libnetcdf.a -L/usr/local/lib -lhdf5_hl -lhdf5 -lz -lm -lcurl
LDFLAGS=../liblib/.libs/libnetcdf.a -L/usr/local/lib -lhdf5_hl -lhdf5 -lz -ldl -lm -lcurl
endif
# cd .. ; ${MAKE} all
ifdef SZIP
LDFLAGS += -lsz -laec
endif
LLP=/usr/local/lib:${LD_LIBRARY_PATH}

View File

@ -2,8 +2,6 @@
Copyright 2008, UCAR/Unidata
See COPYRIGHT file for copying and redistribution conditions.
This program tests the large file bug in netCDF 3.6.2,
creating byte and short variables larger than 4 GiB.
*/
#include "config.h"

116
nc_test4/tst_szip.c Normal file
View File

@ -0,0 +1,116 @@
/* This is part of the netCDF package.
Copyright 2005 University Corporation for Atmospheric Research/Unidata
See COPYRIGHT file for conditions of use.
*/
/*
* Example illustrates the use of SZIP compression in netCDF5
* Taken from HDF5 example.
*/
#include <config.h>
#include <stdlib.h>
#include <stdio.h>
#include "nc_tests.h"
#include "err_macros.h"
#include "netcdf.h"
#include "netcdf_filter.h"
#define PLAIN
#undef USECLOSE
/* Szip Constants. */
#define HDF5_FILTER_SZIP 4
#define H5_SZIP_EC_OPTION_MASK 4
#define H5_SZIP_NN_OPTION_MASK 32
#define H5_SZIP_MAX_PIXELS_PER_BLOCK 32
#define NX 500
#define NY 600
#define CH_NX 100
#define CH_NY 25
int
main(void)
{
int ncid, varid, dimids[2];
size_t dims[2], chunk_size[2];
float buf[NX][NY];
float buf_r[NX][NY];
int i, j;
unsigned int szip_params[2]; /* [0]=options_mask [1]=pixels_per_block */
/* Create a new file using read/write access. */
if(nc_create("testszip.nc", NC_CLOBBER|NC_NETCDF4, &ncid)) ERR;
/* Create dims */
dims[0] = NX;
dims[1] = NY;
if(nc_def_dim(ncid, "x", dims[0], &dimids[0])) ERR;
if(nc_def_dim(ncid, "y", dims[1], &dimids[1])) ERR;
/* Create a dimensioned variable */
if(nc_def_var(ncid, "var", NC_FLOAT, 2, dimids, &varid)) ERR;
/* Define chunking for the variable:
* the raw data is to be partitioned into 100x100 element chunks.
*/
chunk_size[0] = CH_NX;
chunk_size[1] = CH_NY;
if(nc_def_var_chunking(ncid, varid, NC_CHUNKED, chunk_size)) ERR;
#ifndef PLAIN
/*
* Set parameters for SZIP compression; check the description of
* the H5Pset_szip function in the HDF5 Reference Manual for more
* information.
*/
szip_params[0] = H5_SZIP_NN_OPTION_MASK;
szip_params[1] = H5_SZIP_MAX_PIXELS_PER_BLOCK;
if(nc_def_var_filter(ncid, varid, HDF5_FILTER_SZIP, 2, szip_params)) ERR;
#endif
if(nc_enddef(ncid)) ERR;
/* Initialize data buffer with some bogus data. */
for(i=0; i < NX; i++) {
for(j=0; j < NY; j++) {
buf[i][j] = (float)(i + j);
}
}
/* Write the array to the file */
if(nc_put_var_float(ncid, varid, &buf[0][0])) ERR;
#if USECLOSE
/* Close and re-open the file */
if(nc_close(ncid)) ERR;
if(nc_open("testszip.nc", NC_NETCDF4. &ncid)) ERR;
if(nc_inq_varid(ncid, "var", &varid)) ERR;
#endif
/*
* Read the array. This is similar to writing data,
* except the data flows in the opposite direction.
* Note: Decompression should be automatic.
*/
memset(buf_r,0,sizeof(buf_r));
if(nc_get_var_float(ncid, varid, &buf_r[0][0])) ERR;
/* Do comparison */
for (i=0; i < NX; i++) {
for (j=0; j < NY; j++) {
if(buf[i][j] != buf_r[i][j]) {
printf("mismatch: [%d][%d]: write = %f read=%f\n",
i,j,buf[i][j],buf_r[i][j]);
}
}
}
if(nc_close(ncid)) ERR;
SUMMARIZE_ERR;
FINAL_RESULTS;
return 0;
}