![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <H5Tpublic.h>
#include <H5Dpublic.h>
#include <H5Gpublic.h>
#include <H5Spublic.h>
#include <H5Ppublic.h>
#include "mhdf.h"
#include "util.h"
#include "file-handle.h"
#include "status.h"
#include "names-and-paths.h"
Go to the source code of this file.
Enumerations | |
enum | SetMetaCol { CONTENT = 0, CHILDREN = 1, PARENTS = 2, FLAGS = 3 } |
Functions | |
int | mhdf_haveSets (mhdf_FileHandle file, int *have_data, int *have_child, int *have_parent, mhdf_Status *status) |
Check if file contains any sets. | |
hid_t | mhdf_createSetMeta (mhdf_FileHandle file, long num_sets, long *first_id_out, mhdf_Status *status) |
Create table holding list of meshsets and their properties. | |
hid_t | mhdf_openSetMeta (mhdf_FileHandle file, long *num_sets, long *first_id_out, mhdf_Status *status) |
Open table holding list of meshsets and their properties. | |
hid_t | mhdf_openSetMetaSimple (mhdf_FileHandle file, mhdf_Status *status) |
static int | mhdf_readwriteSetMeta (hid_t table_id, int read, long offset, long count, hid_t type, void *data, hid_t prop, mhdf_Status *status) |
void | mhdf_readSetMeta (hid_t table_id, long offset, long count, hid_t type, void *data, mhdf_Status *status) |
Read list of sets and meta-information about sets. | |
void | mhdf_readSetMetaWithOpt (hid_t table_id, long offset, long count, hid_t type, void *data, hid_t prop, mhdf_Status *status) |
void | mhdf_writeSetMeta (hid_t table_id, long offset, long count, hid_t type, const void *data, mhdf_Status *status) |
Write list of sets and meta-information about sets. | |
void | mhdf_writeSetMetaWithOpt (hid_t table_id, long offset, long count, hid_t type, const void *data, hid_t prop, mhdf_Status *status) |
static int | mhdf_readSetMetaColumn (hid_t table_id, enum SetMetaCol column, long offset, long count, hid_t type, void *data, hid_t prop, mhdf_Status *status) |
void | mhdf_readSetFlags (hid_t table_id, long offset, long count, hid_t type, void *data, mhdf_Status *status) |
Read only the flags portion of the set description table. | |
void | mhdf_readSetFlagsWithOpt (hid_t table_id, long offset, long count, hid_t type, void *data, hid_t prop, mhdf_Status *status) |
void | mhdf_readSetContentEndIndices (hid_t table_id, long offset, long count, hid_t type, void *data, mhdf_Status *status) |
Read only the content end indices portion of the set description table. | |
void | mhdf_readSetContentEndIndicesWithOpt (hid_t table_id, long offset, long count, hid_t type, void *data, hid_t prop, mhdf_Status *status) |
void | mhdf_readSetChildEndIndices (hid_t table_id, long offset, long count, hid_t type, void *data, mhdf_Status *status) |
Read only the child end indices portion of the set description table. | |
void | mhdf_readSetChildEndIndicesWithOpt (hid_t table_id, long offset, long count, hid_t type, void *data, hid_t prop, mhdf_Status *status) |
void | mhdf_readSetParentEndIndices (hid_t table_id, long offset, long count, hid_t type, void *data, mhdf_Status *status) |
Read only the parent end indices portion of the set description table. | |
void | mhdf_readSetParentEndIndicesWithOpt (hid_t table_id, long offset, long count, hid_t type, void *data, hid_t prop, mhdf_Status *status) |
hid_t | mhdf_createSetData (mhdf_FileHandle file_handle, long data_list_size, mhdf_Status *status) |
Create file object to hold list of meshset contents. | |
hid_t | mhdf_openSetData (mhdf_FileHandle file_handle, long *data_list_size_out, mhdf_Status *status) |
Open the file object for the meshset contents. | |
void | mhdf_writeSetData (hid_t table_id, long offset, long count, hid_t type, const void *data, mhdf_Status *status) |
Write set contents. | |
void | mhdf_writeSetDataWithOpt (hid_t table_id, long offset, long count, hid_t type, const void *data, hid_t prop, mhdf_Status *status) |
void | mhdf_readSetData (hid_t table_id, long offset, long count, hid_t type, void *data, mhdf_Status *status) |
Read set contents. | |
void | mhdf_readSetDataWithOpt (hid_t table_id, long offset, long count, hid_t type, void *data, hid_t prop, mhdf_Status *status) |
hid_t | mhdf_createSetChildren (mhdf_FileHandle file_handle, long child_list_size, mhdf_Status *status) |
Create file object for storing the set child list. | |
hid_t | mhdf_openSetChildren (mhdf_FileHandle file_handle, long *child_list_size, mhdf_Status *status) |
Open the file object containing the set child list. | |
hid_t | mhdf_createSetParents (mhdf_FileHandle file_handle, long parent_list_size, mhdf_Status *status) |
Create file object for storing the set parent list. | |
hid_t | mhdf_openSetParents (mhdf_FileHandle file_handle, long *parent_list_size, mhdf_Status *status) |
Open the file object containing the set parent list. | |
void | mhdf_writeSetParentsChildren (hid_t table_id, long offset, long count, hid_t type, const void *data, mhdf_Status *status) |
Write set parent/child list. | |
void | mhdf_writeSetParentsChildrenWithOpt (hid_t table_id, long offset, long count, hid_t type, const void *data, hid_t prop, mhdf_Status *status) |
void | mhdf_readSetParentsChildren (hid_t table_id, long offset, long count, hid_t type, void *data, mhdf_Status *status) |
Read set parent/child list. | |
void | mhdf_readSetParentsChildrenWithOpt (hid_t table_id, long offset, long count, hid_t type, void *data, hid_t prop, mhdf_Status *status) |
enum SetMetaCol |
static int mhdf_readSetMetaColumn | ( | hid_t | table_id, |
enum SetMetaCol | column, | ||
long | offset, | ||
long | count, | ||
hid_t | type, | ||
void * | data, | ||
hid_t | prop, | ||
mhdf_Status * | status | ||
) | [static] |
Definition at line 413 of file sets.c.
References FLAGS, mhdf_setFail(), mhdf_setOkay(), and PARENTS.
Referenced by mhdf_readSetChildEndIndices(), mhdf_readSetChildEndIndicesWithOpt(), mhdf_readSetContentEndIndices(), mhdf_readSetContentEndIndicesWithOpt(), mhdf_readSetFlags(), mhdf_readSetFlagsWithOpt(), mhdf_readSetParentEndIndices(), and mhdf_readSetParentEndIndicesWithOpt().
{
hid_t slab_id, mem_id;
hsize_t offsets[2], counts[2], mcount = count;
herr_t rval = 0;
int dims;
const int fill_val = -1;
if( offset < 0 || count < 0 )
{
mhdf_setFail( status,
"Invalid input for reading set description column: "
"offset = %ld, count = %ld\n",
offset, count );
return 0;
}
/* Get dimensions of table, and check against requested count and offset */
slab_id = H5Dget_space( table_id );
if( slab_id < 0 )
{
mhdf_setFail( status, "Internal error calling H5Dget_space." );
return 0;
}
dims = H5Sget_simple_extent_ndims( slab_id );
if( dims != 2 )
{
H5Sclose( slab_id );
mhdf_setFail( status, "Internal error: unexpected dataset rank: %d.", dims );
return 0;
}
dims = H5Sget_simple_extent_dims( slab_id, counts, NULL );
if( dims < 0 )
{
H5Sclose( slab_id );
mhdf_setFail( status, "Internal error calling H5Sget_simple_extend_dims." );
return 0;
}
if( (unsigned long)( offset + count ) > counts[0] )
{
H5Sclose( slab_id );
mhdf_setFail( status, "Requested read of rows %ld to %ld of a %ld row table.\n", offset, offset + count - 1,
(long)counts[0] );
return 0;
}
/* Create a slab definition for the block of memory we're reading into */
mem_id = H5Screate_simple( 1, &mcount, NULL );
if( mem_id < 0 )
{
H5Sclose( slab_id );
mhdf_setFail( status, "Internal error calling H5Screate_simple." );
return 0;
}
/* Old, 3-column table.
* New table is {contents, children, parents, flags}
* Old table is {contents, children, flags}
* If asking for parents, just return zeros.
* If asking for flags, fix column value.
*/
offsets[1] = column;
if( counts[1] == 3 )
{
if( column == PARENTS )
{
rval = H5Dfill( &fill_val, H5T_NATIVE_INT, data, type, mem_id );
H5Sclose( mem_id );
H5Sclose( slab_id );
if( rval < 0 )
{
mhdf_setFail( status, "Internal error calling H5Dfill" );
return 0;
}
else
{
mhdf_setOkay( status );
return 1;
}
}
else if( column == FLAGS )
--offsets[1];
}
else if( counts[1] != 4 )
{
H5Sclose( mem_id );
H5Sclose( slab_id );
mhdf_setFail( status, "Invalid dimension for meshset metadata table." );
return 0;
}
/* Create a slab defintion for the portion of the table we want to read. */
/* offsets[1] was initialized in the above block of code. */
offsets[0] = (hsize_t)offset;
counts[0] = (hsize_t)count;
counts[1] = 1; /* one column */
if( count )
rval = H5Sselect_hyperslab( slab_id, H5S_SELECT_SET, offsets, NULL, counts, NULL );
else
rval = H5Sselect_none( slab_id );
if( rval < 0 )
{
H5Sclose( mem_id );
H5Sclose( slab_id );
mhdf_setFail( status, "Internal error calling H5Sselect_hyperslab." );
return 0;
}
/* Read the data */
rval = H5Dread( table_id, type, mem_id, slab_id, prop, data );
H5Sclose( mem_id );
H5Sclose( slab_id );
if( rval < 0 )
{
mhdf_setFail( status, "Internal error calling H5Dread." );
return 0;
}
mhdf_setOkay( status );
return 1;
}
static int mhdf_readwriteSetMeta | ( | hid_t | table_id, |
int | read, | ||
long | offset, | ||
long | count, | ||
hid_t | type, | ||
void * | data, | ||
hid_t | prop, | ||
mhdf_Status * | status | ||
) | [static] |
Definition at line 191 of file sets.c.
References mhdf_setFail(), and mhdf_setOkay().
Referenced by mhdf_readSetMeta(), mhdf_readSetMetaWithOpt(), mhdf_writeSetMeta(), and mhdf_writeSetMetaWithOpt().
{
hid_t slab_id, sslab_id, smem_id, mem_id;
hsize_t offsets[2], counts[2], mcounts[2], moffsets[2] = { 0, 0 };
herr_t rval = 0;
int dims, i;
const int fill_val = -1;
const hsize_t one = 1;
mcounts[0] = count;
mcounts[1] = 4;
if( offset < 0 || count < 0 )
{
mhdf_setFail( status,
"Invalid input for %s: "
"offset = %ld, count = %ld\n",
read ? "read" : "write", offset, count );
return 0;
}
slab_id = H5Dget_space( table_id );
if( slab_id < 0 )
{
mhdf_setFail( status, "Internal error calling H5Dget_space." );
return 0;
}
dims = H5Sget_simple_extent_ndims( slab_id );
if( dims != 2 )
{
H5Sclose( slab_id );
mhdf_setFail( status, "Internal error: unexpected dataset rank: %d.", dims );
return 0;
}
dims = H5Sget_simple_extent_dims( slab_id, counts, NULL );
if( dims < 0 )
{
H5Sclose( slab_id );
mhdf_setFail( status, "Internal error calling H5Sget_simple_extend_dims." );
return 0;
}
if( (unsigned long)( offset + count ) > counts[0] )
{
H5Sclose( slab_id );
mhdf_setFail( status, "Requested %s of rows %ld to %ld of a %ld row table.\n", read ? "read" : "write", offset,
offset + count - 1, (long)counts[dims - 1] );
return 0;
}
counts[0] = (hsize_t)count;
offsets[0] = (hsize_t)offset;
if( count )
mem_id = H5Screate_simple( dims, mcounts, NULL );
else
{ /* special case for 'NULL' read during collective parallel IO */
mem_id = H5Screate_simple( 1, &one, NULL );
if( mem_id && 0 > H5Sselect_none( mem_id ) )
{
H5Sclose( mem_id );
mem_id = -1;
}
}
if( mem_id < 0 )
{
mhdf_setFail( status, "Internal error calling H5Screate_simple." );
return 0;
}
/* Normal table: 4 columns */
if( counts[1] == 4 )
{
offsets[1] = 0;
if( count )
rval = H5Sselect_hyperslab( slab_id, H5S_SELECT_SET, offsets, NULL, counts, NULL );
else /* special case for 'NULL' read during collective parallel IO */
rval = H5Sselect_none( slab_id );
if( rval < 0 )
{
H5Sclose( mem_id );
H5Sclose( slab_id );
mhdf_setFail( status, "Internal error calling H5Sselect_hyperslab." );
return 0;
}
if( read )
rval = H5Dread( table_id, type, mem_id, slab_id, prop, data );
else
rval = H5Dwrite( table_id, type, mem_id, slab_id, prop, data );
}
/* Old table: 3 columns, no parent link counts */
else if( counts[1] == 3 )
{
rval = 0;
for( i = 0; i < 3 && rval >= 0; ++i )
{
smem_id = H5Scopy( mem_id );
sslab_id = H5Scopy( slab_id );
if( smem_id < 0 || sslab_id < 0 )
{
if( smem_id >= 0 ) H5Sclose( smem_id );
mhdf_setFail( status, "Internal error calling H5Scopy." );
return 0;
}
counts[1] = 1;
offsets[1] = i;
if( count )
rval = H5Sselect_hyperslab( sslab_id, H5S_SELECT_SET, offsets, NULL, counts, NULL );
else
rval = H5Sselect_none( sslab_id );
if( rval < 0 )
{
H5Sclose( slab_id );
H5Sclose( mem_id );
mhdf_setFail( status, "Internal error calling H5Sselect_hyperslab." );
return 0;
}
mcounts[1] = 1;
moffsets[1] = ( i == 2 ) ? 3 : i;
rval = H5Sselect_hyperslab( smem_id, H5S_SELECT_SET, moffsets, NULL, mcounts, NULL );
if( rval < 0 )
{
H5Sclose( sslab_id );
H5Sclose( slab_id );
H5Sclose( mem_id );
mhdf_setFail( status, "Internal error calling H5Sselect_hyperslab." );
return 0;
}
if( read )
rval = H5Dread( table_id, type, smem_id, sslab_id, prop, data );
else
rval = H5Dwrite( table_id, type, smem_id, sslab_id, prop, data );
H5Sclose( sslab_id );
H5Sclose( smem_id );
}
if( read && rval >= 0 )
{
mcounts[1] = 1;
moffsets[1] = 2;
H5Sselect_hyperslab( mem_id, H5S_SELECT_SET, moffsets, NULL, mcounts, NULL );
rval = H5Dfill( &fill_val, H5T_NATIVE_INT, data, type, mem_id );
}
}
else
{
H5Sclose( mem_id );
H5Sclose( slab_id );
mhdf_setFail( status, "Invalid dimension for meshset metadata table." );
return 0;
}
H5Sclose( slab_id );
H5Sclose( mem_id );
if( rval < 0 )
{
mhdf_setFail( status, "Internal error calling H5D%s.", read ? "read" : "write" );
return 0;
}
mhdf_setOkay( status );
return 1;
}