Gromacs
2021-beta2-UNCHECKED
|
Assemble atomic positions of a (small) subset of atoms and distribute to all nodes.
This file contains functions to assemble the positions of a subset of the atoms and to do operations on it like determining the center of mass, or doing translations and rotations. These functions are useful when a subset of the positions needs to be compared to some set of reference positions, as e.g. done for essential dynamics.
Functions | |
void | dd_make_local_group_indices (const gmx_ga2la_t *ga2la, int nr, int anrs[], int *nr_loc, int *anrs_loc[], int *nalloc_loc, int coll_ind[]) |
Select local atoms of a group. More... | |
void | communicate_group_positions (const t_commrec *cr, rvec *xcoll, ivec *shifts, ivec *extra_shifts, gmx_bool bNS, const rvec *x_loc, int nr, int nr_loc, const int *anrs_loc, const int *coll_ind, rvec *xcoll_old, const matrix box) |
Assemble local positions into a collective array present on all nodes. More... | |
void | get_center (rvec x[], real weight[], int nr, rvec center) |
Calculates the center of the positions x locally. More... | |
double | get_sum_of_positions (rvec x[], real weight[], int nr, dvec dsumvec) |
Calculates the sum of the positions x locally. More... | |
void | get_center_comm (const t_commrec *cr, rvec x_loc[], real weight_loc[], int nr_loc, int nr_group, rvec center) |
Calculates the global center of all local arrays x. More... | |
void | translate_x (rvec x[], int nr, const rvec transvec) |
Translate positions. More... | |
void | rotate_x (rvec x[], int nr, matrix rmat) |
Rotate positions. More... | |
void communicate_group_positions | ( | const t_commrec * | cr, |
rvec * | xcoll, | ||
ivec * | shifts, | ||
ivec * | extra_shifts, | ||
gmx_bool | bNS, | ||
const rvec * | x_loc, | ||
int | nr, | ||
int | nr_loc, | ||
const int * | anrs_loc, | ||
const int * | coll_ind, | ||
rvec * | xcoll_old, | ||
const matrix | box | ||
) |
Assemble local positions into a collective array present on all nodes.
Communicate the positions of the group's atoms such that every node has all of them. Unless running on huge number of cores, this is not a big performance impact as long as the collective subset [0..nr] is kept small. The atom indices are retrieved from anrs_loc[0..nr_loc]. If you call the routine for the serial case, provide an array coll_ind[i] = i for i in 1..nr.
If shifts != NULL, the PBC representation of each atom is chosen such that a continuous trajectory results. Therefore, if the group is whole at the start of the simulation, it will always stay whole. If shifts = NULL, the group positions are not made whole again, but assembled and distributed to all nodes. The variables marked "optional" are not used in that case.
[in] | cr | Pointer to MPI communication data. |
[out] | xcoll | Collective array of positions, identical on all nodes after this routine has been called. |
[in,out] | shifts | Collective array of shifts for xcoll, needed to make the group whole. This array remembers the shifts since the start of the simulation (where the group is whole) and must therefore not be changed outside of this routine! If NULL, the group will not be made whole and the optional variables are ignored. |
[out] | extra_shifts | Extra shifts since last time step, only needed as buffer variable [0..nr] (optional). |
[in] | bNS | Neighbor searching / domain re-decomposition has been performed at the begin of this time step such that the shifts have changed and need to be updated (optional). |
[in] | x_loc | Pointer to the local atom positions this node has. |
[in] | nr | Total number of atoms in the group. |
[in] | nr_loc | Number of group atoms on the local node. |
[in] | anrs_loc | Array of the local atom indices. |
[in] | coll_ind | This array of size nr stores for each local atom where it belongs in the collective array so that the local contributions can be gmx_summed. It is provided by dd_make_local_group_indices. |
[in,out] | xcoll_old | Positions from the last time step, used to make the group whole (optional). |
[in] | box | Simulation box matrix, needed to shift xcoll such that the group becomes whole (optional). |
void dd_make_local_group_indices | ( | const gmx_ga2la_t * | ga2la, |
int | nr, | ||
int | anrs[], | ||
int * | nr_loc, | ||
int * | anrs_loc[], | ||
int * | nalloc_loc, | ||
int | coll_ind[] | ||
) |
Select local atoms of a group.
Selects the indices of local atoms of a group and stores them in anrs_loc[0..nr_loc]. If you need the positions of the group's atoms on all nodes, provide a coll_ind[0..nr] array and pass it on to communicate_group_positions. Thus the collective array will always have the same atom order (ascending indices).
[in] | ga2la | Global to local atom index conversion data. |
[in] | nr | The total number of atoms that the group contains. |
[in] | anrs | The global atom number of the group's atoms. |
[out] | nr_loc | The number of group atoms present on the local node. |
[out] | anrs_loc | The local atom numbers of the group. |
[in,out] | nalloc_loc | Local allocation size of anrs_loc array. |
[out] | coll_ind | If not NULL this array must be of size nr. It stores for each local atom where it belongs in the global (collective) array such that it can be gmx_summed in the communicate_group_positions routine. |
void get_center | ( | rvec | x[], |
real | weight[], | ||
int | nr, | ||
rvec | center | ||
) |
Calculates the center of the positions x locally.
Calculates the center of mass (if masses are given in the weight array) or the geometrical center (if NULL is passed as weight).
[in] | x | Positions. |
[in] | weight | Can be NULL or an array of weights. If masses are given as weights, the COM is calculated. |
[in] | nr | Number of positions and weights if present. |
[out] | center | The (weighted) center of the positions. |
void get_center_comm | ( | const t_commrec * | cr, |
rvec | x_loc[], | ||
real | weight_loc[], | ||
int | nr_loc, | ||
int | nr_group, | ||
rvec | center | ||
) |
Calculates the global center of all local arrays x.
Get the center from local positions [0..nr_loc], this involves communication. Not that the positions must already have the correct PBC representation. Use this routine if no collective coordinates are assembled from which the center could be calculated without communication.
[in] | cr | Pointer to MPI communication data. |
[in] | x_loc | Array of local positions [0..nr_loc]. |
[in] | weight_loc | Array of local weights, these are the masses if the center of mass is to be calculated. |
[in] | nr_loc | The number of positions on the local node. |
[in] | nr_group | The number of positions in the whole group. Since this is known anyway, we do not need to communicate and sum nr_loc if we pass it over. |
[out] | center | The (weighted) center of all x_loc from all the nodes. |
double get_sum_of_positions | ( | rvec | x[], |
real | weight[], | ||
int | nr, | ||
dvec | dsumvec | ||
) |
Calculates the sum of the positions x locally.
Calculates the (weighted) sum of position vectors and returns the sum of weights, which is needed when local contributions shall be summed to a global weighted center.
[in] | x | Array of positions. |
[in] | weight | Can be NULL or an array of weights. |
[in] | nr | Number of positions and weights if present. |
[out] | dsumvec | The (weighted) sum of the positions. |
void rotate_x | ( | rvec | x[], |
int | nr, | ||
matrix | rmat | ||
) |
Rotate positions.
Rotate the positions with the rotation matrix.
[in,out] | x | Array of positions. |
[in] | nr | Number of entries in the position array. |
[in] | rmat | Rotation matrix to operate on all positions. |
void translate_x | ( | rvec | x[], |
int | nr, | ||
const rvec | transvec | ||
) |
Translate positions.
Add a translation vector to the positions x.
[in,out] | x | Array of positions. |
[in] | nr | Number of entries in the position array. |
[in] | transvec | Translation vector to be added to all positions. |