fipy中的空间依赖扩散

时间:2014-04-09 19:09:44

标签: python fipy

我正在使用fipy来模拟线性化Poisson-Boltzmann equation,这基本上是

enter image description here

我假设我可以将f(x)建模为边界条件。如果epsilon(x)是常量,那么fipy可以处理这个问题:

phi = CellVariable(mesh)

dielectric_solvent = 80.0
dielectric_inner   = 4.0

LHS = (DiffusionTerm(coeff = dielectric_solvent))
RHS = phi
eq = LHS == RHS

dr = np.linalg.norm(mesh.faceCenters, axis=0)
mask = (dr<.5) * mesh.exteriorFaces
phi.constrain(1, mask)

mask = (dr>.5) * mesh.exteriorFaces
phi.constrain(0, mask)   

sol = eq.solve(var=phi)

,并提供:

enter image description here

complete minimal example is posted as a gist,为了缩短这一点,这是相关部分。

我想做的是让epsilon(x)作为空间中的函数而变化,但DiffusionTerm只能取常数。如何实现空间变化的电介质项?

1 个答案:

答案 0 :(得分:3)

FiPy中的任何系数都可以是空间的函数。例如,您可以按如下方式设置扩散系数,

diffusion_coefficient = dielectric_solvent * ((mesh.x > -0.5) & (mesh.x < 0.5))

然后直接在等式中使用

LHS = (DiffusionTerm(coeff = diffusion_coefficient))

使用单元格中心mesh.xmesh.y定义您的空间变化函数。

另一个指针,将等式更改为

可能更好
eq = TransientTerm() == DiffusionTerm(diffusion_coefficient) - ImplicitSourceTerm(phi)

这样

  • 变量phi在一次扫描中隐式解决

  • 添加TransientTerm可以解决我的问题,只需使用非常大的时间步长即可解决稳态问题

请参阅my comment on your gist了解更改。