0

fipy を使用して、計算ドメイン内の孤立した領域の拡散問題を解決しています。回路図の写真を参照してください。下: 孤立した BC の間にフラックスがなく、周期的な BC にフラックスが存在する場合

この問題は、@Daniel Wheeler の助けを借りて定義された可変係数を使用して Fipy でモデル化されfipy.FaceVariableています。

しかし、計算速度は、有限差分法の 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)
4

1 に答える 1

0

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

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

于 2016-12-02T15:50:03.543 に答える