Причина ваша первоначальная попытка
scansDC(1:nRadii, iScanF, 1:nSpeciesDC) = b(1:nSpeciesDC, 1:nRadii)
дали другой ответ, чем вы хотели, потому что нет никаких оснований для вашего компилятора сделать вывод, что вы хотите транспозиция взята из b только потому, что диапазоны 1:nRadii
и 1:nSpeciesDC
переключаются. Диапазоны массивов совместимы, поэтому данные просто копируются в линейном порядке, предоставляя вам транспонирование того, что вы хотите.
Если вам нужны данные, скопированные на себя в другом порядке, необходимо указать, что, либо делать копии достаточно явно, как в правильном ответе IanH, либо явным образом просить транспонированный:
program test
integer, parameter :: nradii=10, nspeciesDC=2
integer, dimension(nradii, 5, nspeciesDC) :: scansDC
integer, dimension(nspeciesDC, nradii) :: b
integer :: i,j,k
integer, parameter :: iscanf = 2
scansDC = 0
k = 0
do i=1,nradii
do j=1,nspeciesDC
b(j,i) = k
k = k + 1
enddo
enddo
print *, b
scansDC(1:nRadii, iScanF, 1:nSpeciesDC) = transpose(b(1:nspeciesDC, 1:nRadii))
print *,scansDC(:,iScanF,:)
end program test
Это будет работать (это распараллеливание вложенных циклов DO), но я искал что-то, используя назначение массива. – Woody20
FORALL - это форма назначения массива. Семантически это не цикл do - рассмотрим случай, когда левая и правая стороны дочернего элемента * forall-assign-stmt * перекрываются. – IanH