读取文件并在 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)。我认为新版本并没有改变,但也许吧。如果您在未经其他用户同意的情况下与其他用户共享环境,我不建议更改它,尤其是对于新手。
我正在制作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)。我认为新版本并没有改变,但也许吧。如果您在未经其他用户同意的情况下与其他用户共享环境,我不建议更改它,尤其是对于新手。