matrix(2次元配列)とallocateのテストプログラム

Fortran90のテストプログラムです。配列をサブルーチンに受け渡す方法と、メモリの動的確保の方法を整理するために簡単なテストプログラムを作りました。
簡単なプログラムなのでコメントはありません。
適当な2次元配列をセットするset_matrixとプリントするprint_matrixサブルーチンがあるだけです。


matrix.f90

program main
  implicit none

  real(kind=8), allocatable, dimension(:,:):: a
  integer(kind=8), parameter :: d = 5
  integer(kind=8) :: i

  allocate(a(d,d))

  a(:,:) = 0.1d0
  i = 1

  call print_matrix(a, i)

  call set_matrix(a, i)
  call print_matrix(a, i)

  call set_matrix(a, i)
  call print_matrix(a, i)

  deallocate(a)

  contains

  subroutine set_matrix(rarg, iarg)
    implicit none

    real(kind=8), intent(inout), dimension(:,:) :: rarg
    integer(kind=8), intent(inout) :: iarg

    integer(kind=8) :: d1, d2
    integer(kind=8) :: n, m

    d1 = size(rarg, 1)
    d2 = size(rarg, 2)

    do n=1, d1
      do m=1, d2
        rarg(n, m) = (m*n+1)*rarg(n,m)
      enddo
    enddo

    iarg = iarg + 1

  end subroutine set_matrix

  subroutine print_matrix(rarg, iarg)
    implicit none
    real(kind=8), intent(in), dimension(:,:) :: rarg
    integer(kind=8), intent(in) :: iarg
    integer(kind=8) :: d1, d2
    integer(kind=8) :: n, m

    d1 = size(rarg, 1)
    d2 = size(rarg, 2)

    write(*, fmt='(a)') "matrix = "
    do n=1, d1
      do m=1, d2
        write(*, fmt='(f10.5)', advance='no') rarg(n, m)
      enddo
      write(*, *)
    enddo
    write(*, fmt='(a, i5)') "factor  = ", iarg
    write(*, *)
  end subroutine print_matrix

end program main

Makefile

FC=gfortran
FCFLAGS=-O3

OBJS=
TARGS=matrix

all: matrix

matrix: matrix.f90
        $(FC) $(FCFLAGS) -o $@ $<
        ./$@

clean:
        $(RM) -f $(TRGS)

.SUFFIXES: .f90 .o