python - 具有时变狄利克雷边界条件的非稳态扩散-平流方程

标签 python fipy

我想设置 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,根据此 Variable 约束 n_model 并更新 t 的值 在每个时间步。这对我来说快了 4 倍。

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 - 具有时变狄利克雷边界条件的非稳态扩散-平流方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56237476/

相关文章:

python - 具有非恒定容量的传导扩散热二维模型

python - 存储旧值 FiPy

python - 单个查看器中的两个等高线图 - Python FiPy

python - 添加具有翻转值的重复 Pandas 行

python - 在 Fipy 中求解多个偏微分方程

python - pandas 查找多行中特定列中的最小值

python - Django 管道编译器不工作

python - 如何将 ODE 系统与 FEM 系统相结合

python - Python 中的简单感知器

python - 使用导入文件中的变量给出名称错误,即使已使用 'global'