2 * This file is part of the GROMACS molecular simulation package.
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.
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.
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.
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.
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.
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.
49 #include "gmx_fatal.h"
52 int ifunc_index(directive d,int type)
79 gmx_fatal(FARGS,"Invalid bond type %d",type);
91 return F_CROSS_BOND_BONDS;
93 return F_CROSS_BOND_ANGLES;
95 return F_UREY_BRADLEY;
97 return F_QUARTIC_ANGLES;
101 return F_LINEAR_ANGLES;
103 gmx_fatal(FARGS,"Invalid angle type %d",type);
109 if (type == 1 || (d == d_pairtypes && type == 2))
114 gmx_fatal(FARGS,"Invalid pairs type %d",type);
117 return F_LJC_PAIRS_NB;
119 case d_dihedraltypes:
134 return F_PDIHS; /* proper dihedrals where we allow multiple terms over single bond */
136 gmx_fatal(FARGS,"Invalid dihedral type %d",type);
143 case d_nonbond_params:
161 gmx_fatal(FARGS,"Invalid vsites3 type %d",type);
171 gmx_fatal(FARGS,"Invalid vsites4 type %d",type);
177 case d_constrainttypes:
184 gmx_fatal(FARGS,"Invalid constraints type %d",type);
189 case d_position_restraints:
194 gmx_fatal(FARGS,"Water polarization should now be listed under [ water_polarization ]\n");
197 gmx_fatal(FARGS,"Invalid position restraint type %d",type);
203 return F_POLARIZATION;
207 gmx_fatal(FARGS,"Invalid polarization type %d",type);
210 case d_thole_polarization:
212 case d_water_polarization:
214 case d_angle_restraints:
216 case d_angle_restraints_z:
218 case d_distance_restraints:
220 case d_orientation_restraints:
222 case d_dihedral_restraints:
225 gmx_fatal(FARGS,"invalid directive %s in ifunc_index (%s:%s)",
226 dir2str(d),__FILE__,__LINE__);
231 const char *dir2str (directive d)
239 directive str2dir (char *dstr)
242 char buf[STRLEN],*ptr;
244 /* Hack to be able to read old topologies */
245 if (gmx_strncasecmp_min(dstr,"dummies",7) == 0) {
246 sprintf(buf,"virtual_sites%s",dstr+7);
252 for (d=0; (d<d_maxdir); d++)
253 if (gmx_strcasecmp_min(ptr,dir2str((directive)d)) == 0)
259 static directive **necessary = NULL;
261 static void set_nec(directive **n, ...)
262 /* Must always have at least one extra argument */
270 d = (directive)va_arg(ap,int);
273 } while (d != d_none);
277 void DS_Init(DirStack **DS)
279 if (necessary==NULL) {
282 snew(necessary,d_maxdir);
283 set_nec(&(necessary[d_defaults]),d_none);
284 set_nec(&(necessary[d_atomtypes]),d_defaults,d_none);
285 set_nec(&(necessary[d_bondtypes]),d_atomtypes,d_none);
286 set_nec(&(necessary[d_constrainttypes]),d_atomtypes,d_none);
287 set_nec(&(necessary[d_pairtypes]),d_atomtypes,d_none);
288 set_nec(&(necessary[d_angletypes]),d_atomtypes,d_none);
289 set_nec(&(necessary[d_dihedraltypes]),d_atomtypes,d_none);
290 set_nec(&(necessary[d_nonbond_params]),d_atomtypes,d_none);
291 set_nec(&(necessary[d_implicit_genborn_params]),d_atomtypes,d_none);
292 set_nec(&(necessary[d_implicit_surface_params]),d_atomtypes,d_none);
293 set_nec(&(necessary[d_cmaptypes]),d_atomtypes,d_none);
294 set_nec(&(necessary[d_moleculetype]),d_atomtypes,d_none);
295 set_nec(&(necessary[d_atoms]),d_moleculetype,d_none);
296 set_nec(&(necessary[d_vsites2]),d_atoms,d_none);
297 set_nec(&(necessary[d_vsites3]),d_atoms,d_none);
298 set_nec(&(necessary[d_vsites4]),d_atoms,d_none);
299 set_nec(&(necessary[d_vsitesn]),d_atoms,d_none);
300 set_nec(&(necessary[d_bonds]),d_atoms,d_none);
301 set_nec(&(necessary[d_exclusions]),d_bonds,d_constraints,d_settles,d_none);
302 set_nec(&(necessary[d_pairs]),d_atoms,d_none);
303 set_nec(&(necessary[d_pairs_nb]),d_atoms,d_none);
304 set_nec(&(necessary[d_angles]),d_atoms,d_none);
305 set_nec(&(necessary[d_polarization]),d_atoms,d_none);
306 set_nec(&(necessary[d_water_polarization]),d_atoms,d_none);
307 set_nec(&(necessary[d_thole_polarization]),d_atoms,d_none);
308 set_nec(&(necessary[d_dihedrals]),d_atoms,d_none);
309 set_nec(&(necessary[d_constraints]),d_atoms,d_none);
310 set_nec(&(necessary[d_settles]),d_atoms,d_none);
311 set_nec(&(necessary[d_system]),d_moleculetype,d_none);
312 set_nec(&(necessary[d_molecules]),d_system,d_none);
313 set_nec(&(necessary[d_position_restraints]),d_atoms,d_none);
314 set_nec(&(necessary[d_angle_restraints]),d_atoms,d_none);
315 set_nec(&(necessary[d_angle_restraints_z]),d_atoms,d_none);
316 set_nec(&(necessary[d_distance_restraints]),d_atoms,d_none);
317 set_nec(&(necessary[d_orientation_restraints]),d_atoms,d_none);
318 set_nec(&(necessary[d_dihedral_restraints]),d_atoms,d_none);
319 set_nec(&(necessary[d_cmap]), d_atoms, d_none);
321 for(i=0; (i<d_maxdir); i++) {
323 fprintf(debug,"%20s: ",dir2str((directive)i));
330 fprintf(debug,"%20s ",dir2str(d));
341 void DS_Done (DirStack **DS)
345 while (*DS != NULL) {
352 void DS_Push (DirStack **DS, directive d)
362 int DS_Search(DirStack *DS, directive d)
367 while ((D != NULL) && (D->d != d))
373 int DS_Check_Order(DirStack *DS,directive d)
378 /* Check if parameter definitions appear after a moleculetype directive */
379 if (d<d_moleculetype && DS_Search(DS,d_moleculetype))
382 /* Check if all the necessary directives have appeared before directive d */
383 if (necessary[d][0] == d_none)
387 d0=necessary[d][i++];
388 if (DS_Search(DS,d0))