19 #include "nc4internal.h" 20 #include "nc4dispatch.h" 21 #include <H5DSpublic.h> 28 #define NC3_STRICT_ATT_NAME "_nc3_strict" 30 #define NC_HDF5_MAX_NAME 1024 35 static unsigned int OTYPES[5] = {H5F_OBJ_FILE, H5F_OBJ_DATASET, H5F_OBJ_GROUP, 36 H5F_OBJ_DATATYPE, H5F_OBJ_ATTR};
46 flag_atts_dirty(NC_ATT_INFO_T **attlist) {
48 NC_ATT_INFO_T *att = NULL;
54 for(att = *attlist; att; att = att->l.next) {
79 rec_reattach_scales(NC_GRP_INFO_T *grp,
int dimid, hid_t dimscaleid)
82 NC_GRP_INFO_T *child_grp;
86 assert(grp && grp->name && dimid >= 0 && dimscaleid >= 0);
87 LOG((3,
"%s: grp->name %s", __func__, grp->name));
90 for (child_grp = grp->children; child_grp; child_grp = child_grp->l.next)
91 if ((retval = rec_reattach_scales(child_grp, dimid, dimscaleid)))
95 for (i=0; i < grp->vars.nelems; i++)
97 var = grp->vars.value[i];
99 for (d = 0; d < var->ndims; d++)
100 if (var->dimids[d] == dimid && !var->dimscale)
102 LOG((2,
"%s: attaching scale for dimid %d to var %s",
103 __func__, var->dimids[d], var->name));
106 if (H5DSattach_scale(var->hdf_datasetid, dimscaleid, d) < 0)
108 var->dimscale_attached[d] = NC_TRUE;
132 rec_detach_scales(NC_GRP_INFO_T *grp,
int dimid, hid_t dimscaleid)
135 NC_GRP_INFO_T *child_grp;
139 assert(grp && grp->name && dimid >= 0 && dimscaleid >= 0);
140 LOG((3,
"%s: grp->name %s", __func__, grp->name));
143 for (child_grp = grp->children; child_grp; child_grp = child_grp->l.next)
144 if ((retval = rec_detach_scales(child_grp, dimid, dimscaleid)))
148 for (i=0; i < grp->vars.nelems; i++)
150 var = grp->vars.value[i];
152 for (d = 0; d < var->ndims; d++)
153 if (var->dimids[d] == dimid && !var->dimscale)
155 LOG((2,
"%s: detaching scale for dimid %d to var %s",
156 __func__, var->dimids[d], var->name));
158 if (var->dimscale_attached && var->dimscale_attached[d])
160 if (H5DSdetach_scale(var->hdf_datasetid, dimscaleid, d) < 0)
162 var->dimscale_attached[d] = NC_FALSE;
181 nc4_open_var_grp2(NC_GRP_INFO_T *grp,
int varid, hid_t *dataset)
186 if (varid < 0 || varid >= grp->vars.nelems)
188 var = grp->vars.value[varid];
190 assert(var->varid == varid);
193 if (!var->hdf_datasetid)
194 if ((var->hdf_datasetid = H5Dopen2(grp->hdf_grpid, var->name,
198 *dataset = var->hdf_datasetid;
215 nc4_get_default_fill_value(
const NC_TYPE_INFO_T *type_info,
void *fill_value)
217 switch (type_info->nc_typeid)
286 get_fill_value(NC_HDF5_FILE_INFO_T *h5, NC_VAR_INFO_T *var,
void **fillp)
292 if (var->type_info->nc_type_class ==
NC_VLEN)
294 else if (var->type_info->nc_type_class ==
NC_STRING)
295 size =
sizeof(
char *);
298 if ((retval = nc4_get_typelen_mem(h5, var->type_info->nc_typeid, 0, &size)))
304 if (!((*fillp) = calloc(1, size)))
311 LOG((4,
"Found a fill value for var %s", var->name));
312 if (var->type_info->nc_type_class ==
NC_VLEN)
316 fv_vlen->
len = in_vlen->
len;
317 if (!(fv_vlen->p = malloc(size * in_vlen->
len)))
323 memcpy(fv_vlen->p, in_vlen->
p, in_vlen->
len * size);
325 else if (var->type_info->nc_type_class ==
NC_STRING)
327 if (*(
char **)var->fill_value)
328 if (!(**(
char ***)fillp = strdup(*(
char **)var->fill_value)))
336 memcpy((*fillp), var->fill_value, size);
340 if (nc4_get_default_fill_value(var->type_info, *fillp))
369 nc4_get_hdf_typeid(NC_HDF5_FILE_INFO_T *h5,
nc_type xtype,
370 hid_t *hdf_typeid,
int endianness)
372 NC_TYPE_INFO_T *type;
376 assert(hdf_typeid && h5);
389 if ((
typeid = H5Tcopy(H5T_C_S1)) < 0)
391 if (H5Tset_strpad(
typeid, H5T_STR_NULLTERM) < 0)
393 if(H5Tset_cset(
typeid, H5T_CSET_ASCII) < 0)
397 *hdf_typeid =
typeid;
402 if ((
typeid = H5Tcopy(H5T_C_S1)) < 0)
404 if (H5Tset_size(
typeid, H5T_VARIABLE) < 0)
406 if(H5Tset_cset(
typeid, H5T_CSET_UTF8) < 0)
410 *hdf_typeid =
typeid;
421 typeid = H5T_STD_I8LE;
423 typeid = H5T_STD_I8BE;
425 typeid = H5T_NATIVE_SCHAR;
430 typeid = H5T_STD_I16LE;
432 typeid = H5T_STD_I16BE;
434 typeid = H5T_NATIVE_SHORT;
439 typeid = H5T_STD_I32LE;
441 typeid = H5T_STD_I32BE;
443 typeid = H5T_NATIVE_INT;
448 typeid = H5T_STD_U8LE;
450 typeid = H5T_STD_U8BE;
452 typeid = H5T_NATIVE_UCHAR;
457 typeid = H5T_STD_U16LE;
459 typeid = H5T_STD_U16BE;
461 typeid = H5T_NATIVE_USHORT;
466 typeid = H5T_STD_U32LE;
468 typeid = H5T_STD_U32BE;
470 typeid = H5T_NATIVE_UINT;
475 typeid = H5T_STD_I64LE;
477 typeid = H5T_STD_I64BE;
479 typeid = H5T_NATIVE_LLONG;
484 typeid = H5T_STD_U64LE;
486 typeid = H5T_STD_U64BE;
488 typeid = H5T_NATIVE_ULLONG;
493 typeid = H5T_IEEE_F32LE;
495 typeid = H5T_IEEE_F32BE;
497 typeid = H5T_NATIVE_FLOAT;
502 typeid = H5T_IEEE_F64LE;
504 typeid = H5T_IEEE_F64BE;
506 typeid = H5T_NATIVE_DOUBLE;
511 if (nc4_find_type(h5, xtype, &type))
515 typeid = type->hdf_typeid;
521 if ((*hdf_typeid = H5Tcopy(
typeid)) < 0)
525 assert(*hdf_typeid != -1);
528 if (
typeid > 0 && H5Tclose(
typeid) < 0)
546 check_for_vara(
nc_type *mem_nc_type, NC_VAR_INFO_T *var, NC_HDF5_FILE_INFO_T *h5)
553 if (*mem_nc_type ==
NC_NAT)
554 *mem_nc_type = var->type_info->nc_typeid;
555 assert(*mem_nc_type);
558 if (var->type_info->nc_typeid != *mem_nc_type &&
559 (var->type_info->nc_typeid ==
NC_CHAR || *mem_nc_type ==
NC_CHAR))
563 if (h5->flags & NC_INDEF)
567 if ((retval = nc4_enddef_netcdf4_file(h5)))
579 log_dim_info(NC_VAR_INFO_T *var, hsize_t *fdims, hsize_t *fmaxdims,
580 hsize_t *start, hsize_t *count)
585 LOG((4,
"%s: var name %s ndims %d", __func__, var->name, var->ndims));
586 LOG((4,
"File space, and requested:"));
587 for (d2 = 0; d2 < var->ndims; d2++)
589 LOG((4,
"fdims[%d]=%Ld fmaxdims[%d]=%Ld", d2, fdims[d2], d2,
591 LOG((4,
"start[%d]=%Ld count[%d]=%Ld", d2, start[d2], d2, count[d2]));
609 set_par_access(NC_HDF5_FILE_INFO_T *h5, NC_VAR_INFO_T *var, hid_t xfer_plistid)
616 H5FD_mpio_xfer_t hdf5_xfer_mode;
620 H5FD_MPIO_COLLECTIVE : H5FD_MPIO_INDEPENDENT;
623 if (H5Pset_dxpl_mpio(xfer_plistid, hdf5_xfer_mode) < 0)
626 LOG((4,
"%s: %d H5FD_MPIO_COLLECTIVE: %d H5FD_MPIO_INDEPENDENT: %d",
627 __func__, (
int)hdf5_xfer_mode, H5FD_MPIO_COLLECTIVE, H5FD_MPIO_INDEPENDENT));
658 nc4_put_vara(NC *nc,
int ncid,
int varid,
const size_t *startp,
659 const size_t *countp,
nc_type mem_nc_type,
int is_long,
void *data)
662 NC_HDF5_FILE_INFO_T *h5;
665 hid_t file_spaceid = 0, mem_spaceid = 0, xfer_plistid = 0;
670 int need_to_extend = 0;
672 int extend_possible = 0;
674 int retval =
NC_NOERR, range_error = 0, i, d2;
677 int need_to_convert = 0;
681 hid_t mem_typeid = 0;
686 if ((retval = nc4_find_g_var_nc(nc, ncid, varid, &grp, &var)))
689 assert(grp && h5 && var && var->name);
691 LOG((3,
"%s: var->name %s mem_nc_type %d is_long %d",
692 __func__, var->name, mem_nc_type, is_long));
696 if ((retval = check_for_vara(&mem_nc_type, var, h5)))
700 for (i = 0; i < var->ndims; i++)
702 start[i] = startp[i];
703 count[i] = countp[i];
709 if (var->hdf5_name && strlen(var->hdf5_name) >= strlen(NON_COORD_PREPEND) &&
710 strncmp(var->hdf5_name, NON_COORD_PREPEND, strlen(NON_COORD_PREPEND)) == 0 &&
712 name_to_use = var->hdf5_name;
714 name_to_use = var->name;
715 if (!var->hdf_datasetid)
716 if ((var->hdf_datasetid = H5Dopen2(grp->hdf_grpid, name_to_use, H5P_DEFAULT)) < 0)
720 if ((file_spaceid = H5Dget_space(var->hdf_datasetid)) < 0)
726 if (H5Sget_simple_extent_dims(file_spaceid, fdims, fmaxdims) < 0)
730 log_dim_info(var, fdims, fmaxdims, start, count);
735 for (d2 = 0; d2 < var->ndims; d2++)
738 assert(dim && dim->dimid == var->dimids[d2]);
741 #ifdef RELAX_COORD_BOUND 742 if (start[d2] > (hssize_t)fdims[d2] ||
743 (start[d2] == (hssize_t)fdims[d2] && count[d2] > 0))
745 if (start[d2] >= (hssize_t)fdims[d2])
748 if (start[d2] + count[d2] > fdims[d2])
757 if (H5Sget_simple_extent_type(file_spaceid) == H5S_SCALAR)
759 if ((mem_spaceid = H5Screate(H5S_SCALAR)) < 0)
764 if (H5Sselect_hyperslab(file_spaceid, H5S_SELECT_SET, start, NULL,
770 if ((mem_spaceid = H5Screate_simple(var->ndims, count, NULL)) < 0)
777 if ((mem_nc_type != var->type_info->nc_typeid || (var->type_info->nc_typeid ==
NC_INT && is_long)) &&
780 size_t file_type_size;
785 for (d2=0; d2<var->ndims; d2++)
787 LOG((4,
"converting data for var %s type=%d len=%d", var->name,
788 var->type_info->nc_typeid, len));
792 assert(var->type_info->size);
793 file_type_size = var->type_info->size;
799 if (!(bufr = malloc(len * file_type_size)))
808 if ((retval = nc4_get_hdf_typeid(h5, mem_nc_type, &mem_typeid,
809 var->type_info->endianness)))
814 if ((xfer_plistid = H5Pcreate(H5P_DATASET_XFER)) < 0)
821 if (H5Pset_type_conv_cb(xfer_plistid, except_func, &range_error) < 0)
827 if ((retval = set_par_access(h5, var, xfer_plistid)))
837 for (d2 = 0; d2 < var->ndims; d2++)
840 assert(dim && dim->dimid == var->dimids[d2]);
846 if (start[d2] + count[d2] > fdims[d2])
848 xtend_size[d2] = (
long long unsigned)(start[d2] + count[d2]);
852 xtend_size[d2] = (
long long unsigned)fdims[d2];
854 if (start[d2] + count[d2] > dim->len)
856 dim->len = start[d2] + count[d2];
857 dim->extended = NC_TRUE;
862 xtend_size[d2] = (
long long unsigned)dim->len;
868 if (extend_possible && h5->parallel &&
NC_COLLECTIVE == var->parallel_access)
873 if(MPI_SUCCESS != MPI_Allreduce(MPI_IN_PLACE, &need_to_extend, 1, MPI_INT, MPI_BOR, h5->comm))
882 LOG((4,
"extending dataset"));
890 if(MPI_SUCCESS != MPI_Allreduce(MPI_IN_PLACE, xtend_size, var->ndims, MPI_UNSIGNED_LONG_LONG, MPI_MAX, h5->comm))
895 for (d2 = 0; d2 < var->ndims; d2++)
896 fdims[d2] = (hsize_t)xtend_size[d2];
898 if (H5Dset_extent(var->hdf_datasetid, fdims) < 0)
900 if (file_spaceid > 0 && H5Sclose(file_spaceid) < 0)
902 if ((file_spaceid = H5Dget_space(var->hdf_datasetid)) < 0)
904 if (H5Sselect_hyperslab(file_spaceid, H5S_SELECT_SET,
905 start, NULL, count, NULL) < 0)
914 if ((retval = nc4_convert_type(data, bufr, mem_nc_type, var->type_info->nc_typeid,
915 len, &range_error, var->fill_value,
922 LOG((4,
"about to H5Dwrite datasetid 0x%x mem_spaceid 0x%x " 923 "file_spaceid 0x%x", var->hdf_datasetid, mem_spaceid, file_spaceid));
924 if (H5Dwrite(var->hdf_datasetid, var->type_info->hdf_typeid,
925 mem_spaceid, file_spaceid, xfer_plistid, bufr) < 0)
930 if (!var->written_to)
931 var->written_to = NC_TRUE;
936 (var->type_info->nc_typeid ==
NC_UBYTE || var->type_info->nc_typeid ==
NC_BYTE) &&
943 if (mem_typeid > 0 && H5Tclose(mem_typeid) < 0)
946 if (file_spaceid > 0 && H5Sclose(file_spaceid) < 0)
948 if (mem_spaceid > 0 && H5Sclose(mem_spaceid) < 0)
950 if (xfer_plistid && (H5Pclose(xfer_plistid) < 0))
953 if (need_to_convert && bufr) free(bufr);
991 nc4_get_vara(NC *nc,
int ncid,
int varid,
const size_t *startp,
992 const size_t *countp,
nc_type mem_nc_type,
int is_long,
void *data)
995 NC_HDF5_FILE_INFO_T *h5;
998 hid_t file_spaceid = 0, mem_spaceid = 0;
999 hid_t xfer_plistid = 0;
1000 size_t file_type_size;
1005 void *fillvalue = NULL;
1006 int no_read = 0, provide_fill = 0;
1008 int scalar = 0, retval =
NC_NOERR, range_error = 0, i, d2;
1011 hid_t mem_typeid = 0;
1013 #ifndef HDF5_CONVERT 1014 int need_to_convert = 0;
1020 if ((retval = nc4_find_g_var_nc(nc, ncid, varid, &grp, &var)))
1023 assert(grp && h5 && var && var->name);
1025 LOG((3,
"%s: var->name %s mem_nc_type %d is_long %d",
1026 __func__, var->name, mem_nc_type, is_long));
1029 if ((retval = check_for_vara(&mem_nc_type, var, h5)))
1033 for (i = 0; i < var->ndims; i++)
1035 start[i] = startp[i];
1036 count[i] = countp[i];
1042 if (var->hdf5_name && strlen(var->hdf5_name) >= strlen(NON_COORD_PREPEND) &&
1043 strncmp(var->hdf5_name, NON_COORD_PREPEND, strlen(NON_COORD_PREPEND)) == 0 &&
1045 name_to_use = var->hdf5_name;
1047 name_to_use = var->name;
1048 if (!var->hdf_datasetid)
1049 if ((var->hdf_datasetid = H5Dopen2(grp->hdf_grpid, name_to_use, H5P_DEFAULT)) < 0)
1053 if ((file_spaceid = H5Dget_space(var->hdf_datasetid)) < 0)
1059 if (H5Sget_simple_extent_dims(file_spaceid, fdims, fmaxdims) < 0)
1063 log_dim_info(var, fdims, fmaxdims, start, count);
1068 for (d2 = 0; d2 < var->ndims; d2++) {
1070 assert(dim && dim->dimid == var->dimids[d2]);
1077 if ((retval = NC4_inq_dim(ncid, dim->dimid, NULL, &ulen)))
1081 #ifdef RELAX_COORD_BOUND 1082 if (start[d2] > (hssize_t)ulen ||
1083 (start[d2] == (hssize_t)ulen && count[d2] > 0))
1085 if (start[d2] >= (hssize_t)ulen && ulen > 0)
1088 if (start[d2] + count[d2] > ulen)
1096 if (start[d2] >= (hssize_t)fdims[d2])
1097 fill_value_size[d2] = count[d2];
1098 else if (start[d2] + count[d2] > fdims[d2])
1099 fill_value_size[d2] = count[d2] - (fdims[d2] - start[d2]);
1101 fill_value_size[d2] = 0;
1102 count[d2] -= fill_value_size[d2];
1103 if (fill_value_size[d2])
1109 #ifdef RELAX_COORD_BOUND 1110 if (start[d2] > (hssize_t)fdims[d2] ||
1111 (start[d2] == (hssize_t)fdims[d2] && count[d2] > 0))
1113 if (start[d2] >= (hssize_t)fdims[d2])
1116 if (start[d2] + count[d2] > fdims[d2])
1120 fill_value_size[d2] = count[d2];
1126 for (d2 = 0; d2 < var->ndims; d2++)
1132 assert(var->type_info->size);
1133 file_type_size = var->type_info->size;
1141 if (H5Sget_simple_extent_type(file_spaceid) == H5S_SCALAR)
1143 if ((mem_spaceid = H5Screate(H5S_SCALAR)) < 0)
1149 if (H5Sselect_hyperslab(file_spaceid, H5S_SELECT_SET,
1150 start, NULL, count, NULL) < 0)
1154 if ((mem_spaceid = H5Screate_simple(var->ndims, count, NULL)) < 0)
1164 if(var->type_info->nc_type_class ==
NC_STRING &&
1165 H5Tget_size(var->type_info->hdf_typeid) > 1 &&
1166 !H5Tis_variable_str(var->type_info->hdf_typeid)) {
1167 hsize_t fstring_len;
1169 if ((fstring_len = H5Tget_size(var->type_info->hdf_typeid)) == 0)
1171 if (!(*(
char **)data = malloc(1 + fstring_len)))
1173 bufr = *(
char **)data;
1176 #ifndef HDF5_CONVERT 1179 if ((mem_nc_type != var->type_info->nc_typeid || (var->type_info->nc_typeid ==
NC_INT && is_long)) &&
1185 for (d2 = 0; d2 < var->ndims; d2++)
1187 LOG((4,
"converting data for var %s type=%d len=%d", var->name,
1188 var->type_info->nc_typeid, len));
1194 if (!(bufr = malloc(len * file_type_size)))
1204 if ((retval = nc4_get_hdf_typeid(h5, mem_nc_type, &mem_typeid,
1205 var->type_info->endianness)))
1210 if ((xfer_plistid = H5Pcreate(H5P_DATASET_XFER)) < 0)
1217 if (H5Pset_type_conv_cb(xfer_plistid, except_func, &range_error) < 0)
1221 #ifdef USE_PARALLEL4 1223 if ((retval = set_par_access(h5, var, xfer_plistid)))
1228 LOG((5,
"About to H5Dread some data..."));
1229 if (H5Dread(var->hdf_datasetid, var->type_info->native_hdf_typeid,
1230 mem_spaceid, file_spaceid, xfer_plistid, bufr) < 0)
1233 #ifndef HDF5_CONVERT 1239 if (need_to_convert)
1241 if ((retval = nc4_convert_type(bufr, data, var->type_info->nc_typeid, mem_nc_type,
1242 len, &range_error, var->fill_value,
1249 (var->type_info->nc_typeid ==
NC_UBYTE || var->type_info->nc_typeid ==
NC_BYTE) &&
1259 (var->type_info->nc_typeid ==
NC_UBYTE || var->type_info->nc_typeid ==
NC_BYTE) &&
1267 #ifdef USE_PARALLEL4 1274 if ((xfer_plistid = H5Pcreate(H5P_DATASET_XFER)) < 0)
1277 if ((retval = set_par_access(h5, var, xfer_plistid)))
1280 if (H5Sselect_none(file_spaceid)<0)
1285 if((mem_spaceid = H5Dget_space(var->hdf_datasetid))<0)
1287 if (H5Sselect_none(mem_spaceid)<0)
1291 LOG((5,
"About to H5Dread some data..."));
1292 if (H5Dread(var->hdf_datasetid, var->type_info->native_hdf_typeid,
1293 mem_spaceid, file_spaceid, xfer_plistid, bufr) < 0)
1301 if (!scalar && provide_fill)
1304 size_t real_data_size = 0;
1309 for (real_data_size = file_type_size, d2 = 0; d2 < var->ndims; d2++)
1310 real_data_size *= (count[d2] - start[d2]);
1314 if (get_fill_value(h5, var, &fillvalue) < 0)
1318 for (fill_len = 1, d2 = 0; d2 < var->ndims; d2++)
1319 fill_len *= (fill_value_size[d2] ? fill_value_size[d2] : 1);
1322 filldata = (
char *)data + real_data_size;
1323 for (i = 0; i < fill_len; i++)
1326 if (var->type_info->nc_type_class ==
NC_STRING)
1328 if (*(
char **)fillvalue)
1330 if (!(*(
char **)filldata = strdup(*(
char **)fillvalue)))
1334 *(
char **)filldata = NULL;
1336 else if(var->type_info->nc_type_class ==
NC_VLEN) {
1338 memcpy(filldata,fillvalue,file_type_size);
1340 *(
char **)filldata = NULL;
1343 memcpy(filldata, fillvalue, file_type_size);
1344 filldata = (
char *)filldata + file_type_size;
1350 if (mem_typeid > 0 && H5Tclose(mem_typeid) < 0)
1353 if (file_spaceid > 0)
1355 if (H5Sclose(file_spaceid) < 0)
1358 if (mem_spaceid > 0)
1360 if (H5Sclose(mem_spaceid) < 0)
1363 if (xfer_plistid > 0)
1365 if (H5Pclose(xfer_plistid) < 0)
1368 #ifndef HDF5_CONVERT 1369 if (need_to_convert && bufr != NULL)
1376 if (var->type_info->nc_type_class ==
NC_VLEN)
1378 else if (var->type_info->nc_type_class ==
NC_STRING && *(
char **)fillvalue)
1379 free(*(
char **)fillvalue);
1407 put_att_grpa(NC_GRP_INFO_T *grp,
int varid, NC_ATT_INFO_T *att)
1409 hid_t datasetid = 0, locid;
1410 hid_t attid = 0, spaceid = 0, file_typeid = 0;
1415 int phoney_data = 99;
1418 LOG((3,
"%s: varid %d att->attnum %d att->name %s att->nc_typeid %d att->len %d",
1419 __func__, varid, att->attnum, att->name,
1420 att->nc_typeid, att->len));
1423 if (grp->nc4_info->no_write)
1428 locid = grp->hdf_grpid;
1431 if ((retval = nc4_open_var_grp2(grp, varid, &datasetid)))
1437 if ((attr_exists = H5Aexists(locid, att->name)) < 0)
1441 if (H5Adelete(locid, att->name) < 0)
1448 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, att->nc_typeid,
1456 data = &phoney_data;
1459 else if (att->stdata)
1469 if (att->nc_typeid ==
NC_CHAR)
1471 size_t string_size = dims[0];
1475 if ((spaceid = H5Screate(H5S_NULL)) < 0)
1480 if ((spaceid = H5Screate(H5S_SCALAR)) < 0)
1483 if (H5Tset_size(file_typeid, string_size) < 0)
1485 if (H5Tset_strpad(file_typeid, H5T_STR_NULLTERM) < 0)
1492 if ((spaceid = H5Screate(H5S_NULL)) < 0)
1497 if ((spaceid = H5Screate_simple(1, dims, NULL)) < 0)
1501 if ((attid = H5Acreate(locid, att->name, file_typeid, spaceid,
1506 if (H5Awrite(attid, file_typeid, data) < 0)
1510 if (file_typeid && H5Tclose(file_typeid))
1512 if (attid > 0 && H5Aclose(attid) < 0)
1514 if (spaceid > 0 && H5Sclose(spaceid) < 0)
1531 write_attlist(NC_ATT_INFO_T *attlist,
int varid, NC_GRP_INFO_T *grp)
1536 for (att = attlist; att; att = att->l.next)
1540 LOG((4,
"%s: writing att %s to varid %d", __func__, att->name, varid));
1541 if ((retval = put_att_grpa(grp, varid, att)))
1543 att->dirty = NC_FALSE;
1544 att->created = NC_TRUE;
1570 write_coord_dimids(NC_VAR_INFO_T *var)
1572 hsize_t coords_len[1];
1573 hid_t c_spaceid = -1, c_attid = -1;
1577 coords_len[0] = var->ndims;
1578 if ((c_spaceid = H5Screate_simple(1, coords_len, coords_len)) < 0) ret++;
1579 if (!ret && (c_attid = H5Acreate(var->hdf_datasetid, COORDINATES, H5T_NATIVE_INT,
1580 c_spaceid, H5P_DEFAULT)) < 0) ret++;
1581 if (!ret && H5Awrite(c_attid, H5T_NATIVE_INT, var->dimids) < 0) ret++;
1584 if (c_spaceid > 0 && H5Sclose(c_spaceid) < 0) ret++;
1585 if (c_attid > 0 && H5Aclose(c_attid) < 0) ret++;
1600 write_netcdf4_dimid(hid_t datasetid,
int dimid)
1602 hid_t dimid_spaceid, dimid_attid;
1606 if ((dimid_spaceid = H5Screate(H5S_SCALAR)) < 0)
1610 if ((attr_exists = H5Aexists(datasetid, NC_DIMID_ATT_NAME)) < 0)
1613 dimid_attid = H5Aopen_by_name(datasetid,
".", NC_DIMID_ATT_NAME,
1614 H5P_DEFAULT, H5P_DEFAULT);
1617 dimid_attid = H5Acreate(datasetid, NC_DIMID_ATT_NAME,
1618 H5T_NATIVE_INT, dimid_spaceid, H5P_DEFAULT);
1619 if (dimid_attid < 0)
1624 LOG((4,
"%s: writing secret dimid %d", __func__, dimid));
1625 if (H5Awrite(dimid_attid, H5T_NATIVE_INT, &dimid) < 0)
1629 if (H5Sclose(dimid_spaceid) < 0)
1631 if (H5Aclose(dimid_attid) < 0)
1648 var_create_dataset(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var, nc_bool_t write_dimid)
1650 hid_t plistid = 0, access_plistid = 0,
typeid = 0, spaceid = 0;
1651 hsize_t chunksize[H5S_MAX_RANK], dimsize[H5S_MAX_RANK], maxdimsize[H5S_MAX_RANK];
1654 NC_DIM_INFO_T *dim = NULL;
1658 LOG((3,
"%s:: name %s", __func__, var->name));
1661 if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
1663 if ((access_plistid = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
1667 if (H5Pset_obj_track_times(plistid,0)<0)
1671 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, var->type_info->nc_typeid, &
typeid,
1672 var->type_info->endianness)))
1679 if (H5Pset_fill_time(plistid, H5D_FILL_TIME_NEVER) < 0)
1684 if ((retval = get_fill_value(grp->nc4_info, var, &fillp)))
1690 if (var->type_info->nc_type_class ==
NC_STRING)
1692 if (H5Pset_fill_value(plistid,
typeid, fillp) < 0)
1701 hid_t fill_typeid = 0;
1703 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, var->type_info->nc_typeid, &fill_typeid,
1706 if (H5Pset_fill_value(plistid, fill_typeid, fillp) < 0)
1708 if (H5Tclose(fill_typeid) < 0)
1712 if (H5Tclose(fill_typeid) < 0)
1720 if (H5Pset_shuffle(plistid) < 0)
1726 if (H5Pset_deflate(plistid, var->deflate_level) < 0)
1728 }
else if(var->filterid) {
1733 if(var->nparams != 2)
1735 options_mask = (int)var->params[0];
1736 bits_per_pixel = (
int)var->params[1];
1737 if(H5Pset_szip(plistid, options_mask, bits_per_pixel) < 0)
1740 herr_t code = H5Pset_filter(plistid, var->filterid, H5Z_FLAG_MANDATORY, var->nparams, var->params);
1748 if (var->fletcher32)
1749 if (H5Pset_fletcher32(plistid) < 0)
1761 for (d = 0; d < var->ndims; d++) {
1763 assert(dim && dim->dimid == var->dimids[d]);
1772 if(!var->shuffle && !var->deflate &&
1773 !var->fletcher32 && (var->chunksizes == NULL || !var->chunksizes[0])) {
1775 NC_HDF5_FILE_INFO_T *h5 = grp->nc4_info;
1776 if(h5->hdf4 || !unlimdim)
1780 var->contiguous = NC_TRUE;
1784 for (d = 0; d < var->ndims; d++)
1787 assert(dim && dim->dimid == var->dimids[d]);
1788 dimsize[d] = dim->unlimited ? NC_HDF5_UNLIMITED_DIMSIZE : dim->len;
1789 maxdimsize[d] = dim->unlimited ? H5S_UNLIMITED : (hsize_t)dim->len;
1790 if (!var->contiguous) {
1791 if (var->chunksizes[d])
1792 chunksize[d] = var->chunksizes[d];
1796 if (var->type_info->nc_type_class ==
NC_STRING)
1797 type_size =
sizeof(
char *);
1799 type_size = var->type_info->size;
1805 chunksize[d] = pow((
double)DEFAULT_CHUNK_SIZE/type_size,
1806 1/(
double)(var->ndims - unlimdim));
1810 if (!dim->unlimited && chunksize[d] > dim->len)
1811 chunksize[d] = dim->len;
1814 var->chunksizes[d] = chunksize[d];
1819 if (var->contiguous)
1821 if (H5Pset_layout(plistid, H5D_CONTIGUOUS) < 0)
1826 if (H5Pset_chunk(plistid, var->ndims, chunksize) < 0)
1831 if ((spaceid = H5Screate_simple(var->ndims, dimsize, maxdimsize)) < 0)
1836 if ((spaceid = H5Screate(H5S_SCALAR)) < 0)
1841 if (H5Pset_attr_creation_order(plistid, H5P_CRT_ORDER_TRACKED|
1842 H5P_CRT_ORDER_INDEXED) < 0)
1846 if (!var->contiguous && var->chunk_cache_size)
1847 if (H5Pset_chunk_cache(access_plistid, var->chunk_cache_nelems,
1848 var->chunk_cache_size, var->chunk_cache_preemption) < 0)
1852 name_to_use = var->hdf5_name ? var->hdf5_name : var->name;
1853 LOG((4,
"%s: about to H5Dcreate2 dataset %s of type 0x%x", __func__,
1854 name_to_use,
typeid));
1855 if ((var->hdf_datasetid = H5Dcreate2(grp->hdf_grpid, name_to_use,
typeid,
1856 spaceid, H5P_DEFAULT, plistid, access_plistid)) < 0)
1858 var->created = NC_TRUE;
1859 var->is_new_var = NC_FALSE;
1866 if (H5DSset_scale(var->hdf_datasetid, var->name) < 0)
1872 if ((retval = write_coord_dimids(var)))
1877 if ((retval = write_netcdf4_dimid(var->hdf_datasetid, var->dimids[0])))
1883 if ((retval = write_attlist(var->att, var->varid, grp)))
1885 var->attr_dirty = NC_FALSE;
1888 if (
typeid > 0 && H5Tclose(
typeid) < 0)
1890 if (plistid > 0 && H5Pclose(plistid) < 0)
1892 if (access_plistid > 0 && H5Pclose(access_plistid) < 0)
1894 if (spaceid > 0 && H5Sclose(spaceid) < 0)
1898 if (var->type_info->nc_type_class ==
NC_VLEN)
1900 else if (var->type_info->nc_type_class ==
NC_STRING && *(
char **)fillp)
1901 free(*(
char **)fillp);
1919 nc4_adjust_var_cache(NC_GRP_INFO_T *grp, NC_VAR_INFO_T * var)
1921 size_t chunk_size_bytes = 1;
1926 if (var->contiguous)
1928 #ifdef USE_PARALLEL4 1933 for (d = 0; d < var->ndims; d++)
1934 chunk_size_bytes *= var->chunksizes[d];
1935 if (var->type_info->size)
1936 chunk_size_bytes *= var->type_info->size;
1938 chunk_size_bytes *=
sizeof(
char *);
1943 if (var->chunk_cache_size == CHUNK_CACHE_SIZE)
1944 if (chunk_size_bytes > var->chunk_cache_size)
1946 var->chunk_cache_size = chunk_size_bytes * DEFAULT_CHUNKS_IN_CACHE;
1947 if (var->chunk_cache_size > MAX_DEFAULT_CACHE_SIZE)
1948 var->chunk_cache_size = MAX_DEFAULT_CACHE_SIZE;
1949 if ((retval = nc4_reopen_dataset(grp, var)))
1967 commit_type(NC_GRP_INFO_T *grp, NC_TYPE_INFO_T *type)
1971 assert(grp && type);
1974 if (type->committed)
1980 NC_FIELD_INFO_T *field;
1981 hid_t hdf_base_typeid, hdf_typeid;
1983 if ((type->hdf_typeid = H5Tcreate(H5T_COMPOUND, type->size)) < 0)
1985 LOG((4,
"creating compound type %s hdf_typeid 0x%x", type->name,
1988 for (field = type->u.c.field; field; field = field->l.next)
1990 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, field->nc_typeid,
1991 &hdf_base_typeid, type->endianness)))
2000 for (d = 0; d < field->ndims; d++)
2001 dims[d] = field->dim_size[d];
2002 if ((hdf_typeid = H5Tarray_create(hdf_base_typeid, field->ndims,
2005 if (H5Tclose(hdf_base_typeid) < 0)
2009 if (H5Tclose(hdf_base_typeid) < 0)
2013 hdf_typeid = hdf_base_typeid;
2014 LOG((4,
"inserting field %s offset %d hdf_typeid 0x%x", field->name,
2015 field->offset, hdf_typeid));
2016 if (H5Tinsert(type->hdf_typeid, field->name, field->offset,
2019 if (H5Tclose(hdf_typeid) < 0)
2023 else if (type->nc_type_class ==
NC_VLEN)
2026 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, type->u.v.base_nc_typeid,
2027 &type->u.v.base_hdf_typeid, type->endianness)))
2031 if ((type->hdf_typeid = H5Tvlen_create(type->u.v.base_hdf_typeid)) < 0)
2034 else if (type->nc_type_class ==
NC_OPAQUE)
2037 if ((type->hdf_typeid = H5Tcreate(H5T_OPAQUE, type->size)) < 0)
2040 else if (type->nc_type_class ==
NC_ENUM)
2042 NC_ENUM_MEMBER_INFO_T *enum_m;
2044 if (!type->u.e.enum_member)
2048 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, type->u.e.base_nc_typeid,
2049 &type->u.e.base_hdf_typeid, type->endianness)))
2053 if ((type->hdf_typeid = H5Tenum_create(type->u.e.base_hdf_typeid)) < 0)
2057 for (enum_m = type->u.e.enum_member; enum_m; enum_m = enum_m->l.next)
2058 if (H5Tenum_insert(type->hdf_typeid, enum_m->name, enum_m->value) < 0)
2063 LOG((0,
"Unknown class: %d", type->nc_type_class));
2068 if (H5Tcommit(grp->hdf_grpid, type->name, type->hdf_typeid) < 0)
2070 type->committed = NC_TRUE;
2071 LOG((4,
"just committed type %s, HDF typeid: 0x%x", type->name,
2077 if ((type->native_hdf_typeid = H5Tget_native_type(type->hdf_typeid,
2078 H5T_DIR_DEFAULT)) < 0)
2095 write_nc3_strict_att(hid_t hdf_grpid)
2097 hid_t attid = 0, spaceid = 0;
2104 if ((attr_exists = H5Aexists(hdf_grpid, NC3_STRICT_ATT_NAME)) < 0)
2111 if ((spaceid = H5Screate(H5S_SCALAR)) < 0)
2113 if ((attid = H5Acreate(hdf_grpid, NC3_STRICT_ATT_NAME,
2114 H5T_NATIVE_INT, spaceid, H5P_DEFAULT)) < 0)
2116 if (H5Awrite(attid, H5T_NATIVE_INT, &one) < 0)
2120 if (spaceid > 0 && (H5Sclose(spaceid) < 0))
2122 if (attid > 0 && (H5Aclose(attid) < 0))
2136 create_group(NC_GRP_INFO_T *grp)
2148 if ((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0)
2152 if (H5Pset_obj_track_times(gcpl_id,0)<0)
2155 if (H5Pset_link_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0)
2157 if (H5Pset_attr_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0)
2159 if ((grp->hdf_grpid = H5Gcreate2(grp->parent->hdf_grpid, grp->name,
2160 H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
2162 if (H5Pclose(gcpl_id) < 0)
2168 if ((grp->hdf_grpid = H5Gopen2(grp->nc4_info->hdfid,
"/", H5P_DEFAULT)) < 0)
2174 if (gcpl_id > 0 && H5Pclose(gcpl_id) < 0)
2176 if (grp->hdf_grpid > 0 && H5Gclose(grp->hdf_grpid) < 0)
2193 attach_dimscales(NC_GRP_INFO_T *grp)
2196 NC_DIM_INFO_T *dim1;
2201 for (i=0; i < grp->vars.nelems; i++)
2203 var = grp->vars.value[i];
2216 for (d = 0; d < var->ndims; d++)
2219 if (var->dimscale_attached)
2221 if (!var->dimscale_attached[d])
2223 hid_t dim_datasetid;
2225 assert(dim1 && dim1->dimid == var->dimids[d]);
2227 LOG((2,
"%s: attaching scale for dimid %d to var %s",
2228 __func__, var->dimids[d], var->name));
2231 if (dim1->coord_var)
2232 dim_datasetid = dim1->coord_var->hdf_datasetid;
2234 dim_datasetid = dim1->hdf_dimscaleid;
2235 assert(dim_datasetid > 0);
2236 if (H5DSattach_scale(var->hdf_datasetid, dim_datasetid, d) < 0)
2238 var->dimscale_attached[d] = NC_TRUE;
2242 if (!var->dimscale_attached[d])
2244 LOG((0,
"no dimscale found!"));
2267 var_exists(hid_t grpid,
char *name, nc_bool_t *exists)
2275 if ((link_exists = H5Lexists(grpid, name, H5P_DEFAULT)) < 0)
2282 if (H5Gget_objinfo(grpid, name, 1, &statbuf) < 0)
2285 if (H5G_DATASET == statbuf.type)
2307 write_var(NC_VAR_INFO_T *var, NC_GRP_INFO_T *grp, nc_bool_t write_dimid)
2309 nc_bool_t replace_existing_var = NC_FALSE;
2312 LOG((4,
"%s: writing var %s", __func__, var->name));
2316 if (var->created && var->fill_val_changed)
2318 replace_existing_var = NC_TRUE;
2319 var->fill_val_changed = NC_FALSE;
2328 flag_atts_dirty(&var->att);
2335 if (var->became_coord_var)
2339 for (d1 = grp->dim; d1; d1 = d1->l.next)
2340 if (!strcmp(d1->name, var->name))
2344 if ((retval = var_exists(grp->hdf_grpid, var->name, &exists)))
2349 replace_existing_var = NC_TRUE;
2350 flag_atts_dirty(&var->att);
2363 if (replace_existing_var)
2367 for (d1 = grp->dim; d1; d1 = d1->l.next)
2368 if (!strcmp(d1->name, var->name))
2372 if ((retval = var_exists(grp->hdf_grpid, var->name, &exists)))
2376 hid_t dim_datasetid;
2380 dim_datasetid = d1->coord_var->hdf_datasetid;
2382 dim_datasetid = d1->hdf_dimscaleid;
2383 assert(dim_datasetid > 0);
2388 if ((retval = rec_detach_scales(grp->nc4_info->root_grp,
2389 var->dimids[0], dim_datasetid)))
2397 if (var->was_coord_var && var->dimscale_attached)
2410 if ((attr_exists = H5Aexists(var->hdf_datasetid,
"CLASS")) < 0)
2414 if (H5Adelete(var->hdf_datasetid,
"CLASS") < 0)
2417 if ((attr_exists = H5Aexists(var->hdf_datasetid,
"NAME")) < 0)
2421 if (H5Adelete(var->hdf_datasetid,
"NAME") < 0)
2426 if (var->dimscale_attached)
2431 for (d = 0; d < var->ndims; d++)
2432 if (var->dimscale_attached[d])
2434 hid_t dim_datasetid;
2435 NC_DIM_INFO_T *dim1 = var->dim[d];
2436 assert(dim1 && dim1->dimid == var->dimids[d]);
2439 if (dim1->coord_var)
2440 dim_datasetid = dim1->coord_var->hdf_datasetid;
2442 dim_datasetid = dim1->hdf_dimscaleid;
2443 assert(dim_datasetid > 0);
2445 if (H5DSdetach_scale(var->hdf_datasetid, dim_datasetid, d) < 0)
2447 var->dimscale_attached[d] = NC_FALSE;
2453 if (replace_existing_var)
2456 if (var->hdf_datasetid && H5Dclose(var->hdf_datasetid) < 0)
2458 var->hdf_datasetid = 0;
2461 if (H5Gunlink(grp->hdf_grpid, var->name) < 0)
2466 if (var->is_new_var || replace_existing_var)
2468 if ((retval = var_create_dataset(grp, var, write_dimid)))
2473 if (write_dimid && var->ndims)
2474 if ((retval = write_netcdf4_dimid(var->hdf_datasetid, var->dimids[0])))
2478 if (replace_existing_var)
2484 if ((retval = rec_reattach_scales(grp->nc4_info->root_grp,
2485 var->dimids[0], var->hdf_datasetid)))
2492 if (var->dimscale_attached)
2493 memset(var->dimscale_attached, 0,
sizeof(nc_bool_t) * var->ndims);
2498 var->was_coord_var = NC_FALSE;
2499 var->became_coord_var = NC_FALSE;
2502 if (var->attr_dirty)
2505 if ((retval = write_attlist(var->att, var->varid, grp)))
2507 var->attr_dirty = NC_FALSE;
2528 write_dim(NC_DIM_INFO_T *dim, NC_GRP_INFO_T *grp, nc_bool_t write_dimid)
2537 if (0 == dim->hdf_dimscaleid)
2539 hid_t spaceid, create_propid;
2540 hsize_t dims[1], max_dims[1], chunk_dims[1] = {1};
2543 LOG((4,
"%s: creating dim %s", __func__, dim->name));
2546 assert(NULL == dim->coord_var);
2551 if ((create_propid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
2555 if (H5Pset_obj_track_times(create_propid,0)<0)
2559 max_dims[0] = dim->len;
2562 max_dims[0] = H5S_UNLIMITED;
2563 if (H5Pset_chunk(create_propid, 1, chunk_dims) < 0)
2568 if ((spaceid = H5Screate_simple(1, dims, max_dims)) < 0)
2571 if (H5Pset_attr_creation_order(create_propid, H5P_CRT_ORDER_TRACKED|
2572 H5P_CRT_ORDER_INDEXED) < 0)
2576 LOG((4,
"%s: about to H5Dcreate1 a dimscale dataset %s", __func__, dim->name));
2577 if ((dim->hdf_dimscaleid = H5Dcreate1(grp->hdf_grpid, dim->name, H5T_IEEE_F32BE,
2578 spaceid, create_propid)) < 0)
2582 if (H5Sclose(spaceid) < 0)
2584 if (H5Pclose(create_propid) < 0)
2590 sprintf(dimscale_wo_var,
"%s%10d", DIM_WITHOUT_VARIABLE, (
int)dim->len);
2591 if (H5DSset_scale(dim->hdf_dimscaleid, dimscale_wo_var) < 0)
2598 NC_VAR_INFO_T *v1 = NULL;
2600 assert(dim->unlimited);
2604 for (i=0; i < grp->vars.nelems; i++)
2606 if (grp->vars.value[i] && !strcmp(grp->vars.value[i]->name, dim->name))
2608 v1 = grp->vars.value[i];
2614 hsize_t *new_size = NULL;
2619 if (!(new_size = malloc(v1->ndims *
sizeof(hsize_t))))
2621 for (d1 = 0; d1 < v1->ndims; d1++)
2623 assert(v1->dim[d1] && v1->dim[d1]->dimid == v1->dimids[d1]);
2624 new_size[d1] = v1->dim[d1]->len;
2626 if (H5Dset_extent(v1->hdf_datasetid, new_size) < 0) {
2638 if (write_dimid && dim->hdf_dimscaleid)
2639 if ((retval = write_netcdf4_dimid(dim->hdf_dimscaleid, dim->dimid)))
2665 nc4_rec_detect_need_to_preserve_dimids(NC_GRP_INFO_T *grp, nc_bool_t *bad_coord_orderp)
2668 NC_GRP_INFO_T *child_grp;
2669 int last_dimid = -1;
2674 for (i=0; i < grp->vars.nelems; i++)
2676 var = grp->vars.value[i];
2679 if (var->dimscale && var->ndims)
2685 if (var->dimids[0] < last_dimid)
2687 LOG((5,
"%s: %s is out of order coord var", __func__, var->name));
2688 *bad_coord_orderp = NC_TRUE;
2691 last_dimid = var->dimids[0];
2698 LOG((5,
"%s: %s is multidimensional coord var", __func__, var->name));
2699 *bad_coord_orderp = NC_TRUE;
2706 if (var->is_new_var || var->became_coord_var)
2708 LOG((5,
"%s: coord var defined after enddef/redef", __func__));
2709 *bad_coord_orderp = NC_TRUE;
2716 for (child_grp = grp->children; child_grp; child_grp = child_grp->l.next)
2717 if ((retval = nc4_rec_detect_need_to_preserve_dimids(child_grp, bad_coord_orderp)))
2736 nc4_rec_write_metadata(NC_GRP_INFO_T *grp, nc_bool_t bad_coord_order)
2738 NC_DIM_INFO_T *dim = NULL;
2739 NC_VAR_INFO_T *var = NULL;
2740 NC_GRP_INFO_T *child_grp = NULL;
2741 int coord_varid = -1;
2745 assert(grp && grp->name && grp->hdf_grpid);
2746 LOG((3,
"%s: grp->name %s, bad_coord_order %d", __func__, grp->name, bad_coord_order));
2749 if ((retval = write_attlist(grp->att,
NC_GLOBAL, grp)))
2754 if (var_index < grp->vars.nelems)
2755 var = grp->vars.value[var_index];
2762 nc_bool_t found_coord, wrote_coord;
2766 for (found_coord = NC_FALSE; dim && !found_coord; dim = dim->l.next)
2768 if (!dim->coord_var)
2770 if ((retval = write_dim(dim, grp, bad_coord_order)))
2775 coord_varid = dim->coord_var->varid;
2776 found_coord = NC_TRUE;
2782 for (wrote_coord = NC_FALSE; var && !wrote_coord; )
2784 if ((retval = write_var(var, grp, bad_coord_order)))
2786 if (found_coord && var->varid == coord_varid)
2787 wrote_coord = NC_TRUE;
2788 if (++var_index < grp->vars.nelems)
2789 var = grp->vars.value[var_index];
2795 if ((retval = attach_dimscales(grp)))
2799 for (child_grp = grp->children; child_grp; child_grp = child_grp->l.next)
2800 if ((retval = nc4_rec_write_metadata(child_grp, bad_coord_order)))
2816 nc4_rec_write_groups_types(NC_GRP_INFO_T *grp)
2818 NC_GRP_INFO_T *child_grp;
2819 NC_TYPE_INFO_T *type;
2822 assert(grp && grp->name);
2823 LOG((3,
"%s: grp->name %s", __func__, grp->name));
2826 if (!grp->hdf_grpid)
2827 if ((retval = create_group(grp)))
2833 if ((retval = write_nc3_strict_att(grp->hdf_grpid)))
2837 for (type = grp->type; type; type = type->l.next)
2838 if ((retval = commit_type(grp, type)))
2842 for (child_grp = grp->children; child_grp; child_grp = child_grp->l.next)
2843 if ((retval = nc4_rec_write_groups_types(child_grp)))
2877 nc4_convert_type(
const void *src,
void *dest,
2879 const size_t len,
int *range_error,
2880 const void *fill_value,
int strict_nc3,
int src_long,
2887 signed long *lp, *lp1;
2889 signed char *bp, *bp1;
2890 unsigned char *ubp, *ubp1;
2891 unsigned short *usp, *usp1;
2892 unsigned int *uip, *uip1;
2893 long long *lip, *lip1;
2894 unsigned long long *ulip, *ulip1;
2898 LOG((3,
"%s: len %d src_type %d dest_type %d src_long %d dest_long %d",
2899 __func__, len, src_type, dest_type, src_long, dest_long));
2915 for (cp = (
char *)src, cp1 = dest; count < len; count++)
2919 LOG((0,
"%s: Uknown destination type.", __func__));
2927 for (bp = (
signed char *)src, bp1 = dest; count < len; count++)
2931 for (bp = (
signed char *)src, ubp = dest; count < len; count++)
2939 for (bp = (
signed char *)src, sp = dest; count < len; count++)
2943 for (bp = (
signed char *)src, usp = dest; count < len; count++)
2953 for (bp = (
signed char *)src, lp = dest; count < len; count++)
2959 for (bp = (
signed char *)src, ip = dest; count < len; count++)
2964 for (bp = (
signed char *)src, uip = dest; count < len; count++)
2972 for (bp = (
signed char *)src, lip = dest; count < len; count++)
2976 for (bp = (
signed char *)src, ulip = dest; count < len; count++)
2984 for (bp = (
signed char *)src, fp = dest; count < len; count++)
2988 for (bp = (
signed char *)src, dp = dest; count < len; count++)
2992 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
2993 __func__, src_type, dest_type));
3002 for (ubp = (
unsigned char *)src, bp = dest; count < len; count++)
3004 if (!strict_nc3 && *ubp > X_SCHAR_MAX)
3010 for (ubp = (
unsigned char *)src, sp = dest; count < len; count++)
3014 for (ubp = (
unsigned char *)src, ubp1 = dest; count < len; count++)
3018 for (ubp = (
unsigned char *)src, usp = dest; count < len; count++)
3024 for (ubp = (
unsigned char *)src, lp = dest; count < len; count++)
3030 for (ubp = (
unsigned char *)src, ip = dest; count < len; count++)
3035 for (ubp = (
unsigned char *)src, uip = dest; count < len; count++)
3039 for (ubp = (
unsigned char *)src, lip = dest; count < len; count++)
3043 for (ubp = (
unsigned char *)src, ulip = dest; count < len; count++)
3047 for (ubp = (
unsigned char *)src, fp = dest; count < len; count++)
3051 for (ubp = (
unsigned char *)src, dp = dest; count < len; count++)
3055 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3056 __func__, src_type, dest_type));
3065 for (sp = (
short *)src, ubp = dest; count < len; count++)
3067 if (*sp > X_UCHAR_MAX || *sp < 0)
3073 for (sp = (
short *)src, bp = dest; count < len; count++)
3075 if (*sp > X_SCHAR_MAX || *sp < X_SCHAR_MIN)
3081 for (sp = (
short *)src, sp1 = dest; count < len; count++)
3085 for (sp = (
short *)src, usp = dest; count < len; count++)
3094 for (sp = (
short *)src, lp = dest; count < len; count++)
3097 for (sp = (
short *)src, ip = dest; count < len; count++)
3101 for (sp = (
short *)src, uip = dest; count < len; count++)
3109 for (sp = (
short *)src, lip = dest; count < len; count++)
3113 for (sp = (
short *)src, ulip = dest; count < len; count++)
3121 for (sp = (
short *)src, fp = dest; count < len; count++)
3125 for (sp = (
short *)src, dp = dest; count < len; count++)
3129 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3130 __func__, src_type, dest_type));
3139 for (usp = (
unsigned short *)src, ubp = dest; count < len; count++)
3141 if (*usp > X_UCHAR_MAX)
3147 for (usp = (
unsigned short *)src, bp = dest; count < len; count++)
3149 if (*usp > X_SCHAR_MAX)
3155 for (usp = (
unsigned short *)src, sp = dest; count < len; count++)
3157 if (*usp > X_SHORT_MAX)
3163 for (usp = (
unsigned short *)src, usp1 = dest; count < len; count++)
3168 for (usp = (
unsigned short *)src, lp = dest; count < len; count++)
3171 for (usp = (
unsigned short *)src, ip = dest; count < len; count++)
3175 for (usp = (
unsigned short *)src, uip = dest; count < len; count++)
3179 for (usp = (
unsigned short *)src, lip = dest; count < len; count++)
3183 for (usp = (
unsigned short *)src, ulip = dest; count < len; count++)
3187 for (usp = (
unsigned short *)src, fp = dest; count < len; count++)
3191 for (usp = (
unsigned short *)src, dp = dest; count < len; count++)
3195 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3196 __func__, src_type, dest_type));
3207 for (lp = (
long *)src, ubp = dest; count < len; count++)
3209 if (*lp > X_UCHAR_MAX || *lp < 0)
3215 for (lp = (
long *)src, bp = dest; count < len; count++)
3217 if (*lp > X_SCHAR_MAX || *lp < X_SCHAR_MIN)
3223 for (lp = (
long *)src, sp = dest; count < len; count++)
3225 if (*lp > X_SHORT_MAX || *lp < X_SHORT_MIN)
3231 for (lp = (
long *)src, usp = dest; count < len; count++)
3233 if (*lp > X_USHORT_MAX || *lp < 0)
3241 for (lp = (
long *)src, lp1 = dest; count < len; count++)
3243 if (*lp > X_LONG_MAX || *lp < X_LONG_MIN)
3250 for (lp = (
long *)src, ip = dest; count < len; count++)
3252 if (*lp > X_INT_MAX || *lp < X_INT_MIN)
3259 for (lp = (
long *)src, uip = dest; count < len; count++)
3261 if (*lp > X_UINT_MAX || *lp < 0)
3267 for (lp = (
long *)src, lip = dest; count < len; count++)
3271 for (lp = (
long *)src, ulip = dest; count < len; count++)
3279 for (lp = (
long *)src, fp = dest; count < len; count++)
3283 for (lp = (
long *)src, dp = dest; count < len; count++)
3287 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3288 __func__, src_type, dest_type));
3297 for (ip = (
int *)src, ubp = dest; count < len; count++)
3299 if (*ip > X_UCHAR_MAX || *ip < 0)
3305 for (ip = (
int *)src, bp = dest; count < len; count++)
3307 if (*ip > X_SCHAR_MAX || *ip < X_SCHAR_MIN)
3313 for (ip = (
int *)src, sp = dest; count < len; count++)
3315 if (*ip > X_SHORT_MAX || *ip < X_SHORT_MIN)
3321 for (ip = (
int *)src, usp = dest; count < len; count++)
3323 if (*ip > X_USHORT_MAX || *ip < 0)
3331 for (ip = (
int *)src, lp1 = dest; count < len; count++)
3333 if (*ip > X_LONG_MAX || *ip < X_LONG_MIN)
3340 for (ip = (
int *)src, ip1 = dest; count < len; count++)
3342 if (*ip > X_INT_MAX || *ip < X_INT_MIN)
3349 for (ip = (
int *)src, uip = dest; count < len; count++)
3351 if (*ip > X_UINT_MAX || *ip < 0)
3357 for (ip = (
int *)src, lip = dest; count < len; count++)
3361 for (ip = (
int *)src, ulip = dest; count < len; count++)
3369 for (ip = (
int *)src, fp = dest; count < len; count++)
3373 for (ip = (
int *)src, dp = dest; count < len; count++)
3377 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3378 __func__, src_type, dest_type));
3388 for (uip = (
unsigned int *)src, ubp = dest; count < len; count++)
3390 if (*uip > X_UCHAR_MAX)
3396 for (uip = (
unsigned int *)src, bp = dest; count < len; count++)
3398 if (*uip > X_SCHAR_MAX)
3404 for (uip = (
unsigned int *)src, sp = dest; count < len; count++)
3406 if (*uip > X_SHORT_MAX)
3412 for (uip = (
unsigned int *)src, usp = dest; count < len; count++)
3414 if (*uip > X_USHORT_MAX)
3421 for (uip = (
unsigned int *)src, lp = dest; count < len; count++)
3423 if (*uip > X_LONG_MAX)
3428 for (uip = (
unsigned int *)src, ip = dest; count < len; count++)
3430 if (*uip > X_INT_MAX)
3436 for (uip = (
unsigned int *)src, uip1 = dest; count < len; count++)
3438 if (*uip > X_UINT_MAX)
3444 for (uip = (
unsigned int *)src, lip = dest; count < len; count++)
3448 for (uip = (
unsigned int *)src, ulip = dest; count < len; count++)
3452 for (uip = (
unsigned int *)src, fp = dest; count < len; count++)
3456 for (uip = (
unsigned int *)src, dp = dest; count < len; count++)
3460 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3461 __func__, src_type, dest_type));
3470 for (lip = (
long long *)src, ubp = dest; count < len; count++)
3472 if (*lip > X_UCHAR_MAX || *lip < 0)
3478 for (lip = (
long long *)src, bp = dest; count < len; count++)
3480 if (*lip > X_SCHAR_MAX || *lip < X_SCHAR_MIN)
3486 for (lip = (
long long *)src, sp = dest; count < len; count++)
3488 if (*lip > X_SHORT_MAX || *lip < X_SHORT_MIN)
3494 for (lip = (
long long *)src, usp = dest; count < len; count++)
3496 if (*lip > X_USHORT_MAX || *lip < 0)
3502 for (lip = (
long long *)src, uip = dest; count < len; count++)
3504 if (*lip > X_UINT_MAX || *lip < 0)
3511 for (lip = (
long long *)src, lp = dest; count < len; count++)
3513 if (*lip > X_LONG_MAX || *lip < X_LONG_MIN)
3518 for (lip = (
long long *)src, ip = dest; count < len; count++)
3520 if (*lip > X_INT_MAX || *lip < X_INT_MIN)
3526 for (lip = (
long long *)src, lip1 = dest; count < len; count++)
3530 for (lip = (
long long *)src, ulip = dest; count < len; count++)
3538 for (lip = (
long long *)src, fp = dest; count < len; count++)
3542 for (lip = (
long long *)src, dp = dest; count < len; count++)
3546 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3547 __func__, src_type, dest_type));
3556 for (ulip = (
unsigned long long *)src, ubp = dest; count < len; count++)
3558 if (*ulip > X_UCHAR_MAX)
3564 for (ulip = (
unsigned long long *)src, bp = dest; count < len; count++)
3566 if (*ulip > X_SCHAR_MAX)
3572 for (ulip = (
unsigned long long *)src, sp = dest; count < len; count++)
3574 if (*ulip > X_SHORT_MAX)
3580 for (ulip = (
unsigned long long *)src, usp = dest; count < len; count++)
3582 if (*ulip > X_USHORT_MAX)
3588 for (ulip = (
unsigned long long *)src, uip = dest; count < len; count++)
3590 if (*ulip > X_UINT_MAX)
3597 for (ulip = (
unsigned long long *)src, lp = dest; count < len; count++)
3599 if (*ulip > X_LONG_MAX)
3604 for (ulip = (
unsigned long long *)src, ip = dest; count < len; count++)
3606 if (*ulip > X_INT_MAX)
3612 for (ulip = (
unsigned long long *)src, lip = dest; count < len; count++)
3614 if (*ulip > X_INT64_MAX)
3620 for (ulip = (
unsigned long long *)src, ulip1 = dest; count < len; count++)
3624 for (ulip = (
unsigned long long *)src, fp = dest; count < len; count++)
3628 for (ulip = (
unsigned long long *)src, dp = dest; count < len; count++)
3632 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3633 __func__, src_type, dest_type));
3642 for (fp = (
float *)src, ubp = dest; count < len; count++)
3644 if (*fp > X_UCHAR_MAX || *fp < 0)
3650 for (fp = (
float *)src, bp = dest; count < len; count++)
3652 if (*fp > (
double)X_SCHAR_MAX || *fp < (
double)X_SCHAR_MIN)
3658 for (fp = (
float *)src, sp = dest; count < len; count++)
3660 if (*fp > (
double)X_SHORT_MAX || *fp < (
double)X_SHORT_MIN)
3666 for (fp = (
float *)src, usp = dest; count < len; count++)
3668 if (*fp > X_USHORT_MAX || *fp < 0)
3674 for (fp = (
float *)src, uip = dest; count < len; count++)
3676 if (*fp > X_UINT_MAX || *fp < 0)
3683 for (fp = (
float *)src, lp = dest; count < len; count++)
3685 if (*fp > (
double)X_LONG_MAX || *fp < (
double)X_LONG_MIN)
3690 for (fp = (
float *)src, ip = dest; count < len; count++)
3692 if (*fp > (
double)X_INT_MAX || *fp < (
double)X_INT_MIN)
3698 for (fp = (
float *)src, lip = dest; count < len; count++)
3700 if (*fp > X_INT64_MAX || *fp <X_INT64_MIN)
3706 for (fp = (
float *)src, lip = dest; count < len; count++)
3708 if (*fp > X_UINT64_MAX || *fp < 0)
3714 for (fp = (
float *)src, fp1 = dest; count < len; count++)
3722 for (fp = (
float *)src, dp = dest; count < len; count++)
3726 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3727 __func__, src_type, dest_type));
3736 for (dp = (
double *)src, ubp = dest; count < len; count++)
3738 if (*dp > X_UCHAR_MAX || *dp < 0)
3744 for (dp = (
double *)src, bp = dest; count < len; count++)
3746 if (*dp > X_SCHAR_MAX || *dp < X_SCHAR_MIN)
3752 for (dp = (
double *)src, sp = dest; count < len; count++)
3754 if (*dp > X_SHORT_MAX || *dp < X_SHORT_MIN)
3760 for (dp = (
double *)src, usp = dest; count < len; count++)
3762 if (*dp > X_USHORT_MAX || *dp < 0)
3768 for (dp = (
double *)src, uip = dest; count < len; count++)
3770 if (*dp > X_UINT_MAX || *dp < 0)
3777 for (dp = (
double *)src, lp = dest; count < len; count++)
3779 if (*dp > X_LONG_MAX || *dp < X_LONG_MIN)
3784 for (dp = (
double *)src, ip = dest; count < len; count++)
3786 if (*dp > X_INT_MAX || *dp < X_INT_MIN)
3792 for (dp = (
double *)src, lip = dest; count < len; count++)
3794 if (*dp > X_INT64_MAX || *dp < X_INT64_MIN)
3800 for (dp = (
double *)src, lip = dest; count < len; count++)
3802 if (*dp > X_UINT64_MAX || *dp < 0)
3808 for (dp = (
double *)src, fp = dest; count < len; count++)
3810 if (*dp > X_FLOAT_MAX || *dp < X_FLOAT_MIN)
3816 for (dp = (
double *)src, dp1 = dest; count < len; count++)
3824 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
3825 __func__, src_type, dest_type));
3831 LOG((0,
"%s: unexpected src type. src_type %d, dest_type %d",
3832 __func__, src_type, dest_type));
3851 nc4_rec_match_dimscales(NC_GRP_INFO_T *grp)
3859 assert(grp && grp->name);
3860 LOG((4,
"%s: grp->name %s", __func__, grp->name));
3863 for (g = grp->children; g; g = g->l.next)
3864 if ((retval = nc4_rec_match_dimscales(g)))
3869 for (i=0; i < grp->vars.nelems; i++)
3873 var = grp->vars.value[i];
3877 for (d = 0; d < ndims; d++)
3879 if (var->dim[d] == NULL) {
3880 nc4_find_dim(grp, var->dimids[d], &var->dim[d], NULL);
3891 if (var->dimscale_hdf5_objids)
3893 for (d = 0; d < var->ndims; d++)
3895 nc_bool_t finished = NC_FALSE;
3897 LOG((5,
"%s: var %s has dimscale info...", __func__, var->name));
3900 for (g = grp; g && !finished; g = g->parent)
3902 for (dim = g->dim; dim; dim = dim->l.next)
3904 if (var->dimscale_hdf5_objids[d].fileno[0] == dim->hdf5_objid.fileno[0] &&
3905 var->dimscale_hdf5_objids[d].objno[0] == dim->hdf5_objid.objno[0] &&
3906 var->dimscale_hdf5_objids[d].fileno[1] == dim->hdf5_objid.fileno[1] &&
3907 var->dimscale_hdf5_objids[d].objno[1] == dim->hdf5_objid.objno[1])
3909 LOG((4,
"%s: for dimension %d, found dim %s",
3910 __func__, d, dim->name));
3911 var->dimids[d] = dim->dimid;
3918 LOG((5,
"%s: dimid for this dimscale is %d", __func__, var->type_info->nc_typeid));
3925 hsize_t *h5dimlen = NULL, *h5dimlenmax = NULL;
3929 if ((spaceid = H5Dget_space(var->hdf_datasetid)) < 0)
3935 if (!(h5dimlen = malloc(var->ndims *
sizeof(hsize_t))))
3937 if (!(h5dimlenmax = malloc(var->ndims *
sizeof(hsize_t))))
3942 if ((dataset_ndims = H5Sget_simple_extent_dims(spaceid, h5dimlen,
3943 h5dimlenmax)) < 0) {
3948 if (dataset_ndims != var->ndims) {
3957 if (H5Sget_simple_extent_type(spaceid) != H5S_SCALAR)
3962 if (H5Sclose(spaceid) < 0) {
3971 for (d = 0; d < var->ndims; d++)
3974 for (dim = grp->dim; dim; dim = dim->l.next)
3975 if ((dim->len == h5dimlen[d]) &&
3976 ((h5dimlenmax[d] == H5S_UNLIMITED && dim->unlimited) ||
3977 (h5dimlenmax[d] != H5S_UNLIMITED && !dim->unlimited)))
3985 LOG((3,
"%s: creating phony dim for var %s", __func__, var->name));
3986 if ((retval = nc4_dim_list_add(&grp->dim, &dim))) {
3991 dim->dimid = grp->nc4_info->next_dimid++;
3992 sprintf(phony_dim_name,
"phony_dim_%d", dim->dimid);
3993 if (!(dim->name = strdup(phony_dim_name))) {
3998 dim->len = h5dimlen[d];
3999 dim->hash = hash_fast(phony_dim_name, strlen(phony_dim_name));
4000 if (h5dimlenmax[d] == H5S_UNLIMITED)
4001 dim->unlimited = NC_TRUE;
4005 var->dimids[d] = dim->dimid;
4033 nc4_get_typelen_mem(NC_HDF5_FILE_INFO_T *h5,
nc_type xtype,
int is_long,
4036 NC_TYPE_INFO_T *type;
4039 LOG((4,
"%s xtype: %d", __func__, xtype));
4048 *len =
sizeof(char);
4052 *len =
sizeof(short);
4057 *len =
sizeof(long);
4062 *len =
sizeof(float);
4065 *len =
sizeof(double);
4069 *len =
sizeof(
long long);
4072 *len =
sizeof(
char *);
4077 if ((retval = nc4_find_type(h5, xtype, &type)))
4085 LOG((5,
"type->size: %d", type->size));
4103 nc4_get_typeclass(
const NC_HDF5_FILE_INFO_T *h5,
nc_type xtype,
int *type_class)
4107 LOG((4,
"%s xtype: %d", __func__, xtype));
4147 NC_TYPE_INFO_T *type;
4150 if ((retval = nc4_find_type(h5, xtype, &type)))
4155 *type_class = type->nc_type_class;
4172 reportobject(
int log, hid_t
id,
unsigned int type)
4176 const char*
typename = NULL;
4178 len = H5Iget_name(
id, name,
MAXNAME);
4183 case H5F_OBJ_FILE:
typename =
"File";
break;
4184 case H5F_OBJ_DATASET:
typename =
"Dataset";
break;
4185 case H5F_OBJ_GROUP:
typename =
"Group";
break;
4186 case H5F_OBJ_DATATYPE:
typename =
"Datatype";
break;
4188 typename =
"Attribute";
4189 len = H5Aget_name(
id,
MAXNAME, name);
4190 if(len < 0) len = 0;
4193 default:
typename =
"<unknown>";
break;
4197 LOG((0,
"Type = %s(%8u) name='%s'",
typename,
id,name));
4200 fprintf(stderr,
"Type = %s(%8u) name='%s'",
typename,(
unsigned int)
id,name);
4215 reportopenobjectsT(
int log, hid_t fid,
int ntypes,
unsigned int* otypes)
4219 size_t maxobjs = -1;
4220 hid_t* idlist = NULL;
4224 LOG((0,
"\nReport: open objects on %d\n",fid));
4227 fprintf(stdout,
"\nReport: open objects on %d\n",(
int)fid);
4229 maxobjs = H5Fget_obj_count(fid,H5F_OBJ_ALL);
4230 if(idlist != NULL) free(idlist);
4231 idlist = (hid_t*)malloc(
sizeof(hid_t)*maxobjs);
4232 for(t=0;t<ntypes;t++) {
4233 unsigned int ot = otypes[t];
4234 ocount = H5Fget_obj_ids(fid,ot,maxobjs,idlist);
4235 for(i=0;i<ocount;i++) {
4236 hid_t o = idlist[i];
4237 reportobject(log,o,ot);
4240 if(idlist != NULL) free(idlist);
4252 reportopenobjects(
int log, hid_t fid)
4254 reportopenobjectsT(log, fid,5,OTYPES);
4269 NC4_hdf5get_libversion(
unsigned* major,
unsigned* minor,
unsigned* release)
4271 if(H5get_libversion(major,minor,release) < 0)
4287 NC4_hdf5get_superblock(
struct NC_HDF5_FILE_INFO* h5,
int* idp)
4292 if((plist = H5Fget_create_plist(h5->hdfid)) < 0)
4294 if(H5Pget_version(plist, &super, NULL, NULL, NULL) < 0)
4296 if(idp) *idp = (int)super;
4298 if(plist >= 0) H5Pclose(plist);
4302 static int NC4_get_strict_att(NC_HDF5_FILE_INFO_T*);
4303 static int NC4_walk(hid_t,
int*);
4330 NC4_isnetcdf4(
struct NC_HDF5_FILE_INFO* h5)
4337 isnc4 = NC4_get_strict_att(h5);
4343 stat = NC4_walk(h5->root_grp->hdf_grpid, &count);
4347 isnc4 = (count >= 2);
4362 NC4_get_strict_att(NC_HDF5_FILE_INFO_T* h5)
4368 grp = h5->root_grp->hdf_grpid;
4370 attid = H5Aopen_name(grp, NC3_STRICT_ATT_NAME);
4385 NC4_walk(hid_t gid,
int* countp)
4394 char name[NC_HDF5_MAX_NAME];
4397 err = H5Gget_num_objs(gid, &nobj);
4398 if(err < 0)
return err;
4400 for(i = 0; i < nobj; i++) {
4402 len = H5Gget_objname_by_idx(gid,(hsize_t)i,name,(
size_t)NC_HDF5_MAX_NAME);
4403 if(len < 0)
return len;
4405 otype = H5Gget_objtype_by_idx(gid,(
size_t)i);
4408 grpid = H5Gopen(gid,name);
4409 NC4_walk(grpid,countp);
4414 if(strcmp(name,
"phony_dim")==0)
4415 *countp = *countp + 1;
4416 dsid = H5Dopen(gid,name);
4417 na = H5Aget_num_attrs(dsid);
4418 for(j = 0; j < na; j++) {
4419 hid_t aid = H5Aopen_idx(dsid,(
unsigned int) j);
4422 ssize_t len = H5Aget_name(aid, NC_HDF5_MAX_NAME, name);
4423 if(len < 0)
return len;
4425 for(p=NC_RESERVED_VARATT_LIST;*p;p++) {
4426 if(strcmp(name,*p) == 0) {
4427 *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