Merge branch 'rotation-4-5' into rotation
[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 "pull_rotation.h"
76 #include "gmx_membed.h"
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     char *env;
260
261     nthreads = nthreads_requested;
262
263     /* determine # of hardware threads. */
264     if (nthreads_requested < 1)
265     {
266         if ((env = getenv("GMX_MAX_THREADS")) != NULL)
267         {
268             nthreads = 0;
269             sscanf(env,"%d",&nthreads);
270             if (nthreads < 1)
271             {
272                 gmx_fatal(FARGS,"GMX_MAX_THREADS (%d) should be larger than 0",
273                           nthreads);
274             }
275         }
276         else
277         {
278             nthreads = tMPI_Get_recommended_nthreads();
279         }
280     }
281
282     if (inputrec->eI == eiNM || EI_TPI(inputrec->eI))
283     {
284         /* Steps are divided over the nodes iso splitting the atoms */
285         min_atoms_per_thread = 0;
286     }
287     else
288     {
289         min_atoms_per_thread = MIN_ATOMS_PER_THREAD;
290     }
291
292     /* Check if an algorithm does not support parallel simulation.  */
293     if (nthreads != 1 && 
294         ( inputrec->eI == eiLBFGS ||
295           inputrec->coulombtype == eelEWALD ) )
296     {
297         fprintf(stderr,"\nThe integration or electrostatics algorithm doesn't support parallel runs. Not starting any threads.\n");
298         nthreads = 1;
299     }
300     else if (nthreads_requested < 1 &&
301              mtop->natoms/nthreads < min_atoms_per_thread)
302     {
303         /* the thread number was chosen automatically, but there are too many
304            threads (too few atoms per thread) */
305         nthreads_new = max(1,mtop->natoms/min_atoms_per_thread);
306
307         if (nthreads_new > 8 || (nthreads == 8 && nthreads_new > 4))
308         {
309             /* Use only multiples of 4 above 8 threads
310              * or with an 8-core processor
311              * (to avoid 6 threads on 8 core processors with 4 real cores).
312              */
313             nthreads_new = (nthreads_new/4)*4;
314         }
315         else if (nthreads_new > 4)
316         {
317             /* Avoid 5 or 7 threads */
318             nthreads_new = (nthreads_new/2)*2;
319         }
320
321         nthreads = nthreads_new;
322
323         fprintf(stderr,"\n");
324         fprintf(stderr,"NOTE: Parallelization is limited by the small number of atoms,\n");
325         fprintf(stderr,"      only starting %d threads.\n",nthreads);
326         fprintf(stderr,"      You can use the -nt option to optimize the number of threads.\n\n");
327     }
328     return nthreads;
329 }
330 #endif
331
332
333 int mdrunner(int nthreads_requested, FILE *fplog,t_commrec *cr,int nfile,
334              const t_filenm fnm[], const output_env_t oenv, gmx_bool bVerbose,
335              gmx_bool bCompact, int nstglobalcomm,
336              ivec ddxyz,int dd_node_order,real rdd,real rconstr,
337              const char *dddlb_opt,real dlb_scale,
338              const char *ddcsx,const char *ddcsy,const char *ddcsz,
339              int nstepout,int resetstep,int nmultisim,int repl_ex_nst,
340              int repl_ex_seed, real pforce,real cpt_period,real max_hours,
341              const char *deviceOptions, unsigned long Flags)
342 {
343     double     nodetime=0,realtime;
344     t_inputrec *inputrec;
345     t_state    *state=NULL;
346     matrix     box;
347     gmx_ddbox_t ddbox={0};
348     int        npme_major,npme_minor;
349     real       tmpr1,tmpr2;
350     t_nrnb     *nrnb;
351     gmx_mtop_t *mtop=NULL;
352     t_mdatoms  *mdatoms=NULL;
353     t_forcerec *fr=NULL;
354     t_fcdata   *fcd=NULL;
355     real       ewaldcoeff=0;
356     gmx_pme_t  *pmedata=NULL;
357     gmx_vsite_t *vsite=NULL;
358     gmx_constr_t constr;
359     int        i,m,nChargePerturbed=-1,status,nalloc;
360     char       *gro;
361     gmx_wallcycle_t wcycle;
362     gmx_bool       bReadRNG,bReadEkin;
363     int        list;
364     gmx_runtime_t runtime;
365     int        rc;
366     gmx_large_int_t reset_counters;
367     gmx_edsam_t ed=NULL;
368     t_commrec   *cr_old=cr; 
369     int         nthreads=1;
370     gmx_membed_t *membed=NULL;
371
372     /* CAUTION: threads may be started later on in this function, so
373        cr doesn't reflect the final parallel state right now */
374     snew(inputrec,1);
375     snew(mtop,1);
376
377     if (bVerbose && SIMMASTER(cr))
378     {
379         fprintf(stderr,"Getting Loaded...\n");
380     }
381     
382     if (Flags & MD_APPENDFILES) 
383     {
384         fplog = NULL;
385     }
386
387     snew(state,1);
388     if (MASTER(cr)) 
389     {
390         /* Read (nearly) all data required for the simulation */
391         read_tpx_state(ftp2fn(efTPX,nfile,fnm),inputrec,state,NULL,mtop);
392
393         /* NOW the threads will be started: */
394 #ifdef GMX_THREADS
395         nthreads = get_nthreads(nthreads_requested, inputrec, mtop);
396
397         if (nthreads > 1)
398         {
399             /* now start the threads. */
400             cr=mdrunner_start_threads(nthreads, fplog, cr_old, nfile, fnm, 
401                                       oenv, bVerbose, bCompact, nstglobalcomm, 
402                                       ddxyz, dd_node_order, rdd, rconstr, 
403                                       dddlb_opt, dlb_scale, ddcsx, ddcsy, ddcsz,
404                                       nstepout, resetstep, nmultisim, 
405                                       repl_ex_nst, repl_ex_seed, pforce, 
406                                       cpt_period, max_hours, deviceOptions, 
407                                       Flags);
408             /* the main thread continues here with a new cr. We don't deallocate
409                the old cr because other threads may still be reading it. */
410             if (cr == NULL)
411             {
412                 gmx_comm("Failed to spawn threads");
413             }
414         }
415 #endif
416     }
417     /* END OF CAUTION: cr is now reliable */
418
419     /* g_membed initialisation *
420      * Because we change the mtop, init_membed is called before the init_parallel *
421      * (in case we ever want to make it run in parallel) */
422     if (opt2bSet("-membed",nfile,fnm))
423     {
424         fprintf(stderr,"Entering membed code");
425         snew(membed,1);
426         init_membed(fplog,membed,nfile,fnm,mtop,inputrec,state,cr,&cpt_period);
427     }
428
429     if (PAR(cr))
430     {
431         /* now broadcast everything to the non-master nodes/threads: */
432         init_parallel(fplog, cr, inputrec, mtop);
433     }
434     if (fplog != NULL)
435     {
436         pr_inputrec(fplog,0,"Input Parameters",inputrec,FALSE);
437     }
438
439     /* now make sure the state is initialized and propagated */
440     set_state_entries(state,inputrec,cr->nnodes);
441
442     /* A parallel command line option consistency check that we can
443        only do after any threads have started. */
444     if (!PAR(cr) &&
445         (ddxyz[XX] > 1 || ddxyz[YY] > 1 || ddxyz[ZZ] > 1 || cr->npmenodes > 0))
446     {
447         gmx_fatal(FARGS,
448                   "The -dd or -npme option request a parallel simulation, "
449 #ifndef GMX_MPI
450                   "but mdrun was compiled without threads or MPI enabled"
451 #else
452 #ifdef GMX_THREADS
453                   "but the number of threads (option -nt) is 1"
454 #else
455                   "but mdrun was not started through mpirun/mpiexec or only one process was requested through mpirun/mpiexec" 
456 #endif
457 #endif
458             );
459     }
460
461     if (can_use_allvsall(inputrec,mtop,TRUE,cr,fplog))
462     {
463         /* All-vs-all loops do not work with domain decomposition */
464         Flags |= MD_PARTDEC;
465     }
466
467     if (!EEL_PME(inputrec->coulombtype) || (Flags & MD_PARTDEC))
468     {
469         cr->npmenodes = 0;
470     }
471
472 #ifdef GMX_FAHCORE
473     fcRegisterSteps(inputrec->nsteps,inputrec->init_step);
474 #endif
475
476     /* NMR restraints must be initialized before load_checkpoint,
477      * since with time averaging the history is added to t_state.
478      * For proper consistency check we therefore need to extend
479      * t_state here.
480      * So the PME-only nodes (if present) will also initialize
481      * the distance restraints.
482      */
483     snew(fcd,1);
484
485     /* This needs to be called before read_checkpoint to extend the state */
486     init_disres(fplog,mtop,inputrec,cr,Flags & MD_PARTDEC,fcd,state);
487
488     if (gmx_mtop_ftype_count(mtop,F_ORIRES) > 0)
489     {
490         if (PAR(cr) && !(Flags & MD_PARTDEC))
491         {
492             gmx_fatal(FARGS,"Orientation restraints do not work (yet) with domain decomposition, use particle decomposition (mdrun option -pd)");
493         }
494         /* Orientation restraints */
495         if (MASTER(cr))
496         {
497             init_orires(fplog,mtop,state->x,inputrec,cr->ms,&(fcd->orires),
498                         state);
499         }
500     }
501
502     if (DEFORM(*inputrec))
503     {
504         /* Store the deform reference box before reading the checkpoint */
505         if (SIMMASTER(cr))
506         {
507             copy_mat(state->box,box);
508         }
509         if (PAR(cr))
510         {
511             gmx_bcast(sizeof(box),box,cr);
512         }
513         /* Because we do not have the update struct available yet
514          * in which the reference values should be stored,
515          * we store them temporarily in static variables.
516          * This should be thread safe, since they are only written once
517          * and with identical values.
518          */
519 #ifdef GMX_THREADS
520         tMPI_Thread_mutex_lock(&deform_init_box_mutex);
521 #endif
522         deform_init_init_step_tpx = inputrec->init_step;
523         copy_mat(box,deform_init_box_tpx);
524 #ifdef GMX_THREADS
525         tMPI_Thread_mutex_unlock(&deform_init_box_mutex);
526 #endif
527     }
528
529     if (opt2bSet("-cpi",nfile,fnm)) 
530     {
531         /* Check if checkpoint file exists before doing continuation.
532          * This way we can use identical input options for the first and subsequent runs...
533          */
534         if( gmx_fexist_master(opt2fn_master("-cpi",nfile,fnm,cr),cr) )
535         {
536             load_checkpoint(opt2fn_master("-cpi",nfile,fnm,cr),&fplog,
537                             cr,Flags & MD_PARTDEC,ddxyz,
538                             inputrec,state,&bReadRNG,&bReadEkin,
539                             (Flags & MD_APPENDFILES));
540             
541             if (bReadRNG)
542             {
543                 Flags |= MD_READ_RNG;
544             }
545             if (bReadEkin)
546             {
547                 Flags |= MD_READ_EKIN;
548             }
549         }
550     }
551
552     if (((MASTER(cr) || (Flags & MD_SEPPOT)) && (Flags & MD_APPENDFILES))
553 #ifdef GMX_THREADS
554         /* With thread MPI only the master node/thread exists in mdrun.c,
555          * therefore non-master nodes need to open the "seppot" log file here.
556          */
557         || (!MASTER(cr) && (Flags & MD_SEPPOT))
558 #endif
559         )
560     {
561         gmx_log_open(ftp2fn(efLOG,nfile,fnm),cr,!(Flags & MD_SEPPOT),
562                              Flags,&fplog);
563     }
564
565     if (SIMMASTER(cr)) 
566     {
567         copy_mat(state->box,box);
568     }
569
570     if (PAR(cr)) 
571     {
572         gmx_bcast(sizeof(box),box,cr);
573     }
574
575     /* Essential dynamics */
576     if (opt2bSet("-ei",nfile,fnm))
577     {
578         /* Open input and output files, allocate space for ED data structure */
579         ed = ed_open(nfile,fnm,Flags,cr);
580     }
581
582     if (bVerbose && SIMMASTER(cr))
583     {
584         fprintf(stderr,"Loaded with Money\n\n");
585     }
586
587     if (PAR(cr) && !((Flags & MD_PARTDEC) ||
588                      EI_TPI(inputrec->eI) ||
589                      inputrec->eI == eiNM))
590     {
591         cr->dd = init_domain_decomposition(fplog,cr,Flags,ddxyz,rdd,rconstr,
592                                            dddlb_opt,dlb_scale,
593                                            ddcsx,ddcsy,ddcsz,
594                                            mtop,inputrec,
595                                            box,state->x,
596                                            &ddbox,&npme_major,&npme_minor);
597
598         make_dd_communicators(fplog,cr,dd_node_order);
599
600         /* Set overallocation to avoid frequent reallocation of arrays */
601         set_over_alloc_dd(TRUE);
602     }
603     else
604     {
605         /* PME, if used, is done on all nodes with 1D decomposition */
606         cr->npmenodes = 0;
607         cr->duty = (DUTY_PP | DUTY_PME);
608         npme_major = cr->nnodes;
609         npme_minor = 1;
610         
611         if (inputrec->ePBC == epbcSCREW)
612         {
613             gmx_fatal(FARGS,
614                       "pbc=%s is only implemented with domain decomposition",
615                       epbc_names[inputrec->ePBC]);
616         }
617     }
618
619     if (PAR(cr))
620     {
621         /* After possible communicator splitting in make_dd_communicators.
622          * we can set up the intra/inter node communication.
623          */
624         gmx_setup_nodecomm(fplog,cr);
625     }
626
627     wcycle = wallcycle_init(fplog,resetstep,cr);
628     if (PAR(cr))
629     {
630         /* Master synchronizes its value of reset_counters with all nodes 
631          * including PME only nodes */
632         reset_counters = wcycle_get_reset_counters(wcycle);
633         gmx_bcast_sim(sizeof(reset_counters),&reset_counters,cr);
634         wcycle_set_reset_counters(wcycle, reset_counters);
635     }
636
637
638     snew(nrnb,1);
639     if (cr->duty & DUTY_PP)
640     {
641         /* For domain decomposition we allocate dynamically
642          * in dd_partition_system.
643          */
644         if (DOMAINDECOMP(cr))
645         {
646             bcast_state_setup(cr,state);
647         }
648         else
649         {
650             if (PAR(cr))
651             {
652                 if (!MASTER(cr))
653                 {
654                     snew(state,1);
655                 }
656                 bcast_state(cr,state,TRUE);
657             }
658         }
659
660         /* Dihedral Restraints */
661         if (gmx_mtop_ftype_count(mtop,F_DIHRES) > 0)
662         {
663             init_dihres(fplog,mtop,inputrec,fcd);
664         }
665
666         /* Initiate forcerecord */
667         fr = mk_forcerec();
668         init_forcerec(fplog,oenv,fr,fcd,inputrec,mtop,cr,box,FALSE,
669                       opt2fn("-table",nfile,fnm),
670                       opt2fn("-tablep",nfile,fnm),
671                       opt2fn("-tableb",nfile,fnm),FALSE,pforce);
672
673         /* version for PCA_NOT_READ_NODE (see md.c) */
674         /*init_forcerec(fplog,fr,fcd,inputrec,mtop,cr,box,FALSE,
675           "nofile","nofile","nofile",FALSE,pforce);
676           */        
677         fr->bSepDVDL = ((Flags & MD_SEPPOT) == MD_SEPPOT);
678
679         /* Initialize QM-MM */
680         if(fr->bQMMM)
681         {
682             init_QMMMrec(cr,box,mtop,inputrec,fr);
683         }
684
685         /* Initialize the mdatoms structure.
686          * mdatoms is not filled with atom data,
687          * as this can not be done now with domain decomposition.
688          */
689         mdatoms = init_mdatoms(fplog,mtop,inputrec->efep!=efepNO);
690
691         /* Initialize the virtual site communication */
692         vsite = init_vsite(mtop,cr);
693
694         calc_shifts(box,fr->shift_vec);
695
696         /* With periodic molecules the charge groups should be whole at start up
697          * and the virtual sites should not be far from their proper positions.
698          */
699         if (!inputrec->bContinuation && MASTER(cr) &&
700             !(inputrec->ePBC != epbcNONE && inputrec->bPeriodicMols))
701         {
702             /* Make molecules whole at start of run */
703             if (fr->ePBC != epbcNONE)
704             {
705                 do_pbc_first_mtop(fplog,inputrec->ePBC,box,mtop,state->x);
706             }
707             if (vsite)
708             {
709                 /* Correct initial vsite positions are required
710                  * for the initial distribution in the domain decomposition
711                  * and for the initial shell prediction.
712                  */
713                 construct_vsites_mtop(fplog,vsite,mtop,state->x);
714             }
715         }
716
717         /* Initiate PPPM if necessary */
718         if (fr->eeltype == eelPPPM)
719         {
720             if (mdatoms->nChargePerturbed)
721             {
722                 gmx_fatal(FARGS,"Free energy with %s is not implemented",
723                           eel_names[fr->eeltype]);
724             }
725             status = gmx_pppm_init(fplog,cr,oenv,FALSE,TRUE,box,
726                                    getenv("GMXGHAT"),inputrec, (Flags & MD_REPRODUCIBLE));
727             if (status != 0)
728             {
729                 gmx_fatal(FARGS,"Error %d initializing PPPM",status);
730             }
731         }
732
733         if (EEL_PME(fr->eeltype))
734         {
735             ewaldcoeff = fr->ewaldcoeff;
736             pmedata = &fr->pmedata;
737         }
738         else
739         {
740             pmedata = NULL;
741         }
742     }
743     else
744     {
745         /* This is a PME only node */
746
747         /* We don't need the state */
748         done_state(state);
749
750         ewaldcoeff = calc_ewaldcoeff(inputrec->rcoulomb, inputrec->ewald_rtol);
751         snew(pmedata,1);
752     }
753
754     /* Initiate PME if necessary,
755      * either on all nodes or on dedicated PME nodes only. */
756     if (EEL_PME(inputrec->coulombtype))
757     {
758         if (mdatoms)
759         {
760             nChargePerturbed = mdatoms->nChargePerturbed;
761         }
762         if (cr->npmenodes > 0)
763         {
764             /* The PME only nodes need to know nChargePerturbed */
765             gmx_bcast_sim(sizeof(nChargePerturbed),&nChargePerturbed,cr);
766         }
767         if (cr->duty & DUTY_PME)
768         {
769             status = gmx_pme_init(pmedata,cr,npme_major,npme_minor,inputrec,
770                                   mtop ? mtop->natoms : 0,nChargePerturbed,
771                                   (Flags & MD_REPRODUCIBLE));
772             if (status != 0) 
773             {
774                 gmx_fatal(FARGS,"Error %d initializing PME",status);
775             }
776         }
777     }
778
779
780     if (integrator[inputrec->eI].func == do_md
781 #ifdef GMX_OPENMM
782         ||
783         integrator[inputrec->eI].func == do_md_openmm
784 #endif
785         )
786     {
787         /* Turn on signal handling on all nodes */
788         /*
789          * (A user signal from the PME nodes (if any)
790          * is communicated to the PP nodes.
791          */
792         signal_handler_install();
793     }
794
795     if (cr->duty & DUTY_PP)
796     {
797         if (inputrec->ePull != epullNO)
798         {
799             /* Initialize pull code */
800             init_pull(fplog,inputrec,nfile,fnm,mtop,cr,oenv,
801                       EI_DYNAMICS(inputrec->eI) && MASTER(cr),Flags);
802         }
803         
804         if (inputrec->bRot)
805         {
806            /* Initialize enforced rotation code */
807            init_rot(fplog,inputrec,nfile,fnm,cr,state->x,state->box,mtop,oenv,
808                     bVerbose,Flags);
809         }
810
811         constr = init_constraints(fplog,mtop,inputrec,ed,state,cr);
812
813         if (DOMAINDECOMP(cr))
814         {
815             dd_init_bondeds(fplog,cr->dd,mtop,vsite,constr,inputrec,
816                             Flags & MD_DDBONDCHECK,fr->cginfo_mb);
817
818             set_dd_parameters(fplog,cr->dd,dlb_scale,inputrec,fr,&ddbox);
819
820             setup_dd_grid(fplog,cr->dd);
821         }
822
823         /* Now do whatever the user wants us to do (how flexible...) */
824         integrator[inputrec->eI].func(fplog,cr,nfile,fnm,
825                                       oenv,bVerbose,bCompact,
826                                       nstglobalcomm,
827                                       vsite,constr,
828                                       nstepout,inputrec,mtop,
829                                       fcd,state,
830                                       mdatoms,nrnb,wcycle,ed,fr,
831                                       repl_ex_nst,repl_ex_seed,
832                                       membed,
833                                       cpt_period,max_hours,
834                                       deviceOptions,
835                                       Flags,
836                                       &runtime);
837
838         if (inputrec->ePull != epullNO)
839         {
840             finish_pull(fplog,inputrec->pull);
841         }
842         
843         if (inputrec->bRot)
844         {
845             finish_rot(fplog,inputrec->rot);
846         }
847
848     } 
849     else 
850     {
851         /* do PME only */
852         gmx_pmeonly(*pmedata,cr,nrnb,wcycle,ewaldcoeff,FALSE,inputrec);
853     }
854
855     if (EI_DYNAMICS(inputrec->eI) || EI_TPI(inputrec->eI))
856     {
857         /* Some timing stats */  
858         if (SIMMASTER(cr))
859         {
860             if (runtime.proc == 0)
861             {
862                 runtime.proc = runtime.real;
863             }
864         }
865         else
866         {
867             runtime.real = 0;
868         }
869     }
870
871     wallcycle_stop(wcycle,ewcRUN);
872
873     /* Finish up, write some stuff
874      * if rerunMD, don't write last frame again 
875      */
876     finish_run(fplog,cr,ftp2fn(efSTO,nfile,fnm),
877                inputrec,nrnb,wcycle,&runtime,
878                EI_DYNAMICS(inputrec->eI) && !MULTISIM(cr));
879     
880     if (opt2bSet("-membed",nfile,fnm))
881     {
882         sfree(membed);
883     }
884
885     /* Does what it says */  
886     print_date_and_time(fplog,cr->nodeid,"Finished mdrun",&runtime);
887
888     /* Close logfile already here if we were appending to it */
889     if (MASTER(cr) && (Flags & MD_APPENDFILES))
890     {
891         gmx_log_close(fplog);
892     }   
893
894     rc=(int)gmx_get_stop_condition();
895
896 #ifdef GMX_THREADS
897     /* we need to join all threads. The sub-threads join when they
898        exit this function, but the master thread needs to be told to 
899        wait for that. */
900     if (PAR(cr) && MASTER(cr))
901     {
902         tMPI_Finalize();
903     }
904 #endif
905
906     return rc;
907 }
908
909 void md_print_warning(const t_commrec *cr,FILE *fplog,const char *buf)
910 {
911     if (MASTER(cr))
912     {
913         fprintf(stderr,"\n%s\n",buf);
914     }
915     if (fplog)
916     {
917         fprintf(fplog,"\n%s\n",buf);
918     }
919 }