4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
12 * Copyright (c) 1991-1997
13 * BIOSON Research Institute, Dept. of Biophysical Chemistry
14 * University of Groningen, The Netherlands
17 * GROMACS: A message-passing parallel molecular dynamics implementation
18 * H.J.C. Berendsen, D. van der Spoel and R. van Drunen
19 * Comp. Phys. Comm. 91, 43-56 (1995)
21 * Also check out our WWW page:
22 * http://rugmd0.chem.rug.nl/~gmx
27 * GRoups of Organic Molecules in ACtion for Science
29 static char *SRCID_runner_c
= "$Id$";
61 bool optRerunMDset (int nfile
, t_filenm fnm
[])
63 return opt2bSet("-rerun",nfile
,fnm
);
66 void get_cmparm(t_inputrec
*ir
,int step
,bool *bStopCM
,bool *bStopRot
)
68 if (ir
->nstcomm
== 0) {
71 } else if (ir
->nstcomm
> 0) {
72 *bStopCM
= do_per_step(step
,ir
->nstcomm
);
76 *bStopRot
= do_per_step(step
,-ir
->nstcomm
);
80 void set_pot_bools(t_inputrec
*ir
,t_topology
*top
,
81 bool *bLR
,bool *bLJLR
,bool *bBHAM
,bool *b14
)
83 *bLR
= (ir
->rcoulomb
> ir
->rlist
) || EEL_LR(ir
->coulombtype
);
84 *bLJLR
= (ir
->rvdw
> ir
->rlist
);
85 *bBHAM
= (top
->idef
.functype
[0]==F_BHAM
);
86 *b14
= (top
->idef
.il
[F_LJ14
].nr
> 0);
89 void finish_run(FILE *log
,t_commrec
*cr
,
95 double cputime
,double realtime
,int step
,
101 for(i
=0; (i
<eNRNB
); i
++)
103 for(i
=0; (i
<nsb
->nprocs
); i
++)
104 for(j
=0; (j
<eNRNB
); j
++)
105 ntot
.n
[j
]+=nrnb
[i
].n
[j
];
109 fprintf(stderr
,"\n\n");
110 print_perf(stderr
,cputime
,realtime
,&ntot
,nsb
->nprocs
);
113 print_nrnb(log
,&(nrnb
[nsb
->pid
]));
117 print_perf(log
,cputime
,realtime
,&ntot
,nsb
->nprocs
);
119 pr_load(log
,nsb
->nprocs
,nrnb
);
123 void mdrunner(t_commrec
*cr
,int nfile
,t_filenm fnm
[],bool bVerbose
,
124 bool bCompact
,int nDlb
,bool bNM
,int nstepout
,t_edsamyn
*edyn
)
126 double cputime
=0,realtime
;
128 rvec
*buf
,*f
,*vold
,*v
,*vt
,*x
,box_size
;
141 /* Initiate everything (snew sets to zero!) */
147 snew(nrnb
,cr
->nprocs
);
149 /* Initiate invsqrt routines */
150 init_lookup_table(stdlog
);
152 if (bVerbose
&& MASTER(cr
))
153 fprintf(stderr
,"Getting Loaded...\n");
156 /* The master processor reads from disk, then passes everything
157 * around the ring, and finally frees the stuff
160 distribute_parts(cr
->left
,cr
->right
,cr
->pid
,cr
->nprocs
,parm
,
161 ftp2fn(efTPX
,nfile
,fnm
),nDlb
);
163 /* Every processor (including the master) reads the data from the ring */
164 init_parts(stdlog
,cr
,
165 parm
,top
,&x
,&v
,&mdatoms
,nsb
,
166 MASTER(cr
) ? LIST_SCALARS
| LIST_PARM
: 0);
169 init_single(stdlog
,parm
,ftp2fn(efTPX
,nfile
,fnm
),top
,&x
,&v
,&mdatoms
,nsb
);
171 snew(buf
,nsb
->natoms
);
173 snew(vt
,nsb
->natoms
);
174 snew(vold
,nsb
->natoms
);
176 if (bVerbose
&& MASTER(cr
))
177 fprintf(stderr
,"Loaded with Money\n\n");
179 /* Index numbers for parallellism... */
181 top
->idef
.pid
= cr
->pid
;
183 /* Group stuff (energies etc) */
184 init_groups(stdlog
,mdatoms
,&(parm
->ir
.opts
),grps
);
186 /* Periodicity stuff */
187 graph
=mk_graph(&(top
->idef
),top
->atoms
.nr
,FALSE
);
189 p_graph(debug
,"Initial graph",graph
);
191 /* Distance Restraints */
192 init_disres(stdlog
,top
->idef
.il
[F_DISRES
].nr
,&(parm
->ir
));
194 /* check if there are dummies */
196 for(i
=0; (i
<F_NRE
) && !bDummies
; i
++)
197 bDummies
= ((interaction_function
[i
].flags
& IF_DUMMY
) &&
198 (top
->idef
.il
[i
].nr
> 0));
200 /* Initiate forcerecord */
202 init_forcerec(stdlog
,fr
,&(parm
->ir
),&(top
->blocks
[ebMOLS
]),cr
,
203 &(top
->blocks
[ebCGS
]),&(top
->idef
),mdatoms
,parm
->box
,FALSE
);
205 for(m
=0; (m
<DIM
); m
++)
206 box_size
[m
]=parm
->box
[m
][m
];
208 /* Initiate PPPM if necessary */
209 if (fr
->eeltype
== eelPPPM
)
210 init_pppm(stdlog
,cr
,nsb
,FALSE
,TRUE
,box_size
,ftp2fn(efHAT
,nfile
,fnm
),&parm
->ir
);
212 /* Now do whatever the user wants us to do (how flexible...) */
214 start_t
=do_nm(stdlog
,cr
,nfile
,fnm
,
215 bVerbose
,bCompact
,nstepout
,parm
,grps
,
216 top
,ener
,x
,vold
,v
,vt
,f
,buf
,
217 mdatoms
,nsb
,nrnb
,graph
,edyn
,fr
,box_size
);
220 switch (parm
->ir
.eI
) {
223 start_t
=do_md(stdlog
,cr
,nfile
,fnm
,
224 bVerbose
,bCompact
,bDummies
,nstepout
,parm
,grps
,
225 top
,ener
,x
,vold
,v
,vt
,f
,buf
,
226 mdatoms
,nsb
,nrnb
,graph
,edyn
,fr
,box_size
);
229 start_t
=do_cg(stdlog
,nfile
,fnm
,parm
,top
,grps
,nsb
,
230 x
,f
,buf
,mdatoms
,parm
->ekin
,ener
,
231 nrnb
,bVerbose
,bDummies
,cr
,graph
,fr
,box_size
);
234 start_t
=do_steep(stdlog
,nfile
,fnm
,parm
,top
,grps
,nsb
,
235 x
,f
,buf
,mdatoms
,parm
->ekin
,ener
,
236 nrnb
,bVerbose
,bDummies
,cr
,graph
,fr
,box_size
);
239 fatal_error(0,"Invalid integrator (%d)...\n",parm
->ir
.eI
);
242 /* Some timing stats */
244 print_time(stderr
,start_t
,parm
->ir
.nsteps
,&parm
->ir
);
245 realtime
=difftime(time(NULL
),start_t
);
246 if ((cputime
=cpu_time()) == 0)
252 md2atoms(mdatoms
,&(top
->atoms
),TRUE
);
254 /* Finish up, write some stuff */
256 char *gro
=ftp2fn(efSTO
,nfile
,fnm
);
258 /* if rerunMD, don't write last frame again */
259 finish_run(stdlog
,cr
,gro
,nsb
,top
,parm
,
260 nrnb
,cputime
,realtime
,parm
->ir
.nsteps
,
261 (parm
->ir
.eI
==eiMD
) || (parm
->ir
.eI
==eiLD
));
265 /* Does what it says */
266 print_date_and_time(stdlog
,cr
->pid
,"Finished mdrun");
273 void init_md(t_commrec
*cr
,t_inputrec
*ir
,real
*t
,real
*t0
,
274 real
*lambda
,real
*lam0
,real
*SAfactor
,
275 t_nrnb
*mynrnb
,bool *bTYZ
,t_topology
*top
,
276 int nfile
,t_filenm fnm
[],char **traj
,char **xtc_traj
,int *fp_ene
,
277 t_mdebin
**mdebin
,t_groups
*grps
,rvec vcm
,
278 tensor force_vir
,tensor shake_vir
,t_mdatoms
*mdatoms
)
280 bool bBHAM
,b14
,bLR
,bLJLR
;
283 *t
= *t0
= ir
->init_t
;
285 *lambda
= *lam0
= ir
->init_lambda
;
288 *lambda
= *lam0
= 0.0;
291 *SAfactor
= 1.0 - *t0
/ir
->zero_temp_time
;
299 /* Check Environment variables & other booleans */
300 *bTYZ
=getenv("TYZ") != NULL
;
301 set_pot_bools(ir
,top
,&bLR
,&bLJLR
,&bBHAM
,&b14
);
304 *traj
= ftp2fn(efTRN
,nfile
,fnm
);
305 *xtc_traj
= ftp2fn(efXTC
,nfile
,fnm
);
308 *fp_ene
= open_enx(ftp2fn(efENX
,nfile
,fnm
),"w");
309 *mdebin
= init_mdebin(*fp_ene
,grps
,&(top
->atoms
),&(top
->idef
),
310 bLR
,bLJLR
,bBHAM
,b14
,ir
->bPert
,ir
->epc
,
318 /* Initiate variables */
320 clear_mat(force_vir
);
321 clear_mat(shake_vir
);
323 /* Set initial values for invmass etc. */
324 init_mdatoms(mdatoms
,*lambda
,TRUE
);
329 void do_pbc_first(FILE *log
,t_parm
*parm
,rvec box_size
,t_forcerec
*fr
,
330 t_graph
*graph
,rvec x
[])
332 fprintf(log
,"Removing pbc first time\n");
333 calc_shifts(parm
->box
,box_size
,fr
->shift_vec
,FALSE
);
334 mk_mshift(log
,graph
,parm
->box
,x
);
335 shift_self(graph
,fr
->shift_vec
,x
);
336 fprintf(log
,"Done rmpbc\n");