0

解決することに興味があります。

\frac{\delta \phi}{\delta t} - D \nabla^2 \phi - \alpha \phi - \gamma \phi = 0

以下は機能していますが、いくつか質問があります。

  1. FiPy でパフォーマンスを向上させることは可能ですか? nx, ny, nz計算時間が長いにもかかわらず、ここではビンが非常に小さいように感じます。配列が非常に大きい理由がわかりません。X, Y, and Z
  2. [0..nx, 0..ny, 0..nz]最初のフレームで拡大されていることに注意してください。すべてのプロットに自動的に範囲を強制するにはどうすればよいですか?
  3. 1.0最初のフレームのデータは、値が で囲まれた点の球です0.0。勾配があるように見えるのはなぜですか? Mayaviは補間していますか?もしそうなら、どうすればこれを無効にできますか?

コード:

from fipy import *
import mayavi.mlab as mlab
import numpy as np
import time

# Spatial parameters
nx = ny = nz = 30  # bins
dx = dy = dz = 1  # Must this be an integer?
L = nx * dx

# Diffusion and time step
D = 1.
dt = 10.0 * dx**2 / (2. * D)
steps = 4

# Initial value and radius of concentration
phi0 = 1.0
r = 3.0

# Rates
alpha = 1.0  # Source coeficcient
gamma = .01  # Sink coeficcient

mesh = Grid3D(nx=nx, ny=ny, nz=nz, dx=dx, dy=dy, dz=dz)
X, Y, Z = mesh.cellCenters  # These are large arrays
phi = CellVariable(mesh=mesh, name=r"$\phi$", value=0.)

src = phi * alpha  # Source term (zeroth order reaction)
degr = -gamma * phi  # Sink term (degredation)

eq = TransientTerm() == DiffusionTerm(D) + src + degr

# Initial concentration is a sphere located in the center of a bounded cube
phi.setValue(1.0, where=( ((X-nx/2))**2 + (Y-ny/2)**2 + (Z-nz/2)**2 < r**2) )

# Solve
start_time = time.time()
results = [phi.getNumericValue().copy()]
for step in range(steps):
    eq.solve(var=phi, dt=dt)
    results.append(phi.getNumericValue().copy())
print 'Time elapsed:', time.time() - start_time

# Plot
for i, res in enumerate(results):
    fig = mlab.figure()

    res = res.reshape(nx, ny, nz)
    mlab.contour3d(res, opacity=.3, vmin=0, vmax=1, contours=100, transparent=True, extent=[0, 10, 0, 10, 0, 10])

    mlab.colorbar()
    mlab.savefig('diffusion3d_%i.png'%(i+1))
    mlab.close()

経過時間:68.2秒

ゼロフレーム

最初のフレーム

2 番目のフレーム

3 番目のフレーム

4

1 に答える 1

4
  1. あなたの質問からはわかりにくいですが、物事を診断する過程で、問題の次元が大きくなるにつれてLinearLUSolverスケーリングが非常に不十分であることを発見しました ( https://github.com/usnistgov/fipy/issues/474を参照)。

    この対称問題では、PySparse は PCG ソルバーを使用し、Trilinos は GMRES を使用する必要があります。これらのいずれもインストールしていない場合は、SciPy スパース ソルバーがデフォルトで LU (理由はわかりません。調査する必要があります) を取得し、3D での動作が非常に遅くなります。ステートメントに追加solver=LinearGMRESSolver()してみてください。eq.solve(...)

    X、Y、Z のサイズに関しては、30*30*30 のセルの立方体を宣言したので、各セルの中心座標ベクトルは 27000 要素の長さになります。に対する別の期待はありましたcellCentersか?

  2. MayaviDaemonクラスをサブクラス化するか、少なくとも Mayavi での表示の設定方法を確認することをお勧めします。つまり、 adata_set_clipperを目的の境界に設定します。

  3. 知らない。

于 2015-11-21T01:59:08.353 に答える