编辑代码

program main
    integer :: i,a,nn,ll,nst,x,y,ii
    integer :: N,N1,N2,N3,N4             !!三角晶格数
    real(8) :: jj                        !!哈密顿量系数虚部
    integer, allocatable :: spin(:)      !!自旋
    real(8) :: Z,T,k,op1,J,sign
    real(8), allocatable :: W(:),OP(:),Hr(:,:),Hi(:,:)    !!权重,序参量,哈密顿量(能量)
    integer :: s1,s2,s3,s4,s5,s6          !!邻居
    real(8) :: r1,r2,r3,r4                !!位形占比
    real(8) :: ee                         !!期望值

    !k=1   !!玻尔兹曼常数
    Z=0 
    J=0.4  !!哈密顿量系数实部
    jj=0.5d0*acos(sinh(2.d0*J))  !! fi
    ll=3   !!长度
    nn=ll*ll
    N=nn*2           !!三角晶格总数
    nst=2**nn        !!2的n次方个态,指数用双星号
    !T=2.00           !!温度
    allocate (spin(0:nn-1))
    allocate (W(0:nst-1))
    allocate (Hr(0:nst-1,0:2))        !!哈密顿量实部,0上三角,1下三角,2和
    allocate (Hi(0:nst-1,0:2))        !!哈密顿量虚部,0上三角,1下三角,2和
    allocate (OP(0:nst-1))
    Hr(:,0)=0
    Hr(:,1)=0
    Hi(:,0)=0
    Hi(:,1)=0
    ee=0
    do a=0,nst-1
        N1=0
        N2=0
        N3=0
        N4=0
        do i=0,nn-1
            spin(i)=btest(a,i)
            spin(i)=2*spin(i)-1
        enddo
        do i=0,nn-1
            x=mod(i,ll)
            y=i/ll
            s1=spin(mod(x-1+ll,ll)+mod(y-1+ll,ll)*ll)   !!左 上
            s2=spin(x+mod(y+1,ll)*ll)                   !!右
            s3=spin(mod(x-1+ll,ll)+y*ll)                !!上
            s4=spin(x+mod(y-1+ll,ll)*ll)                !!左
            s5=spin(mod(x+1,ll)+y*ll)                   !!下
            s6=spin(mod(x+1,ll)+mod(y+1,ll)*ll)         !!右 下
            !!这种记录方法已经考虑边界周期性
            
            Hr(a,0)=dble(spin(i)*s5*s6)+Hr(a,0)
            Hr(a,1)=dble(spin(i)*s1*s3)+Hr(a,1)
            Hi(a,0)=dble(spin(i)*s5*s6)+Hi(a,0)
            Hi(a,1)=dble(spin(i)*s1*s3)+Hi(a,1)
            ii=spin(i)
            if(ii*s1*s3==1.or.ii*s5*s6==1) then
            if((mod(x,3)==0.and.mod(y,3)==0).or.(mod(x,3)==1.and.mod(y,3)==2).or.(mod(x,3)==2.and.mod(y,3)==1)) then
                !判断格点为A
                if(ii*s1==1.and.ii*s3==1) N1=N1+1
                if(ii*s5==1.and.ii*s6==1) N1=N1+1
                if(ii*s1==-1.and.ii*s3==-1) N2=N2+1
                if(ii*s5==-1.and.ii*s6==-1) N2=N2+1
                if(ii*s1==-1.and.ii*s3==1) N3=N3+1
                if(ii*s5==-1.and.ii*s6==1) N3=N3+1
                if(ii*s1==1.and.ii*s3==-1) N4=N4+1
                if(ii*s5==1.and.ii*s6==-1) N4=N4+1
            elseif((mod(x,3)==0.and.mod(y,3)==1).or.(mod(x,3)==1.and.mod(y,3)==0).or.(mod(x,3)==2.and.mod(y,3)==2)) then
                !判断格点为B
                if(ii*s1==1.and.ii*s3==1) N1=N1+1
                if(ii*s5==1.and.ii*s6==1) N1=N1+1
                if(ii*s1==1.and.ii*s3==-1) N2=N2+1
                if(ii*s5==1.and.ii*s6==-1) N2=N2+1
                if(ii*s1==-1.and.ii*s3==-1) N3=N3+1
                if(ii*s5==-1.and.ii*s6==-1) N3=N3+1
                if(ii*s1==-1.and.ii*s3==1) N4=N4+1
                if(ii*s5==-1.and.ii*s6==1) N4=N4+1
            elseif((mod(x,3)==0.and.mod(y,3)==2).or.(mod(x,3)==1.and.mod(y,3)==1).or.(mod(x,3)==2.and.mod(y,3)==0)) then
                !判断格点为C
                if(ii*s1==1.and.ii*s3==1) N1=N1+1
                if(ii*s5==1.and.ii*s6==1) N1=N1+1
                if(ii*s1==-1.and.ii*s3==1) N2=N2+1
                if(ii*s5==-1.and.ii*s6==1) N2=N2+1
                if(ii*s1==1.and.ii*s3==-1) N3=N3+1
                if(ii*s5==1.and.ii*s6==-1) N3=N3+1
                if(ii*s1==-1.and.ii*s3==-1) N4=N4+1
                if(ii*s5==-1.and.ii*s6==-1) N4=N4+1
            end if
            end if
        enddo
        Hr(a,2)=-Hr(a,0)-Hr(a,1)
        Hi(a,2)=-Hi(a,0)+Hi(a,1)
        W(a)=exp(J*Hr(a,2))*cos(jj*Hi(a,2))
        sign=cos(jj*Hi(a,2))/abs(cos(jj*Hi(a,2)))
        r1=dble(N1)/dble(N)
        r2=dble(N2)/dble(N)
        r3=dble(N3)/dble(N)
        r4=dble(N4)/dble(N)
        OP(a)=(r1-r2)**2+(r1-r3)**2+(r1-r4)**2
        OP(a)=OP(a)+(r2-r3)**2+(r2-r4)**2+(r3-r4)**2
        OP(a)=OP(a)/3.d0*W(a)
        ee=ee+W(a)*sign
    enddo
    Z=sum(W(:))
    ee=ee/Z
    op1=sum(OP(:))/Z
    !do i=0,nst-1
    print *,op1
    !enddo
end