Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

[Fortran] Problems with LAPACK routine

  1. Nov 8, 2013 #1
    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. jcsd
  3. Nov 8, 2013 #2

    Mark44

    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.
     
  4. Nov 8, 2013 #3
    That got it to compile, but now I am getting this error.

    Memory fault(coredump)
     
  5. Nov 8, 2013 #4

    Mark44

    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.
     
  6. Nov 8, 2013 #5

    AlephZero

    User Avatar
    Science Advisor
    Homework Helper

    Also, the documentation says the WORK array must be longer than 6 elements for a 6x6 matrix.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook