将块数据F77转换为F90

She*_*284 4 fortran fortran77 fortran90

我正在将一些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
Run Code Online (Sandbox Code Playgroud)

我的想法是将数组A,B和C放在一个模块中.我没有得到的主要是AREA1和AREA2.如何在F77中使用它们以及如何翻译它们?我的第一个猜测是丢弃它们,只需在模块中定义A,B和C. 但是,它们是一种包含A,B和C的派生类型吗?

chw*_*w21 6

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

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

integer a, b
common /globals/ a, b
Run Code Online (Sandbox Code Playgroud)

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

module globals
    implicit none
    integer a, b
end module globals
Run Code Online (Sandbox Code Playgroud)

然后use,您需要访问的所有模块ab

program main
    use globals
    implicit none
    a = 4
    b = 2
end program main
Run Code Online (Sandbox Code Playgroud)

您可以将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
Run Code Online (Sandbox Code Playgroud)

然后,您可以需要访问其变量的任何地方之前use AREA1use AREA2 之前替换整个事物implicit none.

编辑:忘记脚注

1公共块的规则更加灵活,因为不同变量的值按照命名的顺序存储在公共内存位置.因此,虽然技术上不需要始终使用相同的COMMON语句,但如果不这样做,则可以非常轻松地引入错误.

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

integer a, b
common /globals/ a, b
Run Code Online (Sandbox Code Playgroud)

在主程序和

integer i, j
common /globals/ i, j
Run Code Online (Sandbox Code Playgroud)

在子程序中.假设您使用a和创建模块b,则可以在子例程中以这种方式使用它:

use globals, only: i => a, j => b
Run Code Online (Sandbox Code Playgroud)

(注意,如果你使用only,你必须列出你想要在模块中使用的每个变量.你可以使用类似的东西:only: a, i => b如果你想要ai.)

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

integer k(2)
common /globals/ k
Run Code Online (Sandbox Code Playgroud)

  • 如果您的代码在不同的程序单元中为同一个命名公共块中的变量使用不同的名称,那么要转换为模块,您需要在整个代码中使名称相同.想想你是否真的想要为那些不需要做的事情去努力. (2认同)
  • 避免新代码中的常见块以及被迫将它们从工作遗留代码中移除是不同的事情. (2认同)