# [Fortran] Problems with LAPACK routine

1. Nov 8, 2013

### Bashkir

I am trying to use the LAPACK routine dsyev to solve for the eigenvalues of a matrix, and I designed a program to test this and make sure I am getting the right results. It isn't recognizing the subroutine however.

The subroutine is dsyev, which I can post or can be found on the LAPACK site.

My program is

PROGRAM EIGENVALUE

IMPLICIT NONE

! Statements
Double Precision :: A (6,6), w (6), Work (6)
INTEGER :: i, INFO, LWORK, LDA = 6
CHARACTER :: N, U

! External Subroutines
EXTERNAL :: dsyev

! A matrix
A (1, : ) = (/ 0, 1, 0, 0, 0, 0 /)
A (2, : ) = (/ 0, 0, 1, 0, 0, 0 /)
A (3, : ) = (/ 1, 0, 0, 0, 0, 0 /)
A (4, : ) = (/ 0, 0, 0, 0, 0, 1 /)
A (5, : ) = (/ 0, 0, 0, 1, 0, 0 /)
A (6, : ) = (/ 0, 0, 0, 0, 1, 0 /)

CALL dsyev( 'N', 'U', 6, W, LDA, WORK, LWORK, INFO )

! Print the solution
DO i = 1, 6
WRITE (*, 9) i, w (i)
END DO

9 format ('x [' i1 '] =', f5.2)
END PROGRAM EIGENVALUE

And when I try to compile the error I am getting is:

collins@piccard \$ gfortran Eigenvalue.f90
/tmp/ccczm4lt.o: In function MAIN__':
Eigenvalue.f90:(.text+0x1b9): undefined reference to dsyev_'
collect2: ld returned 1 exit status

2. Nov 8, 2013

### Staff: Mentor

You need to link the library that contains dsyev to your program when you compile it, using a command line similar to the following. The quoted text comes from http://www.stanford.edu/class/me200c/tutorial_90/03_unix90.html. In your case the text after the -L switch is the path to the library directory, and after the -l switch is the name of the library file.
It's been some time since I've written any Fortran code, so what I'm saying I believe is correct.

3. Nov 8, 2013

### Bashkir

That got it to compile, but now I am getting this error.

Memory fault(coredump)

4. Nov 8, 2013

### Staff: Mentor

Based on this documentation - http://www.netlib.org/lapack/explore-html/dd/d4c/dsyev_8f_source.html - you didn't call dsyev correctly. There should be 9 parameters in the call - you have 8.

Code (Text):
CALL dsyev( 'N', 'U', 6, W, LDA, WORK, LWORK, INFO )
Per the documentation, it should be like this:

CALL dsyev( 'N', 'U', 6, A, LDA, W, WORK, LWORK, INFO )

In your call, you're missing the A array, and you have LDA and W in the wrong order. Also, your LWORK variable isn't initialized.

5. Nov 8, 2013

### AlephZero

Also, the documentation says the WORK array must be longer than 6 elements for a 6x6 matrix.