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 * Green Red Orange Magenta Azure Cyan Skyblue
55 #include "gmx_fatal.h"
65 void print_stat(rvec *x,int natoms,matrix box)
69 for(m=0;(m<DIM);m++) {
73 for(i=0;(i<natoms);i++) {
75 xmin[m]=min(xmin[m],x[i][m]);
76 xmax[m]=max(xmax[m],x[i][m]);
80 fprintf(stderr,"DIM %d XMIN %8.3f XMAX %8.3f BOX %8.3f\n",
81 m,xmin[m],xmax[m],box[m][m]);
85 static bool in_box(t_pbc *pbc,rvec x)
90 calc_box_center(ecenterTRIC,pbc->box,box_center);
92 shift = pbc_dx_aiuc(pbc,x,box_center,dx);
94 return (shift == CENTRAL);
97 static void mk_vdw(t_atoms *a,real rvdw[],gmx_atomprop_t aps,
102 /* initialise van der waals arrays of configuration */
103 fprintf(stderr,"Initialising van der waals distances...\n");
104 for(i=0; (i < a->nr); i++)
105 if (!gmx_atomprop_query(aps,epropVDW,
106 *(a->resinfo[a->atom[i].resind].name),
107 *(a->atomname[i]),&(rvdw[i])))
108 rvdw[i] = r_distance;
119 void sort_molecule(t_atoms **atoms_solvt,rvec *x,rvec *v,real *r)
121 int atnr,i,j,moltp=0,nrmoltypes,resnr;
122 t_moltypes *moltypes;
124 t_atoms *atoms,*newatoms;
125 rvec *newx, *newv=NULL;
128 fprintf(stderr,"Sorting configuration\n");
130 atoms = *atoms_solvt;
132 /* copy each residue from *atoms to a molecule in *molecule */
137 for (i=0; i<atoms->nr; i++) {
138 if ( (i==0) || (atoms->atom[i].resind != atoms->atom[i-1].resind) ) {
139 /* see if this was a molecule type we haven't had yet: */
141 for (j=0; (j<nrmoltypes) && (moltp==NOTSET); j++)
142 if (strcmp(*(atoms->resinfo[atoms->atom[i].resind].name),
143 moltypes[j].name)==0)
148 srenew(moltypes,nrmoltypes);
149 moltypes[moltp].name=*(atoms->resinfo[atoms->atom[i].resind].name);
151 while ((i+atnr<atoms->nr) &&
152 (atoms->atom[i].resind == atoms->atom[i+atnr].resind))
154 moltypes[moltp].natoms=atnr;
155 moltypes[moltp].nmol=0;
157 moltypes[moltp].nmol++;
162 fprintf(stderr,"Found %d%s molecule type%s:\n",
163 nrmoltypes,nrmoltypes==1?"":" different",nrmoltypes==1?"":"s");
164 for(j=0; j<nrmoltypes; j++) {
166 moltypes[j].res0 = 0;
168 moltypes[j].res0 = moltypes[j-1].res0+moltypes[j-1].nmol;
169 fprintf(stderr,"%7s (%4d atoms): %5d residues\n",
170 moltypes[j].name,moltypes[j].natoms,moltypes[j].nmol);
173 /* if we have only 1 moleculetype, we don't have to sort */
175 /* find out which molecules should go where: */
176 moltypes[0].i = moltypes[0].i0 = 0;
177 for(j=1; j<nrmoltypes; j++) {
180 moltypes[j-1].i0+moltypes[j-1].natoms*moltypes[j-1].nmol;
183 /* now put them there: */
185 init_t_atoms(newatoms,atoms->nr,FALSE);
186 newatoms->nres=atoms->nres;
187 snew(newatoms->resinfo,atoms->nres);
188 snew(newx,atoms->nr);
189 if (v) snew(newv,atoms->nr);
190 snew(newr,atoms->nr);
192 for (i=0; i<atoms->nr; i++) {
193 resnr = moltypes[tps[i]].res0 +
194 (moltypes[tps[i]].i-moltypes[tps[i]].i0) / moltypes[tps[i]].natoms;
195 newatoms->atom[moltypes[tps[i]].i].resind = resnr;
196 newatoms->resinfo[resnr] = atoms->resinfo[atoms->atom[i].resind];
197 newatoms->resinfo[resnr].nr = resnr + 1;
198 newatoms->atomname[moltypes[tps[i]].i] = atoms->atomname[i];
199 newatoms->atom[moltypes[tps[i]].i] = atoms->atom[i];
200 copy_rvec(x[i],newx[moltypes[tps[i]].i]);
201 if (v) copy_rvec(v[i],newv[moltypes[tps[i]].i]);
202 newr[moltypes[tps[i]].i] = r[i];
203 moltypes[tps[i]].i++;
206 /* put them back into the original arrays and throw away temporary arrays */
207 sfree(atoms->atomname);
208 sfree(atoms->resinfo);
211 *atoms_solvt = newatoms;
212 for (i=0; i<(*atoms_solvt)->nr; i++) {
213 copy_rvec(newx[i],x[i]);
214 if (v) copy_rvec(newv[i],v[i]);
224 void rm_res_pbc(t_atoms *atoms, rvec *x, matrix box)
232 for(n=0; n<atoms->nr; n++) {
233 if (!is_hydrogen(*(atoms->atomname[n]))) {
237 if ( (n+1 == atoms->nr) ||
238 (atoms->atom[n+1].resind != atoms->atom[n].resind) ) {
239 /* if nat==0 we have only hydrogens in the solvent,
240 we take last coordinate as cg */
245 svmul(1.0/nat,xcg,xcg);
246 for(d=0; d<DIM; d++) {
248 for(i=start; i<=n; i++)
252 while (xcg[d]>=box[d][d]) {
253 for(i=start; i<=n; i++)
265 static char *insert_mols(const char *mol_insrt,int nmol_insrt,int ntry,int seed,
266 t_atoms *atoms,rvec **x,real **r,int ePBC,matrix box,
267 gmx_atomprop_t aps,real r_distance,real rshell,
268 const output_env_t oenv)
271 static char *title_insrt;
278 real alfa,beta,gamma;
282 set_pbc(&pbc,ePBC,box);
284 /* read number of atoms of insert molecules */
285 get_stx_coordnum(mol_insrt,&atoms_insrt.nr);
286 if (atoms_insrt.nr == 0)
287 gmx_fatal(FARGS,"No molecule in %s, please check your input\n",mol_insrt);
288 /* allocate memory for atom coordinates of insert molecules */
289 snew(x_insrt,atoms_insrt.nr);
290 snew(r_insrt,atoms_insrt.nr);
291 snew(atoms_insrt.resinfo,atoms_insrt.nr);
292 snew(atoms_insrt.atomname,atoms_insrt.nr);
293 snew(atoms_insrt.atom,atoms_insrt.nr);
294 atoms_insrt.pdbinfo = NULL;
295 snew(x_n,atoms_insrt.nr);
296 snew(title_insrt,STRLEN);
298 /* read residue number, residue names, atomnames, coordinates etc. */
299 fprintf(stderr,"Reading molecule configuration \n");
300 read_stx_conf(mol_insrt,title_insrt,&atoms_insrt,x_insrt,NULL,
301 &ePBC_insrt,box_insrt);
302 fprintf(stderr,"%s\nContaining %d atoms in %d residue\n",
303 title_insrt,atoms_insrt.nr,atoms_insrt.nres);
304 srenew(atoms_insrt.resinfo,atoms_insrt.nres);
306 /* initialise van der waals arrays of insert molecules */
307 mk_vdw(&atoms_insrt,r_insrt,aps,r_distance);
309 srenew(atoms->resinfo,(atoms->nres+nmol_insrt*atoms_insrt.nres));
310 srenew(atoms->atomname,(atoms->nr+atoms_insrt.nr*nmol_insrt));
311 srenew(atoms->atom,(atoms->nr+atoms_insrt.nr*nmol_insrt));
312 srenew(*x,(atoms->nr+atoms_insrt.nr*nmol_insrt));
313 srenew(*r,(atoms->nr+atoms_insrt.nr*nmol_insrt));
316 while ((mol < nmol_insrt) && (trial < ntry*nmol_insrt)) {
317 fprintf(stderr,"\rTry %d",trial++);
318 for (i=0;(i<atoms_insrt.nr);i++) {
319 copy_rvec(x_insrt[i],x_n[i]);
321 alfa=2*M_PI*rando(&seed);
322 beta=2*M_PI*rando(&seed);
323 gamma=2*M_PI*rando(&seed);
324 rotate_conf(atoms_insrt.nr,x_n,NULL,alfa,beta,gamma);
325 offset_x[XX]=box[XX][XX]*rando(&seed);
326 offset_x[YY]=box[YY][YY]*rando(&seed);
327 offset_x[ZZ]=box[ZZ][ZZ]*rando(&seed);
328 gen_box(0,atoms_insrt.nr,x_n,box_insrt,offset_x,TRUE);
329 if (!in_box(&pbc,x_n[0]) || !in_box(&pbc,x_n[atoms_insrt.nr-1]))
333 add_conf(atoms,x,NULL,r,FALSE,ePBC,box,TRUE,
334 &atoms_insrt,x_n,NULL,r_insrt,FALSE,rshell,0,oenv);
336 if (atoms->nr==(atoms_insrt.nr+onr)) {
338 fprintf(stderr," success (now %d atoms)!",atoms->nr);
341 srenew(atoms->resinfo, atoms->nres);
342 srenew(atoms->atomname, atoms->nr);
343 srenew(atoms->atom, atoms->nr);
344 srenew(*x, atoms->nr);
345 srenew(*r, atoms->nr);
347 fprintf(stderr,"\n");
348 /* print number of molecules added */
349 fprintf(stderr,"Added %d molecules (out of %d requested) of %s\n",
350 mol,nmol_insrt,*atoms_insrt.resinfo[0].name);
355 static void add_solv(const char *fn,t_atoms *atoms,rvec **x,rvec **v,real **r,
357 gmx_atomprop_t aps,real r_distance,int *atoms_added,
358 int *residues_added,real rshell,int max_sol,
359 const output_env_t oenv)
363 char filename[STRLEN];
364 char title_solvt[STRLEN];
365 t_atoms *atoms_solvt;
366 rvec *x_solvt,*v_solvt=NULL;
374 strncpy(filename,lfn,STRLEN);
377 get_stx_coordnum(filename,&(atoms_solvt->nr));
378 if (atoms_solvt->nr == 0)
379 gmx_fatal(FARGS,"No solvent in %s, please check your input\n",filename);
380 snew(x_solvt,atoms_solvt->nr);
381 if (v) snew(v_solvt,atoms_solvt->nr);
382 snew(r_solvt,atoms_solvt->nr);
383 snew(atoms_solvt->resinfo,atoms_solvt->nr);
384 snew(atoms_solvt->atomname,atoms_solvt->nr);
385 snew(atoms_solvt->atom,atoms_solvt->nr);
386 atoms_solvt->pdbinfo = NULL;
387 fprintf(stderr,"Reading solvent configuration%s\n",
388 v_solvt?" and velocities":"");
389 read_stx_conf(filename,title_solvt,atoms_solvt,x_solvt,v_solvt,
390 &ePBC_solvt,box_solvt);
391 fprintf(stderr,"\"%s\"\n",title_solvt);
392 fprintf(stderr,"solvent configuration contains %d atoms in %d residues\n",
393 atoms_solvt->nr,atoms_solvt->nres);
394 fprintf(stderr,"\n");
396 /* apply pbc for solvent configuration for whole molecules */
397 rm_res_pbc(atoms_solvt,x_solvt,box_solvt);
399 /* initialise van der waals arrays of solvent configuration */
400 mk_vdw(atoms_solvt,r_solvt,aps,r_distance);
402 /* calculate the box multiplication factors n_box[0...DIM] */
404 for (i=0; (i < DIM);i++) {
406 while (n_box[i]*box_solvt[i][i] < box[i][i])
410 fprintf(stderr,"Will generate new solvent configuration of %dx%dx%d boxes\n",
411 n_box[XX],n_box[YY],n_box[ZZ]);
413 /* realloc atoms_solvt for the new solvent configuration */
414 srenew(atoms_solvt->resinfo,atoms_solvt->nres*nmol);
415 srenew(atoms_solvt->atomname,atoms_solvt->nr*nmol);
416 srenew(atoms_solvt->atom,atoms_solvt->nr*nmol);
417 srenew(x_solvt,atoms_solvt->nr*nmol);
418 if (v_solvt) srenew(v_solvt,atoms_solvt->nr*nmol);
419 srenew(r_solvt,atoms_solvt->nr*nmol);
421 /* generate a new solvent configuration */
422 genconf(atoms_solvt,x_solvt,v_solvt,r_solvt,box_solvt,n_box);
425 print_stat(x_solvt,atoms_solvt->nr,box_solvt);
429 print_stat(x_solvt,atoms_solvt->nr,box_solvt);
431 /* Sort the solvent mixture, not the protein... */
432 sort_molecule(&atoms_solvt,x_solvt,v_solvt,r_solvt);
434 /* add the two configurations */
437 add_conf(atoms,x,v,r,TRUE,ePBC,box,FALSE,
438 atoms_solvt,x_solvt,v_solvt,r_solvt,TRUE,rshell,max_sol,oenv);
439 *atoms_added=atoms->nr-onr;
440 *residues_added=atoms->nres-onres;
445 fprintf(stderr,"Generated solvent containing %d atoms in %d residues\n",
446 *atoms_added,*residues_added);
449 static char *read_prot(const char *confin,t_atoms *atoms,rvec **x,rvec **v,
450 real **r, int *ePBC,matrix box,gmx_atomprop_t aps,
457 get_stx_coordnum(confin,&natoms);
459 /* allocate memory for atom coordinates of configuration 1 */
461 if (v) snew(*v,natoms);
463 init_t_atoms(atoms,natoms,FALSE);
465 /* read residue number, residue names, atomnames, coordinates etc. */
466 fprintf(stderr,"Reading solute configuration%s\n",v?" and velocities":"");
467 read_stx_conf(confin,title,atoms,*x,v?*v:NULL,ePBC,box);
468 fprintf(stderr,"%s\nContaining %d atoms in %d residues\n",
469 title,atoms->nr,atoms->nres);
471 /* initialise van der waals arrays of configuration 1 */
472 mk_vdw(atoms,*r,aps,r_distance);
477 static void update_top(t_atoms *atoms,matrix box,int NFILE,t_filenm fnm[],
480 #define TEMP_FILENM "temp.top"
482 char buf[STRLEN],buf2[STRLEN],*temp;
483 const char *topinout;
485 bool bSystem,bMolecules,bSkip;
490 for(i=0; (i<atoms->nres); i++) {
491 /* calculate number of SOLvent molecules */
492 if ( (strcmp(*atoms->resinfo[i].name,"SOL")==0) ||
493 (strcmp(*atoms->resinfo[i].name,"WAT")==0) ||
494 (strcmp(*atoms->resinfo[i].name,"HOH")==0) )
498 for(i=0; (i<atoms->nr); i++) {
499 gmx_atomprop_query(aps,epropMass,
500 *atoms->resinfo[atoms->atom[i].resind].name,
501 *atoms->atomname[i],&mm);
507 fprintf(stderr,"Volume : %10g (nm^3)\n",vol);
508 fprintf(stderr,"Density : %10g (g/l)\n",
509 (mtot*1e24)/(AVOGADRO*vol));
510 fprintf(stderr,"Number of SOL molecules: %5d \n\n",nsol);
512 /* open topology file and append sol molecules */
513 topinout = ftp2fn(efTOP,NFILE,fnm);
514 if ( ftp2bSet(efTOP,NFILE,fnm) ) {
515 fprintf(stderr,"Processing topology\n");
516 fpin = ffopen(topinout,"r");
517 fpout= ffopen(TEMP_FILENM,"w");
519 bSystem = bMolecules = FALSE;
520 while (fgets(buf, STRLEN, fpin)) {
524 if ((temp=strchr(buf2,'\n')) != NULL)
529 if ((temp=strchr(buf2,'\n')) != NULL)
532 if (buf2[strlen(buf2)-1]==']') {
533 buf2[strlen(buf2)-1]='\0';
536 bSystem=(gmx_strcasecmp(buf2,"system")==0);
537 bMolecules=(gmx_strcasecmp(buf2,"molecules")==0);
539 } else if (bSystem && nsol && (buf[0]!=';') ) {
540 /* if sol present, append "in water" to system name */
542 if (buf2[0] && (!strstr(buf2," water")) ) {
543 sprintf(buf,"%s in water\n",buf2);
546 } else if (bMolecules) {
547 /* check if this is a line with solvent molecules */
548 sscanf(buf,"%s",buf2);
549 if (strcmp(buf2,"SOL")==0) {
550 sscanf(buf,"%*s %d",&i);
559 if ((temp=strchr(buf,'\n')) != NULL)
561 fprintf(stdout,"Removing line #%d '%s' from topology file (%s)\n",
564 fprintf(fpout,"%s",buf);
568 fprintf(stdout,"Adding line for %d solvent molecules to "
569 "topology file (%s)\n",nsol,topinout);
570 fprintf(fpout,"%-15s %5d\n","SOL",nsol);
573 /* use ffopen to generate backup of topinout */
574 fpout=ffopen(topinout,"w");
576 rename(TEMP_FILENM,topinout);
581 int gmx_genbox(int argc,char *argv[])
583 const char *desc[] = {
584 "Genbox can do one of 3 things:[PAR]",
586 "1) Generate a box of solvent. Specify -cs and -box. Or specify -cs and",
587 "-cp with a structure file with a box, but without atoms.[PAR]",
589 "2) Solvate a solute configuration, eg. a protein, in a bath of solvent ",
590 "molecules. Specify [TT]-cp[tt] (solute) and [TT]-cs[tt] (solvent). ",
591 "The box specified in the solute coordinate file ([TT]-cp[tt]) is used,",
592 "unless [TT]-box[tt] is set.",
593 "If you want the solute to be centered in the box,",
594 "the program [TT]editconf[tt] has sophisticated options",
595 "to change the box dimensions and center the solute.",
596 "Solvent molecules are removed from the box where the ",
597 "distance between any atom of the solute molecule(s) and any atom of ",
598 "the solvent molecule is less than the sum of the VanderWaals radii of ",
599 "both atoms. A database ([TT]vdwradii.dat[tt]) of VanderWaals radii is ",
600 "read by the program, atoms not in the database are ",
601 "assigned a default distance [TT]-vdwd[tt].",
602 "Note that this option will also influence the distances between",
603 "solvent molecules if they contain atoms that are not in the database.",
606 "3) Insert a number ([TT]-nmol[tt]) of extra molecules ([TT]-ci[tt]) ",
607 "at random positions.",
608 "The program iterates until [TT]nmol[tt] molecules",
609 "have been inserted in the box. To test whether an insertion is ",
610 "successful the same VanderWaals criterium is used as for removal of ",
611 "solvent molecules. When no appropriately ",
612 "sized holes (holes that can hold an extra molecule) are available the ",
613 "program tries for [TT]-nmol[tt] * [TT]-try[tt] times before giving up. ",
614 "Increase -try if you have several small holes to fill.[PAR]",
616 "The default solvent is Simple Point Charge water (SPC), with coordinates ",
617 "from [TT]$GMXLIB/spc216.gro[tt]. These coordinates can also be used",
618 "for other 3-site water models, since a short equibilibration will remove",
619 "the small differences between the models.",
620 "Other solvents are also supported, as well as mixed solvents. The",
621 "only restriction to solvent types is that a solvent molecule consists",
622 "of exactly one residue. The residue information in the coordinate",
623 "files is used, and should therefore be more or less consistent.",
624 "In practice this means that two subsequent solvent molecules in the ",
625 "solvent coordinate file should have different residue number.",
626 "The box of solute is built by stacking the coordinates read from",
627 "the coordinate file. This means that these coordinates should be ",
628 "equlibrated in periodic boundary conditions to ensure a good",
629 "alignment of molecules on the stacking interfaces.",
630 "The [TT]-maxsol[tt] option simply adds only the first [TT]-maxsol[tt]",
631 "solvent molecules and leaves out the rest would have fit into the box.",
634 "The program can optionally rotate the solute molecule to align the",
635 "longest molecule axis along a box edge. This way the amount of solvent",
636 "molecules necessary is reduced.",
637 "It should be kept in mind that this only works for",
638 "short simulations, as eg. an alpha-helical peptide in solution can ",
639 "rotate over 90 degrees, within 500 ps. In general it is therefore ",
640 "better to make a more or less cubic box.[PAR]",
642 "Setting -shell larger than zero will place a layer of water of",
643 "the specified thickness (nm) around the solute. Hint: it is a good",
644 "idea to put the protein in the center of a box first (using editconf).",
647 "Finally, genbox will optionally remove lines from your topology file in ",
648 "which a number of solvent molecules is already added, and adds a ",
649 "line with the total number of solvent molecules in your coordinate file."
652 const char *bugs[] = {
653 "Molecules must be whole in the initial configurations.",
657 bool bSol,bProt,bBox;
658 const char *conf_prot,*confout;
664 /* protein configuration data */
672 /* other data types */
673 int atoms_added,residues_added;
676 { efSTX, "-cp", "protein", ffOPTRD },
677 { efSTX, "-cs", "spc216", ffLIBOPTRD},
678 { efSTX, "-ci", "insert", ffOPTRD},
679 { efSTO, NULL, NULL, ffWRITE},
680 { efTOP, NULL, NULL, ffOPTRW},
682 #define NFILE asize(fnm)
684 static int nmol_ins=0,nmol_try=10,seed=1997;
685 static real r_distance=0.105,r_shell=0;
686 static rvec new_box={0.0,0.0,0.0};
687 static bool bReadV=FALSE;
688 static int max_sol = 0;
691 { "-box", FALSE, etRVEC, {new_box},
693 { "-nmol", FALSE, etINT , {&nmol_ins},
694 "no of extra molecules to insert" },
695 { "-try", FALSE, etINT , {&nmol_try},
696 "try inserting -nmol*-try times" },
697 { "-seed", FALSE, etINT , {&seed},
698 "random generator seed"},
699 { "-vdwd", FALSE, etREAL, {&r_distance},
700 "default vdwaals distance"},
701 { "-shell", FALSE, etREAL, {&r_shell},
702 "thickness of optional water layer around solute" },
703 { "-maxsol", FALSE, etINT, {&max_sol},
704 "maximum number of solvent molecules to add if they fit in the box. If zero (default) this is ignored" },
705 { "-vel", FALSE, etBOOL, {&bReadV},
706 "keep velocities from input solute and solvent" }
709 CopyRight(stderr,argv[0]);
710 parse_common_args(&argc,argv, PCA_BE_NICE,NFILE,fnm,asize(pa),pa,
711 asize(desc),desc,asize(bugs),bugs,&oenv);
713 bInsert = opt2bSet("-ci",NFILE,fnm) && (nmol_ins > 0);
714 bSol = opt2bSet("-cs",NFILE,fnm);
715 bProt = opt2bSet("-cp",NFILE,fnm);
716 bBox = opt2parg_bSet("-box",asize(pa),pa);
719 if (bInsert && nmol_ins<=0)
720 gmx_fatal(FARGS,"When specifying inserted molecules (-ci), "
721 "-nmol must be larger than 0");
723 gmx_fatal(FARGS,"When no solute (-cp) is specified, "
724 "a box size (-box) must be specified");
726 aps = gmx_atomprop_init();
729 /*generate a solute configuration */
730 conf_prot = opt2fn("-cp",NFILE,fnm);
731 title = read_prot(conf_prot,&atoms,&x,bReadV?&v:NULL,&r,&ePBC,box,
734 fprintf(stderr,"Note: no velocities found\n");
736 fprintf(stderr,"Note: no atoms in %s\n",conf_prot);
753 box[XX][XX]=new_box[XX];
754 box[YY][YY]=new_box[YY];
755 box[ZZ][ZZ]=new_box[ZZ];
758 gmx_fatal(FARGS,"Undefined solute box.\nCreate one with editconf "
759 "or give explicit -box command line option");
761 /* add nmol_ins molecules of atoms_ins
762 in random orientation at random place */
764 title_ins = insert_mols(opt2fn("-ci",NFILE,fnm),nmol_ins,nmol_try,seed,
765 &atoms,&x,&r,ePBC,box,aps,r_distance,r_shell,
768 title_ins = strdup("Generated by genbox");
772 add_solv(opt2fn("-cs",NFILE,fnm),&atoms,&x,v?&v:NULL,&r,ePBC,box,
773 aps,r_distance,&atoms_added,&residues_added,r_shell,max_sol,
776 /* write new configuration 1 to file confout */
777 confout = ftp2fn(efSTO,NFILE,fnm);
778 fprintf(stderr,"Writing generated configuration to %s\n",confout);
780 write_sto_conf(confout,title,&atoms,x,v,ePBC,box);
781 /* print box sizes and box type to stderr */
782 fprintf(stderr,"%s\n",title);
784 write_sto_conf(confout,title_ins,&atoms,x,v,ePBC,box);
786 /* print size of generated configuration */
787 fprintf(stderr,"\nOutput configuration contains %d atoms in %d residues\n",
788 atoms.nr,atoms.nres);
789 update_top(&atoms,box,NFILE,fnm,aps);
791 gmx_atomprop_destroy(aps);