3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
10 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
11 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
12 * Copyright (c) 2001-2004, The GROMACS development team,
13 * check out http://www.gromacs.org for more information.
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * If you want to redistribute modifications, please consider that
21 * scientific software is very special. Version control is crucial -
22 * bugs must be traceable. We will be happy to consider code for
23 * inclusion in the official distribution, but derived work must not
24 * be called official GROMACS. Details are found in the README & COPYING
25 * files - if they are missing, get the official version at www.gromacs.org.
27 * To help us fund GROMACS development, we humbly ask that you cite
28 * the papers on the package - you can find them in the top README file.
30 * For more info, check our website at http://www.gromacs.org
33 * Gromacs Runs On Most of All Computer Systems
45 /* Should be called after generating or reading mtop,
46 * to set some compute intesive variables to avoid
47 * N^2 operations later on.
50 gmx_mtop_finalize(gmx_mtop_t
*mtop
);
53 /* Returns the total number of charge groups in mtop */
55 ncg_mtop(const gmx_mtop_t
*mtop
);
58 /* Returns a pointer to the t_atom struct belonging to atnr_global.
59 * This can be an expensive operation, so if possible use
60 * one of the atom loop constructs below.
63 gmx_mtop_atomnr_to_atom(const gmx_mtop_t
*mtop
,int atnr_global
,
67 /* Returns a pointer to the molecule interaction array ilist_mol[F_NRE]
68 * and the local atom number in the molecule belonging to atnr_global.
71 gmx_mtop_atomnr_to_ilist(const gmx_mtop_t
*mtop
,int atnr_global
,
72 t_ilist
**ilist_mol
,int *atnr_offset
);
75 /* Returns the molecule block index
76 * and the molecule number in the block
77 * and the atom number offset for the atom indices in moltype
78 * belonging to atnr_global.
81 gmx_mtop_atomnr_to_molblock_ind(const gmx_mtop_t
*mtop
,int atnr_global
,
82 int *molb
,int *molnr
,int *atnr_mol
);
85 /* Returns atom name, global resnr and residue name of atom atnr_global */
87 gmx_mtop_atominfo_global(const gmx_mtop_t
*mtop
,int atnr_global
,
88 char **atomname
,int *resnr
,char **resname
);
91 /* Abstract type for atom loop over all atoms */
92 typedef struct gmx_mtop_atomloop_all
*gmx_mtop_atomloop_all_t
;
94 /* Initialize an atom loop over all atoms in the system.
95 * The order of the atoms will be as in the state struct.
96 * Only use this when you really need to loop over all atoms,
97 * i.e. when you use groups which might differ per molecule,
98 * otherwise use gmx_mtop_atomloop_block.
100 extern gmx_mtop_atomloop_all_t
101 gmx_mtop_atomloop_all_init(const gmx_mtop_t
*mtop
);
103 /* Loop to the next atom.
104 * When not at the end:
105 * returns TRUE and at_global,
106 * writes the global atom number in *at_global
107 * and sets the pointer atom to the t_atom struct of that atom.
108 * When at the end, destroys aloop and returns FALSE.
110 * gmx_mtop_atomloop_all_t aloop;
111 * aloop = gmx_mtop_atomloop_all_init(mtop)
112 * while (gmx_mtop_atomloop_all_next(aloop,&at_global,&atom)) {
117 gmx_mtop_atomloop_all_next(gmx_mtop_atomloop_all_t aloop
,
118 int *at_global
,t_atom
**atom
);
120 /* Return the atomname, the residue number and residue name
121 * of the current atom in the loop.
124 gmx_mtop_atomloop_all_names(gmx_mtop_atomloop_all_t aloop
,
125 char **atomname
,int *resnr
,char **resname
);
127 /* Return the a pointer to the moltype struct of the current atom
128 * in the loop and the atom number in the molecule.
131 gmx_mtop_atomloop_all_moltype(gmx_mtop_atomloop_all_t aloop
,
132 gmx_moltype_t
**moltype
,int *at_mol
);
135 /* Abstract type for atom loop over atoms in all molecule blocks */
136 typedef struct gmx_mtop_atomloop_block
*gmx_mtop_atomloop_block_t
;
138 /* Initialize an atom loop over atoms in all molecule blocks the system.
140 extern gmx_mtop_atomloop_block_t
141 gmx_mtop_atomloop_block_init(const gmx_mtop_t
*mtop
);
143 /* Loop to the next atom.
144 * When not at the end:
146 * sets the pointer atom to the t_atom struct of that atom
147 * and return the number of molecules corresponding to this atom.
148 * When at the end, destroys aloop and returns FALSE.
150 * gmx_mtop_atomloop_block_t aloop;
151 * aloop = gmx_mtop_atomloop_block_init(mtop)
152 * while (gmx_mtop_atomloop_block_next(aloop,&atom,&nmol)) {
157 gmx_mtop_atomloop_block_next(gmx_mtop_atomloop_block_t aloop
,
158 t_atom
**atom
,int *nmol
);
161 /* Abstract type for ilist loop over all ilists */
162 typedef struct gmx_mtop_ilistloop
*gmx_mtop_ilistloop_t
;
164 /* Initialize an ilist loop over all molecule types in the system. */
165 extern gmx_mtop_ilistloop_t
166 gmx_mtop_ilistloop_init(const gmx_mtop_t
*mtop
);
169 /* Loop to the next molecule,
170 * When not at the end:
171 * returns TRUE and a pointer to the next array ilist_mol[F_NRE],
172 * writes the number of molecules for this ilist in *nmol.
173 * When at the end, destroys iloop and returns FALSE.
176 gmx_mtop_ilistloop_next(gmx_mtop_ilistloop_t iloop
,
177 t_ilist
**ilist_mol
,int *nmol
);
180 /* Abstract type for ilist loop over all ilists of all molecules */
181 typedef struct gmx_mtop_ilistloop_all
*gmx_mtop_ilistloop_all_t
;
183 /* Initialize an ilist loop over all molecule types in the system.
184 * Only use this when you really need to loop over all molecules,
185 * i.e. when you use groups which might differ per molecule,
186 * otherwise use gmx_mtop_ilistloop.
188 extern gmx_mtop_ilistloop_all_t
189 gmx_mtop_ilistloop_all_init(const gmx_mtop_t
*mtop
);
191 /* Loop to the next molecule,
192 * When not at the end:
193 * returns TRUE and a pointer to the next array ilist_mol[F_NRE],
194 * writes the atom offset which should be added to iatoms in atnr_offset.
195 * When at the end, destroys iloop and returns FALSE.
198 gmx_mtop_ilistloop_all_next(gmx_mtop_ilistloop_all_t iloop
,
199 t_ilist
**ilist_mol
,int *atnr_offset
);
202 /* Returns the total number of interactions in the system of type ftype */
204 gmx_mtop_ftype_count(const gmx_mtop_t
*mtop
,int ftype
);
207 /* Returns a charge group index for the whole system */
209 gmx_mtop_global_cgs(const gmx_mtop_t
*mtop
);
212 /* Returns a single t_atoms struct for the whole system */
214 gmx_mtop_global_atoms(const gmx_mtop_t
*mtop
);
217 /* Make all charge groups the size of one atom.
218 * When bKeepSingleMolCG==TRUE keep charge groups for molecules
219 * that consist of a single charge group.
222 gmx_mtop_make_atomic_charge_groups(gmx_mtop_t
*mtop
,bool bKeepSingleMolCG
);
225 /* Generate a 'local' topology for the whole system.
226 * When ir!=NULL the free energy interactions will be sorted to the end.
228 extern gmx_localtop_t
*
229 gmx_mtop_generate_local_top(const gmx_mtop_t
*mtop
,const t_inputrec
*ir
);
232 /* Converts a gmx_mtop_t struct to t_topology.
233 * All memory relating only to mtop will be freed.
236 gmx_mtop_t_to_t_topology(gmx_mtop_t
*mtop
);