Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <stdlib.h>
#include <string.h>
#include <H5Tpublic.h>
#include <H5Gpublic.h>
#include <H5Dpublic.h>
#include <H5Spublic.h>
#include <H5Apublic.h>
#include <H5Ppublic.h>
#include "status.h"
#include "file-handle.h"
#include "mhdf.h"
#include "util.h"
#include "names-and-paths.h"
Go to the source code of this file.
Functions | |
hid_t | mhdf_getNativeType (hid_t input_type, int size, mhdf_Status *status) |
Make type native-endian. | |
static hid_t | get_tag (mhdf_FileHandle file_handle, const char *tag_name, hid_t *id_type, mhdf_Status *status) |
static hid_t | get_tag_type (FileHandle *file_ptr, const char *tag_path, mhdf_Status *status) |
static int | store_tag_val_in_attrib (hid_t tag_id, const char *attrib_name, hid_t type_id, const void *value, hsize_t value_size, mhdf_Status *status) |
static hid_t | create_tag_common (mhdf_FileHandle file_handle, const char *tag_name, enum mhdf_TagDataType tag_type, int size, int storage, const void *default_value, int default_value_size_in, const void *global_value, int global_value_size_in, hid_t hdf_type, hid_t hdf_base_type, mhdf_Status *status) |
hid_t | mhdf_getTagDataType (mhdf_FileHandle file_handle, const char *tag_name, mhdf_Status *status) |
Get handle to HDF5 type object for tag data. | |
void | mhdf_createTag (mhdf_FileHandle file_handle, const char *tag_name, enum mhdf_TagDataType tag_type, int size, int storage, const void *default_value, const void *global_value, hid_t hdf_type, hid_t hdf_base_type, mhdf_Status *status) |
Add a tag to the file. | |
void | mhdf_createVarLenTag (mhdf_FileHandle file_handle, const char *tag_name, enum mhdf_TagDataType tag_type, int storage, const void *default_value, int default_value_length, const void *global_value, int global_value_length, hid_t hdf_type, hid_t hdf_base_type, mhdf_Status *status) |
Add variable-length tag to file. | |
int | mhdf_getNumberTags (mhdf_FileHandle file_handle, mhdf_Status *status) |
Get the number of tags in the file. | |
char ** | mhdf_getTagNames (mhdf_FileHandle file_handle, int *num_names_out, mhdf_Status *status) |
Get the name for each tag defined in the file. | |
static int | get_attrib_array_length_handle (hid_t attrib_id) |
static int | get_attrib_array_length_name (hid_t file, const char *path) |
void | mhdf_getTagInfo (mhdf_FileHandle file_handle, const char *tag_name, enum mhdf_TagDataType *class_out, int *size_out, int *tstt_storage_out, int *have_default_out, int *have_global_out, int *have_sparse_out, mhdf_Status *status) |
Get the description of a specified tag. | |
static int | read_tag_attrib_data (hid_t tag_id, const char *attrib_name, hid_t type_id, void *data, int is_var_len, mhdf_Status *status) |
void | mhdf_getTagValues (mhdf_FileHandle file_handle, const char *tag_name, hid_t output_data_type, void *default_value, void *global_value, mhdf_Status *status) |
Get the default and global values of the tag. | |
int | mhdf_haveDenseTag (mhdf_FileHandle file_handle, const char *tag_name, const char *type_handle, mhdf_Status *status) |
Check if the file contains dense tag data for the specified tag and element group. | |
hid_t | mhdf_createDenseTagData (mhdf_FileHandle file_handle, const char *tag_name, const char *type_handle, long num_values, mhdf_Status *status) |
Create an object to hold dense tag values for a given element group. | |
hid_t | mhdf_openDenseTagData (mhdf_FileHandle file_handle, const char *tag_name, const char *type_handle, long *num_values_out, mhdf_Status *status) |
Open the object containing dense tag values for a given element group. | |
void | mhdf_createSparseTagData (mhdf_FileHandle file_handle, const char *tag_name, long num_values, hid_t handles_out[2], mhdf_Status *status) |
Create file objects to store sparse tag data. | |
void | mhdf_createVarLenTagData (mhdf_FileHandle file_handle, const char *tag_name, long num_entities, long num_values, hid_t handles_out[3], mhdf_Status *status) |
Create file objects to store (sparse) variable-length tag data. | |
void | mhdf_openSparseTagData (mhdf_FileHandle file_handle, const char *tag_name, long *num_entity_out, long *num_values_out, hid_t handles_out[3], mhdf_Status *status) |
Create file objects to read sparse tag data. | |
void | mhdf_writeSparseTagEntities (hid_t table_id, long offset, long count, hid_t int_type, const void *id_list, mhdf_Status *status) |
Write Global ID list for sparse tag data. | |
void | mhdf_writeSparseTagEntitiesWithOpt (hid_t table_id, long offset, long count, hid_t int_type, const void *id_list, hid_t io_prop, mhdf_Status *status) |
void | mhdf_writeTagValues (hid_t table_id, long offset, long count, hid_t tag_type, const void *tag_data, mhdf_Status *status) |
Write tag values. | |
void | mhdf_writeTagValuesWithOpt (hid_t table_id, long offset, long count, hid_t tag_type, const void *tag_data, hid_t io_prop, mhdf_Status *status) |
void | mhdf_writeSparseTagIndices (hid_t table_id, long offset, long count, hid_t int_type, const void *indices, mhdf_Status *status) |
Write sparse tag end indices for variable-length tag data. | |
void | mhdf_writeSparseTagIndicesWithOpt (hid_t table_id, long offset, long count, hid_t int_type, const void *indices, hid_t io_prop, mhdf_Status *status) |
void | mhdf_readSparseTagEntities (hid_t table_id, long offset, long count, hid_t int_type, void *id_list, mhdf_Status *status) |
Read Global ID list for sparse tag data. | |
void | mhdf_readSparseTagEntitiesWithOpt (hid_t table_id, long offset, long count, hid_t int_type, void *id_list, hid_t io_prop, mhdf_Status *status) |
void | mhdf_readTagValues (hid_t table_id, long offset, long count, hid_t tag_type, void *tag_data, mhdf_Status *status) |
Read tag values. | |
void | mhdf_readTagValuesWithOpt (hid_t table_id, long offset, long count, hid_t tag_type, void *tag_data, hid_t io_prop, mhdf_Status *status) |
void | mhdf_readSparseTagIndices (hid_t table_id, long offset, long count, hid_t int_type, void *indices, mhdf_Status *status) |
Read sparse tag end indices for variable-length tag data. | |
void | mhdf_readSparseTagIndicesWithOpt (hid_t table_id, long offset, long count, hid_t int_type, void *indices, hid_t io_prop, mhdf_Status *status) |
static hid_t create_tag_common | ( | mhdf_FileHandle | file_handle, |
const char * | tag_name, | ||
enum mhdf_TagDataType | tag_type, | ||
int | size, | ||
int | storage, | ||
const void * | default_value, | ||
int | default_value_size_in, | ||
const void * | global_value, | ||
int | global_value_size_in, | ||
hid_t | hdf_type, | ||
hid_t | hdf_base_type, | ||
mhdf_Status * | status | ||
) | [static] |
Definition at line 235 of file tags.c.
References struct_FileHandle::hdf_handle, mhdf_BITFIELD, mhdf_BOOLEAN, mhdf_check_valid_file(), mhdf_create_scalar_attrib(), mhdf_ENTITY_ID, mhdf_FLOAT, mhdf_INTEGER, mhdf_name_to_path_copy(), mhdf_OPAQUE, mhdf_setFail(), mhdf_setOkay(), store_tag_val_in_attrib(), TAG_DEFAULT_ATTRIB, TAG_GLOBAL_ATTRIB, TAG_GROUP, TAG_HANDLE_TYPE_ATTRIB, TAG_TYPE_ATTRIB, and TAG_TYPE_NAME.
Referenced by mhdf_createTag(), and mhdf_createVarLenTag().
{ hid_t temp_id, group_id, tag_id; char* path; FileHandle* file_ptr; herr_t rval; hsize_t arr_len; int one = 1, var_len = 0; hsize_t default_value_size = default_value_size_in; hsize_t global_value_size = global_value_size_in; int close_base_type = 0; /* Force standard data types over user-specified types */ if( tag_type != mhdf_OPAQUE ) hdf_type = 0; if( tag_type != mhdf_ENTITY_ID ) hdf_base_type = 0; /* Validate input */ file_ptr = (FileHandle*)file_handle; if( !mhdf_check_valid_file( file_ptr, status ) ) return -1; if( !tag_name || !*tag_name ) { mhdf_setFail( status, "Invalid tag name" ); return -1; } /* Open the tag group */ #if defined( H5Gopen_vers ) && H5Gopen_vers > 1 group_id = H5Gopen2( file_ptr->hdf_handle, TAG_GROUP, H5P_DEFAULT ); #else group_id = H5Gopen( file_ptr->hdf_handle, TAG_GROUP ); #endif if( group_id < 0 ) { mhdf_setFail( status, "H5Gopen(\"%s\") failed.", TAG_GROUP ); return -1; } /* Create path string for tag object */ path = mhdf_name_to_path_copy( tag_name, status ); if( !path ) { H5Gclose( group_id ); return -1; } /* Create group for this tag */ #if defined( H5Gcreate_vers ) && H5Gcreate_vers > 1 tag_id = H5Gcreate2( group_id, path, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); #else tag_id = H5Gcreate( group_id, path, 3 ); #endif if( tag_id < 0 ) { mhdf_setFail( status, "H5Gcreate( \"%s\" ) failed.", path ); free( path ); H5Gclose( group_id ); return -1; } /* Store the tag name as the comment on the group entry */ rval = H5Gset_comment( group_id, path, tag_name ); H5Gclose( group_id ); free( path ); if( rval < 0 ) { mhdf_setFail( status, "H5Gset_comment failed for tag \"%s\"", tag_name ); H5Gclose( tag_id ); return -1; } /* Store TSTT tag type as attribute */ rval = mhdf_create_scalar_attrib( tag_id, TAG_TYPE_ATTRIB, H5T_NATIVE_INT, &storage, status ); if( !rval ) { H5Gclose( tag_id ); return -1; } if( hdf_type ) { hdf_type = H5Tcopy( hdf_type ); arr_len = 1; } else { switch( tag_type ) { default: case mhdf_OPAQUE: arr_len = 1; hdf_type = H5Tcreate( H5T_OPAQUE, abs( size ) ); H5Tset_tag( hdf_type, "tag_data" ); break; case mhdf_BITFIELD: arr_len = 1; if( size <= 0 ) { mhdf_setFail( status, "Invalid size (%d) for bit tag.", (int)size ); return -1; } else if( size <= 8 ) hdf_type = H5Tcopy( H5T_NATIVE_B8 ); else if( size <= 16 ) hdf_type = H5Tcopy( H5T_NATIVE_B16 ); else if( size <= 32 ) hdf_type = H5Tcopy( H5T_NATIVE_B32 ); else if( size <= 64 ) hdf_type = H5Tcopy( H5T_NATIVE_B64 ); else { mhdf_setFail( status, "Cannot create a bit tag larger than 64-bits. %d bits requested.\n", (int)size ); return -1; } if( 0 > H5Tset_precision( hdf_type, size ) ) { mhdf_setFail( status, "H5Tset_precision failed." ); return -1; } break; case mhdf_ENTITY_ID: arr_len = abs( size ); hdf_type = H5Tcopy( H5T_NATIVE_ULONG ); break; case mhdf_BOOLEAN: arr_len = abs( size ); hdf_type = H5Tcopy( H5T_NATIVE_UCHAR ); break; case mhdf_INTEGER: arr_len = abs( size ); hdf_type = H5Tcopy( H5T_NATIVE_INT ); break; case mhdf_FLOAT: arr_len = abs( size ); hdf_type = H5Tcopy( H5T_NATIVE_DOUBLE ); break; } } if( hdf_type <= 0 ) { mhdf_setFail( status, "Failed to create tag type object." ); H5Gclose( tag_id ); return -1; } if( hdf_base_type && H5Tget_class( hdf_type ) != H5Tget_class( hdf_base_type ) ) { mhdf_setFail( status, "Invalid base type for tag default/global data" ); H5Gclose( tag_id ); return -1; } if( size < -1 || !arr_len ) { mhdf_setFail( status, "Invalid 'size' parameter passed to mhdf_createTag (%d)", (int)size ); H5Gclose( tag_id ); return -1; } else if( size == -1 ) { /* Note: we don't do anything with this here. We rely on * the app to ask us to create the index table later. */ arr_len = 1; /* need to know this later, when storing default/global values */ var_len = 1; } else if( arr_len > 1 ) { #if defined( H5Tarray_create_vers ) && H5Tarray_create_vers > 1 temp_id = H5Tarray_create2( hdf_type, 1, &arr_len ); #else temp_id = H5Tarray_create( hdf_type, 1, &arr_len, NULL ); #endif H5Tclose( hdf_type ); if( temp_id < 0 ) { mhdf_setFail( status, "Failed to create tag type object." ); H5Gclose( tag_id ); return -1; } hdf_type = temp_id; if( hdf_base_type ) { if( H5Tequal( hdf_base_type, hdf_type ) > 0 ) { hdf_base_type = hdf_type; } else { #if defined( H5Tarray_create_vers ) && H5Tarray_create_vers > 1 temp_id = H5Tarray_create2( hdf_base_type, 1, &arr_len ); #else temp_id = H5Tarray_create( hdf_base_type, 1, &arr_len, NULL ); #endif if( temp_id < 0 ) { mhdf_setFail( status, "Failed to create tag type object." ); H5Gclose( tag_id ); H5Tclose( hdf_type ); return -1; } hdf_base_type = temp_id; close_base_type = 1; } } } if( !hdf_base_type ) hdf_base_type = hdf_type; /* Create tag type object, or write attribute if opaque */ #if defined( H5Tcommit_vers ) && H5Tcommit_vers > 1 rval = H5Tcommit2( tag_id, TAG_TYPE_NAME, hdf_type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); #else rval = H5Tcommit( tag_id, TAG_TYPE_NAME, hdf_type ); #endif if( rval < 0 ) { mhdf_setFail( status, "H5Tcommit failed for tag \"%s\"", tag_name ); if( close_base_type ) H5Tclose( hdf_base_type ); H5Tclose( hdf_type ); H5Gclose( tag_id ); return -1; } /* If tag is entity handle, make note of it */ if( tag_type == mhdf_ENTITY_ID ) { rval = mhdf_create_scalar_attrib( tag_id, TAG_HANDLE_TYPE_ATTRIB, H5T_NATIVE_INT, &one, status ); if( !rval ) { if( close_base_type ) H5Tclose( hdf_base_type ); H5Gclose( tag_id ); H5Tclose( hdf_type ); return -1; } } /* Store the default value as a attribute of the tag group */ if( default_value ) { rval = store_tag_val_in_attrib( tag_id, TAG_DEFAULT_ATTRIB, hdf_base_type, default_value, var_len ? default_value_size : 1, status ); if( !rval ) { if( close_base_type ) H5Tclose( hdf_base_type ); H5Gclose( tag_id ); H5Tclose( hdf_type ); return -1; } } /* Store global tag value as attribute */ if( global_value ) { rval = store_tag_val_in_attrib( tag_id, TAG_GLOBAL_ATTRIB, hdf_base_type, global_value, var_len ? global_value_size : 1, status ); if( !rval ) { if( close_base_type ) H5Tclose( hdf_base_type ); H5Gclose( tag_id ); H5Tclose( hdf_type ); return -1; } } if( close_base_type ) H5Tclose( hdf_base_type ); H5Tclose( hdf_type ); mhdf_setOkay( status ); return tag_id; }
static int get_attrib_array_length_handle | ( | hid_t | attrib_id | ) | [static] |
Definition at line 741 of file tags.c.
Referenced by get_attrib_array_length_name().
{ hid_t type_id; int rank; hsize_t dims[H5S_MAX_RANK]; int perm[H5S_MAX_RANK]; type_id = H5Aget_type( attrib_id ); switch( H5Tget_class( type_id ) ) { case H5T_NO_CLASS: dims[0] = -1; break; case H5T_OPAQUE: dims[0] = H5Tget_size( type_id ); break; case H5T_ARRAY: #if defined( H5Tget_array_dims_vers ) && H5Tget_array_dims_vers > 1 (void)perm; /* suppress warning */ rank = H5Tget_array_dims2( type_id, dims ); #else rank = H5Tget_array_dims( type_id, dims, perm ); #endif if( rank == 1 ) break; else return -1; default: dims[0] = 1; break; } H5Tclose( type_id ); return dims[0]; }
static int get_attrib_array_length_name | ( | hid_t | file, |
const char * | path | ||
) | [static] |
Definition at line 793 of file tags.c.
References get_attrib_array_length_handle().
Referenced by mhdf_getTagInfo(), and read_tag_attrib_data().
{ hid_t attrib_id; int result; attrib_id = H5Aopen_name( file, path ); if( attrib_id < 0 ) return -1; result = get_attrib_array_length_handle( attrib_id ); H5Aclose( attrib_id ); return result; }
static hid_t get_tag | ( | mhdf_FileHandle | file_handle, |
const char * | tag_name, | ||
hid_t * | id_type, | ||
mhdf_Status * | status | ||
) | [static] |
Definition at line 106 of file tags.c.
References struct_FileHandle::hdf_handle, struct_FileHandle::id_type, mhdf_check_valid_file(), mhdf_name_to_path_copy(), mhdf_setFail(), mhdf_setOkay(), and TAG_GROUP.
Referenced by mhdf_createSparseTagData(), mhdf_createVarLenTagData(), mhdf_getTagInfo(), mhdf_getTagValues(), and mhdf_openSparseTagData().
{ hid_t group_id, tag_id; char* path; FileHandle* file_ptr; file_ptr = (FileHandle*)file_handle; if( !mhdf_check_valid_file( file_ptr, status ) ) return -1; if( NULL != id_type ) *id_type = file_ptr->id_type; path = mhdf_name_to_path_copy( tag_name, status ); if( NULL == path ) return -1; #if defined( H5Gopen_vers ) && H5Gopen_vers > 1 group_id = H5Gopen2( file_ptr->hdf_handle, TAG_GROUP, H5P_DEFAULT ); #else group_id = H5Gopen( file_ptr->hdf_handle, TAG_GROUP ); #endif if( group_id < 0 ) { mhdf_setFail( status, "Failed to open tag group." ); free( path ); return -1; } #if defined( H5Gopen_vers ) && H5Gopen_vers > 1 tag_id = H5Gopen2( group_id, path, H5P_DEFAULT ); #else tag_id = H5Gopen( group_id, path ); #endif H5Gclose( group_id ); free( path ); if( tag_id < 0 ) { mhdf_setFail( status, "Failed to open tag data for tag \"%s\".", tag_name ); return -1; } mhdf_setOkay( status ); return tag_id; }
static hid_t get_tag_type | ( | FileHandle * | file_ptr, |
const char * | tag_path, | ||
mhdf_Status * | status | ||
) | [static] |
Definition at line 149 of file tags.c.
References struct_FileHandle::hdf_handle, mhdf_setFail(), TAG_GROUP, and TAG_TYPE_NAME.
Referenced by mhdf_createDenseTagData(), and mhdf_getTagDataType().
{ hid_t group_id, tag_id, type_id; #if defined( H5Gopen_vers ) && H5Gopen_vers > 1 group_id = H5Gopen2( file_ptr->hdf_handle, TAG_GROUP, H5P_DEFAULT ); #else group_id = H5Gopen( file_ptr->hdf_handle, TAG_GROUP ); #endif if( group_id < 0 ) { mhdf_setFail( status, "Failed to open tag group." ); return -1; } #if defined( H5Gopen_vers ) && H5Gopen_vers > 1 tag_id = H5Gopen2( group_id, tag_path, H5P_DEFAULT ); #else tag_id = H5Gopen( group_id, tag_path ); #endif H5Gclose( group_id ); if( tag_id < 0 ) { mhdf_setFail( status, "Failed to open group for tag \"%s\".", tag_path ); return -1; } #if defined( H5Topen_vers ) && H5Topen_vers > 1 type_id = H5Topen2( tag_id, TAG_TYPE_NAME, H5P_DEFAULT ); #else type_id = H5Topen( tag_id, TAG_TYPE_NAME ); #endif H5Gclose( tag_id ); if( type_id < 0 ) { mhdf_setFail( status, "Failed to open type data for tag \"%s\".", tag_path ); return -1; } return type_id; }
static int read_tag_attrib_data | ( | hid_t | tag_id, |
const char * | attrib_name, | ||
hid_t | type_id, | ||
void * | data, | ||
int | is_var_len, | ||
mhdf_Status * | status | ||
) | [static] |
Definition at line 1075 of file tags.c.
References get_attrib_array_length_name(), mhdf_find_attribute(), mhdf_read_scalar_attrib(), and mhdf_setFail().
Referenced by mhdf_getTagValues().
{ int rval, ilen; unsigned idx; hid_t read_type = type_id; hsize_t len; /* Check if tag has attribute */ rval = mhdf_find_attribute( tag_id, attrib_name, &idx, status ); if( rval < 0 ) return 0; else if( 0 == rval ) return 1; if( NULL == data ) { mhdf_setFail( status, "Invalid input." ); return 0; } if( is_var_len ) { /* len = get_attrib_array_length_index(tag_id, index); */ ilen = get_attrib_array_length_name( tag_id, attrib_name ); if( ilen < 0 ) { mhdf_setFail( status, "Failed to read length of default/mesh value for tag" ); return 0; } len = ilen; /* caller passes type_id == 0 for OPAQUE */ if( 0 == type_id ) read_type = H5Tcreate( H5T_OPAQUE, len ); else { #if defined( H5Tarray_create_vers ) && H5Tarray_create_vers > 1 read_type = H5Tarray_create2( type_id, 1, &len ); #else read_type = H5Tarray_create( type_id, 1, &len, 0 ); #endif } if( read_type < 0 ) { mhdf_setFail( status, "Failed to read mesh/default value for tag" ); return 0; } } rval = mhdf_read_scalar_attrib( tag_id, attrib_name, read_type, data, status ); if( is_var_len ) H5Tclose( read_type ); return rval; }
static int store_tag_val_in_attrib | ( | hid_t | tag_id, |
const char * | attrib_name, | ||
hid_t | type_id, | ||
const void * | value, | ||
hsize_t | value_size, | ||
mhdf_Status * | status | ||
) | [static] |
Helper function to write default and mesh values for tag
tag_id | The file object upon which to attach the attribute |
attrib_name | The name of the attribute object |
type_id | The data type of the attribute data |
value | Pointer to attribute data |
value_size | Size of attribute data, as multiple of type indicated by type_id. Should be 1 except for variable-length tag data. |
Definition at line 199 of file tags.c.
References mhdf_create_scalar_attrib(), and mhdf_setFail().
Referenced by create_tag_common().
{ hid_t write_type; int rval; if( value_size == 1 ) write_type = type_id; else if( H5Tget_class( type_id ) == H5T_OPAQUE ) { write_type = H5Tcreate( H5T_OPAQUE, value_size ); } else { #if defined( H5Tarray_create_vers ) && H5Tarray_create_vers > 1 write_type = H5Tarray_create2( type_id, 1, &value_size ); #else write_type = H5Tarray_create( type_id, 1, &value_size, 0 ); #endif } if( write_type < 0 ) { mhdf_setFail( status, "Error constructing type object for tag mesh/default value" ); return -1; } rval = mhdf_create_scalar_attrib( tag_id, attrib_name, write_type, value, status ); if( write_type != type_id ) H5Tclose( write_type ); return rval; }