- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I inherited some project done in Fortran 95. After upgrade from Intel Fotran Composer v2013 to v2016, I am receiving errors during linking:
1>suportbase.obj : error LNK2019: unresolved external symbol DGETRF_MKL95 referenced in function SUPORTBASE_mp_INVMAT
1>suportbase.obj : error LNK2019: unresolved external symbol DGETRI_MKL95 referenced in function SUPORTBASE_mp_INVMAT
...fatal error LNK1120: 2 unresolved externals
The code which cause the problem:
pure function invmat(a) result(b) USE usedlapck95_mod, ONLY: getrf,getri USE, INTRINSIC :: IEEE_ARITHMETIC implicit none real(8),intent(in),dimension(:,:) :: a real(8),dimension(size(a,1),size(a,1)) :: b integer(4),dimension(size(a,1)) :: ipiv integer(4) :: info b=a if (size(a,1)==0) return call getrf(b,ipiv,info) call getri(b,ipiv,info) if (info>0) b=IEEE_VALUE (b,IEEE_POSITIVE_INF) end function
The code produce inverse matrix and it uses MKL library rutines.
The module which is called is:
MODULE F95_PRECISION INTEGER, PARAMETER :: SP = KIND(1.0E0) INTEGER, PARAMETER :: DP = KIND(1.0D0) END MODULE F95_PRECISION MODULE usedlapck95_mod INTERFACE GETRF PURE SUBROUTINE SGETRF_MKL95(A,IPIV,INFO) ! MKL Fortran77 call: ! SGETRF(M,N,A,LDA,IPIV,INFO) USE F95_PRECISION, ONLY: WP => SP INTEGER, INTENT(OUT), OPTIONAL :: INFO REAL(WP), INTENT(INOUT) :: A(:,:) INTEGER, INTENT(OUT), OPTIONAL, TARGET :: IPIV(:) END SUBROUTINE SGETRF_MKL95 PURE SUBROUTINE DGETRF_MKL95(A,IPIV,INFO) ! MKL Fortran77 call: ! DGETRF(M,N,A,LDA,IPIV,INFO) USE F95_PRECISION, ONLY: WP => DP INTEGER, INTENT(OUT), OPTIONAL :: INFO REAL(WP), INTENT(INOUT) :: A(:,:) INTEGER, INTENT(OUT), OPTIONAL, TARGET :: IPIV(:) END SUBROUTINE DGETRF_MKL95 PURE SUBROUTINE CGETRF_MKL95(A,IPIV,INFO) ! MKL Fortran77 call: ! CGETRF(M,N,A,LDA,IPIV,INFO) USE F95_PRECISION, ONLY: WP => SP INTEGER, INTENT(OUT), OPTIONAL :: INFO COMPLEX(WP), INTENT(INOUT) :: A(:,:) INTEGER, INTENT(OUT), OPTIONAL, TARGET :: IPIV(:) END SUBROUTINE CGETRF_MKL95 PURE SUBROUTINE ZGETRF_MKL95(A,IPIV,INFO) ! MKL Fortran77 call: ! ZGETRF(M,N,A,LDA,IPIV,INFO) USE F95_PRECISION, ONLY: WP => DP INTEGER, INTENT(OUT), OPTIONAL :: INFO COMPLEX(WP), INTENT(INOUT) :: A(:,:) INTEGER, INTENT(OUT), OPTIONAL, TARGET :: IPIV(:) END SUBROUTINE ZGETRF_MKL95 END INTERFACE GETRF INTERFACE GETRI PURE SUBROUTINE SGETRI_MKL95(A,IPIV,INFO) ! MKL Fortran77 call: ! SGETRI(N,A,LDA,IPIV,WORK,LWORK,INFO) USE F95_PRECISION, ONLY: WP => SP INTEGER, INTENT(OUT), OPTIONAL :: INFO REAL(WP), INTENT(INOUT) :: A(:,:) INTEGER, INTENT(IN) :: IPIV(:) END SUBROUTINE SGETRI_MKL95 PURE SUBROUTINE DGETRI_MKL95(A,IPIV,INFO) ! MKL Fortran77 call: ! DGETRI(N,A,LDA,IPIV,WORK,LWORK,INFO) USE F95_PRECISION, ONLY: WP => DP INTEGER, INTENT(OUT), OPTIONAL :: INFO REAL(WP), INTENT(INOUT) :: A(:,:) INTEGER, INTENT(IN) :: IPIV(:) END SUBROUTINE DGETRI_MKL95 PURE SUBROUTINE CGETRI_MKL95(A,IPIV,INFO) ! MKL Fortran77 call: ! CGETRI(N,A,LDA,IPIV,WORK,LWORK,INFO) USE F95_PRECISION, ONLY: WP => SP INTEGER, INTENT(OUT), OPTIONAL :: INFO COMPLEX(WP), INTENT(INOUT) :: A(:,:) INTEGER, INTENT(IN) :: IPIV(:) END SUBROUTINE CGETRI_MKL95 PURE SUBROUTINE ZGETRI_MKL95(A,IPIV,INFO) ! MKL Fortran77 call: ! ZGETRI(N,A,LDA,IPIV,WORK,LWORK,INFO) USE F95_PRECISION, ONLY: WP => DP INTEGER, INTENT(OUT), OPTIONAL :: INFO COMPLEX(WP), INTENT(INOUT) :: A(:,:) INTEGER, INTENT(IN) :: IPIV(:) END SUBROUTINE ZGETRI_MKL95 END INTERFACE GETRI INTERFACE SYEVD ! JOBZ='N','V'; default: 'N' ! UPLO='U','L'; default: 'U' PURE SUBROUTINE SSYEVD_F95(A,W,JOBZ,UPLO,INFO) ! Fortran77 call: ! SSYEVD(JOBZ,UPLO,N,A,LDA,W,WORK,LWORK,IWORK,LIWORK,INFO) USE F95_PRECISION, ONLY: WP => SP CHARACTER(LEN=1), INTENT(IN), OPTIONAL :: JOBZ CHARACTER(LEN=1), INTENT(IN), OPTIONAL :: UPLO INTEGER, INTENT(OUT), OPTIONAL :: INFO REAL(WP), INTENT(INOUT) :: A(:,:) REAL(WP), INTENT(OUT) :: W(:) END SUBROUTINE SSYEVD_F95 PURE SUBROUTINE DSYEVD_F95(A,W,JOBZ,UPLO,INFO) ! Fortran77 call: ! DSYEVD(JOBZ,UPLO,N,A,LDA,W,WORK,LWORK,IWORK,LIWORK,INFO) USE F95_PRECISION, ONLY: WP => DP CHARACTER(LEN=1), INTENT(IN), OPTIONAL :: JOBZ CHARACTER(LEN=1), INTENT(IN), OPTIONAL :: UPLO INTEGER, INTENT(OUT), OPTIONAL :: INFO REAL(WP), INTENT(INOUT) :: A(:,:) REAL(WP), INTENT(OUT) :: W(:) END SUBROUTINE DSYEVD_F95 END INTERFACE SYEVD end module
Does anybody has an idea how to fix the problem with linker? I have "light" experience with Fortran so far, my colleagues do but they don't have any idea too.
Thank!
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Some module and library names were changed in recent versions of MKL. What you need with IFort 16 is
USE f95_precision, ONLY: WP => DP USE lapack95, ONLY: GETRF, GETRI
in the subprogram source from which GETRF and GETRI are called, and you need to add the appropriate Lapack95 library to the linker line. The library file to use is mkl_lapack95.lib for 32-bit targets, and mkl_lapack95_lp64.lib (if passing 4-byte integer arguments) or mkl_lapack95_ilp64.lib (if passing 8-byte integer arguments) for 64-bit targets.
There is no need to use your own module source (usedlapck95_mod).
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you! That solved my problem! :-)
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page