我正在使用fipy来模拟线性化Poisson-Boltzmann equation,这基本上是
我假设我可以将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)
,并提供:
complete minimal example is posted as a gist,为了缩短这一点,这是相关部分。
我想做的是让epsilon(x)
作为空间中的函数而变化,但DiffusionTerm
只能取常数。如何实现空间变化的电介质项?
答案 0 :(得分: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
在一次扫描中隐式解决
添加TransientTerm
可以解决我的问题,只需使用非常大的时间步长即可解决稳态问题
请参阅my comment on your gist了解更改。