Fipy中的空间依赖扩散
我正在使用fipy来模拟线性化的泊松-玻尔兹曼方程,这个方程基本上是这样的:
我假设可以把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)
这样就得到了:
完整的最小示例已经作为一个gist发布在这里,为了简洁起见,这里只展示相关部分。
我想做的是让epsilon(x)
在空间中变化,但DiffusionTerm
只能接受常数。我该如何实现空间变化的介电项呢?
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
在一次计算中隐式求解加入一个
TransientTerm
可以让问题更稳定,只需使用一个非常大的时间步长来近似稳态问题
查看我在你的gist上的评论,了解具体的修改。