读取文件并在 Fortran 数组中查找值的索引

Read file and find index of value in array in Fortran

我正在制作Abaqus 的用户子程序文件。 但是,在读取文件时我遇到了困难。 因为它是基于 Fortran 77 的,所以很难找到精确的解决方案。 我的目的是读取一个包含 1X1 数组的文件。然后,在数组中找到一个值的索引。

我读取文件的代码是:

open (unit=99,file='D:\SIMULATION\dist.txt',status='old')
read (99,*) dist
close (99)

查找数组中值索引的代码是:

loc=minloc(abs(dist-1),1)

我认为 minloc 适用于 Fortran 90,对吗? Fortran 77中有没有类似于minloc的函数?

您显示的代码应该按预期进行编译和 运行。我假设您实际上正在读取 1xN 数组,并且当您说“1X1”时它是一个拼写错误 - 否则,使用 minloc 毫无意义。

但是,您在评论 (An array-valued argument is required in this context) 中报告的错误消息仅在您对标量值使用 minloc 内在函数时才会出现。因此,我的猜测是您没有将 dist 声明为数组。这是我的意思的一个简单示例:

! The contents of 'values.txt' are: -3.1, 4.1, 5.9, 2.6, -5.4
! Values may be separated by commas or blanks.

program get_min_dist
    implicit none
    real :: x                   ! <-- Cannot be used to represent an array.
    real, dimension(5) :: a     ! <-- An array of 5 reals. Do this instead.
    integer :: loc, funit1

    open(newunit=funit1, file="values.txt", status="old")
    read(funit1,*) x
    rewind(funit1)
    read(funit1,*) a
    close(funit1)

    loc = minloc(abs(a-1),1)    ! <-- I'm assuming there is a reason to 
                                ! subtract 1 from all values in the array

    ! loc = minloc(abs(x-1),1)  ! <-- Error 'An array-valued arg is required`
    print*, "x=",x
    print*, "a=",a
    print*, "index=", loc
    print*, "value=", a(loc)
end program get_min_dist

read(funit1,*) x 中,第一个值将在读取文件时分配,从而导致您看到的错误消息。但是,使用数组 a,您将获得预期的输出。

您对是否需要使用 F77 兼容代码感到困惑可能是因为 Abaqus 继续提供具有 F77 样式固定格式的示例和文档,并要求为 Fortran 源代码提供 [=31= .f 或 .for 扩展名1。默认情况下,此扩展告诉 ifort 期待固定格式代码 2。但是,您使用的编译器版本支持的任何 Fortran 功能仍然有效——如果必须,即使是固定格式也是如此。有关不同 Fortran 版本的功能可用性的更多信息,请参阅您的 (Intel Fortran) 文档。

1 我很高兴知道这是否可以以某种方式改变,例如允许 .f90 扩展。

2 可以在 Abaqus 环境文件中更改此设置,至少对于我的版本使用 (6.9-6.14)。我认为新版本并没有改变,但也许吧。如果您在未经其他用户同意的情况下与其他用户共享环境,我不建议更改它,尤其是对于新手。