2
c $Id: smd_leapf_shake.F 19707 2010-10-29 17:59:36Z d3y133 $
5
subroutine smd_leapf_shake(natms,
26
double precision tstep
28
double precision mass(natms)
31
double precision consdist(ntcons)
32
double precision ncc(3,natms),nvv(3,natms),dcc(3,natms)
33
double precision nrij(3,ntcons),orij(3,ntcons)
34
double precision fff(3,natms)
35
double precision vvv(3,natms)
36
double precision ccc(3,natms)
38
integer i,j,it,maxit,iatm1,iatm2
40
double precision force,rma,rmb
41
double precision tmpvx,tmpvy,tmpvz
42
double precision tstepsq,rtstep,tol,mxdiff
43
double precision nrijsq,dijsq,diffsq,dotprod
46
pname = "smd_leapf_shake"
47
write(*,*) "in "//pname
62
orij(1,i)=ccc(1,iatm1)-ccc(1,iatm2)
63
orij(2,i)=ccc(2,iatm1)-ccc(2,iatm2)
64
orij(3,i)=ccc(3,iatm1)-ccc(3,iatm2)
68
call smd_lat_rebox(ntcons,orij)
76
nvv(1,i)=vvv(1,i)+fff(1,i)*tstep/mass(i)
77
nvv(2,i)=vvv(2,i)+fff(2,i)*tstep/mass(i)
78
nvv(3,i)=vvv(3,i)+fff(3,i)*tstep/mass(i)
80
ccc(1,i)=ncc(1,i)+tstep*nvv(1,i)
81
ccc(2,i)=ncc(2,i)+tstep*nvv(2,i)
82
ccc(3,i)=ncc(3,i)+tstep*nvv(3,i)
94
nrij(1,j)=ccc(1,iatm1)-ccc(1,iatm2)
95
nrij(2,j)=ccc(2,iatm1)-ccc(2,iatm2)
96
nrij(3,j)=ccc(3,iatm1)-ccc(3,iatm2)
100
call smd_lat_rebox(ntcons,nrij)
113
nrijsq=nrij(1,j)**2+nrij(2,j)**2+nrij(3,j)**2
116
mxdiff=max(mxdiff,abs(diffsq)/consdist(j))
118
dotprod=orij(1,j)*nrij(1,j)
119
$ +orij(2,j)*nrij(2,j)
120
$ +orij(3,j)*nrij(3,j)
122
rma= tstepsq/mass(iatm1)
123
rmb=-tstepsq/mass(iatm2)
124
force=diffsq/(-2.0*(rma-rmb)*dotprod)
126
dcc(1,iatm1)=dcc(1,iatm1)-rma*orij(1,j)*force
127
dcc(2,iatm1)=dcc(2,iatm1)-rma*orij(2,j)*force
128
dcc(3,iatm1)=dcc(3,iatm1)-rma*orij(3,j)*force
129
dcc(1,iatm2)=dcc(1,iatm2)-rmb*orij(1,j)*force
130
dcc(2,iatm2)=dcc(2,iatm2)-rmb*orij(2,j)*force
131
dcc(3,iatm2)=dcc(3,iatm2)-rmb*orij(3,j)*force
141
ccc(1,iatm1)=ccc(1,iatm1)+0.5*dcc(1,iatm1)
142
ccc(2,iatm1)=ccc(2,iatm1)+0.5*dcc(2,iatm1)
143
ccc(3,iatm1)=ccc(3,iatm1)+0.5*dcc(3,iatm1)
144
ccc(1,iatm2)=ccc(1,iatm2)+0.5*dcc(1,iatm2)
145
ccc(2,iatm2)=ccc(2,iatm2)+0.5*dcc(2,iatm2)
146
ccc(3,iatm2)=ccc(3,iatm2)+0.5*dcc(3,iatm2)
152
if(mxdiff.lt.tol)goto 100
160
nvv(1,i)=(ccc(1,i)-ncc(1,i))*rtstep
161
nvv(2,i)=(ccc(2,i)-ncc(2,i))*rtstep
162
nvv(3,i)=(ccc(3,i)-ncc(3,i))*rtstep
164
tmpvx=0.5*(nvv(1,i)+vvv(1,i))
165
tmpvy=0.5*(nvv(2,i)+vvv(2,i))
166
tmpvz=0.5*(nvv(3,i)+vvv(3,i))
168
ekin=ekin+mass(i)*(tmpvx**2+tmpvy**2+tmpvz**2)
170
fff(1,i)=(nvv(1,i)-vvv(1,i))*mass(i)*rtstep
171
fff(2,i)=(nvv(2,i)-vvv(2,i))*mass(i)*rtstep
172
fff(3,i)=(nvv(3,i)-vvv(3,i))*mass(i)*rtstep
183
write(*,*) "out "//pname