Робин граничные условия для PDE - FipyPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Робин граничные условия для PDE - Fipy

Сообщение Anonymous »

Я пытаюсь использовать Fipy для решения системы PDE. В этом случае у меня есть соединение из PDE, и мне нужно решить для двух компонентов векторного поля (M1 и M2). Однако мне не нужно решать это одновременно. В процедуре я сначала решаю для M1, используя ранее вычисленные значения M2. Кроме того, эти системы имеют граничные условия типа Робина. Мне было интересно, имел ли кто -нибудь какой -нибудь опыт настройки такого типа граничных условий (Робин) с Fipy? Я посмотрел на документацию, но тип робина до н.э., показанного там, отличается от моего (у меня нет конвекционного термина в BC) < /p>
Выражение для PDE, связанное с M1, дается как система PDE. < /P>
Сопутствующие граничные условия для этой системы не имеют типа Robin, а выражение здесь - это то, что я вышеупомянулся, и в этом типе. решить для M2 в этой единственной системе (которая выполняется на следующем шаге). Это означает, что я использую некоторые предварительно вычисленные значения для M2 при решении этой конкретной системы.

Код: Выделить всё

n_mesh = self.local_mesh.faceNormals
betta = (1 - self.alpha) / (self.alpha)
alpha_f = FaceVariable(name="alpha_f", mesh=self.local_mesh, rank=1)
alpha_f.setValue(betta * n_mesh, where=self.bf_mask == True)
c11 = CellVariable(name="c11",mesh=self.local_mesh)
c11_f = FaceVariable(name="c11_f",mesh=self.local_mesh)

c1_d_c2 = CellVariable(name="c1_d_c2",mesh=self.local_mesh)
c1_d_c2_f = FaceVariable(name="c1_d_c2_f",mesh=self.local_mesh)

m2_previous = CellVariable(name="m2_previous",mesh=self.local_mesh)
m1 = CellVariable(name="m1",mesh=self.local_mesh)
C_T_P_1 = CellVariable(name="c_t_p_1",mesh=self.local_mesh,rank=1)
C_T_P_1_f = FaceVariable(name="c_t_p_1",mesh=self.local_mesh,rank=1)
m_1_b = ImplicitSourceTerm(coeff=alpha_f.divergence)
b1_f = FaceVariable(name="b1_f", mesh=self.local_mesh, rank=1)

c11.setValue(c11_val[0:self.N_cells])
c11_f.setValue(c11.arithmeticFaceValue)
c11_f.setValue(0.0,where=self.bf_mask)

c1_d_c2.setValue(c1_d_c2_val[0:self.N_cells])
c1_d_c2_f.setValue(c1_d_c2.arithmeticFaceValue)
c1_d_c2_f.setValue(0.0,where=self.bf_mask)

m2_previous.setValue(self.m2_iter[0:self.N_cells])
C_T_P_1.setValue(np.stack((r11[0:self.N_cells],r12[0:self.N_cells]),axis=0))
C_T_P_1_f.setValue(C_T_P_1.arithmeticFaceValue)
C_T_P_1_f.setValue(0.0,where=self.bf_mask)

b1_f_np = np.zeros(self.bf_mask.shape)
b1_f_np[self.bf_mask == True] = b_array[self.N_cells:, 0, 0]

r1_vec = np.zeros((2,self.bf_mask.shape[0]))
r1_vec[0,self.bf_mask==True] = r11[self.N_cells:]
r1_vec[1,self.bf_mask==True] = r12[self.N_cells:]
b1_f.setValue(betta * b1_f_np * n_mesh , where=self.bf_mask)

##We set the equations -m1
m1_eq = -DiffusionTerm(coeff=c11_f) == -(c1_d_c2_f * m2_previous.faceGrad).divergence + (C_T_P_1_f).divergence  - b1_f.divergence + m_1_b
Первый термин Diffusion -term - это просто диффузионный термин, связанный с LHS в системе, которую я пытаюсь решить. -(c1_d_c2_f * m2_previous.facegrade) .divergence соответствует одной и той же операции, но с M2 (на основе документации из Fipy, это то, как я должен вычислить этот термин Soure (https://www.ctcms.nist.gov/fipy/documentation/faq.html. (C_T_P_1_F) .divergence соответствует RHS в исходном выражении PDE.
Наконец, b1_f.divergence и m_1_b соответствует исправлениям, которые я добавляю к граничным лицам, но и тем же учету для условий границы Robin. Конечно, изменяя роль между M1 и M2. < /p>
Теперь дело в том, что в принципе я могу решить систему через

Код: Выделить всё

  m1_eq.solve(var=m1)
. Однако сначала во всех решениях, которые я получаю, не совсем то, что я бы ожидал. Я устанавливаю граничные консервации. Для этого моя идея заключалась в том, чтобы принять исходное граничное условие, выразить градиент M1 как функцию остальных терминов в выражении граничного условия, а затем замените его как поток, связанный с граничными гранями в вычислении потока для граничных ячеек.
Это причина, по которой я присваиваю значения. Стандартное выражение устанавливается на 0 для граничных грани и всех терминов, связанных с граничными условиями, соответственно (в данном случае, только B1_F и M_1_B имеют ненулевые записи, соответствующие граничным лицам. Кроме того, выражение, которое я использую для потока на границах из границ. Термин всегда дается на RHS, однако в моем случае у меня нет другого невысокого термина. (Я заметил, что если я не включаю знак минус перед дифузионным , то решение, которое я получу, переворачивается вдоль x и y по отношению к тому, что я ожидаю)
Может быть, у кого -то есть какое -то представление о том, что могло бы происходить или что я мог бы проверить?>

Подробнее здесь: https://stackoverflow.com/questions/795 ... r-pde-fipy
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Решение PDE задом наперед с Fipy
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Мой код неправильно рассчитывает время обработки и время прибытия (раунд-робин)
    Anonymous » » в форуме C++
    0 Ответы
    78 Просмотры
    Последнее сообщение Anonymous
  • Как устранить ошибку Робин: вход «factor_vars» должен быть любым из входов «context_vars»
    Anonymous » » в форуме Python
    0 Ответы
    47 Просмотры
    Последнее сообщение Anonymous
  • Fipy Viewer - отсутствующие значения в легенде [закрыто]
    Anonymous » » в форуме Python
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous
  • Как утекать графические графические услуги решателей PDE в Python?
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»