我一直在利用 NumPy 数组和 SciPy 稀疏矩阵的强大功能在 Python 2.7 中开发一个轻量级的有限元库。一般的想法是,给定一个网格和一个有限元,双线性形式和(稀疏)矩阵之间或多或少是一一对应的。然后,用户可以按照他或她认为合适的方式使用生成的矩阵。
让我举一个典型的例子,在这个例子中,我们用单位载荷在单位平方中求解泊松方程。
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 版本的代码可以在这里找到。