mirror of
https://github.com/Unidata/netcdf-c.git
synced 2025-01-06 15:34:44 +08:00
25f062528b
The file docs/indexing.dox tries to provide design information for the refactoring. The primary change is to replace all walking of linked lists with the use of the NCindex data structure. Ncindex is a combination of a hash table (for name-based lookup) and a vector (for walking the elements in the index). Additionally, global vectors are added to NC_HDF5_FILE_INFO_T to support direct mapping of an e.g. dimid to the NC_DIM_INFO_T object. These global vectors exist for dimensions, types, and groups because they have globally unique id numbers. WARNING: 1. since libsrc4 and libsrchdf4 share code, there are also changes in libsrchdf4. 2. Any outstanding pull requests that change libsrc4 or libhdf4 are likely to cause conflicts with this code. 3. The original reason for doing this was for performance improvements, but as noted elsewhere, this may not be significant because the meta-data read performance apparently is being dominated by the hdf5 library because we do bulk meta-data reading rather than lazy reading.
380 lines
11 KiB
C
380 lines
11 KiB
C
/* 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 <nc4internal.h>
|
|
#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);
|
|
}
|