В основном есть два способа передать массивы подпрограмме в Fortran 90/95:
PROGRAM ARRAY
INTEGER, ALLOCATABLE :: A(:,:)
INTEGER :: N
ALLOCATE(A(N,N))
CALL ARRAY_EXPLICIT(A,N)
! or
CALL ARRAY_ASSUMED(A)
END PROGRAM ARRAY
SUBROUTINE ARRAY_EXPLICIT(A,N)
INTEGER :: N
INTEGER :: A(N,N)
! bla bla
END SUBROUTINE ARRAY_EXPLICIT
SUBROUTINE ARRAY_ASSUMED(A)
INTEGER, ALLOCATABLE :: A(:,:)
N=SIZE(A,1)
! bla bla
END SUBROUTINE ARRAY_ASSUMED
где вам нужен явный интерфейс для второго, обычно с использованием модуля.
Из FORTRAN77 , Я привык к первому варианту и читал, что он также наиболее эффективен, если вы передаете весь массив.
Хорошая вещь с явной формой заключается в том, что я также могу вызывать подпрограмму и рассматривать массив как вектор вместо матрицы:
SUBROUTINE ARRAY_EXPLICIT(A,N)
INTEGER :: N
INTEGER :: A(N**2)
! bla bla
END SUBROUTINE ARRAY_EXPLICIT
Я подумал, есть ли хороший способ делать такие вещи, используя второй интерфейс предполагаемой формы, без его копирования.