program Console12
implicit none
integer,parameter::N=400 !一共400个粒子,
integer::posx(N),posy(N)
integer ::t,i,j,L
real::pi,cell(8,8)
real :: z,s,k
k=0
do i=-10,9 !初始化400个粒子的位置,都在-10*-10的区域
!行走之前,格点上只有一个粒子,开始行走之后,格点上允许有多个粒子,
do j=-10,9
k=k+1
posx(k)=i
posy(k)=j
end do
end do
open (10,file='dis-0.txt')
do i=1,N
write(10,*)posx(i),posy(i)
end do
do t=1,6000000 !总共进行多少次选择
call RANDOM_SEED()
call RANDOM_NUMBER(z)
k=integer(z*N+1) ! k表示第几个粒子
L=integer(z*4+1) ! l表示1,2,3,4,的哪一个数
select case(l) ! 随机选中的粒子往哪里走,行走的区域是一个-100*100的表格
case(1)
posy(k)=posy(k)+1
if(posy(k)>=100) posy(k)=posy(k)-1
case(2)
posy(k)=posy(k)-1
if(posy(k)<-100) posy(k)=posy(k)+1
case(3)
posx(k)=posx(k)-1
if(posx(k)<-100)posx(k)=posx(k)+1
case(4)
posx(k)=posx(k)+1
if(posx(k)>=100)posx(k)=posx(k)-1
end select
!2000步计算一下熵
if(mod(t,2000)==0)then
cell(i,j)=0 !cell(i,j)表示第几个格点区域有多少个粒子,相当于一个8*8的矩阵,
do k=1,N
i=(posx(k)+100)/25+1 !计算每个格子中的粒子数目
j=(posy(k)+100)/25+1
cell(i,j)=cell(i,j)+1.0
end do
pi=cell(i,j)/N
s=0
do i=1,8
do j=1,8
if(pi<1.0/2000.0)cycle !即在2000步的行走中,该格点区域仍然没有一个粒子
s=s-pi*log(pi)
end do
end do
write (10,*)s
end if
end do
close(10)
end program Console12
QQ截图20191206102134.png (84.26 KB, 下载次数: 252)
li913 发表于 2019-12-6 10:22
integer 改为 int; k为整型。
欢迎光临 Fortran Coder (http://bbs.fcode.cn/) | Powered by Discuz! X3.2 |