14#include "nc4internal.h"
15#include "nc4dispatch.h"
17#include "hdf5internal.h"
22#define DEFAULT_1D_UNLIM_SIZE (4096)
28# define M_LN10 2.30258509299404568402
31# define M_LN2 0.69314718055994530942
38#define BIT_XPL_NBR_SGN_FLT (23)
44#define BIT_XPL_NBR_SGN_DBL (52)
51 unsigned long long *ui64p;
72NC4_get_var_chunk_cache(
int ncid,
int varid,
size_t *sizep,
73 size_t *nelemsp,
float *preemptionp)
82 if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5)))
84 assert(nc && grp && h5);
87 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,(
size_t)varid);
90 assert(var && var->hdr.id == varid);
94 *sizep = var->chunkcache.size;
96 *nelemsp = var->chunkcache.nelems;
98 *preemptionp = var->chunkcache.preemption;
120nc_get_var_chunk_cache_ints(
int ncid,
int varid,
int *sizep,
121 int *nelemsp,
int *preemptionp)
123 size_t real_size, real_nelems;
124 float real_preemption;
127 if ((ret = NC4_get_var_chunk_cache(ncid, varid, &real_size,
128 &real_nelems, &real_preemption)))
132 *sizep = (int)(real_size / MEGABYTE);
134 *nelemsp = (int)real_nelems;
136 *preemptionp = (int)(real_preemption * 100);
179NC4_inq_var_all(
int ncid,
int varid,
char *name,
nc_type *xtypep,
180 int *ndimsp,
int *dimidsp,
int *nattsp,
181 int *shufflep,
int *deflatep,
int *deflate_levelp,
182 int *fletcher32p,
int *storagep,
size_t *chunksizesp,
183 int *no_fill,
void *fill_valuep,
int *endiannessp,
184 unsigned int *idp,
size_t *nparamsp,
unsigned int *params)
192 LOG((2,
"%s: ncid 0x%x varid %d", __func__, ncid, varid));
195 if ((retval = nc4_find_nc_grp_h5(ncid, NULL, &grp, &h5)))
202 *nattsp = ncindexcount(grp->att);
207 if (!(var = (NC_VAR_INFO_T *)ncindexith(grp->vars, (
size_t)varid)))
209 assert(var && var->hdr.id == varid);
213 strcpy(name, var->hdr.name);
215 *xtypep = var->type_info->hdr.id;
217 *ndimsp = (int)var->ndims;
219 for (d = 0; d < var->ndims; d++)
220 dimidsp[d] = var->dimids[d];
222 *nattsp = ncindexcount(var->att);
225 if (var->storage ==
NC_CHUNKED && chunksizesp)
227 for (d = 0; d < var->ndims; d++)
229 chunksizesp[d] = var->chunksizes[d];
230 LOG((4,
"chunksizesp[%d]=%d", d, chunksizesp[d]));
236 *storagep = var->storage;
242 *shufflep = (retval ==
NC_NOERR?1:0);
247 *fletcher32p = (retval ==
NC_NOERR?1:0);
258 *no_fill = (int)var->no_fill;
262 if (!var->no_fill && fill_valuep)
267 int xtype = var->type_info->hdr.id;
268 if((retval = NC_copy_data(h5->controller,xtype,var->fill_value,1,fill_valuep)))
return retval;
272 if ((retval = nc4_get_default_fill_value(var->type_info, fill_valuep)))
279 *endiannessp = var->endianness;
301nc_inq_var_chunking_ints(
int ncid,
int varid,
int *storagep,
int *chunksizesp)
308 if ((retval = nc4_find_grp_h5_var(ncid, varid, NULL, NULL, &var)))
314 if (!(cs = malloc(var->ndims *
sizeof(
size_t))))
318 retval = NC4_inq_var_all(ncid, varid, NULL, NULL, NULL, NULL, NULL,
319 NULL, NULL, NULL, NULL, storagep, cs, NULL,
320 NULL, NULL, NULL, NULL, NULL);
323 if (!retval && chunksizesp && var->storage ==
NC_CHUNKED)
325 for (i = 0; i < var->ndims; i++)
327 chunksizesp[i] = (int)cs[i];
351NC4_inq_varid(
int ncid,
const char *name,
int *varidp)
364 LOG((2,
"%s: ncid 0x%x name %s", __func__, ncid, name));
367 if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, NULL)))
371 if ((retval = nc4_normalize_name(name, norm_name)))
375 var = (NC_VAR_INFO_T*)ncindexlookup(grp->vars,norm_name);
378 *varidp = var->hdr.id;
403NC4_var_par_access(
int ncid,
int varid,
int par_access)
408 NC_UNUSED(par_access);
417 LOG((1,
"%s: ncid 0x%x varid %d par_access %d", __func__, ncid,
424 if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5)))
432 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,varid);
434 assert(var->hdr.id == varid);
439 if (nclistlength((NClist*)var->filters) > 0 &&
484nc4_convert_type(
const void *src,
void *dest,
const nc_type src_type,
485 const nc_type dest_type,
const size_t len,
int *range_error,
486 const void *fill_value,
int strict_nc3,
int quantize_mode,
494 double mnt_log10_fabs;
495 double mss_val_cmp_dbl;
497 float mss_val_cmp_flt;
504 unsigned int *u32_ptr;
505 unsigned int msk_f32_u32_zro;
506 unsigned int msk_f32_u32_one;
507 unsigned int msk_f32_u32_hshv;
508 unsigned long long int *u64_ptr;
509 unsigned long long int msk_f64_u64_zro;
510 unsigned long long int msk_f64_u64_one;
511 unsigned long long int msk_f64_u64_hshv;
512 unsigned short prc_bnr_xpl_rqr;
520 signed char *bp, *bp1;
521 unsigned char *ubp, *ubp1;
522 unsigned short *usp, *usp1;
523 unsigned int *uip, *uip1;
524 long long *lip, *lip1;
525 unsigned long long *ulip, *ulip1;
529 LOG((3,
"%s: len %d src_type %d dest_type %d", __func__, len, src_type,
543 mss_val_cmp_flt = *(
float *)fill_value;
553 mss_val_cmp_dbl = *(
double *)fill_value;
574 prc_bnr_xpl_rqr = (
unsigned short)ceil(nsd * bit_per_dgt) + 1;
579 prc_bnr_xpl_rqr = (
unsigned short)nsd;
589 msk_f32_u32_zro = 0U;
590 msk_f32_u32_zro = ~msk_f32_u32_zro;
594 msk_f32_u32_zro <<= bit_xpl_nbr_zro;
598 msk_f32_u32_one = ~msk_f32_u32_zro;
601 msk_f32_u32_hshv=msk_f32_u32_one & (msk_f32_u32_zro >> 1);
609 msk_f64_u64_zro = 0UL;
610 msk_f64_u64_zro = ~msk_f64_u64_zro;
614 msk_f64_u64_zro <<= bit_xpl_nbr_zro;
618 msk_f64_u64_one =~ msk_f64_u64_zro;
621 msk_f64_u64_hshv = msk_f64_u64_one & (msk_f64_u64_zro >> 1);
643 for (cp = (
char *)src, cp1 = dest; count < len; count++)
647 LOG((0,
"%s: Unknown destination type.", __func__));
655 for (bp = (
signed char *)src, bp1 = dest; count < len; count++)
659 for (bp = (
signed char *)src, ubp = dest; count < len; count++)
663 *ubp++ = (
unsigned char)*bp++;
667 for (bp = (
signed char *)src, sp = dest; count < len; count++)
671 for (bp = (
signed char *)src, usp = dest; count < len; count++)
675 *usp++ = (
unsigned short)*bp++;
679 for (bp = (
signed char *)src, ip = dest; count < len; count++)
683 for (bp = (
signed char *)src, uip = dest; count < len; count++)
687 *uip++ = (
unsigned int)*bp++;
691 for (bp = (
signed char *)src, lip = dest; count < len; count++)
695 for (bp = (
signed char *)src, ulip = dest; count < len; count++)
699 *ulip++ = (
unsigned long long)*bp++;
703 for (bp = (
signed char *)src, fp = dest; count < len; count++)
707 for (bp = (
signed char *)src, dp = dest; count < len; count++)
711 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
712 __func__, src_type, dest_type));
721 for (ubp = (
unsigned char *)src, bp = dest; count < len; count++)
723 if (!strict_nc3 && *ubp > X_SCHAR_MAX)
725 *bp++ = (
signed char)*ubp++;
729 for (ubp = (
unsigned char *)src, sp = dest; count < len; count++)
733 for (ubp = (
unsigned char *)src, ubp1 = dest; count < len; count++)
737 for (ubp = (
unsigned char *)src, usp = dest; count < len; count++)
741 for (ubp = (
unsigned char *)src, ip = dest; count < len; count++)
745 for (ubp = (
unsigned char *)src, uip = dest; count < len; count++)
749 for (ubp = (
unsigned char *)src, lip = dest; count < len; count++)
753 for (ubp = (
unsigned char *)src, ulip = dest; count < len; count++)
757 for (ubp = (
unsigned char *)src, fp = dest; count < len; count++)
761 for (ubp = (
unsigned char *)src, dp = dest; count < len; count++)
765 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
766 __func__, src_type, dest_type));
775 for (sp = (
short *)src, ubp = dest; count < len; count++)
777 if (*sp > X_UCHAR_MAX || *sp < 0)
779 *ubp++ = (
unsigned char)*sp++;
783 for (sp = (
short *)src, bp = dest; count < len; count++)
785 if (*sp > X_SCHAR_MAX || *sp < X_SCHAR_MIN)
787 *bp++ = (
signed char)*sp++;
791 for (sp = (
short *)src, sp1 = dest; count < len; count++)
795 for (sp = (
short *)src, usp = dest; count < len; count++)
799 *usp++ = (
unsigned short)*sp++;
803 for (sp = (
short *)src, ip = dest; count < len; count++)
807 for (sp = (
short *)src, uip = dest; count < len; count++)
811 *uip++ = (
unsigned int)*sp++;
815 for (sp = (
short *)src, lip = dest; count < len; count++)
819 for (sp = (
short *)src, ulip = dest; count < len; count++)
823 *ulip++ = (
unsigned long long)*sp++;
827 for (sp = (
short *)src, fp = dest; count < len; count++)
831 for (sp = (
short *)src, dp = dest; count < len; count++)
835 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
836 __func__, src_type, dest_type));
845 for (usp = (
unsigned short *)src, ubp = dest; count < len; count++)
847 if (*usp > X_UCHAR_MAX)
849 *ubp++ = (
unsigned char)*usp++;
853 for (usp = (
unsigned short *)src, bp = dest; count < len; count++)
855 if (*usp > X_SCHAR_MAX)
857 *bp++ = (
signed char)*usp++;
861 for (usp = (
unsigned short *)src, sp = dest; count < len; count++)
863 if (*usp > X_SHORT_MAX)
865 *sp++ = (
signed short)*usp++;
869 for (usp = (
unsigned short *)src, usp1 = dest; count < len; count++)
873 for (usp = (
unsigned short *)src, ip = dest; count < len; count++)
877 for (usp = (
unsigned short *)src, uip = dest; count < len; count++)
881 for (usp = (
unsigned short *)src, lip = dest; count < len; count++)
885 for (usp = (
unsigned short *)src, ulip = dest; count < len; count++)
889 for (usp = (
unsigned short *)src, fp = dest; count < len; count++)
893 for (usp = (
unsigned short *)src, dp = dest; count < len; count++)
897 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
898 __func__, src_type, dest_type));
907 for (ip = (
int *)src, ubp = dest; count < len; count++)
909 if (*ip > X_UCHAR_MAX || *ip < 0)
911 *ubp++ = (
unsigned char)*ip++;
915 for (ip = (
int *)src, bp = dest; count < len; count++)
917 if (*ip > X_SCHAR_MAX || *ip < X_SCHAR_MIN)
919 *bp++ = (
signed char)*ip++;
923 for (ip = (
int *)src, sp = dest; count < len; count++)
925 if (*ip > X_SHORT_MAX || *ip < X_SHORT_MIN)
927 *sp++ = (short)*ip++;
931 for (ip = (
int *)src, usp = dest; count < len; count++)
933 if (*ip > X_USHORT_MAX || *ip < 0)
935 *usp++ = (
unsigned short)*ip++;
939 for (ip = (
int *)src, ip1 = dest; count < len; count++)
941 if (*ip > X_INT_MAX || *ip < X_INT_MIN)
947 for (ip = (
int *)src, uip = dest; count < len; count++)
949 if (*ip > X_UINT_MAX || *ip < 0)
951 *uip++ = (
unsigned int)*ip++;
955 for (ip = (
int *)src, lip = dest; count < len; count++)
959 for (ip = (
int *)src, ulip = dest; count < len; count++)
963 *ulip++ = (
unsigned long long)*ip++;
967 for (ip = (
int *)src, fp = dest; count < len; count++)
968 *fp++ = (
float)*ip++;
971 for (ip = (
int *)src, dp = dest; count < len; count++)
972 *dp++ = (
double)*ip++;
975 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
976 __func__, src_type, dest_type));
985 for (uip = (
unsigned int *)src, ubp = dest; count < len; count++)
987 if (*uip > X_UCHAR_MAX)
989 *ubp++ = (
unsigned char)*uip++;
993 for (uip = (
unsigned int *)src, bp = dest; count < len; count++)
995 if (*uip > X_SCHAR_MAX)
997 *bp++ = (
signed char)*uip++;
1001 for (uip = (
unsigned int *)src, sp = dest; count < len; count++)
1003 if (*uip > X_SHORT_MAX)
1005 *sp++ = (
signed short)*uip++;
1009 for (uip = (
unsigned int *)src, usp = dest; count < len; count++)
1011 if (*uip > X_USHORT_MAX)
1013 *usp++ = (
unsigned short)*uip++;
1017 for (uip = (
unsigned int *)src, ip = dest; count < len; count++)
1019 if (*uip > X_INT_MAX)
1021 *ip++ = (int)*uip++;
1025 for (uip = (
unsigned int *)src, uip1 = dest; count < len; count++)
1027 if (*uip > X_UINT_MAX)
1033 for (uip = (
unsigned int *)src, lip = dest; count < len; count++)
1037 for (uip = (
unsigned int *)src, ulip = dest; count < len; count++)
1041 for (uip = (
unsigned int *)src, fp = dest; count < len; count++)
1042 *fp++ = (
float)*uip++;
1045 for (uip = (
unsigned int *)src, dp = dest; count < len; count++)
1049 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
1050 __func__, src_type, dest_type));
1059 for (lip = (
long long *)src, ubp = dest; count < len; count++)
1061 if (*lip > X_UCHAR_MAX || *lip < 0)
1063 *ubp++ = (
unsigned char)*lip++;
1067 for (lip = (
long long *)src, bp = dest; count < len; count++)
1069 if (*lip > X_SCHAR_MAX || *lip < X_SCHAR_MIN)
1071 *bp++ = (
signed char)*lip++;
1075 for (lip = (
long long *)src, sp = dest; count < len; count++)
1077 if (*lip > X_SHORT_MAX || *lip < X_SHORT_MIN)
1079 *sp++ = (short)*lip++;
1083 for (lip = (
long long *)src, usp = dest; count < len; count++)
1085 if (*lip > X_USHORT_MAX || *lip < 0)
1087 *usp++ = (
unsigned short)*lip++;
1091 for (lip = (
long long *)src, uip = dest; count < len; count++)
1093 if (*lip > X_UINT_MAX || *lip < 0)
1095 *uip++ = (
unsigned int)*lip++;
1099 for (lip = (
long long *)src, ip = dest; count < len; count++)
1101 if (*lip > X_INT_MAX || *lip < X_INT_MIN)
1103 *ip++ = (int)*lip++;
1107 for (lip = (
long long *)src, lip1 = dest; count < len; count++)
1111 for (lip = (
long long *)src, ulip = dest; count < len; count++)
1115 *ulip++ = (
unsigned long long)*lip++;
1119 for (lip = (
long long *)src, fp = dest; count < len; count++)
1120 *fp++ = (
float)*lip++;
1123 for (lip = (
long long *)src, dp = dest; count < len; count++)
1124 *dp++ = (
double)*lip++;
1127 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
1128 __func__, src_type, dest_type));
1137 for (ulip = (
unsigned long long *)src, ubp = dest; count < len; count++)
1139 if (*ulip > X_UCHAR_MAX)
1141 *ubp++ = (
unsigned char)*ulip++;
1145 for (ulip = (
unsigned long long *)src, bp = dest; count < len; count++)
1147 if (*ulip > X_SCHAR_MAX)
1149 *bp++ = (
signed char)*ulip++;
1153 for (ulip = (
unsigned long long *)src, sp = dest; count < len; count++)
1155 if (*ulip > X_SHORT_MAX)
1157 *sp++ = (short)*ulip++;
1161 for (ulip = (
unsigned long long *)src, usp = dest; count < len; count++)
1163 if (*ulip > X_USHORT_MAX)
1165 *usp++ = (
unsigned short)*ulip++;
1169 for (ulip = (
unsigned long long *)src, uip = dest; count < len; count++)
1171 if (*ulip > X_UINT_MAX)
1173 *uip++ = (
unsigned int)*ulip++;
1177 for (ulip = (
unsigned long long *)src, ip = dest; count < len; count++)
1179 if (*ulip > X_INT_MAX)
1181 *ip++ = (int)*ulip++;
1185 for (ulip = (
unsigned long long *)src, lip = dest; count < len; count++)
1187 if (*ulip > X_INT64_MAX)
1189 *lip++ = (
long long)*ulip++;
1193 for (ulip = (
unsigned long long *)src, ulip1 = dest; count < len; count++)
1197 for (ulip = (
unsigned long long *)src, fp = dest; count < len; count++)
1198 *fp++ = (
float)*ulip++;
1201 for (ulip = (
unsigned long long *)src, dp = dest; count < len; count++)
1202 *dp++ = (
double)*ulip++;
1205 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
1206 __func__, src_type, dest_type));
1215 for (fp = (
float *)src, ubp = dest; count < len; count++)
1217 if (*fp > X_UCHAR_MAX || *fp < 0)
1219 *ubp++ = (
unsigned char)*fp++;
1223 for (fp = (
float *)src, bp = dest; count < len; count++)
1225 if (*fp > (
double)X_SCHAR_MAX || *fp < (double)X_SCHAR_MIN)
1227 *bp++ = (
signed char)*fp++;
1231 for (fp = (
float *)src, sp = dest; count < len; count++)
1233 if (*fp > (
double)X_SHORT_MAX || *fp < (double)X_SHORT_MIN)
1235 *sp++ = (short)*fp++;
1239 for (fp = (
float *)src, usp = dest; count < len; count++)
1241 if (*fp > X_USHORT_MAX || *fp < 0)
1243 *usp++ = (
unsigned short)*fp++;
1247 for (fp = (
float *)src, uip = dest; count < len; count++)
1249 if (*fp > (
float)X_UINT_MAX || *fp < 0)
1251 *uip++ = (
unsigned int)*fp++;
1255 for (fp = (
float *)src, ip = dest; count < len; count++)
1257 if (*fp > (
double)X_INT_MAX || *fp < (double)X_INT_MIN)
1263 for (fp = (
float *)src, lip = dest; count < len; count++)
1265 if (*fp > (
float)X_INT64_MAX || *fp <X_INT64_MIN)
1267 *lip++ = (
long long)*fp++;
1271 for (fp = (
float *)src, ulip = dest; count < len; count++)
1273 if (*fp > (
float)X_UINT64_MAX || *fp < 0)
1275 *ulip++ = (
unsigned long long)*fp++;
1279 for (fp = (
float *)src, fp1 = dest; count < len; count++)
1283 for (fp = (
float *)src, dp = dest; count < len; count++)
1287 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
1288 __func__, src_type, dest_type));
1297 for (dp = (
double *)src, ubp = dest; count < len; count++)
1299 if (*dp > X_UCHAR_MAX || *dp < 0)
1301 *ubp++ = (
unsigned char)*dp++;
1305 for (dp = (
double *)src, bp = dest; count < len; count++)
1307 if (*dp > X_SCHAR_MAX || *dp < X_SCHAR_MIN)
1309 *bp++ = (
signed char)*dp++;
1313 for (dp = (
double *)src, sp = dest; count < len; count++)
1315 if (*dp > X_SHORT_MAX || *dp < X_SHORT_MIN)
1317 *sp++ = (short)*dp++;
1321 for (dp = (
double *)src, usp = dest; count < len; count++)
1323 if (*dp > X_USHORT_MAX || *dp < 0)
1325 *usp++ = (
unsigned short)*dp++;
1329 for (dp = (
double *)src, uip = dest; count < len; count++)
1331 if (*dp > X_UINT_MAX || *dp < 0)
1333 *uip++ = (
unsigned int)*dp++;
1337 for (dp = (
double *)src, ip = dest; count < len; count++)
1339 if (*dp > X_INT_MAX || *dp < X_INT_MIN)
1345 for (dp = (
double *)src, lip = dest; count < len; count++)
1347 if (*dp > (
double)X_INT64_MAX || *dp < X_INT64_MIN)
1349 *lip++ = (
long long)*dp++;
1353 for (dp = (
double *)src, ulip = dest; count < len; count++)
1355 if (*dp > (
double)X_UINT64_MAX || *dp < 0)
1357 *ulip++ = (
unsigned long long)*dp++;
1361 for (dp = (
double *)src, fp = dest; count < len; count++)
1363 if (isgreater(*dp, X_FLOAT_MAX) || isless(*dp, X_FLOAT_MIN))
1365 *fp++ = (float)*dp++;
1369 for (dp = (
double *)src, dp1 = dest; count < len; count++)
1373 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
1374 __func__, src_type, dest_type));
1380 LOG((0,
"%s: unexpected src type. src_type %d, dest_type %d",
1381 __func__, src_type, dest_type));
1392 op1.fp = (
float *)dest;
1393 u32_ptr = op1.ui32p;
1395 for (idx = 0L; idx < len; idx += 2L)
1396 if ((val_flt=op1.fp[idx]) != mss_val_cmp_flt && val_flt != 0.0f && !isnan(val_flt))
1397 u32_ptr[idx] &= msk_f32_u32_zro;
1398 for (idx = 1L; idx < len; idx += 2L)
1399 if ((val_flt=op1.fp[idx]) != mss_val_cmp_flt && val_flt != 0.0f && !isnan(val_flt))
1400 u32_ptr[idx] |= msk_f32_u32_one;
1405 op1.dp = (
double *)dest;
1406 u64_ptr = op1.ui64p;
1408 for (idx = 0L; idx < len; idx += 2L)
1409 if ((val_dbl=op1.dp[idx]) != mss_val_cmp_dbl && val_dbl != 0.0 && !isnan(val_dbl))
1410 u64_ptr[idx] &= msk_f64_u64_zro;
1411 for (idx = 1L; idx < len; idx += 2L)
1412 if ((val_dbl=op1.dp[idx]) != mss_val_cmp_dbl && val_dbl != 0.0 && !isnan(val_dbl))
1413 u64_ptr[idx] |= msk_f64_u64_one;
1422 op1.fp = (
float *)dest;
1423 u32_ptr = op1.ui32p;
1424 for (idx = 0L; idx < len; idx++){
1426 if ((val_flt=op1.fp[idx]) != mss_val_cmp_flt && val_flt != 0.0f && !isnan(val_flt)){
1427 u32_ptr[idx] += msk_f32_u32_hshv;
1428 u32_ptr[idx] &= msk_f32_u32_zro;
1435 op1.dp = (
double *)dest;
1436 u64_ptr = op1.ui64p;
1437 for (idx = 0L; idx < len; idx++){
1439 if ((val_dbl=op1.dp[idx]) != mss_val_cmp_dbl && val_dbl != 0.0 && !isnan(val_dbl)){
1440 u64_ptr[idx] += msk_f64_u64_hshv;
1441 u64_ptr[idx] &= msk_f64_u64_zro;
1452 op1.fp = (
float *)dest;
1453 u32_ptr = op1.ui32p;
1454 for (idx = 0L; idx < len; idx++)
1457 if((val_dbl=op1.fp[idx]) != mss_val_cmp_flt && val_dbl != 0.0 && !isnan(val_dbl))
1459 mnt = frexp(val_dbl, &xpn_bs2);
1460 mnt_fabs = fabs(mnt);
1461 mnt_log10_fabs = log10(mnt_fabs);
1463 dgt_nbr = (int)floor(xpn_bs2 * dgt_per_bit + mnt_log10_fabs) + 1;
1464 qnt_pwr = (int)floor(bit_per_dgt * (dgt_nbr - nsd));
1465 prc_bnr_xpl_rqr = mnt_fabs == 0.0 ? 0 : (
unsigned short)abs((
int)floor(xpn_bs2 - bit_per_dgt*mnt_log10_fabs) - qnt_pwr);
1469 msk_f32_u32_zro = 0U;
1470 msk_f32_u32_zro = ~msk_f32_u32_zro;
1472 msk_f32_u32_zro <<= bit_xpl_nbr_zro;
1474 msk_f32_u32_one = ~msk_f32_u32_zro;
1475 msk_f32_u32_hshv = msk_f32_u32_one & (msk_f32_u32_zro >> 1);
1476 u32_ptr[idx] += msk_f32_u32_hshv;
1477 u32_ptr[idx] &= msk_f32_u32_zro;
1486 op1.dp = (
double *)dest;
1487 u64_ptr = op1.ui64p;
1488 for (idx = 0L; idx < len; idx++)
1491 if((val_dbl=op1.dp[idx]) != mss_val_cmp_dbl && val_dbl != 0.0 && !isnan(val_dbl))
1493 mnt = frexp(val_dbl, &xpn_bs2);
1494 mnt_fabs = fabs(mnt);
1495 mnt_log10_fabs = log10(mnt_fabs);
1497 dgt_nbr = (int)floor(xpn_bs2 * dgt_per_bit + mnt_log10_fabs) + 1;
1498 qnt_pwr = (int)floor(bit_per_dgt * (dgt_nbr - nsd));
1499 prc_bnr_xpl_rqr = mnt_fabs == 0.0 ? 0 : (
unsigned short)abs((
int)floor(xpn_bs2 - bit_per_dgt*mnt_log10_fabs) - qnt_pwr);
1503 msk_f64_u64_zro = 0ULL;
1504 msk_f64_u64_zro = ~msk_f64_u64_zro;
1506 msk_f64_u64_zro <<= bit_xpl_nbr_zro;
1508 msk_f64_u64_one = ~msk_f64_u64_zro;
1509 msk_f64_u64_hshv = msk_f64_u64_one & (msk_f64_u64_zro >> 1);
1510 u64_ptr[idx] += msk_f64_u64_hshv;
1511 u64_ptr[idx] &= msk_f64_u64_zro;
1534nc4_get_fill_value(NC_FILE_INFO_T *h5, NC_VAR_INFO_T *var,
void **fillp)
1540 if (var->type_info->nc_type_class ==
NC_VLEN)
1542 else if (var->type_info->nc_type_class ==
NC_STRING)
1543 size =
sizeof(
char *);
1546 if ((retval = nc4_get_typelen_mem(h5, var->type_info->hdr.id, &size)))
1552 if (!((*fillp) = calloc(1, size)))
1557 if (var->fill_value)
1559 LOG((4,
"Found a fill value for var %s", var->hdr.name));
1560 if (var->type_info->nc_type_class ==
NC_VLEN)
1563 size_t basetypesize = 0;
1565 if((retval=nc4_get_typelen_mem(h5, var->type_info->u.v.base_nc_typeid, &basetypesize)))
1568 fv_vlen->
len = in_vlen->
len;
1569 if (!(fv_vlen->p = malloc(basetypesize * in_vlen->
len)))
1575 memcpy(fv_vlen->p, in_vlen->
p, in_vlen->
len * basetypesize);
1577 else if (var->type_info->nc_type_class ==
NC_STRING)
1579 if (*(
char **)var->fill_value)
1580 if (!(**(
char ***)fillp = strdup(*(
char **)var->fill_value)))
1588 memcpy((*fillp), var->fill_value, size);
1592 if (nc4_get_default_fill_value(var->type_info, *fillp))
1616nc4_get_typelen_mem(NC_FILE_INFO_T *h5,
nc_type xtype,
size_t *len)
1618 NC_TYPE_INFO_T *type;
1621 LOG((4,
"%s xtype: %d", __func__, xtype));
1630 *len =
sizeof(char);
1634 *len =
sizeof(short);
1641 *len =
sizeof(float);
1644 *len =
sizeof(double);
1648 *len =
sizeof(
long long);
1651 *len =
sizeof(
char *);
1656 if ((retval = nc4_find_type(h5, xtype, &type)))
1664 LOG((5,
"type->size: %d", type->size));
1684nc4_check_chunksizes(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var,
const size_t *chunksizes)
1691 if ((retval = nc4_get_typelen_mem(grp->nc4_info, var->type_info->hdr.id, &type_len)))
1693 if (var->type_info->nc_type_class ==
NC_VLEN)
1696 dprod = (double)type_len;
1697 for (d = 0; d < var->ndims; d++)
1698 dprod *= (
double)chunksizes[d];
1718nc4_find_default_chunksizes2(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var)
1722 float num_values = 1, num_unlim = 0;
1724 size_t suggested_size;
1726 double total_chunk_size;
1729 if (var->type_info->nc_type_class ==
NC_STRING)
1730 type_size =
sizeof(
char *);
1732 type_size = var->type_info->size;
1737 total_chunk_size = (double) type_size;
1740 if(var->chunksizes == NULL) {
1741 if((var->chunksizes = calloc(1,
sizeof(
size_t)*var->ndims)) == NULL)
1747 for (d = 0; d < var->ndims; d++)
1749 assert(var->dim[d]);
1750 if (! var->dim[d]->unlimited)
1751 num_values *= (float)var->dim[d]->len;
1754 var->chunksizes[d] = 1;
1760 if (var->ndims == 1 && num_unlim == 1) {
1761 if (DEFAULT_CHUNK_SIZE / type_size <= 0)
1763 else if (DEFAULT_CHUNK_SIZE / type_size > DEFAULT_1D_UNLIM_SIZE)
1764 suggested_size = DEFAULT_1D_UNLIM_SIZE;
1766 suggested_size = DEFAULT_CHUNK_SIZE / type_size;
1767 var->chunksizes[0] = suggested_size / type_size;
1768 LOG((4,
"%s: name %s dim %d DEFAULT_CHUNK_SIZE %d num_values %f type_size %d "
1769 "chunksize %ld", __func__, var->hdr.name, d, DEFAULT_CHUNK_SIZE, num_values, type_size, var->chunksizes[0]));
1771 if (var->ndims > 1 && (
float)var->ndims == num_unlim) {
1772 suggested_size = (size_t)pow((
double)DEFAULT_CHUNK_SIZE/(double)type_size, 1.0/(
double)(var->ndims));
1773 for (d = 0; d < var->ndims; d++)
1775 var->chunksizes[d] = suggested_size ? suggested_size : 1;
1776 LOG((4,
"%s: name %s dim %d DEFAULT_CHUNK_SIZE %d num_values %f type_size %d "
1777 "chunksize %ld", __func__, var->hdr.name, d, DEFAULT_CHUNK_SIZE, num_values, type_size, var->chunksizes[d]));
1783 for (d = 0; d < var->ndims; d++)
1784 if (!var->chunksizes[d])
1786 suggested_size = (size_t)(pow((
double)DEFAULT_CHUNK_SIZE/(num_values * (
double)type_size),
1787 1.0/(
double)((
double)var->ndims - num_unlim)) * (double)var->dim[d]->len - .5);
1788 if (suggested_size > var->dim[d]->len)
1789 suggested_size = var->dim[d]->len;
1790 var->chunksizes[d] = suggested_size ? suggested_size : 1;
1791 LOG((4,
"%s: name %s dim %d DEFAULT_CHUNK_SIZE %d num_values %f type_size %d "
1792 "chunksize %ld", __func__, var->hdr.name, d, DEFAULT_CHUNK_SIZE, num_values, type_size, var->chunksizes[d]));
1797 for (d = 0; d < var->ndims; d++)
1798 total_chunk_size *= (
double) var->chunksizes[d];
1799 LOG((4,
"total_chunk_size %f", total_chunk_size));
1803 retval = nc4_check_chunksizes(grp, var, var->chunksizes);
1811 for ( ; retval ==
NC_EBADCHUNK; retval = nc4_check_chunksizes(grp, var, var->chunksizes))
1812 for (d = 0; d < var->ndims; d++)
1813 var->chunksizes[d] = var->chunksizes[d]/2 ? var->chunksizes[d]/2 : 1;
1819 for (d = 0; d < var->ndims; d++)
1823 assert(var->chunksizes[d] > 0);
1824 num_chunks = (var->dim[d]->len + var->chunksizes[d] - 1) / var->chunksizes[d];
1825 if(num_chunks > 0) {
1826 overhang = (num_chunks * var->chunksizes[d]) - var->dim[d]->len;
1827 var->chunksizes[d] -= overhang / num_chunks;
1847nc4_get_default_fill_value(NC_TYPE_INFO_T* tinfo,
void *fill_value)
1849 if(tinfo->hdr.id >
NC_NAT && tinfo->hdr.id <= NC_MAX_ATOMIC_TYPE)
1850 return nc4_get_default_atomic_fill_value(tinfo->hdr.id,fill_value);
1852 switch(tinfo->nc_type_class) {
1854 return nc4_get_default_atomic_fill_value(tinfo->u.e.base_nc_typeid,fill_value);
1859 memset(fill_value,0,tinfo->size);
1879nc4_get_default_atomic_fill_value(
nc_type xtype,
void *fill_value)
EXTERNL int nc_inq_var_filter_info(int ncid, int varid, unsigned int id, size_t *nparams, unsigned int *params)
Find the the param info about filter (if any) associated with a variable and with specified id.
#define BIT_XPL_NBR_SGN_DBL
Used in quantize code.
#define BIT_XPL_NBR_SGN_FLT
Used in quantize code.
#define NC_EBADTYPE
Not a netcdf data type.
#define NC_UINT
unsigned 4-byte int
#define NC_FILL_BYTE
Default fill value.
void * p
Pointer to VL data.
#define NC_EFILTER
Filter operation failed.
#define NC_INT
signed 4 byte integer
#define NC_FILL_INT
Default fill value.
#define NC_BYTE
signed 1 byte integer
#define NC_QUANTIZE_BITROUND
Use BitRound quantization.
size_t len
Length of VL data (in base type units)
#define NC_VLEN
vlen (variable-length) types
#define NC_FILL_UBYTE
Default fill value.
#define NC_NAT
Not A Type.
#define NC_MAX_UINT
Max or min values for a type.
#define NC_DOUBLE
double precision floating point number
#define NC_UBYTE
unsigned 1 byte int
#define NC_FLOAT
single precision floating point number
#define NC_ENOMEM
Memory allocation (malloc) failure.
#define NC_MAX_INT
Max or min values for a type.
#define NC_COMPOUND
compound types
#define NC_CHUNKED
In HDF5 files you can set storage for each variable to be either contiguous or chunked,...
#define NC_SHORT
signed 2 byte integer
#define NC_QUANTIZE_GRANULARBR
Use Granular BitRound quantization.
#define NC_FILL_UINT64
Default fill value.
#define NC_QUANTIZE_BITGROOM
Use BitGroom quantization.
#define NC_ENUM
enum types
#define NC_INT64
signed 8-byte int
#define NC_GLOBAL
Attribute id to put/get a global attribute.
#define NC_FILL_UINT
Default fill value.
#define NC_FILL_CHAR
Default fill value.
#define NC_UINT64
unsigned 8-byte int
#define NC_ENOTVAR
Variable not found.
#define NC_EINVAL
Invalid Argument.
#define NC_MAX_NAME
Maximum for classic library.
#define NC_NOERR
No Error.
#define NC_FILL_USHORT
Default fill value.
#define NC_FILL_SHORT
Default fill value.
#define NC_FILL_INT64
Default fill value.
#define NC_NOQUANTIZE
No quantization in use.
#define NC_USHORT
unsigned 2-byte int
#define NC_OPAQUE
opaque types
#define NC_ENOPAR
Parallel operation on file opened for non-parallel access.
#define NC_EBADCHUNK
Bad chunksize.
#define NC_FILL_FLOAT
Default fill value.
#define NC_ENOFILTER
Filter not defined on variable.
#define NC_FILL_DOUBLE
Default fill value.
#define NC_CHAR
ISO/ASCII character.
#define NC_ERANGE
Math result not representable.
#define NC_FILL_STRING
Default fill value.
int nc_type
The nc_type type is just an int.
This is the type of arrays of vlens.
#define NC_COLLECTIVE
Use with nc_var_par_access() to set parallel access to collective.
#define NC_INDEPENDENT
Use with nc_var_par_access() to set parallel access to independent.