结构因子

结构因子(structure factor)是表征材料对射线的散射能力,包括了原子序数,散射方向和原子位置的影响等等,反映了材料结构的平均信息。实验中可以获得结构因子,通过傅立叶变换获得径向分布函数RDF)。分子模拟则相反,先获得RDF,再通过变换获得结构因子。

静态结构因子( Static Structure FactorSSF) 是一个连接实验分析与模拟分析的重要参量,对于衍射分析来说,它表征的是材料对射线的散射能力,反映结构的平均信息。通过衍射数据计算结构因子的公式为[15

统计发现,液态结构因子的第一峰高度在熔点附近都会达到一个同样的高度,即 S( k) 2.8,这个规律叫做 Hansen-Verlet 凝固判据,是可以用来作为熔化和凝固的判据之一[3]。

……………………………………………………………………………………………

哪位能帮忙分析分析我计算出来的结构因子为什么在大q时不趋近于1?我调整过qxqydq的值,可是没什么作用!

do i = 1 , conf_2

mm=1

do j = 1 , 9

read(1,*)

enddo

do j = 1 , all_n

read(1,*) num_o , type_o , X_o , Y_o , Z_o

if (type_o==1)then !!!!!!!!水分子的坐标

xx(mm) = X_o

yy(mm) = Y_o

zz(mm) = Z_o

mm=mm+1 !!!!!!!水分子的数目

endif

end do

do nx=1,600

do ny=1,600

do nz=1,600

kr=sqrt((nx*qx)**2+(ny*qy)**2+(nz*qz)**2) !!!!!!!q的模

! if ((kr>9).and.(kr<62))then

bin=1+int(kr/0.5)

nhist(bin)=nhist(bin)+1

 

cossum=0.0

sinsum=0.0

 

mm1=0

 

do l = 1 , mm-1

rx=0.1*xx(l)

ry=0.1*yy(l)

rz=0.1*zz(l)

cossum=cossum+cos(nx*qx*rx+ny*qy*ry+nz*qz*rz)

sinsum=sinsum+sin(nx*qx*rx+ny*qy*ry+nz*qz*rz)

mm1=mm1+1

end do

 

hist(bin) =hist(bin) + (cossum**2+sinsum**2)/real(mm-1)

write(*,*) nhist(bin),hist(bin),mm1,mm,i

!endif

enddo

enddo

enddo

end do

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

do k = 1 ,600

if(hist(k)/=0) then

g(k) = real(hist(k))/real(nhist(k))

write(2,*) k*0.5,g(k)

else

g(k)=0

write(2,*) k*0.5,g(k)

endif

end do

……………………………………………………………………………………………

谁能帮忙看看我这段代码是哪里错了吗?为什么我得到的S(k) 和文献里的差距很大?谢谢
【结构因子编程】求助修改
根据这个公式编的一段代码但是得到的结果都不太对劲的样子。

因为是正方box所以 倒空间的最小分度gx,gy,gz为:
gx=gy=gz=2*3.14159/Lx   (这个大小合适吗???)
gr=gx**2+gy**2+gz**2
sigma为reduced distance

      do k=1,100
                        sinsum = 0.0
                        cossum = 0.0
                        param  = 0.0

                        do i = 1, natom-1
                                do j = i+1, natom
                                        rx=x(i)-x(j)
                                        ry=y(i)-y(j)
                                        rz=z(i)-z(j)
                                        cossum = cossum + cos (k*gx*rx + k*gy*ry + k*gz*rz)
                                        sinsum = sinsum + sin (k*gx*rx + k*gy*ry + k*gz*rz)
                                enddo
                        enddo
                        cossum=cossum/real(natom)
                        sinsum=sinsum/real(natom)
                        param  = sqrt(cossum**2 + sinsum**2)
!                        param  = param/real(natom)
                        hist(k)=param+1
        enddo                
        open(200,file=filename2)
                do k=1,100
                        write(200,&quot;(f6.2,x,f11.7)&quot k*gr*sigma,hist(i)
                enddo
        close(200)

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

你的问题出在q的处理上,在第二段做球平均以前,波矢q是矢量。所以你的计算中还需加q矢量的三重循环。我下面给你一个使用FFT算S(q)的例子


先给矩阵DT赋值,是你结构每点的form factor值,V是总原子数
CALL REALFT(DT,V,1)
DO I=1,V-1
KR=int(Rij)  !!!距离的bin size,可乘以常数控制曲线点数
SQ(KR)=SQ(KR)+ABS(DT(I+1))/KR/KR  !!结构因子
ENDDO

SUBROUTINE REALFT(DATA1,N,ISIGN)
REAL*8 WR,WI,WPI,WPR,WTEMP,THETA
DIMENSION DATA1(2*N)  !USES FOUR1
INTEGER N,ISIGN,I1,I2,I3,I4,I
REAL C2,H2R,H2I,QRS,WIS,H1R,H1I
THETA=6.28318530717959D0/2.0D0/DFLOAT(N)
C1=0.5
IF (ISIGN==1) THEN
  C2=-0.5
  CALL FOUR1(DATA1,N,+1)
ELSE
  C2=0.5
  THETA=-THETA
ENDIF
WPR=-2.0D0*DSIN(0.5D0*THETA)**2
WPI=DSIN(THETA)
WR=1.0D0+WPR
WI=WPI
N2P3=2*N+3
DO I=2,N/2+1
  I1=2*I-1
  I2=I1+1
  I3=N2P3-I2
  I4=I3+1
  WRS=SNGL(WR)
  WIS=SNGL(WI)
  H1R=C1*(DATA1(I1)+DATA1(I3))
  H1I=C1*(DATA1(I2)-DATA1(I4))
  H2R=-C2*(DATA1(I2)+DATA1(I4))
  H2I=C2*(DATA1(I1)-DATA1(I3))
  DATA1(I1)=H1R+WRS*H2R-WIS*H2I
  DATA1(I2)=H1I+WRS*H2I+WIS*H2R
  DATA1(I3)=H1R-WRS*H2R+WIS*H2I
  DATA1(I4)=-H1I+WRS*H2I+WIS*H2R
  WTEMP=WR
  WR=WR*WPR-WI*WPI+WR
  WI=WI*WPR+WTEMP*WPI+WI
END DO
IF (ISIGN==1) THEN
  H1R=DATA1(1)
  DATA1(1)=H1R+DATA1(2)
  DATA1(2)=H1R-DATA1(2)
ELSE
  H1R=DATA1(1)
  DATA1(1)=C1*(H1R+DATA1(2))
  DATA1(2)=C1*(H1R-DATA1(2))
  CALL FOUR1(DATA1,N,-1)
ENDIF
END SUBROUTINE REALFT

SUBROUTINE FOUR1(DATA1,NN,ISIGN)
INTEGER ISIGN,NN
DIMENSION DATA1(2*NN)
INTEGER I,ISTEP,J,M,MMAX,N
REAL TEMPI,TEMPR
DOUBLE PRECISION THETA,WI,WPI,WPR,WR,WTEMP
N=2*NN
J=1
DO I=1,N,2
  IF(J&gt;I)THEN
    TEMPR=DATA1(J)
    TEMPI=DATA1(J+1)
    DATA1(J)=DATA1(I)
    DATA1(J+1)=DATA1(I+1)
    DATA1(I)=TEMPR
    DATA1(I+1)=TEMPI
  ENDIF
  M=N/2
  DO WHILE((M&gt;=2).AND.(J&gt;M)) 
    J=J-M
    M=M/2
  END DO
  J=J+M
END DO
MMAX=2
DO WHILE(N&gt;MMAX) 
  ISTEP=2*MMAX
  THETA=6.28318530717959D0/(ISIGN*MMAX)
  WPR=-2.D0*DSIN(0.5D0*THETA)**2
  WPI=DSIN(THETA)
  WR=1.D0
  WI=0.D0
  DO M=1,MMAX,2
    DO I=M,N,ISTEP
      J=I+MMAX
      TEMPR=SNGL(WR)*DATA1(J)-SNGL(WI)*DATA1(J+1)
      TEMPI=SNGL(WR)*DATA1(J+1)+SNGL(WI)*DATA1(J)
      DATA1(J)=DATA1(I)-TEMPR
      DATA1(J+1)=DATA1(I+1)-TEMPI
      DATA1(I)=DATA1(I)+TEMPR
      DATA1(I+1)=DATA1(I+1)+TEMPI
    END DO
    WTEMP=WR
    WR=WR*WPR-WI*WPI+WR
    WI=WI*WPR+WTEMP*WPI+WI
  END DO
  MMAX=ISTEP
END DO
END SUBROUTINE FOUR1

---------------------------------------------------------------------------------------------------

非常感谢!
今天又考虑了下代码,发现少统计了好多对,而且确实也有您说的问题,我只考虑了qx=qy=qz的情况,按照您的意思修改如下:
!!!由公式可知,粒子i和j互换位置的话,就相当于在实部和虚部里考虑了rx=x(i)-x(j)和rx=x(j)-x(i)的正负项。y,z,类似
!!!而cos为偶函数,sin为奇函数,所以cossum相当于加两倍,而sinsum直接正负抵消了

x方向: do nx = 1,50
y方向:                do ny = 1, 50
z方向:                        do nz = 1, 50

                                        kr    = sqrt((nx*qx)**2+(ny*qy)**2+(nz*qz)**2)
                                        bin   =        INT(kr/0.03)   !0.03为dq, 波失q的最小分度
                                        nhist(bin) = nhist(bin)+1 !这个是对每个q的小窗口中计入q次数的统计
                                        do i = 1, natom-1
                                                do j = i+1, natom
考虑周期性条件后:                        rx = x(i)-x(j)
                                                        ry = y(i)-y(j)
                                                        rz = z(i)-z(j)
                                                        
                                                        cossum = cossum+2*cos(nx*qx*rx+ny*qy*ry+nz*qz*rz)
                                                enddo
                                        enddo
                                        cossum = 1+cossum/real(natom)
                                        hist(bin) = hist(bin)+cossum !hist(bin)为S(k)的统计分布
                                        !!!疑问:这里需要对这些hist(bin)值再求平均吗?就是用hist(bin)/nhis(bin)
z方向:                                enddo
y方向:                enddo
x方向:        enddo

 

posted @ 2018-05-15 16:01  Simyang  阅读(11224)  评论(0编辑  收藏  举报