Перевод PDE в правильный синтаксис Fipy

Мне было интересно, как закодировать следующее уравнение в FiPy:

Рассматриваемое запутанное уравнение

(Если кому-то интересно, это происходит от этого типа модели ). У меня небольшие проблемы с переводом третьего термина справа в код FiPy. В этом примере A и B являются переменными.

Я пробовал что-то в форме:

(ImplicitSourceTerm(coeff=chi_A) * (B.getGrad()) / \
 (numerix.sqrt(1 + lambda_ * (B.getGrad())^2))).getGrad()

Но я полагаю, что нельзя .getGrad () что-то, что не является переменной. Я был бы рад любой помощи; огромное спасибо!


person Snakelet    schedule 03.09.2016    source источник


Ответы (1)


Представление термина в вопросе является только явным представлением. Есть два способа представить термин неявным образом.

Одно уравнение для A

Предполагая, что только A решается для (одно уравнение для A), тогда рассматриваемый член может быть представлен как ConvectionTerm.

ConvectionTerm(coeff=chi_A * B.getGrad() / \
               numerix.sqrt(1 + lambda_ * B.grad.mag**2), var=A)

См. Это FAQ.

Множественные уравнения для A и B

Если A решается вместе с B (несколько уравнений), то можно связать уравнения так, чтобы рассматриваемый член мог быть диффузионным членом с B в качестве решаемой переменной (зависимая переменная для члена),

DiffusionTerm(coeff=chi_A * A / \
              numerix.sqrt(1 + lambda_ * B.grad.mag**2), var=B)

Затем необходимо связать уравнения для A и B,

coupled_eqn = eqn_A & eqn_B

См. этот пример.

Этот выбор (совмещенный) лучше, поскольку явное ограничение временного шага на B более жесткое, чем ограничение временного шага на A для рассматриваемого термина.

Примечание

Синтаксис (B.getGrad())^2 в вопросе неверен, он должен быть B.grad.mag**2.

person wd15    schedule 06.09.2016
comment
Уважаемый wd15, это элегантный ответ, и спасибо, что обнаружили синтаксическую ошибку. Когда я вызываю решающую программу, я все еще получаю сообщение об ошибке. В нем говорится, что коэффициент должен иметь ранг 0 для переменной решения ранга 0. Как вы думаете, это связано с формулировкой термина или это результат использования неправильного подхода к решению? (Обратите внимание, что я использовал метод множественных уравнений для кодирования уравнения). - person Snakelet; 09.09.2016
comment
@Snakelet, коэффициент должен иметь ранг 0 ... ошибка обычно означает, что коэффициент имеет неправильную форму для члена, то есть это вектор, а не скалярная величина. Возможно, вы могли бы опубликовать свой код на pastebin или github для отладки. - person wd15; 12.09.2016