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 * Green Red Orange Magenta Azure Cyan Skyblue
29 static char *SRCID_calch_c
= "$Id$";
45 void gen_waterhydrogen(rvec xa
[], rvec xh
[])
50 const rvec matrix1
[6] = {
58 const rvec matrix2
[6] = {
72 /* This was copied from Gromos */
73 for(m
=0; (m
<DIM
); m
++) {
74 xH1
[m
]=xAI
[m
]+matrix1
[l
][m
];
75 xH2
[m
]=xAI
[m
]+matrix2
[l
][m
];
81 void calc_h_pos(int nht
, rvec xa
[], rvec xh
[])
83 #define alfaH (DEG2RAD*109.5)
86 #define alfaCOM (DEG2RAD*117)
87 #define alfaCO (DEG2RAD*121)
88 #define alfaCOA (DEG2RAD*115)
100 /* common work for constructing one, two or three dihedral hydrogens */
108 for(d
=0; (d
<DIM
); d
++) {
115 sa
[XX
] = sij
[YY
]*sb
[ZZ
]-sij
[ZZ
]*sb
[YY
];
116 sa
[YY
] = sij
[ZZ
]*sb
[XX
]-sij
[XX
]*sb
[ZZ
];
117 sa
[ZZ
] = sij
[XX
]*sb
[YY
]-sij
[YY
]*sb
[XX
];
119 for(d
=0; (d
<DIM
); d
++) {
124 for(d
=0; (d
<DIM
); d
++)
127 sb
[XX
] = sa
[YY
]*sij
[ZZ
]-sa
[ZZ
]*sij
[YY
];
128 sb
[YY
] = sa
[ZZ
]*sij
[XX
]-sa
[XX
]*sij
[ZZ
];
129 sb
[ZZ
] = sa
[XX
]*sij
[YY
]-sa
[YY
]*sij
[XX
];
134 case 1: /* construct one planar hydrogen (peptide,rings) */
137 for(d
=0; (d
<DIM
); d
++) {
138 sij
[d
] = xAI
[d
]-xAJ
[d
];
139 sb
[d
] = xAI
[d
]-xAK
[d
];
146 for(d
=0; (d
<DIM
); d
++) {
147 sa
[d
] = sij
[d
]/rij
+sb
[d
]/rb
;
151 for(d
=0; (d
<DIM
); d
++)
152 xH1
[d
] = xAI
[d
]+distH
*sa
[d
]/ra
;
154 case 2: /* one single hydrogen, e.g. hydroxyl */
155 for(d
=0; (d
<DIM
); d
++) {
156 xH1
[d
] = xAI
[d
]+distH
*sin(alfaH
)*sb
[d
]-distH
*cos(alfaH
)*sij
[d
];
159 case 3: /* two planar hydrogens, e.g. -NH2 */
160 for(d
=0; (d
<DIM
); d
++) {
161 xH1
[d
] = xAI
[d
]-distH
*sin(alfaH
)*sb
[d
]-distH
*cos(alfaH
)*sij
[d
];
162 xH2
[d
] = xAI
[d
]+distH
*sin(alfaH
)*sb
[d
]-distH
*cos(alfaH
)*sij
[d
];
165 case 4: /* two or three tetrahedral hydrogens, e.g. -CH3 */
166 for(d
=0; (d
<DIM
); d
++) {
167 xH1
[d
] = xAI
[d
]+distH
*sin(alfaH
)*sb
[d
]-distH
*cos(alfaH
)*sij
[d
];
169 - distH
*sin(alfaH
)*0.5*sb
[d
]
170 + distH
*sin(alfaH
)*s6
*sa
[d
]
171 - distH
*cos(alfaH
)*sij
[d
] );
172 if ( xH3
[XX
]!=NOTSET
&& xH3
[YY
]!=NOTSET
&& xH3
[ZZ
]!=NOTSET
)
174 - distH
*sin(alfaH
)*0.5*sb
[d
]
175 - distH
*sin(alfaH
)*s6
*sa
[d
]
176 - distH
*cos(alfaH
)*sij
[d
] );
179 case 5: { /* one tetrahedral hydrogen, e.g. C3CH */
183 for(d
=0; (d
<DIM
); d
++) {
184 center
=(xAJ
[d
]+xAK
[d
]+xAL
[d
])/3.0;
185 dxc
[d
]=xAI
[d
]-center
;
188 for(d
=0; (d
<DIM
); d
++)
189 xH1
[d
]=xAI
[d
]+dxc
[d
]*distH
/center
;
192 case 6: { /* two tetrahedral hydrogens, e.g. C-CH2-C */
193 rvec rBB
,rCC1
,rCC2
,rNN
;
196 for(d
=0; (d
<DIM
); d
++)
197 rBB
[d
]=xAI
[d
]-0.5*(xAJ
[d
]+xAK
[d
]);
200 rvec_sub(xAI
,xAJ
,rCC1
);
201 rvec_sub(xAI
,xAK
,rCC2
);
202 oprod(rCC1
,rCC2
,rNN
);
205 for(d
=0; (d
<DIM
); d
++) {
206 xH1
[d
]=xAI
[d
]+distH
*(cos(alfaH
/2.0)*rBB
[d
]/bb
+
207 sin(alfaH
/2.0)*rNN
[d
]/nn
);
208 xH2
[d
]=xAI
[d
]+distH
*(cos(alfaH
/2.0)*rBB
[d
]/bb
-
209 sin(alfaH
/2.0)*rNN
[d
]/nn
);
213 case 7: /* two water hydrogens */
214 gen_waterhydrogen(xa
, xh
);
216 case 8: /* two carboxyl oxygens, -COO- */
217 for(d
=0; (d
<DIM
); d
++) {
218 xH1
[d
] = xAI
[d
]-distOM
*sin(alfaCOM
)*sb
[d
]-distOM
*cos(alfaCOM
)*sij
[d
];
219 xH2
[d
] = xAI
[d
]+distOM
*sin(alfaCOM
)*sb
[d
]-distOM
*cos(alfaCOM
)*sij
[d
];
222 case 9: { /* carboxyl oxygens and hydrogen, -COOH */
223 rvec xa2
[4]; /* i,j,k,l */
225 /* first add two oxygens */
226 for(d
=0; (d
<DIM
); d
++) {
227 xH1
[d
] = xAI
[d
]-distO
*sin(alfaCO
)*sb
[d
]-distO
*cos(alfaCO
)*sij
[d
];
228 xH2
[d
] = xAI
[d
]+distOA
*sin(alfaCOA
)*sb
[d
]-distOA
*cos(alfaCOA
)*sij
[d
];
231 /* now use rule 2 to add hydrogen to 2nd oxygen */
232 copy_rvec(xH2
, xa2
[0]); /* new i = n' */
233 copy_rvec(xAI
, xa2
[1]); /* new j = i */
234 copy_rvec(xAJ
, xa2
[2]); /* new k = j */
235 copy_rvec(xAK
, xa2
[3]); /* new l = k, not used */
236 calc_h_pos(2, xa2
, &xH3
);
241 fatal_error(0,"Invalid argument (%d) for nht in routine genh\n",nht
);