From 1caf5a3a047295f8c567482576ab38307b2a642a Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Sun, 20 Jan 2008 10:58:56 +0000 Subject: [PATCH] src/h5/t_openclose.c src/h5/t_readwrite.c * added --- .gitattributes | 2 + src/h5/t_openclose.c | 112 +++++++++++++++++++++++++++++ src/h5/t_readwrite.c | 166 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 280 insertions(+) create mode 100644 src/h5/t_openclose.c create mode 100644 src/h5/t_readwrite.c diff --git a/.gitattributes b/.gitattributes index bb0b43d..ad48166 100644 --- a/.gitattributes +++ b/.gitattributes @@ -60,6 +60,8 @@ src/h5/openclose.c -text src/h5/openclose.h -text src/h5/readwrite.c -text src/h5/readwrite.h -text +src/h5/t_openclose.c -text +src/h5/t_readwrite.c -text src/h5/u_readwrite.c -text src/h5/u_readwrite.h -text test/Bench.c -text diff --git a/src/h5/t_openclose.c b/src/h5/t_openclose.c new file mode 100644 index 0000000..9b69e91 --- /dev/null +++ b/src/h5/t_openclose.c @@ -0,0 +1,112 @@ +#include +#include +#include +#include /* va_arg - System dependent ?! */ +#include +#include +#include +#include + +#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 h5_err_t +_create_array_types ( + h5_file * f + ) { + 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 ); + dims[0] = 3; + t->int32_3tuple_tid = H5Tarray_create ( H5T_NATIVE_INT32, 1, dims, NULL ); + dims[0] = 4; + t->int32_4tuple_tid = H5Tarray_create ( H5T_NATIVE_INT32, 1, dims, NULL ); + + return H5_SUCCESS; +} + +static h5_err_t +_create_vertex_type ( + h5_file * f + ) { + t->vertex_tid = H5Tcreate ( H5T_COMPOUND, sizeof(struct h5_vertex) ); + H5Tinsert ( + t->vertex_tid, + "id", + HOFFSET(struct h5_vertex, id), + H5T_NATIVE_INT32 ); + H5Tinsert ( + t->vertex_tid, + "unused", + HOFFSET(struct h5_vertex, unused), + H5T_NATIVE_INT32 ); + H5Tinsert ( + t->vertex_tid, + "P", + HOFFSET(struct h5_vertex, P), + t->float64_3tuple_tid ); + return H5_SUCCESS; +} + +static h5_err_t +_create_tet_type ( + h5_file * f + ) { + t->tet_tid = H5Tcreate ( H5T_COMPOUND, sizeof(struct h5_tetrahedron) ); + H5Tinsert ( + t->tet_tid, + "id", + HOFFSET(struct h5_tet, id), + H5T_NATIVE_INT32 ); + H5Tinsert ( + t->tet_tid, + "parent_id", + HOFFSET(struct h5_tet, parent_id), + H5T_NATIVE_INT32 ); + H5Tinsert ( + t->tet_tid, + "vertex_ids", + HOFFSET(struct h5_tet, vertex_ids), + t->int32_4tuple_tid ); + + return H5_SUCCESS; + +/*! + \ingroup h5_private + + \internal + + Initialize H5Block internal structure. + + \return H5_SUCCESS or error code +*/ +h5_err_t +_h5t_open_file ( + h5_file * f /*!< IN: file handle */ + ) { + h5_err_t h5err = H5_SUCCESS;; + struct h5t_fdata * t = &fh->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; + + + return H5_SUCCESS; +} diff --git a/src/h5/t_readwrite.c b/src/h5/t_readwrite.c new file mode 100644 index 0000000..32a9f9a --- /dev/null +++ b/src/h5/t_readwrite.c @@ -0,0 +1,166 @@ +#include +#include +#include /* va_arg - System dependent ?! */ +#include +#include +#include +#include + +#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" + +/* + Initialize required data structures only! +*/ +h5_err_t +_h5t_init_step ( + h5_file * f + ) { + memset ( f->t, 0, sizeof(f->t) ); + + f->t.mesh_gid = -1; + f->t.num_levels = f->is_new_step ? 0 : -1; + f->t.cur_level = -1; + + 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 ); + } + if ( f->t.mesh_gid < 0 ) + return HANDLE_H5G_OPEN_ERR ( "Topo" ); +} + +/* + store vertices -> Topo.VERTICES_COORD3D + levels -> TOPO.VERTICES_LEVELS3D + */ +static h5_err_t +_write_vertices ( + h5_file * f + ) { + h5t_fdata t &f->t; + herr_t herr; + + if ( t->coord3d_gid < 0 ) { + h5err = _open_coord3d_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 + ); + 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; +} + +static h5_err_t +_write_tets ( + h5_file * f + ) { + return -1; +} + + +/* + determine new levels + + foreach Object + - create HDF5 groups + - write data + */ +static h5_err_t +_write_data ( + h5_file * f + ) { + struct h5t_fdata *t = &f->t; + h5_err_t h5err; + if ( t->topo_gid < 0 ) { + h5err = _open_topo_group ( f ); + if ( h5err < 0 ) return h5err; + } + h5err = _write_vertices( f ); + if ( h5err < 0 ) return h5err; + h5err = _write_tets( f ); + if ( h5err < 0 ) return h5err; + + return -1; +} + +static h5_err_t +_close_hdf5_objs ( + h5_file * f + ) { + + + return -1; +} + +static h5_err_t +_release_memory ( + h5_file * f + ) { + + return -1; +} + + +/* + - write data + - close HDF5 objects we cannot reuse + - free memory +*/ +h5_err_t +_h5t_close_step ( + h5_file * f + ) { + h5_err_t h5err = _write_data ( f ); + if ( h5err < 0 ) return h5err; + + h5_err_t h5err = _close_hdf5_objs ( f ); + if ( h5err < 0 ) return h5err; + + h5_err_t h5err = _release_memory ( f ); + if ( h5err < 0 ) return h5err; + + return H5_SUCCESS; +}