diff --git a/.gitattributes b/.gitattributes index f4d6a35..9d66b49 100644 --- a/.gitattributes +++ b/.gitattributes @@ -97,8 +97,10 @@ test/Bench.c -text test/BlockTestSpecs.txt -text test/H5BlockParallelTest1.c -text test/H5BlockReadParallel1.c -text +test/H5BlockReadScalarField1Proc.c -text test/H5BlockTest1.c -text test/H5BlockWrite1.c -text +test/H5BlockWriteScalarField1Proc.c -text test/H5ParallelTest.cc -text test/H5PartAndreasTest.cc -text test/H5PartTest.cc -text diff --git a/test/H5BlockReadScalarField1Proc.c b/test/H5BlockReadScalarField1Proc.c new file mode 100644 index 0000000..ffa5f2e --- /dev/null +++ b/test/H5BlockReadScalarField1Proc.c @@ -0,0 +1,162 @@ +#include +#include +#include +#include "H5Part.h" +#include "H5Block.h" +#include "H5BlockTypes.h" + +struct H5BlockPartition Layout[1] = { + { 0, 63, 0, 63, 0, 511 } +}; + +static h5part_int64_t +_calc_index_KJI ( + int myproc, + h5part_int64_t i, + h5part_int64_t j, + h5part_int64_t k + ) { + h5part_int64_t i_dims = Layout[myproc].i_end - Layout[myproc].i_start + 1; + h5part_int64_t j_dims = Layout[myproc].j_end - Layout[myproc].j_start + 1; + + return i + j*i_dims + k*i_dims*j_dims; +} + + + +static h5part_int64_t +_read_file ( + H5PartFile *f, + int myproc, + int nprocs + ){ + + h5part_int64_t i, j, k, idx; + h5part_int64_t herr; + h5part_float64_t *data; + h5part_int64_t i_dims = Layout[myproc].i_end - Layout[myproc].i_start + 1; + h5part_int64_t j_dims = Layout[myproc].j_end - Layout[myproc].j_start + 1; + h5part_int64_t k_dims = Layout[myproc].k_end - Layout[myproc].k_start + 1; + + + printf ( "Reading Step #%lld\n", (long long)f->timestep ); + + data = malloc ( i_dims * j_dims * k_dims * sizeof ( *data ) ); + + herr = H5BlockDefine3DFieldLayout ( + f, + Layout[myproc].i_start, Layout[myproc].i_end, + Layout[myproc].j_start, Layout[myproc].j_end, + Layout[myproc].k_start, Layout[myproc].k_end ); + if ( herr < 0 ) return herr; + + herr = H5Block3dReadScalarField ( f, "TestField", data ); + if ( herr < 0 ) return herr; + + for ( i = 0; i < i_dims; i++ ) { + for ( j = 0; j < j_dims; j++ ) { + for ( k = 0; k < k_dims; k++ ) { + idx = _calc_index_KJI ( myproc, i, j, k ); + h5part_float64_t val = k + + 1000*j + + 100000*i + + 10000000*myproc; + if ( *(data + idx) != val ) { + printf ( "Error reading field at [%lld,%lld,%lld]\n", + (long long)i, + (long long)j, + (long long)k ); + } + } + } + } + + + + free ( data ); + return 1; +} + +int +main ( + int argc, + char **argv + ) { + char *fname = "blockfile1.h5"; + int timestep = 0; + int myproc; + int nprocs; + h5part_int64_t herr; + H5PartFile *f; + MPI_Comm comm = MPI_COMM_WORLD; + + MPI_Init( &argc, &argv ); + MPI_Comm_size ( comm, &nprocs ); + MPI_Comm_rank( comm, &myproc ); + + if ( nprocs != 1 ) { + printf ( "Run this test with 1 processor!" ); + return 1; + } + + printf ("PROC[%d]: Open file \"%s\" for reading ...\n", myproc, fname ); + + f = H5PartOpenFileParallel ( fname, H5PART_READ, comm ); + if ( f == NULL ) return -1; + + herr = H5PartSetStep ( f, timestep ); + if ( herr < 0 ) return herr; + + + H5PartSetVerbosityLevel ( 40 ); + + if ( _read_file ( f, myproc, nprocs ) < 0 ) { + printf ("Failed to read file \"%s\"\n", fname ); + return 2; + } + + char sval[16]; + herr = H5BlockReadFieldAttrib ( + f, + "TestField", + "TestString", + sval ); + if ( herr < 0 ) return -1; + if ( strcmp ( sval, "42" ) != 0 ) { + printf ( "Error reading string attribute: " + "Value is \"%s\" and should be \"42\"\n", sval ); + } + + h5part_int64_t ival[1]; + h5part_float64_t rval[1]; + herr = H5BlockReadFieldAttrib ( + f, + "TestField", + "TestInt64", + ival ); + if ( herr < 0 ) return -1; + if ( ival[0] != 42 ) { + printf ( "Error reading int64 attribute: " + "Value is %lld and should be 42\n", + (long long) ival[0] ); + } + + herr = H5BlockReadFieldAttrib ( + f, + "TestField", + "TestFloat64", + rval ); + if ( herr < 0 ) return -1; + if ( rval[0] != 42.0 ) { + printf ( "Error reading float64 attribute: " + "Value is %f and should be 42.0\n", + rval[0] ); + } + + + herr = H5PartCloseFile ( f ); + if ( herr < 0 ) return -1; + + return 0; +} + diff --git a/test/H5BlockWriteScalarField1Proc.c b/test/H5BlockWriteScalarField1Proc.c new file mode 100644 index 0000000..419cad4 --- /dev/null +++ b/test/H5BlockWriteScalarField1Proc.c @@ -0,0 +1,140 @@ +#include +#include +#include +#include "H5Part.h" +#include "H5Block.h" +#include "H5BlockTypes.h" + +struct H5BlockPartition Layout[1] = { + { 0, 63, 0, 63, 0, 511 } +}; + +static h5part_int64_t +_calc_index_KJI ( + int myproc, + h5part_int64_t i, + h5part_int64_t j, + h5part_int64_t k + ) { + h5part_int64_t i_dims = Layout[myproc].i_end - Layout[myproc].i_start + 1; + h5part_int64_t j_dims = Layout[myproc].j_end - Layout[myproc].j_start + 1; + + return i + j*i_dims + k*i_dims*j_dims; +} + + + +static h5part_int64_t +_write_file ( + H5PartFile *f, + int myproc, + int nprocs + ){ + + h5part_int64_t i, j, k, idx; + h5part_int64_t herr; + h5part_float64_t *data; + h5part_int64_t i_dims = Layout[myproc].i_end - Layout[myproc].i_start + 1; + h5part_int64_t j_dims = Layout[myproc].j_end - Layout[myproc].j_start + 1; + h5part_int64_t k_dims = Layout[myproc].k_end - Layout[myproc].k_start + 1; + + + printf ( "Writing Step #%lld\n", (long long)f->timestep ); + + data = malloc ( i_dims * j_dims * k_dims * sizeof ( *data ) ); + for ( i = 0; i < i_dims; i++ ) { + for ( j = 0; j < j_dims; j++ ) { + for ( k = 0; k < k_dims; k++ ) { + idx = _calc_index_KJI ( myproc, i, j, k ); + *(data + idx) = k + + 1000*j + + 100000*i + + 10000000*myproc; + } + } + } + + herr = H5BlockDefine3DFieldLayout ( + f, + Layout[myproc].i_start, Layout[myproc].i_end, + Layout[myproc].j_start, Layout[myproc].j_end, + Layout[myproc].k_start, Layout[myproc].k_end ); + if ( herr < 0 ) return herr; + + herr = H5Block3dWriteScalarField ( f, "TestField", data ); + if ( herr < 0 ) return herr; + + free ( data ); + return 1; +} + +int +main ( + int argc, + char **argv + ) { + char *fname = "blockfile1.h5"; + int timestep = 0; + int myproc; + int nprocs; + h5part_int64_t herr; + H5PartFile *f; + MPI_Comm comm = MPI_COMM_WORLD; + + MPI_Init( &argc, &argv ); + MPI_Comm_size ( comm, &nprocs ); + MPI_Comm_rank( comm, &myproc ); + + if ( nprocs != 1 ) { + printf ( "Run this test with 1 processor!" ); + return 1; + } + + printf ("PROC[%d]: Open file \"%s\" for writing ...\n", myproc, fname ); + + f = H5PartOpenFileParallel ( fname, H5PART_WRITE, comm ); + if ( f == NULL ) return -1; + + herr = H5PartSetStep ( f, timestep ); + if ( herr < 0 ) return herr; + + + H5PartSetVerbosityLevel ( 40 ); + + if ( _write_file ( f, myproc, nprocs ) < 0 ) { + printf ("Failed to write file \"%s\"\n", fname ); + return 2; + } + + herr = H5BlockWriteFieldAttribString ( + f, + "TestField", + "TestString", + "42" ); + if ( herr < 0 ) return -1; + + h5part_int64_t ival[1] = { 42 }; + h5part_float64_t rval[1] = { 42.0 }; + herr = H5BlockWriteFieldAttrib ( + f, + "TestField", + "TestInt64", + H5PART_INT64, + ival, 1 ); + if ( herr < 0 ) return -1; + + herr = H5BlockWriteFieldAttrib ( + f, + "TestField", + "TestFloat64", + H5PART_FLOAT64, + rval, 1 ); + if ( herr < 0 ) return -1; + + + herr = H5PartCloseFile ( f ); + if ( herr < 0 ) return -1; + + return 0; +} +