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

时间:2017-05-22 12:29:50

标签: arrays fortran fortran77 abaqus

我正在制作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类似?

1 个答案:

答案 0 :(得分:2)

您显示的代码应按预期编译和运行。我假设你实际上正在读一个 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源代码为 .f < / strong>或 .for 扩展名 1 。默认情况下,此扩展程序会告知ifort预期固定格式代码 2 。但是,您使用的编译器版本支持的任何Fortran功能仍然有效 - 即使是固定格式,如果必须的话。有关不同Fortran版本的功能可用性的更多信息,请参阅(英特尔Fortran)文档。

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

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