Skip to content
Snippets Groups Projects

M214003/develop

Closed Uwe Schulzweida requested to merge m214003/develop into develop
1 file
+ 1
1
Compare changes
  • Side-by-side
  • Inline
+ 68
18
@@ -14,23 +14,50 @@
#include "vlist_var.h"
// #include <netcdf_filter.h>
#ifdef HAVE_NETCDF4
#include "netcdf_aux.h"
#endif
void
cdf_def_var_filter(int ncid, int ncvarID, unsigned int id, size_t nparams, const unsigned int *params)
cdf_def_var_filter(int ncid, int ncvarID, const char *filterSpec)
{
#ifdef HAVE_NETCDF4
int status;
if ((status = nc_def_var_filter(ncid, ncvarID, id, nparams, params)))
if (filterSpec)
{
Message("filterId=%u numParams=%zu", id, nparams);
Error("nc_def_var_filter failed; %s", nc_strerror(status));
size_t nfilters = 0;
NC_H5_Filterspec **filters = NULL;
int status = ncaux_h5filterspec_parselist(filterSpec, NULL, &nfilters, &filters);
if (status != NC_NOERR)
{
Message("filterSpec=%s", filterSpec);
Error("ncaux_h5filterspec_parselist failed: %s", nc_strerror(status));
}
if (filters != NULL)
{
for (size_t i = 0; i < nfilters; i++)
{
unsigned int filterid = filters[i]->filterid;
// printf("filter %zu id:%d nparams:%zu param1 %d %d\n", i + 1, filterid, filters[i]->nparams, filters[i]->params[0],
// filters[i]->params[1]);
status = nc_def_var_filter(ncid, ncvarID, filterid, filters[i]->nparams, filters[i]->params);
if (status != NC_NOERR)
{
Message("filterid=%u numParams=%zu", filterid, filters[i]->nparams);
Error("nc_def_var_filter failed: %s", nc_strerror(status));
}
}
for (size_t i = 0; i < nfilters; i++) ncaux_h5filterspec_free(filters[i]);
free(filters);
}
}
#else
static bool lwarn = true;
if (lwarn)
{
lwarn = false;
Warning("filter failed, NetCDF4 not available!");
Warning("Filter failed, NetCDF4 not available!");
}
#endif
}
@@ -48,7 +75,7 @@ cdfDefVarDeflate(int ncid, int ncvarID, int shuffle, int compLevel)
int status;
if ((status = nc_def_var_deflate(ncid, ncvarID, shuffle, deflate, compLevel)))
{
Error("nc_def_var_deflate failed; %s", nc_strerror(status));
Error("nc_def_var_deflate failed: %s", nc_strerror(status));
}
#else
static bool lwarn = true;
@@ -75,7 +102,7 @@ cdfDefVarSzip(int ncid, int ncvarID, int pixels_per_block)
int options_mask = 38;
int status;
if ((status = nc_def_var_szip(ncid, ncvarID, options_mask, pixels_per_block)))
Error("nc_def_var_szip failed; %s", nc_strerror(status));
Error("nc_def_var_szip failed: %s", nc_strerror(status));
#else
(void) ncid;
(void) ncvarID;
@@ -460,13 +487,13 @@ xtype2ppb(nc_type xtype)
}
static void
cdfDefVarFilter(const stream_t *s, int ncvarID)
cdfDefVarFilter(int fileID, int fileType, int ncvarID, const char *filterSpec)
{
if (s->filterId != 0)
if (filterSpec)
{
if (s->filetype == CDI_FILETYPE_NC4 || s->filetype == CDI_FILETYPE_NC4C || s->filetype == CDI_FILETYPE_NCZARR)
if (fileType == CDI_FILETYPE_NC4 || fileType == CDI_FILETYPE_NC4C || fileType == CDI_FILETYPE_NCZARR)
{
cdf_def_var_filter(s->fileID, ncvarID, s->filterId, s->numParams, s->params);
cdf_def_var_filter(fileID, ncvarID, filterSpec);
}
else
{
@@ -776,7 +803,7 @@ cdfDefineDimsAndChunks(const stream_t *streamptr, int varID, int xid, int yid, i
if (chunkType == CDI_CHUNK_GRID && gridsize > ChunkSizeLim)
{
if (CDI_Debug) fprintf(stderr, "gridsize > %u, changed chunkType to CDI_CHUNK_LINES!\n", ChunkSizeLim);
chunkType = CDI_CHUNK_LINES;
chunkType = CDI_CHUNK_AUTO;
}
for (int id = 0; id < 3; ++id)
@@ -914,12 +941,27 @@ cdfGenVarname(int fileID, char name[CDI_MAX_NAME], int pnum, int pcat, int *pdis
*pdis = 255;
}
static void
cdfDefVarChunkCache(int fileID, int ncvarID)
{
size_t size = 0;
size_t nelems = 0;
float preemption = 0;
if (CDI_Chunk_Cache > 0 && nc_get_var_chunk_cache(fileID, ncvarID, &size, &nelems, &preemption) == NC_NOERR)
{
size = CDI_Chunk_Cache;
}
nc_set_var_chunk_cache(fileID, ncvarID, size, nelems, preemption);
}
int
cdfDefVar(stream_t *streamptr, int varID)
{
if (streamptr->vars[varID].ncvarid != CDI_UNDEFID) return streamptr->vars[varID].ncvarid;
int fileID = streamptr->fileID;
int fileType = streamptr->filetype;
if (CDI_Debug) Message("streamID = %d, fileID = %d, varID = %d", streamptr->self, fileID, varID);
int vlistID = streamptr->vlistID;
@@ -992,6 +1034,8 @@ cdfDefVar(stream_t *streamptr, int varID)
int ncvarID = -1;
cdf_def_var(fileID, name, xtype, ndims, dims, &ncvarID);
cdfDefVarChunkCache(fileID, ncvarID);
#ifdef HAVE_NETCDF4
#ifdef NC_QUANTIZE_BITROUND
if (xtype == NC_FLOAT || xtype == NC_DOUBLE)
@@ -1002,14 +1046,20 @@ cdfDefVar(stream_t *streamptr, int varID)
}
#endif
if (useChunks
&& (streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C
|| streamptr->filetype == CDI_FILETYPE_NCZARR))
if (useChunks && (fileType == CDI_FILETYPE_NC4 || fileType == CDI_FILETYPE_NC4C || fileType == CDI_FILETYPE_NCZARR))
cdf_def_var_chunking(fileID, ncvarID, NC_CHUNKED, chunks);
#endif
if (useChunks) cdfDefVarCompression(streamptr, ncvarID, xtype);
if (useChunks) cdfDefVarFilter(streamptr, ncvarID);
if (useChunks)
{
char filterSpec[CDI_MAX_NAME];
length = CDI_MAX_NAME;
if (cdiInqKeyString(vlistID, varID, CDI_KEY_FILTERSPEC, filterSpec, &length) == CDI_NOERR)
cdfDefVarFilter(fileID, fileType, ncvarID, filterSpec);
else if (streamptr->filterSpec)
cdfDefVarFilter(fileID, fileType, ncvarID, streamptr->filterSpec);
}
if (*stdname) cdf_put_att_text(fileID, ncvarID, "standard_name", strlen(stdname), stdname);
if (*longname) cdf_put_att_text(fileID, ncvarID, "long_name", strlen(longname), longname);
@@ -1056,7 +1106,7 @@ cdfDefVar(stream_t *streamptr, int varID)
cdfDefineCellMethods(streamptr, vlistID, varID, fileID, ncvarID);
// Attributes
cdfDefineAttributes(streamptr->filetype, vlistID, varID, fileID, ncvarID);
cdfDefineAttributes(fileType, vlistID, varID, fileID, ncvarID);
// Institute
if (vlistInqInstitut(vlistID) == CDI_UNDEFID) cdfDefineInstituteName(vlistID, varID, fileID, ncvarID);
Loading