我一直在利用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版本的代码。