作者terryys (terry)
看板Fortran
标题Re: [问题] 解暂态方程式
时间Wed Apr 27 16:49:46 2011
※ 引述《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
1F:推 lprsdmn:非常感谢...但我还是试不出来QQ 可以更详细一点吗 04/28 11:26
就是不要宣告(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)