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; }
static void test_read_strided_data64(H5PartFile *file, int nparticles, int step) { int i,t; h5part_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 = H5PartSetStep(file, t); RETURN(status, H5PART_SUCCESS, "H5PartSetStep"); status = H5PartSetNumParticlesStrided(file, nparticles, 6); RETURN(status, H5PART_SUCCESS, "H5PartSetNumParticlesStrided"); status = H5PartReadDataFloat64(file, "x", data+0); RETURN(status, H5PART_SUCCESS, "H5PartReadDataFloat64"); status = H5PartReadDataFloat64(file, "y", data+1); RETURN(status, H5PART_SUCCESS, "H5PartReadDataFloat64"); status = H5PartReadDataFloat64(file, "z", data+2); RETURN(status, H5PART_SUCCESS, "H5PartReadDataFloat64"); status = H5PartReadDataFloat64(file, "px", data+3); RETURN(status, H5PART_SUCCESS, "H5PartReadDataFloat64"); test_read_step_attribs(file, t); status = H5PartReadDataFloat64(file, "py", data+4); RETURN(status, H5PART_SUCCESS, "H5PartReadDataFloat64"); status = H5PartReadDataFloat64(file, "pz", data+5); RETURN(status, H5PART_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_data64(H5PartFile *file, int nparticles, int step) { int i,t; int rank, nprocs; h5part_int64_t status, val, start, end, type, size; char name1[4]; char name2[8]; h5part_int64_t indices[8]; 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)); 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, H5PART_SUCCESS, "H5PartGetDatasetName"); status = H5PartGetDatasetInfo( file, i, name2, 4, &type, &size); RETURN(status, H5PART_SUCCESS, "H5PartGetDatasetInfo"); CVALUE(name1[0], name2[0], "dataset name"); status = H5PartGetDatasetName(file, i, name1, 4); RETURN(status, H5PART_SUCCESS, "H5PartGetDatasetName"); CVALUE(name1[1], name2[1], "dataset name"); IVALUE(size, nprocs*nparticles, "dataset size"); if (name1[0] == 'i') IVALUE(type, H5PART_INT64, "dataset type"); else IVALUE(type, H5PART_FLOAT64, "dataset type"); } #if PARALLEL_IO TEST("Setting throttle"); status = H5PartSetThrottle(file, 3); RETURN(status, H5PART_SUCCESS, "H5PartSetThrottle"); #endif TEST("Reading 64-bit data"); for (t=step; t<step+NTIMESTEPS; t++) { val = H5PartHasStep(file, t); IVALUE(val, 1, "has step"); status = H5PartSetStep(file, t); RETURN(status, H5PART_SUCCESS, "H5PartSetStep"); test_read_step_attribs(file, t); status = H5PartSetNumParticles(file, nparticles); RETURN(status, H5PART_SUCCESS, "H5PartSetNumParticles"); status = H5PartResetView(file); RETURN(status, H5PART_SUCCESS, "H5PartResetView"); start = rank; end = -1; status = H5PartSetView(file, start, end); RETURN(status, H5PART_SUCCESS, "H5PartSetView"); status = H5PartReadDataFloat64(file, "x", x); RETURN(status, H5PART_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, H5PART_SUCCESS, "H5PartSetView"); status = H5PartReadDataFloat64(file, "x", x); RETURN(status, H5PART_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, -1); RETURN(status, H5PART_SUCCESS, "H5PartSetViewIndices"); status = H5PartReadDataFloat64(file, "x", x); RETURN(status, H5PART_SUCCESS, "H5PartReadDataFloat64"); FVALUE(x[2*rank], (double)(2*rank+nparticles*t), "x data"); status = H5PartResetView(file); RETURN(status, H5PART_SUCCESS, "H5PartResetView"); status = H5PartSetViewIndices(file, indices, 4); RETURN(status, H5PART_SUCCESS, "H5PartSetViewIndices"); val = H5PartGetNumParticles(file); IVALUE(val, 4, "particle count"); status = H5PartReadDataFloat64(file, "x", x); RETURN(status, H5PART_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, H5PART_SUCCESS, "H5PartSetViewIndices"); status = H5PartReadDataFloat64(file, "x", x); RETURN(status, H5PART_SUCCESS, "H5PartReadDataFloat64"); status = H5PartSetCanonicalView(file); RETURN(status, H5PART_SUCCESS, "H5PartSetCanonicalView"); status = H5PartReadParticleStep ( file, t, x, y, z, px, py, pz, id); RETURN(status, H5PART_SUCCESS, "H5PartReadParticleStep"); 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"); } } }
void H5input::LoadParticles(int ndim, int rank, int nproc, const int *dimns, double *L, MPI_Comm CART_COMM){ int h5nspec; int ranks_rdr[1] = {0}; int *ranks_rst; long long offset; long long nop; h5_int64_t *h5npart; double *q; double *x; double *y; double *z; double *u; double *v; double *w; std::stringstream sstm; MPI_Comm READER_COMM; MPI_Group org_grp; MPI_Group reader_grp; part = new H5hutpart[nspec]; /* -------------------------------------------------- */ /* Create a new communicator for the reader processor */ /* This way only processor 0 reads the whole file. */ /* It would be better if each processor read one part */ /* of the file...currently not possible with H5hut. */ /* -------------------------------------------------- */ MPI_Comm_group (CART_COMM, &org_grp); ranks_rst = new int[nproc-1]; for (int i=0; i<nproc-1; i++) ranks_rst[i] = i; if (rank==0) MPI_Group_incl (org_grp, 1, ranks_rdr, &reader_grp); else MPI_Group_incl (org_grp, nproc-1, ranks_rst, &reader_grp); delete [] ranks_rst; MPI_Comm_create(CART_COMM, reader_grp, &READER_COMM); if (rank==0) { /* -------------- */ /* Open HDF5 file */ /* -------------- */ std::stringstream filenmbr; std::string filename; filenmbr << std::setfill('0') << std::setw(6) << recycle; filename = basename + "-Partcl" + "_" + filenmbr.str() + ".h5"; partfile = H5OpenFile(filename.c_str(), H5_O_RDONLY, READER_COMM); H5SetStep(partfile, 0); H5ReadStepAttribInt32(partfile, "nspec", &h5nspec); if (nspec!=h5nspec) { std::cout << "[H5hut-io]" << "ERROR in ReadParallelParticles: the number of species in the initial file" << std::endl; std::cout << "[H5hut-io]" << " does not match the number of species requested." << std::endl; abort(); } h5npart = new h5_int64_t[nspec]; nop = 0; for (int i=0; i<nspec; i++) { sstm << "npart_" << i; std::string nparti = sstm.str(); H5ReadStepAttribInt64(partfile, nparti.c_str(), &h5npart[i]); sstm.str(""); nop += h5npart[i]; } q = new double[nop]; x = new double[nop]; y = new double[nop]; z = new double[nop]; u = new double[nop]; v = new double[nop]; w = new double[nop]; offset = 0; for (int i=0; i<nspec; i++) { std::cout << "[H5hut-io]" << " Reading a total of " << h5npart[i] << " particles of species " << i << std::endl; sstm << "q_" << i; std::string dtset = sstm.str(); H5PartReadDataFloat64(partfile,dtset.c_str(),q+offset); sstm.str(""); sstm << "x_" << i; dtset = sstm.str(); H5PartReadDataFloat64(partfile,dtset.c_str(),x+offset); sstm.str(""); sstm << "y_" << i; dtset = sstm.str(); H5PartReadDataFloat64(partfile,dtset.c_str(),y+offset); sstm.str(""); sstm << "z_" << i; dtset = sstm.str(); H5PartReadDataFloat64(partfile,dtset.c_str(),z+offset); sstm.str(""); sstm << "u_" << i; dtset = sstm.str(); H5PartReadDataFloat64(partfile,dtset.c_str(),u+offset); sstm.str(""); sstm << "v_" << i; dtset = sstm.str(); H5PartReadDataFloat64(partfile,dtset.c_str(),v+offset); sstm.str(""); sstm << "w_" << i; dtset = sstm.str(); H5PartReadDataFloat64(partfile,dtset.c_str(),w+offset); sstm.str(""); offset += h5npart[i]; } H5CloseFile(partfile); FindLocalParticles(nproc, ndim, h5npart, nop, dimns, L, CART_COMM, q, x, y, z, u, v, w); delete [] q; delete [] x; delete [] y; delete [] z; delete [] u; delete [] v; delete [] w; delete [] h5npart; } }