// TODO move this to multi-sim module bool multisim_int_all_are_equal(const gmx_multisim_t *ms, gmx_int64_t value) { bool allValuesAreEqual = true; gmx_int64_t *buf; GMX_RELEASE_ASSERT(ms, "Invalid use of multi-simulation pointer"); snew(buf, ms->nsim); /* send our value to all other master ranks, receive all of theirs */ buf[ms->sim] = value; gmx_sumli_sim(ms->nsim, buf, ms); for (int s = 0; s < ms->nsim; s++) { if (buf[s] != value) { allValuesAreEqual = false; break; } } sfree(buf); return allValuesAreEqual; }
void check_multi_int64(FILE *log, const gmx_multisim_t *ms, gmx_int64_t val, const char *name, gmx_bool bQuiet) { gmx_int64_t *ibuf; int p; gmx_bool bCompatible; if (NULL != log && !bQuiet) { fprintf(log, "Multi-checking %s ... ", name); } if (ms == NULL) { gmx_fatal(FARGS, "check_multi_int called with a NULL communication pointer"); } snew(ibuf, ms->nsim); ibuf[ms->sim] = val; gmx_sumli_sim(ms->nsim, ibuf, ms); bCompatible = TRUE; for (p = 1; p < ms->nsim; p++) { bCompatible = bCompatible && (ibuf[p-1] == ibuf[p]); } if (bCompatible) { if (NULL != log && !bQuiet) { fprintf(log, "OK\n"); } } else { if (NULL != log) { fprintf(log, "\n%s is not equal for all subsystems\n", name); for (p = 0; p < ms->nsim; p++) { char strbuf[255]; /* first make the format string */ snprintf(strbuf, 255, " subsystem %%d: %s\n", "%" GMX_PRId64); fprintf(log, strbuf, p, ibuf[p]); } } gmx_fatal(FARGS, "The %d subsystems are not compatible\n", ms->nsim); } sfree(ibuf); }
/* check which of the multisim simulations has the shortest number of steps and return that number of nsteps */ gmx_int64_t get_multisim_nsteps(const t_commrec *cr, gmx_int64_t nsteps) { gmx_int64_t steps_out; if (MASTER(cr)) { gmx_int64_t *buf; int s; snew(buf, cr->ms->nsim); buf[cr->ms->sim] = nsteps; gmx_sumli_sim(cr->ms->nsim, buf, cr->ms); steps_out = -1; for (s = 0; s < cr->ms->nsim; s++) { /* find the smallest positive number */ if (buf[s] >= 0 && ((steps_out < 0) || (buf[s] < steps_out)) ) { steps_out = buf[s]; } } sfree(buf); /* if we're the limiting simulation, don't do anything */ if (steps_out >= 0 && steps_out < nsteps) { char strbuf[255]; snprintf(strbuf, 255, "Will stop simulation %%d after %s steps (another simulation will end then).\n", "%" GMX_PRId64); fprintf(stderr, strbuf, cr->ms->sim, steps_out); } } /* broadcast to non-masters */ gmx_bcast(sizeof(gmx_int64_t), &steps_out, cr); return steps_out; }