为什么 OpenFOAM 使用自己的数据结构和线性求解器?

计算科学 线性代数 线性求解器 线性系统 开放式泡沫 数据结构
2021-12-10 18:16:13

我想知道当 C++ 中有 STL 时,为什么 OpenFOAM 代码有自己的数据结构Lists、、HashTables...等?

另一个与线性求解器相关的问题,为什么它不使用其他成熟的库,如 PETSc、Trilinos、...?

这些选择背后有什么好的理由吗?

2个回答

直接来自亨利的指尖:与 OP 问题大体方向一致的评论

正如 Wolfgang 所指出的,OpenFOAM 早于我们习惯的许多开发,包括 STL 和所有后来的开发。现在,OpenFOAM 开发人员面临的问题是是否坚持他们的实现并努力保持一致性;或者重构他们的代码以适应 STL 和其他特性,以及这种大规模重构带来的所有相关风险和错误。

从 OpenFOAM 的代码库中可以观察到,它们遵循 STL 的思想并有自己的实现,例如在某些容器类中。


而且,作为一个完全不相关的旁注,另一个软件开发人员坚持他们久经考验的框架并避免新的闪亮的例子:Gtk-2 vs. Gtk-3引用文章中引用的开发人员的话:“我们将一无所获,并在移植上浪费数月(甚至数年)。”

根据最近的信息:

在撰写本文时,OpenFOAM 无一例外地遵循 C++11 标准。因此,您可以在 OpenFOAM 中使用该标准的任何 C++ 容器。

OpenFOAM,至少是.com版本,很久以前就已经更新,完全符合 ISO/IEC 14882:2011(即 C++11)标准。未考虑最新的 C++ 标准的主要原因是大多数编译器对 C++14 及更高版本的编译器支持尚未涵盖整个标准(请参阅编译器支持表),OpenFOAM 必须考虑Gcc 和 Clang 以外的编译器。

此外,标准模板库(即 STL)不是C++ 标准(请参阅 参考资料)。话虽如此,所有主要的 OpenFOAM 低级容器(例如UList)几乎都使用了 STL 在深层级别提供或抽象的所有实用程序,例如iterators。

使用来自 C++ 标准实现的容器(例如,Gcc 或 Clang 在低级别以不同方式实现标准或 STL 组件)不适合轻松且稳健地开发、维护和修改数值连续体力学所需的抽象级别问题,但从主观上讲,OpenFOAM 是一种非常优雅的方式。而且您提到的容器不是典型用户可以与之交互的容器。

此外,OpenFOAM 不会或不会使用外部线性求解器套件的说法是不正确的。例如,HPC-OpenFOAM 技术委员会已经对 PETSc-OpenFOAM 进行了一年多的测试。GPU 支持讨论和测试甚至早了十年!英伟达、英特尔和 AMD 在这方面也与 OpenFOAM 密切接触。

问题是 OpenFOAM 的开发是在少数人的肩膀上,他们的盘子里有大量的东西,没有切碎的支持。一些软件公司使用 OpenFOAM 作为他们的工作马,并使用 mombo-jombo 法律技巧(你知道他们)销售他们的产品。这阻碍了 OpenFOAM 可以达到的健康发展水平。尽管有这些吸血鬼,多亏了 OpenFOAM 社区和有道德的工业合作伙伴,OpenFOAM 仍然摇滚。

编辑:这里petsc4Foam 由官方 OpenFOAM 提供。

EDIT-2:此处OpenFOAM-v2006中的PETSc