2016-10-28 30 views
1

我想在深度(h(t))隨時間變化的域上求解簡單的擴散方程(dT/dt = K d2T/dx2)。因此得到的等式是:FiPy - 域延伸/幀增長

dT/dt = K/h^2 d2T/dx2 + z/h dh/dt dT/dz 

其中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是變量被求解,hh_old在使用基於一些式setValue每次掃描或時間步長explicilty更新。此外,最後一項可以分成明確並根據h_t是如何評價一個隱含的源

- h_t/h * T -> - fipy.ImplicitSourceTerm(1/dt) + h_old/h/dt * 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 = mesh,value = z)' - 有沒有更好的方法? h_t從字段本身計算'h_t = A * f(T)'在z = h,然後用於一個簡單的更新'h_new = h_old + dt * h_t'我猜你的分割源項的建議wouldn'在這裏工作? 謝謝! –