2

大きな配列があります。配列が非常に大きいため、「割り当て可能」を使用して fortran で割り当てる必要があります。例えば、

complex(8),allocatalbe :: E0(:, :, :)
allocate(E0(1000,1000,1000))

私たちのコードでは、配列の形式を から に変換する必要がありますE0(1000,1000,1000)E1(1000*1000,1000)つまり、3 次元配列E0(M,N,L) を対応する 2次元 に変換しE1(M*N,L)ます。ただし、Equivalence (E0,E1)「割り当て可能」であるため、ステートメントを使用できません。E1(M*N,L)メモリが限られているなどの理由で、別の配列を定義したり割り当てたりするのは好きではありません。

誰かが達成する方法を持っていますEquivalence(E0,E1)か?

4

1 に答える 1

0

ランク 3 の配列を、ランク 2 の明示的な形状または想定サイズの仮引数を持つ特定のプロシージャに渡します。実引数と仮引数の間のシーケンスの関連付けにより、等価性が得られます。

PROGRAM remap
  IMPLICIT NONE
  REAL, ALLOCATABLE :: a(:,:,:)
  INTEGER :: i
  !****
  ALLOCATE(a(2,3,4))
  a = RESHAPE( (/ (REAL(i), i=1, PRODUCT(SHAPE(a))) /), SHAPE(a))
  CALL remapped(a, SIZE(a,1) * SIZE(a,2), SIZE(a,3))
CONTAINS  
  SUBROUTINE remapped(b,n,m)
    INTEGER, INTENT(IN) :: n, m
    REAL, INTENT(IN) :: b(n,m)
    !****
    ! Should print the first "page" of the actual argument.
    PRINT "(99(F6.1,:,' '))", b(:,1)
  END SUBROUTINE remapped
END PROGRAM remap

後の標準には、ポインター ランクの再マッピングの追加オプションがあります。

于 2012-09-14T00:51:15.157 に答える