Re: [問題] 解暫態方程式
※ 引述《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
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)
討論串 (同標題文章)
Fortran 近期熱門文章
PTT數位生活區 即時熱門文章