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