Gromacs
2026.0-dev-20241106-9ba7f4d
|
#include <cstdint>
#include <cstdio>
#include <memory>
#include <string>
#include <vector>
#include "gromacs/utility/arrayref.h"
#include "gromacs/utility/basedefinitions.h"
#include "gromacs/utility/gmxmpi.h"
Declares the multi-simulation support routines.
Classes | |
struct | gmx_multisim_t |
Coordinate multi-simulation resources for mdrun. More... | |
Macros | |
#define | gmx_sum_sim gmx_sumf_sim |
Convenience define for sum of reals. | |
Functions | |
std::unique_ptr< gmx_multisim_t > | buildMultiSimulation (MPI_Comm worldComm, gmx::ArrayRef< const std::string > multidirs) |
Builder function for gmx_multisim_t. More... | |
void | gmx_sumi_sim (int nr, int r[], const gmx_multisim_t *ms) |
Calculate the sum over the simulations of an array of ints. | |
void | gmx_sumli_sim (int nr, int64_t r[], const gmx_multisim_t *ms) |
Calculate the sum over the simulations of an array of large ints. | |
void | gmx_sumf_sim (int nr, float r[], const gmx_multisim_t *ms) |
Calculate the sum over the simulations of an array of floats. | |
void | gmx_sumd_sim (int nr, double r[], const gmx_multisim_t *ms) |
Calculate the sum over the simulations of an array of doubles. | |
std::vector< int > | gatherIntFromMultiSimulation (const gmx_multisim_t *ms, int localValue) |
Return a vector containing the gathered values of localValue found on the main rank of each simulation. | |
void | check_multi_int (FILE *log, const gmx_multisim_t *ms, int val, const char *name, gmx_bool bQuiet) |
Check if val is the same on all simulations for a mdrun -multidir run. More... | |
void | check_multi_int64 (FILE *log, const gmx_multisim_t *ms, int64_t val, const char *name, gmx_bool bQuiet) |
Check if val is the same on all simulations for a mdrun -multidir run. More... | |
static bool | isMultiSim (const gmx_multisim_t *ms) |
Are we doing multiple independent simulations? | |
bool | findIsSimulationMainRank (const gmx_multisim_t *ms, MPI_Comm communicator) |
Return whether this rank is the main rank of a simulation, using ms (if it is valid) and otherwise communicator . | |
bool | isMainSim (const gmx_multisim_t *ms) |
Are we the main simulation of a possible multi-simulation? | |
bool | isMainSimMainRank (const gmx_multisim_t *ms, bool isMain) |
Are we the main rank (of the main simulation, for a multi-sim). More... | |
void | logInitialMultisimStatus (const gmx_multisim_t *ms, const t_commrec *cr, const gmx::MDLogger &mdlog, bool simulationsShareState, int numSteps, int initialStep) |
Log the initial state of the multi-sim. More... | |
std::unique_ptr<gmx_multisim_t> buildMultiSimulation | ( | MPI_Comm | worldComm, |
gmx::ArrayRef< const std::string > | multidirs | ||
) |
Builder function for gmx_multisim_t.
[in] | worldComm | MPI communicator to split when multi-simulation is requested. |
[in] | multidirs | Strings naming the subdirectories when multi-simulation is requested, otherwise empty |
Splits worldComm
into multidirs.size()
separate simulations, if >1, and creates a communication structure between the main ranks of these simulations.
Valid to call regardless of build configuration, but multidirs
must be empty unless a real MPI build is used.
NotImplementedError | when multidirs is non-empty unless using real MPI is true |
NotImplementedError | when multidirs has exactly one element |
InconsistentInputError | when the number of MPI ranks is not a multiple of the number of multidirs |
FileIOError | when the simulation cannot change to the working directory in multidirs |
void check_multi_int | ( | FILE * | log, |
const gmx_multisim_t * | ms, | ||
int | val, | ||
const char * | name, | ||
gmx_bool | bQuiet | ||
) |
Check if val is the same on all simulations for a mdrun -multidir run.
The string name is used to print to the log file and in a fatal error if the val's don't match. If bQuiet is true and the check passes, no output is written.
void check_multi_int64 | ( | FILE * | log, |
const gmx_multisim_t * | ms, | ||
int64_t | val, | ||
const char * | name, | ||
gmx_bool | bQuiet | ||
) |
Check if val is the same on all simulations for a mdrun -multidir run.
The string name is used to print to the log file and in a fatal error if the val's don't match. If bQuiet is true and the check passes, no output is written.
bool isMainSimMainRank | ( | const gmx_multisim_t * | ms, |
bool | isMain | ||
) |
Are we the main rank (of the main simulation, for a multi-sim).
This rank prints the remaining run time etc.
void logInitialMultisimStatus | ( | const gmx_multisim_t * | ms, |
const t_commrec * | cr, | ||
const gmx::MDLogger & | mdlog, | ||
bool | simulationsShareState, | ||
int | numSteps, | ||
int | initialStep | ||
) |
Log the initial state of the multi-sim.
The simulations may be at different steps, etc so we report that.
[in] | ms | The multi-sum object |
[in] | cr | The commrec object |
[in] | mdlog | Logger |
[in] | simulationsShareState | Whether the simulations share state |
[in] | numSteps | The number of steps in this simulation |
[in] | initialStep | The initial step for this simulation |