Files
src_old/test/write.c
T

465 lines
14 KiB
C

#include <H5Part.h>
#include "testframe.h"
#include "params.h"
static void
test_write_file_attribs(H5PartFile *file, int position)
{
h5part_int64_t status;
char name[ATTR_NAME_SIZE];
TEST("Writing file attributes");
get_attr_name(name, "str", position);
status = H5PartWriteFileAttribString(file, name, ATTR_STR_VAL);
RETURN(status, H5PART_SUCCESS, "H5PartWriteFileAttribString");
get_attr_name(name, "i32", position);
status = H5PartWriteFileAttribInt32(file, name, ATTR_INT32_VAL);
RETURN(status, H5PART_SUCCESS, "H5PartWriteFileAttribInt32");
get_attr_name(name, "i64", position);
status = H5PartWriteFileAttribInt64(file, name, ATTR_INT64_VAL);
RETURN(status, H5PART_SUCCESS, "H5PartWriteFileAttribInt64");
get_attr_name(name, "f32", position);
status = H5PartWriteFileAttribFloat32(file, name, ATTR_FLOAT_VAL);
RETURN(status, H5PART_SUCCESS, "H5PartWriteFileAttribFloat32");
get_attr_name(name, "f64", position);
status = H5PartWriteFileAttribFloat64(file, name, ATTR_FLOAT_VAL);
RETURN(status, H5PART_SUCCESS, "H5PartWriteFileAttribFloat64");
}
static void
test_write_step_attribs(H5PartFile *file, int position)
{
h5part_int64_t status;
char name[ATTR_NAME_SIZE];
TEST("Writing step attributes");
get_attr_name(name, "str", position);
status = H5PartWriteStepAttribString(file, name, ATTR_STR_VAL);
RETURN(status, H5PART_SUCCESS, "H5PartWriteStepAttribString");
get_attr_name(name, "i32", position);
status = H5PartWriteStepAttribInt32(file, name, ATTR_INT32_VAL);
RETURN(status, H5PART_SUCCESS, "H5PartWriteStepAttribInt32");
get_attr_name(name, "i64", position);
status = H5PartWriteStepAttribInt64(file, name, ATTR_INT64_VAL);
RETURN(status, H5PART_SUCCESS, "H5PartWriteStepAttribInt64");
get_attr_name(name, "f32", position);
status = H5PartWriteStepAttribFloat32(file, name, ATTR_FLOAT_VAL);
RETURN(status, H5PART_SUCCESS, "H5PartWriteStepAttribFloat32");
get_attr_name(name, "f64", position);
status = H5PartWriteStepAttribFloat64(file, name, ATTR_FLOAT_VAL);
RETURN(status, H5PART_SUCCESS, "H5PartWriteStepAttribFloat64");
}
static void
test_write_data64(H5PartFile *file, int nparticles, int step)
{
int i,t;
h5part_int64_t status, val;
double *x,*y,*z;
double *px,*py,*pz;
h5part_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=(h5part_int64_t*)malloc(nparticles*sizeof(h5part_int64_t));
/* invalid stride will produce a warning */
status = H5PartSetNumParticlesStrided(file, nparticles, -1);
RETURN(status, H5PART_SUCCESS, "H5PartSetNumParticlesStrided");
/* invalid nparticles will produce an error */
status = H5PartSetNumParticlesStrided(file, -1, 2);
RETURN(status, H5PART_ERR_INVAL, "H5PartSetNumParticlesStrided");
#if PARALLEL_IO
TEST("Setting throttle");
status = H5PartSetThrottle(file, 2);
RETURN(status, H5PART_SUCCESS, "H5PartSetThrottle");
#endif
TEST("Writing 64-bit data");
for (t=step; t<step+NTIMESTEPS; t++)
{
for (i=0; i<nparticles; i++)
{
x[i] = 0.0 + (double)(i+nparticles*t);
y[i] = 0.1 + (double)(i+nparticles*t);
z[i] = 0.2 + (double)(i+nparticles*t);
px[i] = 0.3 + (double)(i+nparticles*t);
py[i] = 0.4 + (double)(i+nparticles*t);
pz[i] = 0.5 + (double)(i+nparticles*t);
id[i] = i + nparticles*t;
}
val = H5PartHasStep(file, t);
status = H5PartSetStep(file, t);
RETURN(status, H5PART_SUCCESS, "H5PartSetStep");
if (val == 0) test_write_step_attribs(file, t);
status = H5PartSetNumParticles(file, nparticles);
RETURN(status, H5PART_SUCCESS, "H5PartSetNumParticles");
status = H5PartWriteDataFloat64(file, "x", x);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat64");
status = H5PartWriteDataFloat64(file, "y", y);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat64");
status = H5PartWriteDataFloat64(file, "z", z);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat64");
status = H5PartWriteDataFloat64(file, "px", px);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat64");
status = H5PartWriteDataFloat64(file, "py", py);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat64");
status = H5PartWriteDataFloat64(file, "pz", pz);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat64");
status = H5PartWriteDataInt64(file, "id", id);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataInt64");
}
}
static void
test_write_strided_data64(H5PartFile *file, int nparticles, int step)
{
int i,t;
h5part_int64_t status;
double *data;
data=(double*)malloc(6*nparticles*sizeof(double));
status = H5PartSetNumParticlesStrided(file, nparticles, 6);
RETURN(status, H5PART_SUCCESS, "H5PartSetNumParticlesStrided");
TEST("Writing 64-bit strided data");
for (t=step; t<step+NTIMESTEPS; t++)
{
for (i=0; i<nparticles; i++)
{
data[6*i] = 0.0 + (double)(i+nparticles*t);
data[6*i+1] = 0.1 + (double)(i+nparticles*t);
data[6*i+2] = 0.2 + (double)(i+nparticles*t);
data[6*i+3] = 0.3 + (double)(i+nparticles*t);
data[6*i+4] = 0.4 + (double)(i+nparticles*t);
data[6*i+5] = 0.5 + (double)(i+nparticles*t);
}
status = H5PartSetStep(file, t);
RETURN(status, H5PART_SUCCESS, "H5PartSetStep");
status = H5PartSetNumParticlesStrided(file, nparticles, 6);
RETURN(status, H5PART_SUCCESS, "H5PartSetNumParticlesStrided");
status = H5PartWriteDataFloat64(file, "x", data+0);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat64");
status = H5PartWriteDataFloat64(file, "y", data+1);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat64");
status = H5PartWriteDataFloat64(file, "z", data+2);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat64");
status = H5PartWriteDataFloat64(file, "px", data+3);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat64");
status = H5PartWriteDataFloat64(file, "py", data+4);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat64");
status = H5PartWriteDataFloat64(file, "pz", data+5);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat64");
test_write_step_attribs(file, t);
}
}
static void
test_write_data32(H5PartFile *file, int nparticles, int step)
{
int i,t;
h5part_int32_t status, val;
int rank, nprocs;
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));
status = H5PartSetNumParticles(file, nparticles);
RETURN(status, H5PART_SUCCESS, "H5PartSetNumParticles");
#if PARALLEL_IO
/* will generate a warning since we are in MPI-IO Collective mode */
TEST("Setting throttle");
status = H5PartSetThrottle(file, 2);
RETURN(status, H5PART_SUCCESS, "H5PartSetThrottle");
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
#else
rank = 0;
nprocs = 1;
#endif
TEST("Writing 32-bit data");
for (t=step; t<step+NTIMESTEPS; t++)
{
for (i=0; i<nparticles; i++)
{
x[i] = 0.0F + (float)(i+nparticles*t);
y[i] = 0.1F + (float)(i+nparticles*t);
z[i] = 0.2F + (float)(i+nparticles*t);
px[i] = 0.3F + (float)(i+nparticles*t);
py[i] = 0.4F + (float)(i+nparticles*t);
pz[i] = 0.5F + (float)(i+nparticles*t);
id[i] = i + nparticles*t;
}
val = H5PartHasStep(file, t);
if (val == 0) {
status = H5PartSetStep(file, t);
RETURN(status, H5PART_SUCCESS, "H5PartSetStep");
}
/* test a two-part write using views */
status = H5PartSetView(file,
rank*nparticles,
rank*nparticles + 31);
RETURN(status, H5PART_SUCCESS, "H5PartSetView");
status = H5PartWriteDataFloat32(file, "x", x);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
test_write_step_attribs(file, t);
status = H5PartWriteDataFloat32(file, "y", y);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "z", z);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "px", px);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "py", py);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "pz", pz);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataInt32(file, LONGNAME, id);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataInt32");
/* the second write phase... */
status = H5PartSetView(file,
rank*nparticles + 32,
rank*nparticles + nparticles - 1);
RETURN(status, H5PART_SUCCESS, "H5PartSetView");
/* offset the input arrays */
status = H5PartWriteDataFloat32(file, "x", x+32);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "y", y+32);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "z", z+32);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "px", px+32);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "py", py+32);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "pz", pz+32);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataInt32(file, LONGNAME, id+32);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataInt32");
}
}
static void
test_write_strided_data32(H5PartFile *file, int nparticles, int step)
{
int i,t;
h5part_int64_t status;
float *data;
data=(float*)malloc(6*nparticles*sizeof(float));
TEST("Writing 32-bit strided data");
for (t=step; t<step+NTIMESTEPS; t++)
{
for (i=0; i<nparticles; i++)
{
data[6*i] = 0.0F + (float)(i+nparticles*t);
data[6*i+1] = 0.1F + (float)(i+nparticles*t);
data[6*i+2] = 0.2F + (float)(i+nparticles*t);
data[6*i+3] = 0.3F + (float)(i+nparticles*t);
data[6*i+4] = 0.4F + (float)(i+nparticles*t);
data[6*i+5] = 0.5F + (float)(i+nparticles*t);
}
status = H5PartSetStep(file, t);
RETURN(status, H5PART_SUCCESS, "H5PartSetStep");
test_write_step_attribs(file, t);
status = H5PartSetNumParticlesStrided(file, nparticles, 6);
RETURN(status, H5PART_SUCCESS, "H5PartSetNumParticlesStrided");
status = H5PartWriteDataFloat32(file, "x", data+0);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "y", data+1);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "z", data+2);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "px", data+3);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "py", data+4);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
status = H5PartWriteDataFloat32(file, "pz", data+5);
RETURN(status, H5PART_SUCCESS, "H5PartWriteDataFloat32");
}
}
void test_write1(void)
{
H5PartFile *file1;
h5part_int64_t status;
TEST("Opening file once, write-truncate");
file1 = OPEN(FILENAME,H5PART_WRITE);
test_is_valid(file1);
test_write_data32(file1, NPARTICLES, 1);
test_write_file_attribs(file1, 0);
status = H5PartCloseFile(file1);
RETURN(status, H5PART_SUCCESS, "H5PartCloseFile");
}
void test_write2(void)
{
H5PartFile *file1;
H5PartFile *file2;
h5part_int64_t status;
TEST("Opening file twice, write-append + read-only");
file1 = OPEN(FILENAME,H5PART_APPEND);
test_is_valid(file1);
file2 = OPEN(FILENAME,H5PART_READ);
test_is_valid(file2);
test_write_strided_data32(file1, NPARTICLES, NTIMESTEPS+1);
test_write_file_attribs(file1, 1);
status = H5PartCloseFile(file1);
RETURN(status, H5PART_SUCCESS, "H5PartCloseFile");
status = H5PartCloseFile(file2);
RETURN(status, H5PART_SUCCESS, "H5PartCloseFile");
}
void test_write3(void)
{
H5PartFile *file1;
h5part_int64_t status;
TEST( "Opening file once, write-truncate, lustre filesyste, "
"MPI-POSIX VFD, 1KB alignment");
file1 = OPENALIGN(FILENAME,
H5PART_WRITE | H5PART_VFD_MPIPOSIX | H5PART_FS_LUSTRE,
1024);
test_is_valid(file1);
TEST("Redefining step name");
status = H5PartDefineStepName(file1, LONGNAME, 16);
RETURN(status, H5PART_SUCCESS, "H5PartDefineStepName");
test_write_strided_data64(file1, NPARTICLES, 0);
test_write_file_attribs(file1, 0);
status = H5PartCloseFile(file1);
RETURN(status, H5PART_SUCCESS, "H5PartCloseFile");
}
void test_write4(void)
{
H5PartFile *file1;
H5PartFile *file2;
h5part_int64_t status;
TEST( "Opening file twice, write-append + read-only, "
"lustre filesystem, MPI-IO Independent VFD, 1K alignment");
file1 = OPENALIGN(FILENAME,
H5PART_APPEND | H5PART_VFD_MPIIO_IND | H5PART_FS_LUSTRE,
1024);
test_is_valid(file1);
file2 = OPENALIGN(FILENAME,
H5PART_READ | H5PART_VFD_MPIIO_IND | H5PART_FS_LUSTRE,
1024);
test_is_valid(file2);
TEST("Redefining step name");
status = H5PartDefineStepName(file1, LONGNAME, 16);
RETURN(status, H5PART_SUCCESS, "H5PartDefineStepName");
status = H5PartDefineStepName(file2, LONGNAME, 16);
RETURN(status, H5PART_SUCCESS, "H5PartDefineStepName");
status = H5PartSetChunkSize(file1, NPARTICLES);
RETURN(status, H5PART_SUCCESS, "H5PartSetChunkSize");
test_write_data64(file1, NPARTICLES, NTIMESTEPS-2);
test_write_file_attribs(file1, 1);
status = H5PartCloseFile(file1);
RETURN(status, H5PART_SUCCESS, "H5PartCloseFile");
status = H5PartCloseFile(file2);
RETURN(status, H5PART_SUCCESS, "H5PartCloseFile");
}