Remove all unnecessary HAVE_CONFIG_H
[alexxy/gromacs.git] / src / programs / mdrun / mdrun.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
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, 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.
10  *
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.
15  *
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.
20  *
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.
25  *
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.
33  *
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.
36  */
37 #include "mdrun_main.h"
38
39 #include "config.h"
40
41 #include <stdio.h>
42 #include <string.h>
43
44 #include "gromacs/legacyheaders/checkpoint.h"
45 #include "gromacs/legacyheaders/copyrite.h"
46 #include "gromacs/legacyheaders/macros.h"
47 #include "gromacs/legacyheaders/main.h"
48 #include "gromacs/legacyheaders/mdrun.h"
49 #include "gromacs/legacyheaders/network.h"
50 #include "gromacs/legacyheaders/readinp.h"
51 #include "gromacs/legacyheaders/typedefs.h"
52 #include "gromacs/legacyheaders/types/commrec.h"
53
54 #include "gromacs/commandline/pargs.h"
55 #include "gromacs/fileio/filenm.h"
56 #include "gromacs/utility/fatalerror.h"
57
58 static bool is_multisim_option_set(int argc, const char *const argv[])
59 {
60     for (int i = 0; i < argc; ++i)
61     {
62         if (strcmp(argv[i], "-multi") == 0 || strcmp(argv[i], "-multidir") == 0)
63         {
64             return true;
65         }
66     }
67     return false;
68 }
69
70 int gmx_mdrun(int argc, char *argv[])
71 {
72     const char   *desc[] = {
73         "[THISMODULE] is the main computational chemistry engine",
74         "within GROMACS. Obviously, it performs Molecular Dynamics simulations,",
75         "but it can also perform Stochastic Dynamics, Energy Minimization,",
76         "test particle insertion or (re)calculation of energies.",
77         "Normal mode analysis is another option. In this case [TT]mdrun[tt]",
78         "builds a Hessian matrix from single conformation.",
79         "For usual Normal Modes-like calculations, make sure that",
80         "the structure provided is properly energy-minimized.",
81         "The generated matrix can be diagonalized by [gmx-nmeig].[PAR]",
82         "The [TT]mdrun[tt] program reads the run input file ([TT]-s[tt])",
83         "and distributes the topology over ranks if needed.",
84         "[TT]mdrun[tt] produces at least four output files.",
85         "A single log file ([TT]-g[tt]) is written, unless the option",
86         "[TT]-seppot[tt] is used, in which case each rank writes a log file.",
87         "The trajectory file ([TT]-o[tt]), contains coordinates, velocities and",
88         "optionally forces.",
89         "The structure file ([TT]-c[tt]) contains the coordinates and",
90         "velocities of the last step.",
91         "The energy file ([TT]-e[tt]) contains energies, the temperature,",
92         "pressure, etc, a lot of these things are also printed in the log file.",
93         "Optionally coordinates can be written to a compressed trajectory file",
94         "([TT]-x[tt]).[PAR]",
95         "The option [TT]-dhdl[tt] is only used when free energy calculation is",
96         "turned on.[PAR]",
97         "A simulation can be run in parallel using two different parallelization",
98         "schemes: MPI parallelization and/or OpenMP thread parallelization.",
99         "The MPI parallelization uses multiple processes when [TT]mdrun[tt] is",
100         "compiled with a normal MPI library or threads when [TT]mdrun[tt] is",
101         "compiled with the GROMACS built-in thread-MPI library. OpenMP threads",
102         "are supported when [TT]mdrun[tt] is compiled with OpenMP. Full OpenMP support",
103         "is only available with the Verlet cut-off scheme, with the (older)",
104         "group scheme only PME-only ranks can use OpenMP parallelization.",
105         "In all cases [TT]mdrun[tt] will by default try to use all the available",
106         "hardware resources. With a normal MPI library only the options",
107         "[TT]-ntomp[tt] (with the Verlet cut-off scheme) and [TT]-ntomp_pme[tt],",
108         "for PME-only ranks, can be used to control the number of threads.",
109         "With thread-MPI there are additional options [TT]-nt[tt], which sets",
110         "the total number of threads, and [TT]-ntmpi[tt], which sets the number",
111         "of thread-MPI threads.",
112         "The number of OpenMP threads used by [TT]mdrun[tt] can also be set with",
113         "the standard environment variable, [TT]OMP_NUM_THREADS[tt].",
114         "The [TT]GMX_PME_NUM_THREADS[tt] environment variable can be used to specify",
115         "the number of threads used by the PME-only ranks.[PAR]",
116         "Note that combined MPI+OpenMP parallelization is in many cases",
117         "slower than either on its own. However, at high parallelization, using the",
118         "combination is often beneficial as it reduces the number of domains and/or",
119         "the number of MPI ranks. (Less and larger domains can improve scaling,",
120         "with separate PME ranks, using fewer MPI ranks reduces communication costs.)",
121         "OpenMP-only parallelization is typically faster than MPI-only parallelization",
122         "on a single CPU(-die). Since we currently don't have proper hardware",
123         "topology detection, [TT]mdrun[tt] compiled with thread-MPI will only",
124         "automatically use OpenMP-only parallelization when you use up to 4",
125         "threads, up to 12 threads with Intel Nehalem/Westmere, or up to 16",
126         "threads with Intel Sandy Bridge or newer CPUs. Otherwise MPI-only",
127         "parallelization is used (except with GPUs, see below).",
128         "[PAR]",
129         "To quickly test the performance of the new Verlet cut-off scheme",
130         "with old [TT].tpr[tt] files, either on CPUs or CPUs+GPUs, you can use",
131         "the [TT]-testverlet[tt] option. This should not be used for production,",
132         "since it can slightly modify potentials and it will remove charge groups",
133         "making analysis difficult, as the [TT].tpr[tt] file will still contain",
134         "charge groups. For production simulations it is highly recommended",
135         "to specify [TT]cutoff-scheme = Verlet[tt] in the [TT].mdp[tt] file.",
136         "[PAR]",
137         "With GPUs (only supported with the Verlet cut-off scheme), the number",
138         "of GPUs should match the number of particle-particle ranks, i.e.",
139         "excluding PME-only ranks. With thread-MPI, unless set on the command line, the number",
140         "of MPI threads will automatically be set to the number of GPUs detected.",
141         "To use a subset of the available GPUs, or to manually provide a mapping of",
142         "GPUs to PP ranks, you can use the [TT]-gpu_id[tt] option. The argument of [TT]-gpu_id[tt] is",
143         "a string of digits (without delimiter) representing device id-s of the GPUs to be used.",
144         "For example, \"[TT]02[tt]\" specifies using GPUs 0 and 2 in the first and second PP ranks per compute node",
145         "respectively. To select different sets of GPU-s",
146         "on different nodes of a compute cluster, use the [TT]GMX_GPU_ID[tt] environment",
147         "variable instead. The format for [TT]GMX_GPU_ID[tt] is identical to ",
148         "[TT]-gpu_id[tt], with the difference that an environment variable can have",
149         "different values on different compute nodes. Multiple MPI ranks on each node",
150         "can share GPUs. This is accomplished by specifying the id(s) of the GPU(s)",
151         "multiple times, e.g. \"[TT]0011[tt]\" for four ranks sharing two GPUs in this node.",
152         "This works within a single simulation, or a multi-simulation, with any form of MPI.",
153         "[PAR]",
154         "With the Verlet cut-off scheme and verlet-buffer-tolerance set,",
155         "the pair-list update interval nstlist can be chosen freely with",
156         "the option [TT]-nstlist[tt]. [TT]mdrun[tt] will then adjust",
157         "the pair-list cut-off to maintain accuracy, and not adjust nstlist.",
158         "Otherwise, by default, [TT]mdrun[tt] will try to increase the",
159         "value of nstlist set in the [TT].mdp[tt] file to improve the",
160         "performance. For CPU-only runs, nstlist might increase to 20, for",
161         "GPU runs up to 40. For medium to high parallelization or with",
162         "fast GPUs, a (user-supplied) larger nstlist value can give much",
163         "better performance.",
164         "[PAR]",
165         "When using PME with separate PME ranks or with a GPU, the two major",
166         "compute tasks, the non-bonded force calculation and the PME calculation",
167         "run on different compute resources. If this load is not balanced,",
168         "some of the resources will be idle part of time. With the Verlet",
169         "cut-off scheme this load is automatically balanced when the PME load",
170         "is too high (but not when it is too low). This is done by scaling",
171         "the Coulomb cut-off and PME grid spacing by the same amount. In the first",
172         "few hundred steps different settings are tried and the fastest is chosen",
173         "for the rest of the simulation. This does not affect the accuracy of",
174         "the results, but it does affect the decomposition of the Coulomb energy",
175         "into particle and mesh contributions. The auto-tuning can be turned off",
176         "with the option [TT]-notunepme[tt].",
177         "[PAR]",
178         "[TT]mdrun[tt] pins (sets affinity of) threads to specific cores,",
179         "when all (logical) cores on a compute node are used by [TT]mdrun[tt],",
180         "even when no multi-threading is used,",
181         "as this usually results in significantly better performance.",
182         "If the queuing systems or the OpenMP library pinned threads, we honor",
183         "this and don't pin again, even though the layout may be sub-optimal.",
184         "If you want to have [TT]mdrun[tt] override an already set thread affinity",
185         "or pin threads when using less cores, use [TT]-pin on[tt].",
186         "With SMT (simultaneous multithreading), e.g. Intel Hyper-Threading,",
187         "there are multiple logical cores per physical core.",
188         "The option [TT]-pinstride[tt] sets the stride in logical cores for",
189         "pinning consecutive threads. Without SMT, 1 is usually the best choice.",
190         "With Intel Hyper-Threading 2 is best when using half or less of the",
191         "logical cores, 1 otherwise. The default value of 0 do exactly that:",
192         "it minimizes the threads per logical core, to optimize performance.",
193         "If you want to run multiple [TT]mdrun[tt] jobs on the same physical node,"
194         "you should set [TT]-pinstride[tt] to 1 when using all logical cores.",
195         "When running multiple [TT]mdrun[tt] (or other) simulations on the same physical",
196         "node, some simulations need to start pinning from a non-zero core",
197         "to avoid overloading cores; with [TT]-pinoffset[tt] you can specify",
198         "the offset in logical cores for pinning.",
199         "[PAR]",
200         "When [TT]mdrun[tt] is started with more than 1 rank,",
201         "parallelization with domain decomposition is used.",
202         "[PAR]",
203         "With domain decomposition, the spatial decomposition can be set",
204         "with option [TT]-dd[tt]. By default [TT]mdrun[tt] selects a good decomposition.",
205         "The user only needs to change this when the system is very inhomogeneous.",
206         "Dynamic load balancing is set with the option [TT]-dlb[tt],",
207         "which can give a significant performance improvement,",
208         "especially for inhomogeneous systems. The only disadvantage of",
209         "dynamic load balancing is that runs are no longer binary reproducible,",
210         "but in most cases this is not important.",
211         "By default the dynamic load balancing is automatically turned on",
212         "when the measured performance loss due to load imbalance is 5% or more.",
213         "At low parallelization these are the only important options",
214         "for domain decomposition.",
215         "At high parallelization the options in the next two sections",
216         "could be important for increasing the performace.",
217         "[PAR]",
218         "When PME is used with domain decomposition, separate ranks can",
219         "be assigned to do only the PME mesh calculation;",
220         "this is computationally more efficient starting at about 12 ranks,",
221         "or even fewer when OpenMP parallelization is used.",
222         "The number of PME ranks is set with option [TT]-npme[tt],",
223         "but this cannot be more than half of the ranks.",
224         "By default [TT]mdrun[tt] makes a guess for the number of PME",
225         "ranks when the number of ranks is larger than 16. With GPUs,",
226         "using separate PME ranks is not selected automatically,",
227         "since the optimal setup depends very much on the details",
228         "of the hardware. In all cases, you might gain performance",
229         "by optimizing [TT]-npme[tt]. Performance statistics on this issue",
230         "are written at the end of the log file.",
231         "For good load balancing at high parallelization, the PME grid x and y",
232         "dimensions should be divisible by the number of PME ranks",
233         "(the simulation will run correctly also when this is not the case).",
234         "[PAR]",
235         "This section lists all options that affect the domain decomposition.",
236         "[PAR]",
237         "Option [TT]-rdd[tt] can be used to set the required maximum distance",
238         "for inter charge-group bonded interactions.",
239         "Communication for two-body bonded interactions below the non-bonded",
240         "cut-off distance always comes for free with the non-bonded communication.",
241         "Atoms beyond the non-bonded cut-off are only communicated when they have",
242         "missing bonded interactions; this means that the extra cost is minor",
243         "and nearly indepedent of the value of [TT]-rdd[tt].",
244         "With dynamic load balancing option [TT]-rdd[tt] also sets",
245         "the lower limit for the domain decomposition cell sizes.",
246         "By default [TT]-rdd[tt] is determined by [TT]mdrun[tt] based on",
247         "the initial coordinates. The chosen value will be a balance",
248         "between interaction range and communication cost.",
249         "[PAR]",
250         "When inter charge-group bonded interactions are beyond",
251         "the bonded cut-off distance, [TT]mdrun[tt] terminates with an error message.",
252         "For pair interactions and tabulated bonds",
253         "that do not generate exclusions, this check can be turned off",
254         "with the option [TT]-noddcheck[tt].",
255         "[PAR]",
256         "When constraints are present, option [TT]-rcon[tt] influences",
257         "the cell size limit as well.",
258         "Atoms connected by NC constraints, where NC is the LINCS order plus 1,",
259         "should not be beyond the smallest cell size. A error message is",
260         "generated when this happens and the user should change the decomposition",
261         "or decrease the LINCS order and increase the number of LINCS iterations.",
262         "By default [TT]mdrun[tt] estimates the minimum cell size required for P-LINCS",
263         "in a conservative fashion. For high parallelization it can be useful",
264         "to set the distance required for P-LINCS with the option [TT]-rcon[tt].",
265         "[PAR]",
266         "The [TT]-dds[tt] option sets the minimum allowed x, y and/or z scaling",
267         "of the cells with dynamic load balancing. [TT]mdrun[tt] will ensure that",
268         "the cells can scale down by at least this factor. This option is used",
269         "for the automated spatial decomposition (when not using [TT]-dd[tt])",
270         "as well as for determining the number of grid pulses, which in turn",
271         "sets the minimum allowed cell size. Under certain circumstances",
272         "the value of [TT]-dds[tt] might need to be adjusted to account for",
273         "high or low spatial inhomogeneity of the system.",
274         "[PAR]",
275         "The option [TT]-gcom[tt] can be used to only do global communication",
276         "every n steps.",
277         "This can improve performance for highly parallel simulations",
278         "where this global communication step becomes the bottleneck.",
279         "For a global thermostat and/or barostat the temperature",
280         "and/or pressure will also only be updated every [TT]-gcom[tt] steps.",
281         "By default it is set to the minimum of nstcalcenergy and nstlist.[PAR]",
282         "With [TT]-rerun[tt] an input trajectory can be given for which ",
283         "forces and energies will be (re)calculated. Neighbor searching will be",
284         "performed for every frame, unless [TT]nstlist[tt] is zero",
285         "(see the [TT].mdp[tt] file).[PAR]",
286         "ED (essential dynamics) sampling and/or additional flooding potentials",
287         "are switched on by using the [TT]-ei[tt] flag followed by an [TT].edi[tt]",
288         "file. The [TT].edi[tt] file can be produced with the [TT]make_edi[tt] tool",
289         "or by using options in the essdyn menu of the WHAT IF program.",
290         "[TT]mdrun[tt] produces a [TT].xvg[tt] output file that",
291         "contains projections of positions, velocities and forces onto selected",
292         "eigenvectors.[PAR]",
293         "When user-defined potential functions have been selected in the",
294         "[TT].mdp[tt] file the [TT]-table[tt] option is used to pass [TT]mdrun[tt]",
295         "a formatted table with potential functions. The file is read from",
296         "either the current directory or from the [TT]GMXLIB[tt] directory.",
297         "A number of pre-formatted tables are presented in the [TT]GMXLIB[tt] dir,",
298         "for 6-8, 6-9, 6-10, 6-11, 6-12 Lennard-Jones potentials with",
299         "normal Coulomb.",
300         "When pair interactions are present, a separate table for pair interaction",
301         "functions is read using the [TT]-tablep[tt] option.[PAR]",
302         "When tabulated bonded functions are present in the topology,",
303         "interaction functions are read using the [TT]-tableb[tt] option.",
304         "For each different tabulated interaction type the table file name is",
305         "modified in a different way: before the file extension an underscore is",
306         "appended, then a 'b' for bonds, an 'a' for angles or a 'd' for dihedrals",
307         "and finally the table number of the interaction type.[PAR]",
308         "The options [TT]-px[tt] and [TT]-pf[tt] are used for writing pull COM",
309         "coordinates and forces when pulling is selected",
310         "in the [TT].mdp[tt] file.[PAR]",
311         "With [TT]-multi[tt] or [TT]-multidir[tt], multiple systems can be ",
312         "simulated in parallel.",
313         "As many input files/directories are required as the number of systems. ",
314         "The [TT]-multidir[tt] option takes a list of directories (one for each ",
315         "system) and runs in each of them, using the input/output file names, ",
316         "such as specified by e.g. the [TT]-s[tt] option, relative to these ",
317         "directories.",
318         "With [TT]-multi[tt], the system number is appended to the run input ",
319         "and each output filename, for instance [TT]topol.tpr[tt] becomes",
320         "[TT]topol0.tpr[tt], [TT]topol1.tpr[tt] etc.",
321         "The number of ranks per system is the total number of ranks",
322         "divided by the number of systems.",
323         "One use of this option is for NMR refinement: when distance",
324         "or orientation restraints are present these can be ensemble averaged",
325         "over all the systems.[PAR]",
326         "With [TT]-replex[tt] replica exchange is attempted every given number",
327         "of steps. The number of replicas is set with the [TT]-multi[tt] or ",
328         "[TT]-multidir[tt] option, described above.",
329         "All run input files should use a different coupling temperature,",
330         "the order of the files is not important. The random seed is set with",
331         "[TT]-reseed[tt]. The velocities are scaled and neighbor searching",
332         "is performed after every exchange.[PAR]",
333         "Finally some experimental algorithms can be tested when the",
334         "appropriate options have been given. Currently under",
335         "investigation are: polarizability.",
336         "[PAR]",
337         "The option [TT]-membed[tt] does what used to be g_membed, i.e. embed",
338         "a protein into a membrane. The data file should contain the options",
339         "that where passed to g_membed before. The [TT]-mn[tt] and [TT]-mp[tt]",
340         "both apply to this as well.",
341         "[PAR]",
342         "The option [TT]-pforce[tt] is useful when you suspect a simulation",
343         "crashes due to too large forces. With this option coordinates and",
344         "forces of atoms with a force larger than a certain value will",
345         "be printed to stderr.",
346         "[PAR]",
347         "Checkpoints containing the complete state of the system are written",
348         "at regular intervals (option [TT]-cpt[tt]) to the file [TT]-cpo[tt],",
349         "unless option [TT]-cpt[tt] is set to -1.",
350         "The previous checkpoint is backed up to [TT]state_prev.cpt[tt] to",
351         "make sure that a recent state of the system is always available,",
352         "even when the simulation is terminated while writing a checkpoint.",
353         "With [TT]-cpnum[tt] all checkpoint files are kept and appended",
354         "with the step number.",
355         "A simulation can be continued by reading the full state from file",
356         "with option [TT]-cpi[tt]. This option is intelligent in the way that",
357         "if no checkpoint file is found, Gromacs just assumes a normal run and",
358         "starts from the first step of the [TT].tpr[tt] file. By default the output",
359         "will be appending to the existing output files. The checkpoint file",
360         "contains checksums of all output files, such that you will never",
361         "loose data when some output files are modified, corrupt or removed.",
362         "There are three scenarios with [TT]-cpi[tt]:[PAR]",
363         "[TT]*[tt] no files with matching names are present: new output files are written[PAR]",
364         "[TT]*[tt] all files are present with names and checksums matching those stored",
365         "in the checkpoint file: files are appended[PAR]",
366         "[TT]*[tt] otherwise no files are modified and a fatal error is generated[PAR]",
367         "With [TT]-noappend[tt] new output files are opened and the simulation",
368         "part number is added to all output file names.",
369         "Note that in all cases the checkpoint file itself is not renamed",
370         "and will be overwritten, unless its name does not match",
371         "the [TT]-cpo[tt] option.",
372         "[PAR]",
373         "With checkpointing the output is appended to previously written",
374         "output files, unless [TT]-noappend[tt] is used or none of the previous",
375         "output files are present (except for the checkpoint file).",
376         "The integrity of the files to be appended is verified using checksums",
377         "which are stored in the checkpoint file. This ensures that output can",
378         "not be mixed up or corrupted due to file appending. When only some",
379         "of the previous output files are present, a fatal error is generated",
380         "and no old output files are modified and no new output files are opened.",
381         "The result with appending will be the same as from a single run.",
382         "The contents will be binary identical, unless you use a different number",
383         "of ranks or dynamic load balancing or the FFT library uses optimizations",
384         "through timing.",
385         "[PAR]",
386         "With option [TT]-maxh[tt] a simulation is terminated and a checkpoint",
387         "file is written at the first neighbor search step where the run time",
388         "exceeds [TT]-maxh[tt]*0.99 hours.",
389         "[PAR]",
390         "When [TT]mdrun[tt] receives a TERM signal, it will set nsteps to the current",
391         "step plus one. When [TT]mdrun[tt] receives an INT signal (e.g. when ctrl+C is",
392         "pressed), it will stop after the next neighbor search step ",
393         "(with nstlist=0 at the next step).",
394         "In both cases all the usual output will be written to file.",
395         "When running with MPI, a signal to one of the [TT]mdrun[tt] ranks",
396         "is sufficient, this signal should not be sent to mpirun or",
397         "the [TT]mdrun[tt] process that is the parent of the others.",
398         "[PAR]",
399         "Interactive molecular dynamics (IMD) can be activated by using at least one",
400         "of the three IMD switches: The [TT]-imdterm[tt] switch allows to terminate the",
401         "simulation from the molecular viewer (e.g. VMD). With [TT]-imdwait[tt],",
402         "[TT]mdrun[tt] pauses whenever no IMD client is connected. Pulling from the",
403         "IMD remote can be turned on by [TT]-imdpull[tt].",
404         "The port [TT]mdrun[tt] listens to can be altered by [TT]-imdport[tt].The",
405         "file pointed to by [TT]-if[tt] contains atom indices and forces if IMD",
406         "pulling is used."
407         "[PAR]",
408         "When [TT]mdrun[tt] is started with MPI, it does not run niced by default."
409     };
410     t_commrec    *cr;
411     t_filenm      fnm[] = {
412         { efTPX, NULL,      NULL,       ffREAD },
413         { efTRN, "-o",      NULL,       ffWRITE },
414         { efCOMPRESSED, "-x", NULL,     ffOPTWR },
415         { efCPT, "-cpi",    NULL,       ffOPTRD },
416         { efCPT, "-cpo",    NULL,       ffOPTWR },
417         { efSTO, "-c",      "confout",  ffWRITE },
418         { efEDR, "-e",      "ener",     ffWRITE },
419         { efLOG, "-g",      "md",       ffWRITE },
420         { efXVG, "-dhdl",   "dhdl",     ffOPTWR },
421         { efXVG, "-field",  "field",    ffOPTWR },
422         { efXVG, "-table",  "table",    ffOPTRD },
423         { efXVG, "-tabletf", "tabletf",    ffOPTRD },
424         { efXVG, "-tablep", "tablep",   ffOPTRD },
425         { efXVG, "-tableb", "table",    ffOPTRD },
426         { efTRX, "-rerun",  "rerun",    ffOPTRD },
427         { efXVG, "-tpi",    "tpi",      ffOPTWR },
428         { efXVG, "-tpid",   "tpidist",  ffOPTWR },
429         { efEDI, "-ei",     "sam",      ffOPTRD },
430         { efXVG, "-eo",     "edsam",    ffOPTWR },
431         { efXVG, "-devout", "deviatie", ffOPTWR },
432         { efXVG, "-runav",  "runaver",  ffOPTWR },
433         { efXVG, "-px",     "pullx",    ffOPTWR },
434         { efXVG, "-pf",     "pullf",    ffOPTWR },
435         { efXVG, "-ro",     "rotation", ffOPTWR },
436         { efLOG, "-ra",     "rotangles", ffOPTWR },
437         { efLOG, "-rs",     "rotslabs", ffOPTWR },
438         { efLOG, "-rt",     "rottorque", ffOPTWR },
439         { efMTX, "-mtx",    "nm",       ffOPTWR },
440         { efNDX, "-dn",     "dipole",   ffOPTWR },
441         { efRND, "-multidir", NULL,      ffOPTRDMULT},
442         { efDAT, "-membed", "membed",   ffOPTRD },
443         { efTOP, "-mp",     "membed",   ffOPTRD },
444         { efNDX, "-mn",     "membed",   ffOPTRD },
445         { efXVG, "-if",     "imdforces", ffOPTWR },
446         { efXVG, "-swap",   "swapions", ffOPTWR }
447     };
448 #define NFILE asize(fnm)
449
450     /* Command line options ! */
451     gmx_bool        bDDBondCheck  = TRUE;
452     gmx_bool        bDDBondComm   = TRUE;
453     gmx_bool        bTunePME      = TRUE;
454     gmx_bool        bTestVerlet   = FALSE;
455     gmx_bool        bVerbose      = FALSE;
456     gmx_bool        bCompact      = TRUE;
457     gmx_bool        bSepPot       = FALSE;
458     gmx_bool        bRerunVSite   = FALSE;
459     gmx_bool        bConfout      = TRUE;
460     gmx_bool        bReproducible = FALSE;
461     gmx_bool        bIMDwait      = FALSE;
462     gmx_bool        bIMDterm      = FALSE;
463     gmx_bool        bIMDpull      = FALSE;
464
465     int             npme          = -1;
466     int             nstlist       = 0;
467     int             nmultisim     = 0;
468     int             nstglobalcomm = -1;
469     int             repl_ex_nst   = 0;
470     int             repl_ex_seed  = -1;
471     int             repl_ex_nex   = 0;
472     int             nstepout      = 100;
473     int             resetstep     = -1;
474     gmx_int64_t     nsteps        = -2;   /* the value -2 means that the mdp option will be used */
475     int             imdport       = 8888; /* can be almost anything, 8888 is easy to remember */
476
477     rvec            realddxyz          = {0, 0, 0};
478     const char     *ddno_opt[ddnoNR+1] =
479     { NULL, "interleave", "pp_pme", "cartesian", NULL };
480     const char     *dddlb_opt[] =
481     { NULL, "auto", "no", "yes", NULL };
482     const char     *thread_aff_opt[threadaffNR+1] =
483     { NULL, "auto", "on", "off", NULL };
484     const char     *nbpu_opt[] =
485     { NULL, "auto", "cpu", "gpu", "gpu_cpu", NULL };
486     real            rdd                   = 0.0, rconstr = 0.0, dlb_scale = 0.8, pforce = -1;
487     char           *ddcsx                 = NULL, *ddcsy = NULL, *ddcsz = NULL;
488     real            cpt_period            = 15.0, max_hours = -1;
489     gmx_bool        bAppendFiles          = TRUE;
490     gmx_bool        bKeepAndNumCPT        = FALSE;
491     gmx_bool        bResetCountersHalfWay = FALSE;
492     output_env_t    oenv                  = NULL;
493     const char     *deviceOptions         = "";
494
495     /* Non transparent initialization of a complex gmx_hw_opt_t struct.
496      * But unfortunately we are not allowed to call a function here,
497      * since declarations follow below.
498      */
499     gmx_hw_opt_t    hw_opt = {
500         0, 0, 0, 0, threadaffSEL, 0, 0,
501         { NULL, FALSE, 0, NULL }
502     };
503
504     t_pargs         pa[] = {
505
506         { "-dd",      FALSE, etRVEC, {&realddxyz},
507           "Domain decomposition grid, 0 is optimize" },
508         { "-ddorder", FALSE, etENUM, {ddno_opt},
509           "DD rank order" },
510         { "-npme",    FALSE, etINT, {&npme},
511           "Number of separate ranks to be used for PME, -1 is guess" },
512         { "-nt",      FALSE, etINT, {&hw_opt.nthreads_tot},
513           "Total number of threads to start (0 is guess)" },
514         { "-ntmpi",   FALSE, etINT, {&hw_opt.nthreads_tmpi},
515           "Number of thread-MPI threads to start (0 is guess)" },
516         { "-ntomp",   FALSE, etINT, {&hw_opt.nthreads_omp},
517           "Number of OpenMP threads per MPI rank to start (0 is guess)" },
518         { "-ntomp_pme", FALSE, etINT, {&hw_opt.nthreads_omp_pme},
519           "Number of OpenMP threads per MPI rank to start (0 is -ntomp)" },
520         { "-pin",     FALSE, etENUM, {thread_aff_opt},
521           "Set thread affinities" },
522         { "-pinoffset", FALSE, etINT, {&hw_opt.core_pinning_offset},
523           "The starting logical core number for pinning to cores; used to avoid pinning threads from different mdrun instances to the same core" },
524         { "-pinstride", FALSE, etINT, {&hw_opt.core_pinning_stride},
525           "Pinning distance in logical cores for threads, use 0 to minimize the number of threads per physical core" },
526         { "-gpu_id",  FALSE, etSTR, {&hw_opt.gpu_opt.gpu_id},
527           "List of GPU device id-s to use, specifies the per-node PP rank to GPU mapping" },
528         { "-ddcheck", FALSE, etBOOL, {&bDDBondCheck},
529           "Check for all bonded interactions with DD" },
530         { "-ddbondcomm", FALSE, etBOOL, {&bDDBondComm},
531           "HIDDENUse special bonded atom communication when [TT]-rdd[tt] > cut-off" },
532         { "-rdd",     FALSE, etREAL, {&rdd},
533           "The maximum distance for bonded interactions with DD (nm), 0 is determine from initial coordinates" },
534         { "-rcon",    FALSE, etREAL, {&rconstr},
535           "Maximum distance for P-LINCS (nm), 0 is estimate" },
536         { "-dlb",     FALSE, etENUM, {dddlb_opt},
537           "Dynamic load balancing (with DD)" },
538         { "-dds",     FALSE, etREAL, {&dlb_scale},
539           "Fraction in (0,1) by whose reciprocal the initial DD cell size will be increased in order to "
540           "provide a margin in which dynamic load balancing can act while preserving the minimum cell size." },
541         { "-ddcsx",   FALSE, etSTR, {&ddcsx},
542           "HIDDENA string containing a vector of the relative sizes in the x "
543           "direction of the corresponding DD cells. Only effective with static "
544           "load balancing." },
545         { "-ddcsy",   FALSE, etSTR, {&ddcsy},
546           "HIDDENA string containing a vector of the relative sizes in the y "
547           "direction of the corresponding DD cells. Only effective with static "
548           "load balancing." },
549         { "-ddcsz",   FALSE, etSTR, {&ddcsz},
550           "HIDDENA string containing a vector of the relative sizes in the z "
551           "direction of the corresponding DD cells. Only effective with static "
552           "load balancing." },
553         { "-gcom",    FALSE, etINT, {&nstglobalcomm},
554           "Global communication frequency" },
555         { "-nb",      FALSE, etENUM, {&nbpu_opt},
556           "Calculate non-bonded interactions on" },
557         { "-nstlist", FALSE, etINT, {&nstlist},
558           "Set nstlist when using a Verlet buffer tolerance (0 is guess)" },
559         { "-tunepme", FALSE, etBOOL, {&bTunePME},
560           "Optimize PME load between PP/PME ranks or GPU/CPU" },
561         { "-testverlet", FALSE, etBOOL, {&bTestVerlet},
562           "Test the Verlet non-bonded scheme" },
563         { "-v",       FALSE, etBOOL, {&bVerbose},
564           "Be loud and noisy" },
565         { "-compact", FALSE, etBOOL, {&bCompact},
566           "Write a compact log file" },
567         { "-seppot",  FALSE, etBOOL, {&bSepPot},
568           "Write separate V and dVdl terms for each interaction type and rank to the log file(s)" },
569         { "-pforce",  FALSE, etREAL, {&pforce},
570           "Print all forces larger than this (kJ/mol nm)" },
571         { "-reprod",  FALSE, etBOOL, {&bReproducible},
572           "Try to avoid optimizations that affect binary reproducibility" },
573         { "-cpt",     FALSE, etREAL, {&cpt_period},
574           "Checkpoint interval (minutes)" },
575         { "-cpnum",   FALSE, etBOOL, {&bKeepAndNumCPT},
576           "Keep and number checkpoint files" },
577         { "-append",  FALSE, etBOOL, {&bAppendFiles},
578           "Append to previous output files when continuing from checkpoint instead of adding the simulation part number to all file names" },
579         { "-nsteps",  FALSE, etINT64, {&nsteps},
580           "Run this number of steps, overrides .mdp file option" },
581         { "-maxh",   FALSE, etREAL, {&max_hours},
582           "Terminate after 0.99 times this time (hours)" },
583         { "-multi",   FALSE, etINT, {&nmultisim},
584           "Do multiple simulations in parallel" },
585         { "-replex",  FALSE, etINT, {&repl_ex_nst},
586           "Attempt replica exchange periodically with this period (steps)" },
587         { "-nex",  FALSE, etINT, {&repl_ex_nex},
588           "Number of random exchanges to carry out each exchange interval (N^3 is one suggestion).  -nex zero or not specified gives neighbor replica exchange." },
589         { "-reseed",  FALSE, etINT, {&repl_ex_seed},
590           "Seed for replica exchange, -1 is generate a seed" },
591         { "-imdport",    FALSE, etINT, {&imdport},
592           "HIDDENIMD listening port" },
593         { "-imdwait",  FALSE, etBOOL, {&bIMDwait},
594           "HIDDENPause the simulation while no IMD client is connected" },
595         { "-imdterm",  FALSE, etBOOL, {&bIMDterm},
596           "HIDDENAllow termination of the simulation from IMD client" },
597         { "-imdpull",  FALSE, etBOOL, {&bIMDpull},
598           "HIDDENAllow pulling in the simulation from IMD client" },
599         { "-rerunvsite", FALSE, etBOOL, {&bRerunVSite},
600           "HIDDENRecalculate virtual site coordinates with [TT]-rerun[tt]" },
601         { "-confout", FALSE, etBOOL, {&bConfout},
602           "HIDDENWrite the last configuration with [TT]-c[tt] and force checkpointing at the last step" },
603         { "-stepout", FALSE, etINT, {&nstepout},
604           "HIDDENFrequency of writing the remaining wall clock time for the run" },
605         { "-resetstep", FALSE, etINT, {&resetstep},
606           "HIDDENReset cycle counters after these many time steps" },
607         { "-resethway", FALSE, etBOOL, {&bResetCountersHalfWay},
608           "HIDDENReset the cycle counters after half the number of steps or halfway [TT]-maxh[tt]" }
609     };
610     unsigned long   Flags;
611     ivec            ddxyz;
612     int             dd_node_order;
613     gmx_bool        bAddPart;
614     FILE           *fplog, *fpmulti;
615     int             sim_part, sim_part_fn;
616     const char     *part_suffix = ".part";
617     char            suffix[STRLEN];
618     int             rc;
619     char          **multidir = NULL;
620
621     cr = init_commrec();
622
623     unsigned long PCA_Flags = PCA_CAN_SET_DEFFNM;
624     // With -multi or -multidir, the file names are going to get processed
625     // further (or the working directory changed), so we can't check for their
626     // existence during parsing.  It isn't useful to do any completion based on
627     // file system contents, either.
628     if (is_multisim_option_set(argc, argv))
629     {
630         PCA_Flags |= PCA_DISABLE_INPUT_FILE_CHECKING;
631     }
632
633     /* Comment this in to do fexist calls only on master
634      * works not with rerun or tables at the moment
635      * also comment out the version of init_forcerec in md.c
636      * with NULL instead of opt2fn
637      */
638     /*
639        if (!MASTER(cr))
640        {
641        PCA_Flags |= PCA_NOT_READ_NODE;
642        }
643      */
644
645     if (!parse_common_args(&argc, argv, PCA_Flags, NFILE, fnm, asize(pa), pa,
646                            asize(desc), desc, 0, NULL, &oenv))
647     {
648         return 0;
649     }
650
651
652     /* we set these early because they might be used in init_multisystem()
653        Note that there is the potential for npme>nnodes until the number of
654        threads is set later on, if there's thread parallelization. That shouldn't
655        lead to problems. */
656     dd_node_order = nenum(ddno_opt);
657     cr->npmenodes = npme;
658
659     hw_opt.thread_affinity = nenum(thread_aff_opt);
660
661     /* now check the -multi and -multidir option */
662     if (opt2bSet("-multidir", NFILE, fnm))
663     {
664         if (nmultisim > 0)
665         {
666             gmx_fatal(FARGS, "mdrun -multi and -multidir options are mutually exclusive.");
667         }
668         nmultisim = opt2fns(&multidir, "-multidir", NFILE, fnm);
669     }
670
671
672     if (repl_ex_nst != 0 && nmultisim < 2)
673     {
674         gmx_fatal(FARGS, "Need at least two replicas for replica exchange (option -multi)");
675     }
676
677     if (repl_ex_nex < 0)
678     {
679         gmx_fatal(FARGS, "Replica exchange number of exchanges needs to be positive");
680     }
681
682     if (nmultisim > 1)
683     {
684 #ifndef GMX_THREAD_MPI
685         gmx_bool bParFn = (multidir == NULL);
686         init_multisystem(cr, nmultisim, multidir, NFILE, fnm, bParFn);
687 #else
688         gmx_fatal(FARGS, "mdrun -multi is not supported with the thread library. "
689                   "Please compile GROMACS with MPI support");
690 #endif
691     }
692
693     bAddPart = !bAppendFiles;
694
695     /* Check if there is ANY checkpoint file available */
696     sim_part    = 1;
697     sim_part_fn = sim_part;
698     if (opt2bSet("-cpi", NFILE, fnm))
699     {
700         if (bSepPot && bAppendFiles)
701         {
702             gmx_fatal(FARGS, "Output file appending is not supported with -seppot");
703         }
704
705         bAppendFiles =
706             read_checkpoint_simulation_part(opt2fn_master("-cpi", NFILE,
707                                                           fnm, cr),
708                                             &sim_part_fn, NULL, cr,
709                                             bAppendFiles, NFILE, fnm,
710                                             part_suffix, &bAddPart);
711         if (sim_part_fn == 0 && MULTIMASTER(cr))
712         {
713             fprintf(stdout, "No previous checkpoint file present, assuming this is a new run.\n");
714         }
715         else
716         {
717             sim_part = sim_part_fn + 1;
718         }
719
720         if (MULTISIM(cr) && MASTER(cr))
721         {
722             if (MULTIMASTER(cr))
723             {
724                 /* Log file is not yet available, so if there's a
725                  * problem we can only write to stderr. */
726                 fpmulti = stderr;
727             }
728             else
729             {
730                 fpmulti = NULL;
731             }
732             check_multi_int(fpmulti, cr->ms, sim_part, "simulation part", TRUE);
733         }
734     }
735     else
736     {
737         bAppendFiles = FALSE;
738     }
739
740     if (!bAppendFiles)
741     {
742         sim_part_fn = sim_part;
743     }
744
745     if (bAddPart)
746     {
747         /* Rename all output files (except checkpoint files) */
748         /* create new part name first (zero-filled) */
749         sprintf(suffix, "%s%04d", part_suffix, sim_part_fn);
750
751         add_suffix_to_output_names(fnm, NFILE, suffix);
752         if (MULTIMASTER(cr))
753         {
754             fprintf(stdout, "Checkpoint file is from part %d, new output files will be suffixed '%s'.\n", sim_part-1, suffix);
755         }
756     }
757
758     Flags = opt2bSet("-rerun", NFILE, fnm) ? MD_RERUN : 0;
759     Flags = Flags | (bSepPot       ? MD_SEPPOT       : 0);
760     Flags = Flags | (bDDBondCheck  ? MD_DDBONDCHECK  : 0);
761     Flags = Flags | (bDDBondComm   ? MD_DDBONDCOMM   : 0);
762     Flags = Flags | (bTunePME      ? MD_TUNEPME      : 0);
763     Flags = Flags | (bTestVerlet   ? MD_TESTVERLET   : 0);
764     Flags = Flags | (bConfout      ? MD_CONFOUT      : 0);
765     Flags = Flags | (bRerunVSite   ? MD_RERUN_VSITE  : 0);
766     Flags = Flags | (bReproducible ? MD_REPRODUCIBLE : 0);
767     Flags = Flags | (bAppendFiles  ? MD_APPENDFILES  : 0);
768     Flags = Flags | (opt2parg_bSet("-append", asize(pa), pa) ? MD_APPENDFILESSET : 0);
769     Flags = Flags | (bKeepAndNumCPT ? MD_KEEPANDNUMCPT : 0);
770     Flags = Flags | (sim_part > 1    ? MD_STARTFROMCPT : 0);
771     Flags = Flags | (bResetCountersHalfWay ? MD_RESETCOUNTERSHALFWAY : 0);
772     Flags = Flags | (bIMDwait      ? MD_IMDWAIT      : 0);
773     Flags = Flags | (bIMDterm      ? MD_IMDTERM      : 0);
774     Flags = Flags | (bIMDpull      ? MD_IMDPULL      : 0);
775
776     /* We postpone opening the log file if we are appending, so we can
777        first truncate the old log file and append to the correct position
778        there instead.  */
779     if ((MASTER(cr) || bSepPot) && !bAppendFiles)
780     {
781         gmx_log_open(ftp2fn(efLOG, NFILE, fnm), cr,
782                      !bSepPot, Flags & MD_APPENDFILES, &fplog);
783         please_cite(fplog, "Hess2008b");
784         please_cite(fplog, "Spoel2005a");
785         please_cite(fplog, "Lindahl2001a");
786         please_cite(fplog, "Berendsen95a");
787     }
788     else if (!MASTER(cr) && bSepPot)
789     {
790         gmx_log_open(ftp2fn(efLOG, NFILE, fnm), cr, !bSepPot, Flags, &fplog);
791     }
792     else
793     {
794         fplog = NULL;
795     }
796
797     ddxyz[XX] = (int)(realddxyz[XX] + 0.5);
798     ddxyz[YY] = (int)(realddxyz[YY] + 0.5);
799     ddxyz[ZZ] = (int)(realddxyz[ZZ] + 0.5);
800
801     rc = mdrunner(&hw_opt, fplog, cr, NFILE, fnm, oenv, bVerbose, bCompact,
802                   nstglobalcomm, ddxyz, dd_node_order, rdd, rconstr,
803                   dddlb_opt[0], dlb_scale, ddcsx, ddcsy, ddcsz,
804                   nbpu_opt[0], nstlist,
805                   nsteps, nstepout, resetstep,
806                   nmultisim, repl_ex_nst, repl_ex_nex, repl_ex_seed,
807                   pforce, cpt_period, max_hours, deviceOptions, imdport, Flags);
808
809     /* Log file has to be closed in mdrunner if we are appending to it
810        (fplog not set here) */
811     if (MASTER(cr) && !bAppendFiles)
812     {
813         gmx_log_close(fplog);
814     }
815
816     return rc;
817 }