2016-12-01 30 views
0

私はfipyを使って、計算領域の分離された領域の拡散問題を解決しています。回路図を参照してください。 @Daniel Wheelerの助けを借りて、fipy.FaceVariableによって定義されたvaring coeffを持つFipyでモデル化されます。Fipyの効率を上げる方法

しかし、計算速度は私のコマンドを満たすことができませんでした。これは、有限差分法を使ったサイモンコードよりもはるかに遅いです。 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コードについてのいくつかの詳細は、明示的または暗黙的であるように便利かもしれません。また、FiPyの手順がCythonコードと比べてどれほど長いかについて詳しく説明しています。 – wd15

答えて

0

Cythonコードが明示的であれば、それは時間ステップの制限があります。 FiPyは暗黙的なので、安定性のためタイムステップの制限はありません。タイムステップサイズが大きくなると精度に問題が生じることがあります。上記の問題の時間ステップサイズを10倍にして10ステップを実行すると(100ではなく)、ソリューションは少し変わりますが、結果をプロットすると同様に見えます。 FiPyを使用することの有用性と利点は、問題の性質、高精度が要求されるのか、エンジニアリングのソリューションだけであるのかによって異なります。

また、FiPyの最初のステップは、可変リレーションシップとキャッシングデータを構築するために非常に遅いことに注意してください。たとえば、上記のコードでは、最初のタイムステップは〜1秒かかりますが、その後のタイムステップは〜0.1秒です。これは、FiPyとの時間比較を行う際に注目に値する。

関連する問題