Re: [問題] 解暫態方程式

看板Fortran作者 (terry)時間13年前 (2011/04/27 16:49), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/3 (看更多)
※ 引述《lprsdmn (ziv)》之銘言: : 我要使用差分法解一個波動方程式 : 假設是二維的 : 這樣要解的是u : 所以宣告u(100,100,100) : 前兩個分別是X方向和Y方向的網格數,後面那個是t : 也就是u(x,y,t) : 假設我給dt是0.01 : 總時間長T給定1 : 這樣就有了100格,一切都很順利 : 我想改的問題來了~ : 今天我想寫一個副程式sub來解上面的波動方程式 : 但是時間方面我想改成以下這樣 : do it=1, 1000 : call sub : end do : it每跑一步就是跑了一個dt : 我想讓他跑1000步,也就是不會被限制宣告那邊就要給他設定t的網格數 : 所以就不用設定時間總長 : 請問我該如何做呢? 我的意思就是在這個步驟 do i=1,nxstep-1 do j=1,nystep-1 do k=1,ntime u(i,j,k+1)=2*u(i,j,k)-u(i,j,k-1)+c*c*((dt/dx)**2*(u(i+1,j,k)-2*u(i,j,k)& +u(i-1,j,k))+(dt/dy)**2*(u(i,j+1,k)-2*u(i,j,k)+u(i,j-1,k)))+100*dt*dt end do end do end do u(:,:,k+1)的計算只需要用到u(:,:,k-1)和u(:,:,k)這兩個 所以你可以用一個叫temp1的儲存u(:,:,k-1),temp2儲存u(:,:,k) 然後下一個dt的u(:,:,k+1)可以只用temp1和temp2就算出來,然後在這裡輸出 跟著把u(:,:,k)存到temp1, u(:,:,k+1)存到temp2就可以算u(:,:,k+2)了 所以並不需要真的用到(100,100,1000)那麼大 然後步數也跟dt沒什麼關係, 要多少步就loop多少次 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 116.49.39.76

04/28 11:26, , 1F
非常感謝...但我還是試不出來QQ 可以更詳細一點嗎
04/28 11:26, 1F
就是不要宣告(100,100,1000)的array, 只需要temp1(100,100), temp2(100,100), u(100,100)這3個 然後迴圈裡你原來的u(i,j,k)用temp1取代,u(i,j,k-1)用temp2取代,下一步的解就存到u 還有記得更新temp1 temp2 ※ 編輯: terryys 來自: 116.49.55.117 (04/28 11:51)
文章代碼(AID): #1DjzYjbL (Fortran)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 3 篇):
文章代碼(AID): #1DjzYjbL (Fortran)