cambiando dimensiones de matriz en fortran
Existen básicamente dos formas de pasar matrices a una subrutina en 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
donde necesita una interfaz explícita para el segundo, generalmente mediante el uso de un módulo.
Desde FORTRAN77, estoy acostumbrado a la primera alternativa, y leí que esta también es la más eficiente si pasa toda la matriz.
Lo bueno de la forma explícita es que también puedo llamar a una subrutina y tratar la matriz como un vector en lugar de una matriz:
SUBROUTINE ARRAY_EXPLICIT(A,N)
INTEGER :: N
INTEGER :: A(N**2)
! bla bla
END SUBROUTINE ARRAY_EXPLICIT
e preguntaba si hay una buena manera de hacer ese tipo de cosas usando la segunda interfaz de forma supuesta, sin copiarla.