gpt4 book ai didi

fortran - 将 block 数据 F77 转换为 F90

转载 作者:行者123 更新时间:2023-12-02 17:21:34 25 4
gpt4 key购买 nike

我正在将一些 F77 文件转换为 F90。然而,有一些常见的 block 没有转换。我是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 block 基本上是全局变量。在每个使用全局变量的过程中,都必须以相同的方式声明它们1,然后在各处共享它们。像这样的事情:

integer a, b
common /globals/ a, b

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

module globals
implicit none
integer a, b
end module globals

然后在需要访问 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隐式none之前替换整个内容在任何需要访问其变量的地方。

编辑:忘记脚注

1公共(public) block 的规则更加灵活,因为不同变量的值按照命名顺序存储在公共(public)内存位置中。因此,虽然技术上没有必要始终使用相同的 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 公共(public) block 兼容,但可能会导致更多麻烦:

integer k(2)
common /globals/ k

关于fortran - 将 block 数据 F77 转换为 F90,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40356320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com