src/h5/errorhandling.c

src/h5/u_readwrite.h
src/h5/H5.h
src/h5/errorhandling.h
src/h5/readwrite.c
src/h5/openclose.c
src/h5/attribs.c
src/h5/Makefile.am
src/h5/u_readwrite.c
src/h5/readwrite.h
src/h5/openclose.h
src/h5/attribs.h
	* added
This commit is contained in:
2007-11-22 11:08:23 +00:00
parent 69600afb50
commit d9239fdd88
13 changed files with 2102 additions and 0 deletions
+12
View File
@@ -38,6 +38,18 @@ src/bindings/Fortran/H5PartF.c -text
src/bindings/Fortran/H5PartF90.inc -text
src/bindings/Fortran/TestUnderscore.f -text
src/bindings/Fortran/TestUnderscoreC.c -text
src/h5/H5.h -text
src/h5/Makefile.am -text
src/h5/attribs.c -text
src/h5/attribs.h -text
src/h5/errorhandling.c -text
src/h5/errorhandling.h -text
src/h5/openclose.c -text
src/h5/openclose.h -text
src/h5/readwrite.c -text
src/h5/readwrite.h -text
src/h5/u_readwrite.c -text
src/h5/u_readwrite.h -text
test/Bench.c -text
test/BlockTestSpecs.txt -text
test/H5BlockDissolveGhosts.c -text
+10
View File
@@ -0,0 +1,10 @@
#ifndef __H5_H
#define __H5_H
#include "attribs.h"
#include "errorhandling.h"
#include "openclose.h"
#include "readwrite.h"
#include "u_readwrite.h"
#endif
+76
View File
@@ -0,0 +1,76 @@
# src level Makefile.am
# PATH SETTING (IMPORTED FROM CONFIGURE)
HDF5ROOT = @HDF5ROOT@
OBJEXT = o
# COMPILERS
CC = @CC@
#INCLUDES
HDFINC = -I$(HDF5ROOT)/include
MPIINC = @MPIINC@
INC = $(HDFINC) ${MPIINC} -I../
# H5Part header file location
H5PINC = -I@prefix@/include
# COMPILER FLAGS
CFLAGS = @CFLAGS@ ${INC}
# H5Part compiled library location
H5PLIB = -L@prefix@/lib
# HDF5 LIBRARY
HDFLIB = -L$(HDF5ROOT)/lib -lhdf5 -lz $(SZLIB) @LDFLAGS@
# SZ LIBRARY
SZLIB = @SZLIB@
# Extra files that I wish to include in the dist tar ball.
EXTRA_DIST = $(EXTRA_HEADERS)
# Files that I don't want to include in the dist tar ball
nodist_include_HEADERS =
# What to build... Will be determined by configure script.
lib_LIBRARIES = libH5.a
# Listing of all possible targets that I may build.
EXTRA_LIBRARIES = libH5.a
# Header files that I wish to install in $(prefix)/include
include_HEADERS = H5.h
# Listing of all possible headers that I may include
EXTRA_HEADERS =
# Listing of sources
libH5_a_SOURCES = attribs.c errorhandling.c openclose.c readwrite.c u_readwrite.c
all: libH5.a
libH5.a: $(libH5_a_OBJECTS)
echo $(libH5_a_OBJECTS)
${AR} rucs $@ $^
%.o : %.c
$(CC) $(CFLAGS) $(INC) -c $<
$(libH5_a_OBJECTS): H5.h
errorhandling.o: errorhandling.c
clean:
$(RM) -f *~ *.o *.a *.so
distclean: clean
$(RM) -f *.a
$(RM) -rf .deps
$(RM) -rf .libs
$(RM) -f Makefile
+163
View File
@@ -0,0 +1,163 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h> /* va_arg - System dependent ?! */
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <hdf5.h>
#include "H5PartTypes.h"
#include "H5BlockTypes.h"
#include "H5Part.h"
#include "H5Block.h"
#include "H5PartPrivate.h"
#include "H5BlockPrivate.h"
#include "H5PartErrors.h"
#include "H5BlockErrors.h"
#include "H5.h"
h5part_int64_t
H5_read_attrib (
hid_t id,
const char *attrib_name,
void *attrib_value
) {
herr_t herr;
hid_t attrib_id;
hid_t space_id;
hid_t type_id;
hid_t mytype;
hsize_t nelem;
attrib_id = H5Aopen_name ( id, attrib_name );
if ( attrib_id <= 0 ) return HANDLE_H5A_OPEN_NAME_ERR( attrib_name );
mytype = H5Aget_type ( attrib_id );
if ( mytype < 0 ) return HANDLE_H5A_GET_TYPE_ERR;
space_id = H5Aget_space ( attrib_id );
if ( space_id < 0 ) return HANDLE_H5A_GET_SPACE_ERR;
nelem = H5Sget_simple_extent_npoints ( space_id );
if ( nelem < 0 ) return HANDLE_H5S_GET_SIMPLE_EXTENT_NPOINTS_ERR;
type_id = H5_normalize_h5_type ( mytype );
herr = H5Aread (attrib_id, type_id, attrib_value );
if ( herr < 0 ) return HANDLE_H5A_READ_ERR;
herr = H5Sclose ( space_id );
if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR;
herr = H5Tclose ( mytype );
if ( herr < 0 ) return HANDLE_H5T_CLOSE_ERR;
herr = H5Aclose ( attrib_id );
if ( herr < 0 ) return HANDLE_H5A_CLOSE_ERR;
return H5PART_SUCCESS;
}
h5part_int64_t
H5_write_attrib (
hid_t id,
const char *attrib_name,
const hid_t attrib_type,
const void *attrib_value,
const hsize_t attrib_nelem
) {
herr_t herr;
hid_t space_id;
hid_t attrib_id;
space_id = H5Screate_simple (1, &attrib_nelem, NULL);
if ( space_id < 0 )
return HANDLE_H5S_CREATE_SIMPLE_ERR ( attrib_nelem );
attrib_id = H5Acreate (
id,
attrib_name,
attrib_type,
space_id,
H5P_DEFAULT );
if ( attrib_id < 0 ) return HANDLE_H5A_CREATE_ERR ( attrib_name );
herr = H5Awrite ( attrib_id, attrib_type, attrib_value);
if ( herr < 0 ) return HANDLE_H5A_WRITE_ERR ( attrib_name );
herr = H5Aclose ( attrib_id );
if ( herr < 0 ) return HANDLE_H5A_CLOSE_ERR;
herr = H5Sclose ( space_id );
if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR;
return H5PART_SUCCESS;
}
h5part_int64_t
H5_get_attrib_info (
hid_t id,
const h5part_int64_t attrib_idx,
char *attrib_name,
const h5part_int64_t len_attrib_name,
h5part_int64_t *attrib_type,
h5part_int64_t *attrib_nelem
) {
herr_t herr;
hid_t attrib_id;
hid_t mytype;
hid_t space_id;
attrib_id = H5Aopen_idx ( id, (unsigned int)attrib_idx );
if ( attrib_id < 0 ) return HANDLE_H5A_OPEN_IDX_ERR ( attrib_idx );
if ( attrib_nelem ) {
space_id = H5Aget_space ( attrib_id );
if ( space_id < 0 ) return HANDLE_H5A_GET_SPACE_ERR;
*attrib_nelem = H5Sget_simple_extent_npoints ( space_id );
if ( *attrib_nelem < 0 )
return HANDLE_H5S_GET_SIMPLE_EXTENT_NPOINTS_ERR;
herr = H5Sclose ( space_id );
if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR;
}
if ( attrib_name ) {
herr = H5Aget_name (
attrib_id,
(size_t)len_attrib_name,
attrib_name );
if ( herr < 0 ) return HANDLE_H5A_GET_NAME_ERR;
}
if ( attrib_type ) {
mytype = H5Aget_type ( attrib_id );
if ( mytype < 0 ) return HANDLE_H5A_GET_TYPE_ERR;
*attrib_type = H5_normalize_h5_type ( mytype );
herr = H5Tclose ( mytype );
if ( herr < 0 ) return HANDLE_H5T_CLOSE_ERR;
}
herr = H5Aclose ( attrib_id);
if ( herr < 0 ) return HANDLE_H5A_CLOSE_ERR;
return H5PART_SUCCESS;
}
h5part_int64_t
H5_get_num_attribs (
H5PartFile *f,
hid_t id
) {
CHECK_FILEHANDLE ( f );
int nattribs = H5Aget_num_attrs ( id );
if ( nattribs < 0 ) HANDLE_H5A_GET_NUM_ATTRS_ERR;
return (h5part_int64_t) nattribs;
}
+36
View File
@@ -0,0 +1,36 @@
#ifndef __ATTRIBS_H
#define __ATTRIBS_H
h5part_int64_t
H5_read_attrib (
hid_t id,
const char *attrib_name,
void *attrib_value
);
h5part_int64_t
H5_write_attrib (
hid_t id,
const char *attrib_name,
const hid_t attrib_type,
const void *attrib_value,
const hsize_t attrib_nelem
);
h5part_int64_t
H5_get_attrib_info (
hid_t id,
const h5part_int64_t attrib_idx,
char *attrib_name,
const h5part_int64_t len_attrib_name,
h5part_int64_t *attrib_type,
h5part_int64_t *attrib_nelem
);
h5part_int64_t
H5_get_num_attribs (
H5PartFile *f,
hid_t id
);
#endif
+224
View File
@@ -0,0 +1,224 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h> /* va_arg - System dependent ?! */
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <hdf5.h>
#include "H5PartTypes.h"
#include "H5Part.h"
#include "H5PartPrivate.h"
#include "H5PartErrors.h"
#include "H5.h"
h5part_error_handler _err_handler = H5PartReportErrorHandler;
h5part_int64_t _h5part_errno = H5PART_SUCCESS;
h5part_int64_t _debug = 0;
static char *__funcname = "NONE";
h5part_int64_t
H5_set_debuglevel (
h5part_int64_t level
) {
_debug = level;
return H5PART_SUCCESS;
}
h5part_int64_t
H5_get_debuglevel (
void
) {
return _debug;
}
h5part_int64_t
H5_set_errorhandler (
h5part_error_handler handler
) {
_err_handler = handler;
return H5PART_SUCCESS;
}
h5part_error_handler
H5_get_errorhandler (
void
) {
return _err_handler;
}
h5part_int64_t
H5_get_errno (
void
) {
return _h5part_errno;
}
/*!
\ingroup h5part_errhandle
This is the H5Part default error handler. If an error occures, an
error message will be printed and an error number will be returned.
\return value given in \c eno
*/
h5part_int64_t
H5_report_errorhandler (
const char *funcname,
const h5part_int64_t eno,
const char *fmt,
...
) {
_h5part_errno = eno;
if ( _debug > 0 ) {
va_list ap;
va_start ( ap, fmt );
H5_vprint_error ( fmt, ap );
va_end ( ap );
}
return _h5part_errno;
}
/*!
\ingroup h5part_errhandle
If an error occures, an error message will be printed and the
program exists with the error code given in \c eno.
*/
h5part_int64_t
H5_abort_errorhandler (
const char *funcname,
const h5part_int64_t eno,
const char *fmt,
...
) {
_h5part_errno = eno;
if ( _debug > 0 ) {
va_list ap;
va_start ( ap, fmt );
fprintf ( stderr, "%s: ", funcname );
vfprintf ( stderr, fmt, ap );
fprintf ( stderr, "\n" );
}
exit (-(int)_h5part_errno);
}
static void
_vprintf (
FILE* f,
const char *prefix,
const char *fmt,
va_list ap
) {
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 );
}
void
H5_vprint_error (
const char *fmt,
va_list ap
) {
if ( _debug < 1 ) return;
_vprintf ( stderr, "E", fmt, ap );
}
void
H5_print_error (
const char *fmt,
...
) {
va_list ap;
va_start ( ap, fmt );
H5_vprint_error ( fmt, ap );
va_end ( ap );
}
void
H5_vprint_warn (
const char *fmt,
va_list ap
) {
if ( _debug < 2 ) return;
_vprintf ( stderr, "W", fmt, ap );
}
void
H5_print_warn (
const char *fmt,
...
) {
va_list ap;
va_start ( ap, fmt );
H5_vprint_warn ( fmt, ap );
va_end ( ap );
}
void
H5_vprint_info (
const char *fmt,
va_list ap
) {
if ( _debug < 3 ) return;
_vprintf ( stdout, "I", fmt, ap );
}
void
H5_print_info (
const char *fmt,
...
) {
va_list ap;
va_start ( ap, fmt );
H5_vprint_info ( fmt, ap );
va_end ( ap );
}
void
H5_vprint_debug (
const char *fmt,
va_list ap
) {
if ( _debug < 4 ) return;
_vprintf ( stdout, "D", fmt, ap );
}
void
H5_print_debug (
const char *fmt,
...
) {
va_list ap;
va_start ( ap, fmt );
H5_vprint_debug ( fmt, ap );
va_end ( ap );
}
void
H5_set_funcname (
char * const fname
) {
__funcname = fname;
}
const char *
H5_get_funcname (
void
) {
return __funcname;
}
+118
View File
@@ -0,0 +1,118 @@
#ifndef __ERRORHANDLING_H
#define __ERRORHANDLING_H
h5part_int64_t
H5_set_debuglevel (
h5part_int64_t level
);
h5part_int64_t
H5_get_debuglevel (
void
);
h5part_int64_t
H5_set_errorhandler (
h5part_error_handler handler
);
h5part_error_handler
H5_get_errorhandler (
void
);
h5part_int64_t
H5_get_errno (
void
);
h5part_int64_t
H5_report_errorhandler (
const char *funcname,
const h5part_int64_t eno,
const char *fmt,
...
);
h5part_int64_t
H5_abort_errorhandler (
const char *funcname,
const h5part_int64_t eno,
const char *fmt,
...
) ;
void
H5_vprint_error (
const char *fmt,
va_list ap
);
void
H5_print_error (
const char *fmt,
... )
#ifdef __GNUC__
__attribute__ ((format (printf, 1, 2)))
#endif
;
void
H5_vprint_warn (
const char *fmt,
va_list ap
);
void
H5_print_warn (
const char *fmt,
...
)
#ifdef __GNUC__
__attribute__ ((format (printf, 1, 2)))
#endif
;
void
H5_vprint_info (
const char *fmt,
va_list ap
);
void
H5_print_info (
const char *fmt,
...
)
#ifdef __GNUC__
__attribute__ ((format (printf, 1, 2)))
#endif
;
void
H5_vprint_debug (
const char *fmt,
va_list ap
);
void
H5_print_debug (
const char *fmt,
...
)
#ifdef __GNUC__
__attribute__ ((format (printf, 1, 2)))
#endif
;
void
H5_set_funcname (
char * const fname
);
const char *
H5_get_funcname (
void
);
#endif
+436
View File
@@ -0,0 +1,436 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h> /* va_arg - System dependent ?! */
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <hdf5.h>
#include "H5PartTypes.h"
#include "H5BlockTypes.h"
#include "H5Part.h"
#include "H5Block.h"
#include "H5PartPrivate.h"
#include "H5BlockPrivate.h"
#include "H5PartErrors.h"
#include "H5BlockErrors.h"
#include "H5.h"
extern h5part_error_handler _err_handler;
extern h5part_int64_t _h5part_errno;
extern unsigned _debug;
static h5part_int64_t
_close_block (
H5PartFile *f
);
/*!
\ingroup h5block_private
\internal
Check whether \c f points to a valid file handle.
\return H5PART_SUCCESS or error code
*/
h5part_int64_t
H5_check_filehandle (
const H5PartFile *f /*!< filehandle to check validity of */
) {
if ( f == NULL )
return HANDLE_H5PART_BADFD_ERR;
if ( f->file == 0 )
return HANDLE_H5PART_BADFD_ERR;
if ( f->block == NULL )
return HANDLE_H5PART_BADFD_ERR;
return H5PART_SUCCESS;
}
/*!
Initialize H5Part
*/
static herr_t
_h5_error_handler ( void* unused ) {
if ( _debug >= 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 H5PART_ERR_INIT;
}
__init = 1;
return H5PART_SUCCESS;
}
/*!
\ingroup h5block_private
\internal
Initialize H5Block internal structure.
\return H5PART_SUCCESS or error code
*/
static h5part_int64_t
_init_block (
H5PartFile *f /*!< IN: file handle */
) {
h5part_int64_t herr;
struct H5BlockStruct *b;
herr = _file_is_valid ( f );
if ( herr == H5PART_SUCCESS ) return H5PART_SUCCESS;
if ( (f == 0) || (f->file == 0) ) return HANDLE_H5PART_BADFD_ERR;
f->block = (struct H5BlockStruct*) malloc( sizeof (*f->block) );
if ( f->block == NULL ) {
return HANDLE_H5PART_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_H5PART_NOMEM_ERR;
}
b->write_layout = (struct H5BlockPartition*) malloc (
f->nprocs * sizeof (b->write_layout[0]) );
if ( b->write_layout == NULL ) {
return HANDLE_H5PART_NOMEM_ERR;
}
b->timestep = -1;
b->blockgroup = -1;
b->shape = -1;
b->diskshape = -1;
b->memshape = -1;
b->field_group_id = -1;
b->have_layout = 0;
f->close_block = _close_block;
return H5PART_SUCCESS;
}
/*!
\ingroup h5block_private
\internal
De-initialize H5Block internal structure. Open HDF5 objects are
closed and allocated memory freed.
\return H5PART_SUCCESS or error code
*/
static h5part_int64_t
_close_block (
H5PartFile *f /*!< IN: file handle */
) {
herr_t herr;
struct H5BlockStruct *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;
f->close_block = NULL;
return H5PART_SUCCESS;
}
H5PartFile*
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 */
int f_parallel /*!< [in] 0 for serial io otherwise parallel */
) {
h5part_int64_t rc = H5PART_SUCCESS;
if ( _init() < 0 ) {
HANDLE_H5PART_INIT_ERR;
return NULL;
}
_h5part_errno = H5PART_SUCCESS;
H5PartFile *f = NULL;
f = (H5PartFile*) malloc( sizeof (H5PartFile) );
if( f == NULL ) {
HANDLE_H5PART_NOMEM_ERR;
goto error_cleanup;
}
memset (f, 0, sizeof (H5PartFile));
f->groupname_step = strdup ( H5PART_GROUPNAME_STEP );
if( f->groupname_step == NULL ) {
HANDLE_H5PART_NOMEM_ERR;
goto error_cleanup;
}
f->stepno_width = 0;
f->xfer_prop = f->create_prop = f->access_prop = H5P_DEFAULT;
if ( f_parallel ) {
#ifdef PARALLEL_IO
/* 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 (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;
}
f->pnparticles =
(h5part_int64_t*) malloc (f->nprocs * sizeof (h5part_int64_t));
if (f->pnparticles == NULL) {
HANDLE_H5PART_NOMEM_ERR;
goto error_cleanup;
}
f->access_prop = H5Pcreate (H5P_FILE_ACCESS);
if (f->access_prop < 0) {
HANDLE_H5P_CREATE_ERR;
goto error_cleanup;
}
if (H5Pset_fapl_mpio (f->access_prop, comm, info) < 0) {
HANDLE_H5P_SET_FAPL_MPIO_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
f->comm = comm;
MPI_Info_free(&info);
#else
/* f_parallel is true, but compilation is for serial I/O */
HANDLE_MPI_UNAVAILABLE_ERR;
goto error_cleanup;
#endif /* PARALLEL_IO */
} else {
f->comm = 0;
f->nprocs = 1;
f->myproc = 0;
f->pnparticles =
(h5part_int64_t*) malloc (f->nprocs * sizeof (h5part_int64_t));
}
if ( flags == H5PART_READ ) {
f->file = H5Fopen (filename, H5F_ACC_RDONLY, f->access_prop);
}
else if ( flags == H5PART_WRITE ){
f->file = H5Fcreate (filename, H5F_ACC_TRUNC, f->create_prop,
f->access_prop);
f->empty = 1;
}
else if ( flags == H5PART_APPEND ) {
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);
/*
The following function call returns an error,
if f->file < 0. But we can safely ignore this.
*/
f->timestep = H5_get_num_objects_matching_pattern(
f->file, "/", H5G_GROUP, f->groupname_step );
if ( f->timestep < 0 ) goto error_cleanup;
}
}
else {
HANDLE_H5PART_FILE_ACCESS_TYPE_ERR ( flags );
goto error_cleanup;
}
if (f->file < 0) {
HANDLE_H5F_OPEN_ERR ( filename, flags );
goto error_cleanup;
}
f->root_id = H5Gopen( f->file, "/" );
if ( f->root_id < 0 ) {
HANDLE_H5G_OPEN_ERR ( "/" );
goto error_cleanup;
}
f->mode = flags;
f->timegroup = -1;
f->shape = 0;
f->diskshape = H5S_ALL;
f->memshape = H5S_ALL;
f->viewstart = -1;
f->viewend = -1;
sprintf (
f->index_name,
"%s#%0*lld",
f->groupname_step, f->stepno_width, (long long) f->timestep );
rc = _init_block ( f );
if ( rc != H5PART_SUCCESS ) {
goto error_cleanup;
}
H5_print_debug (
"Proc[%d]: Opened file \"%s\" val=%lld",
f->myproc,
filename,
(long long)(size_t)f );
return f;
error_cleanup:
if (f != NULL ) {
if (f->groupname_step) {
free (f->groupname_step);
}
if (f->pnparticles != NULL) {
free (f->pnparticles);
}
free (f);
}
return NULL;
}
h5part_int64_t
H5_close_file (
H5PartFile *f
) {
herr_t r = 0;
_h5part_errno = H5PART_SUCCESS;
CHECK_FILEHANDLE ( f );
if ( f->block && f->close_block ) {
(*f->close_block) ( f );
f->block = NULL;
f->close_block = NULL;
}
if( f->shape > 0 ) {
r = H5Sclose( f->shape );
if ( r < 0 ) HANDLE_H5S_CLOSE_ERR;
f->shape = 0;
}
if( f->timegroup >= 0 ) {
r = H5Gclose( f->timegroup );
if ( r < 0 ) HANDLE_H5G_CLOSE_ERR;
f->timegroup = -1;
}
if( f->diskshape != H5S_ALL ) {
r = H5Sclose( f->diskshape );
if ( r < 0 ) HANDLE_H5S_CLOSE_ERR;
f->diskshape = 0;
}
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_id >= 0 ) {
r = H5Gclose ( f->root_id );
if ( r < 0 ) HANDLE_H5G_CLOSE_ERR;
f->root_id = 0;
}
if ( f->file ) {
r = H5Fclose( f->file );
if ( r < 0 ) HANDLE_H5F_CLOSE_ERR;
f->file = 0;
}
if (f->groupname_step) {
free (f->groupname_step);
}
if( f->pnparticles ) {
free( f->pnparticles );
}
free( f );
return _h5part_errno;
}
h5part_int64_t
H5_define_stepname (
H5PartFile *f,
const char *name,
const h5part_int64_t width
) {
f->groupname_step = strdup ( name );
if( f->groupname_step == NULL ) {
return HANDLE_H5PART_NOMEM_ERR;
}
f->stepno_width = (int)width;
return H5PART_SUCCESS;
}
+37
View File
@@ -0,0 +1,37 @@
#ifndef __OPENCLOSE_H
#define __OPENCLOSE_H
H5PartFile*
H5_open_file (
const char *filename,
unsigned flags,
MPI_Comm comm,
int f_parallel
);
h5part_int64_t
H5_check_filehandle (
const H5PartFile *f
);
H5PartFile*
H5_open_file (
const char *filename,
unsigned flags,
MPI_Comm comm,
int f_parallel
);
h5part_int64_t
H5_close_file (
H5PartFile *f
);
h5part_int64_t
H5_define_stepname (
H5PartFile *f,
const char *name,
const h5part_int64_t width
);
#endif
+299
View File
@@ -0,0 +1,299 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h> /* va_arg - System dependent ?! */
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <hdf5.h>
#include "H5PartTypes.h"
#include "H5BlockTypes.h"
#include "H5Part.h"
#include "H5Block.h"
#include "H5PartPrivate.h"
#include "H5BlockPrivate.h"
#include "H5PartErrors.h"
#include "H5BlockErrors.h"
#include "H5.h"
h5part_int64_t
H5_write_data (
H5PartFile *f, /*!< IN: Handle to open file */
const char *name, /*!< IN: Name to associate array with */
const void *array, /*!< IN: Array to commit to disk */
const hid_t type, /*!< IN: Type of data */
const hid_t groupid,
const hid_t shape,
const hid_t memshape,
const hid_t diskshape
) {
herr_t herr;
hid_t dataset_id;
H5_print_debug ( "Create a dataset[%s] mounted on the "
"timestep %lld",
name, (long long)f->timestep );
dataset_id = H5Dcreate (
groupid,
name,
type,
shape,
H5P_DEFAULT );
if ( dataset_id < 0 )
return HANDLE_H5D_CREATE_ERR ( name, f->timestep );
herr = H5Dwrite (
dataset_id,
type,
memshape,
diskshape,
f->xfer_prop,
array );
if ( herr < 0 ) return HANDLE_H5D_WRITE_ERR ( name, f->timestep );
herr = H5Dclose ( dataset_id );
if ( herr < 0 ) return HANDLE_H5D_CLOSE_ERR;
f->empty = 0;
return H5PART_SUCCESS;
}
/*!
\ingroup h5part_kernel
Iterator for \c H5Giterate().
*/
herr_t
H5_iteration_operator (
hid_t group_id, /*!< [in] group id */
const char *member_name,/*!< [in] group name */
void *operator_data /*!< [in,out] data passed to the iterator */
) {
struct _iter_op_data *data = (struct _iter_op_data*)operator_data;
herr_t herr;
H5G_stat_t objinfo;
if ( data->type != H5G_UNKNOWN ) {
herr = H5Gget_objinfo ( group_id, member_name, 1, &objinfo );
if ( herr < 0 ) return (herr_t)HANDLE_H5G_GET_OBJINFO_ERR ( member_name );
if ( objinfo.type != data->type )
return 0;/* don't count, continue iteration */
}
if ( data->name && (data->stop_idx == data->count) ) {
memset ( data->name, 0, data->len );
strncpy ( data->name, member_name, data->len-1 );
return 1; /* stop iteration */
}
/*
count only if pattern is NULL or member name matches
*/
if ( !data->pattern ||
(strncmp (member_name, data->pattern, strlen(data->pattern)) == 0)
) {
data->count++;
}
return 0; /* continue iteration */
}
/*!
\ingroup h5part_kernel
Iterator for \c H5Giterate().
*/
h5part_int64_t
H5_get_num_objects (
hid_t group_id,
const char *group_name,
const hid_t type
) {
return H5_get_num_objects_matching_pattern (
group_id,
group_name,
type,
NULL );
}
/*!
\ingroup h5part_kernel
Iterator for \c H5Giterate().
*/
h5part_int64_t
H5_get_num_objects_matching_pattern (
hid_t group_id,
const char *group_name,
const hid_t type,
char * const pattern
) {
h5part_int64_t herr;
int idx = 0;
struct _iter_op_data data;
memset ( &data, 0, sizeof ( data ) );
data.type = type;
data.pattern = pattern;
herr = H5Giterate ( group_id, group_name, &idx,
H5_iteration_operator, &data );
if ( herr < 0 ) return herr;
return data.count;
}
/*!
\ingroup h5part_kernel
Iterator for \c H5Giterate().
*/
h5part_int64_t
H5_get_object_name (
hid_t group_id,
const char *group_name,
const hid_t type,
const h5part_int64_t idx,
char *obj_name,
const h5part_int64_t len_obj_name
) {
herr_t herr;
struct _iter_op_data data;
int iterator_idx = 0;
memset ( &data, 0, sizeof ( data ) );
data.stop_idx = (hid_t)idx;
data.type = type;
data.name = obj_name;
data.len = (size_t)len_obj_name;
herr = H5Giterate ( group_id, group_name, &iterator_idx,
H5_iteration_operator,
&data );
if ( herr < 0 ) return (h5part_int64_t)herr;
if ( herr == 0 ) HANDLE_H5PART_NOENTRY_ERR( group_name,
type, idx );
return H5PART_SUCCESS;
}
h5part_int64_t
H5_set_step (
H5PartFile *f, /*!< [in] Handle to open file */
const h5part_int64_t step /*!< [in] Time-step to set. */
) {
sprintf (
f->index_name,
"%s#%0*lld",
f->groupname_step, f->stepno_width, (long long) step );
herr_t herr = H5Gget_objinfo( f->file, f->index_name, 1, NULL );
if ( (f->mode != H5PART_READ) && ( herr >= 0 ) ) {
return HANDLE_H5PART_STEP_EXISTS_ERR ( step );
}
if ( f->timegroup >= 0 ) {
herr = H5Gclose ( f->timegroup );
if ( herr < 0 ) return HANDLE_H5G_CLOSE_ERR;
}
f->timegroup = -1;
f->timestep = step;
if( f->mode == H5PART_READ ) {
H5_print_info (
"Proc[%d]: Set step to #%lld for file %lld",
f->myproc,
(long long)step,
(long long)(size_t) f );
f->timegroup = H5Gopen ( f->file, f->index_name );
if ( f->timegroup < 0 ) return HANDLE_H5G_OPEN_ERR( f->index_name );
}
else {
H5_print_debug (
"Proc[%d]: Create step #%lld for file %lld",
f->myproc,
(long long)step,
(long long)(size_t) f );
f->timegroup = H5Gcreate ( f->file, f->index_name, 0 );
if ( f->timegroup < 0 )
return HANDLE_H5G_CREATE_ERR ( f->index_name );
}
return H5PART_SUCCESS;
}
/*!
Normalize HDF5 type
*/
hid_t
H5_normalize_h5_type (
hid_t type
) {
H5T_class_t tclass = H5Tget_class ( type );
int size = H5Tget_size ( type );
switch ( tclass ){
case H5T_INTEGER:
if ( size==8 ) {
return H5T_NATIVE_INT64;
}
else if ( size==1 ) {
return H5T_NATIVE_CHAR;
}
break;
case H5T_FLOAT:
return H5T_NATIVE_DOUBLE;
default:
; /* NOP */
}
H5_print_warn ( "Unknown type %d", (int)type );
return -1;
}
h5part_int64_t
H5_get_dataset_type(
hid_t group_id,
const char *dataset_name
) {
hid_t dataset_id = H5Dopen ( group_id, dataset_name );
if ( dataset_id < 0 ) HANDLE_H5D_OPEN_ERR ( dataset_name );
hid_t hdf5_type = H5Dget_type ( dataset_id );
if ( hdf5_type < 0 ) HANDLE_H5D_GET_TYPE_ERR;
h5part_int64_t type = (h5part_int64_t) H5_normalize_h5_type ( hdf5_type );
herr_t herr = H5Tclose(hdf5_type);
if ( herr < 0 ) HANDLE_H5T_CLOSE_ERR;
herr = H5Dclose(dataset_id);
if ( herr < 0 ) HANDLE_H5D_CLOSE_ERR;
return type;
}
h5part_int64_t
H5_has_index (
H5PartFile *f, /*!< [in] Handle to open file */
h5part_int64_t step /*!< [in] Step number to query */
) {
char name[128];
sprintf ( name,
"%s#%0*lld",
f->groupname_step, f->stepno_width, (long long) step );
return ( H5Gget_objinfo( f->file, name, 1, NULL ) >= 0 );
}
+64
View File
@@ -0,0 +1,64 @@
#ifndef __READWRITE_H
#define __READWRITE_H
h5part_int64_t
H5_write_data (
H5PartFile *f,
const char *name,
const void *array,
const hid_t type,
const hid_t groupid,
const hid_t shape,
const hid_t memshape,
const hid_t diskshape
) ;
h5part_int64_t
H5_get_num_objects (
hid_t group_id,
const char *group_name,
const hid_t type
);
h5part_int64_t
H5_get_num_objects_matching_pattern (
hid_t group_id,
const char *group_name,
const hid_t type,
char * const pattern
);
h5part_int64_t
H5_get_object_name (
hid_t group_id,
const char *group_name,
const hid_t type,
const h5part_int64_t idx,
char *obj_name,
const h5part_int64_t len_obj_name
);
h5part_int64_t
H5_set_step (
H5PartFile *f, /*!< [in] Handle to open file */
const h5part_int64_t step /*!< [in] Time-step to set. */
);
hid_t
H5_normalize_h5_type (
hid_t type
);
h5part_int64_t
H5_get_dataset_type(
hid_t group_id,
const char *dataset_name
);
h5part_int64_t
H5_has_index (
H5PartFile *f, /*!< [in] Handle to open file */
h5part_int64_t step /*!< [in] Step number to query */
);
#endif
+563
View File
@@ -0,0 +1,563 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h> /* va_arg - System dependent ?! */
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <hdf5.h>
#include "H5PartTypes.h"
#include "H5Part.h"
#include "H5PartPrivate.h"
#include "H5PartErrors.h"
#include "H5.h"
extern h5part_error_handler _err_handler;
extern h5part_int64_t _h5part_errno;
extern unsigned _debug;
static hid_t
_get_diskshape_for_reading (
H5PartFile *f,
hid_t dataset
) {
herr_t r;
hid_t space = H5Dget_space(dataset);
if ( space < 0 ) return (hid_t)HANDLE_H5D_GET_SPACE_ERR;
if ( H5PartHasView(f) ){
hsize_t stride;
hsize_t count;
#ifdef HDF5V160
hssize_t start;
#else
hsize_t start;
#endif
/* so, is this selection inclusive or exclusive? */
start = f->viewstart;
count = f->viewend - f->viewstart; /* to be inclusive */
stride=1;
/* now we select a subset */
if ( f->diskshape > 0 ) {
r = H5Sselect_hyperslab (
f->diskshape, H5S_SELECT_SET,
&start, &stride, &count, NULL);
if ( r < 0 ) return (hid_t)HANDLE_H5S_SELECT_HYPERSLAB_ERR;
}
/* now we select a subset */
r = H5Sselect_hyperslab (
space,H5S_SELECT_SET,
&start, &stride, &count, NULL );
if ( r < 0 ) return (hid_t)HANDLE_H5S_SELECT_HYPERSLAB_ERR;
H5_print_debug (
"Selection: range=%d:%d, npoints=%d s=%d",
(int)f->viewstart,(int)f->viewend,
(int)H5Sget_simple_extent_npoints(space),
(int)H5Sget_select_npoints(space) );
}
return space;
}
static hid_t
_get_memshape_for_reading (
H5PartFile *f,
hid_t dataset
) {
if(H5PartHasView(f)) {
hsize_t dmax=H5S_UNLIMITED;
hsize_t len = f->viewend - f->viewstart;
hid_t r = H5Screate_simple(1,&len,&dmax);
if ( r < 0 ) return (hid_t)HANDLE_H5S_CREATE_SIMPLE_ERR ( len );
return r;
}
else {
return H5S_ALL;
}
}
h5part_int64_t
H5U_get_num_elems (
H5PartFile *f /*!< [in] Handle to open file */
) {
h5part_int64_t herr;
hid_t space_id;
hid_t dataset_id;
char dataset_name[128];
char step_name[128];
hsize_t nparticles;
/* Get first dataset in current time-step */
sprintf (
step_name,
"%s#%0*lld",
f->groupname_step, f->stepno_width, (long long) f->timestep );
herr = H5_get_object_name (
f->file,
step_name,
H5G_DATASET,
0,
dataset_name, sizeof (dataset_name) );
if ( herr < 0 ) return herr;
dataset_id = H5Dopen ( f->timegroup, dataset_name );
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 ) ) {
nparticles = H5Sget_select_npoints ( space_id );
if ( nparticles < 0 ) return HANDLE_H5S_GET_SELECT_NPOINTS_ERR;
}
else {
nparticles = H5Sget_simple_extent_npoints ( space_id );
if ( nparticles < 0 )
return HANDLE_H5S_GET_SIMPLE_EXTENT_NPOINTS_ERR;
}
if ( space_id != H5S_ALL ) {
herr = H5Sclose ( space_id );
if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR;
}
herr = H5Dclose ( dataset_id );
if ( herr < 0 ) return HANDLE_H5D_CLOSE_ERR;
return (h5part_int64_t) nparticles;
}
h5part_int64_t
H5U_read_elems (
H5PartFile *f, /*!< [in] Handle to open file */
const char *name, /*!< [in] Name to associate dataset with */
void *array, /*!< [out] Array of data */
const hid_t type
) {
herr_t herr;
hid_t dataset_id;
hid_t space_id;
hid_t memspace_id;
if ( f->timegroup < 0 ) {
h5part_int64_t h5err = H5_set_step ( f, f->timestep );
if ( h5err < 0 ) return h5err;
}
dataset_id = H5Dopen ( f->timegroup, name );
if ( dataset_id < 0 ) return HANDLE_H5D_OPEN_ERR ( name );
space_id = _get_diskshape_for_reading ( f, dataset_id );
if ( space_id < 0 ) return (h5part_int64_t)space_id;
memspace_id = _get_memshape_for_reading ( f, dataset_id );
if ( memspace_id < 0 ) return (h5part_int64_t)memspace_id;
#ifdef INDEPENDENT_IO
herr = H5Dread (
dataset_id,
type,
memspace_id, /* shape/size of data in memory (the
complement to disk hyperslab) */
space_id, /* shape/size of data on disk
(get hyperslab if needed) */
H5P_DEFAULT, /* ignore... its for parallel reads */
array );
#else
herr = H5Dread (
dataset_id,
type,
memspace_id, /* shape/size of data in memory (the
complement to disk hyperslab) */
space_id, /* shape/size of data on disk
(get hyperslab if needed) */
f->xfer_prop, /* ignore... its for parallel reads */
array );
#endif
if ( herr < 0 ) return HANDLE_H5D_READ_ERR ( name, f->timestep );
if ( space_id != H5S_ALL ) {
herr = H5Sclose (space_id );
if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR;
}
if ( memspace_id != H5S_ALL )
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 H5PART_SUCCESS;
}
h5part_int64_t
H5U_set_num_elements (
H5PartFile *f, /*!< [in] Handle to open file */
h5part_int64_t nparticles /*!< [in] Number of particles */
) {
CHECK_FILEHANDLE( f );
herr_t r = 0;
#ifndef PARALLEL_IO
/*
if we are not using parallel-IO, there is enough information
to know that we can short circuit this routine. However,
for parallel IO, this is going to cause problems because
we don't know if things have changed globally
*/
if ( f->nparticles == nparticles ) {
return H5PART_SUCCESS;
}
#endif
if ( f->diskshape != H5S_ALL ) {
r = H5Sclose( f->diskshape );
if ( r < 0 ) return HANDLE_H5S_CLOSE_ERR;
f->diskshape = H5S_ALL;
}
if(f->memshape != H5S_ALL) {
r = H5Sclose( f->memshape );
if ( r < 0 ) return HANDLE_H5S_CLOSE_ERR;
f->memshape = H5S_ALL;
}
if( f->shape ) {
r = H5Sclose(f->shape);
if ( r < 0 ) return HANDLE_H5S_CLOSE_ERR;
}
f->nparticles =(hsize_t) nparticles;
#ifndef PARALLEL_IO
f->shape = H5Screate_simple (1,
&(f->nparticles),
NULL);
if ( f->shape < 0 ) HANDLE_H5S_CREATE_SIMPLE_ERR ( f->nparticles );
#else /* PARALLEL_IO */
/*
The Gameplan here is to declare the overall size of the on-disk
data structure the same way we do for the serial case. But
then we must have additional "DataSpace" structures to define
our in-memory layout of our domain-decomposed portion of the particle
list as well as a "selection" of a subset of the on-disk
data layout that will be written in parallel to mutually exclusive
regions by all of the processors during a parallel I/O operation.
These are f->shape, f->memshape and f->diskshape respectively.
*/
hsize_t start[1];
hsize_t stride[1];
hsize_t count[1];
hsize_t total;
hsize_t dmax = H5S_UNLIMITED;
register int i;
/*
acquire the number of particles to be written from each MPI process
*/
r = MPI_Allgather (
&nparticles, 1, MPI_LONG_LONG,
f->pnparticles, 1, MPI_LONG_LONG,
f->comm);
if ( r != MPI_SUCCESS) {
return HANDLE_MPI_ALLGATHER_ERR;
}
if ( f->myproc == 0 ) {
_H5Part_print_debug ( "Particle offsets:" );
for(i=0;i<f->nprocs;i++)
_H5Part_print_debug ( "\tnp=%lld",
(long long) f->pnparticles[i] );
}
/* should I create a selection here? */
/* compute start offsets */
stride[0] = 1;
start[0] = 0;
for (i=0; i<f->myproc; i++) {
start[0] += f->pnparticles[i];
}
/* compute total nparticles */
total = 0;
for (i=0; i < f->nprocs; i++) {
total += f->pnparticles[i];
}
/* declare overall datasize */
f->shape = H5Screate_simple (1, &total, &total);
if (f->shape < 0) return HANDLE_H5S_CREATE_SIMPLE_ERR ( total );
/* declare overall data size but then will select a subset */
f->diskshape = H5Screate_simple (1, &total, &total);
if (f->diskshape < 0) return HANDLE_H5S_CREATE_SIMPLE_ERR ( total );
/* declare local memory datasize */
f->memshape = H5Screate_simple (1, &(f->nparticles), &dmax);
if (f->memshape < 0)
return HANDLE_H5S_CREATE_SIMPLE_ERR ( f->nparticles );
count[0] = nparticles;
r = H5Sselect_hyperslab (
f->diskshape,
H5S_SELECT_SET,
start,
stride,
count, NULL );
if ( r < 0 ) return HANDLE_H5S_SELECT_HYPERSLAB_ERR;
if ( f->timegroup < 0 ) {
r = H5_set_step ( f, 0 );
if ( r < 0 ) return r;
}
#endif
return H5PART_SUCCESS;
}
h5part_int64_t
H5U_write_data (
H5PartFile *f, /*!< IN: Handle to open file */
const char *name, /*!< IN: Name to associate array with */
const void *array, /*!< IN: Array to commit to disk */
const hid_t type /*!< IN: Type of data */
) {
CHECK_FILEHANDLE ( f );
CHECK_WRITABLE_MODE( f );
CHECK_TIMEGROUP( f );
return H5_write_data(
f,
name,
array,
type,
f->timegroup,
f->shape,
f->memshape,
f->diskshape );
}
h5part_int64_t
H5U_reset_view (
H5PartFile *f
) {
herr_t herr = 0;
f->viewstart = -1;
f->viewend = -1;
if ( f->shape != 0 ){
herr = H5Sclose(f->shape);
if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR;
f->shape=0;
}
if(f->diskshape!=0 && f->diskshape!=H5S_ALL){
herr = H5Sclose(f->diskshape);
if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR;
f->diskshape=H5S_ALL;
}
f->diskshape = H5S_ALL;
if(f->memshape!=0 && f->memshape!=H5S_ALL){
herr = H5Sclose ( f->memshape );
if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR;
f->memshape=H5S_ALL;
}
return H5PART_SUCCESS;
}
h5part_int64_t
H5U_set_view (
H5PartFile *f, /*!< [in] Handle to open file */
h5part_int64_t start, /*!< [in] Start particle */
h5part_int64_t end /*!< [in] End particle */
) {
h5part_int64_t herr = 0;
hsize_t total;
hsize_t stride = 1;
hsize_t dmax = H5S_UNLIMITED;
H5_print_debug (
"Set view (%lld,%lld).",
(long long)start,(long long)end);
herr = H5U_reset_view ( f );
if ( herr < 0 ) return herr;
if ( start == -1 && end == -1 ) return H5PART_SUCCESS;
/*
View has been reset so H5PartGetNumParticles will tell
us the total number of particles.
For now, we interpret start=-1 to mean 0 and
end==-1 to mean end of file
*/
total = (hsize_t) H5U_get_num_elems ( f );
if ( total < 0 ) return HANDLE_H5PART_GET_NUM_PARTICLES_ERR ( total );
if ( start == -1 ) start = 0;
if ( end == -1 ) end = total;
H5_print_debug ( "Total nparticles=%lld", (long long)total );
/* so, is this selection inclusive or exclusive?
it appears to be inclusive for both ends of the range.
*/
if ( end < start ) {
H5_print_warn (
"Nonfatal error. "
"End of view (%lld) is less than start (%lld).",
(long long)end, (long long)start );
end = start; /* ensure that we don't have a range error */
}
/* setting up the new view */
f->viewstart = start;
f->viewend = end;
f->nparticles = end - start + 1;
/* declare overall datasize */
f->shape = H5Screate_simple ( 1, &total, &total );
if ( f->shape < 0 )
return HANDLE_H5S_CREATE_SIMPLE_ERR ( total );
/* declare overall data size but then will select a subset */
f->diskshape= H5Screate_simple ( 1, &total, &total );
if ( f->diskshape < 0 )
return HANDLE_H5S_CREATE_SIMPLE_ERR ( total );
/* declare local memory datasize */
f->memshape = H5Screate_simple(1,&(f->nparticles),&dmax);
if ( f->memshape < 0 )
return HANDLE_H5S_CREATE_SIMPLE_ERR ( f->nparticles );
herr = H5Sselect_hyperslab (
f->diskshape,
H5S_SELECT_SET,
(hsize_t*)&start,
&stride,
&total,
NULL );
if ( herr < 0 ) return HANDLE_H5S_SELECT_HYPERSLAB_ERR;
return H5PART_SUCCESS;
}
h5part_int64_t
H5U_get_view (
H5PartFile *f,
h5part_int64_t *start,
h5part_int64_t *end
) {
h5part_int64_t viewstart = 0;
h5part_int64_t viewend = 0;
if ( f->viewstart >= 0 )
viewstart = f->viewstart;
if ( f->viewend >= 0 ) {
viewend = f->viewend;
}
else {
viewend = H5U_get_num_elems ( f );
if ( viewend < 0 )
return HANDLE_H5PART_GET_NUM_PARTICLES_ERR ( viewend );
}
if ( start ) *start = viewstart;
if ( end ) *end = viewend;
return viewend - viewstart;
}
h5part_int64_t
H5U_set_canonical_view (
H5PartFile *f
) {
h5part_int64_t herr = H5U_reset_view ( f );
if ( herr < 0 ) return HANDLE_H5PART_SET_VIEW_ERR( herr, -1, -1 );
#ifdef PARALLEL_IO
h5part_int64_t start = 0;
h5part_int64_t end = 0;
h5part_int64_t n = 0;
int i = 0;
n = H5U_get_num_elems ( f );
if ( n < 0 ) return HANDLE_H5PART_GET_NUM_PARTICLES_ERR ( n );
/*
now lets query the attributes for this group to see if there
is a 'pnparticles' group that contains the offsets for the
processors.
*/
if ( H5_read_attrib (
f->timegroup,
"pnparticles", f->pnparticles ) < 0) {
/*
Attribute "pnparticles" is not available. So
subdivide the view into NP mostly equal pieces
*/
n /= f->nprocs;
for ( i=0; i<f->nprocs; i++ ) {
f->pnparticles[i] = n;
}
}
for ( i = 0; i < f->myproc; i++ ){
start += f->pnparticles[i];
}
end = start + f->pnparticles[f->myproc] - 1;
herr = H5U_set_view ( f, start, end );
if ( herr < 0 ) return HANDLE_H5PART_SET_VIEW_ERR ( herr, start, end );
#endif
return H5PART_SUCCESS;
}
/*!
Get information about dataset in current index given by its index
*/
h5part_int64_t
H5U_get_dataset_info (
H5PartFile *f, /*!< [in] Handle to open file */
const h5part_int64_t idx,/*!< [in] Index of the dataset */
char *dataset_name, /*!< [out] Name of dataset */
const h5part_int64_t len_dataset_name,
/*!< [in] Size of buffer \c dataset_name */
h5part_int64_t *type, /*!< [out] Type of data in dataset */
h5part_int64_t *nelem /*!< [out] Number of elements. */
) {
h5part_int64_t herr = H5_get_object_name (
f->file,
f->index_name,
H5G_DATASET,
idx,
dataset_name,
len_dataset_name );
if ( herr < 0 ) return herr;
if ( nelem ) {
*nelem = H5U_get_num_elems ( f );
if ( *nelem < 0 ) return *nelem;
}
if ( type ) {
*type = H5_get_dataset_type( f->timegroup, dataset_name );
if ( *type < 0 ) return *type;
}
return H5PART_SUCCESS;
}
+64
View File
@@ -0,0 +1,64 @@
#ifndef __U_READWRITE_H
#define __U_READWRITE_H
h5part_int64_t
H5U_get_num_elems (
H5PartFile *f
);
h5part_int64_t
H5U_read_elems (
H5PartFile *f,
const char *name,
void *array,
const hid_t type
);
h5part_int64_t
H5U_set_num_elements (
H5PartFile *f,
h5part_int64_t nparticles
);
h5part_int64_t
H5U_write_data (
H5PartFile *f,
const char *name,
const void *array,
const hid_t type
);
h5part_int64_t
H5U_reset_view (
H5PartFile *f
);
h5part_int64_t
H5U_set_view (
H5PartFile *f,
h5part_int64_t start,
h5part_int64_t end
);
h5part_int64_t
H5U_get_view (
H5PartFile *f,
h5part_int64_t *start,
h5part_int64_t *end
);
h5part_int64_t
H5U_set_canonical_view (
H5PartFile *f
);
h5part_int64_t
H5U_get_dataset_info (
H5PartFile *f,
const h5part_int64_t idx,
char *dataset_name,
const h5part_int64_t len_dataset_name,
h5part_int64_t *type,
h5part_int64_t *nelem
);
#endif