4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
11 * Copyright (c) 1991-2001, University of Groningen, The Netherlands
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * If you want to redistribute modifications, please consider that
18 * scientific software is very special. Version control is crucial -
19 * bugs must be traceable. We will be happy to consider code for
20 * inclusion in the official distribution, but derived work must not
21 * be called official GROMACS. Details are found in the README & COPYING
22 * files - if they are missing, get the official version at www.gromacs.org.
24 * To help us fund GROMACS development, we humbly ask that you cite
25 * the papers on the package - you can find them in the top README file.
27 * For more info, check our website at http://www.gromacs.org
30 * Gromacs Runs One Microsecond At Cannonball Speeds
32 static char *SRCID_topdirs_c
= "$Id$";
42 int ifunc_index(directive d
,int type
)
60 fatal_error(0,"Invalid bond type %d",type
);
68 fatal_error(0,"Invalid angle type %d",type
);
82 fatal_error(0,"Invalid dihedral type %d",type
);
85 case d_nonbond_params
:
103 fatal_error(0,"Invalid dummies3 type %d",type
);
108 case d_constrainttypes
:
115 fatal_error(0,"Invalid constraints type %d",type
);
119 case d_position_restraints
:
126 fatal_error(0,"Invalid position restraint type %d",type
);
128 case d_angle_restraints
:
130 case d_angle_restraints_z
:
132 case d_distance_restraints
:
134 case d_orientation_restraints
:
137 fatal_error(0,"invalid directive %s in ifunc_index (%s:%s)",
138 dir2str(d
),__FILE__
,__LINE__
);
143 char *dir2str (directive d
)
151 directive
str2dir (char *dstr
)
155 for (d
=(directive
)0; (d
<d_maxdir
); d
++)
156 if (strcasecmp_min(dstr
,dir2str(d
)) == 0)
162 static directive
**necessary
= NULL
;
164 static void set_nec(directive
**n
, ...)
165 /* Must always have at least one extra argument */
173 d
=va_arg(ap
,directive
);
176 } while (d
!= d_none
);
180 void DS_Init(DirStack
**DS
)
182 if (necessary
==NULL
) {
185 snew(necessary
,d_maxdir
);
186 set_nec(&(necessary
[d_defaults
]),d_none
);
187 set_nec(&(necessary
[d_atomtypes
]),d_defaults
,d_none
);
188 set_nec(&(necessary
[d_bondtypes
]),d_atomtypes
,d_none
);
189 set_nec(&(necessary
[d_constrainttypes
]),d_atomtypes
,d_none
);
190 set_nec(&(necessary
[d_pairtypes
]),d_atomtypes
,d_none
);
191 set_nec(&(necessary
[d_angletypes
]),d_atomtypes
,d_none
);
192 set_nec(&(necessary
[d_dihedraltypes
]),d_atomtypes
,d_none
);
193 set_nec(&(necessary
[d_nonbond_params
]),d_atomtypes
,d_none
);
194 set_nec(&(necessary
[d_blocktype
]),d_atomtypes
,d_none
);
195 set_nec(&(necessary
[d_moleculetype
]),d_atomtypes
,d_none
);
196 set_nec(&(necessary
[d_atoms
]),d_blocktype
,d_moleculetype
,d_none
);
197 set_nec(&(necessary
[d_dum2
]),d_atoms
,d_none
);
198 set_nec(&(necessary
[d_dum3
]),d_atoms
,d_none
);
199 set_nec(&(necessary
[d_dum4
]),d_atoms
,d_none
);
200 set_nec(&(necessary
[d_bonds
]),d_atoms
,d_none
);
201 set_nec(&(necessary
[d_exclusions
]),d_bonds
,d_constraints
,d_settles
,d_none
);
202 set_nec(&(necessary
[d_pairs
]),d_atoms
,d_none
);
203 set_nec(&(necessary
[d_angles
]),d_atoms
,d_none
);
204 set_nec(&(necessary
[d_dihedrals
]),d_atoms
,d_none
);
205 set_nec(&(necessary
[d_constraints
]),d_atoms
,d_none
);
206 set_nec(&(necessary
[d_settles
]),d_atoms
,d_none
);
207 set_nec(&(necessary
[d_system
]),d_moleculetype
,d_none
);
208 set_nec(&(necessary
[d_molecules
]),d_system
,d_none
);
209 set_nec(&(necessary
[d_position_restraints
]),d_atoms
,d_none
);
210 set_nec(&(necessary
[d_angle_restraints
]),d_atoms
,d_none
);
211 set_nec(&(necessary
[d_angle_restraints_z
]),d_atoms
,d_none
);
212 set_nec(&(necessary
[d_distance_restraints
]),d_atoms
,d_none
);
213 set_nec(&(necessary
[d_orientation_restraints
]),d_atoms
,d_none
);
214 for(i
=0; (i
<d_maxdir
); i
++) {
216 fprintf(debug
,"%20s: ",dir2str((directive
)i
));
223 fprintf(debug
,"%20s ",dir2str(d
));
234 void DS_Done (DirStack
**DS
)
238 while (*DS
!= NULL
) {
245 void DS_Push (DirStack
**DS
, directive d
)
255 int DS_Search(DirStack
*DS
, directive d
)
260 while ((D
!= NULL
) && (D
->d
!= d
))
266 int DS_Check_Order(DirStack
*DS
,directive d
)
271 /* Check if parameter definitions appear after a moleculetype directive */
272 if (d
<d_moleculetype
&& DS_Search(DS
,d_moleculetype
))
275 /* Check if all the necessary directives have appeared before directive d */
276 if (necessary
[d
][0] == d_none
)
280 d0
=necessary
[d
][i
++];
281 if (DS_Search(DS
,d0
))