将科学和工程程序移植到 Linux

作者:Charles T. Kelsey IV

全功能工程工作站所需的硬件和编译器成本相对较高,使得大多数希望在家中使用工作站的学生或专业人士都难以承受。即使对于大型公司而言,在不降低效率的情况下削减成本也是可取的。随着英特尔处理器速度的提升以及 Linux 可用的软件基础不断增长,这种组合为低成本工作站提供了一个很好的解决方案。

对于工程师和科学家来说,全功能的 FORTRAN 77 编译器是必不可少的。此外,还需要一个易于访问的数值函数和子程序库。全功能的 FORTRAN 77 编译器,无论平台如何,例如 Lahey 的 DOS 编译器和 Sun 的 SPARCstation 编译器,价格都在 800 美元左右。商业数值库,如 IMSL,可能要花费数千美元。

在 Linux 下编译科学和工程代码

在 Linux 下可以轻松获得几个免费的 FORTRAN 77 选项。第一个是 f2c,一个 FORTRAN 到 C 源代码转换器。另一个是 g77,一个由 GNU 项目生成的 FORTRAN 编译器。f2c 的局限性使得 g77 成为在 Linux 下编译用 FORTRAN 77 编写的大型复杂应用程序的唯一可行替代方案。为了测试编译器作为日常工程活动工具的能力,编写了所需的 FORTRAN 代码片段,并使用 g77 编译。结果发现 g77 生成了高效的二进制文件,并且表现得像一个好的 FORTRAN 编译器。

下一步是编译一个更重要的工程代码,该代码通常在价值一万到两万美元的工作站上运行。作为辐射安全专业人员,经常使用的一种代码是 MCNP,它实现了“蒙特卡罗”方法来传输中性粒子辐射。(MCNP 的当前版本是 4A;4B 即将发布。)MCNP 代表了数百人年的编码工作,被认为是此类计算的最佳可用技术。像大多数具有长期开发历史的科学和工程代码包一样,MCNP 主要用 FORTRAN 77 编写,语言转换不被认为是合理的开发步骤。

将此代码移植到新平台的一个具有挑战性的地方是,它是一个与安全相关的、经过验证的代码,因此不能随意更改。任何更改都必须使用补丁文件和提供的实现实用程序进行。此实用程序称为 PRPR,也是用 FORTRAN 77 编写的。PRPR 是相对简单的代码。将 MCNP 移植到 Linux 的第一步是使用 g77 编译 PRPR,无需修改。此操作成功了——这是一个令人鼓舞但具有误导性的事实。软件包的其余部分没有那么配合。

MCNP 已经移植到多个平台,从 VMS 到 UNICOS。第一个明显的尝试是尝试为类似平台提供的补丁文件。没有一个成功,但这些尝试确实导致了许多有教育意义的错误消息。

最初需要克服的障碍是 Slackware 发行版中缺少 fsplit 命令。这个问题通过从 BSD 发行版获取 fsplit 得到解决。

第二个障碍是缺少一些 VAX FORTRAN 扩展,特别是那些与信号处理、日期和时间调用以及执行时间相关的扩展。虽然它们不是 FORTRAN 77 标准的一部分,但它们包含在许多商业 FORTRAN 编译器中。大多数 VAX FORTRAN 扩展的必要功能都很简单,可以用简短的 C 例程来复制,这些例程可以在生成可执行文件时与 FORTRAN 对象链接。MCNP 源代码包含一个用于处理执行时间的 C 例程。

一旦 VAX FORTRAN 扩展问题得到解决,剩下的数十个错误消息就与集成 FORTRAN 和 C 对象的问题有关。由于 MCNP 绘图例程是用 ANSI C 编写的,因此对象的集成对于生成全功能可执行文件是必要的。错误是由子程序声明的语法不正确引起的,这在不同的 FORTRAN 和 C 编译器对之间有所不同。

一旦成功生成可执行二进制文件——也就是说,编译完成且没有错误——就运行了提供的测试问题。测试问题与安全相关代码一起提供,以便用户不仅可以验证他们编译了一个二进制文件,还可以验证该二进制文件产生了合理的答案。将 Linux 二进制文件的测试问题输出与提供的输出进行比较,仅揭示了可归因于架构差异的差异。生成标准的机器是 SPARCstation 5,第一个运行 MCNP 二进制文件的 Linux 机器是 75 MHz Pentium。

自第一个平台以来,MCNP 版本 4A 已经在 100 和 200 MHz Pentium 上编译和运行。虽然 Pentium 不如 SPARCstation 20/151(150 MHz HyperSPARC)快,但考虑到它们相对于 SPARCstation 的成本,它们还是相当快的。请注意,引用的 HyperSPARC 模块本身就超过四千美元。

在列表 1 和 2 中显示了在 Linux 下编译 MCNP 版本 4A 所需的 PRPR 实现的补丁文件。请注意,FORTRAN 和 C 补丁都是必需的。还应注意,当在 OpenLook 窗口管理器下运行时,MCNP 图形行为最佳。

列表 1. FORTRAN 补丁文件

列表 2. C 补丁文件

虽然我们不期望所有科学家和工程师都使用 MCNP,但我们确实希望这份 MCNP 移植文档对那些正在寻找廉价工作站来运行其代码的人有所帮助。

Linux 下 g77 的数值例程库

SLATEC 是一个用 FORTRAN 77 编写的免费例程集合。该集合包含 1400 多个数学和统计子程序,这些子程序都经过了很好的文档记录,并在每个源代码的开头都有标准格式的注释行。为了使工作组共享工作站能够高效地使用此集合,发现创建库存档是最合适的。moreheadgrep 命令以及偶尔的 awking 证明对于查找所需的子程序和查看集成在源代码集合中的文档最有效。

SLATEC 4.1 版库是使用 Linux 下的 g77 编译和创建的,所有源代码都不需要打补丁。但有一个问题:某些例程调用用户提供的子程序,因此不能包含在库中。这些例程是 bvder、bvpor、bvsup、dbvder、dbvpor、dbvsup、dexbvp、drkfab、exbvp 和 rkfab。该库是通过将列表 3 中的脚本与所有 .f 源文件放在 /usr/local/src/slatec 目录中并执行脚本来创建的。

列表 3

用于创建 SLATEC 库的 Shell 脚本

生成的库 libslatec.a 放在 /usr/local/lib 中,任何用户都可以在编译时访问它,假设 /usr/local/lib 在他们的库路径中,使用如下命令:

g77 -o somefile somefile.f -lslatec
结论

我们已经证明,只需少量工作,g77 就可以用于编译非常重要的 FORTRAN 代码包。通过添加两个简单的 C 例程,g77 被用于编译 MCNP,并且在完全没有源代码修改的情况下,它编译了广阔的数学源代码集合 SLATEC。事实证明,g77 是一款 FORTRAN 编译器,它确实可以使基于 Intel 硬件的 Linux 成为工程师和科学家,尤其是预算有限的人的工作站选择。

有关 Charles 和 Gary 的计算工作的更多信息,请访问 www.csn.net/~ckelsey

Porting Scientific and Engineering Programs to Linux
Charles Kelsey (ckelsey@devcg.denver.co.us) 是 Rocky Flats 环境技术站的放射工程师。Charles 的职责包括一般健康物理、一些繁重的数字运算以及部门 UNIX 工作站的补充维护和保养。他尽量远离 VMS。这些人真是太奇怪了,他们甚至为 HP48 计算器编写核工程应用程序。

Gary Masters (gmasters@devcg.denver.co.us) 是 Rocky Flats 环境技术站的放射工程师。Gary 的职责包括一般健康物理、一些轻量级的数字运算以及部门 UNIX 工作站和运行 VMS 的 DEC Alpha 数据库服务器的维护和保养(呸)。欢迎评论,但可能会被忽略并发送到 /dev/null。

加载 Disqus 评论