bc46c5802e20ea574e65a99184bfe434de89d7d4
[alexxy/gromacs.git] / src / gromacs / gmxpreprocess / readadress.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2009 Christoph Junghans, Brad Lambeth.
5  * Copyright (c) 2012,2014, by the GROMACS development team, led by
6  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
7  * and including many others, as listed in the AUTHORS file in the
8  * top-level source directory and at http://www.gromacs.org.
9  *
10  * GROMACS is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public License
12  * as published by the Free Software Foundation; either version 2.1
13  * of the License, or (at your option) any later version.
14  *
15  * GROMACS is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with GROMACS; if not, see
22  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
23  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
24  *
25  * If you want to redistribute modifications to GROMACS, please
26  * consider that scientific software is very special. Version
27  * control is crucial - bugs must be traceable. We will be happy to
28  * consider code for inclusion in the official distribution, but
29  * derived work must not be called official GROMACS. Details are found
30  * in the README & COPYING files - if they are missing, get the
31  * official version at http://www.gromacs.org.
32  *
33  * To help us fund GROMACS development, we humbly ask that you cite
34  * the research papers on the package. Check out http://www.gromacs.org.
35  */
36 #include "gmxpre.h"
37
38 #include <stdlib.h>
39 #include <string.h>
40
41 #include "readir.h"
42 #include "gromacs/legacyheaders/names.h"
43 #include "gromacs/utility/cstringutil.h"
44 #include "gromacs/utility/fatalerror.h"
45 #include "gromacs/utility/smalloc.h"
46
47 #define MAXPTR 254
48
49 static char adress_refs[STRLEN], adress_tf_grp_names[STRLEN], adress_cg_grp_names[STRLEN];
50
51 void read_adressparams(int *ninp_p, t_inpfile **inp_p, t_adress *adress, warninp_t wi)
52 {
53     int         nadress_refs, i;
54     const char *tmp;
55     char       *ptr1[MAXPTR];
56
57
58     int        ninp;
59     t_inpfile *inp;
60
61     ninp   = *ninp_p;
62     inp    = *inp_p;
63
64     EETYPE("adress_type",                adress->type,         eAdresstype_names);
65     RTYPE ("adress_const_wf",            adress->const_wf,     1);
66     RTYPE ("adress_ex_width",            adress->ex_width,     0);
67     RTYPE ("adress_hy_width",            adress->hy_width,     0);
68     RTYPE ("adress_ex_forcecap",         adress->ex_forcecap,     0);
69     EETYPE("adress_interface_correction", adress->icor,         eAdressICtype_names);
70     EETYPE("adress_site",                adress->site,         eAdressSITEtype_names);
71     STYPE ("adress_reference_coords",    adress_refs,             NULL);
72     STYPE ("adress_tf_grp_names",        adress_tf_grp_names,     NULL);
73     STYPE ("adress_cg_grp_names",        adress_cg_grp_names,     NULL);
74     EETYPE("adress_do_hybridpairs",      adress->do_hybridpairs, yesno_names);
75
76     nadress_refs = str_nelem(adress_refs, MAXPTR, ptr1);
77
78     for (i = 0; (i < nadress_refs); i++) /*read vector components*/
79     {
80         adress->refs[i] = strtod(ptr1[i], NULL);
81     }
82     for (; (i < DIM); i++) /*remaining undefined components of the vector set to zero*/
83     {
84         adress->refs[i] = 0;
85     }
86
87     *ninp_p   = ninp;
88     *inp_p    = inp;
89 }
90
91 void do_adress_index(t_adress *adress, gmx_groups_t *groups, char **gnames, t_grpopts *opts, warninp_t wi)
92 {
93     int      nr, i, j, k;
94     char    *ptr1[MAXPTR];
95     int      nadress_cg_grp_names, nadress_tf_grp_names;
96
97     /* AdResS coarse grained groups input */
98
99     nr = groups->grps[egcENER].nr;
100     snew(adress->group_explicit, nr);
101     for (i = 0; i < nr; i++)
102     {
103         adress->group_explicit[i] = TRUE;
104     }
105     adress->n_energy_grps = nr;
106
107     nadress_cg_grp_names = str_nelem(adress_cg_grp_names, MAXPTR, ptr1);
108
109     if (nadress_cg_grp_names > 0)
110     {
111         for (i = 0; i < nadress_cg_grp_names; i++)
112         {
113             /* search for the group name mathching the tf group name */
114             k = 0;
115             while ((k < nr) &&
116                    gmx_strcasecmp(ptr1[i], (char*)(gnames[groups->grps[egcENER].nm_ind[k]])))
117             {
118                 k++;
119             }
120             if (k == nr)
121             {
122                 gmx_fatal(FARGS, "Adress cg energy group %s not found\n", ptr1[i]);
123             }
124             adress->group_explicit[k] = FALSE;
125             printf ("AdResS: Energy group %s is treated as coarse-grained \n",
126                     (char*)(gnames[groups->grps[egcENER].nm_ind[k]]));
127         }
128         /* set energy group exclusions between all coarse-grained and explicit groups */
129         for (j = 0; j < nr; j++)
130         {
131             for (k = 0; k < nr; k++)
132             {
133                 if (!(adress->group_explicit[k] == adress->group_explicit[j]))
134                 {
135                     opts->egp_flags[nr * j + k] |= EGP_EXCL;
136                     if (debug)
137                     {
138                         fprintf(debug, "AdResS excl %s %s \n",
139                                 (char*)(gnames[groups->grps[egcENER].nm_ind[j]]),
140                                 (char*)(gnames[groups->grps[egcENER].nm_ind[k]]));
141                     }
142                 }
143             }
144         }
145     }
146     else
147     {
148         warning(wi, "For an AdResS simulation at least one coarse-grained energy group has to be specified in adress_cg_grp_names");
149     }
150
151
152     /* AdResS multiple tf tables input */
153     nadress_tf_grp_names = str_nelem(adress_tf_grp_names, MAXPTR, ptr1);
154     adress->n_tf_grps    = nadress_tf_grp_names;
155     snew(adress->tf_table_index, nadress_tf_grp_names);
156
157     nr = groups->grps[egcENER].nr;
158
159     if (nadress_tf_grp_names > 0)
160     {
161         for (i = 0; i < nadress_tf_grp_names; i++)
162         {
163             /* search for the group name mathching the tf group name */
164             k = 0;
165             while ((k < nr) &&
166                    gmx_strcasecmp(ptr1[i], (char*)(gnames[groups->grps[egcENER].nm_ind[k]])))
167             {
168                 k++;
169             }
170             if (k == nr)
171             {
172                 gmx_fatal(FARGS, "Adress tf energy group %s not found\n", ptr1[i]);
173             }
174
175             adress->tf_table_index[i] = k;
176             if (debug)
177             {
178                 fprintf(debug, "found tf group %s id %d \n", ptr1[i], k);
179             }
180             if (adress->group_explicit[k])
181             {
182                 gmx_fatal(FARGS, "Thermodynamic force group %s is not a coarse-grained group in adress_cg_grp_names. The thermodynamic force has to act on the coarse-grained vsite of a molecule.\n", ptr1[i]);
183             }
184
185         }
186     }
187     /* end AdResS multiple tf tables input */
188
189
190 }