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 * Gallium Rubidium Oxygen Manganese Argon Carbon Silicon
35 /* This file is completely threadsafe - keep it that way! */
41 #include "hackblock.h"
47 /* these MUST correspond to the enum in hackblock.h */
48 const char *btsNames[ebtsNR] = { "bonds", "angles", "dihedrals", "impropers", "exclusions", "cmap" };
49 const int btsNiatoms[ebtsNR] = { 2, 3, 4, 4, 2, 5 };
51 static void free_t_bonded(t_rbonded *rb)
55 for (i = 0; i < MAXATOMLIST; i++)
62 static void free_t_bondeds(t_rbondeds *rbs)
66 for (i = 0; i < rbs->nb; i++)
68 free_t_bonded(&rbs->b[i]);
75 void free_t_restp(int nrtp, t_restp **rtp)
79 for (i = 0; i < nrtp; i++)
81 sfree((*rtp)[i].resname);
82 sfree((*rtp)[i].atom);
83 for (j = 0; j < (*rtp)[i].natom; j++)
85 sfree(*(*rtp)[i].atomname[j]);
86 sfree((*rtp)[i].atomname[j]);
88 sfree((*rtp)[i].atomname);
89 sfree((*rtp)[i].cgnr);
90 for (j = 0; j < ebtsNR; j++)
92 free_t_bondeds(&(*rtp)[i].rb[j]);
98 void free_t_hack(int nh, t_hack **h)
102 for (i = 0; i < nh; i++)
104 sfree((*h)[i].oname);
105 sfree((*h)[i].nname);
107 for (j = 0; j < 4; j++)
116 void free_t_hackblock(int nhb, t_hackblock **hb)
120 for (i = 0; i < nhb; i++)
122 sfree((*hb)[i].name);
123 free_t_hack((*hb)[i].nhack, &(*hb)[i].hack);
124 for (j = 0; j < ebtsNR; j++)
126 free_t_bondeds(&(*hb)[i].rb[j]);
132 void clear_t_hackblock(t_hackblock *hb)
140 for (i = 0; i < ebtsNR; i++)
147 void clear_t_hack(t_hack *hack)
158 for (i = 0; i < 4; i++)
162 for (i = 0; i < DIM; i++)
164 hack->newx[i] = NOTSET;
168 #define safe_strdup(str) ((str != NULL) ? strdup(str) : NULL)
170 static void copy_t_rbonded(t_rbonded *s, t_rbonded *d)
174 for (i = 0; i < MAXATOMLIST; i++)
176 d->a[i] = safe_strdup(s->a[i]);
178 d->s = safe_strdup(s->s);
181 static gmx_bool contains_char(t_rbonded *s, char c)
187 for (i = 0; i < MAXATOMLIST; i++)
189 if (s->a[i] && s->a[i][0] == c)
198 gmx_bool merge_t_bondeds(t_rbondeds s[], t_rbondeds d[], gmx_bool bMin, gmx_bool bPlus)
201 gmx_bool bBondsRemoved;
203 bBondsRemoved = FALSE;
204 for (i = 0; i < ebtsNR; i++)
209 srenew(d[i].b, d[i].nb + s[i].nb);
210 for (j = 0; j < s[i].nb; j++)
212 if (!(bMin && contains_char(&s[i].b[j], '-'))
213 && !(bPlus && contains_char(&s[i].b[j], '+')))
215 copy_t_rbonded(&s[i].b[j], &d[i].b[ d[i].nb ]);
218 else if (i == ebtsBONDS)
220 bBondsRemoved = TRUE;
226 return bBondsRemoved;
229 void copy_t_restp(t_restp *s, t_restp *d)
234 d->resname = safe_strdup(s->resname);
235 snew(d->atom, s->natom);
236 for (i = 0; i < s->natom; i++)
238 d->atom[i] = s->atom[i];
240 snew(d->atomname, s->natom);
241 for (i = 0; i < s->natom; i++)
243 snew(d->atomname[i], 1);
244 *d->atomname[i] = safe_strdup(*s->atomname[i]);
246 snew(d->cgnr, s->natom);
247 for (i = 0; i < s->natom; i++)
249 d->cgnr[i] = s->cgnr[i];
251 for (i = 0; i < ebtsNR; i++)
253 d->rb[i].type = s->rb[i].type;
257 merge_t_bondeds(s->rb, d->rb, FALSE, FALSE);
260 void copy_t_hack(t_hack *s, t_hack *d)
265 d->oname = safe_strdup(s->oname);
266 d->nname = safe_strdup(s->nname);
270 *(d->atom) = *(s->atom);
276 for (i = 0; i < 4; i++)
278 d->a[i] = safe_strdup(s->a[i]);
280 copy_rvec(s->newx, d->newx);
283 void merge_hacks_lo(int ns, t_hack *s, int *nd, t_hack **d)
289 srenew(*d, *nd + ns);
290 for (i = 0; i < ns; i++)
292 copy_t_hack(&s[i], &(*d)[*nd + i]);
298 void merge_hacks(t_hackblock *s, t_hackblock *d)
300 merge_hacks_lo(s->nhack, s->hack, &d->nhack, &d->hack);
303 void merge_t_hackblock(t_hackblock *s, t_hackblock *d)
306 merge_t_bondeds(s->rb, d->rb, FALSE, FALSE);
309 void copy_t_hackblock(t_hackblock *s, t_hackblock *d)
314 d->name = safe_strdup(s->name);
317 for (i = 0; i < ebtsNR; i++)
322 merge_t_hackblock(s, d);
327 void dump_hb(FILE *out, int nres, t_hackblock hb[])
331 #define SS(s) (s) ? (s) : "-"
332 #define SA(s) (s) ? "+" : ""
333 fprintf(out, "t_hackblock\n");
334 for (i = 0; i < nres; i++)
336 fprintf(out, "%3d %4s %2d %2d\n",
337 i, SS(hb[i].name), hb[i].nhack, hb[i].maxhack);
340 for (j = 0; j < hb[i].nhack; j++)
342 fprintf(out, "%d: %d %4s %4s %1s %2d %d %4s %4s %4s %4s\n",
344 SS(hb[i].hack[j].oname), SS(hb[i].hack[j].nname),
345 SA(hb[i].hack[j].atom), hb[i].hack[j].tp, hb[i].hack[j].cgnr,
346 SS(hb[i].hack[j].AI), SS(hb[i].hack[j].AJ),
347 SS(hb[i].hack[j].AK), SS(hb[i].hack[j].AL) );
350 for (j = 0; j < ebtsNR; j++)
354 fprintf(out, " %c %d:", btsNames[j][0], hb[i].rb[j].nb);
355 for (k = 0; k < hb[i].rb[j].nb; k++)
358 for (l = 0; l < btsNiatoms[j]; l++)
360 fprintf(out, " %s", hb[i].rb[j].b[k].a[l]);
362 fprintf(out, " %s]", SS(hb[i].rb[j].b[k].s));
373 void init_t_protonate(t_protonate *protonate)
375 protonate->bInit = FALSE;