2
subroutine smd_ewald_recip_generic(
20
#include "smd_const_data.fh"
24
double precision ralphsq
25
double precision rksqmax
27
double complex eikr(na)
28
double complex eikx(1:na,0:nk)
29
double complex eiky(1:na,-nk:nk)
30
double complex eikz(1:na,-nk:nk)
31
double precision rlatt(3,3)
32
double precision ccc(na,3)
33
double precision fff(na,3)
34
double precision q(na)
39
integer i,k,kx,ky,kz,kminx,kminy,kminz
41
real*8 rksq,rx,ry,rz,rkx,rky,rkz
42
real*8 kcoeff,factor,force,ewald2
52
rx=rlatt(1,1)*ccc(i,1)+rlatt(1,2)*ccc(i,2)+rlatt(1,3)*ccc(i,3)
53
ry=rlatt(2,1)*ccc(i,1)+rlatt(2,2)*ccc(i,2)+rlatt(2,3)*ccc(i,3)
54
rz=rlatt(3,1)*ccc(i,1)+rlatt(3,2)*ccc(i,2)+rlatt(3,3)*ccc(i,3)
55
eikx(i,1)=dcmplx(dcos(twopi*rx),dsin(twopi*rx))
56
eiky(i,1)=dcmplx(dcos(twopi*ry),dsin(twopi*ry))
57
eikz(i,1)=dcmplx(dcos(twopi*rz),dsin(twopi*rz))
58
eiky(i,-1)=conjg(eiky(i,1))
59
eikz(i,-1)=conjg(eikz(i,1))
66
eikx(i,k)=eikx(i,k-1)*eikx(i,1)
69
eiky(i,k)=eiky(i,k-1)*eiky(i,1)
70
eiky(i,-k)=conjg(eiky(i,k))
73
eikz(i,k)=eikz(i,k-1)*eikz(i,1)
74
eikz(i,-k)=conjg(eikz(i,k))
95
rkx=real(kx)*rlatt(1,1)+real(ky)*rlatt(1,2)+real(kz)*rlatt(1,3)
96
rky=real(kx)*rlatt(2,1)+real(ky)*rlatt(2,2)+real(kz)*rlatt(2,3)
97
rkz=real(kx)*rlatt(3,1)+real(ky)*rlatt(3,2)+real(kz)*rlatt(3,3)
101
rksq=rkx*rkx+rky*rky+rkz*rkz
103
if(rksq.lt.rksqmax.and.rksq.ne.0.0)then
109
eikr(i)=eikx(i,kx)*eiky(i,ky)*eikz(i,kz)
110
rhosum=rhosum+q(i)*eikr(i)
114
kcoeff=exp(rksq*ralphsq)/rksq
115
ewald2=ewald2+factor*kcoeff*conjg(rhosum)*rhosum
118
force=-factor*2.0*twopi*convfct1/vol*kcoeff*
119
$ dimag(rhosum*dconjg(eikr(i)))*q(i)
120
fff(i,1)=fff(i,1)+convfct2*rkx*force
121
fff(i,2)=fff(i,2)+convfct2*rky*force
122
fff(i,3)=fff(i,3)+convfct2*rkz*force
134
ewald2=twopi*ewald2*convfct1/vol
141
subroutine smd_ewald_excl_generic(na,
156
#include "smd_const_data.fh"
161
double precision alpha
162
double precision rcutsq
163
double precision rlatt(3,3),latt(3,3)
165
double precision q(na)
167
double precision ccc(na,3),fff(na,3)
173
double precision dr,ar,rsq
174
double precision erfxc,force
176
double precision x,y,z
178
double precision ssx,ssy,ssz,xss,yss,zss
187
c write(*,*) "i,jbeg,jend",i,jbeg,jend
199
ssx=(rlatt(1,1)*x+rlatt(1,2)*y+rlatt(1,3)*z)
200
ssy=(rlatt(2,1)*x+rlatt(2,2)*y+rlatt(2,3)*z)
201
ssz=(rlatt(3,1)*x+rlatt(3,2)*y+rlatt(3,3)*z)
207
x=(latt(1,1)*xss+latt(1,2)*yss+latt(1,3)*zss)
208
y=(latt(2,1)*xss+latt(2,2)*yss+latt(2,3)*zss)
209
z=(latt(3,1)*xss+latt(3,2)*yss+latt(3,3)*zss)
213
if(rsq.lt.rcutsq)then
218
e=e-convfct1*q(i)*q(j)
221
force=-convfct1*q(i)*q(j)*
222
$ ((1-erfxc(ar))-2*ar/sqrpi*exp(-ar*ar))
225
fff(i,1)=fff(i,1)+convfct2*force*x
226
fff(i,2)=fff(i,2)+convfct2*force*y
227
fff(i,3)=fff(i,3)+convfct2*force*z
229
fff(j,1)=fff(j,1)-convfct2*force*x
230
fff(j,2)=fff(j,2)-convfct2*force*y
231
fff(j,3)=fff(j,3)-convfct2*force*z
242
subroutine smd_ewald_real_generic(na,
255
#include "smd_const_data.fh"
260
double precision alpha
261
double precision rcutsq
263
double precision q(na)
265
double precision ccc(nl,3)
266
double precision fff(na,3)
273
double precision dr,ar,rsq
274
double precision erfxc,force
276
double precision x,y,z
298
if(rsq.lt.rcutsq)then
303
e=e+convfct1*q(i)*q(j)
305
c write(*,*) q(i),q(j),ar,dr
307
force=convfct1*q(i)*q(j)
308
$ *(erfxc(ar)+2*ar/sqrpi*exp(-ar*ar))/(dr*rsq)
310
fff(i,1)=fff(i,1)+convfct2*force*x
311
fff(i,2)=fff(i,2)+convfct2*force*y
312
fff(i,3)=fff(i,3)+convfct2*force*z
314
fff(j,1)=fff(j,1)-convfct2*force*x
315
fff(j,2)=fff(j,2)-convfct2*force*y
316
fff(j,3)=fff(j,3)-convfct2*force*z