Beispiel #1
0
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;
}
Beispiel #2
0
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");
		}
	}
}
Beispiel #3
0
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");
		}
	}
}
Beispiel #4
0
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;

  }

}