Quantcast
Channel: Intel® oneAPI Math Kernel Library & Intel® Math Kernel Library
Viewing all articles
Browse latest Browse all 2652

MKL LAPACK SBGVX example

$
0
0

SBGVX computes a few eigenvalues/eigenvectors of a real symmetric matrix so it should be very useful for FEA where we want only a few eigenvalues/vectors of a very large matrix. So, I implemented a test example following the documentations but I cannot get it to work.  I get an access violation. 

Does anyone has a working example using this routine?

Here is mine:

program Console1
implicit none
    ! Variables
    ! http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/index.htm#GUID-659297EE-D35B-428C-ABBE-1A7EBE2B0F6E.htm#GUID-659297EE-D35B-428C-ABBE-1A7EBE2B0F6E 
    !
    ! N: matrix size
    ! NJ: number of upper diagonals + 1 
    integer, parameter :: N=3, NJ=2, ku=NJ-1, kl=0, ldab=ku+1, iwork=7*N
    !compute eigenvalues with index il to iu included
    integer, parameter :: il=1, iu=2, ldz=N, ldq=N
    integer info, m
    integer, dimension (N) :: ifail
    doubleprecision, dimension (N,N) :: KG, KM
    doubleprecision, dimension (ldab,N) :: KGB, KMB
    doubleprecision, dimension (N) :: W !eigenvalues
    doubleprecision, dimension (N,N) :: q, z
    doubleprecision vl, vu  !not referenced if range="I"
    doubleprecision, parameter :: abstol=0.0D-3  !absolute error tolerance for eigenvalues
    doubleprecision, dimension (iwork) :: work
    character*1, parameter :: jobz="V"  !compute eigenvalues
    character*1, parameter :: range="I" !compute in interval il--iu
    character*1, parameter :: uplo="U"  !upper triangular symmetric

    !local
    integer i,j

    m = iu-il+1
    
    !test matrix
    KG = 0
    KM = 0
    KG(1,1) = 100
    KG(2,2) = 100
    KG(1,2) =  25
    KG(2,1) =  25
    do i=1,N
        KM(i,i) = 1
    enddo
    print *, "KG"
    write(*,"(3G9.3)") ((KG(i,j),j=1,N),i=1,N)

    !copy to band form using 
    !http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/index.htm#GUID-659297EE-D35B-428C-ABBE-1A7EBE2B0F6E.htm#GUID-659297EE-D35B-428C-ABBE-1A7EBE2B0F6E
    KGB = 0
    KMB = 0
    do i=1,N
        do j=1,N
            if (i.ge.max(1,j-ku).and.i.le.min(N,j+kl)) KGB(ku+1+i-j,j) = KG(i,j)
            if (i.ge.max(1,j-ku).and.i.le.min(N,j+kl)) KMB(ku+1+i-j,j) = KM(i,j)
        enddo
    enddo
    print *, "KGB"
    write(*,"(3G9.3)") ((KGB(i,j),j=1,N),i=1,ku+1)
    print *, "KGM"
    write(*,"(3G9.3)") ((KMB(i,j),j=1,N),i=1,ku+1)
    
    !call sbgvx(KGB, KMB, w) 
    
!                  1      2     3  4   5   6    7     8    9    10 11   12  13  14  15  16      17 18 19 20   21    22     23     24    25
    call dsbgvx(jobz, range, uplo, N, ku, ku, KGB, ldab, KMB, ldab, q, ldq, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info)
    print *, "Eigenvalues found=",m
    print *, "Eigenvalues. Info=",info
    write(*,*) W
    pause "Hit ENTER to continue"

end program Console1

 


Viewing all articles
Browse latest Browse all 2652

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>