私はBiologyに触発された問題に対処するためにFiPyを使用しています。PythonソースでPDEを解決する
本質的に、異なる点にソースとシンクがある2D平面を表現したいと思います。ソースは一定のレート(異なるソースは異なるレートを有することができる)で基板を放出し、シンクは固定レートで基板を消費する(異なるシンクは異なるレートを有することができる)。私のコード:
import numpy.matlib
from fipy import CellVariable, Grid2D, Viewer, TransientTerm, DiffusionTerm, ImplicitSourceTerm, ExplicitDiffusionTerm
from fipy.tools import numerix
from time import *
nx = 10
ny = nx
dx = 1.
dy = dx
L = dx*nx
mesh = Grid2D(dx=dx, dy=dy, nx=nx, ny=ny)
arr_grid = numerix.array((
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,),'d')
arr_source = numerix.array((
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0.5,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,),'d')
arr_sink = numerix.array((
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0.5,),'d')
source = CellVariable(mesh=mesh, value = arr_source)
sink = CellVariable(mesh=mesh, value = arr_sink)
phi = CellVariable(name = "solution variable", mesh = mesh, value = arr_grid)
X,Y = mesh.cellCenters
phi.setValue(3.0, where=(X < 2.0) & (X > 1.0))
phi.setValue(-1.0, where=(X < 6.0) & (X > 5.0))
D = 1.
eq = TransientTerm() == DiffusionTerm(coeff=D)
viewer = Viewer(vars=phi, datamin=0., datamax=1.)
steadyState = False
if(steadyState):
print("SteadyState")
DiffusionTerm().solve(var=phi)
viewer.plot()
sleep(20)
else:
print("ByStep")
timeStepDuration = 10 * 0.9 * dx**2/(2 * D)
steps = 500
for step in range(steps):
print(step)
eq.solve(var=phi,
dt=timeStepDuration)
if __name__ == '__main__':
viewer.plot()
これはうまく動作しますが、FiPyは、「非再生可能エネルギー」などのソースを扱い、最終的に私が期待されるように空間全体に均質な濃度を得ます。
X,Y = mesh.cellCenters
phi.setValue(3.0, where=(X < 2.0) & (X > 1.0))
phi.setValue(-1.0, where=(X < 6.0) & (X > 5.0))
をまたに式を変更します:選択肢は削除した
eq = TransientTerm() == DiffusionTerm(coeff=D) + source - sink
ソースおよびシンクが提供する「無限」ソースとシンクこれを変更することはありませんことを考えます。
C:\Python27\python.exe C:/Users/dario_000/PycharmProjects/mesa-test/mesher.py
SteadyState
C:\Python27\lib\site-packages\fipy-3.1.dev134+g64f7866-py2.7.egg\fipy\solvers\scipy\linearLUSolver.py:71: RuntimeWarning: invalid value encountered in double_scalars
if (numerix.sqrt(numerix.sum(errorVector**2))/error0) <= self.tolerance:
そして式が解決されていない。しかし、私は
eq = TransientTerm() == DiffusionTerm(coeff=D) + source - sink
を使用して、定常状態を解くしようとすると、私が取得します。しかし、私は再び使用「の手順で」それを解決した場合:私は期待しているはずだ何
eq = TransientTerm() == DiffusionTerm(coeff=D) + source - sink
が、私はと類似の素敵な画像を取得します:
私が指定する方法上の任意のアドバイス定常状態の解を得ることができるような方法で異なる放射/消費率を持つ、異なる空間的位置にあるソース/シンクとの初期設定?
ありがとうございます!
この質問は、より多くの議論があるFiPyメーリングリストに複製されています。http://thread.gmane.org/gmane.comp.python.fipy/4034を参照してください。 – wd15