如何在 fortran、leapfrog 方案中编写积分循环来求解 PDE(平流)?

计算科学 有限差分 正则 平流扩散 微分方程
2021-12-05 03:25:10

我想用 Leapfrog Scheme 的差分有限法数值求解这个方程

ut+vux=0

我正在尝试编写一个解决该 PDE 机智的代码v=1在越级方案(http://www4.ncsu.edu/~zhilin/TEACHING/MA584/Chapter5_fd_fem.pdf第7页)中,该方案使用了两个级别的时间,但是,我不知道如何在我的代码中编写它

ujn+1=ujn1ΔtΔx[uj+1nuj1n]+O(Δt3,Δx2)
所以我想这怎么可能。

do l=1,Nt
t = t + dt
u_n_p_o=u_n_o
u_n_p=u_n

我计算了un1使用 FTCS(centering Difference) 方案

do i=1,Nx-1 
u_n_o(i)= u_n_p_o(i)- (dt/dx)*(u_n_p_o(i+1)- u_n_p_o(i-1))
end do 

实际上u_n_o是正确的吗?

u_n_p_o(i)=u_n_o(i-1) !2do reciclado de variable


do i=1,Nx-1
u_n(i)= u_n_p_o(i)- (dt/dx)*(u_n_p(i+1)-u_n_p(i-1))
end do 

u_e = amp * exp( - ( x - x0 - t)**2 / sigma**2 ) + 1e-20
call save1Ddata(Nx,t,x,u_e,'u_e',1)
call save1Ddata(Nx,t,x,u_n,'u_n',1)
call save1Ddata(Nx,t,x,u_n,'u_n_o',1)
end do

跳蛙有什么特点?我知道在这种情况下,Courant 因子无关紧要(因为它是稳定的);然而,解在其幅度上会在数值上消散。那么如何测试你的数值解呢?

1个回答

有多种方法可以检查代码是否正确。在这种情况下,最好的方法是对您的代码执行收敛检查。这要求您使用越来越小的值执行相同的计算ΔxΔt看看是否证明了预期的收敛速度。对于 PDE 而言,解决此问题的常用方法是在它们之间建立关系,例如 Courant 数。我在https://github.com/mandli/numerical-methods-pdes有一些可能有用的课程笔记,特别是 7-IVP 和 10-Hyperbolic,其中包含一些 Python 代码片段并描述了 Leapfrog 的问题。