[gmx-developers] using arrays of rvec[] (ie x, v, f, etc)
Nathan Moore
nmoore at physics.umn.edu
Tue Jul 5 17:38:55 CEST 2005
I'm working to rewrite the move_x/move_f functions to allow for the use of
an MPI_AllgatherV on an IBM BlueGene system. I'm struggling at present
with the definition of the x and f arrays as "rvec[]" or "real variables.
The code below fails on compile with errors:
"mvxvf.c", line 196.25: 1506-019 (S) Expecting an array or a pointer to
object type.
"mvxvf.c", line 197.25: 1506-019 (S) Expecting an array or a pointer to
object type.
"mvxvf.c", line 198.25: 1506-019 (S) Expecting an array or a pointer to
object type.
I assume that the compiler doesn't like how I'm copying the temp_x array
back to the x array after the MPI_Allgatherv. Any suggestions as to how
this section should be written?
Also, I'd like to lose the malloc definition of temp_x, but I'm not sure
if there's a #define'd size for that array. ie, I'd like to say
statically at the beginning of this function,
real temp_x[N_ATOMS]
Is the problem size (NUM_ATOMS or similar) defined outside of the
(nsb->natoms)?
thanks,
NT Moore
void move_x(FILE * log,
int left, int right, rvec x[], t_nsborder * nsb, t_nrnb * nrnb)
{
int i;
int NT_status; /* Did the send work? */
int array_length; /* length of the whole x array */
array_length = DIM * (nsb->natoms);
int start_element; /* index of where this node's array begins*/
start_element = nsb->index[nsb->nodeid];
/* The number of elements each node sends */
int *num_sent = (int *) malloc((nsb->nnodes) * sizeof(int));
for (i = 0; i < (nsb->nnodes); i++) {
num_sent[i] = nsb->homenr[i];
}
/* The starting index of each node's block of elements */
/* note the obvious redundancy that
start_element==starting_block[nsb->nodeid] */
int *starting_block = (int *) malloc((nsb->nnodes) * sizeof(int));
for (i = 0; i < (nsb->nnodes); i++) {
starting_block[i] = nsb->index[i];
}
/* The temporary array where x elements are gathered to */
real *temp_x = (real *) malloc(array_length * sizeof(real));
/* pass the x array around */
NT_status = MPI_Allgatherv(&x[start_element],
num_sent[nsb->nodeid],
MPI_REAL,
&temp_x[0],
&num_sent[0],
&starting_block[0],
MPI_REAL, MPI_COMM_WORLD);
/* update the x array with the gathered temp_x array */
for (i = 0; i < array_length; i++) {
x[i][0] = temp_x[i][0];
x[i][1] = temp_x[i][1];
x[i][2] = temp_x[i][2];
}
free(num_sent);
free(starting_block);
free(temp_x);
}
More information about the gromacs.org_gmx-developers
mailing list