Разобрался. Сделать внутри программы 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.