У меня есть назначение массива, которое я сформулировал с помощью forall
. Индексы в одном массиве должны быть вычислены из переменных цикла, так что я пытался использовать временные переменные, аналогично тому ii
этот простой пример:Временные переменные внутри Fortran `forall` или` do concurrent`
program test
integer :: i, ii, a(10), b(20)
a=(/(i, i=1,10)/)
forall (i=1:20)
ii = (i+1)/2
b(i) = a(ii)
end forall
print '(20I3)', b
end program test
Но gfortran
предупреждает меня, что «FORALL с индексом ' я»не используется на левой стороне задания на (1), и поэтому может вызвать многократное назначение к этому объекту», и на самом деле выход не то, что я хотел:
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
(ifort
даже бросает ошибка.) Я понимаю, что могу просто повторять определение ii
каждый раз, когда оно появляется, но это может утомиться в реальных случаях.
Q1: Есть ли способ сделать это, используя forall
?
Теперь, как вы можете прочитать в некоторых otherquestions, forall
больше не кажется, рекомендуется, и прямой do
может быть даже быстрее.
Тем не менее, мое использование forall
в этом случае было таким же удобным, как и скорость. В моей реальной программе у меня есть что-то вроде forall (i=1:10, j=1:10, i<=j)
, и мне нравится, как заголовок forall
позволяет мне указать это без вложенных циклов.
Я также узнал о do concurrent
в этих вопросах, и это, кажется, решить эту проблему, то есть замена forall
выше do concurrent
, выход становится:
1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
и я все еще получаю использовать forall
заголовок ,
Q2: ли это использование локальной переменной, которая не работает в forall
, гарантированное стандартом для работы в do concurrent
? (Вместо того, что это случайность, что он работал в gfortran
.)
К сожалению, на данный момент я не могу использовать do concurrent
в любом случае, потому что немного старше ifort
и gfortran
версии не поддерживают его.
выскочил, самое смешное расширение сделать что-то просто сложное :) Конечно, в более реальном примере это может быть приятным прикосновением. – steabert
@steabert: если кто-то хочет * намеренно * ограничивают их способность писать хороший код с помощью «более элегантного» рабочего процесса, а затем делать что-то сложное необходимо :) - Трудно сказать, если бы индексы были немного сложнее (например, с участием 'if's) , это, вероятно, действительно хороший способ сделать это (предполагая, конечно, что вы все еще ограничиваете себя «forall»). –
Спасибо, это реальный ответ на мой вопрос :-) – xebtl