我想用FiPy解一个扩散方程,并阅读了他们的一些文档,但似乎找不到任何与写一个扩散项有关的东西,其中包括作为自变量函数的附加项(即空间)。我发现的最接近的东西是在FAQ上,他们建议将其他术语重写为ConvectionTerm
。然而,我相信这只适用于附加项是解变量的函数而不是自变量的情况。例如,我试图用以下扩散项解一维扩散方程(其中导数是自变量x的w.r.t.,y是解变量):
D * sin(x) * Div_x {sin(x) * Grad_x {y}}
我觉得这是一个非常简单的表达式,但我找不到如何用FiPy表示法来表达它。任何帮助都将不胜感激!你知道吗
准确代码:
from fipy import Variable,FaceVariable,CellVariable,Grid1D,ImplicitSourceTerm,TransientTerm,DiffusionTerm,Viewer,ConvectionTerm
from fipy.tools import numerix
D = 1
c0 = 1
ka = 1
r0 = 1
nx = 100
dx = 2*math.pi/100
mesh = Grid1D(nx=nx, dx=dx)
conc = CellVariable(name="concentration", mesh=mesh, value=0.) # This is the "phi" in the docs
valueLeft = c0
valueRight = 0
conc.constrain(valueRight, mesh.facesRight)
conc.constrain(valueLeft, mesh.facesLeft)
timeStepDuration = 0.9 * dx**2 / (2 * D)
steps = 100
show_per_steps = 50
A = 1 / (r0**2 * numerix.sin(mesh.x)[0])
dA = -(numerix.cos(mesh.x)[0])/(r0**2 * numerix.sin(mesh.x)[0]**2)
dsindA = (numerix.cos(mesh.x)[0])**3/(numerix.sin(mesh.x)[0])**2
eqX = TransientTerm() + ImplicitSourceTerm(ka) == DiffusionTerm(D*A*numerix.sin(mesh.x)[0]) - ConvectionTerm(D*dA*numerix.cos(mesh.x)[0])+ D*conc*dsindA
from builtins import range
for step in range(steps):
eqX.solve(var=conc, dt=timeStepDuration)
if __name__ == '__main__' and step % show_per_steps == 0:
viewer = Viewer(vars=(conc), datamin=0., datamax=c0)
viewer.plot()
FiPy允许项的系数是空间的函数。例如,以下在FiPy中工作
在上面,扩散系数是空间的函数。
m.x
是保持细胞中心位置的CellVariable
。numerix
用于启用对FiPy变量的操作,方法与Numpy对Numpy数组的操作相同。你知道吗现在,在上面的问题中,在导数之外有一个
sin(x)
,这在FiPy中是不允许的。所有的东西都需要与FiPy配合使用。所以,我们需要重写这个项,使所有的系数都在导数里面。对于任何一般情况,我们都可以写这使得我们可以用扩散,对流和源来表示这个术语。如果
f=sin(x)
和g=sin(x)
,那么FiPy代码将是包括
...
,因为我不知道完整的公式。你知道吗相关问题 更多 >
编程相关推荐