Files
src_old/test/h5u_read.c
T
Marc Howison 7ea00c38f8 Integrated H5Part regression test and fixed numerous errors that it discovered.
Finished integrating H5Block and the Fortran interface (untested).
Started adding an H5Block regression test with a few simple tests (all pass).
Added automatic detection of stripe information on lustre, and config option to compile against lustre API.
Moved buffers for H5Block ghost zone disolving out of the file handle and into the h5b_3d_set_view function.
Fixed bug with pointers in the H5Fed file data not being initialized to NULL.
2010-07-15 19:44:48 +00:00

537 lines
16 KiB
C

#include <stdlib.h>
#include <string.h>
#include "testframe.h"
#include "params.h"
static void
test_read_file_attribs(h5_file_t *file, int position)
{
h5_err_t status;
char name[ATTR_NAME_SIZE];
char str[ATTR_NAME_SIZE];
h5_int32_t i32;
h5_int64_t i64;
h5_float32_t f32;
h5_float64_t f64;
TEST("Reading file attributes");
i64 = H5GetNumFileAttribs(file);
VALUE(i64 % 5, 0, "file attribute count");
get_attr_name(name, "str", position);
status = H5ReadFileAttribString(file, name, str);
RETURN(status, H5_SUCCESS, "H5ReadFileAttribString");
SVALUE(str, ATTR_STR_VAL, "string attribute");
get_attr_name(name, "i32", position);
status = H5ReadFileAttribInt32(file, name, &i32);
RETURN(status, H5_SUCCESS, "H5ReadFileAttribInt32");
IVALUE(i32, ATTR_INT32_VAL, "int32 attribute");
get_attr_name(name, "i64", position);
status = H5ReadFileAttribInt64(file, name, &i64);
RETURN(status, H5_SUCCESS, "H5ReadFileAttribInt64");
IVALUE(i64, ATTR_INT64_VAL, "int64 attribute");
get_attr_name(name, "f32", position);
status = H5ReadFileAttribFloat32(file, name, &f32);
RETURN(status, H5_SUCCESS, "H5ReadFileAttribFloat32");
FVALUE(f32, ATTR_FLOAT_VAL, "float32 attribute");
get_attr_name(name, "f64", position);
status = H5ReadFileAttribFloat64(file, name, &f64);
RETURN(status, H5_SUCCESS, "H5ReadFileAttribFloat64");
FVALUE(f64, ATTR_FLOAT_VAL, "float64 attribute");
}
static void
test_read_step_attribs(h5_file_t *file, int position)
{
h5_err_t status;
char name[ATTR_NAME_SIZE];
char str[ATTR_NAME_SIZE];
h5_int32_t i32;
h5_int64_t i64;
h5_float32_t f32;
h5_float64_t f64;
TEST("Reading file attributes");
i64 = H5GetNumStepAttribs(file);
VALUE(i64 % 5, 0, "step attribute count");
get_attr_name(name, "str", position);
status = H5ReadStepAttribString(file, name, str);
RETURN(status, H5_SUCCESS, "H5ReadStepAttribString");
SVALUE(str, ATTR_STR_VAL, "string attribute");
get_attr_name(name, "i32", position);
status = H5ReadStepAttribInt32(file, name, &i32);
RETURN(status, H5_SUCCESS, "H5ReadStepAttribInt32");
IVALUE(i32, ATTR_INT32_VAL, "int32 attribute");
get_attr_name(name, "i64", position);
status = H5ReadStepAttribInt64(file, name, &i64);
RETURN(status, H5_SUCCESS, "H5ReadStepAttribInt64");
IVALUE(i64, ATTR_INT64_VAL, "int64 attribute");
get_attr_name(name, "f32", position);
status = H5ReadStepAttribFloat32(file, name, &f32);
RETURN(status, H5_SUCCESS, "H5ReadStepAttribFloat32");
FVALUE(f32, ATTR_FLOAT_VAL, "float32 attribute");
get_attr_name(name, "f64", position);
status = H5ReadStepAttribFloat64(file, name, &f64);
RETURN(status, H5_SUCCESS, "H5ReadStepAttribFloat64");
FVALUE(f64, ATTR_FLOAT_VAL, "float64 attribute");
}
static void
test_read_data64(h5_file_t *file, int nparticles, int step)
{
int i,t;
int rank, nprocs;
h5_err_t status;
h5_int64_t val, start, end, type;
char name1[4];
char name2[8];
h5_id_t indices[8];
h5_size_t size;
double *x,*y,*z;
double *px,*py,*pz;
h5_int64_t *id;
x=(double*)malloc(nparticles*sizeof(double));
y=(double*)malloc(nparticles*sizeof(double));
z=(double*)malloc(nparticles*sizeof(double));
px=(double*)malloc(nparticles*sizeof(double));
py=(double*)malloc(nparticles*sizeof(double));
pz=(double*)malloc(nparticles*sizeof(double));
id=(h5_int64_t*)malloc(nparticles*sizeof(h5_int64_t));
TEST("Verifying dataset info");
#if PARALLEL_IO
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
#else
nprocs = 1;
rank = 2;
#endif
val = H5PartGetNumParticles(file);
IVALUE(val, nprocs*nparticles, "particle count");
val = H5PartGetNumDatasets(file);
IVALUE(val, 7, "dataset count");
for (i=0; i<7; i++) {
status = H5PartGetDatasetName(file, i, name1, 2);
RETURN(status, H5_SUCCESS, "H5PartGetDatasetName");
status = H5PartGetDatasetInfo(
file, i, name2, 4, &type, &size);
RETURN(status, H5_SUCCESS, "H5PartGetDatasetInfo");
CVALUE(name1[0], name2[0], "dataset name");
status = H5PartGetDatasetName(file, i, name1, 4);
RETURN(status, H5_SUCCESS, "H5PartGetDatasetName");
CVALUE(name1[1], name2[1], "dataset name");
IVALUE(size, nprocs*nparticles, "dataset size");
if (name1[0] == 'i') IVALUE(type, H5_INT64_T, "dataset type");
else IVALUE(type, H5_FLOAT64_T, "dataset type");
}
#if PARALLEL_IO
TEST("Setting throttle");
status = H5SetThrottle(file, 3);
RETURN(status, H5_SUCCESS, "H5SetThrottle");
#endif
TEST("Reading 64-bit data");
for (t=step; t<step+NTIMESTEPS; t++)
{
val = H5HasStep(file, t);
IVALUE(val, 1, "has step");
status = H5SetStep(file, t);
RETURN(status, H5_SUCCESS, "H5SetStep");
test_read_step_attribs(file, t);
status = H5PartSetNumParticles(file, nparticles);
RETURN(status, H5_SUCCESS, "H5PartSetNumParticles");
status = H5PartResetView(file);
RETURN(status, H5_SUCCESS, "H5PartResetView");
start = rank;
end = -1;
status = H5PartSetView(file, start, end);
RETURN(status, H5_SUCCESS, "H5PartSetView");
status = H5PartReadDataFloat64(file, "x", x);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
FVALUE(x[rank], (double)(start+rank+nparticles*t), "x data");
val = H5PartGetView(file, &start, &end);
IVALUE(val, nprocs*nparticles-start, "particle count");
IVALUE(start, rank, "view start");
IVALUE(end, nprocs*nparticles-1, "view end");
status = H5PartSetView(file, -1, -1);
RETURN(status, H5_SUCCESS, "H5PartSetView");
status = H5PartReadDataFloat64(file, "x", x);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
IVALUE(x[rank], (double)(rank+nparticles*t), "x data");
indices[0] = rank*2 + 0;
indices[1] = rank*2 + 3;
indices[2] = rank*2 + 9;
indices[3] = rank*2 + 7;
status = H5PartSetViewIndices(file, indices, 0);
RETURN(status, H5_SUCCESS, "H5PartSetViewIndices");
status = H5PartReadDataFloat64(file, "x", x);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
FVALUE(x[2*rank], (double)(2*rank+nparticles*t), "x data");
status = H5PartResetView(file);
RETURN(status, H5_SUCCESS, "H5PartResetView");
status = H5PartSetViewIndices(file, indices, 4);
RETURN(status, H5_SUCCESS, "H5PartSetViewIndices");
val = H5PartGetNumParticles(file);
IVALUE(val, 4, "particle count");
status = H5PartReadDataFloat64(file, "x", x);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
FVALUE(x[2], (double)(rank*2+9+nparticles*t), "x data");
val = H5PartGetNumParticles(file);
IVALUE(val, 4, "particle count");
status = H5PartSetViewIndices(file, NULL, 4);
RETURN(status, H5_SUCCESS, "H5PartSetViewIndices");
status = H5PartReadDataFloat64(file, "x", x);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
status = H5PartSetCanonicalView(file);
RETURN(status, H5_SUCCESS, "H5PartSetCanonicalView");
status = H5PartReadDataFloat64(file, "x", x);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
status = H5PartReadDataFloat64(file, "y", y);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
status = H5PartReadDataFloat64(file, "z", z);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
status = H5PartReadDataFloat64(file, "px", px);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
status = H5PartReadDataFloat64(file, "py", py);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
status = H5PartReadDataFloat64(file, "pz", pz);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
status = H5PartReadDataInt64(file, "id", id);
RETURN(status, H5_SUCCESS, "H5PartReadDataInt64");
for (i=0; i<nparticles; i++)
{
FVALUE(x[i] , 0.0 + (double)(i+nparticles*t), " x data");
FVALUE(y[i] , 0.1 + (double)(i+nparticles*t), " y data");
FVALUE(z[i] , 0.2 + (double)(i+nparticles*t), " z data");
FVALUE(px[i], 0.3 + (double)(i+nparticles*t), " px data");
FVALUE(py[i], 0.4 + (double)(i+nparticles*t), " py data");
FVALUE(pz[i], 0.5 + (double)(i+nparticles*t), " pz data");
IVALUE(id[i], (i+nparticles*t), " id data");
}
}
}
static void
test_read_strided_data64(h5_file_t *file, int nparticles, int step)
{
int i,t;
h5_int64_t status;
double *data;
data=(double*)malloc(6*nparticles*sizeof(double));
TEST("Reading 64-bit strided data");
for (t=step; t<step+NTIMESTEPS; t++)
{
status = H5SetStep(file, t);
RETURN(status, H5_SUCCESS, "H5SetStep");
status = H5PartSetNumParticlesStrided(file, nparticles, 6);
RETURN(status, H5_SUCCESS, "H5PartSetNumParticlesStrided");
status = H5PartReadDataFloat64(file, "x", data+0);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
status = H5PartReadDataFloat64(file, "y", data+1);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
status = H5PartReadDataFloat64(file, "z", data+2);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
status = H5PartReadDataFloat64(file, "px", data+3);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
test_read_step_attribs(file, t);
status = H5PartReadDataFloat64(file, "py", data+4);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
status = H5PartReadDataFloat64(file, "pz", data+5);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat64");
for (i=0; i<nparticles; i++)
{
FVALUE(data[6*i] , 0.0 + (double)(i+nparticles*t), "x data");
FVALUE(data[6*i+1], 0.1 + (double)(i+nparticles*t), "y data");
FVALUE(data[6*i+2], 0.2 + (double)(i+nparticles*t), "z data");
FVALUE(data[6*i+3], 0.3 + (double)(i+nparticles*t), "px data");
FVALUE(data[6*i+4], 0.4 + (double)(i+nparticles*t), "py data");
FVALUE(data[6*i+5], 0.5 + (double)(i+nparticles*t), "pz data");
}
}
}
static void
test_read_data32(h5_file_t *file, int nparticles, int step)
{
int i,t;
h5_int64_t status, val;
float *x,*y,*z;
float *px,*py,*pz;
int *id;
x=(float*)malloc(nparticles*sizeof(float));
y=(float*)malloc(nparticles*sizeof(float));
z=(float*)malloc(nparticles*sizeof(float));
px=(float*)malloc(nparticles*sizeof(float));
py=(float*)malloc(nparticles*sizeof(float));
pz=(float*)malloc(nparticles*sizeof(float));
id=(int*)malloc(nparticles*sizeof(int));
TEST("Reading 32-bit data");
for (t=step; t<step+NTIMESTEPS; t++)
{
val = H5HasStep(file, t);
IVALUE(val, 1, "has step");
status = H5SetStep(file, t);
RETURN(status, H5_SUCCESS, "H5SetStep");
status = H5PartSetCanonicalView(file);
RETURN(status, H5_SUCCESS, "H5PartSetCanonicalView");
test_read_step_attribs(file, t);
status = H5PartReadDataFloat32(file, "x", x);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat32");
status = H5PartReadDataFloat32(file, "y", y);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat32");
status = H5PartReadDataFloat32(file, "z", z);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat32");
status = H5PartReadDataFloat32(file, "px", px);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat32");
status = H5PartReadDataFloat32(file, "py", py);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat32");
status = H5PartReadDataFloat32(file, "pz", pz);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat32");
status = H5PartReadDataInt32(file, LONGNAME, id);
RETURN(status, H5_SUCCESS, "H5PartReadDataInt32");
for (i=0; i<nparticles; i++)
{
FVALUE(x[i] , 0.0F + (float)(i+nparticles*t), " x data");
FVALUE(y[i] , 0.1F + (float)(i+nparticles*t), " y data");
FVALUE(z[i] , 0.2F + (float)(i+nparticles*t), " z data");
FVALUE(px[i], 0.3F + (float)(i+nparticles*t), " px data");
FVALUE(py[i], 0.4F + (float)(i+nparticles*t), " py data");
FVALUE(pz[i], 0.5F + (float)(i+nparticles*t), " pz data");
IVALUE(id[i], (i+nparticles*t), " id data");
}
}
}
static void
test_read_strided_data32(h5_file_t *file, int nparticles, int step)
{
int i,t;
h5_int64_t status;
float *data;
data=(float*)malloc(6*nparticles*sizeof(float));
TEST("Reading 32-bit strided data");
for (t=step; t<step+NTIMESTEPS; t++)
{
status = H5SetStep(file, t);
RETURN(status, H5_SUCCESS, "H5SetStep");
status = H5PartSetNumParticlesStrided(file, nparticles, 6);
RETURN(status, H5_SUCCESS, "H5PartSetNumParticlesStrided");
status = H5PartReadDataFloat32(file, "x", data+0);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat32");
status = H5PartReadDataFloat32(file, "y", data+1);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat32");
status = H5PartReadDataFloat32(file, "z", data+2);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat32");
status = H5PartReadDataFloat32(file, "px", data+3);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat32");
status = H5PartReadDataFloat32(file, "py", data+4);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat32");
status = H5PartReadDataFloat32(file, "pz", data+5);
RETURN(status, H5_SUCCESS, "H5PartReadDataFloat32");
for (i=0; i<nparticles; i++)
{
FVALUE(data[6*i] , 0.0F + (float)(i+nparticles*t), "x data");
FVALUE(data[6*i+1], 0.1F + (float)(i+nparticles*t), "y data");
FVALUE(data[6*i+2], 0.2F + (float)(i+nparticles*t), "z data");
FVALUE(data[6*i+3], 0.3F + (float)(i+nparticles*t), "px data");
FVALUE(data[6*i+4], 0.4F + (float)(i+nparticles*t), "py data");
FVALUE(data[6*i+5], 0.5F + (float)(i+nparticles*t), "pz data");
}
test_read_step_attribs(file, t);
}
}
void h5u_test_read1(void)
{
h5_file_t *file1;
h5_int64_t status;
TEST("Opening file once, read-only");
file1 = H5OpenFile(FILENAME, H5_O_RDONLY, MPI_COMM_WORLD);
status = H5CheckFile(file1);
RETURN(status, H5_SUCCESS, "H5CheckFile");
test_read_file_attribs(file1, 0);
test_read_data32(file1, NPARTICLES, 1);
status = H5CloseFile(file1);
RETURN(status, H5_SUCCESS, "H5CloseFile");
}
void h5u_test_read2(void)
{
h5_file_t *file1;
h5_file_t *file2;
h5_int64_t status;
TEST("Opening file twice, read-only");
file1 = H5OpenFile(FILENAME, H5_O_RDONLY, MPI_COMM_WORLD);
status = H5CheckFile(file1);
RETURN(status, H5_SUCCESS, "H5CheckFile");
file2 = H5OpenFile(FILENAME, H5_O_RDONLY, MPI_COMM_WORLD);
status = H5CheckFile(file2);
RETURN(status, H5_SUCCESS, "H5CheckFile");
test_read_strided_data32(file1, NPARTICLES, NTIMESTEPS+1);
test_read_file_attribs(file2, 1);
status = H5CloseFile(file1);
RETURN(status, H5_SUCCESS, "H5CloseFile");
status = H5CloseFile(file2);
RETURN(status, H5_SUCCESS, "H5CloseFile");
}
void h5u_test_read3(void)
{
h5_file_t *file1;
h5_int64_t status;
TEST("Opening file once, read-only, MPI-POSIX VFD");
file1 = H5OpenFile(FILENAME, H5_O_RDONLY | H5_VFD_MPIPOSIX, MPI_COMM_WORLD);
status = H5CheckFile(file1);
RETURN(status, H5_SUCCESS, "H5CheckFile");
TEST("Redefining step name");
status = H5SetStepNameFormat(file1, LONGNAME, 16);
RETURN(status, H5_SUCCESS, "H5SetStepNameFormat");
test_read_strided_data64(file1, NPARTICLES, 0);
test_read_file_attribs(file1, 0);
status = H5CloseFile(file1);
RETURN(status, H5_SUCCESS, "H5CloseFile");
}
void h5u_test_read4(void)
{
h5_file_t *file1;
h5_file_t *file2;
h5_err_t status;
TEST("Opening file twice, read-only, MPI-IO Independent VFD");
file1 = H5OpenFile(FILENAME, H5_O_RDONLY | H5_VFD_INDEPENDENT, MPI_COMM_WORLD);
status = H5CheckFile(file1);
RETURN(status, H5_SUCCESS, "H5CheckFile");
file2 = H5OpenFile(FILENAME, H5_O_RDONLY | H5_VFD_INDEPENDENT, MPI_COMM_WORLD);
status = H5CheckFile(file2);
RETURN(status, H5_SUCCESS, "H5CheckFile");
TEST("Redefining step name");
status = H5SetStepNameFormat(file1, LONGNAME, 16);
RETURN(status, H5_SUCCESS, "H5SetStepNameFormat");
status = H5SetStepNameFormat(file2, LONGNAME, 16);
RETURN(status, H5_SUCCESS, "H5SetStepNameFormat");
test_read_file_attribs(file1, 1);
status = H5SetStep(file2, NTIMESTEPS);
RETURN(status, H5_SUCCESS, "H5SetStep");
test_read_data64(file2, NPARTICLES, NTIMESTEPS-2);
status = H5CloseFile(file1);
RETURN(status, H5_SUCCESS, "H5CloseFile");
status = H5CloseFile(file2);
RETURN(status, H5_SUCCESS, "H5CloseFile");
}