是否有任何“轻量级”FEM 封装?

计算科学 有限元 Python C++ 宠物 芬尼克斯
2021-12-24 07:06:08

基本上,FEM 似乎是一个几乎“解决”的问题。现有许多强大的框架,如 Trilinos、PETSc、FEniCS、Libmesh 或 MOOSE。

他们有一个共同点:他们非常“重量级”。首先,安装通常是超级痛苦的。其次,它们的接口/API 又厚又重——你必须将你的整个想法转化为相应库的想法。这也意味着,特殊要求或现有代码的互操作性和可扩展性是困难的。

其他项目,如(随机示例)Boost、LibIGL、Aztec(线性求解器)、Eigen 或 CGAL,证明完全有可能编写强大的库,无缝集成到 C++ 或 Python 代码中,具有非常简洁和干净的界面,无需安装一个超重的框架。

FEM 有真正轻量级的软件包吗?我不是在寻找简单、自动的求解器——我在寻找一个库,它提供强大的功能,同时保持简洁的界面、与常见数据结构的互操作性(例如 C++ STL)和轻量级安装(例如,仅标头)。

3个回答

我一直在利用 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 版本的代码可以在这里找到。

我觉得你有些困惑。PETSc 与 Fenics、Libmesh、Moose 等不同。事实上,所有这些(重量级)软件包都将 PETSc 用于线性代数。

恕我直言,PETSc 尽可能轻巧。它只需要 C/Fortran 编译器和 Python(仅用于配置),您可以在 5 分钟内在笔记本电脑上构建库。此外,FE 代码中最复杂的部分是并行组装和求解,而 PETSc 兼顾两者。其余的(例如,元素级计算)相当简单。

Trillinos,OTOH 不仅仅是一个线性代数框架,例如,您提到的 Aztec(线性求解器)是其中的一部分。在某些方面,Trillinos 的 Aztec 可以与 PETSc 进行比较。

我可以推荐nutils

nutils至少满足您的一些“轻量级”要求。

  • 它是纯 Python 且易于安装,因为它仅依赖于标准 Python 库numpyscipymatplotlib
  • 因此,它非常适合互操作。至少开发商声称

“暴露的对象是原生 python 类型或允许轻松转换以利用第三方工具。”