14 #include <nc4internal.h>
15 #include "nc4dispatch.h"
16 #include "hdf5internal.h"
36 NC4_get_var_chunk_cache(
int ncid,
int varid,
size_t *sizep,
37 size_t *nelemsp,
float *preemptionp)
46 if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5)))
48 assert(nc && grp && h5);
51 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,varid);
54 assert(var && var->hdr.id == varid);
58 *sizep = var->chunk_cache_size;
60 *nelemsp = var->chunk_cache_nelems;
62 *preemptionp = var->chunk_cache_preemption;
84 nc_get_var_chunk_cache_ints(
int ncid,
int varid,
int *sizep,
85 int *nelemsp,
int *preemptionp)
87 size_t real_size, real_nelems;
88 float real_preemption;
91 if ((ret = NC4_get_var_chunk_cache(ncid, varid, &real_size,
92 &real_nelems, &real_preemption)))
96 *sizep = real_size / MEGABYTE;
98 *nelemsp = (int)real_nelems;
100 *preemptionp = (int)(real_preemption * 100);
143 NC4_inq_var_all(
int ncid,
int varid,
char *name,
nc_type *xtypep,
144 int *ndimsp,
int *dimidsp,
int *nattsp,
145 int *shufflep,
int *deflatep,
int *deflate_levelp,
146 int *fletcher32p,
int *contiguousp,
size_t *chunksizesp,
147 int *no_fill,
void *fill_valuep,
int *endiannessp,
148 unsigned int *idp,
size_t *nparamsp,
unsigned int *params)
156 LOG((2,
"%s: ncid 0x%x varid %d", __func__, ncid, varid));
159 if ((retval = nc4_find_nc_grp_h5(ncid, NULL, &grp, &h5)))
166 *nattsp = ncindexcount(grp->att);
171 if (!(var = (NC_VAR_INFO_T *)ncindexith(grp->vars, varid)))
173 assert(var && var->hdr.id == varid);
177 strcpy(name, var->hdr.name);
179 *xtypep = var->type_info->hdr.id;
181 *ndimsp = var->ndims;
183 for (d = 0; d < var->ndims; d++)
184 dimidsp[d] = var->dimids[d];
186 *nattsp = ncindexcount(var->att);
189 if (!var->contiguous && chunksizesp)
190 for (d = 0; d < var->ndims; d++)
192 chunksizesp[d] = var->chunksizes[d];
193 LOG((4,
"chunksizesp[%d]=%d", d, chunksizesp[d]));
201 *deflatep = (int)var->deflate;
203 *deflate_levelp = var->deflate_level;
205 *shufflep = (int)var->shuffle;
207 *fletcher32p = (int)var->fletcher32;
210 *idp = var->filterid;
212 *nparamsp = (var->params == NULL ? 0 : var->nparams);
213 if (params && var->params != NULL)
214 memcpy(params,var->params,var->nparams*
sizeof(
unsigned int));
218 *no_fill = (int)var->no_fill;
222 if (!var->no_fill && fill_valuep)
227 if (var->type_info->nc_type_class ==
NC_STRING)
229 assert(*(
char **)var->fill_value);
231 if (!(*(
char **)fill_valuep = strdup(*(
char **)var->fill_value)))
233 free(*(
char **)fill_valuep);
239 assert(var->type_info->size);
240 memcpy(fill_valuep, var->fill_value, var->type_info->size);
245 if (var->type_info->nc_type_class ==
NC_STRING)
247 if (!(*(
char **)fill_valuep = calloc(1,
sizeof(
char *))))
250 if ((retval = nc4_get_default_fill_value(var->type_info, (
char **)fill_valuep)))
252 free(*(
char **)fill_valuep);
258 if ((retval = nc4_get_default_fill_value(var->type_info, fill_valuep)))
266 *endiannessp = var->type_info->endianness;
288 nc_inq_var_chunking_ints(
int ncid,
int varid,
int *contiguousp,
int *chunksizesp)
295 if ((retval = nc4_find_grp_h5_var(ncid, varid, NULL, NULL, &var)))
301 if (!(cs = malloc(var->ndims *
sizeof(
size_t))))
305 retval = NC4_inq_var_all(ncid, varid, NULL, NULL, NULL, NULL, NULL,
306 NULL, NULL, NULL, NULL, contiguousp, cs, NULL,
307 NULL, NULL, NULL, NULL, NULL);
310 if (!retval && chunksizesp && var->contiguous ==
NC_CHUNKED)
312 for (i = 0; i < var->ndims; i++)
314 chunksizesp[i] = (int)cs[i];
338 NC4_inq_varid(
int ncid,
const char *name,
int *varidp)
351 LOG((2,
"%s: ncid 0x%x name %s", __func__, ncid, name));
354 if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, NULL)))
358 if ((retval = nc4_normalize_name(name, norm_name)))
362 var = (NC_VAR_INFO_T*)ncindexlookup(grp->vars,norm_name);
365 *varidp = var->hdr.id;
390 NC4_var_par_access(
int ncid,
int varid,
int par_access)
392 #ifndef USE_PARALLEL4
395 NC_UNUSED(par_access);
404 LOG((1,
"%s: ncid 0x%x varid %d par_access %d", __func__, ncid,
411 if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5)))
419 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,varid);
421 assert(var->hdr.id == varid);
454 nc4_convert_type(
const void *src,
void *dest,
const nc_type src_type,
455 const nc_type dest_type,
const size_t len,
int *range_error,
456 const void *fill_value,
int strict_nc3)
463 signed char *bp, *bp1;
464 unsigned char *ubp, *ubp1;
465 unsigned short *usp, *usp1;
466 unsigned int *uip, *uip1;
467 long long *lip, *lip1;
468 unsigned long long *ulip, *ulip1;
472 LOG((3,
"%s: len %d src_type %d dest_type %d", __func__, len, src_type,
489 for (cp = (
char *)src, cp1 = dest; count < len; count++)
493 LOG((0,
"%s: Unknown destination type.", __func__));
501 for (bp = (
signed char *)src, bp1 = dest; count < len; count++)
505 for (bp = (
signed char *)src, ubp = dest; count < len; count++)
513 for (bp = (
signed char *)src, sp = dest; count < len; count++)
517 for (bp = (
signed char *)src, usp = dest; count < len; count++)
525 for (bp = (
signed char *)src, ip = dest; count < len; count++)
529 for (bp = (
signed char *)src, uip = dest; count < len; count++)
537 for (bp = (
signed char *)src, lip = dest; count < len; count++)
541 for (bp = (
signed char *)src, ulip = dest; count < len; count++)
549 for (bp = (
signed char *)src, fp = dest; count < len; count++)
553 for (bp = (
signed char *)src, dp = dest; count < len; count++)
557 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
558 __func__, src_type, dest_type));
567 for (ubp = (
unsigned char *)src, bp = dest; count < len; count++)
569 if (!strict_nc3 && *ubp > X_SCHAR_MAX)
575 for (ubp = (
unsigned char *)src, sp = dest; count < len; count++)
579 for (ubp = (
unsigned char *)src, ubp1 = dest; count < len; count++)
583 for (ubp = (
unsigned char *)src, usp = dest; count < len; count++)
587 for (ubp = (
unsigned char *)src, ip = dest; count < len; count++)
591 for (ubp = (
unsigned char *)src, uip = dest; count < len; count++)
595 for (ubp = (
unsigned char *)src, lip = dest; count < len; count++)
599 for (ubp = (
unsigned char *)src, ulip = dest; count < len; count++)
603 for (ubp = (
unsigned char *)src, fp = dest; count < len; count++)
607 for (ubp = (
unsigned char *)src, dp = dest; count < len; count++)
611 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
612 __func__, src_type, dest_type));
621 for (sp = (
short *)src, ubp = dest; count < len; count++)
623 if (*sp > X_UCHAR_MAX || *sp < 0)
629 for (sp = (
short *)src, bp = dest; count < len; count++)
631 if (*sp > X_SCHAR_MAX || *sp < X_SCHAR_MIN)
637 for (sp = (
short *)src, sp1 = dest; count < len; count++)
641 for (sp = (
short *)src, usp = dest; count < len; count++)
649 for (sp = (
short *)src, ip = dest; count < len; count++)
653 for (sp = (
short *)src, uip = dest; count < len; count++)
661 for (sp = (
short *)src, lip = dest; count < len; count++)
665 for (sp = (
short *)src, ulip = dest; count < len; count++)
673 for (sp = (
short *)src, fp = dest; count < len; count++)
677 for (sp = (
short *)src, dp = dest; count < len; count++)
681 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
682 __func__, src_type, dest_type));
691 for (usp = (
unsigned short *)src, ubp = dest; count < len; count++)
693 if (*usp > X_UCHAR_MAX)
699 for (usp = (
unsigned short *)src, bp = dest; count < len; count++)
701 if (*usp > X_SCHAR_MAX)
707 for (usp = (
unsigned short *)src, sp = dest; count < len; count++)
709 if (*usp > X_SHORT_MAX)
715 for (usp = (
unsigned short *)src, usp1 = dest; count < len; count++)
719 for (usp = (
unsigned short *)src, ip = dest; count < len; count++)
723 for (usp = (
unsigned short *)src, uip = dest; count < len; count++)
727 for (usp = (
unsigned short *)src, lip = dest; count < len; count++)
731 for (usp = (
unsigned short *)src, ulip = dest; count < len; count++)
735 for (usp = (
unsigned short *)src, fp = dest; count < len; count++)
739 for (usp = (
unsigned short *)src, dp = dest; count < len; count++)
743 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
744 __func__, src_type, dest_type));
753 for (ip = (
int *)src, ubp = dest; count < len; count++)
755 if (*ip > X_UCHAR_MAX || *ip < 0)
761 for (ip = (
int *)src, bp = dest; count < len; count++)
763 if (*ip > X_SCHAR_MAX || *ip < X_SCHAR_MIN)
769 for (ip = (
int *)src, sp = dest; count < len; count++)
771 if (*ip > X_SHORT_MAX || *ip < X_SHORT_MIN)
777 for (ip = (
int *)src, usp = dest; count < len; count++)
779 if (*ip > X_USHORT_MAX || *ip < 0)
785 for (ip = (
int *)src, ip1 = dest; count < len; count++)
787 if (*ip > X_INT_MAX || *ip < X_INT_MIN)
793 for (ip = (
int *)src, uip = dest; count < len; count++)
795 if (*ip > X_UINT_MAX || *ip < 0)
801 for (ip = (
int *)src, lip = dest; count < len; count++)
805 for (ip = (
int *)src, ulip = dest; count < len; count++)
813 for (ip = (
int *)src, fp = dest; count < len; count++)
817 for (ip = (
int *)src, dp = dest; count < len; count++)
821 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
822 __func__, src_type, dest_type));
831 for (uip = (
unsigned int *)src, ubp = dest; count < len; count++)
833 if (*uip > X_UCHAR_MAX)
839 for (uip = (
unsigned int *)src, bp = dest; count < len; count++)
841 if (*uip > X_SCHAR_MAX)
847 for (uip = (
unsigned int *)src, sp = dest; count < len; count++)
849 if (*uip > X_SHORT_MAX)
855 for (uip = (
unsigned int *)src, usp = dest; count < len; count++)
857 if (*uip > X_USHORT_MAX)
863 for (uip = (
unsigned int *)src, ip = dest; count < len; count++)
865 if (*uip > X_INT_MAX)
871 for (uip = (
unsigned int *)src, uip1 = dest; count < len; count++)
873 if (*uip > X_UINT_MAX)
879 for (uip = (
unsigned int *)src, lip = dest; count < len; count++)
883 for (uip = (
unsigned int *)src, ulip = dest; count < len; count++)
887 for (uip = (
unsigned int *)src, fp = dest; count < len; count++)
891 for (uip = (
unsigned int *)src, dp = dest; count < len; count++)
895 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
896 __func__, src_type, dest_type));
905 for (lip = (
long long *)src, ubp = dest; count < len; count++)
907 if (*lip > X_UCHAR_MAX || *lip < 0)
913 for (lip = (
long long *)src, bp = dest; count < len; count++)
915 if (*lip > X_SCHAR_MAX || *lip < X_SCHAR_MIN)
921 for (lip = (
long long *)src, sp = dest; count < len; count++)
923 if (*lip > X_SHORT_MAX || *lip < X_SHORT_MIN)
929 for (lip = (
long long *)src, usp = dest; count < len; count++)
931 if (*lip > X_USHORT_MAX || *lip < 0)
937 for (lip = (
long long *)src, uip = dest; count < len; count++)
939 if (*lip > X_UINT_MAX || *lip < 0)
945 for (lip = (
long long *)src, ip = dest; count < len; count++)
947 if (*lip > X_INT_MAX || *lip < X_INT_MIN)
953 for (lip = (
long long *)src, lip1 = dest; count < len; count++)
957 for (lip = (
long long *)src, ulip = dest; count < len; count++)
965 for (lip = (
long long *)src, fp = dest; count < len; count++)
969 for (lip = (
long long *)src, dp = dest; count < len; count++)
973 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
974 __func__, src_type, dest_type));
983 for (ulip = (
unsigned long long *)src, ubp = dest; count < len; count++)
985 if (*ulip > X_UCHAR_MAX)
991 for (ulip = (
unsigned long long *)src, bp = dest; count < len; count++)
993 if (*ulip > X_SCHAR_MAX)
999 for (ulip = (
unsigned long long *)src, sp = dest; count < len; count++)
1001 if (*ulip > X_SHORT_MAX)
1007 for (ulip = (
unsigned long long *)src, usp = dest; count < len; count++)
1009 if (*ulip > X_USHORT_MAX)
1015 for (ulip = (
unsigned long long *)src, uip = dest; count < len; count++)
1017 if (*ulip > X_UINT_MAX)
1023 for (ulip = (
unsigned long long *)src, ip = dest; count < len; count++)
1025 if (*ulip > X_INT_MAX)
1031 for (ulip = (
unsigned long long *)src, lip = dest; count < len; count++)
1033 if (*ulip > X_INT64_MAX)
1039 for (ulip = (
unsigned long long *)src, ulip1 = dest; count < len; count++)
1043 for (ulip = (
unsigned long long *)src, fp = dest; count < len; count++)
1047 for (ulip = (
unsigned long long *)src, dp = dest; count < len; count++)
1051 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
1052 __func__, src_type, dest_type));
1061 for (fp = (
float *)src, ubp = dest; count < len; count++)
1063 if (*fp > X_UCHAR_MAX || *fp < 0)
1069 for (fp = (
float *)src, bp = dest; count < len; count++)
1071 if (*fp > (
double)X_SCHAR_MAX || *fp < (
double)X_SCHAR_MIN)
1077 for (fp = (
float *)src, sp = dest; count < len; count++)
1079 if (*fp > (
double)X_SHORT_MAX || *fp < (
double)X_SHORT_MIN)
1085 for (fp = (
float *)src, usp = dest; count < len; count++)
1087 if (*fp > X_USHORT_MAX || *fp < 0)
1093 for (fp = (
float *)src, uip = dest; count < len; count++)
1095 if (*fp > X_UINT_MAX || *fp < 0)
1101 for (fp = (
float *)src, ip = dest; count < len; count++)
1103 if (*fp > (
double)X_INT_MAX || *fp < (
double)X_INT_MIN)
1109 for (fp = (
float *)src, lip = dest; count < len; count++)
1111 if (*fp > X_INT64_MAX || *fp <X_INT64_MIN)
1117 for (fp = (
float *)src, lip = dest; count < len; count++)
1119 if (*fp > X_UINT64_MAX || *fp < 0)
1125 for (fp = (
float *)src, fp1 = dest; count < len; count++)
1133 for (fp = (
float *)src, dp = dest; count < len; count++)
1137 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
1138 __func__, src_type, dest_type));
1147 for (dp = (
double *)src, ubp = dest; count < len; count++)
1149 if (*dp > X_UCHAR_MAX || *dp < 0)
1155 for (dp = (
double *)src, bp = dest; count < len; count++)
1157 if (*dp > X_SCHAR_MAX || *dp < X_SCHAR_MIN)
1163 for (dp = (
double *)src, sp = dest; count < len; count++)
1165 if (*dp > X_SHORT_MAX || *dp < X_SHORT_MIN)
1171 for (dp = (
double *)src, usp = dest; count < len; count++)
1173 if (*dp > X_USHORT_MAX || *dp < 0)
1179 for (dp = (
double *)src, uip = dest; count < len; count++)
1181 if (*dp > X_UINT_MAX || *dp < 0)
1187 for (dp = (
double *)src, ip = dest; count < len; count++)
1189 if (*dp > X_INT_MAX || *dp < X_INT_MIN)
1195 for (dp = (
double *)src, lip = dest; count < len; count++)
1197 if (*dp > X_INT64_MAX || *dp < X_INT64_MIN)
1203 for (dp = (
double *)src, lip = dest; count < len; count++)
1205 if (*dp > X_UINT64_MAX || *dp < 0)
1211 for (dp = (
double *)src, fp = dest; count < len; count++)
1213 if (*dp > X_FLOAT_MAX || *dp < X_FLOAT_MIN)
1219 for (dp = (
double *)src, dp1 = dest; count < len; count++)
1227 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
1228 __func__, src_type, dest_type));
1234 LOG((0,
"%s: unexpected src type. src_type %d, dest_type %d",
1235 __func__, src_type, dest_type));
1253 nc4_get_default_fill_value(
const NC_TYPE_INFO_T *type_info,
void *fill_value)
1255 switch (type_info->hdr.id)
1325 nc4_get_typelen_mem(NC_FILE_INFO_T *h5,
nc_type xtype,
size_t *len)
1327 NC_TYPE_INFO_T *type;
1330 LOG((4,
"%s xtype: %d", __func__, xtype));
1339 *len =
sizeof(char);
1343 *len =
sizeof(short);
1350 *len =
sizeof(float);
1353 *len =
sizeof(double);
1357 *len =
sizeof(
long long);
1360 *len =
sizeof(
char *);
1365 if ((retval = nc4_find_type(h5, xtype, &type)))
1373 LOG((5,
"type->size: %d", type->size));
#define NC_FILL_UBYTE
Default fill value.
#define NC_ENOMEM
Memory allocation (malloc) failure.
#define NC_CHUNKED
In HDF5 files you can set storage for each variable to be either contiguous or chunked, with nc_def_var_chunking().
#define NC_CHAR
ISO/ASCII character.
#define NC_MAX_INT
Max or min values for a type.
#define NC_CONTIGUOUS
In HDF5 files you can set storage for each variable to be either contiguous or chunked, with nc_def_var_chunking().
#define NC_FILL_CHAR
Default fill value.
#define NC_UBYTE
unsigned 1 byte int
#define NC_ERANGE
Math result not representable.
#define NC_FILL_UINT
Default fill value.
#define NC_UINT
unsigned 4-byte int
#define NC_INT64
signed 8-byte int
#define NC_DOUBLE
double precision floating point number
#define NC_FILL_UINT64
Default fill value.
#define NC_INDEPENDENT
Use with nc_var_par_access() to set parallel access to independent.
int nc_type
The nc_type type is just an int.
#define NC_FILL_STRING
Default fill value.
#define NC_COLLECTIVE
Use with nc_var_par_access() to set parallel access to collective.
#define NC_BYTE
signed 1 byte integer
#define NC_FILL_INT
Default fill value.
#define NC_EBADTYPE
Not a netcdf data type.
#define NC_EINVAL
Invalid Argument.
#define NC_INT
signed 4 byte integer
#define NC_MAX_NAME
Maximum for classic library.
#define NC_USHORT
unsigned 2-byte int
#define NC_FILL_FLOAT
Default fill value.
#define NC_ENOPAR
Parallel operation on file opened for non-parallel access.
#define NC_SHORT
signed 2 byte integer
#define NC_ENOTVAR
Variable not found.
#define NC_NOERR
No Error.
#define NC_FILL_SHORT
Default fill value.
#define NC_FILL_DOUBLE
Default fill value.
#define NC_FILL_USHORT
Default fill value.
#define NC_FILL_BYTE
Default fill value.
#define NC_GLOBAL
Attribute id to put/get a global attribute.
#define NC_FLOAT
single precision floating point number
#define NC_FILL_INT64
Default fill value.
#define NC_UINT64
unsigned 8-byte int