#include "force.h"
#include "pme.h"
#include "pull.h"
+#include "pull_rotation.h"
#include "gmx_wallcycle.h"
#include "mdrun.h"
#include "nsgrid.h"
#ifdef GMX_LIB_MPI
#include <mpi.h>
#endif
-#ifdef GMX_THREADS
+#ifdef GMX_THREAD_MPI
#include "tmpi.h"
#endif
}
for(est=0; est<estNR; est++)
{
- if (EST_DISTR(est) && state_local->flags & (1<<est))
+ if (EST_DISTR(est) && (state_local->flags & (1<<est)))
{
switch (est) {
case estX:
for(est=0; est<estNR; est++)
{
- if (EST_DISTR(est) && state->flags & (1<<est))
+ if (EST_DISTR(est) && (state->flags & (1<<est)))
{
switch(est) {
case estX:
}
for(i=0; i<estNR; i++)
{
- if (EST_DISTR(i) && state_local->flags & (1<<i))
+ if (EST_DISTR(i) && (state_local->flags & (1<<i)))
{
switch (i) {
case estX:
}
else
{
- if (dd->nc[d] > 1 && d < ddbox->npbcdim)
+ if (d < ddbox->npbcdim && dd->nc[d] > 1)
{
tric[d][i] = box[i][d]/box[i][i];
}
for(est=0; est<estNR; est++)
{
- if (EST_DISTR(est) && state->flags & (1<<est)) {
+ if (EST_DISTR(est) && (state->flags & (1<<est))) {
switch (est) {
case estX:
/* Rotate the complete state; for a rectangular box only */
static void make_load_communicator(gmx_domdec_t *dd,MPI_Group g_all,
int dim_ind,ivec loc)
{
- MPI_Group g_row;
+ MPI_Group g_row = MPI_GROUP_EMPTY;
MPI_Comm c_row;
int dim,i,*rank;
ivec loc_c;
gmx_domdec_root_t *root;
+ gmx_bool bPartOfGroup = FALSE;
dim = dd->dim[dim_ind];
copy_ivec(loc,loc_c);
{
loc_c[dim] = i;
rank[i] = dd_index(dd->nc,loc_c);
+ if (rank[i] == dd->rank)
+ {
+ /* This process is part of the group */
+ bPartOfGroup = TRUE;
+ }
+ }
+ if (bPartOfGroup)
+ {
+ MPI_Group_incl(g_all,dd->nc[dim],rank,&g_row);
}
- /* Here we create a new group, that does not necessarily
- * include our process. But MPI_Comm_create needs to be
- * called by all the processes in the original communicator.
- * Calling MPI_Group_free afterwards gives errors, so I assume
- * also the group is needed by all processes. (B. Hess)
- */
- MPI_Group_incl(g_all,dd->nc[dim],rank,&g_row);
MPI_Comm_create(dd->mpi_comm_all,g_row,&c_row);
- if (c_row != MPI_COMM_NULL)
+ if (bPartOfGroup)
{
- /* This process is part of the group */
dd->comm->mpi_comm_load[dim_ind] = c_row;
if (dd->comm->eDLB != edlbNO)
{
/* Reorder the state */
for(i=0; i<estNR; i++)
{
- if (EST_DISTR(i) && state->flags & (1<<i))
+ if (EST_DISTR(i) && (state->flags & (1<<i)))
{
switch (i)
{
/* Update the local pull groups */
dd_make_local_pull_groups(dd,ir->pull,mdatoms);
}
+
+ if (ir->bRot)
+ {
+ /* Update the local rotation groups */
+ dd_make_local_rotation_groups(dd,ir->rot);
+ }
+
add_dd_statistics(dd);