吾生有涯 学海无涯
析模有界 知识无界

Julia CFD|10 二维Burgers方程

二维Burgers方程描述为:

对其进行离散,可表示为:

整理成迭代形式为:

Julia代码

using PyPlot
matplotlib.use("TkAgg")

nx = 41
ny = 41
nt = 120
c = 1
dx = 2 / (nx - 1)
dy = 2 / (ny - 1)
sigma = 0.0009
nu = 0.01
dt = sigma * dx * dy / nu;

x = range(0, 2, length = nx)
y = range(0, 2, length = ny)

u = ones((ny, nx))
v = ones((ny, nx))
comb = ones((ny, nx))

# 初始条件
u[floor(Int, 0.5 / dy):floor(Int, 1 / dy),floor(Int, 0.5 / dx):floor(Int, 1 / dx),] .= 2
v[floor(Int, 0.5 / dy):floor(Int, 1 / dy),floor(Int, 0.5 / dx):floor(Int, 1 / dx),] .= 2

PyPlot.plot_wireframe(x,y,u,cmap=ColorMap("coolwarm"))
PyPlot.show()

绘制初始条件分布如下图所示。

迭代计算代码如下所示。

for n in 1:nt
un =copy(u)
vn =copy(v)
u[2:end-1,2:end-1] = un[2:end-1,2:end-1] - dt/dx*un[2:end-1,2:end-1].*(un[2:end-1,2:end-1]-un[2:end-1,1:end-2])-
dt/dy*vn[2:end-1,2:end-1].*(un[2:end-1,2:end-1]-un[1:end-2,2:end-1])+
nu*dt/dx^2*(un[2:end-1,3:end]-2*un[2:end-1,2:end-1]+un[2:end-1,1:end-2])+
nu*dt/dy^2*(un[3:end,2:end-1]-2*un[2:end-1,2:end-1]+un[3:end,2:end-1])

v[2:end-1,2:end-1] = vn[2:end-1,2:end-1] - dt/dx*un[2:end-1,2:end-1].*(vn[2:end-1,2:end-1]-vn[2:end-1,1:end-2])-
dt/dy*vn[2:end-1,2:end-1].*(vn[2:end-1,2:end-1]-vn[1:end-2,2:end-1])+
nu*dt/dx^2*(vn[2:end-1,3:end]-2*vn[2:end-1,2:end-1]+vn[2:end-1,1:end-2])+
nu*dt/dy^2*(vn[3:end,2:end-1]-2*vn[2:end-1,2:end-1]+vn[3:end,2:end-1])

u[1,:] .= 1
u[end,:] .= 1
u[:,1] .= 1
u[:,end] .= 1

v[1,:] .= 1
v[end,:] .= 1
v[:,1] .= 1
v[:,end] .= 1

显示最终结果。

fig = PyPlot.figure(figsize=(11,7), dpi=100)
wire1 = PyPlot.plot_wireframe(x,y,u,color="b")
# fig2=PyPlot.figure(figsize=(11,7),dpi=100)
# wire2 = PyPlot.plot_wireframe(x,y,v,color="k")
PyPlot.xlabel("x(m)")
PyPlot.ylabel("y(m)")
PyPlot.zlabel("u(m/s)")
PyPlot.show()

最终分布如下图所示。


完整代码如下所示。

using PyPlot
matplotlib.use("TkAgg")

nx = 41
ny = 41
nt = 120
c = 1
dx = 2 / (nx - 1)
dy = 2 / (ny - 1)
sigma = 0.0009
nu = 0.01
dt = sigma * dx * dy / nu;

x = range(0, 2, length = nx)
y = range(0, 2, length = ny)

u = ones((ny, nx))
v = ones((ny, nx))
comb = ones((ny, nx))

# 初始条件
u[floor(Int, 0.5 / dy):floor(Int, 1 / dy),floor(Int, 0.5 / dx):floor(Int, 1 / dx),] .= 2
v[floor(Int, 0.5 / dy):floor(Int, 1 / dy),floor(Int, 0.5 / dx):floor(Int, 1 / dx),] .= 2

# PyPlot.plot_wireframe(x,y,u,cmap=ColorMap("coolwarm"))
# PyPlot.show()

for n in 1:nt
un =copy(u)
vn =copy(v)
u[2:end-1,2:end-1] = un[2:end-1,2:end-1] - dt/dx*un[2:end-1,2:end-1].*(un[2:end-1,2:end-1]-un[2:end-1,1:end-2])-
dt/dy*vn[2:end-1,2:end-1].*(un[2:end-1,2:end-1]-un[1:end-2,2:end-1])+
nu*dt/dx^2*(un[2:end-1,3:end]-2*un[2:end-1,2:end-1]+un[2:end-1,1:end-2])+
nu*dt/dy^2*(un[3:end,2:end-1]-2*un[2:end-1,2:end-1]+un[3:end,2:end-1])

v[2:end-1,2:end-1] = vn[2:end-1,2:end-1] - dt/dx*un[2:end-1,2:end-1].*(vn[2:end-1,2:end-1]-vn[2:end-1,1:end-2])-
dt/dy*vn[2:end-1,2:end-1].*(vn[2:end-1,2:end-1]-vn[1:end-2,2:end-1])+
nu*dt/dx^2*(vn[2:end-1,3:end]-2*vn[2:end-1,2:end-1]+vn[2:end-1,1:end-2])+
nu*dt/dy^2*(vn[3:end,2:end-1]-2*vn[2:end-1,2:end-1]+vn[3:end,2:end-1])

u[1,:] .= 1
u[end,:] .= 1
u[:,1] .= 1
u[:,end] .= 1

v[1,:] .= 1
v[end,:] .= 1
v[:,1] .= 1
v[:,end] .= 1
end

fig = PyPlot.figure(figsize=(11,7), dpi=100)
wire1 = PyPlot.plot_wireframe(x,y,u,color="b")
# fig2=PyPlot.figure(figsize=(11,7),dpi=100)
# wire2 = PyPlot.plot_wireframe(x,y,v,color="k")
PyPlot.xlabel("x(m)")
PyPlot.ylabel("y(m)")
PyPlot.zlabel("u(m/s)")
PyPlot.show()

本篇文章来源于微信公众号: CFD之道

赞(0) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《Julia CFD|10 二维Burgers方程》
文章链接:https://www.topcfd.cn/12737/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册