我对Fortran很新,只能在fortran 95和2003中写。现在我有一个主要用95编写的程序,但它完全采用fortran 77语法,并且还包含77个功能。
现在我需要另一个程序中的功能,但不想重写整个程序。我的想法是取代
program my_prog
与
module my_mod
subroutine my_prog()
替换似乎不起作用。编译器声明来自
的语法subroutine my_prog()
错了。有没有人对这个主题有一些体验,或者知道是否有可能在不重写代码的情况下实现代码?
答案 0 :(得分:4)
模块子程序sub的正确语法是
module name_of_the_module
use whatever
implicit none
!some variables and interfaces
contains
subroutine sub
!here is the code of your subroutine
end subroutine sub
end module name_of_the_module
否则,应该注意,您可以从较新的代码调用FORTRAN 77中的代码。它(除了一些例外)仍然是一个有效的Fortran 2008代码,只是旧的风格。唯一的例外是您不能在一个源文件中混合使用免费和固定源格式。这也可能是你的问题。
最好的办法是让旧的函数和子程序也符合自由源格式(参见“交集格式”here)并将它们放入模块中,如上所示。
答案 1 :(得分:0)
仅将子程序打包到模块中可能在某些情况下有效,但在其他情况下可能无效。 Fortran 77的一些功能现已被宣布为过时。你有几个选择。
编译器开关:许多编译器提供编译时开关来编译遗留代码。这取决于编译器到编译器,将来可能会改变
使用工具:人们编写的工具允许您将f77代码转换为f90 / 95。为此,请参阅: http://www.atmos.illinois.edu/courses/atms391-sp11/Fortran-converters.html
手动更新源代码:有些人在do-loops中使用了浮点变量。使用上面讨论的自动工具可能很难。在存在像(goto)这样的遗留语句的情况下,您可能需要手动工作。为此,请参阅以下链接:
http://www.cisl.ucar.edu/zine/96/fall/articles/3.f90.conversion.html
http://iprc.soest.hawaii.edu/users/furue/improve-fortran.html
从长远来看,您需要逐行手动完成代码并自行进行更改。这是最便携的解决方案。