2016-10-28 4 views
1

Я пытаюсь решить уравнение простой диффузии (dT/dt = K d2T/dx2) в области, глубина которой (h (t)) изменяется во времени. Таким образом, полученное уравнение:FiPy - растягивание области/рост фрейма

где z теперь фиксированный 0-> 1 домен.

Новый термин - адвекция кадра, и я пытаюсь включить его как таковой, но я борюсь с пространственно зависимым коэффициентом.

Когда я включаю его за пределы срока конвекции:

mesh.cellCenters[0]*PowerLawConvectionTerm(...) 

Я получаю эту ошибку:

TermMultiplyError: Must multiply terms by int or float 

Но если я реорганизовать уравнение, поэтому пространственная зависимость внутри термина конвекции:

PowerLawConvectionTerm(coeff=(mesh.cellCenters[0]**2,),...) 

Я получаю другую ошибку при решении уравнения:

AssertionError: assert(len(id1) == len(id2) == len(vector)) 

Каков правильный способ включения этих терминов? Есть ли глупая ошибка, которую я делаю где-то?

ответ

1

Лучший способ для решения этой проблемы может быть разделить последний срок на две части так, что уравнение в FiPy написано

fipy.TransientTerm() == fipy.DiffusionTerm(K/h**2) \ 
         + fipy.ConvectionTerm(z * z_hat * h_t/h) \ 
         - h_t/h * T 

В FiPy не может быть мультипликаторы вне производной этого термина так что требуется дополнительный источник. При этом предполагается, что

K = 1. ## some constant 
h = fipy.Variable(...) ## variable that is continuously updated 
h_old = fipy.Variable(...) ## variable that is continuously updated 
h_t = (h - h_old)/dt ## variable dependent on h and h_old 
T = fipy.CellVariable(...) 
z_hat = [0, 1] ## vector required for convection term coefficient 

T является переменным существом решено, h и h_old являются explicilty обновляются при каждой развертке или временным шаге, используя setValue основанный на некоторой формуле. Кроме того, последнее слагаемое можно разделить на явный и неявный источник

- h_t/h * T -> - fipy.ImplicitSourceTerm(1/dt) + h_old/h/dt * T 

в зависимости от того, как h_t оценивается. Неявный источник должен сделать решение очень стабильным.

+0

Как вы определяете свой z? Я использую 'mesh.cellCenters [0]' (сейчас я работаю в 1D, но это станет вертикальным измерением), и я получаю AssertError выше. Я нашел обходное решение здесь [http://scicomp.stackexchange.com/questions/20784/diffusion-with-space-dependent-drift-in-fipy], где ваша комбинация 'z * z_hat' становится' CellVariable (сетка = mesh, value = z) '- Есть ли лучший способ? h_t рассчитывается по самим полям 'h_t = A * f (T)' при z = h, а затем используется в простом обновлении 'h_new = h_old + dt * h_t' Я предполагаю, что ваше предложение о разделении исходных условий не будет" Т работа здесь? Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^