[請益] 迴圈跳不出來??

看板Fortran作者 (**米)時間12年前 (2012/12/18 02:55), 編輯推噓1(1014)
留言15則, 4人參與, 最新討論串1/1
請教大家,我在做一個一維擴散的模擬, 在我一步一步debug之後,知道問題在迴圈的部分,好像會無法結束?? 可以成功編譯成執行檔,但一旦開始執行,就無法結束了,也無法輸出結果.. 以下是程式碼,麻煩版有幫我看看哪邊出錯了?? program diffusion   !1-D diffusion implicit none !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !宣告區 real L,D,J,C,T,F,smallt !L=length,D=diffusivity,J=diffusion flux,C=initial concentration !F=Fourier's number, smallt=time interval real, parameter :: defaultL = 10 real, parameter :: defaultD = 1.03 real, parameter :: defaultJ = 1E-5 real, parameter :: defaultC = 1E-4 real array1(-1:10001),array2(-1:10001) !the length is divided into 10000 pieces, 10001 nodes, 2 virtual nodes integer*8 p, pmax, x !p=pace, x=location character mode !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !輸入設定參數 write(*,*) "press ""1"" to select the default values, or""2"" to input them" read(*,*) mode if(mode=="1") then L = defaultL D = defaultD J = defaultJ C = defaultC else write(*,*) "please input the length:" read(*,*)L write(*,*) "please input the diffusivity:" read(*,*)D write(*,*) "please input the diffusion flux:" read(*,*)J write(*,*) "please input the initial concentration:" read(*,*)C end if write(*,*) "please input the time:" read(*,*)T !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !計算用到的參數 smallt = 0.25*L*L/D/10**8 pmax = T/smallt F = D*smallt/(L*L)*10**8 array1 = C array2 = C !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !這裡就是出錯的開始!!! do p=1,pmax do x=0,10000 array1(-1) = J*L/10000/D + array1(0) array1(10001) = array1(10000) + array1(0) - array1(-1) array2(x)=F*(array1(x+1)+array1(x-1))+(1-2*F)*array1(x) end do array1 = array2 end do !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !將陣列輸出到文字檔 open(unit=10,file="diffusion1.txt") do x=-1,10001 write(10,*) array1(x) end do STOP END -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.211.150

12/18 09:52, , 1F
應該不是無法結束,是迴圈太大,pmax還要乘上10000
12/18 09:52, 1F

12/18 12:25, , 2F
smallt = 0.25*L*L/D/10**8 檢查你的smallt的值
12/18 12:25, 2F

12/18 12:26, , 3F
如果沒有意外應該是0,導致pmax極大,迴圈跑不完
12/18 12:26, 3F

12/18 12:26, , 4F
改成smallt = 0.25*L*L/D/10.0**8.0 試試看
12/18 12:26, 4F

12/18 12:30, , 5F
不僅是這個地方,例如array1(-1) = J*L/10000/D
12/18 12:30, 5F

12/18 12:30, , 6F
這都會'讓你的結果與預期的不同
12/18 12:30, 6F
謝謝~ 目前我把迴圈數設定成100的話都可以執行成功,所以應該是迴圈太大的問題, 0.25*L*L/D/10.0**8.0有改過但還是跑不完~ 這問題滿棘手的..因為有些參數就是得這麼小阿......QQ ※ 編輯: YmemY 來自: 140.112.4.209 (12/18 13:46)

12/18 13:56, , 7F
t=10,pamx=41200000,x=412000000000,粉大的迴圈,如果參數沒
12/18 13:56, 7F

12/18 13:56, , 8F
錯,也只能丟著給它跑啦
12/18 13:56, 8F

12/18 13:57, , 9F
你可以再把迴圈裡跟x無關的拿出來,可能可以快一咪咪
12/18 13:57, 9F

12/18 14:00, , 10F
呵三樓的精簡化本人常幹,不過它這個程式很簡單,只有兩行多餘
12/18 14:00, 10F

12/18 14:00, , 11F
差別不大啦.重點在t要多大,t=0.0001夠嗎?
12/18 14:00, 11F
t最多可能要到100...囧 不過我想或許我的D數字錯了,他可能是10^-10這麼小,所以smallt可以不用這麼小.. 雖然試了一次還是行不通 但方向應該沒錯 再搞搞看...謝謝

12/18 14:17, , 12F
t=1,十分鐘跑完,I7 2600套裝很便宜電腦,更好的電腦得會更快
12/18 14:17, 12F

12/18 14:18, , 13F
這樣很快了,我的程式都要跑一周以上,有三週還沒跑完的
12/18 14:18, 13F
挖賽!!!!! 原來真的要這麼久XD ※ 編輯: YmemY 來自: 140.112.211.150 (12/18 22:53)

12/19 22:32, , 14F
建議把你所計算的數值的order提高一點,電腦在進行計算
12/19 22:32, 14F

12/19 22:33, , 15F
的時候,其精度會有差別...
12/19 22:33, 15F
感謝各位的提示,經由將參數調整地平易近人一點後,模擬出正確的結果了! ※ 編輯: YmemY 來自: 140.112.211.150 (12/28 02:08)
文章代碼(AID): #1GpsgXWj (Fortran)
文章代碼(AID): #1GpsgXWj (Fortran)