2017-09-25 18 views
2

enter image description here翻譯2- d的PDE和條件成準確Fipy碼

圖像包括控制方程,初始和邊界condition.It descripe板和流體之間的熱傳遞的問題。 我不知道如何使用fipy編碼包含var的二維問題和邊界條件。 這是我的嘗試。

from fipy import * 
import numpy as np 
#constant 
Pe=2400 
le_L=1/20000 
L_l=20000 
alphas=1 
alphaf=1 
a=1/Pe+le_L 
b=1/Pe+L_l 
Bi=0.4 
c=Bi/Pe*L_l 
#generate 
mesh=Grid2D(dx=1,dy=1) 
Ts=CellVariable(mesh=mesh,name='Ts',value=900) 
Tf=CellVariable(mesh=mesh,name='Tf',value=300) 
#condition 
Ts.faceGrad.constrain([0.],mesh.facesLeft) 
Ts.faceGrad.constrain([0.],mesh.facesRight) 
Ts.faceGrad.constrain([-1.*Bi*(Tf.value-Ts.value)],mesh.facesBottom) 
Ts.faceGrad.constrain([0.],mesh.facesTop) 

Tf.constrain(300,mesh.facesLeft) 
Tf.grad.constrain(0,mesh.facesRight) 



a=CellVariable(mesh=mesh,rank=1) 
a[:]=1 

#eq 
eq1=TransientTerm(var=Ts)==DiffusionTerm(coeff=[[a,b]],var=Ts) 
eq2=TransientTerm(var=Tf)==DiffusionTerm(coeff=[[a,0]],var=Tf)-  
ExponentialConvectionTerm(a,var=Tf)+ImplicitSourceTerm(c,var=Tf)-   
ImplicitSourceTerm(c,var=Ts) 

eq=eq1&eq2 

#solve 
dt=0.1 
steps=100 
viewer=Viewer(vars=(Ts,Tf),datamax=1000,datamin=0) 
for i in range(steps): 
eq.solve(dt=dt) 
viewer.plot() 

我發現它失敗了。我不知道哪裏出了問題,我會歡迎任何幫助;非常感謝! 順便說一句,我想要得到的最終圖像就像enter image description here ......很多thx!

回答

1

[編輯,以解決一般的邊界條件]

下運行,並似乎給自然的結果,你正在尋找:

from fipy import * 
import numpy as np 
#constant 
Pe=2400. 
le_L=1./20000. 
L_l=20000. 
alphasx=alphasy=1. 
alphaf=1. 
Bi=0.4 
c=Bi/Pe*L_l 

Dsxx = alphasx 
Dsyy = alphasy * L_l**2 
Ds = 1./Pe * le_L * (1./alphaf) * Variable([[alphasx, 0.], 
              [0., alphasy * L_l**2]]) 

Df = Variable([[1./Pe * le_L, 0], 
       [0., 0.]]) 

#generate 
mesh=Grid2D(Lx=1.,Ly=1.,nx=100, ny=100) 
Ts=CellVariable(mesh=mesh,name='Ts',value=900.) 
Tf=CellVariable(mesh=mesh,name='Tf',value=900.) 
#condition 
bottom_mask = (mesh.facesBottom * mesh.faceNormals).divergence 
dPR = mesh._cellDistances[mesh.facesBottom.value][0] 
Af = mesh._faceAreas[mesh.facesBottom.value][0] 
bottom_coeff = bottom_mask * Ds[1,1] * Af/(1 + dPR) 

Tf.constrain(300,mesh.facesLeft) 



#eq 
eq1=(TransientTerm(var=Ts)==DiffusionTerm(coeff=Ds,var=Ts) 
    + ImplicitSourceTerm(coeff=bottom_coeff * -Bi, var=Tf) 
    - ImplicitSourceTerm(coeff=bottom_coeff * -Bi, var=Ts)) 
eq2=(TransientTerm(var=Tf)==DiffusionTerm(coeff=Df,var=Tf) 
    -ExponentialConvectionTerm(coeff=[[1.], [0]],var=Tf) 
    +ImplicitSourceTerm(c,var=Tf) 
    -ImplicitSourceTerm(c,var=Ts)) 

eq=eq1&eq2 

#solve 
dt=0.01 
steps=100 
viewer=Viewer(vars=(Ts,Tf),datamax=1000,datamin=0) 
for i in range(steps): 
    eq.solve(dt=dt) 
    viewer.plot() 
  • 我改變了一些係數,以同意你提供的數學。
  • 我固定的擴散係數有由FiPy預期各向異性擴散的形狀
  • 我改變了很多整數到浮動的,因爲整數不FiPy很好地工作
  • 我提供了一個域名,解決了(你的目只有一個單元格,使空間變化不可能)
  • 我減少了時間步
  • 我介紹了我們知道如何處理general boundary conditions最好的方法。這很醜陋,但我認爲它是正確的。

您可能還需要引入掃描來解釋方程和邊界條件之間的非線性依賴關係。

+0

謝謝!你是說通過定義邊界作爲源項可以避免掃描的方式嗎?我可以將邊界條件添加到'for'循環中進行更新,如:對於範圍(步驟)中的i:Ts.faceGrad.constrain([ - 1. * Bi *(Tf.value-Ts.value)],mesh.face sBottom);; eq1 = TransientTerm(var = Ts)== DiffusionTerm(Ds,var = Ts); eq2 = TransientTerm(var = Tf )== DiffusionTerm(Df,var = Tf)-Exponent ialConvectionTerm([[1.],[0]],var = Tf)+ ImplicitSourceTerm(c,var = Tf)--ImplicitSourceTerm(c,var = Ts); eq = eq1&eq2; eq.solve(dt = dt)viewer.plot() –

+0

清掃可能不是必需的。我認爲您的方程/邊界條件中不存在任何非線性依賴關係。線性相關性應該由耦合求解來處理。我不認爲在循環中反覆調用'.constrain()'是個好主意。我寫的資料是我們現在對一般邊界條件的最佳建議。 – jeguyer

+0

我已經瞭解了這個方法。但是這個問題的原型是**從一個長方體的底部到液體頂部的熱傳遞**,所以我編寫了'mask =(m.facesTop * m.faceNormals)。發散 dPR = m._cellDistances [m.facesTop.value] [0] Af = m._faceAreas [m.facesTop.value] [0] coeff_top = mask * Df [1,1] * Af /(1+ dpr)',並使用'eq1 = TransientTerm(var = Ts)== DiffusionTerm(coeff = Ds,var = Ts)\ + ImplicitSourceTerm(coeff = top_coeff * -Bi,var = Tf)\ - 第一個等式的ImplicitSourceTerm(coeff = bottom_coeff * -Bi,var = Ts)'但它不適用...哪裏錯了? –