Files
src_old/src/include/H5Block_model.h
T

406 lines
12 KiB
C

/*
Copyright (c) 2006-2016, The Regents of the University of California,
through Lawrence Berkeley National Laboratory (subject to receipt of any
required approvals from the U.S. Dept. of Energy) and the Paul Scherrer
Institut (Switzerland). All rights reserved.
License: see file COPYING in top level of source distribution.
*/
#ifndef __H5BLOCK_MODEL
#define __H5BLOCK_MODEL
#include "h5core/h5_types.h"
#include "h5core/h5.h"
#include "h5core/h5_debug.h"
#include "h5core/h5b_model.h"
/**
\addtogroup h5block_model
@{
*/
#ifdef __cplusplus
extern "C" {
#endif
/********************** defining the layout **********************************/
/**
Checks whether the current time-step has field data or not.
\return true (value \c >0) if step exists
\return false (\c 0) if step does not exist
\return \c H5_FAILURE on error
*/
static inline h5_err_t
H5BlockHasFieldData (
const h5_file_t f ///< [in] file handle
) {
H5_API_ENTER (h5_err_t,
"f=%p, ",
(h5_file_p)f);
H5_API_RETURN (h5b_has_field_data (f));
}
/**
Tests whether a view has been set, either directly with
\ref H5Block3dSetView or indirectly with \ref H5Block3dSetGrid.
\return true (value \c >0) if step exists
\return false (\c 0) if step does not exist
\return \c H5_FAILURE on error
*/
static inline h5_int64_t
H5Block3dHasView (
const h5_file_t f ///< [in] File handle */
) {
H5_API_ENTER (h5_int64_t,
"f=%p",
(h5_file_p)f);
H5_API_RETURN (h5b_3d_has_view (f));
}
/**
Defines the partition of the field that this processor owns, using
Fortran ordering: the fastest moving index is \c i.
This routine uses an MPI_Allgather, so at large concurrency it should
be called as infrequently as possible. For instance, if several timesteps
use the same field dimensions, set the layout only once before the
first timestep.
\return \c H5_SUCCESS on success
\return \c H5_FAILURE on error
*/
static inline h5_err_t
H5Block3dSetView (
const h5_file_t f, ///< [in] File handle.
const h5_int64_t i_start, ///< [in] start index of \c i
const h5_int64_t i_end, ///< [in] end index of \c i
const h5_int64_t j_start, ///< [in] start index of \c j
const h5_int64_t j_end, ///< [in] end index of \c j
const h5_int64_t k_start, ///< [in] start index of \c k
const h5_int64_t k_end ///< [in] end index of \c k
) {
H5_API_ENTER (h5_err_t,
"f=%p, "
"i_start=%lld, i_end=%lld, "
"j_start=%lld, j_end=%lld, "
"k_start=%lld, k_end=%lld",
(h5_file_p)f,
(long long)i_start, (long long)i_end,
(long long)j_start, (long long)j_end,
(long long)k_start, (long long)k_end);
H5_API_RETURN (h5b_3d_set_view (f,
i_start, i_end,
j_start, j_end,
k_start, k_end));
}
/**
Return the view of this processor.
\return \c H5_SUCCESS on success
\return \c H5_FAILURE on error
*/
static inline h5_err_t
H5Block3dGetView (
const h5_file_t f, ///< [in] File handle.
h5_size_t* i_start, ///< [out] start index of \c i
h5_size_t* i_end, ///< [out] end index of \c i
h5_size_t* j_start, ///< [out] start index of \c j
h5_size_t* j_end, ///< [out] end index of \c j
h5_size_t* k_start, ///< [out] start index of \c k
h5_size_t* k_end ///< [out] end index of \c k
) {
H5_API_ENTER (h5_err_t,
"f=%p, "
"i_start=%p, i_end=%p, "
"j_start=%p, j_end=%p, "
"k_start=%p, k_end=%p",
(h5_file_p)f,
i_start, i_end,
j_start, j_end,
k_start, k_end);
H5_API_RETURN (h5b_3d_get_view (f, i_start, i_end, j_start, j_end, k_start, k_end));
}
/**
Return the reduced (ghost-zone free) view of this processor.
\return \c H5_SUCCESS on success
\return \c H5_FAILURE on error
*/
static inline h5_err_t
H5Block3dGetReducedView (
const h5_file_t f, ///< [in] file handle.
h5_size_t* const i_start, ///< [out] start index of \c i
h5_size_t* const i_end, ///< [out] end index of \c i
h5_size_t* const j_start, ///< [out] start index of \c j
h5_size_t* const j_end, ///< [out] end index of \c j
h5_size_t* const k_start, ///< [out] start index of \c j
h5_size_t* const k_end ///< [out] end index of \c j
) {
H5_API_ENTER (h5_err_t,
"f=%p, "
"i_start=%p, i_end=%p, "
"j_start=%p, j_end=%p, "
"k_start=%p, k_end=%p",
(h5_file_p)f,
i_start, i_end,
j_start, j_end,
k_start, k_end);
H5_API_RETURN (h5b_3d_get_reduced_view(f, i_start, i_end, j_start, j_end, k_start, k_end));
}
/**
Define the chunk dimensions and enable chunking in the underlying
HDF5 dataset.
\return \c H5_SUCCESS on success
\return \c H5_FAILURE on error
*/
static inline h5_err_t
H5Block3dSetChunkSize (
const h5_file_t f, ///< [in] file handle.
const h5_size_t i, ///< [in] size of \c i
const h5_size_t j, ///< [in] size of \c j
const h5_size_t k ///< [in] size of \c k
) {
H5_API_ENTER (h5_err_t,
"f=%p, i=%llu, j=%llu, k=%llu",
(h5_file_p)f,
(long long unsigned)i,
(long long unsigned)j,
(long long unsigned)k);
H5_API_RETURN (h5b_3d_set_chunk(f, i, j, k));
}
/**
Lookup the chunk dimensions of the underlying HDF5 dataset.
\return \c H5_SUCCESS on success
\return \c H5_FAILURE on error
*/
static inline h5_err_t
H5Block3dGetChunkSize (
const h5_file_t f, ///< [in] file handle.
const char* field_name, ///< [in] name of dataset
h5_size_t* const i, ///< [out] size of \c i
h5_size_t* const j, ///< [out] size of \c j
h5_size_t* const k ///< [out] size of \c k
) {
H5_API_ENTER (h5_err_t,
"f=%p, i=%p, j=%p, k=%p",
(h5_file_p)f, i, j, k);
H5_API_RETURN (h5b_3d_get_chunk(f, field_name, i, j, k));
}
#ifdef PARALLEL_IO
/**
Define an underlying 3D Cartesian grid on the processors with dimensions
(\c i,\c j,\c k). You can look up a processor's index into the grid
using \ref H5Block3dGetGridCoords.
This function can be used in conjunction with \ref H5Block3dSetDims
to setup the view for a regular grid.
The product of the dimensions must equal the size of the MPI communicator.
\return \c H5_SUCCESS on success
\return \c H5_FAILURE on error
*/
static inline h5_err_t
H5Block3dSetGrid (
const h5_file_t f, ///< [in] file handle.
const h5_size_t i, ///< [in] dimension in \c i
const h5_size_t j, ///< [in] dimension in \c j
const h5_size_t k ///< [in] dimension in \c k
) {
H5_API_ENTER (h5_err_t,
"f=%p, i=%llu, j=%llu, k=%llu",
(h5_file_p)f,
(long long unsigned)i,
(long long unsigned)j,
(long long unsigned)k);
H5_API_RETURN (h5b_3d_set_grid(f, i, j, k));
}
/**
Look up the index (\c i, \c j, \c k) in the grid belonging to MPI processor
\c proc.
\return \c H5_SUCCESS on success
\return \c H5_FAILURE on error
*/
static inline h5_err_t
H5Block3dGetGridCoords (
const h5_file_t f, ///< [in] file handle.
const int proc, ///< [in] MPI processor
h5_int64_t* i, ///< [out] index in \c i
h5_int64_t* j, ///< [out] index in \c j
h5_int64_t* k ///< [out] index in \c k
) {
H5_API_ENTER (h5_err_t,
"f=%p, proc=%d, i=%p, j=%p, k=%p",
(h5_file_p)f, proc, i, j, k);
H5_API_RETURN (h5b_3d_get_grid_coords(f, proc, i, j, k));
}
/**
Set the dimensions of each processor's block when the field is a regular
grid.
A grid must be already set with \ref H5Block3dSetGrid, and all processors
must specify the same dimensions.
\return \c H5_SUCCESS on success
\return \c H5_FAILURE on error
*/
static inline h5_err_t
H5Block3dSetDims (
const h5_file_t f, ///< [in] file handle.
const h5_size_t i, ///< [in] dimension in \c i
const h5_size_t j, ///< [in] dimension in \c j
const h5_size_t k ///< [in] dimension in \c k
) {
H5_API_ENTER (h5_err_t,
"f=%p, i=%llu, j=%llu, k=%llu",
(h5_file_p)f,
(long long unsigned)i,
(long long unsigned)j,
(long long unsigned)k);
H5_API_RETURN (h5b_3d_set_dims(f, i, j, k));
}
#endif
/**
Sets the additional cells (\c i, \c j, \c k) in each direction to use as
the `halo` region (or `ghost zone`) that overlaps between neighboring
processors on the grid.
A grid with dimensions must already be set with \ref H5Block3dSetGrid and
\ref H5Block3dSetDims, and all processors must specify the same halo radii.
\return \c H5_SUCCESS on success
\return \c H5_FAILURE on error
*/
static inline h5_err_t
H5Block3dSetHalo (
const h5_file_t f, ///< [in] file handle.
const h5_size_t i, ///< [in] radius in \c i
const h5_size_t j, ///< [in] radius in \c j
const h5_size_t k ///< [in] radius in \c k
) {
H5_API_ENTER (h5_err_t,
"f=%p, i=%llu, j=%llu, k=%llu",
(h5_file_p)f,
(long long unsigned)i,
(long long unsigned)j,
(long long unsigned)k);
H5_API_RETURN (h5b_3d_set_halo(f, i, j, k));
}
/**
Query number of fields in current time step.
\return \c number of fields
\return H5_FAILURE on error
*/
static inline h5_ssize_t
H5BlockGetNumFields (
const h5_file_t f ///< [in] file handle.
) {
H5_API_ENTER (h5_ssize_t,
"f=%p",
(h5_file_p)f);
H5_API_RETURN (h5b_get_num_fields(f));
}
/**
Get the name, rank and dimensions of the field specified by the
index \c idx.
\c elem_rank reports the rank of the elements in the field
(e.g. scalar or vector).
This function can be used to retrieve all fields bound to the
current time-step by looping from \c 0 to the number of fields
minus one. The number of fields bound to the current time-step
can be queried by calling the function \ref H5BlockGetNumFields.
\return \c H5_SUCCESS on success
\return \c H5_FAILURE on error
*/
static inline h5_err_t
H5BlockGetFieldInfo (
const h5_file_t f, ///< [in] file handle.
const h5_size_t idx, ///< [in] index of field.
char* name, ///< [out] field name.
const h5_size_t len_name, ///< [in] buffer size.
h5_size_t* field_rank, ///< [out] field rank.
h5_size_t* field_dims, ///< [out] field dimensions.
h5_size_t* elem_rank, ///< [out] element rank.
h5_int64_t* type ///< [out] datatype.
) {
H5_API_ENTER (h5_err_t,
"f=%p, idx=%llu, "
"name=%p, len_name=%llu, "
"field_rank=%p, field_dims=%p, elem_rank=%p, type=%p",
(h5_file_p)f, (long long unsigned)idx,
name, (long long unsigned)len_name,
field_rank, field_dims, elem_rank,
type);
H5_API_RETURN (
h5b_get_field_info (
f,
idx,
name,
len_name,
field_rank,
field_dims,
elem_rank,
type));
}
/**
Get the rank and dimensions of the field specified by its name.
\return \c H5_SUCCESS on success
\return \c H5_FAILURE on error
\see H5BlockGetFieldInfo.
*/
static inline h5_err_t
H5BlockGetFieldInfoByName (
const h5_file_t f, ///< [in] file handle.
const char* name, ///< [in] field name.
h5_size_t* field_rank, ///< [out] field rank.
h5_size_t* field_dims, ///< [out] field dimensions.
h5_size_t* elem_rank, ///< [out] element rank.
h5_int64_t* type ///< [out] datatype.
) {
H5_API_ENTER (h5_err_t,
"f=%p, name='%s', "
"field_rank=%p, field_dims=%p, elem_rank=%p, type=%p",
(h5_file_p)f, name, field_rank, field_dims, elem_rank, type);
H5_API_RETURN (
h5b_get_field_info_by_name (
f,
name,
field_rank,
field_dims,
elem_rank,
type));
}
///< @}
#ifdef __cplusplus
}
#endif
#endif