4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
12 * Copyright (c) 1991-1999
13 * BIOSON Research Institute, Dept. of Biophysical Chemistry
14 * University of Groningen, The Netherlands
17 * GROMACS: A message-passing parallel molecular dynamics implementation
18 * H.J.C. Berendsen, D. van der Spoel and R. van Drunen
19 * Comp. Phys. Comm. 91, 43-56 (1995)
21 * Also check out our WWW page:
22 * http://md.chem.rug.nl/~gmx
27 * GRowing Old MAkes el Chrono Sweat
29 static char *SRCID_topdirs_c
= "$Id$";
40 int ifunc_index(directive d
,int type
)
52 fatal_error(0,"Invalid bond type %d",type
);
60 fatal_error(0,"Invalid angle type %d",type
);
74 fatal_error(0,"Invalid dihedral type %d",type
);
77 case d_nonbond_params
:
95 fatal_error(0,"Invalid dummies3 type %d",type
);
100 case d_constrainttypes
:
107 fatal_error(0,"Invalid constraints type %d",type
);
111 case d_position_restraints
:
118 fatal_error(0,"Invalid position restraint type %d",type
);
120 case d_angle_restraints
:
122 case d_angle_restraints_z
:
124 case d_distance_restraints
:
127 fatal_error(0,"invalid directive %s in ifunc_index (%s:%s)",
128 dir2str(d
),__FILE__
,__LINE__
);
133 char *dir2str (directive d
)
141 directive
str2dir (char *dstr
)
145 for (d
=(directive
)0; (d
<d_maxdir
); d
++)
146 if (gmx_strcasecmp(dstr
,dir2str(d
)) == 0)
152 static directive
**necessary
= NULL
;
154 static void set_nec(directive
**n
, ...)
155 /* Must always have at least one extra argument */
163 d
=va_arg(ap
,directive
);
166 } while (d
!= d_none
);
170 void DS_Init(DirStack
**DS
)
172 if (necessary
==NULL
) {
175 snew(necessary
,d_maxdir
);
176 set_nec(&(necessary
[d_defaults
]),d_none
);
177 set_nec(&(necessary
[d_atomtypes
]),d_defaults
,d_none
);
178 set_nec(&(necessary
[d_bondtypes
]),d_atomtypes
,d_none
);
179 set_nec(&(necessary
[d_constrainttypes
]),d_atomtypes
,d_none
);
180 set_nec(&(necessary
[d_pairtypes
]),d_atomtypes
,d_none
);
181 set_nec(&(necessary
[d_angletypes
]),d_atomtypes
,d_none
);
182 set_nec(&(necessary
[d_dihedraltypes
]),d_atomtypes
,d_none
);
183 set_nec(&(necessary
[d_nonbond_params
]),d_atomtypes
,d_none
);
184 set_nec(&(necessary
[d_blocktype
]),d_atomtypes
,d_none
);
185 set_nec(&(necessary
[d_moleculetype
]),d_atomtypes
,d_none
);
186 set_nec(&(necessary
[d_atoms
]),d_blocktype
,d_moleculetype
,d_none
);
187 set_nec(&(necessary
[d_dum2
]),d_atoms
,d_none
);
188 set_nec(&(necessary
[d_dum3
]),d_atoms
,d_none
);
189 set_nec(&(necessary
[d_dum4
]),d_atoms
,d_none
);
190 set_nec(&(necessary
[d_bonds
]),d_atoms
,d_none
);
191 set_nec(&(necessary
[d_exclusions
]),d_bonds
,d_constraints
,d_settles
,d_none
);
192 set_nec(&(necessary
[d_pairs
]),d_atoms
,d_none
);
193 set_nec(&(necessary
[d_angles
]),d_atoms
,d_none
);
194 set_nec(&(necessary
[d_dihedrals
]),d_atoms
,d_none
);
195 set_nec(&(necessary
[d_constraints
]),d_atoms
,d_none
);
196 set_nec(&(necessary
[d_settles
]),d_atoms
,d_none
);
197 set_nec(&(necessary
[d_system
]),d_moleculetype
,d_none
);
198 set_nec(&(necessary
[d_molecules
]),d_system
,d_none
);
199 set_nec(&(necessary
[d_position_restraints
]),d_atoms
,d_none
);
200 set_nec(&(necessary
[d_angle_restraints
]),d_atoms
,d_none
);
201 set_nec(&(necessary
[d_angle_restraints_z
]),d_atoms
,d_none
);
202 set_nec(&(necessary
[d_distance_restraints
]),d_atoms
,d_none
);
203 for(i
=0; (i
<d_maxdir
); i
++) {
205 fprintf(debug
,"%20s: ",dir2str((directive
)i
));
212 fprintf(debug
,"%20s ",dir2str(d
));
223 void DS_Done (DirStack
**DS
)
227 while (*DS
!= NULL
) {
234 void DS_Push (DirStack
**DS
, directive d
)
244 int DS_Search(DirStack
*DS
, directive d
)
249 while ((D
!= NULL
) && (D
->d
!= d
))
255 int DS_Check_Order(DirStack
*DS
,directive d
)
260 if (necessary
[d
][0] == d_none
)
264 d0
=necessary
[d
][i
++];
265 if (DS_Search(DS
,d0
))