19#include "nc4internal.h"
20#include "ncdispatch.h"
21#include "hdf5internal.h"
28#define __STDC_FORMAT_MACROS
32#define NC_HDF5_MAX_NAME 1024
43flag_atts_dirty(NCindex *attlist) {
45 NC_ATT_INFO_T *att = NULL;
51 for(
size_t i=0;i<ncindexsize(attlist);i++) {
52 att = (NC_ATT_INFO_T*)ncindexith(attlist,i);
53 if(att == NULL)
continue;
77rec_reattach_scales(NC_GRP_INFO_T *grp,
int dimid, hid_t dimscaleid)
80 NC_GRP_INFO_T *child_grp;
84 assert(grp && grp->hdr.name && dimid >= 0 && dimscaleid >= 0);
85 LOG((3,
"%s: grp->hdr.name %s", __func__, grp->hdr.name));
88 for (i = 0; i < ncindexsize(grp->children); i++)
90 child_grp = (NC_GRP_INFO_T*)ncindexith(grp->children, i);
92 if ((retval = rec_reattach_scales(child_grp, dimid, dimscaleid)))
97 for (i = 0; i < ncindexsize(grp->vars); i++)
99 NC_HDF5_VAR_INFO_T *hdf5_var;
101 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,i);
102 assert(var && var->format_var_info);
104 hdf5_var = (NC_HDF5_VAR_INFO_T*)var->format_var_info;
105 assert(hdf5_var != NULL);
106 for (
unsigned int d = 0; d < var->ndims; d++)
108 if (var->dimids[d] == dimid && !hdf5_var->dimscale)
110 LOG((2,
"%s: attaching scale for dimid %d to var %s",
111 __func__, var->dimids[d], var->hdr.name));
114 if (H5DSattach_scale(hdf5_var->hdf_datasetid,
117 hdf5_var->dimscale_attached[d] = NC_TRUE;
142rec_detach_scales(NC_GRP_INFO_T *grp,
int dimid, hid_t dimscaleid)
145 NC_GRP_INFO_T *child_grp;
149 assert(grp && grp->hdr.name && dimid >= 0 && dimscaleid >= 0);
150 LOG((3,
"%s: grp->hdr.name %s", __func__, grp->hdr.name));
153 for(i=0;i<ncindexsize(grp->children);i++) {
154 child_grp = (NC_GRP_INFO_T*)ncindexith(grp->children,i);
155 if(child_grp == NULL)
continue;
156 if ((retval = rec_detach_scales(child_grp, dimid, dimscaleid)))
161 for (i = 0; i < ncindexsize(grp->vars); i++)
163 NC_HDF5_VAR_INFO_T *hdf5_var;
164 var = (NC_VAR_INFO_T*)ncindexith(grp->vars, i);
165 assert(var && var->format_var_info);
166 hdf5_var = (NC_HDF5_VAR_INFO_T *)var->format_var_info;
168 for (
unsigned int d = 0; d < var->ndims; d++)
170 if (var->dimids[d] == dimid && !hdf5_var->dimscale)
172 LOG((2,
"%s: detaching scale for dimid %d to var %s",
173 __func__, var->dimids[d], var->hdr.name));
176 if (hdf5_var->dimscale_attached && hdf5_var->dimscale_attached[d])
178 if (H5DSdetach_scale(hdf5_var->hdf_datasetid,
181 hdf5_var->dimscale_attached[d] = NC_FALSE;
202nc4_open_var_grp2(NC_GRP_INFO_T *grp,
int varid, hid_t *dataset)
205 NC_HDF5_VAR_INFO_T *hdf5_var;
207 assert(grp && grp->format_grp_info && dataset);
210 if (!(var = (NC_VAR_INFO_T *)ncindexith(grp->vars, (
size_t)varid)))
212 assert(var && var->hdr.id == varid && var->format_var_info);
213 hdf5_var = (NC_HDF5_VAR_INFO_T *)var->format_var_info;
216 if (!hdf5_var->hdf_datasetid)
218 NC_HDF5_GRP_INFO_T *hdf5_grp;
219 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
221 if ((hdf5_var->hdf_datasetid = H5Dopen2(hdf5_grp->hdf_grpid,
222 var->hdr.name, H5P_DEFAULT)) < 0)
226 *dataset = hdf5_var->hdf_datasetid;
249nc4_get_hdf_typeid(NC_FILE_INFO_T *h5,
nc_type xtype,
250 hid_t *hdf_typeid,
int endianness)
252 NC_TYPE_INFO_T *type;
256 assert(hdf_typeid && h5);
268 if ((
typeid = H5Tcopy(H5T_C_S1)) < 0)
270 if (H5Tset_strpad(
typeid, H5T_STR_NULLTERM) < 0)
272 if(H5Tset_cset(
typeid, H5T_CSET_ASCII) < 0)
276 *hdf_typeid =
typeid;
281 if ((
typeid = H5Tcopy(H5T_C_S1)) < 0)
283 if (H5Tset_size(
typeid, H5T_VARIABLE) < 0)
285 if(H5Tset_cset(
typeid, H5T_CSET_UTF8) < 0)
289 *hdf_typeid =
typeid;
300 typeid = H5T_STD_I8LE;
302 typeid = H5T_STD_I8BE;
304 typeid = H5T_NATIVE_SCHAR;
309 typeid = H5T_STD_I16LE;
311 typeid = H5T_STD_I16BE;
313 typeid = H5T_NATIVE_SHORT;
318 typeid = H5T_STD_I32LE;
320 typeid = H5T_STD_I32BE;
322 typeid = H5T_NATIVE_INT;
327 typeid = H5T_STD_U8LE;
329 typeid = H5T_STD_U8BE;
331 typeid = H5T_NATIVE_UCHAR;
336 typeid = H5T_STD_U16LE;
338 typeid = H5T_STD_U16BE;
340 typeid = H5T_NATIVE_USHORT;
345 typeid = H5T_STD_U32LE;
347 typeid = H5T_STD_U32BE;
349 typeid = H5T_NATIVE_UINT;
354 typeid = H5T_STD_I64LE;
356 typeid = H5T_STD_I64BE;
358 typeid = H5T_NATIVE_LLONG;
363 typeid = H5T_STD_U64LE;
365 typeid = H5T_STD_U64BE;
367 typeid = H5T_NATIVE_ULLONG;
372 typeid = H5T_IEEE_F32LE;
374 typeid = H5T_IEEE_F32BE;
376 typeid = H5T_NATIVE_FLOAT;
381 typeid = H5T_IEEE_F64LE;
383 typeid = H5T_IEEE_F64BE;
385 typeid = H5T_NATIVE_DOUBLE;
390 if (nc4_find_type(h5, xtype, &type))
394 typeid = ((NC_HDF5_TYPE_INFO_T *)type->format_type_info)->hdf_typeid;
400 if ((*hdf_typeid = H5Tcopy(
typeid)) < 0)
404 assert(*hdf_typeid != -1);
407 if (
typeid > 0 && H5Tclose(
typeid) < 0)
427put_att_grpa(NC_GRP_INFO_T *grp,
int varid, NC_ATT_INFO_T *att)
429 NC_HDF5_GRP_INFO_T *hdf5_grp;
430 hid_t datasetid = 0, locid;
431 hid_t attid = 0, spaceid = 0, file_typeid = 0;
432 hid_t existing_att_typeid = 0, existing_attid = 0, existing_spaceid = 0;
436 int phoney_data = 99;
439 assert(att->hdr.name && grp && grp->format_grp_info);
440 LOG((3,
"%s: varid %d att->hdr.id %d att->hdr.name %s att->nc_typeid %d "
441 "att->len %d", __func__, varid, att->hdr.id, att->hdr.name,
442 att->nc_typeid, att->len));
445 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
448 if (grp->nc4_info->no_write)
453 locid = hdf5_grp->hdf_grpid;
456 if ((retval = nc4_open_var_grp2(grp, varid, &datasetid)))
463 dims[0] = (hsize_t)att->len;
464 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, att->nc_typeid,
483 size_t string_size = dims[0];
487 if ((spaceid = H5Screate(H5S_NULL)) < 0)
492 if ((spaceid = H5Screate(H5S_SCALAR)) < 0)
495 if (H5Tset_size(file_typeid, string_size) < 0)
497 if (H5Tset_strpad(file_typeid, H5T_STR_NULLTERM) < 0)
504 if ((spaceid = H5Screate(H5S_NULL)) < 0)
509 if ((spaceid = H5Screate_simple(1, dims, NULL)) < 0)
515 if ((attr_exists = H5Aexists(locid, att->hdr.name)) < 0)
520 if ((existing_attid = H5Aopen(locid, att->hdr.name, H5P_DEFAULT)) < 0)
524 if ((existing_att_typeid = H5Aget_type(existing_attid)) < 0)
528 if ((existing_spaceid = H5Aget_space(existing_attid)) < 0)
534 if (!H5Tequal(file_typeid, existing_att_typeid) ||
535 (!H5Sextent_equal(spaceid, existing_spaceid)))
540 if (H5Adelete(locid, att->hdr.name) < 0)
545 if ((attid = H5Acreate1(locid, att->hdr.name, file_typeid, spaceid,
550 if (H5Awrite(attid, file_typeid, data) < 0)
558 if (H5Awrite(existing_attid, file_typeid, data) < 0)
567 if ((attid = H5Acreate1(locid, att->hdr.name, file_typeid, spaceid,
572 if (H5Awrite(attid, file_typeid, data) < 0)
577 if (file_typeid && H5Tclose(file_typeid))
579 if (attid > 0 && H5Aclose(attid) < 0)
581 if (existing_att_typeid && H5Tclose(existing_att_typeid))
583 if (existing_attid > 0 && H5Aclose(existing_attid) < 0)
585 if (spaceid > 0 && H5Sclose(spaceid) < 0)
587 if (existing_spaceid > 0 && H5Sclose(existing_spaceid) < 0)
604write_attlist(NCindex *attlist,
int varid, NC_GRP_INFO_T *grp)
609 for(
size_t i = 0; i < ncindexsize(attlist); i++)
611 att = (NC_ATT_INFO_T *)ncindexith(attlist, i);
615 LOG((4,
"%s: writing att %s to varid %d", __func__, att->hdr.name, varid));
616 if ((retval = put_att_grpa(grp, varid, att)))
618 att->dirty = NC_FALSE;
619 att->created = NC_TRUE;
639write_coord_dimids(NC_VAR_INFO_T *var)
641 NC_HDF5_VAR_INFO_T *hdf5_var;
642 hsize_t coords_len[1];
643 hid_t c_spaceid = -1, c_attid = -1;
646 assert(var && var->format_var_info);
649 hdf5_var = (NC_HDF5_VAR_INFO_T *)var->format_var_info;
652 coords_len[0] = var->ndims;
653 if ((c_spaceid = H5Screate_simple(1, coords_len, coords_len)) < 0)
657 if ((c_attid = H5Acreate1(hdf5_var->hdf_datasetid, COORDINATES,
658 H5T_NATIVE_INT, c_spaceid, H5P_DEFAULT)) < 0)
662 if (H5Awrite(c_attid, H5T_NATIVE_INT, var->dimids) < 0)
666 if (c_spaceid >= 0 && H5Sclose(c_spaceid) < 0)
668 if (c_attid >= 0 && H5Aclose(c_attid) < 0)
684write_quantize_att(NC_VAR_INFO_T *var)
686 NC_HDF5_VAR_INFO_T *hdf5_var;
688 hid_t c_spaceid = -1, c_attid = -1;
692 assert(var && var->format_var_info);
695 hdf5_var = (NC_HDF5_VAR_INFO_T *)var->format_var_info;
698 switch (var->quantize_mode)
714 if ((c_spaceid = H5Screate_simple(1, &len, &len)) < 0)
718 if ((c_attid = H5Acreate1(hdf5_var->hdf_datasetid, att_name,
719 H5T_NATIVE_INT, c_spaceid, H5P_DEFAULT)) < 0)
723 if (H5Awrite(c_attid, H5T_NATIVE_INT, &var->nsd) < 0)
727 if (c_spaceid >= 0 && H5Sclose(c_spaceid) < 0)
729 if (c_attid >= 0 && H5Aclose(c_attid) < 0)
745write_netcdf4_dimid(hid_t datasetid,
int dimid)
747 hid_t dimid_spaceid = -1, dimid_attid = -1;
752 if ((dimid_spaceid = H5Screate(H5S_SCALAR)) < 0)
756 if ((attr_exists = H5Aexists(datasetid, NC_DIMID_ATT_NAME)) < 0)
759 dimid_attid = H5Aopen_by_name(datasetid,
".", NC_DIMID_ATT_NAME,
760 H5P_DEFAULT, H5P_DEFAULT);
763 dimid_attid = H5Acreate1(datasetid, NC_DIMID_ATT_NAME,
764 H5T_NATIVE_INT, dimid_spaceid, H5P_DEFAULT);
770 LOG((4,
"%s: writing secret dimid %d", __func__, dimid));
771 if (H5Awrite(dimid_attid, H5T_NATIVE_INT, &dimid) < 0)
776 if (dimid_spaceid >= 0 && H5Sclose(dimid_spaceid) < 0)
778 if (dimid_attid >= 0 && H5Aclose(dimid_attid) < 0)
799var_create_dataset(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var, nc_bool_t write_dimid)
801 NC_HDF5_GRP_INFO_T *hdf5_grp;
802 NC_HDF5_VAR_INFO_T *hdf5_var;
803 hid_t plistid = 0, access_plistid = 0,
typeid = 0, spaceid = 0;
804 hsize_t chunksize[H5S_MAX_RANK], dimsize[H5S_MAX_RANK], maxdimsize[H5S_MAX_RANK];
807 NC_DIM_INFO_T *dim = NULL;
810 unsigned int* params = NULL;
812 assert(grp && grp->format_grp_info && var && var->format_var_info);
814 LOG((3,
"%s:: name %s", __func__, var->hdr.name));
817 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
818 hdf5_var = (NC_HDF5_VAR_INFO_T *)var->format_var_info;
821 if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
823 if ((access_plistid = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
827 if (H5Pset_obj_track_times(plistid, 0) < 0)
831 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, var->type_info->hdr.id, &
typeid,
832 var->type_info->endianness)))
839 if (H5Pset_fill_time(plistid, H5D_FILL_TIME_NEVER) < 0)
844 if ((retval = nc4_get_fill_value(grp->nc4_info, var, &fillp)))
850 if (var->type_info->nc_type_class ==
NC_STRING)
852 if (H5Pset_fill_value(plistid,
typeid, fillp) < 0)
861 hid_t fill_typeid = 0;
863 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, var->type_info->hdr.id, &fill_typeid,
866 if (H5Pset_fill_value(plistid, fill_typeid, fillp) < 0)
868 if (H5Tclose(fill_typeid) < 0)
872 if (H5Tclose(fill_typeid) < 0)
884 if(var->filters != NULL) {
886 NClist* filters = (NClist*)var->filters;
887 for(j=0;j<nclistlength(filters);j++) {
888 struct NC_HDF5_Filter* fi = (
struct NC_HDF5_Filter*)nclistget(filters,j);
889 if(fi->filterid == H5Z_FILTER_FLETCHER32) {
890 if(H5Pset_fletcher32(plistid) < 0)
892 }
else if(fi->filterid == H5Z_FILTER_SHUFFLE) {
893 if(H5Pset_shuffle(plistid) < 0)
895 }
else if(fi->filterid == H5Z_FILTER_DEFLATE) {
898 unsigned int level = fi->params[0];
899 if(H5Pset_deflate(plistid, level) < 0)
901 }
else if(fi->filterid == H5Z_FILTER_SZIP) {
904 unsigned int options_mask = fi->params[0];
905 unsigned int bits_per_pixel = fi->params[1];
906 if(H5Pset_szip(plistid, options_mask, bits_per_pixel) < 0)
909 herr_t code = H5Pset_filter(plistid, fi->filterid,
911 fi->nparams, fi->params);
927 for (d = 0; d < var->ndims; d++) {
929 assert(dim && dim->hdr.id == var->dimids[d]);
937 if (nclistlength((NClist*)var->filters) == 0 &&
938 (var->chunksizes == NULL || !var->chunksizes[0]) && !unlimdim)
943 for (d = 0; d < var->ndims; d++)
946 assert(dim && dim->hdr.id == var->dimids[d]);
947 dimsize[d] = dim->unlimited ? NC_HDF5_UNLIMITED_DIMSIZE : dim->len;
948 maxdimsize[d] = dim->unlimited ? H5S_UNLIMITED : (hsize_t)dim->len;
951 if (var->chunksizes[d])
952 chunksize[d] = var->chunksizes[d];
956 if (var->type_info->nc_type_class ==
NC_STRING)
957 type_size =
sizeof(
char *);
959 type_size = var->type_info->size;
965 chunksize[d] = (hsize_t)pow(DEFAULT_CHUNK_SIZE/(
double)type_size,
966 1/(double)((
int)var->ndims - unlimdim));
970 if (!dim->unlimited && chunksize[d] > dim->len)
971 chunksize[d] = dim->len;
974 var->chunksizes[d] = chunksize[d];
980 if ((spaceid = H5Screate_simple((
int)var->ndims, dimsize, maxdimsize)) < 0)
985 if ((spaceid = H5Screate(H5S_SCALAR)) < 0)
994 if (H5Pset_layout(plistid, H5D_CONTIGUOUS) < 0)
999 if (H5Pset_layout(plistid, H5D_COMPACT) < 0)
1002 else if (var->ndims)
1004 if (H5Pset_chunk(plistid, (
int)var->ndims, chunksize) < 0)
1009 if (!grp->nc4_info->no_attr_create_order) {
1010 if (H5Pset_attr_creation_order(plistid, H5P_CRT_ORDER_TRACKED|
1011 H5P_CRT_ORDER_INDEXED) < 0)
1016 if (var->storage ==
NC_CHUNKED && var->chunkcache.size)
1017 if (H5Pset_chunk_cache(access_plistid, var->chunkcache.nelems,
1018 var->chunkcache.size, var->chunkcache.preemption) < 0)
1022 name_to_use = var->alt_name ? var->alt_name : var->hdr.name;
1023 LOG((4,
"%s: about to H5Dcreate2 dataset %s of type 0x%x", __func__,
1024 name_to_use,
typeid));
1025 if ((hdf5_var->hdf_datasetid = H5Dcreate2(hdf5_grp->hdf_grpid, name_to_use,
typeid,
1026 spaceid, H5P_DEFAULT, plistid, access_plistid)) < 0)
1028 var->created = NC_TRUE;
1029 var->is_new_var = NC_FALSE;
1035 if ((retval = write_coord_dimids(var)))
1041 if (hdf5_var->dimscale)
1043 if (H5DSset_scale(hdf5_var->hdf_datasetid, var->hdr.name) < 0)
1054 if ((retval = write_netcdf4_dimid(hdf5_var->hdf_datasetid, var->dimids[0])))
1062 if (var->quantize_mode)
1063 if ((retval = write_quantize_att(var)))
1067 if ((retval = write_attlist(var->att, var->hdr.id, grp)))
1071 var->attr_dirty = NC_FALSE;
1075 if (
typeid > 0 && H5Tclose(
typeid) < 0)
1077 if (plistid > 0 && H5Pclose(plistid) < 0)
1079 if (access_plistid > 0 && H5Pclose(access_plistid) < 0)
1081 if (spaceid > 0 && H5Sclose(spaceid) < 0)
1085 if (var->type_info->nc_type_class ==
NC_VLEN)
1087 else if (var->type_info->nc_type_class ==
NC_STRING && *(
char **)fillp)
1088 free(*(
char **)fillp);
1109nc4_adjust_var_cache(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var)
1111 size_t chunk_size_bytes = 1;
1121 if (grp->nc4_info->parallel)
1126 for (d = 0; d < var->ndims; d++)
1127 chunk_size_bytes *= var->chunksizes[d];
1128 if (var->type_info->size)
1129 chunk_size_bytes *= var->type_info->size;
1131 chunk_size_bytes *=
sizeof(
char *);
1136 if (var->chunkcache.size == CHUNK_CACHE_SIZE)
1137 if (chunk_size_bytes > var->chunkcache.size)
1139 var->chunkcache.size = chunk_size_bytes * DEFAULT_CHUNKS_IN_CACHE;
1140 if (var->chunkcache.size > DEFAULT_CHUNK_CACHE_SIZE)
1141 var->chunkcache.size = DEFAULT_CHUNK_CACHE_SIZE;
1142 if ((retval = nc4_reopen_dataset(grp, var)))
1165commit_type(NC_GRP_INFO_T *grp, NC_TYPE_INFO_T *type)
1167 NC_HDF5_GRP_INFO_T *hdf5_grp;
1168 NC_HDF5_TYPE_INFO_T *hdf5_type;
1169 hid_t base_hdf_typeid;
1172 assert(grp && grp->format_grp_info && type && type->format_type_info);
1175 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
1176 hdf5_type = (NC_HDF5_TYPE_INFO_T *)type->format_type_info;
1179 if (type->committed)
1185 NC_FIELD_INFO_T *field;
1186 hid_t hdf_base_typeid, hdf_typeid;
1189 if ((hdf5_type->hdf_typeid = H5Tcreate(H5T_COMPOUND, type->size)) < 0)
1191 LOG((4,
"creating compound type %s hdf_typeid 0x%x", type->hdr.name,
1192 hdf5_type->hdf_typeid));
1194 for(i=0;i<nclistlength(type->u.c.field);i++)
1196 field = (NC_FIELD_INFO_T *)nclistget(type->u.c.field, i);
1198 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, field->nc_typeid,
1199 &hdf_base_typeid, type->endianness)))
1208 for (d = 0; d < field->ndims; d++)
1209 dims[d] = (hsize_t)field->dim_size[d];
1210 if ((hdf_typeid = H5Tarray_create1(hdf_base_typeid, field->ndims,
1213 if (H5Tclose(hdf_base_typeid) < 0)
1217 if (H5Tclose(hdf_base_typeid) < 0)
1221 hdf_typeid = hdf_base_typeid;
1222 LOG((4,
"inserting field %s offset %d hdf_typeid 0x%x", field->hdr.name,
1223 field->offset, hdf_typeid));
1224 if (H5Tinsert(hdf5_type->hdf_typeid, field->hdr.name, field->offset,
1227 if (H5Tclose(hdf_typeid) < 0)
1231 else if (type->nc_type_class ==
NC_VLEN)
1234 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, type->u.v.base_nc_typeid,
1235 &base_hdf_typeid, type->endianness)))
1239 if ((hdf5_type->hdf_typeid = H5Tvlen_create(base_hdf_typeid)) < 0)
1242 else if (type->nc_type_class ==
NC_OPAQUE)
1245 if ((hdf5_type->hdf_typeid = H5Tcreate(H5T_OPAQUE, type->size)) < 0)
1248 else if (type->nc_type_class ==
NC_ENUM)
1250 NC_ENUM_MEMBER_INFO_T *enum_m;
1253 if (nclistlength(type->u.e.enum_member) == 0)
1257 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, type->u.e.base_nc_typeid,
1258 &base_hdf_typeid, type->endianness)))
1262 if ((hdf5_type->hdf_typeid = H5Tenum_create(base_hdf_typeid)) < 0)
1266 for(i=0;i<nclistlength(type->u.e.enum_member);i++) {
1267 enum_m = (NC_ENUM_MEMBER_INFO_T*)nclistget(type->u.e.enum_member,i);
1268 if (H5Tenum_insert(hdf5_type->hdf_typeid, enum_m->name, enum_m->value) < 0)
1274 LOG((0,
"Unknown class: %d", type->nc_type_class));
1279 if (H5Tcommit1(hdf5_grp->hdf_grpid, type->hdr.name, hdf5_type->hdf_typeid) < 0)
1281 type->committed = NC_TRUE;
1282 LOG((4,
"just committed type %s, HDF typeid: 0x%x", type->hdr.name,
1283 hdf5_type->hdf_typeid));
1288 if ((hdf5_type->native_hdf_typeid = H5Tget_native_type(hdf5_type->hdf_typeid,
1289 H5T_DIR_DEFAULT)) < 0)
1306write_nc3_strict_att(hid_t hdf_grpid)
1308 hid_t attid = 0, spaceid = 0;
1315 if ((attr_exists = H5Aexists(hdf_grpid, NC3_STRICT_ATT_NAME)) < 0)
1322 if ((spaceid = H5Screate(H5S_SCALAR)) < 0)
1324 if ((attid = H5Acreate1(hdf_grpid, NC3_STRICT_ATT_NAME,
1325 H5T_NATIVE_INT, spaceid, H5P_DEFAULT)) < 0)
1327 if (H5Awrite(attid, H5T_NATIVE_INT, &one) < 0)
1331 if (spaceid > 0 && (H5Sclose(spaceid) < 0))
1333 if (attid > 0 && (H5Aclose(attid) < 0))
1351create_group(NC_GRP_INFO_T *grp)
1353 NC_HDF5_GRP_INFO_T *hdf5_grp, *parent_hdf5_grp;
1357 assert(grp && grp->format_grp_info && grp->parent &&
1358 grp->parent->format_grp_info);
1361 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
1362 parent_hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->parent->format_grp_info;
1363 assert(parent_hdf5_grp->hdf_grpid);
1367 if ((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0)
1371 if (H5Pset_obj_track_times(gcpl_id, 0) < 0)
1375 if (H5Pset_link_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0)
1379 if (!grp->nc4_info->no_attr_create_order) {
1380 if (H5Pset_attr_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0)
1385 if ((hdf5_grp->hdf_grpid = H5Gcreate2(parent_hdf5_grp->hdf_grpid, grp->hdr.name,
1386 H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
1390 if (gcpl_id > -1 && H5Pclose(gcpl_id) < 0)
1393 if (hdf5_grp->hdf_grpid > 0 && H5Gclose(hdf5_grp->hdf_grpid) < 0)
1411attach_dimscales(NC_GRP_INFO_T *grp)
1414 NC_HDF5_VAR_INFO_T *hdf5_var;
1417 for (
size_t v = 0; v < ncindexsize(grp->vars); v++)
1420 var = (NC_VAR_INFO_T *)ncindexith(grp->vars, v);
1421 assert(var && var->format_var_info);
1422 hdf5_var = (NC_HDF5_VAR_INFO_T *)var->format_var_info;
1426 if (hdf5_var->dimscale)
1430 for (
unsigned int d = 0; d < var->ndims; d++)
1433 if (hdf5_var->dimscale_attached)
1435 if (!hdf5_var->dimscale_attached[d])
1438 assert(var->dim[d] && var->dim[d]->hdr.id == var->dimids[d] &&
1439 var->dim[d]->format_dim_info);
1441 LOG((2,
"%s: attaching scale for dimid %d to var %s",
1442 __func__, var->dimids[d], var->hdr.name));
1445 if (var->dim[d]->coord_var)
1446 dsid = ((NC_HDF5_VAR_INFO_T *)(var->dim[d]->coord_var->format_var_info))->hdf_datasetid;
1448 dsid = ((NC_HDF5_DIM_INFO_T *)var->dim[d]->format_dim_info)->hdf_dimscaleid;
1454 if (H5DSattach_scale(hdf5_var->hdf_datasetid, dsid, d) < 0)
1456 hdf5_var->dimscale_attached[d] = NC_TRUE;
1476var_exists(hid_t grpid,
char *name, nc_bool_t *exists)
1484 if ((link_exists = H5Lexists(grpid, name, H5P_DEFAULT)) < 0)
1491 if (H5Gget_objinfo(grpid, name, 1, &statbuf) < 0)
1494 if (H5G_DATASET == statbuf.type)
1517remove_coord_atts(hid_t hdf_datasetid)
1523 if ((attr_exists = H5Aexists(hdf_datasetid, NC_DIMID_ATT_NAME)) < 0)
1527 if (H5Adelete(hdf_datasetid, NC_DIMID_ATT_NAME) < 0)
1532 if ((attr_exists = H5Aexists(hdf_datasetid,
1533 HDF5_DIMSCALE_CLASS_ATT_NAME)) < 0)
1537 if (H5Adelete(hdf_datasetid, HDF5_DIMSCALE_CLASS_ATT_NAME) < 0)
1540 if ((attr_exists = H5Aexists(hdf_datasetid,
1541 HDF5_DIMSCALE_NAME_ATT_NAME)) < 0)
1545 if (H5Adelete(hdf_datasetid, HDF5_DIMSCALE_NAME_ATT_NAME) < 0)
1566write_var(NC_VAR_INFO_T *var, NC_GRP_INFO_T *grp, nc_bool_t write_dimid)
1568 NC_HDF5_GRP_INFO_T *hdf5_grp;
1569 NC_HDF5_VAR_INFO_T *hdf5_var;
1570 nc_bool_t replace_existing_var = NC_FALSE;
1573 assert(var && var->format_var_info && grp && grp->format_grp_info);
1575 LOG((4,
"%s: writing var %s", __func__, var->hdr.name));
1578 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
1579 hdf5_var = (NC_HDF5_VAR_INFO_T *)var->format_var_info;
1583 if (var->created && var->fill_val_changed)
1585 replace_existing_var = NC_TRUE;
1586 var->fill_val_changed = NC_FALSE;
1592 flag_atts_dirty(var->att);
1599 if (var->became_coord_var)
1601 if ((NC_DIM_INFO_T *)ncindexlookup(grp->dim, var->hdr.name))
1605 if ((retval = var_exists(hdf5_grp->hdf_grpid, var->hdr.name, &exists)))
1611 replace_existing_var = NC_TRUE;
1612 flag_atts_dirty(var->att);
1619 if (replace_existing_var)
1624 if ((d1 = (NC_DIM_INFO_T *)ncindexlookup(grp->dim, var->hdr.name)))
1627 assert(d1->format_dim_info && d1->hdr.name);
1629 if ((retval = var_exists(hdf5_grp->hdf_grpid, var->hdr.name, &exists)))
1637 dsid = ((NC_HDF5_VAR_INFO_T *)d1->coord_var->format_var_info)->hdf_datasetid;
1639 dsid = ((NC_HDF5_DIM_INFO_T *)d1->format_dim_info)->hdf_dimscaleid;
1645 if ((retval = rec_detach_scales(grp->nc4_info->root_grp,
1646 var->dimids[0], dsid)))
1654 if (var->was_coord_var && hdf5_var->dimscale_attached)
1659 if ((retval = remove_coord_atts(hdf5_var->hdf_datasetid)))
1663 for (
unsigned int d = 0; d < var->ndims; d++)
1665 if (hdf5_var->dimscale_attached[d])
1668 assert(var->dim[d] && var->dim[d]->hdr.id == var->dimids[d] &&
1669 var->dim[d]->format_dim_info);
1672 if (var->dim[d]->coord_var)
1673 dsid = ((NC_HDF5_VAR_INFO_T *)var->dim[d]->coord_var->format_var_info)->hdf_datasetid;
1675 dsid = ((NC_HDF5_DIM_INFO_T *)var->dim[d]->format_dim_info)->hdf_dimscaleid;
1679 if (H5DSdetach_scale(hdf5_var->hdf_datasetid, dsid, d) < 0)
1681 hdf5_var->dimscale_attached[d] = NC_FALSE;
1687 if (replace_existing_var)
1690 if (hdf5_var->hdf_datasetid && H5Dclose(hdf5_var->hdf_datasetid) < 0)
1692 hdf5_var->hdf_datasetid = 0;
1695 if (H5Gunlink(hdf5_grp->hdf_grpid, var->hdr.name) < 0)
1700 if (var->is_new_var || replace_existing_var)
1702 if ((retval = var_create_dataset(grp, var, write_dimid)))
1707 if (write_dimid && var->ndims)
1708 if ((retval = write_netcdf4_dimid(hdf5_var->hdf_datasetid,
1713 if (replace_existing_var)
1717 if(hdf5_var->dimscale)
1719 if ((retval = rec_reattach_scales(grp->nc4_info->root_grp,
1720 var->dimids[0], hdf5_var->hdf_datasetid)))
1727 if (hdf5_var->dimscale_attached)
1728 memset(hdf5_var->dimscale_attached, 0,
sizeof(nc_bool_t) * var->ndims);
1733 var->was_coord_var = NC_FALSE;
1734 var->became_coord_var = NC_FALSE;
1737 if (var->attr_dirty)
1740 if ((retval = write_attlist(var->att, var->hdr.id, grp)))
1742 var->attr_dirty = NC_FALSE;
1760nc4_create_dim_wo_var(NC_DIM_INFO_T *dim)
1762 NC_HDF5_DIM_INFO_T *hdf5_dim;
1763 NC_HDF5_GRP_INFO_T *hdf5_grp;
1764 hid_t spaceid = -1, create_propid = -1;
1765 hsize_t dims[1], max_dims[1], chunk_dims[1] = {1};
1769 LOG((4,
"%s: creating dim %s", __func__, dim->hdr.name));
1772 assert(!dim->coord_var);
1775 hdf5_grp = (NC_HDF5_GRP_INFO_T *)dim->container->format_grp_info;
1776 hdf5_dim = (NC_HDF5_DIM_INFO_T *)dim->format_dim_info;
1779 if ((create_propid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
1783 if (H5Pset_obj_track_times(create_propid, 0) < 0)
1788 max_dims[0] = dim->len;
1794 max_dims[0] = H5S_UNLIMITED;
1795 if (H5Pset_chunk(create_propid, 1, chunk_dims) < 0)
1800 if ((spaceid = H5Screate_simple(1, dims, max_dims)) < 0)
1804 if (!dim->container->nc4_info->no_attr_create_order) {
1805 if (H5Pset_attr_creation_order(create_propid, H5P_CRT_ORDER_TRACKED|
1806 H5P_CRT_ORDER_INDEXED) < 0)
1810 LOG((4,
"%s: about to H5Dcreate1 a dimscale dataset %s", __func__,
1812 if ((hdf5_dim->hdf_dimscaleid = H5Dcreate2(hdf5_grp->hdf_grpid, dim->hdr.name,
1813 H5T_IEEE_F32BE, spaceid,
1814 H5P_DEFAULT, create_propid,
1821 snprintf(dimscale_wo_var,
sizeof(dimscale_wo_var),
"%s%10d", DIM_WITHOUT_VARIABLE, (
int)dim->len);
1822 if (H5DSset_scale(hdf5_dim->hdf_dimscaleid, dimscale_wo_var) < 0)
1828 if ((retval = write_netcdf4_dimid(hdf5_dim->hdf_dimscaleid, dim->hdr.id)))
1832 if (spaceid > 0 && H5Sclose(spaceid) < 0)
1834 if (create_propid > 0 && H5Pclose(create_propid) < 0)
1852write_dim(NC_DIM_INFO_T *dim, NC_GRP_INFO_T *grp, nc_bool_t write_dimid)
1854 NC_HDF5_DIM_INFO_T *hdf5_dim;
1857 assert(dim && dim->format_dim_info && grp && grp->format_grp_info);
1860 hdf5_dim = (NC_HDF5_DIM_INFO_T *)dim->format_dim_info;
1866 if (!hdf5_dim->hdf_dimscaleid)
1867 if ((retval = nc4_create_dim_wo_var(dim)))
1873 NC_VAR_INFO_T *v1 = NULL;
1875 assert(dim->unlimited);
1879 v1 = dim->coord_var;
1882 NC_HDF5_VAR_INFO_T *hdf5_v1;
1886 hdf5_v1 = (NC_HDF5_VAR_INFO_T *)v1->format_var_info;
1890 if (!(new_size = malloc(v1->ndims *
sizeof(hsize_t))))
1892 for (d1 = 0; d1 < v1->ndims; d1++)
1894 assert(v1->dim[d1] && v1->dim[d1]->hdr.id == v1->dimids[d1]);
1895 new_size[d1] = v1->dim[d1]->len;
1897 if (H5Dset_extent(hdf5_v1->hdf_datasetid, new_size) < 0)
1907 if (write_dimid && hdf5_dim->hdf_dimscaleid)
1908 if ((retval = write_netcdf4_dimid(hdf5_dim->hdf_dimscaleid, dim->hdr.id)))
1929nc4_rec_write_metadata(NC_GRP_INFO_T *grp, nc_bool_t bad_coord_order)
1931 NC_DIM_INFO_T *dim = NULL;
1932 NC_VAR_INFO_T *var = NULL;
1933 NC_GRP_INFO_T *child_grp = NULL;
1934 int coord_varid = -1;
1935 size_t var_index = 0;
1936 size_t dim_index = 0;
1939 assert(grp && grp->hdr.name &&
1940 ((NC_HDF5_GRP_INFO_T *)(grp->format_grp_info))->hdf_grpid);
1941 LOG((3,
"%s: grp->hdr.name %s, bad_coord_order %d", __func__, grp->hdr.name,
1945 if ((retval = write_attlist(grp->att,
NC_GLOBAL, grp)))
1950 dim = (NC_DIM_INFO_T *)ncindexith(grp->dim, dim_index);
1951 var = (NC_VAR_INFO_T *)ncindexith(grp->vars, var_index);
1958 nc_bool_t found_coord, wrote_coord;
1962 for (found_coord = NC_FALSE; dim && !found_coord; )
1964 if (!dim->coord_var)
1966 if ((retval = write_dim(dim, grp, bad_coord_order)))
1971 coord_varid = dim->coord_var->hdr.id;
1972 found_coord = NC_TRUE;
1974 dim = (NC_DIM_INFO_T *)ncindexith(grp->dim, ++dim_index);
1979 for (wrote_coord = NC_FALSE; var && !wrote_coord; )
1981 if ((retval = write_var(var, grp, bad_coord_order)))
1983 if (found_coord && var->hdr.id == coord_varid)
1984 wrote_coord = NC_TRUE;
1985 var = (NC_VAR_INFO_T *)ncindexith(grp->vars, ++var_index);
1990 if (!grp->nc4_info->no_dimscale_attach) {
1991 if ((retval = attach_dimscales(grp)))
1996 for (
size_t i = 0; i < ncindexsize(grp->children); i++)
1998 child_grp = (NC_GRP_INFO_T *)ncindexith(grp->children, i);
2000 if ((retval = nc4_rec_write_metadata(child_grp, bad_coord_order)))
2016nc4_rec_write_groups_types(NC_GRP_INFO_T *grp)
2018 NC_GRP_INFO_T *child_grp;
2019 NC_HDF5_GRP_INFO_T *hdf5_grp;
2020 NC_TYPE_INFO_T *type;
2024 assert(grp && grp->hdr.name && grp->format_grp_info);
2025 LOG((3,
"%s: grp->hdr.name %s", __func__, grp->hdr.name));
2028 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
2031 if (!hdf5_grp->hdf_grpid)
2032 if ((retval = create_group(grp)))
2038 if ((retval = write_nc3_strict_att(hdf5_grp->hdf_grpid)))
2042 for(i=0;i<ncindexsize(grp->type);i++) {
2043 type = (NC_TYPE_INFO_T *)ncindexith(grp->type, i);
2045 if ((retval = commit_type(grp, type)))
2050 for(i=0;i<ncindexsize(grp->children);i++) {
2051 if((child_grp = (NC_GRP_INFO_T*)ncindexith(grp->children,i)) == NULL)
continue;
2052 if ((retval = nc4_rec_write_groups_types(child_grp)))
2072nc4_rec_match_dimscales(NC_GRP_INFO_T *grp)
2080 assert(grp && grp->hdr.name);
2081 LOG((4,
"%s: grp->hdr.name %s", __func__, grp->hdr.name));
2084 for (i = 0; i < ncindexsize(grp->children); i++)
2086 g = (NC_GRP_INFO_T*)ncindexith(grp->children, i);
2088 if ((retval = nc4_rec_match_dimscales(g)))
2094 for (i = 0; i < ncindexsize(grp->vars); i++)
2096 NC_HDF5_VAR_INFO_T *hdf5_var;
2100 var = (NC_VAR_INFO_T*)ncindexith(grp->vars, i);
2101 assert(var && var->format_var_info);
2102 hdf5_var = (NC_HDF5_VAR_INFO_T *)var->format_var_info;
2119 const size_t ndims = var->ndims;
2120 for (
size_t d = 0; d < ndims; d++)
2122 if (var->dim[d] == NULL) {
2123 nc4_find_dim(grp, var->dimids[d], &var->dim[d], NULL);
2129 if (!hdf5_var->dimscale)
2132 if (hdf5_var->dimscale_hdf5_objids)
2134 for (
size_t d = 0; d < var->ndims; d++)
2136 nc_bool_t finished = NC_FALSE;
2137 LOG((5,
"%s: var %s has dimscale info...", __func__, var->hdr.name));
2140 for (g = grp; g && !finished; g = g->parent)
2143 for (
size_t j = 0; j < ncindexsize(g->dim); j++)
2146 NC_HDF5_DIM_INFO_T *hdf5_dim;
2147 dim = (NC_DIM_INFO_T *)ncindexith(g->dim, j);
2148 assert(dim && dim->format_dim_info);
2149 hdf5_dim = (NC_HDF5_DIM_INFO_T *)dim->format_dim_info;
2153#if H5_VERSION_GE(1,12,0)
2155 if (H5Otoken_cmp(hdf5_var->hdf_datasetid, &hdf5_var->dimscale_hdf5_objids[d].token, &hdf5_dim->hdf5_objid.token, &token_cmp) < 0)
2158 if (hdf5_var->dimscale_hdf5_objids[d].fileno == hdf5_dim->hdf5_objid.fileno &&
2161 if (hdf5_var->dimscale_hdf5_objids[d].fileno[0] == hdf5_dim->hdf5_objid.fileno[0] &&
2162 hdf5_var->dimscale_hdf5_objids[d].objno[0] == hdf5_dim->hdf5_objid.objno[0] &&
2163 hdf5_var->dimscale_hdf5_objids[d].fileno[1] == hdf5_dim->hdf5_objid.fileno[1] &&
2164 hdf5_var->dimscale_hdf5_objids[d].objno[1] == hdf5_dim->hdf5_objid.objno[1])
2167 LOG((4,
"%s: for dimension %d, found dim %s", __func__,
2169 var->dimids[d] = dim->hdr.id;
2176 LOG((5,
"%s: dimid for this dimscale is %d", __func__,
2177 var->type_info->hdr.id));
2184 hsize_t *h5dimlen = NULL, *h5dimlenmax = NULL;
2188 if ((spaceid = H5Dget_space(hdf5_var->hdf_datasetid)) < 0)
2194 if (!(h5dimlen = malloc(var->ndims *
sizeof(hsize_t))))
2196 if (!(h5dimlenmax = malloc(var->ndims *
sizeof(hsize_t))))
2201 if ((dataset_ndims = H5Sget_simple_extent_dims(spaceid, h5dimlen,
2202 h5dimlenmax)) < 0) {
2207 if (dataset_ndims != var->ndims) {
2216 if (H5Sget_simple_extent_type(spaceid) != H5S_SCALAR)
2221 if (H5Sclose(spaceid) < 0) {
2230 for (d = 0; d < var->ndims; d++)
2232 nc_bool_t match = NC_FALSE;
2234 for(
size_t k=0;k<ncindexsize(grp->dim);k++) {
2235 if((dim = (NC_DIM_INFO_T*)ncindexith(grp->dim,k)) == NULL)
continue;
2236 if ((dim->len == h5dimlen[d]) &&
2237 ((h5dimlenmax[d] == H5S_UNLIMITED && dim->unlimited) ||
2238 (h5dimlenmax[d] != H5S_UNLIMITED && !dim->unlimited)))
2239 {match = NC_TRUE;
break;}
2243 if (match == NC_FALSE)
2246 snprintf(phony_dim_name,
sizeof(phony_dim_name),
"phony_dim_%d", grp->nc4_info->next_dimid);
2247 LOG((3,
"%s: creating phony dim for var %s", __func__, var->hdr.name));
2248 if ((retval = nc4_dim_list_add(grp, phony_dim_name, h5dimlen[d], -1, &dim)))
2255 if (!(dim->format_dim_info = calloc(1,
sizeof(NC_HDF5_DIM_INFO_T))))
2257 if (h5dimlenmax[d] == H5S_UNLIMITED)
2258 dim->unlimited = NC_TRUE;
2262 var->dimids[d] = dim->hdr.id;
2288reportobject(
int uselog, hid_t
id,
unsigned int type)
2290 char name[NC_HDF5_MAX_NAME];
2292 const char*
typename = NULL;
2293 long long printid = (
long long)
id;
2295 len = H5Iget_name(
id, name, NC_HDF5_MAX_NAME);
2300 case H5F_OBJ_FILE:
typename =
"File";
break;
2301 case H5F_OBJ_DATASET:
typename =
"Dataset";
break;
2302 case H5F_OBJ_GROUP:
typename =
"Group";
break;
2303 case H5F_OBJ_DATATYPE:
typename =
"Datatype";
break;
2305 typename =
"Attribute";
2306 len = H5Aget_name(
id, NC_HDF5_MAX_NAME, name);
2307 if(len < 0) len = 0;
2310 default:
typename =
"<unknown>";
break;
2314 LOG((0,
"Type = %s(%lld) name='%s'",
typename,printid,name));
2318 fprintf(stderr,
"Type = %s(%lld) name='%s'",
typename,printid,name);
2334reportopenobjectsT(
int uselog, hid_t fid,
int ntypes,
unsigned int* otypes)
2338 hid_t* idlist = NULL;
2343 LOG((0,
"\nReport: open objects on %lld",(
long long)fid));
2346 fprintf(stdout,
"\nReport: open objects on %lld\n",(
long long)fid);
2347 size_t maxobjs = (size_t)H5Fget_obj_count(fid,H5F_OBJ_ALL);
2348 if(idlist != NULL) free(idlist);
2349 idlist = (hid_t*)malloc(
sizeof(hid_t)*maxobjs);
2350 for(t=0;t<ntypes;t++) {
2351 unsigned int ot = otypes[t];
2352 ocount = H5Fget_obj_ids(fid,ot,maxobjs,idlist);
2353 for(i=0;i<ocount;i++) {
2354 hid_t o = idlist[i];
2355 reportobject(uselog,o,ot);
2358 if(idlist != NULL) free(idlist);
2370reportopenobjects(
int uselog, hid_t fid)
2372 unsigned int OTYPES[5] = {H5F_OBJ_FILE, H5F_OBJ_DATASET, H5F_OBJ_GROUP,
2373 H5F_OBJ_DATATYPE, H5F_OBJ_ATTR};
2375 reportopenobjectsT(uselog, fid ,5, OTYPES);
2386showopenobjects5(NC_FILE_INFO_T* h5)
2388 NC_HDF5_FILE_INFO_T *hdf5_info;
2390 assert(h5 && h5->format_file_info);
2391 hdf5_info = (NC_HDF5_FILE_INFO_T *)h5->format_file_info;
2393 fprintf(stderr,
"===== begin showopenobjects =====\n");
2394 reportopenobjects(0,hdf5_info->hdfid);
2395 fprintf(stderr,
"===== end showopenobjects =====\n");
2408showopenobjects(
int ncid)
2410 NC_FILE_INFO_T* h5 = NULL;
2413 if (nc4_find_nc_grp_h5(ncid, NULL, NULL, &h5) !=
NC_NOERR)
2414 fprintf(stderr,
"failed\n");
2416 showopenobjects5(h5);
2432NC4_hdf5get_libversion(
unsigned* major,
unsigned* minor,
unsigned* release)
2434 if(H5get_libversion(major,minor,release) < 0)
2450NC4_hdf5get_superblock(
struct NC_FILE_INFO* h5,
int* idp)
2452 NC_HDF5_FILE_INFO_T *hdf5_info;
2457 assert(h5 && h5->format_file_info);
2458 hdf5_info = (NC_HDF5_FILE_INFO_T *)h5->format_file_info;
2460 if((plist = H5Fget_create_plist(hdf5_info->hdfid)) < 0)
2462 if(H5Pget_version(plist, &super, NULL, NULL, NULL) < 0)
2464 if(idp) *idp = (int)super;
2466 if(plist >= 0) H5Pclose(plist);
2470static int NC4_root_att_exists(NC_FILE_INFO_T*,
const char* aname);
2471static int NC4_walk(hid_t,
int*);
2499NC4_isnetcdf4(
struct NC_FILE_INFO* h5)
2507 exists = NC4_root_att_exists(h5,NC3_STRICT_ATT_NAME);
2509 {isnc4 = 1;
goto done;}
2511 exists = NC4_root_att_exists(h5,NCPROPS);
2513 {isnc4 = 1;
goto done;}
2517 stat = NC4_walk(((NC_HDF5_GRP_INFO_T *)(h5->root_grp->format_grp_info))->hdf_grpid,
2522 isnc4 = (count >= 2);
2538NC4_root_att_exists(NC_FILE_INFO_T *h5,
const char* aname)
2544 grpid = ((NC_HDF5_GRP_INFO_T *)(h5->root_grp->format_grp_info))->hdf_grpid;
2547 if ((attr_exists = H5Aexists(grpid, aname))<0)
2549 return (attr_exists?1:0);
2562NC4_walk(hid_t gid,
int* countp)
2571 char name[NC_HDF5_MAX_NAME];
2574 err = H5Gget_num_objs(gid, &nobj);
2575 if(err < 0)
return err;
2577 for(hsize_t i = 0; i < nobj; i++) {
2579 len = H5Gget_objname_by_idx(gid,i,name,(
size_t)NC_HDF5_MAX_NAME);
2580 if(len < 0)
return (
int)len;
2582 otype = H5Gget_objtype_by_idx(gid, i);
2585 grpid = H5Gopen1(gid,name);
2586 NC4_walk(grpid,countp);
2591 if(strcmp(name,
"phony_dim")==0)
2592 *countp = *countp + 1;
2593 dsid = H5Dopen1(gid,name);
2594 na = H5Aget_num_attrs(dsid);
2595 for(j = 0; j < na; j++) {
2596 hid_t aid = H5Aopen_idx(dsid,(
unsigned int) j);
2598 const NC_reservedatt* ra;
2599 ssize_t len = H5Aget_name(aid, NC_HDF5_MAX_NAME, name);
2600 if(len < 0)
return (
int)len;
2602 ra = NC_findreserved(name);
2604 *countp = *countp + 1;
EXTERNL int nc_free_vlen(nc_vlen_t *vl)
Free memory in a single VLEN object.
Main header file for the C API.
#define NC_EBADTYPE
Not a netcdf data type.
#define NC_UINT
unsigned 4-byte int
#define NC_ENDIAN_NATIVE
In HDF5 files you can set the endianness of variables with nc_def_var_endian().
#define NC_EFILTER
Filter operation failed.
#define NC_QUANTIZE_GRANULARBR_ATT_NAME
When quantization is used for a variable, an attribute of the appropriate name is added.
#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_VAR_DIMS
max per variable dimensions
#define NC_BYTE
signed 1 byte integer
#define NC_EPERM
Write to read only.
#define NC_QUANTIZE_BITROUND
Use BitRound quantization.
#define NC_EDIMSCALE
Problem with HDF5 dimscales.
#define NC_VLEN
vlen (variable-length) types
#define NC_NAT
Not A Type.
#define NC_DOUBLE
double precision floating point number
#define NC_UBYTE
unsigned 1 byte int
#define NC_FLOAT
single precision floating point number
#define NC_ENOMEM
Memory allocation (malloc) failure.
#define NC_COMPOUND
compound types
#define NC_CHUNKED
In HDF5 files you can set storage for each variable to be either contiguous or chunked,...
#define NC_SHORT
signed 2 byte integer
#define NC_QUANTIZE_GRANULARBR
Use Granular BitRound quantization.
#define NC_QUANTIZE_BITGROOM
Use BitGroom quantization.
#define NC_ENUM
enum types
#define NC_INT64
signed 8-byte int
#define NC_EATTMETA
Problem with attribute metadata.
#define NC_EHDFERR
Error at HDF5 layer.
#define NC_CONTIGUOUS
In HDF5 files you can set storage for each variable to be either contiguous or chunked,...
#define NC_GLOBAL
Attribute id to put/get a global attribute.
#define NC_UINT64
unsigned 8-byte int
#define NC_COMPACT
In HDF5 files you can set storage for each variable to be either contiguous or chunked,...
#define NC_EFILEMETA
Problem with file metadata.
#define NC_ENOTVAR
Variable not found.
#define NC_EINVAL
Invalid Argument.
#define NC_CLASSIC_MODEL
Enforce classic model on netCDF-4.
#define NC_ENDIAN_LITTLE
In HDF5 files you can set the endianness of variables with nc_def_var_endian().
#define NC_MAX_NAME
Maximum for classic library.
#define NC_NOERR
No Error.
#define NC_EDIMMETA
Problem with dimension metadata.
#define NC_USHORT
unsigned 2-byte int
#define NC_OPAQUE
opaque types
#define NC_QUANTIZE_BITGROOM_ATT_NAME
When quantization is used for a variable, an attribute of the appropriate name is added.
#define NC_CHAR
ISO/ASCII character.
#define NC_EVARMETA
Problem with variable metadata.
#define NC_QUANTIZE_BITROUND_ATT_NAME
When quantization is used for a variable, an attribute of the appropriate name is added.
int nc_type
The nc_type type is just an int.
This is the type of arrays of vlens.