【问题标题】:Identify version of Fortran of this code for the LF compiler为 LF 编译器识别此代码的 Fortran 版本
【发布时间】:2019-08-13 06:10:29
【问题描述】:

我是 Fortran 新手。我得到了一个应该在 Fortran 90 中的文件,但它是用 Lahey Fujitsu 编译器编译的(稀疏的文档指出它应该用 lf95 filename.f -out compiled_name @imsllf95.cmd 编译)。但是,有些行用 c 注释,据我了解,这是在 Fortran 77 中注释的方式。此外,矩阵声明为 REAL*8, DIMENSION(23,8) :: xxx19,我认为它来自 Fortran 77。

在大多数情况下,我可以使用gfortranifort 编译文件,但需要计算矩阵逆的部分除外。显然,在 LF95 编译器(使用专有模块 IMSLF90)中,使用 .i. 计算了矩阵逆。如果我删除这些反转,文件编译并运行没有问题(除了它给出错误结果的事实)。

我正在尝试查找编写此代码的 Fortran 版本,以便我可以搜索以相同版本编写的一些代码,以便我可以反转代码中的矩阵。

编辑:该文件具有扩展名 .f,尽管编译说明似乎暗示它是 Fortran 95。

这里有部分代码:

    PROGRAM estimate_group
    implicit none

    INTEGER :: i,j,k,full,group1
    REAL*8, DIMENSION(500) :: theta_start,theta_input



    OPEN(68, STATUS="REPLACE",file='fit_measures.txt')
c   OPEN(68, file='fit_measures.txt')
    REWIND(68)

    DO full=1,1

        PRINT *, "=================================="
        PRINT *, "FULL LOOP #: ", full
        PRINT *, "=================================="
        WRITE(68, *) "=================================="
        WRITE(68, *) "FULL LOOP #: ", full
        WRITE(68, *) "=================================="   

    DO group1=2,28

c   Additional If statement to focus on top level and scale
c       IF ( ((group1>=22) .AND. (group1<=28)) .OR. (group1==2)) THEN
        IF ( group1==2) THEN

c   READING IN THETA VECTOR FROM PREVIOUS ITERATIONS
c   (starting values taken from prior runs theta output)
c   ====================================================

        IF ((group1==2) .AND. (full==1)) THEN
            theta_input=0.0*theta_input
            OPEN(67, file='theta_input1.txt')
            REWIND(67)
            DO i=1,500
            READ(67,*) theta_input(i)
            END DO
        ELSE
            theta_input=0.0*theta_input
            OPEN(66,file='theta_input.txt')
            REWIND(66)
            DO i=1,500
            READ(66,*) theta_input(i)
            END DO
        END IF


    SUBROUTINE estimate(group1, theta_start)

        INTEGER, INTENT(IN) :: group1
        REAL*8, INTENT(IN), DIMENSION(500) :: theta_start


c   Variable Declarations:\ 

        INTEGER :: i,j,k,m,l,t0,i0,improve,max_m



        REAL*8, DIMENSION(23,8) :: xxx19
    xxx19(1:23,1) = (/554.0,541.1,583.3,593.2,615.8,582.0,582.5,546.5,
     &          538.4,494.1,503.3,494.1,486.9,478.6,432.6,439.6,
     &          380.4,355.4,305.9,271.8,254.6,208.8,202.8/)

【问题讨论】:

  • 它不是 any 标准版本的 Fortran。当然不是 Fortran 77。但是,您不必担心这一点:即使此代码编写为带有扩展的 Fortran 90,您的同一个编译器也可以接受使用它支持的 Fortran 2018 功能编写的矩阵求逆代码。跨度>
  • 你能扩展一下吗?
  • “该文件的扩展名为 .f,尽管编译说明似乎暗示它是 Fortran 95。” 扩展名仅指定(特定于编译器)它是固定源格式。任何 Fortran 版本都可以以固定源代码形式编写。 66 还是 2018,没关系。
  • 如果您有特定的问题(如编译器错误消息)想要解决,您应该打开一个新问题,显示有问题的代码、确切的错误消息等等。
  • 谢谢,我开了一个新问题:stackoverflow.com/questions/57487091/…

标签: fortran fortran90 fortran77


【解决方案1】:

Real*8 不是 Fortran 的一部分,也从未成为 Fortran 的一部分。所以对你的问题的严格回答是它不是任何年份的 Fortran。

但是,除了Real*8 之外,您所展示的内容是 Fortran 90 或更高版本。固定源代码形式仍然是该语言的一部分(尽管我会让任何使用它的学生失败),因此它不是代码年代的指标。然而,在快速浏览以上内容后,我可以看到 Fortran 90 标准语言中的以下功能:

  • 混合大小写(外部字符变量和常量)
  • 符号名称中的下划线
  • Implicit None
  • :: 在变量声明和逗号分隔的属性列表中
  • 超过 6 个字符的变量名称
  • 用双引号 (") 分隔字符串
  • Do ... End Do(我假设您出于某种原因错过了 End Do,否则上面的片段毫无意义)
  • == 测试相等性
  • Intent 用于虚拟参数
  • 数组部分
  • 数组构造函数

可能还有其他人。

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多