zoukankan      html  css  js  c++  java
  • 结构因子

    结构因子(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

  • 相关阅读:
    C++ istringstream总结
    C++各数据类型的最值
    AcWing 机器人跳跃问题 二分
    蓝桥杯 矩形面积交
    蓝桥杯 完美的代价
    蓝桥杯 数的读法
    国内 镜像 下载
    redis的pipline使用
    MySQL额外操作
    sql强化演练( goods 表练习)
  • 原文地址:https://www.cnblogs.com/Simulation-Campus/p/9041411.html
Copyright © 2011-2022 走看看