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));
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)
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));
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;