#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
if (DDMASTER(dd))
{
- state->lambda = state_local->lambda;
+ for (i=0;i<efptNR;i++) {
+ state->lambda[i] = state_local->lambda[i];
+ }
+ state->fep_state = state_local->fep_state;
state->veta = state_local->veta;
state->vol0 = state_local->vol0;
copy_mat(state_local->box,state->box);
}
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:
t_state *state,t_state *state_local,
rvec **f)
{
- int i,j,ngtch,ngtcp,nh;
+ int i,j,nh;
nh = state->nhchainlength;
if (DDMASTER(dd))
{
- state_local->lambda = state->lambda;
+ for(i=0;i<efptNR;i++)
+ {
+ state_local->lambda[i] = state->lambda[i];
+ }
+ state_local->fep_state = state->fep_state;
state_local->veta = state->veta;
state_local->vol0 = state->vol0;
copy_mat(state->box,state_local->box);
}
}
}
- dd_bcast(dd,sizeof(real),&state_local->lambda);
+ dd_bcast(dd,((efptNR)*sizeof(real)),state_local->lambda);
+ dd_bcast(dd,sizeof(int),&state_local->fep_state);
dd_bcast(dd,sizeof(real),&state_local->veta);
dd_bcast(dd,sizeof(real),&state_local->vol0);
dd_bcast(dd,sizeof(state_local->box),state_local->box);
}
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];
}
ivec npulse;
int i,cg_gl;
int *ibuf,buf2[2] = { 0, 0 };
-
- if (DDMASTER(dd))
+ gmx_bool bMaster = DDMASTER(dd);
+ if (bMaster)
{
ma = dd->ma;
srenew(dd->index_gl,dd->cg_nalloc);
srenew(dd->cgindex,dd->cg_nalloc+1);
}
- if (DDMASTER(dd))
+ if (bMaster)
{
for(i=0; i<dd->nnodes; 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 */
}
#ifdef GMX_MPI
-static void make_load_communicator(gmx_domdec_t *dd,MPI_Group g_all,
- int dim_ind,ivec loc)
+static void make_load_communicator(gmx_domdec_t *dd, int dim_ind,ivec loc)
{
- MPI_Group g_row;
MPI_Comm c_row;
- int dim,i,*rank;
+ 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);
- snew(rank,dd->nc[dim]);
for(i=0; i<dd->nc[dim]; i++)
{
loc_c[dim] = i;
- rank[i] = dd_index(dd->nc,loc_c);
+ rank = dd_index(dd->nc,loc_c);
+ if (rank == dd->rank)
+ {
+ /* This process is part of the group */
+ bPartOfGroup = TRUE;
+ }
}
- /* 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)
+ MPI_Comm_split(dd->mpi_comm_all, bPartOfGroup?0:MPI_UNDEFINED, dd->rank,
+ &c_row);
+ if (bPartOfGroup)
{
- /* This process is part of the group */
dd->comm->mpi_comm_load[dim_ind] = c_row;
if (dd->comm->eDLB != edlbNO)
{
snew(dd->comm->load[dim_ind].load,dd->nc[dim]*DD_NLOAD_MAX);
}
}
- sfree(rank);
}
#endif
static void make_load_communicators(gmx_domdec_t *dd)
{
#ifdef GMX_MPI
- MPI_Group g_all;
int dim0,dim1,i,j;
ivec loc;
if (debug)
fprintf(debug,"Making load communicators\n");
- MPI_Comm_group(dd->mpi_comm_all,&g_all);
-
snew(dd->comm->load,dd->ndim);
snew(dd->comm->mpi_comm_load,dd->ndim);
clear_ivec(loc);
- make_load_communicator(dd,g_all,0,loc);
+ make_load_communicator(dd,0,loc);
if (dd->ndim > 1) {
dim0 = dd->dim[0];
for(i=0; i<dd->nc[dim0]; i++) {
loc[dim0] = i;
- make_load_communicator(dd,g_all,1,loc);
+ make_load_communicator(dd,1,loc);
}
}
if (dd->ndim > 2) {
dim1 = dd->dim[1];
for(j=0; j<dd->nc[dim1]; j++) {
loc[dim1] = j;
- make_load_communicator(dd,g_all,2,loc);
+ make_load_communicator(dd,2,loc);
}
}
}
- MPI_Group_free(&g_all);
-
if (debug)
fprintf(debug,"Finished making load communicators\n");
#endif
/* 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);