Это немного сложно; Буду приветствовать любые комментарии о том, как улучшить ясность вопроса.
Хорошо, допустим, у меня есть массив:
real, allocatable :: A(:,:,:)
, и я хочу выделить его, прежде чем использовать. Может ли размер третьего измерения зависеть от размера второго измерения?
do i=1,n
allocate(A(3,i,i**2))
end do
Очевидно, что вышесказанное не работает. Я хотел бы получить массив (или набор массивов) с формой (ами)
(3,1,1), (3,2,4), (3,3,9), ... (3, n, n^2)
, где размер третьего измерения равен квадрату размера второго измерения.
Мое правило для размера зависимого измерения немного сложнее, но если возведение в квадрат возможно, я могу сделать все остальное.
Возможно ли это? Если да, то как я могу реализовать это в Фортране?
Что вернет shape (A)
? Было бы интересно.
Другой вариант - выделить максимальный требуемый размер и быть осторожным, чтобы использовать в вычислениях только определенные элементы, например.
allocate(A(3,n,n**2))
Несмотря на то, что сейчас у меня нет проблем с памятью, я бы хотел иметь хорошие практики программирования. В любом случае это интересная проблема.
Спасибо.
РЕДАКТИРОВАТЬ:
Как насчет того, чтобы размер измерения зависел от значения элемента в другом измерении?
В ответе ниже размер массива в обоих измерениях зависел от индекс B. Мне бы хотелось что-нибудь вроде
type myarray
real :: coord(3)
integer,allocatable :: lev(:)
integer, allocatable :: cell(:)
endtype myarray
type(myarray), allocatable :: data
allocate(data(m))
allocate(data%lev(n))
forall (j=1:n) !simple now, for argument's sake
lev(j)=j
endforall
! I was thinking of using a FORALL loop here, but the errors returned
! suggested that the compiler (gfortran) didn't expect IF blocks and ALLOCATE
! statements in a FORALL block
do i=1,m
do j=1,n
allocate(data(i)%cell(lev(j)**2))
enddo
enddo
Вы понимаете, о чем я? Но программа падает, поскольку пытается выделить уже выделенные переменные, например когда i = 1
он выделяет data (1)% cell (1)
, а затем пытается выделить data (1)% cell (2)
.. .у ах. Я хочу примерно следующее:
Каждые данные (i)
имеют массив lev (j)
значений, причем j
выполняется от 1 до n. , и для каждого значения lev (j)
у нас есть ячейка
размером lev
^ 2. Обратите внимание, что эти ячейки
уникальны для каждого данных (i)
и каждого левов
, и что размер этой конкретной ячейки
зависит от соответствующего значения lev
и, возможно, соответствующих данных (i)
тоже.
Придется ли мне использовать производный тип в производном типе?