Код, который вы показали, должен компилироваться и работать, как и ожидалось. Я предполагаю, что вы на самом деле читаете массив 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 или расширение .for1. По умолчанию это расширение указывает ifort
ожидать код фиксированного формата2. Однако любые функции Fortran, поддерживаемые используемой вами версией компилятора, по-прежнему действительны — даже в фиксированном формате, если вам это необходимо. Дополнительные сведения о доступности функций различных версий Fortran см. в документации (Intel Fortran).
1 Я был бы рад узнать, можно ли это как-то изменить, например. чтобы разрешить расширение .f90
.
2 Этот параметр можно изменить в файле среды Abaqus, по крайней мере, для версий, которые я использовал (6.9–6.14). Я не думаю, что это изменилось с новыми выпусками, но может быть. Я не рекомендую изменять его, если вы делитесь средой с другими пользователями без их согласия, особенно для новичков.
person
Matt P
schedule
23.05.2017
minloc
- это f95, но вы не можете использовать abaqus с компилятором только для f77. - person agentp   schedule 22.05.2017read (99,*) dist
также является Fortran 90. Я не думаю, что вам нужно избегать Fortran 90. - person Vladimir F   schedule 22.05.2017minloc
для скалярного значения. Другими словами, код, показанный до сих пор, должен компилироваться и работать нормально, покаdist
является массивом. Кроме того, есть отвлекающий маневр в отношении ограничения F77 ... некоторая путаница OP может быть связана с тем фактом, что документы и примеры Abaqus продолжают использовать фиксированное форматирование в стиле F77, хотя любая операция, поддерживаемая используемой версией компилятора Intel, действующий код. - person Matt P   schedule 23.05.2017