[gmx-developers] rvec x[]
Nathan Moore
nmoore at physics.umn.edu
Fri Jun 24 23:07:00 CEST 2005
Hi All,
Where is the "rvex x[]" class defined? I assumed that it was a flat array
in the replacement for move_x below and got compiler errors:
"mvxvf.c", line 196.14: 1506-068 (W) Operation between types "double*" and
"double" is not allowed.
"mvxvf.c", line 196.9: 1506-025 (S) Operand must be a modifiable lvalue.
Also, What does the "where();" fucntion at the bottom of move_f and
move_x do?
My code snippet follows, all suggestions welcome! I suppose that since X
isn't flat I'll need to pass it with MPI with a type other that
MPI_DOUBLE?
thanks again for all the help!
NTM
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 tempporary array where x elements are gathered to */
double *temp_x = (double *) malloc(array_length * sizeof(double));
/* pass the x array around */
NT_status = MPI_Allgatherv(&x[start_element],
num_sent[nsb->nodeid],
MPI_DOUBLE,
&temp_x[0],
&num_sent[0],
&starting_block[0],
MPI_DOUBLE, MPI_COMM_WORLD);
/* update the x array with the gathered temp_x array */
for (i = 0; i < array_length; i++) {
x[i] = temp_x[i];
}
free(num_sent);
free(starting_block);
free(temp_x);
More information about the gromacs.org_gmx-developers
mailing list