src/H5Block.c

* use of H5 kernel functions
	* INIT(f) removed, Block stuff will now be initialized during file opening.
This commit is contained in:
2007-11-22 10:44:49 +00:00
parent 698135bb91
commit b2e2cf3b95
+29 -192
View File
@@ -50,148 +50,18 @@
#include "H5BlockTypes.h"
#include "H5Block.h"
#include "H5BlockPrivate.h"
#include "h5/H5.h"
#include "H5BlockErrors.h"
#define INIT( f ) { \
h5part_int64_t herr = _init ( f ); \
if ( herr < 0 ) return herr; \
}
/********************** declarations *****************************************/
static h5part_int64_t
_close (
H5PartFile *f
);
/********************** misc *************************************************/
/*!
\ingroup h5block_private
\internal
Check whether \c f points to a valid file handle.
\return H5PART_SUCCESS or error code
*/
static h5part_int64_t
_file_is_valid (
const H5PartFile *f /*!< IN: file handle */
) {
if ( f == NULL )
return H5PART_ERR_BADFD;
if ( f->file == 0 )
return H5PART_ERR_BADFD;
if ( f->block == NULL )
return H5PART_ERR_BADFD;
return H5PART_SUCCESS;
}
/********************** file open and close **********************************/
/*!
\ingroup h5block_private
\internal
Initialize H5Block internal structure.
\return H5PART_SUCCESS or error code
*/
static h5part_int64_t
_init (
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;
/*
hack for non-parallel processing, should be set in H5Part
*/
if ( f->nprocs == 0 ) f->nprocs = 1;
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;
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 (
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;
}
/********************** defining the layout **********************************/
@@ -630,11 +500,11 @@ _dissolve_ghostzones (
}
free ( p_begin );
_H5Part_print_debug ("Layout defined by user:");
H5_print_debug ("Layout defined by user:");
for ( proc_p = 0, p = b->user_layout;
proc_p < f->nprocs;
proc_p++, p++ ) {
_H5Part_print_debug (
H5_print_debug (
"PROC[%d]: proc[%d]: %lld:%lld, %lld:%lld, %lld:%lld ",
f->myproc, proc_p,
(long long)p->i_start, (long long)p->i_end,
@@ -642,11 +512,11 @@ _dissolve_ghostzones (
(long long)p->k_start, (long long)p->k_end );
}
_H5Part_print_debug ("Layout after dissolving ghost-zones:");
H5_print_debug ("Layout after dissolving ghost-zones:");
for ( proc_p = 0, p = b->write_layout;
proc_p < f->nprocs;
proc_p++, p++ ) {
_H5Part_print_debug (
H5_print_debug (
"PROC[%d]: proc[%d]: %lld:%lld, %lld:%lld, %lld:%lld ",
f->myproc, proc_p,
(long long)p->i_start, (long long)p->i_end,
@@ -708,7 +578,6 @@ H5BlockDefine3DFieldLayout(
) {
SET_FNAME ( "H5BlockDefine3DFieldLayout" );
INIT( f );
struct H5BlockStruct *b = f->block;
struct H5BlockPartition *p = &b->user_layout[f->myproc];
@@ -759,7 +628,6 @@ H5Block3dGetPartitionOfProc (
) {
SET_FNAME ( "H5Block3dGetProcOf" );
INIT ( f );
CHECK_LAYOUT ( f );
if ( ( proc < 0 ) || ( proc >= f->nprocs ) )
@@ -799,7 +667,6 @@ H5Block3dGetReducedPartitionOfProc (
) {
SET_FNAME ( "H5Block3dGetProcOf" );
INIT ( f );
CHECK_LAYOUT ( f );
if ( ( proc < 0 ) || ( proc >= f->nprocs ) )
@@ -835,7 +702,6 @@ H5Block3dGetProcOf (
) {
SET_FNAME ( "H5Block3dGetProcOf" );
INIT ( f );
CHECK_LAYOUT ( f );
struct H5BlockPartition *layout = f->block->write_layout;
@@ -990,7 +856,7 @@ _select_hyperslab_for_reading (
(field_dims[1] < (hsize_t)b->j_max) ||
(field_dims[2] < (hsize_t)b->i_max) ) return HANDLE_H5PART_LAYOUT_ERR;
_H5Part_print_debug (
H5_print_debug (
"PROC[%d]: \n"
"\tfield_dims: (%lld,%lld,%lld)",
f->myproc,
@@ -1015,7 +881,7 @@ _select_hyperslab_for_reading (
NULL );
if ( herr < 0 ) return HANDLE_H5S_SELECT_HYPERSLAB_ERR;
_H5Part_print_debug (
H5_print_debug (
"PROC[%d]: Select hyperslab: \n"
"\tstart: (%lld,%lld,%lld)\n"
"\tstride: (%lld,%lld,%lld)\n"
@@ -1090,7 +956,6 @@ H5Block3dReadScalarField (
) {
SET_FNAME ( "H5Block3dReadScalarField" );
INIT ( f );
CHECK_TIMEGROUP ( f );
CHECK_LAYOUT ( f );
@@ -1128,7 +993,6 @@ H5Block3dRead3dVectorField (
) {
SET_FNAME ( "H5Block3dRead3dVectorField" );
INIT ( f );
CHECK_TIMEGROUP ( f );
CHECK_LAYOUT ( f );
@@ -1201,7 +1065,7 @@ _select_hyperslab_for_writing (
if ( b->diskshape < 0 )
return HANDLE_H5S_CREATE_SIMPLE_3D_ERR ( field_dims );
_H5Part_print_debug (
H5_print_debug (
"PROC[%d]: Select hyperslab on diskshape: \n"
"\tstart: (%lld,%lld,%lld)\n"
"\tstride: (%lld,%lld,%lld)\n"
@@ -1238,7 +1102,7 @@ _select_hyperslab_for_writing (
start[1] = p->j_start - q->j_start;
start[2] = p->i_start - q->i_start;
_H5Part_print_debug (
H5_print_debug (
"PROC[%d]: Select hyperslab on memshape: \n"
"\tstart: (%lld,%lld,%lld)\n"
"\tstride: (%lld,%lld,%lld)\n"
@@ -1338,38 +1202,24 @@ _create_field_group (
\return \c H5PART_SUCCESS or error code
*/
h5part_int64_t
_write_data (
static h5part_int64_t
_write_field_data (
H5PartFile *f, /*!< IN: file handle */
const char *name, /*!< IN: name of dataset to write */
const h5part_float64_t *data /*!< IN: data to write */
) {
herr_t herr;
hid_t dataset;
struct H5BlockStruct *b = f->block;
dataset = H5Dcreate (
b->field_group_id,
return H5_write_data (
f,
name,
data,
H5T_NATIVE_DOUBLE,
b->shape,
H5P_DEFAULT );
if ( dataset < 0 ) return HANDLE_H5D_CREATE_ERR ( name, f->timestep );
herr = H5Dwrite (
dataset,
H5T_NATIVE_DOUBLE,
b->field_group_id,
b->shape,
b->memshape,
b->diskshape,
H5P_DEFAULT,
data );
if ( herr < 0 ) return HANDLE_H5D_WRITE_ERR ( name, f->timestep );
herr = H5Dclose ( dataset );
if ( herr < 0 ) return HANDLE_H5D_CLOSE_ERR;
return H5PART_SUCCESS;
b->diskshape );
}
/*!
@@ -1391,15 +1241,16 @@ H5Block3dWriteScalarField (
) {
SET_FNAME ( "H5Block3dWriteScalarField" );
INIT ( f );
CHECK_WRITABLE_MODE ( f );
CHECK_TIMEGROUP ( f );
CHECK_LAYOUT ( f );
h5part_int64_t herr = _create_field_group ( f, name );
if ( herr < 0 ) return herr;
herr = _write_data ( f, "0", data );
herr = _write_field_data (
f,
"0",
data );
if ( herr < 0 ) return herr;
herr = _close_field_group ( f );
@@ -1431,7 +1282,6 @@ H5Block3dWrite3dVectorField (
) {
SET_FNAME ( "H5Block3dWrite3dVectorField" );
INIT ( f );
CHECK_WRITABLE_MODE ( f );
CHECK_TIMEGROUP ( f );
CHECK_LAYOUT ( f );
@@ -1439,11 +1289,11 @@ H5Block3dWrite3dVectorField (
h5part_int64_t herr = _create_field_group ( f, name );
if ( herr < 0 ) return herr;
herr = _write_data ( f, "0", x_data );
herr = _write_field_data ( f, "0", x_data );
if ( herr < 0 ) return herr;
herr = _write_data ( f, "1", y_data );
herr = _write_field_data ( f, "1", y_data );
if ( herr < 0 ) return herr;
herr = _write_data ( f, "2", z_data );
herr = _write_field_data ( f, "2", z_data );
if ( herr < 0 ) return herr;
herr = _close_field_group ( f );
@@ -1467,13 +1317,12 @@ H5BlockGetNumFields (
) {
SET_FNAME ( "H5BlockGetNumFields" );
INIT ( f );
CHECK_TIMEGROUP( f );
if ( ! _have_object ( f->timegroup, H5BLOCK_GROUPNAME_BLOCK ) )
return 0;
return _H5Part_get_num_objects ( f->timegroup, H5BLOCK_GROUPNAME_BLOCK, H5G_GROUP );
return H5_get_num_objects ( f->timegroup, H5BLOCK_GROUPNAME_BLOCK, H5G_GROUP );
}
/*!
@@ -1513,7 +1362,7 @@ _get_field_info (
for ( i = 0, j = *grid_rank-1; i < *grid_rank; i++, j-- )
grid_dims[i] = (h5part_int64_t)dims[j];
*field_dims = _H5Part_get_num_objects (
*field_dims = H5_get_num_objects (
f->block->blockgroup,
field_name,
H5G_DATASET );
@@ -1556,7 +1405,6 @@ H5BlockGetFieldInfo (
) {
SET_FNAME ( "H5BlockGetFieldInfo" );
INIT ( f );
CHECK_TIMEGROUP( f );
h5part_int64_t herr = _H5Part_get_object_name (
@@ -1589,7 +1437,6 @@ H5BlockGetFieldInfoByName (
) {
SET_FNAME ( "H5BlockGetFieldInfo" );
INIT ( f );
CHECK_TIMEGROUP( f );
return _get_field_info (
@@ -1618,7 +1465,7 @@ _write_field_attrib (
h5part_int64_t herr = _open_field_group ( f, field_name );
if ( herr < 0 ) return herr;
_H5Part_write_attrib (
H5_write_attrib (
f->block->field_group_id,
attrib_name,
attrib_type,
@@ -1651,7 +1498,6 @@ H5BlockWriteFieldAttrib (
) {
SET_FNAME ( "H5BlockWriteFieldAttrib" );
INIT ( f );
CHECK_WRITABLE_MODE( f );
CHECK_TIMEGROUP( f );
@@ -1679,7 +1525,6 @@ H5BlockWriteFieldAttribString (
) {
SET_FNAME ( "H5BlockWriteFieldAttribString" );
INIT ( f );
CHECK_WRITABLE_MODE( f );
CHECK_TIMEGROUP( f );
@@ -1704,7 +1549,6 @@ H5BlockGetNumFieldAttribs (
) {
SET_FNAME ( "H5BlockGetNumFieldAttribs" );
INIT ( f );
CHECK_TIMEGROUP( f );
h5part_int64_t herr = _open_field_group ( f, field_name );
@@ -1742,13 +1586,12 @@ H5BlockGetFieldAttribInfo (
) {
SET_FNAME ( "H5BlockGetFieldAttribInfo" );
INIT ( f );
CHECK_TIMEGROUP( f );
h5part_int64_t herr = _open_field_group ( f, field_name );
if ( herr < 0 ) return herr;
herr = _H5Part_get_attrib_info (
herr = H5_get_attrib_info (
f->block->field_group_id,
attrib_idx,
attrib_name,
@@ -1785,7 +1628,7 @@ _read_field_attrib (
h5part_int64_t herr = _open_field_group ( f, field_name );
if ( herr < 0 ) return herr;
herr = _H5Part_read_attrib (
herr = H5_read_attrib (
b->field_group_id,
attrib_name,
attrib_value );
@@ -1813,7 +1656,6 @@ H5BlockReadFieldAttrib (
) {
SET_FNAME ( "H5PartReadFieldAttrib" );
INIT ( f );
CHECK_TIMEGROUP( f );
return _read_field_attrib (
@@ -1841,7 +1683,6 @@ H5Block3dGetFieldOrigin (
) {
SET_FNAME ( "H5BlockSetFieldOrigin" );
INIT ( f );
CHECK_TIMEGROUP( f );
h5part_float64_t origin[3];
@@ -1875,7 +1716,6 @@ H5Block3dSetFieldOrigin (
) {
SET_FNAME ( "H5BlockSetFieldOrigin" );
INIT ( f );
CHECK_WRITABLE_MODE( f );
CHECK_TIMEGROUP( f );
@@ -1907,7 +1747,6 @@ H5Block3dGetFieldSpacing (
) {
SET_FNAME ( "H5BlockGetFieldSpacing" );
INIT ( f );
CHECK_TIMEGROUP( f );
h5part_float64_t spacing[3];
@@ -1941,7 +1780,6 @@ H5Block3dSetFieldSpacing (
) {
SET_FNAME ( "H5BlockSetFieldSpacing" );
INIT ( f );
CHECK_WRITABLE_MODE( f );
CHECK_TIMEGROUP( f );
@@ -1971,7 +1809,6 @@ H5BlockHasFieldData (
) {
SET_FNAME ( "H5BlockHasFieldData" );
INIT ( f );
CHECK_TIMEGROUP( f );
if ( ! _have_object ( f->timegroup, H5BLOCK_GROUPNAME_BLOCK ) ) {