将块数据 F77 转换为 F90
Convert block data F77 to F90
我正在将一些 F77 文件转换为 F90。但是,有一些公共块没有转换。我是F90的新手,没有F77的经验。
有人可以告诉我如何将以下示例代码转换为 F90 吗?
BLOCK DATA SETUP
INTEGER A,B,C
REAL I,J,K,L
COMMON /AREA1/ A,B,C
COMMON /AREA2/ I,J,K,L
DATA A,B,C,I,J,K,L/0,1,2,10.0,-20.0,30.0,-40.0/
END
我的想法是将数组A、B、C放在一个模块中。我在这里没有得到的主要内容是 AREA1 和 AREA2。这些在 F77 中是如何使用的,我该如何翻译它们?我的第一个猜测是丢弃它们并在模块中简单地定义 A、B 和 C。但是,它们是一种包含 A、B 和 C 的派生类型吗?
首先,原始代码应该在 Fortran 90 及更高版本中编译。因此,如果它没有损坏,请不要尝试修复它。
COMMON
块基本上是全局变量。在每一个使用全局变量的程序中,都必须以同样的方式声明1,然后在各处共享。像这样:
integer a, b
common /globals/ a, b
一种更现代的方法是将 globals
转换为模块:
module globals
implicit none
integer a, b
end module globals
然后 use
该模块随处可见 a
和 b
program main
use globals
implicit none
a = 4
b = 2
end program main
您可以将 DATA
语句放入模块中,或者更简单地初始化声明中的每个变量:
module AREA1
implicit none
integer :: a = 0
integer :: b = 1
integer :: c = 2
end module AREA1
module AREA2
implicit none
real :: i = 10.0
real :: j = -20.0
real :: k = 30.0
real :: l = -40.0
end module AREA2
然后,您可以在 use AREA1
和 use AREA2
before the implicit none
任何需要访问其变量的地方替换整个东西.
编辑:忘记脚注
1公共块的规则更灵活,因为不同变量的值按照它们命名的顺序存储在公共内存位置。因此,虽然技术上没有必要始终使用相同的 COMMON
语句,但如果不这样做,很容易引入错误。
如果您有不同命名的变量(但类型相同),那么适应它并不难。假设你有
integer a, b
common /globals/ a, b
在主程序中和
integer i, j
common /globals/ i, j
在子程序中。假设您使用 a
和 b
创建了一个模块,那么您可以在子例程中以这种方式使用它:
use globals, only: i => a, j => b
(请注意,如果您使用 only
,则必须列出要在模块外使用的每个变量。您可以使用类似的内容:only: a, i => b
如果您想要 a
和 i
.)
当然,下面的也可以兼容之前的globals
公共块,但可能会更麻烦:
integer k(2)
common /globals/ k
我正在将一些 F77 文件转换为 F90。但是,有一些公共块没有转换。我是F90的新手,没有F77的经验。 有人可以告诉我如何将以下示例代码转换为 F90 吗?
BLOCK DATA SETUP
INTEGER A,B,C
REAL I,J,K,L
COMMON /AREA1/ A,B,C
COMMON /AREA2/ I,J,K,L
DATA A,B,C,I,J,K,L/0,1,2,10.0,-20.0,30.0,-40.0/
END
我的想法是将数组A、B、C放在一个模块中。我在这里没有得到的主要内容是 AREA1 和 AREA2。这些在 F77 中是如何使用的,我该如何翻译它们?我的第一个猜测是丢弃它们并在模块中简单地定义 A、B 和 C。但是,它们是一种包含 A、B 和 C 的派生类型吗?
首先,原始代码应该在 Fortran 90 及更高版本中编译。因此,如果它没有损坏,请不要尝试修复它。
COMMON
块基本上是全局变量。在每一个使用全局变量的程序中,都必须以同样的方式声明1,然后在各处共享。像这样:
integer a, b
common /globals/ a, b
一种更现代的方法是将 globals
转换为模块:
module globals
implicit none
integer a, b
end module globals
然后 use
该模块随处可见 a
和 b
program main
use globals
implicit none
a = 4
b = 2
end program main
您可以将 DATA
语句放入模块中,或者更简单地初始化声明中的每个变量:
module AREA1
implicit none
integer :: a = 0
integer :: b = 1
integer :: c = 2
end module AREA1
module AREA2
implicit none
real :: i = 10.0
real :: j = -20.0
real :: k = 30.0
real :: l = -40.0
end module AREA2
然后,您可以在 use AREA1
和 use AREA2
before the implicit none
任何需要访问其变量的地方替换整个东西.
编辑:忘记脚注
1公共块的规则更灵活,因为不同变量的值按照它们命名的顺序存储在公共内存位置。因此,虽然技术上没有必要始终使用相同的 COMMON
语句,但如果不这样做,很容易引入错误。
如果您有不同命名的变量(但类型相同),那么适应它并不难。假设你有
integer a, b
common /globals/ a, b
在主程序中和
integer i, j
common /globals/ i, j
在子程序中。假设您使用 a
和 b
创建了一个模块,那么您可以在子例程中以这种方式使用它:
use globals, only: i => a, j => b
(请注意,如果您使用 only
,则必须列出要在模块外使用的每个变量。您可以使用类似的内容:only: a, i => b
如果您想要 a
和 i
.)
当然,下面的也可以兼容之前的globals
公共块,但可能会更麻烦:
integer k(2)
common /globals/ k