subroutine subspace_extraction_ftlm() integer :: lwork, info, i real(dp), allocatable :: work(:) if (iProcIndex /= root) return ! Scrap space for the diagonaliser. lwork = max(1, 3 * n_lanc_vecs_ftlm - 1) allocate(work(lwork)) ! This routine diagonalises a symmetric matrix, A. ! V tells the routine to calculate eigenvalues *and* eigenvectors. ! U tells the routine to get the upper half of A (it is symmetric). ! n_lanc_vecs_ftlm is the number of rows and columns in A. ! A = ftlm_hamil. This matrix stores the eigenvectors in its columns on output. ! n_lanc_vecs_ftlm is the leading dimension of A. ! ftlm_h_eigv stores the eigenvalues on output. ! work is scrap space. ! lwork is the length of the work array. ! info = 0 on output if diagonalisation is successful. call dsyev('V', 'U', n_lanc_vecs_ftlm, ftlm_hamil, n_lanc_vecs_ftlm, ftlm_h_eigv, work, lwork, info) deallocate(work) ! Output all of the eigenvalues. do i = 1, n_lanc_vecs_ftlm write(ftlm_unit, '(1x,f15.10)', advance='no') ftlm_h_eigv(i) end do write(ftlm_unit, '()') end subroutine subspace_extraction_ftlm