元胞自动机程序.docx
《元胞自动机程序.docx》由会员分享,可在线阅读,更多相关《元胞自动机程序.docx(11页珍藏版)》请在冰豆网上搜索。
![元胞自动机程序.docx](https://file1.bdocx.com/fileroot1/2022-10/27/22355aa0-8680-4cf8-9b6f-a245ba23c449/22355aa0-8680-4cf8-9b6f-a245ba23c4491.gif)
元胞自动机程序
!
元胞自动机程序(生命永不停止)
USEMSFLIB
PARAMETERIR=400,JR=400,NMAX=10000!
NMAX-随机产生的生命种子
INTEGERIS(0:
1001,0:
1001),IS1(0:
1001,0:
1001),ISN(1:
8),TMAX,NUM
!
IS-基体的二维数组
write(*,*)'PLEASEINPUTLOOP(TMAX)'
READ(*,*)TMAX
ISEED=RTC()
IS=15!
"死"的状态,基体为白色
!
赋予生命的种子,"活"的状态1
DOI=1,NMAX
IX0=IR*RAN(ISEED)+1
JY0=JR*RAN(ISEED)+1
IS(IX0,JY0)=1
ENDDO
IS1=IS
!
EXECUTETHERULE
DOT=1,TMAX
!
边界条件
IS(0,0:
JR+1)=IS(R,0:
JR+1)
IS(IMAX+1,0:
JR+1)=IS(1,0:
JR+1)
IS(0:
IR+1,0)=IS(0:
IR+1,JMAX)
IS(0:
IR+1,JR+1)=IS(0:
IR+1,1)
!
搜索生命存在的位置
DOIX=1,IR
DOJY=1,JR
!
判断邻居状态
ISN=(/IS(IX-1,JY-1),IS(IX-1,JY),IS(IX-1,JY+1),IS(IX,JY-1)
&,IS(IX,JY+1),IS(IX+1,JY-1),IS(IX+1,JY),IS(IX+1,JY+1)/)
NUM=COUNT(ISN.EQ.1)
!
赋予生存的条件
IF((IS(IX,JY)==15.AND.NUM==3).OR.(IS(IX,JY)==1.AND
&.(NUM==3.OR.NUM==2)))THEN
IS1(IX,JY)=1
ELSE
IS1(IX,JY)=15
ENDIF
!
画图
ISRE=SETCOLOR(IS1(IX,JY))
ISRE=SETPIXEL(IX,JY)
ENDDO
ENDDO
IS=IS1
ENDDO
END
元胞自动机—产生和发展.四个阶段:
1940s诞生:
VonNeumann自我复制机.
1960-70s起步:
JH.Conway生命游戏.
1980s理论研究:
S.WolframCA分类.
1980-90s应用:
HPP-FHP格子气自动机.
C.LangtonN.Packard人工生命
元胞自动机(CellularAutomata,简称CA,也有人称其为细胞自动机、点格自动机、分子自动机或单元自动机)是一种建立在离散的时间和空间上的动力学系统。
散布在规则格网(LatticeGrid)中的每一元胞(Cell)取有限的离散状态,遵循同样的作用规则,依据确定的局部规则作同步更新。
大量元胞通过简单的相互作用而构成动态系统的演化。
与一般的动力学模型不同,元胞自动机不是由严格定义的物理方程或函数确定,而是由一系列模型构造的规则构成,凡是满足这些规则的模型都可以算做是元胞自动机模型。
因此,元胞自动机是一类模型的总称,或者是一个方法框架。
其特点是时间、空间、状态都是离散的,每个变量只取有限多个状态,且其状态改变的规则在时间和空间上都是局部的。
元胞自动机是一种对具有局域连通性的格点,应用局部(有时为中等范围)确定性或概率性的转换规则来描述在离散空间和时间上复杂系统演化规律的同步算法。
元胞自动机可以采取任意的维数,自动机的格点描述被认为与所选模型密切相关的基本的系统实体。
独立的格点可以表示连续的体积单元,原子颗粒大原子团、汽车、人口、晶格缺陷等。
通过作用于每个格点的确定性或概率性转换规则,自动机的演化得以实施。
这些规则决定了每个元胞的状态,并将其描述为其前一状态和邻近元胞的函数。
在计算状态转变过程中所考虑的邻近位置的数目确定了相互作用的范围和自动机的局部演化。
元胞自动机特点:
时间、空间、状态都离散的动力学模型,
利用确定性或概论性的转换规则来描述在离散空间和时间上复杂系统演化
!
元胞自动机模拟单晶长大
USEMSFLIB
PARAMETERIR=400,JR=400
INTEGERIS(0:
IR+1,0:
JR+1),TMAX,ISN(1:
8),NSTATE,T,NR,IX0,IY0,IX,JY
!
!
根据过去状态IS,定义现在状态为IS1;为了突出边界,特别定义ISN1
INTEGERIS1(0:
IR+1,0:
JR+1),ISN1(1:
8)
WRITE(*,*)"PLEASEINPUTTHETIMESTEP"
READ(*,*)TMAX
ISEED=RTC()
IRC=IR/2
JRC=JR/2
!
!
!
定义基体体积能为10,晶粒体积能为1
IS=10
IS(IRC,JRC)=1
!
!
在循环前定义现在状态数组IS1的初始值
IS1=IS
OPEN(1,FILE="E:
\LUKE.DAT")
DOT=1,TMAX
!
!
每次循环前重新定义过去状态数组IS
IS=IS1
!
边界条件
IS(0,0:
JR+1)=IS(R,0:
JR+1)
IS(IMAX+1,0:
JR+1)=IS(1,0:
JR+1)
IS(0:
IR+1,0)=IS(0:
IR+1,JR)
IS(0:
IR+1,JR+1)=IS(0:
IR+1,1)
!
!
整个基体上,各个点上的状态都要根据规则改变,而非随机取点改变
DOIX=1,IR
DOJY=1,JR
ISN=(/IS(IX-1,JY-1),IS(IX-1,JY),IS(IX-1,JY+1),IS(IX,JY-1)
&,IS(IX,JY+1),IS(IX+1,JY-1),IS(IX+1,JY),IS(IX+1,JY+1)/)
E0=COUNT(ISN.NE.IS(IX,JY))
!
如果不是晶粒边界,则跳出,重新循环
IF(E0.EQ.0)CYCLE
!
随机寻找一个相邻点
NR=8*RAN(ISEED)+1
NSTATE=ISN(NR)
!
判断与相邻点的能量差,并决定是否改变状态
E=COUNT(ISN.NE.NSTATE)
RD=RAN(ISEED)
IG=NSTATE-IS(IX,JY)
DE=E-E0+IG+2.5*RD-1.25
!
!
用现在状态数组IS1记录边界状态的改变
IF(DE.LT.0.0)IS1(IX,JY)=NSTATE
ENDDO
ENDDO
!
!
每循环20次在显示屏幕上刷新状态(颜色)
DOIX=1,IR
DOJY=1,JR
IF(MOD(T,20).EQ.0)THEN
ISN1=(/IS1(IX-1,JY-1),IS1(IX-1,JY),IS1(IX-1,JY+1),IS1(IX,JY-1)
&,IS1(IX,JY+1),IS1(IX+1,JY-1),IS1(IX+1,JY),IS1(IX+1,JY+1)/)
ISRE=SETCOLOR(IS(IX,JY))
!
如果是边界,定义特别颜色15,加以区分
IF(COUNT(ISN1.NE.IS1(IX,JY)).GT.0)ISRE=SETCOLOR(15)
ISRE=SETPIXEL(IX,JY)
ENDIF
ENDDO
ENDDO
!
!
!
记录循环次数和对应的晶粒面积
WRITE(1,*)T,SQRT(1.0*COUNT(IS.EQ.1))
ENDDO
CLOSE
(1)
END
USEMSFLIB
PARAMETERIR=400,JR=400,NMAX=100
INTEGERIS(0:
IR+1,0:
JR+1),TMAX,ISN(1:
8),NSTATE,T,NR,IX0,IY0,IX,JY
INTEGERIGV(0:
NMAX)
!
!
根据过去状态IS,定义现在状态为IS1;为了突出边界,特别定义ISN1
INTEGERIS1(0:
IR+1,0:
JR+1),ISN1(1:
8)
WRITE(*,*)"PLEASEINPUTTHETIMESTEP"
READ(*,*)TMAX
ISEED=RTC()
IRC=IR/2
JRC=JR/2
!
定义基体体积能为10,晶粒体积能为1
IS=10
IS(IRC,JRC)=1
!
!
在循环前定义现在状态数组IS1的初始值
IS1=IS
!
!
OPEN(1,FILE="E:
\LUKE.DAT")
DOT=1,TMAX
!
!
每次循环前重新定义过去状态数组IS
IS=IS1
!
!
!
边界条件
IS(0,1:
JR)=IS(IR,1:
JR)
IS(IR,1:
JR)=IS(iR+1,1:
JR)
IS(0:
IR+1,0)=IS(0:
IR+1,JR)
IS(0:
IR+1,JR+1)=IS(0:
IR+1,1)
!
!
整个基体上,各个点上的状态都要根据规则改变,而非随机取点改变
DOIX=1,IR
DOJY=1,JR
!
!
ISN=(/IS(IX-1,JY-1),IS(IX-1,JY),IS(IX-1,JY+1),IS(IX,JY-1)
&,IS(IX,JY+1),IS(IX+1,JY-1),IS(IX+1,JY),IS(IX+1,JY+1)/)
E0=COUNT(ISN.NE.IS(IX,JY))
!
如果不是晶粒边界,则跳出,重新循环
IF(E0.EQ.0)CYCLE
!
随机寻找一个相邻点
sss=0
doiii=1,8
NSTATE=ISN(iii)
!
判断与相邻点的能量差,并决定是否改变状态
E=COUNT(ISN.NE.NSTATE)
RD=RAN(ISEED)
IG=NSTATE-IS(IX,JY)
DE=E-E0+IG+2.5*RD-1.25
!
!
用现在状态数组IS1记录边界状态的改变
IF(DE.LT.0.0)then
sss=sss+1
endif
enddo
if(sss.gt.5)IS1(IX,JY)=11-is(ix,jy)
ENDDO
enddo
!
!
每循环20次在显示屏幕上刷新状态(颜色)
DOIX=1,IR
DOJY=1,JR
IF(MOD(T,20).EQ.0)THEN
ISN1=(/IS1(IX-1,JY-1),IS1(IX-1,JY),IS1(IX-1,JY+1),IS1(IX,JY-1)
&,IS1(IX,JY+1),IS1(IX+1,JY-1),IS1(IX+1,JY),IS1(IX+1,JY+1)/)
ISRE=SETCOLOR(IS(IX,JY))
!
如果是边界,定义特别颜色15,加以区分
IF(COUNT(ISN1.NE.IS1(IX,JY)).GT.0)ISRE=SETCOLOR(15)
ISRE=SETPIXEL(IX,JY)
ENDIF
ENDDO
ENDDO
!
!
!
记录循环次数和对应的晶粒面积
WRITE(1,*)T,SQRT(1.0*COUNT(IS.EQ.1))
ENDDO
CLOSE
(1)
END