是否有使用现代 Fortran 和 OOP 的开源科学库?

计算科学 正则
2021-11-30 22:29:07

在过去的几个月里,我一直在编写一个 Fortran 程序来解决特定的 PDE 系统(描述流体流动/燃烧)。我尝试使用最新标准的 Fortran 和现代 Fortran 具有的新 OOP 功能。我自己工作,身边没有 Fortran 大师来提问,所以对我来说学习的一种自然方式是查看使用现代 Fortran 的其他库/求解器。

不幸的是,那里的所有 Fortran 库似乎都是用非常古老的 Fortran 编写的,Fortran90 上层。因此,我必须自己考虑课程设计和交互。而且我完全不确定我做对了,尤其是从性能的角度来看。但也许我错过了一些东西,如果 Fortran 并使用 OOP 编写了现代科学包?

有很多优秀的 C++ 库可供学习(OpenFOAM、deal.II 等)以及 Python 库。这些语言通常也有一个更大的社区。如果我想通过示例学习,放弃 Fortran 并切换语言可能会更好吗?

4个回答

您可以查看现代 CFD 代码。例如 ...

流动性:通用多相 CFD (FE) 代码;甚至完全非结构化的 AMR

WRF : NCAR 的下一代数值模式天气预报系统

Code Saturne:通用 CFD (FV) 代码;维基百科上列出的一些功能

有类似的现代 Fortran 代码用于结构分析。

但由于缺乏广泛的编译器支持,它们可能无法使用完整的 F2003 功能。大多数新编译器确实支持 F2003 的大部分内容(请参阅 ACM SIGPLAN Fortran 论坛论文),但拥有广泛的用户群需要时间。例如 Debian stable 有 GCC 4.4.5,所以一般来说你不应该期望你的用户有更好的东西(即 4.5/4.6/4.7)。

当 F2003 编译器普及时,您将看到使用 F2003 功能的库/代码。

现在你可以看看 Damian Rouson 的这本书,了解如何使用 OOP 功能。

如果您想通过示例学习,我会推荐rosettacode,一个编程 chrestomathy 网站。在那里你可以找到许多用相当多的不同语言相对编写的示例问题。

Fortran wiki对您来说可能更有趣这里有一个关于 Fortran 中 OOP 的部分可能有用。

Fortan 做得很好——我们不要放弃它!

我同意@JackPoulson 的评论。我不知道有任何用现代 Fortran 编写的开源库。因此,对于您需要切换到 C++ 以通过示例学习的具体问题的答案是不幸的“是”。但是,需要明确的是,我确实知道至少存在一个几乎完全用现代 Fortran 编写并着眼于 OOP 的库,因此这是可能的(并且值得)。但是,该库不是开源的,因此它不会帮助您实现学习目标。

然而,你也可能不愿意丢弃你已经完成的东西。如果您仍然有兴趣为此追求 Fortran 并有特定的开发问题,我鼓励您在 StackOverflow 上询问他们。那里有一些非常熟练的 Fortran 开发人员非常乐意提供帮助。

我在这方面有点晚了,但你应该看看并行线性代数库PSBLAS的第 3 版,它充分利用了现代 Fortran 特性,如继承和多态性。这里还有一篇论文,他们将那个版本的性能与他们的旧版本进行了比较,旧版本坚持 F90/F95。令人惊讶的是,速度差异总体上可以忽略不计。