将块数据F77转换为F90

时间:2016-11-01 08:17:41

标签: fortran fortran90 fortran77

我正在将一些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包含?

1 个答案:

答案 0 :(得分:6)

首先,原始代码应该在Fortran 90及更高版本中编译。因此,如果没有破坏,请不要尝试修复它。

COMMON块基本上是全局变量。在使用全局变量的每个过程中,必须以相同的方式声明它们 1 ,然后它们在任何地方共享。像这样:

integer a, b
common /globals/ a, b

更现代的方法是将globals转换为模块:

module globals
    implicit none
    integer a, b
end module globals

然后use该模块无处不在,您需要访问ab

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 AREA1use AREA2 替换整个内容,然后 implicit none,您需要访问其变量。

编辑:忘记脚注

1 公共块的规则更灵活,因为不同变量的值按照命名的顺序存储在公共内存位置。因此,虽然技术上不必总是使用相同的COMMON语句,但如果不这样做,则可以很容易地引入错误。

如果你有不同的命名变量(但是属于同一类型),那么适应它并不难。说你有

integer a, b
common /globals/ a, b

在主程序中

integer i, j
common /globals/ i, j

在子程序中。假设您使用ab创建了一个模块,那么您可以在子例程中以这种方式使用它:

use globals, only: i => a, j => b

(请注意,如果您使用only,则必须列出要在模块中使用的每个变量。如果您需要only: a, i => b,可以使用以下内容:ai。)

当然,以下内容也与之前的globals常见块兼容,但可能会导致更多麻烦:

integer k(2)
common /globals/ k