Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include "mhdf.h"
#include "util.h"
#include "status.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <H5Tpublic.h>
#include <H5Dpublic.h>
#include <H5Ppublic.h>
Go to the source code of this file.
Defines | |
#define | FIX_OFFSET(TYPE, FIELD) |
Functions | |
static struct mhdf_FileDesc * | alloc_file_desc (mhdf_Status *status) |
static void * | realloc_data (struct mhdf_FileDesc **data, size_t append_bytes, mhdf_Status *status, int alignment) |
void | mhdf_fixFileDesc (struct mhdf_FileDesc *copy_ptr, const struct mhdf_FileDesc *orig_addr) |
Fix nested pointers for copied/moved FileDesc struct. | |
static struct mhdf_FileDesc * | get_elem_desc (mhdf_FileHandle file_handle, struct mhdf_FileDesc *result, const char *elem_handle, int idx, mhdf_Status *status) |
static unsigned | get_file_id_size (hid_t file_id_type, mhdf_Status *status) |
static struct mhdf_FileDesc * | get_tag_desc (mhdf_FileHandle file_handle, struct mhdf_FileDesc *result, const char *name, int idx, hid_t type, mhdf_Status *status) |
static void | free_string_list (char **list, int count) |
struct mhdf_FileDesc * | mhdf_getFileSummary (mhdf_FileHandle file_handle, hid_t file_id_type, mhdf_Status *status, int extraSetInfo) |
Get summary of data tables contained within file. | |
Variables | |
static char | buffer [512] |
#define FIX_OFFSET | ( | TYPE, | |
FIELD | |||
) |
if( copy_ptr->FIELD != NULL ) \ copy_ptr->FIELD = (TYPE)( ( (char*)( copy_ptr->FIELD ) - (char*)orig_addr ) + (char*)copy_ptr )
Definition at line 73 of file file-desc.c.
Referenced by mhdf_fixFileDesc().
static struct mhdf_FileDesc * alloc_file_desc | ( | mhdf_Status * | status | ) | [static, read] |
Definition at line 15 of file file-desc.c.
References mhdf_isError(), mhdf_malloc(), mhdf_FileDesc::offset, and mhdf_FileDesc::total_size.
Referenced by mhdf_getFileSummary().
{ struct mhdf_FileDesc* result; /* allocate a little short of a page */ result = (struct mhdf_FileDesc*)mhdf_malloc( 4000, status ); if( mhdf_isError( status ) ) return 0; memset( result, 0, sizeof( struct mhdf_FileDesc ) ); result->total_size = 4000; result->offset = ( (unsigned char*)result ) + sizeof( struct mhdf_FileDesc ); return result; }
static void free_string_list | ( | char ** | list, |
int | count | ||
) | [static] |
Definition at line 377 of file file-desc.c.
Referenced by mhdf_getFileSummary().
{ int i; for( i = 0; i < count; ++i ) free( list[i] ); free( list ); }
static struct mhdf_FileDesc* get_elem_desc | ( | mhdf_FileHandle | file_handle, |
struct mhdf_FileDesc * | result, | ||
const char * | elem_handle, | ||
int | idx, | ||
mhdf_Status * | status | ||
) | [static, read] |
Definition at line 120 of file file-desc.c.
References buffer, mhdf_EntDesc::count, mhdf_EntDesc::dense_tag_indices, mhdf_ElemDesc::desc, mhdf_FileDesc::elems, mhdf_ElemDesc::handle, mhdf_ElemDesc::have_adj, mhdf_closeData(), mhdf_getElemTypeName(), mhdf_haveAdjacency(), mhdf_isError(), mhdf_isPolyElement(), mhdf_openConnectivity(), mhdf_openPolyConnectivity(), mhdf_EntDesc::num_dense_tags, realloc_data(), mhdf_EntDesc::start_id, mhdf_ElemDesc::type, and mhdf_EntDesc::vals_per_ent.
Referenced by mhdf_getFileSummary().
{ hid_t id_pair[2]; int poly; void* ptr; long junk; ptr = realloc_data( &result, strlen( elem_handle ) + 1, status, sizeof(char) ); if( !ptr ) return NULL; strcpy( ptr, elem_handle ); result->elems[idx].handle = ptr; mhdf_getElemTypeName( file_handle, elem_handle, buffer, sizeof( buffer ), status ); if( mhdf_isError( status ) ) { free( result ); return NULL; } ptr = realloc_data( &result, strlen( buffer ) + 1, status, sizeof(char) ); if( !ptr ) return NULL; strcpy( ptr, buffer ); result->elems[idx].type = ptr; poly = mhdf_isPolyElement( file_handle, elem_handle, status ); if( mhdf_isError( status ) ) { free( result ); return NULL; } if( !poly ) { id_pair[0] = mhdf_openConnectivity( file_handle, elem_handle, &result->elems[idx].desc.vals_per_ent, &result->elems[idx].desc.count, &result->elems[idx].desc.start_id, status ); if( id_pair[0] < 0 ) { free( result ); return NULL; } mhdf_closeData( file_handle, id_pair[0], status ); } else { result->elems[idx].desc.vals_per_ent = -1; mhdf_openPolyConnectivity( file_handle, elem_handle, &result->elems[idx].desc.count, &junk, &result->elems[idx].desc.start_id, id_pair, status ); if( id_pair[0] < 0 ) { free( result ); return NULL; } mhdf_closeData( file_handle, id_pair[0], status ); mhdf_closeData( file_handle, id_pair[1], status ); } result->elems[idx].desc.dense_tag_indices = NULL; result->elems[idx].desc.num_dense_tags = 0; result->elems[idx].have_adj = mhdf_haveAdjacency( file_handle, result->elems[idx].handle, status ); if( mhdf_isError( status ) ) { free( result ); return 0; } return result; }
static unsigned get_file_id_size | ( | hid_t | file_id_type, |
mhdf_Status * | status | ||
) | [static] |
Definition at line 192 of file file-desc.c.
References mhdf_setFail().
Referenced by get_tag_desc().
{ if( H5Tget_class( file_id_type ) != H5T_INTEGER ) { mhdf_setFail( status, "Invalid handle or type class for file ID type." ); return 0; } return H5Tget_size( file_id_type ); }
static struct mhdf_FileDesc* get_tag_desc | ( | mhdf_FileHandle | file_handle, |
struct mhdf_FileDesc * | result, | ||
const char * | name, | ||
int | idx, | ||
hid_t | type, | ||
mhdf_Status * | status | ||
) | [static, read] |
Definition at line 203 of file file-desc.c.
References mhdf_TagDesc::bytes, mhdf_TagDesc::default_value, mhdf_TagDesc::default_value_size, get_file_id_size(), mhdf_TagDesc::global_value, mhdf_TagDesc::global_value_size, mhdf_TagDesc::have_sparse, mhdf_BITFIELD, mhdf_BOOLEAN, mhdf_ENTITY_ID, mhdf_FLOAT, mhdf_getTagInfo(), mhdf_getTagValues(), mhdf_INTEGER, mhdf_isError(), mhdf_OPAQUE, mhdf_setFail(), mhdf_TagDesc::name, realloc_data(), size, mhdf_TagDesc::size, mhdf_TagDesc::storage, mhdf_FileDesc::tags, and mhdf_TagDesc::type.
Referenced by mhdf_getFileSummary().
{ void* ptr; int have_default, have_global; int valsize, size, close_type = 0; hsize_t array_len; ptr = realloc_data( &result, strlen( name ) + 1, status, sizeof(char) ); if( NULL == ptr ) return NULL; strcpy( ptr, name ); result->tags[idx].name = ptr; mhdf_getTagInfo( file_handle, name, &result->tags[idx].type, &result->tags[idx].size, &result->tags[idx].storage, &have_default, &have_global, &result->tags[idx].have_sparse, status ); if( mhdf_isError( status ) ) { free( result ); return NULL; } /* For variable length tags, have_default and have_global will contain the size of the respective values. For fixed-length tags, they are either zero or one. Simplify later code by making them contain the size for both cases. */ valsize = result->tags[idx].size; if( result->tags[idx].size >= 0 ) { if( have_default ) have_default = valsize; if( have_global ) have_global = valsize; } result->tags[idx].default_value = NULL; result->tags[idx].default_value_size = have_default; result->tags[idx].global_value = NULL; result->tags[idx].global_value_size = have_global; switch( result->tags[idx].type ) { case mhdf_OPAQUE: type = 0; break; case mhdf_BOOLEAN: type = H5T_NATIVE_UCHAR; break; case mhdf_INTEGER: type = H5T_NATIVE_INT; have_default *= sizeof( int ); have_global *= sizeof( int ); valsize *= sizeof( int ); break; case mhdf_FLOAT: type = H5T_NATIVE_DOUBLE; have_default *= sizeof( double ); have_global *= sizeof( double ); valsize *= sizeof( double ); break; case mhdf_BITFIELD: have_default = ( have_default + 7 ) / 8; have_global = ( have_global + 7 ) / 8; valsize = ( valsize + 7 ) / 8; switch( valsize ) { case 1: type = H5Tcopy( H5T_NATIVE_B8 ); break; case 2: type = H5Tcopy( H5T_NATIVE_B16 ); break; case 3: case 4: valsize += 4 - valsize; // to avoid fallthrough warning type = H5Tcopy( H5T_NATIVE_B32 ); break; case 5: case 6: case 7: case 8: valsize += 8 - valsize; // to avoid fallthrough warning type = H5Tcopy( H5T_NATIVE_B64 ); break; default: free( result ); mhdf_setFail( status, "Cannot create a bit tag larger than 64-bits. %d bits requested.\n", (int)valsize ); return NULL; } close_type = 1; break; case mhdf_ENTITY_ID: if( 0 == type ) type = H5T_NATIVE_ULONG; size = get_file_id_size( type, status ); if( !size ) { free( result ); return NULL; } have_default *= size; have_global *= size; valsize *= size; break; default: mhdf_setFail( status, "Unknown mhdf_TagDataType value (%d) for tag (\"%s\")", (int)result->tags[idx].type, name ); free( result ); return NULL; } result->tags[idx].bytes = valsize; if( result->tags[idx].type != mhdf_OPAQUE && result->tags[idx].type != mhdf_BITFIELD && result->tags[idx].size > 1 ) { close_type = 1; array_len = result->tags[idx].size; #if defined( H5Tarray_create_vers ) && H5Tarray_create_vers > 1 type = H5Tarray_create2( type, 1, &array_len ); #else type = H5Tarray_create( type, 1, &array_len, 0 ); #endif if( type < 0 ) { mhdf_setFail( status, "H5Tarray_create failed for tag (\"%s\")", name ); free( result ); return NULL; } } if( have_default || have_global ) { if( have_default ) { ptr = realloc_data( &result, have_default, status, sizeof(int) ); if( NULL == ptr ) { if( close_type ) { H5Tclose( type ); } return NULL; } result->tags[idx].default_value = ptr; } if( have_global ) { ptr = realloc_data( &result, have_global, status, sizeof(int) ); if( NULL == ptr ) { if( close_type ) { H5Tclose( type ); } return NULL; } result->tags[idx].global_value = ptr; } mhdf_getTagValues( file_handle, name, type, result->tags[idx].default_value, result->tags[idx].global_value, status ); if( close_type ) { H5Tclose( type ); } if( mhdf_isError( status ) ) { free( result ); return NULL; } } return result; }
static void * realloc_data | ( | struct mhdf_FileDesc ** | data, |
size_t | append_bytes, | ||
mhdf_Status * | status, | ||
int | alignment | ||
) | [static] |
Definition at line 28 of file file-desc.c.
References mhdf_fixFileDesc(), mhdf_isError(), mhdf_realloc(), mhdf_FileDesc::offset, and mhdf_FileDesc::total_size.
Referenced by get_elem_desc(), get_tag_desc(), and mhdf_getFileSummary().
{ void* result_ptr; struct mhdf_FileDesc* const input_ptr = *data; unsigned char* mem_ptr = (unsigned char*)input_ptr; size_t new_size, occupied_size = input_ptr->offset - mem_ptr; int append_bytes_padded = append_bytes + alignment - 1; /* if the end of the allocated space is before the end of the required space */ if( mem_ptr + input_ptr->total_size < input_ptr->offset + append_bytes_padded ) { if( append_bytes_padded < input_ptr->total_size ) new_size = 2 * input_ptr->total_size; else new_size = input_ptr->total_size + append_bytes_padded; *data = (struct mhdf_FileDesc*)mhdf_realloc( *data, new_size, status ); if( mhdf_isError( status ) ) return 0; /* if realloc moved us to a different location in memory, * we need to update all of the internal pointers to * new locations relative to the start of the struct */ if( *data != input_ptr ) { mhdf_fixFileDesc( *data, input_ptr ); mem_ptr = (unsigned char*)( *data ); ( *data )->offset = mem_ptr + occupied_size; } ( *data )->total_size = new_size; } result_ptr = ( *data )->offset; /* need to make this return pointer aligned */ uintptr_t addr = (uintptr_t)(( *data )->offset); int pad = addr%alignment; if (pad > 0) { ( *data )->offset += (alignment-pad); result_ptr = ( *data )->offset; } /*printf("new address %p \n", result_ptr);*/ ( *data )->offset += append_bytes; return result_ptr; }
char buffer[512] [static] |
Definition at line 13 of file file-desc.c.
Referenced by check_valid_adjacencies(), check_valid_elem_conn(), check_valid_poly_conn(), file_exists(), get_elem_desc(), moab::ReadHDF5::get_tagged_entities(), moab::INT_IO_ERROR(), is_acis_bin_file(), is_acis_txt_file(), moab::ReadCGM::is_cubit_file(), is_cubit_file(), moab::ReadCGM::is_facet_file(), moab::ReadCGM::is_iges_file(), is_iges_file(), moab::ReadCGM::is_occ_brep_file(), is_occ_brep_file(), moab::ReadCGM::is_step_file(), is_step_file(), moab::mem_to_string(), mhdf_getElemHandles(), mhdf_name_to_path_cat(), mhdf_name_to_path_copy(), moab::mpi_err_str(), moab::WriteHDF5::ExportSet::name(), print_error(), print_iGeom_error(), print_iMesh_error(), moab::ErrorOutput::print_real(), moab::DebugOutput::print_real(), moab::ReadHDF5::read_adjacencies(), moab::ReadHDF5::read_elems(), moab::ReadHDF5::read_node_adj_elems(), moab::ReadHDF5::read_nodes(), moab::ReadHDF5VarLen::read_offsets(), moab::ReadHDF5::read_poly(), moab::ReadHDF5::read_set_data(), moab::ReadHDF5::read_tag_values_partial(), moab::ReadHDF5::read_var_len_tag(), moab::ParCommGraph::receive_mesh(), moab::ParCommGraph::receive_tag_values(), moab::ReorderTool::reorder_tag_data(), moab::ReadHDF5::search_tag_values(), moab::ParCommGraph::send_graph_partition(), moab::ParCommGraph::send_mesh_parts(), moab::ParCommGraph::send_tag_values(), moab::ReadHDF5::store_file_ids(), moab::ReadHDF5::store_sets_file_ids(), string_tag_value(), moab::WriteHDF5::write_adjacencies(), moab::WriteHDF5::write_elems(), moab::WriteHDF5::write_nodes(), moab::WriteHDF5::write_set_data(), moab::WriteHDF5::write_sets(), and moab::WriteHDF5::write_var_len_data().