我使用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只能取一个常量。如何实现空间变化的介电项?
发布于 2014-04-10 20:37:15
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在一次扫描中隐式求解。TransientTerm使问题稳定下来,只需用一个很大的时间步骤来逼近一个稳态问题。有关更改,请参见我对你的要点的评论。
https://stackoverflow.com/questions/22971859
复制相似问题