Вы инициализируете массив с MAXDIM
строками и NR
столбцами, и похоже, что каждый столбец содержит целые числа от 1 до MAXDIM
.
В качестве первого шага, напишите фактический DO
-loop:
do j=1,NR
do i=1,MAXDIM
myarray(i,j) = i
end do
end do
Свернуть внутренний цикл в структуру неявного цикла:
do j = 1,NR
myarray(1:MAXDIM,j) = (/ (i, i=1,MAXDIM) /)
end do
Когда мы пытаемся свернуть внешний цикл, происходит нечто странное:
myarray = (/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /)
Теперь я получаю ошибку несовместимых рангов, как и вы. Так как я не очень хорош в неявных циклах do, я посмотрел на shape
внутренние результаты для конструктора массива:
print *, shape(myarray)
print *, shape((/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /))
Это распечатывает
5 10
50
Конструктор массива просто расширяет одномерный массив, сглаживая любые конструкции вложенных массивов. На самом деле мы можем отбросить второй набор (/ /)
для упрощения. Так как все уже в правильном порядке, мы можем использовать встроенную reshape
для обеспечения правильного ранга. Моя полная тестовая программа тогда:
program sotest
implicit none
integer, parameter :: MAXDIM = 5
integer, parameter :: NR = 10
integer :: i
integer :: j
integer :: myarray(MAXDIM, NR)
integer :: myarray_implicit(MAXDIM, NR)
do j = 1,NR
do i = 1,MAXDIM
myarray(i,j) = i
end do
end do
myarray_implicit = reshape((/ ((i,i=1,MAXDIM), j=1,NR) /), (/ MAXDIM, NR /))
print *, all(myarray == myarray_implicit)
end program sotest