Существуют два способа передачи массивов в подпрограмму в 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
Я задавался вопросом, есть ли хороший способ делать такие вещи, используя второй, предполагаемый интерфейс формы, не копируя его.