Разобрался. Сделать внутри программы allocatable у меня к победе не ведет, т.к. компилятор выдает ошибку "A dummy argument name is invalid in this context". Но:
1) если массив одномерный, то можно просто сделать его в подпрограмме dimension(*)
2) если чуть сложнее (сделав модуль и interface в нем), то проходит и для двумерных массивов. Привожу примитивный пример с подсчетом суммы элементов квадратной матрицы.
Код:
module Summing
interface SumCalc
subroutine SumCalc(X, N, S)
implicit none
integer i, j, N, S
integer, dimension(:, :) :: X
end subroutine SumCalc
end interface
end module Summing
subroutine SumCalc(X, N, S)
implicit none
integer i, j, N, S
integer, dimension(:, :) :: X
S=0
do i=1, N
do j=1, N
S=S+X(i, j)
end do
end do
end subroutine SumCalc
program mymain
use Summing
implicit none
integer i, j, N, S
integer, allocatable:: X(:, :)
N=100
allocate(X(1:N, 1:N))
do i=1, N
do j=1, N
X(i, j)=i+j
end do
end do
call SumCalc(X, N, S)
deallocate(X)
end program mymain
Наверное, в фортране-95 можно еще как-то, но у меня -90.