0be9b8bb1ec0b5b0028c83ade77edef8209508f4
[alexxy/gromacs.git] / src / gromacs / topology / ifunc.cpp
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,2017,2018 by the GROMACS development team.
7  * Copyright (c) 2019,2020, by the GROMACS development team, led by
8  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
9  * and including many others, as listed in the AUTHORS file in the
10  * top-level source directory and at http://www.gromacs.org.
11  *
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.
16  *
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.
21  *
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.
26  *
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.
34  *
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.
37  */
38 /* This file is completely threadsafe - keep it that way! */
39 #include "gmxpre.h"
40
41 #include "ifunc.h"
42
43 #define def_bonded(str, lstr, nra, nrpa, nrpb)    \
44     {                                             \
45         str, lstr, (nra), (nrpa), (nrpb), IF_BOND \
46     }
47
48 #define def_pair(str, lstr, nra, nrpa, nrpb)                             \
49     {                                                                    \
50         str, lstr, (nra), (nrpa), (nrpb), IF_BOND | IF_PAIR | IF_LIMZERO \
51     }
52
53 #define def_bondedt(str, lstr, nra, nrpa, nrpb)                  \
54     {                                                            \
55         str, lstr, (nra), (nrpa), (nrpb), IF_BOND | IF_TABULATED \
56     }
57
58 #define def_bondedtz(str, lstr, nra, nrpa, nrpb)                              \
59     {                                                                         \
60         str, lstr, (nra), (nrpa), (nrpb), IF_BOND | IF_TABULATED | IF_LIMZERO \
61     }
62
63 #define def_angle(str, lstr, nra, nrpa, nrpb)                \
64     {                                                        \
65         str, lstr, (nra), (nrpa), (nrpb), IF_BOND | IF_ATYPE \
66     }
67
68 #define def_dihedral(str, lstr, nra, nrpa, nrpb)                \
69     {                                                           \
70         str, lstr, (nra), (nrpa), (nrpb), IF_BOND | IF_DIHEDRAL \
71     }
72
73 #define def_dihedral_tabulated(str, lstr, nra, nrpa, nrpb)                     \
74     {                                                                          \
75         str, lstr, (nra), (nrpa), (nrpb), IF_BOND | IF_DIHEDRAL | IF_TABULATED \
76     }
77
78 #define def_bond(str, lstr, nra, nrpa, nrpb)                               \
79     {                                                                      \
80         str, lstr, (nra), (nrpa), (nrpb), IF_BOND | IF_CHEMBOND | IF_BTYPE \
81     }
82
83 #define def_bondt(str, lstr, nra, nrpa, nrpb)                                  \
84     {                                                                          \
85         str, lstr, (nra), (nrpa), (nrpb), IF_BOND | IF_CHEMBOND | IF_TABULATED \
86     }
87
88 #define def_bondnb(str, lstr, nra, nrpa, nrpb)                  \
89     {                                                           \
90         str, lstr, (nra), (nrpa), (nrpb), IF_BOND | IF_CHEMBOND \
91     }
92
93 #define def_vsite(str, lstr, nra, nrpa)       \
94     {                                         \
95         str, lstr, (nra), (nrpa), 0, IF_VSITE \
96     }
97
98 #define def_shk(str, lstr, nra, nrpa, nrpb)             \
99     {                                                   \
100         str, lstr, (nra), (nrpa), (nrpb), IF_CONSTRAINT \
101     }
102
103 #define def_shkcb(str, lstr, nra, nrpa, nrpb)                         \
104     {                                                                 \
105         str, lstr, (nra), (nrpa), (nrpb), IF_CONSTRAINT | IF_CHEMBOND \
106     }
107
108 #define def_nb(str, lstr, nra, nrp)         \
109     {                                       \
110         str, lstr, (nra), (nrp), 0, IF_NULL \
111     }
112
113 #define def_nofc(str, lstr)         \
114     {                               \
115         str, lstr, 0, 0, 0, IF_NULL \
116     }
117
118 /* this MUST correspond to the enum in src/gromacs/topology/ifunc.h */
119 const t_interaction_function interaction_function[F_NRE] = {
120     def_bond("BONDS", "Bond", 2, 2, 2), def_bond("G96BONDS", "G96Bond", 2, 2, 2),
121     def_bond("MORSE", "Morse", 2, 3, 3), def_bond("CUBICBONDS", "Cubic Bonds", 2, 3, 0),
122     def_bondnb("CONNBONDS", "Connect Bonds", 2, 0, 0),
123     def_bonded("HARMONIC", "Harmonic Pot.", 2, 2, 2), def_bondnb("FENEBONDS", "FENE Bonds", 2, 2, 0),
124     def_bondt("TABBONDS", "Tab. Bonds", 2, 2, 2), def_bondedtz("TABBONDSNC", "Tab. Bonds NC", 2, 2, 2),
125     def_bonded("RESTRAINTPOT", "Restraint Pot.", 2, 4, 4), def_angle("ANGLES", "Angle", 3, 2, 2),
126     def_angle("G96ANGLES", "G96Angle", 3, 2, 2), def_angle("RESTRANGLES", "Restricted Angles", 3, 2, 2),
127     def_angle("LINEAR_ANGLES", "Lin. Angle", 3, 2, 2),
128     def_bonded("CROSS_BOND_BOND", "Bond-Cross", 3, 3, 0),
129     def_bonded("CROSS_BOND_ANGLE", "BA-Cross", 3, 4, 0), def_angle("UREY_BRADLEY", "U-B", 3, 4, 4),
130     def_angle("QANGLES", "Quartic Angles", 3, 6, 0), def_bondedt("TABANGLES", "Tab. Angles", 3, 2, 2),
131     def_dihedral("PDIHS", "Proper Dih.", 4, 3, 3), def_dihedral("RBDIHS", "Ryckaert-Bell.", 4, 6, 6),
132     def_dihedral("RESTRDIHS", "Restricted Dih.", 4, 2, 2),
133     def_dihedral("CBTDIHS", "CBT Dih.", 4, 6, 6), def_dihedral("FOURDIHS", "Fourier Dih.", 4, 4, 4),
134     def_dihedral("IDIHS", "Improper Dih.", 4, 2, 2), def_dihedral("PIDIHS", "Improper Dih.", 4, 3, 3),
135     def_dihedral_tabulated("TABDIHS", "Tab. Dih.", 4, 2, 2),
136     def_dihedral("CMAP", "CMAP Dih.", 5, -1, -1), def_nofc("GB12", "GB 1-2 Pol. (unused)"),
137     def_nofc("GB13", "GB 1-3 Pol. (unused)"), def_nofc("GB14", "GB 1-4 Pol. (unused)"),
138     def_nofc("GBPOL", "GB Polarization (unused)"), def_nofc("NPSOLVATION", "Nonpolar Sol. (unused)"),
139     def_pair("LJ14", "LJ-14", 2, 2, 2), def_nofc("COUL14", "Coulomb-14"),
140     def_pair("LJC14_Q", "LJC-14 q", 2, 5, 0), def_pair("LJC_NB", "LJC Pairs NB", 2, 4, 0),
141     def_nb("LJ_SR", "LJ (SR)", 2, 2), def_nb("BHAM", "Buck.ham (SR)", 2, 3),
142     def_nofc("LJ_LR", "LJ (unused)"), def_nofc("BHAM_LR", "B.ham (unused)"),
143     def_nofc("DISPCORR", "Disper. corr."), def_nofc("COUL_SR", "Coulomb (SR)"),
144     def_nofc("COUL_LR", "Coul (unused)"), def_nofc("RF_EXCL", "RF excl."),
145     def_nofc("COUL_RECIP", "Coul. recip."), def_nofc("LJ_RECIP", "LJ recip."),
146     def_nofc("DPD", "DPD"), def_bondnb("POLARIZATION", "Polarization", 2, 1, 0),
147     def_bonded("WATERPOL", "Water Pol.", 5, 6, 0), def_bonded("THOLE", "Thole Pol.", 4, 3, 0),
148     def_bondnb("ANHARM_POL", "Anharm. Pol.", 2, 3, 0), def_bonded("POSRES", "Position Rest.", 1, 3, 3),
149     def_bonded("FBPOSRES", "Flat-bottom posres", 1, 3, 0), def_bonded("DISRES", "Dis. Rest.", 2, 6, 0),
150     def_nofc("DISRESVIOL", "D.R.Viol. (nm)"), def_bonded("ORIRES", "Orient. Rest.", 2, 6, 0),
151     def_nofc("ORDEV", "Ori. R. RMSD"), def_bonded("ANGRES", "Angle Rest.", 4, 3, 3),
152     def_bonded("ANGRESZ", "Angle Rest. Z", 2, 3, 3), def_bonded("DIHRES", "Dih. Rest.", 4, 3, 3),
153     def_nofc("DIHRESVIOL", "Dih. Rest. Viol."), /* obsolete */
154     def_shkcb("CONSTR", "Constraint", 2, 1, 1), def_shk("CONSTRNC", "Constr. No Conn.", 2, 1, 1),
155     def_shkcb("SETTLE", "Settle", 3, 2, 0), def_vsite("VSITE1", "Virtual site 1", 2, 0),
156     def_vsite("VSITE2", "Virtual site 2", 3, 1), def_vsite("VSITE2FD", "Virtual site 2fd", 3, 1),
157     def_vsite("VSITE3", "Virtual site 3", 4, 2), def_vsite("VSITE3FD", "Virtual site 3fd", 4, 2),
158     def_vsite("VSITE3FAD", "Virtual site 3fad", 4, 2),
159     def_vsite("VSITE3OUT", "Virtual site 3out", 4, 3), def_vsite("VSITE4FD", "Virtual site 4fd", 5, 3),
160     def_vsite("VSITE4FDN", "Virtual site 4fdn", 5, 3), def_vsite("VSITEN", "Virtual site N", 2, 2),
161     def_nofc("COM_PULL", "COM Pull En."), def_nofc("DENSITYFIT", "Density fitting"),
162     def_nofc("EQM", "Quantum En."), def_nofc("EPOT", "Potential"), def_nofc("EKIN", "Kinetic En."),
163     def_nofc("ETOT", "Total Energy"), def_nofc("ECONS", "Conserved En."),
164     def_nofc("TEMP", "Temperature"), def_nofc("VTEMP", "Vir. Temp. (not used)"),
165     /* Note that pressure names can not be more than 8 char's,
166      * because " (bar)" is appended to them.
167      */
168     def_nofc("PDISPCORR", "Pres. DC"), def_nofc("PRES", "Pressure"),
169     def_nofc("DH/DL_CON", "dH/dl constr."), /* obsolete */
170     def_nofc("DV/DL", "dVremain/dl"), def_nofc("DK/DL", "dEkin/dl"), def_nofc("DVC/DL", "dVcoul/dl"),
171     def_nofc("DVV/DL", "dVvdw/dl"), def_nofc("DVB/DL", "dVbonded/dl"),
172     def_nofc("DVR/DL", "dVrestraint/dl"), def_nofc("DVT/DL", "dVtemperature/dl")
173 };