module commvar integer,parameter :: n=2,n1=3*n*n*n*8,n2=n1+1,n3=8*n*n*n real*8 :: realn,mini real*8 :: pos(n3,3),dpos(n3,3),opos(n3,3) integer :: neigh(n3,4) real*8 :: r0(3,3),o0,pi integer :: type(n3) ! Variables used ! ! n = length of side of lattice in 8 atom blocks ! n1,n2,n3 = sizes of arrays ! pos = default positions of atoms ! dpos = changes in positions of atoms ! opos = positions loaded in ! neigh(i,j) = j th neighbour of ith atom ! r0(i,j)= perfect lattice length between atoms of type=i and type=j ! o0= 109' ! pi ! wrap = boundary conditions function ! type = ith atom is type i 1=Si 2=Ge 3=C ! contains subroutine values implicit none open(unit=101,file='mini',status='old') read(101,*) mini close(101) r0(1,1)=dble(2.35156) r0(2,2)=dble(2.447) r0(3,3)=dble(1.545) r0(1,2)=(r0(1,1)+r0(2,2))/dble(2) r0(2,1)=r0(1,2) r0(2,3)=(r0(2,2)+r0(3,3))/dble(2) r0(3,2)=r0(2,3) r0(1,3)=dble(1.888) r0(3,1)=dble(1.888) realn=dble(4*n)*r0(1,1)/sqrt(dble(3)) o0=acos(dble(-1)/dble(3)) pi=acos(dble(-1)) end subroutine values end module commvar ! MAIN PROGRAM program phd4 use commvar use para implicit none call values call parameters call setup call readin call leastsquares call writeout(2) end program phd4 subroutine lsqfun(iflag,m1,no,x,fvecc,iw,liw,w,lw) use commvar use para implicit none integer :: iflag,m1,no,liw,iw(liw),lw,i,j,a,b real*8 :: x(no),fvecc(m1),w(lw),sum sum=dble(0) a=1 b=2 bfr(a,b)=x(1) bfr(b,a)=x(1) bfo(a,b,b)=x(2) bfo(b,b,a)=x(2) bfo(b,a,b)=x(3) bfo(a,a,b)=x(4) bfo(b,a,a)=x(4) bfo(a,b,a)=x(5) bfro(a,b,b)=x(6) bfro(b,b,a)=x(6) bfro(b,a,b)=x(7) bfro(a,a,b)=x(8) bfro(b,a,a)=x(8) bfro(a,b,a)=x(9) bfrr(a,b,b)=x(10) bfrr(b,b,a)=x(10) bfrr(b,a,b)=x(11) bfrr(a,a,b)=x(12) bfrr(b,a,a)=x(12) bfrr(a,b,a)=x(13) bfoo(a,b,b,b)=x(14) bfoo(a,a,b,b)=x(15) bfoo(a,b,b,a)=x(15) bfoo(a,a,a,b)=x(16) bfoo(a,b,a,a)=x(16) bfoo(a,b,a,b)=x(17) bfoo(a,a,b,a)=x(18) bfoo(b,a,a,a)=x(19) bfoo(b,a,b,b)=x(20) bfoo(b,b,b,a)=x(20) bfoo(b,b,a,b)=x(21) bfoo(b,a,b,a)=x(22) bfoo(b,a,a,a)=x(23) bfoo1(b,a,b,b)=x(24) bfoo1(b,b,a,b)=x(24) bfoo1(a,a,b,b)=x(25) bfoo1(b,b,a,a)=x(25) bfoo1(a,b,b,b)=x(26) bfoo1(b,b,b,a)=x(26) bfoo1(b,a,a,a)=x(27) bfoo1(a,a,a,b)=x(27) bfoo1(a,a,b,a)=x(28) bfoo1(a,b,a,a)=x(28) bfoo1(b,a,b,a)=x(29) bfoo1(a,b,a,b)=x(29) bfoo1(a,b,b,a)=x(30) bfoo1(b,a,a,b)=x(31) bfoo7(a,a,a,a,b)=x(32) bfoo7(a,a,a,b,a)=x(33) bfoo7(a,a,a,b,b)=x(34) bfoo7(a,a,b,a,a)=x(35) bfoo7(a,a,b,a,b)=x(36) bfoo7(a,a,b,b,a)=x(37) bfoo7(a,a,b,b,b)=x(38) bfoo7(a,b,a,a,a)=x(39) bfoo7(b,a,a,a,a)=x(39) bfoo7(a,b,a,a,b)=x(40) bfoo7(b,a,a,a,b)=x(40) bfoo7(a,b,a,b,a)=x(41) bfoo7(b,a,a,b,a)=x(41) bfoo7(a,b,a,b,b)=x(42) bfoo7(b,a,a,b,b)=x(42) bfoo7(a,b,b,a,a)=x(43) bfoo7(b,a,b,a,a)=x(43) bfoo7(a,b,b,a,b)=x(44) bfoo7(b,a,b,a,b)=x(44) bfoo7(a,b,b,b,a)=x(45) bfoo7(b,a,b,b,a)=x(45) bfoo7(a,b,b,b,b)=x(46) bfoo7(b,a,b,b,b)=x(46) bfoo7(b,b,a,a,a)=x(47) bfoo7(b,b,a,a,b)=x(48) bfoo7(b,b,a,b,a)=x(49) bfoo7(b,b,a,b,b)=x(50) bfoo7(b,b,b,a,a)=x(51) bfoo7(b,b,b,a,b)=x(52) bfoo7(b,b,b,b,a)=x(53) call relax do i=2,n3 do j=1,3 dpos(i,j)=dpos(i,j)-dpos(1,j) end do end do dpos(1,1)=dble(0) dpos(1,2)=dble(0) dpos(1,3)=dble(0) do i=1,n3 do j=1,3 fvecc(3*(i-1)+j)=opos(i,j)-pos(i,j)-dpos(i,j) sum=sum+fvecc(3*(i-1)+j)**2 end do end do if (sumpi) angle=2*pi-angle end function angle real*8 function r3(a,b,c) use commvar implicit none integer a,b,c,ta,tb,tc ta=type(a) tb=type(b) tc=type(c) r3=(r0(ta,tb)+r0(tb,tc))/dble(2) end function r3 real*8 function r41(a,b,c,d) use commvar implicit none integer a,b,c,d,ta,tb,tc,td ta=type(a) tb=type(b) tc=type(c) td=type(d) r41=(r0(ta,tb)+r0(ta,tc)+r0(ta,td))/dble(3) end function r41 real*8 function r42(a,b,c,d) use commvar implicit none integer a,b,c,d,ta,tb,tc,td ta=type(a) tb=type(b) tc=type(c) td=type(d) r42=(r0(ta,tb)+r0(tb,tc)+r0(tc,td))/dble(3) end function r42 real*8 function r51(a,b,c,d,e) use commvar implicit none integer a,b,c,d,e,ta,tb,tc,td,te ta=type(a) tb=type(b) tc=type(c) td=type(d) te=type(e) r51=(r0(ta,tb)+r0(tb,tc)+r0(tc,td)+r0(td,te))/dble(4) end function r51 real*8 function r52(a,b,c,d,e) use commvar implicit none integer a,b,c,d,e,ta,tb,tc,td,te ta=type(a) tb=type(b) tc=type(c) td=type(d) te=type(e) r52=(r0(ta,td)+r0(tb,td)+r0(tc,td)+r0(tc,te))/dble(4) end function r52 subroutine readin use commvar implicit none integer ::a,i,j,k,e,f,g,h,place real*8 :: b,c,d,opos2(n3,3) open(unit=45,file='sige.dat',status='unknown') 100 format(i3,i3,i4,i4,i4,i4,f15.8,f15.8,f14.8) do i=1,n3 read(45,100)a,type(i),j,k,e,f,opos(i,1),opos(i,2),opos(i,3) dpos(i,1)=opos(i,1)-pos(i,1) dpos(i,2)=opos(i,2)-pos(i,2) dpos(i,3)=opos(i,3)-pos(i,3) ! if (type(i)==2) type(i)=3 end do open(unit=45,file='sige.txt',status='unknown') do i=1,n3 read(45,*)a,opos2(i,1),opos2(i,2),opos2(i,3),b,c,d end do place=1 do i=1,43 10 if (type(place)==1) then opos(place,1)=opos2(i,1) opos(place,2)=opos2(i,2) opos(place,3)=opos2(i,3) place=place+1 else place=place+1 goto 10 end if end do place=1 do i=44,64 20 if (type(place)==2) then opos(place,1)=opos2(i,1) opos(place,2)=opos2(i,2) opos(place,3)=opos2(i,3) place=place+1 else place=place+1 goto 20 end if end do do i=1,n3 do j=1,3 opos(i,j)=dble(.529177249)*opos(i,j) end do end do open(unit=101,file='newloc.dat',status='replace') do i=1,n3 write(101,*) i,opos(i,1),opos(i,2),opos(i,3) end do close(101) do i=2,n3 do j=1,3 opos(i,j)=opos(i,j)-opos(1,j) end do end do opos(1,1)=dble(0) opos(1,2)=dble(0) opos(1,3)=dble(0) return end subroutine readin subroutine writeout(a) use para implicit none integer :: a,i,j,k,l,m if (a==1)open(unit=22,file='start.f90',status='replace') if (a==2)open(unit=22,file='param.f90',status='replace') if (a==3)open(unit=22,file='minim.f90',status='replace') write(22,*)' module para' write(22,*)' real*8::bfr(0:3,0:3),bfo(0:3,0:3,0:3)' write(22,*)' real*8::bfro(0:3,0:3,0:3),bfrr(0:3,0:3,0:3)' write(22,*)' real*8::bfoo(0:3,0:3,0:3,0:3)' write(22,*)' real*8::bfoo1(0:3,0:3,0:3,0:3)' write(22,*)' real*8::bfoo4(0:3,0:3,0:3,0:3,0:3)' write(22,*)' real*8::bfoo5(0:3,0:3,0:3,0:3,0:3)' write(22,*)' real*8:: bfoo7(0:3,0:3,0:3,0:3,0:3)' write(22,*)' contains' write(22,*)' subroutine parameters' 1 format(a10,i1,a1,i1,a2,f13.8) do i=0,3 do j=0,3 write(22,1)' bfr(',i,',',j,')=',bfr(i,j)**2 end do end do 2 format(a10,i1,a1,i1,a1,i1,a2,f10.8) do i=0,3 do j=0,3 do k=0,3 write(22,2)' bfo(',i,',',j,',',k,')=',bfo(i,j,k)**2 end do end do end do 3 format(a11,i1,a1,i1,a1,i1,a2,f10.8) do i=0,3 do j=0,3 do k=0,3 write(22,3)' bfro(',i,',',j,',',k,')=',bfro(i,j,k) end do end do end do do i=0,3 do j=0,3 do k=0,3 write(22,3)' bfrr(',i,',',j,',',k,')=',bfrr(i,j,k) end do end do end do 4 format(a11,i1,a1,i1,a1,i1,a1,i1,a2,f10.8) do i=0,3 do j=0,3 do k=0,3 do l=0,3 write(22,4)' bfoo(',i,',',j,',',k,',',l,')=',bfoo(i,j,k,l) end do end do end do end do 5 format(a12,i1,a1,i1,a1,i1,a1,i1,a2,f10.8) do i=0,3 do j=0,3 do k=0,3 do l=0,3 write(22,5)' bfoo1(',i,',',j,',',k,',',l,')=',bfoo1(i,j,k,l) end do end do end do end do 6 format(a12,i1,a1,i1,a1,i1,a1,i1,a1,i1,a2,f10.8) do i=0,3 do j=0,3 do k=0,3 do l=0,3 do m=0,3 write(22,6)' bfoo4(',i,',',j,',',k,',',l,',',m,')=',bfoo4(i,j,k,l,m) end do end do end do end do end do do i=0,3 do j=0,3 do k=0,3 do l=0,3 do m=0,3 write(22,6)' bfoo5(',i,',',j,',',k,',',l,',',m,')=',bfoo5(i,j,k,l,m) end do end do end do end do end do do i=0,3 do j=0,3 do k=0,3 do l=0,3 do m=0,3 write(22,6)' bfoo7(',i,',',j,',',k,',',l,',',m,')=',bfoo7(i,j,k,l,m) end do end do end do end do end do write(22,*)' end subroutine parameters' write(22,*)' end module para' close(22) return end subroutine writeout