2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team.
6 * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
7 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8 * and including many others, as listed in the AUTHORS file in the
9 * top-level source directory and at http://www.gromacs.org.
11 * GROMACS is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 2.1
14 * of the License, or (at your option) any later version.
16 * GROMACS is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with GROMACS; if not, see
23 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 * If you want to redistribute modifications to GROMACS, please
27 * consider that scientific software is very special. Version
28 * control is crucial - bugs must be traceable. We will be happy to
29 * consider code for inclusion in the official distribution, but
30 * derived work must not be called official GROMACS. Details are found
31 * in the README & COPYING files - if they are missing, get the
32 * official version at http://www.gromacs.org.
34 * To help us fund GROMACS development, we humbly ask that you cite
35 * the research papers on the package. Check out http://www.gromacs.org.
37 /*! \libinternal \file
39 * \brief This file declares helper functionality for legacy option handling for mdrun
41 * \author Berk Hess <hess@kth.se>
42 * \author David van der Spoel <david.vanderspoel@icm.uu.se>
43 * \author Erik Lindahl <erik@kth.se>
44 * \author Mark Abraham <mark.j.abraham@gmail.com>
46 * \ingroup module_mdrun
49 #ifndef GMX_MDRUN_LEGACYMDRUNOPTIONS_H
50 #define GMX_MDRUN_LEGACYMDRUNOPTIONS_H
52 #include "gromacs/commandline/filenm.h"
53 #include "gromacs/commandline/pargs.h"
54 #include "gromacs/domdec/domdec.h"
55 #include "gromacs/hardware/hw_info.h"
56 #include "gromacs/mdrun/logging.h"
57 #include "gromacs/mdtypes/mdrunoptions.h"
59 #include "replicaexchange.h"
61 struct gmx_multisim_t;
67 * \brief This class provides the same command-line option
68 * functionality to both CLI and API sessions.
70 * This class should not exist, but is necessary now to introduce
71 * support for the CLI and API without duplicating code. It should be
72 * eliminated following the TODOs below.
74 * \todo Modules in mdrun should acquire proper option handling so
75 * that all of these declarations and defaults are local to the
78 * \todo Contextual aspects, such as working directory, MPI
79 * environment, and environment variable handling are more properly
80 * the role of SimulationContext, and should be moved there */
81 class LegacyMdrunOptions
84 //! Ongoing collection of mdrun options
85 MdrunOptions mdrunOptions;
86 //! Options for the domain decomposition.
87 DomdecOptions domdecOptions;
88 //! Parallelism-related user options.
90 //! Command-line override for the duration of a neighbor list with the Verlet scheme.
91 int nstlist_cmdline = 0;
92 //! Parameters for replica-exchange simulations.
93 ReplicaExchangeParameters replExParams;
95 //! Filename options to fill from command-line argument values.
96 std::vector<t_filenm> filenames =
97 {{{ efTPR, nullptr, nullptr, ffREAD },
98 { efTRN, "-o", nullptr, ffWRITE },
99 { efCOMPRESSED, "-x", nullptr, ffOPTWR },
100 { efCPT, "-cpi", nullptr, ffOPTRD | ffALLOW_MISSING },
101 { efCPT, "-cpo", nullptr, ffOPTWR },
102 { efSTO, "-c", "confout", ffWRITE },
103 { efEDR, "-e", "ener", ffWRITE },
104 { efLOG, "-g", "md", ffWRITE },
105 { efXVG, "-dhdl", "dhdl", ffOPTWR },
106 { efXVG, "-field", "field", ffOPTWR },
107 { efXVG, "-table", "table", ffOPTRD },
108 { efXVG, "-tablep", "tablep", ffOPTRD },
109 { efXVG, "-tableb", "table", ffOPTRDMULT },
110 { efTRX, "-rerun", "rerun", ffOPTRD },
111 { efXVG, "-tpi", "tpi", ffOPTWR },
112 { efXVG, "-tpid", "tpidist", ffOPTWR },
113 { efEDI, "-ei", "sam", ffOPTRD },
114 { efXVG, "-eo", "edsam", ffOPTWR },
115 { efXVG, "-px", "pullx", ffOPTWR },
116 { efXVG, "-pf", "pullf", ffOPTWR },
117 { efXVG, "-ro", "rotation", ffOPTWR },
118 { efLOG, "-ra", "rotangles", ffOPTWR },
119 { efLOG, "-rs", "rotslabs", ffOPTWR },
120 { efLOG, "-rt", "rottorque", ffOPTWR },
121 { efMTX, "-mtx", "nm", ffOPTWR },
122 { efRND, "-multidir", nullptr, ffOPTRDMULT},
123 { efXVG, "-awh", "awhinit", ffOPTRD },
124 { efDAT, "-membed", "membed", ffOPTRD },
125 { efTOP, "-mp", "membed", ffOPTRD },
126 { efNDX, "-mn", "membed", ffOPTRD },
127 { efXVG, "-if", "imdforces", ffOPTWR },
128 { efXVG, "-swap", "swapions", ffOPTWR }}};
130 //! Print a warning if any force is larger than this (in kJ/mol nm).
133 /*! \brief Output context for writing text files
135 * \todo Clarify initialization, ownership, and lifetime. */
136 gmx_output_env_t *oenv = nullptr;
138 //! Handle to file used for logging.
139 LogFilePtr logFileGuard = nullptr;
141 /*! \brief Command line options, defaults, docs and storage for them to fill. */
143 rvec realddxyz = {0, 0, 0};
144 const char *ddrank_opt_choices[static_cast<int>(DdRankOrder::nr)+1] =
145 { nullptr, "interleave", "pp_pme", "cartesian", nullptr };
146 const char *dddlb_opt_choices[static_cast<int>(DlbOption::nr)+1] =
147 { nullptr, "auto", "no", "yes", nullptr };
148 const char *thread_aff_opt_choices[threadaffNR+1] =
149 { nullptr, "auto", "on", "off", nullptr };
150 const char *nbpu_opt_choices[5] =
151 { nullptr, "auto", "cpu", "gpu", nullptr };
152 const char *pme_opt_choices[5] =
153 { nullptr, "auto", "cpu", "gpu", nullptr };
154 const char *pme_fft_opt_choices[5] =
155 { nullptr, "auto", "cpu", "gpu", nullptr };
156 const char *bonded_opt_choices[5] =
157 { nullptr, "auto", "cpu", "gpu", nullptr };
158 gmx_bool bTryToAppendFiles = TRUE;
159 const char *gpuIdsAvailable = "";
160 const char *userGpuTaskAssignment = "";
162 ImdOptions &imdOptions = mdrunOptions.imdOptions;
166 { "-dd", FALSE, etRVEC, {&realddxyz},
167 "Domain decomposition grid, 0 is optimize" },
168 { "-ddorder", FALSE, etENUM, {ddrank_opt_choices},
170 { "-npme", FALSE, etINT, {&domdecOptions.numPmeRanks},
171 "Number of separate ranks to be used for PME, -1 is guess" },
172 { "-nt", FALSE, etINT, {&hw_opt.nthreads_tot},
173 "Total number of threads to start (0 is guess)" },
174 { "-ntmpi", FALSE, etINT, {&hw_opt.nthreads_tmpi},
175 "Number of thread-MPI ranks to start (0 is guess)" },
176 { "-ntomp", FALSE, etINT, {&hw_opt.nthreads_omp},
177 "Number of OpenMP threads per MPI rank to start (0 is guess)" },
178 { "-ntomp_pme", FALSE, etINT, {&hw_opt.nthreads_omp_pme},
179 "Number of OpenMP threads per MPI rank to start (0 is -ntomp)" },
180 { "-pin", FALSE, etENUM, {thread_aff_opt_choices},
181 "Whether mdrun should try to set thread affinities" },
182 { "-pinoffset", FALSE, etINT, {&hw_opt.core_pinning_offset},
183 "The lowest logical core number to which mdrun should pin the first thread" },
184 { "-pinstride", FALSE, etINT, {&hw_opt.core_pinning_stride},
185 "Pinning distance in logical cores for threads, use 0 to minimize the number of threads per physical core" },
186 { "-gpu_id", FALSE, etSTR, {&gpuIdsAvailable},
187 "List of unique GPU device IDs available to use" },
188 { "-gputasks", FALSE, etSTR, {&userGpuTaskAssignment},
189 "List of GPU device IDs, mapping each PP task on each node to a device" },
190 { "-ddcheck", FALSE, etBOOL, {&domdecOptions.checkBondedInteractions},
191 "Check for all bonded interactions with DD" },
192 { "-ddbondcomm", FALSE, etBOOL, {&domdecOptions.useBondedCommunication},
193 "HIDDENUse special bonded atom communication when [TT]-rdd[tt] > cut-off" },
194 { "-rdd", FALSE, etREAL, {&domdecOptions.minimumCommunicationRange},
195 "The maximum distance for bonded interactions with DD (nm), 0 is determine from initial coordinates" },
196 { "-rcon", FALSE, etREAL, {&domdecOptions.constraintCommunicationRange},
197 "Maximum distance for P-LINCS (nm), 0 is estimate" },
198 { "-dlb", FALSE, etENUM, {dddlb_opt_choices},
199 "Dynamic load balancing (with DD)" },
200 { "-dds", FALSE, etREAL, {&domdecOptions.dlbScaling},
201 "Fraction in (0,1) by whose reciprocal the initial DD cell size will be increased in order to "
202 "provide a margin in which dynamic load balancing can act while preserving the minimum cell size." },
203 { "-ddcsx", FALSE, etSTR, {&domdecOptions.cellSizeX},
204 "HIDDENA string containing a vector of the relative sizes in the x "
205 "direction of the corresponding DD cells. Only effective with static "
207 { "-ddcsy", FALSE, etSTR, {&domdecOptions.cellSizeY},
208 "HIDDENA string containing a vector of the relative sizes in the y "
209 "direction of the corresponding DD cells. Only effective with static "
211 { "-ddcsz", FALSE, etSTR, {&domdecOptions.cellSizeZ},
212 "HIDDENA string containing a vector of the relative sizes in the z "
213 "direction of the corresponding DD cells. Only effective with static "
215 { "-gcom", FALSE, etINT, {&mdrunOptions.globalCommunicationInterval},
216 "Global communication frequency" },
217 { "-nb", FALSE, etENUM, {nbpu_opt_choices},
218 "Calculate non-bonded interactions on" },
219 { "-nstlist", FALSE, etINT, {&nstlist_cmdline},
220 "Set nstlist when using a Verlet buffer tolerance (0 is guess)" },
221 { "-tunepme", FALSE, etBOOL, {&mdrunOptions.tunePme},
222 "Optimize PME load between PP/PME ranks or GPU/CPU (only with the Verlet cut-off scheme)" },
223 { "-pme", FALSE, etENUM, {pme_opt_choices},
224 "Perform PME calculations on" },
225 { "-pmefft", FALSE, etENUM, {pme_fft_opt_choices},
226 "Perform PME FFT calculations on" },
227 { "-bonded", FALSE, etENUM, {bonded_opt_choices},
228 "Perform bonded calculations on" },
229 { "-v", FALSE, etBOOL, {&mdrunOptions.verbose},
230 "Be loud and noisy" },
231 { "-pforce", FALSE, etREAL, {&pforce},
232 "Print all forces larger than this (kJ/mol nm)" },
233 { "-reprod", FALSE, etBOOL, {&mdrunOptions.reproducible},
234 "Try to avoid optimizations that affect binary reproducibility" },
235 { "-cpt", FALSE, etREAL, {&mdrunOptions.checkpointOptions.period},
236 "Checkpoint interval (minutes)" },
237 { "-cpnum", FALSE, etBOOL, {&mdrunOptions.checkpointOptions.keepAndNumberCheckpointFiles},
238 "Keep and number checkpoint files" },
239 { "-append", FALSE, etBOOL, {&bTryToAppendFiles},
240 "Append to previous output files when continuing from checkpoint instead of adding the simulation part number to all file names" },
241 { "-nsteps", FALSE, etINT64, {&mdrunOptions.numStepsCommandline},
242 "Run this number of steps, overrides .mdp file option (-1 means infinite, -2 means use mdp option, smaller is invalid)" },
243 { "-maxh", FALSE, etREAL, {&mdrunOptions.maximumHoursToRun},
244 "Terminate after 0.99 times this time (hours)" },
245 { "-replex", FALSE, etINT, {&replExParams.exchangeInterval},
246 "Attempt replica exchange periodically with this period (steps)" },
247 { "-nex", FALSE, etINT, {&replExParams.numExchanges},
248 "Number of random exchanges to carry out each exchange interval (N^3 is one suggestion). -nex zero or not specified gives neighbor replica exchange." },
249 { "-reseed", FALSE, etINT, {&replExParams.randomSeed},
250 "Seed for replica exchange, -1 is generate a seed" },
251 { "-imdport", FALSE, etINT, {&imdOptions.port},
252 "HIDDENIMD listening port" },
253 { "-imdwait", FALSE, etBOOL, {&imdOptions.wait},
254 "HIDDENPause the simulation while no IMD client is connected" },
255 { "-imdterm", FALSE, etBOOL, {&imdOptions.terminatable},
256 "HIDDENAllow termination of the simulation from IMD client" },
257 { "-imdpull", FALSE, etBOOL, {&imdOptions.pull},
258 "HIDDENAllow pulling in the simulation from IMD client" },
259 { "-rerunvsite", FALSE, etBOOL, {&mdrunOptions.rerunConstructVsites},
260 "HIDDENRecalculate virtual site coordinates with [TT]-rerun[tt]" },
261 { "-confout", FALSE, etBOOL, {&mdrunOptions.writeConfout},
262 "HIDDENWrite the last configuration with [TT]-c[tt] and force checkpointing at the last step" },
263 { "-stepout", FALSE, etINT, {&mdrunOptions.verboseStepPrintInterval},
264 "HIDDENFrequency of writing the remaining wall clock time for the run" },
265 { "-resetstep", FALSE, etINT, {&mdrunOptions.timingOptions.resetStep},
266 "HIDDENReset cycle counters after these many time steps" },
267 { "-resethway", FALSE, etBOOL, {&mdrunOptions.timingOptions.resetHalfway},
268 "HIDDENReset the cycle counters after half the number of steps or halfway [TT]-maxh[tt]" }
272 //! Handle to communication object.
273 t_commrec *cr = nullptr;
274 //! Multi-simulation object.
275 gmx_multisim_t *ms = nullptr;
277 //! Parses the command-line input and prepares to start mdrun.
278 int updateFromCommandLine(int argc, char **argv, ArrayRef<const char *> desc);
280 ~LegacyMdrunOptions();
283 } // end namespace gmx