小型项目的良好有限元库

计算科学 线性代数 有限元 稀疏矩阵 显卡 库达
2021-12-22 11:10:58

我目前正在从事这个项目,并且我有一个使用有限元方法的基本结构分析仪。本质上,我将每个块变成一组桁架,构建一个将每个桁架的力相互关联的刚度矩阵,并将其输入 Matlab。

下一个任务是让我加快速度,最好是使用一些 GPU 加速。由于 Matlab 尚不支持 GPU 中的备用矩阵计算,因此我正在研究其他可用的库。我正在考虑采用的一种方法是使用CULA Sparse的求解器来加快速度。但也有许多有限元软件包可能会做得更好,并节省我构建矩阵和检索结果的性能开销。

我想知道的是,这些有限元软件包中的哪一个适合我?这是一个很难的问题,所以这里有一些限定词,按重要性排序:

  • 它是程序的一部分,因此库比完整的建模包更受欢迎。
  • 建立并有据可查
  • GPU 加速
  • 使用方便
  • 它应该快速计算相对较小的数据集的结果(大约在一秒钟内解决一个 10,000 个元素的系统)
  • 学生的价格应该在300美元以下。
  • Java 和 C 中的接口。

有人有推荐吗?还是继续我的 CULA 想法会更好?

编辑:杰德布朗要求我更详细地给出我正在做的计算。我不是土木工程师,但我与其中一位工程师谈到了制作外观和感觉都不错的结构分析系统的可能性。我已经有了一个原型。这是它的工作原理。

  1. 在像 Minecraft 这样的游戏设置中,子程序针对要测试的块 R 的某个连续区域。该程序在块区域之外创建一个桁架网格,并为网格中的每个节点分配一个权重(基于块的重量)。有与该区域接壤的基本节点。
  2. 从这个网格中,程序生成一个宽刚度矩阵T和一个权重向量w从那里,它需要求解方程Tf = w,其中f,未知数,是一个向量,表示每个桁架和基础节点施加的力。换句话说,一行T决定了桁架和基础力如何相加以抵消节点的权重。
  3. 目前,我的程序通过使用共轭梯度求解器求解方程TT'u=b来解决这个问题,然后得到f = T'u
  4. 一旦我对每个桁架施加了力,我就可以确定哪些块在应变下破裂。如果其中一个组成的桁架施加的力超过阈值,我没有使用详细的变形模型,而是只使用每个块。

因为我的结构分析系统是用于游戏而不是严肃的工程环境,所以速度比准确性重要得多。制作它的许多工作将包括调整变量,以便给游戏带来良好的感觉。

4个回答

有很多有限元库可以满足您的大部分标准。没有特别的顺序,我会提到 deal.II(我自己的项目)、libMesh 和 FEniCS。这三个都很大,都是库,有据可查,拥有庞大的用户群。这三个都得到积极维护,并且与通用库一样快。所有人都将解决弹性方程。全部免费。

使用任何已建立的项目(上述三个以及第二层项目)您可能无法满足的标准是:

  • 在科学计算中,我们使用 C++ 已经有很长一段时间了。上面所有三个库都是用 C++ 编写的(尽管 FEniCS 有一个 Python 接口),这对于许多其他库来说通常也是如此。

  • 他们不直接使用 GPU。其中一些具有可以使用 GPU 加速计算的求解器库的接口,但即使在这些情况下,在 GPU 上执行此操作更快的证据并不是真正的结论。不过,它非常困难且不可移植的证据非常确凿。

由于您希望将程序嵌入到游戏中,例如结构的物理引擎,因此使用显式 FEM 是一个好主意。类似于使用Verlet算法完成的模拟。

如果您可以拥有结构化网格,则显式 FEM 可以非常快,因为这样,单元的所有刚度矩阵都是相同的(您可以计算一次)。实际上,您可以对其进行分析计算并在程序中对其进行硬编码。速度的原因是您不需要求解方程组。使用 Verlet 积分——和集中质量矩阵——你只需要计算

ui(t+1)=2ui(t)ui(t1)+FiΔt2Mii.

您的 10,000 自由度的目标大小应该很容易满足,而无需嵌入整个 FEM 库(正如其他人所指出的那样,这可能无论如何都很难做到),而且不到一秒钟。假设解决系统是您当前的瓶颈而不是组装它(首先检查这个),我建议您将任何现有的和免费的直接求解器用于大型稀疏系统。一些指示:

此外,如果您使用Eigen线性代数库,它已经内置了一些稀疏直接求解器,因此您甚至不需要链接到外部库。这些可能比上面链接的专用库要慢一些,但上手起来更容易、更快。

我将建议一个比前面提到的那些不太知名的 FE 库。它没有那些复杂,但可以满足您的要求。它有很好的文档记录,因为它很简单,所以也更容易使用、修改和理解。

库/代码是 Feature

http://www.utwente.nl/ctw/tm/research/NSM/software/feature/

你说你对速度比准确性更感兴趣。然而,作为一名长期从事应力分析的人,我可以说将固体连续体(如混凝土墙)表示为桁架元素的集合并不简单。所以我认为你在寻找一个包含连续弹性元素的有限元库是正确的,而不是试图从低级线性代数组件构建你自己的。