Apply clang-format to source tree
[alexxy/gromacs.git] / src / gromacs / topology / idef.h
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  * Copyright (c) 2013,2014,2015,2016,2018,2019, by the GROMACS development team, led by
7  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8  * and including many others, as listed in the AUTHORS file in the
9  * top-level source directory and at http://www.gromacs.org.
10  *
11  * GROMACS is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public License
13  * as published by the Free Software Foundation; either version 2.1
14  * of the License, or (at your option) any later version.
15  *
16  * GROMACS is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with GROMACS; if not, see
23  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
25  *
26  * If you want to redistribute modifications to GROMACS, please
27  * consider that scientific software is very special. Version
28  * control is crucial - bugs must be traceable. We will be happy to
29  * consider code for inclusion in the official distribution, but
30  * derived work must not be called official GROMACS. Details are found
31  * in the README & COPYING files - if they are missing, get the
32  * official version at http://www.gromacs.org.
33  *
34  * To help us fund GROMACS development, we humbly ask that you cite
35  * the research papers on the package. Check out http://www.gromacs.org.
36  */
37 #ifndef GMX_TOPOLOGY_IDEF_H
38 #define GMX_TOPOLOGY_IDEF_H
39
40 #include <cstdio>
41
42 #include <array>
43 #include <vector>
44
45 #include "gromacs/math/vectypes.h"
46 #include "gromacs/topology/ifunc.h"
47 #include "gromacs/utility/basedefinitions.h"
48 #include "gromacs/utility/real.h"
49
50 typedef union t_iparams {
51     /* Some parameters have A and B values for free energy calculations.
52      * The B values are not used for regular simulations of course.
53      * Free Energy for nonbondeds can be computed by changing the atom type.
54      * The harmonic type is used for all harmonic potentials:
55      * bonds, angles and improper dihedrals
56      */
57     struct
58     {
59         real a, b, c;
60     } bham;
61     struct
62     {
63         real rA, krA, rB, krB;
64     } harmonic;
65     struct
66     {
67         real klinA, aA, klinB, aB;
68     } linangle;
69     struct
70     {
71         real lowA, up1A, up2A, kA, lowB, up1B, up2B, kB;
72     } restraint;
73     /* No free energy supported for cubic bonds, FENE, WPOL or cross terms */
74     struct
75     {
76         real b0, kb, kcub;
77     } cubic;
78     struct
79     {
80         real bm, kb;
81     } fene;
82     struct
83     {
84         real r1e, r2e, krr;
85     } cross_bb;
86     struct
87     {
88         real r1e, r2e, r3e, krt;
89     } cross_ba;
90     struct
91     {
92         real thetaA, kthetaA, r13A, kUBA, thetaB, kthetaB, r13B, kUBB;
93     } u_b;
94     struct
95     {
96         real theta, c[5];
97     } qangle;
98     struct
99     {
100         real alpha;
101     } polarize;
102     struct
103     {
104         real alpha, drcut, khyp;
105     } anharm_polarize;
106     struct
107     {
108         real al_x, al_y, al_z, rOH, rHH, rOD;
109     } wpol;
110     struct
111     {
112         real a, alpha1, alpha2, rfac;
113     } thole;
114     struct
115     {
116         real c6, c12;
117     } lj;
118     struct
119     {
120         real c6A, c12A, c6B, c12B;
121     } lj14;
122     struct
123     {
124         real fqq, qi, qj, c6, c12;
125     } ljc14;
126     struct
127     {
128         real qi, qj, c6, c12;
129     } ljcnb;
130     /* Proper dihedrals can not have different multiplicity when
131      * doing free energy calculations, because the potential would not
132      * be periodic anymore.
133      */
134     struct
135     {
136         real phiA, cpA;
137         int  mult;
138         real phiB, cpB;
139     } pdihs;
140     struct
141     {
142         real dA, dB;
143     } constr;
144     /* Settle can not be used for Free energy calculations of water bond geometry.
145      * Use shake (or lincs) instead if you have to change the water bonds.
146      */
147     struct
148     {
149         real doh, dhh;
150     } settle;
151     struct
152     {
153         real b0A, cbA, betaA, b0B, cbB, betaB;
154     } morse;
155     struct
156     {
157         real pos0A[DIM], fcA[DIM], pos0B[DIM], fcB[DIM];
158     } posres;
159     struct
160     {
161         real pos0[DIM], r, k;
162         int  geom;
163     } fbposres;
164     struct
165     {
166         real rbcA[NR_RBDIHS], rbcB[NR_RBDIHS];
167     } rbdihs;
168     struct
169     {
170         real cbtcA[NR_CBTDIHS], cbtcB[NR_CBTDIHS];
171     } cbtdihs;
172     struct
173     {
174         real a, b, c, d, e, f;
175     } vsite;
176     struct
177     {
178         int  n;
179         real a;
180     } vsiten;
181     /* NOTE: npair is only set after reading the tpx file */
182     struct
183     {
184         real low, up1, up2, kfac;
185         int  type, label, npair;
186     } disres;
187     struct
188     {
189         real phiA, dphiA, kfacA, phiB, dphiB, kfacB;
190     } dihres;
191     struct
192     {
193         int  ex, power, label;
194         real c, obs, kfac;
195     } orires;
196     struct
197     {
198         int  table;
199         real kA;
200         real kB;
201     } tab;
202     struct
203     {
204         int cmapA, cmapB;
205     } cmap;
206     struct
207     {
208         real buf[MAXFORCEPARAM];
209     } generic; /* Conversion */
210 } t_iparams;
211
212 typedef int t_functype;
213
214 /* List of listed interactions, see description further down.
215  *
216  * TODO: Consider storing the function type as well.
217  * TODO: Consider providing per interaction access.
218  */
219 struct InteractionList
220 {
221     /* Returns the total number of elements in iatoms */
222     int size() const { return gmx::ssize(iatoms); }
223
224     /* List of interactions, see explanation further down */
225     std::vector<int> iatoms;
226 };
227
228 /* List of interaction lists, one list for each interaction type
229  *
230  * TODO: Consider only including entries in use instead of all F_NRE
231  */
232 typedef std::array<InteractionList, F_NRE> InteractionLists;
233
234 /* Deprecated list of listed interactions.
235  *
236  * The nonperturbed/perturbed interactions are now separated (sorted) in the
237  * ilist, such that the first 0..(nr_nonperturbed-1) ones are exactly that, and
238  * the remaining ones from nr_nonperturbed..(nr-1) are perturbed bonded
239  * interactions.
240  */
241 struct t_ilist
242 {
243     /* Returns the total number of elements in iatoms */
244     int size() const { return nr; }
245
246     int      nr;
247     int      nr_nonperturbed;
248     t_iatom* iatoms;
249     int      nalloc;
250 };
251
252 /* TODO: Replace t_ilist in gmx_localtop_t by InteractionList.
253  *       The nr_nonperturbed functionality needs to be ported.
254  *       Remove t_topology.
255  *       Remove t_ilist and remove templating on list type
256  *       in mshift.cpp, constr.cpp, vsite.cpp and domdec_topology.cpp.
257  */
258
259 /*
260  * The structs InteractionList and t_ilist defines a list of atoms with their interactions.
261  * General field description:
262  *   int nr
263  *      the size (nr elements) of the interactions array (iatoms[]).
264  *   t_iatom *iatoms
265  *  specifies which atoms are involved in an interaction of a certain
266  *       type. The layout of this array is as follows:
267  *
268  *        +-----+---+---+---+-----+---+---+-----+---+---+---+-----+---+---+...
269  *        |type1|at1|at2|at3|type2|at1|at2|type1|at1|at2|at3|type3|at1|at2|
270  *        +-----+---+---+---+-----+---+---+-----+---+---+---+-----+---+---+...
271  *
272  *  So for interaction type type1 3 atoms are needed, and for type2 and
273  *      type3 only 2. The type identifier is used to select the function to
274  *      calculate the interaction and its actual parameters. This type
275  *      identifier is an index in a params[] and functype[] array.
276  */
277
278 /*! \brief Type for returning a list of InteractionList references
279  *
280  * TODO: Remove when the function type is made part of InteractionList
281  */
282 struct InteractionListHandle
283 {
284     const int               functionType; //!< The function type
285     const std::vector<int>& iatoms;       //!< Reference to interaction list
286 };
287
288 /*! \brief Returns a list of all non-empty InteractionList entries with any of the interaction flags in \p flags set
289  *
290  * \param[in] ilists  Set of interaction lists
291  * \param[in] flags   Bit mask with one or more IF_... bits set
292  */
293 static inline std::vector<InteractionListHandle> extractILists(const InteractionLists& ilists, int flags)
294 {
295     std::vector<InteractionListHandle> handles;
296     for (size_t ftype = 0; ftype < ilists.size(); ftype++)
297     {
298         if ((interaction_function[ftype].flags & flags) && ilists[ftype].size() > 0)
299         {
300             handles.push_back({ static_cast<int>(ftype), ilists[ftype].iatoms });
301         }
302     }
303     return handles;
304 }
305
306 /*! \brief Returns the stride for the iatoms array in \p ilistHandle
307  *
308  * \param[in] ilistHandle  The ilist to return the stride for
309  */
310 static inline int ilistStride(const InteractionListHandle& ilistHandle)
311 {
312     return 1 + NRAL(ilistHandle.functionType);
313 }
314
315 struct gmx_cmapdata_t
316 {
317     std::vector<real> cmap; /* Has length 4*grid_spacing*grid_spacing, */
318     /* there are 4 entries for each cmap type (V,dVdx,dVdy,d2dVdxdy) */
319 };
320
321 struct gmx_cmap_t
322 {
323     int                         grid_spacing = 0; /* Grid spacing */
324     std::vector<gmx_cmapdata_t> cmapdata; /* Lists of grids with actual, pre-interpolated data */
325 };
326
327
328 enum
329 {
330     ilsortUNKNOWN,
331     ilsortNO_FE,
332     ilsortFE_UNSORTED,
333     ilsortFE_SORTED
334 };
335
336 typedef struct t_idef
337 {
338     int         ntypes;
339     int         atnr;
340     t_functype* functype;
341     t_iparams*  iparams;
342     real        fudgeQQ;
343     gmx_cmap_t* cmap_grid;
344     t_iparams * iparams_posres, *iparams_fbposres;
345     int         iparams_posres_nalloc, iparams_fbposres_nalloc;
346
347     t_ilist il[F_NRE];
348     int     ilsort;
349 } t_idef;
350
351 /*
352  * The struct t_idef defines all the interactions for the complete
353  * simulation. The structure is setup in such a way that the multinode
354  * version of the program  can use it as easy as the single node version.
355  * General field description:
356  *   int ntypes
357  *      defines the number of elements in functype[] and param[].
358  *   int nodeid
359  *      the node id (if parallel machines)
360  *   int atnr
361  *      the number of atomtypes
362  *   t_functype *functype
363  *      array of length ntypes, defines for every force type what type of
364  *      function to use. Every "bond" with the same function but different
365  *      force parameters is a different force type. The type identifier in the
366  *      forceatoms[] array is an index in this array.
367  *   t_iparams *iparams
368  *      array of length ntypes, defines the parameters for every interaction
369  *      type. The type identifier in the actual interaction list
370  *      (ilist[ftype].iatoms[]) is an index in this array.
371  *   gmx_cmap_t cmap_grid
372  *      the grid for the dihedral pair correction maps.
373  *   t_iparams *iparams_posres, *iparams_fbposres
374  *      defines the parameters for position restraints only.
375  *      Position restraints are the only interactions that have different
376  *      parameters (reference positions) for different molecules
377  *      of the same type. ilist[F_POSRES].iatoms[] is an index in this array.
378  *   t_ilist il[F_NRE]
379  *      The list of interactions for each type. Note that some,
380  *      such as LJ and COUL will have 0 entries.
381  *   int ilsort
382  *      The state of the sorting of il, values are provided above.
383  */
384
385 void pr_iparams(FILE* fp, t_functype ftype, const t_iparams* iparams);
386 void pr_ilist(FILE*                  fp,
387               int                    indent,
388               const char*            title,
389               const t_functype*      functype,
390               const InteractionList& ilist,
391               gmx_bool               bShowNumbers,
392               gmx_bool               bShowParameters,
393               const t_iparams*       iparams);
394 void pr_idef(FILE* fp, int indent, const char* title, const t_idef* idef, gmx_bool bShowNumbers, gmx_bool bShowParameters);
395
396 /*! \brief
397  * Properly initialize idef struct.
398  *
399  * \param[in] idef Pointer to idef struct to initialize.
400  */
401 void init_idef(t_idef* idef);
402
403 /*! \brief
404  * Properly clean up idef struct.
405  *
406  * \param[in] idef Pointer to idef struct to clean up.
407  */
408 void done_idef(t_idef* idef);
409
410 void copy_ilist(const t_ilist* src, t_ilist* dst);
411
412 #endif