File handling and attributes
Table of Contents
1. Open a H5hut file
1.1. Open file with default properties, serial version
C implementation
#include "H5hut.h" int main ( int argc, char** argv ) { h5_file_t f = H5OpenFile ("testfile.h5", H5_O_WRONLY, H5_PROP_DEFAULT); H5CloseFile (f); return 0; }
Fortran90 implementation
include 'H5hut.f90' program openclose use H5hut implicit none include 'mpif.h' integer*8 :: file_id, status file_id = h5_openfile ("testfile.h5", H5_O_WRONLY, H5_PROP_DEFAULT) status = h5_closefile (file_id); end program openclose
1.2. Open file with default properties, parallel version
C implementation
#include "H5hut.h" int main ( int argc, char** argv ) { MPI_Init (&argc, &argv); h5_file_t f = H5OpenFile ("testfile.h5", H5_O_WRONLY, H5_PROP_DEFAULT); H5CloseFile (f); MPI_Finalize (); return 0; }
Fortran90 implementation
include 'H5hut.f90' program openclose use H5hut implicit none include 'mpif.h' integer :: ierr integer*8 :: file_id, status call mpi_init(ierr) file_id = h5_openfile ("testfile.h5", H5_O_WRONLY, H5_PROP_DEFAULT) status = h5_closefile (file_id); call mpi_finalize(ierr) end program openclose
1.3. Open file to use MPI independent I/O
C implementation
#include "H5hut.h" int main ( int argc, char** argv ) { MPI_Init (&argc, &argv); MPI_Comm comm = MPI_COMM_WORLD; h5_prop_t prop = H5CreateFileProp (); H5SetPropFileMPIOIndependent (prop, &comm); h5_file_t f = H5OpenFile ("testfile.h5", H5_O_WRONLY, prop); H5CloseProp (prop); H5CloseFile (f); MPI_Finalize (); return 0; }
Fortran90 implementation
include 'H5hut.f90' program openclose use H5hut implicit none include 'mpif.h' integer :: comm, rank, ierr integer*8 :: file_id, status integer*8 :: props comm = MPI_COMM_WORLD call mpi_init(ierr) call mpi_comm_rank(comm, rank, ierr) props = h5_createprop_file () status = h5_setprop_file_mpio_collective (props, comm) file_id = h5_openfile ("testfile.h5", H5_O_WRONLY, props) status = h5_closeprop (props) status = h5_closefile (file_id); call mpi_finalize(ierr) end program openclose
2. File attributes
2.1. Write file attributes
C implementation
#include "H5hut.h" #define FNAME "example_file_attribs.h5" #define ATTR_STRING "FileAttrString" #define ATTR_INT32 "FileAttrInt32" #define ATTR_INT64 "FileAttrInt64" #define ATTR_FLOAT32 "FileAttrFloat32" #define ATTR_FLOAT64 "FileAttrFloat64" #define asize(array) (sizeof(array)/sizeof(array[0])) int main ( int argc, char** argv ) { char* string_value = "This is a string attribute bound to the file."; int32_t int32_value[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144}; int64_t int64_value[] = {42, 43, 44, 45}; h5_float32_t float32_value[] = {2.71828}; h5_float64_t float64_value[] = {3.14159265358979323846264338327950288419716939937510}; MPI_Init (&argc, &argv); H5AbortOnError (); // if file properties is set to default, MPI_COMM_WORLD will be used h5_file_t f = H5OpenFile (FNAME, H5_O_WRONLY, H5_PROP_DEFAULT); H5WriteFileAttribString (f, ATTR_STRING, string_value); H5WriteFileAttribInt32 (f, ATTR_INT32, int32_value, asize(int32_value)); H5WriteFileAttribInt64 (f, ATTR_INT64, int64_value, asize(int64_value)); H5WriteFileAttribFloat32 (f, ATTR_FLOAT32, float32_value, asize(float32_value)); H5WriteFileAttribFloat64 (f, ATTR_FLOAT64, float64_value, asize(float32_value)); H5CloseFile (f); MPI_Finalize (); return 0; }
Fortran90 implementation
include 'H5hut.f90' program write_file_attribs use H5hut implicit none include 'mpif.h' integer*8, parameter :: verbosity_level = 1 character (len=*), parameter :: FNAME = "example_file_attribs.h5" character (len=*), parameter :: ATTR_STRING = "FileAttrString" character (len=*), parameter :: ATTR_I4 = "FileAttrInt32" character (len=*), parameter :: ATTR_I8 = "FileAttrInt64" character (len=*), parameter :: ATTR_R4 = "FileAttrFloat32" character (len=*), parameter :: ATTR_R8 = "FileAttrFloat64" character (len=*),parameter :: string_value = "This is a string attribute bound to the file." integer*4, parameter, dimension(*) :: i4_value = (/0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144/) integer*8, parameter, dimension(*) :: i8_value = (/42, 43, 44, 45/) real*4, parameter, dimension(*) :: r4_value = (/2.71828/) real*8, parameter, dimension(*) :: r8_value = (/3.141592653589793238462643383279502884197169/) integer :: ierr integer*8 :: file_id, status call mpi_init(ierr) ! abort program on any H5hut error call h5_abort_on_error() call h5_set_verbosity_level (verbosity_level) ! MPI_COMM_WORLD is used, if file is opened with default properties file_id = h5_openfile (FNAME, H5_O_WRONLY, H5_PROP_DEFAULT) ! write attributes status = h5_writefileattrib_string (file_id, ATTR_STRING, string_value) status = h5_writefileattrib_i4 (file_id, ATTR_I4, i4_value, int8(size(i4_value, 1))) status = h5_writefileattrib_i8 (file_id, ATTR_I8, i8_value, int8(size(i8_value, 1))) status = h5_writefileattrib_r4 (file_id, ATTR_R4, r4_value, int8(size(r4_value, 1))) status = h5_writefileattrib_r8 (file_id, ATTR_R8, r8_value, int8(size(r8_value, 1))) ! cleanup status = h5_closefile (file_id) call mpi_finalize(ierr) end program write_file_attribs
2.2. Read file attributes
Read and print the file attributes written by above example.
C implementation
#include "H5hut.h" #include <stdlib.h> #define FNAME "example_file_attribs.h5" #define VERBOSITY H5_VERBOSE_ERROR #define DEBUG_MSK 0 #define ATTR_STRING "FileAttrString" #define ATTR_INT32 "FileAttrInt32" #define ATTR_INT64 "FileAttrInt64" #define ATTR_FLOAT32 "FileAttrFloat32" #define ATTR_FLOAT64 "FileAttrFloat64" int main ( int argc, char** argv ) { MPI_Init (&argc, &argv); H5AbortOnError (); H5SetVerbosityLevel (VERBOSITY); H5SetDebugMask (DEBUG_MSK); // if file properties is set to default, MPI_COMM_WORLD will be used h5_file_t f = H5OpenFile (FNAME, H5_O_RDONLY, H5_PROP_DEFAULT); h5_size_t len; H5GetFileAttribInfoByName (f, ATTR_STRING, NULL, &len); char* attr_string = (char*)malloc (len+1); H5ReadFileAttribString (f, ATTR_STRING, attr_string); printf ("%s: %s\n", ATTR_STRING, attr_string); free (attr_string); H5GetFileAttribInfoByName (f, ATTR_INT32, NULL, &len); int32_t* attr_int32 = (int32_t*)malloc (sizeof(*attr_int32)*len); H5ReadFileAttribInt32 (f, ATTR_INT32, attr_int32); printf ("%s:", ATTR_INT32); for (int i = 0; i < len; i++) { printf (" %d", attr_int32[i]); } printf ("\n"); free (attr_int32); H5GetFileAttribInfoByName (f, ATTR_INT64, NULL, &len); int64_t* attr_int64 = (int64_t*)malloc (sizeof(*attr_int64)*len); H5ReadFileAttribInt64 (f, ATTR_INT64, attr_int64); printf ("%s:", ATTR_INT64); for (int i = 0; i < len; i++) { printf (" %lld", (long long int)attr_int64[i]); } printf ("\n"); free (attr_int64); H5GetFileAttribInfoByName (f, ATTR_FLOAT32, NULL, &len); h5_float32_t* attr_float32 = (h5_float32_t*)malloc (sizeof(*attr_float32)*len); H5ReadFileAttribFloat32 (f, ATTR_FLOAT32, attr_float32); printf ("%s:", ATTR_FLOAT32); for (int i = 0; i < len; i++) { printf (" %f", attr_float32[i]); } printf ("\n"); free (attr_float32); H5GetFileAttribInfoByName (f, ATTR_FLOAT64, NULL, &len); h5_float64_t* attr_float64 = (h5_float64_t*)malloc (sizeof(*attr_float64)*len); H5ReadFileAttribFloat64 (f, ATTR_FLOAT64, attr_float64); printf ("%s:", ATTR_FLOAT64); for (int i = 0; i < len; i++) { printf (" %f", attr_float64[i]); } printf ("\n"); free (attr_float64); // cleanup H5CloseFile (f); MPI_Finalize (); return 0; } --- *Fortran implementation*
include 'H5hut.f90'
program read_step_attribs use H5hut implicit none include 'mpif.h'
! the file name we want to read character (len=*), parameter :: FNAME = "example_file_attribs.h5"
! verbosity level: set it to a power of 2 minus one or zero integer*8, parameter :: verbosity_level = 1
! we know the attribute names! character (len=*), parameter :: ATTR_STRING = "StepAttrString" character (len=*), parameter :: ATTR_I4 = "StepAttrInt32" character (len=*), parameter :: ATTR_I8 = "StepAttrInt64" character (len=*), parameter :: ATTR_R4 = "StepAttrFloat32" character (len=*), parameter :: ATTR_R8 = "StepAttrFloat64"
! for formated output character (len=128) :: fmt
! attribute values. Note: allocatable strings aren't supported in Fortran90 character (len=256) :: string_value integer*4, allocatable :: i4_value (:) integer*8, allocatable :: i8_value (:) real*4, allocatable :: r4_value (:) real*8, allocatable :: r8_value (:)
! used for mpi error return integer :: ierr
! H5hut file id integer*8 :: file_id
! H5hut API status return integer*8 status
! type of attribute integer*8 type
! len of attribute integer*8 len
! loop index integer*8 i
call mpi_init (ierr)
! abort program on any H5hut error call h5_abort_on_error ()
call h5_set_verbosity_level (verbosity_level)
! MPI_COMM_WORLD is used, if file is opened with default properties file_id = h5_openfile (FNAME, H5_O_RDONLY, H5_PROP_DEFAULT)
! open step 1 status = h5_setstep (file_id, int8(1))
! read and output string attribute status = h5_getstepattribinfo_by_name (file_id, ATTR_STRING, type, len) status = h5_readstepattrib_string (file_id, ATTR_STRING, string_value) write (fmt, "(a, i0, a)") '(a', len, ')' write (*, "(a, ' = ')", advance='no') ATTR_STRING write (*, fmt) string_value
! read and output 32bit integer attribute status = h5_getstepattribinfo_by_name (file_id, ATTR_I4, type, len) allocate (i4_value(len)) status = h5_readstepattrib_i4 (file_id, ATTR_I4, i4_value) write (fmt, "(a, i0, a)") '(', len, 'i4)' write (*, "(a, ' =')", advance='no') ATTR_I4 write (*, fmt) (i4_value(i), i = 1, len)
! read and output 64bit integer attribute status = h5_getstepattribinfo_by_name (file_id, ATTR_I8, type, len) allocate (i8_value(len)) status = h5_readstepattrib_i8 (file_id, ATTR_I8, i8_value) write (fmt, "(a, i0, a)") '(', len, 'i4)' write (*, "(a, ' =')", advance='no') ATTR_I8 write (*, fmt) (i8_value(i), i = 1, len)
! read and output 32bit floating point attribute status = h5_getstepattribinfo_by_name (file_id, ATTR_R4, type, len) allocate (r4_value(len)) status = h5_readstepattrib_r4 (file_id, ATTR_R4, r4_value) write (fmt, "(a, i0, a)") '(', len, 'f10.5)' write (*, "(a, ' =')", advance='no') ATTR_R4 write (*, fmt) (r4_value(i), i = 1, len)
! read and output 64bit floating point attribute status = h5_getstepattribinfo_by_name (file_id, ATTR_R8, type, len) allocate (r8_value(len)) status = h5_readstepattrib_r8 (file_id, ATTR_R8, r8_value) write (fmt, "(a, i0, a)") '(', len, 'f10.5)' write (*, "(a, ' =')", advance='no') ATTR_R8 write (*, fmt) (r8_value(i), i = 1, len)
! cleanup status = h5_closefile (file_id) call mpi_finalize(ierr)
end program read_step_attribs