在 Advection-Diffusion 方程中实现零通量条件的代码
Implementing code for zero flux condition in Advection-Diffusion equation
我想知道如何为 avdection-diffusion 定义的方程实现零通量条件:

分析以上可知满足零磁通条件时:
.
所以,我用有限差分方案写了一个代码:
import numpy as np
import matplotlib.pyplot as plt
nx = 101
dx = 0.01
nt = 200
c = -1.
D = .1
dt = 0.0001
u = np.zeros(nx)
u[0:50] = 2
un = u.copy()
for n in range(nt):
for i in range(1, nx-1):
un = u.copy()
u[i] = un[i] + D * dt /dx**2* (un[i+1]-2*un[i]+un[i-1])-\
c*dt/dx*(un[i] - un[i-1])
u[0] = u[1]*(c*dx+D)/D #BC zero flux at left side
plt.plot(np.linspace(0, 1, 101), u)
plt.ylim(0, 4)
plt.xlim(0, 1.)
plt.show()
哪里
u[1]*(c*dx+D)/D
表示零通量条件,其结果来自:

但是结果不满足零通量条件,所以质量随时间不守恒
任何人都可以帮助我发现我的错误吗?
提前致谢,
解决此问题的最简单方法是 explicit upwind finite volume 方案。设 u[i]
表示 u
在单元格 i
上的平均值,q[i]
表示单元格 i
外的通量,则两个方程式为
- 保护:
du[i]/dt + (q[i]-q[i-1])/dx = 0
- 流量:
q[i] = c*u[i] - D*(u[i+1]-u[i])/dx
在一个时间步中,您使用 u[0:nx]
的已知值来计算 interior 通量 q[0:nx]
。然后使用这些计算变化 du[0:nx]
,以及 flux 边界条件 q[-1]=q[nx]=0
(即不需要幽灵节点)。
(请注意,对于此类问题,您可能应该在 Computational Science StackExchange 处提问。)
我已经找到问题的答案了,我会在这里分享,以防有人觉得有用。
我想为平流扩散方程建立zero-flux保守边界条件,这代表罗宾边界条件。鉴于在 SO 中几乎不可能编写等式,您可以在此处查看一个很好的解释:https://scicomp.stackexchange.com/questions/5434/conservation-of-a-physical-quantity-when-using-neumann-boundary-conditions-appli
下面的代码将RBC加入到平流扩散方程中,解决了我的问题。
# 1. Import libraries
import numpy as np
import matplotlib.pyplot as plt
# 2. Set up parameters
nx = 101
dx = 0.01
nt = 7000
c = .5
D = .1
dt = 0.0001
# 3. Initial conditions
u = np.zeros(nx)
u[10:35] = 4
un = u.copy()
# 4. Solving the PDE
for n in range(nt):
un = u.copy()
for i in range(1, nx-1):
u[i] = un[i] + D * dt / dx ** 2 * (un[i+1]-2*un[i]+un[i-1]) -\
c*dt/dx*(un[i] - un[i-1])
u[0] = u[1] - dx * c / D * u[1] # Robin Boundary Condition LEFT
u[-1] = u[-2] + dx * c / D * u[-1] # Robin Boundary Condition RIGHT
# 5. Plot results
plt.plot(np.linspace(0, 1, 101), u)
plt.ylim(0, 4)
plt.xlim(0, 1.)
plt.show()
我想知道如何为 avdection-diffusion 定义的方程实现零通量条件:
分析以上可知满足零磁通条件时:
.
所以,我用有限差分方案写了一个代码:
import numpy as np
import matplotlib.pyplot as plt
nx = 101
dx = 0.01
nt = 200
c = -1.
D = .1
dt = 0.0001
u = np.zeros(nx)
u[0:50] = 2
un = u.copy()
for n in range(nt):
for i in range(1, nx-1):
un = u.copy()
u[i] = un[i] + D * dt /dx**2* (un[i+1]-2*un[i]+un[i-1])-\
c*dt/dx*(un[i] - un[i-1])
u[0] = u[1]*(c*dx+D)/D #BC zero flux at left side
plt.plot(np.linspace(0, 1, 101), u)
plt.ylim(0, 4)
plt.xlim(0, 1.)
plt.show()
哪里
u[1]*(c*dx+D)/D
表示零通量条件,其结果来自:
但是结果不满足零通量条件,所以质量随时间不守恒
任何人都可以帮助我发现我的错误吗?
提前致谢,
解决此问题的最简单方法是 explicit upwind finite volume 方案。设 u[i]
表示 u
在单元格 i
上的平均值,q[i]
表示单元格 i
外的通量,则两个方程式为
- 保护:
du[i]/dt + (q[i]-q[i-1])/dx = 0
- 流量:
q[i] = c*u[i] - D*(u[i+1]-u[i])/dx
在一个时间步中,您使用 u[0:nx]
的已知值来计算 interior 通量 q[0:nx]
。然后使用这些计算变化 du[0:nx]
,以及 flux 边界条件 q[-1]=q[nx]=0
(即不需要幽灵节点)。
(请注意,对于此类问题,您可能应该在 Computational Science StackExchange 处提问。)
我已经找到问题的答案了,我会在这里分享,以防有人觉得有用。
我想为平流扩散方程建立zero-flux保守边界条件,这代表罗宾边界条件。鉴于在 SO 中几乎不可能编写等式,您可以在此处查看一个很好的解释:https://scicomp.stackexchange.com/questions/5434/conservation-of-a-physical-quantity-when-using-neumann-boundary-conditions-appli
下面的代码将RBC加入到平流扩散方程中,解决了我的问题。
# 1. Import libraries
import numpy as np
import matplotlib.pyplot as plt
# 2. Set up parameters
nx = 101
dx = 0.01
nt = 7000
c = .5
D = .1
dt = 0.0001
# 3. Initial conditions
u = np.zeros(nx)
u[10:35] = 4
un = u.copy()
# 4. Solving the PDE
for n in range(nt):
un = u.copy()
for i in range(1, nx-1):
u[i] = un[i] + D * dt / dx ** 2 * (un[i+1]-2*un[i]+un[i-1]) -\
c*dt/dx*(un[i] - un[i-1])
u[0] = u[1] - dx * c / D * u[1] # Robin Boundary Condition LEFT
u[-1] = u[-2] + dx * c / D * u[-1] # Robin Boundary Condition RIGHT
# 5. Plot results
plt.plot(np.linspace(0, 1, 101), u)
plt.ylim(0, 4)
plt.xlim(0, 1.)
plt.show()