Added software-related quote
[gromacs/rigid-bodies.git] / src / tools / gmx_membed.c
blobd597c15fc6eb57551b2b0a4b98f29b0b31444c2b
1 /*
2 * $Id: mdrun.c,v 1.139.2.9 2009/05/04 16:13:29 hess Exp $
4 * This source code is part of
6 * G R O M A C S
8 * GROningen MAchine for Chemical Simulations
10 * VERSION 3.2.0
11 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
12 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
13 * Copyright (c) 2001-2004, The GROMACS development team,
14 * check out http://www.gromacs.org for more information.
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License
18 * as published by the Free Software Foundation; either version 2
19 * of the License, or (at your option) any later version.
21 * If you want to redistribute modifications, please consider that
22 * scientific software is very special. Version control is crucial -
23 * bugs must be traceable. We will be happy to consider code for
24 * inclusion in the official distribution, but derived work must not
25 * be called official GROMACS. Details are found in the README & COPYING
26 * files - if they are missing, get the official version at www.gromacs.org.
28 * To help us fund GROMACS development, we humbly ask that you cite
29 * the papers on the package - you can find them in the top README file.
31 * For more info, check our website at http://www.gromacs.org
33 * And Hey:
34 * Gallium Rubidium Oxygen Manganese Argon Carbon Silicon
36 #ifdef HAVE_CONFIG_H
37 #include <config.h>
38 #endif
40 #include <signal.h>
41 #include <stdlib.h>
42 #include "typedefs.h"
43 #include "smalloc.h"
44 #include "sysstuff.h"
45 #include "vec.h"
46 #include "statutil.h"
47 #include "macros.h"
48 #include "copyrite.h"
49 #include "main.h"
50 #include "futil.h"
51 #include "edsam.h"
52 #include "checkpoint.h"
53 #include "vcm.h"
54 #include "mdebin.h"
55 #include "nrnb.h"
56 #include "calcmu.h"
57 #include "index.h"
58 #include "vsite.h"
59 #include "update.h"
60 #include "ns.h"
61 #include "trnio.h"
62 #include "xtcio.h"
63 #include "mdrun.h"
64 #include "confio.h"
65 #include "network.h"
66 #include "pull.h"
67 #include "xvgr.h"
68 #include "physics.h"
69 #include "names.h"
70 #include "disre.h"
71 #include "orires.h"
72 #include "dihre.h"
73 #include "pppm.h"
74 #include "pme.h"
75 #include "mdatoms.h"
76 #include "qmmm.h"
77 #include "mpelogging.h"
78 #include "domdec.h"
79 #include "partdec.h"
80 #include "topsort.h"
81 #include "coulomb.h"
82 #include "constr.h"
83 #include "shellfc.h"
84 #include "mvdata.h"
85 #include "checkpoint.h"
86 #include "mtop_util.h"
87 #include "tpxio.h"
88 #include "string2.h"
89 #include "sighandler.h"
90 #include "gmx_ana.h"
92 #ifdef GMX_LIB_MPI
93 #include <mpi.h>
94 #endif
95 #ifdef GMX_THREADS
96 #include "tmpi.h"
97 #endif
99 /* afm stuf */
100 #include "pull.h"
102 /* We use the same defines as in mvdata.c here */
103 #define block_bc(cr, d) gmx_bcast( sizeof(d), &(d),(cr))
104 #define nblock_bc(cr,nr,d) gmx_bcast((nr)*sizeof((d)[0]), (d),(cr))
105 #define snew_bc(cr,d,nr) { if (!MASTER(cr)) snew((d),(nr)); }
107 /* The following two variables and the signal_handler function
108 * is used from pme.c as well
111 typedef struct {
112 t_state s;
113 rvec *f;
114 real epot;
115 real fnorm;
116 real fmax;
117 int a_fmax;
118 } em_state_t;
120 typedef struct {
121 int it_xy;
122 int it_z;
123 int xy_step;
124 int z_step;
125 rvec xmin;
126 rvec xmax;
127 rvec *geom_cent;
128 int pieces;
129 int *nidx;
130 atom_id **subindex;
131 } pos_ins_t;
133 typedef struct {
134 int id;
135 char *name;
136 int nr;
137 int natoms; /*nr of atoms per lipid*/
138 int mol1; /*id of the first lipid molecule*/
139 real area;
140 } lip_t;
142 typedef struct {
143 char *name;
144 t_block mem_at;
145 int *mol_id;
146 int nmol;
147 real lip_area;
148 real zmin;
149 real zmax;
150 real zmed;
151 } mem_t;
153 typedef struct {
154 int *mol;
155 int *block;
156 int nr;
157 } rm_t;
159 int search_string(char *s,int ng,char ***gn)
161 int i;
163 for(i=0; (i<ng); i++)
164 if (gmx_strcasecmp(s,*gn[i]) == 0)
165 return i;
167 gmx_fatal(FARGS,"Group %s not found in indexfile.\nMaybe you have non-default groups in your mdp file, while not using the '-n' option of grompp.\nIn that case use the '-n' option.\n",s);
169 return -1;
172 int get_mol_id(int at,int nmblock,gmx_molblock_t *mblock, int *type, int *block)
174 int mol_id=0;
175 int i;
177 for(i=0;i<nmblock;i++)
179 if(at<(mblock[i].nmol*mblock[i].natoms_mol))
181 mol_id+=at/mblock[i].natoms_mol;
182 *type = mblock[i].type;
183 *block = i;
184 return mol_id;
185 } else {
186 at-= mblock[i].nmol*mblock[i].natoms_mol;
187 mol_id+=mblock[i].nmol;
191 gmx_fatal(FARGS,"Something is wrong in mol ids, at %d, mol_id %d",at,mol_id);
193 return -1;
196 int get_block(int mol_id,int nmblock,gmx_molblock_t *mblock)
198 int i;
199 int nmol=0;
201 for(i=0;i<nmblock;i++)
203 nmol+=mblock[i].nmol;
204 if(mol_id<nmol)
205 return i;
208 gmx_fatal(FARGS,"mol_id %d larger than total number of molecules %d.\n",mol_id,nmol);
210 return -1;
213 int get_tpr_version(const char *infile)
215 char buf[STRLEN];
216 gmx_bool bDouble;
217 int precision,fver;
218 t_fileio *fio;
220 fio = open_tpx(infile,"r");
221 gmx_fio_checktype(fio);
223 precision = sizeof(real);
225 gmx_fio_do_string(fio,buf);
226 if (strncmp(buf,"VERSION",7))
227 gmx_fatal(FARGS,"Can not read file %s,\n"
228 " this file is from a Gromacs version which is older than 2.0\n"
229 " Make a new one with grompp or use a gro or pdb file, if possible",
230 gmx_fio_getname(fio));
231 gmx_fio_do_int(fio,precision);
232 bDouble = (precision == sizeof(double));
233 if ((precision != sizeof(float)) && !bDouble)
234 gmx_fatal(FARGS,"Unknown precision in file %s: real is %d bytes "
235 "instead of %d or %d",
236 gmx_fio_getname(fio),precision,sizeof(float),sizeof(double));
237 gmx_fio_setprecision(fio,bDouble);
238 fprintf(stderr,"Reading file %s, %s (%s precision)\n",
239 gmx_fio_getname(fio),buf,bDouble ? "double" : "single");
241 gmx_fio_do_int(fio,fver);
243 close_tpx(fio);
245 return fver;
248 void set_inbox(int natom, rvec *x)
250 rvec tmp;
251 int i;
253 tmp[XX]=tmp[YY]=tmp[ZZ]=0.0;
254 for(i=0;i<natom;i++)
256 if(x[i][XX]<tmp[XX]) tmp[XX]=x[i][XX];
257 if(x[i][YY]<tmp[YY]) tmp[YY]=x[i][YY];
258 if(x[i][ZZ]<tmp[ZZ]) tmp[ZZ]=x[i][ZZ];
261 for(i=0;i<natom;i++)
262 rvec_inc(x[i],tmp);
265 int get_mtype_list(t_block *at, gmx_mtop_t *mtop, t_block *tlist)
267 int i,j,nr,mol_id;
268 int type=0,block=0;
269 gmx_bool bNEW;
271 nr=0;
272 snew(tlist->index,at->nr);
273 for (i=0;i<at->nr;i++)
275 bNEW=TRUE;
276 mol_id = get_mol_id(at->index[i],mtop->nmolblock,mtop->molblock,&type,&block);
277 for(j=0;j<nr;j++)
279 if(tlist->index[j]==type)
280 bNEW=FALSE;
282 if(bNEW==TRUE)
284 tlist->index[nr]=type;
285 nr++;
289 srenew(tlist->index,nr);
290 return nr;
293 void check_types(t_block *ins_at,t_block *rest_at,gmx_mtop_t *mtop)
295 t_block *ins_mtype,*rest_mtype;
296 int i,j;
298 snew(ins_mtype,1);
299 snew(rest_mtype,1);
300 ins_mtype->nr = get_mtype_list(ins_at , mtop, ins_mtype );
301 rest_mtype->nr = get_mtype_list(rest_at, mtop, rest_mtype);
303 for(i=0;i<ins_mtype->nr;i++)
305 for(j=0;j<rest_mtype->nr;j++)
307 if(ins_mtype->index[i]==rest_mtype->index[j])
308 gmx_fatal(FARGS,"Moleculetype %s is found both in the group to insert and the rest of the system.\n"
309 "Because we need to exclude all interactions between the atoms in the group to\n"
310 "insert, the same moleculetype can not be used in both groups. Change the\n"
311 "moleculetype of the molecules %s in the inserted group. Do not forget to provide\n"
312 "an appropriate *.itp file",*(mtop->moltype[rest_mtype->index[j]].name),
313 *(mtop->moltype[rest_mtype->index[j]].name));
317 sfree(ins_mtype->index);
318 sfree(rest_mtype->index);
319 sfree(ins_mtype);
320 sfree(rest_mtype);
323 int init_ins_at(t_block *ins_at,t_block *rest_at,t_state *state, pos_ins_t *pos_ins,gmx_groups_t *groups,int ins_grp_id, real xy_max)
325 int i,gid,c=0;
326 real x,xmin,xmax,y,ymin,ymax,z,zmin,zmax;
328 snew(rest_at->index,state->natoms);
330 xmin=xmax=state->x[ins_at->index[0]][XX];
331 ymin=ymax=state->x[ins_at->index[0]][YY];
332 zmin=zmax=state->x[ins_at->index[0]][ZZ];
334 for(i=0;i<state->natoms;i++)
336 gid = groups->grpnr[egcFREEZE][i];
337 if(groups->grps[egcFREEZE].nm_ind[gid]==ins_grp_id)
339 x=state->x[i][XX];
340 if (x<xmin) xmin=x;
341 if (x>xmax) xmax=x;
342 y=state->x[i][YY];
343 if (y<ymin) ymin=y;
344 if (y>ymax) ymax=y;
345 z=state->x[i][ZZ];
346 if (z<zmin) zmin=z;
347 if (z>zmax) zmax=z;
348 } else {
349 rest_at->index[c]=i;
350 c++;
354 rest_at->nr=c;
355 srenew(rest_at->index,c);
357 if(xy_max>1.000001)
359 pos_ins->xmin[XX]=xmin-((xmax-xmin)*xy_max-(xmax-xmin))/2;
360 pos_ins->xmin[YY]=ymin-((ymax-ymin)*xy_max-(ymax-ymin))/2;
362 pos_ins->xmax[XX]=xmax+((xmax-xmin)*xy_max-(xmax-xmin))/2;
363 pos_ins->xmax[YY]=ymax+((ymax-ymin)*xy_max-(ymax-ymin))/2;
364 } else {
365 pos_ins->xmin[XX]=xmin;
366 pos_ins->xmin[YY]=ymin;
368 pos_ins->xmax[XX]=xmax;
369 pos_ins->xmax[YY]=ymax;
372 /* 6.0 is estimated thickness of bilayer */
373 if( (zmax-zmin) < 6.0 )
375 pos_ins->xmin[ZZ]=zmin+(zmax-zmin)/2.0-3.0;
376 pos_ins->xmax[ZZ]=zmin+(zmax-zmin)/2.0+3.0;
377 } else {
378 pos_ins->xmin[ZZ]=zmin;
379 pos_ins->xmax[ZZ]=zmax;
382 return c;
385 real est_prot_area(pos_ins_t *pos_ins,rvec *r,t_block *ins_at, mem_t *mem_p)
387 real x,y,dx=0.15,dy=0.15,area=0.0;
388 real add;
389 int c,at;
391 for(x=pos_ins->xmin[XX];x<pos_ins->xmax[XX];x+=dx)
393 for(y=pos_ins->xmin[YY];y<pos_ins->xmax[YY];y+=dy)
395 c=0;
396 add=0.0;
399 at=ins_at->index[c];
400 if ( (r[at][XX]>=x) && (r[at][XX]<x+dx) &&
401 (r[at][YY]>=y) && (r[at][YY]<y+dy) &&
402 (r[at][ZZ]>mem_p->zmin+1.0) && (r[at][ZZ]<mem_p->zmax-1.0) )
403 add=1.0;
404 c++;
405 } while ( (c<ins_at->nr) && (add<0.5) );
406 area+=add;
409 area=area*dx*dy;
411 return area;
414 void init_lip(matrix box, gmx_mtop_t *mtop, lip_t *lip)
416 int i;
417 real mem_area;
418 int mol1=0;
420 mem_area = box[XX][XX]*box[YY][YY]-box[XX][YY]*box[YY][XX];
421 for(i=0;i<mtop->nmolblock;i++)
423 if(mtop->molblock[i].type == lip->id)
425 lip->nr=mtop->molblock[i].nmol;
426 lip->natoms=mtop->molblock[i].natoms_mol;
429 lip->area=2.0*mem_area/(double)lip->nr;
431 for (i=0;i<lip->id;i++)
432 mol1+=mtop->molblock[i].nmol;
433 lip->mol1=mol1;
436 int init_mem_at(mem_t *mem_p, gmx_mtop_t *mtop, rvec *r, matrix box, pos_ins_t *pos_ins)
438 int i,j,at,mol,nmol,nmolbox,count;
439 t_block *mem_a;
440 real z,zmin,zmax,mem_area;
441 gmx_bool bNew;
442 atom_id *mol_id;
443 int type=0,block=0;
445 nmol=count=0;
446 mem_a=&(mem_p->mem_at);
447 snew(mol_id,mem_a->nr);
448 /* snew(index,mem_a->nr); */
449 zmin=pos_ins->xmax[ZZ];
450 zmax=pos_ins->xmin[ZZ];
451 for(i=0;i<mem_a->nr;i++)
453 at=mem_a->index[i];
454 if( (r[at][XX]>pos_ins->xmin[XX]) && (r[at][XX]<pos_ins->xmax[XX]) &&
455 (r[at][YY]>pos_ins->xmin[YY]) && (r[at][YY]<pos_ins->xmax[YY]) &&
456 (r[at][ZZ]>pos_ins->xmin[ZZ]) && (r[at][ZZ]<pos_ins->xmax[ZZ]) )
458 mol = get_mol_id(at,mtop->nmolblock,mtop->molblock,&type,&block);
460 bNew=TRUE;
461 for(j=0;j<nmol;j++)
462 if(mol == mol_id[j])
463 bNew=FALSE;
465 if(bNew)
467 mol_id[nmol]=mol;
468 nmol++;
471 z=r[at][ZZ];
472 if(z<zmin) zmin=z;
473 if(z>zmax) zmax=z;
475 /* index[count]=at;*/
476 count++;
480 mem_p->nmol=nmol;
481 srenew(mol_id,nmol);
482 mem_p->mol_id=mol_id;
483 /* srenew(index,count);*/
484 /* mem_p->mem_at.nr=count;*/
485 /* sfree(mem_p->mem_at.index);*/
486 /* mem_p->mem_at.index=index;*/
488 if((zmax-zmin)>(box[ZZ][ZZ]-0.5))
489 gmx_fatal(FARGS,"Something is wrong with your membrane. Max and min z values are %f and %f.\n"
490 "Maybe your membrane is not centered in the box, but located at the box edge in the z-direction,\n"
491 "so that one membrane is distributed over two periodic box images. Another possibility is that\n"
492 "your water layer is not thick enough.\n",zmax,zmin);
493 mem_p->zmin=zmin;
494 mem_p->zmax=zmax;
495 mem_p->zmed=(zmax-zmin)/2+zmin;
497 /*number of membrane molecules in protein box*/
498 nmolbox = count/mtop->molblock[block].natoms_mol;
499 /*mem_area = box[XX][XX]*box[YY][YY]-box[XX][YY]*box[YY][XX];
500 mem_p->lip_area = 2.0*mem_area/(double)mem_p->nmol;*/
501 mem_area = (pos_ins->xmax[XX]-pos_ins->xmin[XX])*(pos_ins->xmax[YY]-pos_ins->xmin[YY]);
502 mem_p->lip_area = 2.0*mem_area/(double)nmolbox;
504 return mem_p->mem_at.nr;
507 void init_resize(t_block *ins_at,rvec *r_ins,pos_ins_t *pos_ins,mem_t *mem_p,rvec *r, gmx_bool bALLOW_ASYMMETRY)
509 int i,j,at,c,outsidesum,gctr=0;
510 int idxsum=0;
512 /*sanity check*/
513 for (i=0;i<pos_ins->pieces;i++)
514 idxsum+=pos_ins->nidx[i];
515 if (idxsum!=ins_at->nr)
516 gmx_fatal(FARGS,"Piecewise sum of inserted atoms not same as size of group selected to insert.");
518 snew(pos_ins->geom_cent,pos_ins->pieces);
519 for (i=0;i<pos_ins->pieces;i++)
521 c=0;
522 outsidesum=0;
523 for(j=0;j<DIM;j++)
524 pos_ins->geom_cent[i][j]=0;
526 for(j=0;j<DIM;j++)
527 pos_ins->geom_cent[i][j]=0;
528 for (j=0;j<pos_ins->nidx[i];j++)
530 at=pos_ins->subindex[i][j];
531 copy_rvec(r[at],r_ins[gctr]);
532 if( (r_ins[gctr][ZZ]<mem_p->zmax) && (r_ins[gctr][ZZ]>mem_p->zmin) )
534 rvec_inc(pos_ins->geom_cent[i],r_ins[gctr]);
535 c++;
537 else
538 outsidesum++;
539 gctr++;
541 if (c>0)
542 svmul(1/(double)c,pos_ins->geom_cent[i],pos_ins->geom_cent[i]);
543 if (!bALLOW_ASYMMETRY)
544 pos_ins->geom_cent[i][ZZ]=mem_p->zmed;
546 fprintf(stderr,"Embedding piece %d with center of geometry: %f %f %f\n",i,pos_ins->geom_cent[i][XX],pos_ins->geom_cent[i][YY],pos_ins->geom_cent[i][ZZ]);
548 fprintf(stderr,"\n");
551 void resize(t_block *ins_at, rvec *r_ins, rvec *r, pos_ins_t *pos_ins,rvec fac)
553 int i,j,k,at,c=0;
554 for (k=0;k<pos_ins->pieces;k++)
555 for(i=0;i<pos_ins->nidx[k];i++)
557 at=pos_ins->subindex[k][i];
558 for(j=0;j<DIM;j++)
559 r[at][j]=pos_ins->geom_cent[k][j]+fac[j]*(r_ins[c][j]-pos_ins->geom_cent[k][j]);
560 c++;
564 int gen_rm_list(rm_t *rm_p,t_block *ins_at,t_block *rest_at,t_pbc *pbc, gmx_mtop_t *mtop,
565 rvec *r, rvec *r_ins, mem_t *mem_p, pos_ins_t *pos_ins, real probe_rad, int low_up_rm, gmx_bool bALLOW_ASYMMETRY)
567 int i,j,k,l,at,at2,mol_id;
568 int type=0,block=0;
569 int nrm,nupper,nlower;
570 real r_min_rad,z_lip,min_norm;
571 gmx_bool bRM;
572 rvec dr,dr_tmp;
573 real *dist;
574 int *order;
576 r_min_rad=probe_rad*probe_rad;
577 snew(rm_p->mol,mtop->mols.nr);
578 snew(rm_p->block,mtop->mols.nr);
579 nrm=nupper=0;
580 nlower=low_up_rm;
581 for(i=0;i<ins_at->nr;i++)
583 at=ins_at->index[i];
584 for(j=0;j<rest_at->nr;j++)
586 at2=rest_at->index[j];
587 pbc_dx(pbc,r[at],r[at2],dr);
589 if(norm2(dr)<r_min_rad)
591 mol_id = get_mol_id(at2,mtop->nmolblock,mtop->molblock,&type,&block);
592 bRM=TRUE;
593 for(l=0;l<nrm;l++)
594 if(rm_p->mol[l]==mol_id)
595 bRM=FALSE;
596 if(bRM)
598 /*fprintf(stderr,"%d wordt toegevoegd\n",mol_id);*/
599 rm_p->mol[nrm]=mol_id;
600 rm_p->block[nrm]=block;
601 nrm++;
602 z_lip=0.0;
603 for(l=0;l<mem_p->nmol;l++)
605 if(mol_id==mem_p->mol_id[l])
607 for(k=mtop->mols.index[mol_id];k<mtop->mols.index[mol_id+1];k++)
608 z_lip+=r[k][ZZ];
609 z_lip/=mtop->molblock[block].natoms_mol;
610 if(z_lip<mem_p->zmed)
611 nlower++;
612 else
613 nupper++;
621 /*make sure equal number of lipids from upper and lower layer are removed */
622 if( (nupper!=nlower) && (!bALLOW_ASYMMETRY) )
624 snew(dist,mem_p->nmol);
625 snew(order,mem_p->nmol);
626 for(i=0;i<mem_p->nmol;i++)
628 at = mtop->mols.index[mem_p->mol_id[i]];
629 pbc_dx(pbc,r[at],pos_ins->geom_cent[0],dr);
630 if (pos_ins->pieces>1)
632 /*minimum dr value*/
633 min_norm=norm2(dr);
634 for (k=1;k<pos_ins->pieces;k++)
636 pbc_dx(pbc,r[at],pos_ins->geom_cent[k],dr_tmp);
637 if (norm2(dr_tmp) < min_norm)
639 min_norm=norm2(dr_tmp);
640 copy_rvec(dr_tmp,dr);
644 dist[i]=dr[XX]*dr[XX]+dr[YY]*dr[YY];
645 j=i-1;
646 while (j>=0 && dist[i]<dist[order[j]])
648 order[j+1]=order[j];
649 j--;
651 order[j+1]=i;
654 i=0;
655 while(nupper!=nlower)
657 mol_id=mem_p->mol_id[order[i]];
658 block=get_block(mol_id,mtop->nmolblock,mtop->molblock);
660 bRM=TRUE;
661 for(l=0;l<nrm;l++)
662 if(rm_p->mol[l]==mol_id)
663 bRM=FALSE;
664 if(bRM)
666 z_lip=0;
667 for(k=mtop->mols.index[mol_id];k<mtop->mols.index[mol_id+1];k++)
668 z_lip+=r[k][ZZ];
669 z_lip/=mtop->molblock[block].natoms_mol;
670 if(nupper>nlower && z_lip<mem_p->zmed)
672 rm_p->mol[nrm]=mol_id;
673 rm_p->block[nrm]=block;
674 nrm++;
675 nlower++;
677 else if (nupper<nlower && z_lip>mem_p->zmed)
679 rm_p->mol[nrm]=mol_id;
680 rm_p->block[nrm]=block;
681 nrm++;
682 nupper++;
685 i++;
687 if(i>mem_p->nmol)
688 gmx_fatal(FARGS,"Trying to remove more lipid molecules than there are in the membrane");
690 sfree(dist);
691 sfree(order);
694 rm_p->nr=nrm;
695 srenew(rm_p->mol,nrm);
696 srenew(rm_p->block,nrm);
698 return nupper+nlower;
701 void rm_group(t_inputrec *ir, gmx_groups_t *groups, gmx_mtop_t *mtop, rm_t *rm_p, t_state *state, t_block *ins_at, pos_ins_t *pos_ins)
703 int i,j,k,n,rm,mol_id,at,block;
704 rvec *x_tmp,*v_tmp;
705 atom_id *list,*new_mols;
706 unsigned char *new_egrp[egcNR];
707 gmx_bool bRM;
709 snew(list,state->natoms);
710 n=0;
711 for(i=0;i<rm_p->nr;i++)
713 mol_id=rm_p->mol[i];
714 at=mtop->mols.index[mol_id];
715 block =rm_p->block[i];
716 mtop->molblock[block].nmol--;
717 for(j=0;j<mtop->molblock[block].natoms_mol;j++)
719 list[n]=at+j;
720 n++;
723 mtop->mols.index[mol_id]=-1;
726 mtop->mols.nr-=rm_p->nr;
727 mtop->mols.nalloc_index-=rm_p->nr;
728 snew(new_mols,mtop->mols.nr);
729 for(i=0;i<mtop->mols.nr+rm_p->nr;i++)
731 j=0;
732 if(mtop->mols.index[i]!=-1)
734 new_mols[j]=mtop->mols.index[i];
735 j++;
738 sfree(mtop->mols.index);
739 mtop->mols.index=new_mols;
742 mtop->natoms-=n;
743 state->natoms-=n;
744 state->nalloc=state->natoms;
745 snew(x_tmp,state->nalloc);
746 snew(v_tmp,state->nalloc);
748 for(i=0;i<egcNR;i++)
750 if(groups->grpnr[i]!=NULL)
752 groups->ngrpnr[i]=state->natoms;
753 snew(new_egrp[i],state->natoms);
757 rm=0;
758 for (i=0;i<state->natoms+n;i++)
760 bRM=FALSE;
761 for(j=0;j<n;j++)
763 if(i==list[j])
765 bRM=TRUE;
766 rm++;
770 if(!bRM)
772 for(j=0;j<egcNR;j++)
774 if(groups->grpnr[j]!=NULL)
776 new_egrp[j][i-rm]=groups->grpnr[j][i];
779 copy_rvec(state->x[i],x_tmp[i-rm]);
780 copy_rvec(state->v[i],v_tmp[i-rm]);
781 for(j=0;j<ins_at->nr;j++)
783 if (i==ins_at->index[j])
784 ins_at->index[j]=i-rm;
786 for(j=0;j<pos_ins->pieces;j++)
788 for(k=0;k<pos_ins->nidx[j];k++)
790 if (i==pos_ins->subindex[j][k])
791 pos_ins->subindex[j][k]=i-rm;
796 sfree(state->x);
797 state->x=x_tmp;
798 sfree(state->v);
799 state->v=v_tmp;
801 for(i=0;i<egcNR;i++)
803 if(groups->grpnr[i]!=NULL)
805 sfree(groups->grpnr[i]);
806 groups->grpnr[i]=new_egrp[i];
811 int rm_bonded(t_block *ins_at, gmx_mtop_t *mtop)
813 int i,j,m;
814 int type,natom,nmol,at,atom1=0,rm_at=0;
815 gmx_bool *bRM,bINS;
816 /*this routine lives dangerously by assuming that all molecules of a given type are in order in the structure*/
817 /*this routine does not live as dangerously as it seems. There is namely a check in mdrunner_membed to make
818 *sure that g_membed exits with a warning when there are molecules of the same type not in the
819 *ins_at index group. MGWolf 050710 */
822 snew(bRM,mtop->nmoltype);
823 for (i=0;i<mtop->nmoltype;i++)
825 bRM[i]=TRUE;
828 for (i=0;i<mtop->nmolblock;i++)
830 /*loop over molecule blocks*/
831 type =mtop->molblock[i].type;
832 natom =mtop->molblock[i].natoms_mol;
833 nmol =mtop->molblock[i].nmol;
835 for(j=0;j<natom*nmol && bRM[type]==TRUE;j++)
837 /*loop over atoms in the block*/
838 at=j+atom1; /*atom index = block index + offset*/
839 bINS=FALSE;
841 for (m=0;(m<ins_at->nr) && (bINS==FALSE);m++)
843 /*loop over atoms in insertion index group to determine if we're inserting one*/
844 if(at==ins_at->index[m])
846 bINS=TRUE;
849 bRM[type]=bINS;
851 atom1+=natom*nmol; /*update offset*/
852 if(bRM[type])
854 rm_at+=natom*nmol; /*increment bonded removal counter by # atoms in block*/
858 for(i=0;i<mtop->nmoltype;i++)
860 if(bRM[i])
862 for(j=0;j<F_LJ;j++)
864 mtop->moltype[i].ilist[j].nr=0;
866 for(j=F_POSRES;j<=F_VSITEN;j++)
868 mtop->moltype[i].ilist[j].nr=0;
872 sfree(bRM);
874 return rm_at;
877 void top_update(const char *topfile, char *ins, rm_t *rm_p, gmx_mtop_t *mtop)
879 #define TEMP_FILENM "temp.top"
880 int bMolecules=0;
881 FILE *fpin,*fpout;
882 char buf[STRLEN],buf2[STRLEN],*temp;
883 int i,*nmol_rm,nmol,line;
885 fpin = ffopen(topfile,"r");
886 fpout = ffopen(TEMP_FILENM,"w");
888 snew(nmol_rm,mtop->nmoltype);
889 for(i=0;i<rm_p->nr;i++)
890 nmol_rm[rm_p->block[i]]++;
892 line=0;
893 while(fgets(buf,STRLEN,fpin))
895 line++;
896 if(buf[0]!=';')
898 strcpy(buf2,buf);
899 if ((temp=strchr(buf2,'\n')) != NULL)
900 temp[0]='\0';
901 ltrim(buf2);
903 if (buf2[0]=='[')
905 buf2[0]=' ';
906 if ((temp=strchr(buf2,'\n')) != NULL)
907 temp[0]='\0';
908 rtrim(buf2);
909 if (buf2[strlen(buf2)-1]==']')
911 buf2[strlen(buf2)-1]='\0';
912 ltrim(buf2);
913 rtrim(buf2);
914 if (gmx_strcasecmp(buf2,"molecules")==0)
915 bMolecules=1;
917 fprintf(fpout,"%s",buf);
918 } else if (bMolecules==1)
920 for(i=0;i<mtop->nmolblock;i++)
922 nmol=mtop->molblock[i].nmol;
923 sprintf(buf,"%-15s %5d\n",*(mtop->moltype[mtop->molblock[i].type].name),nmol);
924 fprintf(fpout,"%s",buf);
926 bMolecules=2;
927 } else if (bMolecules==2)
929 /* print nothing */
930 } else
932 fprintf(fpout,"%s",buf);
934 } else
936 fprintf(fpout,"%s",buf);
940 fclose(fpout);
941 /* use ffopen to generate backup of topinout */
942 fpout=ffopen(topfile,"w");
943 fclose(fpout);
944 rename(TEMP_FILENM,topfile);
945 #undef TEMP_FILENM
948 void md_print_warning(const t_commrec *cr,FILE *fplog,const char *buf)
950 if (MASTER(cr))
952 fprintf(stderr,"\n%s\n",buf);
954 if (fplog)
956 fprintf(fplog,"\n%s\n",buf);
960 /* simulation conditions to transmit. Keep in mind that they are
961 transmitted to other nodes through an MPI_Reduce after
962 casting them to a real (so the signals can be sent together with other
963 data). This means that the only meaningful values are positive,
964 negative or zero. */
965 enum { eglsNABNSB, eglsCHKPT, eglsSTOPCOND, eglsRESETCOUNTERS, eglsNR };
966 /* Is the signal in one simulation independent of other simulations? */
967 gmx_bool gs_simlocal[eglsNR] = { TRUE, FALSE, FALSE, TRUE };
969 typedef struct {
970 int nstms; /* The frequency for intersimulation communication */
971 int sig[eglsNR]; /* The signal set by one process in do_md */
972 int set[eglsNR]; /* The communicated signal, equal for all processes */
973 } globsig_t;
976 static int multisim_min(const gmx_multisim_t *ms,int nmin,int n)
978 int *buf;
979 gmx_bool bPos,bEqual;
980 int s,d;
982 snew(buf,ms->nsim);
983 buf[ms->sim] = n;
984 gmx_sumi_sim(ms->nsim,buf,ms);
985 bPos = TRUE;
986 bEqual = TRUE;
987 for(s=0; s<ms->nsim; s++)
989 bPos = bPos && (buf[s] > 0);
990 bEqual = bEqual && (buf[s] == buf[0]);
992 if (bPos)
994 if (bEqual)
996 nmin = min(nmin,buf[0]);
998 else
1000 /* Find the least common multiple */
1001 for(d=2; d<nmin; d++)
1003 s = 0;
1004 while (s < ms->nsim && d % buf[s] == 0)
1006 s++;
1008 if (s == ms->nsim)
1010 /* We found the LCM and it is less than nmin */
1011 nmin = d;
1012 break;
1017 sfree(buf);
1019 return nmin;
1022 static int multisim_nstsimsync(const t_commrec *cr,
1023 const t_inputrec *ir,int repl_ex_nst)
1025 int nmin;
1027 if (MASTER(cr))
1029 nmin = INT_MAX;
1030 nmin = multisim_min(cr->ms,nmin,ir->nstlist);
1031 nmin = multisim_min(cr->ms,nmin,ir->nstcalcenergy);
1032 nmin = multisim_min(cr->ms,nmin,repl_ex_nst);
1033 if (nmin == INT_MAX)
1035 gmx_fatal(FARGS,"Can not find an appropriate interval for inter-simulation communication, since nstlist, nstcalcenergy and -replex are all <= 0");
1037 /* Avoid inter-simulation communication at every (second) step */
1038 if (nmin <= 2)
1040 nmin = 10;
1044 gmx_bcast(sizeof(int),&nmin,cr);
1046 return nmin;
1049 static void init_global_signals(globsig_t *gs,const t_commrec *cr,
1050 const t_inputrec *ir,int repl_ex_nst)
1052 int i;
1054 if (MULTISIM(cr))
1056 gs->nstms = multisim_nstsimsync(cr,ir,repl_ex_nst);
1057 if (debug)
1059 fprintf(debug,"Syncing simulations for checkpointing and termination every %d steps\n",gs->nstms);
1062 else
1064 gs->nstms = 1;
1067 for(i=0; i<eglsNR; i++)
1069 gs->sig[i] = 0;
1070 gs->set[i] = 0;
1074 static void copy_coupling_state(t_state *statea,t_state *stateb,
1075 gmx_ekindata_t *ekinda,gmx_ekindata_t *ekindb, t_grpopts* opts)
1078 /* MRS note -- might be able to get rid of some of the arguments. Look over it when it's all debugged */
1080 int i,j,nc;
1082 /* Make sure we have enough space for x and v */
1083 if (statea->nalloc > stateb->nalloc)
1085 stateb->nalloc = statea->nalloc;
1086 srenew(stateb->x,stateb->nalloc);
1087 srenew(stateb->v,stateb->nalloc);
1090 stateb->natoms = statea->natoms;
1091 stateb->ngtc = statea->ngtc;
1092 stateb->nnhpres = statea->nnhpres;
1093 stateb->veta = statea->veta;
1094 if (ekinda)
1096 copy_mat(ekinda->ekin,ekindb->ekin);
1097 for (i=0; i<stateb->ngtc; i++)
1099 ekindb->tcstat[i].T = ekinda->tcstat[i].T;
1100 ekindb->tcstat[i].Th = ekinda->tcstat[i].Th;
1101 copy_mat(ekinda->tcstat[i].ekinh,ekindb->tcstat[i].ekinh);
1102 copy_mat(ekinda->tcstat[i].ekinf,ekindb->tcstat[i].ekinf);
1103 ekindb->tcstat[i].ekinscalef_nhc = ekinda->tcstat[i].ekinscalef_nhc;
1104 ekindb->tcstat[i].ekinscaleh_nhc = ekinda->tcstat[i].ekinscaleh_nhc;
1105 ekindb->tcstat[i].vscale_nhc = ekinda->tcstat[i].vscale_nhc;
1108 copy_rvecn(statea->x,stateb->x,0,stateb->natoms);
1109 copy_rvecn(statea->v,stateb->v,0,stateb->natoms);
1110 copy_mat(statea->box,stateb->box);
1111 copy_mat(statea->box_rel,stateb->box_rel);
1112 copy_mat(statea->boxv,stateb->boxv);
1114 for (i = 0; i<stateb->ngtc; i++)
1116 nc = i*opts->nhchainlength;
1117 for (j=0; j<opts->nhchainlength; j++)
1119 stateb->nosehoover_xi[nc+j] = statea->nosehoover_xi[nc+j];
1120 stateb->nosehoover_vxi[nc+j] = statea->nosehoover_vxi[nc+j];
1123 if (stateb->nhpres_xi != NULL)
1125 for (i = 0; i<stateb->nnhpres; i++)
1127 nc = i*opts->nhchainlength;
1128 for (j=0; j<opts->nhchainlength; j++)
1130 stateb->nhpres_xi[nc+j] = statea->nhpres_xi[nc+j];
1131 stateb->nhpres_vxi[nc+j] = statea->nhpres_vxi[nc+j];
1137 static void compute_globals(FILE *fplog, gmx_global_stat_t gstat, t_commrec *cr, t_inputrec *ir,
1138 t_forcerec *fr, gmx_ekindata_t *ekind,
1139 t_state *state, t_state *state_global, t_mdatoms *mdatoms,
1140 t_nrnb *nrnb, t_vcm *vcm, gmx_wallcycle_t wcycle,
1141 gmx_enerdata_t *enerd,tensor force_vir, tensor shake_vir, tensor total_vir,
1142 tensor pres, rvec mu_tot, gmx_constr_t constr,
1143 globsig_t *gs,gmx_bool bInterSimGS,
1144 matrix box, gmx_mtop_t *top_global, real *pcurr,
1145 int natoms, gmx_bool *bSumEkinhOld, int flags)
1147 int i,gsi;
1148 real gs_buf[eglsNR];
1149 tensor corr_vir,corr_pres;
1150 gmx_bool bEner,bPres,bTemp;
1151 gmx_bool bRerunMD, bStopCM, bGStat, bIterate,
1152 bFirstIterate,bReadEkin,bEkinAveVel,bScaleEkin, bConstrain;
1153 real prescorr,enercorr,dvdlcorr;
1155 /* translate CGLO flags to gmx_booleans */
1156 bRerunMD = flags & CGLO_RERUNMD;
1157 bStopCM = flags & CGLO_STOPCM;
1158 bGStat = flags & CGLO_GSTAT;
1159 bReadEkin = (flags & CGLO_READEKIN);
1160 bScaleEkin = (flags & CGLO_SCALEEKIN);
1161 bEner = flags & CGLO_ENERGY;
1162 bTemp = flags & CGLO_TEMPERATURE;
1163 bPres = (flags & CGLO_PRESSURE);
1164 bConstrain = (flags & CGLO_CONSTRAINT);
1165 bIterate = (flags & CGLO_ITERATE);
1166 bFirstIterate = (flags & CGLO_FIRSTITERATE);
1168 /* we calculate a full state kinetic energy either with full-step velocity verlet
1169 or half step where we need the pressure */
1170 bEkinAveVel = (ir->eI==eiVV || (ir->eI==eiVVAK && IR_NPT_TROTTER(ir) && bPres) || bReadEkin);
1172 /* in initalization, it sums the shake virial in vv, and to
1173 sums ekinh_old in leapfrog (or if we are calculating ekinh_old for other reasons */
1175 /* ########## Kinetic energy ############## */
1177 if (bTemp)
1179 /* Non-equilibrium MD: this is parallellized, but only does communication
1180 * when there really is NEMD.
1183 if (PAR(cr) && (ekind->bNEMD))
1185 accumulate_u(cr,&(ir->opts),ekind);
1187 debug_gmx();
1188 if (bReadEkin)
1190 restore_ekinstate_from_state(cr,ekind,&state_global->ekinstate);
1192 else
1195 calc_ke_part(state,&(ir->opts),mdatoms,ekind,nrnb,bEkinAveVel,bIterate);
1198 debug_gmx();
1200 /* Calculate center of mass velocity if necessary, also parallellized */
1201 if (bStopCM && !bRerunMD && bEner)
1203 calc_vcm_grp(fplog,mdatoms->start,mdatoms->homenr,mdatoms,
1204 state->x,state->v,vcm);
1208 if (bTemp || bPres || bEner || bConstrain)
1210 if (!bGStat)
1212 /* We will not sum ekinh_old,
1213 * so signal that we still have to do it.
1215 *bSumEkinhOld = TRUE;
1218 else
1220 if (gs != NULL)
1222 for(i=0; i<eglsNR; i++)
1224 gs_buf[i] = gs->sig[i];
1227 if (PAR(cr))
1229 wallcycle_start(wcycle,ewcMoveE);
1230 GMX_MPE_LOG(ev_global_stat_start);
1231 global_stat(fplog,gstat,cr,enerd,force_vir,shake_vir,mu_tot,
1232 ir,ekind,constr,vcm,
1233 gs != NULL ? eglsNR : 0,gs_buf,
1234 top_global,state,
1235 *bSumEkinhOld,flags);
1236 GMX_MPE_LOG(ev_global_stat_finish);
1237 wallcycle_stop(wcycle,ewcMoveE);
1239 if (gs != NULL)
1241 if (MULTISIM(cr) && bInterSimGS)
1243 if (MASTER(cr))
1245 /* Communicate the signals between the simulations */
1246 gmx_sum_sim(eglsNR,gs_buf,cr->ms);
1248 /* Communicate the signals form the master to the others */
1249 gmx_bcast(eglsNR*sizeof(gs_buf[0]),gs_buf,cr);
1251 for(i=0; i<eglsNR; i++)
1253 if (bInterSimGS || gs_simlocal[i])
1255 /* Set the communicated signal only when it is non-zero,
1256 * since signals might not be processed at each MD step.
1258 gsi = (gs_buf[i] >= 0 ?
1259 (int)(gs_buf[i] + 0.5) :
1260 (int)(gs_buf[i] - 0.5));
1261 if (gsi != 0)
1263 gs->set[i] = gsi;
1265 /* Turn off the local signal */
1266 gs->sig[i] = 0;
1270 *bSumEkinhOld = FALSE;
1274 if (!ekind->bNEMD && debug && bTemp && (vcm->nr > 0))
1276 correct_ekin(debug,
1277 mdatoms->start,mdatoms->start+mdatoms->homenr,
1278 state->v,vcm->group_p[0],
1279 mdatoms->massT,mdatoms->tmass,ekind->ekin);
1282 if (bEner) {
1283 /* Do center of mass motion removal */
1284 if (bStopCM && !bRerunMD) /* is this correct? Does it get called too often with this logic? */
1286 check_cm_grp(fplog,vcm,ir,1);
1287 do_stopcm_grp(fplog,mdatoms->start,mdatoms->homenr,mdatoms->cVCM,
1288 state->x,state->v,vcm);
1289 inc_nrnb(nrnb,eNR_STOPCM,mdatoms->homenr);
1293 if (bTemp)
1295 /* Sum the kinetic energies of the groups & calc temp */
1296 /* compute full step kinetic energies if vv, or if vv-avek and we are computing the pressure with IR_NPT_TROTTER */
1297 /* three maincase: VV with AveVel (md-vv), vv with AveEkin (md-vv-avek), leap with AveEkin (md).
1298 Leap with AveVel is also an option for the future but not supported now.
1299 bEkinAveVel: If TRUE, we simply multiply ekin by ekinscale to get a full step kinetic energy.
1300 If FALSE, we average ekinh_old and ekinh*ekinscale_nhc to get an averaged half step kinetic energy.
1301 bSaveEkinOld: If TRUE (in the case of iteration = bIterate is TRUE), we don't reset the ekinscale_nhc.
1302 If FALSE, we go ahead and erase over it.
1304 enerd->term[F_TEMP] = sum_ekin(&(ir->opts),ekind,&(enerd->term[F_DKDL]),
1305 bEkinAveVel,bIterate,bScaleEkin);
1307 enerd->term[F_EKIN] = trace(ekind->ekin);
1310 /* ########## Long range energy information ###### */
1312 if (bEner || bPres || bConstrain)
1314 calc_dispcorr(fplog,ir,fr,0,top_global->natoms,box,state->lambda,
1315 corr_pres,corr_vir,&prescorr,&enercorr,&dvdlcorr);
1318 if (bEner && bFirstIterate)
1320 enerd->term[F_DISPCORR] = enercorr;
1321 enerd->term[F_EPOT] += enercorr;
1322 enerd->term[F_DVDL] += dvdlcorr;
1323 if (fr->efep != efepNO) {
1324 enerd->dvdl_lin += dvdlcorr;
1328 /* ########## Now pressure ############## */
1329 if (bPres || bConstrain)
1332 m_add(force_vir,shake_vir,total_vir);
1334 /* Calculate pressure and apply LR correction if PPPM is used.
1335 * Use the box from last timestep since we already called update().
1338 enerd->term[F_PRES] = calc_pres(fr->ePBC,ir->nwall,box,ekind->ekin,total_vir,pres,
1339 (fr->eeltype==eelPPPM)?enerd->term[F_COUL_RECIP]:0.0);
1341 /* Calculate long range corrections to pressure and energy */
1342 /* this adds to enerd->term[F_PRES] and enerd->term[F_ETOT],
1343 and computes enerd->term[F_DISPCORR]. Also modifies the
1344 total_vir and pres tesors */
1346 m_add(total_vir,corr_vir,total_vir);
1347 m_add(pres,corr_pres,pres);
1348 enerd->term[F_PDISPCORR] = prescorr;
1349 enerd->term[F_PRES] += prescorr;
1350 *pcurr = enerd->term[F_PRES];
1351 /* calculate temperature using virial */
1352 enerd->term[F_VTEMP] = calc_temp(trace(total_vir),ir->opts.nrdf[0]);
1358 /* Definitions for convergence of iterated constraints */
1360 /* iterate constraints up to 50 times */
1361 #define MAXITERCONST 50
1363 /* data type */
1364 typedef struct
1366 real f,fprev,x,xprev;
1367 int iter_i;
1368 gmx_bool bIterate;
1369 real allrelerr[MAXITERCONST+2];
1370 int num_close; /* number of "close" violations, caused by limited precision. */
1371 } gmx_iterate_t;
1373 #ifdef GMX_DOUBLE
1374 #define CONVERGEITER 0.000000001
1375 #define CLOSE_ENOUGH 0.000001000
1376 #else
1377 #define CONVERGEITER 0.0001
1378 #define CLOSE_ENOUGH 0.0050
1379 #endif
1381 /* we want to keep track of the close calls. If there are too many, there might be some other issues.
1382 so we make sure that it's either less than some predetermined number, or if more than that number,
1383 only some small fraction of the total. */
1384 #define MAX_NUMBER_CLOSE 50
1385 #define FRACTION_CLOSE 0.001
1387 /* maximum length of cyclic traps to check, emerging from limited numerical precision */
1388 #define CYCLEMAX 20
1390 static void gmx_iterate_init(gmx_iterate_t *iterate,gmx_bool bIterate)
1392 int i;
1394 iterate->iter_i = 0;
1395 iterate->bIterate = bIterate;
1396 iterate->num_close = 0;
1397 for (i=0;i<MAXITERCONST+2;i++)
1399 iterate->allrelerr[i] = 0;
1403 static gmx_bool done_iterating(const t_commrec *cr,FILE *fplog, int nsteps, gmx_iterate_t *iterate, gmx_bool bFirstIterate, real fom, real *newf)
1405 /* monitor convergence, and use a secant search to propose new
1406 values.
1407 x_{i} - x_{i-1}
1408 The secant method computes x_{i+1} = x_{i} - f(x_{i}) * ---------------------
1409 f(x_{i}) - f(x_{i-1})
1411 The function we are trying to zero is fom-x, where fom is the
1412 "figure of merit" which is the pressure (or the veta value) we
1413 would get by putting in an old value of the pressure or veta into
1414 the incrementor function for the step or half step. I have
1415 verified that this gives the same answer as self consistent
1416 iteration, usually in many fewer steps, especially for small tau_p.
1418 We could possibly eliminate an iteration with proper use
1419 of the value from the previous step, but that would take a bit
1420 more bookkeeping, especially for veta, since tests indicate the
1421 function of veta on the last step is not sufficiently close to
1422 guarantee convergence this step. This is
1423 good enough for now. On my tests, I could use tau_p down to
1424 0.02, which is smaller that would ever be necessary in
1425 practice. Generally, 3-5 iterations will be sufficient */
1427 real relerr,err;
1428 char buf[256];
1429 int i;
1430 gmx_bool incycle;
1432 if (bFirstIterate)
1434 iterate->x = fom;
1435 iterate->f = fom-iterate->x;
1436 iterate->xprev = 0;
1437 iterate->fprev = 0;
1438 *newf = fom;
1440 else
1442 iterate->f = fom-iterate->x; /* we want to zero this difference */
1443 if ((iterate->iter_i > 1) && (iterate->iter_i < MAXITERCONST))
1445 if (iterate->f==iterate->fprev)
1447 *newf = iterate->f;
1449 else
1451 *newf = iterate->x - (iterate->x-iterate->xprev)*(iterate->f)/(iterate->f-iterate->fprev);
1454 else
1456 /* just use self-consistent iteration the first step to initialize, or
1457 if it's not converging (which happens occasionally -- need to investigate why) */
1458 *newf = fom;
1461 /* Consider a slight shortcut allowing us to exit one sooner -- we check the
1462 difference between the closest of x and xprev to the new
1463 value. To be 100% certain, we should check the difference between
1464 the last result, and the previous result, or
1466 relerr = (fabs((x-xprev)/fom));
1468 but this is pretty much never necessary under typical conditions.
1469 Checking numerically, it seems to lead to almost exactly the same
1470 trajectories, but there are small differences out a few decimal
1471 places in the pressure, and eventually in the v_eta, but it could
1472 save an interation.
1474 if (fabs(*newf-x) < fabs(*newf - xprev)) { xmin = x;} else { xmin = xprev;}
1475 relerr = (fabs((*newf-xmin) / *newf));
1478 err = fabs((iterate->f-iterate->fprev));
1479 relerr = fabs(err/fom);
1481 iterate->allrelerr[iterate->iter_i] = relerr;
1483 if (iterate->iter_i > 0)
1485 if (debug)
1487 fprintf(debug,"Iterating NPT constraints: %6i %20.12f%14.6g%20.12f\n",
1488 iterate->iter_i,fom,relerr,*newf);
1491 if ((relerr < CONVERGEITER) || (err < CONVERGEITER) || (fom==0) || ((iterate->x == iterate->xprev) && iterate->iter_i > 1))
1493 iterate->bIterate = FALSE;
1494 if (debug)
1496 fprintf(debug,"Iterating NPT constraints: CONVERGED\n");
1498 return TRUE;
1500 if (iterate->iter_i > MAXITERCONST)
1502 if (relerr < CLOSE_ENOUGH)
1504 incycle = FALSE;
1505 for (i=1;i<CYCLEMAX;i++) {
1506 if ((iterate->allrelerr[iterate->iter_i-(1+i)] == iterate->allrelerr[iterate->iter_i-1]) &&
1507 (iterate->allrelerr[iterate->iter_i-(1+i)] == iterate->allrelerr[iterate->iter_i-(1+2*i)])) {
1508 incycle = TRUE;
1509 if (debug)
1511 fprintf(debug,"Exiting from an NPT iterating cycle of length %d\n",i);
1513 break;
1517 if (incycle) {
1518 /* step 1: trapped in a numerical attractor */
1519 /* we are trapped in a numerical attractor, and can't converge any more, and are close to the final result.
1520 Better to give up convergence here than have the simulation die.
1522 iterate->num_close++;
1523 return TRUE;
1525 else
1527 /* Step #2: test if we are reasonably close for other reasons, then monitor the number. If not, die */
1529 /* how many close calls have we had? If less than a few, we're OK */
1530 if (iterate->num_close < MAX_NUMBER_CLOSE)
1532 sprintf(buf,"Slight numerical convergence deviation with NPT at step %d, relative error only %10.5g, likely not a problem, continuing\n",nsteps,relerr);
1533 md_print_warning(cr,fplog,buf);
1534 iterate->num_close++;
1535 return TRUE;
1536 /* if more than a few, check the total fraction. If too high, die. */
1537 } else if (iterate->num_close/(double)nsteps > FRACTION_CLOSE) {
1538 gmx_fatal(FARGS,"Could not converge NPT constraints, too many exceptions (%d%%\n",iterate->num_close/(double)nsteps);
1542 else
1544 gmx_fatal(FARGS,"Could not converge NPT constraints\n");
1549 iterate->xprev = iterate->x;
1550 iterate->x = *newf;
1551 iterate->fprev = iterate->f;
1552 iterate->iter_i++;
1554 return FALSE;
1557 static void check_nst_param(FILE *fplog,t_commrec *cr,
1558 const char *desc_nst,int nst,
1559 const char *desc_p,int *p)
1561 char buf[STRLEN];
1563 if (*p > 0 && *p % nst != 0)
1565 /* Round up to the next multiple of nst */
1566 *p = ((*p)/nst + 1)*nst;
1567 sprintf(buf,"NOTE: %s changes %s to %d\n",desc_nst,desc_p,*p);
1568 md_print_warning(cr,fplog,buf);
1572 static void reset_all_counters(FILE *fplog,t_commrec *cr,
1573 gmx_large_int_t step,
1574 gmx_large_int_t *step_rel,t_inputrec *ir,
1575 gmx_wallcycle_t wcycle,t_nrnb *nrnb,
1576 gmx_runtime_t *runtime)
1578 char buf[STRLEN],sbuf[STEPSTRSIZE];
1580 /* Reset all the counters related to performance over the run */
1581 sprintf(buf,"Step %s: resetting all time and cycle counters\n",
1582 gmx_step_str(step,sbuf));
1583 md_print_warning(cr,fplog,buf);
1585 wallcycle_stop(wcycle,ewcRUN);
1586 wallcycle_reset_all(wcycle);
1587 if (DOMAINDECOMP(cr))
1589 reset_dd_statistics_counters(cr->dd);
1591 init_nrnb(nrnb);
1592 ir->init_step += *step_rel;
1593 ir->nsteps -= *step_rel;
1594 *step_rel = 0;
1595 wallcycle_start(wcycle,ewcRUN);
1596 runtime_start(runtime);
1597 print_date_and_time(fplog,cr->nodeid,"Restarted time",runtime);
1600 static int check_nstglobalcomm(FILE *fplog,t_commrec *cr,
1601 int nstglobalcomm,t_inputrec *ir)
1603 char buf[STRLEN];
1605 if (!EI_DYNAMICS(ir->eI))
1607 nstglobalcomm = 1;
1610 if (nstglobalcomm == -1)
1612 if (ir->nstcalcenergy == 0 && ir->nstlist == 0)
1614 nstglobalcomm = 10;
1615 if (ir->nstenergy > 0 && ir->nstenergy < nstglobalcomm)
1617 nstglobalcomm = ir->nstenergy;
1620 else
1622 /* We assume that if nstcalcenergy > nstlist,
1623 * nstcalcenergy is a multiple of nstlist.
1625 if (ir->nstcalcenergy == 0 ||
1626 (ir->nstlist > 0 && ir->nstlist < ir->nstcalcenergy))
1628 nstglobalcomm = ir->nstlist;
1630 else
1632 nstglobalcomm = ir->nstcalcenergy;
1636 else
1638 if (ir->nstlist > 0 &&
1639 nstglobalcomm > ir->nstlist && nstglobalcomm % ir->nstlist != 0)
1641 nstglobalcomm = (nstglobalcomm / ir->nstlist)*ir->nstlist;
1642 sprintf(buf,"WARNING: nstglobalcomm is larger than nstlist, but not a multiple, setting it to %d\n",nstglobalcomm);
1643 md_print_warning(cr,fplog,buf);
1645 if (nstglobalcomm > ir->nstcalcenergy)
1647 check_nst_param(fplog,cr,"-gcom",nstglobalcomm,
1648 "nstcalcenergy",&ir->nstcalcenergy);
1651 check_nst_param(fplog,cr,"-gcom",nstglobalcomm,
1652 "nstenergy",&ir->nstenergy);
1654 check_nst_param(fplog,cr,"-gcom",nstglobalcomm,
1655 "nstlog",&ir->nstlog);
1658 if (ir->comm_mode != ecmNO && ir->nstcomm < nstglobalcomm)
1660 sprintf(buf,"WARNING: Changing nstcomm from %d to %d\n",
1661 ir->nstcomm,nstglobalcomm);
1662 md_print_warning(cr,fplog,buf);
1663 ir->nstcomm = nstglobalcomm;
1666 return nstglobalcomm;
1669 void check_ir_old_tpx_versions(t_commrec *cr,FILE *fplog,
1670 t_inputrec *ir,gmx_mtop_t *mtop)
1672 /* Check required for old tpx files */
1673 if (IR_TWINRANGE(*ir) && ir->nstlist > 1 &&
1674 ir->nstcalcenergy % ir->nstlist != 0)
1676 md_print_warning(cr,fplog,"Old tpr file with twin-range settings: modifying energy calculation and/or T/P-coupling frequencies");
1678 if (gmx_mtop_ftype_count(mtop,F_CONSTR) +
1679 gmx_mtop_ftype_count(mtop,F_CONSTRNC) > 0 &&
1680 ir->eConstrAlg == econtSHAKE)
1682 md_print_warning(cr,fplog,"With twin-range cut-off's and SHAKE the virial and pressure are incorrect");
1683 if (ir->epc != epcNO)
1685 gmx_fatal(FARGS,"Can not do pressure coupling with twin-range cut-off's and SHAKE");
1688 check_nst_param(fplog,cr,"nstlist",ir->nstlist,
1689 "nstcalcenergy",&ir->nstcalcenergy);
1690 check_nst_param(fplog,cr,"nstcalcenergy",ir->nstcalcenergy,
1691 "nstenergy",&ir->nstenergy);
1692 check_nst_param(fplog,cr,"nstcalcenergy",ir->nstcalcenergy,
1693 "nstlog",&ir->nstlog);
1694 if (ir->efep != efepNO)
1696 check_nst_param(fplog,cr,"nstcalcenergy",ir->nstcalcenergy,
1697 "nstdhdl",&ir->nstdhdl);
1702 typedef struct {
1703 gmx_bool bGStatEveryStep;
1704 gmx_large_int_t step_ns;
1705 gmx_large_int_t step_nscheck;
1706 gmx_large_int_t nns;
1707 matrix scale_tot;
1708 int nabnsb;
1709 double s1;
1710 double s2;
1711 double ab;
1712 double lt_runav;
1713 double lt_runav2;
1714 } gmx_nlheur_t;
1716 static void reset_nlistheuristics(gmx_nlheur_t *nlh,gmx_large_int_t step)
1718 nlh->lt_runav = 0;
1719 nlh->lt_runav2 = 0;
1720 nlh->step_nscheck = step;
1723 static void init_nlistheuristics(gmx_nlheur_t *nlh,
1724 gmx_bool bGStatEveryStep,gmx_large_int_t step)
1726 nlh->bGStatEveryStep = bGStatEveryStep;
1727 nlh->nns = 0;
1728 nlh->nabnsb = 0;
1729 nlh->s1 = 0;
1730 nlh->s2 = 0;
1731 nlh->ab = 0;
1733 reset_nlistheuristics(nlh,step);
1736 static void update_nliststatistics(gmx_nlheur_t *nlh,gmx_large_int_t step)
1738 gmx_large_int_t nl_lt;
1739 char sbuf[STEPSTRSIZE],sbuf2[STEPSTRSIZE];
1741 /* Determine the neighbor list life time */
1742 nl_lt = step - nlh->step_ns;
1743 if (debug)
1745 fprintf(debug,"%d atoms beyond ns buffer, updating neighbor list after %s steps\n",nlh->nabnsb,gmx_step_str(nl_lt,sbuf));
1747 nlh->nns++;
1748 nlh->s1 += nl_lt;
1749 nlh->s2 += nl_lt*nl_lt;
1750 nlh->ab += nlh->nabnsb;
1751 if (nlh->lt_runav == 0)
1753 nlh->lt_runav = nl_lt;
1754 /* Initialize the fluctuation average
1755 * such that at startup we check after 0 steps.
1757 nlh->lt_runav2 = sqr(nl_lt/2.0);
1759 /* Running average with 0.9 gives an exp. history of 9.5 */
1760 nlh->lt_runav2 = 0.9*nlh->lt_runav2 + 0.1*sqr(nlh->lt_runav - nl_lt);
1761 nlh->lt_runav = 0.9*nlh->lt_runav + 0.1*nl_lt;
1762 if (nlh->bGStatEveryStep)
1764 /* Always check the nlist validity */
1765 nlh->step_nscheck = step;
1767 else
1769 /* We check after: <life time> - 2*sigma
1770 * The factor 2 is quite conservative,
1771 * but we assume that with nstlist=-1 the user
1772 * prefers exact integration over performance.
1774 nlh->step_nscheck = step
1775 + (int)(nlh->lt_runav - 2.0*sqrt(nlh->lt_runav2)) - 1;
1777 if (debug)
1779 fprintf(debug,"nlist life time %s run av. %4.1f sig %3.1f check %s check with -gcom %d\n",
1780 gmx_step_str(nl_lt,sbuf),nlh->lt_runav,sqrt(nlh->lt_runav2),
1781 gmx_step_str(nlh->step_nscheck-step+1,sbuf2),
1782 (int)(nlh->lt_runav - 2.0*sqrt(nlh->lt_runav2)));
1786 static void set_nlistheuristics(gmx_nlheur_t *nlh,gmx_bool bReset,gmx_large_int_t step)
1788 int d;
1790 if (bReset)
1792 reset_nlistheuristics(nlh,step);
1794 else
1796 update_nliststatistics(nlh,step);
1799 nlh->step_ns = step;
1800 /* Initialize the cumulative coordinate scaling matrix */
1801 clear_mat(nlh->scale_tot);
1802 for(d=0; d<DIM; d++)
1804 nlh->scale_tot[d][d] = 1.0;
1808 double do_md_membed(FILE *fplog,t_commrec *cr,int nfile,const t_filenm fnm[],
1809 const output_env_t oenv, gmx_bool bVerbose,gmx_bool bCompact,
1810 int nstglobalcomm,
1811 gmx_vsite_t *vsite,gmx_constr_t constr,
1812 int stepout,t_inputrec *ir,
1813 gmx_mtop_t *top_global,
1814 t_fcdata *fcd,
1815 t_state *state_global,
1816 t_mdatoms *mdatoms,
1817 t_nrnb *nrnb,gmx_wallcycle_t wcycle,
1818 gmx_edsam_t ed,t_forcerec *fr,
1819 int repl_ex_nst,int repl_ex_seed,
1820 real cpt_period,real max_hours,
1821 const char *deviceOptions,
1822 unsigned long Flags,
1823 gmx_runtime_t *runtime,
1824 rvec fac, rvec *r_ins, pos_ins_t *pos_ins, t_block *ins_at,
1825 real xy_step, real z_step, int it_xy, int it_z)
1827 gmx_mdoutf_t *outf;
1828 gmx_large_int_t step,step_rel;
1829 double run_time;
1830 double t,t0,lam0;
1831 gmx_bool bGStatEveryStep,bGStat,bNstEner,bCalcEnerPres;
1832 gmx_bool bNS,bNStList,bSimAnn,bStopCM,bRerunMD,bNotLastFrame=FALSE,
1833 bFirstStep,bStateFromTPX,bInitStep,bLastStep,
1834 bBornRadii,bStartingFromCpt;
1835 gmx_bool bDoDHDL=FALSE;
1836 gmx_bool do_ene,do_log,do_verbose,bRerunWarnNoV=TRUE,
1837 bForceUpdate=FALSE,bCPT;
1838 int mdof_flags;
1839 gmx_bool bMasterState;
1840 int force_flags,cglo_flags;
1841 tensor force_vir,shake_vir,total_vir,tmp_vir,pres;
1842 int i,m;
1843 t_trxstatus *status;
1844 rvec mu_tot;
1845 t_vcm *vcm;
1846 t_state *bufstate=NULL;
1847 matrix *scale_tot,pcoupl_mu,M,ebox;
1848 gmx_nlheur_t nlh;
1849 t_trxframe rerun_fr;
1850 /* gmx_repl_ex_t repl_ex=NULL;*/
1851 int nchkpt=1;
1853 gmx_localtop_t *top;
1854 t_mdebin *mdebin=NULL;
1855 t_state *state=NULL;
1856 rvec *f_global=NULL;
1857 int n_xtc=-1;
1858 rvec *x_xtc=NULL;
1859 gmx_enerdata_t *enerd;
1860 rvec *f=NULL;
1861 gmx_global_stat_t gstat;
1862 gmx_update_t upd=NULL;
1863 t_graph *graph=NULL;
1864 globsig_t gs;
1866 gmx_bool bFFscan;
1867 gmx_groups_t *groups;
1868 gmx_ekindata_t *ekind, *ekind_save;
1869 gmx_shellfc_t shellfc;
1870 int count,nconverged=0;
1871 real timestep=0;
1872 double tcount=0;
1873 gmx_bool bIonize=FALSE;
1874 gmx_bool bTCR=FALSE,bConverged=TRUE,bOK,bSumEkinhOld,bExchanged;
1875 gmx_bool bAppend;
1876 gmx_bool bResetCountersHalfMaxH=FALSE;
1877 gmx_bool bVV,bIterations,bIterate,bFirstIterate,bTemp,bPres,bTrotter;
1878 real temp0,dvdl;
1879 int a0,a1,ii;
1880 rvec *xcopy=NULL,*vcopy=NULL,*cbuf=NULL;
1881 matrix boxcopy={{0}},lastbox;
1882 real veta_save,pcurr,scalevir,tracevir;
1883 real vetanew = 0;
1884 double cycles;
1885 real last_conserved = 0;
1886 real last_ekin = 0;
1887 t_extmass MassQ;
1888 int **trotter_seq;
1889 char sbuf[STEPSTRSIZE],sbuf2[STEPSTRSIZE];
1890 int handled_stop_condition=gmx_stop_cond_none; /* compare to get_stop_condition*/
1891 gmx_iterate_t iterate;
1892 #ifdef GMX_FAHCORE
1893 /* Temporary addition for FAHCORE checkpointing */
1894 int chkpt_ret;
1895 #endif
1897 /* Check for special mdrun options */
1898 bRerunMD = (Flags & MD_RERUN);
1899 bIonize = (Flags & MD_IONIZE);
1900 bFFscan = (Flags & MD_FFSCAN);
1901 bAppend = (Flags & MD_APPENDFILES);
1902 bGStatEveryStep = FALSE;
1903 if (Flags & MD_RESETCOUNTERSHALFWAY)
1905 if (ir->nsteps > 0)
1907 /* Signal to reset the counters half the simulation steps. */
1908 wcycle_set_reset_counters(wcycle,ir->nsteps/2);
1910 /* Signal to reset the counters halfway the simulation time. */
1911 bResetCountersHalfMaxH = (max_hours > 0);
1914 /* md-vv uses averaged full step velocities for T-control
1915 md-vv-avek uses averaged half step velocities for T-control (but full step ekin for P control)
1916 md uses averaged half step kinetic energies to determine temperature unless defined otherwise by GMX_EKIN_AVE_VEL; */
1917 bVV = EI_VV(ir->eI);
1918 if (bVV) /* to store the initial velocities while computing virial */
1920 snew(cbuf,top_global->natoms);
1922 /* all the iteratative cases - only if there are constraints */
1923 bIterations = ((IR_NPT_TROTTER(ir)) && (constr) && (!bRerunMD));
1924 bTrotter = (bVV && (IR_NPT_TROTTER(ir) || (IR_NVT_TROTTER(ir))));
1926 if (bRerunMD)
1928 /* Since we don't know if the frames read are related in any way,
1929 * rebuild the neighborlist at every step.
1931 ir->nstlist = 1;
1932 ir->nstcalcenergy = 1;
1933 nstglobalcomm = 1;
1936 check_ir_old_tpx_versions(cr,fplog,ir,top_global);
1938 nstglobalcomm = check_nstglobalcomm(fplog,cr,nstglobalcomm,ir);
1939 /*bGStatEveryStep = (nstglobalcomm == 1);*/
1940 bGStatEveryStep = FALSE;
1942 if (!bGStatEveryStep && ir->nstlist == -1 && fplog != NULL)
1944 fprintf(fplog,
1945 "To reduce the energy communication with nstlist = -1\n"
1946 "the neighbor list validity should not be checked at every step,\n"
1947 "this means that exact integration is not guaranteed.\n"
1948 "The neighbor list validity is checked after:\n"
1949 " <n.list life time> - 2*std.dev.(n.list life time) steps.\n"
1950 "In most cases this will result in exact integration.\n"
1951 "This reduces the energy communication by a factor of 2 to 3.\n"
1952 "If you want less energy communication, set nstlist > 3.\n\n");
1955 if (bRerunMD || bFFscan)
1957 ir->nstxtcout = 0;
1959 groups = &top_global->groups;
1961 /* Initial values */
1962 init_md(fplog,cr,ir,oenv,&t,&t0,&state_global->lambda,&lam0,
1963 nrnb,top_global,&upd,
1964 nfile,fnm,&outf,&mdebin,
1965 force_vir,shake_vir,mu_tot,&bSimAnn,&vcm,state_global,Flags);
1967 clear_mat(total_vir);
1968 clear_mat(pres);
1969 /* Energy terms and groups */
1970 snew(enerd,1);
1971 init_enerdata(top_global->groups.grps[egcENER].nr,ir->n_flambda,enerd);
1972 if (DOMAINDECOMP(cr))
1974 f = NULL;
1976 else
1978 snew(f,top_global->natoms);
1981 /* Kinetic energy data */
1982 snew(ekind,1);
1983 init_ekindata(fplog,top_global,&(ir->opts),ekind);
1984 /* needed for iteration of constraints */
1985 snew(ekind_save,1);
1986 init_ekindata(fplog,top_global,&(ir->opts),ekind_save);
1987 /* Copy the cos acceleration to the groups struct */
1988 ekind->cosacc.cos_accel = ir->cos_accel;
1990 gstat = global_stat_init(ir);
1991 debug_gmx();
1993 /* Check for polarizable models and flexible constraints */
1994 shellfc = init_shell_flexcon(fplog,
1995 top_global,n_flexible_constraints(constr),
1996 (ir->bContinuation ||
1997 (DOMAINDECOMP(cr) && !MASTER(cr))) ?
1998 NULL : state_global->x);
2000 /* if (DEFORM(*ir))
2002 #ifdef GMX_THREADS
2003 tMPI_Thread_mutex_lock(&deform_init_box_mutex);
2004 #endif
2005 set_deform_reference_box(upd,
2006 deform_init_init_step_tpx,
2007 deform_init_box_tpx);
2008 #ifdef GMX_THREADS
2009 tMPI_Thread_mutex_unlock(&deform_init_box_mutex);
2010 #endif
2013 /* {
2014 double io = compute_io(ir,top_global->natoms,groups,mdebin->ebin->nener,1);
2015 if ((io > 2000) && MASTER(cr))
2016 fprintf(stderr,
2017 "\nWARNING: This run will generate roughly %.0f Mb of data\n\n",
2018 io);
2021 if (DOMAINDECOMP(cr)) {
2022 top = dd_init_local_top(top_global);
2024 snew(state,1);
2025 dd_init_local_state(cr->dd,state_global,state);
2027 if (DDMASTER(cr->dd) && ir->nstfout) {
2028 snew(f_global,state_global->natoms);
2030 } else {
2031 if (PAR(cr)) {
2032 /* Initialize the particle decomposition and split the topology */
2033 top = split_system(fplog,top_global,ir,cr);
2035 pd_cg_range(cr,&fr->cg0,&fr->hcg);
2036 pd_at_range(cr,&a0,&a1);
2037 } else {
2038 top = gmx_mtop_generate_local_top(top_global,ir);
2040 a0 = 0;
2041 a1 = top_global->natoms;
2044 state = partdec_init_local_state(cr,state_global);
2045 f_global = f;
2047 atoms2md(top_global,ir,0,NULL,a0,a1-a0,mdatoms);
2049 if (vsite) {
2050 set_vsite_top(vsite,top,mdatoms,cr);
2053 if (ir->ePBC != epbcNONE && !ir->bPeriodicMols) {
2054 graph = mk_graph(fplog,&(top->idef),0,top_global->natoms,FALSE,FALSE);
2057 if (shellfc) {
2058 make_local_shells(cr,mdatoms,shellfc);
2061 if (ir->pull && PAR(cr)) {
2062 dd_make_local_pull_groups(NULL,ir->pull,mdatoms);
2066 if (DOMAINDECOMP(cr))
2068 /* Distribute the charge groups over the nodes from the master node */
2069 dd_partition_system(fplog,ir->init_step,cr,TRUE,1,
2070 state_global,top_global,ir,
2071 state,&f,mdatoms,top,fr,
2072 vsite,shellfc,constr,
2073 nrnb,wcycle,FALSE);
2076 update_mdatoms(mdatoms,state->lambda);
2078 if (MASTER(cr))
2080 if (opt2bSet("-cpi",nfile,fnm))
2082 /* Update mdebin with energy history if appending to output files */
2083 if ( Flags & MD_APPENDFILES )
2085 restore_energyhistory_from_state(mdebin,&state_global->enerhist);
2087 else
2089 /* We might have read an energy history from checkpoint,
2090 * free the allocated memory and reset the counts.
2092 done_energyhistory(&state_global->enerhist);
2093 init_energyhistory(&state_global->enerhist);
2096 /* Set the initial energy history in state by updating once */
2097 update_energyhistory(&state_global->enerhist,mdebin);
2100 if ((state->flags & (1<<estLD_RNG)) && (Flags & MD_READ_RNG)) {
2101 /* Set the random state if we read a checkpoint file */
2102 set_stochd_state(upd,state);
2105 /* Initialize constraints */
2106 if (constr) {
2107 if (!DOMAINDECOMP(cr))
2108 set_constraints(constr,top,ir,mdatoms,cr);
2111 /* Check whether we have to GCT stuff */
2112 /* bTCR = ftp2bSet(efGCT,nfile,fnm);
2113 if (bTCR) {
2114 if (MASTER(cr)) {
2115 fprintf(stderr,"Will do General Coupling Theory!\n");
2117 gnx = top_global->mols.nr;
2118 snew(grpindex,gnx);
2119 for(i=0; (i<gnx); i++) {
2120 grpindex[i] = i;
2124 /* if (repl_ex_nst > 0 && MASTER(cr))
2125 repl_ex = init_replica_exchange(fplog,cr->ms,state_global,ir,
2126 repl_ex_nst,repl_ex_seed);*/
2128 if (!ir->bContinuation && !bRerunMD)
2130 if (mdatoms->cFREEZE && (state->flags & (1<<estV)))
2132 /* Set the velocities of frozen particles to zero */
2133 for(i=mdatoms->start; i<mdatoms->start+mdatoms->homenr; i++)
2135 for(m=0; m<DIM; m++)
2137 if (ir->opts.nFreeze[mdatoms->cFREEZE[i]][m])
2139 state->v[i][m] = 0;
2145 if (constr)
2147 /* Constrain the initial coordinates and velocities */
2148 do_constrain_first(fplog,constr,ir,mdatoms,state,f,
2149 graph,cr,nrnb,fr,top,shake_vir);
2151 if (vsite)
2153 /* Construct the virtual sites for the initial configuration */
2154 construct_vsites(fplog,vsite,state->x,nrnb,ir->delta_t,NULL,
2155 top->idef.iparams,top->idef.il,
2156 fr->ePBC,fr->bMolPBC,graph,cr,state->box);
2160 debug_gmx();
2162 /* I'm assuming we need global communication the first time! MRS */
2163 cglo_flags = (CGLO_TEMPERATURE | CGLO_GSTAT
2164 | (bVV ? CGLO_PRESSURE:0)
2165 | (bVV ? CGLO_CONSTRAINT:0)
2166 | (bRerunMD ? CGLO_RERUNMD:0)
2167 | ((Flags & MD_READ_EKIN) ? CGLO_READEKIN:0));
2169 bSumEkinhOld = FALSE;
2170 compute_globals(fplog,gstat,cr,ir,fr,ekind,state,state_global,mdatoms,nrnb,vcm,
2171 wcycle,enerd,force_vir,shake_vir,total_vir,pres,mu_tot,
2172 constr,NULL,FALSE,state->box,
2173 top_global,&pcurr,top_global->natoms,&bSumEkinhOld,cglo_flags);
2174 if (ir->eI == eiVVAK) {
2175 /* a second call to get the half step temperature initialized as well */
2176 /* we do the same call as above, but turn the pressure off -- internally, this
2177 is recognized as a velocity verlet half-step kinetic energy calculation.
2178 This minimized excess variables, but perhaps loses some logic?*/
2180 compute_globals(fplog,gstat,cr,ir,fr,ekind,state,state_global,mdatoms,nrnb,vcm,
2181 wcycle,enerd,force_vir,shake_vir,total_vir,pres,mu_tot,
2182 constr,NULL,FALSE,state->box,
2183 top_global,&pcurr,top_global->natoms,&bSumEkinhOld,
2184 cglo_flags &~ CGLO_PRESSURE);
2187 /* Calculate the initial half step temperature, and save the ekinh_old */
2188 if (!(Flags & MD_STARTFROMCPT))
2190 for(i=0; (i<ir->opts.ngtc); i++)
2192 copy_mat(ekind->tcstat[i].ekinh,ekind->tcstat[i].ekinh_old);
2195 if (ir->eI != eiVV)
2197 enerd->term[F_TEMP] *= 2; /* result of averages being done over previous and current step,
2198 and there is no previous step */
2200 temp0 = enerd->term[F_TEMP];
2202 /* if using an iterative algorithm, we need to create a working directory for the state. */
2203 if (bIterations)
2205 bufstate = init_bufstate(state);
2207 if (bFFscan)
2209 snew(xcopy,state->natoms);
2210 snew(vcopy,state->natoms);
2211 copy_rvecn(state->x,xcopy,0,state->natoms);
2212 copy_rvecn(state->v,vcopy,0,state->natoms);
2213 copy_mat(state->box,boxcopy);
2216 /* need to make an initiation call to get the Trotter variables set, as well as other constants for non-trotter
2217 temperature control */
2218 trotter_seq = init_npt_vars(ir,state,&MassQ,bTrotter);
2220 if (MASTER(cr))
2222 if (constr && !ir->bContinuation && ir->eConstrAlg == econtLINCS)
2224 fprintf(fplog,
2225 "RMS relative constraint deviation after constraining: %.2e\n",
2226 constr_rmsd(constr,FALSE));
2228 fprintf(fplog,"Initial temperature: %g K\n",enerd->term[F_TEMP]);
2229 if (bRerunMD)
2231 fprintf(stderr,"starting md rerun '%s', reading coordinates from"
2232 " input trajectory '%s'\n\n",
2233 *(top_global->name),opt2fn("-rerun",nfile,fnm));
2234 if (bVerbose)
2236 fprintf(stderr,"Calculated time to finish depends on nsteps from "
2237 "run input file,\nwhich may not correspond to the time "
2238 "needed to process input trajectory.\n\n");
2241 else
2243 char tbuf[20];
2244 fprintf(stderr,"starting mdrun '%s'\n",
2245 *(top_global->name));
2246 if (ir->nsteps >= 0)
2248 sprintf(tbuf,"%8.1f",(ir->init_step+ir->nsteps)*ir->delta_t);
2250 else
2252 sprintf(tbuf,"%s","infinite");
2254 if (ir->init_step > 0)
2256 fprintf(stderr,"%s steps, %s ps (continuing from step %s, %8.1f ps).\n",
2257 gmx_step_str(ir->init_step+ir->nsteps,sbuf),tbuf,
2258 gmx_step_str(ir->init_step,sbuf2),
2259 ir->init_step*ir->delta_t);
2261 else
2263 fprintf(stderr,"%s steps, %s ps.\n",
2264 gmx_step_str(ir->nsteps,sbuf),tbuf);
2267 fprintf(fplog,"\n");
2270 /* Set and write start time */
2271 runtime_start(runtime);
2272 print_date_and_time(fplog,cr->nodeid,"Started mdrun",runtime);
2273 wallcycle_start(wcycle,ewcRUN);
2274 if (fplog)
2275 fprintf(fplog,"\n");
2277 /* safest point to do file checkpointing is here. More general point would be immediately before integrator call */
2278 /*#ifdef GMX_FAHCORE
2279 chkpt_ret=fcCheckPointParallel( cr->nodeid,
2280 NULL,0);
2281 if ( chkpt_ret == 0 )
2282 gmx_fatal( 3,__FILE__,__LINE__, "Checkpoint error on step %d\n", 0 );
2283 #endif*/
2285 debug_gmx();
2286 /***********************************************************
2288 * Loop over MD steps
2290 ************************************************************/
2292 /* if rerunMD then read coordinates and velocities from input trajectory */
2293 if (bRerunMD)
2295 if (getenv("GMX_FORCE_UPDATE"))
2297 bForceUpdate = TRUE;
2300 bNotLastFrame = read_first_frame(oenv,&status,
2301 opt2fn("-rerun",nfile,fnm),
2302 &rerun_fr,TRX_NEED_X | TRX_READ_V);
2303 if (rerun_fr.natoms != top_global->natoms)
2305 gmx_fatal(FARGS,
2306 "Number of atoms in trajectory (%d) does not match the "
2307 "run input file (%d)\n",
2308 rerun_fr.natoms,top_global->natoms);
2310 if (ir->ePBC != epbcNONE)
2312 if (!rerun_fr.bBox)
2314 gmx_fatal(FARGS,"Rerun trajectory frame step %d time %f does not contain a box, while pbc is used",rerun_fr.step,rerun_fr.time);
2316 if (max_cutoff2(ir->ePBC,rerun_fr.box) < sqr(fr->rlistlong))
2318 gmx_fatal(FARGS,"Rerun trajectory frame step %d time %f has too small box dimensions",rerun_fr.step,rerun_fr.time);
2321 /* Set the shift vectors.
2322 * Necessary here when have a static box different from the tpr box.
2324 calc_shifts(rerun_fr.box,fr->shift_vec);
2328 /* loop over MD steps or if rerunMD to end of input trajectory */
2329 bFirstStep = TRUE;
2330 /* Skip the first Nose-Hoover integration when we get the state from tpx */
2331 bStateFromTPX = !opt2bSet("-cpi",nfile,fnm);
2332 bInitStep = bFirstStep && (bStateFromTPX || bVV);
2333 bStartingFromCpt = (Flags & MD_STARTFROMCPT) && bInitStep;
2334 bLastStep = FALSE;
2335 bSumEkinhOld = FALSE;
2336 bExchanged = FALSE;
2338 init_global_signals(&gs,cr,ir,repl_ex_nst);
2340 step = ir->init_step;
2341 step_rel = 0;
2343 if (ir->nstlist == -1)
2345 init_nlistheuristics(&nlh,bGStatEveryStep,step);
2348 bLastStep = (bRerunMD || (ir->nsteps >= 0 && step_rel > ir->nsteps));
2349 while (!bLastStep || (bRerunMD && bNotLastFrame)) {
2351 wallcycle_start(wcycle,ewcSTEP);
2353 GMX_MPE_LOG(ev_timestep1);
2355 if (bRerunMD) {
2356 if (rerun_fr.bStep) {
2357 step = rerun_fr.step;
2358 step_rel = step - ir->init_step;
2360 if (rerun_fr.bTime) {
2361 t = rerun_fr.time;
2363 else
2365 t = step;
2368 else
2370 bLastStep = (step_rel == ir->nsteps);
2371 t = t0 + step*ir->delta_t;
2374 if (ir->efep != efepNO)
2376 if (bRerunMD && rerun_fr.bLambda && (ir->delta_lambda!=0))
2378 state_global->lambda = rerun_fr.lambda;
2380 else
2382 state_global->lambda = lam0 + step*ir->delta_lambda;
2384 state->lambda = state_global->lambda;
2385 bDoDHDL = do_per_step(step,ir->nstdhdl);
2388 if (bSimAnn)
2390 update_annealing_target_temp(&(ir->opts),t);
2393 if (bRerunMD)
2395 if (!(DOMAINDECOMP(cr) && !MASTER(cr)))
2397 for(i=0; i<state_global->natoms; i++)
2399 copy_rvec(rerun_fr.x[i],state_global->x[i]);
2401 if (rerun_fr.bV)
2403 for(i=0; i<state_global->natoms; i++)
2405 copy_rvec(rerun_fr.v[i],state_global->v[i]);
2408 else
2410 for(i=0; i<state_global->natoms; i++)
2412 clear_rvec(state_global->v[i]);
2414 if (bRerunWarnNoV)
2416 fprintf(stderr,"\nWARNING: Some frames do not contain velocities.\n"
2417 " Ekin, temperature and pressure are incorrect,\n"
2418 " the virial will be incorrect when constraints are present.\n"
2419 "\n");
2420 bRerunWarnNoV = FALSE;
2424 copy_mat(rerun_fr.box,state_global->box);
2425 copy_mat(state_global->box,state->box);
2427 if (vsite && (Flags & MD_RERUN_VSITE))
2429 if (DOMAINDECOMP(cr))
2431 gmx_fatal(FARGS,"Vsite recalculation with -rerun is not implemented for domain decomposition, use particle decomposition");
2433 if (graph)
2435 /* Following is necessary because the graph may get out of sync
2436 * with the coordinates if we only have every N'th coordinate set
2438 mk_mshift(fplog,graph,fr->ePBC,state->box,state->x);
2439 shift_self(graph,state->box,state->x);
2441 construct_vsites(fplog,vsite,state->x,nrnb,ir->delta_t,state->v,
2442 top->idef.iparams,top->idef.il,
2443 fr->ePBC,fr->bMolPBC,graph,cr,state->box);
2444 if (graph)
2446 unshift_self(graph,state->box,state->x);
2451 /* Stop Center of Mass motion */
2452 bStopCM = (ir->comm_mode != ecmNO && do_per_step(step,ir->nstcomm));
2454 /* Copy back starting coordinates in case we're doing a forcefield scan */
2455 if (bFFscan)
2457 for(ii=0; (ii<state->natoms); ii++)
2459 copy_rvec(xcopy[ii],state->x[ii]);
2460 copy_rvec(vcopy[ii],state->v[ii]);
2462 copy_mat(boxcopy,state->box);
2465 if (bRerunMD)
2467 /* for rerun MD always do Neighbour Searching */
2468 bNS = (bFirstStep || ir->nstlist != 0);
2469 bNStList = bNS;
2471 else
2473 /* Determine whether or not to do Neighbour Searching and LR */
2474 bNStList = (ir->nstlist > 0 && step % ir->nstlist == 0);
2476 bNS = (bFirstStep || bExchanged || bNStList ||
2477 (ir->nstlist == -1 && nlh.nabnsb > 0));
2479 if (bNS && ir->nstlist == -1)
2481 set_nlistheuristics(&nlh,bFirstStep || bExchanged,step);
2485 /* < 0 means stop at next step, > 0 means stop at next NS step */
2486 if ( (gs.set[eglsSTOPCOND] < 0 ) ||
2487 ( (gs.set[eglsSTOPCOND] > 0 ) && ( bNS || ir->nstlist==0)) )
2489 bLastStep = TRUE;
2492 /* Determine whether or not to update the Born radii if doing GB */
2493 bBornRadii=bFirstStep;
2494 if (ir->implicit_solvent && (step % ir->nstgbradii==0))
2496 bBornRadii=TRUE;
2499 do_log = do_per_step(step,ir->nstlog) || bFirstStep || bLastStep;
2500 do_verbose = bVerbose &&
2501 (step % stepout == 0 || bFirstStep || bLastStep);
2503 if (bNS && !(bFirstStep && ir->bContinuation && !bRerunMD))
2505 if (bRerunMD)
2507 bMasterState = TRUE;
2509 else
2511 bMasterState = FALSE;
2512 /* Correct the new box if it is too skewed */
2513 if (DYNAMIC_BOX(*ir))
2515 if (correct_box(fplog,step,state->box,graph))
2517 bMasterState = TRUE;
2520 if (DOMAINDECOMP(cr) && bMasterState)
2522 dd_collect_state(cr->dd,state,state_global);
2526 if (DOMAINDECOMP(cr))
2528 /* Repartition the domain decomposition */
2529 wallcycle_start(wcycle,ewcDOMDEC);
2530 dd_partition_system(fplog,step,cr,
2531 bMasterState,nstglobalcomm,
2532 state_global,top_global,ir,
2533 state,&f,mdatoms,top,fr,
2534 vsite,shellfc,constr,
2535 nrnb,wcycle,do_verbose);
2536 wallcycle_stop(wcycle,ewcDOMDEC);
2537 /* If using an iterative integrator, reallocate space to match the decomposition */
2541 if (MASTER(cr) && do_log && !bFFscan)
2543 print_ebin_header(fplog,step,t,state->lambda);
2546 if (ir->efep != efepNO)
2548 update_mdatoms(mdatoms,state->lambda);
2551 if (bRerunMD && rerun_fr.bV)
2554 /* We need the kinetic energy at minus the half step for determining
2555 * the full step kinetic energy and possibly for T-coupling.*/
2556 /* This may not be quite working correctly yet . . . . */
2557 compute_globals(fplog,gstat,cr,ir,fr,ekind,state,state_global,mdatoms,nrnb,vcm,
2558 wcycle,enerd,NULL,NULL,NULL,NULL,mu_tot,
2559 constr,NULL,FALSE,state->box,
2560 top_global,&pcurr,top_global->natoms,&bSumEkinhOld,
2561 CGLO_RERUNMD | CGLO_GSTAT | CGLO_TEMPERATURE);
2563 clear_mat(force_vir);
2565 /* Ionize the atoms if necessary */
2566 /* if (bIonize)
2568 ionize(fplog,oenv,mdatoms,top_global,t,ir,state->x,state->v,
2569 mdatoms->start,mdatoms->start+mdatoms->homenr,state->box,cr);
2572 /* Update force field in ffscan program */
2573 /* if (bFFscan)
2575 if (update_forcefield(fplog,
2576 nfile,fnm,fr,
2577 mdatoms->nr,state->x,state->box)) {
2578 if (gmx_parallel_env_initialized())
2580 gmx_finalize();
2582 exit(0);
2586 GMX_MPE_LOG(ev_timestep2);
2588 /* We write a checkpoint at this MD step when:
2589 * either at an NS step when we signalled through gs,
2590 * or at the last step (but not when we do not want confout),
2591 * but never at the first step or with rerun.
2593 /* bCPT = (((gs.set[eglsCHKPT] && bNS) ||
2594 (bLastStep && (Flags & MD_CONFOUT))) &&
2595 step > ir->init_step && !bRerunMD);
2596 if (bCPT)
2598 gs.set[eglsCHKPT] = 0;
2601 /* Determine the energy and pressure:
2602 * at nstcalcenergy steps and at energy output steps (set below).
2604 bNstEner = (bGStatEveryStep || do_per_step(step,ir->nstcalcenergy));
2605 bCalcEnerPres = bNstEner;
2607 /* Do we need global communication ? */
2608 bGStat = (bCalcEnerPres || bStopCM ||
2609 (ir->nstlist == -1 && !bRerunMD && step >= nlh.step_nscheck));
2611 do_ene = (do_per_step(step,ir->nstenergy) || bLastStep);
2613 if (do_ene || do_log)
2615 bCalcEnerPres = TRUE;
2616 bGStat = TRUE;
2619 /* these CGLO_ options remain the same throughout the iteration */
2620 cglo_flags = ((bRerunMD ? CGLO_RERUNMD : 0) |
2621 (bStopCM ? CGLO_STOPCM : 0) |
2622 (bGStat ? CGLO_GSTAT : 0)
2625 force_flags = (GMX_FORCE_STATECHANGED |
2626 ((DYNAMIC_BOX(*ir) || bRerunMD) ? GMX_FORCE_DYNAMICBOX : 0) |
2627 GMX_FORCE_ALLFORCES |
2628 (bNStList ? GMX_FORCE_DOLR : 0) |
2629 GMX_FORCE_SEPLRF |
2630 (bCalcEnerPres ? GMX_FORCE_VIRIAL : 0) |
2631 (bDoDHDL ? GMX_FORCE_DHDL : 0)
2634 if (shellfc)
2636 /* Now is the time to relax the shells */
2637 count=relax_shell_flexcon(fplog,cr,bVerbose,bFFscan ? step+1 : step,
2638 ir,bNS,force_flags,
2639 bStopCM,top,top_global,
2640 constr,enerd,fcd,
2641 state,f,force_vir,mdatoms,
2642 nrnb,wcycle,graph,groups,
2643 shellfc,fr,bBornRadii,t,mu_tot,
2644 state->natoms,&bConverged,vsite,
2645 outf->fp_field);
2646 tcount+=count;
2648 if (bConverged)
2650 nconverged++;
2653 else
2655 /* The coordinates (x) are shifted (to get whole molecules)
2656 * in do_force.
2657 * This is parallellized as well, and does communication too.
2658 * Check comments in sim_util.c
2661 do_force(fplog,cr,ir,step,nrnb,wcycle,top,top_global,groups,
2662 state->box,state->x,&state->hist,
2663 f,force_vir,mdatoms,enerd,fcd,
2664 state->lambda,graph,
2665 fr,vsite,mu_tot,t,outf->fp_field,ed,bBornRadii,
2666 (bNS ? GMX_FORCE_NS : 0) | force_flags);
2669 GMX_BARRIER(cr->mpi_comm_mygroup);
2671 /* if (bTCR)
2673 mu_aver = calc_mu_aver(cr,state->x,mdatoms->chargeA,
2674 mu_tot,&top_global->mols,mdatoms,gnx,grpindex);
2677 if (bTCR && bFirstStep)
2679 tcr=init_coupling(fplog,nfile,fnm,cr,fr,mdatoms,&(top->idef));
2680 fprintf(fplog,"Done init_coupling\n");
2681 fflush(fplog);
2684 /* ############### START FIRST UPDATE HALF-STEP ############### */
2686 if (bVV && !bStartingFromCpt && !bRerunMD)
2688 if (ir->eI == eiVV)
2690 if (bInitStep)
2692 /* if using velocity verlet with full time step Ekin,
2693 * take the first half step only to compute the
2694 * virial for the first step. From there,
2695 * revert back to the initial coordinates
2696 * so that the input is actually the initial step.
2698 copy_rvecn(state->v,cbuf,0,state->natoms); /* should make this better for parallelizing? */
2701 /* this is for NHC in the Ekin(t+dt/2) version of vv */
2702 if (!bInitStep)
2704 trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq,ettTSEQ2);
2707 if (ir->eI == eiVVAK)
2709 update_tcouple(fplog,step,ir,state,ekind,wcycle,upd,&MassQ,mdatoms);
2712 update_coords(fplog,step,ir,mdatoms,state,
2713 f,fr->bTwinRange && bNStList,fr->f_twin,fcd,
2714 ekind,M,wcycle,upd,bInitStep,etrtVELOCITY1,
2715 cr,nrnb,constr,&top->idef);
2717 if (bIterations)
2719 gmx_iterate_init(&iterate,bIterations && !bInitStep);
2721 /* for iterations, we save these vectors, as we will be self-consistently iterating
2722 the calculations */
2723 /*#### UPDATE EXTENDED VARIABLES IN TROTTER FORMULATION */
2725 /* save the state */
2726 if (bIterations && iterate.bIterate) {
2727 copy_coupling_state(state,bufstate,ekind,ekind_save,&(ir->opts));
2731 bFirstIterate = TRUE;
2732 while (bFirstIterate || (bIterations && iterate.bIterate))
2734 if (bIterations && iterate.bIterate)
2736 copy_coupling_state(bufstate,state,ekind_save,ekind,&(ir->opts));
2737 if (bFirstIterate && bTrotter)
2739 /* The first time through, we need a decent first estimate
2740 of veta(t+dt) to compute the constraints. Do
2741 this by computing the box volume part of the
2742 trotter integration at this time. Nothing else
2743 should be changed by this routine here. If
2744 !(first time), we start with the previous value
2745 of veta. */
2747 veta_save = state->veta;
2748 trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq,ettTSEQ0);
2749 vetanew = state->veta;
2750 state->veta = veta_save;
2754 bOK = TRUE;
2755 if ( !bRerunMD || rerun_fr.bV || bForceUpdate) { /* Why is rerun_fr.bV here? Unclear. */
2756 dvdl = 0;
2758 update_constraints(fplog,step,&dvdl,ir,ekind,mdatoms,state,graph,f,
2759 &top->idef,shake_vir,NULL,
2760 cr,nrnb,wcycle,upd,constr,
2761 bInitStep,TRUE,bCalcEnerPres,vetanew);
2763 if (!bOK && !bFFscan)
2765 gmx_fatal(FARGS,"Constraint error: Shake, Lincs or Settle could not solve the constrains");
2769 else if (graph)
2770 { /* Need to unshift here if a do_force has been
2771 called in the previous step */
2772 unshift_self(graph,state->box,state->x);
2776 if (bVV) {
2777 /* if VV, compute the pressure and constraints */
2778 /* if VV2, the pressure and constraints only if using pressure control.*/
2779 bPres = (ir->eI==eiVV || IR_NPT_TROTTER(ir));
2780 bTemp = ((ir->eI==eiVV &&(!bInitStep)) || (ir->eI==eiVVAK && IR_NPT_TROTTER(ir)));
2781 compute_globals(fplog,gstat,cr,ir,fr,ekind,state,state_global,mdatoms,nrnb,vcm,
2782 wcycle,enerd,force_vir,shake_vir,total_vir,pres,mu_tot,
2783 constr,NULL,FALSE,state->box,
2784 top_global,&pcurr,top_global->natoms,&bSumEkinhOld,
2785 cglo_flags
2786 | CGLO_ENERGY
2787 | (bTemp ? CGLO_TEMPERATURE:0)
2788 | (bPres ? CGLO_PRESSURE : 0)
2789 | (bPres ? CGLO_CONSTRAINT : 0)
2790 | (iterate.bIterate ? CGLO_ITERATE : 0)
2791 | (bFirstIterate ? CGLO_FIRSTITERATE : 0)
2792 | CGLO_SCALEEKIN
2795 /* explanation of above:
2796 a) We compute Ekin at the full time step
2797 if 1) we are using the AveVel Ekin, and it's not the
2798 initial step, or 2) if we are using AveEkin, but need the full
2799 time step kinetic energy for the pressure.
2800 b) If we are using EkinAveEkin for the kinetic energy for the temperture control, we still feed in
2801 EkinAveVel because it's needed for the pressure */
2803 /* temperature scaling and pressure scaling to produce the extended variables at t+dt */
2804 if (bVV && !bInitStep)
2806 trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ, trotter_seq,ettTSEQ2);
2809 if (bIterations &&
2810 done_iterating(cr,fplog,step,&iterate,bFirstIterate,
2811 state->veta,&vetanew))
2813 break;
2815 bFirstIterate = FALSE;
2818 if (bTrotter && !bInitStep) {
2819 copy_mat(shake_vir,state->svir_prev);
2820 copy_mat(force_vir,state->fvir_prev);
2821 if (IR_NVT_TROTTER(ir) && ir->eI==eiVV) {
2822 /* update temperature and kinetic energy now that step is over - this is the v(t+dt) point */
2823 enerd->term[F_TEMP] = sum_ekin(&(ir->opts),ekind,NULL,(ir->eI==eiVV),FALSE,FALSE);
2824 enerd->term[F_EKIN] = trace(ekind->ekin);
2827 /* if it's the initial step, we performed this first step just to get the constraint virial */
2828 if (bInitStep && ir->eI==eiVV) {
2829 copy_rvecn(cbuf,state->v,0,state->natoms);
2832 if (fr->bSepDVDL && fplog && do_log)
2834 fprintf(fplog,sepdvdlformat,"Constraint",0.0,dvdl);
2836 enerd->term[F_DHDL_CON] += dvdl;
2838 GMX_MPE_LOG(ev_timestep1);
2842 /* MRS -- now done iterating -- compute the conserved quantity */
2843 if (bVV) {
2844 last_conserved = 0;
2845 if (IR_NVT_TROTTER(ir) || IR_NPT_TROTTER(ir))
2847 last_conserved =
2848 NPT_energy(ir,state,&MassQ);
2849 if ((ir->eDispCorr != edispcEnerPres) && (ir->eDispCorr != edispcAllEnerPres))
2851 last_conserved -= enerd->term[F_DISPCORR];
2854 if (ir->eI==eiVV) {
2855 last_ekin = enerd->term[F_EKIN]; /* does this get preserved through checkpointing? */
2859 /* ######## END FIRST UPDATE STEP ############## */
2860 /* ######## If doing VV, we now have v(dt) ###### */
2862 /* ################## START TRAJECTORY OUTPUT ################# */
2864 /* Now we have the energies and forces corresponding to the
2865 * coordinates at time t. We must output all of this before
2866 * the update.
2867 * for RerunMD t is read from input trajectory
2869 GMX_MPE_LOG(ev_output_start);
2871 mdof_flags = 0;
2872 if (do_per_step(step,ir->nstxout)) { mdof_flags |= MDOF_X; }
2873 if (do_per_step(step,ir->nstvout)) { mdof_flags |= MDOF_V; }
2874 if (do_per_step(step,ir->nstfout)) { mdof_flags |= MDOF_F; }
2875 if (do_per_step(step,ir->nstxtcout)) { mdof_flags |= MDOF_XTC; }
2876 /* if (bCPT) { mdof_flags |= MDOF_CPT; };*/
2878 #ifdef GMX_FAHCORE
2879 if (MASTER(cr))
2880 fcReportProgress( ir->nsteps, step );
2882 if (bLastStep)
2884 /* Enforce writing positions and velocities at end of run */
2885 mdof_flags |= (MDOF_X | MDOF_V);
2887 /* sync bCPT and fc record-keeping */
2888 /* if (bCPT && MASTER(cr))
2889 fcRequestCheckPoint();*/
2890 #endif
2892 if (mdof_flags != 0)
2894 wallcycle_start(wcycle,ewcTRAJ);
2895 /* if (bCPT)
2897 if (state->flags & (1<<estLD_RNG))
2899 get_stochd_state(upd,state);
2901 if (MASTER(cr))
2903 if (bSumEkinhOld)
2905 state_global->ekinstate.bUpToDate = FALSE;
2907 else
2909 update_ekinstate(&state_global->ekinstate,ekind);
2910 state_global->ekinstate.bUpToDate = TRUE;
2912 update_energyhistory(&state_global->enerhist,mdebin);
2915 write_traj(fplog,cr,outf,mdof_flags,top_global,
2916 step,t,state,state_global,f,f_global,&n_xtc,&x_xtc);
2917 /* if (bCPT)
2919 nchkpt++;
2920 bCPT = FALSE;
2922 debug_gmx();
2923 if (bLastStep && step_rel == ir->nsteps &&
2924 (Flags & MD_CONFOUT) && MASTER(cr) &&
2925 !bRerunMD && !bFFscan)
2927 /* x and v have been collected in write_traj,
2928 * because a checkpoint file will always be written
2929 * at the last step.
2931 fprintf(stderr,"\nWriting final coordinates.\n");
2932 if (ir->ePBC != epbcNONE && !ir->bPeriodicMols &&
2933 DOMAINDECOMP(cr))
2935 /* Make molecules whole only for confout writing */
2936 do_pbc_mtop(fplog,ir->ePBC,state->box,top_global,state_global->x);
2938 /* write_sto_conf_mtop(ftp2fn(efSTO,nfile,fnm),
2939 *top_global->name,top_global,
2940 state_global->x,state_global->v,
2941 ir->ePBC,state->box);*/
2942 debug_gmx();
2944 wallcycle_stop(wcycle,ewcTRAJ);
2946 GMX_MPE_LOG(ev_output_finish);
2948 /* kludge -- virial is lost with restart for NPT control. Must restart */
2949 if (bStartingFromCpt && bVV)
2951 copy_mat(state->svir_prev,shake_vir);
2952 copy_mat(state->fvir_prev,force_vir);
2954 /* ################## END TRAJECTORY OUTPUT ################ */
2956 /* Determine the pressure:
2957 * always when we want exact averages in the energy file,
2958 * at ns steps when we have pressure coupling,
2959 * otherwise only at energy output steps (set below).
2962 bNstEner = (bGStatEveryStep || do_per_step(step,ir->nstcalcenergy));
2963 bCalcEnerPres = bNstEner;
2965 /* Do we need global communication ? */
2966 bGStat = (bGStatEveryStep || bStopCM || bNS ||
2967 (ir->nstlist == -1 && !bRerunMD && step >= nlh.step_nscheck));
2969 do_ene = (do_per_step(step,ir->nstenergy) || bLastStep);
2971 if (do_ene || do_log)
2973 bCalcEnerPres = TRUE;
2974 bGStat = TRUE;
2977 /* Determine the wallclock run time up till now */
2978 run_time = gmx_gettime() - (double)runtime->real;
2980 /* Check whether everything is still allright */
2981 if (((int)gmx_get_stop_condition() > handled_stop_condition)
2982 #ifdef GMX_THREADS
2983 && MASTER(cr)
2984 #endif
2987 /* this is just make gs.sig compatible with the hack
2988 of sending signals around by MPI_Reduce with together with
2989 other floats */
2990 if ( gmx_get_stop_condition() == gmx_stop_cond_next_ns )
2991 gs.sig[eglsSTOPCOND]=1;
2992 if ( gmx_get_stop_condition() == gmx_stop_cond_next )
2993 gs.sig[eglsSTOPCOND]=-1;
2994 /* < 0 means stop at next step, > 0 means stop at next NS step */
2995 if (fplog)
2997 fprintf(fplog,
2998 "\n\nReceived the %s signal, stopping at the next %sstep\n\n",
2999 gmx_get_signal_name(),
3000 gs.sig[eglsSTOPCOND]==1 ? "NS " : "");
3001 fflush(fplog);
3003 fprintf(stderr,
3004 "\n\nReceived the %s signal, stopping at the next %sstep\n\n",
3005 gmx_get_signal_name(),
3006 gs.sig[eglsSTOPCOND]==1 ? "NS " : "");
3007 fflush(stderr);
3008 handled_stop_condition=(int)gmx_get_stop_condition();
3010 else if (MASTER(cr) && (bNS || ir->nstlist <= 0) &&
3011 (max_hours > 0 && run_time > max_hours*60.0*60.0*0.99) &&
3012 gs.sig[eglsSTOPCOND] == 0 && gs.set[eglsSTOPCOND] == 0)
3014 /* Signal to terminate the run */
3015 gs.sig[eglsSTOPCOND] = 1;
3016 if (fplog)
3018 fprintf(fplog,"\nStep %s: Run time exceeded %.3f hours, will terminate the run\n",gmx_step_str(step,sbuf),max_hours*0.99);
3020 fprintf(stderr, "\nStep %s: Run time exceeded %.3f hours, will terminate the run\n",gmx_step_str(step,sbuf),max_hours*0.99);
3023 if (bResetCountersHalfMaxH && MASTER(cr) &&
3024 run_time > max_hours*60.0*60.0*0.495)
3026 gs.sig[eglsRESETCOUNTERS] = 1;
3029 if (ir->nstlist == -1 && !bRerunMD)
3031 /* When bGStatEveryStep=FALSE, global_stat is only called
3032 * when we check the atom displacements, not at NS steps.
3033 * This means that also the bonded interaction count check is not
3034 * performed immediately after NS. Therefore a few MD steps could
3035 * be performed with missing interactions.
3036 * But wrong energies are never written to file,
3037 * since energies are only written after global_stat
3038 * has been called.
3040 if (step >= nlh.step_nscheck)
3042 nlh.nabnsb = natoms_beyond_ns_buffer(ir,fr,&top->cgs,
3043 nlh.scale_tot,state->x);
3045 else
3047 /* This is not necessarily true,
3048 * but step_nscheck is determined quite conservatively.
3050 nlh.nabnsb = 0;
3054 /* In parallel we only have to check for checkpointing in steps
3055 * where we do global communication,
3056 * otherwise the other nodes don't know.
3058 if (MASTER(cr) && ((bGStat || !PAR(cr)) &&
3059 cpt_period >= 0 &&
3060 (cpt_period == 0 ||
3061 run_time >= nchkpt*cpt_period*60.0)) &&
3062 gs.set[eglsCHKPT] == 0)
3064 gs.sig[eglsCHKPT] = 1;
3067 if (bIterations)
3069 gmx_iterate_init(&iterate,bIterations);
3072 /* for iterations, we save these vectors, as we will be redoing the calculations */
3073 if (bIterations && iterate.bIterate)
3075 copy_coupling_state(state,bufstate,ekind,ekind_save,&(ir->opts));
3077 bFirstIterate = TRUE;
3078 while (bFirstIterate || (bIterations && iterate.bIterate))
3080 /* We now restore these vectors to redo the calculation with improved extended variables */
3081 if (bIterations)
3083 copy_coupling_state(bufstate,state,ekind_save,ekind,&(ir->opts));
3086 /* We make the decision to break or not -after- the calculation of Ekin and Pressure,
3087 so scroll down for that logic */
3089 /* ######### START SECOND UPDATE STEP ################# */
3090 GMX_MPE_LOG(ev_update_start);
3091 bOK = TRUE;
3092 if (!bRerunMD || rerun_fr.bV || bForceUpdate)
3094 wallcycle_start(wcycle,ewcUPDATE);
3095 dvdl = 0;
3096 /* Box is changed in update() when we do pressure coupling,
3097 * but we should still use the old box for energy corrections and when
3098 * writing it to the energy file, so it matches the trajectory files for
3099 * the same timestep above. Make a copy in a separate array.
3101 copy_mat(state->box,lastbox);
3102 /* UPDATE PRESSURE VARIABLES IN TROTTER FORMULATION WITH CONSTRAINTS */
3103 if (bTrotter)
3105 if (bIterations && iterate.bIterate)
3107 if (bFirstIterate)
3109 scalevir = 1;
3111 else
3113 /* we use a new value of scalevir to converge the iterations faster */
3114 scalevir = tracevir/trace(shake_vir);
3116 msmul(shake_vir,scalevir,shake_vir);
3117 m_add(force_vir,shake_vir,total_vir);
3118 clear_mat(shake_vir);
3120 trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ, trotter_seq,ettTSEQ3);
3122 /* We can only do Berendsen coupling after we have summed
3123 * the kinetic energy or virial. Since the happens
3124 * in global_state after update, we should only do it at
3125 * step % nstlist = 1 with bGStatEveryStep=FALSE.
3128 if (ir->eI != eiVVAK)
3130 update_tcouple(fplog,step,ir,state,ekind,wcycle,upd,&MassQ,mdatoms);
3132 update_pcouple(fplog,step,ir,state,pcoupl_mu,M,wcycle,
3133 upd,bInitStep);
3135 if (bVV)
3137 /* velocity half-step update */
3138 update_coords(fplog,step,ir,mdatoms,state,f,fr->bTwinRange && bNStList,fr->f_twin,fcd,
3139 ekind,M,wcycle,upd,FALSE,etrtVELOCITY2,cr,nrnb,constr,&top->idef);
3142 /* Above, initialize just copies ekinh into ekin,
3143 * it doesn't copy position (for VV),
3144 * and entire integrator for MD.
3147 if (ir->eI==eiVVAK)
3149 copy_rvecn(state->x,cbuf,0,state->natoms);
3152 update_coords(fplog,step,ir,mdatoms,state,f,fr->bTwinRange && bNStList,fr->f_twin,fcd,
3153 ekind,M,wcycle,upd,bInitStep,etrtPOSITION,cr,nrnb,constr,&top->idef);
3154 wallcycle_stop(wcycle,ewcUPDATE);
3156 update_constraints(fplog,step,&dvdl,ir,ekind,mdatoms,state,graph,f,
3157 &top->idef,shake_vir,force_vir,
3158 cr,nrnb,wcycle,upd,constr,
3159 bInitStep,FALSE,bCalcEnerPres,state->veta);
3161 if (ir->eI==eiVVAK)
3163 /* erase F_EKIN and F_TEMP here? */
3164 /* just compute the kinetic energy at the half step to perform a trotter step */
3165 compute_globals(fplog,gstat,cr,ir,fr,ekind,state,state_global,mdatoms,nrnb,vcm,
3166 wcycle,enerd,force_vir,shake_vir,total_vir,pres,mu_tot,
3167 constr,NULL,FALSE,lastbox,
3168 top_global,&pcurr,top_global->natoms,&bSumEkinhOld,
3169 cglo_flags | CGLO_TEMPERATURE | CGLO_CONSTRAINT
3171 wallcycle_start(wcycle,ewcUPDATE);
3172 trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ, trotter_seq,ettTSEQ4);
3173 /* now we know the scaling, we can compute the positions again again */
3174 copy_rvecn(cbuf,state->x,0,state->natoms);
3176 update_coords(fplog,step,ir,mdatoms,state,f,fr->bTwinRange && bNStList,fr->f_twin,fcd,
3177 ekind,M,wcycle,upd,bInitStep,etrtPOSITION,cr,nrnb,constr,&top->idef);
3178 wallcycle_stop(wcycle,ewcUPDATE);
3180 /* do we need an extra constraint here? just need to copy out of state->v to upd->xp? */
3181 /* are the small terms in the shake_vir here due
3182 * to numerical errors, or are they important
3183 * physically? I'm thinking they are just errors, but not completely sure.
3184 * For now, will call without actually constraining, constr=NULL*/
3185 update_constraints(fplog,step,&dvdl,ir,ekind,mdatoms,state,graph,f,
3186 &top->idef,tmp_vir,force_vir,
3187 cr,nrnb,wcycle,upd,NULL,
3188 bInitStep,FALSE,bCalcEnerPres,state->veta);
3190 if (!bOK && !bFFscan)
3192 gmx_fatal(FARGS,"Constraint error: Shake, Lincs or Settle could not solve the constrains");
3195 if (fr->bSepDVDL && fplog && do_log)
3197 fprintf(fplog,sepdvdlformat,"Constraint",0.0,dvdl);
3199 enerd->term[F_DHDL_CON] += dvdl;
3201 else if (graph)
3203 /* Need to unshift here */
3204 unshift_self(graph,state->box,state->x);
3207 GMX_BARRIER(cr->mpi_comm_mygroup);
3208 GMX_MPE_LOG(ev_update_finish);
3210 if (vsite != NULL)
3212 wallcycle_start(wcycle,ewcVSITECONSTR);
3213 if (graph != NULL)
3215 shift_self(graph,state->box,state->x);
3217 construct_vsites(fplog,vsite,state->x,nrnb,ir->delta_t,state->v,
3218 top->idef.iparams,top->idef.il,
3219 fr->ePBC,fr->bMolPBC,graph,cr,state->box);
3221 if (graph != NULL)
3223 unshift_self(graph,state->box,state->x);
3225 wallcycle_stop(wcycle,ewcVSITECONSTR);
3228 /* ############## IF NOT VV, Calculate globals HERE, also iterate constraints ############ */
3229 if (ir->nstlist == -1 && bFirstIterate)
3231 gs.sig[eglsNABNSB] = nlh.nabnsb;
3233 compute_globals(fplog,gstat,cr,ir,fr,ekind,state,state_global,mdatoms,nrnb,vcm,
3234 wcycle,enerd,force_vir,shake_vir,total_vir,pres,mu_tot,
3235 constr,
3236 bFirstIterate ? &gs : NULL,(step % gs.nstms == 0),
3237 lastbox,
3238 top_global,&pcurr,top_global->natoms,&bSumEkinhOld,
3239 cglo_flags
3240 | (!EI_VV(ir->eI) ? CGLO_ENERGY : 0)
3241 | (!EI_VV(ir->eI) ? CGLO_TEMPERATURE : 0)
3242 | (!EI_VV(ir->eI) || bRerunMD ? CGLO_PRESSURE : 0)
3243 | (bIterations && iterate.bIterate ? CGLO_ITERATE : 0)
3244 | (bFirstIterate ? CGLO_FIRSTITERATE : 0)
3245 | CGLO_CONSTRAINT
3247 if (ir->nstlist == -1 && bFirstIterate)
3249 nlh.nabnsb = gs.set[eglsNABNSB];
3250 gs.set[eglsNABNSB] = 0;
3252 /* bIterate is set to keep it from eliminating the old ekin kinetic energy terms */
3253 /* ############# END CALC EKIN AND PRESSURE ################# */
3255 /* Note: this is OK, but there are some numerical precision issues with using the convergence of
3256 the virial that should probably be addressed eventually. state->veta has better properies,
3257 but what we actually need entering the new cycle is the new shake_vir value. Ideally, we could
3258 generate the new shake_vir, but test the veta value for convergence. This will take some thought. */
3260 if (bIterations &&
3261 done_iterating(cr,fplog,step,&iterate,bFirstIterate,
3262 trace(shake_vir),&tracevir))
3264 break;
3266 bFirstIterate = FALSE;
3269 update_box(fplog,step,ir,mdatoms,state,graph,f,
3270 ir->nstlist==-1 ? &nlh.scale_tot : NULL,pcoupl_mu,nrnb,wcycle,upd,bInitStep,FALSE);
3272 /* ################# END UPDATE STEP 2 ################# */
3273 /* #### We now have r(t+dt) and v(t+dt/2) ############# */
3275 /* The coordinates (x) were unshifted in update */
3276 /* if (bFFscan && (shellfc==NULL || bConverged))
3278 if (print_forcefield(fplog,enerd->term,mdatoms->homenr,
3279 f,NULL,xcopy,
3280 &(top_global->mols),mdatoms->massT,pres))
3282 if (gmx_parallel_env_initialized())
3284 gmx_finalize();
3286 fprintf(stderr,"\n");
3287 exit(0);
3290 if (!bGStat)
3292 /* We will not sum ekinh_old,
3293 * so signal that we still have to do it.
3295 bSumEkinhOld = TRUE;
3298 /* if (bTCR)
3300 /* Only do GCT when the relaxation of shells (minimization) has converged,
3301 * otherwise we might be coupling to bogus energies.
3302 * In parallel we must always do this, because the other sims might
3303 * update the FF.
3306 /* Since this is called with the new coordinates state->x, I assume
3307 * we want the new box state->box too. / EL 20040121
3309 /* do_coupling(fplog,oenv,nfile,fnm,tcr,t,step,enerd->term,fr,
3310 ir,MASTER(cr),
3311 mdatoms,&(top->idef),mu_aver,
3312 top_global->mols.nr,cr,
3313 state->box,total_vir,pres,
3314 mu_tot,state->x,f,bConverged);
3315 debug_gmx();
3318 /* ######### BEGIN PREPARING EDR OUTPUT ########### */
3320 sum_dhdl(enerd,state->lambda,ir);
3321 /* use the directly determined last velocity, not actually the averaged half steps */
3322 if (bTrotter && ir->eI==eiVV)
3324 enerd->term[F_EKIN] = last_ekin;
3326 enerd->term[F_ETOT] = enerd->term[F_EPOT] + enerd->term[F_EKIN];
3328 switch (ir->etc)
3330 case etcNO:
3331 break;
3332 case etcBERENDSEN:
3333 break;
3334 case etcNOSEHOOVER:
3335 if (IR_NVT_TROTTER(ir)) {
3336 enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] + last_conserved;
3337 } else {
3338 enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] +
3339 NPT_energy(ir,state,&MassQ);
3341 break;
3342 case etcVRESCALE:
3343 enerd->term[F_ECONSERVED] =
3344 enerd->term[F_ETOT] + vrescale_energy(&(ir->opts),
3345 state->therm_integral);
3346 break;
3347 default:
3348 break;
3351 /* Check for excessively large energies */
3352 /* if (bIonize)
3354 #ifdef GMX_DOUBLE
3355 real etot_max = 1e200;
3356 #else
3357 real etot_max = 1e30;
3358 #endif
3359 if (fabs(enerd->term[F_ETOT]) > etot_max)
3361 fprintf(stderr,"Energy too large (%g), giving up\n",
3362 enerd->term[F_ETOT]);
3365 /* ######### END PREPARING EDR OUTPUT ########### */
3367 /* Time for performance */
3368 if (((step % stepout) == 0) || bLastStep)
3370 runtime_upd_proc(runtime);
3373 /* Output stuff */
3374 if (MASTER(cr))
3376 gmx_bool do_dr,do_or;
3378 if (!(bStartingFromCpt && (EI_VV(ir->eI))))
3380 if (bNstEner)
3382 upd_mdebin(mdebin,bDoDHDL,TRUE,
3383 t,mdatoms->tmass,enerd,state,lastbox,
3384 shake_vir,force_vir,total_vir,pres,
3385 ekind,mu_tot,constr);
3387 else
3389 upd_mdebin_step(mdebin);
3392 do_dr = do_per_step(step,ir->nstdisreout);
3393 do_or = do_per_step(step,ir->nstorireout);
3395 print_ebin(outf->fp_ene,do_ene,do_dr,do_or,do_log?fplog:NULL,
3396 step,t,
3397 eprNORMAL,bCompact,mdebin,fcd,groups,&(ir->opts));
3399 if (ir->ePull != epullNO)
3401 pull_print_output(ir->pull,step,t);
3404 if (do_per_step(step,ir->nstlog))
3406 if(fflush(fplog) != 0)
3408 gmx_fatal(FARGS,"Cannot flush logfile - maybe you are out of quota?");
3414 /* Remaining runtime */
3415 if (MULTIMASTER(cr) && (do_verbose || gmx_got_usr_signal() ))
3417 if (shellfc)
3419 fprintf(stderr,"\n");
3421 print_time(stderr,runtime,step,ir,cr);
3424 /* Set new positions for the group to embed */
3425 if(!bLastStep){
3426 if(step_rel<=it_xy)
3428 fac[0]+=xy_step;
3429 fac[1]+=xy_step;
3430 } else if (step_rel<=(it_xy+it_z))
3432 fac[2]+=z_step;
3434 resize(ins_at,r_ins,state_global->x,pos_ins,fac);
3437 /* Replica exchange */
3438 /* bExchanged = FALSE;
3439 if ((repl_ex_nst > 0) && (step > 0) && !bLastStep &&
3440 do_per_step(step,repl_ex_nst))
3442 bExchanged = replica_exchange(fplog,cr,repl_ex,
3443 state_global,enerd->term,
3444 state,step,t);
3446 if (bExchanged && PAR(cr))
3448 if (DOMAINDECOMP(cr))
3450 dd_partition_system(fplog,step,cr,TRUE,1,
3451 state_global,top_global,ir,
3452 state,&f,mdatoms,top,fr,
3453 vsite,shellfc,constr,
3454 nrnb,wcycle,FALSE);
3456 else
3458 bcast_state(cr,state,FALSE);
3462 bFirstStep = FALSE;
3463 bInitStep = FALSE;
3464 bStartingFromCpt = FALSE;
3466 /* ####### SET VARIABLES FOR NEXT ITERATION IF THEY STILL NEED IT ###### */
3467 /* Complicated conditional when bGStatEveryStep=FALSE.
3468 * We can not just use bGStat, since then the simulation results
3469 * would depend on nstenergy and nstlog or step_nscheck.
3471 if (((state->flags & (1<<estPRES_PREV)) ||
3472 (state->flags & (1<<estSVIR_PREV)) ||
3473 (state->flags & (1<<estFVIR_PREV))) &&
3474 (bGStatEveryStep ||
3475 (ir->nstlist > 0 && step % ir->nstlist == 0) ||
3476 (ir->nstlist < 0 && nlh.nabnsb > 0) ||
3477 (ir->nstlist == 0 && bGStat)))
3479 /* Store the pressure in t_state for pressure coupling
3480 * at the next MD step.
3482 if (state->flags & (1<<estPRES_PREV))
3484 copy_mat(pres,state->pres_prev);
3488 /* ####### END SET VARIABLES FOR NEXT ITERATION ###### */
3490 if (bRerunMD)
3492 /* read next frame from input trajectory */
3493 bNotLastFrame = read_next_frame(oenv,status,&rerun_fr);
3496 if (!bRerunMD || !rerun_fr.bStep)
3498 /* increase the MD step number */
3499 step++;
3500 step_rel++;
3503 cycles = wallcycle_stop(wcycle,ewcSTEP);
3504 if (DOMAINDECOMP(cr) && wcycle)
3506 dd_cycles_add(cr->dd,cycles,ddCyclStep);
3509 if (step_rel == wcycle_get_reset_counters(wcycle) ||
3510 gs.set[eglsRESETCOUNTERS] != 0)
3512 /* Reset all the counters related to performance over the run */
3513 reset_all_counters(fplog,cr,step,&step_rel,ir,wcycle,nrnb,runtime);
3514 wcycle_set_reset_counters(wcycle,-1);
3515 bResetCountersHalfMaxH = FALSE;
3516 gs.set[eglsRESETCOUNTERS] = 0;
3519 /* End of main MD loop */
3520 debug_gmx();
3521 write_sto_conf_mtop(ftp2fn(efSTO,nfile,fnm),
3522 *top_global->name,top_global,
3523 state_global->x,state_global->v,
3524 ir->ePBC,state->box);
3526 /* Stop the time */
3527 runtime_end(runtime);
3529 if (bRerunMD)
3531 close_trj(status);
3534 if (!(cr->duty & DUTY_PME))
3536 /* Tell the PME only node to finish */
3537 gmx_pme_finish(cr);
3540 if (MASTER(cr))
3542 if (ir->nstcalcenergy > 0 && !bRerunMD)
3544 print_ebin(outf->fp_ene,FALSE,FALSE,FALSE,fplog,step,t,
3545 eprAVER,FALSE,mdebin,fcd,groups,&(ir->opts));
3549 done_mdoutf(outf);
3551 debug_gmx();
3553 if (ir->nstlist == -1 && nlh.nns > 0 && fplog)
3555 fprintf(fplog,"Average neighborlist lifetime: %.1f steps, std.dev.: %.1f steps\n",nlh.s1/nlh.nns,sqrt(nlh.s2/nlh.nns - sqr(nlh.s1/nlh.nns)));
3556 fprintf(fplog,"Average number of atoms that crossed the half buffer length: %.1f\n\n",nlh.ab/nlh.nns);
3559 if (shellfc && fplog)
3561 fprintf(fplog,"Fraction of iterations that converged: %.2f %%\n",
3562 (nconverged*100.0)/step_rel);
3563 fprintf(fplog,"Average number of force evaluations per MD step: %.2f\n\n",
3564 tcount/step_rel);
3567 /* if (repl_ex_nst > 0 && MASTER(cr))
3569 print_replica_exchange_statistics(fplog,repl_ex);
3572 runtime->nsteps_done = step_rel;
3574 return 0;
3578 int mdrunner_membed(FILE *fplog,t_commrec *cr,int nfile,const t_filenm fnm[],
3579 const output_env_t oenv, gmx_bool bVerbose,gmx_bool bCompact,
3580 int nstglobalcomm,
3581 ivec ddxyz,int dd_node_order,real rdd,real rconstr,
3582 const char *dddlb_opt,real dlb_scale,
3583 const char *ddcsx,const char *ddcsy,const char *ddcsz,
3584 int nstepout,int resetstep,int nmultisim,int repl_ex_nst,int repl_ex_seed,
3585 real pforce,real cpt_period,real max_hours,
3586 const char *deviceOptions,
3587 unsigned long Flags,
3588 real xy_fac, real xy_max, real z_fac, real z_max,
3589 int it_xy, int it_z, real probe_rad, int low_up_rm,
3590 int pieces, gmx_bool bALLOW_ASYMMETRY, int maxwarn)
3592 double nodetime=0,realtime;
3593 t_inputrec *inputrec;
3594 t_state *state=NULL;
3595 matrix box;
3596 gmx_ddbox_t ddbox;
3597 int npme_major,npme_minor;
3598 real tmpr1,tmpr2;
3599 t_nrnb *nrnb;
3600 gmx_mtop_t *mtop=NULL;
3601 t_mdatoms *mdatoms=NULL;
3602 t_forcerec *fr=NULL;
3603 t_fcdata *fcd=NULL;
3604 real ewaldcoeff=0;
3605 gmx_pme_t *pmedata=NULL;
3606 gmx_vsite_t *vsite=NULL;
3607 gmx_constr_t constr;
3608 int i,m,nChargePerturbed=-1,status,nalloc;
3609 char *gro;
3610 gmx_wallcycle_t wcycle;
3611 gmx_bool bReadRNG,bReadEkin;
3612 int list;
3613 gmx_runtime_t runtime;
3614 int rc;
3615 gmx_large_int_t reset_counters;
3616 gmx_edsam_t ed=NULL;
3617 t_commrec *cr_old=cr;
3618 int nthreads=1,nthreads_requested=1;
3621 char *ins;
3622 int rm_bonded_at,fr_id,fr_i=0,tmp_id,warn=0;
3623 int ng,j,max_lip_rm,ins_grp_id,ins_nat,mem_nat,ntype,lip_rm,tpr_version;
3624 real xy_step=0,z_step=0;
3625 real prot_area;
3626 rvec *r_ins=NULL,fac;
3627 t_block *ins_at,*rest_at;
3628 pos_ins_t *pos_ins;
3629 mem_t *mem_p;
3630 rm_t *rm_p;
3631 gmx_groups_t *groups;
3632 gmx_bool bExcl=FALSE;
3633 t_atoms atoms;
3634 t_pbc *pbc;
3635 char **piecename=NULL;
3637 /* CAUTION: threads may be started later on in this function, so
3638 cr doesn't reflect the final parallel state right now */
3639 snew(inputrec,1);
3640 snew(mtop,1);
3642 if (bVerbose && SIMMASTER(cr))
3644 fprintf(stderr,"Getting Loaded...\n");
3647 if (Flags & MD_APPENDFILES)
3649 fplog = NULL;
3652 snew(state,1);
3653 if (MASTER(cr))
3655 /* Read (nearly) all data required for the simulation */
3656 read_tpx_state(ftp2fn(efTPX,nfile,fnm),inputrec,state,NULL,mtop);
3658 /* NOW the threads will be started: */
3659 #ifdef GMX_THREADS
3660 #endif
3662 /* END OF CAUTION: cr is now reliable */
3664 if (PAR(cr))
3666 /* now broadcast everything to the non-master nodes/threads: */
3667 init_parallel(fplog, cr, inputrec, mtop);
3669 /* now make sure the state is initialized and propagated */
3670 set_state_entries(state,inputrec,cr->nnodes);
3672 if (can_use_allvsall(inputrec,mtop,TRUE,cr,fplog))
3674 /* All-vs-all loops do not work with domain decomposition */
3675 Flags |= MD_PARTDEC;
3678 if (!EEL_PME(inputrec->coulombtype) || (Flags & MD_PARTDEC))
3680 cr->npmenodes = 0;
3683 snew(ins_at,1);
3684 snew(pos_ins,1);
3685 if(MASTER(cr))
3687 tpr_version = get_tpr_version(ftp2fn(efTPX,nfile,fnm));
3688 if (tpr_version<58)
3689 gmx_fatal(FARGS,"Version of *.tpr file to old (%d). Rerun grompp with gromacs VERSION 4.0.3 or newer.\n",tpr_version);
3691 if( inputrec->eI != eiMD )
3692 gmx_input("Change integrator to md in mdp file.");
3694 if(PAR(cr))
3695 gmx_input("Sorry, parallel g_membed is not yet fully functrional.");
3697 groups=&(mtop->groups);
3699 atoms=gmx_mtop_global_atoms(mtop);
3700 snew(mem_p,1);
3701 fprintf(stderr,"\nSelect a group to embed in the membrane:\n");
3702 get_index(&atoms,ftp2fn_null(efNDX,nfile,fnm),1,&(ins_at->nr),&(ins_at->index),&ins);
3703 ins_grp_id = search_string(ins,groups->ngrpname,(groups->grpname));
3704 fprintf(stderr,"\nSelect a group to embed %s into (e.g. the membrane):\n",ins);
3705 get_index(&atoms,ftp2fn_null(efNDX,nfile,fnm),1,&(mem_p->mem_at.nr),&(mem_p->mem_at.index),&(mem_p->name));
3707 pos_ins->pieces=pieces;
3708 snew(pos_ins->nidx,pieces);
3709 snew(pos_ins->subindex,pieces);
3710 snew(piecename,pieces);
3711 if (pieces>1)
3713 fprintf(stderr,"\nSelect pieces to embed:\n");
3714 get_index(&atoms,ftp2fn_null(efNDX,nfile,fnm),pieces,pos_ins->nidx,pos_ins->subindex,piecename);
3716 else
3718 /*use whole embedded group*/
3719 snew(pos_ins->nidx,1);
3720 snew(pos_ins->subindex,1);
3721 pos_ins->nidx[0]=ins_at->nr;
3722 pos_ins->subindex[0]=ins_at->index;
3725 if(probe_rad<0.2199999)
3727 warn++;
3728 fprintf(stderr,"\nWarning %d:\nA probe radius (-rad) smaller than 0.2 can result in overlap between waters "
3729 "and the group to embed, which will result in Lincs errors etc.\nIf you are sure, you can increase maxwarn.\n\n",warn);
3732 if(xy_fac<0.09999999)
3734 warn++;
3735 fprintf(stderr,"\nWarning %d:\nThe initial size of %s is probably too smal.\n"
3736 "If you are sure, you can increase maxwarn.\n\n",warn,ins);
3739 if(it_xy<1000)
3741 warn++;
3742 fprintf(stderr,"\nWarning %d;\nThe number of steps used to grow the xy-coordinates of %s (%d) is probably too small.\n"
3743 "Increase -nxy or, if you are sure, you can increase maxwarn.\n\n",warn,ins,it_xy);
3746 if( (it_z<100) && ( z_fac<0.99999999 || z_fac>1.0000001) )
3748 warn++;
3749 fprintf(stderr,"\nWarning %d;\nThe number of steps used to grow the z-coordinate of %s (%d) is probably too small.\n"
3750 "Increase -nz or, if you are sure, you can increase maxwarn.\n\n",warn,ins,it_z);
3753 if(it_xy+it_z>inputrec->nsteps)
3755 warn++;
3756 fprintf(stderr,"\nWarning %d:\nThe number of growth steps (-nxy + -nz) is larger than the number of steps in the tpr.\n"
3757 "If you are sure, you can increase maxwarn.\n\n",warn);
3760 fr_id=-1;
3761 if( inputrec->opts.ngfrz==1)
3762 gmx_fatal(FARGS,"You did not specify \"%s\" as a freezegroup.",ins);
3763 for(i=0;i<inputrec->opts.ngfrz;i++)
3765 tmp_id = mtop->groups.grps[egcFREEZE].nm_ind[i];
3766 if(ins_grp_id==tmp_id)
3768 fr_id=tmp_id;
3769 fr_i=i;
3772 if (fr_id == -1 )
3773 gmx_fatal(FARGS,"\"%s\" not as freezegroup defined in the mdp-file.",ins);
3775 for(i=0;i<DIM;i++)
3776 if( inputrec->opts.nFreeze[fr_i][i] != 1)
3777 gmx_fatal(FARGS,"freeze dimensions for %s are not Y Y Y\n",ins);
3779 ng = groups->grps[egcENER].nr;
3780 if (ng == 1)
3781 gmx_input("No energy groups defined. This is necessary for energy exclusion in the freeze group");
3783 for(i=0;i<ng;i++)
3785 for(j=0;j<ng;j++)
3787 if (inputrec->opts.egp_flags[ng*i+j] == EGP_EXCL)
3789 bExcl = TRUE;
3790 if ( (groups->grps[egcENER].nm_ind[i] != ins_grp_id) || (groups->grps[egcENER].nm_ind[j] != ins_grp_id) )
3791 gmx_fatal(FARGS,"Energy exclusions \"%s\" and \"%s\" do not match the group to embed \"%s\"",
3792 *groups->grpname[groups->grps[egcENER].nm_ind[i]],
3793 *groups->grpname[groups->grps[egcENER].nm_ind[j]],ins);
3797 if (!bExcl)
3798 gmx_input("No energy exclusion groups defined. This is necessary for energy exclusion in the freeze group");
3800 /* Set all atoms in box*/
3801 /*set_inbox(state->natoms,state->x);*/
3803 /* Guess the area the protein will occupy in the membrane plane Calculate area per lipid*/
3804 snew(rest_at,1);
3805 ins_nat = init_ins_at(ins_at,rest_at,state,pos_ins,groups,ins_grp_id,xy_max);
3806 /* Check moleculetypes in insertion group */
3807 check_types(ins_at,rest_at,mtop);
3809 mem_nat = init_mem_at(mem_p,mtop,state->x,state->box,pos_ins);
3811 prot_area = est_prot_area(pos_ins,state->x,ins_at,mem_p);
3812 if ( (prot_area>7.5) && ( (state->box[XX][XX]*state->box[YY][YY]-state->box[XX][YY]*state->box[YY][XX])<50) )
3814 warn++;
3815 fprintf(stderr,"\nWarning %d:\nThe xy-area is very small compared to the area of the protein.\n"
3816 "This might cause pressure problems during the growth phase. Just try with\n"
3817 "current setup (-maxwarn + 1), but if pressure problems occur, lower the\n"
3818 "compressibility in the mdp-file or use no pressure coupling at all.\n\n",warn);
3820 if(warn>maxwarn)
3821 gmx_fatal(FARGS,"Too many warnings.\n");
3823 printf("The estimated area of the protein in the membrane is %.3f nm^2\n",prot_area);
3824 printf("\nThere are %d lipids in the membrane part that overlaps the protein.\nThe area per lipid is %.4f nm^2.\n",mem_p->nmol,mem_p->lip_area);
3826 /* Maximum number of lipids to be removed*/
3827 max_lip_rm=(int)(2*prot_area/mem_p->lip_area);
3828 printf("Maximum number of lipids that will be removed is %d.\n",max_lip_rm);
3830 printf("\nWill resize the protein by a factor of %.3f in the xy plane and %.3f in the z direction.\n"
3831 "This resizing will be done with respect to the geometrical center of all protein atoms\n"
3832 "that span the membrane region, i.e. z between %.3f and %.3f\n\n",xy_fac,z_fac,mem_p->zmin,mem_p->zmax);
3834 /* resize the protein by xy and by z if necessary*/
3835 snew(r_ins,ins_at->nr);
3836 init_resize(ins_at,r_ins,pos_ins,mem_p,state->x,bALLOW_ASYMMETRY);
3837 fac[0]=fac[1]=xy_fac;
3838 fac[2]=z_fac;
3840 xy_step =(xy_max-xy_fac)/(double)(it_xy);
3841 z_step =(z_max-z_fac)/(double)(it_z-1);
3843 resize(ins_at,r_ins,state->x,pos_ins,fac);
3845 /* remove overlapping lipids and water from the membrane box*/
3846 /*mark molecules to be removed*/
3847 snew(pbc,1);
3848 set_pbc(pbc,inputrec->ePBC,state->box);
3850 snew(rm_p,1);
3851 lip_rm = gen_rm_list(rm_p,ins_at,rest_at,pbc,mtop,state->x, r_ins, mem_p,pos_ins,probe_rad,low_up_rm,bALLOW_ASYMMETRY);
3852 lip_rm -= low_up_rm;
3854 if(fplog)
3855 for(i=0;i<rm_p->nr;i++)
3856 fprintf(fplog,"rm mol %d\n",rm_p->mol[i]);
3858 for(i=0;i<mtop->nmolblock;i++)
3860 ntype=0;
3861 for(j=0;j<rm_p->nr;j++)
3862 if(rm_p->block[j]==i)
3863 ntype++;
3864 printf("Will remove %d %s molecules\n",ntype,*(mtop->moltype[mtop->molblock[i].type].name));
3867 if(lip_rm>max_lip_rm)
3869 warn++;
3870 fprintf(stderr,"\nWarning %d:\nTrying to remove a larger lipid area than the estimated protein area\n"
3871 "Try making the -xyinit resize factor smaller. If you are sure about this increase maxwarn.\n\n",warn);
3874 /*remove all lipids and waters overlapping and update all important structures*/
3875 rm_group(inputrec,groups,mtop,rm_p,state,ins_at,pos_ins);
3877 rm_bonded_at = rm_bonded(ins_at,mtop);
3878 if (rm_bonded_at != ins_at->nr)
3880 fprintf(stderr,"Warning: The number of atoms for which the bonded interactions are removed is %d, "
3881 "while %d atoms are embedded. Make sure that the atoms to be embedded are not in the same"
3882 "molecule type as atoms that are not to be embedded.\n",rm_bonded_at,ins_at->nr);
3885 if(warn>maxwarn)
3886 gmx_fatal(FARGS,"Too many warnings.\nIf you are sure these warnings are harmless, you can increase -maxwarn");
3888 if (MASTER(cr))
3890 if (ftp2bSet(efTOP,nfile,fnm))
3891 top_update(opt2fn("-p",nfile,fnm),ins,rm_p,mtop);
3894 sfree(pbc);
3895 sfree(rest_at);
3898 #ifdef GMX_FAHCORE
3899 fcRegisterSteps(inputrec->nsteps,inputrec->init_step);
3900 #endif
3902 /* NMR restraints must be initialized before load_checkpoint,
3903 * since with time averaging the history is added to t_state.
3904 * For proper consistency check we therefore need to extend
3905 * t_state here.
3906 * So the PME-only nodes (if present) will also initialize
3907 * the distance restraints.
3909 snew(fcd,1);
3911 /* This needs to be called before read_checkpoint to extend the state */
3912 init_disres(fplog,mtop,inputrec,cr,Flags & MD_PARTDEC,fcd,state);
3914 if (gmx_mtop_ftype_count(mtop,F_ORIRES) > 0)
3916 if (PAR(cr) && !(Flags & MD_PARTDEC))
3918 gmx_fatal(FARGS,"Orientation restraints do not work (yet) with domain decomposition, use particle decomposition (mdrun option -pd)");
3920 /* Orientation restraints */
3921 if (MASTER(cr))
3923 init_orires(fplog,mtop,state->x,inputrec,cr->ms,&(fcd->orires),
3924 state);
3928 if (DEFORM(*inputrec))
3930 /* Store the deform reference box before reading the checkpoint */
3931 if (SIMMASTER(cr))
3933 copy_mat(state->box,box);
3935 if (PAR(cr))
3937 gmx_bcast(sizeof(box),box,cr);
3939 /* Because we do not have the update struct available yet
3940 * in which the reference values should be stored,
3941 * we store them temporarily in static variables.
3942 * This should be thread safe, since they are only written once
3943 * and with identical values.
3945 /* deform_init_init_step_tpx = inputrec->init_step;*/
3946 /* copy_mat(box,deform_init_box_tpx);*/
3949 if (opt2bSet("-cpi",nfile,fnm))
3951 /* Check if checkpoint file exists before doing continuation.
3952 * This way we can use identical input options for the first and subsequent runs...
3954 if( gmx_fexist_master(opt2fn_master("-cpi",nfile,fnm,cr),cr) )
3956 load_checkpoint(opt2fn_master("-cpi",nfile,fnm,cr),&fplog,
3957 cr,Flags & MD_PARTDEC,ddxyz,
3958 inputrec,state,&bReadRNG,&bReadEkin,
3959 (Flags & MD_APPENDFILES));
3961 if (bReadRNG)
3963 Flags |= MD_READ_RNG;
3965 if (bReadEkin)
3967 Flags |= MD_READ_EKIN;
3972 if ((MASTER(cr) || (Flags & MD_SEPPOT)) && (Flags & MD_APPENDFILES))
3974 gmx_log_open(ftp2fn(efLOG,nfile,fnm),cr,!(Flags & MD_SEPPOT),
3975 Flags,&fplog);
3978 if (SIMMASTER(cr))
3980 copy_mat(state->box,box);
3983 if (PAR(cr))
3985 gmx_bcast(sizeof(box),box,cr);
3988 if (bVerbose && SIMMASTER(cr))
3990 fprintf(stderr,"Loaded with Money\n\n");
3993 if (PAR(cr) && !((Flags & MD_PARTDEC) || EI_TPI(inputrec->eI)))
3995 cr->dd = init_domain_decomposition(fplog,cr,Flags,ddxyz,rdd,rconstr,
3996 dddlb_opt,dlb_scale,
3997 ddcsx,ddcsy,ddcsz,
3998 mtop,inputrec,
3999 box,state->x,
4000 &ddbox,&npme_major,&npme_minor);
4002 make_dd_communicators(fplog,cr,dd_node_order);
4004 /* Set overallocation to avoid frequent reallocation of arrays */
4005 set_over_alloc_dd(TRUE);
4007 else
4009 /* PME, if used, is done on all nodes with 1D decomposition */
4010 cr->npmenodes = 0;
4011 cr->duty = (DUTY_PP | DUTY_PME);
4012 npme_major = cr->nnodes;
4013 npme_minor = 1;
4015 if (inputrec->ePBC == epbcSCREW)
4017 gmx_fatal(FARGS,
4018 "pbc=%s is only implemented with domain decomposition",
4019 epbc_names[inputrec->ePBC]);
4023 if (PAR(cr))
4025 /* After possible communicator splitting in make_dd_communicators.
4026 * we can set up the intra/inter node communication.
4028 gmx_setup_nodecomm(fplog,cr);
4031 wcycle = wallcycle_init(fplog,resetstep,cr);
4032 if (PAR(cr))
4034 /* Master synchronizes its value of reset_counters with all nodes
4035 * including PME only nodes */
4036 reset_counters = wcycle_get_reset_counters(wcycle);
4037 gmx_bcast_sim(sizeof(reset_counters),&reset_counters,cr);
4038 wcycle_set_reset_counters(wcycle, reset_counters);
4042 snew(nrnb,1);
4043 if (cr->duty & DUTY_PP)
4045 /* For domain decomposition we allocate dynamically
4046 * in dd_partition_system.
4048 if (DOMAINDECOMP(cr))
4050 bcast_state_setup(cr,state);
4052 else
4054 if (PAR(cr))
4056 if (!MASTER(cr))
4058 snew(state,1);
4060 bcast_state(cr,state,TRUE);
4064 /* Dihedral Restraints */
4065 if (gmx_mtop_ftype_count(mtop,F_DIHRES) > 0)
4067 init_dihres(fplog,mtop,inputrec,fcd);
4070 /* Initiate forcerecord */
4071 fr = mk_forcerec();
4072 init_forcerec(fplog,oenv,fr,fcd,inputrec,mtop,cr,box,FALSE,
4073 opt2fn("-table",nfile,fnm),
4074 opt2fn("-tablep",nfile,fnm),
4075 opt2fn("-tableb",nfile,fnm),FALSE,pforce);
4077 /* version for PCA_NOT_READ_NODE (see md.c) */
4078 /*init_forcerec(fplog,fr,fcd,inputrec,mtop,cr,box,FALSE,
4079 "nofile","nofile","nofile",FALSE,pforce);
4081 fr->bSepDVDL = ((Flags & MD_SEPPOT) == MD_SEPPOT);
4083 /* Initialize QM-MM */
4084 if(fr->bQMMM)
4086 init_QMMMrec(cr,box,mtop,inputrec,fr);
4089 /* Initialize the mdatoms structure.
4090 * mdatoms is not filled with atom data,
4091 * as this can not be done now with domain decomposition.
4093 mdatoms = init_mdatoms(fplog,mtop,inputrec->efep!=efepNO);
4095 /* Initialize the virtual site communication */
4096 vsite = init_vsite(mtop,cr);
4098 calc_shifts(box,fr->shift_vec);
4100 /* With periodic molecules the charge groups should be whole at start up
4101 * and the virtual sites should not be far from their proper positions.
4103 if (!inputrec->bContinuation && MASTER(cr) &&
4104 !(inputrec->ePBC != epbcNONE && inputrec->bPeriodicMols))
4106 /* Make molecules whole at start of run */
4107 if (fr->ePBC != epbcNONE)
4109 do_pbc_first_mtop(fplog,inputrec->ePBC,box,mtop,state->x);
4111 if (vsite)
4113 /* Correct initial vsite positions are required
4114 * for the initial distribution in the domain decomposition
4115 * and for the initial shell prediction.
4117 construct_vsites_mtop(fplog,vsite,mtop,state->x);
4121 /* Initiate PPPM if necessary */
4122 if (fr->eeltype == eelPPPM)
4124 if (mdatoms->nChargePerturbed)
4126 gmx_fatal(FARGS,"Free energy with %s is not implemented",
4127 eel_names[fr->eeltype]);
4129 status = gmx_pppm_init(fplog,cr,oenv,FALSE,TRUE,box,
4130 getenv("GMXGHAT"),inputrec, (Flags & MD_REPRODUCIBLE));
4131 if (status != 0)
4133 gmx_fatal(FARGS,"Error %d initializing PPPM",status);
4137 if (EEL_PME(fr->eeltype))
4139 ewaldcoeff = fr->ewaldcoeff;
4140 pmedata = &fr->pmedata;
4142 else
4144 pmedata = NULL;
4147 else
4149 /* This is a PME only node */
4151 /* We don't need the state */
4152 done_state(state);
4154 ewaldcoeff = calc_ewaldcoeff(inputrec->rcoulomb, inputrec->ewald_rtol);
4155 snew(pmedata,1);
4158 /* Initiate PME if necessary,
4159 * either on all nodes or on dedicated PME nodes only. */
4160 if (EEL_PME(inputrec->coulombtype))
4162 if (mdatoms)
4164 nChargePerturbed = mdatoms->nChargePerturbed;
4166 if (cr->npmenodes > 0)
4168 /* The PME only nodes need to know nChargePerturbed */
4169 gmx_bcast_sim(sizeof(nChargePerturbed),&nChargePerturbed,cr);
4171 if (cr->duty & DUTY_PME)
4173 status = gmx_pme_init(pmedata,cr,npme_major,npme_minor,inputrec,
4174 mtop ? mtop->natoms : 0,nChargePerturbed,
4175 (Flags & MD_REPRODUCIBLE));
4176 if (status != 0)
4178 gmx_fatal(FARGS,"Error %d initializing PME",status);
4184 /* if (integrator[inputrec->eI].func == do_md
4185 #ifdef GMX_OPENMM
4187 integrator[inputrec->eI].func == do_md_openmm
4188 #endif
4191 /* Turn on signal handling on all nodes */
4193 * (A user signal from the PME nodes (if any)
4194 * is communicated to the PP nodes.
4196 signal_handler_install();
4197 /* }*/
4199 if (cr->duty & DUTY_PP)
4201 if (inputrec->ePull != epullNO)
4203 /* Initialize pull code */
4204 init_pull(fplog,inputrec,nfile,fnm,mtop,cr,oenv,
4205 EI_DYNAMICS(inputrec->eI) && MASTER(cr),Flags);
4208 constr = init_constraints(fplog,mtop,inputrec,ed,state,cr);
4210 if (DOMAINDECOMP(cr))
4212 dd_init_bondeds(fplog,cr->dd,mtop,vsite,constr,inputrec,
4213 Flags & MD_DDBONDCHECK,fr->cginfo_mb);
4215 set_dd_parameters(fplog,cr->dd,dlb_scale,inputrec,fr,&ddbox);
4217 setup_dd_grid(fplog,cr->dd);
4220 /* Now do whatever the user wants us to do (how flexible...) */
4221 do_md_membed(fplog,cr,nfile,fnm,
4222 oenv,bVerbose,bCompact,
4223 nstglobalcomm,
4224 vsite,constr,
4225 nstepout,inputrec,mtop,
4226 fcd,state,
4227 mdatoms,nrnb,wcycle,ed,fr,
4228 repl_ex_nst,repl_ex_seed,
4229 cpt_period,max_hours,
4230 deviceOptions,
4231 Flags,
4232 &runtime,
4233 fac, r_ins, pos_ins, ins_at,
4234 xy_step, z_step, it_xy, it_z);
4236 if (inputrec->ePull != epullNO)
4238 finish_pull(fplog,inputrec->pull);
4241 else
4243 /* do PME only */
4244 gmx_pmeonly(*pmedata,cr,nrnb,wcycle,ewaldcoeff,FALSE,inputrec);
4247 if (EI_DYNAMICS(inputrec->eI) || EI_TPI(inputrec->eI))
4249 /* Some timing stats */
4250 if (MASTER(cr))
4252 if (runtime.proc == 0)
4254 runtime.proc = runtime.real;
4257 else
4259 runtime.real = 0;
4263 wallcycle_stop(wcycle,ewcRUN);
4265 /* Finish up, write some stuff
4266 * if rerunMD, don't write last frame again
4268 finish_run(fplog,cr,ftp2fn(efSTO,nfile,fnm),
4269 inputrec,nrnb,wcycle,&runtime,
4270 EI_DYNAMICS(inputrec->eI) && !MULTISIM(cr));
4272 /* Does what it says */
4273 print_date_and_time(fplog,cr->nodeid,"Finished mdrun",&runtime);
4275 /* Close logfile already here if we were appending to it */
4276 if (MASTER(cr) && (Flags & MD_APPENDFILES))
4278 gmx_log_close(fplog);
4281 if (pieces>1)
4283 sfree(piecename);
4286 rc=(int)gmx_get_stop_condition();
4288 return rc;
4291 int gmx_membed(int argc,char *argv[])
4293 const char *desc[] = {
4294 "g_membed embeds a membrane protein into an equilibrated lipid bilayer at the position",
4295 "and orientation specified by the user.\n",
4296 "\n",
4297 "SHORT MANUAL\n------------\n",
4298 "The user should merge the structure files of the protein and membrane (+solvent), creating a",
4299 "single structure file with the protein overlapping the membrane at the desired position and",
4300 "orientation. Box size should be taken from the membrane structure file. The corresponding topology",
4301 "files should also be merged. Consecutively, create a tpr file (input for g_membed) from these files,"
4302 "with the following options included in the mdp file.\n",
4303 " - integrator = md\n",
4304 " - energygrp = Protein (or other group that you want to insert)\n",
4305 " - freezegrps = Protein\n",
4306 " - freezedim = Y Y Y\n",
4307 " - energygrp_excl = Protein Protein\n",
4308 "The output is a structure file containing the protein embedded in the membrane. If a topology",
4309 "file is provided, the number of lipid and ",
4310 "solvent molecules will be updated to match the new structure file.\n",
4311 "For a more extensive manual see Wolf et al, J Comp Chem 31 (2010) 2169-2174, Appendix.\n",
4312 "\n",
4313 "SHORT METHOD DESCRIPTION\n",
4314 "------------------------\n",
4315 "1. The protein is resized around its center of mass by a factor -xy in the xy-plane",
4316 "(the membrane plane) and a factor -z in the z-direction (if the size of the",
4317 "protein in the z-direction is the same or smaller than the width of the membrane, a",
4318 "-z value larger than 1 can prevent that the protein will be enveloped by the lipids).\n",
4319 "2. All lipid and solvent molecules overlapping with the resized protein are removed. All",
4320 "intraprotein interactions are turned off to prevent numerical issues for small values of -xy",
4321 " or -z\n",
4322 "3. One md step is performed.\n",
4323 "4. The resize factor (-xy or -z) is incremented by a small amount ((1-xy)/nxy or (1-z)/nz) and the",
4324 "protein is resized again around its center of mass. The resize factor for the xy-plane",
4325 "is incremented first. The resize factor for the z-direction is not changed until the -xy factor",
4326 "is 1 (thus after -nxy iteration).\n",
4327 "5. Repeat step 3 and 4 until the protein reaches its original size (-nxy + -nz iterations).\n",
4328 "For a more extensive method descrition see Wolf et al, J Comp Chem, 31 (2010) 2169-2174.\n",
4329 "\n",
4330 "NOTE\n----\n",
4331 " - Protein can be any molecule you want to insert in the membrane.\n",
4332 " - It is recommended to perform a short equilibration run after the embedding",
4333 "(see Wolf et al, J Comp Chem 31 (2010) 2169-2174, to re-equilibrate the membrane. Clearly",
4334 "protein equilibration might require longer.\n",
4335 "\n"
4337 t_commrec *cr;
4338 t_filenm fnm[] = {
4339 { efTPX, "-f", "into_mem", ffREAD },
4340 { efNDX, "-n", "index", ffOPTRD },
4341 { efTOP, "-p", "topol", ffOPTRW },
4342 { efTRN, "-o", NULL, ffWRITE },
4343 { efXTC, "-x", NULL, ffOPTWR },
4344 { efCPT, "-cpi", NULL, ffOPTRD },
4345 { efCPT, "-cpo", NULL, ffOPTWR },
4346 { efSTO, "-c", "membedded", ffWRITE },
4347 { efEDR, "-e", "ener", ffWRITE },
4348 { efLOG, "-g", "md", ffWRITE },
4349 { efEDI, "-ei", "sam", ffOPTRD },
4350 { efTRX, "-rerun", "rerun", ffOPTRD },
4351 { efXVG, "-table", "table", ffOPTRD },
4352 { efXVG, "-tablep", "tablep", ffOPTRD },
4353 { efXVG, "-tableb", "table", ffOPTRD },
4354 { efXVG, "-dhdl", "dhdl", ffOPTWR },
4355 { efXVG, "-field", "field", ffOPTWR },
4356 { efXVG, "-table", "table", ffOPTRD },
4357 { efXVG, "-tablep", "tablep", ffOPTRD },
4358 { efXVG, "-tableb", "table", ffOPTRD },
4359 { efTRX, "-rerun", "rerun", ffOPTRD },
4360 { efXVG, "-tpi", "tpi", ffOPTWR },
4361 { efXVG, "-tpid", "tpidist", ffOPTWR },
4362 { efEDI, "-ei", "sam", ffOPTRD },
4363 { efEDO, "-eo", "sam", ffOPTWR },
4364 { efGCT, "-j", "wham", ffOPTRD },
4365 { efGCT, "-jo", "bam", ffOPTWR },
4366 { efXVG, "-ffout", "gct", ffOPTWR },
4367 { efXVG, "-devout", "deviatie", ffOPTWR },
4368 { efXVG, "-runav", "runaver", ffOPTWR },
4369 { efXVG, "-px", "pullx", ffOPTWR },
4370 { efXVG, "-pf", "pullf", ffOPTWR },
4371 { efMTX, "-mtx", "nm", ffOPTWR },
4372 { efNDX, "-dn", "dipole", ffOPTWR }
4374 #define NFILE asize(fnm)
4376 /* Command line options ! */
4377 gmx_bool bCart = FALSE;
4378 gmx_bool bPPPME = FALSE;
4379 gmx_bool bPartDec = FALSE;
4380 gmx_bool bDDBondCheck = TRUE;
4381 gmx_bool bDDBondComm = TRUE;
4382 gmx_bool bVerbose = FALSE;
4383 gmx_bool bCompact = TRUE;
4384 gmx_bool bSepPot = FALSE;
4385 gmx_bool bRerunVSite = FALSE;
4386 gmx_bool bIonize = FALSE;
4387 gmx_bool bConfout = TRUE;
4388 gmx_bool bReproducible = FALSE;
4390 int npme=-1;
4391 int nmultisim=0;
4392 int nstglobalcomm=-1;
4393 int repl_ex_nst=0;
4394 int repl_ex_seed=-1;
4395 int nstepout=100;
4396 int nthreads=0; /* set to determine # of threads automatically */
4397 int resetstep=-1;
4399 rvec realddxyz={0,0,0};
4400 const char *ddno_opt[ddnoNR+1] =
4401 { NULL, "interleave", "pp_pme", "cartesian", NULL };
4402 const char *dddlb_opt[] =
4403 { NULL, "auto", "no", "yes", NULL };
4404 real rdd=0.0,rconstr=0.0,dlb_scale=0.8,pforce=-1;
4405 char *ddcsx=NULL,*ddcsy=NULL,*ddcsz=NULL;
4406 real cpt_period=15.0,max_hours=-1;
4407 gmx_bool bAppendFiles=TRUE,bAddPart=TRUE;
4408 gmx_bool bResetCountersHalfWay=FALSE;
4409 output_env_t oenv=NULL;
4410 const char *deviceOptions = "";
4412 real xy_fac = 0.5;
4413 real xy_max = 1.0;
4414 real z_fac = 1.0;
4415 real z_max = 1.0;
4416 int it_xy = 1000;
4417 int it_z = 0;
4418 real probe_rad = 0.22;
4419 int low_up_rm = 0;
4420 int maxwarn=0;
4421 int pieces=1;
4422 gmx_bool bALLOW_ASYMMETRY=FALSE;
4425 /* arguments relevant to OPENMM only*/
4426 #ifdef GMX_OPENMM
4427 gmx_input("g_membed not functional in openmm");
4428 #endif
4430 t_pargs pa[] = {
4431 { "-xyinit", FALSE, etREAL, {&xy_fac}, "Resize factor for the protein in the xy dimension before starting embedding" },
4432 { "-xyend", FALSE, etREAL, {&xy_max}, "Final resize factor in the xy dimension" },
4433 { "-zinit", FALSE, etREAL, {&z_fac}, "Resize factor for the protein in the z dimension before starting embedding" },
4434 { "-zend", FALSE, etREAL, {&z_max}, "Final resize faction in the z dimension" },
4435 { "-nxy", FALSE, etINT, {&it_xy}, "Number of iteration for the xy dimension" },
4436 { "-nz", FALSE, etINT, {&it_z}, "Number of iterations for the z dimension" },
4437 { "-rad", FALSE, etREAL, {&probe_rad}, "Probe radius to check for overlap between the group to embed and the membrane"},
4438 { "-pieces", FALSE, etINT, {&pieces}, "Perform piecewise resize. Select parts of the group to insert and resize these with respect to their own geometrical center." },
4439 { "-asymmetry",FALSE, etBOOL,{&bALLOW_ASYMMETRY}, "Allow asymmetric insertion, i.e. the number of lipids removed from the upper and lower leaflet will not be checked." },
4440 { "-ndiff" , FALSE, etINT, {&low_up_rm}, "Number of lipids that will additionally be removed from the lower (negative number) or upper (positive number) membrane leaflet." },
4441 { "-maxwarn", FALSE, etINT, {&maxwarn}, "Maximum number of warning allowed" },
4442 { "-pd", FALSE, etBOOL,{&bPartDec},
4443 "HIDDENUse particle decompostion" },
4444 { "-dd", FALSE, etRVEC,{&realddxyz},
4445 "HIDDENDomain decomposition grid, 0 is optimize" },
4446 { "-nt", FALSE, etINT, {&nthreads},
4447 "HIDDENNumber of threads to start (0 is guess)" },
4448 { "-npme", FALSE, etINT, {&npme},
4449 "HIDDENNumber of separate nodes to be used for PME, -1 is guess" },
4450 { "-ddorder", FALSE, etENUM, {ddno_opt},
4451 "HIDDENDD node order" },
4452 { "-ddcheck", FALSE, etBOOL, {&bDDBondCheck},
4453 "HIDDENCheck for all bonded interactions with DD" },
4454 { "-ddbondcomm", FALSE, etBOOL, {&bDDBondComm},
4455 "HIDDENUse special bonded atom communication when -rdd > cut-off" },
4456 { "-rdd", FALSE, etREAL, {&rdd},
4457 "HIDDENThe maximum distance for bonded interactions with DD (nm), 0 is determine from initial coordinates" },
4458 { "-rcon", FALSE, etREAL, {&rconstr},
4459 "HIDDENMaximum distance for P-LINCS (nm), 0 is estimate" },
4460 { "-dlb", FALSE, etENUM, {dddlb_opt},
4461 "HIDDENDynamic load balancing (with DD)" },
4462 { "-dds", FALSE, etREAL, {&dlb_scale},
4463 "HIDDENMinimum allowed dlb scaling of the DD cell size" },
4464 { "-ddcsx", FALSE, etSTR, {&ddcsx},
4465 "HIDDENThe DD cell sizes in x" },
4466 { "-ddcsy", FALSE, etSTR, {&ddcsy},
4467 "HIDDENThe DD cell sizes in y" },
4468 { "-ddcsz", FALSE, etSTR, {&ddcsz},
4469 "HIDDENThe DD cell sizes in z" },
4470 { "-gcom", FALSE, etINT,{&nstglobalcomm},
4471 "HIDDENGlobal communication frequency" },
4472 { "-compact", FALSE, etBOOL,{&bCompact},
4473 "Write a compact log file" },
4474 { "-seppot", FALSE, etBOOL, {&bSepPot},
4475 "HIDDENWrite separate V and dVdl terms for each interaction type and node to the log file(s)" },
4476 { "-pforce", FALSE, etREAL, {&pforce},
4477 "HIDDENPrint all forces larger than this (kJ/mol nm)" },
4478 { "-reprod", FALSE, etBOOL,{&bReproducible},
4479 "HIDDENTry to avoid optimizations that affect binary reproducibility" },
4480 { "-multi", FALSE, etINT,{&nmultisim},
4481 "HIDDENDo multiple simulations in parallel" },
4482 { "-replex", FALSE, etINT, {&repl_ex_nst},
4483 "HIDDENAttempt replica exchange every # steps" },
4484 { "-reseed", FALSE, etINT, {&repl_ex_seed},
4485 "HIDDENSeed for replica exchange, -1 is generate a seed" },
4486 { "-rerunvsite", FALSE, etBOOL, {&bRerunVSite},
4487 "HIDDENRecalculate virtual site coordinates with -rerun" },
4488 { "-ionize", FALSE, etBOOL,{&bIonize},
4489 "HIDDENDo a simulation including the effect of an X-Ray bombardment on your system" },
4490 { "-confout", TRUE, etBOOL, {&bConfout},
4491 "HIDDENWrite the last configuration with -c and force checkpointing at the last step" },
4492 { "-stepout", FALSE, etINT, {&nstepout},
4493 "HIDDENFrequency of writing the remaining runtime" },
4494 { "-resetstep", FALSE, etINT, {&resetstep},
4495 "HIDDENReset cycle counters after these many time steps" },
4496 { "-resethway", FALSE, etBOOL, {&bResetCountersHalfWay},
4497 "HIDDENReset the cycle counters after half the number of steps or halfway -maxh" },
4498 { "-v", FALSE, etBOOL,{&bVerbose},
4499 "Be loud and noisy" },
4500 { "-maxh", FALSE, etREAL, {&max_hours},
4501 "HIDDENTerminate after 0.99 times this time (hours)" },
4502 { "-cpt", FALSE, etREAL, {&cpt_period},
4503 "HIDDENCheckpoint interval (minutes)" },
4504 { "-append", FALSE, etBOOL, {&bAppendFiles},
4505 "HIDDENAppend to previous output files when continuing from checkpoint" },
4506 { "-addpart", FALSE, etBOOL, {&bAddPart},
4507 "HIDDENAdd the simulation part number to all output files when continuing from checkpoint" },
4509 gmx_edsam_t ed;
4510 unsigned long Flags, PCA_Flags;
4511 ivec ddxyz;
4512 int dd_node_order;
4513 gmx_bool HaveCheckpoint;
4514 FILE *fplog,*fptest;
4515 int sim_part,sim_part_fn;
4516 const char *part_suffix=".part";
4517 char suffix[STRLEN];
4518 int rc;
4521 cr = init_par(&argc,&argv);
4523 PCA_Flags = (PCA_KEEP_ARGS | PCA_NOEXIT_ON_ARGS | PCA_CAN_SET_DEFFNM
4524 | (MASTER(cr) ? 0 : PCA_QUIET));
4527 /* Comment this in to do fexist calls only on master
4528 * works not with rerun or tables at the moment
4529 * also comment out the version of init_forcerec in md.c
4530 * with NULL instead of opt2fn
4533 if (!MASTER(cr))
4535 PCA_Flags |= PCA_NOT_READ_NODE;
4539 parse_common_args(&argc,argv,PCA_Flags, NFILE,fnm,asize(pa),pa,
4540 asize(desc),desc,0,NULL, &oenv);
4542 /* we set these early because they might be used in init_multisystem()
4543 Note that there is the potential for npme>nnodes until the number of
4544 threads is set later on, if there's thread parallelization. That shouldn't
4545 lead to problems. */
4546 dd_node_order = nenum(ddno_opt);
4547 cr->npmenodes = npme;
4549 #ifdef GMX_THREADS
4550 /* now determine the number of threads automatically. The threads are
4551 only started at mdrunner_threads, though. */
4552 if (nthreads<1)
4554 nthreads=tMPI_Get_recommended_nthreads();
4556 #else
4557 nthreads=1;
4558 #endif
4561 if (repl_ex_nst != 0 && nmultisim < 2)
4562 gmx_fatal(FARGS,"Need at least two replicas for replica exchange (option -multi)");
4564 if (nmultisim > 1) {
4565 #ifndef GMX_THREADS
4566 init_multisystem(cr,nmultisim,NFILE,fnm,TRUE);
4567 #else
4568 gmx_fatal(FARGS,"mdrun -multi is not supported with the thread library.Please compile GROMACS with MPI support");
4569 #endif
4572 /* Check if there is ANY checkpoint file available */
4573 sim_part = 1;
4574 sim_part_fn = sim_part;
4575 if (opt2bSet("-cpi",NFILE,fnm))
4577 bAppendFiles =
4578 read_checkpoint_simulation_part(opt2fn_master("-cpi", NFILE,fnm,cr),
4579 &sim_part_fn,NULL,cr,
4580 bAppendFiles,NFILE,fnm,
4581 part_suffix,&bAddPart);
4582 if (sim_part_fn==0 && MASTER(cr))
4584 fprintf(stdout,"No previous checkpoint file present, assuming this is a new run.\n");
4586 else
4588 sim_part = sim_part_fn + 1;
4591 else
4593 bAppendFiles = FALSE;
4596 if (!bAppendFiles)
4598 sim_part_fn = sim_part;
4601 if (bAddPart && sim_part_fn > 1)
4603 /* This is a continuation run, rename trajectory output files
4604 (except checkpoint files) */
4605 /* create new part name first (zero-filled) */
4606 sprintf(suffix,"%s%04d",part_suffix,sim_part_fn);
4608 add_suffix_to_output_names(fnm,NFILE,suffix);
4609 fprintf(stdout,"Checkpoint file is from part %d, new output files will be suffixed '%s'.\n",sim_part-1,suffix);
4612 Flags = opt2bSet("-rerun",NFILE,fnm) ? MD_RERUN : 0;
4613 Flags = Flags | (bSepPot ? MD_SEPPOT : 0);
4614 Flags = Flags | (bIonize ? MD_IONIZE : 0);
4615 Flags = Flags | (bPartDec ? MD_PARTDEC : 0);
4616 Flags = Flags | (bDDBondCheck ? MD_DDBONDCHECK : 0);
4617 Flags = Flags | (bDDBondComm ? MD_DDBONDCOMM : 0);
4618 Flags = Flags | (bConfout ? MD_CONFOUT : 0);
4619 Flags = Flags | (bRerunVSite ? MD_RERUN_VSITE : 0);
4620 Flags = Flags | (bReproducible ? MD_REPRODUCIBLE : 0);
4621 Flags = Flags | (bAppendFiles ? MD_APPENDFILES : 0);
4622 Flags = Flags | (sim_part>1 ? MD_STARTFROMCPT : 0);
4623 Flags = Flags | (bResetCountersHalfWay ? MD_RESETCOUNTERSHALFWAY : 0);
4626 /* We postpone opening the log file if we are appending, so we can
4627 first truncate the old log file and append to the correct position
4628 there instead. */
4629 if ((MASTER(cr) || bSepPot) && !bAppendFiles)
4631 gmx_log_open(ftp2fn(efLOG,NFILE,fnm),cr,!bSepPot,Flags,&fplog);
4632 CopyRight(fplog,argv[0]);
4633 please_cite(fplog,"Hess2008b");
4634 please_cite(fplog,"Spoel2005a");
4635 please_cite(fplog,"Lindahl2001a");
4636 please_cite(fplog,"Berendsen95a");
4638 else
4640 fplog = NULL;
4643 ddxyz[XX] = (int)(realddxyz[XX] + 0.5);
4644 ddxyz[YY] = (int)(realddxyz[YY] + 0.5);
4645 ddxyz[ZZ] = (int)(realddxyz[ZZ] + 0.5);
4647 /* even if nthreads = 1, we still call this one */
4649 rc = mdrunner_membed(fplog, cr, NFILE, fnm, oenv, bVerbose, bCompact,
4650 nstglobalcomm,
4651 ddxyz, dd_node_order, rdd, rconstr, dddlb_opt[0], dlb_scale,
4652 ddcsx, ddcsy, ddcsz, nstepout, resetstep, nmultisim, repl_ex_nst,
4653 repl_ex_seed, pforce, cpt_period, max_hours, deviceOptions, Flags,
4654 xy_fac,xy_max,z_fac,z_max,
4655 it_xy,it_z,probe_rad,low_up_rm,
4656 pieces,bALLOW_ASYMMETRY,maxwarn);
4658 if (gmx_parallel_env_initialized())
4659 gmx_finalize();
4661 if (MULTIMASTER(cr)) {
4662 thanx(stderr);
4665 /* Log file has to be closed in mdrunner if we are appending to it
4666 (fplog not set here) */
4667 fprintf(stderr,"Please cite:\nWolf et al, J Comp Chem 31 (2010) 2169-2174.\n");
4669 if (MASTER(cr) && !bAppendFiles)
4671 gmx_log_close(fplog);
4674 return rc;