5

我正在使用 fipy 对线性化Poisson-Boltzmann 方程进行建模,这本质上是

在此处输入图像描述

我假设我可以建模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)

给予:

在此处输入图像描述

完整的最小示例作为要点发布,为了简短起见,这是相关部分。

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

4

1 回答 1

3

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

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

然后直接在你的方程中使用它

LHS = (DiffusionTerm(coeff = diffusion_coefficient))

只需使用单元中心定义空间变化函数,mesh.x然后mesh.y.

另一个指针,最好将方程式更改为

eq = TransientTerm() == DiffusionTerm(diffusion_coefficient) - ImplicitSourceTerm(phi)

以便

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

  • 添加 aTransientTerm对我来说可以稳定问题,只需使用非常大的时间步长来近似稳态问题

有关更改,请参阅我对您的要点的评论。

于 2014-04-10T20:37:15.917 回答