Исходный вопрос
Давайте рассмотрим уравнение для электронов. В FiPy это будет выглядеть примерно так:
eqn = TransientTerm(var=var_n) == G - R - DiffusionTerm(coeff_phi, var=phi) + DiffusionTerm(coeff_n, var=var_n) + boundary_condition
Чтобы решить эту проблему с правильным граничным условием, нам нужно обнулить поток внутри и снаружи домена в условиях диффузии в левой части. и добавить поток для граничного условия. coeff_phi
и 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)