18 #include "hdf5internal.h" 21 #ifdef HAVE_INTTYPES_H 22 #define __STDC_FORMAT_MACROS 26 #define NC_HDF5_MAX_NAME 1024 37 flag_atts_dirty(NCindex *attlist) {
39 NC_ATT_INFO_T *att = NULL;
46 for(i=0;i<ncindexsize(attlist);i++) {
47 att = (NC_ATT_INFO_T*)ncindexith(attlist,i);
48 if(att == NULL)
continue;
72 rec_reattach_scales(NC_GRP_INFO_T *grp,
int dimid, hid_t dimscaleid)
75 NC_GRP_INFO_T *child_grp;
79 assert(grp && grp->hdr.name && dimid >= 0 && dimscaleid >= 0);
80 LOG((3,
"%s: grp->hdr.name %s", __func__, grp->hdr.name));
83 for(i=0;i<ncindexsize(grp->children);i++) {
84 child_grp = (NC_GRP_INFO_T*)ncindexith(grp->children,i);
85 if(child_grp == NULL)
continue;
86 if ((retval = rec_reattach_scales(child_grp, dimid, dimscaleid)))
91 for(i=0;i<ncindexsize(grp->vars);i++)
93 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,i);
94 if(var == NULL)
continue;
95 for (d = 0; d < var->ndims; d++)
96 if (var->dimids[d] == dimid && !var->dimscale)
98 LOG((2,
"%s: attaching scale for dimid %d to var %s",
99 __func__, var->dimids[d], var->hdr.name));
102 if (H5DSattach_scale(var->hdf_datasetid, dimscaleid, d) < 0)
104 var->dimscale_attached[d] = NC_TRUE;
128 rec_detach_scales(NC_GRP_INFO_T *grp,
int dimid, hid_t dimscaleid)
131 NC_GRP_INFO_T *child_grp;
135 assert(grp && grp->hdr.name && dimid >= 0 && dimscaleid >= 0);
136 LOG((3,
"%s: grp->hdr.name %s", __func__, grp->hdr.name));
139 for(i=0;i<ncindexsize(grp->children);i++) {
140 child_grp = (NC_GRP_INFO_T*)ncindexith(grp->children,i);
141 if(child_grp == NULL)
continue;
142 if ((retval = rec_detach_scales(child_grp, dimid, dimscaleid)))
147 for(i=0;i<ncindexsize(grp->vars);i++) {
148 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,i);
149 if(var == NULL)
continue;
150 for (d = 0; d < var->ndims; d++)
151 if (var->dimids[d] == dimid && !var->dimscale)
153 LOG((2,
"%s: detaching scale for dimid %d to var %s",
154 __func__, var->dimids[d], var->hdr.name));
156 if (var->dimscale_attached && var->dimscale_attached[d])
158 if (H5DSdetach_scale(var->hdf_datasetid, dimscaleid, d) < 0)
160 var->dimscale_attached[d] = NC_FALSE;
179 nc4_open_var_grp2(NC_GRP_INFO_T *grp,
int varid, hid_t *dataset)
183 assert(grp && grp->format_grp_info && dataset);
186 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,varid);
188 assert(var->hdr.id == varid);
191 if (!var->hdf_datasetid)
193 NC_HDF5_GRP_INFO_T *hdf5_grp;
194 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
196 if ((var->hdf_datasetid = H5Dopen2(hdf5_grp->hdf_grpid,
197 var->hdr.name, H5P_DEFAULT)) < 0)
201 *dataset = var->hdf_datasetid;
218 nc4_get_default_fill_value(
const NC_TYPE_INFO_T *type_info,
void *fill_value)
220 switch (type_info->hdr.id)
289 nc4_get_fill_value(NC_FILE_INFO_T *h5, NC_VAR_INFO_T *var,
void **fillp)
295 if (var->type_info->nc_type_class ==
NC_VLEN)
297 else if (var->type_info->nc_type_class ==
NC_STRING)
298 size =
sizeof(
char *);
301 if ((retval = nc4_get_typelen_mem(h5, var->type_info->hdr.id, &size)))
307 if (!((*fillp) = calloc(1, size)))
314 LOG((4,
"Found a fill value for var %s", var->hdr.name));
315 if (var->type_info->nc_type_class ==
NC_VLEN)
318 size_t basetypesize = 0;
320 if((retval=nc4_get_typelen_mem(h5, var->type_info->u.v.base_nc_typeid, &basetypesize)))
323 fv_vlen->
len = in_vlen->
len;
324 if (!(fv_vlen->p = malloc(basetypesize * in_vlen->
len)))
330 memcpy(fv_vlen->p, in_vlen->
p, in_vlen->
len * basetypesize);
332 else if (var->type_info->nc_type_class ==
NC_STRING)
334 if (*(
char **)var->fill_value)
335 if (!(**(
char ***)fillp = strdup(*(
char **)var->fill_value)))
343 memcpy((*fillp), var->fill_value, size);
347 if (nc4_get_default_fill_value(var->type_info, *fillp))
376 nc4_get_hdf_typeid(NC_FILE_INFO_T *h5,
nc_type xtype,
377 hid_t *hdf_typeid,
int endianness)
379 NC_TYPE_INFO_T *type;
383 assert(hdf_typeid && h5);
395 if ((
typeid = H5Tcopy(H5T_C_S1)) < 0)
397 if (H5Tset_strpad(
typeid, H5T_STR_NULLTERM) < 0)
399 if(H5Tset_cset(
typeid, H5T_CSET_ASCII) < 0)
403 *hdf_typeid =
typeid;
408 if ((
typeid = H5Tcopy(H5T_C_S1)) < 0)
410 if (H5Tset_size(
typeid, H5T_VARIABLE) < 0)
412 if(H5Tset_cset(
typeid, H5T_CSET_UTF8) < 0)
416 *hdf_typeid =
typeid;
427 typeid = H5T_STD_I8LE;
429 typeid = H5T_STD_I8BE;
431 typeid = H5T_NATIVE_SCHAR;
436 typeid = H5T_STD_I16LE;
438 typeid = H5T_STD_I16BE;
440 typeid = H5T_NATIVE_SHORT;
445 typeid = H5T_STD_I32LE;
447 typeid = H5T_STD_I32BE;
449 typeid = H5T_NATIVE_INT;
454 typeid = H5T_STD_U8LE;
456 typeid = H5T_STD_U8BE;
458 typeid = H5T_NATIVE_UCHAR;
463 typeid = H5T_STD_U16LE;
465 typeid = H5T_STD_U16BE;
467 typeid = H5T_NATIVE_USHORT;
472 typeid = H5T_STD_U32LE;
474 typeid = H5T_STD_U32BE;
476 typeid = H5T_NATIVE_UINT;
481 typeid = H5T_STD_I64LE;
483 typeid = H5T_STD_I64BE;
485 typeid = H5T_NATIVE_LLONG;
490 typeid = H5T_STD_U64LE;
492 typeid = H5T_STD_U64BE;
494 typeid = H5T_NATIVE_ULLONG;
499 typeid = H5T_IEEE_F32LE;
501 typeid = H5T_IEEE_F32BE;
503 typeid = H5T_NATIVE_FLOAT;
508 typeid = H5T_IEEE_F64LE;
510 typeid = H5T_IEEE_F64BE;
512 typeid = H5T_NATIVE_DOUBLE;
517 if (nc4_find_type(h5, xtype, &type))
521 typeid = type->hdf_typeid;
527 if ((*hdf_typeid = H5Tcopy(
typeid)) < 0)
531 assert(*hdf_typeid != -1);
534 if (
typeid > 0 && H5Tclose(
typeid) < 0)
554 put_att_grpa(NC_GRP_INFO_T *grp,
int varid, NC_ATT_INFO_T *att)
556 NC_HDF5_GRP_INFO_T *hdf5_grp;
557 hid_t datasetid = 0, locid;
558 hid_t attid = 0, spaceid = 0, file_typeid = 0;
559 hid_t existing_att_typeid = 0, existing_attid = 0, existing_spaceid = 0;
564 int phoney_data = 99;
567 assert(att->hdr.name && grp && grp->format_grp_info);
568 LOG((3,
"%s: varid %d att->hdr.id %d att->hdr.name %s att->nc_typeid %d " 569 "att->len %d", __func__, varid, att->hdr.id, att->hdr.name,
570 att->nc_typeid, att->len));
573 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
576 if (grp->nc4_info->no_write)
581 locid = hdf5_grp->hdf_grpid;
584 if ((retval = nc4_open_var_grp2(grp, varid, &datasetid)))
592 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, att->nc_typeid,
603 else if (att->stdata)
615 size_t string_size = dims[0];
619 if ((spaceid = H5Screate(H5S_NULL)) < 0)
624 if ((spaceid = H5Screate(H5S_SCALAR)) < 0)
627 if (H5Tset_size(file_typeid, string_size) < 0)
629 if (H5Tset_strpad(file_typeid, H5T_STR_NULLTERM) < 0)
636 if ((spaceid = H5Screate(H5S_NULL)) < 0)
641 if ((spaceid = H5Screate_simple(1, dims, NULL)) < 0)
647 if ((attr_exists = H5Aexists(locid, att->hdr.name)) < 0)
654 if ((existing_attid = H5Aopen(locid, att->hdr.name, H5P_DEFAULT)) < 0)
658 if ((existing_att_typeid = H5Aget_type(existing_attid)) < 0)
662 if ((existing_spaceid = H5Aget_space(existing_attid)) < 0)
664 if ((npoints = H5Sget_simple_extent_npoints(existing_spaceid)) < 0)
668 if (file_typeid != existing_att_typeid || npoints != att->len)
670 if (H5Adelete(locid, att->hdr.name) < 0)
680 if ((attid = H5Acreate(locid, att->hdr.name, file_typeid, spaceid,
685 if (H5Awrite(attid, file_typeid, data) < 0)
689 if (file_typeid && H5Tclose(file_typeid))
691 if (attid > 0 && H5Aclose(attid) < 0)
693 if (existing_att_typeid && H5Tclose(existing_att_typeid))
695 if (existing_attid > 0 && H5Aclose(existing_attid) < 0)
697 if (spaceid > 0 && H5Sclose(spaceid) < 0)
699 if (existing_spaceid > 0 && H5Sclose(existing_spaceid) < 0)
716 write_attlist(NCindex *attlist,
int varid, NC_GRP_INFO_T *grp)
722 for(i = 0; i < ncindexsize(attlist); i++)
724 att = (NC_ATT_INFO_T *)ncindexith(attlist, i);
728 LOG((4,
"%s: writing att %s to varid %d", __func__, att->hdr.name, varid));
729 if ((retval = put_att_grpa(grp, varid, att)))
731 att->dirty = NC_FALSE;
732 att->created = NC_TRUE;
752 write_coord_dimids(NC_VAR_INFO_T *var)
754 hsize_t coords_len[1];
755 hid_t c_spaceid = -1, c_attid = -1;
759 coords_len[0] = var->ndims;
760 if ((c_spaceid = H5Screate_simple(1, coords_len, coords_len)) < 0)
764 if ((c_attid = H5Acreate(var->hdf_datasetid, COORDINATES, H5T_NATIVE_INT,
765 c_spaceid, H5P_DEFAULT)) < 0)
769 if (H5Awrite(c_attid, H5T_NATIVE_INT, var->dimids) < 0)
773 if (c_spaceid >= 0 && H5Sclose(c_spaceid) < 0)
775 if (c_attid >= 0 && H5Aclose(c_attid) < 0)
791 write_netcdf4_dimid(hid_t datasetid,
int dimid)
793 hid_t dimid_spaceid, dimid_attid;
797 if ((dimid_spaceid = H5Screate(H5S_SCALAR)) < 0)
801 if ((attr_exists = H5Aexists(datasetid, NC_DIMID_ATT_NAME)) < 0)
804 dimid_attid = H5Aopen_by_name(datasetid,
".", NC_DIMID_ATT_NAME,
805 H5P_DEFAULT, H5P_DEFAULT);
808 dimid_attid = H5Acreate(datasetid, NC_DIMID_ATT_NAME,
809 H5T_NATIVE_INT, dimid_spaceid, H5P_DEFAULT);
815 LOG((4,
"%s: writing secret dimid %d", __func__, dimid));
816 if (H5Awrite(dimid_attid, H5T_NATIVE_INT, &dimid) < 0)
820 if (H5Sclose(dimid_spaceid) < 0)
822 if (H5Aclose(dimid_attid) < 0)
843 var_create_dataset(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var, nc_bool_t write_dimid)
845 NC_HDF5_GRP_INFO_T *hdf5_grp;
846 hid_t plistid = 0, access_plistid = 0,
typeid = 0, spaceid = 0;
847 hsize_t chunksize[H5S_MAX_RANK], dimsize[H5S_MAX_RANK], maxdimsize[H5S_MAX_RANK];
850 NC_DIM_INFO_T *dim = NULL;
854 assert(grp && grp->format_grp_info && var);
856 LOG((3,
"%s:: name %s", __func__, var->hdr.name));
859 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
862 if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
864 if ((access_plistid = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
868 if (H5Pset_obj_track_times(plistid, 0) < 0)
872 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, var->type_info->hdr.id, &
typeid,
873 var->type_info->endianness)))
880 if (H5Pset_fill_time(plistid, H5D_FILL_TIME_NEVER) < 0)
885 if ((retval = nc4_get_fill_value(grp->nc4_info, var, &fillp)))
891 if (var->type_info->nc_type_class ==
NC_STRING)
893 if (H5Pset_fill_value(plistid,
typeid, fillp) < 0)
902 hid_t fill_typeid = 0;
904 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, var->type_info->hdr.id, &fill_typeid,
907 if (H5Pset_fill_value(plistid, fill_typeid, fillp) < 0)
909 if (H5Tclose(fill_typeid) < 0)
913 if (H5Tclose(fill_typeid) < 0)
921 if (H5Pset_shuffle(plistid) < 0)
927 if (H5Pset_deflate(plistid, var->deflate_level) < 0)
929 }
else if(var->filterid) {
934 if(var->nparams != 2)
936 options_mask = (int)var->params[0];
937 bits_per_pixel = (
int)var->params[1];
938 if(H5Pset_szip(plistid, options_mask, bits_per_pixel) < 0)
941 herr_t code = H5Pset_filter(plistid, var->filterid, H5Z_FLAG_MANDATORY, var->nparams, var->params);
950 if (H5Pset_fletcher32(plistid) < 0)
962 for (d = 0; d < var->ndims; d++) {
964 assert(dim && dim->hdr.id == var->dimids[d]);
972 if (!var->shuffle && !var->deflate && !var->fletcher32 &&
973 (var->chunksizes == NULL || !var->chunksizes[0]) && !unlimdim)
974 var->contiguous = NC_TRUE;
977 for (d = 0; d < var->ndims; d++)
980 assert(dim && dim->hdr.id == var->dimids[d]);
981 dimsize[d] = dim->unlimited ? NC_HDF5_UNLIMITED_DIMSIZE : dim->len;
982 maxdimsize[d] = dim->unlimited ? H5S_UNLIMITED : (hsize_t)dim->len;
983 if (!var->contiguous) {
984 if (var->chunksizes[d])
985 chunksize[d] = var->chunksizes[d];
989 if (var->type_info->nc_type_class ==
NC_STRING)
990 type_size =
sizeof(
char *);
992 type_size = var->type_info->size;
998 chunksize[d] = pow((
double)DEFAULT_CHUNK_SIZE/type_size,
999 1/(
double)(var->ndims - unlimdim));
1003 if (!dim->unlimited && chunksize[d] > dim->len)
1004 chunksize[d] = dim->len;
1007 var->chunksizes[d] = chunksize[d];
1012 if (var->contiguous)
1014 if (H5Pset_layout(plistid, H5D_CONTIGUOUS) < 0)
1019 if (H5Pset_chunk(plistid, var->ndims, chunksize) < 0)
1024 if ((spaceid = H5Screate_simple(var->ndims, dimsize, maxdimsize)) < 0)
1029 if ((spaceid = H5Screate(H5S_SCALAR)) < 0)
1034 if (H5Pset_attr_creation_order(plistid, H5P_CRT_ORDER_TRACKED|
1035 H5P_CRT_ORDER_INDEXED) < 0)
1039 if (!var->contiguous && var->chunk_cache_size)
1040 if (H5Pset_chunk_cache(access_plistid, var->chunk_cache_nelems,
1041 var->chunk_cache_size, var->chunk_cache_preemption) < 0)
1045 name_to_use = var->hdf5_name ? var->hdf5_name : var->hdr.name;
1046 LOG((4,
"%s: about to H5Dcreate2 dataset %s of type 0x%x", __func__,
1047 name_to_use,
typeid));
1048 if ((var->hdf_datasetid = H5Dcreate2(hdf5_grp->hdf_grpid, name_to_use,
typeid,
1049 spaceid, H5P_DEFAULT, plistid, access_plistid)) < 0)
1051 var->created = NC_TRUE;
1052 var->is_new_var = NC_FALSE;
1059 if (H5DSset_scale(var->hdf_datasetid, var->hdr.name) < 0)
1065 if ((retval = write_coord_dimids(var)))
1070 if ((retval = write_netcdf4_dimid(var->hdf_datasetid, var->dimids[0])))
1075 if ((retval = write_attlist(var->att, var->hdr.id, grp)))
1077 var->attr_dirty = NC_FALSE;
1080 if (
typeid > 0 && H5Tclose(
typeid) < 0)
1082 if (plistid > 0 && H5Pclose(plistid) < 0)
1084 if (access_plistid > 0 && H5Pclose(access_plistid) < 0)
1086 if (spaceid > 0 && H5Sclose(spaceid) < 0)
1090 if (var->type_info->nc_type_class ==
NC_VLEN)
1092 else if (var->type_info->nc_type_class ==
NC_STRING && *(
char **)fillp)
1093 free(*(
char **)fillp);
1111 nc4_adjust_var_cache(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var)
1113 size_t chunk_size_bytes = 1;
1118 if (var->contiguous)
1120 #ifdef USE_PARALLEL4 1125 for (d = 0; d < var->ndims; d++)
1126 chunk_size_bytes *= var->chunksizes[d];
1127 if (var->type_info->size)
1128 chunk_size_bytes *= var->type_info->size;
1130 chunk_size_bytes *=
sizeof(
char *);
1135 if (var->chunk_cache_size == CHUNK_CACHE_SIZE)
1136 if (chunk_size_bytes > var->chunk_cache_size)
1138 var->chunk_cache_size = chunk_size_bytes * DEFAULT_CHUNKS_IN_CACHE;
1139 if (var->chunk_cache_size > MAX_DEFAULT_CACHE_SIZE)
1140 var->chunk_cache_size = MAX_DEFAULT_CACHE_SIZE;
1141 if ((retval = nc4_reopen_dataset(grp, var)))
1164 commit_type(NC_GRP_INFO_T *grp, NC_TYPE_INFO_T *type)
1166 NC_HDF5_GRP_INFO_T *hdf5_grp;
1169 assert(grp && grp->format_grp_info && type);
1172 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
1175 if (type->committed)
1181 NC_FIELD_INFO_T *field;
1182 hid_t hdf_base_typeid, hdf_typeid;
1185 if ((type->hdf_typeid = H5Tcreate(H5T_COMPOUND, type->size)) < 0)
1187 LOG((4,
"creating compound type %s hdf_typeid 0x%x", type->hdr.name,
1190 for(i=0;i<nclistlength(type->u.c.field);i++)
1192 field = (NC_FIELD_INFO_T *)nclistget(type->u.c.field, i);
1194 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, field->nc_typeid,
1195 &hdf_base_typeid, type->endianness)))
1204 for (d = 0; d < field->ndims; d++)
1205 dims[d] = field->dim_size[d];
1206 if ((hdf_typeid = H5Tarray_create(hdf_base_typeid, field->ndims,
1209 if (H5Tclose(hdf_base_typeid) < 0)
1213 if (H5Tclose(hdf_base_typeid) < 0)
1217 hdf_typeid = hdf_base_typeid;
1218 LOG((4,
"inserting field %s offset %d hdf_typeid 0x%x", field->hdr.name,
1219 field->offset, hdf_typeid));
1220 if (H5Tinsert(type->hdf_typeid, field->hdr.name, field->offset,
1223 if (H5Tclose(hdf_typeid) < 0)
1227 else if (type->nc_type_class ==
NC_VLEN)
1230 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, type->u.v.base_nc_typeid,
1231 &type->u.v.base_hdf_typeid, type->endianness)))
1235 if ((type->hdf_typeid = H5Tvlen_create(type->u.v.base_hdf_typeid)) < 0)
1238 else if (type->nc_type_class ==
NC_OPAQUE)
1241 if ((type->hdf_typeid = H5Tcreate(H5T_OPAQUE, type->size)) < 0)
1244 else if (type->nc_type_class ==
NC_ENUM)
1246 NC_ENUM_MEMBER_INFO_T *enum_m;
1249 if (nclistlength(type->u.e.enum_member) == 0)
1253 if ((retval = nc4_get_hdf_typeid(grp->nc4_info, type->u.e.base_nc_typeid,
1254 &type->u.e.base_hdf_typeid, type->endianness)))
1258 if ((type->hdf_typeid = H5Tenum_create(type->u.e.base_hdf_typeid)) < 0)
1262 for(i=0;i<nclistlength(type->u.e.enum_member);i++) {
1263 enum_m = (NC_ENUM_MEMBER_INFO_T*)nclistget(type->u.e.enum_member,i);
1264 if (H5Tenum_insert(type->hdf_typeid, enum_m->name, enum_m->value) < 0)
1270 LOG((0,
"Unknown class: %d", type->nc_type_class));
1275 if (H5Tcommit(hdf5_grp->hdf_grpid, type->hdr.name, type->hdf_typeid) < 0)
1277 type->committed = NC_TRUE;
1278 LOG((4,
"just committed type %s, HDF typeid: 0x%x", type->hdr.name,
1284 if ((type->native_hdf_typeid = H5Tget_native_type(type->hdf_typeid,
1285 H5T_DIR_DEFAULT)) < 0)
1302 write_nc3_strict_att(hid_t hdf_grpid)
1304 hid_t attid = 0, spaceid = 0;
1311 if ((attr_exists = H5Aexists(hdf_grpid, NC3_STRICT_ATT_NAME)) < 0)
1318 if ((spaceid = H5Screate(H5S_SCALAR)) < 0)
1320 if ((attid = H5Acreate(hdf_grpid, NC3_STRICT_ATT_NAME,
1321 H5T_NATIVE_INT, spaceid, H5P_DEFAULT)) < 0)
1323 if (H5Awrite(attid, H5T_NATIVE_INT, &one) < 0)
1327 if (spaceid > 0 && (H5Sclose(spaceid) < 0))
1329 if (attid > 0 && (H5Aclose(attid) < 0))
1347 create_group(NC_GRP_INFO_T *grp)
1349 NC_HDF5_GRP_INFO_T *hdf5_grp, *parent_hdf5_grp;
1353 assert(grp && grp->format_grp_info && grp->parent &&
1354 grp->parent->format_grp_info);
1357 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
1358 parent_hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->parent->format_grp_info;
1359 assert(parent_hdf5_grp->hdf_grpid);
1363 if ((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0)
1367 if (H5Pset_obj_track_times(gcpl_id, 0) < 0)
1371 if (H5Pset_link_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0)
1375 if (H5Pset_attr_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0)
1379 if ((hdf5_grp->hdf_grpid = H5Gcreate2(parent_hdf5_grp->hdf_grpid, grp->hdr.name,
1380 H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
1384 if (gcpl_id > -1 && H5Pclose(gcpl_id) < 0)
1387 if (hdf5_grp->hdf_grpid > 0 && H5Gclose(hdf5_grp->hdf_grpid) < 0)
1404 attach_dimscales(NC_GRP_INFO_T *grp)
1407 NC_DIM_INFO_T *dim1;
1412 for(i=0;i<ncindexsize(grp->vars);i++)
1414 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,i);
1427 for (d = 0; d < var->ndims; d++)
1430 if (var->dimscale_attached)
1432 if (!var->dimscale_attached[d])
1434 NC_HDF5_DIM_INFO_T *hdf5_dim1;
1435 hid_t dim_datasetid;
1437 assert(dim1 && dim1->hdr.id == var->dimids[d] && dim1->format_dim_info);
1438 hdf5_dim1 = (NC_HDF5_DIM_INFO_T *)dim1->format_dim_info;
1440 LOG((2,
"%s: attaching scale for dimid %d to var %s",
1441 __func__, var->dimids[d], var->hdr.name));
1444 if (dim1->coord_var)
1445 dim_datasetid = dim1->coord_var->hdf_datasetid;
1447 dim_datasetid = hdf5_dim1->hdf_dimscaleid;
1448 if(!(dim_datasetid > 0))
1449 assert(dim_datasetid > 0);
1450 if (H5DSattach_scale(var->hdf_datasetid, dim_datasetid, d) < 0)
1452 var->dimscale_attached[d] = NC_TRUE;
1456 if (!var->dimscale_attached[d])
1458 LOG((0,
"no dimscale found!"));
1481 var_exists(hid_t grpid,
char *name, nc_bool_t *exists)
1489 if ((link_exists = H5Lexists(grpid, name, H5P_DEFAULT)) < 0)
1496 if (H5Gget_objinfo(grpid, name, 1, &statbuf) < 0)
1499 if (H5G_DATASET == statbuf.type)
1521 remove_coord_atts(hid_t hdf_datasetid)
1527 if ((attr_exists = H5Aexists(hdf_datasetid, NC_DIMID_ATT_NAME)) < 0)
1531 if (H5Adelete(hdf_datasetid, NC_DIMID_ATT_NAME) < 0)
1538 if ((attr_exists = H5Aexists(hdf_datasetid, HDF5_DIMSCALE_CLASS_ATT_NAME)) < 0)
1542 if (H5Adelete(hdf_datasetid, HDF5_DIMSCALE_CLASS_ATT_NAME) < 0)
1545 if ((attr_exists = H5Aexists(hdf_datasetid, HDF5_DIMSCALE_NAME_ATT_NAME)) < 0)
1549 if (H5Adelete(hdf_datasetid, HDF5_DIMSCALE_NAME_ATT_NAME) < 0)
1570 write_var(NC_VAR_INFO_T *var, NC_GRP_INFO_T *grp, nc_bool_t write_dimid)
1572 NC_HDF5_GRP_INFO_T *hdf5_grp;
1573 nc_bool_t replace_existing_var = NC_FALSE;
1576 assert(var && grp && grp->format_grp_info);
1578 LOG((4,
"%s: writing var %s", __func__, var->hdr.name));
1581 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
1585 if (var->created && var->fill_val_changed)
1587 replace_existing_var = NC_TRUE;
1588 var->fill_val_changed = NC_FALSE;
1597 flag_atts_dirty(var->att);
1604 if (var->became_coord_var)
1609 for (i = 0; i < ncindexsize(grp->dim); i++)
1611 d1 = (NC_DIM_INFO_T*)ncindexith(grp->dim,i);
1613 if (!strcmp(d1->hdr.name, var->hdr.name))
1617 if ((retval = var_exists(hdf5_grp->hdf_grpid, var->hdr.name, &exists)))
1622 replace_existing_var = NC_TRUE;
1623 flag_atts_dirty(var->att);
1637 if (replace_existing_var)
1641 for (i = 0; i < ncindexsize(grp->dim); i++)
1644 NC_HDF5_DIM_INFO_T *hdf5_d1;
1647 d1 = (NC_DIM_INFO_T *)ncindexith(grp->dim, i);
1648 assert(d1 && d1->format_dim_info && d1->hdr.name);
1649 hdf5_d1 = (NC_HDF5_DIM_INFO_T *)d1->format_dim_info;
1651 if (!strcmp(d1->hdr.name, var->hdr.name))
1655 if ((retval = var_exists(hdf5_grp->hdf_grpid, var->hdr.name,
1660 hid_t dim_datasetid;
1664 dim_datasetid = d1->coord_var->hdf_datasetid;
1666 dim_datasetid = hdf5_d1->hdf_dimscaleid;
1667 assert(dim_datasetid > 0);
1672 if ((retval = rec_detach_scales(grp->nc4_info->root_grp,
1673 var->dimids[0], dim_datasetid)))
1682 if (var->was_coord_var && var->dimscale_attached)
1690 if ((retval = remove_coord_atts(var->hdf_datasetid)))
1694 if (var->dimscale_attached)
1699 for (d = 0; d < var->ndims; d++)
1701 if (var->dimscale_attached[d])
1703 hid_t dim_datasetid;
1704 NC_DIM_INFO_T *dim1 = var->dim[d];
1705 NC_HDF5_DIM_INFO_T *hdf5_dim1;
1706 assert(dim1 && dim1->hdr.id == var->dimids[d] && dim1->format_dim_info);
1707 hdf5_dim1 = (NC_HDF5_DIM_INFO_T *)dim1->format_dim_info;
1710 if (dim1->coord_var)
1711 dim_datasetid = dim1->coord_var->hdf_datasetid;
1713 dim_datasetid = hdf5_dim1->hdf_dimscaleid;
1714 assert(dim_datasetid > 0);
1716 if (H5DSdetach_scale(var->hdf_datasetid, dim_datasetid, d) < 0)
1718 var->dimscale_attached[d] = NC_FALSE;
1725 if (replace_existing_var)
1728 if (var->hdf_datasetid && H5Dclose(var->hdf_datasetid) < 0)
1730 var->hdf_datasetid = 0;
1733 if (H5Gunlink(hdf5_grp->hdf_grpid, var->hdr.name) < 0)
1738 if (var->is_new_var || replace_existing_var)
1740 if ((retval = var_create_dataset(grp, var, write_dimid)))
1745 if (write_dimid && var->ndims)
1746 if ((retval = write_netcdf4_dimid(var->hdf_datasetid, var->dimids[0])))
1750 if (replace_existing_var)
1756 if ((retval = rec_reattach_scales(grp->nc4_info->root_grp,
1757 var->dimids[0], var->hdf_datasetid)))
1764 if (var->dimscale_attached)
1765 memset(var->dimscale_attached, 0,
sizeof(nc_bool_t) * var->ndims);
1770 var->was_coord_var = NC_FALSE;
1771 var->became_coord_var = NC_FALSE;
1774 if (var->attr_dirty)
1777 if ((retval = write_attlist(var->att, var->hdr.id, grp)))
1779 var->attr_dirty = NC_FALSE;
1800 write_dim(NC_DIM_INFO_T *dim, NC_GRP_INFO_T *grp, nc_bool_t write_dimid)
1802 NC_HDF5_GRP_INFO_T *hdf5_grp;
1803 NC_HDF5_DIM_INFO_T *hdf5_dim;
1806 assert(dim && dim->format_dim_info && grp && grp->format_grp_info);
1809 hdf5_dim = (NC_HDF5_DIM_INFO_T *)dim->format_dim_info;
1810 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
1816 if (!hdf5_dim->hdf_dimscaleid)
1818 hid_t spaceid, create_propid;
1819 hsize_t dims[1], max_dims[1], chunk_dims[1] = {1};
1822 LOG((4,
"%s: creating dim %s", __func__, dim->hdr.name));
1825 assert(NULL == dim->coord_var);
1830 if ((create_propid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
1834 if (H5Pset_obj_track_times(create_propid,0)<0)
1838 max_dims[0] = dim->len;
1841 max_dims[0] = H5S_UNLIMITED;
1842 if (H5Pset_chunk(create_propid, 1, chunk_dims) < 0)
1847 if ((spaceid = H5Screate_simple(1, dims, max_dims)) < 0)
1850 if (H5Pset_attr_creation_order(create_propid, H5P_CRT_ORDER_TRACKED|
1851 H5P_CRT_ORDER_INDEXED) < 0)
1855 LOG((4,
"%s: about to H5Dcreate1 a dimscale dataset %s", __func__, dim->hdr.name));
1856 if ((hdf5_dim->hdf_dimscaleid = H5Dcreate1(hdf5_grp->hdf_grpid, dim->hdr.name, H5T_IEEE_F32BE,
1857 spaceid, create_propid)) < 0)
1861 if (H5Sclose(spaceid) < 0)
1863 if (H5Pclose(create_propid) < 0)
1869 sprintf(dimscale_wo_var,
"%s%10d", DIM_WITHOUT_VARIABLE, (
int)dim->len);
1870 if (H5DSset_scale(hdf5_dim->hdf_dimscaleid, dimscale_wo_var) < 0)
1877 NC_VAR_INFO_T *v1 = NULL;
1879 assert(dim->unlimited);
1883 v1 = (NC_VAR_INFO_T*)ncindexlookup(grp->vars,dim->hdr.name);
1886 hsize_t *new_size = NULL;
1891 if (!(new_size = malloc(v1->ndims *
sizeof(hsize_t))))
1893 for (d1 = 0; d1 < v1->ndims; d1++)
1895 assert(v1->dim[d1] && v1->dim[d1]->hdr.id == v1->dimids[d1]);
1896 new_size[d1] = v1->dim[d1]->len;
1898 if (H5Dset_extent(v1->hdf_datasetid, new_size) < 0) {
1910 if (write_dimid && hdf5_dim->hdf_dimscaleid)
1911 if ((retval = write_netcdf4_dimid(hdf5_dim->hdf_dimscaleid, dim->hdr.id)))
1937 nc4_detect_preserve_dimids(NC_GRP_INFO_T *grp, nc_bool_t *bad_coord_orderp)
1940 NC_GRP_INFO_T *child_grp;
1941 int last_dimid = -1;
1946 for (i=0; i < ncindexsize(grp->vars); i++)
1948 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,i);
1949 if (var == NULL)
continue;
1951 if (var->dimscale && var->ndims)
1957 if (var->dimids[0] < last_dimid)
1959 LOG((5,
"%s: %s is out of order coord var", __func__, var->hdr.name));
1960 *bad_coord_orderp = NC_TRUE;
1963 last_dimid = var->dimids[0];
1970 LOG((5,
"%s: %s is multidimensional coord var", __func__, var->hdr.name));
1971 *bad_coord_orderp = NC_TRUE;
1978 if (var->is_new_var || var->became_coord_var)
1980 LOG((5,
"%s: coord var defined after enddef/redef", __func__));
1981 *bad_coord_orderp = NC_TRUE;
1988 for (i = 0; i < ncindexsize(grp->children); i++)
1990 if (!(child_grp = (NC_GRP_INFO_T *)ncindexith(grp->children, i)))
1992 if ((retval = nc4_detect_preserve_dimids(child_grp, bad_coord_orderp)))
2011 nc4_rec_write_metadata(NC_GRP_INFO_T *grp, nc_bool_t bad_coord_order)
2013 NC_DIM_INFO_T *dim = NULL;
2014 NC_VAR_INFO_T *var = NULL;
2015 NC_GRP_INFO_T *child_grp = NULL;
2016 int coord_varid = -1;
2022 assert(grp && grp->hdr.name &&
2023 ((NC_HDF5_GRP_INFO_T *)(grp->format_grp_info))->hdf_grpid);
2024 LOG((3,
"%s: grp->hdr.name %s, bad_coord_order %d", __func__, grp->hdr.name,
2028 if ((retval = write_attlist(grp->att,
NC_GLOBAL, grp)))
2036 dim = (NC_DIM_INFO_T*)ncindexith(grp->dim,dim_index);
2037 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,var_index);
2043 nc_bool_t found_coord, wrote_coord;
2047 for (found_coord = NC_FALSE; dim && !found_coord; )
2049 if (!dim->coord_var)
2051 if ((retval = write_dim(dim, grp, bad_coord_order)))
2056 coord_varid = dim->coord_var->hdr.id;
2057 found_coord = NC_TRUE;
2059 dim = (NC_DIM_INFO_T*)ncindexith(grp->dim,++dim_index);
2064 for (wrote_coord = NC_FALSE; var && !wrote_coord; )
2066 if ((retval = write_var(var, grp, bad_coord_order)))
2068 if (found_coord && var->hdr.id == coord_varid)
2069 wrote_coord = NC_TRUE;
2070 var = (NC_VAR_INFO_T*)ncindexith(grp->vars,++var_index);
2074 if ((retval = attach_dimscales(grp)))
2078 for(i=0;i<ncindexsize(grp->children);i++) {
2079 if((child_grp = (NC_GRP_INFO_T*)ncindexith(grp->children,i)) == NULL)
continue;
2080 if ((retval = nc4_rec_write_metadata(child_grp, bad_coord_order)))
2096 nc4_rec_write_groups_types(NC_GRP_INFO_T *grp)
2098 NC_GRP_INFO_T *child_grp;
2099 NC_HDF5_GRP_INFO_T *hdf5_grp;
2100 NC_TYPE_INFO_T *type;
2104 assert(grp && grp->hdr.name && grp->format_grp_info);
2105 LOG((3,
"%s: grp->hdr.name %s", __func__, grp->hdr.name));
2108 hdf5_grp = (NC_HDF5_GRP_INFO_T *)grp->format_grp_info;
2111 if (!hdf5_grp->hdf_grpid)
2112 if ((retval = create_group(grp)))
2118 if ((retval = write_nc3_strict_att(hdf5_grp->hdf_grpid)))
2122 for(i=0;i<ncindexsize(grp->type);i++) {
2123 type = (NC_TYPE_INFO_T *)ncindexith(grp->type, i);
2125 if ((retval = commit_type(grp, type)))
2130 for(i=0;i<ncindexsize(grp->children);i++) {
2131 if((child_grp = (NC_GRP_INFO_T*)ncindexith(grp->children,i)) == NULL)
continue;
2132 if ((retval = nc4_rec_write_groups_types(child_grp)))
2164 nc4_convert_type(
const void *src,
void *dest,
const nc_type src_type,
2165 const nc_type dest_type,
const size_t len,
int *range_error,
2166 const void *fill_value,
int strict_nc3)
2173 signed char *bp, *bp1;
2174 unsigned char *ubp, *ubp1;
2175 unsigned short *usp, *usp1;
2176 unsigned int *uip, *uip1;
2177 long long *lip, *lip1;
2178 unsigned long long *ulip, *ulip1;
2182 LOG((3,
"%s: len %d src_type %d dest_type %d", __func__, len, src_type,
2199 for (cp = (
char *)src, cp1 = dest; count < len; count++)
2203 LOG((0,
"%s: Unknown destination type.", __func__));
2211 for (bp = (
signed char *)src, bp1 = dest; count < len; count++)
2215 for (bp = (
signed char *)src, ubp = dest; count < len; count++)
2223 for (bp = (
signed char *)src, sp = dest; count < len; count++)
2227 for (bp = (
signed char *)src, usp = dest; count < len; count++)
2235 for (bp = (
signed char *)src, ip = dest; count < len; count++)
2239 for (bp = (
signed char *)src, uip = dest; count < len; count++)
2247 for (bp = (
signed char *)src, lip = dest; count < len; count++)
2251 for (bp = (
signed char *)src, ulip = dest; count < len; count++)
2259 for (bp = (
signed char *)src, fp = dest; count < len; count++)
2263 for (bp = (
signed char *)src, dp = dest; count < len; count++)
2267 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
2268 __func__, src_type, dest_type));
2277 for (ubp = (
unsigned char *)src, bp = dest; count < len; count++)
2279 if (!strict_nc3 && *ubp > X_SCHAR_MAX)
2285 for (ubp = (
unsigned char *)src, sp = dest; count < len; count++)
2289 for (ubp = (
unsigned char *)src, ubp1 = dest; count < len; count++)
2293 for (ubp = (
unsigned char *)src, usp = dest; count < len; count++)
2297 for (ubp = (
unsigned char *)src, ip = dest; count < len; count++)
2301 for (ubp = (
unsigned char *)src, uip = dest; count < len; count++)
2305 for (ubp = (
unsigned char *)src, lip = dest; count < len; count++)
2309 for (ubp = (
unsigned char *)src, ulip = dest; count < len; count++)
2313 for (ubp = (
unsigned char *)src, fp = dest; count < len; count++)
2317 for (ubp = (
unsigned char *)src, dp = dest; count < len; count++)
2321 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
2322 __func__, src_type, dest_type));
2331 for (sp = (
short *)src, ubp = dest; count < len; count++)
2333 if (*sp > X_UCHAR_MAX || *sp < 0)
2339 for (sp = (
short *)src, bp = dest; count < len; count++)
2341 if (*sp > X_SCHAR_MAX || *sp < X_SCHAR_MIN)
2347 for (sp = (
short *)src, sp1 = dest; count < len; count++)
2351 for (sp = (
short *)src, usp = dest; count < len; count++)
2359 for (sp = (
short *)src, ip = dest; count < len; count++)
2363 for (sp = (
short *)src, uip = dest; count < len; count++)
2371 for (sp = (
short *)src, lip = dest; count < len; count++)
2375 for (sp = (
short *)src, ulip = dest; count < len; count++)
2383 for (sp = (
short *)src, fp = dest; count < len; count++)
2387 for (sp = (
short *)src, dp = dest; count < len; count++)
2391 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
2392 __func__, src_type, dest_type));
2401 for (usp = (
unsigned short *)src, ubp = dest; count < len; count++)
2403 if (*usp > X_UCHAR_MAX)
2409 for (usp = (
unsigned short *)src, bp = dest; count < len; count++)
2411 if (*usp > X_SCHAR_MAX)
2417 for (usp = (
unsigned short *)src, sp = dest; count < len; count++)
2419 if (*usp > X_SHORT_MAX)
2425 for (usp = (
unsigned short *)src, usp1 = dest; count < len; count++)
2429 for (usp = (
unsigned short *)src, ip = dest; count < len; count++)
2433 for (usp = (
unsigned short *)src, uip = dest; count < len; count++)
2437 for (usp = (
unsigned short *)src, lip = dest; count < len; count++)
2441 for (usp = (
unsigned short *)src, ulip = dest; count < len; count++)
2445 for (usp = (
unsigned short *)src, fp = dest; count < len; count++)
2449 for (usp = (
unsigned short *)src, dp = dest; count < len; count++)
2453 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
2454 __func__, src_type, dest_type));
2463 for (ip = (
int *)src, ubp = dest; count < len; count++)
2465 if (*ip > X_UCHAR_MAX || *ip < 0)
2471 for (ip = (
int *)src, bp = dest; count < len; count++)
2473 if (*ip > X_SCHAR_MAX || *ip < X_SCHAR_MIN)
2479 for (ip = (
int *)src, sp = dest; count < len; count++)
2481 if (*ip > X_SHORT_MAX || *ip < X_SHORT_MIN)
2487 for (ip = (
int *)src, usp = dest; count < len; count++)
2489 if (*ip > X_USHORT_MAX || *ip < 0)
2495 for (ip = (
int *)src, ip1 = dest; count < len; count++)
2497 if (*ip > X_INT_MAX || *ip < X_INT_MIN)
2503 for (ip = (
int *)src, uip = dest; count < len; count++)
2505 if (*ip > X_UINT_MAX || *ip < 0)
2511 for (ip = (
int *)src, lip = dest; count < len; count++)
2515 for (ip = (
int *)src, ulip = dest; count < len; count++)
2523 for (ip = (
int *)src, fp = dest; count < len; count++)
2527 for (ip = (
int *)src, dp = dest; count < len; count++)
2531 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
2532 __func__, src_type, dest_type));
2541 for (uip = (
unsigned int *)src, ubp = dest; count < len; count++)
2543 if (*uip > X_UCHAR_MAX)
2549 for (uip = (
unsigned int *)src, bp = dest; count < len; count++)
2551 if (*uip > X_SCHAR_MAX)
2557 for (uip = (
unsigned int *)src, sp = dest; count < len; count++)
2559 if (*uip > X_SHORT_MAX)
2565 for (uip = (
unsigned int *)src, usp = dest; count < len; count++)
2567 if (*uip > X_USHORT_MAX)
2573 for (uip = (
unsigned int *)src, ip = dest; count < len; count++)
2575 if (*uip > X_INT_MAX)
2581 for (uip = (
unsigned int *)src, uip1 = dest; count < len; count++)
2583 if (*uip > X_UINT_MAX)
2589 for (uip = (
unsigned int *)src, lip = dest; count < len; count++)
2593 for (uip = (
unsigned int *)src, ulip = dest; count < len; count++)
2597 for (uip = (
unsigned int *)src, fp = dest; count < len; count++)
2601 for (uip = (
unsigned int *)src, dp = dest; count < len; count++)
2605 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
2606 __func__, src_type, dest_type));
2615 for (lip = (
long long *)src, ubp = dest; count < len; count++)
2617 if (*lip > X_UCHAR_MAX || *lip < 0)
2623 for (lip = (
long long *)src, bp = dest; count < len; count++)
2625 if (*lip > X_SCHAR_MAX || *lip < X_SCHAR_MIN)
2631 for (lip = (
long long *)src, sp = dest; count < len; count++)
2633 if (*lip > X_SHORT_MAX || *lip < X_SHORT_MIN)
2639 for (lip = (
long long *)src, usp = dest; count < len; count++)
2641 if (*lip > X_USHORT_MAX || *lip < 0)
2647 for (lip = (
long long *)src, uip = dest; count < len; count++)
2649 if (*lip > X_UINT_MAX || *lip < 0)
2655 for (lip = (
long long *)src, ip = dest; count < len; count++)
2657 if (*lip > X_INT_MAX || *lip < X_INT_MIN)
2663 for (lip = (
long long *)src, lip1 = dest; count < len; count++)
2667 for (lip = (
long long *)src, ulip = dest; count < len; count++)
2675 for (lip = (
long long *)src, fp = dest; count < len; count++)
2679 for (lip = (
long long *)src, dp = dest; count < len; count++)
2683 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
2684 __func__, src_type, dest_type));
2693 for (ulip = (
unsigned long long *)src, ubp = dest; count < len; count++)
2695 if (*ulip > X_UCHAR_MAX)
2701 for (ulip = (
unsigned long long *)src, bp = dest; count < len; count++)
2703 if (*ulip > X_SCHAR_MAX)
2709 for (ulip = (
unsigned long long *)src, sp = dest; count < len; count++)
2711 if (*ulip > X_SHORT_MAX)
2717 for (ulip = (
unsigned long long *)src, usp = dest; count < len; count++)
2719 if (*ulip > X_USHORT_MAX)
2725 for (ulip = (
unsigned long long *)src, uip = dest; count < len; count++)
2727 if (*ulip > X_UINT_MAX)
2733 for (ulip = (
unsigned long long *)src, ip = dest; count < len; count++)
2735 if (*ulip > X_INT_MAX)
2741 for (ulip = (
unsigned long long *)src, lip = dest; count < len; count++)
2743 if (*ulip > X_INT64_MAX)
2749 for (ulip = (
unsigned long long *)src, ulip1 = dest; count < len; count++)
2753 for (ulip = (
unsigned long long *)src, fp = dest; count < len; count++)
2757 for (ulip = (
unsigned long long *)src, dp = dest; count < len; count++)
2761 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
2762 __func__, src_type, dest_type));
2771 for (fp = (
float *)src, ubp = dest; count < len; count++)
2773 if (*fp > X_UCHAR_MAX || *fp < 0)
2779 for (fp = (
float *)src, bp = dest; count < len; count++)
2781 if (*fp > (
double)X_SCHAR_MAX || *fp < (
double)X_SCHAR_MIN)
2787 for (fp = (
float *)src, sp = dest; count < len; count++)
2789 if (*fp > (
double)X_SHORT_MAX || *fp < (
double)X_SHORT_MIN)
2795 for (fp = (
float *)src, usp = dest; count < len; count++)
2797 if (*fp > X_USHORT_MAX || *fp < 0)
2803 for (fp = (
float *)src, uip = dest; count < len; count++)
2805 if (*fp > X_UINT_MAX || *fp < 0)
2811 for (fp = (
float *)src, ip = dest; count < len; count++)
2813 if (*fp > (
double)X_INT_MAX || *fp < (
double)X_INT_MIN)
2819 for (fp = (
float *)src, lip = dest; count < len; count++)
2821 if (*fp > X_INT64_MAX || *fp <X_INT64_MIN)
2827 for (fp = (
float *)src, lip = dest; count < len; count++)
2829 if (*fp > X_UINT64_MAX || *fp < 0)
2835 for (fp = (
float *)src, fp1 = dest; count < len; count++)
2843 for (fp = (
float *)src, dp = dest; count < len; count++)
2847 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
2848 __func__, src_type, dest_type));
2857 for (dp = (
double *)src, ubp = dest; count < len; count++)
2859 if (*dp > X_UCHAR_MAX || *dp < 0)
2865 for (dp = (
double *)src, bp = dest; count < len; count++)
2867 if (*dp > X_SCHAR_MAX || *dp < X_SCHAR_MIN)
2873 for (dp = (
double *)src, sp = dest; count < len; count++)
2875 if (*dp > X_SHORT_MAX || *dp < X_SHORT_MIN)
2881 for (dp = (
double *)src, usp = dest; count < len; count++)
2883 if (*dp > X_USHORT_MAX || *dp < 0)
2889 for (dp = (
double *)src, uip = dest; count < len; count++)
2891 if (*dp > X_UINT_MAX || *dp < 0)
2897 for (dp = (
double *)src, ip = dest; count < len; count++)
2899 if (*dp > X_INT_MAX || *dp < X_INT_MIN)
2905 for (dp = (
double *)src, lip = dest; count < len; count++)
2907 if (*dp > X_INT64_MAX || *dp < X_INT64_MIN)
2913 for (dp = (
double *)src, lip = dest; count < len; count++)
2915 if (*dp > X_UINT64_MAX || *dp < 0)
2921 for (dp = (
double *)src, fp = dest; count < len; count++)
2923 if (*dp > X_FLOAT_MAX || *dp < X_FLOAT_MIN)
2929 for (dp = (
double *)src, dp1 = dest; count < len; count++)
2937 LOG((0,
"%s: unexpected dest type. src_type %d, dest_type %d",
2938 __func__, src_type, dest_type));
2944 LOG((0,
"%s: unexpected src type. src_type %d, dest_type %d",
2945 __func__, src_type, dest_type));
2965 nc4_rec_match_dimscales(NC_GRP_INFO_T *grp)
2973 assert(grp && grp->hdr.name);
2974 LOG((4,
"%s: grp->hdr.name %s", __func__, grp->hdr.name));
2977 for(i=0;i<ncindexsize(grp->children);i++) {
2978 if((g = (NC_GRP_INFO_T*)ncindexith(grp->children,i)) == NULL)
continue;
2979 if ((retval = nc4_rec_match_dimscales(g)))
2984 for(i=0;i<ncindexsize(grp->vars);i++)
2988 if((var = (NC_VAR_INFO_T*)ncindexith(grp->vars,i)) == NULL)
continue;
3005 for (d = 0; d < ndims; d++)
3007 if (var->dim[d] == NULL) {
3008 nc4_find_dim(grp, var->dimids[d], &var->dim[d], NULL);
3020 if (var->dimscale_hdf5_objids)
3022 for (d = 0; d < var->ndims; d++)
3024 nc_bool_t finished = NC_FALSE;
3025 LOG((5,
"%s: var %s has dimscale info...", __func__, var->hdr.name));
3028 for (g = grp; g && !finished; g = g->parent)
3031 for (j = 0; j < ncindexsize(g->dim); j++)
3034 NC_HDF5_DIM_INFO_T *hdf5_dim;
3035 dim = (NC_DIM_INFO_T *)ncindexith(g->dim, j);
3036 assert(dim && dim->format_dim_info);
3037 hdf5_dim = (NC_HDF5_DIM_INFO_T *)dim->format_dim_info;
3041 if (var->dimscale_hdf5_objids[d].fileno[0] == hdf5_dim->hdf5_objid.fileno[0] &&
3042 var->dimscale_hdf5_objids[d].objno[0] == hdf5_dim->hdf5_objid.objno[0] &&
3043 var->dimscale_hdf5_objids[d].fileno[1] == hdf5_dim->hdf5_objid.fileno[1] &&
3044 var->dimscale_hdf5_objids[d].objno[1] == hdf5_dim->hdf5_objid.objno[1])
3046 LOG((4,
"%s: for dimension %d, found dim %s", __func__,
3048 var->dimids[d] = dim->hdr.id;
3055 LOG((5,
"%s: dimid for this dimscale is %d", __func__,
3056 var->type_info->hdr.id));
3063 hsize_t *h5dimlen = NULL, *h5dimlenmax = NULL;
3067 if ((spaceid = H5Dget_space(var->hdf_datasetid)) < 0)
3073 if (!(h5dimlen = malloc(var->ndims *
sizeof(hsize_t))))
3075 if (!(h5dimlenmax = malloc(var->ndims *
sizeof(hsize_t))))
3080 if ((dataset_ndims = H5Sget_simple_extent_dims(spaceid, h5dimlen,
3081 h5dimlenmax)) < 0) {
3086 if (dataset_ndims != var->ndims) {
3095 if (H5Sget_simple_extent_type(spaceid) != H5S_SCALAR)
3100 if (H5Sclose(spaceid) < 0) {
3109 for (d = 0; d < var->ndims; d++)
3114 for(match=-1,k=0;k<ncindexsize(grp->dim);k++) {
3115 if((dim = (NC_DIM_INFO_T*)ncindexith(grp->dim,k)) == NULL)
continue;
3116 if ((dim->len == h5dimlen[d]) &&
3117 ((h5dimlenmax[d] == H5S_UNLIMITED && dim->unlimited) ||
3118 (h5dimlenmax[d] != H5S_UNLIMITED && !dim->unlimited)))
3126 sprintf(phony_dim_name,
"phony_dim_%d", grp->nc4_info->next_dimid);
3127 LOG((3,
"%s: creating phony dim for var %s", __func__, var->hdr.name));
3128 if ((retval = nc4_dim_list_add(grp, phony_dim_name, h5dimlen[d], -1, &dim)))
3135 if (!(dim->format_dim_info = calloc(1,
sizeof(NC_HDF5_DIM_INFO_T))))
3137 if (h5dimlenmax[d] == H5S_UNLIMITED)
3138 dim->unlimited = NC_TRUE;
3142 var->dimids[d] = dim->hdr.id;
3169 nc4_get_typelen_mem(NC_FILE_INFO_T *h5,
nc_type xtype,
size_t *len)
3171 NC_TYPE_INFO_T *type;
3174 LOG((4,
"%s xtype: %d", __func__, xtype));
3183 *len =
sizeof(char);
3187 *len =
sizeof(short);
3194 *len =
sizeof(float);
3197 *len =
sizeof(double);
3201 *len =
sizeof(
long long);
3204 *len =
sizeof(
char *);
3209 if ((retval = nc4_find_type(h5, xtype, &type)))
3217 LOG((5,
"type->size: %d", type->size));
3235 nc4_get_typeclass(
const NC_FILE_INFO_T *h5,
nc_type xtype,
int *type_class)
3239 LOG((4,
"%s xtype: %d", __func__, xtype));
3279 NC_TYPE_INFO_T *type;
3282 if ((retval = nc4_find_type(h5, xtype, &type)))
3287 *type_class = type->nc_type_class;
3306 reportobject(
int uselog, hid_t
id,
unsigned int type)
3308 char name[NC_HDF5_MAX_NAME];
3310 const char*
typename = NULL;
3311 long long printid = (
long long)
id;
3313 len = H5Iget_name(
id, name, NC_HDF5_MAX_NAME);
3318 case H5F_OBJ_FILE:
typename =
"File";
break;
3319 case H5F_OBJ_DATASET:
typename =
"Dataset";
break;
3320 case H5F_OBJ_GROUP:
typename =
"Group";
break;
3321 case H5F_OBJ_DATATYPE:
typename =
"Datatype";
break;
3323 typename =
"Attribute";
3324 len = H5Aget_name(
id, NC_HDF5_MAX_NAME, name);
3325 if(len < 0) len = 0;
3328 default:
typename =
"<unknown>";
break;
3332 LOG((0,
"Type = %s(%lld) name='%s'",
typename,printid,name));
3336 fprintf(stderr,
"Type = %s(%lld) name='%s'",
typename,printid,name);
3352 reportopenobjectsT(
int uselog, hid_t fid,
int ntypes,
unsigned int* otypes)
3356 size_t maxobjs = -1;
3357 hid_t* idlist = NULL;
3362 LOG((0,
"\nReport: open objects on %lld",(
long long)fid));
3365 fprintf(stdout,
"\nReport: open objects on %lld\n",(
long long)fid);
3366 maxobjs = H5Fget_obj_count(fid,H5F_OBJ_ALL);
3367 if(idlist != NULL) free(idlist);
3368 idlist = (hid_t*)malloc(
sizeof(hid_t)*maxobjs);
3369 for(t=0;t<ntypes;t++) {
3370 unsigned int ot = otypes[t];
3371 ocount = H5Fget_obj_ids(fid,ot,maxobjs,idlist);
3372 for(i=0;i<ocount;i++) {
3373 hid_t o = idlist[i];
3374 reportobject(uselog,o,ot);
3377 if(idlist != NULL) free(idlist);
3389 reportopenobjects(
int uselog, hid_t fid)
3391 unsigned int OTYPES[5] = {H5F_OBJ_FILE, H5F_OBJ_DATASET, H5F_OBJ_GROUP,
3392 H5F_OBJ_DATATYPE, H5F_OBJ_ATTR};
3394 reportopenobjectsT(uselog, fid ,5, OTYPES);
3405 showopenobjects5(NC_FILE_INFO_T* h5)
3407 NC_HDF5_FILE_INFO_T *hdf5_info;
3409 assert(h5 && h5->format_file_info);
3410 hdf5_info = (NC_HDF5_FILE_INFO_T *)h5->format_file_info;
3412 fprintf(stderr,
"===== begin showopenobjects =====\n");
3413 reportopenobjects(0,hdf5_info->hdfid);
3414 fprintf(stderr,
"===== end showopenobjects =====\n");
3427 showopenobjects(
int ncid)
3429 NC_FILE_INFO_T* h5 = NULL;
3432 if (nc4_find_nc_grp_h5(ncid, NULL, NULL, &h5) !=
NC_NOERR)
3433 fprintf(stderr,
"failed\n");
3435 showopenobjects5(h5);
3451 NC4_hdf5get_libversion(
unsigned* major,
unsigned* minor,
unsigned* release)
3453 if(H5get_libversion(major,minor,release) < 0)
3469 NC4_hdf5get_superblock(
struct NC_FILE_INFO* h5,
int* idp)
3471 NC_HDF5_FILE_INFO_T *hdf5_info;
3476 assert(h5 && h5->format_file_info);
3477 hdf5_info = (NC_HDF5_FILE_INFO_T *)h5->format_file_info;
3479 if((plist = H5Fget_create_plist(hdf5_info->hdfid)) < 0)
3481 if(H5Pget_version(plist, &super, NULL, NULL, NULL) < 0)
3483 if(idp) *idp = (int)super;
3485 if(plist >= 0) H5Pclose(plist);
3489 static int NC4_get_strict_att(NC_FILE_INFO_T*);
3490 static int NC4_walk(hid_t,
int*);
3517 NC4_isnetcdf4(
struct NC_FILE_INFO* h5)
3524 isnc4 = NC4_get_strict_att(h5);
3530 stat = NC4_walk(((NC_HDF5_GRP_INFO_T *)(h5->root_grp->format_grp_info))->hdf_grpid,
3535 isnc4 = (count >= 2);
3550 NC4_get_strict_att(NC_FILE_INFO_T *h5)
3556 grpid = ((NC_HDF5_GRP_INFO_T *)(h5->root_grp->format_grp_info))->hdf_grpid;
3559 attid = H5Aopen_name(grpid, NC3_STRICT_ATT_NAME);
3574 NC4_walk(hid_t gid,
int* countp)
3583 char name[NC_HDF5_MAX_NAME];
3586 err = H5Gget_num_objs(gid, &nobj);
3587 if(err < 0)
return err;
3589 for(i = 0; i < nobj; i++) {
3591 len = H5Gget_objname_by_idx(gid,(hsize_t)i,name,(
size_t)NC_HDF5_MAX_NAME);
3592 if(len < 0)
return len;
3594 otype = H5Gget_objtype_by_idx(gid,(
size_t)i);
3597 grpid = H5Gopen(gid,name);
3598 NC4_walk(grpid,countp);
3603 if(strcmp(name,
"phony_dim")==0)
3604 *countp = *countp + 1;
3605 dsid = H5Dopen(gid,name);
3606 na = H5Aget_num_attrs(dsid);
3607 for(j = 0; j < na; j++) {
3608 hid_t aid = H5Aopen_idx(dsid,(
unsigned int) j);
3610 const NC_reservedatt* ra;
3611 ssize_t len = H5Aget_name(aid, NC_HDF5_MAX_NAME, name);
3612 if(len < 0)
return len;
3615 ra = NC_findreserved(name);
3617 *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_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_INT64
signed 8-byte int
#define NC_DOUBLE
double precision floating point number
#define NC_FILL_UINT64
Default fill value.
int nc_type
The nc_type type is just an int.
#define NC_FILL_STRING
Default fill value.
#define H5Z_FILTER_SZIP
ID of HDF SZIP filter.
#define NC_BYTE
signed 1 byte integer
#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_EFILEMETA
Problem with file metadata.
#define NC_EFILTER
Filter operation failed.
#define NC_EBADTYPE
Not a netcdf data type.
#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_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 NC_EPERM
Write to read only.
#define NC_NOERR
No Error.
#define NC_ENUM
enum types
#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