From 07e57ff23a1af332c834c0167cebc2769f3ce691 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Thu, 25 Sep 2008 15:43:24 +0000 Subject: [PATCH] refactoring --- .gitattributes | 1 - src/h5_core/Makefile.am | 70 ++- src/h5_core/h5_attribs.c | 4 +- src/h5_core/h5_core.h | 69 +-- src/h5_core/h5_core_private.h | 39 +- src/h5_core/h5_errorhandling.c | 94 ++- src/h5_core/h5_errorhandling.h | 48 ++ src/h5_core/h5_errorhandling_private.h | 481 ++++++--------- src/h5_core/h5_general.c | 465 --------------- src/h5_core/h5_maps.c | 2 +- src/h5_core/h5_openclose.c | 8 +- src/h5_core/h5_readwrite.c | 176 +++++- src/h5_core/h5_readwrite.h | 12 + src/h5_core/h5_types.h | 105 +++- src/h5_core/h5t_boundaries.c | 356 ++++++++++- src/h5_core/h5t_boundaries.h | 56 +- src/h5_core/h5t_errorhandling.c | 56 +- src/h5_core/h5t_errorhandling_private.h | 72 ++- src/h5_core/h5t_map.c | 210 ++++--- src/h5_core/h5t_map_private.h | 14 +- src/h5_core/h5t_openclose.c | 233 +++++++- src/h5_core/h5t_openclose.h | 49 +- src/h5_core/h5t_readwrite.c | 753 +++--------------------- src/h5_core/h5t_readwrite.h | 57 +- src/h5_core/h5u_readwrite.c | 22 +- src/h5_core/h5u_readwrite.h | 41 +- 26 files changed, 1670 insertions(+), 1823 deletions(-) delete mode 100644 src/h5_core/h5_general.c diff --git a/.gitattributes b/.gitattributes index 0ae3a2f..75c9013 100644 --- a/.gitattributes +++ b/.gitattributes @@ -378,7 +378,6 @@ src/h5_core/h5_core_private.h -text src/h5_core/h5_errorhandling.c -text src/h5_core/h5_errorhandling.h -text src/h5_core/h5_errorhandling_private.h -text -src/h5_core/h5_general.c -text src/h5_core/h5_maps.c -text src/h5_core/h5_maps.h -text src/h5_core/h5_openclose.c -text diff --git a/src/h5_core/Makefile.am b/src/h5_core/Makefile.am index 15c5efb..cdae2df 100644 --- a/src/h5_core/Makefile.am +++ b/src/h5_core/Makefile.am @@ -36,52 +36,68 @@ EXTRA_DIST = $(EXTRA_HEADERS) nodist_include_HEADERS = # What to build... Will be determined by configure script. -lib_LIBRARIES = libH5.a +lib_LIBRARIES = libH5_core.a # Listing of all possible targets that I may build. -EXTRA_LIBRARIES = libH5.a +EXTRA_LIBRARIES = libH5_core.a # Header files that I wish to install in $(prefix)/include include_HEADERS = \ + h5_attribs.h \ h5_core.h \ + h5_errorhandling.h \ + h5_errorhandling_private.h \ + h5_hdf5.h \ + h5_maps.h \ + h5_openclose.h \ + h5_qsort_private.h \ + h5_readwrite.h \ + h5_readwrite_private.h \ h5_types.h \ - attribs.h \ - errorhandling.h \ - errorhandling_private.h \ - maps.h \ - readwrite.h \ - t_errorhandling_private.h \ - t_map.h \ - t_openclose.h \ - t_readwrite.h \ - u_readwrite.h + h5b_errorhandling_private.h \ + h5t_boundaries.h \ + h5t_boundaries_private.h \ + h5t_errorhandling_private.h \ + h5t_map.h \ + h5t_openclose.h \ + h5t_readwrite.h \ + h5t_readwrite_private.h \ + h5t_storemesh.h + h5t_storemesh_private.h + h5u_errorhandling_private.h \ + h5u_readwrite.h # Listing of all possible headers that I may include EXTRA_HEADERS = # Listing of sources -libH5_a_SOURCES = \ - attribs.c \ - errorhandling.c \ - general.c \ - maps.c \ - readwrite.c \ - t_errorhandling.c \ - t_map.c \ - t_openclose.c \ - t_readwrite.c \ - u_readwrite.c +libH5_core_a_SOURCES = \ + h5_attribs.c \ + h5_errorhandling.c \ + h5_hdf5.c \ + h5_maps.c \ + h5_openclose.c \ + h5_qsort.c \ + h5_qsort_r.c \ + h5_readwrite.c \ + h5t_boundaries.c \ + h5t_errorhandling.c \ + h5t_map.c \ + h5t_openclose.c \ + h5t_readwrite.c \ + h5t_storemesh.c \ + h5u_readwrite.c -all: libH5.a +all: libH5_core.a -libH5.a: $(libH5_a_OBJECTS) +libH5_core.a: $(libH5_core_a_OBJECTS) echo $(libH5_a_OBJECTS) ${AR} rucs $@ $^ - + %.o : %.c $(CC) $(CFLAGS) $(INC) -c $< -$(libH5_a_OBJECTS): h5_core.h +$(libH5_core_a_OBJECTS): h5_core.h #errorhandling.o: errorhandling.c diff --git a/src/h5_core/h5_attribs.c b/src/h5_core/h5_attribs.c index d7e3f73..7f0cb4b 100644 --- a/src/h5_core/h5_attribs.c +++ b/src/h5_core/h5_attribs.c @@ -7,7 +7,7 @@ #include #include "h5_core.h" -#include "h5_private.h" +#include "h5_core_private.h" #include "H5Part.h" #include "H5Block.h" @@ -76,7 +76,7 @@ h5_write_attrib ( attrib_name, attrib_type, space_id, - H5P_DEFAULT ); + H5P_DEFAULT, H5P_DEFAULT ); if ( attrib_id < 0 ) return HANDLE_H5A_CREATE_ERR ( attrib_name ); herr = H5Awrite ( attrib_id, attrib_type, attrib_value); diff --git a/src/h5_core/h5_core.h b/src/h5_core/h5_core.h index 9a9e6a8..ae17d31 100644 --- a/src/h5_core/h5_core.h +++ b/src/h5_core/h5_core.h @@ -3,62 +3,19 @@ #include "h5_types.h" -h5_file* -h5_open_file ( - const char *filename, - unsigned flags, - MPI_Comm comm - ); +#include "h5_attribs.h" +#include "h5_errorhandling.h" +#include "h5_hdf5.h" +#include "h5_maps.h" +#include "h5_openclose.h" +#include "h5_readwrite.h" +#include "h5_readwrite_private.h" +#include "h5t_boundaries.h" +#include "h5t_map.h" +#include "h5t_openclose.h" +#include "h5t_readwrite.h" +#include "h5t_storemesh.h" +#include "h5u_readwrite.h" -h5part_int64_t -h5_check_filehandle ( - const h5_file *f - ); - -h5part_int64_t -h5_close_file ( - h5_file *f - ); - -h5part_int64_t -h5_define_stepname_fmt ( - h5_file *f, - const char *name, - const h5part_int64_t width - ); - -h5_err_t -h5_get_stepname_fmt ( - h5_file *f, - char *name, - const h5_size_t l_name, - h5_size_t *width - ); - -h5_err_t -_h5_close_step ( - h5_file *f - ); - -h5_int64_t -h5_has_step ( - h5_file * f, - h5_int64_t step - ); - -h5_int64_t -h5_get_step ( - h5_file *f - ); - -#include "attribs.h" -#include "errorhandling.h" -#include "maps.h" -#include "readwrite.h" -#include "t_boundaries.h" -#include "t_map.h" -#include "t_openclose.h" -#include "t_readwrite.h" -#include "u_readwrite.h" #endif diff --git a/src/h5_core/h5_core_private.h b/src/h5_core/h5_core_private.h index c6b4050..06e2006 100644 --- a/src/h5_core/h5_core_private.h +++ b/src/h5_core/h5_core_private.h @@ -1,9 +1,15 @@ #ifndef __H5_PRIVATE_H #define __H5_PRIVATE_H -#include "errorhandling_private.h" -#include "t_map_private.h" -#include "t_errorhandling_private.h" +#include "h5_errorhandling_private.h" +#include "h5_qsort_private.h" +#include "h5b_errorhandling_private.h" +#include "h5t_boundaries_private.h" +#include "h5t_map_private.h" +#include "h5t_errorhandling_private.h" +#include "h5t_readwrite_private.h" +#include "h5t_storemesh_private.h" +#include "h5u_errorhandling_private.h" #define H5PART_GROUPNAME_STEP "Step" @@ -17,33 +23,8 @@ #define _h5t_build_triangle_id( idx, entity_id ) \ ( (idx << (sizeof(entity_id)*8 - 3)) | (entity_id & H5_TET_MASK)) -#define SET_FNAME( fname ) h5_set_funcname( fname ); - -#define CHECK_FILEHANDLE( f ) \ - if ( f == NULL ) \ - return HANDLE_H5_BADFD_ERR; - -#define CHECK_WRITABLE_MODE( f ) \ - if ( f->mode==H5PART_READ ) \ - return (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_INVAL, \ - "Attempting to write to read-only file" ); - -#define CHECK_READONLY_MODE( f ) \ - if ( ! f->mode==H5PART_READ ) \ - return (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_INVAL, \ - "Operation is not allowed on writable files." ); - -#define CHECK_TIMEGROUP( f ) \ - if ( f->step_gid <= 0 ) \ - return (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_INVAL, \ - "Internal error: step_gid <= 0."); +#define TRY(func,exception) if ( func < 0 ) goto exception; /*! diff --git a/src/h5_core/h5_errorhandling.c b/src/h5_core/h5_errorhandling.c index af50914..382593e 100644 --- a/src/h5_core/h5_errorhandling.c +++ b/src/h5_core/h5_errorhandling.c @@ -7,20 +7,27 @@ #include #include "h5_core.h" -#include "h5_private.h" -#include "H5Part.h" +#include "h5_core_private.h" -h5_error_handler _err_handler = h5_report_errorhandler; -h5_err_t _h5part_errno = H5_SUCCESS; -h5_id_t _debug = 0; +static h5_error_handler _err_handler = h5_report_errorhandler; +static h5_verror_handler _verr_handler = h5_report_verrorhandler; +static h5_err_t _h5_errno = H5_SUCCESS; +static h5_id_t _h5_debug = 0; static char *__funcname = "NONE"; +const char * const H5_O_MODES[] = { + "H5_O_RDWR", + "H5_O_RDONLY", + "H5_O_WRONLY", + "H5_O_APPEND" +}; + h5_err_t h5_set_debuglevel ( h5_id_t level ) { - _debug = level; + _h5_debug = level; return H5_SUCCESS; } @@ -28,7 +35,7 @@ h5_err_t h5_get_debuglevel ( void ) { - return _debug; + return _h5_debug; } h5_err_t @@ -39,18 +46,32 @@ h5_set_errorhandler ( return H5_SUCCESS; } -h5part_error_handler +h5_error_handler h5_get_errorhandler ( void ) { return _err_handler; } +h5_verror_handler +h5_get_verrorhandler ( + void + ) { + return _verr_handler; +} + h5_err_t h5_get_errno ( void ) { - return _h5part_errno; + return _h5_errno; +} + +void +h5_set_errno ( + h5_err_t h5_errno + ) { + _h5_errno = h5_errno; } @@ -70,14 +91,29 @@ h5_report_errorhandler ( ... ) { - _h5part_errno = eno; - if ( _debug > 0 ) { + _h5_errno = eno; + if ( _h5_debug > 0 ) { va_list ap; va_start ( ap, fmt ); h5_vprint_error ( fmt, ap ); va_end ( ap ); } - return _h5part_errno; + return _h5_errno; +} + +h5_err_t +h5_report_verrorhandler ( + const char *funcname, + const h5_err_t eno, + const char *fmt, + va_list ap + ) { + + _h5_errno = eno; + if ( _h5_debug > 0 ) { + h5_vprint_error ( fmt, ap ); + } + return _h5_errno; } /*! @@ -94,15 +130,15 @@ h5_abort_errorhandler ( ... ) { - _h5part_errno = eno; - if ( _debug > 0 ) { + _h5_errno = eno; + if ( _h5_debug > 0 ) { va_list ap; va_start ( ap, fmt ); fprintf ( stderr, "%s: ", funcname ); vfprintf ( stderr, fmt, ap ); fprintf ( stderr, "\n" ); } - exit (-(int)_h5part_errno); + exit (-(int)_h5_errno); } static void @@ -112,20 +148,38 @@ _vprintf ( const char *fmt, va_list ap ) { - char *fmt2 = (char*)malloc( strlen ( prefix ) +strlen ( fmt ) + strlen ( __funcname ) + 16 ); + char *fmt2 = (char*)malloc( + strlen ( prefix ) + + strlen ( fmt ) + + strlen ( __funcname ) + 16 ); if ( fmt2 == NULL ) return; sprintf ( fmt2, "%s: %s: %s\n", prefix, __funcname, fmt ); vfprintf ( stderr, fmt2, ap ); free ( fmt2 ); } +h5_err_t +h5_error ( + h5_err_t error_no, + const char *fmt, + ... + ) { + va_list ap; + va_start ( ap, fmt ); + + (*h5_get_verrorhandler()) ( h5_get_funcname(), error_no, fmt, ap ); + + va_end ( ap ); + return error_no; +} + void h5_vprint_error ( const char *fmt, va_list ap ) { - if ( _debug < 1 ) return; + if ( _h5_debug < 1 ) return; _vprintf ( stderr, "E", fmt, ap ); } @@ -147,7 +201,7 @@ h5_vprint_warn ( va_list ap ) { - if ( _debug < 2 ) return; + if ( _h5_debug < 2 ) return; _vprintf ( stderr, "W", fmt, ap ); } @@ -169,7 +223,7 @@ h5_vprint_info ( va_list ap ) { - if ( _debug < 3 ) return; + if ( _h5_debug < 3 ) return; _vprintf ( stdout, "I", fmt, ap ); } @@ -191,7 +245,7 @@ h5_vprint_debug ( va_list ap ) { - if ( _debug < 4 ) return; + if ( _h5_debug < 4 ) return; _vprintf ( stdout, "D", fmt, ap ); } diff --git a/src/h5_core/h5_errorhandling.h b/src/h5_core/h5_errorhandling.h index 541dbf7..102b5c8 100644 --- a/src/h5_core/h5_errorhandling.h +++ b/src/h5_core/h5_errorhandling.h @@ -4,7 +4,35 @@ #define h5_debug h5_print_debug #define h5_info h5_print_info #define h5_warn h5_print_warn +#if 0 #define h5_error h5_print_error +#endif + +#define SET_FNAME( fname ) h5_set_funcname( fname ); +#define CHECK_FILEHANDLE( f ) \ + if ( f == NULL ) \ + return HANDLE_H5_BADFD_ERR; + +#define CHECK_WRITABLE_MODE( f ) \ + if ( f->mode==H5_O_RDONLY ) \ + return (*h5_get_errorhandler()) ( \ + h5_get_funcname(), \ + H5_ERR_INVAL, \ + "Attempting to write to read-only file" ); + +#define CHECK_READONLY_MODE( f ) \ + if ( ! f->mode==H5_O_RDONLY ) \ + return (*h5_get_errorhandler()) ( \ + h5_get_funcname(), \ + H5_ERR_INVAL, \ + "Operation is not allowed on writable files." ); + +#define CHECK_TIMEGROUP( f ) \ + if ( f->step_gid <= 0 ) \ + return (*h5_get_errorhandler()) ( \ + h5_get_funcname(), \ + H5_ERR_INVAL, \ + "Internal error: step_gid <= 0."); h5_err_t h5_set_debuglevel ( @@ -31,6 +59,11 @@ h5_get_errno ( void ); +void +h5_set_errno ( + h5_err_t h5_errno + ); + h5_err_t h5_report_errorhandler ( const char *funcname, @@ -39,6 +72,14 @@ h5_report_errorhandler ( ... ); +h5_err_t +h5_report_verrorhandler ( + const char *funcname, + const h5_err_t eno, + const char *fmt, + va_list ap + ); + h5_err_t h5_abort_errorhandler ( const char *funcname, @@ -47,6 +88,13 @@ h5_abort_errorhandler ( ... ) ; +h5_err_t +h5_error ( + h5_err_t error_no, + const char *fmt, + ... + ); + void h5_vprint_error ( const char *fmt, diff --git a/src/h5_core/h5_errorhandling_private.h b/src/h5_core/h5_errorhandling_private.h index 78293d8..c8edc7f 100644 --- a/src/h5_core/h5_errorhandling_private.h +++ b/src/h5_core/h5_errorhandling_private.h @@ -1,426 +1,331 @@ #ifndef __ERRORHANDLING_PRIVATE_H #define __ERRORHANDLING_PRIVATE_H -extern h5part_error_handler _err_handler; -extern h5_err_t _h5part_errno; -extern h5_id_t _debug; +#define h5_error_not_implemented( file, func, lino ) \ + h5_error( \ + H5_ERR_NOT_IMPLEMENTED, \ + "%s: Function \"%s\", line %d not yet implemented!", \ + file, func, lino ); -#define HANDLE_H5_ERR_NOT_IMPLEMENTED \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_NOT_IMPLEMENTED, \ - "Function not yet implemented!" ); - -#define HANDLE_H5G_OPEN_ERR( s ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ - "Cannot open group \"%s\".", s ); - -#define CHECK_LAYOUT( f ) \ - if ( ! f->block->have_layout ) \ - return (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5PART_ERR_LAYOUT, \ - "No layout defined." ) - -#define HANDLE_H5_LAYOUT_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5PART_ERR_LAYOUT, \ - "Bad layout." ); +#define h5_error_internal( file, func, lino ) \ + h5_error( \ + H5_ERR_INTERNAL, \ + "%s: Internal error: %s line %d!", \ + file, func, lino ) #define HANDLE_H5_NOENT_ERR( name ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5PART_ERR_NOENT, \ - "Object \"%s\" doesn't exists.", name ); + h5_error( \ + H5PART_ERR_NOENT, \ + "Object \"%s\" doesn't exists.", name ); #define HANDLE_H5_DATASET_RANK_ERR( m, n ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5PART_ERR_INVAL, \ - "Wrong rank of dataset: Is %d, but should be %d", \ - m, n ); + h5_error( \ + H5PART_ERR_INVAL, \ + "Wrong rank of dataset: Is %d, but should be %d", \ + m, n ); #define HANDLE_H5_GROUP_EXISTS_ERR( name ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5PART_ERR_INVAL, \ - "Group \"%s\" already exists", name ) - -#define HANDLE_H5_INTERNAL_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_INTERNAL, \ - "Internal error: %s line %d!", __FILE__, __LINE__ ) + h5_error( \ + H5PART_ERR_INVAL, \ + "Group \"%s\" already exists", name ) /**************** H5 *********************/ #define HANDLE_H5_BADFD_ERR \ - (*h5_get_errorhandler())( \ - h5_get_funcname(), \ + h5_error( \ H5_ERR_BADFD, \ "Called with bad filehandle." ); #define HANDLE_H5_INIT_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ + h5_error( \ H5_ERR_INIT, \ "Cannot initialize H5Part." ); #define HANDLE_H5_NOMEM_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ + h5_error( \ H5_ERR_NOMEM, \ "Out of memory." ); #define HANDLE_H5_SETSTEP_ERR( rc, step ) \ - (*h5_get_errorhandler()) ( \ + h5_error\ h5_get_funcname(), \ rc, \ - "Cannont set time-step to %lld.", (long long)step ); + "Cannont set step to %lld.", (long long)step ); + +#define _h5_handle_file_mode_error( mode_id ) \ + h5_error( \ + H5_ERR_BADF, \ + "Operation not permitted in mode \"%s\"", \ + H5_O_MODES[mode_id] ); #define HANDLE_H5_FILE_ACCESS_TYPE_ERR( flags ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_INVAL, \ - "Invalid file access type \"%d\".", flags); + h5_error( \ + H5_ERR_INVAL, \ + "Invalid file access mode \"%d\".", flags); #define HANDLE_H5_STEP_EXISTS_ERR( step ) \ - (*h5_get_errorhandler())( \ - h5_get_funcname(), \ + h5_error( \ H5_ERR_INVAL, \ "Step #%lld already exists, step cannot be set to an existing" \ " step in write and append mode", (long long)step ); -#define HANDLE_H5_SET_VIEW_ERR( rc, start, end ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - rc, \ - "Cannot set view to (%lld, %lld).", \ - (long long)start, (long long)end ); +#define HANDLE_H5_NOENTRY_ERR( group_name, type, idx ) \ + h5_error( \ + H5_ERR_NOENTRY, \ + "No entry with index %lld and type %d in group %s!", \ + (long long)idx, type, group_name ); -#define HANDLE_H5_GET_NUM_PARTICLES_ERR( rc ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - rc, \ - "Cannot get number of particles." ); - -#define HANDLE_H5_NOENTRY_ERR( group_name, type, idx ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_NOENTRY, \ - "No entry with index %lld and type %d in group %s!", \ - (long long)idx, type, group_name ); - - -#define HANDLE_H5_UNDEF_MESH_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_INVAL, \ - "Mesh not yet defined." ); - -#define HANDLE_H5_UNDEF_LEVEL_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_INVAL, \ - "Level not yet defined." ); #define HANDLE_H5_OVERFLOW_ERR( otype, max ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_INVAL, \ - "Cannot store more than %d %s", max, otype ); + h5_error( \ + H5_ERR_INVAL, \ + "Cannot store more than %d %s", max, otype ); -#define HANDLE_H5_PARENT_ID_ERR( otype, oid, pid ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_INVAL, \ - "Impossible parent_id %d for %s with global id %d", \ - pid, otype, oid ); +#define HANDLE_H5_PARENT_ID_ERR( otype, oid, pid ) \ + h5_error( \ + H5_ERR_INVAL, \ + "Impossible parent_id %d for %s with global id %d", \ + pid, otype, oid ); #define HANDLE_H5_OUT_OF_RANGE_ERR( otype, oid ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_INVAL, \ - "%s id %d out of range", \ - otype, oid ); + h5_error( \ + H5_ERR_INVAL, \ + "%s id %d out of range", \ + otype, oid ); /**************** HDF5 *********************/ /* H5A: Attribute */ -#define HANDLE_H5A_CLOSE_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5A_CLOSE_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot terminate access to attribute." ); -#define HANDLE_H5A_CREATE_ERR( s ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5A_CREATE_ERR( s ) \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot create attribute \"%s\".", s ); -#define HANDLE_H5A_GET_NAME_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5A_GET_NAME_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot get attribute name." ); -#define HANDLE_H5A_GET_NUM_ATTRS_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5A_GET_NUM_ATTRS_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot get number of attributes." ); -#define HANDLE_H5A_GET_SPACE_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5A_GET_SPACE_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot get a copy of dataspace for attribute." ); -#define HANDLE_H5A_GET_TYPE_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5A_GET_TYPE_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot get attribute datatype." ); -#define HANDLE_H5A_OPEN_IDX_ERR( n ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5A_OPEN_IDX_ERR( n ) \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot open attribute specified by index \"%lld\".", \ (long long)n ); -#define HANDLE_H5A_OPEN_NAME_ERR( s ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5A_OPEN_NAME_ERR( s ) \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot open attribute specified by name \"%s\".", s ); -#define HANDLE_H5A_READ_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5A_READ_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot read attribute" ); -#define HANDLE_H5A_WRITE_ERR( s ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5A_WRITE_ERR( s ) \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot write attribute \"%s\".", s ); /* H5D: Dataset */ -#define HANDLE_H5D_CLOSE_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5D_CLOSE_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Close of dataset failed." ); -#define HANDLE_H5D_CREATE_ERR( s ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5D_CREATE_ERR( s ) \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot create dataset name \"%s\"", \ s ); -#define HANDLE_H5D_GET_SPACE_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5D_GET_SPACE_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot get dataspace identifier."); -#define HANDLE_H5D_GET_TYPE_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5D_GET_TYPE_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot determine dataset type."); -#define HANDLE_H5D_OPEN_ERR( s ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5D_OPEN_ERR( s ) \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot open dataset \"%s\".", s ); -#define HANDLE_H5D_READ_ERR( s ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5D_READ_ERR( s ) \ + h5_error( \ + H5_ERR_HDF5, \ "Read from dataset \"%s\".", \ s ); -#define HANDLE_H5D_WRITE_ERR( s ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5D_WRITE_ERR( s ) \ + h5_error( \ + H5_ERR_HDF5, \ "Write to dataset \"%s\" failed.", \ s ); /* H5F: file */ -#define HANDLE_H5F_CLOSE_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5F_CLOSE_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot terminate access to file." ); -#define HANDLE_H5F_OPEN_ERR( filename, flags ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ - "Cannot open file \"%s\" with mode \"%d\"", filename, flags ); - - +#define HANDLE_H5F_OPEN_ERR( filename, flags ) \ + h5_error( \ + H5_ERR_HDF5, \ + "Cannot open file \"%s\" with mode \"%d\"", \ + filename, flags ); /* H5G: group */ -#define HANDLE_H5G_CLOSE_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5G_CLOSE_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot terminate access to datagroup." ); -#define HANDLE_H5G_CREATE_ERR( s ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5G_CREATE_ERR( s ) \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot create datagroup \"%s\".", s ); -#define HANDLE_H5G_GET_OBJINFO_ERR( s ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5G_GET_OBJINFO_ERR( s ) \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot get information about object \"%s\".", s ); -#define HANDLE_H5G_OPEN_ERR( s ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ - "Cannot open group \"%s\".", s ); - +#define HANDLE_H5G_OPEN_ERR( parent_id, grp_name ) \ + h5_error( \ + H5_ERR_HDF5, \ + "Cannot open group \"%s/%s\".", parent_id, grp_name ); /* H5P: property */ -#define HANDLE_H5P_CLOSE_ERR( s ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5P_CLOSE_ERR( s ) \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot terminate access to property list \"%s\".", s ); -#define HANDLE_H5P_CREATE_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5P_CREATE_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot create property list." ); -#define HANDLE_H5P_SET_DXPL_MPIO_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ - "MPI: Cannot set data transfer mode." ); +#define HANDLE_H5P_SET_DXPL_MPIO_ERR \ + h5_error( \ + H5_ERR_HDF5, \ + "MPI: Cannot set data transfer mode." ); -#define HANDLE_H5P_SET_FAPL_MPIO_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ - "Cannot store IO communicator information to the " \ - "file access property list."); +#define HANDLE_H5P_SET_FAPL_MPIO_ERR \ + h5_error( \ + H5_ERR_HDF5, \ + "Cannot store IO communicator information to the " \ + "file access property list."); /* H5S: dataspace */ -#define HANDLE_H5S_CREATE_SIMPLE_ERR( rank ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5PART_ERR_HDF5, \ +#define HANDLE_H5S_CREATE_SIMPLE_ERR( rank ) \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot create dataspace with rank %d.", \ rank ); -#define HANDLE_H5S_CREATE_SIMPLE_3D_ERR( dims ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5PART_ERR_HDF5, \ - "Cannot create 3d dataspace with dimension sizes " \ - "\"(%lld,%lld,%lld)\".", \ - (long long)dims[0], (long long)dims[1], (long long)dims[2] ); +#define HANDLE_H5S_CREATE_SIMPLE_3D_ERR( dims ) \ + h5_error( \ + H5_ERR_HDF5, \ + "Cannot create 3d dataspace with dimension sizes " \ + "\"(%lld,%lld,%lld)\".", \ + (long long)dims[0], (long long)dims[1], (long long)dims[2] ); -#define HANDLE_H5S_CLOSE_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5S_CLOSE_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot terminate access to dataspace." ); -#define HANDLE_H5S_GET_SELECT_NPOINTS_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ - "Cannot determine the number of elements in dataspace selection." ); +#define HANDLE_H5S_GET_SELECT_NPOINTS_ERR \ + h5_error( \ + H5_ERR_HDF5, \ + "Cannot determine the number of elements" \ + "in dataspace selection." ); -#define HANDLE_H5S_GET_SIMPLE_EXTENT_NPOINTS_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5S_GET_SIMPLE_EXTENT_NPOINTS_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot determine number of elements in dataspace." ); -#define HANDLE_H5S_SELECT_HYPERSLAB_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ - "Cannot set select hyperslap region or add the specified region" ); +#define HANDLE_H5S_SELECT_HYPERSLAB_ERR \ + h5_error( \ + H5_ERR_HDF5, \ + "Cannot set select hyperslap region or add the " \ + "specified region" ); -#define HANDLE_H5S_GET_SIMPLE_EXTENT_DIMS_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5PART_ERR_HDF5, \ +#define HANDLE_H5S_GET_SIMPLE_EXTENT_DIMS_ERR \ + h5_error( \ + H5PART_ERR_HDF5, \ "Cannot get dimension sizes of dataset" ); /* H5T: type */ -#define HANDLE_H5T_ARRAY_CREATE_ERR( type_name, rank ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ - "Can't create array datatype object with base datatype %s and rank %d", \ +#define HANDLE_H5T_ARRAY_CREATE_ERR( type_name, rank ) \ + h5_error( \ + H5_ERR_HDF5, \ + "Can't create array datatype object with base " \ + "datatype %s and rank %d", \ type_name, rank ); -#define HANDLE_H5T_CREATE_ERR( class_name, obj_name ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5T_CREATE_ERR( class_name, obj_name ) \ + h5_error( \ + H5_ERR_HDF5, \ "Can't create datatype object of class %s to handle %s.", \ class_name, obj_name ); -#define HANDLE_H5T_INSERT_ERR( field_name, type_name ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5T_INSERT_ERR( field_name, type_name ) \ + h5_error( \ + H5_ERR_HDF5, \ "Can't insert field %s to compound datatype to handle %s", \ field_name, type_name ); -#define HANDLE_H5T_CLOSE_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_HDF5, \ +#define HANDLE_H5T_CLOSE_ERR \ + h5_error( \ + H5_ERR_HDF5, \ "Cannot release datatype." ); /* MPI */ -#define HANDLE_MPI_ALLGATHER_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_MPI, \ +#define HANDLE_MPI_ALLGATHER_ERR \ + h5_error( \ + H5_ERR_MPI, \ "Cannot gather data." ); -#define HANDLE_MPI_COMM_SIZE_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_MPI, \ +#define HANDLE_MPI_COMM_SIZE_ERR \ + h5_error( \ + H5_ERR_MPI, \ "Cannot get number of processes in my group." ); -#define HANDLE_MPI_COMM_RANK_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_MPI, \ +#define HANDLE_MPI_COMM_RANK_ERR \ + h5_error( \ + H5_ERR_MPI, \ "Cannot get rank of the calling process in my group." ); -#define HANDLE_MPI_UNAVAILABLE_ERR \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_MPI, \ +#define HANDLE_MPI_UNAVAILABLE_ERR \ + h5_error( \ + H5_ERR_MPI, \ "MPI not available" ); diff --git a/src/h5_core/h5_general.c b/src/h5_core/h5_general.c deleted file mode 100644 index 4c05aae..0000000 --- a/src/h5_core/h5_general.c +++ /dev/null @@ -1,465 +0,0 @@ -#include -#include -#include -#include /* va_arg - System dependent ?! */ -#include -#include -#include -#include - -#include "h5_core.h" -#include "h5_core_private.h" - -/*! - \ingroup h5block_private - - \internal - - Check whether \c f points to a valid file handle. - - \return H5_SUCCESS or error code -*/ -h5part_int64_t -h5_check_filehandle ( - const h5_file *f /*!< filehandle to check validity of */ - ) { - - if ( f == NULL ) - return HANDLE_H5_BADFD_ERR; - if ( f->file == 0 ) - return HANDLE_H5_BADFD_ERR; - if ( f->block == NULL ) - return HANDLE_H5_BADFD_ERR; - return H5_SUCCESS; -} - - -/*! - Initialize H5Part -*/ -static herr_t -_h5_error_handler ( void* unused ) { - - if ( h5_get_debuglevel() >= 5 ) { - H5Eprint (stderr); - } - return 0; -} - -static h5part_int64_t -_init ( void ) { - static int __init = 0; - - herr_t r5; - if ( ! __init ) { - r5 = H5Eset_auto ( _h5_error_handler, NULL ); - if ( r5 < 0 ) return H5_ERR_INIT; - } - __init = 1; - return H5_SUCCESS; -} - -/*! - \ingroup h5_private - - \internal - - Initialize unstructured data internal data structure. - - \return H5_SUCCESS or error code -*/ -static h5part_int64_t -_h5u_open_file ( - h5_file *f /*!< IN: file handle */ - ) { - f->shape = 0; - f->diskshape = H5S_ALL; - f->memshape = H5S_ALL; - f->viewstart = -1; - f->viewend = -1; - f->pnparticles = - (h5part_int64_t*) malloc (f->nprocs * sizeof (h5part_int64_t)); - if (f->pnparticles == NULL) { - return HANDLE_H5_NOMEM_ERR; - } - return H5_SUCCESS; -} - -/*! - \ingroup h5_private - - \internal - - Initialize H5Block internal structure. - - \return H5_SUCCESS or error code -*/ -static h5part_int64_t -_h5b_open_file ( - h5_file *f /*!< IN: file handle */ - ) { - struct h5b_fdata *b; - - if ( (f == 0) || (f->file == 0) ) return HANDLE_H5_BADFD_ERR; - if ( f->block ) return H5_SUCCESS; - - f->block = (struct h5b_fdata*) malloc( sizeof (*f->block) ); - if ( f->block == NULL ) { - return HANDLE_H5_NOMEM_ERR; - } - b = f->block; - memset ( b, 0, sizeof (*b) ); - b->user_layout = (struct H5BlockPartition*) malloc ( - f->nprocs * sizeof (b->user_layout[0]) ); - if ( b->user_layout == NULL ) { - return HANDLE_H5_NOMEM_ERR; - } - b->write_layout = (struct H5BlockPartition*) malloc ( - f->nprocs * sizeof (b->write_layout[0]) ); - if ( b->write_layout == NULL ) { - return HANDLE_H5_NOMEM_ERR; - } - b->step_idx = -1; - b->blockgroup = -1; - b->shape = -1; - b->diskshape = -1; - b->memshape = -1; - b->field_group_id = -1; - b->have_layout = 0; - - return H5_SUCCESS; -} - - -h5_file* -h5_open_file ( - const char *filename, /*!< [in] The name of the data file to open. */ - unsigned flags, /*!< [in] The access mode for the file. */ - MPI_Comm comm /*!< [in] MPI communicator */ - ) { - - h5_info ( "Opening file %s.", filename ); - - if ( _init() < 0 ) { - HANDLE_H5_INIT_ERR; - return NULL; - } - h5_set_errno ( H5_SUCCESS ); - h5_file *f = NULL; - - f = (h5_file*) malloc( sizeof (h5_file) ); - if( f == NULL ) { - HANDLE_H5_NOMEM_ERR; - goto error_cleanup; - } - memset (f, 0, sizeof (h5_file)); - - f->prefix_step_name = strdup ( H5PART_GROUPNAME_STEP ); - if( f->prefix_step_name == NULL ) { - HANDLE_H5_NOMEM_ERR; - goto error_cleanup; - } - f->width_step_idx = 0; - - f->xfer_prop = f->create_prop = f->access_prop = H5P_DEFAULT; - - f->comm = 0; /* init values for serial case */ - f->nprocs = 1; - f->myproc = 0; - -#ifdef PARALLEL_IO - f->comm = comm; - if (MPI_Comm_size (comm, &f->nprocs) != MPI_SUCCESS) { - HANDLE_MPI_COMM_SIZE_ERR; - goto error_cleanup; - } - if (MPI_Comm_rank (comm, &f->myproc) != MPI_SUCCESS) { - HANDLE_MPI_COMM_RANK_ERR; - goto error_cleanup; - } - - - /* for the SP2... perhaps different for linux */ - MPI_Info info = MPI_INFO_NULL; - - /* ks: IBM_large_block_io */ - MPI_Info_create(&info); - MPI_Info_set(info, "IBM_largeblock_io", "true" ); - if (H5Pset_fapl_mpio (f->access_prop, comm, info) < 0) { - HANDLE_H5P_SET_FAPL_MPIO_ERR; - goto error_cleanup; - } - MPI_Info_free(&info); - - f->access_prop = H5Pcreate (H5P_FILE_ACCESS); - if (f->access_prop < 0) { - HANDLE_H5P_CREATE_ERR; - goto error_cleanup; - } - - /* f->create_prop = H5Pcreate(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. */ - f->xfer_prop = H5Pcreate (H5P_DATASET_XFER); - if (f->xfer_prop < 0) { - HANDLE_H5P_CREATE_ERR; - goto error_cleanup; - } - -#ifdef COLLECTIVE_IO - if (H5Pset_dxpl_mpio (f->xfer_prop,H5FD_MPIO_COLLECTIVE) < 0) { - HANDLE_H5P_SET_DXPL_MPIO_ERR; - goto error_cleanup; - } -#endif /* COLLECTIVE_IO */ - -#endif /* PARALLEL_IO */ - - if ( flags == H5_O_RDONLY ) { - f->file = H5Fopen (filename, H5F_ACC_RDONLY, f->access_prop); - } - else if ( flags == H5_O_WRONLY ){ - f->file = H5Fcreate (filename, H5F_ACC_TRUNC, f->create_prop, - f->access_prop); - f->empty = 1; - } - else if ( flags == H5_O_APPEND || H5_O_RDWR ) { - int fd = open (filename, O_RDONLY, 0); - if ( (fd == -1) && (errno == ENOENT) ) { - f->file = H5Fcreate(filename, H5F_ACC_TRUNC, - f->create_prop, f->access_prop); - f->empty = 1; - } - else if (fd != -1) { - close (fd); - f->file = H5Fopen (filename, H5F_ACC_RDWR, - f->access_prop); - } - } - else { - HANDLE_H5_FILE_ACCESS_TYPE_ERR ( flags ); - goto error_cleanup; - } - - if (f->file < 0) { - HANDLE_H5F_OPEN_ERR ( filename, flags ); - goto error_cleanup; - } - f->root_gid = H5Gopen( f->file, "/" ); - if ( f->root_gid < 0 ) { - HANDLE_H5G_OPEN_ERR ( "", "" ); - goto error_cleanup; - } - f->mode = flags; - f->step_gid = -1; - - sprintf ( - f->step_name, - "%s#%0*lld", - f->prefix_step_name, f->width_step_idx, (long long) f->step_idx ); - - if ( _h5u_open_file ( f ) < 0 ) { - goto error_cleanup; - } - - if ( _h5b_open_file ( f ) < 0 ) { - goto error_cleanup; - } - - if ( _h5t_open_file ( f ) < 0 ) { - goto error_cleanup; - } - - return f; - - error_cleanup: - if (f != NULL ) { - if (f->prefix_step_name) { - free (f->prefix_step_name); - } - if (f->pnparticles != NULL) { - free (f->pnparticles); - } - free (f); - } - return NULL; -} - -/*! - \ingroup h5_private - - \internal - - De-initialize H5Block internal structure. Open HDF5 objects are - closed and allocated memory freed. - - \return H5_SUCCESS or error code -*/ -static h5part_int64_t -_h5u_close_file ( - h5_file *f /*!< IN: file handle */ - ) { - herr_t herr; - h5_set_errno ( H5_SUCCESS ); - if( f->shape > 0 ) { - herr = H5Sclose( f->shape ); - if ( herr < 0 ) HANDLE_H5S_CLOSE_ERR; - f->shape = 0; - } - if( f->diskshape != H5S_ALL ) { - herr = H5Sclose( f->diskshape ); - if ( herr < 0 ) HANDLE_H5S_CLOSE_ERR; - f->diskshape = 0; - } - if( f->memshape != H5S_ALL ) { - herr = H5Sclose( f->memshape ); - if ( herr < 0 ) HANDLE_H5S_CLOSE_ERR; - f->memshape = 0; - } - if( f->pnparticles ) { - free( f->pnparticles ); - } - return h5_get_errno(); -} - -/*! - \ingroup h5block_private - - \internal - - De-initialize H5Block internal structure. Open HDF5 objects are - closed and allocated memory freed. - - \return H5_SUCCESS or error code -*/ -static h5part_int64_t -_h5b_close_file ( - h5_file *f /*!< IN: file handle */ - ) { - - herr_t herr; - struct h5b_fdata *b = f->block; - - if ( b->blockgroup >= 0 ) { - herr = H5Gclose ( b->blockgroup ); - if ( herr < 0 ) return HANDLE_H5G_CLOSE_ERR; - b->blockgroup = -1; - } - if ( b->shape >= 0 ) { - herr = H5Sclose ( b->shape ); - if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR; - b->shape = -1; - } - if ( b->diskshape >= 0 ) { - herr = H5Sclose ( b->diskshape ); - if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR; - b->diskshape = -1; - } - if ( b->memshape >= 0 ) { - herr = H5Sclose ( b->memshape ); - if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR; - b->memshape = -1; - } - free ( f->block ); - f->block = NULL; - - return H5_SUCCESS; -} - -h5part_int64_t -h5_close_file ( - h5_file *f - ) { - herr_t r = 0; - h5_set_errno ( H5_SUCCESS ); - - CHECK_FILEHANDLE ( f ); - - _h5_close_step ( f ); - - _h5u_close_file ( f ); - _h5b_close_file ( f ); - _h5t_close_file ( f ); - - if( f->step_gid >= 0 ) { - r = H5Gclose( f->step_gid ); - if ( r < 0 ) HANDLE_H5G_CLOSE_ERR; - f->step_gid = -1; - } - if( f->xfer_prop != H5P_DEFAULT ) { - r = H5Pclose( f->xfer_prop ); - if ( r < 0 ) HANDLE_H5P_CLOSE_ERR ( "f->xfer_prop" ); - f->xfer_prop = H5P_DEFAULT; - } - if( f->access_prop != H5P_DEFAULT ) { - r = H5Pclose( f->access_prop ); - if ( r < 0 ) HANDLE_H5P_CLOSE_ERR ( "f->access_prop" ); - f->access_prop = H5P_DEFAULT; - } - if( f->create_prop != H5P_DEFAULT ) { - r = H5Pclose( f->create_prop ); - if ( r < 0 ) HANDLE_H5P_CLOSE_ERR ( "f->create_prop" ); - f->create_prop = H5P_DEFAULT; - } - if ( f->root_gid >= 0 ) { - r = H5Gclose ( f->root_gid ); - if ( r < 0 ) HANDLE_H5G_CLOSE_ERR; - f->root_gid = 0; - } - if ( f->file ) { - r = H5Fclose( f->file ); - if ( r < 0 ) HANDLE_H5F_CLOSE_ERR; - f->file = 0; - } - if (f->prefix_step_name) { - free (f->prefix_step_name); - } - free( f ); - - return h5_get_errno(); -} - -h5_int64_t -h5_define_stepname_fmt ( - h5_file *f, - const char *name, - const h5part_int64_t width - ) { - f->prefix_step_name = strdup ( name ); - if( f->prefix_step_name == NULL ) { - return HANDLE_H5_NOMEM_ERR; - } - f->width_step_idx = (int)width; - - return H5_SUCCESS; -} - -h5_err_t -h5_get_stepname_fmt ( - h5_file * f, - char *name, - const h5_size_t l_name, - h5_size_t *width - ) { - return -1; -} - -h5_int64_t -h5_get_step ( - h5_file * f - ) { - return -1; -} - - -h5_int64_t -h5_has_step ( - h5_file * f, - h5_int64_t step - ) { - char name[128]; - sprintf ( name, "%s#%0*lld", f->prefix_step_name, f->width_step_idx, (long long) step ); - return ( H5Gget_objinfo( f->file, name, 1, NULL ) >= 0 ); -} diff --git a/src/h5_core/h5_maps.c b/src/h5_core/h5_maps.c index 6e16d73..6d95208 100644 --- a/src/h5_core/h5_maps.c +++ b/src/h5_core/h5_maps.c @@ -3,7 +3,7 @@ #include #include "h5_types.h" #include "h5_core.h" -#include "h5_private.h" +#include "h5_core_private.h" h5_err_t _h5_alloc_smap ( diff --git a/src/h5_core/h5_openclose.c b/src/h5_core/h5_openclose.c index 4c05aae..fe102aa 100644 --- a/src/h5_core/h5_openclose.c +++ b/src/h5_core/h5_openclose.c @@ -38,10 +38,10 @@ h5_check_filehandle ( Initialize H5Part */ static herr_t -_h5_error_handler ( void* unused ) { +_h5_error_handler ( hid_t estack_id, void* unused ) { if ( h5_get_debuglevel() >= 5 ) { - H5Eprint (stderr); + H5Eprint (estack_id, stderr); } return 0; } @@ -52,7 +52,7 @@ _init ( void ) { herr_t r5; if ( ! __init ) { - r5 = H5Eset_auto ( _h5_error_handler, NULL ); + r5 = H5Eset_auto ( H5E_DEFAULT, _h5_error_handler, NULL ); if ( r5 < 0 ) return H5_ERR_INIT; } __init = 1; @@ -247,7 +247,7 @@ h5_open_file ( HANDLE_H5F_OPEN_ERR ( filename, flags ); goto error_cleanup; } - f->root_gid = H5Gopen( f->file, "/" ); + f->root_gid = H5Gopen( f->file, "/", H5P_DEFAULT ); if ( f->root_gid < 0 ) { HANDLE_H5G_OPEN_ERR ( "", "" ); goto error_cleanup; diff --git a/src/h5_core/h5_readwrite.c b/src/h5_core/h5_readwrite.c index 60ac283..c8e997b 100644 --- a/src/h5_core/h5_readwrite.c +++ b/src/h5_core/h5_readwrite.c @@ -7,9 +7,7 @@ #include #include "h5_core.h" -#include "h5_private.h" -#include "H5Part.h" -#include "H5Block.h" +#include "h5_core_private.h" h5part_int64_t h5_write_data ( @@ -32,7 +30,7 @@ h5_write_data ( name, type, shape, - H5P_DEFAULT ); + H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); if ( dataset_id < 0 ) return HANDLE_H5D_CREATE_ERR ( name ); @@ -54,6 +52,165 @@ h5_write_data ( return H5_SUCCESS; } +h5_err_t +h5_write_dataset ( + h5_file * const f, /*!< IN: Handle to open file */ + const hid_t group_id, + const char dataset_name[],/*!< IN: Name to associate data with */ + const hid_t type_id, /*!< IN: Type of data */ + const hid_t memspace_id, + const hid_t diskspace_id, + const void * const data /*!< IN: Data to commit to disk */ + ) { + h5_info ( "Writing dataset %s/%s.", + h5_get_objname(group_id), dataset_name ); + + if ( f->mode == O_RDONLY ) + return _h5_handle_file_mode_error( f->mode ); + + /* + file modes: + H5_O_RDONLY: only reading allowed + H5_O_WRONLY: create new file, dataset must not exist + H5_O_APPEND: allows appendings of new datasets to an existing file + H5_O_RDWR: dataset may exist + */ + H5O_info_t dataset_info; + herr_t herr = H5Oget_info_by_name( + group_id, + dataset_name, + &dataset_info, + H5P_DEFAULT ); + + if ( (herr >= 0) && ( (f->mode==H5_O_WRONLY) || (f->mode==H5_O_APPEND) ) ) { + h5_warn ( "Dataset %s/%s already exist.", + h5_get_objname(group_id), dataset_name ); + return _h5_handle_file_mode_error( f->mode ); + } + hid_t dataset_id; + if ( herr >= 0 ) { + dataset_id = H5Dopen ( + group_id, + dataset_name, + H5P_DEFAULT ); + if ( dataset_id < 0 ) + return HANDLE_H5D_OPEN_ERR ( dataset_name ); + } else { + dataset_id = H5Dcreate ( + group_id, + dataset_name, + type_id, + diskspace_id, + H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); + if ( dataset_id < 0 ) + return HANDLE_H5D_CREATE_ERR ( dataset_name ); + } + herr = H5Dwrite ( + dataset_id, + type_id, + memspace_id, + diskspace_id, + f->xfer_prop, + data ); + + if ( herr < 0 ) return HANDLE_H5D_WRITE_ERR ( dataset_name ); + + herr = H5Dclose ( dataset_id ); + if ( herr < 0 ) return HANDLE_H5D_CLOSE_ERR; + + f->empty = 0; + + return H5_SUCCESS; +} + +h5_err_t +h5_read_dataset2 ( + h5_file * const f, + hid_t group_id, + const char dataset_name[], + hid_t type_id, + hid_t (*set_memspace)(h5_file*,hid_t), + hid_t (*set_diskspace)(h5_file*,hid_t), + void * const data ) { + + hid_t dataset_id = H5Dopen ( group_id, dataset_name, H5P_DEFAULT ); + if ( dataset_id < 0 ) return HANDLE_H5D_OPEN_ERR ( dataset_name ); + + hid_t memspace_id = (*set_memspace)( f, dataset_id ); + if ( memspace_id < 0 ) return memspace_id; + hid_t diskspace_id = (*set_diskspace)( f, dataset_id ); + if ( diskspace_id < 0 ) return diskspace_id; + + + h5_err_t h5err = _h5_read_dataset ( + f, + dataset_id, + type_id, + memspace_id, + diskspace_id, + data ); + if ( h5err < 0 ) return h5err; + + herr_t herr = H5Sclose ( diskspace_id ); + if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR; + herr = H5Sclose ( memspace_id ); + if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR; + + herr = H5Dclose ( dataset_id ); + if ( herr < 0 ) return HANDLE_H5D_CLOSE_ERR; + + return H5_SUCCESS; +} + +h5_err_t +h5_read_dataset ( + h5_file *f, + hid_t group_id, + const char dataset_name[], + hid_t type_id, + hid_t memspace_id, + hid_t diskspace_id, + void * const data ) { + + hid_t dataset_id = H5Dopen ( group_id, dataset_name, H5P_DEFAULT ); + if ( dataset_id < 0 ) return HANDLE_H5D_OPEN_ERR ( dataset_name ); + + h5_err_t h5err = _h5_read_dataset ( + f, + dataset_id, + type_id, + memspace_id, + diskspace_id, + data ); + if ( h5err < 0 ) return h5err; + + herr_t herr = H5Dclose ( dataset_id ); + if ( herr < 0 ) return HANDLE_H5D_CLOSE_ERR; + + return H5_SUCCESS; +} + +h5_err_t +_h5_read_dataset ( + h5_file * const f, + hid_t dataset_id, + hid_t type_id, + hid_t memspace_id, + hid_t diskspace_id, + void * const data ) { + + herr_t herr = H5Dread ( + dataset_id, + type_id, + memspace_id, + diskspace_id, + f->xfer_prop, + data ); + if ( herr < 0 ) + return HANDLE_H5D_READ_ERR ( h5_get_objname ( dataset_id ) ); + + return H5_SUCCESS; +} /*! \ingroup h5part_kernel @@ -191,7 +348,8 @@ _create_step ( (long long)f->step_idx, (long long)(size_t) f ); f->is_new_step = 1; - f->step_gid = H5Gcreate ( f->file, f->step_name, 0 ); + f->step_gid = H5Gcreate ( f->file, f->step_name, 0, + H5P_DEFAULT, H5P_DEFAULT ); if ( f->step_gid < 0 ) return HANDLE_H5G_CREATE_ERR ( f->step_name ); @@ -208,9 +366,9 @@ _open_step ( (long long)f->step_idx, (long long)(size_t) f ); f->is_new_step = 0; - f->step_gid = H5Gopen ( f->file, f->step_name ); + f->step_gid = H5Gopen ( f->file, f->step_name, H5P_DEFAULT ); if ( f->step_gid < 0 ) - return HANDLE_H5G_OPEN_ERR( f->step_name ); + return HANDLE_H5G_OPEN_ERR( "", f->step_name ); return H5_SUCCESS; } @@ -258,7 +416,7 @@ _set_step ( herr_t herr = H5Gget_objinfo( f->file, f->step_name, 1, NULL ); if( f->mode == H5_O_RDONLY ) { - if ( herr < 0 ) return HANDLE_H5G_OPEN_ERR( f->step_name ); + if ( herr < 0 ) return HANDLE_H5G_OPEN_ERR( "", f->step_name ); herr = _open_step ( f ); if ( herr < 0 ) return herr; } else if ( (f->mode == H5_O_WRONLY) || (f->mode == H5_O_APPEND) ) { @@ -328,7 +486,7 @@ h5_get_dataset_type( hid_t group_id, const char *dataset_name ) { - hid_t dataset_id = H5Dopen ( group_id, dataset_name ); + hid_t dataset_id = H5Dopen ( group_id, dataset_name, H5P_DEFAULT ); if ( dataset_id < 0 ) HANDLE_H5D_OPEN_ERR ( dataset_name ); hid_t hdf5_type = H5Dget_type ( dataset_id ); diff --git a/src/h5_core/h5_readwrite.h b/src/h5_core/h5_readwrite.h index f01cde5..f69581c 100644 --- a/src/h5_core/h5_readwrite.h +++ b/src/h5_core/h5_readwrite.h @@ -13,6 +13,18 @@ h5_write_data ( const hid_t diskshape ) ; +h5_err_t +h5_write_dataset ( + h5_file * const f, + const hid_t group_id, + const char dataset_name[], + const hid_t type_id, + const hid_t memspace_id, + const hid_t diskspace_id, + const void * const data + ) ; + + h5part_int64_t h5_get_num_objects ( hid_t group_id, diff --git a/src/h5_core/h5_types.h b/src/h5_core/h5_types.h index 539145c..b7f31a0 100644 --- a/src/h5_core/h5_types.h +++ b/src/h5_core/h5_types.h @@ -8,6 +8,7 @@ #include #define H5_SUCCESS 0 +#define H5_ERR_BADF -9 #define H5_ERR_NOMEM -12 #define H5_ERR_INVAL -22 #define H5_ERR_BADFD -77 @@ -23,10 +24,12 @@ #define H5_ERR_INTERNAL -253 #define H5_ERR_NOT_IMPLEMENTED -254 -#define H5_O_RDONLY 0x01 -#define H5_O_WRONLY 0x02 -#define H5_O_APPEND 0x03 -#define H5_O_RDWR 0x04 +#define H5_O_RDWR 0 +#define H5_O_RDONLY 1 +#define H5_O_WRONLY 2 +#define H5_O_APPEND 3 + +extern const char * const H5_O_MODES[]; #ifdef WIN32 typedef __int64 int64_t; @@ -49,18 +52,24 @@ struct h5_complex { }; typedef struct h5_complex h5_complex; -enum h5_mesh_types { /* enum with number of vertices(!) */ - TRIANGLE_MESH = 3, - TETRAHEDRAL_MESH = 4 +enum h5_oid { /* enum with number of vertices(!) */ + H5_OID_VERTEX = 1, + H5_OID_EDGE = 2, + H5_OID_TRIANGLE = 3, + H5_OID_TETRAHEDRON = 4 }; -#define H5_MAX_VERTICES_PER_ENTITY TETRAHEDRAL_MESH +typedef enum h5_oid h5_oid_t; + +#define H5_MAX_VERTICES_PER_ENTITY H5_OID_TETRAHEDRON struct h5_vertex { /* 32Byte */ h5_id_t id; h5_id_t unused; /* for right alignment */ h5_float64_t P[3]; }; +typedef struct h5_vertex h5_vertex; +typedef struct h5_vertex h5_vertex_t; struct h5_edge { /* 16Bytes */ h5_id_t id; @@ -69,6 +78,8 @@ struct h5_edge { /* 16Bytes */ h5_id_t unused; /* for right alignment */ h5_id_t vertex_ids[2]; }; +typedef struct h5_edge h5_edge; +typedef struct h5_edge h5_edge_t; struct h5_triangle { /*24Bytes*/ h5_id_t id; @@ -76,7 +87,8 @@ struct h5_triangle { /*24Bytes*/ h5_id_t vertex_ids[3]; h5_id_t refined_on_level; }; - +typedef struct h5_triangle h5_triangle; +typedef struct h5_triangle h5_triangle_t; struct h5_tetrahedron { /* 24Bytes */ h5_id_t id; @@ -85,6 +97,8 @@ struct h5_tetrahedron { /* 24Bytes */ h5_id_t unused; /* for right alignment */ h5_id_t vertex_ids[4]; }; +typedef struct h5_tetrahedron h5_tetrahedron; +typedef struct h5_tetrahedron h5_tetrahedron_t; struct h5_ltriangle { h5_id_t vertex_ids[3]; /* local(!) vertex ids */ @@ -94,16 +108,18 @@ struct h5_ltetrahedron { h5_id_t vertex_ids[4]; /* local(!) vertex ids */ }; -typedef struct h5_vertex h5_vertex; -typedef struct h5_edge h5_edge; -typedef struct h5_triangle h5_triangle; -typedef struct h5_tetrahedron h5_tetrahedron; typedef h5_err_t (*h5_error_handler)( const char*, const h5_err_t, const char*,...) #ifdef __GNUC__ -__attribute__ ((format (printf, 3, 4))) + __attribute__ ((format (printf, 3, 4))) #endif - ; + ; + +typedef h5_err_t (*h5_verror_handler)( + const char*, + const h5_err_t, + const char*, + va_list ap ); typedef h5_error_handler h5part_error_handler; @@ -157,9 +173,6 @@ struct h5b_fdata { hid_t field_group_id; }; -struct h5t_fdata_level { -}; - union entities { struct h5_tetrahedron *tets; struct h5_triangle *tris; @@ -187,26 +200,48 @@ struct idmap { } *items; }; +struct boundary { + char name[16]; + char label[256]; + h5_id_t id; /* name of boundary as integer */ + h5_id_t changed; /* true if boundary is new or + has been changed */ + h5_id_t gid; /* hdf5 grp id boundary */ + h5_id_t *faces; + h5_id_t *lfaces; + h5_size_t *num_faces; /* addit. num of faces per level */ + h5_size_t *num_faces_on_level; /* real num of faces per level */ + + h5_id_t last_accessed_face; +}; +typedef struct boundary boundary_t; + struct h5t_fdata { + /*** book-keeping ***/ char mesh_name[16]; - enum h5_mesh_types mesh_type; + char mesh_label[256]; + enum h5_oid mesh_type; h5_id_t cur_mesh; - h5_id_t new_mesh; /* idx of the first new mesh or -1 */ + h5_id_t mesh_changed; /* true if mesh is new or has been changed */ h5_id_t num_meshes; + hid_t entity_tid; /* HDF5 type id: tet, triangle ... */ h5_id_t cur_level; h5_id_t new_level; /* idx of the first new level or -1 */ h5_size_t num_levels; + /*** vertices ***/ h5_vertex *vertices; h5_size_t *num_vertices; struct idmap map_vertex_g2l;/* map global id to local id */ + struct smap sorted_lvertices; h5_id_t last_retrieved_vertex_id; h5_id_t last_stored_vertex_id; + + /*** Entities ***/ union entities entities; - union lentities lentities; - hid_t entity_tid; /* type of mesh: tetrahedral, triangle ... */ + union lentities lentities; /* local vertex id's of entities */ h5_size_t *num_entities; h5_size_t *num_entities_on_level; struct idmap map_entity_g2l;/* map global id to local id */ @@ -219,20 +254,25 @@ struct h5t_fdata { h5_id_t last_retrieved_entity_id; h5_id_t last_stored_entity_id; - /* HDF5 objects */ + /*** Boundary Meshes ***/ + h5_id_t num_boundaries; /* number of boundaries */ + h5_id_t boundaries_gid; /* hdf5 grp id container group */ - hid_t topo_gid; /* grp id of mesh in current level */ + boundary_t boundary; + + /*** HDF5 objects ***/ + hid_t topo_gid; /* grp id of mesh in current level */ hid_t meshes_gid; hid_t mesh_gid; - /* type ids' for compound types */ - hid_t float64_3tuple_tid; - hid_t int32_2tuple_tid; - hid_t int32_3tuple_tid; - hid_t int32_4tuple_tid; - hid_t vertex_tid; - hid_t triangle_tid; - hid_t tet_tid; + /*** type ids' for compound types ***/ + hid_t float64_3tuple_tid; /* 3-tuple of 64-bit float */ + hid_t int32_2tuple_tid; /* 2-tuple of 32-bit int */ + hid_t int32_3tuple_tid; /* 3-tuple of 32-bit int */ + hid_t int32_4tuple_tid; /* 4-tuple of 32-bit int */ + hid_t vertex_tid; /* vertex structure */ + hid_t triangle_tid; /* triangle structure */ + hid_t tet_tid; /* tetrahedron structure */ }; /** @@ -302,5 +342,6 @@ struct h5_file { }; typedef struct h5_file h5_file; +typedef struct h5_file h5_file_t; typedef struct h5_file H5PartFile; #endif diff --git a/src/h5_core/h5t_boundaries.c b/src/h5_core/h5t_boundaries.c index e9152eb..b0890a7 100644 --- a/src/h5_core/h5t_boundaries.c +++ b/src/h5_core/h5t_boundaries.c @@ -1,12 +1,360 @@ #include -#include "h5/h5_core.h" -#include "h5/h5_core_private.h" +#include "h5_core/h5_core.h" +#include "h5_core/h5_core_private.h" + +static h5_err_t +_open_boundaries_group ( + h5_file * const f + ) { + struct h5t_fdata *t = &f->t; + + if ( t->cur_mesh < 0 ) + return _h5t_error_undef_mesh ( f ); + TRY( (t->boundaries_gid = _h5_open_group ( + f, t->mesh_gid, H5T_BOUNDARYMESH_GRPNAME )), error_exit ); + return H5_SUCCESS; +error_exit: + return h5_get_errno(); +} + +static h5_err_t +_open_boundary_group ( + h5_file * const f + ) { + struct h5t_fdata *t = &f->t; + boundary_t *boundary = &t->boundary; + + if ( t->cur_mesh < 0 ) + return _h5t_error_undef_mesh ( f ); + + if ( t->boundaries_gid < 0 ) { + TRY( _open_boundaries_group ( f ), error_exit ); + } + boundary->gid = _h5_open_group ( + f, t->boundaries_gid, boundary->name ); + return H5_SUCCESS; +error_exit: + return h5_get_errno(); +} + +h5_id_t +h5t_get_num_boundaries ( + h5_file * const f + ) { + struct h5t_fdata *t = &f->t; + + if ( t->cur_mesh < 0 ) + return _h5t_error_undef_mesh ( f ); + if ( t->num_boundaries < 0 ) { + t->num_boundaries = h5_get_num_objects ( + t->mesh_gid, + H5T_BOUNDARYMESH_GRPNAME, + H5G_GROUP ); + } + if ( t->num_boundaries < 0 ) t->num_boundaries = 0; + return t->num_boundaries; +} h5_err_t -h5t_add_boundary ( - h5_file *f, +h5t_set_boundary_label ( + h5_file * const f, const char * const bname ) { return -1; } +h5_err_t +h5t_get_boundary_label ( + h5_file * const f, + char * const boundary_name, + const size_t size + ) { + return -1; +} + +h5_err_t +h5t_open_boundary ( + h5_file * const f, + const h5_id_t boundary_id + ) { + struct h5t_fdata *t = &f->t; + boundary_t *boundary = &t->boundary; + + TRY( h5t_close_boundary ( f ), error_exit ); + + if ( t->num_boundaries < 0 ) { + TRY( h5t_get_num_boundaries ( f ), error_exit ); + } + if ( (boundary_id < -1) || (boundary_id >= t->num_boundaries) ) { + return HANDLE_H5_OUT_OF_RANGE_ERR( "boundary", boundary_id ); + } + if ( boundary_id == -1 ) { /* append new boundary */ + boundary->id = t->num_boundaries++; + boundary->changed = boundary_id; + } else { + boundary->id = boundary_id; + } + snprintf ( boundary->name, sizeof (boundary->name), + "%d", boundary->id ); + TRY( _open_boundary_group ( f ), error_exit ); + + return H5_SUCCESS; +error_exit: + return h5_get_errno(); +} + +h5_err_t +h5t_open_boundary_with_label ( + h5_file * const f, + const char * const boundary_label + ) { + return -1; +} + +h5_err_t +_h5t_read_boundaryfaces ( + h5_file * const f + ) { + struct h5t_fdata *t = &f->t; + boundary_t *boundary = &t->boundary; + + const char * const dataset_name = "Faces"; + hid_t dataset_id = H5Dopen ( boundary->gid, dataset_name, H5P_DEFAULT ); + if ( dataset_id < 0 ) + return HANDLE_H5D_OPEN_ERR ( dataset_name ); + + hid_t diskspace_id = H5Dget_space(dataset_id); + if ( diskspace_id < 0 ) return (hid_t)HANDLE_H5D_GET_SPACE_ERR; + + h5_id_t num_faces = H5Sget_simple_extent_npoints ( diskspace_id ); + if ( num_faces < 0 ) + return HANDLE_H5S_GET_SIMPLE_EXTENT_NPOINTS_ERR; + + herr_t herr = H5Sclose ( diskspace_id ); + if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR; + + herr = H5Dclose ( dataset_id ); + if ( herr < 0 ) return HANDLE_H5D_CLOSE_ERR; + + h5t_add_num_boundaryfaces ( f, num_faces ); + + h5_err_t h5err = _h5_read_dataset ( + f, + dataset_id, + H5T_NATIVE_INT32, + H5S_ALL, + H5S_ALL, + boundary->faces ); + if ( h5err < 0 ) return h5err; + + herr = H5Dclose ( dataset_id ); + if ( herr < 0 ) return HANDLE_H5D_CLOSE_ERR; + + return H5_SUCCESS; +} + +h5_err_t +_h5t_write_boundary ( + h5_file * const f + ) { + struct h5t_fdata *t = &f->t; + boundary_t *boundary = &t->boundary; + + hsize_t maxdim = H5S_UNLIMITED; + + return _h5t_write_obj ( + f, + boundary->gid, + boundary->num_faces[0], + maxdim, + H5T_NATIVE_INT32, + (void*)boundary->faces, + "Faces" + ); +} + +h5_err_t +h5t_close_boundary ( + h5_file * const f + ) { + struct h5t_fdata *t = &f->t; + boundary_t *boundary = &t->boundary; + + if ( boundary->changed ) { + h5_err_t h5err = _h5t_write_boundary ( f ); + if ( h5err < 0 ) return h5err; + } + if ( boundary->faces ) free ( boundary->faces ); + if ( boundary->lfaces ) free ( boundary->faces ); + if ( boundary->num_faces ) free ( boundary->num_faces ); + if ( boundary->num_faces_on_level ) free ( boundary->num_faces_on_level ); + + bzero ( boundary, sizeof(*boundary) ); + + TRY( _h5_close_group( boundary->gid ), exception); + + boundary->id = -1; + boundary->gid = -1; + boundary->last_accessed_face = -1; + + return H5_SUCCESS; +exception: + return h5_get_errno(); +} + +h5_err_t +h5t_add_num_boundaryfaces ( + h5_file * const f, + const h5_id_t num_faces + ) { + struct h5t_fdata *t = &f->t; + boundary_t *boundary = &t->boundary; + + boundary->num_faces = realloc ( + boundary->num_faces, + t->num_levels*sizeof(boundary->num_faces[0]) ); + boundary->num_faces_on_level = realloc ( + boundary->num_faces_on_level, + t->num_levels*sizeof(boundary->num_faces_on_level[0]) ); + boundary->faces = realloc ( + boundary->faces, + num_faces*sizeof(boundary->faces[0]) ); + boundary->lfaces = realloc ( + boundary->lfaces, + num_faces*sizeof(boundary->lfaces[0]) ); + if ( boundary->num_faces == NULL || + boundary->num_faces_on_level == NULL || + boundary->faces == NULL || + boundary->lfaces == NULL ) { + return HANDLE_H5_NOMEM_ERR; + } + memset ( boundary->num_faces, + 0, t->num_levels*sizeof(boundary->num_faces[0]) ); + memset ( boundary->num_faces_on_level, + 0, t->num_levels*sizeof(boundary->num_faces_on_level[0]) ); + memset ( boundary->faces, + -1, num_faces*sizeof(boundary->faces[0]) ); + memset ( + boundary->lfaces, + 0, num_faces*sizeof(boundary->lfaces[0]) ); + boundary->num_faces[0] = num_faces; + boundary->last_accessed_face = -1; + + return H5_SUCCESS; +} + +/*! + Number of boundary faces in current level +*/ +h5_id_t +h5t_get_num_boundaryfaces ( + h5_file * const f + ) { + return -1; +} + +h5_id_t +h5t_store_boundaryface ( + h5_file * const f, + h5_id_t * const global_vids + ) { + struct h5t_fdata *t = &f->t; + + if ( t->vertices == NULL ) { + h5_err_t h5err = _h5t_read_mesh ( f ); + if ( h5err < 0 ) return h5err; + } + + switch ( t->mesh_type ) { + case H5_OID_TETRAHEDRON: { + h5_id_t local_vids[3]; + h5_err_t h5err = h5t_map_global_vertex_ids2local ( + f, global_vids, 3, local_vids ); + if ( h5err < 0 ) return h5err; + h5_id_t local_tid = h5t_get_local_triangle_id ( f, local_vids ); + if ( local_tid < 0 ) + return _h5t_error_local_triangle_id_nexist( local_vids ); + return h5t_store_boundaryface_local_id ( f, local_tid ); + } + default: + return -1; + } +} + +h5_id_t +h5t_store_boundaryface_global_id ( + h5_file * const f, + const h5_id_t global_fid + ) { + struct h5t_fdata *t = &f->t; + + switch ( t->mesh_type ) { + case H5_OID_TETRAHEDRON: { + h5_id_t local_tid = h5t_map_global_triangle_id2local ( + f, global_fid ); + if ( local_tid < 0 ) return local_tid; + return h5t_store_boundaryface_local_id ( f, local_tid ); + } + default: + return -1; + } +} + +h5_id_t +h5t_store_boundaryface_local_id ( + h5_file * const f, + const h5_id_t local_fid + ) { + struct h5t_fdata *t = &f->t; + boundary_t *boundary = &t->boundary; + + if ( boundary->num_faces == NULL ) + return HANDLE_H5_OVERFLOW_ERR ( + "boundary faces", + -1 ); + if ( ++(boundary->last_accessed_face) >= boundary->num_faces[0] ) + return HANDLE_H5_OVERFLOW_ERR ( + "boundary faces", + boundary->num_faces[0] ); + + switch ( t->mesh_type ) { + case H5_OID_TETRAHEDRON: { + h5_id_t local_tet_id = local_fid & H5_TET_MASK; + if ( t->entities.tets[local_tet_id].parent_id != -1 ) { + return _h5t_error_store_boundaryface_local_id ( + local_fid ); + } + h5_id_t global_tid = h5t_map_local_triangle_id2global( + f, local_fid ); + boundary->faces[boundary->last_accessed_face] = global_tid; + return H5_SUCCESS; + } + default: + return -1; + } +} + +h5_err_t +h5t_start_traverse_boundary_faces ( + h5_file * const f + ) { + struct h5t_fdata *t = &f->t; + boundary_t *boundary = &t->boundary; + + if ( boundary->faces == NULL ) { + TRY( _h5t_read_boundaryfaces ( f ), error_exit ); + } + boundary->last_accessed_face = -1; +error_exit: + return h5_get_errno(); +} + +h5_id_t +h5t_traverse_boundary_faces ( + h5_file * const f, + h5_id_t * const global_id, + h5_id_t * const parent_id, + h5_id_t vertex_ids[] + ) { + return -1; +} diff --git a/src/h5_core/h5t_boundaries.h b/src/h5_core/h5t_boundaries.h index 2a74c7b..53bfa36 100644 --- a/src/h5_core/h5t_boundaries.h +++ b/src/h5_core/h5t_boundaries.h @@ -1,10 +1,56 @@ -#ifndef __T_BOUNDARIES_H -#define __T_BOUNDARIES_H +#ifndef __H5T_BOUNDARIES_H +#define __H5T_BOUNDARIES_H h5_err_t -h5t_add_boundary ( - h5_file *f, - const char * const bname +h5t_open_boundary ( + h5_file * const f, + const h5_id_t boundary_id ); +h5_err_t +h5t_close_boundary ( + h5_file * const f + ); + +h5_err_t +h5t_add_num_boundaryfaces ( + h5_file * const f, + const h5_id_t num + ); + +h5_id_t +h5t_get_num_boundaryfaces ( + h5_file * const f + ); + +h5_id_t +h5t_store_boundaryface ( + h5_file * const f, + h5_id_t * const vertices + ); + +h5_id_t +h5t_store_boundaryface_global_id ( + h5_file * const f, + const h5_id_t global_fid + ); + +h5_id_t +h5t_store_boundaryface_local_id ( + h5_file * const f, + const h5_id_t local_fid + ); + +h5_err_t +h5t_start_traverse_boundary_faces ( + h5_file * const f + ); + +h5_id_t +h5t_traverse_boundary_faces ( + h5_file * const f, + h5_id_t * const global_id, + h5_id_t * const parent_id, + h5_id_t vertex_ids[] + ); #endif diff --git a/src/h5_core/h5t_errorhandling.c b/src/h5_core/h5t_errorhandling.c index 937dc21..f580267 100644 --- a/src/h5_core/h5t_errorhandling.c +++ b/src/h5_core/h5t_errorhandling.c @@ -7,7 +7,15 @@ #include #include "h5_core.h" -#include "h5_private.h" +#include "h5_core_private.h" + +const char * H5_OID_NAMES[] = { + "N.N.", + "vertex", + "edge", + "triangle", + "tetrahedron" +}; h5_err_t _h5t_handle_get_global_entity_id_err ( @@ -16,12 +24,13 @@ _h5t_handle_get_global_entity_id_err ( ) { struct h5t_fdata *t = &f->t; switch ( t->mesh_type ) { - case TETRAHEDRAL_MESH: - return _h5t_handle_get_global_tet_id_err ( global_vids ); - case TRIANGLE_MESH: - return _h5t_handle_get_global_tri_id_err ( global_vids ); + case H5_OID_TETRAHEDRON: + return _h5t_error_global_tet_id_nexist ( global_vids ); + case H5_OID_TRIANGLE: + return _h5t_error_global_tri_id_nexist ( global_vids ); + default: + return h5_error_internal( __FILE__, __func__, __LINE__ ); } - return -1; } h5_err_t @@ -31,11 +40,34 @@ _h5t_handle_get_local_entity_id_err ( ) { struct h5t_fdata *t = &f->t; switch ( t->mesh_type ) { - case TETRAHEDRAL_MESH: - return _h5t_handle_get_local_tet_id_err ( local_vids ); - case TRIANGLE_MESH: - return _h5t_handle_get_local_triangle_id_err ( local_vids ); + case H5_OID_TETRAHEDRON: + return _h5t_error_local_tet_id_nexist ( local_vids ); + case H5_OID_TRIANGLE: + return _h5t_error_local_triangle_id_nexist ( local_vids ); + default: + return h5_error_internal( __FILE__, __func__, __LINE__ ); + } +} + +h5_err_t +_h5t_error_illegal_object_type ( + h5_file_t * const f, + h5_oid_t oid ) { + struct h5t_fdata *t = &f->t; + switch ( t->mesh_type ) { + case H5_OID_TETRAHEDRON: + return h5_error_internal( __FILE__, __func__, __LINE__ ); + case H5_OID_TRIANGLE: + switch ( oid ) { + case H5_OID_TETRAHEDRON: + return h5_error ( + H5_ERR_INVAL, + "Illegal topological entity tetrahedron" + " in triangle mesh." ); + default: + return h5_error_internal( __FILE__, __func__, __LINE__ ); + } + default: + return h5_error_internal( __FILE__, __func__, __LINE__ ); } - return -1; } - diff --git a/src/h5_core/h5t_errorhandling_private.h b/src/h5_core/h5t_errorhandling_private.h index e5f1107..d203ac2 100644 --- a/src/h5_core/h5t_errorhandling_private.h +++ b/src/h5_core/h5t_errorhandling_private.h @@ -1,5 +1,6 @@ -#ifndef __T_ERRORHANDLING_H -#define __T_ERRORHANDLING_H +#ifndef __H5T_ERRORHANDLING_PRIVATE_H +#define __H5T_ERRORHANDLING_PRIVATE_H + h5_err_t _h5t_handle_get_global_entity_id_err ( @@ -13,53 +14,62 @@ _h5t_handle_get_local_entity_id_err ( const h5_id_t * const local_vids ); -#define H5T_HANDLE_GID_NOT_EXIST_ERR( name, id ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_NOENTRY, \ - "Global %s id %ld does not exist!", \ +h5_err_t +_h5t_error_illegal_object_type ( + h5_file_t * const f, + h5_oid_t oid ); + +#define _h5t_error_undef_mesh( f ) \ + h5_error( \ + H5_ERR_INVAL, \ + "Mesh not yet defined." ); + +#define _h5t_error_undef_level( f ) \ + h5_error( \ + H5_ERR_INVAL, \ + "Level not yet defined." ); + +#define _h5t_error_global_id_nexist( name, id ) \ + h5_error( \ + H5_ERR_NOENTRY, \ + "%s with global id %ld does not exist!", \ name, (long)id ); -#define _h5t_handle_global_id_not_exist_err( name, id ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_NOENTRY, \ - "%s with global id %ld does not exist!", \ - name, (long)id ); -#define _h5t_handle_get_global_tet_id_err( vids ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ +#define _h5t_error_global_tet_id_nexist( vids ) \ + h5_error( \ H5_ERR_NOENTRY, \ "Tetrahedron with global vertex ids (%d,%d,%d,%d) doesn't exist!", \ vids[0], vids[1], vids[2], vids[3] ); -#define _h5t_handle_get_global_tri_id_err( vids ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_NOENTRY, \ +#define _h5t_error_global_tri_id_nexist( vids ) \ + h5_error( \ + H5_ERR_NOENTRY, \ "Triangle with global vertex ids (%d,%d,%d) doesn't exist!", \ vids[0], vids[1], vids[2] ); -#define _h5t_handle_get_local_tet_id_err( vids ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_NOENTRY, \ +#define _h5t_error_local_tet_id_nexist( vids ) \ + h5_error( \ + H5_ERR_NOENTRY, \ "Tetrahedron with local vertex ids (%d,%d,%d,%d) doesn't exist!", \ vids[0], vids[1], vids[2], vids[3] ); -#define _h5t_handle_get_local_triangle_id_err( vids ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ +#define _h5t_error_local_triangle_id_nexist( vids ) \ + h5_error( \ H5_ERR_NOENTRY, \ "Triangle with local vertex ids (%d,%d,%d) doesn't exist!", \ vids[0], vids[1], vids[2] ); -#define _h5t_handle_get_global_triangle_id_err( vids ) \ - (*h5_get_errorhandler()) ( \ - h5_get_funcname(), \ - H5_ERR_NOENTRY, \ +#define _h5t_error_global_triangle_id_nexist( vids ) \ + h5_error( \ + H5_ERR_NOENTRY, \ "Triangle with global vertex ids (%d,%d,%d) doesn't exist!", \ vids[0], vids[1], vids[2] ); +#define _h5t_error_store_boundaryface_local_id( local_fid ) \ + h5_error( \ + H5_ERR_INVAL, \ + "Boundary face with local id %d is not on level 0!", \ + local_fid ); + #endif diff --git a/src/h5_core/h5t_map.c b/src/h5_core/h5t_map.c index 7c8f5e8..8f7d71a 100644 --- a/src/h5_core/h5t_map.c +++ b/src/h5_core/h5t_map.c @@ -1,8 +1,67 @@ #include -#include "h5/h5_core.h" -#include "h5/h5_private.h" -#include "h5/t_map.h" +#include "h5_core/h5_core.h" +#include "h5_core/h5_core_private.h" + +/*! + Compare to vertices given by their 3-dimensional coordinates +*/ +static int +_cmp_vertices ( + h5_float64_t *P1, + h5_float64_t *P2 + ) { + int i; + for ( i = 0; i < 3; i++ ) { + if ( P1[i] < P2[i] ) return -1; + else if (P1[i] > P2[i] )return 1; + } + return 0; +} + +static int +_qsort_cmp_vertices ( + void * _f, + const void* _local_vid1, + const void* _local_vid2 + ) { + h5_file *f = (h5_file*)_f; + h5_id_t local_vid1 = *(h5_id_t*)_local_vid1; + h5_id_t local_vid2 = *(h5_id_t*)_local_vid2; + + return _cmp_vertices ( + f->t.vertices[local_vid1].P, + f->t.vertices[local_vid2].P ); +} + + +/*! + We assume that the number of vertices is already known. +*/ +h5_err_t +_h5t_sort_vertices ( + h5_file_t * const f + ) { + + struct h5t_fdata *t = &f->t; + h5_id_t num_vertices = t->num_vertices[t->num_levels-1]; + + h5_id_t i; + for ( i = 0; i < num_vertices; i++ ) { + t->sorted_lvertices.items[i] = i; + } + t->sorted_lvertices.num_items = num_vertices; + + _h5_qsort_r ( + t->sorted_lvertices.items, + num_vertices, + sizeof(t->sorted_lvertices.items[0]), + f, + _qsort_cmp_vertices ); + + return H5_SUCCESS; +} + /*! Returns the local vertex id of the i-th vertex of an entity. For triangles @@ -21,7 +80,7 @@ _get_local_vertex_id_of_entity ( h5_id_t global_vid = -1; switch ( t->mesh_type ) { - case TETRAHEDRAL_MESH: { + case H5_OID_TETRAHEDRON: { local_vid = t->lentities.tets[local_eid].vertex_ids[ith_vertex]; if ( local_vid == -1 ) { global_vid = @@ -33,7 +92,7 @@ _get_local_vertex_id_of_entity ( } break; } - case TRIANGLE_MESH: { + case H5_OID_TRIANGLE: { local_vid = t->lentities.tris[local_eid].vertex_ids[ith_vertex]; if ( local_vid == -1 ) { global_vid = @@ -45,6 +104,8 @@ _get_local_vertex_id_of_entity ( } break; } + default: + return h5_error_internal ( __FILE__, __func__, __LINE__ ); } return local_vid; } @@ -69,21 +130,7 @@ _get_vertex_of_entity ( return t->vertices[local_vid].P; } -/*! - Compare to vertices given by their 3-dimensional coordinates -*/ -static int -_cmp_vertices ( - h5_float64_t *P1, - h5_float64_t *P2 - ) { - int i; - for ( i = 0; i < 3; i++ ) { - if ( P1[i] < P2[i] ) return -1; - else if (P1[i] > P2[i] )return 1; - } - return 0; -} + /*! Compare two entities given by their local vertex ids @@ -147,29 +194,36 @@ _cmp_entities1 ( return 0; } -/* - The re-rentrant version of qsort(3) is not available on many systems, thus ... -*/ -static h5_file *_f; + static int -_qsort_cmp_entities0 ( const void* _local_eid1, const void* _local_eid2 ) { +_qsort_cmp_entities0 ( + void *_f, + const void* _local_eid1, + const void* _local_eid2 + ) { + h5_file_t *f = (h5_file_t*)_f; h5_id_t local_eid1 = *(h5_id_t*)_local_eid1; h5_id_t local_eid2 = *(h5_id_t*)_local_eid2; - return _cmp_entities ( _f, local_eid1, local_eid2 ); + return _cmp_entities ( f, local_eid1, local_eid2 ); } static int -_qsort_cmp_entities1 ( const void* _local_eid1, const void* _local_eid2 ) { +_qsort_cmp_entities1 ( + void *_f, + const void* _local_eid1, + const void* _local_eid2 + ) { + h5_file_t *f = (h5_file_t*)_f; h5_id_t local_eid1 = *(h5_id_t*)_local_eid1; h5_id_t local_eid2 = *(h5_id_t*)_local_eid2; - return _cmp_entities1 ( _f, local_eid1, local_eid2 ); + return _cmp_entities1 ( f, local_eid1, local_eid2 ); } /*! Sort entities geometrically. */ -static h5_err_t -_sort_entities ( +h5_err_t +_h5t_sort_entities ( h5_file *f ) { @@ -189,14 +243,17 @@ _sort_entities ( t->sorted_lentities[k].num_items = num_entities; } - _f = f; - qsort ( t->sorted_lentities[0].items, + _h5_qsort_r ( + t->sorted_lentities[0].items, num_entities, sizeof(t->sorted_lentities[0].items[0]), + f, _qsort_cmp_entities0 ); - qsort ( t->sorted_lentities[1].items, + _h5_qsort_r ( + t->sorted_lentities[1].items, num_entities, sizeof(t->sorted_lentities[1].items[0]), + f, _qsort_cmp_entities1 ); return H5_SUCCESS; @@ -290,28 +347,6 @@ _search_entity ( return -(low+1); // not found } -h5_err_t -_h5t_read_mesh ( - h5_file *f - ) { - struct h5t_fdata *t = &f->t; - - if ( t->vertices == NULL ) { - h5_err_t h5err = _h5t_read_vertices ( f ); - if ( h5err < 0 ) return h5err; - } - - if ( t->entities.data == NULL ) { - h5_err_t h5err = _h5t_read_entities ( f ); - if ( h5err < 0 ) return h5err; - } - - if ( t->sorted_lentities[0].items == NULL ) { - _sort_entities ( f ); - } - return H5_SUCCESS; -} - /*! Get local id of entity given by local vertex id's */ @@ -342,7 +377,7 @@ h5t_map_global_vertex_id2local ( h5_id_t local_id = _h5_search_idmap ( &t->map_vertex_g2l, global_id ); if ( local_id < 0 ) - return _h5t_handle_global_id_not_exist_err ("vertex", global_id ); + return _h5t_error_global_id_nexist ("vertex", global_id ); return local_id; } @@ -371,7 +406,7 @@ h5t_map_global_vertex_ids2local ( local_vids[i] = h5t_map_global_vertex_id2local ( f, global_vids[i] ); if ( local_vids[i] < 0 ) - return _h5t_handle_global_id_not_exist_err ( + return _h5t_error_global_id_nexist ( "vertex", global_vids[i] ); } return H5_SUCCESS; @@ -388,16 +423,17 @@ h5t_map_local_entity_id2global ( struct h5t_fdata *t = &f->t; switch ( t->mesh_type ) { - case TETRAHEDRAL_MESH: + case H5_OID_TETRAHEDRON: if ( local_eid < 0 || local_eid > t->num_entities[t->num_levels-1] ) return HANDLE_H5_OUT_OF_RANGE_ERR ( "tet", local_eid ); return t->entities.tets[local_eid].id; - case TRIANGLE_MESH: + case H5_OID_TRIANGLE: if ( local_eid < 0 || local_eid > t->num_entities[t->num_levels-1] ) return HANDLE_H5_OUT_OF_RANGE_ERR ( "triangle", local_eid ); return t->entities.tris[local_eid].id; + default: + return h5_error_internal ( __FILE__, __func__, __LINE__ ); } - return -1; } /*! @@ -571,20 +607,21 @@ h5t_get_global_triangle_id ( } switch ( t->mesh_type ) { - case TETRAHEDRAL_MESH: { + case H5_OID_TETRAHEDRON: { h5_id_t local_vids[3]; h5_err_t h5err = h5t_map_global_vertex_ids2local ( f, global_vids, 3, local_vids ); if ( h5err < 0 ) return h5err; h5_id_t local_tid = h5t_get_local_triangle_id ( f, local_vids ); if ( local_tid < 0 ) - return _h5t_handle_get_global_triangle_id_err( global_vids ); + return _h5t_error_global_triangle_id_nexist ( global_vids ); return h5t_map_local_triangle_id2global ( f, local_tid ); } - case TRIANGLE_MESH: + case H5_OID_TRIANGLE: return h5t_get_global_entity_id ( f, global_vids ); + default: + return h5_error_internal ( __FILE__, __func__, __LINE__ ); } - return -1; } /*! @@ -598,33 +635,20 @@ h5t_get_local_triangle_id ( struct h5t_fdata *t = &f->t; switch ( t->mesh_type ) { - case TETRAHEDRAL_MESH: { - struct h5t_fdata *t = &f->t; - - if ( t->vertices == NULL ) { - h5_err_t h5err = _h5t_read_vertices ( f ); - if ( h5err < 0 ) return h5err; - } - - if ( t->entities.data == NULL ) { - h5_err_t h5err = _h5t_read_entities ( f ); - if ( h5err < 0 ) return h5err; - } - - if ( t->sorted_lentities[0].items == NULL ) { - _sort_entities ( f ); - } + case H5_OID_TETRAHEDRON: { + h5_err_t h5err = _h5t_read_mesh ( f ); + if ( h5err < 0 ) return h5err; h5_id_t local_tid = _tetm_search_triangle ( f, local_vids ); if ( local_tid == -1 ) { - return _h5t_handle_get_local_triangle_id_err ( - local_vids ); + return _h5t_error_local_triangle_id_nexist(local_vids); } return local_tid; } - case TRIANGLE_MESH: + case H5_OID_TRIANGLE: return h5t_get_local_entity_id ( f, local_vids ); + default: + return h5_error_internal ( __FILE__, __func__, __LINE__ ); } - return -1; } h5_id_t @@ -635,7 +659,7 @@ h5t_map_global_entity_id2local ( struct h5t_fdata *t = &f->t; h5_id_t local_eid = _h5_search_idmap ( &t->map_entity_g2l, global_eid ); if ( local_eid < 0 ) - return _h5t_handle_global_id_not_exist_err ( "entity", global_eid ); + return _h5t_error_global_id_nexist ( "entity", global_eid ); return local_eid; } @@ -651,19 +675,20 @@ h5t_map_global_triangle_id2local ( ) { struct h5t_fdata *t = &f->t; switch ( t->mesh_type ) { - case TETRAHEDRAL_MESH: { + case H5_OID_TETRAHEDRON: { h5_id_t global_tet_id = global_tri_id & H5_TET_MASK; h5_id_t local_tet_id = h5t_map_global_entity_id2local ( f, global_tet_id ); if ( local_tet_id < 0 ) - return _h5t_handle_global_id_not_exist_err ( + return _h5t_error_global_id_nexist ( "triangle", global_tri_id ); return local_tet_id | (global_tri_id & ~H5_TET_MASK); } - case TRIANGLE_MESH: + case H5_OID_TRIANGLE: return h5t_map_global_entity_id2local ( f, global_tri_id ); + default: + return h5_error_internal ( __FILE__, __func__, __LINE__ ); } - return -1; } /*! @@ -678,7 +703,7 @@ h5t_map_local_triangle_id2global ( ) { struct h5t_fdata *t = &f->t; switch ( t->mesh_type ) { - case TETRAHEDRAL_MESH: { + case H5_OID_TETRAHEDRON: { h5_id_t local_tet_id = local_tri_id & H5_TET_MASK; h5_id_t global_tet_id = h5t_map_local_entity_id2global ( f, local_tet_id ); @@ -687,8 +712,9 @@ h5t_map_local_triangle_id2global ( "triangle", local_tri_id ); return global_tet_id | (local_tri_id & ~H5_TET_MASK); } - case TRIANGLE_MESH: + case H5_OID_TRIANGLE: return h5t_map_local_entity_id2global ( f, local_tri_id ); + default: + return h5_error_internal ( __FILE__, __func__, __LINE__ ); } - return -1; } diff --git a/src/h5_core/h5t_map_private.h b/src/h5_core/h5t_map_private.h index 6f4ea2f..25e544b 100644 --- a/src/h5_core/h5t_map_private.h +++ b/src/h5_core/h5t_map_private.h @@ -3,16 +3,26 @@ h5_err_t _h5t_sort_global_vertex_ids ( - h5_file * const f, + h5_file_t * const f, h5_id_t * const global_vids, const h5_size_t size ); h5_err_t _h5t_sort_local_vertex_ids ( - h5_file * const f, + h5_file_t * const f, h5_id_t * const local_vids, const h5_size_t size ); +h5_err_t +_h5t_sort_vertices ( + h5_file_t * const f + ); + +h5_err_t +_h5t_sort_entities ( + h5_file_t * const f + ); + #endif diff --git a/src/h5_core/h5t_openclose.c b/src/h5_core/h5t_openclose.c index 7797d8d..32f3db3 100644 --- a/src/h5_core/h5t_openclose.c +++ b/src/h5_core/h5t_openclose.c @@ -7,9 +7,8 @@ #include #include -#include "h5/h5_core.h" -#include "h5/h5_private.h" -#include "H5Part.h" +#include "h5_core/h5_core.h" +#include "h5_core/h5_core_private.h" /* create several HDF5 types @@ -21,28 +20,28 @@ _create_array_types ( struct h5t_fdata *t = &f->t; hsize_t dims[1] = { 3 }; - hid_t hid = H5Tarray_create ( H5T_NATIVE_DOUBLE, 1, dims, NULL); + hid_t hid = H5Tarray_create ( H5T_NATIVE_DOUBLE, 1, dims ); if ( hid < 0 ) { return HANDLE_H5T_ARRAY_CREATE_ERR ( "H5T_NATIVE_DOUBLE", 1 ); } t->float64_3tuple_tid = hid; dims[0] = 2; - hid = H5Tarray_create ( H5T_NATIVE_INT32, 1, dims, NULL ); + hid = H5Tarray_create ( H5T_NATIVE_INT32, 1, dims ); if ( hid < 0 ) { return HANDLE_H5T_ARRAY_CREATE_ERR ( "H5T_NATIVE_INT32", 1 ); } t->int32_2tuple_tid = hid; dims[0] = 3; - hid = H5Tarray_create ( H5T_NATIVE_INT32, 1, dims, NULL ); + hid = H5Tarray_create ( H5T_NATIVE_INT32, 1, dims ); if ( hid < 0 ) { return HANDLE_H5T_ARRAY_CREATE_ERR ( "H5T_NATIVE_INT32", 1 ); } t->int32_3tuple_tid = hid; dims[0] = 4; - hid = H5Tarray_create ( H5T_NATIVE_INT32, 1, dims, NULL ); + hid = H5Tarray_create ( H5T_NATIVE_INT32, 1, dims ); if ( hid < 0 ) { return HANDLE_H5T_ARRAY_CREATE_ERR ( "H5T_NATIVE_INT32", 1 ); } @@ -221,6 +220,8 @@ _h5t_init_fdata ( t->topo_gid = -1; t->meshes_gid = -1; t->mesh_gid = -1; + + t->num_boundaries = -1; return H5_SUCCESS; } @@ -241,7 +242,6 @@ _h5t_open_file ( ) { h5_err_t h5err = H5_SUCCESS;; - f->t.new_mesh = -1; if (( h5err = _h5t_init_fdata ( f )) < 0 ) return h5err; if (( h5err = _create_array_types ( f )) < 0 ) return h5err; @@ -273,3 +273,220 @@ _h5t_close_file ( return h5err; } + +h5_err_t +_h5t_init_step ( + h5_file_t * const f + ) { + + return H5_SUCCESS; +} + +/* + - write data + - close HDF5 objects we cannot reuse + - free memory +*/ +h5_err_t +_h5t_close_step ( + h5_file * f + ) { + + return H5_SUCCESS; +} + + +h5_err_t +_h5t_open_topo_group ( + h5_file_t * const f + ) { + struct h5t_fdata *t = &f->t; + + t->topo_gid = _h5_open_group ( f, f->root_gid, H5T_CONTAINER_GRPNAME ); + return t->topo_gid; +} + +h5_err_t +_h5t_open_meshes_group ( + h5_file_t * const f + ) { + struct h5t_fdata *t = &f->t; + + if ( t->topo_gid < 0 ) { + h5_err_t h5err = _h5t_open_topo_group ( f ); + if ( h5err < 0 ) return h5err; + } + switch ( t->mesh_type) { + case H5_OID_TETRAHEDRON: + t->meshes_gid = _h5_open_group ( f, t->topo_gid, "TetMeshes" ); + break; + case H5_OID_TRIANGLE: + t->meshes_gid = _h5_open_group ( f, t->topo_gid, "TriangleMeshes" ); + break; + default: + t->meshes_gid = -1; + } + return (h5_err_t)t->meshes_gid; +} + +h5_err_t +_h5t_open_mesh_group ( + h5_file_t * const f + ) { + struct h5t_fdata *t = &f->t; + + if ( t->meshes_gid < 0 ) { + h5_err_t h5err = _h5t_open_meshes_group ( f ); + if ( h5err < 0 ) return h5err; + } + t->mesh_gid = _h5_open_group ( f, t->meshes_gid, t->mesh_name ); + return (h5_err_t)t->mesh_gid; +} + +/* + If the value of parameter \c id is \c -1, a new mesh will be appended. +*/ +h5_err_t +h5t_open_mesh ( + h5_file_t * const f, + h5_id_t id, + const h5_oid_t type + ) { + struct h5t_fdata *t = &f->t; + + h5_err_t h5err = _h5t_close_mesh ( f ); + if ( h5err < 0 ) return h5err; + + if ( t->num_meshes < 0 ) { + h5_size_t result = h5t_get_num_meshes ( f, type ); + t->num_meshes = ( result > 0 ? result : 0 ); + } + if ( (id < -1) || (id >= t->num_meshes) ) { + return HANDLE_H5_OUT_OF_RANGE_ERR( "mesh", id ); + } + if ( id == -1 ) { /* append new mesh */ + id = t->num_meshes; + } + t->mesh_type = type; + snprintf ( t->mesh_name, sizeof (t->mesh_name), "%d", id ); + + switch( type ) { + case H5_OID_TETRAHEDRON: + t->entity_tid = t->tet_tid; + break; + case H5_OID_TRIANGLE: + t->entity_tid = t->triangle_tid; + break; + default: + return -1; + } + + h5err = _h5t_open_mesh_group ( f ); + if ( h5err < 0 ) return h5err; + + t->cur_mesh = id; + + if ( id != t->num_meshes ) { /* open existing */ + t->num_levels = h5t_get_num_levels ( f ); + if ( t->num_levels < 0 ) return t->num_levels; + } else { /* append new */ + t->num_meshes++; + t->mesh_changed = id; + t->num_levels = 0; + } + + return H5_SUCCESS; +} + +static h5_err_t +_close_hdf5_objs ( + h5_file_t * const f + ) { + + + return H5_SUCCESS; +} + +static h5_err_t +_release_memory ( + h5_file_t * const f + ) { + struct h5t_fdata *t = &f->t; + + if ( t->num_vertices ) { + free ( t->num_vertices ); + } + t->num_vertices = NULL; + + if ( t->num_entities ) { + free ( t->num_entities ); + } + t->num_entities = NULL; + + if ( t->num_entities_on_level ) { + free ( t->num_entities_on_level ); + } + t->num_entities_on_level = NULL; + + if ( t->map_vertex_g2l.items ) { + free ( t->map_vertex_g2l.items ); + } + t->map_vertex_g2l.items = NULL; + + if ( t->map_entity_g2l.items ) { + free ( t->map_entity_g2l.items ); + } + t->map_entity_g2l.items = NULL; + + if ( t->vertices ) { + free ( t->vertices ); + } + t->vertices = NULL; + + if ( t->entities.data ) { + free ( t->entities.data ); + } + t->entities.data = NULL; + + return H5_SUCCESS; +} + +h5_err_t +_h5t_close_mesh ( + h5_file_t * const f /*!< file handle */ + ) { + + h5_err_t h5err = H5_SUCCESS; + + h5err = _h5t_write_mesh ( f ); + if ( h5err < 0 ) return h5err; + + h5err = _close_hdf5_objs ( f ); + if ( h5err < 0 ) return h5err; + + h5err = _release_memory ( f ); + if ( h5err < 0 ) return h5err; + + h5err = h5t_close_boundary ( f ); + if ( h5err < 0 ) return h5err; + + if (( h5err = _h5t_init_fdata ( f )) < 0 ) return h5err; + + return h5err; +} + +h5_err_t +h5t_open_level ( + h5_file_t * const f, + const h5_id_t id + ) { + struct h5t_fdata *t = &f->t; + + if ( (id < 0) || (id >= t->num_levels) ) + return HANDLE_H5_OUT_OF_RANGE_ERR ( "Level", id ); + t->cur_level = id; + t->last_retrieved_vertex_id = -1; + t->last_retrieved_entity_id = -1; + + return H5_SUCCESS; +} diff --git a/src/h5_core/h5t_openclose.h b/src/h5_core/h5t_openclose.h index 2ab8463..ce01129 100644 --- a/src/h5_core/h5t_openclose.h +++ b/src/h5_core/h5t_openclose.h @@ -3,16 +3,59 @@ h5_err_t _h5t_open_file ( - h5_file * f /*!< IN: file handle */ + h5_file_t * const f ); h5_err_t _h5t_close_file ( - h5_file *fh /*!< IN: file handle */ + h5_file_t * const f ); h5_err_t _h5t_init_fdata ( - h5_file * f + 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_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_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 16d5896..dcc3e64 100644 --- a/src/h5_core/h5t_readwrite.c +++ b/src/h5_core/h5t_readwrite.c @@ -6,134 +6,31 @@ #include #include -#include "h5_core.h" -#include "h5_private.h" +#include "h5_core/h5_core.h" +#include "h5_core/h5_core_private.h" -#include "H5Part.h" -#include "H5Block.h" -/* - Initialize required data structures only! -*/ h5_err_t -_h5t_init_step ( - h5_file * f - ) { - - return H5_SUCCESS; -} - -static hid_t -_open_group ( +_h5t_write_obj ( h5_file * f, - hid_t parent_gid, - const char * const grpname - ) { - hid_t gid; - herr_t herr = H5Gget_objinfo( - parent_gid, grpname, 1, NULL ); - - if ( herr >= 0 ) { - h5_info ( - "Opening group %s/%s.", - h5_get_objname(parent_gid), - grpname ); - gid = H5Gopen ( parent_gid, grpname ); - } else { - h5_info ( - "Creating group %s/%s.", - h5_get_objname(parent_gid), - grpname ); - gid = H5Gcreate ( parent_gid, grpname, 0 ); - } - if ( gid < 0 ) - return HANDLE_H5G_OPEN_ERR ( H5T_CONTAINER_GRPNAME ); - - return gid; -} - -static h5_err_t -_open_topo_group ( - h5_file * f - ) { - struct h5t_fdata *t = &f->t; - - t->topo_gid = _open_group ( f, f->root_gid, H5T_CONTAINER_GRPNAME ); - return t->topo_gid; -} - -static h5_err_t -_open_meshes_group ( - h5_file * f - ) { - struct h5t_fdata *t = &f->t; - - if ( t->topo_gid < 0 ) { - h5_err_t h5err = _open_topo_group ( f ); - if ( h5err < 0 ) return h5err; - } - switch ( t->mesh_type) { - case TETRAHEDRAL_MESH: - t->meshes_gid = _open_group ( f, t->topo_gid, "TetMeshes" ); - break; - case TRIANGLE_MESH: - t->meshes_gid = _open_group ( f, t->topo_gid, "TriangleMeshes" ); - break; - default: - t->meshes_gid = -1; - } - return (h5_err_t)t->meshes_gid; -} - -static h5_err_t -_open_mesh_group ( - h5_file * f - ) { - struct h5t_fdata *t = &f->t; - - if ( t->meshes_gid < 0 ) { - h5_err_t h5err = _open_meshes_group ( f ); - if ( h5err < 0 ) return h5err; - } - t->mesh_gid = _open_group ( f, t->meshes_gid, t->mesh_name ); - return (h5_err_t)t->mesh_gid; -} - -static h5_err_t -_write_obj ( - h5_file * f, - const hid_t gid, + const hid_t group_id, const hsize_t current_dims, const hsize_t max_dims, - const hid_t tid, + const hid_t type_id, const void * const object, - const char * const dsname + const char * const dataset_name ) { - hsize_t dims[1] = { current_dims }; - hsize_t maxdims[1] = { current_dims }; - /*hsize_t maxdims[1] = { max_dims };*/ - hid_t sid = H5Screate_simple ( - 1, - dims, - maxdims - ); - if ( sid < 0 ) return HANDLE_H5S_CREATE_SIMPLE_ERR ( 1 ); - - h5_err_t h5err = (h5_err_t)h5_write_data ( + h5_err_t h5err = (h5_err_t)h5_write_dataset ( f, - dsname, - object, - tid, - gid, - sid, + group_id, + dataset_name, + type_id, H5S_ALL, - H5S_ALL ); + H5S_ALL, + object ); if ( h5err < 0 ) return h5err; - herr_t herr = H5Sclose ( sid ); - if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR; - return H5_SUCCESS; } @@ -147,12 +44,12 @@ _write_vertices ( if ( t->num_vertices <= 0 ) return H5_SUCCESS; /* ???? */ if ( t->mesh_gid < 0 ) { - h5err = _open_mesh_group ( f ); + h5err = _h5t_open_mesh_group ( f ); if ( h5err < 0 ) return h5err; } hsize_t maxdim = H5S_UNLIMITED; - h5err = _write_obj ( + h5err = _h5t_write_obj ( f, t->mesh_gid, t->num_vertices[t->num_levels-1], @@ -162,7 +59,7 @@ _write_vertices ( "Vertices" ); if ( h5err < 0 ) return h5err; - return _write_obj ( + return _h5t_write_obj ( f, t->mesh_gid, t->num_levels, @@ -183,12 +80,12 @@ _write_entities ( if ( t->num_entities <= 0 ) return H5_SUCCESS; if ( t->mesh_gid < 0 ) { - h5err = _open_mesh_group ( f ); + h5err = _h5t_open_mesh_group ( f ); if ( h5err < 0 ) return h5err; } hsize_t maxdim = H5S_UNLIMITED; - h5err = _write_obj ( + h5err = _h5t_write_obj ( f, t->mesh_gid, t->num_entities[t->num_levels-1], @@ -199,7 +96,7 @@ _write_entities ( ); if ( h5err < 0 ) return h5err; - h5err = _write_obj ( + h5err = _h5t_write_obj ( f, t->mesh_gid, t->num_levels, @@ -210,7 +107,7 @@ _write_entities ( ); if ( h5err < 0 ) return h5err; - return _write_obj ( + return _h5t_write_obj ( f, t->mesh_gid, t->num_levels, @@ -221,23 +118,14 @@ _write_entities ( ); } - -/* - determine new levels - - foreach Object - - create HDF5 groups - - write data - */ -static h5_err_t -_write_data ( +h5_err_t +_h5t_write_mesh ( h5_file * f ) { struct h5t_fdata *t = &f->t; h5_err_t h5err; - if ( t->num_levels <= 0 ) return 0; - if ( t->new_mesh < 0 ) return 0; + if ( ! t->mesh_changed ) return 0; h5err = _write_vertices( f ); if ( h5err < 0 ) return h5err; @@ -247,112 +135,25 @@ _write_data ( return H5_SUCCESS; } -static h5_err_t -_close_hdf5_objs ( - h5_file * f - ) { - - - return H5_SUCCESS; -} - -static h5_err_t -_release_memory ( - h5_file * f - ) { - struct h5t_fdata *t = &f->t; - - if ( t->num_vertices ) { - free ( t->num_vertices ); - } - t->num_vertices = NULL; - - if ( t->num_entities ) { - free ( t->num_entities ); - } - t->num_entities = NULL; - - if ( t->num_entities_on_level ) { - free ( t->num_entities_on_level ); - } - t->num_entities_on_level = NULL; - - if ( t->map_vertex_g2l.items ) { - free ( t->map_vertex_g2l.items ); - } - t->map_vertex_g2l.items = NULL; - - if ( t->map_entity_g2l.items ) { - free ( t->map_entity_g2l.items ); - } - t->map_entity_g2l.items = NULL; - - if ( t->vertices ) { - free ( t->vertices ); - } - t->vertices = NULL; - - if ( t->entities.data ) { - free ( t->entities.data ); - } - t->entities.data = NULL; - - return H5_SUCCESS; -} - - -/* - - write data - - close HDF5 objects we cannot reuse - - free memory -*/ -h5_err_t -_h5t_close_step ( - h5_file * f - ) { - - return H5_SUCCESS; -} - -h5_err_t -_h5t_close_mesh ( - h5_file *f /*!< file handle */ - ) { - - h5_err_t h5err = H5_SUCCESS; - - h5err = _write_data ( f ); - if ( h5err < 0 ) return h5err; - - h5err = _close_hdf5_objs ( f ); - if ( h5err < 0 ) return h5err; - - h5err = _release_memory ( f ); - if ( h5err < 0 ) return h5err; - - if (( h5err = _h5t_init_fdata ( f )) < 0 ) return h5err; - - return h5err; -} h5_size_t h5t_get_num_meshes ( h5_file * f, - const enum h5_mesh_types type + const enum h5_oid type ) { struct h5t_fdata *t = &f->t; if ( t->topo_gid < 0 ) { - h5_err_t h5err = _open_topo_group ( f ); + h5_err_t h5err = _h5t_open_topo_group ( f ); if ( h5err < 0 ) return h5err; } switch ( type ) { - case TETRAHEDRAL_MESH: + case H5_OID_TETRAHEDRON: return (h5_size_t)h5_get_num_objects ( f->t.topo_gid, "TetMeshes", H5G_GROUP ); - case TRIANGLE_MESH: + case H5_OID_TRIANGLE: return (h5_size_t)h5_get_num_objects ( f->t.topo_gid, "TriangleMeshes", @@ -363,65 +164,6 @@ h5t_get_num_meshes ( } /* - If the value of parameter \c id is \c -1, a new mesh will be appended. - After calling this function, the number of levels is stored in the - file structure. -*/ -h5_err_t -h5t_open_mesh ( - h5_file * f, - h5_id_t id, - const enum h5_mesh_types type - ) { - struct h5t_fdata *t = &f->t; - - h5_err_t h5err = _h5t_close_mesh ( f ); - if ( h5err < 0 ) return h5err; - - if ( t->num_meshes < 0 ) { - h5_size_t result = h5t_get_num_meshes ( f, type ); - t->num_meshes = ( result > 0 ? result : 0 ); - } - if ( (id < -1) || (id >= t->num_meshes) ) { - return HANDLE_H5_OUT_OF_RANGE_ERR( "mesh", id ); - } - if ( id == -1 ) { /* append new mesh */ - id = t->num_meshes; - } - t->mesh_type = type; - snprintf ( t->mesh_name, sizeof (t->mesh_name), "%d", id ); - - switch( type ) { - case TETRAHEDRAL_MESH: - t->entity_tid = t->tet_tid; - break; - case TRIANGLE_MESH: - t->entity_tid = t->triangle_tid; - break; - default: - return -1; - } - - h5err = _open_mesh_group ( f ); - if ( h5err < 0 ) return h5err; - - t->cur_mesh = id; - - if ( id != t->num_meshes ) { /* open existing */ - t->num_levels = h5t_get_num_levels ( f ); - if ( t->num_levels < 0 ) return t->num_levels; - } else { /* append new */ - t->num_meshes++; - if ( t->new_mesh < 0 ) - t->new_mesh = id; - t->num_levels = 0; - } - - return H5_SUCCESS; -} - -/* - Number of levels: Number of elements in dataset H5T_COORD3D_NUM_ELEMS_DSNAME */ h5_size_t h5t_get_num_levels ( @@ -432,44 +174,29 @@ h5t_get_num_levels ( if ( t->num_levels >= 0 ) return t->num_levels; if ( t->cur_mesh < 0 ) { - return HANDLE_H5_UNDEF_MESH_ERR; + return _h5t_error_undef_mesh ( f ); } if ( t->mesh_gid < 0 ) { - h5err = _open_mesh_group ( f ); + h5err = _h5t_open_mesh_group ( f ); if ( h5err < 0 ) return h5err; } - hid_t dset_id = H5Dopen ( t->mesh_gid, "NumVertices" ); - if ( dset_id < 0 ) + hid_t dataset_id = H5Dopen ( t->mesh_gid, "NumVertices", H5P_DEFAULT ); + if ( dataset_id < 0 ) return HANDLE_H5D_OPEN_ERR ( "NumVertices" ); - hid_t space_id = H5Dget_space( dset_id ); - if ( space_id < 0 ) + hid_t diskspace_id = H5Dget_space( dataset_id ); + if ( diskspace_id < 0 ) return HANDLE_H5D_GET_SPACE_ERR; - hssize_t size = H5Sget_simple_extent_npoints ( space_id ); + hssize_t size = H5Sget_simple_extent_npoints ( diskspace_id ); if ( size < 0 ) return HANDLE_H5S_GET_SIMPLE_EXTENT_NPOINTS_ERR; - herr_t herr = H5Sclose ( space_id ); + herr_t herr = H5Sclose ( diskspace_id ); if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR; t->num_levels = size; return size; } -h5_err_t -h5t_open_level ( - h5_file * f, - const h5_id_t id - ) { - struct h5t_fdata *t = &f->t; - - if ( (id < 0) || (id >= t->num_levels) ) - return HANDLE_H5_OUT_OF_RANGE_ERR ( "Level", id ); - t->cur_level = id; - t->last_retrieved_vertex_id = -1; - t->last_retrieved_entity_id = -1; - - return H5_SUCCESS; -} h5_id_t h5t_get_level ( @@ -479,76 +206,6 @@ h5t_get_level ( return t->cur_level; } -h5_id_t -h5t_add_level ( - h5_file * f - ) { - struct h5t_fdata *t = &f->t; - - if ( f->mode == H5_O_RDONLY ) { - return H5_ERR_INVAL; - } - - /* t->num_levels will be set to zero on file creation(!) */ - if ( t->num_levels == -1 ) { /* unknown number of levels */ - /* determine number of levels */ - return -1; /* not implemented */ - } - t->cur_level = t->num_levels++; - - ssize_t num_bytes = t->num_levels*sizeof ( h5_size_t ); - t->num_vertices = realloc ( t->num_vertices, num_bytes ); - t->num_vertices[t->cur_level] = -1; - - t->num_entities = realloc ( t->num_entities, num_bytes ); - t->num_entities[t->cur_level] = -1; - t->num_entities_on_level = realloc ( t->num_entities_on_level, num_bytes ); - t->num_entities_on_level[t->cur_level] = -1; - - t->new_level = t->cur_level; - if ( t->cur_level == 0 ) { - /* nothing stored yet */ - t->last_stored_vertex_id = -1; - t->last_stored_entity_id = -1; - } - return t->cur_level; -} - -static h5_err_t -_alloc_num_vertices ( - h5_file * f, - const h5_size_t num_vertices - ) { - struct h5t_fdata *t = &f->t; - - ssize_t num_bytes = num_vertices*sizeof ( t->vertices[0] ); - h5_debug ( "Allocating %ld bytes.", num_bytes ); - t->vertices = realloc ( t->vertices, num_bytes ); - if ( t->vertices == NULL ) { - return HANDLE_H5_NOMEM_ERR; - } - - return _h5_alloc_idmap (&t->map_vertex_g2l, num_vertices ); -} - - -h5_err_t -h5t_add_num_vertices ( - h5_file * f, - const h5_size_t num - ) { - struct h5t_fdata *t = &f->t; - - if ( t->cur_level < 0 ) { - return HANDLE_H5_UNDEF_LEVEL_ERR; - } - ssize_t num_vertices = (t->cur_level > 0 ? - t->num_vertices[t->cur_level-1] + num : num); - t->num_vertices[t->cur_level] = num_vertices; - - return _alloc_num_vertices ( f, num_vertices ); -} - /* read everything with this function !? */ @@ -562,7 +219,7 @@ _read_dataset ( hid_t (*open_file_space)(h5_file*,hid_t), void * const data ) { - hid_t dataset_id = H5Dopen ( group_id, dataset_name ); + hid_t dataset_id = H5Dopen ( group_id, dataset_name, H5P_DEFAULT ); if ( dataset_id < 0 ) return HANDLE_H5D_OPEN_ERR ( dataset_name ); hid_t mem_space_id = (*open_mem_space)( f, dataset_id ); @@ -627,7 +284,7 @@ _read_num_vertices ( struct h5t_fdata *t = &f->t; if ( t->mesh_gid < 0 ) { - h5err = _open_mesh_group ( f ); + h5err = _h5t_open_mesh_group ( f ); if ( h5err < 0 ) return h5err; } ssize_t num_bytes = t->num_levels*sizeof ( t->num_vertices[0] ); @@ -656,7 +313,7 @@ _h5t_read_vertices ( struct h5t_fdata *t = &f->t; if ( t->mesh_gid < 0 ) { - h5err = _open_mesh_group ( f ); + h5err = _h5t_open_mesh_group ( f ); if ( h5err < 0 ) return h5err; } @@ -665,7 +322,7 @@ _h5t_read_vertices ( if ( h5err < 0 ) return h5err; } - h5err = _alloc_num_vertices ( f, t->num_vertices[t->num_levels-1] ); + h5err = _h5t_alloc_num_vertices ( f, t->num_vertices[t->num_levels-1] ); if ( h5err < 0 ) return h5err; h5err = _read_dataset ( @@ -686,6 +343,8 @@ _h5t_read_vertices ( t->map_vertex_g2l.num_items++; } _h5_sort_idmap ( &t->map_vertex_g2l ); + _h5t_sort_vertices ( f ); + return H5_SUCCESS; } @@ -696,10 +355,10 @@ h5t_get_num_vertices_on_level ( struct h5t_fdata *t = &f->t; if ( t->cur_mesh < 0 ) { - return HANDLE_H5_UNDEF_MESH_ERR; + return _h5t_error_undef_mesh ( f ); } if ( t->cur_level < 0 ) { - return HANDLE_H5_UNDEF_LEVEL_ERR; + return _h5t_error_undef_level( f ); } if ( t->num_vertices == NULL ) { h5_err_t h5err = _read_num_vertices ( f ); @@ -708,50 +367,6 @@ h5t_get_num_vertices_on_level ( return t->num_vertices[t->cur_level]; } -h5_id_t -h5t_store_vertex ( - h5_file * f, /*!< file handle */ - const h5_id_t global_id, /*!< global vertex id or -1 */ - const h5_float64_t P[3] /*!< coordinates */ - ) { - struct h5t_fdata *t = &f->t; - - /* - more than allocated - */ - if ( t->last_stored_vertex_id+1 >= t->num_vertices[t->cur_level] ) - return HANDLE_H5_OVERFLOW_ERR( "vertex", - t->num_vertices[t->cur_level] ); - - /* - missing call to add the first level - */ - if ( t->cur_level < 0 ) - return HANDLE_H5_UNDEF_LEVEL_ERR; - - /* - check id - */ - if ( (t->cur_level == 0) && ( - (global_id < 0) || (global_id >= t->num_vertices[0]) ) ) { - return HANDLE_H5_OUT_OF_RANGE_ERR( "vertex", global_id ); - } - if ( (t->cur_level > 0) && ( - (global_id < t->num_vertices[t->cur_level-1]) || - (global_id >= t->num_vertices[t->cur_level]) ) ) { - return HANDLE_H5_OUT_OF_RANGE_ERR( "vertex", global_id ); - } - - h5_id_t local_id = ++t->last_stored_vertex_id; - h5_vertex *vertex = &t->vertices[local_id]; - vertex->id = global_id; - memcpy ( &vertex->P, P, sizeof ( vertex->P ) ); - - _h5_insert_idmap ( &t->map_vertex_g2l, global_id, local_id ); - - return local_id; -} - h5_err_t h5t_start_traverse_vertices ( h5_file * f @@ -785,217 +400,6 @@ h5t_traverse_vertices ( return t->last_retrieved_vertex_id; } -static h5_err_t -_alloc_num_entities ( - h5_file * f, - size_t cur_num_entities, - size_t new_num_entities - ) { - struct h5t_fdata *t = &f->t; - size_t sizeof_entity = 0; - size_t sizeof_lentity = 0; - - switch ( t->mesh_type ) { - case TETRAHEDRAL_MESH: - sizeof_entity = sizeof ( t->entities.tets[0] ); - sizeof_lentity = sizeof ( t->lentities.tets[0] ); - break; - case TRIANGLE_MESH: - sizeof_entity = sizeof ( t->entities.tris[0] ); - sizeof_lentity = sizeof ( t->lentities.tris[0] ); - break; - default: - return -1; - } - - t->entities.data = realloc ( - t->entities.data, new_num_entities * sizeof_entity ); - if ( t->entities.data == NULL ) { - return H5_ERR_NOMEM; - } - - t->lentities.data = realloc ( - t->lentities.data, new_num_entities*sizeof_lentity ); - if ( t->lentities.data == NULL ) { - return H5_ERR_NOMEM; - } - memset ( - t->lentities.data+cur_num_entities*sizeof_lentity, - -1, - (new_num_entities-cur_num_entities) * sizeof_lentity ); - - return _h5_alloc_idmap (&t->map_entity_g2l, new_num_entities ); -} - -h5_err_t -h5t_add_num_entities ( - h5_file * f, - const h5_size_t num - ) { - struct h5t_fdata *t = &f->t; - - size_t cur_num_entities = t->cur_level > 0 ? - t->num_entities[t->cur_level-1] : 0; - size_t new_num_entities = t->cur_level > 0 ? - num + t->num_entities[t->cur_level-1] : num; - t->num_entities[t->cur_level] = new_num_entities; - - t->num_entities_on_level[t->cur_level] = t->cur_level > 0 ? - num + t->num_entities_on_level[t->cur_level-1] : num; - - return _alloc_num_entities ( f, cur_num_entities, new_num_entities ); -} - - -h5_id_t -h5t_store_tet ( - h5_file * f, - const h5_id_t global_id, /*!< global tetrahedron id */ - const h5_id_t parent_id, /*!< global parent id - if level \c >0 else \c -1 */ - const h5_id_t vertex_ids[4] /*!< tuple with vertex id's */ - ) { - - struct h5t_fdata *t = &f->t; - - /* - more than allocated - */ - if ( t->last_stored_entity_id+1 >= t->num_entities[t->cur_level] ) - return HANDLE_H5_OVERFLOW_ERR( - "tet", t->num_entities[t->cur_level] ); - - /* - missing call to add the first level - */ - if ( t->cur_level < 0 ) - return HANDLE_H5_UNDEF_LEVEL_ERR; - - /* - check parent id - */ - if ( (t->cur_level == 0) && - (parent_id != -1) ) { - return HANDLE_H5_PARENT_ID_ERR ( "tet", global_id, parent_id ); - } - if ( (t->cur_level > 0) && - (parent_id < 0) ) { - return HANDLE_H5_PARENT_ID_ERR ( "tet", global_id, parent_id ); - } - if ( (t->cur_level > 0) && - (parent_id >= t->num_entities[t->cur_level-1]) ) { - return HANDLE_H5_PARENT_ID_ERR ( "tet", global_id, parent_id ); - } - /* - check id - */ - if ( (t->cur_level == 0) && ( - (global_id < 0) || (global_id >= t->num_entities[0]) ) ) { - return HANDLE_H5_OUT_OF_RANGE_ERR( "tet", global_id ); - } - if ( (t->cur_level > 0) && ( - (global_id < t->num_entities[t->cur_level-1]) || - (global_id >= t->num_entities[t->cur_level]) ) ) { - return HANDLE_H5_OUT_OF_RANGE_ERR( "tet", global_id ); - } - - h5_id_t local_id = ++t->last_stored_entity_id; - h5_tetrahedron *tet = &t->entities.tets[local_id]; - tet->id = global_id; - tet->parent_id = parent_id; - tet->refined_on_level = -1; - tet->unused = 0; - - memcpy ( &tet->vertex_ids, vertex_ids, sizeof ( tet->vertex_ids ) ); - - _h5t_sort_global_vertex_ids ( f, tet->vertex_ids, 4 ); - _h5_insert_idmap ( &t->map_entity_g2l, global_id, local_id ); - - if ( parent_id >= 0 ) { - h5_id_t local_parent_id = _h5_search_idmap ( - &t->map_entity_g2l, parent_id ); - if ( t->entities.tets[local_parent_id].refined_on_level < 0 ) { - t->entities.tets[local_parent_id].refined_on_level = - t->cur_level; - t->num_entities_on_level[t->cur_level]--; - } - } - return local_id; -} - - -h5_id_t -h5t_store_triangle ( - h5_file * f, - const h5_id_t global_id, /*!< global triangle id */ - const h5_id_t parent_id, /*!< global parent id - if level \c >0 else \c -1 */ - const h5_id_t vertex_ids[3] /*!< tuple with vertex id's */ - ) { - - struct h5t_fdata *t = &f->t; - - /* - more than allocated - */ - if ( t->last_stored_entity_id+1 >= t->num_entities[t->cur_level] ) - return HANDLE_H5_OVERFLOW_ERR( - "triangle", t->num_entities[t->cur_level] ); - - /* - missing call to add the first level - */ - if ( t->cur_level < 0 ) - return HANDLE_H5_UNDEF_LEVEL_ERR; - - /* - check parent id - */ - if ( (t->cur_level == 0) && (parent_id != -1) ) { - return HANDLE_H5_PARENT_ID_ERR ( - "triangle", global_id, parent_id ); - } - if ( (t->cur_level > 0) && (parent_id < 0) ) { - return HANDLE_H5_PARENT_ID_ERR ( - "triangle", global_id, parent_id ); - } - if ( (t->cur_level>0) && (parent_id >= t->num_entities[t->cur_level-1]) ) { - return HANDLE_H5_PARENT_ID_ERR ( - "triangle", global_id, parent_id ); - } - /* - check id - */ - if ( (t->cur_level == 0) && ( - (global_id < 0) || (global_id >= t->num_entities[0]) ) ) { - return HANDLE_H5_OUT_OF_RANGE_ERR( "triangle", global_id ); - } - if ( (t->cur_level > 0) && ( - (global_id < t->num_entities[t->cur_level-1]) || - (global_id >= t->num_entities[t->cur_level]) ) ) { - return HANDLE_H5_OUT_OF_RANGE_ERR( "triangle", global_id ); - } - - h5_id_t local_id = ++t->last_stored_entity_id; - h5_triangle *tri = &t->entities.tris[local_id]; - tri->id = global_id; - tri->parent_id = parent_id; - tri->refined_on_level = -1; - memcpy ( &tri->vertex_ids, vertex_ids, sizeof ( tri->vertex_ids ) ); - - _h5_insert_idmap ( &t->map_entity_g2l, global_id, local_id ); - - if ( parent_id >= 0 ) { - h5_id_t local_parent_id = _h5_search_idmap ( - &t->map_entity_g2l, parent_id ); - if ( t->entities.tris[local_parent_id].refined_on_level < 0 ) { - t->entities.tris[local_parent_id].refined_on_level = - t->cur_level; - t->num_entities_on_level[t->cur_level]--; - } - } - return local_id; -} static h5_err_t _read_num_entities ( @@ -1007,7 +411,7 @@ _read_num_entities ( struct h5t_fdata *t = &f->t; if ( t->mesh_gid < 0 ) { - h5err = _open_mesh_group ( f ); + h5err = _h5t_open_mesh_group ( f ); if ( h5err < 0 ) return h5err; } ssize_t num_bytes = t->num_levels*sizeof ( t->num_entities[0] ); @@ -1037,10 +441,10 @@ _read_num_entities_on_level ( struct h5t_fdata *t = &f->t; if ( t->cur_level < 0 ) - return HANDLE_H5_UNDEF_LEVEL_ERR; + return _h5t_error_undef_level( f ); if ( t->mesh_gid < 0 ) { - h5err = _open_mesh_group ( f ); + h5err = _h5t_open_mesh_group ( f ); if ( h5err < 0 ) return h5err; } ssize_t num_bytes = t->num_levels*sizeof ( t->num_entities_on_level[0] ); @@ -1085,7 +489,7 @@ _h5t_read_entities ( struct h5t_fdata *t = &f->t; if ( t->mesh_gid < 0 ) { - h5err = _open_mesh_group ( f ); + h5err = _h5t_open_mesh_group ( f ); if ( h5err < 0 ) return h5err; } @@ -1094,7 +498,7 @@ _h5t_read_entities ( if ( h5err < 0 ) return h5err; } - h5err = _alloc_num_entities ( f, 0, t->num_entities[t->num_levels-1] ); + h5err = _h5t_alloc_num_entities ( f, 0, t->num_entities[t->num_levels-1] ); h5err = _read_dataset ( f, @@ -1112,7 +516,7 @@ _h5t_read_entities ( h5_id_t local_eid = 0; h5_id_t num_entities = t->num_entities[t->num_levels-1]; switch ( t->mesh_type ) { - case TETRAHEDRAL_MESH: + case H5_OID_TETRAHEDRON: for ( local_eid = 0; local_eid < num_entities; local_eid++ ) { h5err = h5t_map_global_vertex_ids2local ( f, @@ -1123,7 +527,7 @@ _h5t_read_entities ( if ( h5err < 0 ) return h5err; } break; - case TRIANGLE_MESH: + case H5_OID_TRIANGLE: for ( local_eid = 0; local_eid < num_entities; local_eid++ ) { h5err = h5t_map_global_vertex_ids2local ( f, @@ -1148,10 +552,10 @@ h5t_get_num_entities_on_level ( struct h5t_fdata *t = &f->t; if ( t->cur_mesh < 0 ) { - return HANDLE_H5_UNDEF_MESH_ERR; + return _h5t_error_undef_mesh ( f ); } if ( t->cur_level < 0 ) { - return HANDLE_H5_UNDEF_LEVEL_ERR; + return _h5t_error_undef_level( f ); } if ( t->num_entities_on_level == NULL ) { h5_err_t h5err = _read_num_entities_on_level ( f ); @@ -1167,7 +571,7 @@ h5t_get_num_entities ( struct h5t_fdata *t = &f->t; if ( t->cur_mesh < 0 ) { - return HANDLE_H5_UNDEF_MESH_ERR; + return _h5t_error_undef_mesh ( f ); } if ( t->num_entities == NULL ) { h5_err_t h5err = _read_num_entities ( f ); @@ -1183,10 +587,10 @@ h5t_start_traverse_tets ( struct h5t_fdata *t = &f->t; switch ( t->mesh_type ) { - case TRIANGLE_MESH: { + case H5_OID_TRIANGLE: { return H5_ERR_INVAL; } - case TETRAHEDRAL_MESH: { + case H5_OID_TETRAHEDRON: { t->last_retrieved_entity_id = -1; return H5_SUCCESS; } @@ -1220,7 +624,7 @@ _traverse_tets ( tet++; t->last_retrieved_entity_id++; if ( t->last_retrieved_entity_id >= t->num_entities[t->cur_level] ) { - return HANDLE_H5_INTERNAL_ERR; + return h5_error_internal( __FILE__, __func__, __LINE__ ); } } @@ -1242,14 +646,14 @@ h5t_traverse_tets ( struct h5t_fdata *t = &f->t; switch ( t->mesh_type ) { - case TRIANGLE_MESH: { + case H5_OID_TRIANGLE: { return H5_ERR_INVAL; } - case TETRAHEDRAL_MESH: { + case H5_OID_TETRAHEDRON: { return _traverse_tets ( f, id, parent_id, ids ); } default: - return H5_ERR_INTERNAL; + return h5_error_internal( __FILE__, __func__, __LINE__ ); } } @@ -1261,15 +665,15 @@ h5t_start_traverse_triangles ( struct h5t_fdata *t = &f->t; switch ( t->mesh_type ) { - case TRIANGLE_MESH: { + case H5_OID_TRIANGLE: { t->last_retrieved_entity_id = -1; return H5_SUCCESS; } - case TETRAHEDRAL_MESH: { - return H5_ERR_NOT_IMPLEMENTED; + case H5_OID_TETRAHEDRON: { + return h5_error_not_implemented( __FILE__, __func__, __LINE__ ); } default: - return H5_ERR_INTERNAL; + return h5_error_internal( __FILE__, __func__, __LINE__ ); } } @@ -1299,7 +703,7 @@ _traverse_triangles ( tri++; t->last_retrieved_entity_id++; if ( t->last_retrieved_entity_id >= t->num_entities[t->cur_level] ) { - return HANDLE_H5_INTERNAL_ERR; + return h5_error_internal( __FILE__, __func__, __LINE__ ); } } @@ -1322,13 +726,36 @@ h5t_traverse_triangles ( struct h5t_fdata *t = &f->t; switch ( t->mesh_type ) { - case TRIANGLE_MESH: { + case H5_OID_TRIANGLE: { return _traverse_triangles ( f, id, parent_id, ids ); } - case TETRAHEDRAL_MESH: { - return H5_ERR_NOT_IMPLEMENTED; + case H5_OID_TETRAHEDRON: { + return h5_error_not_implemented( __FILE__, __func__, __LINE__ ); } default: - return H5_ERR_INTERNAL; + return h5_error_internal( __FILE__, __func__, __LINE__ ); } } + +h5_err_t +_h5t_read_mesh ( + h5_file *f + ) { + struct h5t_fdata *t = &f->t; + + if ( t->vertices == NULL ) { + h5_err_t h5err = _h5t_read_vertices ( f ); + if ( h5err < 0 ) return h5err; + } + + if ( t->entities.data == NULL ) { + h5_err_t h5err = _h5t_read_entities ( f ); + if ( h5err < 0 ) return h5err; + } + + if ( t->sorted_lentities[0].items == NULL ) { + _h5t_sort_entities ( f ); + } + return H5_SUCCESS; +} + diff --git a/src/h5_core/h5t_readwrite.h b/src/h5_core/h5t_readwrite.h index 2eba30b..f2935f0 100644 --- a/src/h5_core/h5t_readwrite.h +++ b/src/h5_core/h5t_readwrite.h @@ -2,31 +2,14 @@ #define __T_READWRITE_H h5_err_t -_h5t_init_step ( - h5_file * f - ); - -h5_err_t -_h5t_close_step ( - h5_file * f - ); - -h5_err_t -_h5t_close_mesh ( +_h5t_write_mesh ( h5_file * f ); h5_size_t h5t_get_num_meshes ( h5_file * f, - const enum h5_mesh_types type - ); - -h5_err_t -h5t_open_mesh ( - h5_file * f, - h5_id_t id, - const enum h5_mesh_types type + const enum h5_oid type ); h5_id_t @@ -39,40 +22,16 @@ h5t_get_num_levels ( h5_file * f ); -h5_err_t -h5t_open_level ( - h5_file * f, - const h5_id_t id - ); - h5_id_t h5t_get_level ( h5_file * f ); -h5_id_t -h5t_add_level ( - h5_file * f - ); - h5_err_t _h5t_read_vertices ( h5_file * f ); -h5_size_t -h5t_add_num_vertices ( - h5_file * f, - const h5_size_t num - ); - -h5_id_t -h5t_store_vertex ( - h5_file * f, - const h5_id_t id, - const h5_float64_t P[3] - ); - h5_size_t h5t_get_num_vertices_on_level ( h5_file * f @@ -90,6 +49,18 @@ h5t_traverse_vertices ( h5_float64_t P[3] ); +h5_size_t +h5t_add_num_tets ( + h5_file * f, + const h5_size_t num + ) ; + +h5_size_t +h5t_add_num_triangles ( + h5_file * f, + const h5_size_t num + ) ; + h5_size_t h5t_add_num_entities ( h5_file * f, diff --git a/src/h5_core/h5u_readwrite.c b/src/h5_core/h5u_readwrite.c index f8ca911..e5a716a 100644 --- a/src/h5_core/h5u_readwrite.c +++ b/src/h5_core/h5u_readwrite.c @@ -6,9 +6,15 @@ #include #include -#include "h5_core.h" -#include "h5_private.h" -#include "H5Part.h" +#include "h5_core/h5_core.h" +#include "h5_core/h5_core_private.h" + +h5_int64_t +h5u_has_view ( + h5_file *f + ) { + return ( f->viewstart >= 0 ) && ( f->viewend >= 0 ); +} static hid_t _get_diskshape_for_reading ( @@ -21,7 +27,7 @@ _get_diskshape_for_reading ( hid_t space = H5Dget_space(dataset); if ( space < 0 ) return (hid_t)HANDLE_H5D_GET_SPACE_ERR; - if ( H5PartHasView(f) ){ + if ( h5u_has_view ( f ) ) { hsize_t stride; hsize_t count; #ifdef HDF5V160 @@ -63,7 +69,7 @@ _get_memshape_for_reading ( hid_t dataset ) { - if(H5PartHasView(f)) { + if ( h5u_has_view ( f ) ) { hsize_t dmax=H5S_UNLIMITED; hsize_t len = f->viewend - f->viewstart; hid_t r = H5Screate_simple(1,&len,&dmax); @@ -101,14 +107,14 @@ H5U_get_num_elems ( dataset_name, sizeof (dataset_name) ); if ( herr < 0 ) return herr; - dataset_id = H5Dopen ( f->step_gid, dataset_name ); + dataset_id = H5Dopen ( f->step_gid, dataset_name, H5P_DEFAULT ); if ( dataset_id < 0 ) return HANDLE_H5D_OPEN_ERR ( dataset_name ); space_id = _get_diskshape_for_reading ( f, dataset_id ); if ( space_id < 0 ) return (h5part_int64_t)space_id; - if ( H5PartHasView ( f ) ) { + if ( h5u_has_view ( f ) ) { nparticles = H5Sget_select_npoints ( space_id ); if ( nparticles < 0 ) return HANDLE_H5S_GET_SELECT_NPOINTS_ERR; } @@ -144,7 +150,7 @@ H5U_read_elems ( h5part_int64_t h5err = h5_set_step ( f, f->step_idx ); if ( h5err < 0 ) return h5err; } - dataset_id = H5Dopen ( f->step_gid, name ); + dataset_id = H5Dopen ( f->step_gid, name, H5P_DEFAULT ); if ( dataset_id < 0 ) return HANDLE_H5D_OPEN_ERR ( name ); space_id = _get_diskshape_for_reading ( f, dataset_id ); diff --git a/src/h5_core/h5u_readwrite.h b/src/h5_core/h5u_readwrite.h index da199ec..483b843 100644 --- a/src/h5_core/h5u_readwrite.h +++ b/src/h5_core/h5u_readwrite.h @@ -1,12 +1,12 @@ #ifndef __U_READWRITE_H #define __U_READWRITE_H -h5part_int64_t +h5_int64_t H5U_get_num_elems ( h5_file *f ); -h5part_int64_t +h5_int64_t H5U_read_elems ( h5_file *f, const char *name, @@ -14,13 +14,13 @@ H5U_read_elems ( const hid_t type ); -h5part_int64_t +h5_int64_t H5U_set_num_elements ( h5_file *f, - h5part_int64_t nparticles + h5_int64_t nparticles ); -h5part_int64_t +h5_int64_t H5U_write_data ( h5_file *f, const char *name, @@ -28,37 +28,42 @@ H5U_write_data ( const hid_t type ); -h5part_int64_t +h5_int64_t +h5u_has_view ( + h5_file *f + ); + +h5_int64_t H5U_reset_view ( h5_file *f ); -h5part_int64_t +h5_int64_t H5U_set_view ( h5_file *f, - h5part_int64_t start, - h5part_int64_t end + h5_int64_t start, + h5_int64_t end ); -h5part_int64_t +h5_int64_t H5U_get_view ( h5_file *f, - h5part_int64_t *start, - h5part_int64_t *end + h5_int64_t *start, + h5_int64_t *end ); -h5part_int64_t +h5_int64_t H5U_set_canonical_view ( h5_file *f ); -h5part_int64_t +h5_int64_t H5U_get_dataset_info ( h5_file *f, - const h5part_int64_t idx, + const h5_int64_t idx, char *dataset_name, - const h5part_int64_t len_dataset_name, - h5part_int64_t *type, - h5part_int64_t *nelem + const h5_int64_t len_dataset_name, + h5_int64_t *type, + h5_int64_t *nelem ); #endif