From 7889214ddf72daa6e70dd1797d65b9268815190a Mon Sep 17 00:00:00 2001 From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de> Date: Sat, 5 Nov 2022 14:25:32 +0100 Subject: [PATCH] cdfDefAxisCommon: added support for compression. --- src/stream_cdf_o.c | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/stream_cdf_o.c b/src/stream_cdf_o.c index f020bbead..18c7cdb38 100644 --- a/src/stream_cdf_o.c +++ b/src/stream_cdf_o.c @@ -418,6 +418,18 @@ checkZaxisName(char *axisname, int fileID, int vlistID, int zaxisID, int nzaxis) return (int) iz; } +static void +cdfGridCompress(int fileID, int ncvarid, size_t gridsize, int filetype, int comptype, size_t *chunks) +{ +#ifdef HAVE_NETCDF4 + if (gridsize >= 32 && comptype == CDI_COMPRESS_ZIP && (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NCZARR)) + { + cdf_def_var_chunking(fileID, ncvarid, NC_CHUNKED, chunks); + cdfDefVarDeflate(fileID, ncvarid, 1); + } +#endif +} + static void cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool addVarToGrid, const struct cdfDefGridAxisInqs *gridAxisInq, int axisKey, char axisLetter, @@ -490,6 +502,17 @@ cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool { cdf_def_var(fileID, axisname, xtype, ndims, &dimID, &ncvarid); + int chunkSize = 0; + int chunkType = CDI_CHUNK_GRID; + cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKTYPE, &chunkType); + cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKSIZE, &chunkSize); + if (chunkSize > 0) chunkType = CDI_CHUNK_AUTO; + + if (chunkType == CDI_CHUNK_GRID && dimlen > ChunkSizeLim) chunkType = CDI_CHUNK_LINES; + + size_t chunk = calc_chunksize_x(chunkType, chunkSize, dimlen, true); + cdfGridCompress(fileID, ncvarid, dimlen, streamptr->filetype, streamptr->comptype, &chunk); + cdfPutGridStdAtts(fileID, ncvarid, gridID, axisLetter); { char axisStr[2] = { axisLetter, '\0' }; @@ -569,18 +592,6 @@ cdfDefYaxis(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool addV cdfDefAxisCommon(streamptr, gridID, gridIndex, ndims, addVarToGrid, &gridInqsY, CDI_YAXIS, 'Y', finishCyclicYBounds); } -static void -cdfGridCompress(int fileID, int ncvarid, size_t gridsize, int filetype, int comptype, size_t *chunks) -{ -#ifdef HAVE_NETCDF4 - if (gridsize > 1 && comptype == CDI_COMPRESS_ZIP && (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C)) - { - cdf_def_var_chunking(fileID, ncvarid, NC_CHUNKED, chunks); - cdfDefVarDeflate(fileID, ncvarid, 1); - } -#endif -} - static void cdfDefGridReference(stream_t *streamptr, int gridID) { @@ -688,7 +699,7 @@ cdfDefIrregularGridCommon(stream_t *streamptr, int gridID, size_t xsize, size_t dimIDs[0] = ydimID; dimIDs[1] = xdimID; } - else /* ndims == 2 */ + else // ndims == 2 { chunks[0] = calc_chunksize_x(chunkType, chunkSize, xsize, (ydimID == CDI_UNDEFID)); dimIDs[0] = xdimID; -- GitLab