Merge branch 'release-4-5-patches'
[alexxy/gromacs.git] / src / kernel / runner.c
1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; c-file-style: "stroustrup"; -*-
2  *
3  * 
4  *                This source code is part of
5  * 
6  *                 G   R   O   M   A   C   S
7  * 
8  *          GROningen MAchine for Chemical Simulations
9  * 
10  *                        VERSION 3.2.0
11  * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
12  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
13  * Copyright (c) 2001-2004, The GROMACS development team,
14  * check out http://www.gromacs.org for more information.
15
16  * This program is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU General Public License
18  * as published by the Free Software Foundation; either version 2
19  * of the License, or (at your option) any later version.
20  * 
21  * If you want to redistribute modifications, please consider that
22  * scientific software is very special. Version control is crucial -
23  * bugs must be traceable. We will be happy to consider code for
24  * inclusion in the official distribution, but derived work must not
25  * be called official GROMACS. Details are found in the README & COPYING
26  * files - if they are missing, get the official version at www.gromacs.org.
27  * 
28  * To help us fund GROMACS development, we humbly ask that you cite
29  * the papers on the package - you can find them in the top README file.
30  * 
31  * For more info, check our website at http://www.gromacs.org
32  * 
33  * And Hey:
34  * Gallium Rubidium Oxygen Manganese Argon Carbon Silicon
35  */
36 #ifdef HAVE_CONFIG_H
37 #include <config.h>
38 #endif
39
40 #include <signal.h>
41 #include <stdlib.h>
42
43 #if ((defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64) && !defined __CYGWIN__ && !defined __CYGWIN32__)
44 /* _isnan() */
45 #include <float.h>
46 #endif
47
48 #include "typedefs.h"
49 #include "smalloc.h"
50 #include "sysstuff.h"
51 #include "statutil.h"
52 #include "mdrun.h"
53 #include "network.h"
54 #include "pull.h"
55 #include "names.h"
56 #include "disre.h"
57 #include "orires.h"
58 #include "dihre.h"
59 #include "pppm.h"
60 #include "pme.h"
61 #include "mdatoms.h"
62 #include "repl_ex.h"
63 #include "qmmm.h"
64 #include "mpelogging.h"
65 #include "domdec.h"
66 #include "partdec.h"
67 #include "coulomb.h"
68 #include "constr.h"
69 #include "mvdata.h"
70 #include "checkpoint.h"
71 #include "mtop_util.h"
72 #include "sighandler.h"
73 #include "tpxio.h"
74 #include "txtdump.h"
75 #include "gmx_membed.h"
76
77 #include "md_openmm.h"
78
79 #ifdef GMX_LIB_MPI
80 #include <mpi.h>
81 #endif
82 #ifdef GMX_THREADS
83 #include "tmpi.h"
84 #endif
85
86 #ifdef GMX_FAHCORE
87 #include "corewrap.h"
88 #endif
89
90 #ifdef GMX_OPENMM
91 #include "md_openmm.h"
92 #endif
93
94
95 typedef struct { 
96     gmx_integrator_t *func;
97 } gmx_intp_t;
98
99 /* The array should match the eI array in include/types/enums.h */
100 #ifdef GMX_OPENMM  /* FIXME do_md_openmm needs fixing */
101 const gmx_intp_t integrator[eiNR] = { {do_md_openmm}, {do_md_openmm}, {do_md_openmm}, {do_md_openmm}, {do_md_openmm}, {do_md_openmm}, {do_md_openmm}, {do_md_openmm}, {do_md_openmm}, {do_md_openmm}, {do_md_openmm},{do_md_openmm}};
102 #else
103 const gmx_intp_t integrator[eiNR] = { {do_md}, {do_steep}, {do_cg}, {do_md}, {do_md}, {do_nm}, {do_lbfgs}, {do_tpi}, {do_tpi}, {do_md}, {do_md},{do_md}};
104 #endif
105
106 gmx_large_int_t     deform_init_init_step_tpx;
107 matrix              deform_init_box_tpx;
108 #ifdef GMX_THREADS
109 tMPI_Thread_mutex_t deform_init_box_mutex=TMPI_THREAD_MUTEX_INITIALIZER;
110 #endif
111
112
113 #ifdef GMX_THREADS
114 struct mdrunner_arglist
115 {
116     FILE *fplog;
117     t_commrec *cr;
118     int nfile;
119     const t_filenm *fnm;
120     output_env_t oenv;
121     gmx_bool bVerbose;
122     gmx_bool bCompact;
123     int nstglobalcomm;
124     ivec ddxyz;
125     int dd_node_order;
126     real rdd;
127     real rconstr;
128     const char *dddlb_opt;
129     real dlb_scale;
130     const char *ddcsx;
131     const char *ddcsy;
132     const char *ddcsz;
133     int nstepout;
134     int resetstep;
135     int nmultisim;
136     int repl_ex_nst;
137     int repl_ex_seed;
138     real pforce;
139     real cpt_period;
140     real max_hours;
141     const char *deviceOptions;
142     unsigned long Flags;
143     int ret; /* return value */
144 };
145
146
147 /* The function used for spawning threads. Extracts the mdrunner() 
148    arguments from its one argument and calls mdrunner(), after making
149    a commrec. */
150 static void mdrunner_start_fn(void *arg)
151 {
152     struct mdrunner_arglist *mda=(struct mdrunner_arglist*)arg;
153     struct mdrunner_arglist mc=*mda; /* copy the arg list to make sure 
154                                         that it's thread-local. This doesn't
155                                         copy pointed-to items, of course,
156                                         but those are all const. */
157     t_commrec *cr;  /* we need a local version of this */
158     FILE *fplog=NULL;
159     t_filenm *fnm;
160
161     fnm = dup_tfn(mc.nfile, mc.fnm);
162
163     cr = init_par_threads(mc.cr);
164
165     if (MASTER(cr))
166     {
167         fplog=mc.fplog;
168     }
169
170     mda->ret=mdrunner(cr->nnodes, fplog, cr, mc.nfile, fnm, mc.oenv, 
171                       mc.bVerbose, mc.bCompact, mc.nstglobalcomm, 
172                       mc.ddxyz, mc.dd_node_order, mc.rdd,
173                       mc.rconstr, mc.dddlb_opt, mc.dlb_scale, 
174                       mc.ddcsx, mc.ddcsy, mc.ddcsz, mc.nstepout, mc.resetstep, 
175                       mc.nmultisim, mc.repl_ex_nst, mc.repl_ex_seed, mc.pforce, 
176                       mc.cpt_period, mc.max_hours, mc.deviceOptions, mc.Flags);
177 }
178
179 /* called by mdrunner() to start a specific number of threads (including 
180    the main thread) for thread-parallel runs. This in turn calls mdrunner()
181    for each thread. 
182    All options besides nthreads are the same as for mdrunner(). */
183 static t_commrec *mdrunner_start_threads(int nthreads, 
184               FILE *fplog,t_commrec *cr,int nfile, 
185               const t_filenm fnm[], const output_env_t oenv, gmx_bool bVerbose,
186               gmx_bool bCompact, int nstglobalcomm,
187               ivec ddxyz,int dd_node_order,real rdd,real rconstr,
188               const char *dddlb_opt,real dlb_scale,
189               const char *ddcsx,const char *ddcsy,const char *ddcsz,
190               int nstepout,int resetstep,int nmultisim,int repl_ex_nst,
191               int repl_ex_seed, real pforce,real cpt_period, real max_hours, 
192               const char *deviceOptions, unsigned long Flags)
193 {
194     int ret;
195     struct mdrunner_arglist *mda;
196     t_commrec *crn; /* the new commrec */
197     t_filenm *fnmn;
198
199     /* first check whether we even need to start tMPI */
200     if (nthreads<2)
201         return cr;
202
203     /* a few small, one-time, almost unavoidable memory leaks: */
204     snew(mda,1);
205     fnmn=dup_tfn(nfile, fnm);
206
207     /* fill the data structure to pass as void pointer to thread start fn */
208     mda->fplog=fplog;
209     mda->cr=cr;
210     mda->nfile=nfile;
211     mda->fnm=fnmn;
212     mda->oenv=oenv;
213     mda->bVerbose=bVerbose;
214     mda->bCompact=bCompact;
215     mda->nstglobalcomm=nstglobalcomm;
216     mda->ddxyz[XX]=ddxyz[XX];
217     mda->ddxyz[YY]=ddxyz[YY];
218     mda->ddxyz[ZZ]=ddxyz[ZZ];
219     mda->dd_node_order=dd_node_order;
220     mda->rdd=rdd;
221     mda->rconstr=rconstr;
222     mda->dddlb_opt=dddlb_opt;
223     mda->dlb_scale=dlb_scale;
224     mda->ddcsx=ddcsx;
225     mda->ddcsy=ddcsy;
226     mda->ddcsz=ddcsz;
227     mda->nstepout=nstepout;
228     mda->resetstep=resetstep;
229     mda->nmultisim=nmultisim;
230     mda->repl_ex_nst=repl_ex_nst;
231     mda->repl_ex_seed=repl_ex_seed;
232     mda->pforce=pforce;
233     mda->cpt_period=cpt_period;
234     mda->max_hours=max_hours;
235     mda->deviceOptions=deviceOptions;
236     mda->Flags=Flags;
237
238     fprintf(stderr, "Starting %d threads\n",nthreads);
239     fflush(stderr);
240     /* now spawn new threads that start mdrunner_start_fn(), while 
241        the main thread returns */
242     ret=tMPI_Init_fn(TRUE, nthreads, mdrunner_start_fn, (void*)(mda) );
243     if (ret!=TMPI_SUCCESS)
244         return NULL;
245
246     /* make a new comm_rec to reflect the new situation */
247     crn=init_par_threads(cr);
248     return crn;
249 }
250
251
252 /* get the number of threads based on how many there were requested, 
253    which algorithms we're using, and how many particles there are. */
254 static int get_nthreads(int nthreads_requested, t_inputrec *inputrec,
255                         gmx_mtop_t *mtop)
256 {
257     int nthreads,nthreads_new;
258     int min_atoms_per_thread;
259
260     nthreads = nthreads_requested;
261
262     /* determine # of hardware threads. */
263     if (nthreads_requested < 1)
264     {
265         nthreads = tMPI_Get_recommended_nthreads();
266     }
267
268     if (inputrec->eI == eiNM || EI_TPI(inputrec->eI))
269     {
270         /* Steps are divided over the nodes iso splitting the atoms */
271         min_atoms_per_thread = 0;
272     }
273     else
274     {
275         min_atoms_per_thread = MIN_ATOMS_PER_THREAD;
276     }
277
278     /* Check if an algorithm does not support parallel simulation.  */
279     if (nthreads != 1 && 
280         ( inputrec->eI == eiLBFGS ||
281           inputrec->coulombtype == eelEWALD ) )
282     {
283         fprintf(stderr,"\nThe integration or electrostatics algorithm doesn't support parallel runs. Not starting any threads.\n");
284         nthreads = 1;
285     }
286     else if (nthreads_requested < 1 &&
287              mtop->natoms/nthreads < min_atoms_per_thread)
288     {
289         /* the thread number was chosen automatically, but there are too many
290            threads (too few atoms per thread) */
291         nthreads_new = max(1,mtop->natoms/min_atoms_per_thread);
292
293         if (nthreads_new > 8 || (nthreads == 8 && nthreads_new > 4))
294         {
295             /* Use only multiples of 4 above 8 threads
296              * or with an 8-core processor
297              * (to avoid 6 threads on 8 core processors with 4 real cores).
298              */
299             nthreads_new = (nthreads_new/4)*4;
300         }
301         else if (nthreads_new > 4)
302         {
303             /* Avoid 5 or 7 threads */
304             nthreads_new = (nthreads_new/2)*2;
305         }
306
307         nthreads = nthreads_new;
308
309         fprintf(stderr,"\n");
310         fprintf(stderr,"NOTE: Parallelization is limited by the small number of atoms,\n");
311         fprintf(stderr,"      only starting %d threads.\n",nthreads);
312         fprintf(stderr,"      You can use the -nt option to optimize the number of threads.\n\n");
313     }
314     return nthreads;
315 }
316 #endif
317
318
319 int mdrunner(int nthreads_requested, FILE *fplog,t_commrec *cr,int nfile,
320              const t_filenm fnm[], const output_env_t oenv, gmx_bool bVerbose,
321              gmx_bool bCompact, int nstglobalcomm,
322              ivec ddxyz,int dd_node_order,real rdd,real rconstr,
323              const char *dddlb_opt,real dlb_scale,
324              const char *ddcsx,const char *ddcsy,const char *ddcsz,
325              int nstepout,int resetstep,int nmultisim,int repl_ex_nst,
326              int repl_ex_seed, real pforce,real cpt_period,real max_hours,
327              const char *deviceOptions, unsigned long Flags)
328 {
329     double     nodetime=0,realtime;
330     t_inputrec *inputrec;
331     t_state    *state=NULL;
332     matrix     box;
333     gmx_ddbox_t ddbox={0};
334     int        npme_major,npme_minor;
335     real       tmpr1,tmpr2;
336     t_nrnb     *nrnb;
337     gmx_mtop_t *mtop=NULL;
338     t_mdatoms  *mdatoms=NULL;
339     t_forcerec *fr=NULL;
340     t_fcdata   *fcd=NULL;
341     real       ewaldcoeff=0;
342     gmx_pme_t  *pmedata=NULL;
343     gmx_vsite_t *vsite=NULL;
344     gmx_constr_t constr;
345     int        i,m,nChargePerturbed=-1,status,nalloc;
346     char       *gro;
347     gmx_wallcycle_t wcycle;
348     gmx_bool       bReadRNG,bReadEkin;
349     int        list;
350     gmx_runtime_t runtime;
351     int        rc;
352     gmx_large_int_t reset_counters;
353     gmx_edsam_t ed=NULL;
354     t_commrec   *cr_old=cr; 
355     int         nthreads=1;
356     gmx_membed_t *membed=NULL;
357
358     /* CAUTION: threads may be started later on in this function, so
359        cr doesn't reflect the final parallel state right now */
360     snew(inputrec,1);
361     snew(mtop,1);
362
363     if (bVerbose && SIMMASTER(cr))
364     {
365         fprintf(stderr,"Getting Loaded...\n");
366     }
367     
368     if (Flags & MD_APPENDFILES) 
369     {
370         fplog = NULL;
371     }
372
373     snew(state,1);
374     if (MASTER(cr)) 
375     {
376         /* Read (nearly) all data required for the simulation */
377         read_tpx_state(ftp2fn(efTPX,nfile,fnm),inputrec,state,NULL,mtop);
378
379         /* NOW the threads will be started: */
380 #ifdef GMX_THREADS
381         nthreads = get_nthreads(nthreads_requested, inputrec, mtop);
382
383         if (nthreads > 1)
384         {
385             /* now start the threads. */
386             cr=mdrunner_start_threads(nthreads, fplog, cr_old, nfile, fnm, 
387                                       oenv, bVerbose, bCompact, nstglobalcomm, 
388                                       ddxyz, dd_node_order, rdd, rconstr, 
389                                       dddlb_opt, dlb_scale, ddcsx, ddcsy, ddcsz,
390                                       nstepout, resetstep, nmultisim, 
391                                       repl_ex_nst, repl_ex_seed, pforce, 
392                                       cpt_period, max_hours, deviceOptions, 
393                                       Flags);
394             /* the main thread continues here with a new cr. We don't deallocate
395                the old cr because other threads may still be reading it. */
396             if (cr == NULL)
397             {
398                 gmx_comm("Failed to spawn threads");
399             }
400         }
401 #endif
402     }
403     /* END OF CAUTION: cr is now reliable */
404
405     /* g_membed initialisation *
406      * Because we change the mtop, init_membed is called before the init_parallel *
407      * (in case we ever want to make it run in parallel) */
408     if (opt2bSet("-membed",nfile,fnm))
409     {
410         fprintf(stderr,"Entering membed code");
411         snew(membed,1);
412         init_membed(fplog,membed,nfile,fnm,mtop,inputrec,state,cr,&cpt_period);
413     }
414
415     if (PAR(cr))
416     {
417         /* now broadcast everything to the non-master nodes/threads: */
418         init_parallel(fplog, cr, inputrec, mtop);
419     }
420     if (fplog != NULL)
421     {
422         pr_inputrec(fplog,0,"Input Parameters",inputrec,FALSE);
423     }
424
425     /* now make sure the state is initialized and propagated */
426     set_state_entries(state,inputrec,cr->nnodes);
427
428     /* A parallel command line option consistency check that we can
429        only do after any threads have started. */
430     if (!PAR(cr) &&
431         (ddxyz[XX] > 1 || ddxyz[YY] > 1 || ddxyz[ZZ] > 1 || cr->npmenodes > 0))
432     {
433         gmx_fatal(FARGS,
434                   "The -dd or -npme option request a parallel simulation, "
435 #ifndef GMX_MPI
436                   "but mdrun was compiled without threads or MPI enabled"
437 #else
438 #ifdef GMX_THREADS
439                   "but the number of threads (option -nt) is 1"
440 #else
441                   "but mdrun was not started through mpirun/mpiexec or only one process was requested through mpirun/mpiexec" 
442 #endif
443 #endif
444             );
445     }
446
447     if (can_use_allvsall(inputrec,mtop,TRUE,cr,fplog))
448     {
449         /* All-vs-all loops do not work with domain decomposition */
450         Flags |= MD_PARTDEC;
451     }
452
453     if (!EEL_PME(inputrec->coulombtype) || (Flags & MD_PARTDEC))
454     {
455         cr->npmenodes = 0;
456     }
457
458 #ifdef GMX_FAHCORE
459     fcRegisterSteps(inputrec->nsteps,inputrec->init_step);
460 #endif
461
462     /* NMR restraints must be initialized before load_checkpoint,
463      * since with time averaging the history is added to t_state.
464      * For proper consistency check we therefore need to extend
465      * t_state here.
466      * So the PME-only nodes (if present) will also initialize
467      * the distance restraints.
468      */
469     snew(fcd,1);
470
471     /* This needs to be called before read_checkpoint to extend the state */
472     init_disres(fplog,mtop,inputrec,cr,Flags & MD_PARTDEC,fcd,state);
473
474     if (gmx_mtop_ftype_count(mtop,F_ORIRES) > 0)
475     {
476         if (PAR(cr) && !(Flags & MD_PARTDEC))
477         {
478             gmx_fatal(FARGS,"Orientation restraints do not work (yet) with domain decomposition, use particle decomposition (mdrun option -pd)");
479         }
480         /* Orientation restraints */
481         if (MASTER(cr))
482         {
483             init_orires(fplog,mtop,state->x,inputrec,cr->ms,&(fcd->orires),
484                         state);
485         }
486     }
487
488     if (DEFORM(*inputrec))
489     {
490         /* Store the deform reference box before reading the checkpoint */
491         if (SIMMASTER(cr))
492         {
493             copy_mat(state->box,box);
494         }
495         if (PAR(cr))
496         {
497             gmx_bcast(sizeof(box),box,cr);
498         }
499         /* Because we do not have the update struct available yet
500          * in which the reference values should be stored,
501          * we store them temporarily in static variables.
502          * This should be thread safe, since they are only written once
503          * and with identical values.
504          */
505 #ifdef GMX_THREADS
506         tMPI_Thread_mutex_lock(&deform_init_box_mutex);
507 #endif
508         deform_init_init_step_tpx = inputrec->init_step;
509         copy_mat(box,deform_init_box_tpx);
510 #ifdef GMX_THREADS
511         tMPI_Thread_mutex_unlock(&deform_init_box_mutex);
512 #endif
513     }
514
515     if (opt2bSet("-cpi",nfile,fnm)) 
516     {
517         /* Check if checkpoint file exists before doing continuation.
518          * This way we can use identical input options for the first and subsequent runs...
519          */
520         if( gmx_fexist_master(opt2fn_master("-cpi",nfile,fnm,cr),cr) )
521         {
522             load_checkpoint(opt2fn_master("-cpi",nfile,fnm,cr),&fplog,
523                             cr,Flags & MD_PARTDEC,ddxyz,
524                             inputrec,state,&bReadRNG,&bReadEkin,
525                             (Flags & MD_APPENDFILES));
526             
527             if (bReadRNG)
528             {
529                 Flags |= MD_READ_RNG;
530             }
531             if (bReadEkin)
532             {
533                 Flags |= MD_READ_EKIN;
534             }
535         }
536     }
537
538     if (((MASTER(cr) || (Flags & MD_SEPPOT)) && (Flags & MD_APPENDFILES))
539 #ifdef GMX_THREADS
540         /* With thread MPI only the master node/thread exists in mdrun.c,
541          * therefore non-master nodes need to open the "seppot" log file here.
542          */
543         || (!MASTER(cr) && (Flags & MD_SEPPOT))
544 #endif
545         )
546     {
547         gmx_log_open(ftp2fn(efLOG,nfile,fnm),cr,!(Flags & MD_SEPPOT),
548                              Flags,&fplog);
549     }
550
551     if (SIMMASTER(cr)) 
552     {
553         copy_mat(state->box,box);
554     }
555
556     if (PAR(cr)) 
557     {
558         gmx_bcast(sizeof(box),box,cr);
559     }
560
561     /* Essential dynamics */
562     if (opt2bSet("-ei",nfile,fnm))
563     {
564         /* Open input and output files, allocate space for ED data structure */
565         ed = ed_open(nfile,fnm,Flags,cr);
566     }
567
568     if (bVerbose && SIMMASTER(cr))
569     {
570         fprintf(stderr,"Loaded with Money\n\n");
571     }
572
573     if (PAR(cr) && !((Flags & MD_PARTDEC) ||
574                      EI_TPI(inputrec->eI) ||
575                      inputrec->eI == eiNM))
576     {
577         cr->dd = init_domain_decomposition(fplog,cr,Flags,ddxyz,rdd,rconstr,
578                                            dddlb_opt,dlb_scale,
579                                            ddcsx,ddcsy,ddcsz,
580                                            mtop,inputrec,
581                                            box,state->x,
582                                            &ddbox,&npme_major,&npme_minor);
583
584         make_dd_communicators(fplog,cr,dd_node_order);
585
586         /* Set overallocation to avoid frequent reallocation of arrays */
587         set_over_alloc_dd(TRUE);
588     }
589     else
590     {
591         /* PME, if used, is done on all nodes with 1D decomposition */
592         cr->npmenodes = 0;
593         cr->duty = (DUTY_PP | DUTY_PME);
594         npme_major = cr->nnodes;
595         npme_minor = 1;
596         
597         if (inputrec->ePBC == epbcSCREW)
598         {
599             gmx_fatal(FARGS,
600                       "pbc=%s is only implemented with domain decomposition",
601                       epbc_names[inputrec->ePBC]);
602         }
603     }
604
605     if (PAR(cr))
606     {
607         /* After possible communicator splitting in make_dd_communicators.
608          * we can set up the intra/inter node communication.
609          */
610         gmx_setup_nodecomm(fplog,cr);
611     }
612
613     wcycle = wallcycle_init(fplog,resetstep,cr);
614     if (PAR(cr))
615     {
616         /* Master synchronizes its value of reset_counters with all nodes 
617          * including PME only nodes */
618         reset_counters = wcycle_get_reset_counters(wcycle);
619         gmx_bcast_sim(sizeof(reset_counters),&reset_counters,cr);
620         wcycle_set_reset_counters(wcycle, reset_counters);
621     }
622
623
624     snew(nrnb,1);
625     if (cr->duty & DUTY_PP)
626     {
627         /* For domain decomposition we allocate dynamically
628          * in dd_partition_system.
629          */
630         if (DOMAINDECOMP(cr))
631         {
632             bcast_state_setup(cr,state);
633         }
634         else
635         {
636             if (PAR(cr))
637             {
638                 if (!MASTER(cr))
639                 {
640                     snew(state,1);
641                 }
642                 bcast_state(cr,state,TRUE);
643             }
644         }
645
646         /* Dihedral Restraints */
647         if (gmx_mtop_ftype_count(mtop,F_DIHRES) > 0)
648         {
649             init_dihres(fplog,mtop,inputrec,fcd);
650         }
651
652         /* Initiate forcerecord */
653         fr = mk_forcerec();
654         init_forcerec(fplog,oenv,fr,fcd,inputrec,mtop,cr,box,FALSE,
655                       opt2fn("-table",nfile,fnm),
656                       opt2fn("-tablep",nfile,fnm),
657                       opt2fn("-tableb",nfile,fnm),FALSE,pforce);
658
659         /* version for PCA_NOT_READ_NODE (see md.c) */
660         /*init_forcerec(fplog,fr,fcd,inputrec,mtop,cr,box,FALSE,
661           "nofile","nofile","nofile",FALSE,pforce);
662           */        
663         fr->bSepDVDL = ((Flags & MD_SEPPOT) == MD_SEPPOT);
664
665         /* Initialize QM-MM */
666         if(fr->bQMMM)
667         {
668             init_QMMMrec(cr,box,mtop,inputrec,fr);
669         }
670
671         /* Initialize the mdatoms structure.
672          * mdatoms is not filled with atom data,
673          * as this can not be done now with domain decomposition.
674          */
675         mdatoms = init_mdatoms(fplog,mtop,inputrec->efep!=efepNO);
676
677         /* Initialize the virtual site communication */
678         vsite = init_vsite(mtop,cr);
679
680         calc_shifts(box,fr->shift_vec);
681
682         /* With periodic molecules the charge groups should be whole at start up
683          * and the virtual sites should not be far from their proper positions.
684          */
685         if (!inputrec->bContinuation && MASTER(cr) &&
686             !(inputrec->ePBC != epbcNONE && inputrec->bPeriodicMols))
687         {
688             /* Make molecules whole at start of run */
689             if (fr->ePBC != epbcNONE)
690             {
691                 do_pbc_first_mtop(fplog,inputrec->ePBC,box,mtop,state->x);
692             }
693             if (vsite)
694             {
695                 /* Correct initial vsite positions are required
696                  * for the initial distribution in the domain decomposition
697                  * and for the initial shell prediction.
698                  */
699                 construct_vsites_mtop(fplog,vsite,mtop,state->x);
700             }
701         }
702
703         /* Initiate PPPM if necessary */
704         if (fr->eeltype == eelPPPM)
705         {
706             if (mdatoms->nChargePerturbed)
707             {
708                 gmx_fatal(FARGS,"Free energy with %s is not implemented",
709                           eel_names[fr->eeltype]);
710             }
711             status = gmx_pppm_init(fplog,cr,oenv,FALSE,TRUE,box,
712                                    getenv("GMXGHAT"),inputrec, (Flags & MD_REPRODUCIBLE));
713             if (status != 0)
714             {
715                 gmx_fatal(FARGS,"Error %d initializing PPPM",status);
716             }
717         }
718
719         if (EEL_PME(fr->eeltype))
720         {
721             ewaldcoeff = fr->ewaldcoeff;
722             pmedata = &fr->pmedata;
723         }
724         else
725         {
726             pmedata = NULL;
727         }
728     }
729     else
730     {
731         /* This is a PME only node */
732
733         /* We don't need the state */
734         done_state(state);
735
736         ewaldcoeff = calc_ewaldcoeff(inputrec->rcoulomb, inputrec->ewald_rtol);
737         snew(pmedata,1);
738     }
739
740     /* Initiate PME if necessary,
741      * either on all nodes or on dedicated PME nodes only. */
742     if (EEL_PME(inputrec->coulombtype))
743     {
744         if (mdatoms)
745         {
746             nChargePerturbed = mdatoms->nChargePerturbed;
747         }
748         if (cr->npmenodes > 0)
749         {
750             /* The PME only nodes need to know nChargePerturbed */
751             gmx_bcast_sim(sizeof(nChargePerturbed),&nChargePerturbed,cr);
752         }
753         if (cr->duty & DUTY_PME)
754         {
755             status = gmx_pme_init(pmedata,cr,npme_major,npme_minor,inputrec,
756                                   mtop ? mtop->natoms : 0,nChargePerturbed,
757                                   (Flags & MD_REPRODUCIBLE));
758             if (status != 0) 
759             {
760                 gmx_fatal(FARGS,"Error %d initializing PME",status);
761             }
762         }
763     }
764
765
766     if (integrator[inputrec->eI].func == do_md
767 #ifdef GMX_OPENMM
768         ||
769         integrator[inputrec->eI].func == do_md_openmm
770 #endif
771         )
772     {
773         /* Turn on signal handling on all nodes */
774         /*
775          * (A user signal from the PME nodes (if any)
776          * is communicated to the PP nodes.
777          */
778         signal_handler_install();
779     }
780
781     if (cr->duty & DUTY_PP)
782     {
783         if (inputrec->ePull != epullNO)
784         {
785             /* Initialize pull code */
786             init_pull(fplog,inputrec,nfile,fnm,mtop,cr,oenv,
787                       EI_DYNAMICS(inputrec->eI) && MASTER(cr),Flags);
788         }
789
790         constr = init_constraints(fplog,mtop,inputrec,ed,state,cr);
791
792         if (DOMAINDECOMP(cr))
793         {
794             dd_init_bondeds(fplog,cr->dd,mtop,vsite,constr,inputrec,
795                             Flags & MD_DDBONDCHECK,fr->cginfo_mb);
796
797             set_dd_parameters(fplog,cr->dd,dlb_scale,inputrec,fr,&ddbox);
798
799             setup_dd_grid(fplog,cr->dd);
800         }
801
802         /* Now do whatever the user wants us to do (how flexible...) */
803         integrator[inputrec->eI].func(fplog,cr,nfile,fnm,
804                                       oenv,bVerbose,bCompact,
805                                       nstglobalcomm,
806                                       vsite,constr,
807                                       nstepout,inputrec,mtop,
808                                       fcd,state,
809                                       mdatoms,nrnb,wcycle,ed,fr,
810                                       repl_ex_nst,repl_ex_seed,
811                                       membed,
812                                       cpt_period,max_hours,
813                                       deviceOptions,
814                                       Flags,
815                                       &runtime);
816
817         if (inputrec->ePull != epullNO)
818         {
819             finish_pull(fplog,inputrec->pull);
820         }
821     } 
822     else 
823     {
824         /* do PME only */
825         gmx_pmeonly(*pmedata,cr,nrnb,wcycle,ewaldcoeff,FALSE,inputrec);
826     }
827
828     if (EI_DYNAMICS(inputrec->eI) || EI_TPI(inputrec->eI))
829     {
830         /* Some timing stats */  
831         if (SIMMASTER(cr))
832         {
833             if (runtime.proc == 0)
834             {
835                 runtime.proc = runtime.real;
836             }
837         }
838         else
839         {
840             runtime.real = 0;
841         }
842     }
843
844     wallcycle_stop(wcycle,ewcRUN);
845
846     /* Finish up, write some stuff
847      * if rerunMD, don't write last frame again 
848      */
849     finish_run(fplog,cr,ftp2fn(efSTO,nfile,fnm),
850                inputrec,nrnb,wcycle,&runtime,
851                EI_DYNAMICS(inputrec->eI) && !MULTISIM(cr));
852     
853     if (opt2bSet("-membed",nfile,fnm))
854     {
855         sfree(membed);
856     }
857
858     /* Does what it says */  
859     print_date_and_time(fplog,cr->nodeid,"Finished mdrun",&runtime);
860
861     /* Close logfile already here if we were appending to it */
862     if (MASTER(cr) && (Flags & MD_APPENDFILES))
863     {
864         gmx_log_close(fplog);
865     }   
866
867     rc=(int)gmx_get_stop_condition();
868
869 #ifdef GMX_THREADS
870     /* we need to join all threads. The sub-threads join when they
871        exit this function, but the master thread needs to be told to 
872        wait for that. */
873     if (PAR(cr) && MASTER(cr))
874     {
875         tMPI_Finalize();
876     }
877 #endif
878
879     return rc;
880 }
881
882 void md_print_warning(const t_commrec *cr,FILE *fplog,const char *buf)
883 {
884     if (MASTER(cr))
885     {
886         fprintf(stderr,"\n%s\n",buf);
887     }
888     if (fplog)
889     {
890         fprintf(fplog,"\n%s\n",buf);
891     }
892 }