4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
12 * Copyright (c) 1991-1999
13 * BIOSON Research Institute, Dept. of Biophysical Chemistry
14 * University of Groningen, The Netherlands
17 * GROMACS: A message-passing parallel molecular dynamics implementation
18 * H.J.C. Berendsen, D. van der Spoel and R. van Drunen
19 * Comp. Phys. Comm. 91, 43-56 (1995)
21 * Also check out our WWW page:
22 * http://md.chem.rug.nl/~gmx
27 * GRowing Old MAkes el Chrono Sweat
29 static char *SRCID_nm_c
= "$Id$";
44 time_t do_nm(FILE *log
,t_commrec
*cr
,int nfile
,t_filenm fnm
[],
45 bool bVerbose
,bool bCompact
,int stepout
,
46 t_parm
*parm
,t_groups
*grps
,
47 t_topology
*top
,real ener
[],
48 rvec x
[],rvec vold
[],rvec v
[],rvec vt
[],rvec f
[],
49 rvec buf
[],t_mdatoms
*mdatoms
,
50 t_nsborder
*nsb
,t_nrnb nrnb
[],
51 t_graph
*graph
,t_edsamyn
*edyn
,
52 t_forcerec
*fr
,rvec box_size
)
57 real t
,lambda
,t0
,lam0
;
58 bool bNS
,bStopCM
,bTYZ
,bLR
,bLJLR
,bBHAM
,b14
,bBox
;
59 tensor force_vir
,shake_vir
;
61 char *mtx
,*enerfile
,wfile
[80];
66 /* added with respect to mdrun */
69 real der_range
=1.0e-6,fmax
;
71 snew(dfdx
,top
->atoms
.nr
);
76 /* end nmrun differences */
80 lam0
= parm
->ir
.init_lambda
;
84 /* Check Environment variables */
85 bTYZ
=getenv("TYZ") != NULL
;
89 bBox
= (fr
->eBox
!= ebtNONE
);
91 calc_shifts(parm
->box
,box_size
,fr
->shift_vec
,FALSE
);
92 fprintf(log
,"Removing pbc first time\n");
93 mk_mshift(log
,graph
,parm
->box
,x
);
94 shift_self(graph
,fr
->shift_vec
,x
);
97 mtx
=ftp2fn(efMTX
,nfile
,fnm
);
99 /* Open the enrgy file */
101 fp_ene
=open_enx(ftp2fn(efENX
,nfile
,fnm
),"w");
104 set_pot_bools(&(parm
->ir
),top
,&bLR
,&bLJLR
,&bBHAM
,&b14
);
105 mdebin
=init_mdebin(fp_ene
,grps
,&(top
->atoms
),&(top
->idef
),bLR
,bLJLR
,
106 bBHAM
,b14
,parm
->ir
.bPert
,parm
->ir
.epc
,
107 parm
->ir
.bDispCorr
,cr
);
109 /* Compute initial EKin for all.. */
110 calc_ke_part(TRUE
,0,top
->atoms
.nr
,
111 vold
,v
,vt
,&(parm
->ir
.opts
),
112 mdatoms
,grps
,&mynrnb
,
113 lambda
,&ener
[F_DVDL
]);
115 /* Calculate Temperature coupling parameters lambda */
116 ener
[F_TEMP
]=sum_ekin(&(parm
->ir
.opts
),grps
,parm
->ekin
,bTYZ
);
117 tcoupl(parm
->ir
.btc
,&(parm
->ir
.opts
),grps
,parm
->ir
.delta_t
,lam0
,0,
121 /* Write start time and temperature */
122 start_t
=print_date_and_time(log
,cr
->pid
,"Started nmrun");
124 fprintf(stderr
,"starting nmrun '%s'\n%d steps.\n\n",*(top
->name
),
130 /* Call do_force once to make pairlist */
132 clear_mat(force_vir
);
135 do_force(log
,cr
,parm
,nsb
,force_vir
,0,&mynrnb
,
136 top
,grps
,x
,v
,f
,buf
,mdatoms
,ener
,bVerbose
&& !PAR(cr
),
137 lambda
,graph
,bNS
,FALSE
,fr
);
140 /* Shift back the coordinates, since we're not calling update */
141 unshift_self(graph
,fr
->shift_vec
,x
);
144 /* if forces not small, warn user */
145 fmax
=f_max(cr
->left
,cr
->right
,nsb
->nprocs
,0,top
->atoms
.nr
,f
);
146 fprintf(stderr
,"Maximum force:%12.5e\n",fmax
);
148 fprintf(stderr
,"Maximum force probably not small enough to");
149 fprintf(stderr
," ensure that you are in a \nenergy well. ");
150 fprintf(stderr
,"Be aware that negative eigenvalues may occur");
151 fprintf(stderr
," when the\nresulting matrix is diagonalized.\n");
154 /***********************************************************
156 * Loop over all pairs in matrix
158 * do_force called twice. Once with positive and
159 * once with negative displacement
161 ************************************************************/
163 /* fudge nr of steps to nr of atoms */
165 parm
->ir
.nsteps
=top
->atoms
.nr
;
167 for (step
=0; (step
<parm
->ir
.nsteps
); step
++) {
169 for (idum
=0; (idum
<DIM
); idum
++) {
171 x
[step
][idum
]=x
[step
][idum
]-der_range
;
173 clear_mat(force_vir
);
175 do_force(log
,cr
,parm
,nsb
,force_vir
,2*(step
*DIM
+idum
),&mynrnb
,
176 top
,grps
,x
,v
,f
,buf
,mdatoms
,ener
,bVerbose
&& !PAR(cr
),
177 lambda
,graph
,bNS
,FALSE
,fr
);
179 /* Shift back the coordinates, since we're not calling update */
180 unshift_self(graph
,fr
->shift_vec
,x
);
182 for (jdum
=0; (jdum
<top
->atoms
.nr
); jdum
++) {
183 for (kdum
=0; (kdum
<DIM
); kdum
++) {
184 dfdx
[jdum
][kdum
]=f
[jdum
][kdum
];
188 x
[step
][idum
]=x
[step
][idum
]+2.0*der_range
;
190 clear_mat(force_vir
);
192 do_force(log
,cr
,parm
,nsb
,force_vir
,2*(step
*DIM
+idum
)+1,&mynrnb
,
193 top
,grps
,x
,v
,f
,buf
,mdatoms
,ener
,bVerbose
&& !PAR(cr
),
194 lambda
,graph
,bNS
,FALSE
,fr
);
196 /* Shift back the coordinates, since we're not calling update */
197 unshift_self(graph
,fr
->shift_vec
,x
);
199 for (jdum
=0; (jdum
<top
->atoms
.nr
); jdum
++) {
200 for (kdum
=0; (kdum
<DIM
); kdum
++) {
201 dfdx
[jdum
][kdum
]=(f
[jdum
][kdum
]-dfdx
[jdum
][kdum
])/2.0e-6;
205 /* store derivatives now, diagonalization later */
208 write_traj(log
,cr
,mtx
,
209 nsb
,step
,t
,lambda
,nrnb
,nsb
->natoms
,xx
,vv
,ff
,parm
->box
);
211 /* x is restored to original */
213 x
[step
][idum
]=x
[step
][idum
]-der_range
;
218 /*if (MASTER(cr) && bVerbose && ((step % stepout)==0))
219 print_time(stderr,start_t,step,&parm->ir);*/
222 if (MASTER(cr
) && bVerbose
) {
223 fprintf(stderr
,"\rFinished step %d out of %d",step
+1,top
->atoms
.nr
);
227 t
=t0
+step
*parm
->ir
.delta_t
;
228 lambda
=lam0
+step
*parm
->ir
.delta_lambda
;
231 print_ebin(-1,FALSE
,FALSE
,log
,step
,t
,lambda
,0.0,eprAVER
,
232 FALSE
,mdebin
,grps
,&(top
->atoms
));
233 print_ebin(-1,FALSE
,FALSE
,log
,step
,t
,lambda
,0.0,eprRMS
,
234 FALSE
,mdebin
,grps
,&(top
->atoms
));
237 /* Construct dummy particles, for last output frame */
238 construct_dummies(log
,x
,&mynrnb
,parm
->ir
.delta_t
,v
,&top
->idef
);
240 /*free_nslist(log);*/