Фиксированные граничные условия потока в FiPy - PullRequest
2 голосов
/ 10 июля 2020

У меня есть следующий вопрос к этой теме Связанные нелинейные уравнения в FyPi . Мне удалось настроить систему и получить разумные результаты при использовании граничных условий Неймана для всех переменных (то есть при сохранении постоянных концентраций электронов и дырок и потенциалов на границах).

система уравнений

Теперь я хотел бы сравнить ее с ситуацией, когда потоки электронов (n) и дырок (p) связаны соотношениями:

Граничные условия

где n 0 (0), p 0 (0) - равновесные концентрации на левой границе, аналогичные уравнения были бы для правой границы. с - скорость рекомбинации.

Я знаю об этом описании в документации (https://www.ctcms.nist.gov/fipy/documentation/USAGE.html#applying -fixed-flux-boundary-conditions ), но не Я знаю, как это применить.

Поскольку граничные условия учитывают концентрации на краях, должны ли быть переменные n, p, phi , определенные как FaceVariables? Не могли бы вы помочь мне с определением этих граничных условий?

1 Ответ

1 голос
/ 14 июля 2020

Исходный вопрос

Давайте рассмотрим уравнение для электронов. В 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)
...