周围是否有“轻量级”的FEM软件包?


9

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

它们的共同点是:它们非常“重”。首先,安装通常非常麻烦。其次,它们的接口/ API很繁琐-您必须将整个想法转化为相应库的思想。这也意味着很难满足特殊要求或现有代码的互操作性和可扩展性。

其他项目(例如随机示例)Boost,LibIGL,Aztec(线性求解器),Eigen或CGAL证明,绝对有可能编写功能强大的库,这些接口可以通过非常精简的界面无缝集成到C ++或Python代码中,而无需安装超重的框架。

FEM是否有真正轻巧的包装?我不是在寻找简单,自动的求解器-我是在寻找一个提供强大功能,同时保持精益接口,与常见数据结构(例如C ++ STL)互操作性以及轻量级安装(例如仅标题)的库。


1
您是否在询问FEM库或FEM应用程序?
nicoguaro

2
“在保持精简界面的同时提供强大的功能”并不矛盾。我使用Fenics和deal.ii,它的安装甚至使用起来都不难。Fenics带有可轻松安装的二进制文件。deal.II具有许多安装选项,例如通过Linuxbrew,Homebrew,Candi等。我建议选择其中一种并对其进行很好的学习。一旦您跨过了最初的学习曲线,它将获得很好的回报。我使用Fenics解决小问题,快速测试一些想法并进行一些教学。对于更大的问题,并行计算,我更喜欢交易。两者都有很好的文档。
cfdlab '16

1
@PraveenChandrashekar:强大的功能和精益接口绝对不矛盾。例如查看libigl,boost或Numpy。是的,Fenics似乎易于使用,但是例如将其集成到现有应用程序中将很麻烦。假设您有一个小游戏,您需要集成实时FEM代码(仅作为示例)。
迈克尔

2
我同意@PraveenChandrashekar的观点,但除此之外,我认为所提出的问题是无法回答的。至少,您需要提供要使用FEM解决的PDE的示例,以及希望“轻量级”库提供哪些功能来帮助您完成此任务的示例。
比尔·格林

1
我想到的一个简单的是SfePy,我下载了它,它是7 MB。我还检查了Hermes,它的大小为10 MB,虽然我没有尝试过(但是我已经尝试过Agros 2D)。这里还有更多选项:en.wikipedia.org/wiki/List_of_finite_element_software_packages
nicoguaro

Answers:


10

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


4

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

IMHO PETSc尽可能轻巧。它只需要C / Fortran编译器和Python(仅用于配置),您就可以在5分钟内在笔记本电脑上构建该库。同样,FE代码最复杂的部分是并行汇编和求解,而PETSc会同时处理这两个问题。其余的(例如元素级别的计算)非常简单。

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


1
在这种情况下,“并行装配”到底是什么意思?仅仅是矩阵/向量元素的通信,还是还有更多?我半透彻地阅读了该手册,但是我对组装并没有太多了解(除了线性求解器中的通信)(手册:mcs.anl.gov/petsc/petsc-current/docs/manual.pdf
Michael

4

我可以推荐坚果

坚果至少满足您的“轻量”要求。

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

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


这是一个非常有趣的项目!我没有意识到这一点,目标似乎与我的目标非常相似。他们肯定有一些不错的演示视频...
knl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.