Распределить динамический массив с взаимозависимыми измерениями

Это немного сложно; Буду приветствовать любые комментарии о том, как улучшить ясность вопроса.

Хорошо, допустим, у меня есть массив:

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) тоже.

Придется ли мне использовать производный тип в производном типе?

5
задан Samuel Tan 20 December 2011 в 04:07
поделиться