module md_module implicit none contains subroutine matrix_diagonal(a,diag,n) implicit none real, intent (in), dimension (:,:) :: a real, intent (out), dimension (:) :: diag integer, intent (in) :: n real, dimension (1:size(a,1)*size(a,1)) :: temp ! subroutine to extract the diagonal elements of an n * n matrix A temp = pack(a,.true.) diag = temp(1:n*n:n+1) end subroutine matrix_diagonal end module md_module program ch2503 ! program reads the n * n matrix from a file use md_module implicit none integer :: i, n real, allocatable, dimension (:,:) :: a real, allocatable, dimension (:) :: adiag character (len=20) :: filename print *, 'input name of data file' read '(a)', filename open (unit=1,file=filename) read (1,*) n allocate (a(1:n,1:n),adiag(1:n)) do i = 1, n read (1,*) a(i,1:n) end do call matrix_diagonal(a,adiag,n) print *, ' diagonal elements of a are:' print *, adiag end program ch2503