私はNumPy配列とSciPy疎行列の力を利用するPython 2.7で軽量の有限要素ライブラリを開発しています。一般的な考え方は、メッシュと有限要素が与えられた場合、双線形形式と(スパース)行列の間に1対1の対応があるということです。次に、ユーザーは結果として得られた行列を、自分が適切だと思うときに使用できます。
単位負荷のある単位正方形でポアソン方程式を解く標準的な例を紹介します。
from spfem.mesh import MeshTri
from spfem.asm import AssemblerElement
from spfem.element import ElementTriP1
from spfem.utils import direct
# Create a triangular mesh. By default, the unit square is meshed.
m=MeshTri()
# Refine the mesh six times by splitting each triangle into four
# subtriangles repeatedly.
m.refine(6)
# Combine the mesh and a type of finite element to create
# an assembler. By default, an affine mapping is used.
a=AssemblerElement(m,ElementTriP1())
# Assemble the bilinear and linear forms. The former outputs
# a SciPy csr_matrix and the latter outputs linear NumPy array.
A=a.iasm(lambda du,dv: du[0]*dv[0]+du[1]*dv[1])
b=a.iasm(lambda v: 1.0*v)
# Solve the linear system in interior nodes using
# a direct solution method provided by SciPy.
x=direct(A,b,I=m.interior_nodes())
# Visualize the solution using Matplotlib.
m.plot3(x)
m.show()
他のコメント:
- 私の目標は、厳密な収束ユニットテストを記述して、たとえば、それぞれの基準での理論的な収束率が得られることを確認することです。テストは変更ごとに自動的に実行されます。
- 新しい要素の実装は非常に簡単です。
プロジェクトはGitHubにあります。
Python 3バージョンのコードはここにあります。