/* Copyright 2018, UCAR/Unidata See netcdf/COPYRIGHT file for copying * and redistribution conditions.*/ /** * @file @internal This file handles the variable functions for the * HDF4 dispatch layer. * * @author Ed Hartnett */ #include #include "nc4dispatch.h" /** * @internal Set chunk cache size for a variable. This is the internal * function called by nc_set_var_chunk_cache(). * * @param ncid File ID. * @param varid Variable ID. * @param size Size in bytes to set cache. * @param nelems Number of elements in cache. * @param preemption Controls cache swapping. * * @returns ::NC_NOERR No error. * @returns ::NC_EBADID Bad ncid. * @returns ::NC_ENOTVAR Invalid variable ID. * @returns ::NC_ESTRICTNC3 Attempting netcdf-4 operation on strict nc3 netcdf-4 file. * @returns ::NC_EINVAL Invalid input. * @returns ::NC_EHDFERR HDF5 error. * @author Ed Hartnett */ int HDF4_set_var_chunk_cache(int ncid, int varid, size_t size, size_t nelems, float preemption) { return NC_ENOTNC4; } /** * @internal This is called by nc_get_var_chunk_cache(). Get chunk * cache size for a variable. * * @param ncid File ID. * @param varid Variable ID. * @param sizep Gets size in bytes of cache. * @param nelemsp Gets number of element slots in cache. * @param preemptionp Gets cache swapping setting. * * @returns ::NC_NOERR No error. * @returns ::NC_EBADID Bad ncid. * @returns ::NC_ENOTVAR Invalid variable ID. * @returns ::NC_ENOTNC4 Not a netCDF-4 file. * @author Ed Hartnett */ int HDF4_get_var_chunk_cache(int ncid, int varid, size_t *sizep, size_t *nelemsp, float *preemptionp) { return NC_ENOTNC4; } /** * @internal Not allowed for HDF4. * * @param ncid File ID. * @param name Name. * @param xtype Type. * @param ndims Number of dims. * @param dimidsp Array of dim IDs. * @param varidp Gets the var ID. * * @returns ::NC_EPERM Not allowed for HDF4. * @author Ed Hartnett */ int HDF4_def_var(int ncid, const char *name, nc_type xtype, int ndims, const int *dimidsp, int *varidp) { return NC_EPERM; } /** * @internal Set compression settings on a variable. This is called by * nc_def_var_deflate(). * * @param ncid File ID. * @param varid Variable ID. * @param shuffle True to turn on the shuffle filter. * @param deflate True to turn on deflation. * @param deflate_level A number between 0 (no compression) and 9 * (maximum compression). * * @returns ::NC_NOERR No error. * @returns ::NC_EBADID Bad ncid. * @returns ::NC_ENOTVAR Invalid variable ID. * @returns ::NC_ENOTNC4 Attempting netcdf-4 operation on file that is * not netCDF-4/HDF5. * @returns ::NC_ELATEDEF Too late to change settings for this variable. * @returns ::NC_ENOTINDEFINE Not in define mode. * @returns ::NC_EINVAL Invalid input * @author Ed Hartnett, Dennis Heimbigner */ int HDF4_def_var_deflate(int ncid, int varid, int shuffle, int deflate, int deflate_level) { return NC_EPERM; } /** * @internal Set checksum on a variable. This is called by * nc_def_var_fletcher32(). * * @param ncid File ID. * @param varid Variable ID. * @param fletcher32 Pointer to fletcher32 setting. * * @returns ::NC_NOERR No error. * @returns ::NC_EBADID Bad ncid. * @returns ::NC_ENOTVAR Invalid variable ID. * @returns ::NC_ENOTNC4 Attempting netcdf-4 operation on file that is * not netCDF-4/HDF5. * @returns ::NC_ELATEDEF Too late to change settings for this variable. * @returns ::NC_ENOTINDEFINE Not in define mode. * @returns ::NC_EINVAL Invalid input * @author Ed Hartnett, Dennis Heimbigner */ int HDF4_def_var_fletcher32(int ncid, int varid, int fletcher32) { return NC_ENOTNC4; } /** * @internal Define chunking stuff for a var. This is called by * nc_def_var_chunking(). Chunking is required in any dataset with one * or more unlimited dimensions in HDF5, or any dataset using a * filter. * * @param ncid File ID. * @param varid Variable ID. * @param contiguous Pointer to contiguous setting. * @param chunksizesp Array of chunksizes. * * @returns ::NC_NOERR No error. * @returns ::NC_EBADID Bad ncid. * @returns ::NC_ENOTVAR Invalid variable ID. * @returns ::NC_ENOTNC4 Attempting netcdf-4 operation on file that is * not netCDF-4/HDF5. * @returns ::NC_ELATEDEF Too late to change settings for this variable. * @returns ::NC_ENOTINDEFINE Not in define mode. * @returns ::NC_EINVAL Invalid input * @returns ::NC_EBADCHUNK Bad chunksize. * @author Ed Hartnett, Dennis Heimbigner */ int HDF4_def_var_chunking(int ncid, int varid, int contiguous, const size_t *chunksizesp) { return NC_EPERM; } /** * @internal This functions sets fill value and no_fill mode for a * netCDF-4 variable. It is called by nc_def_var_fill(). * * @note All pointer parameters may be NULL, in which case they are ignored. * @param ncid File ID. * @param varid Variable ID. * @param no_fill No_fill setting. * @param fill_value Pointer to fill value. * * @returns ::NC_NOERR for success * @returns ::NC_EBADID Bad ncid. * @returns ::NC_ENOTVAR Invalid variable ID. * @returns ::NC_ENOTNC4 Attempting netcdf-4 operation on file that is * not netCDF-4/HDF5. * @returns ::NC_ESTRICTNC3 Attempting netcdf-4 operation on strict nc3 * netcdf-4 file. * @returns ::NC_ELATEDEF Too late to change settings for this variable. * @returns ::NC_ENOTINDEFINE Not in define mode. * @returns ::NC_EPERM File is read only. * @returns ::NC_EINVAL Invalid input * @author Ed Hartnett */ int HDF4_def_var_fill(int ncid, int varid, int no_fill, const void *fill_value) { return NC_ENOTNC4; } /** * @internal This functions sets endianness for a netCDF-4 * variable. Called by nc_def_var_endian(). * * @note All pointer parameters may be NULL, in which case they are ignored. * @param ncid File ID. * @param varid Variable ID. * @param endianness Endianness setting. * * @returns ::NC_NOERR for success * @returns ::NC_EBADID Bad ncid. * @returns ::NC_ENOTVAR Invalid variable ID. * @returns ::NC_ENOTNC4 Attempting netcdf-4 operation on file that is * not netCDF-4/HDF5. * @returns ::NC_ESTRICTNC3 Attempting netcdf-4 operation on strict nc3 * netcdf-4 file. * @returns ::NC_ELATEDEF Too late to change settings for this variable. * @returns ::NC_ENOTINDEFINE Not in define mode. * @returns ::NC_EPERM File is read only. * @returns ::NC_EINVAL Invalid input * @author Ed Hartnett */ int HDF4_def_var_endian(int ncid, int varid, int endianness) { return NC_ENOTNC4; } /** * @internal Define filter settings. Called by nc_def_var_filter(). * * @param ncid File ID. * @param varid Variable ID. * @param id Filter ID * @param nparams Number of parameters for filter. * @param parms Filter parameters. * * @returns ::NC_NOERR for success * @returns ::NC_EBADID Bad ncid. * @returns ::NC_ENOTVAR Invalid variable ID. * @returns ::NC_ENOTNC4 Attempting netcdf-4 operation on file that is * not netCDF-4/HDF5. * @returns ::NC_ELATEDEF Too late to change settings for this variable. * @returns ::NC_EFILTER Filter error. * @returns ::NC_EINVAL Invalid input * @author Dennis Heimbigner */ int HDF4_def_var_filter(int ncid, int varid, unsigned int id, size_t nparams, const unsigned int* parms) { return NC_ENOTNC4; } /** * @internal Not allowed for HDF4. * * @param ncid File ID. * @param varid Variable ID * @param name New name of the variable. * * @returns ::NC_EPERM Not allowed for HDF4. * @author Ed Hartnett */ int HDF4_rename_var(int ncid, int varid, const char *name) { return NC_EPERM; } /** * @internal * * This function will change the parallel access of a variable from * independent to collective. * * @param ncid File ID. * @param varid Variable ID. * @param par_access NC_COLLECTIVE or NC_INDEPENDENT. * * @returns ::NC_NOERR No error. * @returns ::NC_EBADID Invalid ncid passed. * @returns ::NC_ENOTVAR Invalid varid passed. * @returns ::NC_ENOPAR LFile was not opened with nc_open_par/nc_create_var. * @returns ::NC_EINVAL Invalid par_access specified. * @returns ::NC_NOERR for success * @author Ed Hartnett, Dennis Heimbigner */ int HDF4_var_par_access(int ncid, int varid, int par_access) { return NC_ENOTNC4; } /** * @internal Get data from an HDF4 SD dataset. * * @param ncid File ID. * @param varid Variable ID. * @param startp Array of start indicies. * @param countp Array of counts. * @param mem_nc_type The type of these data after it is read into memory. * @param is_long Ignored for HDF4. * @param data pointer that gets the data. * @returns ::NC_NOERR for success * @author Ed Hartnett */ static int nc4_get_hdf4_vara(NC *nc, int ncid, int varid, const size_t *startp, const size_t *countp, nc_type mem_nc_type, int is_long, void *data) { NC_GRP_INFO_T *grp; NC_HDF5_FILE_INFO_T *h5; NC_VAR_INFO_T *var; int32 start32[NC_MAX_VAR_DIMS], edge32[NC_MAX_VAR_DIMS]; int retval, d; /* Find our metadata for this file, group, and var. */ assert(nc); if ((retval = nc4_find_g_var_nc(nc, ncid, varid, &grp, &var))) return retval; h5 = NC4_DATA(nc); assert(grp && h5 && var && var->hdr.name); for (d = 0; d < var->ndims; d++) { start32[d] = startp[d]; edge32[d] = countp[d]; } if (SDreaddata(var->sdsid, start32, NULL, edge32, data)) return NC_EHDFERR; return NC_NOERR; } /** * @internal Write an array of data to a variable. This is called by * nc_put_vara() and other nc_put_vara_* functions, for netCDF-4 * files. * * @param ncid File ID. * @param varid Variable ID. * @param startp Array of start indicies. * @param countp Array of counts. * @param op pointer that gets the data. * @param memtype The type of these data in memory. * * @returns ::NC_NOERR for success * @author Ed Hartnett, Dennis Heimbigner */ int HDF4_put_vara(int ncid, int varid, const size_t *startp, const size_t *countp, const void *op, int memtype) { return NC_EPERM; } /** * Read an array of values. This is called by nc_get_vara() for * netCDF-4 files, as well as all the other nc_get_vara_* * functions. HDF4 files are handled as a special case. * * @param ncid File ID. * @param varid Variable ID. * @param startp Array of start indicies. * @param countp Array of counts. * @param ip pointer that gets the data. * @param memtype The type of these data after it is read into memory. * @returns ::NC_NOERR for success * @author Ed Hartnett, Dennis Heimbigner */ int HDF4_get_vara(int ncid, int varid, const size_t *startp, const size_t *countp, void *ip, int memtype) { NC *nc; NC_HDF5_FILE_INFO_T* h5; LOG((2, "%s: ncid 0x%x varid %d memtype %d", __func__, ncid, varid, memtype)); if (!(nc = nc4_find_nc_file(ncid, &h5))) return NC_EBADID; /* Handle HDF4 cases. */ return nc4_get_hdf4_vara(nc, ncid, varid, startp, countp, memtype, 0, (void *)ip); }