[gpumd] Re: xyz for an atom

  • From: Bruce Fan <brucenju@xxxxxxxxx>
  • To: gpumd@xxxxxxxxxxxxx
  • Date: Wed, 27 Nov 2019 23:20:19 +0200

Hi,

If you know the atom IDs you want to dump, you can modify the
"dump_positions" function in the "measure.cu" source file and compile the
code again (assuming you are using v2.4.1). This function reads:

void Measure::dump_positions(FILE *fid, Atom *atom, int step)
{
    if (!dump_position) return;
    if ((step + 1) % sample_interval_position != 0) return;
    int memory = sizeof(real) * atom->N;
    CHECK(cudaMemcpy(atom->cpu_x, atom->x, memory, cudaMemcpyDeviceToHost));
    CHECK(cudaMemcpy(atom->cpu_y, atom->y, memory, cudaMemcpyDeviceToHost));
    CHECK(cudaMemcpy(atom->cpu_z, atom->z, memory, cudaMemcpyDeviceToHost));
    fprintf(fid, "%d\n", atom->N);
    fprintf(fid, "%d\n", (step + 1) / sample_interval_position - 1);
    for (int n = 0; n < atom->N; n++)
    {
        fprintf(fid, "%d %g %g %g\n", atom->cpu_type[n],
            atom->cpu_x[n], atom->cpu_y[n], atom->cpu_z[n]);
    }
    fflush(fid);
}

Assuming you want to dump atoms from ID N1 (counting from 0) to N2
(exclusive), you can change the above function to (modified parts are in red
):

void Measure::dump_positions(FILE *fid, Atom *atom, int step)
{
    if (!dump_position) return;
    if ((step + 1) % sample_interval_position != 0) return;
    const int N1 = your choice
    const int N2 = your choice
    const int N = N2 - N1;
    int memory = sizeof(real) * N;
    CHECK(cudaMemcpy(atom->cpu_x, atom->x + N1, memory,
cudaMemcpyDeviceToHost));
    CHECK(cudaMemcpy(atom->cpu_y, atom->y + N1 , memory,
cudaMemcpyDeviceToHost));
    CHECK(cudaMemcpy(atom->cpu_z, atom->z + N1 , memory,
cudaMemcpyDeviceToHost));
    fprintf(fid, "%d\n", N);
    fprintf(fid, "%d\n", (step + 1) / sample_interval_position - 1);
    for (int n = 0; n < N; n++)
    {
        fprintf(fid, "%d %g %g %g\n", atom->cpu_type[n + N1],
            atom->cpu_x[n], atom->cpu_y[n], atom->cpu_z[n]);
    }
    fflush(fid);
}

I hope you get the idea and can handle your case if it is not identical to
what I have proposed.

Zheyong





Florencia Carusela <flor.caru@xxxxxxxxx> 于 2019年11月27日周三 19:27写道:

Hi Bruce

As I understand with dump position, it is possible to record atoms
position (every t steps).

But is it possible to record only the position versus time for a given
(selected) atom?

Thanks
Florencia

Other related posts: