void Cio_data::write(vector<Cparticle> &ps, int timestep) { H5PartFile *writer = H5PartOpenFile(filename.c_str(),H5PART_WRITE); H5PartSetStep(writer,timestep); int n = ps.size(); H5PartSetNumParticles(writer,n); double r[NDIM][n],v[NDIM][n],mass[n],u[n]; long long tag[n]; double zero[n]; for (int i=0; i<n; i++) { zero[i] = 0.0; for (int j=0; j<NDIM; j++) { r[j][i] = ps[i].r[j]; v[j][i] = ps[i].v[j]; } mass[i] = ps[i].mass; u[i] = ps[i].u; tag[i] = ps[i].tag; } for (int i=0; i<NDIM; i++) { H5PartWriteDataFloat64(writer,dimNames[i],r[i]); H5PartWriteDataFloat64(writer,vdimNames[i],v[i]); } for (int i=NDIM; i<3; i++) { H5PartWriteDataFloat64(writer,dimNames[i],zero); H5PartWriteDataFloat64(writer,vdimNames[i],zero); } H5PartWriteDataFloat64(writer,"mass",mass); H5PartWriteDataFloat64(writer,"u",u); H5PartWriteDataInt64(writer,"id",tag); }
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_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"); } }
void H5output::WriteParticles(int ispec, long long np, const double *q, const double *x, const double *y, const double *z, const double *u, const double *v, const double *w, MPI_Comm CART_COMM){ /* --------------------------------------------------------------------- */ /* Find out the total number of particles of species i in all the domain */ /* --------------------------------------------------------------------- */ long long ntpart; MPI_Allreduce(&np, &ntpart, 1, MPI_LONG_LONG, MPI_SUM, CART_COMM); const h5_int64_t ntp = ntpart; /* --------------------------------------------- */ /* Write the number of particles as an attribute */ /* --------------------------------------------- */ std::stringstream sstm; sstm << "npart_" << ispec; std::string nparti = sstm.str(); H5WriteStepAttribInt64(partfile, nparti.c_str(), &ntp, 1); sstm.str(""); H5PartSetNumParticles(partfile,np); /* ------------------ */ /* Write the datasets */ /* ------------------ */ sstm << "q_" << ispec; std::string dtset = sstm.str(); H5PartWriteDataFloat64(partfile,dtset.c_str(),q); sstm.str(""); sstm << "x_" << ispec; dtset = sstm.str(); H5PartWriteDataFloat64(partfile,dtset.c_str(),x); sstm.str(""); sstm << "y_" << ispec; dtset = sstm.str(); H5PartWriteDataFloat64(partfile,dtset.c_str(),y); sstm.str(""); sstm << "z_" << ispec; dtset = sstm.str(); H5PartWriteDataFloat64(partfile,dtset.c_str(),z); sstm.str(""); sstm << "u_" << ispec; dtset = sstm.str(); H5PartWriteDataFloat64(partfile,dtset.c_str(),u); sstm.str(""); sstm << "v_" << ispec; dtset = sstm.str(); H5PartWriteDataFloat64(partfile,dtset.c_str(),v); sstm.str(""); sstm << "w_" << ispec; dtset = sstm.str(); H5PartWriteDataFloat64(partfile,dtset.c_str(),w); sstm.str(""); }