[Fortran] Problems with LAPACK routine

  • Fortran
  • Thread starter Bashkir
  • Start date
  • #1
31
1

Main Question or Discussion Point

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
 

Answers and Replies

  • #2
33,722
5,418
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.
Similarly, we can link to a Fortran 90 compiled library (such as the BLAS/LAPACK library in the class account) by
f90 main.f90 -L/usr/class/me390/lib -lmy_lib90
 
  • #3
31
1
That got it to compile, but now I am getting this error.

Memory fault(coredump)
 
  • #4
33,722
5,418
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:
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
AlephZero
Science Advisor
Homework Helper
6,994
291
Also, the documentation says the WORK array must be longer than 6 elements for a 6x6 matrix.
 

Related Threads on [Fortran] Problems with LAPACK routine

Replies
22
Views
3K
Replies
2
Views
1K
  • Last Post
Replies
1
Views
6K
Replies
5
Views
5K
Replies
2
Views
5K
Replies
7
Views
5K
Replies
6
Views
1K
Replies
3
Views
2K
Replies
3
Views
2K
Top