lammps/tools/createatoms/createAtoms.f

1211 lines
37 KiB
Fortran

c X. W. Zhou, xzhou@sandia.gov
include 'createAtoms.h'
call latgen()
call delete()
call hitvalue()
call disturb()
call systemshift()
call colect()
if (ilatseed .ne. 0) call randomize()
call velgen()
call outputfiles()
if (float(nntype(1)) .ne. 0.0)
* write(6,*)(float(nntype(i))/float(nntype(1)),i=1,ntypes)
write(6,*)'atoms of different species ',(nntype(i),i=1,ntypes)
stop
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine latgen()
include 'createAtoms.h'
character*8 lattype
common /latinfo/ lattype,alat(3),xrot(3),yrot(3),zrot(3),
* periodicity(3),xbound(2),ybound(2),zbound(2),strain(3),
* delx(3),rcell(3),ccell(nelmax)
common /iran/ iseed
namelist /maincard/ ntypes,amass,ielement,ilatseed,
* perlb,perub,iseed,xy,xz,yz
namelist /latcard/ lattype,alat,xrot,yrot,zrot,
* periodicity,xbound,ybound,zbound,
* strain,delx
iseed=3245566
natoms=0
ilatseed=0
xy=1.0e12
xz=1.0e12
yz=1.0e12
read(5,maincard)
do i = 1,3
perlen(i)=perub(i)-perlb(i)
enddo
do i=1,ntypes
nntype(i)=0
enddo
1 continue
strain(1)=0.0
strain(2)=0.0
strain(3)=0.0
xbound(1)=0.0
xbound(2)=0.0
ybound(1)=0.0
ybound(2)=0.0
zbound(1)=0.0
zbound(2)=0.0
delx(1)=0.0
delx(2)=0.0
delx(3)=0.0
lattype='none'
read(5,latcard)
if (lattype .eq. 'none') goto 2
call latgen1()
call defvalue()
goto 1
2 continue
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine latgen1()
include 'createAtoms.h'
character*8 lattype
common /latinfo/ lattype,alat(3),xrot(3),yrot(3),zrot(3),
* periodicity(3),xbound(2),ybound(2),zbound(2),strain(3),
* delx(3),rcell(3),ccell(nelmax)
common /tmpvar/ avec(3),bvec(3),cvec(3),xold(3),yold(3),zold(3),
* avecp(3),bvecp(3),cvecp(3),rcellp(3),roter(3,3),rvs(3,100)
data xold/1.0,0.0,0.0/,yold/0.0,1.0,0.0/,zold/0.0,0.0,1.0/
namelist /subcard/ rcell,ccell
call storelat(lattype,avec,bvec,cvec)
if (xbound(1) .eq. xbound(2)) then
xbound(1)=perlb(1)
xbound(2)=perub(1)
endif
if (ybound(1) .eq. ybound(2)) then
ybound(1)=perlb(2)
ybound(2)=perub(2)
endif
if (zbound(1) .eq. zbound(2)) then
zbound(1)=perlb(3)
zbound(2)=perub(3)
endif
vol=alat(1)*alat(2)*alat(3)
xnorm=sqrt((xrot(1)*alat(2)*alat(3))**2+
* (xrot(2)*alat(1)*alat(3))**2+
* (xrot(3)*alat(1)*alat(2))**2)
ynorm=sqrt((yrot(1)*alat(2)*alat(3))**2+
* (yrot(2)*alat(1)*alat(3))**2+
* (yrot(3)*alat(1)*alat(2))**2)
znorm=sqrt((zrot(1)*alat(2)*alat(3))**2+
* (zrot(2)*alat(1)*alat(3))**2+
* (zrot(3)*alat(1)*alat(2))**2)
periodicity(1)=vol*periodicity(1)/xnorm
periodicity(2)=vol*periodicity(2)/ynorm
periodicity(3)=vol*periodicity(3)/znorm
do 5 i=1,3
xrot(i)=vol*xrot(i)/(alat(i)*xnorm)
yrot(i)=vol*yrot(i)/(alat(i)*ynorm)
zrot(i)=vol*zrot(i)/(alat(i)*znorm)
5 continue
do 10 i=1,3
do 10 j=1,3
roter(i,j)=xold(i)*xrot(j)+yold(i)*yrot(j)+zold(i)*zrot(j)
10 continue
do 20 i=1,3
avecp(i)=0.0
bvecp(i)=0.0
cvecp(i)=0.0
do 20 j=1,3
avecp(i)=avecp(i)+roter(i,j)*avec(j)*0.5*alat(j)
bvecp(i)=bvecp(i)+roter(i,j)*bvec(j)*0.5*alat(j)
cvecp(i)=cvecp(i)+roter(i,j)*cvec(j)*0.5*alat(j)
20 continue
do 30 i=1,3
avec(i)=avecp(i)
bvec(i)=bvecp(i)
cvec(i)=cvecp(i)
30 continue
call applystrain()
nrange=20
nsmall=0
do 300 ii=-nrange,nrange
do 300 jj=-nrange,nrange
do 300 kk=-nrange,nrange
xt=ii*avec(1)+jj*bvec(1)+kk*cvec(1)
if (xt .ge. periodicity(1)-0.1 .or. xt .lt. -0.1) goto 300
yt=ii*avec(2)+jj*bvec(2)+kk*cvec(2)
if (yt .ge. periodicity(2)-0.1 .or. yt .lt. -0.1) goto 300
zt=ii*avec(3)+jj*bvec(3)+kk*cvec(3)
if (zt .ge. periodicity(3)-0.1 .or. zt .lt. -0.1) goto 300
nsmall=nsmall+1
rvs(1,nsmall)=xt
rvs(2,nsmall)=yt
rvs(3,nsmall)=zt
300 continue
nxa=xbound(1)/periodicity(1)-2
nxb=xbound(2)/periodicity(1)+2
nya=ybound(1)/periodicity(2)-2
nyb=ybound(2)/periodicity(2)+2
nza=zbound(1)/periodicity(3)-2
nzb=zbound(2)/periodicity(3)+2
1 rcell(1)=-100.0
read(5,subcard)
if (rcell(1) .eq. -100.0) then
return
endif
do 190 m = 2,ntypes
ccell(m)=min(1.0,ccell(m-1)+ccell(m))
190 continue
do 800 i=1,3
rcellp(i)=0.0
do 800 j=1,3
rcellp(i)=rcellp(i)+roter(i,j)*rcell(j)*alat(j)
800 continue
do 801 i=1,3
rcell(i)=rcellp(i)*(1.0+strain(i))
801 continue
do 250 nn=1,nsmall
do 251 ii=nxa,nxb
xt=ii*periodicity(1)+rvs(1,nn)+rcell(1)
if (xt .ge. xbound(2) .or. xt .lt. xbound(1)) goto 251
do 252 jj=nya,nyb
yt=jj*periodicity(2)+rvs(2,nn)+rcell(2)
if (yt .ge. ybound(2) .or. yt .lt. ybound(1)) goto 252
do 253 kk=nza,nzb
zt=kk*periodicity(3)+rvs(3,nn)+rcell(3)
if (zt .ge. zbound(2) .or. zt .lt. zbound(1)) goto 253
tst=ranl()
it=0
do 201 m=ntypes,1,-1
if (tst .le. ccell(m)) it=m
201 continue
natoms=natoms+1
if (natoms .gt. natmax) then
write(6,9601)natmax
9601 format('number of atoms exceeds maximum dimension: ',i10)
endif
itype(natoms)=it
nhittag(natoms)=0
nntype(it)=nntype(it)+1
rv(1,natoms)=xt+delx(1)
rv(2,natoms)=yt+delx(2)
rv(3,natoms)=zt+delx(3)
if (rv(1,natoms) .lt. perlb(1))
* rv(1,natoms)=rv(1,natoms)+perlen(1)
if (rv(1,natoms) .ge. perub(1))
* rv(1,natoms)=rv(1,natoms)-perlen(1)
if (rv(2,natoms) .lt. perlb(2))
* rv(2,natoms)=rv(2,natoms)+perlen(2)
if (rv(2,natoms) .ge. perub(2))
* rv(2,natoms)=rv(2,natoms)-perlen(2)
if (rv(3,natoms) .lt. perlb(3))
* rv(3,natoms)=rv(3,natoms)+perlen(3)
if (rv(3,natoms) .ge. perub(3))
* rv(3,natoms)=rv(3,natoms)-perlen(3)
253 continue
252 continue
251 continue
250 continue
goto 1
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine defvalue()
include 'createAtoms.h'
integer oldtype
character*8 lattype
common /latinfo/ lattype,alat(3),xrot(3),yrot(3),zrot(3),
* periodicity(3),xbound(2),ybound(2),zbound(2),strain(3),
* delx(3),rcell(3),ccell(nelmax)
common /tmpvar/ avec(3),bvec(3),cvec(3),xold(3),yold(3),zold(3),
* avecp(3),bvecp(3),cvecp(3),rcellp(3),roter(3,3),rvs(3,100)
dimension cent(3),plane(3),planec(3),surface(3)
namelist /defcard/ xmin,xmax,ymin,ymax,zmin,zmax,
* oldtype,newtype,prob,cent,plane,dist,surface,
* nramp,ndirec,dismax,theta,phi,nscrew,anglemin,anglemax,
* xbottom,xheight,zbottom,zheight,nrepeatsx,nrepeatsz
data pi/3.1415927/
1 continue
xmin=-1.0e-20
xmax=1.0e20
ymin=-1.0e20
ymax=1.0e20
zmin=-1.0e20
zmax=1.0e20
oldtype=0
dist=-1.0
newtype=-11
cent(1)=0.5*(perlb(1)+perub(1))
cent(2)=0.5*(perlb(2)+perub(2))
cent(3)=0.5*(perlb(3)+perub(3))
surface(1)=0.0
surface(2)=0.0
surface(3)=0.0
nramp=1
nscrew=0
anglemin=0.0
anglemax=360.0
ndirec=3
dismax=0.0
theta=5000.0
phi=5000.0
nrepeatsx=0
nrepeatsz=0
read(5,defcard)
if (newtype .lt. -10 .and. dismax .eq. 0.0) return
if (newtype .gt. ntypes) then
ntypes=ntypes+1
if (oldtype .ne. 0) then
amass(ntypes)=amass(oldtype)
else
amass(ntypes)=amass(ntypes-1)
endif
endif
if (surface(1) .eq. 1.0) then
perlb(1)=perlb(1)-10.0
perub(1)=perub(1)+10.0
perlen(1)=perub(1)-perlb(1)
endif
if (surface(2) .eq. 1.0) then
perlb(2)=perlb(2)-10.0
perub(2)=perub(2)+10.0
perlen(2)=perub(2)-perlb(2)
endif
if (surface(3) .eq. 1.0) then
perlb(3)=perlb(3)-10.0
perub(3)=perub(3)+10.0
perlen(3)=perub(3)-perlb(3)
endif
vol=alat(1)*alat(2)*alat(3)
if (dismax .ne. 0.0) then
astart=anglemin
afinish=anglemax
if (anglemax .lt. anglemin) then
anglemin=afinish
anglemax=astart
endif
if (nramp .eq. 1) then
pstart=xmin
pfinish=xmax
if (xmax .lt. xmin) then
xmin=pfinish
xmax=pstart
endif
endif
if (nramp .eq. 2) then
pstart=ymin
pfinish=ymax
if (ymax .lt. ymin) then
ymin=pfinish
ymax=pstart
endif
endif
if (nramp .eq. 3) then
pstart=zmin
pfinish=zmax
if (zmax .lt. zmin) then
zmin=pfinish
zmax=pstart
endif
endif
do 33 i=1,natoms
if (rv(1,i) .lt. xmin) goto 33
if (rv(1,i) .gt. xmax) goto 33
if (rv(2,i) .lt. ymin) goto 33
if (rv(2,i) .gt. ymax) goto 33
if (rv(3,i) .lt. zmin) goto 33
if (rv(3,i) .gt. zmax) goto 33
if (nscrew .eq. 0) then
if (nramp .eq. 0) then
rv(ndirec,i)=rv(ndirec,i)+dismax
else
rv(ndirec,i)=rv(ndirec,i)+
* (rv(nramp,i)-pstart)/(pfinish-pstart)*dismax
endif
else
if (ndirec .eq. 1) then
dx=rv(2,i)-cent(2)
dy=rv(3,i)-cent(3)
dxmax=abs(ymax-cent(2))
dxmin=abs(ymin-cent(2))
rmax=min(dxmin,dxmax)
endif
if (ndirec .eq. 2) then
dx=rv(3,i)-cent(3)
dy=rv(1,i)-cent(1)
dxmax=abs(zmax-cent(3))
dxmin=abs(zmin-cent(3))
rmax=min(dxmin,dxmax)
endif
if (ndirec .eq. 3) then
dx=rv(1,i)-cent(1)
dy=rv(2,i)-cent(2)
dxmax=abs(xmax-cent(1))
dxmin=abs(xmin-cent(1))
rmax=min(dxmin,dxmax)
endif
dr=sqrt(dx**2+dy**2)
if (dr .eq. 0.0) then
angle=0.0
else
angle=acos(dx/dr)*180.0/pi
if (dy .lt. 0.0) angle=360.0-angle
endif
if (angle .lt. anglemin) goto 33
if (angle .gt. anglemax) goto 33
if (nscrew .eq. 1) then
astart1=astart
afinish1=afinish
else if (nscrew .eq. 2) then
if (astart .eq. 0.0 .and.
* afinish .eq. 180.0) then
if (dr .le. dxmax) then
astart1=astart
else
astart1=acos(dxmax/dr)*180.0/pi
endif
if (dr .le. dxmin) then
afinish1=afinish
else
afinish1=180.0-acos(dxmin/dr)*180.0/pi
endif
else if (astart .eq. 180.0 .and.
* afinish .eq. 0.0) then
if (dr .le. dxmin) then
astart1=astart
else
astart1=180.0-acos(dxmin/dr)*180.0/pi
endif
if (dr .le. dxmax) then
afinish1=afinish
else
afinish1=acos(dxmax/dr)*180.0/pi
endif
else if (astart .eq. 180.0 .and.
* afinish .eq. 360.0) then
if (dr .le. dxmin) then
astart1=astart
else
astart1=180.0+acos(dxmin/dr)*180.0/pi
endif
if (dr .le. dxmax) then
afinish1=afinish
else
afinish1=360.0-acos(dxmax/dr)*180.0/pi
endif
else if (astart .eq. 360.0 .and.
* afinish .eq. 180.0) then
if (dr .le. dxmax) then
astart1=astart
else
astart1=360.0-acos(dxmax/dr)*180.0/pi
endif
if (dr .le. dxmin) then
afinish1=afinish
else
afinish1=180.0+acos(dxmin/dr)*180.0/pi
endif
else
write(6,*)'problem in nscrew=2'
stop
endif
endif
if (dr .gt. rmax) dr=rmax
rv(ndirec,i)=rv(ndirec,i)+dr/rmax*
* (angle-astart1)/(afinish1-astart1)*dismax
endif
33 continue
else if (theta .eq. 5000.0 .and. phi .eq. 5000.0 .and.
* nrepeatsx*nrepeatsz .eq. 0.0) then
if (dist .lt. 0.0) then
do 2 i=1,natoms
if (rv(1,i) .lt. xmin) goto 2
if (rv(1,i) .gt. xmax) goto 2
if (rv(2,i) .lt. ymin) goto 2
if (rv(2,i) .gt. ymax) goto 2
if (rv(3,i) .lt. zmin) goto 2
if (rv(3,i) .gt. zmax) goto 2
if (oldtype .eq. itype(i) .or. oldtype .eq. 0) then
if (ranl() .lt. prob) itype(i)=newtype
endif
2 continue
else
if (theta .eq. 5000.0) then
pnorm=sqrt((plane(1)*alat(2)*alat(3))**2+
* (plane(2)*alat(1)*alat(3))**2+
* (plane(3)*alat(1)*alat(2))**2)
do 30 n=1,3
plane(n)=vol*plane(n)/(alat(n)*pnorm)
30 continue
do 20 n=1,3
planec(n)=0.0
do 20 m=1,3
planec(n)=planec(n)+roter(n,m)*plane(m)
20 continue
else
planec(1)=sin(pi/180.0*theta)*cos(pi/180.0*phi)
planec(3)=sin(pi/180.0*theta)*sin(pi/180.0*phi)
planec(2)=cos(pi/180.0*theta)
endif
do 22 i=1,natoms
dis1=rv(1,i)-cent(1)
dis2=rv(2,i)-cent(2)
dis3=rv(3,i)-cent(3)
if (dis1*planec(1)+dis2*planec(2)+dis3*planec(3)
* .gt. dist) then
if (oldtype .eq. itype(i) .or. oldtype .eq. 0)
* itype(i)=newtype
endif
22 continue
endif
else if (nrepeatsx*nrepeatsz .ne. 0) then
do 4 i=1,natoms
if (rv(1,i) .le. xmin .or. rv(1,i) .ge. xmax) then
ylocalx = xbottom
else
ylocalx = xbottom + 0.5*xheight*(1.0+
* cos(2.0*pi*nrepeatsx/(xmax-xmin)*
* (rv(1,i)-(xmin+xmax)/(2.0*nrepeatsx))))
endif
if (rv(3,i) .le. zmin .or. rv(3,i) .ge. zmax) then
ylocalz = zbottom
else
ylocalz = zbottom + 0.5*zheight*(1.0+
* cos(2.0*pi*nrepeatsz/(zmax-zmin)*
* (rv(3,i)-(zmin+zmax)/(2.0*nrepeatsz))))
endif
ylocal = ylocalx
if (ylocal .gt. ylocalz) ylocal = ylocalz
if (rv(2,i) .gt. ylocal) then
itype(i)=newtype
endif
4 continue
endif
goto 1
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine storelat(latty,avec,bvec,cvec)
character*8 lstored(10),latty
dimension avecs(3,10),bvecs(3,10),cvecs(3,10)
dimension avec(3),bvec(3),cvec(3)
data lstored/'fcc ','bcc ','sc ',7*' '/
data avecs/1.0,1.0,0.0, 1.0,1.0,-1.0, 2.0,0.0,0.0, 21*0.0/
data bvecs/0.0,1.0,1.0, -1.0,1.0,1.0, 0.0,2.0,0.0, 21*0.0/
data cvecs/1.0,0.0,1.0, 1.0,-1.0,1.0, 0.0,0.0,2.0, 21*0.0/
imatch=0
do 10 i=1,10
if (latty .ne. lstored(i)) goto 10
imatch = 1
do 5 j=1,3
avec(j)=avecs(j,i)
bvec(j)=bvecs(j,i)
cvec(j)=cvecs(j,i)
5 continue
10 continue
if (imatch .eq. 1) return
write(6,15) latty
15 format('could not find lattice type ')
stop
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine applystrain()
include 'createAtoms.h'
character*8 lattype
common /latinfo/ lattype,alat(3),xrot(3),yrot(3),zrot(3),
* periodicity(3),xbound(2),ybound(2),zbound(2),strain(3),
* delx(3),rcell(3),ccell(nelmax)
common /tmpvar/ avec(3),bvec(3),cvec(3),xold(3),yold(3),zold(3),
* avecp(3),bvecp(3),cvecp(3),rcellp(3),roter(3,3),rvs(3,100)
do i=1,3
periodicity(i)=(1.0+strain(i))*periodicity(i)
avec(i)=(1.0+strain(i))*avec(i)
bvec(i)=(1.0+strain(i))*bvec(i)
cvec(i)=(1.0+strain(i))*cvec(i)
enddo
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine hitvalue()
include 'createAtoms.h'
namelist /hitcard/ xmin,xmax,ymin,ymax,zmin,zmax,nhit
nhitcards=0
1001 nhit=0
xmin=-10000.0
xmax=10000.0
ymin=-10000.0
ymax=10000.0
zmin=-10000.0
zmax=10000.0
read(5,hitcard)
if (nhit .eq. 0) then
return
endif
nchange=0
do 1002 i=1,natoms
if (rv(1,i) .lt. xmin) goto 1002
if (rv(1,i) .gt. xmax) goto 1002
if (rv(2,i) .lt. ymin) goto 1002
if (rv(2,i) .gt. ymax) goto 1002
if (rv(3,i) .lt. zmin) goto 1002
if (rv(3,i) .gt. zmax) goto 1002
nchange=nchange+1
nhittag(i)=nhit
1002 continue
if (nchange .ne. 0) nhitcards=nhitcards+1
goto 1001
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine systemshift()
include 'createAtoms.h'
namelist /shiftcard/ mode
mode=0
read(5,shiftcard)
if (mode .eq. 0) return
if (mode .eq. 1) then
top=perub(2)
bottom=perlb(2)
sdely=0.0
do i=1,natoms
if (nhittag(i) .eq. 3 .and. top .gt. rv(2,i)) top=rv(2,i)
if (nhittag(i) .eq. 4 .and. bottom .lt. rv(2,i))
* bottom=rv(2,i)
enddo
sdely=-0.5*(top+bottom)
do i=1,natoms
rv(2,i)=rv(2,i)+sdely
enddo
endif
if (mode .eq. 2) then
c This shift only assumes a maximum of two plane spacings.
xmin=10.0
do i=1,natoms
if (rv(1,i) .lt. xmin) xmin=rv(1,i)
enddo
shiftneg=-10.0
shiftpos=10.0
do i=1,natoms
shift=rv(1,i)-xmin
shift=shift-perlen(1)*nint(shift/perlen(1))
if (shift .gt. 0.01 .and. shift .lt. shiftpos)
* shiftpos=shift
if (shift .lt. -0.01 .and. shift .gt. shiftneg)
* shiftneg=shift
enddo
if (-shiftneg .gt. shiftpos) then
shift=0.5*shiftneg
else
shift=0.5*shiftpos
endif
perlb(1)=xmin+shift
perub(1)=perlb(1)+perlen(1)
endif
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine colect()
include 'createAtoms.h'
do i=1,natoms
if (rv(1,i) .lt. perlb(1)) rv(1,i)=rv(1,i)+perlen(1)
if (rv(1,i) .ge. perub(1)) rv(1,i)=rv(1,i)-perlen(1)
if (rv(2,i) .lt. perlb(2)) rv(2,i)=rv(2,i)+perlen(2)
if (rv(2,i) .ge. perub(2)) rv(2,i)=rv(2,i)-perlen(2)
if (rv(3,i) .lt. perlb(3)) rv(3,i)=rv(3,i)+perlen(3)
if (rv(3,i) .ge. perub(3)) rv(3,i)=rv(3,i)-perlen(3)
enddo
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
real function ranl()
common /iran/ iseed
iseed=iseed*125
iseed=iseed-2796203*(iseed/2796203)
ranl=abs(iseed/2796203.0)
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine delete()
include 'createAtoms.h'
nw_del=0
do i=1,ntypes
nntype(i)=0
enddo
natoms0=natoms
natoms=0
do 1 i=1,natoms0
if (itype(i) .eq. -1) nw_del=nw_del+1
if (itype(i) .le. 0) goto 1
natoms=natoms+1
ntag(natoms)=natoms
itype(natoms)=itype(i)
nhittag(natoms)=nhittag(i)
nntype(itype(natoms))=nntype(itype(natoms))+1
rv(1,natoms)=rv(1,i)
rv(2,natoms)=rv(2,i)
rv(3,natoms)=rv(3,i)
1 continue
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine randomize()
include 'createAtoms.h'
dimension rv0(6,natmax),itype0(natmax),nhittag0(natmax)
do 1 i=1,natoms
itype0(i)=itype(i)
if (nhitcards .gt. 0) nhittag0(i)=nhittag(i)
rv0(1,i)=rv(1,i)
rv0(2,i)=rv(2,i)
rv0(3,i)=rv(3,i)
rv0(4,i)=rv(4,i)
rv0(5,i)=rv(5,i)
rv0(6,i)=rv(6,i)
1 continue
im=1
10 im=im*2
if (im .lt. natoms) goto 10
ia=365
ic=8161
ivalue=mod(ilatseed,natoms)
do 2 i=1,natoms
20 ivalue=mod(ia*ivalue+ic,im)
if (ivalue .ge. natoms) goto 20
ntmp=ivalue+1
if (ntmp .ge. 1 .and. ntmp .le. natoms) then
ntag(ntmp)=i
itype(ntmp)=itype0(i)
if (nhitcards .gt. 0) nhittag(ntmp)=nhittag0(i)
rv(1,ntmp)=rv0(1,i)
rv(2,ntmp)=rv0(2,i)
rv(3,ntmp)=rv0(3,i)
rv(4,ntmp)=rv0(4,i)
rv(5,ntmp)=rv0(5,i)
rv(6,ntmp)=rv0(6,i)
endif
2 continue
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine write0(dumpfile)
include 'createAtoms.h'
character*32 dumpfile, typ
open (unit=2,file=dumpfile)
write(2,*) natoms
write(2,100) 'GaN lattice'
do i=1,natoms
if (itype(i).eq.1) then
typ = 'Ga'
else
typ = 'N'
endif
write(2,150) typ(1:length(typ)),rv(1,i),rv(2,i),rv(3,i)
enddo
50 format(i8)
100 format(a)
150 format(a3,3f13.5)
close(2)
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine write1(dumpfile)
include 'createAtoms.h'
character*32 dumpfile
zero=0.0
open (unit=2,file=dumpfile)
write(2,*) 'ITEM: NUMBER OF ATOMS'
write(2,*) natoms
write(2,*) 'ITEM: BOX BOUNDS'
write(2,*) perlb(1),perub(1)
write(2,*) perlb(2),perub(2)
write(2,*) perlb(3),perub(3)
write(2,*) 'ITEM: TIME'
write(2,*) 0.0
write(2,*) 'ITEM: ATOMS'
if (nhitcards .eq. 0) then
do i=1,natoms
write(2,*) ntag(i),itype(i),rv(1,i),rv(2,i),rv(3,i)
enddo
else
do i=1,natoms
write(2,*) ntag(i),itype(i),nhittag(i),
* rv(1,i),rv(2,i),rv(3,i)
enddo
endif
close(2)
open(unit=2,file=dumpfile(1:index(dumpfile,' ')-1)//'.vel')
write(2,*) 'ITEM: NUMBER OF ATOMS'
write(2,*) natoms
write(2,*) 'ITEM: BOUNDARY VELOCITY'
write(2,*) zero,zero,zero
write(2,*) 'ITEM: TIME'
write(2,*) zero
write(2,*) 'ITEM: VELOCITIES'
do i=1,natoms
write(2,*) ntag(i),rv(4,i),rv(5,i),rv(6,i)
enddo
close(2)
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine write2(dumpfile)
include 'createAtoms.h'
data conmas/1.0365e-4/
character*32 dumpfile
open (unit=2,file=dumpfile)
zero=0.0
write(2,*) 'using dynamo'
write(2,9502) natoms,ntypes,zero
9502 format(2i10,e15.8)
write(2,9503) (perub(i),i=1,3),(perlb(i),i=1,3)
9503 format(3e25.16)
write(2,9504) (amass(i)*conmas,ielement(i),i=1,ntypes)
9504 format(e25.16,i10)
write(2,9505) ((rv(i,j),i=1,6),itype(j),j=1,natoms)
9505 format(3e25.16/3e25.16/i10)
write(2,9503) zero,zero,zero
close(2)
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine write3(dumpfile)
include 'createAtoms.h'
character*32 dumpfile
open (unit=2,file=dumpfile)
area=(1.0-float(nw_del)/float(natoms0))*perlen(2)*perlen(3)
write(2,*) 'Start File for LAMMPS ',area
write(2,*)
write(2,*) natoms,' atoms'
write(2,*)
write(2,*) ntypes,' atom types'
write(2,*)
write(2,*) perlb(1),perub(1),' xlo xhi'
write(2,*) perlb(2),perub(2),' ylo yhi'
write(2,*) perlb(3),perub(3),' zlo zhi'
if (xy .ge. 1.0e8 .or. xz .ge. 1.0e8 .or. yz .ge. 1.0e8) then
write(2,*)
else
write(2,*)
write(2,*)xy,xz,yz,' xy xz yz'
write(2,*)
endif
write(2,*) 'Masses'
write(2,*)
do i=1,ntypes
write(2,*)i,amass(i)
enddo
write(2,*)
write(2,*) 'Atoms'
write(2,*)
do i=1,natoms
write(2,*) i,itype(i),rv(1,i),rv(2,i),rv(3,i)
enddo
write(2,*)
write(2,*) 'Velocities'
write(2,*)
zero=0.0
do i=1,natoms
write(2,*) i,rv(4,i),rv(5,i),rv(6,i)
enddo
close(2)
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine write4(dumpfile)
include 'createAtoms.h'
character*32 dumpfile,full
dumpfile='ens'
full=dumpfile(1:index(dumpfile,' ')-1)//'.case'
open(unit=2,file=full)
write(2,101)
101 format('FORMAT')
write(2,102)
102 format('type: ensight')
write(2,103)
103 format('GEOMETRY')
write(2,104)'ens.case.****.geo'
104 format('model: 1 ',a30)
write(2,105)
105 format('VARIABLE')
write(2,111)
111 format('TIME')
write(2,112)
112 format('time set: 1')
write(2,113)
113 format('number of steps: 1')
write(2,114)
114 format('filename start number: 1')
write(2,115)
115 format('filename increment: 1')
write(2,116)
116 format('time values:')
write(2,117)
117 format('1')
close(2)
full=dumpfile(1:index(dumpfile,' ')-1)//'.case.0001.geo'
open(unit=2,file=full)
write(2,201)
write(2,202)
write(2,203)
write(2,204)
write(2,205)
write(2,206)natoms
do j=1,natoms
write(2,207)j,rv(1,j),rv(2,j),rv(3,j)
enddo
do j=1,ntypes
write(2,208)j
write(2,209)j
write(2,210)
write(2,206)nntype(j)
do k=1,natoms
if (itype(k) .eq. j) write(2,211)k,k
enddo
enddo
201 format('spparks input')
202 format('geometry for element group 1')
203 format('node id given')
204 format('element id given')
205 format('coordinates')
206 format(i8)
207 format(i8,3e12.5)
208 format('part',i2)
209 format('atombox',i2)
210 format('point')
211 format(2i8)
close(2)
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine write5(dumpfile)
include 'createAtoms.h'
character*32 dumpfile,full
character*200 sentence
full=dumpfile(1:index(dumpfile,' ')-1)//'.lat'
open (unit=2,file=full)
call neigen()
nmax=numneigh(1)
do i=1,natoms
if (nmax .lt. numneigh(i)) nmax=numneigh(i)
enddo
write(2,*) 'spparks input lattice'
write(2,*)
write(2,*) '3 dimension'
write(2,*) natoms,' vertices'
write(2,*) nmax,' max connectivity'
write(2,*) perlb(1),perub(1),' xlo xhi'
write(2,*) perlb(2),perub(2),' ylo yhi'
write(2,*) perlb(3),perub(3),' zlo zhi'
write(2,*)
write(2,*) 'Vertices'
write(2,*)
do i=1,natoms
write(2,*) i,rv(1,i),rv(2,i),rv(3,i)
enddo
write(2,*)
write(2,*) 'Edges'
write(2,*)
do i=1,natoms
write(sentence,*) i,(neigh(k,i),k=1,numneigh(i))
write(2,*)sentence(1:len_trim(sentence))
enddo
close(2)
full=dumpfile(1:index(dumpfile,' ')-1)//'.conf'
open (unit=2,file=full)
nvalues=1
write(2,*) 'spparks input configuration'
write(2,*) natoms,nvalues
write(2,*)
do i=1,natoms
write(2,*) i,itype(i)
enddo
close(2)
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine disturb()
include 'createAtoms.h'
dimension strain(3)
namelist /disturbcard/ dismax,strain
dismax=0.0
strain(1)=0.0
strain(2)=0.0
strain(3)=0.0
read(5,disturbcard)
if (dismax .ne. 0.0) then
do 1 i=1,natoms
rv(1,i)=rv(1,i)+dismax*(ranl()-0.5)
rv(2,i)=rv(2,i)+dismax*(ranl()-0.5)
rv(3,i)=rv(3,i)+dismax*(ranl()-0.5)
1 continue
endif
if (strain(1)**2+strain(2)**2+strain(3)**2 .ne. 0.0) then
do 2 i=1,3
perlen(i)=perlen(i)*(1.0+strain(i))
perub(i)=perlb(i)+perlen(i)
2 continue
do 3 i=1,natoms
do 3 j=1,3
rv(j,i)=perlb(j)+(rv(j,i)-perlb(j))*(1.0+strain(j))
3 continue
endif
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine outputfiles()
character*32 dynamo,paradyn,lammps,xyz,ensight,spparks
namelist /filecard/ dynamo,paradyn,lammps,xyz,ensight,spparks
xyz="none"
paradyn="none"
dynamo="none"
lammps="none"
ensight="none"
spparks="none"
read(5,filecard)
if (xyz .ne. "none") call write0(xyz)
if (paradyn .ne. "none") call write1(paradyn)
if (dynamo .ne. "none") call write2(dynamo)
if (lammps .ne. "none") call write3(lammps)
if (ensight .ne. "none") call write4(ensight)
if (spparks .ne. "none") call write5(spparks)
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
integer function length(str)
character*(*) str
n = len(str)
10 if (n.gt.0) then
if (str(n:n).eq.' ') then
n = n - 1
goto 10
endif
endif
length = n
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine velgen()
include 'createAtoms.h'
data boltz/8.617e-5/,conmas/1.0365e-4/
namelist /velcard/ Tbnd,Tmid,naxis,nmesh,equal,ensureTave,
* steeper
dimension Tmesh(200),pmesh(200),vcm(3,200),tmass(200),ekin(200),
* scale(200),ncount(200)
Tbnd=0.0
Tmid=0.0
naxis=1
nmesh=100
equal=1.0
ensureTave=0.0
steeper=0.0
read(5,velcard)
Tbnd=equal*Tbnd
Tmid=equal*Tmid
Tave=0.5*(Tbnd+Tmid)
Tbnd=Tave+(Tbnd-Tave)*(1.0+steeper)
Tmid=Tave+(Tmid-Tave)*(1.0+steeper)
if (Tbnd+Tmid .le. 0.0) then
do i=1,natoms
rv(4,i)=0.0
rv(5,i)=0.0
rv(6,i)=0.0
enddo
else
wmesh=perlen(naxis)/nmesh
do i=1,nmesh
pmesh(i)=(i-0.5)*wmesh
Tmesh(i)=Tmid+(Tbnd-Tmid)*abs(pmesh(i)-0.5*perlen(naxis))/
* (0.5*perlen(naxis))
vcm(1,i)=0.0
vcm(2,i)=0.0
vcm(3,i)=0.0
tmass(i)=0.0
ekin(i)=0.0
ncount(i)=0
enddo
do i=1,natoms
index=(rv(naxis,i)-perlb(naxis))/wmesh+1
it=itype(i)
vnorm=sqrt(Tmesh(index)*boltz/(amass(it)*conmas))
do j=1,3
rv(j+3,i)=vnorm*rgauss()
vcm(j,index)=vcm(j,index)+amass(it)*conmas*rv(j+3,i)
enddo
tmass(index)=tmass(index)+amass(it)*conmas
ncount(index)=ncount(index)+1
enddo
do i=1,nmesh
do j=1,3
vcm(j,i)=vcm(j,i)/tmass(i)
enddo
enddo
do i=1,natoms
index=(rv(naxis,i)-perlb(naxis))/wmesh+1
do j=1,3
rv(j+3,i)=rv(j+3,i)-vcm(j,index)
enddo
enddo
do i=1,natoms
index=(rv(naxis,i)-perlb(naxis))/wmesh+1
it=itype(i)
ekin(index)=ekin(index)+0.5*amass(it)*conmas*
* (rv(4,i)**2+rv(5,i)**2+rv(6,i)**2)
enddo
do i=1,nmesh
treal=2.0/(3.0*boltz)*ekin(i)/ncount(i)
if (treal .eq. 0.0) then
scale(i)=0.0
else
scale(i)=sqrt(Tmesh(i)/treal)
endif
enddo
do i=1,natoms
index=(rv(naxis,i)-perlb(naxis))/wmesh+1
do j=4,6
rv(j,i)=rv(j,i)*scale(index)
enddo
enddo
if (ensureTave .eq. 1.0) then
ekint=0.0
do i=1,natoms
it=itype(i)
ekint=ekint+0.5*amass(it)*conmas*
* (rv(4,i)**2+rv(5,i)**2+rv(6,i)**2)
enddo
trealt=2.0/(3.0*boltz)*ekint/natoms
if (trealt .eq. 0.0) then
scalet=0.0
else
scalet=sqrt(Tave/trealt)
endif
do i=1,natoms
do j=4,6
rv(j,i)=rv(j,i)*scalet
enddo
enddo
endif
endif
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
function rgauss()
data twopi/6.283185308/
1 continue
a1 = ranl()
if (a1 .eq. 0.0) goto 1
a2 = ranl()
rgauss = sqrt(-2.0*log(a1))*cos(twopi*a2)
return
end
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine neigen()
include 'createAtoms.h'
dimension idbox(100,100,100,100),nbox(100,100,100)
cutoff=100.0
xmin=rv(1,1)
xmax=rv(1,1)
ymin=rv(2,1)
ymax=rv(2,1)
zmin=rv(3,1)
zmax=rv(3,1)
do i=2,natoms
if (xmin .gt. rv(1,i)) xmin=rv(1,i)
if (xmax .lt. rv(1,i)) xmax=rv(1,i)
if (ymin .gt. rv(2,i)) ymin=rv(2,i)
if (ymax .lt. rv(2,i)) ymax=rv(2,i)
if (zmin .gt. rv(3,i)) zmin=rv(3,i)
if (zmax .lt. rv(3,i)) zmax=rv(3,i)
dx=rv(1,i)-rv(1,1)
dy=rv(2,i)-rv(2,1)
dz=rv(3,i)-rv(3,1)
dx=dx-perlen(1)*nint(dx/perlen(1))
dy=dy-perlen(2)*nint(dy/perlen(2))
dz=dz-perlen(3)*nint(dz/perlen(3))
tmp=dx**2+dy**2+dz**2
if (tmp .lt. cutoff) cutoff=tmp
enddo
cutoff=sqrt(cutoff)+0.1
nx=(xmax-xmin)/cutoff+1
ny=(ymax-ymin)/cutoff+1
nz=(zmax-zmin)/cutoff+1
if (nx .gt. 100) nx=100
if (ny .gt. 100) ny=100
if (nz .gt. 100) nz=100
delx=(xmax-xmin)/nx
dely=(ymax-ymin)/ny
delz=(zmax-zmin)/nz
do n1=1,nx
do n2=1,ny
do n3=1,nz
nbox(n1,n2,n3)=0
enddo
enddo
enddo
do j=1,natoms
numneigh(j)=0
n1=(rv(1,j)-xmin)/delx+1
if (n1 .lt. 1) n1=1
if (n1 .gt. nx) n1=nx
n2=(rv(2,j)-ymin)/dely+1
if (n2 .lt. 1) n2=1
if (n2 .gt. ny) n2=ny
n3=(rv(3,j)-zmin)/delz+1
if (n3 .lt. 1) n3=1
if (n3 .gt. nz) n3=nz
nbox(n1,n2,n3)=nbox(n1,n2,n3)+1
idbox(n1,n2,n3,nbox(n1,n2,n3))=j
enddo
do j=1,natoms
n1=(rv(1,j)-xmin)/delx+1
if (n1 .lt. 1) n1=1
if (n1 .gt. nx) n1=nx
n2=(rv(2,j)-ymin)/dely+1
if (n2 .lt. 1) n2=1
if (n2 .gt. ny) n2=ny
n3=(rv(3,j)-zmin)/delz+1
if (n3 .lt. 1) n3=1
if (n3 .gt. nz) n3=nz
do na=n1-1,n1+1
if (na .lt. 1) then
naa=nx
else if (na .gt. nx) then
naa=1
else
naa=na
endif
do nb=n2-1,n2+1
if (nb .lt. 1) then
nbb=ny
else if (nb .gt. ny) then
nbb=1
else
nbb=nb
endif
do nc=n3-1,n3+1
if (nc .lt. 1) then
ncc=nz
else if (nc .gt. nz) then
ncc=1
else
ncc=nc
endif
do 100 ndd=1,nbox(naa,nbb,ncc)
k=idbox(naa,nbb,ncc,ndd)
if (k .ge. j) goto 100
dx=rv(1,k)-rv(1,j)
dy=rv(2,k)-rv(2,j)
dz=rv(3,k)-rv(3,j)
dx=dx-perlen(1)*nint(dx/perlen(1))
dy=dy-perlen(2)*nint(dy/perlen(2))
dz=dz-perlen(3)*nint(dz/perlen(3))
tmp=sqrt(dx**2+dy**2+dz**2)
if (tmp .le. cutoff) then
numneigh(j)=numneigh(j)+1
neigh(numneigh(j),j)=k
numneigh(k)=numneigh(k)+1
neigh(numneigh(k),k)=j
endif
100 continue
enddo
enddo
enddo
enddo
return
end