[Fortran] Problems with LAPACK routine

  • Context: Fortran 
  • Thread starter Thread starter Bashkir
  • Start date Start date
  • Tags Tags
    Fortran Lapack
Click For Summary

Discussion Overview

The discussion revolves around issues encountered while using the LAPACK routine dsyev in a Fortran program to compute eigenvalues of a matrix. Participants address compilation errors and correct usage of the routine, focusing on the technical aspects of the implementation.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant describes their Fortran program attempting to use dsyev but encountering an "undefined reference" error during compilation.
  • Another participant suggests that the error is due to not linking the LAPACK library correctly during compilation, providing a command line example for linking.
  • A third participant reports a new error, "Memory fault(coredump)," after successfully compiling the program.
  • One participant points out that the call to dsyev is incorrect, noting that it should include 9 parameters instead of 8, and specifies the correct order of parameters.
  • Another participant adds that the WORK array must be longer than 6 elements for a 6x6 matrix, indicating a potential issue with the program's setup.

Areas of Agreement / Disagreement

Participants express differing views on the correct usage of the dsyev routine, with some agreeing on the need for proper parameter order and array sizes, while others focus on the linking issue. The discussion remains unresolved regarding the specific cause of the memory fault.

Contextual Notes

Participants mention missing initializations and the need for proper library linking, but do not resolve the implications of these issues on the overall functionality of the program.

Bashkir
Messages
31
Reaction score
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
 
Technology news on Phys.org
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
 
That got it to compile, but now I am getting this error.

Memory fault(coredump)
 
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.
 
Also, the documentation says the WORK array must be longer than 6 elements for a 6x6 matrix.
 

Similar threads

  • · Replies 1 ·
Replies
1
Views
8K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 6 ·
Replies
6
Views
3K
  • · Replies 18 ·
Replies
18
Views
7K
  • · Replies 22 ·
Replies
22
Views
5K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 1 ·
Replies
1
Views
6K
  • · Replies 7 ·
Replies
7
Views
5K