diff --git a/include/netCDF4.pxi b/include/netCDF4.pxi index 86e309839..864436a0d 100644 --- a/include/netCDF4.pxi +++ b/include/netCDF4.pxi @@ -368,6 +368,7 @@ cdef extern from "netcdf.h": int nc_inq_enum_ident(int ncid, nc_type xtype, long long value, char *identifier) nogil + IF HAS_QUANTIZATION_SUPPORT: cdef extern from "netcdf.h": cdef enum: @@ -377,6 +378,8 @@ IF HAS_QUANTIZATION_SUPPORT: NC_QUANTIZE_BITROUND int nc_def_var_quantize(int ncid, int varid, int quantize_mode, int nsd) nogil int nc_inq_var_quantize(int ncid, int varid, int *quantize_modep, int *nsdp) nogil + +IF HAS_NCFILTER: cdef extern from "netcdf_filter.h": int nc_inq_filter_avail(int ncid, unsigned filterid) nogil @@ -388,8 +391,6 @@ IF HAS_SZIP_SUPPORT: int nc_inq_var_quantize(int ncid, int varid, int *quantize_modep, int *nsdp) nogil int nc_def_var_szip(int ncid, int varid, int options_mask, int pixels_per_bloc) nogil int nc_inq_var_szip(int ncid, int varid, int *options_maskp, int *pixels_per_blockp) nogil - cdef extern from "netcdf_filter.h": - int nc_inq_filter_avail(int ncid, unsigned filterid) nogil IF HAS_ZSTANDARD_SUPPORT: cdef extern from "netcdf_filter.h": @@ -397,7 +398,6 @@ IF HAS_ZSTANDARD_SUPPORT: H5Z_FILTER_ZSTD int nc_def_var_zstandard(int ncid, int varid, int level) nogil int nc_inq_var_zstandard(int ncid, int varid, int* hasfilterp, int *levelp) nogil - int nc_inq_filter_avail(int ncid, unsigned id) nogil IF HAS_BZIP2_SUPPORT: cdef extern from "netcdf_filter.h": @@ -405,7 +405,6 @@ IF HAS_BZIP2_SUPPORT: H5Z_FILTER_BZIP2 int nc_def_var_bzip2(int ncid, int varid, int level) nogil int nc_inq_var_bzip2(int ncid, int varid, int* hasfilterp, int *levelp) nogil - int nc_inq_filter_avail(int ncid, unsigned filterid) nogil IF HAS_BLOSC_SUPPORT: cdef extern from "netcdf_filter.h": @@ -413,7 +412,6 @@ IF HAS_BLOSC_SUPPORT: H5Z_FILTER_BLOSC int nc_def_var_blosc(int ncid, int varid, unsigned subcompressor, unsigned level, unsigned blocksize, unsigned addshuffle) nogil int nc_inq_var_blosc(int ncid, int varid, int* hasfilterp, unsigned* subcompressorp, unsigned* levelp, unsigned* blocksizep, unsigned* addshufflep) nogil - int nc_inq_filter_avail(int ncid, unsigned filterid) nogil IF HAS_NC_OPEN_MEM: cdef extern from "netcdf_mem.h": diff --git a/setup.py b/setup.py index 87ba082e9..b1e941a96 100644 --- a/setup.py +++ b/setup.py @@ -70,6 +70,7 @@ def check_api(inc_dirs,netcdf_lib_version): has_zstandard = False has_bzip2 = False has_blosc = False + has_ncfilter = False has_set_alignment = False for d in inc_dirs: @@ -116,6 +117,8 @@ def check_api(inc_dirs,netcdf_lib_version): has_bzip2 = True if line.startswith('EXTERNL int nc_def_var_blosc'): has_blosc = True + if line.startswith('EXTERNL int nc_inq_filter_avail'): + has_ncfilter = True ncmetapath = os.path.join(d,'netcdf_meta.h') if os.path.exists(ncmetapath): @@ -143,7 +146,7 @@ def check_api(inc_dirs,netcdf_lib_version): return has_rename_grp, has_nc_inq_path, has_nc_inq_format_extended, \ has_cdf5_format, has_nc_open_mem, has_nc_create_mem, \ has_parallel4_support, has_pnetcdf_support, has_szip_support, has_quantize, \ - has_zstandard, has_bzip2, has_blosc, has_set_alignment + has_zstandard, has_bzip2, has_blosc, has_set_alignment, has_ncfilter def getnetcdfvers(libdirs): @@ -557,7 +560,7 @@ def _populate_hdf5_info(dirstosearch, inc_dirs, libs, lib_dirs): has_rename_grp, has_nc_inq_path, has_nc_inq_format_extended, \ has_cdf5_format, has_nc_open_mem, has_nc_create_mem, \ has_parallel4_support, has_pnetcdf_support, has_szip_support, has_quantize, \ - has_zstandard, has_bzip2, has_blosc, has_set_alignment = \ + has_zstandard, has_bzip2, has_blosc, has_set_alignment, has_ncfilter = \ check_api(inc_dirs,netcdf_lib_version) # for netcdf 4.4.x CDF5 format is always enabled. if netcdf_lib_version is not None and\ @@ -671,6 +674,13 @@ def _populate_hdf5_info(dirstosearch, inc_dirs, libs, lib_dirs): sys.stdout.write('netcdf lib does not have nc_set_alignment function\n') f.write('DEF HAS_SET_ALIGNMENT = 0\n') + if has_blosc: + sys.stdout.write('netcdf lib has nc_inq_filter_avail function\n') + f.write('DEF HAS_NCFILTER = 1\n') + else: + sys.stdout.write('netcdf lib does not have nc_inq_filter_avail function\n') + f.write('DEF HAS_NCFILTER = 0\n') + f.close() if has_parallel4_support or has_pnetcdf_support: diff --git a/src/netCDF4/_netCDF4.pyx b/src/netCDF4/_netCDF4.pyx index 29852a65d..aa64adde1 100644 --- a/src/netCDF4/_netCDF4.pyx +++ b/src/netCDF4/_netCDF4.pyx @@ -3543,15 +3543,21 @@ returns True if bzip2 compression filter is available""" **`has_szip_filter(self)`** returns True if szip compression filter is available""" cdef int ierr - IF HAS_SZIP_SUPPORT: - with nogil: - ierr = nc_inq_filter_avail(self._grpid, H5Z_FILTER_SZIP) - if ierr: + IF HAS_NCFILTER: + IF HAS_SZIP_SUPPORT: + with nogil: + ierr = nc_inq_filter_avail(self._grpid, H5Z_FILTER_SZIP) + if ierr: + return False + else: + return True + ELSE: return False - else: + ELSE: + IF HAS_SZIP_SUPPORT: return True - ELSE: - return False + ELSE: + return False cdef class Group(Dataset): """