Gromacs  2026.0-dev-20241106-9ba7f4d
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Classes | Macros | Functions
#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"
+ Include dependency graph for multisim.h:
+ This graph shows which files directly or indirectly include this file:

Description

Declares the multi-simulation support routines.

Author
Mark Abraham mark..nosp@m.j.ab.nosp@m.raham.nosp@m.@gma.nosp@m.il.co.nosp@m.m

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_tbuildMultiSimulation (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...
 

Function Documentation

std::unique_ptr<gmx_multisim_t> buildMultiSimulation ( MPI_Comm  worldComm,
gmx::ArrayRef< const std::string >  multidirs 
)

Builder function for gmx_multisim_t.

Parameters
[in]worldCommMPI communicator to split when multi-simulation is requested.
[in]multidirsStrings 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.

Exceptions
NotImplementedErrorwhen multidirs is non-empty unless using real MPI is true
NotImplementedErrorwhen multidirs has exactly one element
InconsistentInputErrorwhen the number of MPI ranks is not a multiple of the number of multidirs
FileIOErrorwhen 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.

Parameters
[in]msThe multi-sum object
[in]crThe commrec object
[in]mdlogLogger
[in]simulationsShareStateWhether the simulations share state
[in]numStepsThe number of steps in this simulation
[in]initialStepThe initial step for this simulation