python - 具有时间相关 Dirichlet 边界条件的非稳态扩散-平流方程
问题描述
我想设置 fipy 来求解具有正弦边界的一维扩散对流方程。
我最终得到以下代码:
from fipy import *
import numpy as np
import matplotlib.pylab as plt
def boundary(t):
return 1 + 0.1 * np.sin(6*np.pi*t)
nx = 50
dx = 1./nx
mesh = Grid1D(nx=nx, dx=dx)
n_model = CellVariable(name="density",mesh=mesh,value=1., hasOld=True)
D_model = CellVariable(name="D",mesh=mesh,value=mesh.x[::-1]*5.+3)
v_model = FaceVariable(name="v",mesh=mesh,value=1. )
v_model = (-1*mesh.x) * [[1.]]
n_model.constrain(boundary(0.), mesh.facesRight)
equation = (TransientTerm(var=n_model) == DiffusionTerm(coeff=D_model,var=n_model) \
+ ExponentialConvectionTerm(coeff=v_model,var=n_model))
timeStepDuration = 0.9 * dx**2 / (2 * 1) * 1e2
time_length = 2
steps = np.int(time_length/timeStepDuration)
t = 0
n_out = np.zeros((steps,nx))
import time
t1 = time.time()
for step in xrange(steps):
t += timeStepDuration
n_model.updateOld()
n_out[step] = n_model.globalValue
n_model.constrain(boundary(t), mesh.facesRight)
equation.solve(dt=timeStepDuration)
print "Execution time: %.3f"%(time.time()-t1)
plt.figure()
plt.imshow(n_out.T)
plt.colorbar()
plt.show()
代码运行良好,我得到了合理的结果。然而,它也很慢,大约 3.5 秒的周期。有没有更好的方法来实现这一点?或者我怎样才能加快系统速度?
解决方案
你不想继续重新约束n_model
。约束不会被替换;他们都被相继申请。相反,做我们在examples.diffusion.mesh1D
. 声明t
为,对此进行Variable
约束并在每个时间步更新 的值。这对我来说快了大约 4 倍。n_model
Variable
t
from fipy import *
import numpy as np
import matplotlib.pylab as plt
def boundary(t):
return 1 + 0.1 * np.sin(6*np.pi*t)
nx = 50
dx = 1./nx
mesh = Grid1D(nx=nx, dx=dx)
n_model = CellVariable(name="density",mesh=mesh,value=1., hasOld=True)
D_model = CellVariable(name="D",mesh=mesh,value=mesh.x[::-1]*5.+3)
v_model = FaceVariable(name="v",mesh=mesh,value=1. )
v_model = (-1*mesh.x) * [[1.]]
t = Variable(value=0.)
n_model.constrain(boundary(t), mesh.facesRight)
equation = (TransientTerm(var=n_model) == DiffusionTerm(coeff=D_model,var=n_model) \
+ ExponentialConvectionTerm(coeff=v_model,var=n_model))
timeStepDuration = 0.9 * dx**2 / (2 * 1) * 1e2
time_length = 2
steps = np.int(time_length/timeStepDuration)
n_out = np.zeros((steps,nx))
import time
t1 = time.time()
for step in xrange(steps):
t.setValue(t() + timeStepDuration)
n_model.updateOld()
n_out[step] = n_model.globalValue
equation.solve(dt=timeStepDuration)
print "Execution time: %.3f"%(time.time()-t1)
plt.figure()
plt.imshow(n_out.T)
plt.colorbar()
plt.show()
推荐阅读
- python - Python 套接字错误 300 '永久移动'
- json - jq-更新一个json的值添加一个前缀
- c# - 带有简单注入器的 ASP.NET Core 2.1 服务定位器返回 null
- c++ - 如何在双精度数组上定义比较运算符(小于)?
- javascript - jQuery和另一个js之间的冲突
- java - Postgres 引起:java.lang.NoClassDefFoundError: 无法初始化类 org.postgresql.util.GT
- azure-media-services - Azure 媒体服务 v3 - 事件网格 - 删除资产不会触发任何存储事件
- amazon-web-services - AWS:ALB 立即或 130 秒后响应
- xaml - 在 Xamarin.Forms 中使用 FlexLayout 将 UI 元素“相互叠加”
- java - 数字选择器从相反方向增加数字