我正在制作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
类似?
答案 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)。我认为新版本不会改变,但也许。如果您未经他人同意与其他用户共享环境,我建议不要更改它,特别是对于新手。