Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Fortran 77程序更新为更现代的Fortran以提高可读性?_Fortran_Readability - Fatal编程技术网

如何将Fortran 77程序更新为更现代的Fortran以提高可读性?

如何将Fortran 77程序更新为更现代的Fortran以提高可读性?,fortran,readability,Fortran,Readability,我试图使用更现代的Fortran语言更新以下Fortran 77程序,以提高其可读性。有人能提供一些建议吗?我尝试使用find和replace将“IS”更改为更可读的变量,但这导致了类型转换问题。对于比这个大得多的其他Fortran 77程序,这个任务被证明是非常乏味的 C 3D ISING MODEL C Critical temperature TC = 4.5116=1/.22165 DIMENSION IS(10,10,10), EX(

我试图使用更现代的Fortran语言更新以下Fortran 77程序,以提高其可读性。有人能提供一些建议吗?我尝试使用find和replace将“IS”更改为更可读的变量,但这导致了类型转换问题。对于比这个大得多的其他Fortran 77程序,这个任务被证明是非常乏味的

C         3D ISING MODEL
C         Critical temperature TC = 4.5116=1/.22165
          DIMENSION IS(10,10,10), EX(13)
          REAL *8 R(1)
          DATA IS/1000*1/
          ITMAX=5000
          ISTART=4000
          L=10
          NR=1
          ISEED=768521034
          M=L*L*L
          DO 1000 K=1,24
          TR=0.05+(K-1)*.05
          T=TR/.221655
          MR=0.
          DO 3 I=1, 13, 2
3         EX(I)=EXP(-2*(I-7.)/T)
          DO 2 ITIME=1,ITMAX
          DO 1 K1=1,L
          K1P1=K1+1
          K1M1=K1-1
          IF(K1.EQ.1) K1M1=L
          IF(K1.EQ.L) K1P1=1
          DO 1 K2=1,L
          K2P1=K2+1
          K2M1=K2-1
          IF(K2.EQ.1) K2M1=L
          IF(K2.EQ.L) K2P1=1
          DO 1 K3=1,L
          K3P1=K3+1
          K3M1=K3-1
          IF(K3.EQ.1) K3M1=L
          IF(K3.EQ.L) K3P1=1
        IEN=7+IS(K3,K2,K1)*(IS(K3M1,K2,K1)+IS(K3P1,K2,K1)+IS(K3,K2M1,K1)
     &  +IS(K3,K2P1,K1)+IS(K3,K2,K1M1)+IS(K3,K2,K1P1))
          CALL GGUBS(ISEED,NR,R)
          IF(EX(IEN).LT.R(1)) GOTO 1
          IS(K3,K2,K1)=-IS(K3,K2,K1)
          M=M+2*IS(K3,K2,K1)
C          WRITE(*,*) M,ITIME
1         CONTINUE
          IF (ITIME.GT.ISTART) MR=MR+M
2         CONTINUE
          WRITE(*,*) FLOAT(MR)/1000./FLOAT((ITMAX-ISTART)),TR
          WRITE(1,*) FLOAT(MR)/1000./FLOAT((ITMAX-ISTART)),TR
1000      CONTINUE
          STOP
          END

        SUBROUTINE GGUBS(ISEED,NR,R)
        IMPLICIT REAL *8(A-H,O-Z)
        DIMENSION R(NR)
        DATA D2P31M/2147483647.D0/
        DATA D2P31/2147483648.D0/
        DO 7 I=1,NR
        ISEED=MOD(16807.D0*ISEED, D2P31M)
        R(I)=ISEED/D2P31
    7   CONTINUE
        RETURN
        END

我还在学Fortran。我有一本关于Fortran应用于分子动力学的非常老的教科书,下面是Fortran的例子。我面临着学习一门新语言和将Fortran帮助从新的Fortran翻译成古老的Fortran的困难。我花了时间研究这个问题,发现强迫非隐式有助于我更好地理解程序。我正在努力处理Fortran的一些类似机器的特性,比如有限的行空间、字符列语法,以及缩进代码以使代码看起来更整洁而不破坏逻辑。总的来说,在不破坏逻辑的情况下使代码看起来更可读是我最大的学习曲线。

有一些工具可以将FORTRAN 77转换为FORTRAN 90()。你可以从其中一个开始。如果代码将继续使用,保持不变,则将其视为遗留代码,不要对其进行修补。如果它没有坏,就不要修理它。如果代码需要改进或扩展,移植到Fortran 90将有助于程序员。将FORTRAN 77改进为FORTRAN>=90是一项投资;平衡要做的投资和要在代码上做的编程工作。在阶段中进行更改,并对程序进行回归测试,以确保不会引入bug。这项工作可以是不平凡的。要拥有完全现代化的代码,您应该删除隐式声明并声明所有变量。然后,您可以重命名一些变量,使其具有更有意义的名称,而不必考虑隐式键入。

有一些工具可以将FORTRAN 77转换为FORTRAN 90()。你可以从其中一个开始。如果代码将继续使用,保持不变,则将其视为遗留代码,不要对其进行修补。如果它没有坏,就不要修理它。如果代码需要改进或扩展,移植到Fortran 90将有助于程序员。将FORTRAN 77改进为FORTRAN>=90是一项投资;平衡要做的投资和要在代码上做的编程工作。在阶段中进行更改,并对程序进行回归测试,以确保不会引入bug。这项工作可以是不平凡的。要拥有完全现代化的代码,您应该删除隐式声明并声明所有变量。然后,您可以重命名一些变量,使其具有更有意义的名称,而不必考虑隐式键入。

或者,如果您先使用转换器,然后手动更新程序,您可能会了解更多信息。首先。其他需要考虑的事项:

  • 使用自由格式

  • DO WHILE
    (已弃用)转换为
    DO。。。如果()退出。。。结束DO

    注意需要相反的逻辑表达式;例如,逻辑运算符

  • 考虑用更具体的函数替换旧的内在函数

  • 用现代符号替换
    IF()中的旧逻辑运算符

  • 使变量声明现代化,对[物理]常数使用
    模块
    参数
    对函数和子例程使用
    对函数和子例程上的伪变量使用双精度(如果需要),
    意图
    ,最后--
    字符(LEN=)

  • DO
    循环上的文本标签

  • 可分配的
    数组(如果适用)

  • 良好的内务管理:
    CLOSE
    语句与
    OPEN
    语句配对

  • 用现代固有功能(例如,
    maxval
    )替换常见任务

最后,使用gfortran-g-std=f2008-Wall-Wextra-O2进行“彻底”编译,以隔离和解决潜在问题


您可以找到更全面的可能更改列表。

或者,如果您先使用转换器,然后手动更新程序,您可能会了解更多信息。首先。其他需要考虑的事项:

  • 使用自由格式

  • DO WHILE
    (已弃用)转换为
    DO。。。如果()退出。。。结束DO

    注意需要相反的逻辑表达式;例如,逻辑运算符

  • 考虑用更具体的函数替换旧的内在函数

  • 用现代符号替换
    IF()中的旧逻辑运算符

  • 使变量声明现代化,对[物理]常数使用
    模块
    参数
    对函数和子例程使用
    对函数和子例程上的伪变量使用双精度(如果需要),
    意图
    ,最后--
    字符(LEN=)

  • DO
    循环上的文本标签

  • 可分配的
    数组(如果适用)

  • 良好的内务管理:
    CLOSE
    语句与
    OPEN
    语句配对

  • 用现代固有功能(例如,
    maxval
    )替换常见任务

最后,使用gfortran-g-std=f2008-Wall-Wextra-O2进行“彻底”编译,以隔离和解决潜在问题


可以找到更全面的可能变化列表。

这里已经有了一些好的答案。我想补充三件尚未提及的事情:

  • 将例程和变量名重命名为更长、更具描述性的名称。如果你有一个带有自动完成功能的编辑器(例如Photran或是一个最合适的文本编辑器插件),你仍然可以输入有效的代码