Intel® oneAPI Math Kernel Library
Ask questions and share information with other developers who use Intel® Math Kernel Library.

Pardiso - There is no matching specific subroutine

Lorenzo_B_
Beginner
542 Views

Hi everybody!
I have a problem with Pardiso in a fortran project. I am trying to write a simple routine to solve a linear system, but compilation stops at calling pardiso_64 (or pardiso in the case of 32bit version of my program). The error is:

Error    1     error #6285: There is no matching specific subroutine for this generic subroutine call.   [PARDISO_64]

Here it is my code. A module defines the variables to be shared between all project file:

MODULE variables
INTEGER*8 :: M        ! Lines
INTEGER*8 :: N        ! Columns
DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: MATRA ! original 2D matrix
INTEGER*8, DIMENSION(:), ALLOCATABLE :: ROWSA,COLSA ! matrix of row pointers and column positions
DOUBLE PRECISION,    dimension(:), ALLOCATABLE :: VALSA
DOUBLE PRECISION,    dimension(:,:), ALLOCATABLE :: RHSVC, SOLVC ! matrix of values, right hand side and solution vector
END MODULE variables

After filling in the arrays VALSA, COLSA, ROWSA, RHSVC, SOLVC, we call a subroutine that prepares variables and calls pardiso:

SUBROUTINE INTPAR
USE VARIABLES
USE mkl_pardiso
!     Internal solver memory pointer for 64-bit architectures
INTEGER*8 PT(64)
!     Other variables
INTEGER*8 maxfct, mnum, mtype, phase, nrhs, error, msglvl
! Solver Parameters vectors
INTEGER*8, ALLOCATABLE, DIMENSION(:) :: iparm, perm

!---- ALLOCATION OF VECTORS
ALLOCATE(SOLVC(M,1))
ALLOCATE(RHSVC(M,1))
ALLOCATE(iparm(64))
ALLOCATE(perm(M))
!.... END OF ALLOCATION

!---- CHOICE OF PARDISO PARAMETERS
iparm(1) = 1     
iparm(2) = 2     
iparm(3) = 1     
iparm(4) = 0     
iparm(5) = 0     
iparm(6) = 0     
iparm(7) = 0     
iparm(8) = 9     
iparm(9) = 0 
iparm(10) = 13   
iparm(11) = 1    
iparm(12) = 0
iparm(13) = 0    
iparm(14) = 0    
iparm(15) = 0
iparm(16) = 0    
iparm(17) = 0
iparm(18) = -1   
iparm(19) = -1   
iparm(20) = 0    
iparm(21) = 0    
iparm(22) = 0    
iparm(23) = 0    
iparm(24) = 1    
iparm(25) = 0
iparm(26) = 0
iparm(27) = 1    
iparm(28) = 0    
iparm(29) = 0
iparm(30) = 0    
iparm(31) = 0    
iparm(32) = 0
iparm(33) = 0
iparm(34) = 0
iparm(35) = 0     
iparm(36) = 0
iparm(37) = 0     
iparm(38) = 0
iparm(39) = 0
iparm(40) = 0
iparm(41) = 0     
iparm(42) = 0
iparm(43) = 0
iparm(44) = 0     
iparm(45) = 0
iparm(46) = 0
iparm(47) = 0     
iparm(48) = 0
iparm(49) = 0
iparm(50) = 0
iparm(51) = 0     
iparm(52) = 0
iparm(53) = 0
iparm(54) = 0     
iparm(55) = 0
iparm(56) = 0
iparm(57) = 0     
iparm(58) = 0
iparm(59) = 0
iparm(60) = 1    
iparm(61) = 0     
iparm(62) = 0
iparm(63) = 0
iparm(64) = 0     

maxfct = 1
mnum = 1
nrhs = 1
error = 0        
msglvl = 1       
mtype = -2       

!     Initiliaze the internal solver memory pointer.
do i = 1, 64
  pt(i)=0
end do
!.... END OF VARIABLES INITIALIZATION



!---- PHASE 11 - ANALYSIS
!     Reordering and Symbolic Factorization, This step also allocates
!     all memory that is necessary for the factorization

phase = 11 ! only reordering and symbolic factorization

CALL pardiso_64 (PT, maxfct, mnum, mtype, phase, n, VALSA, COLSA, &
              ROWSA, perm, nrhs, iparm, msglvl, RHSVC, SOLVC, error)

WRITE(*,*) 'Reordering completed ... '
END SUBROUTINE INTPAR

Again, the compilation of such code stops with error: Error    1     error #6285: There is no matching specific subroutine for this generic subroutine call.   [PARDISO_64]

It is compiled in debug mode, on 64bit configuration in Visual Studio 2010 with Intel Fortran Compiler XE 12.0

Any solution? Thank you very much!


0 Kudos
3 Replies
Gennady_F_Intel
Moderator
542 Views

I see you use integer*8 data types - then question - do you use /4I8  option while compiling this example?

0 Kudos
Lorenzo_B_
Beginner
542 Views

Reading the description of the option /4I8 in the manual I found out that it does not make any difference if all INTEGER values are declared as INTEGER(kind=8), right?

The problem that I found is that the interface to the function "Pardiso" is not pardiso_64 but pardiso_?_64 where "?" is the type of values you are putting in. In my case I have pardiso_D_64, and now, at least, it starts. Is there any known issue of this interface? The MKL manual does not present this kind of declaration!!

0 Kudos
mecej4
Honored Contributor III
542 Views

1. Options such as /4I do not cause size changes to variables declared with explicit size/KIND. Likewise, one has to allow for what such options do to integer constants and constant integer expressions -- there can be bad surprises here.

2. When using a library function/subroutine (such as Pardiso) which has been designed to be accessed using the F77 interface (all arguments included in call/invocation, user has responsibility for checking sequence, type, size of arguments) or a more simplified/versatile F9X interface, there are three types of interfaces in the library:

(a) the generic F9X interface, which is the choice when the interface is adequate,

(b) the F77 interface, and

(c) the specific interfaces.

It is not intended that the specific interfaces be called by library users, and they are, therefore, often not mentioned in the documentation. That is why, unless you have valid reasons to access the specific interfaces such as pardiso_?_64, you should refrain from doing so. If the library developers changed the specific interfaces when issuing a new version of MKL, your code that called the specific interfaces would probably malfunction.

0 Kudos
Reply