Fortran Coder

标题: 毕业需求 跪求大师 给指点下程序,要不然不毕业我就自杀 [打印本页]

作者: gegeshishen    时间: 2014-3-31 05:41
标题: 毕业需求 跪求大师 给指点下程序,要不然不毕业我就自杀
元胞自动机模拟单晶长大

[Fortran] 纯文本查看 复制代码
 USE MSFLIB
       PARAMETER IR=400,JR=400
      INTEGERIS(0:IR+1,0:JR+1),TMAX,ISN(1:8),NSTATE,T,NR,IX0,IY0,IX,JY
!!   根据过去状态IS,定义现在状态为IS1;为了突出边界,特别定义ISN1
      INTEGER IS1(0:IR+1,0:JR+1),ISN1(1:8)
      WRITE(*,*)"PLEASE INPUT THE TIMESTEP "
       READ(*,*)TMAX
       ISEED=RTC()
        IRC=IR/2 !=IR*ran(iseed)+1
       JRC=JR/2
!      定义基体体积能为10,晶粒体积能为1
       IS=8
       IS(IRC,JRC)=1
!!   在循环前定义现在状态数组IS1的初始值
      IS1=IS
      OPEN(1,FILE="E:\LUKE.DAT")
      DO T=1,TMAX
!!   每次循环前重新定义过去状态数组IS
      IS=IS1
!      边界条件
            IS(0,0:JR+1)=IS(IR,0:JR+1)
              IS(IR+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)
!!       整个基体上,各个点上的状态都要根据规则改变,而非随机取点改变
         DO IX=1,IR
           DO JY=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
        END DO
!!     每循环20次在显示屏幕上刷新状态(颜色)
      DO IX=1,IR
       DO JY=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)
!            END IF
      ENDDO
      ENDDO
!!
!    记录循环次数和对应的晶粒面积
         WRITE(1,*)T, SQRT(1.0*COUNT(IS.EQ.1))
       ENDDO
       CLOSE(1)
       END   




作者: 楚香饭    时间: 2014-3-31 05:41
楼主的代码有何问题呢?

在我这里可以运行,输入 TIMESTEP 为 300,得到一组变化的图形(我不知道是不是你希望的晶体)

我截了两个时间的图形如下:



另外得到 LUKE.dat 文件,部分如下:
           1   1.000000   
           2   1.732051   
           3   2.449490   
           4   3.464102   
           5   4.472136   
           6   5.099020   
           7   5.744563   
           8   6.480741   
           9   6.855655   
          10   7.681146   
          11   8.366600   
          12   9.273619   
          13   10.53565   
          14   11.57584   
          15   12.40967   
          16   13.30413   
          17   13.92839   
          18   14.93318   
          19   15.81139   
          20   16.91154   
          21   18.05547   
          22   19.13113   
          23   20.04994   
          24   21.11871   
          25   22.00000   
          26   23.04344   
          27   23.93742   
          28   24.95997   
          29   26.13427   
          30   27.11088   
          31   28.12472   


如果楼主对计算结果不满意,可以进行 Debug 调试,查看是哪里的问题。

如果楼主是希望在这里找到对应专业的人来修改计算结果不正确,那难度就很高了。真的。
作者: 珊瑚虫    时间: 2014-3-31 14:11
你的问题具体是什么,这个程序貌似没什么问题,不要激动,先冷静一点
作者: 有赖幽趣    时间: 2014-4-1 15:56
啥意思啊???
作者: fcode    时间: 2014-4-1 16:11
不知道,楼主估计已经自杀了。此贴也有成了人类的未解之谜。
作者: 有赖幽趣    时间: 2014-4-3 17:43
fcode 发表于 2014-4-1 16:11
不知道,楼主估计已经自杀了。此贴也有成了人类的未解之谜。

其实我可以帮他的,但是他一直没回复呢
作者: fcode    时间: 2014-4-3 18:07
有赖幽趣 发表于 2014-4-3 17:43
其实我可以帮他的,但是他一直没回复呢

那今晚你睡觉以后,他应该会托梦给你。
作者: 岸边的鱼    时间: 2014-4-11 21:57
至今无解吗?托梦了吗?




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2