Fortran Coder

查看: 20872|回复: 15
打印 上一主题 下一主题

[数值问题] 關於超出邊界的問題

[复制链接]

10

帖子

1

主题

0

精华

入门

F 币
50 元
贡献
30 点
跳转到指定楼层
楼主
发表于 2017-4-3 01:42:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
程式檔案txt檔:(我用.f跑)
mam.txt (13.07 KB, 下载次数: 1)
程式內容:
[Fortran] 纯文本查看 复制代码
001                 program sandpile
002                integer Z,h(3000,3000),L,t,ix,iy,an(3000,3000),a,n,na,aa
003                  integer ax1,ay1,ah1(3000,3000),ax2,ay2,ah2(3000,3000)
004                  integer ax3,ay3,ah3(3000,3000)
005                          integer tn(100000),tx(100000),ty(100000),tx1(100000)
006                          integer ty1(1000000),m,i,j,noapi,k,m1,n1,n2,n3,n4
007                  integer a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14
008                  integer a15,a16,a17,a18
009                integer na1,na2,na3,na4,na5,na6,na7,na8,na9,na10,na11
010                          integer na12,na13,na14,na15,na16,na17,na18,na19,na20
011                          integer na21,na22,na23
012                      call CPU_time(time_begin)
013                Z=2
014                L=32
015                  km=8
016                  noap=1000000
017                Do ix=1,L !設ix平面從一到L
018                Do iy=1,L !設iy平面從一到L
019                h(ix,iy)=rand()*Z+1 !晶格內的高度1~4隨機
020                enddo  
021                enddo                
022                     p1=0
023                     p2=0
024                         p3=0
025                     p4=0
026                Do noapi=1,noap
027        if(km.gt.1)then
028                Do ix=1,L
029                Do iy=1,L
030                  ax1=ix
031                  ay1=iy
032                  ah1(ax1,ay1)=h(ix,iy)
033                enddo  
034                enddo
035                          mmx=0
036        mmx1=0
037        na=0
038        aa=0
039        endif
040                  do mm=1,km
041                          n=0
042                  a=0
043                  Do x=1,L
044                Do y=1,L
045                          an(x,y)=0
046                           enddo  
047                enddo    
048                 ix=rand()*L+1
049                 iy=rand()*L+1
050                 t=0
051                 h(ix,iy)=h(ix,iy)+1
052                  if(km.gt.1)then            
053                 if(h(ix,iy).le.Z.and.mmx.eq.1) then
054                            kfc=0
055                           kfc=rand()*2+1
056                   if(kfc.eq.2) mmx=0
057        endif
058                           if(h(ix,iy).le.Z.and.mmx.eq.0) then
059                   do ix=1,L
060                   do iy=1,L
061        ax2=ix
062        ay2=iy
063        ah2(ax2,ay2)=h(ix,iy)
064        enddo
065        enddo
066        mmx=1
067        endif
068        endif
069                           if(h(ix,iy).gt.Z) then
070                    n=n+1
071                        an(ix,iy)=an(ix,iy)+1
072                    if(an(ix,iy).eq.1) then
073                                a=a+1
074                                else
075                    a=a+0
076                    end if
077                  h(ix,iy)=h(ix,iy)-Z
078                    t=1
079                  tn(1)=1
080                    tx(1)=ix
081                    ty(1)=iy
082 101                 m=0
083                   DO k=1,tn(t)
084                      ixtmp=tx(k)
085                      iytmp=ty(k)
086 
087                   DO 90 kn=1,Z
088                     
089                        call neighbor(noapi,ixtmp,iytmp,kn,L,i,j,nd)
090 
091                       if(nd.eq.1) goto 90
092 
093                                   h(i,j)=h(i,j)+1
094                     if(h(i,j).gt.Z) then
095                         n=n+1
096                                         an(i,j)=an(i,j)+1
097                       if(an(i,j).eq.1) then
098                                   a=a+1
099                                   else
100                       a=a+0
101                       end if
102                       m=m+1
103                       tx1(m)=i
104                      ty1(m)=j
105                       h(i,j)=h(i,j)-Z
106                     endif
10790                   continue
108                      enddo
109                    if(m.ge.1) then
110                      t=t+1
111                      tn(t)=m
112                      DO m1=1,m
113                       tx(m1)=tx1(m1)
114                       ty(m1)=ty1(m1)
115                      enddo
116                        goto 101
117                    endif                
118                   endif
119        if(km.gt.1)then
120      if(mmx1.eq.1.and.mmx.eq.0) then
121      if(aa.gt.a.and.mmx1.eq.1)mmx1=0
122        if(aa.eq.a.and.mmx1.eq.1)then
123        kfc1=0
124        kfc1=rand()*2+1
125        if(kfc1.eq.2) mmx1=0
126        endif
127        endif
128      if(mmx1.eq.0.and.mmx.eq.0) then
129                       do ix=1,L
130                   do iy=1,L
131        ax3=ix
132        ay3=iy
133        ah3(ax3,ay3)=h(ix,iy)
134        enddo
135        enddo
136        na=n
137        aa=a
138        mmx1=1
139      endif
140                 Do ax1=1,L
141                Do ay1=1,L
142                    ix=ax1
143                  iy=ay1
144                  h(ix,iy)=ah1(ax1,ay1)
145                enddo  
146                enddo
147                        endif       
148                     enddo
149       if(km.gt.1)then
150        if(mmx.eq.1) then
151                do ax2=1,L
152        do ay2=1,L
153      ix=ax2
154        iy=ay2
155        h(ix,iy)=ah2(ax2,ay2)
156      enddo
157        enddo
158        a=0
159        n=0
160        endif
161        if(mmx1.eq.1.and.mmx.eq.0) then
162      do ax3=1,L
163        do ay3=1,L
164      ix=ax3
165        iy=ay3
166        h(ix,iy)=ah3(ax3,ay3)
167      enddo
168        enddo
169        a=aa
170        n=na
171        endif
172        endif
173                          n1=0
174                      n2=0
175        n3=0
176        n4=0
177                      DO i1=1,L
178                      DO j1=1,L
179                             if(h(i1,j1).eq.1) n1=n1+1
180                     if(h(i1,j1).eq.2) n2=n2+1
181                         if(h(i1,j1).eq.3) n3=n3+1
182                     if(h(i1,j1).eq.4) n4=n4+1
183                   enddo
184                   enddo
185                                         if(2**(0).le.a.and.a.lt.2**(1)) a1=a1+1
186                             if(2**(1).le.a.and.a.lt.2**(2)) a2=a2+1
187                             if(2**(2).le.a.and.a.lt.2**(3)) a3=a3+1
188                             if(2**(3).le.a.and.a.lt.2**(4)) a4=a4+1
189                             if(2**(4).le.a.and.a.lt.2**(5)) a5=a5+1
190                             if(2**(5).le.a.and.a.lt.2**(6)) a6=a6+1
191                             if(2**(6).le.a.and.a.lt.2**(7)) a7=a7+1
192                             if(2**(7).le.a.and.a.lt.2**(8)) a8=a8+1
193                             if(2**(8).le.a.and.a.lt.2**(9)) a9=a9+1
194                             if(2**(9).le.a.and.a.lt.2**(10)) a10=a10+1
195                             if(2**(10).le.a.and.a.lt.2**(11)) a11=a11+1
196                             if(2**(11).le.a.and.a.lt.2**(12)) a12=a12+1
197                             if(2**(12).le.a.and.a.lt.2**(13)) a13=a13+1                    
198                                         if(2**(13).le.a.and.a.lt.2**(14)) a14=a14+1
199                         if(2**(14).le.a.and.a.lt.2**(15)) a15=a15+1
200                         if(2**(15).le.a.and.a.lt.2**(16)) a16=a16+1
201                         if(2**(16).le.a.and.a.lt.2**(17)) a17=a17+1
202                         if(2**(17).le.a.and.a.lt.2**(18)) a18=a18+1
203                                         if(2**(0).le.n.and.n.lt.2**(1)) na1=na1+1
204                             if(2**(1).le.n.and.n.lt.2**(2)) na2=na2+1
205                             if(2**(2).le.n.and.n.lt.2**(3)) na3=na3+1
206                             if(2**(3).le.n.and.n.lt.2**(4)) na4=na4+1
207                             if(2**(4).le.n.and.n.lt.2**(5)) na5=na5+1
208                             if(2**(5).le.n.and.n.lt.2**(6)) na6=na6+1
209                             if(2**(6).le.n.and.n.lt.2**(7)) na7=na7+1
210                             if(2**(7).le.n.and.n.lt.2**(8)) na8=na8+1
211                             if(2**(8).le.n.and.n.lt.2**(9)) na9=na9+1
212                             if(2**(9).le.n.and.n.lt.2**(10)) na10=na10+1
213                             if(2**(10).le.n.and.n.lt.2**(11)) na11=na11+1
214                             if(2**(11).le.n.and.n.lt.2**(12)) na12=na12+1
215                             if(2**(12).le.n.and.n.lt.2**(13)) na13=na13+1                    
216                                         if(2**(13).le.n.and.n.lt.2**(14)) na14=na14+1
217                         if(2**(14).le.n.and.n.lt.2**(15)) na15=na15+1
218                         if(2**(15).le.n.and.n.lt.2**(16)) na16=na16+1
219                         if(2**(16).le.n.and.n.lt.2**(17)) na17=na17+1
220                         if(2**(17).le.n.and.n.lt.2**(18)) na18=na18+1
221                             if(2**(18).le.n.and.n.lt.2**(19)) na19=na19+1
222                             if(2**(19).le.n.and.n.lt.2**(20)) na20=na20+1
223                             if(2**(20).le.n.and.n.lt.2**(21)) na21=na21+1
224                             if(2**(21).le.n.and.n.lt.2**(22)) na22=na22+1
225                             if(2**(22).le.n.and.n.lt.2**(23)) na23=na23+1
226                              p1=p1+real(n1)/real(L*L)
227                                  p2=p2+real(n2)/real(L*L)
228                              p3=p3+real(n3)/real(L*L)
229                                  p4=p4+real(n4)/real(L*L)
230                    enddo
231                         write(*,*) 'n1=',na1,',','a1=',a1
232                         write(*,*) 'n2=',na2,',','a2=',a2
233                         write(*,*) 'n3=',na3,',','a3=',a3
234                         write(*,*) 'n4=',na4,',','a4=',a4
235                         write(*,*) 'n5=',na5,',','a5=',a5
236                         write(*,*) 'n6=',na6,',','a6=',a6
237                         write(*,*) 'n7=',na7,',','a7=',a7
238                         write(*,*) 'n8=',na8,',','a8=',a8
239                         write(*,*) 'n9=',na9,',','a9=',a9
240                         write(*,*) 'n10=',na10,',','a10=',a10
241                         write(*,*) 'n11=',na11,',','a11=',a11
242                         write(*,*) 'n12=',na12,',','a12=',a12
243                         write(*,*) 'n13=',na13,',','a13=',a13
244                         write(*,*) 'n14=',na14,',','a14=',a14
245                         write(*,*) 'n15=',na15,',','a15=',a15
246                         write(*,*) 'n16=',na16,',','a16=',a16
247                                         write(*,*) 'n17=',na17,',','a17=',a17
248                                         write(*,*) 'n18=',na18,',','a18=',a18
249                         write(*,*) 'n19=',na19
250                         write(*,*) 'n20=',na20
251                         write(*,*) 'n21=',na21
252                         write(*,*) 'n22=',na22
253                         write(*,*) 'n23=',na23
254                                write(*,*) '1的平均',p1/real(noap)
255                                write(*,*) '2的平均',p2/real(noap)
256                                write(*,*) '3的平均',p3/real(noap)
257                                write(*,*) '4的平均',p4/real(noap)
258                   call CPU_time(time_end)
259                 write(*,*) 'time=',time_end-time_begin,'s'
260                    read(*,*)
261                   stop
262                  end
263 
264 
265                      subroutine neighbor(noapi,i1,j1,k,L,i,j,nd)
266                   k=rand()*4+1
267                                  nd=0
268                      if(k.eq.1) then
269                        i=i1-1
270                        if(i.eq.0) nd=1
271                        j=j1
272                      endif
273                    if(k.eq.2) then
274                        i=i1
275                        j=j1+1
276                        if(j.eq.L+1) nd=1
277                      endif
278                      if(k.eq.3) then
279                        i=i1+1
280                        if(i.eq.L+1) nd=1
281                        j=j1
282                      endif
283                    if(k.eq.4) then
284                        i=i1
285                        j=j1-1
286                        if(j.eq.0) nd=1
287                      endif
288                      return
289                      end



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

838

帖子

2

主题

0

精华

大宗师

F 币
3937 元
贡献
2339 点
沙发
发表于 2017-4-3 11:00:51 | 只看该作者
a1,a2 这些变量,没有初始化。

QQ截图20170403105947.png (18.02 KB, 下载次数: 466)

QQ截图20170403105947.png

10

帖子

1

主题

0

精华

入门

F 币
50 元
贡献
30 点
板凳
 楼主| 发表于 2017-4-3 11:06:41 | 只看该作者
我是想要他們累加,所以沒初始化,沒初始化會出問題嗎?
我修改看看,謝謝

10

帖子

1

主题

0

精华

入门

F 币
50 元
贡献
30 点
地板
 楼主| 发表于 2017-4-3 11:56:27 | 只看该作者
數值初始化了,還是有問題耶

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
5#
发表于 2017-4-3 16:27:45 | 只看该作者
楼主可以用 /traceback /check:bounds 来看到底哪个数组出问题了

10

帖子

1

主题

0

精华

入门

F 币
50 元
贡献
30 点
6#
 楼主| 发表于 2017-4-3 16:41:49 | 只看该作者
請問要加在哪裡?

10

帖子

1

主题

0

精华

入门

F 币
50 元
贡献
30 点
7#
 楼主| 发表于 2017-4-3 22:48:09 | 只看该作者
本帖最后由 希萊雅桑 于 2017-4-3 22:49 编辑
Villain 发表于 2017-4-3 16:27
楼主可以用 /traceback /check:bounds 来看到底哪个数组出问题了

是在這裡檢查嗎?

10

帖子

1

主题

0

精华

入门

F 币
50 元
贡献
30 点
8#
 楼主| 发表于 2017-4-3 22:50:14 | 只看该作者
li913 发表于 2017-4-3 11:00
a1,a2 这些变量,没有初始化。

我是想要他們累加,所以沒初始化
初始化了還是有問題

10

帖子

1

主题

0

精华

入门

F 币
50 元
贡献
30 点
9#
 楼主| 发表于 2017-4-3 22:52:18 | 只看该作者
Villain 发表于 2017-4-3 16:27
楼主可以用 /traceback /check:bounds 来看到底哪个数组出问题了

我的km設在4沒有這個問題,設在8就有問題了,不知道是哪裡出界了,可是檢查程式碼都有正確壓QAQ

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
10#
发表于 2017-4-4 09:12:11 | 只看该作者
希萊雅桑 发表于 2017-4-3 22:52
我的km設在4沒有這個問題,設在8就有問題了,不知道是哪裡出界了,可是檢查程式碼都有正確壓QAQ:-dizz ...

看了看你的代码,貌似你是在用随机函数。debug了一下,程序报错的位置确实是rand所在的行。
就我所知,fortran中没有rand这个随机函数,fortran产生随机数的方法是call random_number(x),为了让随机数更均匀,一般用 call random_seed()来提供种子。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-5-2 03:35

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表