From 22a1fa33eb0e1bdfb65c39e5cc749d0cff0340d7 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Fri, 13 Nov 2009 21:46:15 +0000 Subject: [PATCH] tag implementation, bugfixes ... --- src/H5Block.c | 77 +++--- src/H5Fed.h | 1 + src/H5Fed_store.h | 9 +- src/Makefile.am | 12 +- src/h5_core/Makefile.am | 3 + src/h5_core/h5_attribs.c | 45 ++-- src/h5_core/h5_core.h | 10 +- src/h5_core/h5_core_private.h | 79 +------ src/h5_core/h5_errorhandling.c | 3 +- src/h5_core/h5_errorhandling_private.h | 6 - src/h5_core/h5_hdf5.c | 297 ++++++++++++++++------- src/h5_core/h5_hdf5_private.h | 226 +++++++++++------- src/h5_core/h5_hsearch.c | 113 +++++++-- src/h5_core/h5_hsearch_private.h | 51 ++-- src/h5_core/h5_maps.c | 4 +- src/h5_core/h5_openclose.c | 44 ++-- src/h5_core/h5_readwrite.c | 143 ++++++----- src/h5_core/h5_readwrite_private.h | 35 ++- src/h5_core/h5_types.h | 6 +- src/h5_core/h5_types_private.h | 1 - src/h5_core/h5t_adjacencies.c | 56 +++-- src/h5_core/h5t_adjacencies_private.h | 7 +- src/h5_core/h5t_boundaries.c | 20 +- src/h5_core/h5t_consts.c | 13 +- src/h5_core/h5t_consts_private.h | 11 +- src/h5_core/h5t_hsearch.c | 80 ++++--- src/h5_core/h5t_hsearch_private.h | 42 +++- src/h5_core/h5t_map.c | 8 +- src/h5_core/h5t_openclose.c | 313 ++++++++++++++++++------- src/h5_core/h5t_openclose.h | 70 ++---- src/h5_core/h5t_readwrite.c | 50 ++-- src/h5_core/h5t_retrieve.c | 175 ++++++++------ src/h5_core/h5t_storemesh.c | 138 +---------- src/h5_core/h5t_storemesh_private.h | 25 -- src/h5_core/h5t_types_private.h | 87 ++----- src/h5_core/h5u_readwrite.c | 60 ++--- src/h5_core/hdf5_misc.c | 2 + 37 files changed, 1299 insertions(+), 1023 deletions(-) diff --git a/src/H5Block.c b/src/H5Block.c index 31e3c7d..446f700 100644 --- a/src/H5Block.c +++ b/src/H5Block.c @@ -544,13 +544,13 @@ _release_hyperslab ( ) { struct h5b_fdata *b = f->b; - TRY( _h5_close_dataspace( f, b->shape ) ); + TRY( _hdf_close_dataspace( f, b->shape ) ); f->b->shape = -1; - TRY( _h5_close_dataspace( f, b->diskshape ) ); + TRY( _hdf_close_dataspace( f, b->diskshape ) ); f->b->diskshape = -1; - TRY( _h5_close_dataspace( f, f->b->memshape ) ); + TRY( _hdf_close_dataspace( f, f->b->memshape ) ); f->b->memshape = -1; return H5_SUCCESS; @@ -773,7 +773,7 @@ _open_block_group ( struct h5b_fdata *b = f->b; if ( (f->step_idx != b->step_idx) && (b->blockgroup > 0) ) { - TRY( _h5_close_group( f, b->blockgroup ) ); + TRY( _hdf_close_group( f, b->blockgroup ) ); f->b->blockgroup = -1; } @@ -850,7 +850,7 @@ _close_field_group ( h5_file_t *f /*!< IN: file handle */ ) { - return _h5_close_group ( f, f->b->field_group_id ); + return _hdf_close_group ( f, f->b->field_group_id ); } /*! @@ -888,10 +888,11 @@ _select_hyperslab_for_reading ( p->i_end - p->i_start + 1 }; TRY( _release_hyperslab ( f ) ); - TRY ( b->diskshape = _h5_get_dataset_space ( f, dataset ) ); - TRY ( rank = _h5_get_dims_of_space ( f, b->diskshape, NULL, NULL ) ); + TRY ( b->diskshape = _hdf_get_dataset_space ( f, dataset ) ); + TRY ( rank = _hdf_get_dims_of_dataspace ( f, b->diskshape, NULL, NULL ) ); if ( rank != 3 ) return HANDLE_H5_DATASET_RANK_ERR ( f, rank, 3 ); - TRY ( rank = _h5_get_dims_of_space ( f, b->diskshape, field_dims, NULL ) ); + TRY ( rank = _hdf_get_dims_of_dataspace ( + f, b->diskshape, field_dims, NULL ) ); if ( (field_dims[0] < (hsize_t)b->k_max) || (field_dims[1] < (hsize_t)b->j_max) || @@ -906,9 +907,11 @@ _select_hyperslab_for_reading ( (long long)field_dims[1], (long long)field_dims[0] ); - TRY ( b->diskshape = _h5_create_space ( f, rank, field_dims,field_dims ) ); - TRY ( b->memshape = _h5_create_space ( f, rank, part_dims, part_dims ) ); - TRY ( _h5_select_hyperslab_of_space ( + TRY ( b->diskshape = _hdf_create_dataspace ( + f, rank, field_dims,field_dims ) ); + TRY ( b->memshape = _hdf_create_dataspace ( + f, rank, part_dims, part_dims ) ); + TRY ( _hdf_select_hyperslab_of_dataspace ( f, b->diskshape, H5S_SELECT_SET, @@ -954,7 +957,7 @@ _read_data ( struct h5b_fdata *b = f->b; hid_t dataset_id; TRY( - dataset_id = _h5_open_dataset ( + dataset_id = _hdf_open_dataset ( f, b->field_group_id, name ) @@ -962,7 +965,7 @@ _read_data ( TRY( _select_hyperslab_for_reading ( f, dataset_id ) ); TRY( - _h5_read_dataset( + _hdf_read_dataset( f, dataset_id, type, @@ -972,7 +975,7 @@ _read_data ( data ) ); TRY( - _h5_close_dataset( f, dataset_id ) + _hdf_close_dataset( f, dataset_id ) ); return H5_SUCCESS; @@ -991,7 +994,7 @@ h5b_read_scalar_field ( TRY ( _open_field_group ( f, field_name ) ); TRY ( _read_data ( f, dataset_name, data, type ) ); - TRY ( _h5_close_group ( f, f->b->field_group_id ) ); + TRY ( _hdf_close_group ( f, f->b->field_group_id ) ); return H5_SUCCESS; } @@ -1085,7 +1088,7 @@ h5b_3d_read_3d_vectorfield ( TRY ( _read_data ( f, "0", x_data, type ) ); TRY ( _read_data ( f, "1", y_data, type ) ); TRY ( _read_data ( f, "2", z_data, type ) ); - TRY ( _h5_close_group ( f, f->b->field_group_id ) ); + TRY ( _hdf_close_group ( f, f->b->field_group_id ) ); return H5_SUCCESS; } @@ -1170,8 +1173,10 @@ _select_hyperslab_for_writing ( }; - TRY ( b->shape = _h5_create_space ( f, rank, field_dims, field_dims ) ); - TRY ( b->diskshape = _h5_create_space ( f, rank, field_dims,field_dims ) ); + TRY ( b->shape = _hdf_create_dataspace ( + f, rank, field_dims, field_dims ) ); + TRY ( b->diskshape = _hdf_create_dataspace ( + f, rank, field_dims,field_dims ) ); h5_debug ( f, @@ -1190,7 +1195,7 @@ _select_hyperslab_for_writing ( (long long)part_dims[1], (long long)part_dims[0] ); - TRY ( _h5_select_hyperslab_of_space ( + TRY ( _hdf_select_hyperslab_of_dataspace ( f, b->diskshape, H5S_SELECT_SET, @@ -1203,7 +1208,8 @@ _select_hyperslab_for_writing ( field_dims[1] = q->j_end - q->j_start + 1; field_dims[2] = q->i_end - q->i_start + 1; - TRY ( b->memshape = _h5_create_space ( f, rank, field_dims, field_dims ) ); + TRY ( b->memshape = _hdf_create_dataspace ( + f, rank, field_dims, field_dims ) ); start[0] = p->k_start - q->k_start; start[1] = p->j_start - q->j_start; @@ -1226,7 +1232,7 @@ _select_hyperslab_for_writing ( (long long)part_dims[1], (long long)part_dims[0] ); - TRY ( _h5_select_hyperslab_of_space ( + TRY ( _hdf_select_hyperslab_of_dataspace ( f, b->memshape, H5S_SELECT_SET, @@ -1316,7 +1322,7 @@ H5Block3dWriteScalarField ( f, "0", data ) ); - TRY ( _h5_close_group ( f, f->b->field_group_id ) ); + TRY ( _hdf_close_group ( f, f->b->field_group_id ) ); return H5_SUCCESS; } @@ -1352,7 +1358,7 @@ H5Block3dWrite3dVectorField ( TRY ( _write_field_data ( f, "0", x_data ) ); TRY ( _write_field_data ( f, "1", y_data ) ); TRY ( _write_field_data ( f, "2", z_data ) ); - TRY ( _h5_close_group ( f, f->b->field_group_id ) ); + TRY ( _hdf_close_group ( f, f->b->field_group_id ) ); return H5_SUCCESS; } @@ -1404,10 +1410,11 @@ _get_field_info ( hid_t dataspace_id; TRY ( _open_block_group ( f ) ); - TRY ( group_id = _h5_open_group( f, f->b->blockgroup, field_name ) ); - TRY ( dataset_id = _h5_open_dataset ( f, group_id, "0" ) ); - TRY ( dataspace_id = _h5_get_dataset_space ( f, dataset_id ) ); - TRY ( *grid_rank = _h5_get_dims_of_space ( f, dataspace_id, dims, NULL ) ); + TRY ( group_id = _hdf_open_group( f, f->b->blockgroup, field_name ) ); + TRY ( dataset_id = _hdf_open_dataset ( f, group_id, "0" ) ); + TRY ( dataspace_id = _hdf_get_dataset_space ( f, dataset_id ) ); + TRY ( *grid_rank = _hdf_get_dims_of_dataspace ( + f, dataspace_id, dims, NULL ) ); for ( i = 0, j = *grid_rank-1; i < *grid_rank; i++, j-- ) grid_dims[i] = (h5_int64_t)dims[j]; @@ -1416,9 +1423,9 @@ _get_field_info ( f->b->blockgroup, field_name, H5G_DATASET ) ); - TRY( _h5_close_dataspace( f, dataspace_id ) ); - TRY( _h5_close_dataset( f, dataset_id ) ); - TRY( _h5_close_group( f, group_id ) ); + TRY( _hdf_close_dataspace( f, dataspace_id ) ); + TRY( _hdf_close_dataset( f, dataset_id ) ); + TRY( _hdf_close_group( f, group_id ) ); return H5_SUCCESS; } @@ -1512,7 +1519,7 @@ _write_field_attrib ( attrib_type, attrib_value, attrib_nelem ) ); - TRY ( _h5_close_group ( f, f->b->field_group_id ) ); + TRY ( _hdf_close_group ( f, f->b->field_group_id ) ); return H5_SUCCESS; } @@ -1591,8 +1598,8 @@ H5BlockGetNumFieldAttribs ( CHECK_TIMEGROUP( f ); TRY ( _open_field_group ( f, field_name ) ); - TRY ( nattribs = _h5_get_num_attributes ( f, f->b->field_group_id ) ); - TRY ( _h5_close_group ( f, f->b->field_group_id ) ); + TRY ( nattribs = _hdf_get_num_attributes ( f, f->b->field_group_id ) ); + TRY ( _hdf_close_group ( f, f->b->field_group_id ) ); return nattribs; } @@ -1630,7 +1637,7 @@ H5BlockGetFieldAttribInfo ( len_of_attrib_name, attrib_type, attrib_nelem ) ); - TRY ( _h5_close_group ( f, f->b->field_group_id ) ); + TRY ( _hdf_close_group ( f, f->b->field_group_id ) ); return H5_SUCCESS; } @@ -1660,7 +1667,7 @@ _read_field_attrib ( b->field_group_id, attrib_name, attrib_value ) ); - TRY ( _h5_close_group ( f, f->b->field_group_id ) ); + TRY ( _hdf_close_group ( f, f->b->field_group_id ) ); return H5_SUCCESS; } diff --git a/src/H5Fed.h b/src/H5Fed.h index 6375dca..faefbd8 100644 --- a/src/H5Fed.h +++ b/src/H5Fed.h @@ -26,6 +26,7 @@ #include "H5Fed_map.h" #include "H5Fed_retrieve.h" #include "H5Fed_store.h" +#include "H5Fed_tags.h" /****** General routines *****************************************************/ diff --git a/src/H5Fed_store.h b/src/H5Fed_store.h index 1db6248..5a0a0ac 100644 --- a/src/H5Fed_store.h +++ b/src/H5Fed_store.h @@ -75,7 +75,7 @@ H5FedBeginRefineElements ( h5_id_t H5FedRefineElement ( h5_file_t * const f, - const h5_id_t local_eid + const h5_id_t eid ); h5_err_t @@ -83,4 +83,11 @@ H5FedEndRefineElements ( h5_file_t * const f ); +h5_err_t +H5FedMarkRefineElement ( + h5_file_t * const f, + const h5_id_t eid + ); + + #endif diff --git a/src/Makefile.am b/src/Makefile.am index 6f9028b..ac9fd4b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -49,6 +49,7 @@ include_HEADERS = \ H5Fed_boundaries.h \ H5Fed_map.h \ H5Fed_store.h \ + H5Fed_tags.h \ H5Part.h # Listing of all possible headers that I may include @@ -66,6 +67,7 @@ libH5_a_SOURCES = \ H5Fed_map.c \ H5Fed_retrieve.c \ H5Fed_store.c \ + H5Fed_tags.c \ H5Part.c SUBDIRS = h5_core bindings @@ -82,10 +84,8 @@ H5Block.o: H5Block.c H5Part.h H5Block.h clean: clean-recursive $(RM) -f *~ *.o *.a *.so -distclean: - $(RM) -f *.a +distclean: clean $(RM) -f Underscore.h - -# $(RM) -rf .deps -# $(RM) -rf .libs -# $(RM) -f Makefile + $(RM) -rf .deps + $(RM) -rf .libs + $(RM) -f Makefile diff --git a/src/h5_core/Makefile.am b/src/h5_core/Makefile.am index 46dc99d..949ca20 100644 --- a/src/h5_core/Makefile.am +++ b/src/h5_core/Makefile.am @@ -62,6 +62,8 @@ EXTRA_HEADERS = \ h5t_retrieve_private.h \ h5t_storemesh.h \ h5t_storemesh_private.h \ + h5t_tags.h \ + h5t_tags_private.h \ h5u_errorhandling_private.h \ h5u_readwrite.h \ hdf5_misc.h @@ -106,6 +108,7 @@ libH5_core_a_SOURCES = \ h5t_readwrite.c \ h5t_retrieve.c \ h5t_storemesh.c \ + h5t_tags.c \ h5u_readwrite.c \ hdf5_misc.c diff --git a/src/h5_core/h5_attribs.c b/src/h5_core/h5_attribs.c index eba7f4f..67744e4 100644 --- a/src/h5_core/h5_attribs.c +++ b/src/h5_core/h5_attribs.c @@ -38,15 +38,15 @@ h5_read_attrib ( hid_t mytype; hsize_t nelem; - TRY ( attrib_id = _h5_open_attribute ( f, id, attrib_name ) ); - TRY ( mytype = _h5_get_attribute_type ( f, attrib_id ) ); - TRY ( space_id = _h5_get_attribute_space ( f, attrib_id ) ); - TRY ( nelem = _h5_get_npoints_of_space ( f, space_id ) ); + TRY ( attrib_id = _hdf_open_attribute ( f, id, attrib_name ) ); + TRY ( mytype = _hdf_get_attribute_type ( f, attrib_id ) ); + TRY ( space_id = _hdf_get_attribute_dataspace ( f, attrib_id ) ); + TRY ( nelem = _hdf_get_npoints_of_dataspace ( f, space_id ) ); TRY ( type_id = h5_normalize_h5_type ( f, mytype ) ); - TRY ( _h5_read_attribute ( f, attrib_id, type_id, attrib_value ) ); - TRY ( _h5_close_dataspace( f, space_id ) ); - TRY ( _h5_close_type( f, mytype ) ); - TRY ( _h5_close_attribute ( f, attrib_id ) ); + TRY ( _hdf_read_attribute ( f, attrib_id, type_id, attrib_value ) ); + TRY ( _hdf_close_dataspace( f, space_id ) ); + TRY ( _hdf_close_type( f, mytype ) ); + TRY ( _hdf_close_attribute ( f, attrib_id ) ); return H5_SUCCESS; } @@ -70,8 +70,8 @@ h5_write_attrib ( hid_t space_id; hid_t attrib_id; - TRY ( space_id = _h5_create_space ( f, 1, &attrib_nelem, NULL) ); - TRY ( attrib_id = _h5_create_attribute ( + TRY ( space_id = _hdf_create_dataspace ( f, 1, &attrib_nelem, NULL) ); + TRY ( attrib_id = _hdf_create_attribute ( f, id, attrib_name, @@ -79,9 +79,9 @@ h5_write_attrib ( space_id, H5P_DEFAULT, H5P_DEFAULT ) ); - TRY ( _h5_write_attribute ( f, attrib_id, attrib_type, attrib_value ) ); - TRY ( _h5_close_attribute ( f, attrib_id ) ); - TRY ( _h5_close_dataspace ( f, space_id ) ); + TRY ( _hdf_write_attribute ( f, attrib_id, attrib_type, attrib_value ) ); + TRY ( _hdf_close_attribute ( f, attrib_id ) ); + TRY ( _hdf_close_dataspace ( f, space_id ) ); return H5_SUCCESS; } @@ -107,29 +107,30 @@ h5_get_attrib_info ( hid_t mytype; hid_t space_id; - TRY ( attrib_id = _h5_open_attribute_idx ( + TRY ( attrib_id = _hdf_open_attribute_idx ( f, id, (unsigned int)attrib_idx ) ); if ( attrib_nelem ) { - TRY ( space_id = _h5_get_attribute_space ( f, attrib_id ) ); - TRY ( *attrib_nelem = _h5_get_npoints_of_space ( f, space_id ) ); - TRY( _h5_close_dataspace( f, space_id ) ); + TRY ( space_id = _hdf_get_attribute_dataspace ( f, attrib_id ) ); + TRY ( *attrib_nelem = _hdf_get_npoints_of_dataspace ( + f, space_id ) ); + TRY( _hdf_close_dataspace( f, space_id ) ); } if ( attrib_name ) { - TRY ( _h5_get_attribute_name ( + TRY ( _hdf_get_attribute_name ( f, attrib_id, (size_t)len_attrib_name, attrib_name ) ); } if ( attrib_type ) { - TRY ( mytype = _h5_get_attribute_type ( f, attrib_id ) ); + TRY ( mytype = _hdf_get_attribute_type ( f, attrib_id ) ); TRY ( *attrib_type = h5_normalize_h5_type ( f, mytype ) ); - TRY ( _h5_close_type( f, mytype ) ); + TRY ( _hdf_close_type( f, mytype ) ); } - TRY ( _h5_close_attribute ( f, attrib_id ) ); + TRY ( _hdf_close_attribute ( f, attrib_id ) ); return H5_SUCCESS; } @@ -147,5 +148,5 @@ h5_get_num_attribs ( const hid_t id ) { CHECK_FILEHANDLE ( f ); - return _h5_get_num_attributes ( f, id ); + return _hdf_get_num_attributes ( f, id ); } diff --git a/src/h5_core/h5_core.h b/src/h5_core/h5_core.h index e76018d..075cb83 100644 --- a/src/h5_core/h5_core.h +++ b/src/h5_core/h5_core.h @@ -9,15 +9,9 @@ #include "h5_maps.h" #include "h5_openclose.h" #include "h5_readwrite.h" -#include "h5t_adjacencies.h" -#include "h5t_boundaries.h" -#include "h5t_inquiry.h" -#include "h5t_map.h" -#include "h5t_openclose.h" -#include "h5t_readwrite.h" -#include "h5t_retrieve.h" -#include "h5t_storemesh.h" #include "h5u_readwrite.h" #include "hdf5_misc.h" +#include "h5t_core.h" + #endif diff --git a/src/h5_core/h5_core_private.h b/src/h5_core/h5_core_private.h index 293443a..18e5228 100644 --- a/src/h5_core/h5_core_private.h +++ b/src/h5_core/h5_core_private.h @@ -2,9 +2,6 @@ #define __H5_CORE_PRIVATE_H #include "h5_types_private.h" -#include "h5b_types_private.h" -#include "h5t_types_private.h" -#include "h5u_types_private.h" #include "h5_errorhandling_private.h" #include "h5_fcmp_private.h" @@ -15,17 +12,12 @@ #include "h5_readwrite_private.h" #include "h5_syscall_private.h" +#include "h5b_types_private.h" +#include "h5u_types_private.h" + #include "h5b_errorhandling_private.h" -#include "h5t_adjacencies_private.h" -#include "h5t_boundaries_private.h" -#include "h5t_consts_private.h" -#include "h5t_errorhandling_private.h" -#include "h5t_hsearch_private.h" -#include "h5t_map_private.h" -#include "h5t_readwrite_private.h" -#include "h5t_retrieve_private.h" -#include "h5t_storemesh_private.h" +#include "h5t_core_private.h" #include "h5u_errorhandling_private.h" #include "h5u_types_private.h" @@ -33,64 +25,8 @@ #define H5PART_GROUPNAME_STEP "Step" #define H5B_CONTAINER_GRPNAME "Block" - -#define H5T_CONTAINER_GRPNAME "Topo" - #define H5BLOCK_GROUPNAME_BLOCK H5B_CONTAINER_GRPNAME -/* - ID's: 64bit - - Vertices: - 000100vv tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt - 3V TT TT TT TT TT TT - - Edges: - 00100eee tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt - 2E TT TT TT TT TT TT - - Trinagles: - 001100dd tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt - 1D TT TT TT TT TT TT - - Tets: - 01000000 tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt - 00 TT TT TT TT TT TT - -*/ -#define H5T_ELEM_MASK ( (h5_id_t) (ULLONG_MAX >> 8) ) -#define H5T_ELEM_TYPE_MASK ( 7ull << (sizeof(h5_id_t)*8-4) ) -#define H5T_FACE_MASK (15ull << (sizeof(h5_id_t)*7) ) - -#define H5T_ELEM_TYPE_VERTEX ((h5_id_t)1 << (sizeof(h5_id_t)*8-4)) -#define H5T_ELEM_TYPE_EDGE ((h5_id_t)2 << (sizeof(h5_id_t)*8-4)) -#define H5T_ELEM_TYPE_TRIANGLE ((h5_id_t)3 << (sizeof(h5_id_t)*8-4)) -#define H5T_ELEM_TYPE_TET ((h5_id_t)4 << (sizeof(h5_id_t)*8-4)) - - -#define _h5t_build_vertex_id( face_id, elem_id ) \ - ( H5T_ELEM_TYPE_VERTEX | \ - ((h5_id_t)(face_id) << (sizeof(h5_id_t)*7)) | \ - ((elem_id) & H5T_ELEM_MASK)) - -#define _h5t_build_edge_id( face_id, elem_id ) \ - ( H5T_ELEM_TYPE_EDGE | \ - ((h5_id_t)(face_id) << (sizeof(h5_id_t)*7)) | \ - ((elem_id) & H5T_ELEM_MASK)) - -#define _h5t_build_triangle_id( face_id, elem_id ) \ - ( H5T_ELEM_TYPE_TRIANGLE | \ - ((h5_id_t)(face_id) << (sizeof(h5_id_t)*7)) | \ - ((elem_id) & H5T_ELEM_MASK)) - -#define _h5t_get_entity_type( entity_id ) \ - ( entity_id & H5T_ELEM_TYPE_MASK ) - -#define _h5t_get_face_id( entity_id ) \ - ( (entity_id & H5T_FACE_MASK) >> (sizeof(h5_id_t)*7) ) - -#define _h5t_get_elem_id( entity_id ) \ - ( entity_id & H5T_ELEM_MASK ) #define TRY( func ) \ if ( (int64_t)(ptrdiff_t)(func) <= (int64_t)H5_ERR ) \ @@ -105,13 +41,6 @@ Don't use them in applications! */ - -h5_int64_t -h5_set_step ( - h5_file_t *f, - const h5_int64_t step - ); - h5_int64_t h5_get_num_particles ( h5_file_t *f diff --git a/src/h5_core/h5_errorhandling.c b/src/h5_core/h5_errorhandling.c index 7214082..fe7026b 100644 --- a/src/h5_core/h5_errorhandling.c +++ b/src/h5_core/h5_errorhandling.c @@ -156,8 +156,7 @@ h5_abort_errorhandler ( ) { if ( _h5_debuglevel > 0 ) { - fprintf ( stderr, "%s: ", f->__funcname ); - vfprintf ( stderr, fmt, ap ); + h5_verror ( f, fmt, ap ); } exit (-(int)f->__errno); } diff --git a/src/h5_core/h5_errorhandling_private.h b/src/h5_core/h5_errorhandling_private.h index 61c585d..97d8b64 100644 --- a/src/h5_core/h5_errorhandling_private.h +++ b/src/h5_core/h5_errorhandling_private.h @@ -15,12 +15,6 @@ "%s: Internal error: %s line %d!", \ file, func, lino ) -#define HANDLE_H5_NOENT_ERR( f, name ) \ - h5_error( \ - f, \ - H5_ERR_NOENT, \ - "Object \"%s\" doesn't exists.", name ); - #define HANDLE_H5_DATASET_RANK_ERR( f, m, n ) \ h5_error( \ f, \ diff --git a/src/h5_core/h5_hdf5.c b/src/h5_core/h5_hdf5.c index 213d51b..af18064 100644 --- a/src/h5_core/h5_hdf5.c +++ b/src/h5_core/h5_hdf5.c @@ -4,6 +4,41 @@ #include "h5_core/h5_core_private.h" /****** G r o u p ************************************************************/ + +hid_t +_hdf_open_group ( + h5_file_t * f, + const hid_t loc_id, + const char * const group_name + ) { + hid_t group_id = H5Gopen ( loc_id, group_name, H5P_DEFAULT ); + if ( group_id < 0 ) + return h5_error ( + f, + H5_ERR_HDF5, + "Cannot open group \"%s/%s\".", + h5_get_objname ( loc_id ), + group_name ); + return group_id; +} + +hid_t +_hdf_create_group ( + h5_file_t * f, + const hid_t loc_id, + const char * const group_name + ) { + hid_t group_id = H5Gcreate ( loc_id, group_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); + if ( group_id < 0 ) + return h5_error ( + f, + H5_ERR_HDF5, + "Cannot create group \"%s/%s\".", + h5_get_objname ( loc_id ), + group_name ); + return group_id; +} + /*! Open HDF5 group. If group doesn't exist create it. @@ -65,22 +100,64 @@ _h5_open_group ( \param[in] group_id id of group to close */ h5_err_t -_h5_close_group ( +_hdf_close_group ( h5_file_t * const f, const hid_t group_id ) { if ( group_id <= 0 ) return H5_SUCCESS; - const char *group_name = h5_get_objname( group_id ); if ( H5Gclose ( group_id ) < 0 ) { return h5_error ( f, H5_ERR_HDF5, "Cannot terminate access to group \"%s\".", - group_name ); + h5_get_objname( group_id ) ); } return H5_SUCCESS; } +hsize_t +_hdf_get_num_objs_in_group ( + h5_file_t * const f, + const hid_t group_id + ) { + H5G_info_t group_info; + if ( H5Gget_info( group_id, &group_info ) < 0 ) { + return h5_error ( + f, + H5_ERR_HDF5, + "Cannot get number of objects in group %s.", + h5_get_objname( group_id ) ); + } + return group_info.nlinks; +} + +h5_err_t +_hdf_get_objname_by_idx_in_group ( + h5_file_t * const f, + hid_t loc_id, + hsize_t idx, + char **name ) { + size_t size; + + size = H5Gget_objname_by_idx ( loc_id, idx, NULL, 0 ) + 1; + if ( size < 0 ) goto error; + + *name = _h5_calloc ( f, 1, size ); + if ( *name == NULL ) goto error; + + size = H5Gget_objname_by_idx ( loc_id, idx, *name, size ); + if ( size < 0 ) goto error; + + return H5_SUCCESS; + +error: + return h5_error ( + f, + H5_ERR_HDF5, + "Cannot get name of object %ld in group %s.", + (long)idx, + h5_get_objname( loc_id ) ); +} /****** D a t a s e t ********************************************************/ /*! @@ -91,7 +168,7 @@ _h5_close_group ( \param[in] dataset_name name of dataset to open */ hid_t -_h5_open_dataset ( +_hdf_open_dataset ( h5_file_t * const f, const hid_t loc_id, const char * const dataset_name @@ -111,28 +188,6 @@ _h5_open_dataset ( return dataset_id; } -/*! - Get dataspace of existing dataset - - \param[in] f file handle - \param[in] dataset_id id of dataset - - */ -hid_t -_h5_get_dataset_space ( - h5_file_t * const f, - const hid_t dataset_id - ) { - hid_t dataspace_id = H5Dget_space ( dataset_id ); - if ( dataspace_id < 0 ) - return h5_error ( - f, - H5_ERR_HDF5, - "Cannot get dataspace for dataset \"%s\".", - h5_get_objname ( dataset_id ) ); - return dataspace_id; -} - /*! Create new dataset @@ -145,7 +200,7 @@ _h5_get_dataset_space ( */ hid_t -_h5_create_dataset ( +_hdf_create_dataset ( h5_file_t * const f, hid_t loc_id, const char * dataset_name, @@ -165,13 +220,60 @@ _h5_create_dataset ( return h5_error( f, H5_ERR_HDF5, - "Cannot create dataset name \"%s\"", + "Cannot create dataset %s/%s", + h5_get_objname ( loc_id ), dataset_name ); return dataset_id; } /*! - Write dataset. + Close dataset. + + \param[in] f file handle + \param[in] dataset_id id of dataset to close +*/ +herr_t +_hdf_close_dataset ( + h5_file_t * const f, + const hid_t dset_id + ) { + if ( dset_id == 0 || dset_id == -1 ) return H5_SUCCESS; + const char *dset_name = h5_get_objname( dset_id ); + + if ( H5Dclose ( dset_id ) < 0 ) { + return h5_error( + f, + H5_ERR_HDF5, + "Close of dataset \"%s\" failed.", dset_name ); + } + return H5_SUCCESS; +} + +/*! + Get dataspace of existing dataset + + \param[in] f file handle + \param[in] dataset_id id of dataset + + */ +hid_t +_hdf_get_dataset_space ( + h5_file_t * const f, + const hid_t dataset_id + ) { + hid_t dataspace_id = H5Dget_space ( dataset_id ); + if ( dataspace_id < 0 ) + return h5_error ( + f, + H5_ERR_HDF5, + "Cannot get dataspace for dataset \"%s\".", + h5_get_objname ( dataset_id ) ); + return dataspace_id; +} + +/*! + Wrapper for H5Dwrite. + \param[in] f file handle \param[in] dataset_id id of dataset @@ -183,7 +285,7 @@ _h5_create_dataset ( */ herr_t -_h5_write_dataset ( +_hdf_write_dataset ( h5_file_t * const f, const hid_t dataset_id, const hid_t type_id, @@ -209,8 +311,11 @@ _h5_write_dataset ( return H5_SUCCESS; } +/* + Wrapper for H5Dread +*/ h5_err_t -_h5_read_dataset ( +_hdf_read_dataset ( h5_file_t * const f, const hid_t dataset_id, const hid_t type_id, @@ -230,50 +335,74 @@ _h5_read_dataset ( return h5_error( f, H5_ERR_HDF5, - "Read from dataset \"%s\".", \ + "Error reading dataset \"%s\".", \ h5_get_objname ( dataset_id ) ); return H5_SUCCESS; } hid_t -_h5_get_dataset_type ( +_hdf_get_dataset_type ( h5_file_t * const f, const hid_t dataset_id ) { hid_t datatype_id = H5Dget_type ( dataset_id ); if ( datatype_id < 0 ) - h5_error( + return h5_error( f, H5_ERR_HDF5, "Cannot determine dataset type."); - return H5_SUCCESS; + return datatype_id; } -/*! - Close dataset. - \param[in] f file handle - \param[in] dataset_id id of dataset to close -*/ herr_t -_h5_close_dataset ( +_hdf_set_dataset_extent ( h5_file_t * const f, - const hid_t dataset_id + hid_t dset_id, + const hsize_t *size ) { - if ( dataset_id == 0 || dataset_id == -1 ) return H5_SUCCESS; - const char *dataset_name = h5_get_objname( dataset_id ); + const char *dset_name = h5_get_objname( dset_id ); - if ( H5Dclose ( dataset_id ) < 0 ) { + if ( H5Dset_extent( dset_id, size ) < 0 ) { return h5_error( f, H5_ERR_HDF5, - "Close of dataset \"%s\" failed.", dataset_name ); + "Changing size of dataset \"%s\" dimensions failed.", + dset_name ); } return H5_SUCCESS; } +hssize_t +_hdf_get_npoints_of_dataset ( + h5_file_t * const f, + hid_t dset_id + ) { + hid_t dspace_id; + hsize_t size; + TRY ( dspace_id = _hdf_get_dataset_space ( f, dset_id ) ); + TRY ( size = _hdf_get_npoints_of_dataspace ( f, dspace_id ) ); + TRY ( _hdf_close_dataspace( f, dspace_id ) ); + return size; +} + +hssize_t +_hdf_get_npoints_of_dataset_by_name ( + h5_file_t * const f, + hid_t loc_id, + char * name + ) { + hid_t dset_id; + hsize_t size; + TRY ( dset_id = _hdf_open_dataset ( f, loc_id, name ) ); + TRY ( size = _hdf_get_npoints_of_dataset ( f, dset_id ) ); + TRY ( _hdf_close_dataset ( f, dset_id ) ); + return size; +} + + /****** D a t a s p a c e ****************************************************/ /*! Create dataspace for dataset. H5Screate_simple wrapper. @@ -285,7 +414,7 @@ _h5_close_dataset ( */ hid_t -_h5_create_space ( +_hdf_create_dataspace ( h5_file_t * const f, const int rank, const hsize_t * dims, @@ -302,7 +431,7 @@ _h5_create_space ( } herr_t -_h5_select_hyperslab_of_space ( +_hdf_select_hyperslab_of_dataspace ( h5_file_t * const f, hid_t space_id, H5S_seloper_t op, @@ -328,7 +457,7 @@ _h5_select_hyperslab_of_space ( } hssize_t -_h5_get_selected_npoints_of_space ( +_hdf_get_selected_npoints_of_dataspace ( h5_file_t * const f, hid_t space_id ) { @@ -342,7 +471,7 @@ _h5_get_selected_npoints_of_space ( } hssize_t -_h5_get_npoints_of_space ( +_hdf_get_npoints_of_dataspace ( h5_file_t * const f, hid_t space_id ) { @@ -356,7 +485,7 @@ _h5_get_npoints_of_space ( } int -_h5_get_dims_of_space ( +_hdf_get_dims_of_dataspace ( h5_file_t * const f, hid_t space_id, hsize_t *dims, @@ -379,7 +508,7 @@ _h5_get_dims_of_space ( \param[in] dataspace_id id of space to close */ herr_t -_h5_close_dataspace ( +_hdf_close_dataspace ( h5_file_t * const f, const hid_t dataspace_id ) { @@ -399,8 +528,8 @@ _h5_close_dataspace ( /****** D a t a t y p e ******************************************************/ -const char* -_h5_get_base_type_name ( +static const char* +_get_base_type_name ( h5_file_t * const f, hid_t base_type_id ) { @@ -412,8 +541,8 @@ _h5_get_base_type_name ( return "[unknown]"; } -const char* -_h5_get_class_type_name ( +static const char* +_get_class_type_name ( h5_file_t * const f, hid_t base_type_id ) { @@ -431,7 +560,7 @@ _h5_get_class_type_name ( \param[in] dims dimensions */ hid_t -_h5_create_array_type ( +_hdf_create_array_type ( h5_file_t * const f, hid_t base_type_id, int rank, @@ -444,14 +573,14 @@ _h5_create_array_type ( H5_ERR_HDF5, "Can't create array datatype object with base " "type %s and rank %d", - _h5_get_base_type_name ( f, base_type_id ), + _get_base_type_name ( f, base_type_id ), rank ); } return type_id; } hid_t -_h5_create_type ( +_hdf_create_type ( h5_file_t * const f, H5T_class_t class, const size_t size @@ -462,14 +591,14 @@ _h5_create_type ( f, H5_ERR_HDF5, "Can't create datatype object of class %s.", - _h5_get_class_type_name ( f, class ) + _get_class_type_name ( f, class ) ); } return type_id; } herr_t -_h5_insert_type ( +_hdf_insert_type ( h5_file_t * const f, hid_t dtype_id, const char * name, @@ -487,7 +616,7 @@ _h5_insert_type ( } herr_t -_h5_close_type ( +_hdf_close_type ( h5_file_t * const f, hid_t dtype_id ) { @@ -503,7 +632,7 @@ _h5_close_type ( /****** P r o p e r t y ******************************************************/ hid_t -_h5_create_property ( +_hdf_create_property ( h5_file_t * const f, hid_t cls_id ) { @@ -517,14 +646,13 @@ _h5_create_property ( } herr_t -_h5_set_chunk_property ( +_hdf_set_chunk_property ( h5_file_t * const f, hid_t plist, - int ndims, - const hsize_t * dim + int rank, + const hsize_t * dims ) { - herr_t herr = H5Pset_chunk ( plist, ndims, dim ); - if ( herr < 0 ) + if ( H5Pset_chunk ( plist, rank, dims ) < 0 ) return h5_error ( f, H5_ERR_HDF5, @@ -535,7 +663,7 @@ _h5_set_chunk_property ( #ifdef PARALLEL_IO h5_err_t -_h5_set_fapl_mpio_property ( +_hdf_set_fapl_mpio_property ( h5_file_t * const f, hid_t fapl_id, MPI_Comm comm, @@ -553,7 +681,7 @@ _h5_set_fapl_mpio_property ( #endif h5_err_t -_h5_close_property ( +_hdf_close_property ( h5_file_t * const f, hid_t prop ) { @@ -569,7 +697,7 @@ _h5_close_property ( /****** F i l e **************************************************************/ herr_t -_h5_close_file ( +_hdf_close_file ( h5_file_t * const f, hid_t fileid ) { @@ -585,7 +713,7 @@ _h5_close_file ( /****** E r r o r h a n d l i n g ********************************************/ herr_t -_h5_set_errorhandler ( +_hdf_set_errorhandler ( h5_file_t * const f, hid_t estack_id, H5E_auto_t func, @@ -602,7 +730,7 @@ _h5_set_errorhandler ( /****** A t t r i b u t e ****************************************************/ hid_t -_h5_open_attribute ( +_hdf_open_attribute ( h5_file_t * const f, hid_t loc_id, const char *attr_name @@ -619,7 +747,7 @@ _h5_open_attribute ( } hid_t -_h5_open_attribute_idx ( +_hdf_open_attribute_idx ( h5_file_t * const f, hid_t loc_id, unsigned int idx @@ -636,7 +764,7 @@ _h5_open_attribute_idx ( } hid_t -_h5_open_attribute_by_name ( +_hdf_open_attribute_by_name ( h5_file_t * const f, hid_t loc_id, const char *obj_name, @@ -659,7 +787,7 @@ _h5_open_attribute_by_name ( } hid_t -_h5_create_attribute ( +_hdf_create_attribute ( h5_file_t * const f, hid_t loc_id, const char *attr_name, @@ -686,7 +814,7 @@ _h5_create_attribute ( } herr_t -_h5_read_attribute ( +_hdf_read_attribute ( h5_file_t * const f, hid_t attr_id, hid_t mem_type_id, @@ -703,8 +831,11 @@ _h5_read_attribute ( return H5_SUCCESS; } +/* + Wrapper for H5Awrite. + */ herr_t -_h5_write_attribute ( +_hdf_write_attribute ( h5_file_t * const f, hid_t attr_id, hid_t mem_type_id, @@ -722,7 +853,7 @@ _h5_write_attribute ( } ssize_t -_h5_get_attribute_name ( +_hdf_get_attribute_name ( h5_file_t * const f, hid_t attr_id, size_t buf_size, @@ -738,7 +869,7 @@ _h5_get_attribute_name ( } hid_t -_h5_get_attribute_type ( +_hdf_get_attribute_type ( h5_file_t * const f, hid_t attr_id ) { @@ -753,7 +884,7 @@ _h5_get_attribute_type ( } hid_t -_h5_get_attribute_space ( +_hdf_get_attribute_dataspace ( h5_file_t * const f, hid_t attr_id ) { @@ -768,7 +899,7 @@ _h5_get_attribute_space ( } int -_h5_get_num_attributes ( +_hdf_get_num_attributes ( h5_file_t * const f, hid_t loc_id ) { @@ -784,7 +915,7 @@ _h5_get_num_attributes ( herr_t -_h5_close_attribute ( +_hdf_close_attribute ( h5_file_t * const f, hid_t attr_id ) { diff --git a/src/h5_core/h5_hdf5_private.h b/src/h5_core/h5_hdf5_private.h index 215d178..be315d7 100644 --- a/src/h5_core/h5_hdf5_private.h +++ b/src/h5_core/h5_hdf5_private.h @@ -1,86 +1,57 @@ #ifndef __H5_HDF5_H #define __H5_HDF5_H +/*** group ***/ +hid_t +_hdf_open_group ( + h5_file_t *f, + const hid_t loc_id, + const char * const group_name + ); + +hid_t +_hdf_create_group ( + h5_file_t * f, + const hid_t loc_id, + const char * const group_name + ); + hid_t _h5_open_group ( h5_file_t *f, - const hid_t parent_group_id, + const hid_t loc_id, const char * const group_name ); h5_err_t -_h5_close_group ( +_hdf_close_group ( h5_file_t * const f, const hid_t group_id ); +hsize_t +_hdf_get_num_objs_in_group ( + h5_file_t * const f, + const hid_t group_id + ); + +h5_err_t +_hdf_get_objname_by_idx_in_group ( + h5_file_t * const f, + hid_t loc_id, + hsize_t idx, + char **name ); + +/*** dataset ***/ hid_t -_h5_open_dataset ( +_hdf_open_dataset ( h5_file_t * const f, const hid_t gid, const char * const dataset_name ); hid_t -_h5_open_dataset ( - h5_file_t * const f, - const hid_t loc_id, - const char * const dataset_name - ); - -hid_t -_h5_create_space ( - h5_file_t * const f, - const int rank, - const hsize_t * dims, - const hsize_t * maxdims - ); - -hid_t -_h5_get_dataset_space ( - h5_file_t * const f, - const hid_t dataset_id - ); - -herr_t -_h5_select_hyperslab_of_space ( - h5_file_t * const f, - hid_t space_id, - H5S_seloper_t op, - const hsize_t *start, - const hsize_t *stride, - const hsize_t *count, - const hsize_t *block - ); - -hssize_t -_h5_get_selected_npoints_of_space ( - h5_file_t * const f, - hid_t space_id - ); - -hssize_t -_h5_get_npoints_of_space ( - h5_file_t * const f, - hid_t space_id - ); - -herr_t -_h5_close_dataspace ( - h5_file_t * const f, - const hid_t dataspace_id - ); - -int -_h5_get_dims_of_space ( - h5_file_t * const f, - hid_t space_id, - hsize_t *dims, - hsize_t *maxdims - ); - -hid_t -_h5_create_dataset ( +_hdf_create_dataset ( h5_file_t * const f, hid_t loc_id, const char * dataset_name, @@ -90,7 +61,14 @@ _h5_create_dataset ( ); herr_t -_h5_write_dataset ( +_hdf_close_dataset ( + h5_file_t * const f, + const hid_t dataset_id + ); + + +herr_t +_hdf_write_dataset ( h5_file_t * const f, const hid_t dataset_id, const hid_t type_id, @@ -101,7 +79,7 @@ _h5_write_dataset ( ); h5_err_t -_h5_read_dataset ( +_hdf_read_dataset ( h5_file_t * const f, const hid_t dataset_id, const hid_t type_id, @@ -111,19 +89,86 @@ _h5_read_dataset ( void * const buf ); hid_t -_h5_get_dataset_type ( +_hdf_get_dataset_type ( h5_file_t * const f, const hid_t dataset_id ); herr_t -_h5_close_dataset ( +_hdf_set_dataset_extent ( + h5_file_t * const f, + hid_t dset_id, + const hsize_t *size + ); + +hssize_t +_hdf_get_npoints_of_dataset ( + h5_file_t * const f, + hid_t dset_id + ); + +hssize_t +_hdf_get_npoints_of_dataset_by_name ( + h5_file_t * const f, + hid_t loc_id, + char * name + ); + +/*** dataspace ***/ +hid_t +_hdf_create_dataspace ( + h5_file_t * const f, + const int rank, + const hsize_t * dims, + const hsize_t * maxdims + ); + +hid_t +_hdf_get_dataset_space ( h5_file_t * const f, const hid_t dataset_id ); +herr_t +_hdf_select_hyperslab_of_dataspace ( + h5_file_t * const f, + hid_t space_id, + H5S_seloper_t op, + const hsize_t *start, + const hsize_t *stride, + const hsize_t *count, + const hsize_t *block + ); + +hssize_t +_hdf_get_selected_npoints_of_dataspace ( + h5_file_t * const f, + hid_t space_id + ); + +hssize_t +_hdf_get_npoints_of_dataspace ( + h5_file_t * const f, + hid_t space_id + ); + +herr_t +_hdf_close_dataspace ( + h5_file_t * const f, + const hid_t dataspace_id + ); + +int +_hdf_get_dims_of_dataspace ( + h5_file_t * const f, + hid_t space_id, + hsize_t *dims, + hsize_t *maxdims + ); + +/*** type ***/ hid_t -_h5_create_array_type ( +_hdf_create_array_type ( h5_file_t * const f, hid_t base_type_id, int rank, @@ -131,14 +176,14 @@ _h5_create_array_type ( ); hid_t -_h5_create_type ( +_hdf_create_type ( h5_file_t * const f, H5T_class_t _class, const size_t size ); herr_t -_h5_insert_type ( +_hdf_insert_type ( h5_file_t * const f, hid_t dtype_id, const char * name, @@ -147,19 +192,20 @@ _h5_insert_type ( ); herr_t -_h5_close_type ( +_hdf_close_type ( h5_file_t * const f, hid_t dtype_id ); +/*** property ***/ hid_t -_h5_create_property ( +_hdf_create_property ( h5_file_t * const f, hid_t cls_id ); herr_t -_h5_set_chunk_property ( +_hdf_set_chunk_property ( h5_file_t * const f, hid_t plist, int ndims, @@ -168,7 +214,7 @@ _h5_set_chunk_property ( #ifdef PARALLEL_IO h5_err_t -_h5_set_fapl_mpio_property ( +_hdf_set_fapl_mpio_property ( h5_file_t * const f, hid_t fapl_id, MPI_Comm comm, @@ -177,41 +223,44 @@ _h5_set_fapl_mpio_property ( #endif h5_err_t -_h5_close_property ( +_hdf_close_property ( h5_file_t * const f, hid_t prop ); +/*** file ***/ herr_t -_h5_close_file ( +_hdf_close_file ( h5_file_t * const f, hid_t fileid ); +/*** error handling ***/ herr_t -_h5_set_errorhandler ( +_hdf_set_errorhandler ( h5_file_t * const f, hid_t estack_id, H5E_auto_t func, void *client_data ); +/*** attributes ***/ hid_t -_h5_open_attribute ( +_hdf_open_attribute ( h5_file_t * const f, hid_t loc_id, const char *attr_name ); hid_t -_h5_open_attribute_idx ( +_hdf_open_attribute_idx ( h5_file_t * const f, hid_t loc_id, unsigned int idx ); hid_t -_h5_open_attribute_by_name ( +_hdf_open_attribute_by_name ( h5_file_t * const f, hid_t loc_id, const char *obj_name, @@ -219,7 +268,7 @@ _h5_open_attribute_by_name ( ); hid_t -_h5_open_attribute_by_idx ( +_hdf_open_attribute_by_idx ( h5_file_t * const f, hid_t loc_id, const char *obj_name, @@ -231,7 +280,7 @@ _h5_open_attribute_by_idx ( ); hid_t -_h5_create_attribute ( +_hdf_create_attribute ( h5_file_t * const f, hid_t loc_id, const char *attr_name, @@ -242,7 +291,7 @@ _h5_create_attribute ( ); herr_t -_h5_read_attribute ( +_hdf_read_attribute ( h5_file_t * const f, hid_t attr_id, hid_t mem_type_id, @@ -250,7 +299,7 @@ _h5_read_attribute ( ); herr_t -_h5_write_attribute ( +_hdf_write_attribute ( h5_file_t * const f, hid_t attr_id, hid_t mem_type_id, @@ -258,7 +307,7 @@ _h5_write_attribute ( ); ssize_t -_h5_get_attribute_name ( +_hdf_get_attribute_name ( h5_file_t * const f, hid_t attr_id, size_t buf_size, @@ -266,24 +315,25 @@ _h5_get_attribute_name ( ); hid_t -_h5_get_attribute_type ( +_hdf_get_attribute_type ( h5_file_t * const f, hid_t attr_id ); hid_t -_h5_get_attribute_space ( +_hdf_get_attribute_dataspace ( h5_file_t * const f, hid_t attr_id ); -int _h5_get_num_attributes ( +int +_hdf_get_num_attributes ( h5_file_t * const f, hid_t loc_id ); herr_t -_h5_close_attribute ( +_hdf_close_attribute ( h5_file_t * const f, hid_t attr_id ); diff --git a/src/h5_core/h5_hsearch.c b/src/h5_core/h5_hsearch.c index cbb9ebb..2228f9a 100644 --- a/src/h5_core/h5_hsearch.c +++ b/src/h5_core/h5_hsearch.c @@ -43,7 +43,7 @@ typedef struct _ENTRY { a) the code is (most probably) called a few times per program run and b) the number is small because the table must fit in the core */ static int -isprime (unsigned int number) { +isprime (const unsigned int number) { /* no even number will be passed */ unsigned int div = 3; @@ -60,12 +60,12 @@ isprime (unsigned int number) { The contents of the table is zeroed, especially the field used becomes zero. */ h5_err_t -_h5_hcreate_r ( +_h5_hcreate ( h5_file_t * const f, size_t nel, h5_hashtable_t *htab, - int (*compare)(void*, void*), - unsigned int (*compute_hash)(void*) + int (*compare)(const void*, const void*), + unsigned int (*compute_hash)(const void*) ) { /* Test for correct arguments. */ if (htab == NULL || htab->table != NULL) { @@ -94,7 +94,7 @@ _h5_hcreate_r ( or equal the current size. */ h5_err_t -_h5_hresize_r ( +_h5_hresize ( h5_file_t * const f, size_t nel, h5_hashtable_t *htab @@ -108,28 +108,28 @@ _h5_hresize_r ( nel += htab->size; h5_debug ( f, "Resize hash table from %u to %lu elements.", htab->size, nel ); - TRY ( _h5_hcreate_r ( + TRY ( _h5_hcreate ( f, nel, &__htab, htab->compare, htab->compute_hash ) ); unsigned int idx; for ( idx = 1; idx <= htab->size; idx++ ) { if ( htab->table[idx].used ) { void *ventry; - TRY ( _h5_hsearch_r ( + _h5_hsearch ( f, htab->table[idx].entry, H5_ENTER, &ventry, - &__htab ) ); + &__htab ); } } - TRY ( _h5_hdestroy_r ( f, htab ) ); + TRY ( _h5_hdestroy ( f, htab ) ); *htab = __htab; return H5_SUCCESS; } /* After using the hash table it has to be destroyed. The used memory can be freed and the local static variable can be marked as not used. */ h5_err_t -_h5_hdestroy_r ( +_h5_hdestroy ( h5_file_t * const f, struct hsearch_data *htab ) { @@ -162,10 +162,10 @@ _h5_hdestroy_r ( equality of the stored and the parameter value. This helps to prevent unnecessary expensive calls of strcmp. */ h5_err_t -_h5_hsearch_r ( +_h5_hsearch ( h5_file_t * const f, void *item, - h5_action_t action, + const h5_action_t action, void **retval, struct hsearch_data *htab ) { @@ -206,7 +206,8 @@ _h5_hsearch_r ( /* If entry is found use it. */ if (htab->table[idx].used == hval - && ((*htab->compare) (item, htab->table[idx].entry) == 0) ) { + && ((*htab->compare) ( + item, htab->table[idx].entry) == 0) ) { *retval = htab->table[idx].entry; return H5_SUCCESS; } @@ -231,21 +232,95 @@ _h5_hsearch_r ( *retval = htab->table[idx].entry; return H5_SUCCESS; } - *retval = NULL; + h5_error ( f, H5_ERR_INVAL, "Key not found in hash table." ); return H5_ERR; } -void -_h5_hwalk_r ( +h5_err_t +_h5_hwalk ( h5_file_t* f, struct hsearch_data *htab, - void (*visit)(const void *item) + h5_err_t (*visit)(h5_file_t*const f, const void *item) ) { unsigned int idx = 1; for ( idx = 1; idx < htab->size; idx++ ) { if ( htab->table[idx].used ) { - (*visit)( &htab->table[idx].entry ); + TRY ( (*visit)( f, &htab->table[idx].entry ) ); } - } + } + return H5_SUCCESS; +} + +typedef struct { + char *key; +} h5_hitem_string_keyed_t; + +static int +_hcmp_string_keyed ( + const void *__a, + const void *__b + ) { + h5_hitem_string_keyed_t *a = (h5_hitem_string_keyed_t*) __a; + h5_hitem_string_keyed_t *b = (h5_hitem_string_keyed_t*) __b; + return strcmp ( a->key, b->key ); +} + +static unsigned int +_hcompute_string_keyed ( + const void *__item + ) { + h5_hitem_string_keyed_t *item = (h5_hitem_string_keyed_t*) __item; + unsigned int len = strlen (item->key); + unsigned int hval = len; + unsigned int count = len; + while (count-- > 0) { + hval <<= 4; + hval += item->key[count]; + } + return hval; +} + +h5_err_t +_h5_hcreate_string_keyed ( + h5_file_t * const f, + size_t nel, + h5_hashtable_t *htab + ) { + return _h5_hcreate ( f, nel, htab, + _hcmp_string_keyed, _hcompute_string_keyed ); +} + +static int +_hcmp_id_keyed ( + const void *__a, + const void *__b + ) { + return memcmp ( __a, __b, sizeof(h5_id_t) ); +} + +static unsigned int +_hcompute_id_keyed ( + const void *__item + ) { + char *key = (char*)__item; + unsigned int count = sizeof ( h5_id_t ); + unsigned int hval = count; + while ( count-- > 0 ) { + if ( key[count] ) { + hval <<= 4; + hval += key[count]; + } + } + return hval; +} + +h5_err_t +_h5_hcreate_id_keyed ( + h5_file_t * const f, + size_t nel, + h5_hashtable_t *htab + ) { + return _h5_hcreate ( f, nel, htab, + _hcmp_id_keyed, _hcompute_id_keyed ); } diff --git a/src/h5_core/h5_hsearch_private.h b/src/h5_core/h5_hsearch_private.h index 2d2de40..0412b38 100644 --- a/src/h5_core/h5_hsearch_private.h +++ b/src/h5_core/h5_hsearch_private.h @@ -1,6 +1,14 @@ #ifndef __H5_HSEARCH_PRIVATE_H #define __H5_HSEARCH_PRIVATE_H +typedef struct hsearch_data { + struct _ENTRY *table; + unsigned int size; + unsigned int filled; + int (*compare)(const void*, const void*); + unsigned int (*compute_hash)(const void*); +} h5_hashtable_t; + /* Action which shall be performed in the call to hsearch. */ typedef enum { H5_FIND, @@ -14,40 +22,55 @@ typedef struct h5_entry { /* Reentrant versions which can handle multiple hashing tables at the same time. */ extern h5_err_t -_h5_hsearch_r ( +_h5_hsearch ( h5_file_t * const f, void *item, - h5_action_t action, + const h5_action_t action, void **retval, - struct hsearch_data *htab + h5_hashtable_t *htab ); extern h5_err_t -_h5_hcreate_r ( +_h5_hcreate ( h5_file_t* const f, size_t __nel, - struct hsearch_data *__htab, - int (*compare)(void*, void*), - unsigned int (*compute_hash)(void*) + h5_hashtable_t *__htab, + int (*compare)(const void*, const void*), + unsigned int (*compute_hash)(const void*) ); extern h5_err_t -_h5_hresize_r ( +_h5_hresize ( h5_file_t * const f, size_t nel, h5_hashtable_t *htab ); extern h5_err_t -_h5_hdestroy_r ( +_h5_hdestroy ( h5_file_t* f, - struct hsearch_data *__htab + h5_hashtable_t *__htab ); -extern void -_h5_hwalk_r ( +extern h5_err_t +_h5_hwalk ( h5_file_t* f, - struct hsearch_data *__htab, - void (*visit)(const void *__item) + h5_hashtable_t *__htab, + h5_err_t (*visit)(h5_file_t*const f, const void *__item) ); + +extern h5_err_t +_h5_hcreate_string_keyed ( + h5_file_t * const f, + size_t nel, + h5_hashtable_t *htab + ); + +h5_err_t +_h5_hcreate_id_keyed ( + h5_file_t * const f, + size_t nel, + h5_hashtable_t *htab + ); + #endif diff --git a/src/h5_core/h5_maps.c b/src/h5_core/h5_maps.c index e8b4838..09fcc97 100644 --- a/src/h5_core/h5_maps.c +++ b/src/h5_core/h5_maps.c @@ -82,8 +82,8 @@ _h5_cmp_ids_by_eid ( const void *_id1, const void *_id2 ) { - h5_id_t id1 = _h5t_get_elem_id ( *(h5_id_t*)_id1 ); - h5_id_t id2 = _h5t_get_elem_id ( *(h5_id_t*)_id2 ); + h5_id_t id1 = _h5t_get_elem_idx ( *(h5_id_t*)_id1 ); + h5_id_t id2 = _h5t_get_elem_idx ( *(h5_id_t*)_id2 ); if ( id1 < id2 ) return -1; if ( id1 > id2 ) return 1; diff --git a/src/h5_core/h5_openclose.c b/src/h5_core/h5_openclose.c index db93fe8..1ba87a5 100644 --- a/src/h5_core/h5_openclose.c +++ b/src/h5_core/h5_openclose.c @@ -134,7 +134,7 @@ _h5_open_file ( ) { h5_info ( f, "Opening file %s.", filename ); - TRY ( _h5_set_errorhandler ( f, H5E_DEFAULT, _h5_error_handler, NULL ) ); + TRY ( _hdf_set_errorhandler ( f, H5E_DEFAULT, _h5_error_handler, NULL ) ); TRY ( h5_set_stepname_fmt ( f, H5PART_GROUPNAME_STEP, 0 ) ); f->xfer_prop = f->create_prop = f->access_prop = H5P_DEFAULT; @@ -154,17 +154,17 @@ _h5_open_file ( /* ks: IBM_large_block_io */ MPI_Info_create(&info); MPI_Info_set(info, "IBM_largeblock_io", "true" ); - TRY ( _h5_set_fapl_mpio_property ( f, f->access_prop, comm, info ) ); + TRY ( _hdf_set_fapl_mpio_property ( f, f->access_prop, comm, info ) ); MPI_Info_free(&info); - TRY ( f->access_prop = _h5_create_property ( f, H5P_FILE_ACCESS ) ); + TRY ( f->access_prop = _hdf_create_property ( f, H5P_FILE_ACCESS ) ); - /*TRY ( f->create_prop = _h5_create_property ( f, H5P_FILE_CREATE) );*/ + /*TRY ( f->create_prop = _hdf_create_property ( f, H5P_FILE_CREATE) );*/ f->create_prop = H5P_DEFAULT; /* xfer_prop: also used for parallel I/O, during actual writes rather than the access_prop which is for file creation. */ - TRY ( f->xfer_prop = _h5_create_property ( f, H5P_DATASET_XFER ) ); + TRY ( f->xfer_prop = _hdf_create_property ( f, H5P_DATASET_XFER ) ); #ifdef COLLECTIVE_IO if (H5Pset_dxpl_mpio (f->xfer_prop,H5FD_MPIO_COLLECTIVE) < 0) { @@ -247,9 +247,11 @@ h5_open_file ( f->__funcname = funcname; if ( _h5_open_file( f, filename, flags, comm ) < 0 ) { if (f != NULL ) { - if (f->u->pnparticles != NULL) { - free (f->u->pnparticles); - } + /* Oops, cannot open file. We release the memory allocated for + f only, there is most likely more allocated memory we do + *not* release. + We don't use the wrapper function because we don't know + wheter it will work or not! */ free (f); } return NULL; @@ -275,15 +277,15 @@ _h5u_close_file ( f->__errno = H5_SUCCESS; if( u->shape > 0 ) { - TRY( _h5_close_dataspace( f, u->shape ) ); + TRY( _hdf_close_dataspace( f, u->shape ) ); u->shape = 0; } if( u->diskshape != H5S_ALL ) { - TRY( _h5_close_dataspace( f, u->diskshape ) ); + TRY( _hdf_close_dataspace( f, u->diskshape ) ); u->diskshape = 0; } if( u->memshape != H5S_ALL ) { - TRY( _h5_close_dataspace( f, u->memshape ) ); + TRY( _hdf_close_dataspace( f, u->memshape ) ); u->memshape = 0; } if( u->pnparticles ) { @@ -308,10 +310,10 @@ _h5b_close_file ( ) { struct h5b_fdata *b = f->b; - TRY ( _h5_close_group( f, b->blockgroup ) ); - TRY ( _h5_close_dataspace( f, b->shape ) ); - TRY ( _h5_close_dataspace( f, b->diskshape ) ); - TRY ( _h5_close_dataspace( f, b->memshape ) ); + TRY ( _hdf_close_group( f, b->blockgroup ) ); + TRY ( _hdf_close_dataspace( f, b->shape ) ); + TRY ( _hdf_close_dataspace( f, b->diskshape ) ); + TRY ( _hdf_close_dataspace( f, b->memshape ) ); free ( f->b ); f->b = NULL; @@ -339,12 +341,12 @@ h5_close_file ( TRY( _h5u_close_file ( f ) ); TRY( _h5b_close_file ( f ) ); TRY( _h5t_close_file ( f ) ); - TRY( _h5_close_group( f, f->step_gid ) ); - TRY( _h5_close_property ( f, f->xfer_prop ) ); - TRY( _h5_close_property ( f, f->access_prop ) ); - TRY( _h5_close_property ( f, f->create_prop ) ); - TRY( _h5_close_group ( f, f->root_gid ) ); - TRY( _h5_close_file ( f, f->file ) ); + TRY( _hdf_close_group( f, f->step_gid ) ); + TRY( _hdf_close_property ( f, f->xfer_prop ) ); + TRY( _hdf_close_property ( f, f->access_prop ) ); + TRY( _hdf_close_property ( f, f->create_prop ) ); + TRY( _hdf_close_group ( f, f->root_gid ) ); + TRY( _hdf_close_file ( f, f->file ) ); free( f ); diff --git a/src/h5_core/h5_readwrite.c b/src/h5_core/h5_readwrite.c index d029f83..47375aa 100644 --- a/src/h5_core/h5_readwrite.c +++ b/src/h5_core/h5_readwrite.c @@ -23,25 +23,25 @@ h5_write_data ( const hid_t memspace_id, const hid_t diskspace_id ) { - hid_t dataset_id; + hid_t dset_id; h5_info ( f, "Writing dataset %s/%s.", h5_get_objname(group_id), name ); - TRY ( dataset_id = _h5_create_dataset ( + TRY ( dset_id = _hdf_create_dataset ( f, group_id, name, type_id, diskspace_id, H5P_DEFAULT ) ); - TRY ( _h5_write_dataset ( + TRY ( _hdf_write_dataset ( f, - dataset_id, + dset_id, type_id, memspace_id, diskspace_id, f->xfer_prop, array ) ); - TRY ( _h5_close_dataset( f, dataset_id ) ); + TRY ( _hdf_close_dataset( f, dset_id ) ); f->empty = 0; @@ -57,77 +57,81 @@ h5_write_data ( - Close dataset */ h5_err_t -_h5_write ( +_h5_write_dataset_by_name ( h5_file_t * const f, const hid_t loc_id, - h5_dataset_info_t *ds_info, + h5_dsinfo_t *dsinfo, hid_t (*set_memspace)(h5_file_t*,hid_t), hid_t (*set_diskspace)(h5_file_t*,hid_t), const void * const data ) { h5_info ( f, "Writing dataset %s/%s.", - h5_get_objname ( loc_id ), ds_info->name ); + h5_get_objname ( loc_id ), dsinfo->name ); H5O_info_t obj_info; herr_t herr = H5Oget_info_by_name( loc_id, - ds_info->name, + dsinfo->name, &obj_info, H5P_DEFAULT ); if ( (herr >= 0) && ( (f->mode==H5_O_WRONLY) || (f->mode==H5_O_APPEND) ) ) { h5_warn ( f, "Dataset %s/%s already exist.", - h5_get_objname ( loc_id ), ds_info->name ); + h5_get_objname ( loc_id ), dsinfo->name ); return _h5_handle_file_mode_error( f, f->mode ); } /* open/create dataset */ - hid_t dataset_id; + hid_t dset_id; hid_t dataspace_id; hid_t diskspace_id; hid_t memspace_id; if ( herr >= 0 ) { - TRY( (dataset_id = _h5_open_dataset ( + /* overwrite dataset */ + TRY ( (dset_id = _hdf_open_dataset ( f, loc_id, - ds_info->name ) ) ); - TRY( (dataspace_id = _h5_get_dataset_space ( + dsinfo->name ) ) ); + TRY ( (dataspace_id = _hdf_get_dataset_space ( f, - dataset_id ) ) ); - /* - extend dataset? - */ + dset_id ) ) ); + TRY ( _hdf_set_dataset_extent ( + f, + dset_id, + dsinfo->dims ) ); + /* exten dataset? */ } else { - TRY ( dataspace_id = _h5_create_space ( + /* create dataset */ + TRY ( dataspace_id = _hdf_create_dataspace ( f, - ds_info->rank, - ds_info->dims, - ds_info->maxdims ) ); - TRY ( dataset_id = _h5_create_dataset ( + dsinfo->rank, + dsinfo->dims, + dsinfo->max_dims ) ); + TRY ( dset_id = _hdf_create_dataset ( f, loc_id, - ds_info->name, - *ds_info->type_id, + dsinfo->name, + dsinfo->type_id, dataspace_id, - ds_info->create_prop ) ); + dsinfo->create_prop ) ); } TRY ( memspace_id = (*set_memspace)( f, 0 ) ); TRY ( diskspace_id = (*set_diskspace)( f, dataspace_id ) ); - TRY ( _h5_write_dataset ( + TRY ( _hdf_write_dataset ( f, - dataset_id, - *ds_info->type_id, + dset_id, + dsinfo->type_id, memspace_id, diskspace_id, f->xfer_prop, data ) ); - TRY ( _h5_close_dataspace ( f, diskspace_id ) ); - TRY ( _h5_close_dataspace ( f, memspace_id ) ); - TRY ( _h5_close_dataset( f, dataset_id ) ); + TRY ( _hdf_close_dataspace ( f, diskspace_id ) ); + TRY ( _hdf_close_dataspace ( f, memspace_id ) ); + TRY ( _hdf_close_dataset( f, dset_id ) ); f->empty = 0; @@ -135,40 +139,57 @@ _h5_write ( } h5_err_t -_h5_read ( +_h5_read_dataset ( h5_file_t * const f, - hid_t loc_id, - h5_dataset_info_t *ds_info, - hid_t (*set_memspace)(h5_file_t*,hid_t), - hid_t (*set_diskspace)(h5_file_t*,hid_t), + hid_t dset_id, + h5_dsinfo_t *dsinfo, + hid_t (*set_mspace)(h5_file_t*,hid_t), + hid_t (*set_dspace)(h5_file_t*,hid_t), void * const data ) { - hid_t dataset_id; - hid_t memspace_id; - hid_t diskspace_id; + hid_t mspace_id; + hid_t dspace_id; - TRY ( (dataset_id = _h5_open_dataset ( - f, - loc_id, - ds_info->name ) ) ); - TRY ( (memspace_id = (*set_memspace)( f, dataset_id ) ) ); - TRY ( (diskspace_id = (*set_diskspace)( f, dataset_id ) ) ); - TRY ( _h5_read_dataset ( + TRY ( (mspace_id = (*set_mspace)( f, dset_id ) ) ); + TRY ( (dspace_id = (*set_dspace)( f, dset_id ) ) ); + TRY ( _hdf_read_dataset ( f, - dataset_id, - *ds_info->type_id, - memspace_id, - diskspace_id, + dset_id, + dsinfo->type_id, + mspace_id, + dspace_id, f->xfer_prop, data ) ); - TRY ( _h5_close_dataspace ( f, diskspace_id ) ); - TRY ( _h5_close_dataspace ( f, memspace_id ) ); - TRY ( _h5_close_dataset ( f, dataset_id ) ); + TRY ( _hdf_close_dataspace ( f, dspace_id ) ); + TRY ( _hdf_close_dataspace ( f, mspace_id ) ); return H5_SUCCESS; } +h5_err_t +_h5_read_dataset_by_name ( + h5_file_t * const f, + hid_t loc_id, + h5_dsinfo_t *dsinfo, + hid_t (*set_mspace)(h5_file_t*,hid_t), + hid_t (*set_dspace)(h5_file_t*,hid_t), + void * const data + ) { + + hid_t dset_id; + TRY ( (dset_id = _hdf_open_dataset ( + f, + loc_id, + dsinfo->name ) ) ); + TRY ( _h5_read_dataset ( f, dset_id, dsinfo, set_mspace, set_dspace, + data ) ); + TRY ( _hdf_close_dataset ( f, dset_id ) ); + + return H5_SUCCESS; +} + + static h5_err_t _init_step ( h5_file_t * f @@ -185,7 +206,7 @@ _h5_close_step ( if ( f->step_gid < 0 ) return H5_SUCCESS; TRY ( _h5t_close_step ( f ) ); - TRY ( _h5_close_group ( f, f->step_gid ) ); + TRY ( _hdf_close_group ( f, f->step_gid ) ); f->step_gid = -1; @@ -262,16 +283,16 @@ h5_int64_t h5_get_dataset_type( h5_file_t * const f, hid_t group_id, - const char *dataset_name + const char *dset_name ) { - hid_t dataset_id; + hid_t dset_id; hid_t hdf5_type; - TRY( dataset_id = _h5_open_dataset ( f, group_id, dataset_name ) ); - TRY ( hdf5_type = _h5_get_dataset_type ( f, dataset_id ) ); + TRY( dset_id = _hdf_open_dataset ( f, group_id, dset_name ) ); + TRY ( hdf5_type = _hdf_get_dataset_type ( f, dset_id ) ); h5_int64_t type = (h5_int64_t) h5_normalize_h5_type ( f, hdf5_type ); - TRY( _h5_close_type( f, hdf5_type ) ); - TRY( _h5_close_dataset( f, dataset_id ) ); + TRY( _hdf_close_type( f, hdf5_type ) ); + TRY( _hdf_close_dataset( f, dset_id ) ); return type; } diff --git a/src/h5_core/h5_readwrite_private.h b/src/h5_core/h5_readwrite_private.h index 6044051..d626070 100644 --- a/src/h5_core/h5_readwrite_private.h +++ b/src/h5_core/h5_readwrite_private.h @@ -1,23 +1,48 @@ #ifndef __H5_READWRITE_PRIVATE_H #define __H5_READWRITE_PRIVATE_H +/* + information about HDF5 dataset +*/ +typedef struct h5_dataset_info { + char name[256]; + int rank; + hsize_t dims[4]; + hsize_t max_dims[4]; + hsize_t chunk_dims[4]; + hid_t type_id; + hid_t create_prop; + hid_t access_prop; +} h5_dsinfo_t; + h5_err_t -_h5_write ( +_h5_write_dataset_by_name ( h5_file_t * const f, hid_t loc_id, - struct h5_dataset_info *ds_info, + h5_dsinfo_t *ds_info, hid_t (*set_memspace)(h5_file_t*,hid_t), hid_t (*set_diskspace)(h5_file_t*,hid_t), const void * const data ); h5_err_t -_h5_read ( +_h5_read_dataset ( h5_file_t * const f, - hid_t loc_id, - h5_dataset_info_t *ds_info, + hid_t dset_id, + h5_dsinfo_t *ds_info, hid_t (*set_memspace)(h5_file_t*,hid_t), hid_t (*set_diskspace)(h5_file_t*,hid_t), void * const data ); + +h5_err_t +_h5_read_dataset_by_name ( + h5_file_t * const f, + hid_t loc_id, + h5_dsinfo_t *ds_info, + hid_t (*set_memspace)(h5_file_t*,hid_t), + hid_t (*set_diskspace)(h5_file_t*,hid_t), + void * const data + ); + #endif diff --git a/src/h5_core/h5_types.h b/src/h5_core/h5_types.h index 5b1dad2..c4166b9 100644 --- a/src/h5_core/h5_types.h +++ b/src/h5_core/h5_types.h @@ -59,12 +59,12 @@ typedef h5_err_t (*h5_errorhandler_t)( typedef unsigned long MPI_Comm; #endif -struct h5_idlist { +typedef struct h5_idlist { h5_size_t size; /* allocated space in number of items */ h5_size_t num_items; /* stored items */ h5_id_t *items; -}; -typedef struct h5_idlist h5_idlist_t; +} h5_idlist_t; + struct h5_idmap; typedef struct h5_idmap h5_idmap_t; diff --git a/src/h5_core/h5_types_private.h b/src/h5_core/h5_types_private.h index 2a99b7c..80f209d 100644 --- a/src/h5_core/h5_types_private.h +++ b/src/h5_core/h5_types_private.h @@ -1,7 +1,6 @@ #ifndef __H5_TYPES_PRIVATE_H #define __H5_TYPES_PRIVATE_H - struct h5_idmap_el { h5_id_t global_id; h5_id_t local_id; diff --git a/src/h5_core/h5t_adjacencies.c b/src/h5_core/h5t_adjacencies.c index bb2c29e..ed2d11c 100644 --- a/src/h5_core/h5t_adjacencies.c +++ b/src/h5_core/h5t_adjacencies.c @@ -54,7 +54,7 @@ _compute_tets_of_edges ( h5_id_t eid = (t->cur_level <= 0 ) ? 0 : t->num_elems[t->cur_level-1]; h5_elem_ldta_t *tet = tet = &t->elems_ldta[eid]; h5_id_t num_elems = t->num_elems[t->num_levels-1]; - h5_te_entry_t *retval = NULL; + h5t_te_entry_t *retval = NULL; TRY ( _h5t_resize_te_htab ( f, 4*(num_elems-eid) ) ); for ( ; eid < num_elems; eid++, tet++ ) { h5_id_t face; @@ -73,7 +73,7 @@ _compute_tets_of_triangles ( h5_id_t eid = (t->cur_level <= 0 ) ? 0 : t->num_elems[t->cur_level-1]; h5_elem_ldta_t *tet = tet = &t->elems_ldta[eid]; h5_id_t num_elems = t->num_elems[t->num_levels-1]; - h5_td_entry_t *retval = NULL; + h5t_td_entry_t *retval = NULL; TRY ( _h5t_resize_td_htab ( f, 4*(num_elems-eid) ) ); for ( ; eid < num_elems; eid++, tet++ ) { h5_id_t face; @@ -114,18 +114,18 @@ _compute_children_of_edge ( h5_idlist_t *children ) { h5t_fdata_t *t = f->t; - h5_te_entry_t *te; + h5t_te_entry_t *te; TRY ( _h5t_find_te2 ( f, _h5t_get_face_id ( kid ), - _h5t_get_elem_id ( kid ), + _h5t_get_elem_idx ( kid ), &te ) ); h5_id_t *edge = te->value.items; h5_id_t *end = te->value.items+te->value.num_items; for ( ; edge < end; edge++ ) { - h5_id_t eid = _h5t_get_elem_id ( *edge ); + h5_id_t eid = _h5t_get_elem_idx ( *edge ); h5_id_t face_id = _h5t_get_face_id ( *edge ); h5_elem_ldta_t *tet = &t->elems_ldta[eid]; if ( _h5t_elem_is_on_cur_level ( f, tet ) == H5_OK ) { @@ -158,19 +158,19 @@ _compute_sections_of_edge ( h5_idlist_t *children ) { h5t_fdata_t *t = f->t; - h5_te_entry_t *te; + h5t_te_entry_t *te; TRY ( _h5t_find_te2 ( f, _h5t_get_face_id ( kid ), - _h5t_get_elem_id ( kid ), + _h5t_get_elem_idx ( kid ), &te ) ); h5_id_t *edge = te->value.items; h5_id_t *end = te->value.items+te->value.num_items; int refined = 0; for ( ; edge < end; edge++ ) { - h5_id_t eid = _h5t_get_elem_id ( *edge ); + h5_id_t eid = _h5t_get_elem_idx ( *edge ); h5_id_t face_id = _h5t_get_face_id ( *edge ); h5_elem_ldta_t *tet = &t->elems_ldta[eid]; if ( ! _h5t_elem_is_on_cur_level ( f, tet ) == H5_OK ) { @@ -220,18 +220,18 @@ _compute_children_of_triangle ( ) { h5t_fdata_t *t = f->t; - h5_td_entry_t *td; + h5t_td_entry_t *td; TRY ( _h5t_find_td2 ( f, _h5t_get_face_id ( did ), - _h5t_get_elem_id ( did ), + _h5t_get_elem_idx ( did ), &td ) ); h5_id_t *tri = td->value.items; h5_id_t *end = td->value.items+td->value.num_items; for ( ; tri < end; tri++ ) { - h5_id_t eid = _h5t_get_elem_id ( *tri ); + h5_id_t eid = _h5t_get_elem_idx ( *tri ); h5_id_t face_id = _h5t_get_face_id ( *tri ); h5_elem_ldta_t *tet = &t->elems_ldta[eid]; if ( _h5t_elem_is_on_cur_level ( f, tet ) == H5_OK ) { @@ -265,17 +265,17 @@ _compute_sections_of_triangle ( h5_idlist_t *children ) { h5t_fdata_t *t = f->t; - h5_td_entry_t *td; + h5t_td_entry_t *td; TRY ( _h5t_find_td2 ( f, _h5t_get_face_id ( did ), - _h5t_get_elem_id ( did ), &td ) ); + _h5t_get_elem_idx ( did ), &td ) ); h5_id_t *tri = td->value.items; h5_id_t *end = td->value.items+td->value.num_items; int refined = 0; for ( ; tri < end; tri++ ) { - h5_id_t eid = _h5t_get_elem_id ( *tri ); + h5_id_t eid = _h5t_get_elem_idx ( *tri ); h5_id_t face_id = _h5t_get_face_id ( *tri ); h5_elem_ldta_t *tet = &t->elems_ldta[eid]; if ( ! _h5t_elem_is_on_cur_level ( f, tet ) == H5_OK ) { @@ -313,7 +313,7 @@ _add_edge ( h5_id_t face_id, h5_id_t eid ) { - h5_te_entry_t *te; + h5t_te_entry_t *te; TRY ( _h5t_find_te2 ( f, face_id, eid, &te ) ); TRY ( _h5_search_idlist ( f, list, te->value.items[0] ) ); return H5_SUCCESS; @@ -334,7 +334,7 @@ h5t_get_edges_upadjacent_to_vertex ( h5_id_t *vidp = tv->items; for ( i = 0; i < tv->num_items; i++, vidp++ ) { - h5_id_t eid = _h5t_get_elem_id ( *vidp ); + h5_id_t eid = _h5t_get_elem_idx ( *vidp ); h5_id_t face = _h5t_get_face_id ( *vidp ); h5_elem_ldta_t *tet = &t->elems_ldta[eid]; @@ -356,7 +356,7 @@ _add_triangle ( h5_id_t face, h5_id_t eid ) { - h5_td_entry_t *td; + h5t_td_entry_t *td; TRY ( _h5t_find_td2 ( f, face, eid, &td ) ); TRY ( _h5_search_idlist ( f, list, td->value.items[0] ) ); @@ -376,7 +376,7 @@ h5t_get_triangles_upadjacent_to_vertex ( h5_size_t i; h5_id_t *vidp = tv->items; for ( i = 0; i < tv->num_items; i++, vidp++ ) { - h5_id_t eid = _h5t_get_elem_id ( *vidp ); + h5_id_t eid = _h5t_get_elem_idx ( *vidp ); h5_id_t face = _h5t_get_face_id ( *vidp ); h5_elem_ldta_t *tet = &t->elems_ldta[eid]; @@ -404,7 +404,7 @@ h5t_get_tets_upadjacent_to_vertex ( h5_size_t i; h5_id_t *vidp = tv->items; for ( i = 0; i < tv->num_items; i++, vidp++ ) { - h5_id_t eid = _h5t_get_elem_id ( *vidp ); + h5_id_t eid = _h5t_get_elem_idx ( *vidp ); h5_elem_ldta_t *tet = &t->elems_ldta[eid]; if ( _h5t_elem_is_on_cur_level ( f, tet ) == H5_NOK ) { @@ -429,7 +429,7 @@ h5t_get_triangles_upadjacent_to_edge ( h5_id_t *end = children->items+children->num_items; int map[6][2] = { {2,3}, {0,3}, {1,3}, {1,2}, {0,2}, {0,1} }; for ( ; edge < end; edge++ ) { - h5_id_t eid = _h5t_get_elem_id ( *edge ); + h5_id_t eid = _h5t_get_elem_idx ( *edge ); h5_id_t face_id = _h5t_get_face_id ( *edge ); TRY ( _add_triangle ( f, *list, map[face_id][0], eid ) ); TRY ( _add_triangle ( f, *list, map[face_id][1], eid ) ); @@ -452,7 +452,7 @@ h5t_get_tets_upadjacent_to_edge ( int i; h5_id_t *kidp = children->items; for ( i = 0; i < children->num_items; i++, kidp++ ) { - h5_id_t eid = _h5t_get_elem_id ( *kidp ); + h5_id_t eid = _h5t_get_elem_idx ( *kidp ); TRY ( _h5_search_idlist ( f, *list, eid ) ); } TRY ( _h5_free_idlist( f, &children ) ); @@ -472,7 +472,7 @@ h5t_get_tets_upadjacent_to_triangle ( int i; h5_id_t *didp = children->items; for ( i = 0; i < children->num_items; i++ , didp++) { - h5_id_t eid = _h5t_get_elem_id ( *didp ); + h5_id_t eid = _h5t_get_elem_idx ( *didp ); TRY ( _h5_search_idlist ( f, *list, eid ) ); } TRY ( _h5_free_idlist( f, &children ) ); @@ -516,7 +516,7 @@ h5t_get_vertices_downadjacent_to_triangle ( int map[4][3] = { {1,4,5}, {2,3,5}, {0,3,4}, {0,1,2} }; h5_id_t face = _h5t_get_face_id ( did ); - h5_id_t eid = _h5t_get_elem_id ( did ); + h5_id_t eid = _h5t_get_elem_idx ( did ); h5_id_t i; for ( i = 0; i < 3; i++ ) { @@ -579,7 +579,7 @@ h5t_get_edges_downadjacent_to_triangle ( int map[4][3] = { {1,4,5}, {2,3,5}, {0,3,4}, {0,1,2} }; h5_id_t face_id = _h5t_get_face_id ( did ); - h5_id_t eid = _h5t_get_elem_id ( did ); + h5_id_t eid = _h5t_get_elem_idx ( did ); h5_id_t i; for ( i = 0; i < 3; i++ ) { @@ -655,3 +655,11 @@ h5t_release_list_of_adjacencies ( TRY ( _h5_free_idlist ( f, list ) ); return H5_SUCCESS; } + +h5_err_t +_h5t_release_adjacencies ( + h5_file_t * const f + ) { + /* TO BE WRITTEN @@@ */ + return H5_SUCCESS; +} diff --git a/src/h5_core/h5t_adjacencies_private.h b/src/h5_core/h5t_adjacencies_private.h index 5e95684..067535d 100644 --- a/src/h5_core/h5t_adjacencies_private.h +++ b/src/h5_core/h5t_adjacencies_private.h @@ -1,9 +1,6 @@ #ifndef __H5T_ADJACENCIES_PRIVATE_H #define __H5T_ADJACENCIES_PRIVATE_H -h5_err_t -_h5t_rebuild_adj_data ( - h5_file_t * const f - ); - +h5_err_t _h5t_rebuild_adj_data ( h5_file_t * const f ); +h5_err_t _h5t_release_adjacencies ( h5_file_t * const f ); #endif diff --git a/src/h5_core/h5t_boundaries.c b/src/h5_core/h5t_boundaries.c index c281ba8..6244b1c 100644 --- a/src/h5_core/h5t_boundaries.c +++ b/src/h5_core/h5t_boundaries.c @@ -120,14 +120,14 @@ _h5t_read_boundaryfaces ( const char * const dataset_name = "Faces"; hid_t dataset_id; h5_size_t num_faces; - TRY ( dataset_id = _h5_open_dataset ( f, boundary->gid, dataset_name ) ); - TRY ( diskspace_id = _h5_get_dataset_space ( f, dataset_id ) ); - TRY ( num_faces = _h5_get_npoints_of_space ( f, diskspace_id ) ); - TRY ( _h5_close_dataspace( f, diskspace_id ) ); - TRY ( _h5_close_dataset( f, dataset_id ) ); + TRY ( dataset_id = _hdf_open_dataset ( f, boundary->gid, dataset_name ) ); + TRY ( diskspace_id = _hdf_get_dataset_space ( f, dataset_id ) ); + TRY ( num_faces = _hdf_get_npoints_of_dataspace ( f, diskspace_id ) ); + TRY ( _hdf_close_dataspace( f, diskspace_id ) ); + TRY ( _hdf_close_dataset( f, dataset_id ) ); TRY ( h5t_add_num_boundaryfaces ( f, num_faces ) ); - TRY ( _h5_read_dataset ( + TRY ( _hdf_read_dataset ( f, dataset_id, H5T_NATIVE_INT32, @@ -135,7 +135,7 @@ _h5t_read_boundaryfaces ( H5S_ALL, f->xfer_prop, boundary->faces ) ); - TRY ( _h5_close_dataset( f, dataset_id ) ); + TRY ( _hdf_close_dataset( f, dataset_id ) ); return H5_SUCCESS; } @@ -155,7 +155,7 @@ _h5t_write_boundary ( struct h5t_fdata *t = f->t; boundary_t *boundary = &t->boundary; - return _h5_write ( + return _h5_write_dataset_by_name ( f, boundary->gid, &boundary->dsinfo, @@ -183,7 +183,7 @@ h5t_close_boundary ( bzero ( boundary, sizeof(*boundary) ); - TRY( _h5_close_group( f, boundary->gid ) ); + TRY( _hdf_close_group( f, boundary->gid ) ); boundary->id = -1; boundary->gid = -1; @@ -263,7 +263,7 @@ h5t_store_boundaryface_local_id ( switch ( t->mesh_type ) { case H5_OID_TETRAHEDRON: { - h5_id_t local_tet_id = _h5t_get_elem_id ( local_fid ); + h5_id_t local_tet_id = _h5t_get_elem_idx ( local_fid ); if ( t->elems.tets[local_tet_id].global_parent_eid != -1 ) { return _h5t_error_store_boundaryface_local_id ( f, diff --git a/src/h5_core/h5t_consts.c b/src/h5_core/h5t_consts.c index b4d704d..0294f31 100644 --- a/src/h5_core/h5t_consts.c +++ b/src/h5_core/h5t_consts.c @@ -1,8 +1,9 @@ -#include "h5_types.h" -#include "h5_types_private.h" +#include "h5_core.h" +#include "h5_core_private.h" #include "h5t_types_private.h" -const char * _h5t_oid_names[] = { +const char * +_h5t_oid_names[] = { "N.N.", "vertex", "edge", @@ -10,7 +11,8 @@ const char * _h5t_oid_names[] = { "tetrahedron" }; -const char * _h5t_meshes_grpnames[] = { +const char * +_h5t_meshes_grpnames[] = { "N.N.", "N.N.", "N.N.", @@ -18,7 +20,8 @@ const char * _h5t_meshes_grpnames[] = { "TetMeshes" }; -const size_t _h5t_sizeof_elem[] = { +const size_t +_h5t_sizeof_elem[] = { 0, 0, 0, diff --git a/src/h5_core/h5t_consts_private.h b/src/h5_core/h5t_consts_private.h index 394adf0..3dde026 100644 --- a/src/h5_core/h5t_consts_private.h +++ b/src/h5_core/h5t_consts_private.h @@ -1,13 +1,10 @@ #ifndef __H5T_CONSTS_PRIVATE_H #define __H5T_CONSTS_PRIVATE_H -extern char * _h5t_oid_names[]; -extern char * _h5t_meshes_grpnames[]; -extern size_t _h5t_sizeof_elem[]; +extern const char * _h5t_oid_names[]; +extern const char * _h5t_meshes_grpnames[]; +extern const size_t _h5t_sizeof_elem[]; -const char * -_h5t_map_oid2str ( - h5_id_t oid - ); +const char *_h5t_map_oid2str ( h5_oid_t oid ); #endif diff --git a/src/h5_core/h5t_hsearch.c b/src/h5_core/h5t_hsearch.c index e9e91ce..804e122 100644 --- a/src/h5_core/h5t_hsearch.c +++ b/src/h5_core/h5t_hsearch.c @@ -5,17 +5,17 @@ static int _cmp_te_entries ( - void *__a, - void *__b + const void *__a, + const void *__b ) { return memcmp ( __a, __b, sizeof(h5_2id_t) ); } static unsigned int _compute_te_hashval ( - void *__item + const void *__item ) { - h5_te_entry_t *item = (h5_te_entry_t*)__item; + h5t_te_entry_t *item = (h5t_te_entry_t*)__item; char *key = (char *)item->key.vids; unsigned int count = 2 * sizeof ( item->key.vids[0] ); unsigned int hval = count; @@ -34,7 +34,7 @@ _h5t_create_te_htab ( size_t nel ) { h5t_adjacencies_t *a = &f->t->adjacencies; - return _h5_hcreate_r ( + return _h5_hcreate ( f, nel, &a->te_hash, @@ -51,7 +51,7 @@ _h5t_resize_te_htab ( if ( a->te_hash.size == 0 ) { TRY ( _h5t_create_te_htab ( f, nel ) ); } else if ( a->te_hash.size < nel ) { - TRY ( _h5_hresize_r ( f, nel, &a->te_hash ) ); + TRY ( _h5_hresize ( f, nel, &a->te_hash ) ); } return H5_SUCCESS; } @@ -61,7 +61,7 @@ _h5t_search_te2 ( h5_file_t * const f, h5_id_t face, h5_id_t eid, - h5_te_entry_t **entry + h5t_te_entry_t **entry ) { h5t_fdata_t *t = f->t; h5t_adjacencies_t *a = &t->adjacencies; @@ -79,18 +79,18 @@ _h5t_search_te2 ( */ if ( (a->te_hash.size*6) <= (a->te_hash.filled<<3) ) { h5_id_t num_elems = t->num_elems[t->num_levels-1]; - TRY ( _h5_hresize_r ( + TRY ( _h5_hresize ( f, 3*(num_elems - eid), &a->te_hash ) ); } - TRY ( _h5_hsearch_r ( + TRY ( _h5_hsearch ( f, *entry, H5_ENTER, &__retval, &a->te_hash ) ); - h5_te_entry_t *retval = (h5_te_entry_t *)__retval; + h5t_te_entry_t *retval = (h5t_te_entry_t *)__retval; TRY ( _h5_search_idlist ( f, &retval->value, @@ -110,17 +110,17 @@ _h5t_search_te2 ( h5_err_t _h5t_find_te ( h5_file_t * const f, - h5_te_entry_t *item, - h5_te_entry_t **retval + h5t_te_entry_t *item, + h5t_te_entry_t **retval ) { void *__ret; - TRY ( _h5_hsearch_r ( + TRY ( _h5_hsearch ( f, item, H5_FIND, &__ret, &f->t->adjacencies.te_hash ) ); - *retval = (h5_te_entry_t *)__ret; + *retval = (h5t_te_entry_t *)__ret; return H5_SUCCESS; } @@ -134,9 +134,9 @@ _h5t_find_te2 ( h5_file_t * const f, h5_id_t face_id, h5_id_t local_eid, - h5_te_entry_t **retval + h5t_te_entry_t **retval ) { - h5_te_entry_t item; + h5t_te_entry_t item; TRY ( h5t_get_local_vids_of_edge2 ( f, face_id, @@ -148,17 +148,17 @@ _h5t_find_te2 ( static int _cmp_td_entries ( - void *__a, - void *__b + const void *__a, + const void *__b ) { return memcmp ( __a, __b, sizeof(h5_3id_t) ); } static unsigned int _compute_td_hashval ( - void *__item + const void *__item ) { - h5_te_entry_t *item = (h5_te_entry_t*)__item; + h5t_te_entry_t *item = (h5t_te_entry_t*)__item; char *key = (char *)item->key.vids; unsigned int count = sizeof ( h5_3id_t ); unsigned int hval = count; @@ -177,7 +177,7 @@ _h5t_create_td_htab ( size_t nel ) { h5t_adjacencies_t *a = &f->t->adjacencies; - return _h5_hcreate_r ( + return _h5_hcreate ( f, nel, &a->td_hash, @@ -194,7 +194,7 @@ _h5t_resize_td_htab ( if ( a->td_hash.size == 0 ) { TRY ( _h5t_create_td_htab ( f, nel ) ); } else if ( a->td_hash.size < nel ) { - TRY ( _h5_hresize_r ( f, nel, &a->td_hash ) ); + TRY ( _h5_hresize ( f, nel, &a->td_hash ) ); } return H5_SUCCESS; } @@ -204,7 +204,7 @@ _h5t_search_td2 ( h5_file_t * const f, h5_id_t face, h5_id_t eid, - h5_td_entry_t **entry + h5t_td_entry_t **entry ) { h5t_fdata_t *t = f->t; h5t_adjacencies_t *a = &f->t->adjacencies; @@ -222,19 +222,19 @@ _h5t_search_td2 ( */ if ( (a->td_hash.size*6) <= (a->td_hash.filled<<3) ) { h5_id_t num_elems = t->num_elems[t->num_levels-1]; - TRY ( _h5_hresize_r ( + TRY ( _h5_hresize ( f, 3*(num_elems-eid), &a->td_hash ) ); } - TRY ( _h5_hsearch_r ( + TRY ( _h5_hsearch ( f, *entry, H5_ENTER, &__retval, &a->td_hash ) ); - h5_td_entry_t *retval = (h5_td_entry_t *)__retval; + h5t_td_entry_t *retval = (h5t_td_entry_t *)__retval; TRY ( _h5_search_idlist ( f, &retval->value, @@ -248,11 +248,11 @@ _h5t_search_td2 ( h5_err_t _h5t_find_td ( h5_file_t * const f, - h5_td_entry_t *item, - h5_td_entry_t **retval + h5t_td_entry_t *item, + h5t_td_entry_t **retval ) { void *__ret; - _h5_hsearch_r ( + _h5_hsearch ( f, item, H5_FIND, @@ -261,7 +261,7 @@ _h5t_find_td ( if ( __ret == NULL ) { return _h5t_error_local_triangle_nexist( f, item->key.vids ); } - *retval = (h5_td_entry_t *)__ret; + *retval = (h5t_td_entry_t *)__ret; return H5_SUCCESS; } @@ -270,9 +270,9 @@ _h5t_find_td2 ( h5_file_t * const f, h5_id_t face_id, h5_id_t local_eid, - h5_td_entry_t **retval + h5t_td_entry_t **retval ) { - h5_td_entry_t item; + h5t_td_entry_t item; TRY ( h5t_get_local_vids_of_triangle2 ( f, face_id, @@ -280,3 +280,19 @@ _h5t_find_td2 ( item.key.vids ) ); return _h5t_find_td ( f, &item, retval ); } + +h5_err_t +_h5t_find_tv2 ( + h5_file_t * const f, + h5_id_t cid, + h5_id_t el_idx, + h5_idlist_t **retval + ) { + /* + map (cid,el_idx) to local index of vertex + */ + h5_id_t vidx = f->t->elems_ldta[el_idx].local_vids[cid]; + *retval = &f->t->vertices_data[vidx].tv; + + return H5_SUCCESS; +} diff --git a/src/h5_core/h5t_hsearch_private.h b/src/h5_core/h5t_hsearch_private.h index ef292f4..f86be8f 100644 --- a/src/h5_core/h5t_hsearch_private.h +++ b/src/h5_core/h5t_hsearch_private.h @@ -1,6 +1,25 @@ #ifndef __H5T_HSEARCH_PRIVATE_H #define __H5T_HSEARCH_PRIVATE_H +typedef struct h5t_te_entry_key { + h5_id_t vids[2]; +} h5t_te_entry_key_t; + +typedef struct h5_te_entry { + h5t_te_entry_key_t key; + h5_idlist_t value; +} h5t_te_entry_t; + +typedef struct h5t_td_entry_key { + h5_3id_t vids; +} h5t_td_entry_key_t; + +typedef struct h5_td_entry { + h5t_td_entry_key_t key; + h5_idlist_t value; +} h5t_td_entry_t; + + h5_err_t _h5t_create_te_htab ( h5_file_t * const f, @@ -18,14 +37,14 @@ _h5t_search_te2 ( h5_file_t * const f, h5_id_t face_id, h5_id_t local_eid, - h5_te_entry_t **entry + h5t_te_entry_t **entry ); h5_err_t _h5t_find_te ( h5_file_t * const f, - h5_te_entry_t *item, - h5_te_entry_t **retval + h5t_te_entry_t *item, + h5t_te_entry_t **retval ); h5_err_t @@ -33,7 +52,7 @@ _h5t_find_te2 ( h5_file_t * const f, h5_id_t face_id, h5_id_t local_eid, - h5_te_entry_t **retval + h5t_te_entry_t **retval ); @@ -54,14 +73,14 @@ _h5t_search_td2 ( h5_file_t * const f, h5_id_t face_id, h5_id_t local_eid, - h5_td_entry_t **entry + h5t_td_entry_t **entry ); h5_err_t _h5t_find_td ( h5_file_t * const f, - h5_td_entry_t *item, - h5_td_entry_t **retval + h5t_td_entry_t *item, + h5t_td_entry_t **retval ); h5_err_t @@ -69,7 +88,14 @@ _h5t_find_td2 ( h5_file_t * const f, h5_id_t face_id, h5_id_t local_eid, - h5_td_entry_t **rentry + h5t_td_entry_t **rentry ); +h5_err_t +_h5t_find_tv2 ( + h5_file_t * const f, + h5_id_t cid, + h5_id_t el_idx, + h5_idlist_t **retval + ); #endif diff --git a/src/h5_core/h5t_map.c b/src/h5_core/h5t_map.c index a65ee75..fb7c6a1 100644 --- a/src/h5_core/h5t_map.c +++ b/src/h5_core/h5t_map.c @@ -421,7 +421,7 @@ h5t_map_global_triangle_id2local ( struct h5t_fdata *t = f->t; switch ( t->mesh_type ) { case H5_OID_TETRAHEDRON: { - h5_id_t global_tet_id = _h5t_get_elem_id ( global_tri_id ); + h5_id_t global_tet_id = _h5t_get_elem_idx ( global_tri_id ); h5_id_t local_tet_id = h5t_map_global_eid2local ( f, global_tet_id ); if ( local_tet_id < 0 ) @@ -449,7 +449,7 @@ h5t_map_local_triangle_id2global ( struct h5t_fdata *t = f->t; switch ( t->mesh_type ) { case H5_OID_TETRAHEDRON: { - h5_id_t local_tet_id = _h5t_get_elem_id ( local_tri_id ); + h5_id_t local_tet_id = _h5t_get_elem_idx ( local_tri_id ); h5_id_t global_tet_id = h5t_map_local_eid2global ( f, local_tet_id ); if ( global_tet_id < 0 ) @@ -522,7 +522,7 @@ h5t_get_local_vids_of_edge ( h5_id_t *edge ) { h5_id_t face_id = _h5t_get_face_id ( id ); - h5_id_t el_id = _h5t_get_elem_id ( id ); + h5_id_t el_id = _h5t_get_elem_idx ( id ); return h5t_get_local_vids_of_edge2 ( f, face_id, el_id, edge ); } @@ -547,7 +547,7 @@ h5t_get_local_vids_of_triangle ( h5_id_t *vids ) { h5_id_t face = _h5t_get_face_id ( id ); - h5_id_t el_id = _h5t_get_elem_id ( id ); + h5_id_t el_id = _h5t_get_elem_idx ( id ); return h5t_get_local_vids_of_triangle2 ( f, face, el_id, vids ); } diff --git a/src/h5_core/h5t_openclose.c b/src/h5_core/h5t_openclose.c index 6e3a7e8..142c0a0 100644 --- a/src/h5_core/h5t_openclose.c +++ b/src/h5_core/h5t_openclose.c @@ -34,14 +34,14 @@ _create_array_types ( hsize_t dims[1] = { 3 }; TRY( - dtypes->h5_coord3d_t = _h5_create_array_type ( + dtypes->h5_coord3d_t = _hdf_create_array_type ( f, H5_FLOAT64_T, 1, dims ) ); TRY( - dtypes->h5_3id_t = _h5_create_array_type ( + dtypes->h5_3id_t = _hdf_create_array_type ( f, H5_ID_T, 1, @@ -49,7 +49,7 @@ _create_array_types ( ); dims[0] = 4; TRY( - dtypes->h5_4id_t = _h5_create_array_type ( + dtypes->h5_4id_t = _hdf_create_array_type ( f, H5_ID_T, 1, @@ -66,19 +66,19 @@ _create_vertex_type ( h5_dtypes_t *dtypes = &f->t->dtypes; TRY( - dtypes->h5_vertex_t = _h5_create_type ( + dtypes->h5_vertex_t = _hdf_create_type ( f, H5_COMPOUND_T, sizeof(struct h5_vertex) ) ); TRY( - _h5_insert_type ( + _hdf_insert_type ( f, dtypes->h5_vertex_t, "global_vid", HOFFSET(struct h5_vertex, global_vid), H5_ID_T ) ); TRY( - _h5_insert_type ( + _hdf_insert_type ( f, dtypes->h5_vertex_t, "P", @@ -95,33 +95,33 @@ _create_triangle_type ( h5_dtypes_t *dtypes = &f->t->dtypes; TRY( - dtypes->h5_triangle_t = _h5_create_type ( + dtypes->h5_triangle_t = _hdf_create_type ( f, H5_COMPOUND_T, sizeof(struct h5_triangle) ) ); TRY( - _h5_insert_type ( + _hdf_insert_type ( f, dtypes->h5_triangle_t, "global_eid", HOFFSET(struct h5_triangle, global_eid), H5_ID_T ) ); TRY( - _h5_insert_type ( + _hdf_insert_type ( f, dtypes->h5_triangle_t, "global_parent_eid", HOFFSET(struct h5_triangle, global_parent_eid), H5_ID_T ) ); TRY( - _h5_insert_type ( + _hdf_insert_type ( f, dtypes->h5_triangle_t, "global_child_eid", HOFFSET(struct h5_triangle, global_child_eid), H5_ID_T ) ); TRY( - _h5_insert_type ( + _hdf_insert_type ( f, dtypes->h5_triangle_t, "global_vids", @@ -131,6 +131,35 @@ _create_triangle_type ( return H5_SUCCESS; } +static h5_err_t +_create_tag_types ( + h5_file_t * f + ) { + h5_dtypes_t *dtypes = &f->t->dtypes; + + TRY ( + dtypes->h5t_tag_idx_t = _hdf_create_type ( + f, + H5_COMPOUND_T, + sizeof(h5t_tag_idx_t) ) ); + TRY ( + _hdf_insert_type ( + f, + dtypes->h5t_tag_idx_t, + "eid", + HOFFSET(h5t_tag_idx_t, eid), + H5_ID_T ) ); + TRY ( + _hdf_insert_type ( + f, + dtypes->h5t_tag_idx_t, + "idx", + HOFFSET(h5t_tag_idx_t, idx), + H5_ID_T ) ); + + return H5_SUCCESS; +} + static h5_err_t _create_tet_type ( h5_file_t * f @@ -138,33 +167,33 @@ _create_tet_type ( h5_dtypes_t *dtypes = &f->t->dtypes; TRY( - dtypes->h5_tet_t = _h5_create_type ( + dtypes->h5_tet_t = _hdf_create_type ( f, H5_COMPOUND_T, sizeof(struct h5_tetrahedron) ) ); TRY( - _h5_insert_type ( + _hdf_insert_type ( f, dtypes->h5_tet_t, "global_eid", HOFFSET(struct h5_tetrahedron, global_eid), H5_ID_T ) ); TRY( - _h5_insert_type ( + _hdf_insert_type ( f, dtypes->h5_tet_t, "global_parent_eid", HOFFSET(struct h5_tetrahedron, global_parent_eid), H5_ID_T ) ); TRY( - _h5_insert_type ( + _hdf_insert_type ( f, dtypes->h5_tet_t, "global_child_eid", HOFFSET(struct h5_tetrahedron, global_child_eid), H5T_NATIVE_INT32 ) ); TRY( - _h5_insert_type ( + _hdf_insert_type ( f, dtypes->h5_tet_t, "global_vids", @@ -174,16 +203,17 @@ _create_tet_type ( return H5_SUCCESS; } + #if 0 h5_err_t _h5_set_dataset_properties ( - h5_dataset_info_t *dsinfo, + h5_dsinfo_t *dsinfo, const char *name, const hid_t type, const int rank, const hsize_t *dims, const hsize_t *maxdims, - const hsize_t chunk_size + const hsize_t chunk_dims ) { return H5_SUCCESS; @@ -213,85 +243,84 @@ _init_fdata ( strcpy( t->dsinfo_vertices.name, "Vertices" ); t->dsinfo_vertices.rank = 1; t->dsinfo_vertices.dims[0] = 0; - t->dsinfo_vertices.maxdims[0] = H5S_UNLIMITED; - t->dsinfo_vertices.chunk_size[0] = 4096; - t->dsinfo_vertices.type_id = &t->dtypes.h5_vertex_t; - TRY( t->dsinfo_vertices.create_prop = _h5_create_property ( + t->dsinfo_vertices.max_dims[0] = H5S_UNLIMITED; + t->dsinfo_vertices.chunk_dims[0] = 4096; + t->dsinfo_vertices.type_id = t->dtypes.h5_vertex_t; + TRY( t->dsinfo_vertices.create_prop = _hdf_create_property ( f, H5P_DATASET_CREATE ) ); - TRY( _h5_set_chunk_property ( + TRY( _hdf_set_chunk_property ( f, t->dsinfo_vertices.create_prop, t->dsinfo_vertices.rank, - t->dsinfo_vertices.chunk_size ) ); + t->dsinfo_vertices.chunk_dims ) ); t->dsinfo_vertices.access_prop = H5P_DEFAULT; /* NumVertices */ strcpy( t->dsinfo_num_vertices.name, "NumVertices" ); t->dsinfo_num_vertices.rank = 1; t->dsinfo_num_vertices.dims[0] = 0; - t->dsinfo_num_vertices.maxdims[0] = H5S_UNLIMITED; - t->dsinfo_num_vertices.chunk_size[0] = 4096; - t->dsinfo_num_vertices.type_id = &t->dtypes.h5_id_t; - TRY( t->dsinfo_num_vertices.create_prop = _h5_create_property ( + t->dsinfo_num_vertices.max_dims[0] = H5S_UNLIMITED; + t->dsinfo_num_vertices.chunk_dims[0] = 4096; + t->dsinfo_num_vertices.type_id = t->dtypes.h5_id_t; + TRY( t->dsinfo_num_vertices.create_prop = _hdf_create_property ( f, H5P_DATASET_CREATE ) ); - TRY( _h5_set_chunk_property ( + TRY( _hdf_set_chunk_property ( f, t->dsinfo_num_vertices.create_prop, t->dsinfo_num_vertices.rank, - t->dsinfo_num_vertices.chunk_size ) ); + t->dsinfo_num_vertices.chunk_dims ) ); t->dsinfo_num_vertices.access_prop = H5P_DEFAULT; /* Elems */ strcpy( t->dsinfo_elems.name, "Elems" ); t->dsinfo_elems.rank = 1; t->dsinfo_elems.dims[0] = 0; - t->dsinfo_elems.maxdims[0] = H5S_UNLIMITED; - t->dsinfo_elems.chunk_size[0] = 4096; - t->dsinfo_elems.type_id = &t->elem_tid; - TRY( t->dsinfo_elems.create_prop = _h5_create_property ( + t->dsinfo_elems.max_dims[0] = H5S_UNLIMITED; + t->dsinfo_elems.chunk_dims[0] = 4096; + TRY( t->dsinfo_elems.create_prop = _hdf_create_property ( f, H5P_DATASET_CREATE ) ); - TRY( _h5_set_chunk_property ( + TRY( _hdf_set_chunk_property ( f, t->dsinfo_elems.create_prop, t->dsinfo_elems.rank, - t->dsinfo_elems.chunk_size ) ); + t->dsinfo_elems.chunk_dims ) ); t->dsinfo_elems.access_prop = H5P_DEFAULT; /* NumElems */ strcpy( t->dsinfo_num_elems.name, "NumElems" ); t->dsinfo_num_elems.rank = 1; t->dsinfo_num_elems.dims[0] = 0; - t->dsinfo_num_elems.maxdims[0] = H5S_UNLIMITED; - t->dsinfo_num_elems.chunk_size[0] = 4096; - t->dsinfo_num_elems.type_id = &t->dtypes.h5_id_t; - TRY( t->dsinfo_num_elems.create_prop = _h5_create_property ( + t->dsinfo_num_elems.max_dims[0] = H5S_UNLIMITED; + t->dsinfo_num_elems.chunk_dims[0] = 4096; + t->dsinfo_num_elems.type_id = t->dtypes.h5_id_t; + TRY( t->dsinfo_num_elems.create_prop = _hdf_create_property ( f, H5P_DATASET_CREATE ) ); - TRY( _h5_set_chunk_property ( + TRY( _hdf_set_chunk_property ( f, t->dsinfo_num_elems.create_prop, t->dsinfo_num_elems.rank, - t->dsinfo_num_elems.chunk_size ) ); + t->dsinfo_num_elems.chunk_dims ) ); t->dsinfo_num_elems.access_prop = H5P_DEFAULT; /* NumElemsOnLevel */ strcpy( t->dsinfo_num_elems_on_level.name, "NumElemsOnLevel" ); t->dsinfo_num_elems_on_level.rank = 1; t->dsinfo_num_elems_on_level.dims[0] = 0; - t->dsinfo_num_elems_on_level.maxdims[0] = H5S_UNLIMITED; - t->dsinfo_num_elems_on_level.chunk_size[0] = 4096; - t->dsinfo_num_elems_on_level.type_id = &t->dtypes.h5_id_t; - TRY( t->dsinfo_num_elems_on_level.create_prop = _h5_create_property ( + t->dsinfo_num_elems_on_level.max_dims[0] = H5S_UNLIMITED; + t->dsinfo_num_elems_on_level.chunk_dims[0] = 4096; + t->dsinfo_num_elems_on_level.type_id = t->dtypes.h5_id_t; + TRY( t->dsinfo_num_elems_on_level.create_prop = _hdf_create_property ( f, H5P_DATASET_CREATE ) ); - TRY( _h5_set_chunk_property ( + TRY( _hdf_set_chunk_property ( f, t->dsinfo_num_elems_on_level.create_prop, t->dsinfo_num_elems_on_level.rank, - t->dsinfo_num_elems_on_level.chunk_size ) ); + t->dsinfo_num_elems_on_level.chunk_dims ) ); t->dsinfo_num_elems_on_level.access_prop = H5P_DEFAULT; return H5_SUCCESS; @@ -316,12 +345,14 @@ _h5t_open_file ( h5t_fdata_t *t = f->t; t->dtypes.h5_id_t = H5_INT64_T; + t->dtypes.h5_int64_t = H5_INT64_T; t->dtypes.h5_float64_t = H5_FLOAT64_T; TRY( _create_array_types ( f ) ); TRY( _create_vertex_type ( f ) ); TRY( _create_triangle_type ( f ) ); TRY( _create_tet_type ( f ) ); + TRY( _create_tag_types ( f ) ); TRY( _init_fdata ( f ) ); return H5_SUCCESS; @@ -341,12 +372,9 @@ h5_err_t _h5t_close_file ( h5_file_t *f /*!< IN: file handle */ ) { + TRY ( _h5t_close_mesh ( f ) ); - h5_err_t h5err = H5_SUCCESS; - - h5err = _h5t_close_mesh ( f ); - - return h5err; + return H5_SUCCESS; } h5_err_t @@ -442,11 +470,11 @@ h5t_open_mesh ( switch( type ) { case H5_OID_TETRAHEDRON: - t->elem_tid = t->dtypes.h5_tet_t; + t->dsinfo_elems.type_id = t->dtypes.h5_tet_t; t->methods = tet_funcs; break; case H5_OID_TRIANGLE: - t->elem_tid = t->dtypes.h5_triangle_t; + t->dsinfo_elems.type_id = t->dtypes.h5_triangle_t; t->methods = tri_funcs; break; default: @@ -469,12 +497,31 @@ h5t_open_mesh ( return H5_SUCCESS; } + static h5_err_t -_close_hdf5_objs ( +_release_elems ( h5_file_t * const f ) { + h5t_fdata_t *t = f->t; + TRY ( _h5_free ( f, t->elems.data ) ); + TRY( _h5_free ( f, t->num_elems ) ); + TRY ( _h5_free ( f, t->elems_ldta ) ); + TRY ( _h5_free ( f, t->num_elems_on_level ) ); + TRY ( _h5_free ( f, t->map_elem_g2l.items ) ); + + return H5_SUCCESS; +} + +static h5_err_t +_release_vertices ( + h5_file_t * const f + ) { + h5t_fdata_t *t = f->t; + TRY ( _h5_free ( f, t->vertices ) ); + TRY ( _h5_free ( f, t->vertices_data ) ); + TRY ( _h5_free ( f, t->num_vertices ) ); + TRY ( _h5_free ( f, t->map_vertex_g2l.items ) ); - return H5_SUCCESS; } @@ -482,37 +529,20 @@ static h5_err_t _release_memory ( h5_file_t * const f ) { - struct h5t_fdata *t = f->t; - - _h5_free ( f, t->vertices ); - t->vertices = NULL; - _h5_free ( f, t->vertices_data ); - t->vertices_data = NULL; - _h5_free ( f, t->num_vertices ); - t->num_vertices = NULL; - _h5_free ( f, t->map_vertex_g2l.items ); - - _h5_free ( f, t->elems.data ); - t->elems.data = NULL; - _h5_free ( f, t->num_elems ); - _h5_free ( f, t->elems_ldta ); - t->elems_ldta = NULL; - _h5_free ( f, t->num_elems_on_level ); - t->num_elems_on_level = NULL; - _h5_free ( f, t->map_elem_g2l.items ); - t->map_elem_g2l.items = NULL; + TRY ( _h5t_release_tags ( f ) ); + TRY ( _h5t_release_adjacencies ( f ) ); + TRY ( _release_elems ( f ) ); + TRY ( _release_vertices ( f ) ); return H5_SUCCESS; } h5_err_t _h5t_close_mesh ( - h5_file_t * const f /*!< file handle */ + h5_file_t * const f ) { TRY( _h5t_write_mesh ( f ) ); - TRY( _close_hdf5_objs ( f ) ); TRY( _release_memory ( f ) ); - TRY( h5t_close_boundary ( f ) ); TRY( _init_fdata ( f ) ); return H5_SUCCESS; @@ -533,9 +563,132 @@ h5t_open_level ( } herr_t -_h5_set_chunk_property ( +_hdf_set_chunk_property ( h5_file_t * const f, hid_t plist, int ndims, const hsize_t * dim ); + + +h5_err_t +_h5t_alloc_num_vertices ( + h5_file_t * const f, + const h5_size_t num_vertices + ) { + h5t_fdata_t *t = f->t; + + ssize_t size = num_vertices * sizeof ( t->vertices[0] ); + TRY ( t->vertices = _h5_alloc ( f, t->vertices, size ) ); + size = num_vertices * sizeof ( t->vertices_data[0] ); + TRY ( t->vertices_data = _h5_alloc ( f, t->vertices_data, size ) ); + TRY( _h5_alloc_idmap ( f, &t->map_vertex_g2l, num_vertices ) ); + TRY( _h5_alloc_idlist_items ( f, &t->sorted_lvertices, num_vertices ) ); + + return H5_SUCCESS; +} + +h5_err_t +_h5t_alloc_tris ( + h5_file_t * const f, + const size_t cur, + const size_t new + ) { + h5t_fdata_t *t = f->t; + const size_t nvertices = 3; + + /* alloc mem for elements */ + TRY ( t->elems.tris = _h5_alloc ( + f, + t->elems.tris, + new * sizeof(t->elems.tris[0]) ) ); + memset ( + t->elems.tris + cur, + -1, + (new-cur) * sizeof(t->elems.tris[0]) ); + + /* alloc mem for local data of elements */ + TRY ( t->elems_ldta = _h5_alloc ( + f, + t->elems_ldta, + new * sizeof (t->elems_ldta[0]) ) ); + memset ( + t->elems_ldta + cur, + -1, + (new-cur) * sizeof (t->elems_ldta[0]) ); + + /* alloc mem for local vertex IDs of elements */ + TRY ( t->elems_lvids = _h5_alloc ( + f, + t->elems_lvids, + new * sizeof(t->elems_lvids[0]) * nvertices ) ); + memset ( + t->elems_lvids + cur * sizeof(t->elems_lvids[0]) * nvertices, + -1, + (new-cur) * sizeof(t->elems_lvids[0]) * nvertices ); + + /* re-init pointer to local vertex id in local data structure */ + h5_id_t *p = t->elems_lvids; + h5_id_t id; + for ( id = 0; id < new; id++, p+=nvertices ) { + t->elems_ldta[id].local_vids = p; + } + + /* alloc mem for global to local ID mapping */ + TRY ( _h5_alloc_idmap ( f, &t->map_elem_g2l, new ) ); + + return H5_SUCCESS; +} + +h5_err_t +_h5t_alloc_tets ( + h5_file_t * const f, + const size_t cur, + const size_t new + ) { + h5t_fdata_t *t = f->t; + const size_t nvertices = 4; + + /* alloc mem for elements */ + TRY ( t->elems.tets = _h5_alloc ( + f, + t->elems.tets, + new * sizeof(t->elems.tets[0]) ) ); + memset ( + t->elems.tets + cur, + -1, + (new-cur) * sizeof(t->elems.tets[0]) ); + + /* alloc mem for local data of elements */ + TRY ( t->elems_ldta = _h5_alloc ( + f, + t->elems_ldta, + new * sizeof (t->elems_ldta[0]) ) ); + memset ( + t->elems_ldta + cur, + -1, + (new-cur) * sizeof (t->elems_ldta[0]) ); + + /* alloc mem for local vertex IDs of elements */ + TRY ( t->elems_lvids = _h5_alloc ( + f, + t->elems_lvids, + new * sizeof(t->elems_lvids[0]) * nvertices ) ); + memset ( + t->elems_lvids + cur * nvertices, + -1, + (new-cur) * sizeof(t->elems_lvids[0]) * nvertices ); + + /* re-init pointer to local vertex id in local data structure */ + h5_id_t *p = t->elems_lvids; + h5_id_t id; + for ( id = 0; id < new; id++, p+=nvertices ) { + t->elems_ldta[id].local_vids = p; + } + + /* alloc mem for global to local ID mapping */ + TRY ( _h5_alloc_idmap ( f, &t->map_elem_g2l, new ) ); + + return H5_SUCCESS; +} + diff --git a/src/h5_core/h5t_openclose.h b/src/h5_core/h5t_openclose.h index 29fe69d..f9aaf8c 100644 --- a/src/h5_core/h5t_openclose.h +++ b/src/h5_core/h5t_openclose.h @@ -1,61 +1,27 @@ #ifndef __H5T_OPENCLOSE_H #define __H5T_OPENCLOSE_H -h5_err_t -_h5t_open_file ( - h5_file_t * const f - ); -h5_err_t -_h5t_close_file ( - h5_file_t * const f - ); +h5_err_t h5t_open_mesh ( h5_file_t * const f, const h5_id_t id, + const h5_oid_t type ); +h5_err_t h5t_open_level ( h5_file_t * const f, const h5_id_t id ); -h5_err_t -_h5t_init_fdata ( - h5_file_t * const f - ); +h5_err_t _h5t_open_file ( h5_file_t * const f ); +h5_err_t _h5t_close_file ( h5_file_t * const f ); +h5_err_t _h5t_open_topo_group ( h5_file_t * const f ); +h5_err_t _h5t_open_meshes_group ( h5_file_t * const f ); +h5_err_t _h5t_open_mesh_group ( h5_file_t * const f ); +h5_err_t _h5t_close_mesh ( h5_file_t * const f ); +h5_err_t _h5t_close_step ( h5_file_t * const f ); -h5_err_t -h5t_open_mesh ( - h5_file_t * const f, - const h5_id_t id, - const h5_oid_t type - ); +h5_err_t _h5t_init_fdata ( h5_file_t * const f ); +h5_err_t _h5t_init_step ( h5_file_t * const f ); -h5_err_t -_h5t_open_topo_group ( - h5_file_t * const f - ); +h5_err_t _h5t_alloc_num_vertices ( h5_file_t * const f, + const h5_size_t num_vertices ); +h5_err_t _h5t_alloc_tris ( h5_file_t * const f, const size_t cur, + const size_t new_size ); +h5_err_t _h5t_alloc_tets ( h5_file_t * const f, const size_t cur, + const size_t new_size ); -h5_err_t -_h5t_open_meshes_group ( - h5_file_t * const f - ); - -h5_err_t -_h5t_open_mesh_group ( - h5_file_t * const f - ); - -h5_err_t -_h5t_close_mesh ( - h5_file_t * const f - ); - -h5_err_t -h5t_open_level ( - h5_file_t * const f, - const h5_id_t id - ); - -h5_err_t -_h5t_init_step ( - h5_file_t * const f - ); - -h5_err_t -_h5t_close_step ( - h5_file_t * const f - ); #endif diff --git a/src/h5_core/h5t_readwrite.c b/src/h5_core/h5t_readwrite.c index c8f3767..65032aa 100644 --- a/src/h5_core/h5t_readwrite.c +++ b/src/h5_core/h5t_readwrite.c @@ -18,7 +18,6 @@ _open_space_all ( } /* - Write vertices: * either we write a new dataset * or we append data to this dataset @@ -38,14 +37,14 @@ _write_vertices ( TRY( _h5t_open_mesh_group ( f ) ); } t->dsinfo_vertices.dims[0] = t->num_vertices[t->cur_level]; - TRY( _h5_write ( + TRY( _h5_write_dataset_by_name ( f, t->mesh_gid, &t->dsinfo_vertices, _open_space_all, _open_space_all, t->vertices ) ); - TRY( _h5_write ( + TRY( _h5_write_dataset_by_name ( f, t->mesh_gid, &t->dsinfo_num_vertices, @@ -68,7 +67,7 @@ _write_elems ( TRY( _h5t_open_mesh_group ( f ) ); } - TRY ( _h5_write ( + TRY ( _h5_write_dataset_by_name ( f, t->mesh_gid, &t->dsinfo_elems, @@ -76,7 +75,7 @@ _write_elems ( _open_space_all, t->elems.data ) ); - TRY ( _h5_write ( + TRY ( _h5_write_dataset_by_name ( f, t->mesh_gid, &t->dsinfo_num_elems, @@ -84,7 +83,7 @@ _write_elems ( _open_space_all, t->num_elems ) ); - TRY ( _h5_write ( + TRY ( _h5_write_dataset_by_name ( f, t->mesh_gid, &t->dsinfo_num_elems_on_level, @@ -100,10 +99,13 @@ _h5t_write_mesh ( h5_file_t * f ) { h5t_fdata_t *t = f->t; - if ( ! t->mesh_changed ) return 0; - - TRY( _write_vertices( f ) ); - TRY( _write_elems( f ) ); + if ( t->mesh_changed ) { + TRY( _write_vertices( f ) ); + TRY( _write_elems( f ) ); + } + if ( t->mtags.changed ) { + TRY ( _h5t_write_mtags ( f ) ); + } return H5_SUCCESS; } @@ -120,10 +122,10 @@ _read_num_levels ( if ( t->cur_mesh < 0 ) { return _h5t_error_undef_mesh ( f ); } - TRY ( dataset_id = _h5_open_dataset ( f, t->mesh_gid, "NumVertices" ) ); - TRY ( diskspace_id = _h5_get_dataset_space ( f, dataset_id ) ); - TRY ( size = _h5_get_npoints_of_space ( f, diskspace_id ) ); - TRY ( _h5_close_dataspace( f, diskspace_id ) ); + TRY ( dataset_id = _hdf_open_dataset ( f, t->mesh_gid, "NumVertices" ) ); + TRY ( diskspace_id = _hdf_get_dataset_space ( f, dataset_id ) ); + TRY ( size = _hdf_get_npoints_of_dataspace ( f, diskspace_id ) ); + TRY ( _hdf_close_dataspace( f, diskspace_id ) ); t->num_levels = size; return size; @@ -157,7 +159,7 @@ _read_num_vertices ( } ssize_t num_bytes = t->num_levels*sizeof ( t->num_vertices[0] ); TRY ( t->num_vertices = _h5_alloc ( f, t->num_vertices, num_bytes ) ); - TRY ( _h5_read ( + TRY ( _h5_read_dataset_by_name ( f, t->mesh_gid, &t->dsinfo_num_vertices, @@ -176,7 +178,7 @@ _read_vertices ( TRY( _h5t_alloc_num_vertices ( f, t->num_vertices[t->num_levels-1] ) ); - TRY( _h5_read ( + TRY( _h5_read_dataset_by_name ( f, t->mesh_gid, &t->dsinfo_vertices, @@ -203,7 +205,7 @@ _read_num_elems ( size_t size = t->num_levels * sizeof ( t->num_elems[0] ); TRY( t->num_elems = _h5_alloc ( f, NULL, size ) ); TRY( t->num_elems_on_level = _h5_alloc ( f, NULL, size ) ); - TRY( _h5_read ( + TRY( _h5_read_dataset_by_name ( f, t->mesh_gid, &t->dsinfo_num_elems, @@ -211,7 +213,7 @@ _read_num_elems ( _open_space_all, t->num_elems ) ); - TRY( _h5_read ( + TRY( _h5_read_dataset_by_name ( f, t->mesh_gid, &t->dsinfo_num_elems_on_level, @@ -295,7 +297,7 @@ _read_elems ( h5t_fdata_t *t = f->t; TRY( (*t->methods._alloc_elems)( f, 0, t->num_elems[t->num_levels-1] ) ); - TRY( _h5_read ( + TRY( _h5_read_dataset_by_name ( f, t->mesh_gid, &t->dsinfo_elems, @@ -311,6 +313,15 @@ _read_elems ( return H5_SUCCESS; } +static h5_err_t +_read_mtags ( + h5_file_t *const f + ) { + h5t_fdata_t *t = f->t; + TRY ( t->mtags.group_id = _h5_open_group ( f, t->mesh_gid, "Tags" ) ); + return _h5t_read_tag_container ( f, &f->t->mtags ); +} + h5_err_t _h5t_read_mesh ( h5_file_t *f @@ -323,6 +334,7 @@ _h5t_read_mesh ( TRY ( _read_num_elems ( f ) ); TRY ( _read_vertices ( f ) ); TRY ( _read_elems ( f ) ); + TRY ( _read_mtags ( f ) ); return H5_SUCCESS; } diff --git a/src/h5_core/h5t_retrieve.c b/src/h5_core/h5t_retrieve.c index 93194b2..6c2da22 100644 --- a/src/h5_core/h5t_retrieve.c +++ b/src/h5_core/h5t_retrieve.c @@ -9,44 +9,26 @@ #include "h5_core/h5_core.h" #include "h5_core/h5_core_private.h" -h5_err_t -h5t_begin_traverse_vertices ( - h5_file_t * f +/* + Skip elements which have been refined on a level <= the current one. +*/ +static h5_id_t +_skip_to_next_elem_on_level ( + h5_file_t * f, + h5_id_t *eid ) { h5t_fdata_t *t = f->t; - h5t_vertex_iterator_t *iter = &t->iters.vertex; + h5_elem_ldta_t *el_dta; - iter->cur_vid = -1; - return H5_SUCCESS; -} - -h5_id_t -h5t_traverse_vertices ( - h5_file_t * const f, /*!< file handle */ - h5_float64_t P[3] /*!< OUT: coordinates */ - ) { - h5t_fdata_t *t = f->t; - h5t_vertex_iterator_t *iter = &t->iters.vertex; - - if ( iter->cur_vid+1 >= t->num_vertices[t->cur_level] ) { - h5_debug ( f, "Traversing done!" ); - return H5_NOK; - } - h5_vertex_t *vertex = &t->vertices[++iter->cur_vid]; - memcpy ( P, &vertex->P, sizeof ( vertex->P ) ); - - return iter->cur_vid; -} - -h5_err_t -h5t_end_traverse_vertices ( - h5_file_t * f - ) { - h5t_fdata_t *t = f->t; - h5t_vertex_iterator_t *iter = &t->iters.vertex; - - iter->cur_vid = -1; - return H5_SUCCESS; + do { + (*eid)++; + if ( *eid >= t->num_elems[t->cur_level] ) { + return h5_error_internal ( + f, __FILE__, __func__, __LINE__ ); + } + el_dta = &t->elems_ldta[*eid]; + } while ( _h5t_elem_is_on_cur_level ( f, el_dta ) == H5_NOK ); + return *eid; } /* @@ -68,27 +50,68 @@ _h5t_elem_is_on_cur_level ( return H5_SUCCESS; } -/* - Skip elements which have been refined on a level <= the current one. -*/ -h5_id_t -_skip_to_next_elem_on_level ( - h5_file_t * f, - h5_id_t *eid +h5_err_t +h5t_begin_traverse_vertices ( + h5_file_t * f ) { h5t_fdata_t *t = f->t; - h5_elem_ldta_t *el_dta; + h5t_entity_iterator_t *iter = &t->iters.vertex; + iter->cur_cid = -1; + iter->cur_eid = -1; + TRY ( _skip_to_next_elem_on_level ( f, &iter->cur_eid ) ); + return H5_SUCCESS; +} + +h5_id_t +h5t_traverse_vertices ( + h5_file_t * const f, /*!< file handle */ + h5_float64_t P[3] /*!< OUT: coordinates */ + ) { + h5t_fdata_t *t = f->t; + h5t_entity_iterator_t *iter = &t->iters.vertex; + h5_idlist_t *tv; + size_t i; do { - (*eid)++; - if ( *eid >= t->num_elems[t->cur_level] ) { - return h5_error_internal ( - f, __FILE__, __func__, __LINE__ ); + if ( iter->cur_cid >= 3 ) { + if ( iter->cur_eid+1 >= t->num_elems[t->cur_level] ) { + h5_debug ( f, "Traversing done!" ); + return H5_NOK; + } + TRY ( _skip_to_next_elem_on_level ( + f, &iter->cur_eid ) ); + iter->cur_cid = 0; + } else { + iter->cur_cid++; } - el_dta = &t->elems_ldta[*eid]; - } - while ( _h5t_elem_is_on_cur_level ( f, el_dta ) == H5_NOK ); - return *eid; + TRY ( _h5t_find_tv2 ( f, iter->cur_cid, iter->cur_eid, &tv ) ); + /* skip to first element which is on current level */ + i = -1; + h5_elem_ldta_t *el_dta; + do { + i++; + h5_id_t eid = _h5t_get_elem_idx ( tv->items[i] ); + el_dta = &t->elems_ldta[eid]; + } while ( _h5t_elem_is_on_cur_level ( f, el_dta ) == H5_NOK ); + } while ( iter->cur_eid != _h5t_get_elem_idx(tv->items[i]) ); + + h5_id_t vidx = t->elems_ldta[iter->cur_eid].local_vids[iter->cur_cid]; + h5_vertex_t *vertex = &t->vertices[vidx]; + memcpy ( P, &vertex->P, sizeof ( vertex->P ) ); + + return _h5t_build_vertex_id ( iter->cur_cid, iter->cur_eid ); +} + +h5_err_t +h5t_end_traverse_vertices ( + h5_file_t * f + ) { + h5t_fdata_t *t = f->t; + h5t_entity_iterator_t *iter = &t->iters.vertex; + + iter->cur_cid = -1; + iter->cur_eid = -1; + return H5_SUCCESS; } h5_err_t @@ -98,9 +121,9 @@ h5t_begin_traverse_edges ( h5t_fdata_t *t = f->t; h5t_entity_iterator_t *iter = &t->iters.edge; + iter->cur_cid = -1; iter->cur_eid = -1; TRY ( _skip_to_next_elem_on_level ( f, &iter->cur_eid ) ); - iter->cur_fid = -1; return H5_SUCCESS; } @@ -111,31 +134,31 @@ h5t_traverse_edges ( ) { h5t_fdata_t *t = f->t; h5t_entity_iterator_t *iter = &t->iters.edge; - h5_te_entry_t *te; + h5t_te_entry_t *te; h5_size_t i; do { - if ( iter->cur_fid >= 5 ) { + if ( iter->cur_cid >= 5 ) { if ( iter->cur_eid+1 >= t->num_elems[t->cur_level] ) { h5_debug ( f, "Traversing done!" ); return H5_NOK; } TRY ( _skip_to_next_elem_on_level ( f, &iter->cur_eid ) ); - iter->cur_fid = 0; + iter->cur_cid = 0; } else { - iter->cur_fid++; + iter->cur_cid++; } TRY ( _h5t_find_te2 ( - f, iter->cur_fid, iter->cur_eid, &te ) ); + f, iter->cur_cid, iter->cur_eid, &te ) ); /* skip to first element which is on current level */ i = -1; h5_elem_ldta_t *el_dta; do { i++; - h5_id_t eid = _h5t_get_elem_id ( te->value.items[i] ); + h5_id_t eid = _h5t_get_elem_idx ( te->value.items[i] ); el_dta = &t->elems_ldta[eid]; } while ( _h5t_elem_is_on_cur_level ( f, el_dta ) == H5_NOK ); - } while ( iter->cur_eid != _h5t_get_elem_id(te->value.items[i]) ); + } while ( iter->cur_eid != _h5t_get_elem_idx(te->value.items[i]) ); memcpy ( local_vids, te->key.vids, 2*sizeof(h5_id_t) ); return te->value.items[0]; @@ -148,8 +171,8 @@ h5t_end_traverse_edges ( h5t_fdata_t *t = f->t; h5t_entity_iterator_t *iter = &t->iters.edge; - iter->cur_eid = 0; - iter->cur_fid = -1; + iter->cur_cid = -1; + iter->cur_eid = -1; return H5_SUCCESS; } @@ -160,9 +183,9 @@ h5t_begin_traverse_triangles ( h5t_fdata_t *t = f->t; h5t_entity_iterator_t *iter = &t->iters.triangle; + iter->cur_cid = -1; iter->cur_eid = -1; TRY ( _skip_to_next_elem_on_level ( f, &iter->cur_eid ) ); - iter->cur_fid = -1; return H5_SUCCESS; } @@ -173,30 +196,30 @@ h5t_traverse_triangles ( ) { h5t_fdata_t *t = f->t; h5t_entity_iterator_t *iter = &t->iters.triangle; - h5_td_entry_t *td; + h5t_td_entry_t *td; h5_size_t i; do { - if ( iter->cur_fid >= 3 ) { + if ( iter->cur_cid >= 3 ) { if ( iter->cur_eid+1 >= t->num_elems[t->cur_level] ) { h5_debug ( f, "Traversing done!" ); return H5_NOK; } TRY ( _skip_to_next_elem_on_level ( f, &iter->cur_eid ) ); - iter->cur_fid = 0; + iter->cur_cid = 0; } else { - iter->cur_fid++; + iter->cur_cid++; } - TRY ( _h5t_find_td2 ( f, iter->cur_fid, iter->cur_eid, &td ) ); + TRY ( _h5t_find_td2 ( f, iter->cur_cid, iter->cur_eid, &td ) ); /* skip to first element which is on current level */ i = -1; h5_elem_ldta_t *el_dta; do { i++; - h5_id_t eid = _h5t_get_elem_id ( td->value.items[i] ); + h5_id_t eid = _h5t_get_elem_idx ( td->value.items[i] ); el_dta = &t->elems_ldta[eid]; } while ( _h5t_elem_is_on_cur_level ( f, el_dta ) == H5_NOK ); - } while ( iter->cur_eid != _h5t_get_elem_id(td->value.items[i]) ); + } while ( iter->cur_eid != _h5t_get_elem_idx(td->value.items[i]) ); memcpy ( local_vids, td->key.vids, 3*sizeof(h5_id_t) ); return td->value.items[0]; @@ -209,8 +232,8 @@ h5t_end_traverse_triangles ( h5t_fdata_t *t = f->t; h5t_entity_iterator_t *iter = &t->iters.triangle; - iter->cur_eid = 0; - iter->cur_fid = -1; + iter->cur_cid = -1; + iter->cur_eid = -1; return H5_SUCCESS; } @@ -219,8 +242,9 @@ h5t_begin_traverse_elems ( h5_file_t * f ) { h5t_fdata_t *t = f->t; - h5t_elem_iterator_t *iter = &t->iters.elem; + h5t_entity_iterator_t *iter = &t->iters.elem; + iter->cur_cid = -1; iter->cur_eid = -1; return H5_SUCCESS; } @@ -235,7 +259,7 @@ h5t_traverse_elems ( h5_id_t *local_vids ) { h5t_fdata_t *t = f->t; - h5t_elem_iterator_t *iter = &t->iters.elem; + h5t_entity_iterator_t *iter = &t->iters.elem; h5_elem_ldta_t *elem_data; h5_id_t local_child_eid; h5_id_t refined_on_level = -1; @@ -263,7 +287,7 @@ h5t_traverse_elems ( elem_data->local_vids, sizeof ( elem_data->local_vids[0] ) * t->mesh_type ); - return iter->cur_eid; + return _h5t_build_elem_id ( iter->cur_eid ); } h5_err_t @@ -271,7 +295,8 @@ h5t_end_traverse_elems ( h5_file_t * f ) { h5t_fdata_t *t = f->t; - h5t_elem_iterator_t *iter = &t->iters.elem; + h5t_entity_iterator_t *iter = &t->iters.elem; + iter->cur_cid = -1; iter->cur_eid = -1; return H5_SUCCESS; } diff --git a/src/h5_core/h5t_storemesh.c b/src/h5_core/h5t_storemesh.c index c52b43b..61adf77 100644 --- a/src/h5_core/h5t_storemesh.c +++ b/src/h5_core/h5t_storemesh.c @@ -3,8 +3,6 @@ #include #include "h5_core/h5_core.h" -#include "h5_core/h5_types_private.h" -#include "h5_core/h5t_types_private.h" #include "h5_core/h5_core_private.h" /*! @@ -121,7 +119,7 @@ h5t_add_level ( t->dsinfo_num_elems_on_level.dims[0] = t->num_levels; ssize_t num_bytes = t->num_levels*sizeof ( h5_size_t ); - t->num_vertices = realloc ( t->num_vertices, num_bytes ); + TRY ( t->num_vertices = _h5_alloc ( f, t->num_vertices, num_bytes ) ); t->num_vertices[t->cur_level] = -1; TRY ( t->num_elems = _h5_alloc ( f, t->num_elems, num_bytes ) ); @@ -140,23 +138,6 @@ h5t_add_level ( return t->cur_level; } -h5_err_t -_h5t_alloc_num_vertices ( - h5_file_t * const f, - const h5_size_t num_vertices - ) { - h5t_fdata_t *t = f->t; - - ssize_t size = num_vertices * sizeof ( t->vertices[0] ); - TRY ( t->vertices = _h5_alloc ( f, t->vertices, size ) ); - size = num_vertices * sizeof ( t->vertices_data[0] ); - TRY ( t->vertices_data = _h5_alloc ( f, t->vertices_data, size ) ); - TRY( _h5_alloc_idmap ( f, &t->map_vertex_g2l, num_vertices ) ); - TRY( _h5_alloc_idlist_items ( f, &t->sorted_lvertices, num_vertices ) ); - - return H5_SUCCESS; -} - /*! Allocate memory for (more) vertices. */ @@ -221,110 +202,6 @@ h5t_end_store_vertices ( return H5_SUCCESS; } -h5_err_t -_h5t_alloc_tris ( - h5_file_t * const f, - const size_t cur, - const size_t new - ) { - h5t_fdata_t *t = f->t; - const size_t nvertices = 3; - - /* alloc mem for elements */ - TRY ( t->elems.tris = _h5_alloc ( - f, - t->elems.tris, - new * sizeof(t->elems.tris[0]) ) ); - memset ( - t->elems.tris + cur, - -1, - (new-cur) * sizeof(t->elems.tris[0]) ); - - /* alloc mem for local data of elements */ - TRY ( t->elems_ldta = _h5_alloc ( - f, - t->elems_ldta, - new * sizeof (t->elems_ldta[0]) ) ); - memset ( - t->elems_ldta + cur, - -1, - (new-cur) * sizeof (t->elems_ldta[0]) ); - - /* alloc mem for local vertex IDs of elements */ - TRY ( t->elems_lvids = _h5_alloc ( - f, - t->elems_lvids, - new * sizeof(t->elems_lvids[0]) * nvertices ) ); - memset ( - t->elems_lvids + cur * sizeof(t->elems_lvids[0]) * nvertices, - -1, - (new-cur) * sizeof(t->elems_lvids[0]) * nvertices ); - - /* re-init pointer to local vertex id in local data structure */ - h5_id_t *p = t->elems_lvids; - h5_id_t id; - for ( id = 0; id < new; id++, p+=nvertices ) { - t->elems_ldta[id].local_vids = p; - } - - /* alloc mem for global to local ID mapping */ - TRY ( _h5_alloc_idmap ( f, &t->map_elem_g2l, new ) ); - - return H5_SUCCESS; -} - -h5_err_t -_h5t_alloc_tets ( - h5_file_t * const f, - const size_t cur, - const size_t new - ) { - h5t_fdata_t *t = f->t; - const size_t nvertices = 4; - - /* alloc mem for elements */ - TRY ( t->elems.tets = _h5_alloc ( - f, - t->elems.tets, - new * sizeof(t->elems.tets[0]) ) ); - memset ( - t->elems.tets + cur, - -1, - (new-cur) * sizeof(t->elems.tets[0]) ); - - /* alloc mem for local data of elements */ - TRY ( t->elems_ldta = _h5_alloc ( - f, - t->elems_ldta, - new * sizeof (t->elems_ldta[0]) ) ); - memset ( - t->elems_ldta + cur, - -1, - (new-cur) * sizeof (t->elems_ldta[0]) ); - - /* alloc mem for local vertex IDs of elements */ - TRY ( t->elems_lvids = _h5_alloc ( - f, - t->elems_lvids, - new * sizeof(t->elems_lvids[0]) * nvertices ) ); - memset ( - t->elems_lvids + cur * nvertices, - -1, - (new-cur) * sizeof(t->elems_lvids[0]) * nvertices ); - - /* re-init pointer to local vertex id in local data structure */ - h5_id_t *p = t->elems_lvids; - h5_id_t id; - for ( id = 0; id < new; id++, p+=nvertices ) { - t->elems_ldta[id].local_vids = p; - } - - /* alloc mem for global to local ID mapping */ - TRY ( _h5_alloc_idmap ( f, &t->map_elem_g2l, new ) ); - - return H5_SUCCESS; -} - /*! Initialize everything so that we can begin to store elements. @@ -420,7 +297,7 @@ _h5t_store_tet ( sizeof (*local_vids) * t->mesh_type ); _h5t_sort_local_vids ( f, elem_ldta->local_vids, t->mesh_type ); h5_id_t face_id; - h5_te_entry_t *retval; + h5t_te_entry_t *retval; for ( face_id = 0; face_id < 6; face_id++ ) { TRY ( _h5t_search_te2 ( f, @@ -450,7 +327,7 @@ _h5t_store_tri ( sizeof (*local_vids) * t->mesh_type ); _h5t_sort_local_vids ( f, elem_ldta->local_vids, t->mesh_type ); h5_id_t face_id; - h5_te_entry_t *retval; + h5t_te_entry_t *retval; for ( face_id = 0; face_id < 3; face_id++ ) { TRY ( _h5t_search_te2 ( f, @@ -536,9 +413,9 @@ _h5t_bisect_edge ( h5_id_t el_id ) { h5t_fdata_t *t = f->t; - h5_te_entry_t item; + h5t_te_entry_t item; h5_id_t *vids = item.key.vids; - h5_te_entry_t *retval; + h5t_te_entry_t *retval; /* get all elements sharing the given edge */ @@ -549,14 +426,15 @@ _h5t_bisect_edge ( */ size_t i; for ( i = 0; i < retval->value.num_items; i++ ) { - h5_id_t local_id = _h5t_get_elem_id ( retval->value.items[i] ); + h5_id_t local_id = _h5t_get_elem_idx ( retval->value.items[i] ); h5_elem_ldta_t *tet = &t->elems_ldta[local_id]; if ( tet->local_child_eid >= 0 ) { /* this element has been refined! return bisecting point */ - h5_id_t face_id = _h5t_get_face_id ( retval->value.items[i] ); + h5_id_t face_id = _h5t_get_face_id ( + retval->value.items[i] ); h5_id_t kids[2], edge0[2], edge1[2]; TRY ( _h5t_compute_direct_children_of_edge ( f, diff --git a/src/h5_core/h5t_storemesh_private.h b/src/h5_core/h5t_storemesh_private.h index 497e4f3..3f8b782 100644 --- a/src/h5_core/h5t_storemesh_private.h +++ b/src/h5_core/h5t_storemesh_private.h @@ -1,26 +1,6 @@ #ifndef __H5T_STOREMESH_PRIVATE_H #define __H5T_STOREMESH_PRIVATE_H -h5_err_t -_h5t_alloc_num_vertices ( - h5_file_t * const f, - const h5_size_t num_vertices - ); - -h5_err_t -_h5t_alloc_tris ( - h5_file_t * const f, - const size_t cur, - const size_t new - ); - -h5_err_t -_h5t_alloc_tets ( - h5_file_t * const f, - const size_t cur, - const size_t new - ); - h5_id_t _h5t_store_tri ( h5_file_t * const f, @@ -35,11 +15,6 @@ _h5t_store_tet ( const h5_id_t vids[] ); -h5_err_t -_h5t_close_level ( - h5_file_t * const f - ); - h5_err_t _h5t_compute_direct_children_of_edge ( h5_file_t * const f, diff --git a/src/h5_core/h5t_types_private.h b/src/h5_core/h5t_types_private.h index c2fdc46..5a5ec04 100644 --- a/src/h5_core/h5t_types_private.h +++ b/src/h5_core/h5t_types_private.h @@ -54,19 +54,6 @@ typedef union h5_elems { } h5_elems_t; -/* - information about HDF5 dataset -*/ -typedef struct h5_dataset_info { - char name[256]; - int rank; - hsize_t dims[4]; - hsize_t maxdims[4]; - hsize_t chunk_size[4]; - hid_t *type_id; - hid_t create_prop; - hid_t access_prop; -} h5_dataset_info_t; typedef struct boundary { @@ -82,71 +69,38 @@ typedef struct boundary { h5_size_t *num_faces_on_level; /* real num of faces per level */ h5_id_t last_accessed_face; - h5_dataset_info_t dsinfo; + h5_dsinfo_t dsinfo; } boundary_t; /*** type ids' for compound types ***/ typedef struct h5_dtypes { - hid_t h5_id_t; - hid_t h5_int64_t; - hid_t h5_float64_t; + hid_t h5_id_t; /* ID's */ + hid_t h5_int64_t; /* 64 bit signed integer */ + hid_t h5_float64_t; /* 64 bit floating point */ hid_t h5_coord3d_t; /* 3-tuple of 64-bit float */ - hid_t h5_3id_t; /* 3-tuple of id's */ - hid_t h5_4id_t; /* 4-tuple of id's */ + hid_t h5_3id_t; /* 3-tuple of ID's */ + hid_t h5_4id_t; /* 4-tuple of ID's */ hid_t h5_vertex_t; /* vertex structure */ hid_t h5_triangle_t; /* triangle structure */ hid_t h5_tet_t; /* tetrahedron structure */ + hid_t h5t_tag_idx_t; } h5_dtypes_t; -typedef struct h5_te_entry_key { - h5_id_t vids[2]; -} h5_te_entry_key_t; - -typedef struct h5_te_entry { - h5_te_entry_key_t key; - h5_idlist_t value; -} h5_te_entry_t; - -typedef struct h5_td_entry_key { - h5_3id_t vids; -} h5_td_entry_key_t; - -typedef struct h5_td_entry { - h5_td_entry_key_t key; - h5_idlist_t value; -} h5_td_entry_t; - -typedef struct hsearch_data { - struct _ENTRY *table; - unsigned int size; - unsigned int filled; - int (*compare)(void*, void*); - unsigned int (*compute_hash)(void*); -} h5_hashtable_t; - typedef struct h5t_adjacencies { - struct hsearch_data te_hash; - struct hsearch_data td_hash; + h5_hashtable_t te_hash; + h5_hashtable_t td_hash; } h5t_adjacencies_t; -typedef struct h5t_elem_iterator { - h5_id_t cur_eid; -} h5t_elem_iterator_t; - -typedef struct h5t_vertex_iterator { - h5_id_t cur_vid; -} h5t_vertex_iterator_t; - typedef struct h5t_entity_iterator { - h5_id_t cur_fid; + h5_id_t cur_cid; h5_id_t cur_eid; } h5t_entity_iterator_t; typedef struct h5t_iterators { - h5t_vertex_iterator_t vertex; + h5t_entity_iterator_t vertex; h5t_entity_iterator_t edge; h5t_entity_iterator_t triangle; - h5t_elem_iterator_t elem; + h5t_entity_iterator_t elem; } h5t_iterators_t; typedef struct h5t_fdata { @@ -157,7 +111,6 @@ typedef struct h5t_fdata { h5_id_t cur_mesh; /* id of current mesh */ h5_id_t mesh_changed; /* true if new or has been changed */ h5_id_t num_meshes; /* number of meshes */ - hid_t elem_tid; /* HDF5 type id: tet, triangle etc */ h5_id_t cur_level; /* id of current level */ h5_id_t new_level; /* idx of the first new level or -1 */ h5_size_t num_levels; /* number of levels */ @@ -166,7 +119,7 @@ typedef struct h5t_fdata { hid_t topo_gid; /* grp id of mesh in current level */ - hid_t meshes_gid; + hid_t meshes_gid; /* HDF5 id */ hid_t mesh_gid; /*** type ids' for base & compound data types ***/ @@ -184,8 +137,8 @@ typedef struct h5t_fdata { h5_idmap_t map_vertex_g2l; /* map global id to local id */ h5_idlist_t sorted_lvertices; h5_id_t last_stored_vid; - h5_dataset_info_t dsinfo_vertices; - h5_dataset_info_t dsinfo_num_vertices; + h5_dsinfo_t dsinfo_vertices; + h5_dsinfo_t dsinfo_num_vertices; /*** Elements ***/ @@ -205,9 +158,9 @@ typedef struct h5t_fdata { h5_idlist_t sorted_elems[H5_MAX_VERTICES_PER_ELEM]; h5_id_t last_stored_eid; - h5_dataset_info_t dsinfo_elems; - h5_dataset_info_t dsinfo_num_elems; - h5_dataset_info_t dsinfo_num_elems_on_level; + h5_dsinfo_t dsinfo_elems; + h5_dsinfo_t dsinfo_num_elems; + h5_dsinfo_t dsinfo_num_elems_on_level; /*** Boundary Meshes ***/ h5_id_t num_boundaries; /* number of boundaries */ @@ -216,7 +169,9 @@ typedef struct h5t_fdata { boundary_t boundary; h5t_adjacencies_t adjacencies; - + /*** Tags ***/ + h5t_tagcontainer_t mtags; + h5t_tagcontainer_t stags; } h5t_fdata_t; #endif diff --git a/src/h5_core/h5u_readwrite.c b/src/h5_core/h5u_readwrite.c index 1d1c6dd..22305d1 100644 --- a/src/h5_core/h5u_readwrite.c +++ b/src/h5_core/h5u_readwrite.c @@ -24,7 +24,7 @@ _get_diskshape_for_reading ( struct h5u_fdata *u = f->u; hid_t space; - TRY( space = _h5_get_dataset_space ( f, dataset ) ); + TRY( space = _hdf_get_dataset_space ( f, dataset ) ); if ( h5u_has_view ( f ) ) { hsize_t stride; @@ -42,14 +42,14 @@ _get_diskshape_for_reading ( /* now we select a subset */ if ( u->diskshape > 0 ) { - TRY ( _h5_select_hyperslab_of_space ( + TRY ( _hdf_select_hyperslab_of_dataspace ( f, u->diskshape, H5S_SELECT_SET, &start, &stride, &count, NULL ) ); } - TRY ( _h5_select_hyperslab_of_space ( + TRY ( _hdf_select_hyperslab_of_dataspace ( f, space, H5S_SELECT_SET, @@ -76,7 +76,7 @@ _get_memshape_for_reading ( if ( h5u_has_view ( f ) ) { hsize_t dmax=H5S_UNLIMITED; hsize_t len = u->viewend - u->viewstart; - return _h5_create_space ( f, 1, &len, &dmax ); + return _hdf_create_dataspace ( f, 1, &len, &dmax ); } else { return H5S_ALL; } @@ -104,17 +104,19 @@ h5u_get_num_elems ( H5G_DATASET, 0, dataset_name, sizeof (dataset_name) ) ); - TRY( dataset_id = _h5_open_dataset ( f, f->step_gid, dataset_name ) ); + TRY( dataset_id = _hdf_open_dataset ( f, f->step_gid, dataset_name ) ); TRY( space_id = _get_diskshape_for_reading ( f, dataset_id ) ); if ( h5u_has_view ( f ) ) { - TRY ( nparticles = _h5_get_selected_npoints_of_space ( f, space_id ) ); + TRY ( nparticles = _hdf_get_selected_npoints_of_dataspace ( + f, space_id ) ); } else { - TRY ( nparticles = _h5_get_npoints_of_space ( f, space_id ) ); + TRY ( nparticles = _hdf_get_npoints_of_dataspace ( + f, space_id ) ); } - TRY( _h5_close_dataspace( f, space_id ) ); - TRY( _h5_close_dataset( f, dataset_id ) ); + TRY( _hdf_close_dataspace( f, space_id ) ); + TRY( _hdf_close_dataset( f, dataset_id ) ); return (h5_int64_t) nparticles; } @@ -134,10 +136,10 @@ h5u_read_elems ( if ( f->step_gid < 0 ) { TRY( h5_set_step ( f, f->step_idx ) ); } - TRY( (dataset_id = _h5_open_dataset ( f, f->step_gid, name ) ) ); + TRY( (dataset_id = _hdf_open_dataset ( f, f->step_gid, name ) ) ); TRY( (space_id = _get_diskshape_for_reading ( f, dataset_id ) ) ); TRY( (memspace_id = _get_memshape_for_reading ( f, dataset_id ) ) ); - TRY( _h5_read_dataset ( + TRY( _hdf_read_dataset ( f, dataset_id, type, @@ -145,9 +147,9 @@ h5u_read_elems ( space_id, f->xfer_prop, array ) ); - TRY( _h5_close_dataspace( f, space_id ) ); - TRY( _h5_close_dataspace( f, memspace_id ) ); - TRY( _h5_close_dataset ( f, dataset_id ) ); + TRY( _hdf_close_dataspace( f, space_id ) ); + TRY( _hdf_close_dataspace( f, memspace_id ) ); + TRY( _hdf_close_dataset ( f, dataset_id ) ); return H5_SUCCESS; } @@ -171,15 +173,15 @@ h5u_set_num_elements ( return H5_SUCCESS; } #endif - TRY( _h5_close_dataspace( f, u->diskshape ) ); - TRY( _h5_close_dataspace( f, u->memshape ) ); - TRY( _h5_close_dataspace( f, u->shape ) ); + TRY( _hdf_close_dataspace( f, u->diskshape ) ); + TRY( _hdf_close_dataspace( f, u->memshape ) ); + TRY( _hdf_close_dataspace( f, u->shape ) ); u->diskshape = H5S_ALL; u->memshape = H5S_ALL; u->shape = H5S_ALL; u->nparticles =(hsize_t) nparticles; #ifndef PARALLEL_IO - TRY( u->shape = _h5_create_space ( + TRY( u->shape = _hdf_create_dataspace ( f, 1, &(u->nparticles), @@ -237,17 +239,17 @@ h5u_set_num_elements ( } /* declare overall datasize */ - TRY ( f->u->shape = _h5_create_space ( f, 1, &total, &total ) ); + TRY ( f->u->shape = _hdf_create_dataspace ( f, 1, &total, &total ) ); /* declare overall data size but then will select a subset */ - TRY ( f->u->diskshape = _h5_create_space ( f, 1, &total, &total) ); + TRY ( f->u->diskshape = _hdf_create_dataspace ( f, 1, &total, &total) ); /* declare local memory datasize */ - TRY ( f->u->memshape = _h5_create_space ( + TRY ( f->u->memshape = _hdf_create_dataspace ( f, 1, &(f->u->nparticles), &dmax ) ); count[0] = nparticles; - TRY ( _h5_select_hyperslab_of_space ( + TRY ( _hdf_select_hyperslab_of_dataspace ( f, f->u->diskshape, H5S_SELECT_SET, @@ -293,11 +295,11 @@ h5u_reset_view ( u->viewstart = -1; u->viewend = -1; - TRY( _h5_close_dataspace( f, u->shape ) ); + TRY( _hdf_close_dataspace( f, u->shape ) ); u->shape = H5S_ALL; - TRY( _h5_close_dataspace( f, u->diskshape ) ); + TRY( _hdf_close_dataspace( f, u->diskshape ) ); u->diskshape = H5S_ALL; - TRY( _h5_close_dataspace( f, u->memshape ) ); + TRY( _hdf_close_dataspace( f, u->memshape ) ); u->memshape = H5S_ALL; return H5_SUCCESS; @@ -356,16 +358,16 @@ h5u_set_view ( u->nparticles = end - start + 1; /* declare overall datasize */ - TRY ( u->shape = _h5_create_space ( f, 1, &total, &total ) ); + TRY ( u->shape = _hdf_create_dataspace ( f, 1, &total, &total ) ); /* declare overall data size but then will select a subset */ - TRY ( u->diskshape= _h5_create_space ( f, 1, &total, &total ) ); + TRY ( u->diskshape= _hdf_create_dataspace ( f, 1, &total, &total ) ); /* declare local memory datasize */ - TRY ( u->memshape = _h5_create_space ( + TRY ( u->memshape = _hdf_create_dataspace ( f, 1, &(u->nparticles), &dmax ) ); - TRY ( _h5_select_hyperslab_of_space ( + TRY ( _hdf_select_hyperslab_of_dataspace ( f, u->diskshape, H5S_SELECT_SET, diff --git a/src/h5_core/hdf5_misc.c b/src/h5_core/hdf5_misc.c index 354e714..081e29e 100644 --- a/src/h5_core/hdf5_misc.c +++ b/src/h5_core/hdf5_misc.c @@ -3,6 +3,8 @@ #include "h5_core.h" #include "h5_core_private.h" +/* OBSOLETE!!! */ + struct _iter_op_data { int stop_idx; int count;