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_rdgroup_c
= "$Id$";
41 t_block
*init_index(char *gfile
, char ***grpname
)
47 char line
[STRLEN
],*pt
,str
[STRLEN
];
51 get_a_line(in
,line
,STRLEN
);
61 if (get_header(line
,str
)) {
63 srenew(b
->index
,b
->nr
+1);
64 srenew(*grpname
,b
->nr
);
67 b
->index
[b
->nr
]=b
->index
[b
->nr
-1];
68 (*grpname
)[b
->nr
-1]=strdup(str
);
71 while ((i
=sscanf(pt
,"%s",str
)) == 1) {
75 srenew(b
->a
,maxentries
);
80 pt
=strstr(pt
,str
)+strlen(str
);
83 } while (get_a_line(in
,line
,STRLEN
));
87 sscanf(line
,"%d%d",&b
->nr
,&b
->nra
);
88 snew(b
->index
,b
->nr
+1);
92 for (i
=0; (i
<b
->nr
); i
++) {
93 fscanf(in
,"%s%d",str
,&ng
);
94 (*grpname
)[i
]=strdup(str
);
95 b
->index
[i
+1]=b
->index
[i
]+ng
;
96 if (b
->index
[i
+1] > b
->nra
)
97 fatal_error(0,"Something wrong in your indexfile at group %s",str
);
98 for(j
=0; (j
<ng
); j
++) {
100 b
->a
[b
->index
[i
]+j
]=a
;
102 /* while (fgetc(in)!='\n'); */
110 static int qgroup(int *a
)
112 printf("Select a group: ");
117 static int rd_pascal_set(int **set
)
120 char *bb
[STRLEN
],*ptr
;
123 printf("Give a set of numbers (eg.: 1..8,13,17..21)\n");
124 fgets(buf
,STRLEN
,stdin
);
128 for(i
=0; (i
<(int)strlen(buf
)); i
++)
131 if (buf
[i
+1] != '\0')
132 bb
[nb
++] = &(buf
[i
+1]);
135 for(i
=0; (i
<nb
); i
++) {
136 if ((ptr
=strstr(bb
[i
],"..")) != NULL
) {
137 ptr
[0]=' ', ptr
[1]=' ';
138 sscanf(bb
[i
],"%d %d",&nb
,&ne
);
139 for(j
=nb
; (j
<=ne
); j
++)
143 sscanf(bb
[i
],"%d",&nb
);
147 printf("\nI found the following set:\n");
148 for(i
=0; (i
<ns
); i
++)
149 printf("%4d ",(*set
)[i
]);
155 static void rd_groups(t_block
*grps
,char **grpname
,char *gnames
[],
156 int ngrps
,int isize
[],atom_id
*index
[],int grpnr
[])
161 fatal_error(0,"Error: no groups in indexfile");
162 for(i
=0; (i
<grps
->nr
); i
++)
163 printf("Group %5d (%12s) has %5u elements\n",i
,grpname
[i
],
164 grps
->index
[i
+1]-grps
->index
[i
]);
165 for(i
=0; (i
<ngrps
); i
++) {
168 gnr1
=qgroup(&grpnr
[i
]);
169 if ((gnr1
<0) || (gnr1
>=grps
->nr
))
170 printf("Select between %d and %d.\n",0,grps
->nr
-1);
171 } while ((gnr1
<0) || (gnr1
>=grps
->nr
));
173 printf("There is one group in the index\n");
176 gnames
[i
]=strdup(grpname
[gnr1
]);
177 isize
[i
]=grps
->index
[gnr1
+1]-grps
->index
[gnr1
];
178 snew(index
[i
],isize
[i
]);
179 for(j
=0; (j
<isize
[i
]); j
++)
180 index
[i
][j
]=grps
->a
[grps
->index
[gnr1
]+j
];
184 void rd_index(char *statfile
,int ngrps
,int isize
[],
185 atom_id
*index
[],char *grpnames
[])
193 fatal_error(0,"No index file specified");
194 grps
=init_index(statfile
,&gnames
);
195 rd_groups(grps
,gnames
,grpnames
,ngrps
,isize
,index
,grpnr
);
198 void rd_index_nrs(char *statfile
,int ngrps
,int isize
[],
199 atom_id
*index
[],char *grpnames
[],int grpnr
[])
205 fatal_error(0,"No index file specified");
206 grps
=init_index(statfile
,&gnames
);
208 rd_groups(grps
,gnames
,grpnames
,ngrps
,isize
,index
,grpnr
);
211 void get_index(t_atoms
*atoms
, char *fnm
, int ngrps
,
212 int isize
[], atom_id
*index
[],char *grpnames
[])
221 grps
=init_index(fnm
,gnames
);
226 analyse(atoms
,grps
,gnames
,FALSE
,FALSE
);
228 rd_groups(grps
,*gnames
,grpnames
,ngrps
,isize
,index
,grpnr
);