14 #include "nc4internal.h"
15 #include "nc4dispatch.h"
17 #include "hdf5internal.h"
22 #define DEFAULT_1D_UNLIM_SIZE (4096)
41 NC4_get_var_chunk_cache(
int ncid,
int varid,
size_t *sizep,
42 size_t *nelemsp,
float *preemptionp)
51 if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5)))
53 assert(nc && grp && h5);
56 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,varid);
59 assert(var && var->hdr.id == varid);
63 *sizep = var->chunk_cache_size;
65 *nelemsp = var->chunk_cache_nelems;
67 *preemptionp = var->chunk_cache_preemption;
89 nc_get_var_chunk_cache_ints(
int ncid,
int varid,
int *sizep,
90 int *nelemsp,
int *preemptionp)
92 size_t real_size, real_nelems;
93 float real_preemption;
96 if ((ret = NC4_get_var_chunk_cache(ncid, varid, &real_size,
97 &real_nelems, &real_preemption)))
101 *sizep = real_size / MEGABYTE;
103 *nelemsp = (int)real_nelems;
105 *preemptionp = (int)(real_preemption * 100);
148 NC4_inq_var_all(
int ncid,
int varid,
char *name,
nc_type *xtypep,
149 int *ndimsp,
int *dimidsp,
int *nattsp,
150 int *shufflep,
int *deflatep,
int *deflate_levelp,
151 int *fletcher32p,
int *storagep,
size_t *chunksizesp,
152 int *no_fill,
void *fill_valuep,
int *endiannessp,
153 unsigned int *idp,
size_t *nparamsp,
unsigned int *params)
161 LOG((2,
"%s: ncid 0x%x varid %d", __func__, ncid, varid));
164 if ((retval = nc4_find_nc_grp_h5(ncid, NULL, &grp, &h5)))
171 *nattsp = ncindexcount(grp->att);
176 if (!(var = (NC_VAR_INFO_T *)ncindexith(grp->vars, varid)))
178 assert(var && var->hdr.id == varid);
182 strcpy(name, var->hdr.name);
184 *xtypep = var->type_info->hdr.id;
186 *ndimsp = var->ndims;
188 for (d = 0; d < var->ndims; d++)
189 dimidsp[d] = var->dimids[d];
191 *nattsp = ncindexcount(var->att);
194 if (var->storage ==
NC_CHUNKED && chunksizesp)
196 for (d = 0; d < var->ndims; d++)
198 chunksizesp[d] = var->chunksizes[d];
199 LOG((4,
"chunksizesp[%d]=%d", d, chunksizesp[d]));
205 *storagep = var->storage;
209 *shufflep = (int)var->shuffle;
211 *fletcher32p = (int)var->fletcher32;
222 *no_fill = (int)var->no_fill;
226 if (!var->no_fill && fill_valuep)
231 if (var->type_info->nc_type_class ==
NC_STRING)
233 assert(*(
char **)var->fill_value);
235 if (!(*(
char **)fill_valuep = strdup(*(
char **)var->fill_value)))
237 free(*(
char **)fill_valuep);
243 assert(var->type_info->size);
244 memcpy(fill_valuep, var->fill_value, var->type_info->size);
249 if (var->type_info->nc_type_class ==
NC_STRING)
251 if (!(*(
char **)fill_valuep = calloc(1,
sizeof(
char *))))
254 if ((retval = nc4_get_default_fill_value(var->type_info->hdr.id, (
char **)fill_valuep)))
256 free(*(
char **)fill_valuep);
262 if ((retval = nc4_get_default_fill_value(var->type_info->hdr.id, fill_valuep)))
270 *endiannessp = var->endianness;
292 nc_inq_var_chunking_ints(
int ncid,
int varid,
int *storagep,
int *chunksizesp)
299 if ((retval = nc4_find_grp_h5_var(ncid, varid, NULL, NULL, &var)))
305 if (!(cs = malloc(var->ndims *
sizeof(
size_t))))
309 retval = NC4_inq_var_all(ncid, varid, NULL, NULL, NULL, NULL, NULL,
310 NULL, NULL, NULL, NULL, storagep, cs, NULL,
311 NULL, NULL, NULL, NULL, NULL);
314 if (!retval && chunksizesp && var->storage ==
NC_CHUNKED)
316 for (i = 0; i < var->ndims; i++)
318 chunksizesp[i] = (int)cs[i];
342 NC4_inq_varid(
int ncid,
const char *name,
int *varidp)
355 LOG((2,
"%s: ncid 0x%x name %s", __func__, ncid, name));
358 if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, NULL)))
362 if ((retval = nc4_normalize_name(name, norm_name)))
366 var = (NC_VAR_INFO_T*)ncindexlookup(grp->vars,norm_name);
369 *varidp = var->hdr.id;
394 NC4_var_par_access(
int ncid,
int varid,
int par_access)
396 #ifndef USE_PARALLEL4
399 NC_UNUSED(par_access);
408 LOG((1,
"%s: ncid 0x%x varid %d par_access %d", __func__, ncid,
415 if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5)))
423 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,varid);
425 assert(var->hdr.id == varid);
430 if ((nclistlength((NClist*)var->filters) > 0 || var->shuffle || var->fletcher32) &&
465 nc4_convert_type(
const void *src,
void *dest,
const nc_type src_type,
466 const nc_type dest_type,
const size_t len,
int *range_error,
467 const void *fill_value,
int strict_nc3)
474 signed char *bp, *bp1;
475 unsigned char *ubp, *ubp1;
476 unsigned short *usp, *usp1;
477 unsigned int *uip, *uip1;
478 long long *lip, *lip1;
479 unsigned long long *ulip, *ulip1;
483 LOG((3,
"%s: len %d src_type %d dest_type %d", __func__, len, src_type,
500 for (cp = (
char *)src, cp1 = dest; count < len; count++)
504 LOG((0,
"%s: Unknown destination type.", __func__));
512 for (bp = (
signed char *)src, bp1 = dest; count < len; count++)
516 for (bp = (
signed char *)src, ubp = dest; count < len; count++)
524 for (bp = (
signed char *)src, sp = dest; count < len; count++)
528 for (bp = (
signed char *)src, usp = dest; count < len; count++)
536 for (bp = (
signed char *)src, ip = dest; count < len; count++)
540 for (bp = (
signed char *)src, uip = dest; count < len; count++)
548 for (bp = (
signed char *)src, lip = dest; count < len; count++)
552 for (bp = (
signed char *)src, ulip = dest; count < len; count++)
560 for (bp = (
signed char *)src, fp = dest; count < len; count++)
564 for (bp = (
signed char *)src, dp = dest; count < len; count++)
568 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
569 __func__, src_type, dest_type));
578 for (ubp = (
unsigned char *)src, bp = dest; count < len; count++)
580 if (!strict_nc3 && *ubp > X_SCHAR_MAX)
586 for (ubp = (
unsigned char *)src, sp = dest; count < len; count++)
590 for (ubp = (
unsigned char *)src, ubp1 = dest; count < len; count++)
594 for (ubp = (
unsigned char *)src, usp = dest; count < len; count++)
598 for (ubp = (
unsigned char *)src, ip = dest; count < len; count++)
602 for (ubp = (
unsigned char *)src, uip = dest; count < len; count++)
606 for (ubp = (
unsigned char *)src, lip = dest; count < len; count++)
610 for (ubp = (
unsigned char *)src, ulip = dest; count < len; count++)
614 for (ubp = (
unsigned char *)src, fp = dest; count < len; count++)
618 for (ubp = (
unsigned char *)src, dp = dest; count < len; count++)
622 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
623 __func__, src_type, dest_type));
632 for (sp = (
short *)src, ubp = dest; count < len; count++)
634 if (*sp > X_UCHAR_MAX || *sp < 0)
640 for (sp = (
short *)src, bp = dest; count < len; count++)
642 if (*sp > X_SCHAR_MAX || *sp < X_SCHAR_MIN)
648 for (sp = (
short *)src, sp1 = dest; count < len; count++)
652 for (sp = (
short *)src, usp = dest; count < len; count++)
660 for (sp = (
short *)src, ip = dest; count < len; count++)
664 for (sp = (
short *)src, uip = dest; count < len; count++)
672 for (sp = (
short *)src, lip = dest; count < len; count++)
676 for (sp = (
short *)src, ulip = dest; count < len; count++)
684 for (sp = (
short *)src, fp = dest; count < len; count++)
688 for (sp = (
short *)src, dp = dest; count < len; count++)
692 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
693 __func__, src_type, dest_type));
702 for (usp = (
unsigned short *)src, ubp = dest; count < len; count++)
704 if (*usp > X_UCHAR_MAX)
710 for (usp = (
unsigned short *)src, bp = dest; count < len; count++)
712 if (*usp > X_SCHAR_MAX)
718 for (usp = (
unsigned short *)src, sp = dest; count < len; count++)
720 if (*usp > X_SHORT_MAX)
726 for (usp = (
unsigned short *)src, usp1 = dest; count < len; count++)
730 for (usp = (
unsigned short *)src, ip = dest; count < len; count++)
734 for (usp = (
unsigned short *)src, uip = dest; count < len; count++)
738 for (usp = (
unsigned short *)src, lip = dest; count < len; count++)
742 for (usp = (
unsigned short *)src, ulip = dest; count < len; count++)
746 for (usp = (
unsigned short *)src, fp = dest; count < len; count++)
750 for (usp = (
unsigned short *)src, dp = dest; count < len; count++)
754 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
755 __func__, src_type, dest_type));
764 for (ip = (
int *)src, ubp = dest; count < len; count++)
766 if (*ip > X_UCHAR_MAX || *ip < 0)
772 for (ip = (
int *)src, bp = dest; count < len; count++)
774 if (*ip > X_SCHAR_MAX || *ip < X_SCHAR_MIN)
780 for (ip = (
int *)src, sp = dest; count < len; count++)
782 if (*ip > X_SHORT_MAX || *ip < X_SHORT_MIN)
788 for (ip = (
int *)src, usp = dest; count < len; count++)
790 if (*ip > X_USHORT_MAX || *ip < 0)
796 for (ip = (
int *)src, ip1 = dest; count < len; count++)
798 if (*ip > X_INT_MAX || *ip < X_INT_MIN)
804 for (ip = (
int *)src, uip = dest; count < len; count++)
806 if (*ip > X_UINT_MAX || *ip < 0)
812 for (ip = (
int *)src, lip = dest; count < len; count++)
816 for (ip = (
int *)src, ulip = dest; count < len; count++)
824 for (ip = (
int *)src, fp = dest; count < len; count++)
828 for (ip = (
int *)src, dp = dest; count < len; count++)
832 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
833 __func__, src_type, dest_type));
842 for (uip = (
unsigned int *)src, ubp = dest; count < len; count++)
844 if (*uip > X_UCHAR_MAX)
850 for (uip = (
unsigned int *)src, bp = dest; count < len; count++)
852 if (*uip > X_SCHAR_MAX)
858 for (uip = (
unsigned int *)src, sp = dest; count < len; count++)
860 if (*uip > X_SHORT_MAX)
866 for (uip = (
unsigned int *)src, usp = dest; count < len; count++)
868 if (*uip > X_USHORT_MAX)
874 for (uip = (
unsigned int *)src, ip = dest; count < len; count++)
876 if (*uip > X_INT_MAX)
882 for (uip = (
unsigned int *)src, uip1 = dest; count < len; count++)
884 if (*uip > X_UINT_MAX)
890 for (uip = (
unsigned int *)src, lip = dest; count < len; count++)
894 for (uip = (
unsigned int *)src, ulip = dest; count < len; count++)
898 for (uip = (
unsigned int *)src, fp = dest; count < len; count++)
902 for (uip = (
unsigned int *)src, dp = dest; count < len; count++)
906 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
907 __func__, src_type, dest_type));
916 for (lip = (
long long *)src, ubp = dest; count < len; count++)
918 if (*lip > X_UCHAR_MAX || *lip < 0)
924 for (lip = (
long long *)src, bp = dest; count < len; count++)
926 if (*lip > X_SCHAR_MAX || *lip < X_SCHAR_MIN)
932 for (lip = (
long long *)src, sp = dest; count < len; count++)
934 if (*lip > X_SHORT_MAX || *lip < X_SHORT_MIN)
940 for (lip = (
long long *)src, usp = dest; count < len; count++)
942 if (*lip > X_USHORT_MAX || *lip < 0)
948 for (lip = (
long long *)src, uip = dest; count < len; count++)
950 if (*lip > X_UINT_MAX || *lip < 0)
956 for (lip = (
long long *)src, ip = dest; count < len; count++)
958 if (*lip > X_INT_MAX || *lip < X_INT_MIN)
964 for (lip = (
long long *)src, lip1 = dest; count < len; count++)
968 for (lip = (
long long *)src, ulip = dest; count < len; count++)
976 for (lip = (
long long *)src, fp = dest; count < len; count++)
980 for (lip = (
long long *)src, dp = dest; count < len; count++)
984 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
985 __func__, src_type, dest_type));
994 for (ulip = (
unsigned long long *)src, ubp = dest; count < len; count++)
996 if (*ulip > X_UCHAR_MAX)
1002 for (ulip = (
unsigned long long *)src, bp = dest; count < len; count++)
1004 if (*ulip > X_SCHAR_MAX)
1010 for (ulip = (
unsigned long long *)src, sp = dest; count < len; count++)
1012 if (*ulip > X_SHORT_MAX)
1018 for (ulip = (
unsigned long long *)src, usp = dest; count < len; count++)
1020 if (*ulip > X_USHORT_MAX)
1026 for (ulip = (
unsigned long long *)src, uip = dest; count < len; count++)
1028 if (*ulip > X_UINT_MAX)
1034 for (ulip = (
unsigned long long *)src, ip = dest; count < len; count++)
1036 if (*ulip > X_INT_MAX)
1042 for (ulip = (
unsigned long long *)src, lip = dest; count < len; count++)
1044 if (*ulip > X_INT64_MAX)
1050 for (ulip = (
unsigned long long *)src, ulip1 = dest; count < len; count++)
1054 for (ulip = (
unsigned long long *)src, fp = dest; count < len; count++)
1058 for (ulip = (
unsigned long long *)src, dp = dest; count < len; count++)
1062 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
1063 __func__, src_type, dest_type));
1072 for (fp = (
float *)src, ubp = dest; count < len; count++)
1074 if (*fp > X_UCHAR_MAX || *fp < 0)
1080 for (fp = (
float *)src, bp = dest; count < len; count++)
1082 if (*fp > (
double)X_SCHAR_MAX || *fp < (
double)X_SCHAR_MIN)
1088 for (fp = (
float *)src, sp = dest; count < len; count++)
1090 if (*fp > (
double)X_SHORT_MAX || *fp < (
double)X_SHORT_MIN)
1096 for (fp = (
float *)src, usp = dest; count < len; count++)
1098 if (*fp > X_USHORT_MAX || *fp < 0)
1104 for (fp = (
float *)src, uip = dest; count < len; count++)
1106 if (*fp > X_UINT_MAX || *fp < 0)
1112 for (fp = (
float *)src, ip = dest; count < len; count++)
1114 if (*fp > (
double)X_INT_MAX || *fp < (
double)X_INT_MIN)
1120 for (fp = (
float *)src, lip = dest; count < len; count++)
1122 if (*fp > X_INT64_MAX || *fp <X_INT64_MIN)
1128 for (fp = (
float *)src, lip = dest; count < len; count++)
1130 if (*fp > X_UINT64_MAX || *fp < 0)
1136 for (fp = (
float *)src, fp1 = dest; count < len; count++)
1144 for (fp = (
float *)src, dp = dest; count < len; count++)
1148 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
1149 __func__, src_type, dest_type));
1158 for (dp = (
double *)src, ubp = dest; count < len; count++)
1160 if (*dp > X_UCHAR_MAX || *dp < 0)
1166 for (dp = (
double *)src, bp = dest; count < len; count++)
1168 if (*dp > X_SCHAR_MAX || *dp < X_SCHAR_MIN)
1174 for (dp = (
double *)src, sp = dest; count < len; count++)
1176 if (*dp > X_SHORT_MAX || *dp < X_SHORT_MIN)
1182 for (dp = (
double *)src, usp = dest; count < len; count++)
1184 if (*dp > X_USHORT_MAX || *dp < 0)
1190 for (dp = (
double *)src, uip = dest; count < len; count++)
1192 if (*dp > X_UINT_MAX || *dp < 0)
1198 for (dp = (
double *)src, ip = dest; count < len; count++)
1200 if (*dp > X_INT_MAX || *dp < X_INT_MIN)
1206 for (dp = (
double *)src, lip = dest; count < len; count++)
1208 if (*dp > X_INT64_MAX || *dp < X_INT64_MIN)
1214 for (dp = (
double *)src, lip = dest; count < len; count++)
1216 if (*dp > X_UINT64_MAX || *dp < 0)
1222 for (dp = (
double *)src, fp = dest; count < len; count++)
1224 if (isgreater(*dp, X_FLOAT_MAX) || isless(*dp, X_FLOAT_MIN))
1230 for (dp = (
double *)src, dp1 = dest; count < len; count++)
1238 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
1239 __func__, src_type, dest_type));
1245 LOG((0,
"%s: unexpected src type. src_type %d, dest_type %d",
1246 __func__, src_type, dest_type));
1264 nc4_get_fill_value(NC_FILE_INFO_T *h5, NC_VAR_INFO_T *var,
void **fillp)
1270 if (var->type_info->nc_type_class ==
NC_VLEN)
1272 else if (var->type_info->nc_type_class ==
NC_STRING)
1273 size =
sizeof(
char *);
1276 if ((retval = nc4_get_typelen_mem(h5, var->type_info->hdr.id, &size)))
1282 if (!((*fillp) = calloc(1, size)))
1287 if (var->fill_value)
1289 LOG((4,
"Found a fill value for var %s", var->hdr.name));
1290 if (var->type_info->nc_type_class ==
NC_VLEN)
1293 size_t basetypesize = 0;
1295 if((retval=nc4_get_typelen_mem(h5, var->type_info->u.v.base_nc_typeid, &basetypesize)))
1298 fv_vlen->
len = in_vlen->
len;
1299 if (!(fv_vlen->p = malloc(basetypesize * in_vlen->
len)))
1305 memcpy(fv_vlen->p, in_vlen->
p, in_vlen->
len * basetypesize);
1307 else if (var->type_info->nc_type_class ==
NC_STRING)
1309 if (*(
char **)var->fill_value)
1310 if (!(**(
char ***)fillp = strdup(*(
char **)var->fill_value)))
1318 memcpy((*fillp), var->fill_value, size);
1322 if (nc4_get_default_fill_value(var->type_info->hdr.id, *fillp))
1345 nc4_get_default_fill_value(
nc_type typecode,
void *fill_value)
1417 nc4_get_typelen_mem(NC_FILE_INFO_T *h5,
nc_type xtype,
size_t *len)
1419 NC_TYPE_INFO_T *type;
1422 LOG((4,
"%s xtype: %d", __func__, xtype));
1431 *len =
sizeof(char);
1435 *len =
sizeof(short);
1442 *len =
sizeof(float);
1445 *len =
sizeof(double);
1449 *len =
sizeof(
long long);
1452 *len =
sizeof(
char *);
1457 if ((retval = nc4_find_type(h5, xtype, &type)))
1465 LOG((5,
"type->size: %d", type->size));
1485 nc4_check_chunksizes(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var,
const size_t *chunksizes)
1492 if ((retval = nc4_get_typelen_mem(grp->nc4_info, var->type_info->hdr.id, &type_len)))
1494 if (var->type_info->nc_type_class ==
NC_VLEN)
1497 dprod = (double)type_len;
1498 for (d = 0; d < var->ndims; d++)
1499 dprod *= (
double)chunksizes[d];
1519 nc4_find_default_chunksizes2(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var)
1523 float num_values = 1, num_unlim = 0;
1525 size_t suggested_size;
1527 double total_chunk_size;
1530 if (var->type_info->nc_type_class ==
NC_STRING)
1531 type_size =
sizeof(
char *);
1533 type_size = var->type_info->size;
1538 total_chunk_size = (double) type_size;
1541 if(var->chunksizes == NULL) {
1542 if((var->chunksizes = calloc(1,
sizeof(
size_t)*var->ndims)) == NULL)
1548 for (d = 0; d < var->ndims; d++)
1550 assert(var->dim[d]);
1551 if (! var->dim[d]->unlimited)
1552 num_values *= (float)var->dim[d]->len;
1555 var->chunksizes[d] = 1;
1561 if (var->ndims == 1 && num_unlim == 1) {
1562 if (DEFAULT_CHUNK_SIZE / type_size <= 0)
1564 else if (DEFAULT_CHUNK_SIZE / type_size > DEFAULT_1D_UNLIM_SIZE)
1565 suggested_size = DEFAULT_1D_UNLIM_SIZE;
1567 suggested_size = DEFAULT_CHUNK_SIZE / type_size;
1568 var->chunksizes[0] = suggested_size / type_size;
1569 LOG((4,
"%s: name %s dim %d DEFAULT_CHUNK_SIZE %d num_values %f type_size %d "
1570 "chunksize %ld", __func__, var->hdr.name, d, DEFAULT_CHUNK_SIZE, num_values, type_size, var->chunksizes[0]));
1572 if (var->ndims > 1 && var->ndims == num_unlim) {
1573 suggested_size = pow((
double)DEFAULT_CHUNK_SIZE/type_size, 1.0/(
double)(var->ndims));
1574 for (d = 0; d < var->ndims; d++)
1576 var->chunksizes[d] = suggested_size ? suggested_size : 1;
1577 LOG((4,
"%s: name %s dim %d DEFAULT_CHUNK_SIZE %d num_values %f type_size %d "
1578 "chunksize %ld", __func__, var->hdr.name, d, DEFAULT_CHUNK_SIZE, num_values, type_size, var->chunksizes[d]));
1584 for (d = 0; d < var->ndims; d++)
1585 if (!var->chunksizes[d])
1587 suggested_size = (pow((
double)DEFAULT_CHUNK_SIZE/(num_values * type_size),
1588 1.0/(
double)(var->ndims - num_unlim)) * var->dim[d]->len - .5);
1589 if (suggested_size > var->dim[d]->len)
1590 suggested_size = var->dim[d]->len;
1591 var->chunksizes[d] = suggested_size ? suggested_size : 1;
1592 LOG((4,
"%s: name %s dim %d DEFAULT_CHUNK_SIZE %d num_values %f type_size %d "
1593 "chunksize %ld", __func__, var->hdr.name, d, DEFAULT_CHUNK_SIZE, num_values, type_size, var->chunksizes[d]));
1598 for (d = 0; d < var->ndims; d++)
1599 total_chunk_size *= (
double) var->chunksizes[d];
1600 LOG((4,
"total_chunk_size %f", total_chunk_size));
1604 retval = nc4_check_chunksizes(grp, var, var->chunksizes);
1612 for ( ; retval ==
NC_EBADCHUNK; retval = nc4_check_chunksizes(grp, var, var->chunksizes))
1613 for (d = 0; d < var->ndims; d++)
1614 var->chunksizes[d] = var->chunksizes[d]/2 ? var->chunksizes[d]/2 : 1;
1620 for (d = 0; d < var->ndims; d++)
1624 assert(var->chunksizes[d] > 0);
1625 num_chunks = (var->dim[d]->len + var->chunksizes[d] - 1) / var->chunksizes[d];
1626 if(num_chunks > 0) {
1627 overhang = (num_chunks * var->chunksizes[d]) - var->dim[d]->len;
1628 var->chunksizes[d] -= overhang / num_chunks;