Fipy中的空间依赖扩散

5 投票
1 回答
1241 浏览
提问于 2025-04-18 02:05

我正在使用fipy来模拟线性化的泊松-玻尔兹曼方程,这个方程基本上是这样的:

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

完整的最小示例已经作为一个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.xmesh.y

还有一个建议,可能更好把你的方程改成:

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

这样做可以让:

  • 变量phi在一次计算中隐式求解

  • 加入一个TransientTerm可以让问题更稳定,只需使用一个非常大的时间步长来近似稳态问题

查看我在你的gist上的评论,了解具体的修改。

撰写回答