用一堆 .f 源文件制作一个模块

Make a module out a bunch of .f source files

我下载了一些 Fortran 源代码,其中包含大约 50 个 .f 文件。每个 .f 文件包含一个子例程或函数。我想将所有这些方便地填充到 Fortran 模块 .mod 文件中。有没有办法用 gfortran 做到这一点(除了在模块定义中煞费苦心地写出每个 sub/func 原型)?

这更像是格式化评论而不是答案,但您可以尝试编写类似这样的源文件

module this_will_end_in_tears

contains

include 'subroutine1.f'
include 'subroutine2.f'
include 'subroutine2.f'
...

end module this_will_end_in_tears

如果我怀疑 .f 文件包含固定格式的源代码,那么您最好确保该模块也是固定格式的。

我预计,正如您可能已经猜到的那样,这不会在您第一次尝试时编译,但它可能(只是可能)为您节省一点时间来完成这项工作,就像您所说的那样, 煞费苦心写出每个sub/func ...

哦,为了避免任何 Fortran 爱好者对这个建议感到畏缩,请注意,我并不是说这是继续进行的好方法,只是它可以为您节省一点时间。

祝你好运。

我制作了这个 bash 脚本,它带有两个参数 'the module name' 和 'the file extension',然后构建一个模块文件。它目前是为固定格式制作的。所有源文件必须与脚本位于同一目录中。当然你可以修改它更灵活。

name=
ext=
modsrc=$name.$ext
echo -e "      MODULE $name\n" > $modsrc
echo -e "          implicit none\n" >> $modsrc
echo -e "          contains\n" >> $modsrc
for i in *.f;
do
   if [ "$i" != "$modsrc" ]; then
       echo -e "         include '$i'\n" >> $modsrc
   fi
done
echo -e "       END MODULE $name\n" >> $modsrc

我通常通过将 .f90 代码编译为 -fixed 来解决问题。然后通常添加 INTENT 和 IMPLICIT NONE。我几乎总是有用于调试的 D 线,这似乎对我来说最容易使用 -fixed 形式。稍后添加对齐编译指示和 OpenMP 缩减子句以及相关的向量内容。