2016-12-01 155 views
0

我正在使用fipy解決計算域中孤立區域的擴散問題。參見原理圖。如下: where there is no flux between isolated BC, and flux exists at periodic BC如何提高Fipy效率

這個問題在Fipy模型下,在@Daniel Wheeler的幫助下通過fipy.FaceVariable定義varing coeff。

但是,計算速度無法滿足我的命令,這比使用有限差分法的cython代碼慢得多。如果我想加速fipy計算,我該怎麼辦? 這裏是我的演示代碼:

from pylab import * 
from numpy import * 
import fipy 
from scipy.spatial import Delaunay 
from fipy.variables.cellVariable import CellVariable 
from fipy.terms.transientTerm import TransientTerm 
from fipy.terms.diffusionTerm import DiffusionTerm 
from fipy.viewers import Viewer 

import time 


nx, ny = 100.0, 100.0 
dx, dy = 1.0, 1.0 
mesh = fipy.PeriodicGrid2D(dx=dx, dy=dy, nx=nx, ny=ny) 
x, y = mesh.cellCenters 
D1 = 10.0 
D2 = 1.0 

X, Y = mesh.faceCenters 

print x 
phi = CellVariable(name="Carbon", mesh=mesh, value=0.0) 
coeff = fipy.FaceVariable(mesh=mesh, value=10.0) 

pos1 = X == 50.0 
pos2 = Y == 50.0 
pos = pos1+ pos2 
coeff[pos] = 0 
posA1 = logical_and(x >= 20.0, x <= 30.0) 
posA2 = logical_and(y >= 20.0, y <= 30.0) 
posA = logical_and(posA1, posA2) 
posB1 = logical_and(x >= 20.0, x <= 30.0) 
posB2 = logical_and(y >= 70.0, y <= 80.0) 
posB = logical_and(posB1, posB2) 
posC1 = logical_and(x >= 70.0, x <= 80.0) 
posC2 = logical_and(y >= 20.0, y <= 30.0) 
posC = logical_and(posC1, posC2) 
posD1 = logical_and(x >= 70.0, x <= 80.0) 
posD2 = logical_and(y >= 70.0, y <= 80.0) 
posD = logical_and(posD1, posD2) 

phi[posA] = 10 
phi[posB] = 20 
phi[posC] = 100 
phi[posD] = 30 

eq = TransientTerm() == DiffusionTerm(coeff=coeff) 
timeStepDuration = 10 * 0.9 * 1.0**2/(2 * 1.0) 
steps = 100 

for step in range(steps): 
    eq.solve(var=phi, dt=timeStepDuration) 

viewer = Viewer(vars=phi) 
viewer.plot() 

time.sleep(60) 
+0

關於Cython代碼的一些細節可能很方便,就像它是顯式的還是隱式的。此外,有關與Cython代碼相比,FiPy的步驟有多長的更多細節。 – wd15

回答

0

如果用Cython代碼是明確的,那麼它將有一個時間步長限制。 FiPy是隱含的,因此穩定性沒有時間限制。隨着時間步長的增加,準確度可能會出現問題。如果上述問題中的時間步長增加了10倍,並且運行了10個步驟(而不是100個),則解決方案會稍微變化,但在繪製結果時看起來很相似。使用FiPy的效用和好處取決於問題的性質以及是否需要高精度或者僅僅是工程解決方案。

此外,請注意FiPy的第一個時間步驟非常慢,因爲它正在構建變量關係和緩存數據。例如,在上面的代碼中,第一個時間步需要1秒,而後面的時間步需要約0.1秒。在與FiPy進行時間比較時,這值得注意。