Free-energy support for LJ-PME
[alexxy/gromacs.git] / src / gromacs / gmxpreprocess / grompp.c
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) 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 "grompp.h"
38
39 #ifdef HAVE_CONFIG_H
40 #include <config.h>
41 #endif
42
43 #include <sys/types.h>
44 #include <math.h>
45 #include <string.h>
46 #include <errno.h>
47 #include <limits.h>
48 #include <assert.h>
49
50 #include "sysstuff.h"
51 #include "smalloc.h"
52 #include "macros.h"
53 #include "string2.h"
54 #include "readir.h"
55 #include "toputil.h"
56 #include "topio.h"
57 #include "gromacs/fileio/confio.h"
58 #include "readir.h"
59 #include "symtab.h"
60 #include "names.h"
61 #include "grompp-impl.h"
62 #include "gromacs/random/random.h"
63 #include "gromacs/gmxpreprocess/gen_maxwell_velocities.h"
64 #include "vec.h"
65 #include "gromacs/fileio/futil.h"
66 #include "gromacs/commandline/pargs.h"
67 #include "splitter.h"
68 #include "gromacs/gmxpreprocess/sortwater.h"
69 #include "convparm.h"
70 #include "gmx_fatal.h"
71 #include "warninp.h"
72 #include "index.h"
73 #include "gromacs/fileio/gmxfio.h"
74 #include "gromacs/fileio/trnio.h"
75 #include "gromacs/fileio/tpxio.h"
76 #include "gromacs/fileio/trxio.h"
77 #include "vsite_parm.h"
78 #include "txtdump.h"
79 #include "calcgrid.h"
80 #include "add_par.h"
81 #include "gromacs/fileio/enxio.h"
82 #include "perf_est.h"
83 #include "compute_io.h"
84 #include "gpp_atomtype.h"
85 #include "mtop_util.h"
86 #include "genborn.h"
87 #include "calc_verletbuf.h"
88 #include "tomorse.h"
89 #include "gromacs/imd/imd.h"
90
91
92 static int rm_interactions(int ifunc, int nrmols, t_molinfo mols[])
93 {
94     int  i, n;
95
96     n = 0;
97     /* For all the molecule types */
98     for (i = 0; i < nrmols; i++)
99     {
100         n += mols[i].plist[ifunc].nr;
101         mols[i].plist[ifunc].nr = 0;
102     }
103     return n;
104 }
105
106 static int check_atom_names(const char *fn1, const char *fn2,
107                             gmx_mtop_t *mtop, t_atoms *at)
108 {
109     int      mb, m, i, j, nmismatch;
110     t_atoms *tat;
111 #define MAXMISMATCH 20
112
113     if (mtop->natoms != at->nr)
114     {
115         gmx_incons("comparing atom names");
116     }
117
118     nmismatch = 0;
119     i         = 0;
120     for (mb = 0; mb < mtop->nmolblock; mb++)
121     {
122         tat = &mtop->moltype[mtop->molblock[mb].type].atoms;
123         for (m = 0; m < mtop->molblock[mb].nmol; m++)
124         {
125             for (j = 0; j < tat->nr; j++)
126             {
127                 if (strcmp( *(tat->atomname[j]), *(at->atomname[i]) ) != 0)
128                 {
129                     if (nmismatch < MAXMISMATCH)
130                     {
131                         fprintf(stderr,
132                                 "Warning: atom name %d in %s and %s does not match (%s - %s)\n",
133                                 i+1, fn1, fn2, *(tat->atomname[j]), *(at->atomname[i]));
134                     }
135                     else if (nmismatch == MAXMISMATCH)
136                     {
137                         fprintf(stderr, "(more than %d non-matching atom names)\n", MAXMISMATCH);
138                     }
139                     nmismatch++;
140                 }
141                 i++;
142             }
143         }
144     }
145
146     return nmismatch;
147 }
148
149 static void check_eg_vs_cg(gmx_mtop_t *mtop)
150 {
151     int            astart, mb, m, cg, j, firstj;
152     unsigned char  firsteg, eg;
153     gmx_moltype_t *molt;
154
155     /* Go through all the charge groups and make sure all their
156      * atoms are in the same energy group.
157      */
158
159     astart = 0;
160     for (mb = 0; mb < mtop->nmolblock; mb++)
161     {
162         molt = &mtop->moltype[mtop->molblock[mb].type];
163         for (m = 0; m < mtop->molblock[mb].nmol; m++)
164         {
165             for (cg = 0; cg < molt->cgs.nr; cg++)
166             {
167                 /* Get the energy group of the first atom in this charge group */
168                 firstj  = astart + molt->cgs.index[cg];
169                 firsteg = ggrpnr(&mtop->groups, egcENER, firstj);
170                 for (j = molt->cgs.index[cg]+1; j < molt->cgs.index[cg+1]; j++)
171                 {
172                     eg = ggrpnr(&mtop->groups, egcENER, astart+j);
173                     if (eg != firsteg)
174                     {
175                         gmx_fatal(FARGS, "atoms %d and %d in charge group %d of molecule type '%s' are in different energy groups",
176                                   firstj+1, astart+j+1, cg+1, *molt->name);
177                     }
178                 }
179             }
180             astart += molt->atoms.nr;
181         }
182     }
183 }
184
185 static void check_cg_sizes(const char *topfn, t_block *cgs, warninp_t wi)
186 {
187     int  maxsize, cg;
188     char warn_buf[STRLEN];
189
190     maxsize = 0;
191     for (cg = 0; cg < cgs->nr; cg++)
192     {
193         maxsize = max(maxsize, cgs->index[cg+1]-cgs->index[cg]);
194     }
195
196     if (maxsize > MAX_CHARGEGROUP_SIZE)
197     {
198         gmx_fatal(FARGS, "The largest charge group contains %d atoms. The maximum is %d.", maxsize, MAX_CHARGEGROUP_SIZE);
199     }
200     else if (maxsize > 10)
201     {
202         set_warning_line(wi, topfn, -1);
203         sprintf(warn_buf,
204                 "The largest charge group contains %d atoms.\n"
205                 "Since atoms only see each other when the centers of geometry of the charge groups they belong to are within the cut-off distance, too large charge groups can lead to serious cut-off artifacts.\n"
206                 "For efficiency and accuracy, charge group should consist of a few atoms.\n"
207                 "For all-atom force fields use: CH3, CH2, CH, NH2, NH, OH, CO2, CO, etc.",
208                 maxsize);
209         warning_note(wi, warn_buf);
210     }
211 }
212
213 static void check_bonds_timestep(gmx_mtop_t *mtop, double dt, warninp_t wi)
214 {
215     /* This check is not intended to ensure accurate integration,
216      * rather it is to signal mistakes in the mdp settings.
217      * A common mistake is to forget to turn on constraints
218      * for MD after energy minimization with flexible bonds.
219      * This check can also detect too large time steps for flexible water
220      * models, but such errors will often be masked by the constraints
221      * mdp options, which turns flexible water into water with bond constraints,
222      * but without an angle constraint. Unfortunately such incorrect use
223      * of water models can not easily be detected without checking
224      * for specific model names.
225      *
226      * The stability limit of leap-frog or velocity verlet is 4.44 steps
227      * per oscillational period.
228      * But accurate bonds distributions are lost far before that limit.
229      * To allow relatively common schemes (although not common with Gromacs)
230      * of dt=1 fs without constraints and dt=2 fs with only H-bond constraints
231      * we set the note limit to 10.
232      */
233     int            min_steps_warn = 5;
234     int            min_steps_note = 10;
235     t_iparams     *ip;
236     int            molt;
237     gmx_moltype_t *moltype, *w_moltype;
238     t_atom        *atom;
239     t_ilist       *ilist, *ilb, *ilc, *ils;
240     int            ftype;
241     int            i, a1, a2, w_a1, w_a2, j;
242     real           twopi2, limit2, fc, re, m1, m2, period2, w_period2;
243     gmx_bool       bFound, bWater, bWarn;
244     char           warn_buf[STRLEN];
245
246     ip = mtop->ffparams.iparams;
247
248     twopi2 = sqr(2*M_PI);
249
250     limit2 = sqr(min_steps_note*dt);
251
252     w_a1      = w_a2 = -1;
253     w_period2 = -1.0;
254
255     w_moltype = NULL;
256     for (molt = 0; molt < mtop->nmoltype; molt++)
257     {
258         moltype = &mtop->moltype[molt];
259         atom    = moltype->atoms.atom;
260         ilist   = moltype->ilist;
261         ilc     = &ilist[F_CONSTR];
262         ils     = &ilist[F_SETTLE];
263         for (ftype = 0; ftype < F_NRE; ftype++)
264         {
265             if (!(ftype == F_BONDS || ftype == F_G96BONDS || ftype == F_HARMONIC))
266             {
267                 continue;
268             }
269
270             ilb = &ilist[ftype];
271             for (i = 0; i < ilb->nr; i += 3)
272             {
273                 fc = ip[ilb->iatoms[i]].harmonic.krA;
274                 re = ip[ilb->iatoms[i]].harmonic.rA;
275                 if (ftype == F_G96BONDS)
276                 {
277                     /* Convert squared sqaure fc to harmonic fc */
278                     fc = 2*fc*re;
279                 }
280                 a1 = ilb->iatoms[i+1];
281                 a2 = ilb->iatoms[i+2];
282                 m1 = atom[a1].m;
283                 m2 = atom[a2].m;
284                 if (fc > 0 && m1 > 0 && m2 > 0)
285                 {
286                     period2 = twopi2*m1*m2/((m1 + m2)*fc);
287                 }
288                 else
289                 {
290                     period2 = GMX_FLOAT_MAX;
291                 }
292                 if (debug)
293                 {
294                     fprintf(debug, "fc %g m1 %g m2 %g period %g\n",
295                             fc, m1, m2, sqrt(period2));
296                 }
297                 if (period2 < limit2)
298                 {
299                     bFound = FALSE;
300                     for (j = 0; j < ilc->nr; j += 3)
301                     {
302                         if ((ilc->iatoms[j+1] == a1 && ilc->iatoms[j+2] == a2) ||
303                             (ilc->iatoms[j+1] == a2 && ilc->iatoms[j+2] == a1))
304                         {
305                             bFound = TRUE;
306                         }
307                     }
308                     for (j = 0; j < ils->nr; j += 4)
309                     {
310                         if ((a1 == ils->iatoms[j+1] || a1 == ils->iatoms[j+2] || a1 == ils->iatoms[j+3]) &&
311                             (a2 == ils->iatoms[j+1] || a2 == ils->iatoms[j+2] || a2 == ils->iatoms[j+3]))
312                         {
313                             bFound = TRUE;
314                         }
315                     }
316                     if (!bFound &&
317                         (w_moltype == NULL || period2 < w_period2))
318                     {
319                         w_moltype = moltype;
320                         w_a1      = a1;
321                         w_a2      = a2;
322                         w_period2 = period2;
323                     }
324                 }
325             }
326         }
327     }
328
329     if (w_moltype != NULL)
330     {
331         bWarn = (w_period2 < sqr(min_steps_warn*dt));
332         /* A check that would recognize most water models */
333         bWater = ((*w_moltype->atoms.atomname[0])[0] == 'O' &&
334                   w_moltype->atoms.nr <= 5);
335         sprintf(warn_buf, "The bond in molecule-type %s between atoms %d %s and %d %s has an estimated oscillational period of %.1e ps, which is less than %d times the time step of %.1e ps.\n"
336                 "%s",
337                 *w_moltype->name,
338                 w_a1+1, *w_moltype->atoms.atomname[w_a1],
339                 w_a2+1, *w_moltype->atoms.atomname[w_a2],
340                 sqrt(w_period2), bWarn ? min_steps_warn : min_steps_note, dt,
341                 bWater ?
342                 "Maybe you asked for fexible water." :
343                 "Maybe you forgot to change the constraints mdp option.");
344         if (bWarn)
345         {
346             warning(wi, warn_buf);
347         }
348         else
349         {
350             warning_note(wi, warn_buf);
351         }
352     }
353 }
354
355 static void check_vel(gmx_mtop_t *mtop, rvec v[])
356 {
357     gmx_mtop_atomloop_all_t aloop;
358     t_atom                 *atom;
359     int                     a;
360
361     aloop = gmx_mtop_atomloop_all_init(mtop);
362     while (gmx_mtop_atomloop_all_next(aloop, &a, &atom))
363     {
364         if (atom->ptype == eptShell ||
365             atom->ptype == eptBond  ||
366             atom->ptype == eptVSite)
367         {
368             clear_rvec(v[a]);
369         }
370     }
371 }
372
373 static gmx_bool nint_ftype(gmx_mtop_t *mtop, t_molinfo *mi, int ftype)
374 {
375     int nint, mb;
376
377     nint = 0;
378     for (mb = 0; mb < mtop->nmolblock; mb++)
379     {
380         nint += mtop->molblock[mb].nmol*mi[mtop->molblock[mb].type].plist[ftype].nr;
381     }
382
383     return nint;
384 }
385
386 /* This routine reorders the molecule type array
387  * in the order of use in the molblocks,
388  * unused molecule types are deleted.
389  */
390 static void renumber_moltypes(gmx_mtop_t *sys,
391                               int *nmolinfo, t_molinfo **molinfo)
392 {
393     int       *order, norder, i;
394     int        mb, mi;
395     t_molinfo *minew;
396
397     snew(order, *nmolinfo);
398     norder = 0;
399     for (mb = 0; mb < sys->nmolblock; mb++)
400     {
401         for (i = 0; i < norder; i++)
402         {
403             if (order[i] == sys->molblock[mb].type)
404             {
405                 break;
406             }
407         }
408         if (i == norder)
409         {
410             /* This type did not occur yet, add it */
411             order[norder] = sys->molblock[mb].type;
412             /* Renumber the moltype in the topology */
413             norder++;
414         }
415         sys->molblock[mb].type = i;
416     }
417
418     /* We still need to reorder the molinfo structs */
419     snew(minew, norder);
420     for (mi = 0; mi < *nmolinfo; mi++)
421     {
422         for (i = 0; i < norder; i++)
423         {
424             if (order[i] == mi)
425             {
426                 break;
427             }
428         }
429         if (i == norder)
430         {
431             done_mi(&(*molinfo)[mi]);
432         }
433         else
434         {
435             minew[i] = (*molinfo)[mi];
436         }
437     }
438     sfree(*molinfo);
439
440     *nmolinfo = norder;
441     *molinfo  = minew;
442 }
443
444 static void molinfo2mtop(int nmi, t_molinfo *mi, gmx_mtop_t *mtop)
445 {
446     int            m;
447     gmx_moltype_t *molt;
448
449     mtop->nmoltype = nmi;
450     snew(mtop->moltype, nmi);
451     for (m = 0; m < nmi; m++)
452     {
453         molt        = &mtop->moltype[m];
454         molt->name  = mi[m].name;
455         molt->atoms = mi[m].atoms;
456         /* ilists are copied later */
457         molt->cgs   = mi[m].cgs;
458         molt->excls = mi[m].excls;
459     }
460 }
461
462 static void
463 new_status(const char *topfile, const char *topppfile, const char *confin,
464            t_gromppopts *opts, t_inputrec *ir, gmx_bool bZero,
465            gmx_bool bGenVel, gmx_bool bVerbose, t_state *state,
466            gpp_atomtype_t atype, gmx_mtop_t *sys,
467            int *nmi, t_molinfo **mi, t_params plist[],
468            int *comb, double *reppow, real *fudgeQQ,
469            gmx_bool bMorse,
470            warninp_t wi)
471 {
472     t_molinfo      *molinfo = NULL;
473     int             nmolblock;
474     gmx_molblock_t *molblock, *molbs;
475     t_atoms        *confat;
476     int             mb, i, nrmols, nmismatch;
477     char            buf[STRLEN];
478     gmx_bool        bGB = FALSE;
479     char            warn_buf[STRLEN];
480
481     init_mtop(sys);
482
483     /* Set gmx_boolean for GB */
484     if (ir->implicit_solvent)
485     {
486         bGB = TRUE;
487     }
488
489     /* TOPOLOGY processing */
490     sys->name = do_top(bVerbose, topfile, topppfile, opts, bZero, &(sys->symtab),
491                        plist, comb, reppow, fudgeQQ,
492                        atype, &nrmols, &molinfo, ir,
493                        &nmolblock, &molblock, bGB,
494                        wi);
495
496     sys->nmolblock = 0;
497     snew(sys->molblock, nmolblock);
498
499     sys->natoms = 0;
500     for (mb = 0; mb < nmolblock; mb++)
501     {
502         if (sys->nmolblock > 0 &&
503             molblock[mb].type == sys->molblock[sys->nmolblock-1].type)
504         {
505             /* Merge consecutive blocks with the same molecule type */
506             sys->molblock[sys->nmolblock-1].nmol += molblock[mb].nmol;
507             sys->natoms += molblock[mb].nmol*sys->molblock[sys->nmolblock-1].natoms_mol;
508         }
509         else if (molblock[mb].nmol > 0)
510         {
511             /* Add a new molblock to the topology */
512             molbs             = &sys->molblock[sys->nmolblock];
513             *molbs            = molblock[mb];
514             molbs->natoms_mol = molinfo[molbs->type].atoms.nr;
515             molbs->nposres_xA = 0;
516             molbs->nposres_xB = 0;
517             sys->natoms      += molbs->nmol*molbs->natoms_mol;
518             sys->nmolblock++;
519         }
520     }
521     if (sys->nmolblock == 0)
522     {
523         gmx_fatal(FARGS, "No molecules were defined in the system");
524     }
525
526     renumber_moltypes(sys, &nrmols, &molinfo);
527
528     if (bMorse)
529     {
530         convert_harmonics(nrmols, molinfo, atype);
531     }
532
533     if (ir->eDisre == edrNone)
534     {
535         i = rm_interactions(F_DISRES, nrmols, molinfo);
536         if (i > 0)
537         {
538             set_warning_line(wi, "unknown", -1);
539             sprintf(warn_buf, "disre = no, removed %d distance restraints", i);
540             warning_note(wi, warn_buf);
541         }
542     }
543     if (opts->bOrire == FALSE)
544     {
545         i = rm_interactions(F_ORIRES, nrmols, molinfo);
546         if (i > 0)
547         {
548             set_warning_line(wi, "unknown", -1);
549             sprintf(warn_buf, "orire = no, removed %d orientation restraints", i);
550             warning_note(wi, warn_buf);
551         }
552     }
553
554     /* Copy structures from msys to sys */
555     molinfo2mtop(nrmols, molinfo, sys);
556
557     gmx_mtop_finalize(sys);
558
559     /* COORDINATE file processing */
560     if (bVerbose)
561     {
562         fprintf(stderr, "processing coordinates...\n");
563     }
564
565     get_stx_coordnum(confin, &state->natoms);
566     if (state->natoms != sys->natoms)
567     {
568         gmx_fatal(FARGS, "number of coordinates in coordinate file (%s, %d)\n"
569                   "             does not match topology (%s, %d)",
570                   confin, state->natoms, topfile, sys->natoms);
571     }
572     else
573     {
574         /* make space for coordinates and velocities */
575         char title[STRLEN];
576         snew(confat, 1);
577         init_t_atoms(confat, state->natoms, FALSE);
578         init_state(state, state->natoms, 0, 0, 0, 0);
579         read_stx_conf(confin, title, confat, state->x, state->v, NULL, state->box);
580         /* This call fixes the box shape for runs with pressure scaling */
581         set_box_rel(ir, state);
582
583         nmismatch = check_atom_names(topfile, confin, sys, confat);
584         free_t_atoms(confat, TRUE);
585         sfree(confat);
586
587         if (nmismatch)
588         {
589             sprintf(buf, "%d non-matching atom name%s\n"
590                     "atom names from %s will be used\n"
591                     "atom names from %s will be ignored\n",
592                     nmismatch, (nmismatch == 1) ? "" : "s", topfile, confin);
593             warning(wi, buf);
594         }
595         if (bVerbose)
596         {
597             fprintf(stderr, "double-checking input for internal consistency...\n");
598         }
599         double_check(ir, state->box, nint_ftype(sys, molinfo, F_CONSTR), wi);
600     }
601
602     if (bGenVel)
603     {
604         real                   *mass;
605         gmx_mtop_atomloop_all_t aloop;
606         t_atom                 *atom;
607         unsigned int            useed;
608
609         snew(mass, state->natoms);
610         aloop = gmx_mtop_atomloop_all_init(sys);
611         while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
612         {
613             mass[i] = atom->m;
614         }
615
616         useed = opts->seed;
617         if (opts->seed == -1)
618         {
619             useed = (int)gmx_rng_make_seed();
620             fprintf(stderr, "Setting gen_seed to %u\n", useed);
621         }
622         maxwell_speed(opts->tempi, useed, sys, state->v);
623
624         stop_cm(stdout, state->natoms, mass, state->x, state->v);
625         sfree(mass);
626     }
627
628     *nmi = nrmols;
629     *mi  = molinfo;
630 }
631
632 static void copy_state(const char *slog, t_trxframe *fr,
633                        gmx_bool bReadVel, t_state *state,
634                        double *use_time)
635 {
636     int i;
637
638     if (fr->not_ok & FRAME_NOT_OK)
639     {
640         gmx_fatal(FARGS, "Can not start from an incomplete frame");
641     }
642     if (!fr->bX)
643     {
644         gmx_fatal(FARGS, "Did not find a frame with coordinates in file %s",
645                   slog);
646     }
647
648     for (i = 0; i < state->natoms; i++)
649     {
650         copy_rvec(fr->x[i], state->x[i]);
651     }
652     if (bReadVel)
653     {
654         if (!fr->bV)
655         {
656             gmx_incons("Trajecory frame unexpectedly does not contain velocities");
657         }
658         for (i = 0; i < state->natoms; i++)
659         {
660             copy_rvec(fr->v[i], state->v[i]);
661         }
662     }
663     if (fr->bBox)
664     {
665         copy_mat(fr->box, state->box);
666     }
667
668     *use_time = fr->time;
669 }
670
671 static void cont_status(const char *slog, const char *ener,
672                         gmx_bool bNeedVel, gmx_bool bGenVel, real fr_time,
673                         t_inputrec *ir, t_state *state,
674                         gmx_mtop_t *sys,
675                         const output_env_t oenv)
676 /* If fr_time == -1 read the last frame available which is complete */
677 {
678     gmx_bool     bReadVel;
679     t_trxframe   fr;
680     t_trxstatus *fp;
681     int          i;
682     double       use_time;
683
684     bReadVel = (bNeedVel && !bGenVel);
685
686     fprintf(stderr,
687             "Reading Coordinates%s and Box size from old trajectory\n",
688             bReadVel ? ", Velocities" : "");
689     if (fr_time == -1)
690     {
691         fprintf(stderr, "Will read whole trajectory\n");
692     }
693     else
694     {
695         fprintf(stderr, "Will read till time %g\n", fr_time);
696     }
697     if (!bReadVel)
698     {
699         if (bGenVel)
700         {
701             fprintf(stderr, "Velocities generated: "
702                     "ignoring velocities in input trajectory\n");
703         }
704         read_first_frame(oenv, &fp, slog, &fr, TRX_NEED_X);
705     }
706     else
707     {
708         read_first_frame(oenv, &fp, slog, &fr, TRX_NEED_X | TRX_NEED_V);
709
710         if (!fr.bV)
711         {
712             fprintf(stderr,
713                     "\n"
714                     "WARNING: Did not find a frame with velocities in file %s,\n"
715                     "         all velocities will be set to zero!\n\n", slog);
716             for (i = 0; i < sys->natoms; i++)
717             {
718                 clear_rvec(state->v[i]);
719             }
720             close_trj(fp);
721             /* Search for a frame without velocities */
722             bReadVel = FALSE;
723             read_first_frame(oenv, &fp, slog, &fr, TRX_NEED_X);
724         }
725     }
726
727     state->natoms = fr.natoms;
728
729     if (sys->natoms != state->natoms)
730     {
731         gmx_fatal(FARGS, "Number of atoms in Topology "
732                   "is not the same as in Trajectory");
733     }
734     copy_state(slog, &fr, bReadVel, state, &use_time);
735
736     /* Find the appropriate frame */
737     while ((fr_time == -1 || fr.time < fr_time) &&
738            read_next_frame(oenv, fp, &fr))
739     {
740         copy_state(slog, &fr, bReadVel, state, &use_time);
741     }
742
743     close_trj(fp);
744
745     /* Set the relative box lengths for preserving the box shape.
746      * Note that this call can lead to differences in the last bit
747      * with respect to using gmx convert-tpr to create a [TT].tpx[tt] file.
748      */
749     set_box_rel(ir, state);
750
751     fprintf(stderr, "Using frame at t = %g ps\n", use_time);
752     fprintf(stderr, "Starting time for run is %g ps\n", ir->init_t);
753
754     if ((ir->epc != epcNO  || ir->etc == etcNOSEHOOVER) && ener)
755     {
756         get_enx_state(ener, use_time, &sys->groups, ir, state);
757         preserve_box_shape(ir, state->box_rel, state->boxv);
758     }
759 }
760
761 static void read_posres(gmx_mtop_t *mtop, t_molinfo *molinfo, gmx_bool bTopB,
762                         char *fn,
763                         int rc_scaling, int ePBC,
764                         rvec com,
765                         warninp_t wi)
766 {
767     gmx_bool        bFirst = TRUE, *hadAtom;
768     rvec           *x, *v, *xp;
769     dvec            sum;
770     double          totmass;
771     t_atoms         dumat;
772     matrix          box, invbox;
773     int             natoms, npbcdim = 0;
774     char            warn_buf[STRLEN], title[STRLEN];
775     int             a, i, ai, j, k, mb, nat_molb;
776     gmx_molblock_t *molb;
777     t_params       *pr, *prfb;
778     t_atom         *atom;
779
780     get_stx_coordnum(fn, &natoms);
781     if (natoms != mtop->natoms)
782     {
783         sprintf(warn_buf, "The number of atoms in %s (%d) does not match the number of atoms in the topology (%d). Will assume that the first %d atoms in the topology and %s match.", fn, natoms, mtop->natoms, min(mtop->natoms, natoms), fn);
784         warning(wi, warn_buf);
785     }
786     snew(x, natoms);
787     snew(v, natoms);
788     init_t_atoms(&dumat, natoms, FALSE);
789     read_stx_conf(fn, title, &dumat, x, v, NULL, box);
790
791     npbcdim = ePBC2npbcdim(ePBC);
792     clear_rvec(com);
793     if (rc_scaling != erscNO)
794     {
795         copy_mat(box, invbox);
796         for (j = npbcdim; j < DIM; j++)
797         {
798             clear_rvec(invbox[j]);
799             invbox[j][j] = 1;
800         }
801         m_inv_ur0(invbox, invbox);
802     }
803
804     /* Copy the reference coordinates to mtop */
805     clear_dvec(sum);
806     totmass = 0;
807     a       = 0;
808     snew(hadAtom, natoms);
809     for (mb = 0; mb < mtop->nmolblock; mb++)
810     {
811         molb     = &mtop->molblock[mb];
812         nat_molb = molb->nmol*mtop->moltype[molb->type].atoms.nr;
813         pr       = &(molinfo[molb->type].plist[F_POSRES]);
814         prfb     = &(molinfo[molb->type].plist[F_FBPOSRES]);
815         if (pr->nr > 0 || prfb->nr > 0)
816         {
817             atom = mtop->moltype[molb->type].atoms.atom;
818             for (i = 0; (i < pr->nr); i++)
819             {
820                 ai = pr->param[i].AI;
821                 if (ai >= natoms)
822                 {
823                     gmx_fatal(FARGS, "Position restraint atom index (%d) in moltype '%s' is larger than number of atoms in %s (%d).\n",
824                               ai+1, *molinfo[molb->type].name, fn, natoms);
825                 }
826                 hadAtom[ai] = TRUE;
827                 if (rc_scaling == erscCOM)
828                 {
829                     /* Determine the center of mass of the posres reference coordinates */
830                     for (j = 0; j < npbcdim; j++)
831                     {
832                         sum[j] += atom[ai].m*x[a+ai][j];
833                     }
834                     totmass  += atom[ai].m;
835                 }
836             }
837             /* Same for flat-bottomed posres, but do not count an atom twice for COM */
838             for (i = 0; (i < prfb->nr); i++)
839             {
840                 ai = prfb->param[i].AI;
841                 if (ai >= natoms)
842                 {
843                     gmx_fatal(FARGS, "Position restraint atom index (%d) in moltype '%s' is larger than number of atoms in %s (%d).\n",
844                               ai+1, *molinfo[molb->type].name, fn, natoms);
845                 }
846                 if (rc_scaling == erscCOM && hadAtom[ai] == FALSE)
847                 {
848                     /* Determine the center of mass of the posres reference coordinates */
849                     for (j = 0; j < npbcdim; j++)
850                     {
851                         sum[j] += atom[ai].m*x[a+ai][j];
852                     }
853                     totmass  += atom[ai].m;
854                 }
855             }
856             if (!bTopB)
857             {
858                 molb->nposres_xA = nat_molb;
859                 snew(molb->posres_xA, molb->nposres_xA);
860                 for (i = 0; i < nat_molb; i++)
861                 {
862                     copy_rvec(x[a+i], molb->posres_xA[i]);
863                 }
864             }
865             else
866             {
867                 molb->nposres_xB = nat_molb;
868                 snew(molb->posres_xB, molb->nposres_xB);
869                 for (i = 0; i < nat_molb; i++)
870                 {
871                     copy_rvec(x[a+i], molb->posres_xB[i]);
872                 }
873             }
874         }
875         a += nat_molb;
876     }
877     if (rc_scaling == erscCOM)
878     {
879         if (totmass == 0)
880         {
881             gmx_fatal(FARGS, "The total mass of the position restraint atoms is 0");
882         }
883         for (j = 0; j < npbcdim; j++)
884         {
885             com[j] = sum[j]/totmass;
886         }
887         fprintf(stderr, "The center of mass of the position restraint coord's is %6.3f %6.3f %6.3f\n", com[XX], com[YY], com[ZZ]);
888     }
889
890     if (rc_scaling != erscNO)
891     {
892         assert(npbcdim <= DIM);
893
894         for (mb = 0; mb < mtop->nmolblock; mb++)
895         {
896             molb     = &mtop->molblock[mb];
897             nat_molb = molb->nmol*mtop->moltype[molb->type].atoms.nr;
898             if (molb->nposres_xA > 0 || molb->nposres_xB > 0)
899             {
900                 xp = (!bTopB ? molb->posres_xA : molb->posres_xB);
901                 for (i = 0; i < nat_molb; i++)
902                 {
903                     for (j = 0; j < npbcdim; j++)
904                     {
905                         if (rc_scaling == erscALL)
906                         {
907                             /* Convert from Cartesian to crystal coordinates */
908                             xp[i][j] *= invbox[j][j];
909                             for (k = j+1; k < npbcdim; k++)
910                             {
911                                 xp[i][j] += invbox[k][j]*xp[i][k];
912                             }
913                         }
914                         else if (rc_scaling == erscCOM)
915                         {
916                             /* Subtract the center of mass */
917                             xp[i][j] -= com[j];
918                         }
919                     }
920                 }
921             }
922         }
923
924         if (rc_scaling == erscCOM)
925         {
926             /* Convert the COM from Cartesian to crystal coordinates */
927             for (j = 0; j < npbcdim; j++)
928             {
929                 com[j] *= invbox[j][j];
930                 for (k = j+1; k < npbcdim; k++)
931                 {
932                     com[j] += invbox[k][j]*com[k];
933                 }
934             }
935         }
936     }
937
938     free_t_atoms(&dumat, TRUE);
939     sfree(x);
940     sfree(v);
941     sfree(hadAtom);
942 }
943
944 static void gen_posres(gmx_mtop_t *mtop, t_molinfo *mi,
945                        char *fnA, char *fnB,
946                        int rc_scaling, int ePBC,
947                        rvec com, rvec comB,
948                        warninp_t wi)
949 {
950     int i, j;
951
952     read_posres  (mtop, mi, FALSE, fnA, rc_scaling, ePBC, com, wi);
953     if (strcmp(fnA, fnB) != 0)
954     {
955         read_posres(mtop, mi, TRUE, fnB, rc_scaling, ePBC, comB, wi);
956     }
957 }
958
959 static void set_wall_atomtype(gpp_atomtype_t at, t_gromppopts *opts,
960                               t_inputrec *ir, warninp_t wi)
961 {
962     int  i;
963     char warn_buf[STRLEN];
964
965     if (ir->nwall > 0)
966     {
967         fprintf(stderr, "Searching the wall atom type(s)\n");
968     }
969     for (i = 0; i < ir->nwall; i++)
970     {
971         ir->wall_atomtype[i] = get_atomtype_type(opts->wall_atomtype[i], at);
972         if (ir->wall_atomtype[i] == NOTSET)
973         {
974             sprintf(warn_buf, "Specified wall atom type %s is not defined", opts->wall_atomtype[i]);
975             warning_error(wi, warn_buf);
976         }
977     }
978 }
979
980 static int nrdf_internal(t_atoms *atoms)
981 {
982     int i, nmass, nrdf;
983
984     nmass = 0;
985     for (i = 0; i < atoms->nr; i++)
986     {
987         /* Vsite ptype might not be set here yet, so also check the mass */
988         if ((atoms->atom[i].ptype == eptAtom ||
989              atoms->atom[i].ptype == eptNucleus)
990             && atoms->atom[i].m > 0)
991         {
992             nmass++;
993         }
994     }
995     switch (nmass)
996     {
997         case 0:  nrdf = 0; break;
998         case 1:  nrdf = 0; break;
999         case 2:  nrdf = 1; break;
1000         default: nrdf = nmass*3 - 6; break;
1001     }
1002
1003     return nrdf;
1004 }
1005
1006 void
1007 spline1d( double        dx,
1008           double *      y,
1009           int           n,
1010           double *      u,
1011           double *      y2 )
1012 {
1013     int    i;
1014     double p, q;
1015
1016     y2[0] = 0.0;
1017     u[0]  = 0.0;
1018
1019     for (i = 1; i < n-1; i++)
1020     {
1021         p     = 0.5*y2[i-1]+2.0;
1022         y2[i] = -0.5/p;
1023         q     = (y[i+1]-2.0*y[i]+y[i-1])/dx;
1024         u[i]  = (3.0*q/dx-0.5*u[i-1])/p;
1025     }
1026
1027     y2[n-1] = 0.0;
1028
1029     for (i = n-2; i >= 0; i--)
1030     {
1031         y2[i] = y2[i]*y2[i+1]+u[i];
1032     }
1033 }
1034
1035
1036 void
1037 interpolate1d( double     xmin,
1038                double     dx,
1039                double *   ya,
1040                double *   y2a,
1041                double     x,
1042                double *   y,
1043                double *   y1)
1044 {
1045     int    ix;
1046     double a, b;
1047
1048     ix = (x-xmin)/dx;
1049
1050     a = (xmin+(ix+1)*dx-x)/dx;
1051     b = (x-xmin-ix*dx)/dx;
1052
1053     *y  = a*ya[ix]+b*ya[ix+1]+((a*a*a-a)*y2a[ix]+(b*b*b-b)*y2a[ix+1])*(dx*dx)/6.0;
1054     *y1 = (ya[ix+1]-ya[ix])/dx-(3.0*a*a-1.0)/6.0*dx*y2a[ix]+(3.0*b*b-1.0)/6.0*dx*y2a[ix+1];
1055 }
1056
1057
1058 void
1059 setup_cmap (int              grid_spacing,
1060             int              nc,
1061             real *           grid,
1062             gmx_cmap_t *     cmap_grid)
1063 {
1064     double *tmp_u, *tmp_u2, *tmp_yy, *tmp_y1, *tmp_t2, *tmp_grid;
1065
1066     int     i, j, k, ii, jj, kk, idx;
1067     int     offset;
1068     double  dx, xmin, v, v1, v2, v12;
1069     double  phi, psi;
1070
1071     snew(tmp_u, 2*grid_spacing);
1072     snew(tmp_u2, 2*grid_spacing);
1073     snew(tmp_yy, 2*grid_spacing);
1074     snew(tmp_y1, 2*grid_spacing);
1075     snew(tmp_t2, 2*grid_spacing*2*grid_spacing);
1076     snew(tmp_grid, 2*grid_spacing*2*grid_spacing);
1077
1078     dx   = 360.0/grid_spacing;
1079     xmin = -180.0-dx*grid_spacing/2;
1080
1081     for (kk = 0; kk < nc; kk++)
1082     {
1083         /* Compute an offset depending on which cmap we are using
1084          * Offset will be the map number multiplied with the
1085          * grid_spacing * grid_spacing * 2
1086          */
1087         offset = kk * grid_spacing * grid_spacing * 2;
1088
1089         for (i = 0; i < 2*grid_spacing; i++)
1090         {
1091             ii = (i+grid_spacing-grid_spacing/2)%grid_spacing;
1092
1093             for (j = 0; j < 2*grid_spacing; j++)
1094             {
1095                 jj = (j+grid_spacing-grid_spacing/2)%grid_spacing;
1096                 tmp_grid[i*grid_spacing*2+j] = grid[offset+ii*grid_spacing+jj];
1097             }
1098         }
1099
1100         for (i = 0; i < 2*grid_spacing; i++)
1101         {
1102             spline1d(dx, &(tmp_grid[2*grid_spacing*i]), 2*grid_spacing, tmp_u, &(tmp_t2[2*grid_spacing*i]));
1103         }
1104
1105         for (i = grid_spacing/2; i < grid_spacing+grid_spacing/2; i++)
1106         {
1107             ii  = i-grid_spacing/2;
1108             phi = ii*dx-180.0;
1109
1110             for (j = grid_spacing/2; j < grid_spacing+grid_spacing/2; j++)
1111             {
1112                 jj  = j-grid_spacing/2;
1113                 psi = jj*dx-180.0;
1114
1115                 for (k = 0; k < 2*grid_spacing; k++)
1116                 {
1117                     interpolate1d(xmin, dx, &(tmp_grid[2*grid_spacing*k]),
1118                                   &(tmp_t2[2*grid_spacing*k]), psi, &tmp_yy[k], &tmp_y1[k]);
1119                 }
1120
1121                 spline1d(dx, tmp_yy, 2*grid_spacing, tmp_u, tmp_u2);
1122                 interpolate1d(xmin, dx, tmp_yy, tmp_u2, phi, &v, &v1);
1123                 spline1d(dx, tmp_y1, 2*grid_spacing, tmp_u, tmp_u2);
1124                 interpolate1d(xmin, dx, tmp_y1, tmp_u2, phi, &v2, &v12);
1125
1126                 idx = ii*grid_spacing+jj;
1127                 cmap_grid->cmapdata[kk].cmap[idx*4]   = grid[offset+ii*grid_spacing+jj];
1128                 cmap_grid->cmapdata[kk].cmap[idx*4+1] = v1;
1129                 cmap_grid->cmapdata[kk].cmap[idx*4+2] = v2;
1130                 cmap_grid->cmapdata[kk].cmap[idx*4+3] = v12;
1131             }
1132         }
1133     }
1134 }
1135
1136 void init_cmap_grid(gmx_cmap_t *cmap_grid, int ngrid, int grid_spacing)
1137 {
1138     int i, k, nelem;
1139
1140     cmap_grid->ngrid        = ngrid;
1141     cmap_grid->grid_spacing = grid_spacing;
1142     nelem                   = cmap_grid->grid_spacing*cmap_grid->grid_spacing;
1143
1144     snew(cmap_grid->cmapdata, ngrid);
1145
1146     for (i = 0; i < cmap_grid->ngrid; i++)
1147     {
1148         snew(cmap_grid->cmapdata[i].cmap, 4*nelem);
1149     }
1150 }
1151
1152
1153 static int count_constraints(gmx_mtop_t *mtop, t_molinfo *mi, warninp_t wi)
1154 {
1155     int             count, count_mol, i, mb;
1156     gmx_molblock_t *molb;
1157     t_params       *plist;
1158     char            buf[STRLEN];
1159
1160     count = 0;
1161     for (mb = 0; mb < mtop->nmolblock; mb++)
1162     {
1163         count_mol = 0;
1164         molb      = &mtop->molblock[mb];
1165         plist     = mi[molb->type].plist;
1166
1167         for (i = 0; i < F_NRE; i++)
1168         {
1169             if (i == F_SETTLE)
1170             {
1171                 count_mol += 3*plist[i].nr;
1172             }
1173             else if (interaction_function[i].flags & IF_CONSTRAINT)
1174             {
1175                 count_mol += plist[i].nr;
1176             }
1177         }
1178
1179         if (count_mol > nrdf_internal(&mi[molb->type].atoms))
1180         {
1181             sprintf(buf,
1182                     "Molecule type '%s' has %d constraints.\n"
1183                     "For stability and efficiency there should not be more constraints than internal number of degrees of freedom: %d.\n",
1184                     *mi[molb->type].name, count_mol,
1185                     nrdf_internal(&mi[molb->type].atoms));
1186             warning(wi, buf);
1187         }
1188         count += molb->nmol*count_mol;
1189     }
1190
1191     return count;
1192 }
1193
1194 static void check_gbsa_params_charged(gmx_mtop_t *sys, gpp_atomtype_t atype)
1195 {
1196     int            i, nmiss, natoms, mt;
1197     real           q;
1198     const t_atoms *atoms;
1199
1200     nmiss = 0;
1201     for (mt = 0; mt < sys->nmoltype; mt++)
1202     {
1203         atoms  = &sys->moltype[mt].atoms;
1204         natoms = atoms->nr;
1205
1206         for (i = 0; i < natoms; i++)
1207         {
1208             q = atoms->atom[i].q;
1209             if ((get_atomtype_radius(atoms->atom[i].type, atype)    == 0  ||
1210                  get_atomtype_vol(atoms->atom[i].type, atype)       == 0  ||
1211                  get_atomtype_surftens(atoms->atom[i].type, atype)  == 0  ||
1212                  get_atomtype_gb_radius(atoms->atom[i].type, atype) == 0  ||
1213                  get_atomtype_S_hct(atoms->atom[i].type, atype)     == 0) &&
1214                 q != 0)
1215             {
1216                 fprintf(stderr, "\nGB parameter(s) zero for atom type '%s' while charge is %g\n",
1217                         get_atomtype_name(atoms->atom[i].type, atype), q);
1218                 nmiss++;
1219             }
1220         }
1221     }
1222
1223     if (nmiss > 0)
1224     {
1225         gmx_fatal(FARGS, "Can't do GB electrostatics; the implicit_genborn_params section of the forcefield has parameters with value zero for %d atomtypes that occur as charged atoms.", nmiss);
1226     }
1227 }
1228
1229
1230 static void check_gbsa_params(gpp_atomtype_t atype)
1231 {
1232     int  nmiss, i;
1233
1234     /* If we are doing GBSA, check that we got the parameters we need
1235      * This checking is to see if there are GBSA paratmeters for all
1236      * atoms in the force field. To go around this for testing purposes
1237      * comment out the nerror++ counter temporarily
1238      */
1239     nmiss = 0;
1240     for (i = 0; i < get_atomtype_ntypes(atype); i++)
1241     {
1242         if (get_atomtype_radius(i, atype)    < 0 ||
1243             get_atomtype_vol(i, atype)       < 0 ||
1244             get_atomtype_surftens(i, atype)  < 0 ||
1245             get_atomtype_gb_radius(i, atype) < 0 ||
1246             get_atomtype_S_hct(i, atype)     < 0)
1247         {
1248             fprintf(stderr, "\nGB parameter(s) missing or negative for atom type '%s'\n",
1249                     get_atomtype_name(i, atype));
1250             nmiss++;
1251         }
1252     }
1253
1254     if (nmiss > 0)
1255     {
1256         gmx_fatal(FARGS, "Can't do GB electrostatics; the implicit_genborn_params section of the forcefield is missing parameters for %d atomtypes or they might be negative.", nmiss);
1257     }
1258
1259 }
1260
1261 static real calc_temp(const gmx_mtop_t *mtop,
1262                       const t_inputrec *ir,
1263                       rvec             *v)
1264 {
1265     double                  sum_mv2;
1266     gmx_mtop_atomloop_all_t aloop;
1267     t_atom                 *atom;
1268     int                     a;
1269     int                     nrdf, g;
1270
1271     sum_mv2 = 0;
1272
1273     aloop = gmx_mtop_atomloop_all_init(mtop);
1274     while (gmx_mtop_atomloop_all_next(aloop, &a, &atom))
1275     {
1276         sum_mv2 += atom->m*norm2(v[a]);
1277     }
1278
1279     nrdf = 0;
1280     for (g = 0; g < ir->opts.ngtc; g++)
1281     {
1282         nrdf += ir->opts.nrdf[g];
1283     }
1284
1285     return sum_mv2/(nrdf*BOLTZ);
1286 }
1287
1288 static real get_max_reference_temp(const t_inputrec *ir,
1289                                    warninp_t         wi)
1290 {
1291     real     ref_t;
1292     int      i;
1293     gmx_bool bNoCoupl;
1294
1295     ref_t    = 0;
1296     bNoCoupl = FALSE;
1297     for (i = 0; i < ir->opts.ngtc; i++)
1298     {
1299         if (ir->opts.tau_t[i] < 0)
1300         {
1301             bNoCoupl = TRUE;
1302         }
1303         else
1304         {
1305             ref_t = max(ref_t, ir->opts.ref_t[i]);
1306         }
1307     }
1308
1309     if (bNoCoupl)
1310     {
1311         char buf[STRLEN];
1312
1313         sprintf(buf, "Some temperature coupling groups do not use temperature coupling. We will assume their temperature is not more than %.3f K. If their temperature is higher, the energy error and the Verlet buffer might be underestimated.",
1314                 ref_t);
1315         warning(wi, buf);
1316     }
1317
1318     return ref_t;
1319 }
1320
1321 static void set_verlet_buffer(const gmx_mtop_t *mtop,
1322                               t_inputrec       *ir,
1323                               real              buffer_temp,
1324                               matrix            box,
1325                               warninp_t         wi)
1326 {
1327     int                    i;
1328     verletbuf_list_setup_t ls;
1329     real                   rlist_1x1;
1330     int                    n_nonlin_vsite;
1331     char                   warn_buf[STRLEN];
1332
1333     printf("Determining Verlet buffer for a tolerance of %g kJ/mol/ps at %g K\n", ir->verletbuf_tol, buffer_temp);
1334
1335     /* Calculate the buffer size for simple atom vs atoms list */
1336     ls.cluster_size_i = 1;
1337     ls.cluster_size_j = 1;
1338     calc_verlet_buffer_size(mtop, det(box), ir, buffer_temp,
1339                             &ls, &n_nonlin_vsite, &rlist_1x1);
1340
1341     /* Set the pair-list buffer size in ir */
1342     verletbuf_get_list_setup(FALSE, &ls);
1343     calc_verlet_buffer_size(mtop, det(box), ir, buffer_temp,
1344                             &ls, &n_nonlin_vsite, &ir->rlist);
1345
1346     if (n_nonlin_vsite > 0)
1347     {
1348         sprintf(warn_buf, "There are %d non-linear virtual site constructions. Their contribution to the energy error is approximated. In most cases this does not affect the error significantly.", n_nonlin_vsite);
1349         warning_note(wi, warn_buf);
1350     }
1351
1352     printf("Calculated rlist for %dx%d atom pair-list as %.3f nm, buffer size %.3f nm\n",
1353            1, 1, rlist_1x1, rlist_1x1-max(ir->rvdw, ir->rcoulomb));
1354
1355     ir->rlistlong = ir->rlist;
1356     printf("Set rlist, assuming %dx%d atom pair-list, to %.3f nm, buffer size %.3f nm\n",
1357            ls.cluster_size_i, ls.cluster_size_j,
1358            ir->rlist, ir->rlist-max(ir->rvdw, ir->rcoulomb));
1359
1360     if (sqr(ir->rlistlong) >= max_cutoff2(ir->ePBC, box))
1361     {
1362         gmx_fatal(FARGS, "The pair-list cut-off (%g nm) is longer than half the shortest box vector or longer than the smallest box diagonal element (%g nm). Increase the box size or decrease nstlist or increase verlet-buffer-tolerance.", ir->rlistlong, sqrt(max_cutoff2(ir->ePBC, box)));
1363     }
1364 }
1365
1366 int gmx_grompp(int argc, char *argv[])
1367 {
1368     static const char *desc[] = {
1369         "[THISMODULE] (the gromacs preprocessor)",
1370         "reads a molecular topology file, checks the validity of the",
1371         "file, expands the topology from a molecular description to an atomic",
1372         "description. The topology file contains information about",
1373         "molecule types and the number of molecules, the preprocessor",
1374         "copies each molecule as needed. ",
1375         "There is no limitation on the number of molecule types. ",
1376         "Bonds and bond-angles can be converted into constraints, separately",
1377         "for hydrogens and heavy atoms.",
1378         "Then a coordinate file is read and velocities can be generated",
1379         "from a Maxwellian distribution if requested.",
1380         "[THISMODULE] also reads parameters for [gmx-mdrun] ",
1381         "(eg. number of MD steps, time step, cut-off), and others such as",
1382         "NEMD parameters, which are corrected so that the net acceleration",
1383         "is zero.",
1384         "Eventually a binary file is produced that can serve as the sole input",
1385         "file for the MD program.[PAR]",
1386
1387         "[THISMODULE] uses the atom names from the topology file. The atom names",
1388         "in the coordinate file (option [TT]-c[tt]) are only read to generate",
1389         "warnings when they do not match the atom names in the topology.",
1390         "Note that the atom names are irrelevant for the simulation as",
1391         "only the atom types are used for generating interaction parameters.[PAR]",
1392
1393         "[THISMODULE] uses a built-in preprocessor to resolve includes, macros, ",
1394         "etc. The preprocessor supports the following keywords:[PAR]",
1395         "#ifdef VARIABLE[BR]",
1396         "#ifndef VARIABLE[BR]",
1397         "#else[BR]",
1398         "#endif[BR]",
1399         "#define VARIABLE[BR]",
1400         "#undef VARIABLE[BR]"
1401         "#include \"filename\"[BR]",
1402         "#include <filename>[PAR]",
1403         "The functioning of these statements in your topology may be modulated by",
1404         "using the following two flags in your [TT].mdp[tt] file:[PAR]",
1405         "[TT]define = -DVARIABLE1 -DVARIABLE2[BR]",
1406         "include = -I/home/john/doe[tt][BR]",
1407         "For further information a C-programming textbook may help you out.",
1408         "Specifying the [TT]-pp[tt] flag will get the pre-processed",
1409         "topology file written out so that you can verify its contents.[PAR]",
1410
1411         /* cpp has been unnecessary for some time, hasn't it?
1412             "If your system does not have a C-preprocessor, you can still",
1413             "use [TT]grompp[tt], but you do not have access to the features ",
1414             "from the cpp. Command line options to the C-preprocessor can be given",
1415             "in the [TT].mdp[tt] file. See your local manual (man cpp).[PAR]",
1416          */
1417
1418         "When using position restraints a file with restraint coordinates",
1419         "can be supplied with [TT]-r[tt], otherwise restraining will be done",
1420         "with respect to the conformation from the [TT]-c[tt] option.",
1421         "For free energy calculation the the coordinates for the B topology",
1422         "can be supplied with [TT]-rb[tt], otherwise they will be equal to",
1423         "those of the A topology.[PAR]",
1424
1425         "Starting coordinates can be read from trajectory with [TT]-t[tt].",
1426         "The last frame with coordinates and velocities will be read,",
1427         "unless the [TT]-time[tt] option is used. Only if this information",
1428         "is absent will the coordinates in the [TT]-c[tt] file be used.",
1429         "Note that these velocities will not be used when [TT]gen_vel = yes[tt]",
1430         "in your [TT].mdp[tt] file. An energy file can be supplied with",
1431         "[TT]-e[tt] to read Nose-Hoover and/or Parrinello-Rahman coupling",
1432         "variables.[PAR]",
1433
1434         "[THISMODULE] can be used to restart simulations (preserving",
1435         "continuity) by supplying just a checkpoint file with [TT]-t[tt].",
1436         "However, for simply changing the number of run steps to extend",
1437         "a run, using [gmx-convert-tpr] is more convenient than [THISMODULE].",
1438         "You then supply the old checkpoint file directly to [gmx-mdrun]",
1439         "with [TT]-cpi[tt]. If you wish to change the ensemble or things",
1440         "like output frequency, then supplying the checkpoint file to",
1441         "[THISMODULE] with [TT]-t[tt] along with a new [TT].mdp[tt] file",
1442         "with [TT]-f[tt] is the recommended procedure.[PAR]",
1443
1444         "By default, all bonded interactions which have constant energy due to",
1445         "virtual site constructions will be removed. If this constant energy is",
1446         "not zero, this will result in a shift in the total energy. All bonded",
1447         "interactions can be kept by turning off [TT]-rmvsbds[tt]. Additionally,",
1448         "all constraints for distances which will be constant anyway because",
1449         "of virtual site constructions will be removed. If any constraints remain",
1450         "which involve virtual sites, a fatal error will result.[PAR]"
1451
1452         "To verify your run input file, please take note of all warnings",
1453         "on the screen, and correct where necessary. Do also look at the contents",
1454         "of the [TT]mdout.mdp[tt] file; this contains comment lines, as well as",
1455         "the input that [THISMODULE] has read. If in doubt, you can start [THISMODULE]",
1456         "with the [TT]-debug[tt] option which will give you more information",
1457         "in a file called [TT]grompp.log[tt] (along with real debug info). You",
1458         "can see the contents of the run input file with the [gmx-dump]",
1459         "program. [gmx-check] can be used to compare the contents of two",
1460         "run input files.[PAR]"
1461
1462         "The [TT]-maxwarn[tt] option can be used to override warnings printed",
1463         "by [THISMODULE] that otherwise halt output. In some cases, warnings are",
1464         "harmless, but usually they are not. The user is advised to carefully",
1465         "interpret the output messages before attempting to bypass them with",
1466         "this option."
1467     };
1468     t_gromppopts      *opts;
1469     gmx_mtop_t        *sys;
1470     int                nmi;
1471     t_molinfo         *mi;
1472     gpp_atomtype_t     atype;
1473     t_inputrec        *ir;
1474     int                natoms, nvsite, comb, mt;
1475     t_params          *plist;
1476     t_state            state;
1477     matrix             box;
1478     real               max_spacing, fudgeQQ;
1479     double             reppow;
1480     char               fn[STRLEN], fnB[STRLEN];
1481     const char        *mdparin;
1482     int                ntype;
1483     gmx_bool           bNeedVel, bGenVel;
1484     gmx_bool           have_atomnumber;
1485     int                n12, n13, n14;
1486     t_params          *gb_plist = NULL;
1487     gmx_genborn_t     *born     = NULL;
1488     output_env_t       oenv;
1489     gmx_bool           bVerbose = FALSE;
1490     warninp_t          wi;
1491     char               warn_buf[STRLEN];
1492     unsigned int       useed;
1493     t_atoms            IMDatoms;   /* Atoms to be operated on interactively (IMD) */
1494
1495     t_filenm           fnm[] = {
1496         { efMDP, NULL,  NULL,        ffREAD  },
1497         { efMDP, "-po", "mdout",     ffWRITE },
1498         { efSTX, "-c",  NULL,        ffREAD  },
1499         { efSTX, "-r",  NULL,        ffOPTRD },
1500         { efSTX, "-rb", NULL,        ffOPTRD },
1501         { efNDX, NULL,  NULL,        ffOPTRD },
1502         { efTOP, NULL,  NULL,        ffREAD  },
1503         { efTOP, "-pp", "processed", ffOPTWR },
1504         { efTPX, "-o",  NULL,        ffWRITE },
1505         { efTRN, "-t",  NULL,        ffOPTRD },
1506         { efEDR, "-e",  NULL,        ffOPTRD },
1507         /* This group is needed by the VMD viewer as the start configuration for IMD sessions: */
1508         { efGRO, "-imd", "imdgroup", ffOPTWR },
1509         { efTRN, "-ref", "rotref",   ffOPTRW }
1510     };
1511 #define NFILE asize(fnm)
1512
1513     /* Command line options */
1514     static gmx_bool bRenum   = TRUE;
1515     static gmx_bool bRmVSBds = TRUE, bZero = FALSE;
1516     static int      i, maxwarn = 0;
1517     static real     fr_time = -1;
1518     t_pargs         pa[]    = {
1519         { "-v",       FALSE, etBOOL, {&bVerbose},
1520           "Be loud and noisy" },
1521         { "-time",    FALSE, etREAL, {&fr_time},
1522           "Take frame at or first after this time." },
1523         { "-rmvsbds", FALSE, etBOOL, {&bRmVSBds},
1524           "Remove constant bonded interactions with virtual sites" },
1525         { "-maxwarn", FALSE, etINT,  {&maxwarn},
1526           "Number of allowed warnings during input processing. Not for normal use and may generate unstable systems" },
1527         { "-zero",    FALSE, etBOOL, {&bZero},
1528           "Set parameters for bonded interactions without defaults to zero instead of generating an error" },
1529         { "-renum",   FALSE, etBOOL, {&bRenum},
1530           "Renumber atomtypes and minimize number of atomtypes" }
1531     };
1532
1533     /* Initiate some variables */
1534     snew(ir, 1);
1535     snew(opts, 1);
1536     init_ir(ir, opts);
1537
1538     /* Parse the command line */
1539     if (!parse_common_args(&argc, argv, 0, NFILE, fnm, asize(pa), pa,
1540                            asize(desc), desc, 0, NULL, &oenv))
1541     {
1542         return 0;
1543     }
1544
1545     wi = init_warning(TRUE, maxwarn);
1546
1547     /* PARAMETER file processing */
1548     mdparin = opt2fn("-f", NFILE, fnm);
1549     set_warning_line(wi, mdparin, -1);
1550     get_ir(mdparin, opt2fn("-po", NFILE, fnm), ir, opts, wi);
1551
1552     if (bVerbose)
1553     {
1554         fprintf(stderr, "checking input for internal consistency...\n");
1555     }
1556     check_ir(mdparin, ir, opts, wi);
1557
1558     if (ir->ld_seed == -1)
1559     {
1560         ir->ld_seed = (gmx_int64_t)gmx_rng_make_seed();
1561         fprintf(stderr, "Setting the LD random seed to %"GMX_PRId64 "\n", ir->ld_seed);
1562     }
1563
1564     if (ir->expandedvals->lmc_seed == -1)
1565     {
1566         ir->expandedvals->lmc_seed = (int)gmx_rng_make_seed();
1567         fprintf(stderr, "Setting the lambda MC random seed to %d\n", ir->expandedvals->lmc_seed);
1568     }
1569
1570     bNeedVel = EI_STATE_VELOCITY(ir->eI);
1571     bGenVel  = (bNeedVel && opts->bGenVel);
1572     if (bGenVel && ir->bContinuation)
1573     {
1574         sprintf(warn_buf,
1575                 "Generating velocities is inconsistent with attempting "
1576                 "to continue a previous run. Choose only one of "
1577                 "gen-vel = yes and continuation = yes.");
1578         warning_error(wi, warn_buf);
1579     }
1580
1581     snew(plist, F_NRE);
1582     init_plist(plist);
1583     snew(sys, 1);
1584     atype = init_atomtype();
1585     if (debug)
1586     {
1587         pr_symtab(debug, 0, "Just opened", &sys->symtab);
1588     }
1589
1590     strcpy(fn, ftp2fn(efTOP, NFILE, fnm));
1591     if (!gmx_fexist(fn))
1592     {
1593         gmx_fatal(FARGS, "%s does not exist", fn);
1594     }
1595     new_status(fn, opt2fn_null("-pp", NFILE, fnm), opt2fn("-c", NFILE, fnm),
1596                opts, ir, bZero, bGenVel, bVerbose, &state,
1597                atype, sys, &nmi, &mi, plist, &comb, &reppow, &fudgeQQ,
1598                opts->bMorse,
1599                wi);
1600
1601     if (debug)
1602     {
1603         pr_symtab(debug, 0, "After new_status", &sys->symtab);
1604     }
1605
1606     nvsite = 0;
1607     /* set parameters for virtual site construction (not for vsiten) */
1608     for (mt = 0; mt < sys->nmoltype; mt++)
1609     {
1610         nvsite +=
1611             set_vsites(bVerbose, &sys->moltype[mt].atoms, atype, mi[mt].plist);
1612     }
1613     /* now throw away all obsolete bonds, angles and dihedrals: */
1614     /* note: constraints are ALWAYS removed */
1615     if (nvsite)
1616     {
1617         for (mt = 0; mt < sys->nmoltype; mt++)
1618         {
1619             clean_vsite_bondeds(mi[mt].plist, sys->moltype[mt].atoms.nr, bRmVSBds);
1620         }
1621     }
1622
1623     if (ir->cutoff_scheme == ecutsVERLET)
1624     {
1625         fprintf(stderr, "Removing all charge groups because cutoff-scheme=%s\n",
1626                 ecutscheme_names[ir->cutoff_scheme]);
1627
1628         /* Remove all charge groups */
1629         gmx_mtop_remove_chargegroups(sys);
1630     }
1631
1632     if (count_constraints(sys, mi, wi) && (ir->eConstrAlg == econtSHAKE))
1633     {
1634         if (ir->eI == eiCG || ir->eI == eiLBFGS)
1635         {
1636             sprintf(warn_buf, "Can not do %s with %s, use %s",
1637                     EI(ir->eI), econstr_names[econtSHAKE], econstr_names[econtLINCS]);
1638             warning_error(wi, warn_buf);
1639         }
1640         if (ir->bPeriodicMols)
1641         {
1642             sprintf(warn_buf, "Can not do periodic molecules with %s, use %s",
1643                     econstr_names[econtSHAKE], econstr_names[econtLINCS]);
1644             warning_error(wi, warn_buf);
1645         }
1646     }
1647
1648     if (EI_SD (ir->eI) &&  ir->etc != etcNO)
1649     {
1650         warning_note(wi, "Temperature coupling is ignored with SD integrators.");
1651     }
1652
1653     /* If we are doing QM/MM, check that we got the atom numbers */
1654     have_atomnumber = TRUE;
1655     for (i = 0; i < get_atomtype_ntypes(atype); i++)
1656     {
1657         have_atomnumber = have_atomnumber && (get_atomtype_atomnumber(i, atype) >= 0);
1658     }
1659     if (!have_atomnumber && ir->bQMMM)
1660     {
1661         warning_error(wi,
1662                       "\n"
1663                       "It appears as if you are trying to run a QM/MM calculation, but the force\n"
1664                       "field you are using does not contain atom numbers fields. This is an\n"
1665                       "optional field (introduced in Gromacs 3.3) for general runs, but mandatory\n"
1666                       "for QM/MM. The good news is that it is easy to add - put the atom number as\n"
1667                       "an integer just before the mass column in ffXXXnb.itp.\n"
1668                       "NB: United atoms have the same atom numbers as normal ones.\n\n");
1669     }
1670
1671     if (ir->bAdress)
1672     {
1673         if ((ir->adress->const_wf > 1) || (ir->adress->const_wf < 0))
1674         {
1675             warning_error(wi, "AdResS contant weighting function should be between 0 and 1\n\n");
1676         }
1677         /** TODO check size of ex+hy width against box size */
1678     }
1679
1680     /* Check for errors in the input now, since they might cause problems
1681      * during processing further down.
1682      */
1683     check_warning_error(wi, FARGS);
1684
1685     if (opt2bSet("-r", NFILE, fnm))
1686     {
1687         sprintf(fn, "%s", opt2fn("-r", NFILE, fnm));
1688     }
1689     else
1690     {
1691         sprintf(fn, "%s", opt2fn("-c", NFILE, fnm));
1692     }
1693     if (opt2bSet("-rb", NFILE, fnm))
1694     {
1695         sprintf(fnB, "%s", opt2fn("-rb", NFILE, fnm));
1696     }
1697     else
1698     {
1699         strcpy(fnB, fn);
1700     }
1701
1702     if (nint_ftype(sys, mi, F_POSRES) > 0 || nint_ftype(sys, mi, F_FBPOSRES) > 0)
1703     {
1704         if (bVerbose)
1705         {
1706             fprintf(stderr, "Reading position restraint coords from %s", fn);
1707             if (strcmp(fn, fnB) == 0)
1708             {
1709                 fprintf(stderr, "\n");
1710             }
1711             else
1712             {
1713                 fprintf(stderr, " and %s\n", fnB);
1714             }
1715         }
1716         gen_posres(sys, mi, fn, fnB,
1717                    ir->refcoord_scaling, ir->ePBC,
1718                    ir->posres_com, ir->posres_comB,
1719                    wi);
1720     }
1721
1722     /* If we are using CMAP, setup the pre-interpolation grid */
1723     if (plist->ncmap > 0)
1724     {
1725         init_cmap_grid(&sys->ffparams.cmap_grid, plist->nc, plist->grid_spacing);
1726         setup_cmap(plist->grid_spacing, plist->nc, plist->cmap, &sys->ffparams.cmap_grid);
1727     }
1728
1729     set_wall_atomtype(atype, opts, ir, wi);
1730     if (bRenum)
1731     {
1732         renum_atype(plist, sys, ir->wall_atomtype, atype, bVerbose);
1733         ntype = get_atomtype_ntypes(atype);
1734     }
1735
1736     if (ir->implicit_solvent != eisNO)
1737     {
1738         /* Now we have renumbered the atom types, we can check the GBSA params */
1739         check_gbsa_params(atype);
1740
1741         /* Check that all atoms that have charge and/or LJ-parameters also have
1742          * sensible GB-parameters
1743          */
1744         check_gbsa_params_charged(sys, atype);
1745     }
1746
1747     /* PELA: Copy the atomtype data to the topology atomtype list */
1748     copy_atomtype_atomtypes(atype, &(sys->atomtypes));
1749
1750     if (debug)
1751     {
1752         pr_symtab(debug, 0, "After renum_atype", &sys->symtab);
1753     }
1754
1755     if (bVerbose)
1756     {
1757         fprintf(stderr, "converting bonded parameters...\n");
1758     }
1759
1760     ntype = get_atomtype_ntypes(atype);
1761     convert_params(ntype, plist, mi, comb, reppow, fudgeQQ, sys);
1762
1763     if (debug)
1764     {
1765         pr_symtab(debug, 0, "After convert_params", &sys->symtab);
1766     }
1767
1768     /* set ptype to VSite for virtual sites */
1769     for (mt = 0; mt < sys->nmoltype; mt++)
1770     {
1771         set_vsites_ptype(FALSE, &sys->moltype[mt]);
1772     }
1773     if (debug)
1774     {
1775         pr_symtab(debug, 0, "After virtual sites", &sys->symtab);
1776     }
1777     /* Check velocity for virtual sites and shells */
1778     if (bGenVel)
1779     {
1780         check_vel(sys, state.v);
1781     }
1782
1783     /* check masses */
1784     check_mol(sys, wi);
1785
1786     for (i = 0; i < sys->nmoltype; i++)
1787     {
1788         check_cg_sizes(ftp2fn(efTOP, NFILE, fnm), &sys->moltype[i].cgs, wi);
1789     }
1790
1791     if (EI_DYNAMICS(ir->eI) && ir->eI != eiBD)
1792     {
1793         check_bonds_timestep(sys, ir->delta_t, wi);
1794     }
1795
1796     if (EI_ENERGY_MINIMIZATION(ir->eI) && 0 == ir->nsteps)
1797     {
1798         warning_note(wi, "Zero-step energy minimization will alter the coordinates before calculating the energy. If you just want the energy of a single point, try zero-step MD (with unconstrained_start = yes). To do multiple single-point energy evaluations of different configurations of the same topology, use mdrun -rerun.");
1799     }
1800
1801     check_warning_error(wi, FARGS);
1802
1803     if (bVerbose)
1804     {
1805         fprintf(stderr, "initialising group options...\n");
1806     }
1807     do_index(mdparin, ftp2fn_null(efNDX, NFILE, fnm),
1808              sys, bVerbose, ir,
1809              bGenVel ? state.v : NULL,
1810              wi);
1811
1812     if (ir->cutoff_scheme == ecutsVERLET && ir->verletbuf_tol > 0 &&
1813         ir->nstlist > 1)
1814     {
1815         if (EI_DYNAMICS(ir->eI) && inputrec2nboundeddim(ir) == 3)
1816         {
1817             real buffer_temp;
1818
1819             if (EI_MD(ir->eI) && ir->etc == etcNO)
1820             {
1821                 if (bGenVel)
1822                 {
1823                     buffer_temp = opts->tempi;
1824                 }
1825                 else
1826                 {
1827                     buffer_temp = calc_temp(sys, ir, state.v);
1828                 }
1829                 if (buffer_temp > 0)
1830                 {
1831                     sprintf(warn_buf, "NVE simulation: will use the initial temperature of %.3f K for determining the Verlet buffer size", buffer_temp);
1832                     warning_note(wi, warn_buf);
1833                 }
1834                 else
1835                 {
1836                     sprintf(warn_buf, "NVE simulation with an initial temperature of zero: will use a Verlet buffer of %d%%. Check your energy drift!",
1837                             (int)(verlet_buffer_ratio_NVE_T0*100 + 0.5));
1838                     warning_note(wi, warn_buf);
1839                 }
1840             }
1841             else
1842             {
1843                 buffer_temp = get_max_reference_temp(ir, wi);
1844             }
1845
1846             if (EI_MD(ir->eI) && ir->etc == etcNO && buffer_temp == 0)
1847             {
1848                 /* NVE with initial T=0: we add a fixed ratio to rlist.
1849                  * Since we don't actually use verletbuf_tol, we set it to -1
1850                  * so it can't be misused later.
1851                  */
1852                 ir->rlist         *= 1.0 + verlet_buffer_ratio_NVE_T0;
1853                 ir->verletbuf_tol  = -1;
1854             }
1855             else
1856             {
1857                 /* We warn for NVE simulations with >1(.1)% drift tolerance */
1858                 const real drift_tol = 0.01;
1859                 real       ener_runtime;
1860
1861                 /* We use 2 DOF per atom = 2kT pot+kin energy, to be on
1862                  * the safe side with constraints (without constraints: 3 DOF).
1863                  */
1864                 ener_runtime = 2*BOLTZ*buffer_temp/(ir->nsteps*ir->delta_t);
1865
1866                 if (EI_MD(ir->eI) && ir->etc == etcNO && ir->nstlist > 1 &&
1867                     ir->nsteps > 0 &&
1868                     ir->verletbuf_tol > 1.1*drift_tol*ener_runtime)
1869                 {
1870                     sprintf(warn_buf, "You are using a Verlet buffer tolerance of %g kJ/mol/ps for an NVE simulation of length %g ps, which can give a final drift of %d%%. For conserving energy to %d%%, you might need to set verlet-buffer-tolerance to %.1e.",
1871                             ir->verletbuf_tol, ir->nsteps*ir->delta_t,
1872                             (int)(ir->verletbuf_tol/ener_runtime*100 + 0.5),
1873                             (int)(100*drift_tol + 0.5),
1874                             drift_tol*ener_runtime);
1875                     warning_note(wi, warn_buf);
1876                 }
1877
1878                 set_verlet_buffer(sys, ir, buffer_temp, state.box, wi);
1879             }
1880         }
1881     }
1882
1883     /* Init the temperature coupling state */
1884     init_gtc_state(&state, ir->opts.ngtc, 0, ir->opts.nhchainlength); /* need to add nnhpres here? */
1885
1886     if (bVerbose)
1887     {
1888         fprintf(stderr, "Checking consistency between energy and charge groups...\n");
1889     }
1890     check_eg_vs_cg(sys);
1891
1892     if (debug)
1893     {
1894         pr_symtab(debug, 0, "After index", &sys->symtab);
1895     }
1896
1897     triple_check(mdparin, ir, sys, wi);
1898     close_symtab(&sys->symtab);
1899     if (debug)
1900     {
1901         pr_symtab(debug, 0, "After close", &sys->symtab);
1902     }
1903
1904     /* make exclusions between QM atoms */
1905     if (ir->bQMMM)
1906     {
1907         if (ir->QMMMscheme == eQMMMschemenormal && ir->ns_type == ensSIMPLE)
1908         {
1909             gmx_fatal(FARGS, "electrostatic embedding only works with grid neighboursearching, use ns-type=grid instead\n");
1910         }
1911         else
1912         {
1913             generate_qmexcl(sys, ir, wi);
1914         }
1915     }
1916
1917     if (ftp2bSet(efTRN, NFILE, fnm))
1918     {
1919         if (bVerbose)
1920         {
1921             fprintf(stderr, "getting data from old trajectory ...\n");
1922         }
1923         cont_status(ftp2fn(efTRN, NFILE, fnm), ftp2fn_null(efEDR, NFILE, fnm),
1924                     bNeedVel, bGenVel, fr_time, ir, &state, sys, oenv);
1925     }
1926
1927     if (ir->ePBC == epbcXY && ir->nwall != 2)
1928     {
1929         clear_rvec(state.box[ZZ]);
1930     }
1931
1932     if (ir->cutoff_scheme != ecutsVERLET && ir->rlist > 0)
1933     {
1934         set_warning_line(wi, mdparin, -1);
1935         check_chargegroup_radii(sys, ir, state.x, wi);
1936     }
1937
1938     if (EEL_FULL(ir->coulombtype) || EVDW_PME(ir->vdwtype))
1939     {
1940         /* Calculate the optimal grid dimensions */
1941         copy_mat(state.box, box);
1942         if (ir->ePBC == epbcXY && ir->nwall == 2)
1943         {
1944             svmul(ir->wall_ewald_zfac, box[ZZ], box[ZZ]);
1945         }
1946         if (ir->nkx > 0 && ir->nky > 0 && ir->nkz > 0)
1947         {
1948             /* Mark fourier_spacing as not used */
1949             ir->fourier_spacing = 0;
1950         }
1951         else if (ir->nkx != 0 && ir->nky != 0 && ir->nkz != 0)
1952         {
1953             set_warning_line(wi, mdparin, -1);
1954             warning_error(wi, "Some of the Fourier grid sizes are set, but all of them need to be set.");
1955         }
1956         max_spacing = calc_grid(stdout, box, ir->fourier_spacing,
1957                                 &(ir->nkx), &(ir->nky), &(ir->nkz));
1958     }
1959
1960     /* MRS: eventually figure out better logic for initializing the fep
1961        values that makes declaring the lambda and declaring the state not
1962        potentially conflict if not handled correctly. */
1963     if (ir->efep != efepNO)
1964     {
1965         state.fep_state = ir->fepvals->init_fep_state;
1966         for (i = 0; i < efptNR; i++)
1967         {
1968             /* init_lambda trumps state definitions*/
1969             if (ir->fepvals->init_lambda >= 0)
1970             {
1971                 state.lambda[i] = ir->fepvals->init_lambda;
1972             }
1973             else
1974             {
1975                 if (ir->fepvals->all_lambda[i] == NULL)
1976                 {
1977                     gmx_fatal(FARGS, "Values of lambda not set for a free energy calculation!");
1978                 }
1979                 else
1980                 {
1981                     state.lambda[i] = ir->fepvals->all_lambda[i][state.fep_state];
1982                 }
1983             }
1984         }
1985     }
1986
1987     if (ir->ePull != epullNO)
1988     {
1989         set_pull_init(ir, sys, state.x, state.box, state.lambda[efptMASS], oenv, opts->pull_start);
1990     }
1991
1992     if (ir->bRot)
1993     {
1994         set_reference_positions(ir->rot, state.x, state.box,
1995                                 opt2fn("-ref", NFILE, fnm), opt2bSet("-ref", NFILE, fnm),
1996                                 wi);
1997     }
1998
1999     /*  reset_multinr(sys); */
2000
2001     if (EEL_PME(ir->coulombtype))
2002     {
2003         float ratio = pme_load_estimate(sys, ir, state.box);
2004         fprintf(stderr, "Estimate for the relative computational load of the PME mesh part: %.2f\n", ratio);
2005         /* With free energy we might need to do PME both for the A and B state
2006          * charges. This will double the cost, but the optimal performance will
2007          * then probably be at a slightly larger cut-off and grid spacing.
2008          */
2009         if ((ir->efep == efepNO && ratio > 1.0/2.0) ||
2010             (ir->efep != efepNO && ratio > 2.0/3.0))
2011         {
2012             warning_note(wi,
2013                          "The optimal PME mesh load for parallel simulations is below 0.5\n"
2014                          "and for highly parallel simulations between 0.25 and 0.33,\n"
2015                          "for higher performance, increase the cut-off and the PME grid spacing.\n");
2016             if (ir->efep != efepNO)
2017             {
2018                 warning_note(wi,
2019                              "For free energy simulations, the optimal load limit increases from 0.5 to 0.667\n");
2020             }
2021         }
2022     }
2023
2024     {
2025         char   warn_buf[STRLEN];
2026         double cio = compute_io(ir, sys->natoms, &sys->groups, F_NRE, 1);
2027         sprintf(warn_buf, "This run will generate roughly %.0f Mb of data", cio);
2028         if (cio > 2000)
2029         {
2030             set_warning_line(wi, mdparin, -1);
2031             warning_note(wi, warn_buf);
2032         }
2033         else
2034         {
2035             printf("%s\n", warn_buf);
2036         }
2037     }
2038
2039     if (bVerbose)
2040     {
2041         fprintf(stderr, "writing run input file...\n");
2042     }
2043
2044     done_warning(wi, FARGS);
2045     write_tpx_state(ftp2fn(efTPX, NFILE, fnm), ir, &state, sys);
2046
2047     /* Output IMD group, if bIMD is TRUE */
2048     write_IMDgroup_to_file(ir->bIMD, ir, &state, sys, NFILE, fnm);
2049
2050     done_atomtype(atype);
2051     done_mtop(sys, TRUE);
2052     done_inputrec_strings();
2053
2054     return 0;
2055 }