原始问题
让我们只考虑电子方程。在 FiPy 中,它看起来像这样,
eqn = TransientTerm(var=var_n) == G - R - DiffusionTerm(coeff_phi, var=phi) + DiffusionTerm(coeff_n, var=var_n) + boundary_condition
为了用正确的边界条件解决这个问题,我们需要将左侧扩散项中进出域的通量归零,并添加边界条件的通量。coeff_phi
and coeff_n
是取决于各种参数的扩散系数。coeff_phi
还取决于n_var
以及。为了将助焊剂的使用归零,
coeff_phi.constrain(0., mesh.facesLeft)
coeff_n.constrain(0., mesh.facesLeft)
要构建边界条件,请使用:
boundary_condition = (mesh.facesLeft * s * (n_var.faceValue - n0) / charge).divergence
我假设n0
随着时间的推移而变化,所以应该是Variable
对象根据其与时间的关系在时间步中更新。
我假设s
是某种恒定的值。
将系数定义为 0(评论中的问题)
为了澄清,有两种方法可以在边界上保持零系数。
使用约束
给定一个定义为 FaceVariables 上的操作的系数,则以下内容将按预期工作(将左侧保持为零)。
from fipy import Grid1D, FaceVariable
mesh = Grid1D(nx=10, dx=0.1)
var0 = FaceVariable(mesh=mesh, value=1 - mesh.x.faceValue)
var1 = var0 * var0
print('before constraint:', var1)
var1.constrain(0, where=mesh.facesLeft)
print('after constraint:', var1)
var0[0] = 10.0
print('after var0 reset:', var1)
乘以~mesh.facesLeft
这是使用约束的另一种方法,可能更容易控制和理解。如果您不相信约束会做正确的事情,请使用此选项。~mesh.facesLeft
是一个布尔数组,因此可以像约束一样使用。
from fipy import Grid1D, FaceVariable
mesh = Grid1D(nx=10, dx=0.1)
var0 = FaceVariable(mesh=mesh, value=1 - mesh.x.faceValue)
var1 = var0 * var0 * ~mesh.facesLeft
print('using ~mesh.facesLeft:', var1)
var0[0] = 10.0
print('after var0 reset:', var1)