vector<Cparticle> *Cio_data::read(int timestep) { H5PartFile *reader = H5PartOpenFile(filename.c_str(),H5PART_READ); if (H5PartGetNumSteps(reader) < timestep) { cerr << "There is not "<<timestep<<"timesteps in the file"<<endl; H5PartCloseFile(reader); exit(-1); } H5PartSetStep(reader,timestep); int n = H5PartGetNumParticles(reader); vector<Cparticle> *output = new vector<Cparticle>(n); double r[NDIM][n],v[NDIM][n],mass[n],u[n]; for (int i=0; i<NDIM; i++) { if (!H5PartReadDataFloat64(reader,dimNames[i],r[i])) { cerr << "Error reading particle position data" << endl; exit(-1); } } for (int i=0; i<NDIM; i++) { if (!H5PartReadDataFloat64(reader,vdimNames[i],v[i])) { cerr << "Error reading particle velocity data" << endl; exit(-1); } } if (!(H5PartReadDataFloat64(reader,"mass",mass))&& (H5PartReadDataFloat64(reader,"u",u))) { cerr << "Error reading particle data in file" << endl; exit(-1); } for (int i=0; i<n; i++) { for (int j=0; j<NDIM; i++) { (*output)[i].r[j] = r[j][i]; (*output)[i].v[j] = r[j][i]; } (*output)[i].mass = mass[i]; (*output)[i].u = u[i]; } H5PartCloseFile(reader); return output; }
void test_read2(void) { H5PartFile *file1; H5PartFile *file2; h5part_int64_t status; TEST( "Opening file twice, read-only"); file1 = OPEN(FILENAME,H5PART_READ); test_is_valid(file1); file2 = OPEN(FILENAME,H5PART_READ); test_is_valid(file2); test_read_strided_data32(file1, NPARTICLES, NTIMESTEPS+1); test_read_file_attribs(file2, 1); status = H5PartCloseFile(file1); RETURN(status, H5PART_SUCCESS, "H5PartCloseFile"); status = H5PartCloseFile(file2); RETURN(status, H5PART_SUCCESS, "H5PartCloseFile"); }
void test_read4(void) { H5PartFile *file1; H5PartFile *file2; h5part_int64_t status; TEST( "Opening file twice, read-only, lustre filesystem " "MPI-IO Independent VFD, 64K alignment"); file1 = OPENALIGN(FILENAME, H5PART_READ | H5PART_VFD_MPIIO_IND | H5PART_FS_LUSTRE, 65536); test_is_valid(file1); file2 = OPENALIGN(FILENAME, H5PART_READ | H5PART_VFD_MPIIO_IND | H5PART_FS_LUSTRE, 65536); 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"); test_read_file_attribs(file1, 1); status = H5PartSetStep(file2, NTIMESTEPS); RETURN(status, H5PART_SUCCESS, "H5PartSetStep"); test_read_data64(file2, NPARTICLES, NTIMESTEPS-2); status = H5PartCloseFile(file1); RETURN(status, H5PART_SUCCESS, "H5PartCloseFile"); status = H5PartCloseFile(file2); 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"); }
void test_read1(void) { H5PartFile *file1; h5part_int64_t status; TEST("Opening file once, read-only"); file1 = OPEN(FILENAME,H5PART_READ); test_is_valid(file1); test_read_file_attribs(file1, 0); test_read_data32(file1, NPARTICLES, 1); status = H5PartCloseFile(file1); RETURN(status, H5PART_SUCCESS, "H5PartCloseFile"); }
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_read3(void) { H5PartFile *file1; h5part_int64_t status; TEST( "Opening file once, read-only, lustre filesystem, " "MPI-POSIX VFD, 64KB alignment"); file1 = OPENALIGN(FILENAME, H5PART_READ | H5PART_VFD_MPIPOSIX | H5PART_FS_LUSTRE, 65536); test_is_valid(file1); TEST("Redefining step name"); status = H5PartDefineStepName(file1, LONGNAME, 16); RETURN(status, H5PART_SUCCESS, "H5PartDefineStepName"); test_read_strided_data64(file1, NPARTICLES, 0); test_read_file_attribs(file1, 0); status = H5PartCloseFile(file1); 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"); }
double write_data (float* data, int iter, Params* p) { int i,j; double start_time; double open_time; double write_time; double close_time; double total_time; double sum_time; double open_mean; double write_mean; double close_mean; double bandwidth; float* segment; char var_name[64]; char* filename; H5PartFile* file; h5part_int64_t status; if (p->verbosity >= VERBOSITY_HIGH) { printf ("rank %d: writing data\n", p->rank); } start_time = MPI_Wtime(); filename = (char*) malloc (strlen (p->filename) + 64); sprintf (filename, "%s/%d.h5", p->filename, iter); file = H5PartOpenFileParallelAlign (filename, p->flags, MPI_COMM_WORLD, p->alignment); if (!file) { fprintf (stderr, "rank %d: could not open H5Part file!\n", p->rank); MPI_Barrier (MPI_COMM_WORLD); exit (EXIT_FAILURE); } H5PartSetNumParticles (file, p->particles); if (p->verbosity >= VERBOSITY_HIGH) { printf ("rank %d: %ld particles\n", p->rank, p->particles); } open_time = MPI_Wtime() - start_time; segment = data; for (i=1; i<=p->segments; i++) { status = H5PartSetStep (file, i); if (status != H5PART_SUCCESS) { fprintf (stderr, "rank %d: H5PartSetStep error!", p->rank); } for (j=0; j<p->blocks; j++) { sprintf (var_name, "test%d", j); status = H5PartWriteDataFloat32 (file, var_name, segment); if (status != H5PART_SUCCESS) { fprintf (stderr, "rank %d: H5PartWriteDataFloat32 error!", p->rank); } segment += p->particles; } } write_time = (MPI_Wtime() - start_time) - open_time; H5PartCloseFile (file); close_time = (MPI_Wtime() - start_time) - write_time - open_time; total_time = open_time + write_time + close_time; if (p->verbosity >= VERBOSITY_HIGH) { printf ("rank %d: write\t%.3f\t%.3f\t%.3f\t%.3f\n", p->rank, open_time, write_time, close_time, total_time); } MPI_Barrier (MPI_COMM_WORLD); MPI_Reduce (&open_time, &sum_time, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); open_mean = sum_time / p->procs; MPI_Reduce (&write_time, &sum_time, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); write_mean = sum_time / p->procs; MPI_Reduce (&close_time, &sum_time, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); close_mean = sum_time / p->procs; bandwidth = p->aggregate_size / total_time; if (p->verbosity >= VERBOSITY_MEDIUM && p->rank == 0) { printf ("write\t%.1f\t%.3f\t%.3f\t%.3f\t%.3f\n", bandwidth, open_mean, write_mean, close_mean, total_time); } free (filename); return bandwidth; }