19 #include "nc4internal.h" 20 #include "nc4dispatch.h" 21 #include <H5DSpublic.h> 24 #ifdef HAVE_INTTYPES_H 25 #define __STDC_FORMAT_MACROS 33 #define NC3_STRICT_ATT_NAME "_nc3_strict" 35 #define NC_HDF5_MAX_NAME 1024 40 static unsigned int OTYPES[5] = {H5F_OBJ_FILE, H5F_OBJ_DATASET, H5F_OBJ_GROUP, 41 H5F_OBJ_DATATYPE, H5F_OBJ_ATTR};
51 flag_atts_dirty(NC_ATT_INFO_T **attlist) {
53 NC_ATT_INFO_T *att = NULL;
59 for(att = *attlist; att; att = att->l.next) {
84 rec_reattach_scales(NC_GRP_INFO_T *grp,
int dimid, hid_t dimscaleid)
87 NC_GRP_INFO_T *child_grp;
91 assert(grp && grp->name && dimid >= 0 && dimscaleid >= 0);
92 LOG((3,
"%s: grp->name %s", __func__, grp->name));
95 for (child_grp = grp->children; child_grp; child_grp = child_grp->l.next)
96 if ((retval = rec_reattach_scales(child_grp, dimid, dimscaleid)))
100 for (i=0; i < grp->vars.nelems; i++)
102 var = grp->vars.value[i];
104 for (d = 0; d < var->ndims; d++)
105 if (var->dimids[d] == dimid && !var->dimscale)
107 LOG((2,
"%s: attaching scale for dimid %d to var %s",
108 __func__, var->dimids[d], var->name));
111 if (H5DSattach_scale(var->hdf_datasetid, dimscaleid, d) < 0)
113 var->dimscale_attached[d] = NC_TRUE;
137 rec_detach_scales(NC_GRP_INFO_T *grp,
int dimid, hid_t dimscaleid)
140 NC_GRP_INFO_T *child_grp;
144 assert(grp && grp->name && dimid >= 0 && dimscaleid >= 0);
145 LOG((3,
"%s: grp->name %s", __func__, grp->name));
148 for (child_grp = grp->children; child_grp; child_grp = child_grp->l.next)
149 if ((retval = rec_detach_scales(child_grp, dimid, dimscaleid)))
153 for (i=0; i < grp->vars.nelems; i++)
155 var = grp->vars.value[i];
157 for (d = 0; d < var->ndims; d++)
158 if (var->dimids[d] == dimid && !var->dimscale)
160 LOG((2,
"%s: detaching scale for dimid %d to var %s",
161 __func__, var->dimids[d], var->name));
163 if (var->dimscale_attached && var->dimscale_attached[d])
165 if (H5DSdetach_scale(var->hdf_datasetid, dimscaleid, d) < 0)
167 var->dimscale_attached[d] = NC_FALSE;
186 nc4_open_var_grp2(NC_GRP_INFO_T *grp,
int varid, hid_t *dataset)
191 if (varid < 0 || varid >= grp->vars.nelems)
193 var = grp->vars.value[varid];
195 assert(var->varid == varid);
198 if (!var->hdf_datasetid)
199 if ((var->hdf_datasetid = H5Dopen2(grp->hdf_grpid, var->name,
203 *dataset = var->hdf_datasetid;
220 nc4_get_default_fill_value(
const NC_TYPE_INFO_T *type_info,
void *fill_value)
222 switch (type_info->nc_typeid)
291 get_fill_value(NC_HDF5_FILE_INFO_T *h5, NC_VAR_INFO_T *var,
void **fillp)
297 if (var->type_info->nc_type_class ==
NC_VLEN)
299 else if (var->type_info->nc_type_class ==
NC_STRING)
300 size =
sizeof(
char *);
303 if ((retval = nc4_get_typelen_mem(h5, var->type_info->nc_typeid, 0, &size)))
309 if (!((*fillp) = calloc(1, size)))
316 LOG((4,
"Found a fill value for var %s", var->name));
317 if (var->type_info->nc_type_class ==
NC_VLEN)
321 fv_vlen->
len = in_vlen->
len;
322 if (!(fv_vlen->p = malloc(size * in_vlen->
len)))
328 memcpy(fv_vlen->p, in_vlen->
p, in_vlen->
len * size);
330 else if (var->type_info->nc_type_class ==
NC_STRING)
332 if (*(
char **)var->fill_value)
333 if (!(**(
char ***)fillp = strdup(*(
char **)var->fill_value)))
341 memcpy((*fillp), var->fill_value, size);
345 if (nc4_get_default_fill_value(var->type_info, *fillp))
374 nc4_get_hdf_typeid(NC_HDF5_FILE_INFO_T *h5,
nc_type xtype,
375 hid_t *hdf_typeid,
int endianness)
377 NC_TYPE_INFO_T *type;
381 assert(hdf_typeid && h5);
394 if ((
typeid = H5Tcopy(H5T_C_S1)) < 0)
396 if (H5Tset_strpad(
typeid, H5T_STR_NULLTERM) < 0)
398 if(H5Tset_cset(
typeid, H5T_CSET_ASCII) < 0)
402 *hdf_typeid =
typeid;
407 if ((
typeid = H5Tcopy(H5T_C_S1)) < 0)
409 if (H5Tset_size(
typeid, H5T_VARIABLE) < 0)
411 if(H5Tset_cset(
typeid, H5T_CSET_UTF8) < 0)
415 *hdf_typeid =
typeid;
426 typeid = H5T_STD_I8LE;
428 typeid = H5T_STD_I8BE;
430 typeid = H5T_NATIVE_SCHAR;
435 typeid = H5T_STD_I16LE;
437 typeid = H5T_STD_I16BE;
439 typeid = H5T_NATIVE_SHORT;
444 typeid = H5T_STD_I32LE;
446 typeid = H5T_STD_I32BE;
448 typeid = H5T_NATIVE_INT;
453 typeid = H5T_STD_U8LE;
455 typeid = H5T_STD_U8BE;
457 typeid = H5T_NATIVE_UCHAR;
462 typeid = H5T_STD_U16LE;
464 typeid = H5T_STD_U16BE;
466 typeid = H5T_NATIVE_USHORT;
471 typeid = H5T_STD_U32LE;
473 typeid = H5T_STD_U32BE;
475 typeid = H5T_NATIVE_UINT;
480 typeid = H5T_STD_I64LE;
482 typeid = H5T_STD_I64BE;
484 typeid = H5T_NATIVE_LLONG;
489 typeid = H5T_STD_U64LE;
491 typeid = H5T_STD_U64BE;
493 typeid = H5T_NATIVE_ULLONG;
498 typeid = H5T_IEEE_F32LE;
500 typeid = H5T_IEEE_F32BE;
502 typeid = H5T_NATIVE_FLOAT;
507 typeid = H5T_IEEE_F64LE;
509 typeid = H5T_IEEE_F64BE;
511 typeid = H5T_NATIVE_DOUBLE;
516 if (nc4_find_type(h5, xtype, &type))
520 typeid = type->hdf_typeid;
526 if ((*hdf_typeid = H5Tcopy(
typeid)) < 0)
530 assert(*hdf_typeid != -1);
533 if (
typeid > 0 && H5Tclose(
typeid) < 0)
551 check_for_vara(
nc_type *mem_nc_type, NC_VAR_INFO_T *var, NC_HDF5_FILE_INFO_T *h5)
558 if (*mem_nc_type ==
NC_NAT)
559 *mem_nc_type = var->type_info->nc_typeid;
560 assert(*mem_nc_type);
563 if (var->type_info->nc_typeid != *mem_nc_type &&
564 (var->type_info->nc_typeid ==
NC_CHAR || *mem_nc_type ==
NC_CHAR))
568 if (h5->flags & NC_INDEF)
572 if ((retval = nc4_enddef_netcdf4_file(h5)))
584 log_dim_info(NC_VAR_INFO_T *var, hsize_t *fdims, hsize_t *fmaxdims,
585 hsize_t *start, hsize_t *count)
590 LOG((4,
"%s: var name %s ndims %d", __func__, var->name, var->ndims));
591 LOG((4,
"File space, and requested:"));
592 for (d2 = 0; d2 < var->ndims; d2++)
594 LOG((4,
"fdims[%d]=%Ld fmaxdims[%d]=%Ld", d2, fdims[d2], d2,
596 LOG((4,
"start[%d]=%Ld count[%d]=%Ld", d2, start[d2], d2, count[d2]));
614 set_par_access(NC_HDF5_FILE_INFO_T *h5, NC_VAR_INFO_T *var, hid_t xfer_plistid)
621 H5FD_mpio_xfer_t hdf5_xfer_mode;
625 H5FD_MPIO_COLLECTIVE : H5FD_MPIO_INDEPENDENT;
628 if (H5Pset_dxpl_mpio(xfer_plistid, hdf5_xfer_mode) < 0)
631 LOG((4,
"%s: %d H5FD_MPIO_COLLECTIVE: %d H5FD_MPIO_INDEPENDENT: %d",
632 __func__, (
int)hdf5_xfer_mode, H5FD_MPIO_COLLECTIVE, H5FD_MPIO_INDEPENDENT));
663 nc4_put_vara(NC *nc,
int ncid,
int varid,
const size_t *startp,
664 const size_t *countp,
nc_type mem_nc_type,
int is_long,
void *data)
667 NC_HDF5_FILE_INFO_T *h5;
670 hid_t file_spaceid = 0, mem_spaceid = 0, xfer_plistid = 0;
675 int need_to_extend = 0;
677 int extend_possible = 0;
679 int retval =
NC_NOERR, range_error = 0, i, d2;
682 int need_to_convert = 0;
686 hid_t mem_typeid = 0;
691 if ((retval = nc4_find_g_var_nc(nc, ncid, varid, &grp, &var)))
694 assert(grp && h5 && var && var->name);
696 LOG((3,
"%s: var->name %s mem_nc_type %d is_long %d",
697 __func__, var->name, mem_nc_type, is_long));
701 if ((retval = check_for_vara(&mem_nc_type, var, h5)))
705 for (i = 0; i < var->ndims; i++)
707 start[i] = startp[i];
708 count[i] = countp[i];
714 if (var->hdf5_name && strlen(var->hdf5_name) >= strlen(NON_COORD_PREPEND) &&
715 strncmp(var->hdf5_name, NON_COORD_PREPEND, strlen(NON_COORD_PREPEND)) == 0 &&
717 name_to_use = var->hdf5_name;
719 name_to_use = var->name;
720 if (!var->hdf_datasetid)
721 if ((var->hdf_datasetid = H5Dopen2(grp->hdf_grpid, name_to_use, H5P_DEFAULT)) < 0)
725 if ((file_spaceid = H5Dget_space(var->hdf_datasetid)) < 0)
731 if (H5Sget_simple_extent_dims(file_spaceid, fdims, fmaxdims) < 0)
735 log_dim_info(var, fdims, fmaxdims, start, count);
740 for (d2 = 0; d2 < var->ndims; d2++)
743 assert(dim && dim->dimid == var->dimids[d2]);
746 #ifdef RELAX_COORD_BOUND 747 if (start[d2] > (hssize_t)fdims[d2] ||
748 (start[d2] == (hssize_t)fdims[d2] && count[d2] > 0))
750 if (start[d2] >= (hssize_t)fdims[d2])
753 if (start[d2] + count[d2] > fdims[d2])
762 if (H5Sget_simple_extent_type(file_spaceid) == H5S_SCALAR)
764 if ((mem_spaceid = H5Screate(H5S_SCALAR)) < 0)
769 if (H5Sselect_hyperslab(file_spaceid, H5S_SELECT_SET, start, NULL,
775 if ((mem_spaceid = H5Screate_simple(var->ndims, count, NULL)) < 0)
782 if ((mem_nc_type != var->type_info->nc_typeid || (var->type_info->nc_typeid ==
NC_INT && is_long)) &&
785 size_t file_type_size;
790 for (d2=0; d2<var->ndims; d2++)
792 LOG((4,
"converting data for var %s type=%d len=%d", var->name,
793 var->type_info->nc_typeid, len));
797 assert(var->type_info->size);
798 file_type_size = var->type_info->size;
804 if (!(bufr = malloc(len * file_type_size)))
813 if ((retval = nc4_get_hdf_typeid(h5, mem_nc_type, &mem_typeid,
814 var->type_info->endianness)))
819 if ((xfer_plistid = H5Pcreate(H5P_DATASET_XFER)) < 0)
826 if (H5Pset_type_conv_cb(xfer_plistid, except_func, &range_error) < 0)
832 if ((retval = set_par_access(h5, var, xfer_plistid)))
842 for (d2 = 0; d2 < var->ndims; d2++)
845 assert(dim && dim->dimid == var->dimids[d2]);
851 if (start[d2] + count[d2] > fdims[d2])
853 xtend_size[d2] = (
long long unsigned)(start[d2] + count[d2]);
857 xtend_size[d2] = (
long long unsigned)fdims[d2];
859 if (start[d2] + count[d2] > dim->len)
861 dim->len = start[d2] + count[d2];
862 dim->extended = NC_TRUE;
867 xtend_size[d2] = (
long long unsigned)dim->len;
873 if (extend_possible && h5->parallel &&
NC_COLLECTIVE == var->parallel_access)
878 if(MPI_SUCCESS != MPI_Allreduce(MPI_IN_PLACE, &need_to_extend, 1, MPI_INT, MPI_BOR, h5->comm))
887 LOG((4,
"extending dataset"));
895 if(MPI_SUCCESS != MPI_Allreduce(MPI_IN_PLACE, xtend_size, var->ndims, MPI_UNSIGNED_LONG_LONG, MPI_MAX, h5->comm))
900 for (d2 = 0; d2 < var->ndims; d2++)
901 fdims[d2] = (hsize_t)xtend_size[d2];
903 if (H5Dset_extent(var->hdf_datasetid, fdims) < 0)
905 if (file_spaceid > 0 && H5Sclose(file_spaceid) < 0)
907 if ((file_spaceid = H5Dget_space(var->hdf_datasetid)) < 0)
909 if (H5Sselect_hyperslab(file_spaceid, H5S_SELECT_SET,
910 start, NULL, count, NULL) < 0)
919 if ((retval = nc4_convert_type(data, bufr, mem_nc_type, var->type_info->nc_typeid,
920 len, &range_error, var->fill_value,
927 LOG((4,
"about to H5Dwrite datasetid 0x%x mem_spaceid 0x%x " 928 "file_spaceid 0x%x", var->hdf_datasetid, mem_spaceid, file_spaceid));
929 if (H5Dwrite(var->hdf_datasetid, var->type_info->hdf_typeid,
930 mem_spaceid, file_spaceid, xfer_plistid, bufr) < 0)
935 if (!var->written_to)
936 var->written_to = NC_TRUE;
941 (var->type_info->nc_typeid ==
NC_UBYTE || var->type_info->nc_typeid ==
NC_BYTE) &&
948 if (mem_typeid > 0 && H5Tclose(mem_typeid) < 0)
951 if (file_spaceid > 0 && H5Sclose(file_spaceid) < 0)
953 if (mem_spaceid > 0 && H5Sclose(mem_spaceid) < 0)
955 if (xfer_plistid && (H5Pclose(xfer_plistid) < 0))
958 if (need_to_convert && bufr) free(bufr);
996 nc4_get_vara(NC *nc,
int ncid,
int varid,
const size_t *startp,
997 const size_t *countp,
nc_type mem_nc_type,
int is_long,
void *data)
1000 NC_HDF5_FILE_INFO_T *h5;
1003 hid_t file_spaceid = 0, mem_spaceid = 0;
1004 hid_t xfer_plistid = 0;
1005 size_t file_type_size;
1010 void *fillvalue = NULL;
1011 int no_read = 0, provide_fill = 0;
1013 int scalar = 0, retval =
NC_NOERR, range_error = 0, i, d2;
1016 hid_t mem_typeid = 0;
1018 #ifndef HDF5_CONVERT 1019 int need_to_convert = 0;
1025 if ((retval = nc4_find_g_var_nc(nc, ncid, varid, &grp, &var)))
1028 assert(grp && h5 && var && var->name);
1030 LOG((3,
"%s: var->name %s mem_nc_type %d is_long %d",
1031 __func__, var->name, mem_nc_type, is_long));
1034 if ((retval = check_for_vara(&mem_nc_type, var, h5)))
1038 for (i = 0; i < var->ndims; i++)
1040 start[i] = startp[i];
1041 count[i] = countp[i];
1047 if (var->hdf5_name && strlen(var->hdf5_name) >= strlen(NON_COORD_PREPEND) &&
1048 strncmp(var->hdf5_name, NON_COORD_PREPEND, strlen(NON_COORD_PREPEND)) == 0 &&
1050 name_to_use = var->hdf5_name;
1052 name_to_use = var->name;
1053 if (!var->hdf_datasetid)
1054 if ((var->hdf_datasetid = H5Dopen2(grp->hdf_grpid, name_to_use, H5P_DEFAULT)) < 0)
1058 if ((file_spaceid = H5Dget_space(var->hdf_datasetid)) < 0)
1064 if (H5Sget_simple_extent_dims(file_spaceid, fdims, fmaxdims) < 0)
1068 log_dim_info(var, fdims, fmaxdims, start, count);
1073 for (d2 = 0; d2 < var->ndims; d2++) {
1075 assert(dim && dim->dimid == var->dimids[d2]);
1082 if ((retval = NC4_inq_dim(ncid, dim->dimid, NULL, &ulen)))
1086 #ifdef RELAX_COORD_BOUND 1087 if (start[d2] > (hssize_t)ulen ||
1088 (start[d2] == (hssize_t)ulen && count[d2] > 0))
1090 if (start[d2] >= (hssize_t)ulen && ulen > 0)
1093 if (start[d2] + count[d2] > ulen)
1101 if (start[d2] >= (hssize_t)fdims[d2])
1102 fill_value_size[d2] = count[d2];
1103 else if (start[d2] + count[d2] > fdims[d2])
1104 fill_value_size[d2] = count[d2] - (fdims[d2] - start[d2]);
1106 fill_value_size[d2] = 0;
1107 count[d2] -= fill_value_size[d2];
1108 if (fill_value_size[d2])
1114 #ifdef RELAX_COORD_BOUND 1115 if (start[d2] > (hssize_t)fdims[d2] ||
1116 (start[d2] == (hssize_t)fdims[d2] && count[d2] > 0))
1118 if (start[d2] >= (hssize_t)fdims[d2])
1121 if (start[d2] + count[d2] > fdims[d2])
1125 fill_value_size[d2] = count[d2];
1131 for (d2 = 0; d2 < var->ndims; d2++)
1137 assert(var->type_info->size);
1138 file_type_size = var->type_info->size;
1146 if (H5Sget_simple_extent_type(file_spaceid) == H5S_SCALAR)
1148 if ((mem_spaceid = H5Screate(H5S_SCALAR)) < 0)
1154 if (H5Sselect_hyperslab(file_spaceid, H5S_SELECT_SET,
1155 start, NULL, count, NULL) < 0)
1159 if ((mem_spaceid = H5Screate_simple(var->ndims, count, NULL)) < 0)
1169 if(var->type_info->nc_type_class ==
NC_STRING &&
1170 H5Tget_size(var->type_info->hdf_typeid) > 1 &&
1171 !H5Tis_variable_str(var->type_info->hdf_typeid)) {
1172 hsize_t fstring_len;
1174 if ((fstring_len = H5Tget_size(var->type_info->hdf_typeid)) == 0)
1176 if (!(*(
char **)data = malloc(1 + fstring_len)))
1178 bufr = *(
char **)data;
1181 #ifndef HDF5_CONVERT 1184 if ((mem_nc_type != var->type_info->nc_typeid || (var->type_info->nc_typeid ==
NC_INT && is_long)) &&
1190 for (d2 = 0; d2 < var->ndims; d2++)
1192 LOG((4,
"converting data for var %s type=%d len=%d", var->name,
1193 var->type_info->nc_typeid, len));
1199 if (!(bufr = malloc(len * file_type_size)))
1209 if ((retval = nc4_get_hdf_typeid(h5, mem_nc_type, &mem_typeid,
1210 var->type_info->endianness)))
1215 if ((xfer_plistid = H5Pcreate(H5P_DATASET_XFER)) < 0)
1222 if (H5Pset_type_conv_cb(xfer_plistid, except_func, &range_error) < 0)
1226 #ifdef USE_PARALLEL4 1228 if ((retval = set_par_access(h5, var, xfer_plistid)))
1233 LOG((5,
"About to H5Dread some data..."));
1234 if (H5Dread(var->hdf_datasetid, var->type_info->native_hdf_typeid,
1235 mem_spaceid, file_spaceid, xfer_plistid, bufr) < 0)
1238 #ifndef HDF5_CONVERT 1244 if (need_to_convert)
1246 if ((retval = nc4_convert_type(bufr, data, var->type_info->nc_typeid, mem_nc_type,
1247 len, &range_error, var->fill_value,
1254 (var->type_info->nc_typeid ==
NC_UBYTE || var->type_info->nc_typeid ==
NC_BYTE) &&
1264 (var->type_info->nc_typeid ==
NC_UBYTE || var->type_info->nc_typeid ==
NC_BYTE) &&
1272 #ifdef USE_PARALLEL4 1279 if ((xfer_plistid = H5Pcreate(H5P_DATASET_XFER)) < 0)
1282 if ((retval = set_par_access(h5, var, xfer_plistid)))
1285 if (H5Sselect_none(file_spaceid)<0)
1290 if((mem_spaceid = H5Dget_space(var->hdf_datasetid))<0)
1292 if (H5Sselect_none(mem_spaceid)<0)
1296 LOG((5,
"About to H5Dread some data..."));
1297 if (H5Dread(var->hdf_datasetid, var->type_info->native_hdf_typeid,
1298 mem_spaceid, file_spaceid, xfer_plistid, bufr) < 0)
1306 if (!scalar && provide_fill)
1309 size_t real_data_size = 0;
1314 for (real_data_size = file_type_size, d2 = 0; d2 < var->ndims; d2++)
1315 real_data_size *= (count[d2] - start[d2]);
1319 if (get_fill_value(h5, var, &fillvalue) < 0)
1323 for (fill_len = 1, d2 = 0; d2 < var->ndims; d2++)
1324 fill_len *= (fill_value_size[d2] ? fill_value_size[d2] : 1);
1327 filldata = (
char *)data + real_data_size;
1328 for (i = 0; i < fill_len; i++)
1331 if (var->type_info->nc_type_class ==
NC_STRING)
1333 if (*(
char **)fillvalue)
1335 if (!(*(
char **)filldata = strdup(*(
char **)fillvalue)))
1339 *(
char **)filldata = NULL;
1341 else if(var->type_info->nc_type_class ==
NC_VLEN) {
1343 memcpy(filldata,fillvalue,file_type_size);
1345 *(
char **)filldata = NULL;
1348 memcpy(filldata, fillvalue, file_type_size);
1349 filldata = (
char *)filldata + file_type_size;
1355 if (mem_typeid > 0 && H5Tclose(mem_typeid) < 0)
1358 if (file_spaceid > 0)
1360 if (H5Sclose(file_spaceid) < 0)
1363 if (mem_spaceid > 0)
1365 if (H5Sclose(mem_spaceid) < 0)
1368 if (xfer_plistid > 0)
1370 if (H5Pclose(xfer_plistid) < 0)
1373 #ifndef HDF5_CONVERT 1374 if (need_to_convert && bufr != NULL)
1381 if (var->type_info->nc_type_class ==
NC_VLEN)
1383 else if (var->type_info->nc_type_class ==
NC_STRING && *(
char **)fillvalue)
1384 free(*(
char **)fillvalue);
1412 put_att_grpa(NC_GRP_INFO_T *grp,
int varid, NC_ATT_INFO_T *att)
1414 hid_t datasetid = 0, locid;
1415 hid_t attid = 0, spaceid = 0, file_typeid = 0;
1420 int phoney_data = 99;
1423 LOG((3,
"%s: varid %d att->attnum %d att->name %s att->nc_typeid %d att->len %d",
1424 __func__, varid, att->attnum, att->name,
1425 att->nc_typeid, att->len));
1428 if (grp->nc4_info->no_write)
1433 locid = grp->hdf_grpid;
1436 if ((retval = nc4_open_var_grp2(grp, varid, &datasetid)))
1442 if ((attr_exists = H5Aexists(locid, att->name)) < 0)
1446 if (H5Adelete(locid, att->name) < 0)
1453 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, att->nc_typeid,
1461 data = &phoney_data;
1464 else if (att->stdata)
1474 if (att->nc_typeid ==
NC_CHAR)
1476 size_t string_size = dims[0];
1480 if ((spaceid = H5Screate(H5S_NULL)) < 0)
1485 if ((spaceid = H5Screate(H5S_SCALAR)) < 0)
1488 if (H5Tset_size(file_typeid, string_size) < 0)
1490 if (H5Tset_strpad(file_typeid, H5T_STR_NULLTERM) < 0)
1497 if ((spaceid = H5Screate(H5S_NULL)) < 0)
1502 if ((spaceid = H5Screate_simple(1, dims, NULL)) < 0)
1506 if ((attid = H5Acreate(locid, att->name, file_typeid, spaceid,
1511 if (H5Awrite(attid, file_typeid, data) < 0)
1515 if (file_typeid && H5Tclose(file_typeid))
1517 if (attid > 0 && H5Aclose(attid) < 0)
1519 if (spaceid > 0 && H5Sclose(spaceid) < 0)
1536 write_attlist(NC_ATT_INFO_T *attlist,
int varid, NC_GRP_INFO_T *grp)
1541 for (att = attlist; att; att = att->l.next)
1545 LOG((4,
"%s: writing att %s to varid %d", __func__, att->name, varid));
1546 if ((retval = put_att_grpa(grp, varid, att)))
1548 att->dirty = NC_FALSE;
1549 att->created = NC_TRUE;
1575 write_coord_dimids(NC_VAR_INFO_T *var)
1577 hsize_t coords_len[1];
1578 hid_t c_spaceid = -1, c_attid = -1;
1582 coords_len[0] = var->ndims;
1583 if ((c_spaceid = H5Screate_simple(1, coords_len, coords_len)) < 0) ret++;
1584 if (!ret && (c_attid = H5Acreate(var->hdf_datasetid, COORDINATES, H5T_NATIVE_INT,
1585 c_spaceid, H5P_DEFAULT)) < 0) ret++;
1586 if (!ret && H5Awrite(c_attid, H5T_NATIVE_INT, var->dimids) < 0) ret++;
1589 if (c_spaceid > 0 && H5Sclose(c_spaceid) < 0) ret++;
1590 if (c_attid > 0 && H5Aclose(c_attid) < 0) ret++;
1605 write_netcdf4_dimid(hid_t datasetid,
int dimid)
1607 hid_t dimid_spaceid, dimid_attid;
1611 if ((dimid_spaceid = H5Screate(H5S_SCALAR)) < 0)
1615 if ((attr_exists = H5Aexists(datasetid, NC_DIMID_ATT_NAME)) < 0)
1618 dimid_attid = H5Aopen_by_name(datasetid,
".", NC_DIMID_ATT_NAME,
1619 H5P_DEFAULT, H5P_DEFAULT);
1622 dimid_attid = H5Acreate(datasetid, NC_DIMID_ATT_NAME,
1623 H5T_NATIVE_INT, dimid_spaceid, H5P_DEFAULT);
1624 if (dimid_attid < 0)
1629 LOG((4,
"%s: writing secret dimid %d", __func__, dimid));
1630 if (H5Awrite(dimid_attid, H5T_NATIVE_INT, &dimid) < 0)
1634 if (H5Sclose(dimid_spaceid) < 0)
1636 if (H5Aclose(dimid_attid) < 0)
1653 var_create_dataset(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var, nc_bool_t write_dimid)
1655 hid_t plistid = 0, access_plistid = 0,
typeid = 0, spaceid = 0;
1656 hsize_t chunksize[H5S_MAX_RANK], dimsize[H5S_MAX_RANK], maxdimsize[H5S_MAX_RANK];
1659 NC_DIM_INFO_T *dim = NULL;
1663 LOG((3,
"%s:: name %s", __func__, var->name));
1666 if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
1668 if ((access_plistid = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
1672 if (H5Pset_obj_track_times(plistid,0)<0)
1676 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, var->type_info->nc_typeid, &
typeid,
1677 var->type_info->endianness)))
1684 if (H5Pset_fill_time(plistid, H5D_FILL_TIME_NEVER) < 0)
1689 if ((retval = get_fill_value(grp->nc4_info, var, &fillp)))
1695 if (var->type_info->nc_type_class ==
NC_STRING)
1697 if (H5Pset_fill_value(plistid,
typeid, fillp) < 0)
1706 hid_t fill_typeid = 0;
1708 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, var->type_info->nc_typeid, &fill_typeid,
1711 if (H5Pset_fill_value(plistid, fill_typeid, fillp) < 0)
1713 if (H5Tclose(fill_typeid) < 0)
1717 if (H5Tclose(fill_typeid) < 0)
1725 if (H5Pset_shuffle(plistid) < 0)
1731 if (H5Pset_deflate(plistid, var->deflate_level) < 0)
1733 }
else if(var->filterid) {
1738 if(var->nparams != 2)
1740 options_mask = (int)var->params[0];
1741 bits_per_pixel = (
int)var->params[1];
1742 if(H5Pset_szip(plistid, options_mask, bits_per_pixel) < 0)
1745 herr_t code = H5Pset_filter(plistid, var->filterid, H5Z_FLAG_MANDATORY, var->nparams, var->params);
1753 if (var->fletcher32)
1754 if (H5Pset_fletcher32(plistid) < 0)
1766 for (d = 0; d < var->ndims; d++) {
1768 assert(dim && dim->dimid == var->dimids[d]);
1776 if (!var->shuffle && !var->deflate && !var->fletcher32 &&
1777 (var->chunksizes == NULL || !var->chunksizes[0]) && !unlimdim)
1778 var->contiguous = NC_TRUE;
1781 for (d = 0; d < var->ndims; d++)
1784 assert(dim && dim->dimid == var->dimids[d]);
1785 dimsize[d] = dim->unlimited ? NC_HDF5_UNLIMITED_DIMSIZE : dim->len;
1786 maxdimsize[d] = dim->unlimited ? H5S_UNLIMITED : (hsize_t)dim->len;
1787 if (!var->contiguous) {
1788 if (var->chunksizes[d])
1789 chunksize[d] = var->chunksizes[d];
1793 if (var->type_info->nc_type_class ==
NC_STRING)
1794 type_size =
sizeof(
char *);
1796 type_size = var->type_info->size;
1802 chunksize[d] = pow((
double)DEFAULT_CHUNK_SIZE/type_size,
1803 1/(
double)(var->ndims - unlimdim));
1807 if (!dim->unlimited && chunksize[d] > dim->len)
1808 chunksize[d] = dim->len;
1811 var->chunksizes[d] = chunksize[d];
1816 if (var->contiguous)
1818 if (H5Pset_layout(plistid, H5D_CONTIGUOUS) < 0)
1823 if (H5Pset_chunk(plistid, var->ndims, chunksize) < 0)
1828 if ((spaceid = H5Screate_simple(var->ndims, dimsize, maxdimsize)) < 0)
1833 if ((spaceid = H5Screate(H5S_SCALAR)) < 0)
1838 if (H5Pset_attr_creation_order(plistid, H5P_CRT_ORDER_TRACKED|
1839 H5P_CRT_ORDER_INDEXED) < 0)
1843 if (!var->contiguous && var->chunk_cache_size)
1844 if (H5Pset_chunk_cache(access_plistid, var->chunk_cache_nelems,
1845 var->chunk_cache_size, var->chunk_cache_preemption) < 0)
1849 name_to_use = var->hdf5_name ? var->hdf5_name : var->name;
1850 LOG((4,
"%s: about to H5Dcreate2 dataset %s of type 0x%x", __func__,
1851 name_to_use,
typeid));
1852 if ((var->hdf_datasetid = H5Dcreate2(grp->hdf_grpid, name_to_use,
typeid,
1853 spaceid, H5P_DEFAULT, plistid, access_plistid)) < 0)
1855 var->created = NC_TRUE;
1856 var->is_new_var = NC_FALSE;
1863 if (H5DSset_scale(var->hdf_datasetid, var->name) < 0)
1869 if ((retval = write_coord_dimids(var)))
1874 if ((retval = write_netcdf4_dimid(var->hdf_datasetid, var->dimids[0])))
1880 if ((retval = write_attlist(var->att, var->varid, grp)))
1882 var->attr_dirty = NC_FALSE;
1885 if (
typeid > 0 && H5Tclose(
typeid) < 0)
1887 if (plistid > 0 && H5Pclose(plistid) < 0)
1889 if (access_plistid > 0 && H5Pclose(access_plistid) < 0)
1891 if (spaceid > 0 && H5Sclose(spaceid) < 0)
1895 if (var->type_info->nc_type_class ==
NC_VLEN)
1897 else if (var->type_info->nc_type_class ==
NC_STRING && *(
char **)fillp)
1898 free(*(
char **)fillp);
1916 nc4_adjust_var_cache(NC_GRP_INFO_T *grp, NC_VAR_INFO_T * var)
1918 size_t chunk_size_bytes = 1;
1923 if (var->contiguous)
1925 #ifdef USE_PARALLEL4 1930 for (d = 0; d < var->ndims; d++)
1931 chunk_size_bytes *= var->chunksizes[d];
1932 if (var->type_info->size)
1933 chunk_size_bytes *= var->type_info->size;
1935 chunk_size_bytes *=
sizeof(
char *);
1940 if (var->chunk_cache_size == CHUNK_CACHE_SIZE)
1941 if (chunk_size_bytes > var->chunk_cache_size)
1943 var->chunk_cache_size = chunk_size_bytes * DEFAULT_CHUNKS_IN_CACHE;
1944 if (var->chunk_cache_size > MAX_DEFAULT_CACHE_SIZE)
1945 var->chunk_cache_size = MAX_DEFAULT_CACHE_SIZE;
1946 if ((retval = nc4_reopen_dataset(grp, var)))
1964 commit_type(NC_GRP_INFO_T *grp, NC_TYPE_INFO_T *type)
1968 assert(grp && type);
1971 if (type->committed)
1977 NC_FIELD_INFO_T *field;
1978 hid_t hdf_base_typeid, hdf_typeid;
1980 if ((type->hdf_typeid = H5Tcreate(H5T_COMPOUND, type->size)) < 0)
1982 LOG((4,
"creating compound type %s hdf_typeid 0x%x", type->name,
1985 for (field = type->u.c.field; field; field = field->l.next)
1987 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, field->nc_typeid,
1988 &hdf_base_typeid, type->endianness)))
1997 for (d = 0; d < field->ndims; d++)
1998 dims[d] = field->dim_size[d];
1999 if ((hdf_typeid = H5Tarray_create(hdf_base_typeid, field->ndims,
2002 if (H5Tclose(hdf_base_typeid) < 0)
2006 if (H5Tclose(hdf_base_typeid) < 0)
2010 hdf_typeid = hdf_base_typeid;
2011 LOG((4,
"inserting field %s offset %d hdf_typeid 0x%x", field->name,
2012 field->offset, hdf_typeid));
2013 if (H5Tinsert(type->hdf_typeid, field->name, field->offset,
2016 if (H5Tclose(hdf_typeid) < 0)
2020 else if (type->nc_type_class ==
NC_VLEN)
2023 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, type->u.v.base_nc_typeid,
2024 &type->u.v.base_hdf_typeid, type->endianness)))
2028 if ((type->hdf_typeid = H5Tvlen_create(type->u.v.base_hdf_typeid)) < 0)
2031 else if (type->nc_type_class ==
NC_OPAQUE)
2034 if ((type->hdf_typeid = H5Tcreate(H5T_OPAQUE, type->size)) < 0)
2037 else if (type->nc_type_class ==
NC_ENUM)
2039 NC_ENUM_MEMBER_INFO_T *enum_m;
2041 if (!type->u.e.enum_member)
2045 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, type->u.e.base_nc_typeid,
2046 &type->u.e.base_hdf_typeid, type->endianness)))
2050 if ((type->hdf_typeid = H5Tenum_create(type->u.e.base_hdf_typeid)) < 0)
2054 for (enum_m = type->u.e.enum_member; enum_m; enum_m = enum_m->l.next)
2055 if (H5Tenum_insert(type->hdf_typeid, enum_m->name, enum_m->value) < 0)
2060 LOG((0,
"Unknown class: %d", type->nc_type_class));
2065 if (H5Tcommit(grp->hdf_grpid, type->name, type->hdf_typeid) < 0)
2067 type->committed = NC_TRUE;
2068 LOG((4,
"just committed type %s, HDF typeid: 0x%x", type->name,
2074 if ((type->native_hdf_typeid = H5Tget_native_type(type->hdf_typeid,
2075 H5T_DIR_DEFAULT)) < 0)
2092 write_nc3_strict_att(hid_t hdf_grpid)
2094 hid_t attid = 0, spaceid = 0;
2101 if ((attr_exists = H5Aexists(hdf_grpid, NC3_STRICT_ATT_NAME)) < 0)
2108 if ((spaceid = H5Screate(H5S_SCALAR)) < 0)
2110 if ((attid = H5Acreate(hdf_grpid, NC3_STRICT_ATT_NAME,
2111 H5T_NATIVE_INT, spaceid, H5P_DEFAULT)) < 0)
2113 if (H5Awrite(attid, H5T_NATIVE_INT, &one) < 0)
2117 if (spaceid > 0 && (H5Sclose(spaceid) < 0))
2119 if (attid > 0 && (H5Aclose(attid) < 0))
2133 create_group(NC_GRP_INFO_T *grp)
2145 if ((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0)
2149 if (H5Pset_obj_track_times(gcpl_id,0)<0)
2152 if (H5Pset_link_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0)
2154 if (H5Pset_attr_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0)
2156 if ((grp->hdf_grpid = H5Gcreate2(grp->parent->hdf_grpid, grp->name,
2157 H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
2159 if (H5Pclose(gcpl_id) < 0)
2165 if ((grp->hdf_grpid = H5Gopen2(grp->nc4_info->hdfid,
"/", H5P_DEFAULT)) < 0)
2171 if (gcpl_id > 0 && H5Pclose(gcpl_id) < 0)
2173 if (grp->hdf_grpid > 0 && H5Gclose(grp->hdf_grpid) < 0)
2190 attach_dimscales(NC_GRP_INFO_T *grp)
2193 NC_DIM_INFO_T *dim1;
2198 for (i=0; i < grp->vars.nelems; i++)
2200 var = grp->vars.value[i];
2213 for (d = 0; d < var->ndims; d++)
2216 if (var->dimscale_attached)
2218 if (!var->dimscale_attached[d])
2220 hid_t dim_datasetid;
2222 assert(dim1 && dim1->dimid == var->dimids[d]);
2224 LOG((2,
"%s: attaching scale for dimid %d to var %s",
2225 __func__, var->dimids[d], var->name));
2228 if (dim1->coord_var)
2229 dim_datasetid = dim1->coord_var->hdf_datasetid;
2231 dim_datasetid = dim1->hdf_dimscaleid;
2232 assert(dim_datasetid > 0);
2233 if (H5DSattach_scale(var->hdf_datasetid, dim_datasetid, d) < 0)
2235 var->dimscale_attached[d] = NC_TRUE;
2239 if (!var->dimscale_attached[d])
2241 LOG((0,
"no dimscale found!"));
2264 var_exists(hid_t grpid,
char *name, nc_bool_t *exists)
2272 if ((link_exists = H5Lexists(grpid, name, H5P_DEFAULT)) < 0)
2279 if (H5Gget_objinfo(grpid, name, 1, &statbuf) < 0)
2282 if (H5G_DATASET == statbuf.type)
2304 remove_coord_atts(hid_t hdf_datasetid)
2310 if ((attr_exists = H5Aexists(hdf_datasetid, NC_DIMID_ATT_NAME)) < 0)
2314 if (H5Adelete(hdf_datasetid, NC_DIMID_ATT_NAME) < 0)
2321 if ((attr_exists = H5Aexists(hdf_datasetid, HDF5_DIMSCALE_CLASS_ATT_NAME)) < 0)
2325 if (H5Adelete(hdf_datasetid, HDF5_DIMSCALE_CLASS_ATT_NAME) < 0)
2328 if ((attr_exists = H5Aexists(hdf_datasetid, HDF5_DIMSCALE_NAME_ATT_NAME)) < 0)
2332 if (H5Adelete(hdf_datasetid, HDF5_DIMSCALE_NAME_ATT_NAME) < 0)
2353 write_var(NC_VAR_INFO_T *var, NC_GRP_INFO_T *grp, nc_bool_t write_dimid)
2355 nc_bool_t replace_existing_var = NC_FALSE;
2358 LOG((4,
"%s: writing var %s", __func__, var->name));
2362 if (var->created && var->fill_val_changed)
2364 replace_existing_var = NC_TRUE;
2365 var->fill_val_changed = NC_FALSE;
2374 flag_atts_dirty(&var->att);
2381 if (var->became_coord_var)
2385 for (d1 = grp->dim; d1; d1 = d1->l.next)
2386 if (!strcmp(d1->name, var->name))
2390 if ((retval = var_exists(grp->hdf_grpid, var->name, &exists)))
2395 replace_existing_var = NC_TRUE;
2396 flag_atts_dirty(&var->att);
2409 if (replace_existing_var)
2413 for (d1 = grp->dim; d1; d1 = d1->l.next)
2414 if (!strcmp(d1->name, var->name))
2418 if ((retval = var_exists(grp->hdf_grpid, var->name, &exists)))
2422 hid_t dim_datasetid;
2426 dim_datasetid = d1->coord_var->hdf_datasetid;
2428 dim_datasetid = d1->hdf_dimscaleid;
2429 assert(dim_datasetid > 0);
2434 if ((retval = rec_detach_scales(grp->nc4_info->root_grp,
2435 var->dimids[0], dim_datasetid)))
2443 if (var->was_coord_var && var->dimscale_attached)
2451 if ((retval = remove_coord_atts(var->hdf_datasetid)))
2455 if (var->dimscale_attached)
2460 for (d = 0; d < var->ndims; d++)
2461 if (var->dimscale_attached[d])
2463 hid_t dim_datasetid;
2464 NC_DIM_INFO_T *dim1 = var->dim[d];
2465 assert(dim1 && dim1->dimid == var->dimids[d]);
2468 if (dim1->coord_var)
2469 dim_datasetid = dim1->coord_var->hdf_datasetid;
2471 dim_datasetid = dim1->hdf_dimscaleid;
2472 assert(dim_datasetid > 0);
2474 if (H5DSdetach_scale(var->hdf_datasetid, dim_datasetid, d) < 0)
2476 var->dimscale_attached[d] = NC_FALSE;
2482 if (replace_existing_var)
2485 if (var->hdf_datasetid && H5Dclose(var->hdf_datasetid) < 0)
2487 var->hdf_datasetid = 0;
2490 if (H5Gunlink(grp->hdf_grpid, var->name) < 0)
2495 if (var->is_new_var || replace_existing_var)
2497 if ((retval = var_create_dataset(grp, var, write_dimid)))
2502 if (write_dimid && var->ndims)
2503 if ((retval = write_netcdf4_dimid(var->hdf_datasetid, var->dimids[0])))
2507 if (replace_existing_var)
2513 if ((retval = rec_reattach_scales(grp->nc4_info->root_grp,
2514 var->dimids[0], var->hdf_datasetid)))
2521 if (var->dimscale_attached)
2522 memset(var->dimscale_attached, 0,
sizeof(nc_bool_t) * var->ndims);
2527 var->was_coord_var = NC_FALSE;
2528 var->became_coord_var = NC_FALSE;
2531 if (var->attr_dirty)
2534 if ((retval = write_attlist(var->att, var->varid, grp)))
2536 var->attr_dirty = NC_FALSE;
2557 write_dim(NC_DIM_INFO_T *dim, NC_GRP_INFO_T *grp, nc_bool_t write_dimid)
2566 if (0 == dim->hdf_dimscaleid)
2568 hid_t spaceid, create_propid;
2569 hsize_t dims[1], max_dims[1], chunk_dims[1] = {1};
2572 LOG((4,
"%s: creating dim %s", __func__, dim->name));
2575 assert(NULL == dim->coord_var);
2580 if ((create_propid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
2584 if (H5Pset_obj_track_times(create_propid,0)<0)
2588 max_dims[0] = dim->len;
2591 max_dims[0] = H5S_UNLIMITED;
2592 if (H5Pset_chunk(create_propid, 1, chunk_dims) < 0)
2597 if ((spaceid = H5Screate_simple(1, dims, max_dims)) < 0)
2600 if (H5Pset_attr_creation_order(create_propid, H5P_CRT_ORDER_TRACKED|
2601 H5P_CRT_ORDER_INDEXED) < 0)
2605 LOG((4,
"%s: about to H5Dcreate1 a dimscale dataset %s", __func__, dim->name));
2606 if ((dim->hdf_dimscaleid = H5Dcreate1(grp->hdf_grpid, dim->name, H5T_IEEE_F32BE,
2607 spaceid, create_propid)) < 0)
2611 if (H5Sclose(spaceid) < 0)
2613 if (H5Pclose(create_propid) < 0)
2619 sprintf(dimscale_wo_var,
"%s%10d", DIM_WITHOUT_VARIABLE, (
int)dim->len);
2620 if (H5DSset_scale(dim->hdf_dimscaleid, dimscale_wo_var) < 0)
2627 NC_VAR_INFO_T *v1 = NULL;
2629 assert(dim->unlimited);
2633 for (i=0; i < grp->vars.nelems; i++)
2635 if (grp->vars.value[i] && !strcmp(grp->vars.value[i]->name, dim->name))
2637 v1 = grp->vars.value[i];
2643 hsize_t *new_size = NULL;
2648 if (!(new_size = malloc(v1->ndims *
sizeof(hsize_t))))
2650 for (d1 = 0; d1 < v1->ndims; d1++)
2652 assert(v1->dim[d1] && v1->dim[d1]->dimid == v1->dimids[d1]);
2653 new_size[d1] = v1->dim[d1]->len;
2655 if (H5Dset_extent(v1->hdf_datasetid, new_size) < 0) {
2667 if (write_dimid && dim->hdf_dimscaleid)
2668 if ((retval = write_netcdf4_dimid(dim->hdf_dimscaleid, dim->dimid)))
2694 nc4_rec_detect_need_to_preserve_dimids(NC_GRP_INFO_T *grp, nc_bool_t *bad_coord_orderp)
2697 NC_GRP_INFO_T *child_grp;
2698 int last_dimid = -1;
2703 for (i=0; i < grp->vars.nelems; i++)
2705 var = grp->vars.value[i];
2708 if (var->dimscale && var->ndims)
2714 if (var->dimids[0] < last_dimid)
2716 LOG((5,
"%s: %s is out of order coord var", __func__, var->name));
2717 *bad_coord_orderp = NC_TRUE;
2720 last_dimid = var->dimids[0];
2727 LOG((5,
"%s: %s is multidimensional coord var", __func__, var->name));
2728 *bad_coord_orderp = NC_TRUE;
2735 if (var->is_new_var || var->became_coord_var)
2737 LOG((5,
"%s: coord var defined after enddef/redef", __func__));
2738 *bad_coord_orderp = NC_TRUE;
2745 for (child_grp = grp->children; child_grp; child_grp = child_grp->l.next)
2746 if ((retval = nc4_rec_detect_need_to_preserve_dimids(child_grp, bad_coord_orderp)))
2765 nc4_rec_write_metadata(NC_GRP_INFO_T *grp, nc_bool_t bad_coord_order)
2767 NC_DIM_INFO_T *dim = NULL;
2768 NC_VAR_INFO_T *var = NULL;
2769 NC_GRP_INFO_T *child_grp = NULL;
2770 int coord_varid = -1;
2774 assert(grp && grp->name && grp->hdf_grpid);
2775 LOG((3,
"%s: grp->name %s, bad_coord_order %d", __func__, grp->name, bad_coord_order));
2778 if ((retval = write_attlist(grp->att,
NC_GLOBAL, grp)))
2783 if (var_index < grp->vars.nelems)
2784 var = grp->vars.value[var_index];
2791 nc_bool_t found_coord, wrote_coord;
2795 for (found_coord = NC_FALSE; dim && !found_coord; dim = dim->l.next)
2797 if (!dim->coord_var)
2799 if ((retval = write_dim(dim, grp, bad_coord_order)))
2804 coord_varid = dim->coord_var->varid;
2805 found_coord = NC_TRUE;
2811 for (wrote_coord = NC_FALSE; var && !wrote_coord; )
2813 if ((retval = write_var(var, grp, bad_coord_order)))
2815 if (found_coord && var->varid == coord_varid)
2816 wrote_coord = NC_TRUE;
2817 if (++var_index < grp->vars.nelems)
2818 var = grp->vars.value[var_index];
2824 if ((retval = attach_dimscales(grp)))
2828 for (child_grp = grp->children; child_grp; child_grp = child_grp->l.next)
2829 if ((retval = nc4_rec_write_metadata(child_grp, bad_coord_order)))
2845 nc4_rec_write_groups_types(NC_GRP_INFO_T *grp)
2847 NC_GRP_INFO_T *child_grp;
2848 NC_TYPE_INFO_T *type;
2851 assert(grp && grp->name);
2852 LOG((3,
"%s: grp->name %s", __func__, grp->name));
2855 if (!grp->hdf_grpid)
2856 if ((retval = create_group(grp)))
2862 if ((retval = write_nc3_strict_att(grp->hdf_grpid)))
2866 for (type = grp->type; type; type = type->l.next)
2867 if ((retval = commit_type(grp, type)))
2871 for (child_grp = grp->children; child_grp; child_grp = child_grp->l.next)
2872 if ((retval = nc4_rec_write_groups_types(child_grp)))
2906 nc4_convert_type(
const void *src,
void *dest,
2908 const size_t len,
int *range_error,
2909 const void *fill_value,
int strict_nc3,
int src_long,
2916 signed long *lp, *lp1;
2918 signed char *bp, *bp1;
2919 unsigned char *ubp, *ubp1;
2920 unsigned short *usp, *usp1;
2921 unsigned int *uip, *uip1;
2922 long long *lip, *lip1;
2923 unsigned long long *ulip, *ulip1;
2927 LOG((3,
"%s: len %d src_type %d dest_type %d src_long %d dest_long %d",
2928 __func__, len, src_type, dest_type, src_long, dest_long));
2944 for (cp = (
char *)src, cp1 = dest; count < len; count++)
2948 LOG((0,
"%s: Uknown destination type.", __func__));
2956 for (bp = (
signed char *)src, bp1 = dest; count < len; count++)
2960 for (bp = (
signed char *)src, ubp = dest; count < len; count++)
2968 for (bp = (
signed char *)src, sp = dest; count < len; count++)
2972 for (bp = (
signed char *)src, usp = dest; count < len; count++)
2982 for (bp = (
signed char *)src, lp = dest; count < len; count++)
2988 for (bp = (
signed char *)src, ip = dest; count < len; count++)
2993 for (bp = (
signed char *)src, uip = dest; count < len; count++)
3001 for (bp = (
signed char *)src, lip = dest; count < len; count++)
3005 for (bp = (
signed char *)src, ulip = dest; count < len; count++)
3013 for (bp = (
signed char *)src, fp = dest; count < len; count++)
3017 for (bp = (
signed char *)src, dp = dest; count < len; count++)
3021 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3022 __func__, src_type, dest_type));
3031 for (ubp = (
unsigned char *)src, bp = dest; count < len; count++)
3033 if (!strict_nc3 && *ubp > X_SCHAR_MAX)
3039 for (ubp = (
unsigned char *)src, sp = dest; count < len; count++)
3043 for (ubp = (
unsigned char *)src, ubp1 = dest; count < len; count++)
3047 for (ubp = (
unsigned char *)src, usp = dest; count < len; count++)
3053 for (ubp = (
unsigned char *)src, lp = dest; count < len; count++)
3059 for (ubp = (
unsigned char *)src, ip = dest; count < len; count++)
3064 for (ubp = (
unsigned char *)src, uip = dest; count < len; count++)
3068 for (ubp = (
unsigned char *)src, lip = dest; count < len; count++)
3072 for (ubp = (
unsigned char *)src, ulip = dest; count < len; count++)
3076 for (ubp = (
unsigned char *)src, fp = dest; count < len; count++)
3080 for (ubp = (
unsigned char *)src, dp = dest; count < len; count++)
3084 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3085 __func__, src_type, dest_type));
3094 for (sp = (
short *)src, ubp = dest; count < len; count++)
3096 if (*sp > X_UCHAR_MAX || *sp < 0)
3102 for (sp = (
short *)src, bp = dest; count < len; count++)
3104 if (*sp > X_SCHAR_MAX || *sp < X_SCHAR_MIN)
3110 for (sp = (
short *)src, sp1 = dest; count < len; count++)
3114 for (sp = (
short *)src, usp = dest; count < len; count++)
3123 for (sp = (
short *)src, lp = dest; count < len; count++)
3126 for (sp = (
short *)src, ip = dest; count < len; count++)
3130 for (sp = (
short *)src, uip = dest; count < len; count++)
3138 for (sp = (
short *)src, lip = dest; count < len; count++)
3142 for (sp = (
short *)src, ulip = dest; count < len; count++)
3150 for (sp = (
short *)src, fp = dest; count < len; count++)
3154 for (sp = (
short *)src, dp = dest; count < len; count++)
3158 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3159 __func__, src_type, dest_type));
3168 for (usp = (
unsigned short *)src, ubp = dest; count < len; count++)
3170 if (*usp > X_UCHAR_MAX)
3176 for (usp = (
unsigned short *)src, bp = dest; count < len; count++)
3178 if (*usp > X_SCHAR_MAX)
3184 for (usp = (
unsigned short *)src, sp = dest; count < len; count++)
3186 if (*usp > X_SHORT_MAX)
3192 for (usp = (
unsigned short *)src, usp1 = dest; count < len; count++)
3197 for (usp = (
unsigned short *)src, lp = dest; count < len; count++)
3200 for (usp = (
unsigned short *)src, ip = dest; count < len; count++)
3204 for (usp = (
unsigned short *)src, uip = dest; count < len; count++)
3208 for (usp = (
unsigned short *)src, lip = dest; count < len; count++)
3212 for (usp = (
unsigned short *)src, ulip = dest; count < len; count++)
3216 for (usp = (
unsigned short *)src, fp = dest; count < len; count++)
3220 for (usp = (
unsigned short *)src, dp = dest; count < len; count++)
3224 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3225 __func__, src_type, dest_type));
3236 for (lp = (
long *)src, ubp = dest; count < len; count++)
3238 if (*lp > X_UCHAR_MAX || *lp < 0)
3244 for (lp = (
long *)src, bp = dest; count < len; count++)
3246 if (*lp > X_SCHAR_MAX || *lp < X_SCHAR_MIN)
3252 for (lp = (
long *)src, sp = dest; count < len; count++)
3254 if (*lp > X_SHORT_MAX || *lp < X_SHORT_MIN)
3260 for (lp = (
long *)src, usp = dest; count < len; count++)
3262 if (*lp > X_USHORT_MAX || *lp < 0)
3270 for (lp = (
long *)src, lp1 = dest; count < len; count++)
3272 if (*lp > X_LONG_MAX || *lp < X_LONG_MIN)
3279 for (lp = (
long *)src, ip = dest; count < len; count++)
3281 if (*lp > X_INT_MAX || *lp < X_INT_MIN)
3288 for (lp = (
long *)src, uip = dest; count < len; count++)
3290 if (*lp > X_UINT_MAX || *lp < 0)
3296 for (lp = (
long *)src, lip = dest; count < len; count++)
3300 for (lp = (
long *)src, ulip = dest; count < len; count++)
3308 for (lp = (
long *)src, fp = dest; count < len; count++)
3312 for (lp = (
long *)src, dp = dest; count < len; count++)
3316 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3317 __func__, src_type, dest_type));
3326 for (ip = (
int *)src, ubp = dest; count < len; count++)
3328 if (*ip > X_UCHAR_MAX || *ip < 0)
3334 for (ip = (
int *)src, bp = dest; count < len; count++)
3336 if (*ip > X_SCHAR_MAX || *ip < X_SCHAR_MIN)
3342 for (ip = (
int *)src, sp = dest; count < len; count++)
3344 if (*ip > X_SHORT_MAX || *ip < X_SHORT_MIN)
3350 for (ip = (
int *)src, usp = dest; count < len; count++)
3352 if (*ip > X_USHORT_MAX || *ip < 0)
3360 for (ip = (
int *)src, lp1 = dest; count < len; count++)
3362 if (*ip > X_LONG_MAX || *ip < X_LONG_MIN)
3369 for (ip = (
int *)src, ip1 = dest; count < len; count++)
3371 if (*ip > X_INT_MAX || *ip < X_INT_MIN)
3378 for (ip = (
int *)src, uip = dest; count < len; count++)
3380 if (*ip > X_UINT_MAX || *ip < 0)
3386 for (ip = (
int *)src, lip = dest; count < len; count++)
3390 for (ip = (
int *)src, ulip = dest; count < len; count++)
3398 for (ip = (
int *)src, fp = dest; count < len; count++)
3402 for (ip = (
int *)src, dp = dest; count < len; count++)
3406 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3407 __func__, src_type, dest_type));
3417 for (uip = (
unsigned int *)src, ubp = dest; count < len; count++)
3419 if (*uip > X_UCHAR_MAX)
3425 for (uip = (
unsigned int *)src, bp = dest; count < len; count++)
3427 if (*uip > X_SCHAR_MAX)
3433 for (uip = (
unsigned int *)src, sp = dest; count < len; count++)
3435 if (*uip > X_SHORT_MAX)
3441 for (uip = (
unsigned int *)src, usp = dest; count < len; count++)
3443 if (*uip > X_USHORT_MAX)
3450 for (uip = (
unsigned int *)src, lp = dest; count < len; count++)
3452 if (*uip > X_LONG_MAX)
3457 for (uip = (
unsigned int *)src, ip = dest; count < len; count++)
3459 if (*uip > X_INT_MAX)
3465 for (uip = (
unsigned int *)src, uip1 = dest; count < len; count++)
3467 if (*uip > X_UINT_MAX)
3473 for (uip = (
unsigned int *)src, lip = dest; count < len; count++)
3477 for (uip = (
unsigned int *)src, ulip = dest; count < len; count++)
3481 for (uip = (
unsigned int *)src, fp = dest; count < len; count++)
3485 for (uip = (
unsigned int *)src, dp = dest; count < len; count++)
3489 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3490 __func__, src_type, dest_type));
3499 for (lip = (
long long *)src, ubp = dest; count < len; count++)
3501 if (*lip > X_UCHAR_MAX || *lip < 0)
3507 for (lip = (
long long *)src, bp = dest; count < len; count++)
3509 if (*lip > X_SCHAR_MAX || *lip < X_SCHAR_MIN)
3515 for (lip = (
long long *)src, sp = dest; count < len; count++)
3517 if (*lip > X_SHORT_MAX || *lip < X_SHORT_MIN)
3523 for (lip = (
long long *)src, usp = dest; count < len; count++)
3525 if (*lip > X_USHORT_MAX || *lip < 0)
3531 for (lip = (
long long *)src, uip = dest; count < len; count++)
3533 if (*lip > X_UINT_MAX || *lip < 0)
3540 for (lip = (
long long *)src, lp = dest; count < len; count++)
3542 if (*lip > X_LONG_MAX || *lip < X_LONG_MIN)
3547 for (lip = (
long long *)src, ip = dest; count < len; count++)
3549 if (*lip > X_INT_MAX || *lip < X_INT_MIN)
3555 for (lip = (
long long *)src, lip1 = dest; count < len; count++)
3559 for (lip = (
long long *)src, ulip = dest; count < len; count++)
3567 for (lip = (
long long *)src, fp = dest; count < len; count++)
3571 for (lip = (
long long *)src, dp = dest; count < len; count++)
3575 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3576 __func__, src_type, dest_type));
3585 for (ulip = (
unsigned long long *)src, ubp = dest; count < len; count++)
3587 if (*ulip > X_UCHAR_MAX)
3593 for (ulip = (
unsigned long long *)src, bp = dest; count < len; count++)
3595 if (*ulip > X_SCHAR_MAX)
3601 for (ulip = (
unsigned long long *)src, sp = dest; count < len; count++)
3603 if (*ulip > X_SHORT_MAX)
3609 for (ulip = (
unsigned long long *)src, usp = dest; count < len; count++)
3611 if (*ulip > X_USHORT_MAX)
3617 for (ulip = (
unsigned long long *)src, uip = dest; count < len; count++)
3619 if (*ulip > X_UINT_MAX)
3626 for (ulip = (
unsigned long long *)src, lp = dest; count < len; count++)
3628 if (*ulip > X_LONG_MAX)
3633 for (ulip = (
unsigned long long *)src, ip = dest; count < len; count++)
3635 if (*ulip > X_INT_MAX)
3641 for (ulip = (
unsigned long long *)src, lip = dest; count < len; count++)
3643 if (*ulip > X_INT64_MAX)
3649 for (ulip = (
unsigned long long *)src, ulip1 = dest; count < len; count++)
3653 for (ulip = (
unsigned long long *)src, fp = dest; count < len; count++)
3657 for (ulip = (
unsigned long long *)src, dp = dest; count < len; count++)
3661 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3662 __func__, src_type, dest_type));
3671 for (fp = (
float *)src, ubp = dest; count < len; count++)
3673 if (*fp > X_UCHAR_MAX || *fp < 0)
3679 for (fp = (
float *)src, bp = dest; count < len; count++)
3681 if (*fp > (
double)X_SCHAR_MAX || *fp < (
double)X_SCHAR_MIN)
3687 for (fp = (
float *)src, sp = dest; count < len; count++)
3689 if (*fp > (
double)X_SHORT_MAX || *fp < (
double)X_SHORT_MIN)
3695 for (fp = (
float *)src, usp = dest; count < len; count++)
3697 if (*fp > X_USHORT_MAX || *fp < 0)
3703 for (fp = (
float *)src, uip = dest; count < len; count++)
3705 if (*fp > X_UINT_MAX || *fp < 0)
3712 for (fp = (
float *)src, lp = dest; count < len; count++)
3714 if (*fp > (
double)X_LONG_MAX || *fp < (
double)X_LONG_MIN)
3719 for (fp = (
float *)src, ip = dest; count < len; count++)
3721 if (*fp > (
double)X_INT_MAX || *fp < (
double)X_INT_MIN)
3727 for (fp = (
float *)src, lip = dest; count < len; count++)
3729 if (*fp > X_INT64_MAX || *fp <X_INT64_MIN)
3735 for (fp = (
float *)src, lip = dest; count < len; count++)
3737 if (*fp > X_UINT64_MAX || *fp < 0)
3743 for (fp = (
float *)src, fp1 = dest; count < len; count++)
3751 for (fp = (
float *)src, dp = dest; count < len; count++)
3755 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3756 __func__, src_type, dest_type));
3765 for (dp = (
double *)src, ubp = dest; count < len; count++)
3767 if (*dp > X_UCHAR_MAX || *dp < 0)
3773 for (dp = (
double *)src, bp = dest; count < len; count++)
3775 if (*dp > X_SCHAR_MAX || *dp < X_SCHAR_MIN)
3781 for (dp = (
double *)src, sp = dest; count < len; count++)
3783 if (*dp > X_SHORT_MAX || *dp < X_SHORT_MIN)
3789 for (dp = (
double *)src, usp = dest; count < len; count++)
3791 if (*dp > X_USHORT_MAX || *dp < 0)
3797 for (dp = (
double *)src, uip = dest; count < len; count++)
3799 if (*dp > X_UINT_MAX || *dp < 0)
3806 for (dp = (
double *)src, lp = dest; count < len; count++)
3808 if (*dp > X_LONG_MAX || *dp < X_LONG_MIN)
3813 for (dp = (
double *)src, ip = dest; count < len; count++)
3815 if (*dp > X_INT_MAX || *dp < X_INT_MIN)
3821 for (dp = (
double *)src, lip = dest; count < len; count++)
3823 if (*dp > X_INT64_MAX || *dp < X_INT64_MIN)
3829 for (dp = (
double *)src, lip = dest; count < len; count++)
3831 if (*dp > X_UINT64_MAX || *dp < 0)
3837 for (dp = (
double *)src, fp = dest; count < len; count++)
3839 if (*dp > X_FLOAT_MAX || *dp < X_FLOAT_MIN)
3845 for (dp = (
double *)src, dp1 = dest; count < len; count++)
3853 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3854 __func__, src_type, dest_type));
3860 LOG((0,
"%s: unexpected src type. src_type %d, dest_type %d",
3861 __func__, src_type, dest_type));
3880 nc4_rec_match_dimscales(NC_GRP_INFO_T *grp)
3888 assert(grp && grp->name);
3889 LOG((4,
"%s: grp->name %s", __func__, grp->name));
3892 for (g = grp->children; g; g = g->l.next)
3893 if ((retval = nc4_rec_match_dimscales(g)))
3898 for (i=0; i < grp->vars.nelems; i++)
3902 var = grp->vars.value[i];
3906 for (d = 0; d < ndims; d++)
3908 if (var->dim[d] == NULL) {
3909 nc4_find_dim(grp, var->dimids[d], &var->dim[d], NULL);
3920 if (var->dimscale_hdf5_objids)
3922 for (d = 0; d < var->ndims; d++)
3924 nc_bool_t finished = NC_FALSE;
3926 LOG((5,
"%s: var %s has dimscale info...", __func__, var->name));
3929 for (g = grp; g && !finished; g = g->parent)
3931 for (dim = g->dim; dim; dim = dim->l.next)
3933 if (var->dimscale_hdf5_objids[d].fileno[0] == dim->hdf5_objid.fileno[0] &&
3934 var->dimscale_hdf5_objids[d].objno[0] == dim->hdf5_objid.objno[0] &&
3935 var->dimscale_hdf5_objids[d].fileno[1] == dim->hdf5_objid.fileno[1] &&
3936 var->dimscale_hdf5_objids[d].objno[1] == dim->hdf5_objid.objno[1])
3938 LOG((4,
"%s: for dimension %d, found dim %s",
3939 __func__, d, dim->name));
3940 var->dimids[d] = dim->dimid;
3947 LOG((5,
"%s: dimid for this dimscale is %d", __func__, var->type_info->nc_typeid));
3954 hsize_t *h5dimlen = NULL, *h5dimlenmax = NULL;
3958 if ((spaceid = H5Dget_space(var->hdf_datasetid)) < 0)
3964 if (!(h5dimlen = malloc(var->ndims *
sizeof(hsize_t))))
3966 if (!(h5dimlenmax = malloc(var->ndims *
sizeof(hsize_t))))
3971 if ((dataset_ndims = H5Sget_simple_extent_dims(spaceid, h5dimlen,
3972 h5dimlenmax)) < 0) {
3977 if (dataset_ndims != var->ndims) {
3986 if (H5Sget_simple_extent_type(spaceid) != H5S_SCALAR)
3991 if (H5Sclose(spaceid) < 0) {
4000 for (d = 0; d < var->ndims; d++)
4003 for (dim = grp->dim; dim; dim = dim->l.next)
4004 if ((dim->len == h5dimlen[d]) &&
4005 ((h5dimlenmax[d] == H5S_UNLIMITED && dim->unlimited) ||
4006 (h5dimlenmax[d] != H5S_UNLIMITED && !dim->unlimited)))
4014 LOG((3,
"%s: creating phony dim for var %s", __func__, var->name));
4015 if ((retval = nc4_dim_list_add(&grp->dim, &dim))) {
4020 dim->dimid = grp->nc4_info->next_dimid++;
4021 sprintf(phony_dim_name,
"phony_dim_%d", dim->dimid);
4022 if (!(dim->name = strdup(phony_dim_name))) {
4027 dim->len = h5dimlen[d];
4028 dim->hash = hash_fast(phony_dim_name, strlen(phony_dim_name));
4029 if (h5dimlenmax[d] == H5S_UNLIMITED)
4030 dim->unlimited = NC_TRUE;
4034 var->dimids[d] = dim->dimid;
4062 nc4_get_typelen_mem(NC_HDF5_FILE_INFO_T *h5,
nc_type xtype,
int is_long,
4065 NC_TYPE_INFO_T *type;
4068 LOG((4,
"%s xtype: %d", __func__, xtype));
4077 *len =
sizeof(char);
4081 *len =
sizeof(short);
4086 *len =
sizeof(long);
4091 *len =
sizeof(float);
4094 *len =
sizeof(double);
4098 *len =
sizeof(
long long);
4101 *len =
sizeof(
char *);
4106 if ((retval = nc4_find_type(h5, xtype, &type)))
4114 LOG((5,
"type->size: %d", type->size));
4132 nc4_get_typeclass(
const NC_HDF5_FILE_INFO_T *h5,
nc_type xtype,
int *type_class)
4136 LOG((4,
"%s xtype: %d", __func__, xtype));
4176 NC_TYPE_INFO_T *type;
4179 if ((retval = nc4_find_type(h5, xtype, &type)))
4184 *type_class = type->nc_type_class;
4201 reportobject(
int log, hid_t
id,
unsigned int type)
4205 const char*
typename = NULL;
4207 len = H5Iget_name(
id, name,
MAXNAME);
4212 case H5F_OBJ_FILE:
typename =
"File";
break;
4213 case H5F_OBJ_DATASET:
typename =
"Dataset";
break;
4214 case H5F_OBJ_GROUP:
typename =
"Group";
break;
4215 case H5F_OBJ_DATATYPE:
typename =
"Datatype";
break;
4217 typename =
"Attribute";
4218 len = H5Aget_name(
id,
MAXNAME, name);
4219 if(len < 0) len = 0;
4222 default:
typename =
"<unknown>";
break;
4226 LOG((0,
"Type = %s(%8" PRId64
") name='%s'",
typename,
id,name));
4229 fprintf(stderr,
"Type = %s(%8" PRId64
") name='%s'",
typename,
id,name);
4244 reportopenobjectsT(
int log, hid_t fid,
int ntypes,
unsigned int* otypes)
4248 size_t maxobjs = -1;
4249 hid_t* idlist = NULL;
4253 LOG((0,
"\nReport: open objects on %" PRId64
"\n",fid));
4256 fprintf(stdout,
"\nReport: open objects on %" PRId64
"\n",fid);
4258 maxobjs = H5Fget_obj_count(fid,H5F_OBJ_ALL);
4259 if(idlist != NULL) free(idlist);
4260 idlist = (hid_t*)malloc(
sizeof(hid_t)*maxobjs);
4261 for(t=0;t<ntypes;t++) {
4262 unsigned int ot = otypes[t];
4263 ocount = H5Fget_obj_ids(fid,ot,maxobjs,idlist);
4264 for(i=0;i<ocount;i++) {
4265 hid_t o = idlist[i];
4266 reportobject(log,o,ot);
4269 if(idlist != NULL) free(idlist);
4281 reportopenobjects(
int log, hid_t fid)
4283 reportopenobjectsT(log, fid,5,OTYPES);
4298 NC4_hdf5get_libversion(
unsigned* major,
unsigned* minor,
unsigned* release)
4300 if(H5get_libversion(major,minor,release) < 0)
4316 NC4_hdf5get_superblock(
struct NC_HDF5_FILE_INFO* h5,
int* idp)
4321 if((plist = H5Fget_create_plist(h5->hdfid)) < 0)
4323 if(H5Pget_version(plist, &super, NULL, NULL, NULL) < 0)
4325 if(idp) *idp = (int)super;
4327 if(plist >= 0) H5Pclose(plist);
4331 static int NC4_get_strict_att(NC_HDF5_FILE_INFO_T*);
4332 static int NC4_walk(hid_t,
int*);
4359 NC4_isnetcdf4(
struct NC_HDF5_FILE_INFO* h5)
4366 isnc4 = NC4_get_strict_att(h5);
4372 stat = NC4_walk(h5->root_grp->hdf_grpid, &count);
4376 isnc4 = (count >= 2);
4391 NC4_get_strict_att(NC_HDF5_FILE_INFO_T* h5)
4397 grp = h5->root_grp->hdf_grpid;
4399 attid = H5Aopen_name(grp, NC3_STRICT_ATT_NAME);
4414 NC4_walk(hid_t gid,
int* countp)
4423 char name[NC_HDF5_MAX_NAME];
4426 err = H5Gget_num_objs(gid, &nobj);
4427 if(err < 0)
return err;
4429 for(i = 0; i < nobj; i++) {
4431 len = H5Gget_objname_by_idx(gid,(hsize_t)i,name,(
size_t)NC_HDF5_MAX_NAME);
4432 if(len < 0)
return len;
4434 otype = H5Gget_objtype_by_idx(gid,(
size_t)i);
4437 grpid = H5Gopen(gid,name);
4438 NC4_walk(grpid,countp);
4443 if(strcmp(name,
"phony_dim")==0)
4444 *countp = *countp + 1;
4445 dsid = H5Dopen(gid,name);
4446 na = H5Aget_num_attrs(dsid);
4447 for(j = 0; j < na; j++) {
4448 hid_t aid = H5Aopen_idx(dsid,(
unsigned int) j);
4451 ssize_t len = H5Aget_name(aid, NC_HDF5_MAX_NAME, name);
4452 if(len < 0)
return len;
4454 for(p=NC_RESERVED_VARATT_LIST;*p;p++) {
4455 if(strcmp(name,*p) == 0) {
4456 *countp = *countp + 1;
#define NC_FILL_UBYTE
Default fill value.
#define NC_ENOMEM
Memory allocation (malloc) failure.
#define NC_CHAR
ISO/ASCII character.
#define NC_FILL_CHAR
Default fill value.
#define NC_UBYTE
unsigned 1 byte int
#define NC_EDIMSCALE
Problem with HDF5 dimscales.
#define NC_CLASSIC_MODEL
Enforce classic model on netCDF-4.
#define NC_ERANGE
Math result not representable.
#define NC_MAX_VAR_DIMS
max per variable dimensions
#define NC_FILL_UINT
Default fill value.
#define NC_UINT
unsigned 4-byte int
#define NC_EHDFERR
Error at HDF5 layer.
#define NC_OPAQUE
opaque types
#define NC_EINVALCOORDS
Index exceeds dimension bound.
#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.
#define NC_ECANTEXTEND
Attempt to extend dataset during ind.
Main header file for the Parallel C API.
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 H5Z_FILTER_SZIP
ID of HDF SZIP filter.
#define NC_BYTE
signed 1 byte integer
#define NC_EINDEFINE
Operation not allowed in define mode.
#define NC_FILL_INT
Default fill value.
size_t len
Length of VL data (in base type units)
#define NC_ENDIAN_LITTLE
In HDF5 files you can set the endianness of variables with nc_def_var_endian().
#define NC_EATTMETA
Problem with attribute metadata.
#define NC_VLEN
vlen (variable-length) types
#define NC_EMPI
MPI operation failed.
#define NC_EFILEMETA
Problem with file metadata.
#define NC_EFILTER
Filter operation failed.
#define NC_EBADTYPE
Not a netcdf data type.
#define NC_EEDGE
Start+count exceeds dimension bound.
#define NC_EDIMMETA
Problem with dimension metadata.
#define NC_EINVAL
Invalid Argument.
#define NC_INT
signed 4 byte integer
#define NC_ENDIAN_BIG
In HDF5 files you can set the endianness of variables with nc_def_var_endian().
#define NC_MAX_NAME
Maximum for classic library.
void * p
Pointer to VL data.
#define NC_NAT
Not A Type.
EXTERNL int nc_free_vlen(nc_vlen_t *vl)
Free memory in a VLEN object.
#define NC_USHORT
unsigned 2-byte int
#define NC_EPARINIT
Error initializing for parallel access.
#define NC_FILL_FLOAT
Default fill value.
#define NC_EVARMETA
Problem with variable metadata.
This is the type of arrays of vlens.
#define NC_SHORT
signed 2 byte integer
#define NC_ENDIAN_NATIVE
In HDF5 files you can set the endianness of variables with nc_def_var_endian().
#define NC_ENOTVAR
Variable not found.
#define MAXNAME
Max HDF5 name.
#define NC_EPERM
Write to read only.
#define NC_NOERR
No Error.
#define NC_ENUM
enum types
#define NC_ECHAR
Attempt to convert between text & numbers.
#define NC_FILL_SHORT
Default fill value.
#define NC_FILL_DOUBLE
Default fill value.
#define NC_COMPOUND
compound types
#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