From ca8decaf455246075ab414ce405c2f3f8f33bae5 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Fri, 25 Jan 2008 19:30:41 +0000 Subject: [PATCH] est/H5BlockTestAttributes.c - adaption to renamed elements in struct h5_file src/H5PartErrors.h src/H5BlockTypes.h src/H5Part.h src/H5Block.c - refactoring src/H5Fed.h src/H5Fed_statistics.c src/Makefile.am src/H5BlockErrors.h src/h5/h5_types.h src/h5/attribs.c src/h5/t_readwrite.c src/h5/u_readwrite.c src/h5/t_openclose.c src/h5/H5.h src/h5/readwrite.c src/h5/openclose.c src/h5/openclose.h src/H5Fed.c - H5Fed write vertices and tets --- src/H5Block.c | 15 ++- src/H5BlockErrors.h | 8 +- src/H5BlockTypes.h | 27 ----- src/H5Fed.c | 2 +- src/H5Fed.h | 211 ++++++++++++++++++++--------------- src/H5Fed_statistics.c | 117 +------------------ src/H5Part.h | 32 +++--- src/H5PartErrors.h | 112 +++++++++---------- src/Makefile.am | 8 +- src/h5/H5.h | 2 + src/h5/attribs.c | 1 - src/h5/h5_types.h | 164 +++++++++++++++++---------- src/h5/openclose.c | 67 ++++------- src/h5/openclose.h | 11 +- src/h5/readwrite.c | 27 ++--- src/h5/t_openclose.c | 64 +++++++++-- src/h5/t_readwrite.c | 168 ++++++++++++++++++++-------- src/h5/u_readwrite.c | 10 +- test/H5BlockTestAttributes.c | 4 +- 19 files changed, 539 insertions(+), 511 deletions(-) diff --git a/src/H5Block.c b/src/H5Block.c index 55e7435..421ce4a 100644 --- a/src/H5Block.c +++ b/src/H5Block.c @@ -49,7 +49,6 @@ #include "H5BlockTypes.h" #include "H5Block.h" -#include "H5BlockPrivate.h" #include "h5/H5.h" #include "H5BlockErrors.h" @@ -442,7 +441,7 @@ _dissolve_ghostzones ( f->nprocs * sizeof (*f->block->user_layout) ); p_begin = p_max = p_end = (struct list*) malloc ( sizeof ( *p_begin ) ); - if ( p_begin == NULL ) return HANDLE_H5PART_NOMEM_ERR; + if ( p_begin == NULL ) return HANDLE_H5_NOMEM_ERR; memset ( p_begin, 0, sizeof ( *p_begin ) ); @@ -456,7 +455,7 @@ _dissolve_ghostzones ( if ( _have_ghostzone ( p, q ) ) { p_el = (struct list*) malloc ( sizeof ( *p_el ) ); if ( p_el == NULL ) - return HANDLE_H5PART_NOMEM_ERR; + return HANDLE_H5_NOMEM_ERR; p_el->p = p; p_el->q = q; @@ -596,7 +595,7 @@ H5BlockDefine3DFieldLayout( _get_dimension_sizes ( f ); herr = _dissolve_ghostzones ( f ); - if ( herr < 0 ) return HANDLE_H5PART_LAYOUT_ERR; + if ( herr < 0 ) return HANDLE_H5_LAYOUT_ERR; herr = _release_hyperslab ( f ); if ( herr < 0 ) return HANDLE_H5S_CLOSE_ERR; @@ -784,7 +783,7 @@ _open_field_group ( if ( h5err < 0 ) return h5err; if ( ! _have_object ( b->blockgroup, name ) ) - return HANDLE_H5PART_NOENT_ERR ( name ); + return HANDLE_H5_NOENT_ERR ( name ); herr_t herr = H5Gopen ( b->blockgroup, name ); if ( herr < 0 ) return HANDLE_H5G_OPEN_ERR ( name ); @@ -847,14 +846,14 @@ _select_hyperslab_for_reading ( rank = H5Sget_simple_extent_dims ( b->diskshape, NULL, NULL ); if ( rank < 0 ) return HANDLE_H5S_GET_SIMPLE_EXTENT_DIMS_ERR; - if ( rank != 3 ) return HANDLE_H5PART_DATASET_RANK_ERR ( rank, 3 ); + if ( rank != 3 ) return HANDLE_H5_DATASET_RANK_ERR ( rank, 3 ); rank = H5Sget_simple_extent_dims ( b->diskshape, field_dims, NULL ); if ( rank < 0 ) return HANDLE_H5S_GET_SIMPLE_EXTENT_DIMS_ERR; if ( (field_dims[0] < (hsize_t)b->k_max) || (field_dims[1] < (hsize_t)b->j_max) || - (field_dims[2] < (hsize_t)b->i_max) ) return HANDLE_H5PART_LAYOUT_ERR; + (field_dims[2] < (hsize_t)b->i_max) ) return HANDLE_H5_LAYOUT_ERR; H5_print_debug ( "PROC[%d]: \n" @@ -1186,7 +1185,7 @@ _create_field_group ( if ( h5err < 0 ) return h5err; if ( _have_object ( b->blockgroup, name ) ) - return HANDLE_H5PART_GROUP_EXISTS_ERR ( name ); + return HANDLE_H5_GROUP_EXISTS_ERR ( name ); herr_t herr = H5Gcreate ( b->blockgroup, name, 0 ); if ( herr < 0 ) return HANDLE_H5G_CREATE_ERR ( name ); diff --git a/src/H5BlockErrors.h b/src/H5BlockErrors.h index a31baeb..c5a7021 100644 --- a/src/H5BlockErrors.h +++ b/src/H5BlockErrors.h @@ -10,26 +10,26 @@ H5PART_ERR_LAYOUT, \ "No layout defined." ) -#define HANDLE_H5PART_LAYOUT_ERR \ +#define HANDLE_H5_LAYOUT_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ H5PART_ERR_LAYOUT, \ "Bad layout." ); -#define HANDLE_H5PART_NOENT_ERR( name ) \ +#define HANDLE_H5_NOENT_ERR( name ) \ (*_err_handler) ( \ H5_get_funcname(), \ H5PART_ERR_NOENT, \ "Object \"%s\" doesn't exists.", name ); -#define HANDLE_H5PART_DATASET_RANK_ERR( m, n ) \ +#define HANDLE_H5_DATASET_RANK_ERR( m, n ) \ (*_err_handler) ( \ H5_get_funcname(), \ H5PART_ERR_INVAL, \ "Wrong rank of dataset: Is %d, but should be %d", \ m, n ); -#define HANDLE_H5PART_GROUP_EXISTS_ERR( name ) \ +#define HANDLE_H5_GROUP_EXISTS_ERR( name ) \ (*_err_handler) ( \ H5_get_funcname(), \ H5PART_ERR_INVAL, \ diff --git a/src/H5BlockTypes.h b/src/H5BlockTypes.h index b2984e4..97b7704 100644 --- a/src/H5BlockTypes.h +++ b/src/H5BlockTypes.h @@ -1,32 +1,5 @@ #ifndef __H5BLOCKTYPES_H #define __H5BLOCKTYPES_H -struct H5BlockPartition { - h5part_int64_t i_start; - h5part_int64_t i_end; - h5part_int64_t j_start; - h5part_int64_t j_end; - h5part_int64_t k_start; - h5part_int64_t k_end; -}; - -struct h5b_fdata { - h5part_int64_t step_idx; - h5part_int64_t i_max; - h5part_int64_t j_max; - h5part_int64_t k_max; - struct H5BlockPartition *user_layout; - struct H5BlockPartition *write_layout; - int have_layout; - - hid_t shape; - hid_t memshape; - hid_t diskshape; - hid_t blockgroup; - hid_t field_group_id; -}; - -#define H5PART_ERR_LAYOUT -100 -#define H5PART_ERR_NOENT -101 #endif diff --git a/src/H5Fed.c b/src/H5Fed.c index b992b16..db9483e 100644 --- a/src/H5Fed.c +++ b/src/H5Fed.c @@ -36,7 +36,7 @@ */ #include -#include "h5/h5_types.h" +#include "h5/H5.h" #include "H5Fed.h" diff --git a/src/H5Fed.h b/src/H5Fed.h index bd6944b..4298312 100644 --- a/src/H5Fed.h +++ b/src/H5Fed.h @@ -54,11 +54,6 @@ h5_int_t H5FedHasBoundaryMesh( /****** VERTEX statistics routines *******************************************/ -h5_size_t H5FedGetNumVertices ( - h5_file * fh, - const h5_id_t level - ); - h5_size_t H5FedGetNumVerticesTotal( h5_file * fh, const h5_id_t level @@ -72,17 +67,12 @@ h5_size_t H5FedGetNumVerticesCnode ( /****** EDGE statistics routines ********************************************/ -h5_size_t H5FedGetNumEdgesInTetrahedralMesh ( +h5_size_t H5FedGetNumEdgesTotal ( h5_file * fh, const h5_id_t level ); -h5_size_t H5FedGetNumEdgesInTetrahedralMeshTotal ( - h5_file * fh, - const h5_id_t level - ); - -h5_size_t H5FedGetNumEdgeInTetrahedralMeshCnode ( +h5_size_t H5FedGetNumEdgesCnode ( h5_file * fh, const h5_id_t level, const h5_id_t cnode @@ -90,17 +80,12 @@ h5_size_t H5FedGetNumEdgeInTetrahedralMeshCnode ( /****** TRIANGLE statistics routines *****************************************/ -h5_size_t H5FedGetNumTrianglesInTetrahedralMesh ( +h5_size_t H5FedGetNumTrianglesTotal ( h5_file * fh, const h5_id_t level ); -h5_size_t H5FedGetNumTrianglesInTetrahedralMeshTotal ( - h5_file * fh, - const h5_id_t level - ); - -h5_size_t H5FedGetNumTrianglesInTetrahedralMeshCnode ( +h5_size_t H5FedGetNumTrianglesCnode ( h5_file * fh, const h5_id_t level, const h5_id_t cnode @@ -108,11 +93,6 @@ h5_size_t H5FedGetNumTrianglesInTetrahedralMeshCnode ( /****** TETRAHEDRON statistics routines **************************************/ -h5_size_t H5FedGetNumTetrahedra ( - h5_file * fh, - const h5_id_t level - ); - h5_size_t H5FedGetNumTetrahedraTotal( h5_file * fh, const h5_id_t level @@ -126,11 +106,6 @@ h5_size_t H5FedGetNumTetrahedraCnode ( /****** BOUNDARY statistics routines ****************************************/ -h5_size_t H5FedGetNumBoundaryTriangles ( - h5_file * fh, - const h5_id_t level - ); - h5_size_t H5FedGetNumBoundaryTrianglesTotal ( h5_file * fh, const h5_id_t level @@ -142,89 +117,145 @@ h5_size_t H5FedGetNumBoundaryTrianglesCnode ( const h5_id_t cnode ); -/****** RETRIEVAL routines **************************************************/ +/****** STORE / RETRIEVAL routines ********************************************/ -h5_vertex * H5FedGetVertexCoordinate ( - h5_file * fh, - const h5_id_t level, - const h5_id_t vertex_id +/* vertices */ +h5_size_t +H5FedSetNumVertices ( + h5_file * f, + const h5_size_t num ); -h5_edge * H5FedGetEdge ( - h5_file * fh, - const h5_id_t level, - const h5_id_t local_id +h5_size_t +H5FedGetNumVertices ( + h5_file * f ); -h5_triangle * H5FedGetTriangle ( - h5_file * fh, - const h5_id_t level, - const h5_id_t local_id +h5_id_t +H5FedStoreVertex ( + h5_file * f, + const h5_id_t id, + const h5_float64_t P[3] ); -h5_tetrahedron * H5FedGetTetrahedron ( - h5_file * fh, - const h5_id_t level, - const h5_id_t local_id +h5_id_t +H5FedGetVertex ( + h5_file * f, + h5_id_t * const id, + h5_float64_t * const P[3] ); -h5_triangle * H5FedGetBoundaryTriangle ( - h5_file * fh, - const h5_id_t level, - const h5_id_t local_id +/* edges */ +h5_size_t +H5FedSetNumEdges ( + h5_file * f, + const h5_size_t num ); -/****** STORE routines*****************************************************/ - -h5_int_t H5FedSetNumVertices ( - h5_file * fh, - const h5_id_t level, - const h5_size_t num_vertices +h5_size_t +H5FedGetNumEdges ( + h5_file * f ); -h5_int_t H5FedSetNumTetrahedra ( +h5_id_t +H5FedStoreEdge ( + h5_file * f, + const h5_id_t id, + const h5_id_t parent_id, + const h5_id_t vertex_ids[2] + ); + +h5_id_t +H5FedGetEdge ( + h5_file * f, + h5_id_t * const id, + h5_id_t * const parent_id, + h5_id_t * const vertex_ids[2] + ); + +/* triangles */ +h5_size_t +H5FedSetNumTriangles ( + h5_file * f, + const h5_size_t num + ); + +h5_size_t +H5FedGetNumTriangles ( + h5_file * f + ); + +h5_int_t +H5FedStoreTriangle ( + h5_file * f, + const h5_id_t id, + const h5_id_t parent_id, + const h5_id_t vertex_ids[3] + ); + +h5_id_t +H5FedGetTriangle ( + h5_file * f, + h5_id_t * const id, + h5_id_t * const parent_id, + h5_id_t * const vertex_ids[2] + ); + +/* boundary triangles */ +h5_size_t +H5FedSetNumBoundaryTriangles ( + h5_file * f, + const h5_size_t num + ); + +h5_size_t +H5FedGetNumBoundaryTriangles ( + h5_file * f + ); + + +h5_id_t +H5FedStoreBoundaryTriangle ( h5_file * fh, - const h5_id_t level, + const h5_id_t id, + const h5_id_t parent_id, + const h5_id_t vertex_ids[3] + ); + +h5_id_t +H5FedGetBoundaryTriangle ( + h5_file * f, + h5_id_t * const id, + h5_id_t * const parent_id, + h5_id_t * const vertex_ids[3] + ); + +/* tetrahedra */ +h5_size_t +H5FedSetNumTetrahedra ( + h5_file * f, const h5_size_t num_tet ); -h5_int_t H5FedStoreVertexCoordinate ( - h5_file * fh, - const h5_id_t level, - const h5_id_t vertex_id, - const h5_vertex * const vertex +h5_size_t +H5FedGetNumTetrahedra ( + h5_file * f ); -h5_int_t H5FedStoreEdge ( - h5_file * fh, - const h5_id_t level, - const h5_id_t edge_id, +h5_id_t +H5FedStoreTetrahedron ( + h5_file * f, + const h5_id_t id, const h5_id_t parent_id, - const h5_edge * const edge + const h5_id_t vertex_ids[4] ); -h5_int_t H5FedStoreTriangle ( - h5_file * fh, - const h5_id_t level, - const h5_id_t triangle_id, - const h5_id_t parent_id, - const h5_triangle * const triangle - ); - -h5_int_t H5FedStoreTetrahedron ( - h5_file * fh, - const h5_id_t level, - const h5_id_t tet_id, - const h5_id_t parent_id, - const h5_tetrahedron * const tet/*!< 4-tuple with vertex id's */ - ); - -h5_int_t H5FedStoreBoundaryTriangle ( - h5_file * fh, - const h5_id_t level, - const h5_id_t btriangle_id, - const h5_id_t parent_id, - const h5_triangle * const btriangle +h5_id_t +H5FedGetTetrahedron ( + h5_file * f, + h5_id_t * const id, + h5_id_t * parent_id, + h5_id_t * const vertex_ids[4] ); /****** UPWARD ADJACENCY routines *********************************************/ diff --git a/src/H5Fed_statistics.c b/src/H5Fed_statistics.c index d94dcf5..d3f0e53 100644 --- a/src/H5Fed_statistics.c +++ b/src/H5Fed_statistics.c @@ -18,21 +18,6 @@ #include "h5/h5_types.h" #include "H5Fed.h" -/*! - \ingroup h5fed_c_api - - Get the number of vertices used for defining a submesh - at level \c level for this compute node in current step. - - \return number of vertices - \return \c -1 on error. -*/ -h5_size_t H5FedGetNumVertices ( - h5_file * fh, /*!< file handle */ - const h5_id_t level /*!< mesh level to query */ - ) { - return -1; -} /*! \ingroup h5fed_c_api @@ -69,31 +54,6 @@ h5_size_t H5FedGetNumVerticesCnode ( /****** EDGE statistics routines ********************************************/ -/*! - \ingroup h5fed_c_api - - Returns the number of edges present in the mesh at level \c level in - current time step on this compute node. - - \return number of edges - \return \c -1 on error. - - \note - It is left to the API implementor how to make this information - available; in general he can compute it from the definition of - the tetrahedral mesh. - - \note - After counting the number for the local cnode we call MPI_Gather() - to collect the number from the other cnodes and store them into an - array. The inquired number will be provided from this array. -*/ -h5_size_t H5FedGetNumEdgesInTetrahedralMesh ( - h5_file * fh, /*!< file handle */ - const h5_id_t level /*!< mesh level to query */ - ) { - return -1; -} /*! \ingroup h5fed_c_api @@ -104,7 +64,7 @@ h5_size_t H5FedGetNumEdgesInTetrahedralMesh ( \return number of edges \return \c -1 on error. */ -h5_size_t H5FedGetNumEdgesInTetrahedralMeshTotal ( +h5_size_t H5FedGetNumEdgesTotal ( h5_file * fh, /*!< file handle */ const h5_id_t level /*!< mesh level to query */ ) { @@ -120,7 +80,7 @@ h5_size_t H5FedGetNumEdgesInTetrahedralMeshTotal ( \return number of edges \return \c -1 on error. */ -h5_size_t H5FedGetNumEdgeInTetrahedralMeshCnode ( +h5_size_t H5FedGetNumEdgesCnode ( h5_file * fh, /*!< file handle */ const h5_id_t level, /*!< mesh level to query */ const h5_id_t cnode /*!< compute node */ @@ -130,27 +90,6 @@ h5_size_t H5FedGetNumEdgeInTetrahedralMeshCnode ( /****** TRIANGLE statistics routines *****************************************/ -/*! - \ingroup h5fed_c_api - - Get the number of triangles present in the mesh at level \c level in - current time step on this compute note. - - \return Number of triangles - \return \c -1 on error. - - \note - After counting the number for the local cnode we call MPI_Gather() - to collect the number from the other cnodes and store them into an - array. The inquired number will be provided from this array. -*/ -h5_size_t H5FedGetNumTrianglesInTetrahedralMesh ( - h5_file * fh, /*!< file handle */ - const h5_id_t level /*!< mesh level to query */ - ) { - return -1; -} - /*! \ingroup h5fed_c_api @@ -160,7 +99,7 @@ h5_size_t H5FedGetNumTrianglesInTetrahedralMesh ( \return Number of triangles \return \c -1 on error. */ -h5_size_t H5FedGetNumTrianglesInTetrahedralMeshTotal ( +h5_size_t H5FedGetNumTrianglesTotal ( h5_file * fh, /*!< file handle */ const h5_id_t level /*!< mesh level to query */ ) { @@ -176,7 +115,7 @@ h5_size_t H5FedGetNumTrianglesInTetrahedralMeshTotal ( \return Number of triangles \return \c -1 on error. */ -h5_size_t H5FedGetNumTrianglesInTetrahedralMeshCnode ( +h5_size_t H5FedGetNumTrianglesCnode ( h5_file * fh, /*!< file handle */ const h5_id_t level, /*!< mesh level to query */ const h5_id_t cnode /*!< compute node */ @@ -186,27 +125,6 @@ h5_size_t H5FedGetNumTrianglesInTetrahedralMeshCnode ( /****** TETRAHEDRON statistics routines **************************************/ -/*! - \ingroup h5fed_c_api - - Returns the number of tetrahedral elements present in the mesh at - level \c level in current step on this compute node. - - \return number of tetrahedra - \return \c -1 on error. - - \note - After counting the number for the local cnode we call MPI_Gather() - to collect the number from the other cnodes and store them into an - array. The inquired number will be provided from this array. -*/ -h5_size_t H5FedGetNumTetrahedra ( - h5_file * fh, /*!< file handle */ - const h5_id_t level /*!< mesh level to query */ - ) { - return -1; -} - /*! \ingroup h5fed_c_api @@ -242,33 +160,6 @@ h5_size_t H5FedGetNumTetrahedraCnode ( /****** BOUNDARY statistics routines ****************************************/ -/*! - \ingroup h5fed_c_api - - Get the number of boundary triangles present in the mesh at - level \c level in current step on this compute node. - - \return number of tetrahedras - \return \c -1 on error. - - \note - It is left to the API implementor how to make this information - available. In general he can compute it from the definition - of the tetrahedral mesh, using the adjacency relations, i.e. - the fact that a boundary triangle has only one single adjacent - tetrahedron. - - \note - After counting the number for the local cnode we call MPI_Gather() - to collect the number from the other cnodes and store them into an - array. The inquired number will be provided from this array. -*/ -h5_size_t H5FedGetNumBoundaryTriangles ( - h5_file * fh, /*!< file handle */ - const h5_id_t level /*!< mesh level to query */ - ) { - return -1; -} /*! \ingroup h5fed_c_api diff --git a/src/H5Part.h b/src/H5Part.h index 6b65ee4..9998b2b 100644 --- a/src/H5Part.h +++ b/src/H5Part.h @@ -14,27 +14,21 @@ extern "C" { #include "H5PartTypes.h" +#define H5PART_SUCCESS H5_SUCCESS +#define H5PART_ERR_NOMEM H5_ERR_NOMEM +#define H5PART_ERR_INVAL H5_ERR_INVAL +#define H5PART_ERR_BADFD H5_ERR_BADFD +#define H5PART_ERR_LAYOUT H5_ERR_LAYOUT +#define H5PART_ERR_NOENT H5_ERR_NOENT +#define H5PART_ERR_INIT H5_ERR_INIT +#define H5PART_ERR_NOENTRY H5_ERR_NOENTRY -#define H5PART_SUCCESS 0 -#define H5PART_ERR_NOMEM -12 -#define H5PART_ERR_INVAL -22 -#define H5PART_ERR_BADFD -77 +#define H5PART_ERR_MPI H5_ERR_MPI +#define H5PART_ERR_HDF5 H5_ERR_HDF5 -#define H5PART_ERR_INIT -200 -#define H5PART_ERR_NOENTRY -201 - -#define H5PART_ERR_MPI -201 -#define H5PART_ERR_HDF5 -202 - - -#define H5_O_RDONLY 0x01 -#define H5_O_WRONLY 0x02 -#define H5_O_APPEND 0x03 -#define H5_O_RDWR 0x04 - -#define H5PART_READ H5_O_RDONLY # legacy def, will be removed -#define H5PART_WRITE H5_O_WRONLY # legacy def, will be removed -#define H5PART_APPEND H5_O_APPEND # legacy def, will be removed +#define H5PART_READ H5_O_RDONLY +#define H5PART_WRITE H5_O_WRONLY +#define H5PART_APPEND H5_O_APPEND #define H5PART_INT64 ((h5part_int64_t)H5T_NATIVE_INT64) #define H5PART_FLOAT64 ((h5part_int64_t)H5T_NATIVE_DOUBLE) diff --git a/src/H5PartErrors.h b/src/H5PartErrors.h index b7fae5f..b4c38c8 100644 --- a/src/H5PartErrors.h +++ b/src/H5PartErrors.h @@ -6,85 +6,85 @@ #define CHECK_FILEHANDLE( f ) \ if ( H5_check_filehandle ( f ) != H5PART_SUCCESS ) \ - return HANDLE_H5PART_BADFD_ERR; + return HANDLE_H5_BADFD_ERR; #define CHECK_WRITABLE_MODE( f ) \ if ( f->mode==H5PART_READ ) \ return (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_INVAL, \ + H5_ERR_INVAL, \ "Attempting to write to read-only file" ); #define CHECK_READONLY_MODE( f ) \ if ( ! f->mode==H5PART_READ ) \ return (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_INVAL, \ + H5_ERR_INVAL, \ "Operation is not allowed on writable files." ); #define CHECK_TIMEGROUP( f ) \ if ( f->step_gid <= 0 ) \ return (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_INVAL, \ + H5_ERR_INVAL, \ "Timegroup <= 0."); /**************** H5Part *********************/ -#define HANDLE_H5PART_BADFD_ERR \ +#define HANDLE_H5_BADFD_ERR \ (*_err_handler)( \ H5_get_funcname(), \ - H5PART_ERR_BADFD, \ + H5_ERR_BADFD, \ "Called with bad filehandle." ); -#define HANDLE_H5PART_INIT_ERR \ +#define HANDLE_H5_INIT_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_INIT, \ + H5_ERR_INIT, \ "Cannot initialize H5Part." ); -#define HANDLE_H5PART_NOMEM_ERR \ +#define HANDLE_H5_NOMEM_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_NOMEM, \ + H5_ERR_NOMEM, \ "Out of memory." ); -#define HANDLE_H5PART_SETSTEP_ERR( rc, step ) \ +#define HANDLE_H5_SETSTEP_ERR( rc, step ) \ (*_err_handler) ( \ H5_get_funcname(), \ rc, \ "Cannont set time-step to %lld.", (long long)step ); -#define HANDLE_H5PART_FILE_ACCESS_TYPE_ERR( flags ) \ +#define HANDLE_H5_FILE_ACCESS_TYPE_ERR( flags ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_INVAL, \ + H5_ERR_INVAL, \ "Invalid file access type \"%d\".", flags); -#define HANDLE_H5PART_STEP_EXISTS_ERR( step ) \ +#define HANDLE_H5_STEP_EXISTS_ERR( step ) \ (*_err_handler)( \ H5_get_funcname(), \ - H5PART_ERR_INVAL, \ + 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_H5PART_SET_VIEW_ERR( rc, start, end ) \ +#define HANDLE_H5_SET_VIEW_ERR( rc, start, end ) \ (*_err_handler) ( \ H5_get_funcname(), \ rc, \ "Cannot set view to (%lld, %lld).", \ (long long)start, (long long)end ); -#define HANDLE_H5PART_GET_NUM_PARTICLES_ERR( rc ) \ +#define HANDLE_H5_GET_NUM_PARTICLES_ERR( rc ) \ (*_err_handler) ( \ H5_get_funcname(), \ rc, \ "Cannot get number of particles." ); -#define HANDLE_H5PART_NOENTRY_ERR( group_name, type, idx ) \ +#define HANDLE_H5_NOENTRY_ERR( group_name, type, idx ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_NOENTRY, \ + H5_ERR_NOENTRY, \ "No entry with index %lld and type %d in group %s!", \ (long long)idx, type, group_name ); @@ -93,107 +93,107 @@ #define HANDLE_H5A_CLOSE_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot terminate access to attribute." ); #define HANDLE_H5A_CREATE_ERR( s ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot create attribute \"%s\".", s ); #define HANDLE_H5A_GET_NAME_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot get attribute name." ); #define HANDLE_H5A_GET_NUM_ATTRS_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot get number of attributes." ); #define HANDLE_H5A_GET_SPACE_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot get a copy of dataspace for attribute." ); #define HANDLE_H5A_GET_TYPE_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot get attribute datatype." ); #define HANDLE_H5A_OPEN_IDX_ERR( n ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot open attribute specified by index \"%lld\".", \ (long long)n ); #define HANDLE_H5A_OPEN_NAME_ERR( s ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot open attribute specified by name \"%s\".", s ); #define HANDLE_H5A_READ_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot read attribute" ); #define HANDLE_H5A_WRITE_ERR( s ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot write attribute \"%s\".", s ); /* H5D: Dataset */ #define HANDLE_H5D_CLOSE_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Close of dataset failed." ); #define HANDLE_H5D_CREATE_ERR( s, n ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot create dataset for name \"%s\", step \"%lld\".", \ s, (long long) n ); #define HANDLE_H5D_GET_SPACE_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot get dataspace identifier."); #define HANDLE_H5D_GET_TYPE_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot determine dataset type."); #define HANDLE_H5D_OPEN_ERR( s ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot open dataset \"%s\".", s ); #define HANDLE_H5D_READ_ERR( s, n ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Read from dataset \"%s\" failed, step \"%lld\".", \ s, (long long) n ); #define HANDLE_H5D_WRITE_ERR( s, n ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Write to dataset \"%s\" failed, step \"%lld\".", \ s, (long long)n ); @@ -201,13 +201,13 @@ #define HANDLE_H5F_CLOSE_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot terminate access to file." ); #define HANDLE_H5F_OPEN_ERR( filename, flags ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot open file \"%s\" with mode \"%d\"", filename, flags ); @@ -216,25 +216,25 @@ #define HANDLE_H5G_CLOSE_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot terminate access to datagroup." ); #define HANDLE_H5G_CREATE_ERR( s ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot create datagroup \"%s\".", s ); #define HANDLE_H5G_GET_OBJINFO_ERR( s ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot get information about object \"%s\".", s ); #define HANDLE_H5G_OPEN_ERR( s ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot open group \"%s\".", s ); @@ -242,26 +242,26 @@ #define HANDLE_H5P_CLOSE_ERR( s ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot terminate access to property list \"%s\".", s ); #define HANDLE_H5P_CREATE_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot create property list." ); #define HANDLE_H5P_SET_DXPL_MPIO_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "MPI: Cannot set data transfer mode." ); #define HANDLE_H5P_SET_FAPL_MPIO_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot store IO communicator information to the " \ "file access property list."); @@ -269,63 +269,63 @@ #define HANDLE_H5S_CREATE_SIMPLE_ERR( n ) \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot create dataspace with len \"%lld\".", (long long) n ); #define HANDLE_H5S_CLOSE_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot terminate access to dataspace." ); #define HANDLE_H5S_GET_SELECT_NPOINTS_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot determine the number of elements in dataspace selection." ); #define HANDLE_H5S_GET_SIMPLE_EXTENT_NPOINTS_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot determine number of elements in dataspace." ); #define HANDLE_H5S_SELECT_HYPERSLAB_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot set select hyperslap region or add the specified region" ); /* H5T: type */ #define HANDLE_H5T_CLOSE_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_HDF5, \ + H5_ERR_HDF5, \ "Cannot release datatype." ); /* MPI */ #define HANDLE_MPI_ALLGATHER_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_MPI, \ + H5_ERR_MPI, \ "Cannot gather data." ); #define HANDLE_MPI_COMM_SIZE_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_MPI, \ + H5_ERR_MPI, \ "Cannot get number of processes in my group." ); #define HANDLE_MPI_COMM_RANK_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_MPI, \ + H5_ERR_MPI, \ "Cannot get rank of the calling process in my group." ); #define HANDLE_MPI_UNAVAILABLE_ERR \ (*_err_handler) ( \ H5_get_funcname(), \ - H5PART_ERR_MPI, \ + H5_ERR_MPI, \ "MPI not available" ); #endif diff --git a/src/Makefile.am b/src/Makefile.am index bf726de..7188155 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -61,9 +61,8 @@ libH5Part_a_SOURCES = \ H5Fed.c \ H5Fed_adjacency.c \ H5Fed_dof.c \ - H5Fed_retrieve.c \ H5Fed_statistics.c \ - H5Fed_store.c + H5Fed_storeretrieve.c SUBDIRS = h5 bindings @@ -78,7 +77,10 @@ libH5Part.a: $(libH5Part_a_OBJECTS) H5Part.o: H5Part.c H5Part.h H5PartPrivate.h H5PartTypes.h H5Block.o: H5Block.c H5Part.h H5PartPrivate.h H5PartTypes.h H5Block.h H5BlockTypes.h -clean: +clean-recursive: + for d in ${SUBDIRS}; do ${MAKE} -C $$d clean; done + +clean: clean-recursive rm -f *~ *.o *.a *.so distclean: clean diff --git a/src/h5/H5.h b/src/h5/H5.h index 3a29c2b..758bc88 100644 --- a/src/h5/H5.h +++ b/src/h5/H5.h @@ -2,11 +2,13 @@ #define __H5_H #include "h5_types.h" +#include "h5_private.h" #include "attribs.h" #include "errorhandling.h" #include "openclose.h" #include "readwrite.h" +#include "t_readwrite.h" #include "u_readwrite.h" #endif diff --git a/src/h5/attribs.c b/src/h5/attribs.c index 34005ca..9b995c1 100644 --- a/src/h5/attribs.c +++ b/src/h5/attribs.c @@ -11,7 +11,6 @@ #include "H5Part.h" #include "H5Block.h" #include "H5PartPrivate.h" -#include "H5BlockPrivate.h" #include "H5PartErrors.h" #include "H5BlockErrors.h" #include "H5.h" diff --git a/src/h5/h5_types.h b/src/h5/h5_types.h index 1167e67..77afb82 100644 --- a/src/h5/h5_types.h +++ b/src/h5/h5_types.h @@ -8,6 +8,24 @@ #include #include +#define H5_SUCCESS 0 +#define H5_ERR_NOMEM -12 +#define H5_ERR_INVAL -22 +#define H5_ERR_BADFD -77 + +#define H5_ERR_LAYOUT -100 +#define H5_ERR_NOENT -101 + +#define H5_ERR_INIT -200 +#define H5_ERR_NOENTRY -201 + +#define H5_ERR_MPI -201 +#define H5_ERR_HDF5 -202 + +#define H5_O_RDONLY 0x01 +#define H5_O_WRONLY 0x02 +#define H5_O_APPEND 0x03 +#define H5_O_RDWR 0x04 #ifdef WIN32 typedef __int64 int64_t; @@ -24,6 +42,8 @@ typedef double h5_float64_t; typedef h5_float64_t h5_float_t; typedef h5_float64_t h5part_float64_t; +typedef h5_err_t h5_int32_t; + struct h5_complex { h5_float64_t r,i; }; @@ -38,6 +58,8 @@ struct h5_vertex { /* 32Byte */ struct h5_edge { /* 16Bytes */ h5_id_t id; h5_id_t parent_id; + h5_id_t refined_on_evel; /* = 0 if not refined*/ + h5_id_t unused; /* for right alignment */ h5_id_t vertex_ids[2]; }; @@ -45,17 +67,19 @@ struct h5_triangle { /*24Bytes*/ h5_id_t id; h5_id_t parent_id; h5_id_t vertex_ids[3]; - h5_id_t unused; /* for alignment */ + h5_id_t refined_on_level; }; struct h5_tetrahedron { /* 24Bytes */ h5_id_t id; h5_id_t parent_id; + h5_id_t refined_on_evel; + h5_id_t unused; /* for right alignment */ h5_id_t vertex_ids[4]; }; typedef struct h5_vertex h5_vertex; -typedef struct h5_edge h5_edg; +typedef struct h5_edge h5_edge; typedef struct h5_triangle h5_triangle; typedef struct h5_tetrahedron h5_tetrahedron; @@ -71,9 +95,85 @@ typedef h5_error_handler h5part_error_handler; typedef unsigned long MPI_Comm; #endif -struct h5u_fdata; /* unstructured data */ -struct h5b_fdata; /* block structured data */ -struct h5t_fdata; /* topology data */ +struct h5u_fdata { + hsize_t nparticles; /* -> u.nparticles */ + + h5part_int64_t viewstart; /* -1 if no view is available: A "view" looks */ + h5part_int64_t viewend; /* at a subset of the data. */ + + /** + the number of particles in each processor. + With respect to the "VIEW", these numbers + can be regarded as non-overlapping subsections + of the particle array stored in the file. + So they can be used to compute the offset of + the view for each processor + */ + h5part_int64_t *pnparticles; + + hid_t shape; + hid_t diskshape; + hid_t memshape; +}; + +struct H5BlockPartition { + h5part_int64_t i_start; + h5part_int64_t i_end; + h5part_int64_t j_start; + h5part_int64_t j_end; + h5part_int64_t k_start; + h5part_int64_t k_end; +}; + +struct h5b_fdata { + h5part_int64_t step_idx; + h5part_int64_t i_max; + h5part_int64_t j_max; + h5part_int64_t k_max; + struct H5BlockPartition *user_layout; + struct H5BlockPartition *write_layout; + int have_layout; + + hid_t shape; + hid_t memshape; + hid_t diskshape; + hid_t blockgroup; + hid_t field_group_id; +}; + +struct h5t_fdata_level { +}; + +struct h5t_fdata { + h5_id_t new_level; /* idx of the first new level or -1 */ + h5_id_t cur_level; + h5_size_t num_levels; + + h5_size_t *num_vertices; + h5_size_t *num_tets; + h5_size_t *num_tets_on_level; + + h5_id_t last_stored_vertex_id; + h5_vertex * vertices; + + h5_id_t last_stored_tet_id; + h5_tetrahedron * tets; + + /* HDF5 objects */ + + hid_t topo_gid; /* grp id of mesh in current level */ + hid_t coord_gid; + hid_t vmesh_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 tet_tid; +}; + /** \struct h5_file @@ -109,6 +209,7 @@ struct h5_file { h5_int64_t step_idx; /* step index */ hid_t step_gid; /* HDF5 grp id of current step */ + int is_new_step; /* BEGIN unstructured stuff, @@ -143,57 +244,4 @@ struct h5_file { typedef struct h5_file h5_file; -struct h5u_fdata { - hsize_t nparticles; /* -> u.nparticles */ - - h5part_int64_t viewstart; /* -1 if no view is available: A "view" looks */ - h5part_int64_t viewend; /* at a subset of the data. */ - - /** - the number of particles in each processor. - With respect to the "VIEW", these numbers - can be regarded as non-overlapping subsections - of the particle array stored in the file. - So they can be used to compute the offset of - the view for each processor - */ - h5part_int64_t *pnparticles; - - hid_t shape; - hid_t diskshape; - hid_t memshape; -} - -struct h5b_fdata { - h5part_int64_t step_idx; - h5part_int64_t i_max; - h5part_int64_t j_max; - h5part_int64_t k_max; - struct H5BlockPartition *user_layout; - struct H5BlockPartition *write_layout; - int have_layout; - - hid_t shape; - hid_t memshape; - hid_t diskshape; - hid_t blockgroup; - hid_t field_group_id; -}; - -struct h5t_fdata_level { - int new_level; - h5_id_t last_stored_vertex; - h5_size_t num_vertices; - h5_vertex * vertices; - h5_id_t last_stored_tet; - h5_size_t num_tets; - h5_tetrahedron * tets; -}; - -struct h5t_fdata { - h5_id_t cur_level; - h5_size_t num_levels; - hid_t mesh_gid; - struct h5t_fdata_level levels[]; -}; #endif diff --git a/src/h5/openclose.c b/src/h5/openclose.c index 047796b..4a9e799 100644 --- a/src/h5/openclose.c +++ b/src/h5/openclose.c @@ -12,7 +12,6 @@ #include "H5Part.h" #include "H5Block.h" #include "H5PartPrivate.h" -#include "H5BlockPrivate.h" #include "H5PartErrors.h" #include "H5BlockErrors.h" #include "H5.h" @@ -41,11 +40,11 @@ H5_check_filehandle ( ) { if ( f == NULL ) - return HANDLE_H5PART_BADFD_ERR; + return HANDLE_H5_BADFD_ERR; if ( f->file == 0 ) - return HANDLE_H5PART_BADFD_ERR; + return HANDLE_H5_BADFD_ERR; if ( f->block == NULL ) - return HANDLE_H5PART_BADFD_ERR; + return HANDLE_H5_BADFD_ERR; return H5PART_SUCCESS; } @@ -96,8 +95,7 @@ _h5u_open_file ( f->pnparticles = (h5part_int64_t*) malloc (f->nprocs * sizeof (h5part_int64_t)); if (f->pnparticles == NULL) { - HANDLE_H5PART_NOMEM_ERR; - goto error_cleanup; + return HANDLE_H5_NOMEM_ERR; } return H5_SUCCESS; } @@ -121,23 +119,23 @@ _h5b_open_file ( herr = H5_check_filehandle ( f ); if ( herr == H5_SUCCESS ) return H5_SUCCESS; - if ( (f == 0) || (f->file == 0) ) return HANDLE_H5PART_BADFD_ERR; + if ( (f == 0) || (f->file == 0) ) return HANDLE_H5_BADFD_ERR; f->block = (struct h5b_fdata*) malloc( sizeof (*f->block) ); if ( f->block == NULL ) { - return HANDLE_H5PART_NOMEM_ERR; + 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_H5PART_NOMEM_ERR; + 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_H5PART_NOMEM_ERR; + return HANDLE_H5_NOMEM_ERR; } b->step_idx = -1; b->blockgroup = -1; @@ -161,7 +159,7 @@ H5_open_file ( h5part_int64_t rc = H5PART_SUCCESS; if ( _init() < 0 ) { - HANDLE_H5PART_INIT_ERR; + HANDLE_H5_INIT_ERR; return NULL; } _h5part_errno = H5PART_SUCCESS; @@ -169,14 +167,14 @@ H5_open_file ( f = (h5_file*) malloc( sizeof (h5_file) ); if( f == NULL ) { - HANDLE_H5PART_NOMEM_ERR; + 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_H5PART_NOMEM_ERR; + HANDLE_H5_NOMEM_ERR; goto error_cleanup; } f->width_step_idx = 0; @@ -245,7 +243,7 @@ H5_open_file ( f->access_prop); f->empty = 1; } - else if ( flags == H5_O_APPEND || H5_O_RDWR ) { + 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, @@ -259,7 +257,7 @@ H5_open_file ( } } else { - HANDLE_H5PART_FILE_ACCESS_TYPE_ERR ( flags ); + HANDLE_H5_FILE_ACCESS_TYPE_ERR ( flags ); goto error_cleanup; } @@ -327,20 +325,21 @@ static h5part_int64_t _h5u_close_file ( h5_file *f /*!< IN: file handle */ ) { + herr_t herr; _h5part_errno = H5_SUCCESS; if( f->shape > 0 ) { - r = H5Sclose( f->shape ); - if ( r < 0 ) HANDLE_H5S_CLOSE_ERR; + herr = H5Sclose( f->shape ); + if ( herr < 0 ) HANDLE_H5S_CLOSE_ERR; f->shape = 0; } if( f->diskshape != H5S_ALL ) { - r = H5Sclose( f->diskshape ); - if ( r < 0 ) HANDLE_H5S_CLOSE_ERR; + herr = H5Sclose( f->diskshape ); + if ( herr < 0 ) HANDLE_H5S_CLOSE_ERR; f->diskshape = 0; } if( f->memshape != H5S_ALL ) { - r = H5Sclose( f->memshape ); - if ( r < 0 ) HANDLE_H5S_CLOSE_ERR; + herr = H5Sclose( f->memshape ); + if ( herr < 0 ) HANDLE_H5S_CLOSE_ERR; f->memshape = 0; } if( f->pnparticles ) { @@ -393,30 +392,6 @@ _h5b_close_file ( return H5PART_SUCCESS; } -/*! - \ingroup h5_private - - \internal - - De-initialize topological internal structure. Open HDF5 objects are - closed and allocated memory freed. - - \return H5_SUCCESS or error code -*/ -static h5part_int64_t -_h5t_close_file ( - h5_file *fh /*!< IN: file handle */ - ) { - - h5_err_t herr = H5_SUCCESS; - struct h5t_fdata *t = fh->t; - - if ( t->levels ) { - free ( levels ); - } - return herr; -} - h5part_int64_t H5_close_file ( h5_file *f @@ -477,7 +452,7 @@ H5_define_stepname ( ) { f->prefix_step_name = strdup ( name ); if( f->prefix_step_name == NULL ) { - return HANDLE_H5PART_NOMEM_ERR; + return HANDLE_H5_NOMEM_ERR; } f->width_step_idx = (int)width; diff --git a/src/h5/openclose.h b/src/h5/openclose.h index 7c09cf7..75d335c 100644 --- a/src/h5/openclose.h +++ b/src/h5/openclose.h @@ -5,8 +5,7 @@ h5_file* H5_open_file ( const char *filename, unsigned flags, - MPI_Comm comm, - int f_parallel + MPI_Comm comm ); h5part_int64_t @@ -14,14 +13,6 @@ H5_check_filehandle ( const h5_file *f ); -h5_file* -H5_open_file ( - const char *filename, - unsigned flags, - MPI_Comm comm, - int f_parallel - ); - h5part_int64_t H5_close_file ( h5_file *f diff --git a/src/h5/readwrite.c b/src/h5/readwrite.c index 83b240c..311fddc 100644 --- a/src/h5/readwrite.c +++ b/src/h5/readwrite.c @@ -11,7 +11,6 @@ #include "H5Part.h" #include "H5Block.h" #include "H5PartPrivate.h" -#include "H5BlockPrivate.h" #include "H5PartErrors.h" #include "H5BlockErrors.h" #include "H5.h" @@ -180,7 +179,7 @@ H5_get_object_name ( &data ); if ( herr < 0 ) return (h5part_int64_t)herr; - if ( herr == 0 ) HANDLE_H5PART_NOENTRY_ERR( group_name, + if ( herr == 0 ) HANDLE_H5_NOENTRY_ERR( group_name, type, idx ); return H5PART_SUCCESS; @@ -210,7 +209,7 @@ _open_step ( H5_print_info ( "Proc[%d]: Open step #%lld for file %lld", f->myproc, - (long long)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 ); @@ -222,14 +221,16 @@ _open_step ( static h5_err_t _init_step ( + h5_file * f + ) { h5_err_t h5err = _h5t_init_step ( f ); if ( h5err < 0 ) return h5err; return H5_SUCCESS; } -static h5_err_t -_close_step ( +h5_err_t +_h5_close_step ( h5_file * f ) { @@ -265,7 +266,7 @@ _set_step ( herr = _open_step ( f ); if ( herr < 0 ) return herr; } else if ( (f->mode == H5_O_WRONLY) || (f->mode == H5_O_APPEND) ) { - if ( herr > 0 ) return HANDLE_H5PART_STEP_EXISTS_ERR ( step ); + if ( herr > 0 ) return HANDLE_H5_STEP_EXISTS_ERR ( step_idx ); herr = _create_step ( f ); if ( herr < 0 ) return herr; } else if ( (f->mode == H5_O_RDWR) && (herr < 0) ) { @@ -278,20 +279,20 @@ _set_step ( return H5_SUCCESS; } -h5p_int64_t +h5_int64_t H5_set_step ( h5_file *f, /*!< [in] Handle to open file */ const h5_int64_t step_idx /*!< [in] Step to set. */ ) { - herr = _close_step ( f ); - if ( herr < 0 ) return herr; + h5_err_t h5err = _h5_close_step ( f ); + if ( h5err < 0 ) return h5err; - herr = _set_step ( f ); - if ( herr < 0 ) return herr; + h5err = _set_step ( f, step_idx ); + if ( h5err < 0 ) return h5err; - herr = _init_step ( f ); - if ( herr < 0 ) return herr; + h5err = _init_step ( f ); + if ( h5err < 0 ) return h5err; return H5_SUCCESS; } diff --git a/src/h5/t_openclose.c b/src/h5/t_openclose.c index 9b69e91..0f3bcb4 100644 --- a/src/h5/t_openclose.c +++ b/src/h5/t_openclose.c @@ -12,10 +12,10 @@ #include "H5Part.h" #include "H5Block.h" #include "H5PartPrivate.h" -#include "H5BlockPrivate.h" #include "H5PartErrors.h" #include "H5BlockErrors.h" #include "H5.h" +#include "h5/h5_types.h" extern h5part_error_handler _err_handler; extern h5part_int64_t _h5part_errno; @@ -26,7 +26,9 @@ static h5_err_t _create_array_types ( h5_file * f ) { + struct h5t_fdata *t = &f->t; hsize_t dims[1] = { 3 }; + t->float64_3tuple_tid = H5Tarray_create ( H5T_NATIVE_DOUBLE, 1, dims,NULL); dims[0] = 2; t->int32_2tuple_tid = H5Tarray_create ( H5T_NATIVE_INT32, 1, dims, NULL ); @@ -42,6 +44,8 @@ static h5_err_t _create_vertex_type ( h5_file * f ) { + struct h5t_fdata *t = &f->t; + t->vertex_tid = H5Tcreate ( H5T_COMPOUND, sizeof(struct h5_vertex) ); H5Tinsert ( t->vertex_tid, @@ -65,31 +69,35 @@ static h5_err_t _create_tet_type ( h5_file * f ) { + struct h5t_fdata *t = &f->t; + t->tet_tid = H5Tcreate ( H5T_COMPOUND, sizeof(struct h5_tetrahedron) ); H5Tinsert ( t->tet_tid, "id", - HOFFSET(struct h5_tet, id), + HOFFSET(struct h5_tetrahedron, id), H5T_NATIVE_INT32 ); H5Tinsert ( t->tet_tid, "parent_id", - HOFFSET(struct h5_tet, parent_id), + HOFFSET(struct h5_tetrahedron, parent_id), H5T_NATIVE_INT32 ); H5Tinsert ( t->tet_tid, "vertex_ids", - HOFFSET(struct h5_tet, vertex_ids), + HOFFSET(struct h5_tetrahedron, vertex_ids), t->int32_4tuple_tid ); return H5_SUCCESS; +} /*! \ingroup h5_private \internal - Initialize H5Block internal structure. + Initialize topo internal structure. The structure has already be initialized + with zero's. \return H5_SUCCESS or error code */ @@ -98,15 +106,49 @@ _h5t_open_file ( h5_file * f /*!< IN: file handle */ ) { h5_err_t h5err = H5_SUCCESS;; - struct h5t_fdata * t = &fh->t; + struct h5t_fdata * t = &f->t; t->num_levels = -1; - levels = NULL; - - if (h5err = _create_array_types ( f )) < 0 ) return herr; - if (h5err = _create_vertex_type ( f )) < 0 ) return herr; - if (h5err = _create_tet_type ( f )) < 0 ) return herr; + if (( h5err = _create_array_types ( f )) < 0 ) return h5err; + if (( h5err = _create_vertex_type ( f )) < 0 ) return h5err; + if (( h5err = _create_tet_type ( f )) < 0 ) return h5err; return H5_SUCCESS; } + +/*! + \ingroup h5_private + + \internal + + De-initialize topological internal structure. Open HDF5 objects are + closed and allocated memory freed. + + \return H5_SUCCESS or error code +*/ +static h5part_int64_t +_h5t_close_file ( + h5_file *fh /*!< IN: file handle */ + ) { + + h5_err_t herr = H5_SUCCESS; + struct h5t_fdata *t = &fh->t; + + if ( t->num_vertices ) { + free ( t->num_vertices ); + } + if ( t->num_tets ) { + free ( t->num_tets ); + } + if ( t->num_tets_on_level ) { + free ( t->num_tets_on_level ); + } + if ( t->vertices ) { + free ( t->vertices ); + } + if ( t->tets ) { + free ( t->tets ); + } + return herr; +} diff --git a/src/h5/t_readwrite.c b/src/h5/t_readwrite.c index 32a9f9a..cbbf8b6 100644 --- a/src/h5/t_readwrite.c +++ b/src/h5/t_readwrite.c @@ -11,7 +11,6 @@ #include "H5Part.h" #include "H5Block.h" #include "H5PartPrivate.h" -#include "H5BlockPrivate.h" #include "H5PartErrors.h" #include "H5BlockErrors.h" #include "H5.h" @@ -23,27 +22,105 @@ h5_err_t _h5t_init_step ( h5_file * f ) { - memset ( f->t, 0, sizeof(f->t) ); + memset ( &f->t, 0, sizeof(f->t) ); - f->t.mesh_gid = -1; + f->t.topo_gid = -1; f->t.num_levels = f->is_new_step ? 0 : -1; f->t.cur_level = -1; return H5_SUCCESS; } +static hid_t +_open_group ( + 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 ) { + gid = H5Gopen ( parent_gid, grpname ); + } else { + gid = H5Gcreate ( parent_gid, grpname, 0 ); + } + if ( gid < 0 ) + return HANDLE_H5G_OPEN_ERR ( H5T_CONTAINER_GRPNAME ); + + return H5_SUCCESS; +} + static h5_err_t _open_topo_group ( h5_file * f ) { - herr_t herr = H5Gget_objinfo( f->step_gid, "Topo", 1, NULL ); - if ( herr => 0 ) { - f->t.mesh_gid = H5Gopen ( f->step_gid, "Topo" ); - } else { - f->t.mesh_gid = H5Gcreate ( f->step_gid, "Topo", 0 ); + return _open_group ( f, f->step_gid, H5T_CONTAINER_GRPNAME ); +} + +static h5_err_t +_open_coord_group ( + h5_file * f + ) { + if ( f->t.topo_gid < 0 ) { + h5_err_t h5err = _open_topo_group ( f ); + if ( h5err < 0 ) return h5err; } - if ( f->t.mesh_gid < 0 ) - return HANDLE_H5G_OPEN_ERR ( "Topo" ); + return _open_group ( f, f->t.topo_gid, H5T_COORD_GRPNAME ); +} + +static h5_err_t +_open_vmesh_group ( + h5_file * f + ) { + if ( f->t.topo_gid < 0 ) { + h5_err_t h5err = _open_topo_group ( f ); + if ( h5err < 0 ) return h5err; + } + return _open_group ( f, f->t.topo_gid, H5T_VMESH_GRPNAME ); +} + +static h5_err_t +_write_obj ( + const hid_t gid, + const hsize_t current_dims, + const hsize_t max_dims, + const hid_t tid, + const void * const object, + const char * const dsname + ) { + hsize_t dims[1] = { current_dims }; + hsize_t maxdims[1] = { max_dims }; + + hid_t sid = H5Screate_simple ( + 1, + dims, + maxdims + ); + if ( sid < 0 ) return -1; + + hid_t did = H5Dcreate ( + gid, + dsname, + tid, + sid, + H5P_DEFAULT); + if ( did < 0 ) return -1; + + herr_t herr = H5Dwrite ( + did, + tid, + H5S_ALL, H5S_ALL, H5P_DEFAULT, + object ); + if ( herr < 0 ) return -1; + + herr = H5Dclose ( did ); + if ( herr < 0 ) return -1; + + herr = H5Sclose ( sid ); + if ( herr < 0 ) return -1; + + return H5_SUCCESS; } /* @@ -54,41 +131,23 @@ static h5_err_t _write_vertices ( h5_file * f ) { - h5t_fdata t &f->t; - herr_t herr; + struct h5t_fdata *t = &f->t; + h5_err_t h5err; - if ( t->coord3d_gid < 0 ) { - h5err = _open_coord3d_group ( f ); + if ( t->coord_gid < 0 ) { + h5err = _open_coord_group ( f ); if ( h5err < 0 ) return h5err; } - if ( t->num_levels == 0 ) return 0; - if ( t->num_levels < 0 ) return -1; - - hsize_t current_dims[1]; - current_dims[0] = t->levels[t->num_levels-1].num_vertices; - - t->coord3d_sid = H5Screate_simple ( - 1, - current_dims, - H5S_UNLIMITED + hsize_t maxdim = H5S_UNLIMITED; + h5err = _write_obj ( + t->coord_gid, + t->vertex_tid, + t->num_vertices[t->num_levels-1], + maxdim, + (void*)t->vertices, + H5T_COORD3D_DSNAME ); - if ( t->coord3d_sid < 0 ) return -1; - - t->coord3d_did = H5Dcreate ( - coord3d_gid, - "COORD3D", - t->vertex_tid, - t->coord3d_sid, - H5P_DEFAULT); - if ( t->coord3d_did < 0 ) return -1; - - herr = H5Dwrite ( - coord3d, - t->vertex_tid, - H5S_ALL, H5S_ALL, H5P_DEFAULT, - t->vertices ); - if ( herr < 0 ) return -1; return H5_SUCCESS; } @@ -97,9 +156,26 @@ static h5_err_t _write_tets ( h5_file * f ) { - return -1; -} + struct h5t_fdata *t = &f->t; + h5_err_t h5err; + if ( t->vmesh_gid < 0 ) { + h5err = _open_vmesh_group ( f ); + if ( h5err < 0 ) return h5err; + } + + hsize_t maxdim = H5S_UNLIMITED; + herr_t herr = _write_obj ( + t->vmesh_gid, + t->tet_tid, + t->num_tets[t->num_levels-1], + maxdim, + (void*)t->tets, + H5T_TETMESH_DSNAME + ); + + return H5_SUCCESS; +} /* determine new levels @@ -114,6 +190,10 @@ _write_data ( ) { struct h5t_fdata *t = &f->t; h5_err_t h5err; + + if ( t->num_levels == 0 ) return 0; + if ( t->num_levels < 0 ) return -1; + if ( t->topo_gid < 0 ) { h5err = _open_topo_group ( f ); if ( h5err < 0 ) return h5err; @@ -156,10 +236,10 @@ _h5t_close_step ( h5_err_t h5err = _write_data ( f ); if ( h5err < 0 ) return h5err; - h5_err_t h5err = _close_hdf5_objs ( f ); + h5err = _close_hdf5_objs ( f ); if ( h5err < 0 ) return h5err; - h5_err_t h5err = _release_memory ( f ); + h5err = _release_memory ( f ); if ( h5err < 0 ) return h5err; return H5_SUCCESS; diff --git a/src/h5/u_readwrite.c b/src/h5/u_readwrite.c index 12a64c3..e342363 100644 --- a/src/h5/u_readwrite.c +++ b/src/h5/u_readwrite.c @@ -403,7 +403,7 @@ H5U_set_view ( 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 ( total < 0 ) return HANDLE_H5_GET_NUM_PARTICLES_ERR ( total ); if ( start == -1 ) start = 0; if ( end == -1 ) end = total; @@ -471,7 +471,7 @@ H5U_get_view ( else { viewend = H5U_get_num_elems ( f ); if ( viewend < 0 ) - return HANDLE_H5PART_GET_NUM_PARTICLES_ERR ( viewend ); + return HANDLE_H5_GET_NUM_PARTICLES_ERR ( viewend ); } if ( start ) *start = viewstart; @@ -485,7 +485,7 @@ H5U_set_canonical_view ( h5_file *f ) { h5part_int64_t herr = H5U_reset_view ( f ); - if ( herr < 0 ) return HANDLE_H5PART_SET_VIEW_ERR( herr, -1, -1 ); + if ( herr < 0 ) return HANDLE_H5_SET_VIEW_ERR( herr, -1, -1 ); #ifdef PARALLEL_IO h5part_int64_t start = 0; @@ -494,7 +494,7 @@ H5U_set_canonical_view ( int i = 0; n = H5U_get_num_elems ( f ); - if ( n < 0 ) return HANDLE_H5PART_GET_NUM_PARTICLES_ERR ( n ); + if ( n < 0 ) return HANDLE_H5_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 @@ -518,7 +518,7 @@ H5U_set_canonical_view ( } 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 ); + if ( herr < 0 ) return HANDLE_H5_SET_VIEW_ERR ( herr, start, end ); #endif diff --git a/test/H5BlockTestAttributes.c b/test/H5BlockTestAttributes.c index 3483fe1..b08d975 100644 --- a/test/H5BlockTestAttributes.c +++ b/test/H5BlockTestAttributes.c @@ -31,7 +31,7 @@ _write_data ( h5part_int64_t j_dims = layout->j_end - layout->j_start + 1; h5part_int64_t k_dims = layout->k_end - layout->k_start + 1; - printf ( "Writing Step #%lld\n", (long long)f->timestep ); + printf ( "Writing Step #%lld\n", (long long)f->step_idx ); data = malloc ( i_dims * j_dims * k_dims * sizeof ( *data ) ); for ( i = 0; i < i_dims; i++ ) { @@ -168,7 +168,7 @@ _read_data ( h5part_int64_t j_dims = layout->j_end - layout->j_start + 1; h5part_int64_t k_dims = layout->k_end - layout->k_start + 1; - printf ( "Reading Step #%lld\n", (long long)f->timestep ); + printf ( "Reading Step #%lld\n", (long long)f->step_idx ); data = malloc ( i_dims * j_dims * k_dims * sizeof ( *data ) );