hid_t mhdf_createConnectivity( mhdf_FileHandle file_handle, const char* elem_handle, int nodes_per_elem, long count, long* first_id_out, mhdf_Status* status ) { FileHandle* file_ptr; hid_t elem_id, table_id; hsize_t dims[2]; long first_id; API_BEGIN; file_ptr = (FileHandle*)(file_handle); if (!mhdf_check_valid_file( file_ptr, status )) return -1; if (nodes_per_elem <= 0 || count < 0 || !first_id_out) { mhdf_setFail( status, "Invalid argument." ); return -1; } elem_id = mhdf_elem_group_from_handle( file_ptr, elem_handle, status ); if (elem_id < 0) return -1; dims[0] = (hsize_t)count; dims[1] = (hsize_t)nodes_per_elem; table_id = mhdf_create_table( elem_id, CONNECTIVITY_NAME, file_ptr->id_type, 2, dims, status ); H5Gclose( elem_id ); if (table_id < 0) return -1; first_id = file_ptr->max_id + 1; if (!mhdf_create_scalar_attrib( table_id, START_ID_ATTRIB, H5T_NATIVE_LONG, &first_id, status )) { H5Dclose( table_id ); return -1; } *first_id_out = first_id; file_ptr->max_id += count; if (!mhdf_write_max_id( file_ptr, status)) { H5Dclose( table_id ); return -1; } file_ptr->open_handle_count++; mhdf_setOkay( status ); API_END_H(1); return table_id; }
void mhdf_addElement( mhdf_FileHandle file_handle, const char* name, unsigned int elem_type, mhdf_Status* status ) { FileHandle* file_ptr = (FileHandle*)file_handle; hid_t group_id, tag_id, enum_id; char* path, *ptr; size_t name_len; herr_t rval; API_BEGIN; if (!mhdf_check_valid_file( file_ptr, status )) return; name_len = mhdf_name_to_path( name, NULL, 0 ); name_len += strlen(ELEMENT_GROUP) + 1; path = (char*)mhdf_malloc( name_len, status ); if (!path) return; strcpy( path, ELEMENT_GROUP ); ptr = path + strlen(ELEMENT_GROUP); if (!mhdf_path_to_name( name, ptr )) { mhdf_setFail( status, "Invalid character string in internal file path: \"%s\"\n", name ); return; } #if defined(H5Gcreate_vers) && H5Gcreate_vers > 1 group_id = H5Gcreate2( file_ptr->hdf_handle, path, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); #else group_id = H5Gcreate( file_ptr->hdf_handle, path, 3 ); #endif if (group_id < 0) { mhdf_setFail( status, "Creation of \"%s\" group failed.\n", path ); free( path ); return; } free( path ); #if defined(H5Gcreate_vers) && H5Gcreate_vers > 1 tag_id = H5Gcreate2( group_id, DENSE_TAG_SUBGROUP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); #else tag_id = H5Gcreate( group_id, DENSE_TAG_SUBGROUP, 0 ); #endif if (tag_id < 0) { H5Gclose( group_id ); mhdf_setFail( status, "Creation of tag subgroup failed.\n" ); return; } H5Gclose( tag_id ); enum_id = get_elem_type_enum( file_ptr, status ); if (enum_id < 0) { H5Gclose( group_id ); return; } rval = H5Tconvert( H5T_NATIVE_UINT, H5Tget_super(enum_id), 1, &elem_type, NULL, H5P_DEFAULT ); if (rval < 0) { H5Gclose( group_id ); H5Tclose( enum_id ); mhdf_setFail( status, "Internal error converting to enum type." ); return; } rval = mhdf_create_scalar_attrib( group_id, ELEM_TYPE_ATTRIB, enum_id, &elem_type, status ); H5Tclose( enum_id ); if (rval < 0) { H5Gclose( group_id ); return; } H5Gclose( group_id ); mhdf_setOkay( status ); API_END; }
void mhdf_createPolyConnectivity( mhdf_FileHandle file_handle, const char* elem_type, long num_poly, long data_list_length, long* first_id_out, hid_t handles_out[2], mhdf_Status* status ) { FileHandle* file_ptr; hid_t elem_id, index_id, conn_id; hsize_t dim; long first_id; API_BEGIN; file_ptr = (FileHandle*)(file_handle); if (!mhdf_check_valid_file( file_ptr, status )) return; if (num_poly <= 0 || data_list_length <= 0 || !first_id_out) { mhdf_setFail( status, "Invalid argument." ); return; } if (data_list_length < 3*num_poly) { /* Could check agains 4*num_poly, but allow degenerate polys (1 for count plus 2 dim-1 defining entities, where > 2 defining entities is a normal poly, 2 defining entities is a degenerate poly and 1 defning entity is not valid.) */ mhdf_setFail( status, "Invalid polygon data: data length of %ld is " "insufficient for %ld poly(gons/hedra).\n", data_list_length, num_poly ); return; } elem_id = mhdf_elem_group_from_handle( file_ptr, elem_type, status ); if (elem_id < 0) return; dim = (hsize_t)num_poly; index_id = mhdf_create_table( elem_id, POLY_INDEX_NAME, MHDF_INDEX_TYPE, 1, &dim, status ); if (index_id < 0) { H5Gclose(elem_id); return; } dim = (hsize_t)data_list_length; conn_id = mhdf_create_table( elem_id, CONNECTIVITY_NAME, file_ptr->id_type, 1, &dim, status ); H5Gclose( elem_id ); if (conn_id < 0) { H5Dclose(index_id); return; } first_id = file_ptr->max_id + 1; if (!mhdf_create_scalar_attrib( conn_id, START_ID_ATTRIB, H5T_NATIVE_LONG, &first_id, status )) { H5Dclose(index_id); H5Dclose( conn_id ); return; } *first_id_out = first_id; file_ptr->max_id += num_poly; if (!mhdf_write_max_id( file_ptr, status)) { H5Dclose(index_id); H5Dclose( conn_id ); return; } file_ptr->open_handle_count++; mhdf_setOkay( status ); handles_out[0] = index_id; handles_out[1] = conn_id; API_END_H(2); }
mhdf_FileHandle mhdf_createFile( const char* filename, int overwrite, const char** elem_type_list, size_t elem_list_len, hid_t id_type, mhdf_Status* status ) { FileHandle* file_ptr; unsigned int flags; unsigned char idx; size_t i; hid_t enum_id, group_id; int rval; API_BEGIN; if (elem_list_len > 255) { mhdf_setFail( status, "Element type list too long." ); return NULL; } mhdf_setOkay( status ); /* Create struct to hold working data */ file_ptr = mhdf_alloc_FileHandle( 0, id_type, status ); if (!file_ptr) return NULL; /* Create the file */ flags = overwrite ? H5F_ACC_TRUNC : H5F_ACC_EXCL; file_ptr->hdf_handle = H5Fcreate( filename, flags, H5P_DEFAULT, H5P_DEFAULT ); if (file_ptr->hdf_handle < 0) { mhdf_setFail( status, "Failed to create file \"%s\"", filename ); free( file_ptr ); return NULL; } /* Create file structure */ if (!make_hdf_group( ROOT_GROUP, file_ptr->hdf_handle, 6, status ) || !make_hdf_group( TAG_GROUP, file_ptr->hdf_handle, 0, status ) || !make_hdf_group( ELEMENT_GROUP, file_ptr->hdf_handle, 8, status ) || !make_hdf_group( NODE_GROUP, file_ptr->hdf_handle, 3, status ) || !make_hdf_group( SET_GROUP, file_ptr->hdf_handle, 5, status ) || !make_hdf_group( NODE_TAG_GROUP, file_ptr->hdf_handle, 0, status ) || !make_hdf_group( SET_TAG_GROUP, file_ptr->hdf_handle, 0, status )) { H5Fclose( file_ptr->hdf_handle ); free( file_ptr ); return NULL; } /* Store the max ID as an attribite on the /tstt/ group */ #if defined(H5Gopen_vers) && H5Gopen_vers > 1 group_id = H5Gopen2( file_ptr->hdf_handle, ROOT_GROUP, H5P_DEFAULT ); #else group_id = H5Gopen( file_ptr->hdf_handle, ROOT_GROUP ); #endif rval = mhdf_create_scalar_attrib( group_id, MAX_ID_ATTRIB, H5T_NATIVE_ULONG, &file_ptr->max_id, status ); H5Gclose( group_id ); if (!rval) { H5Fclose( file_ptr->hdf_handle ); free( file_ptr ); return NULL; } /* Create the type name list in file */ enum_id = H5Tenum_create( H5T_NATIVE_UCHAR ); if (enum_id < 0) { mhdf_setFail( status, "Failed to store elem type list." ); H5Fclose( file_ptr->hdf_handle ); free( file_ptr ); return NULL; } for (i = 0; i < elem_list_len; ++i) { if (!elem_type_list[i] || !*elem_type_list[i]) continue; idx = (unsigned char)i; if ( H5Tenum_insert( enum_id, elem_type_list[i], &idx ) < 0) { mhdf_setFail( status, "Failed to store elem type list." ); H5Fclose( file_ptr->hdf_handle ); free( file_ptr ); return NULL; } } #if defined(H5Tcommit_vers) && H5Tcommit_vers > 1 if (H5Tcommit2( file_ptr->hdf_handle, TYPE_ENUM_PATH, enum_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ) < 0) #else if (H5Tcommit( file_ptr->hdf_handle, TYPE_ENUM_PATH, enum_id ) < 0) #endif { mhdf_setFail( status, "Failed to store elem type list." ); H5Fclose( file_ptr->hdf_handle ); free( file_ptr ); return NULL; } H5Tclose( enum_id ); API_END_H( 1 ); return file_ptr; }