我正在尝试创建一个简单的示例,以便在MKL英特尔库中使用Pardiso求解器。我一直在遵循提供的示例,但是如果我在子例程中调用Pardiso,则不起作用。恐怕这与 INCLUDE 语句或链接方面有关。
所有子例程使用的数组都包含在名为变量的模块中
MODULE variables
INTEGER :: M ! Lines
INTEGER :: N ! Columns
REAL*8, DIMENSION(:,:), ALLOCATABLE :: MATRA ! original matrix
INTEGER, DIMENSION(:), ALLOCATABLE :: ROWSA,COLSA ! ia and ja in pardiso
REAL*8, dimension(:), ALLOCATABLE :: VALSA, RHSVC, SOLVC ! a, b, x
END MODULE variables
包含该程序的文件如下:
INCLUDE 'mkl_pardiso.f90'
program PardisoFortran
use variables
use mkl_pardiso
implicit none
! do some stuff to create the matrices
call create_matrices
call INITPARDISO
end program
最后文件初始化
subroutine INITPARDISO
USE VARIABLES
USE mkl_pardiso
! pardiso variable declaration
TYPE(MKL_PARDISO_HANDLE), ALLOCATABLE :: pt(:)
INTEGER maxfct, mnum, mtype, phase, nrhs, error, msglvl
INTEGER, ALLOCATABLE, DIMENSION(:) :: iparm
INTEGER i, idum
REAL*8 waltime1, waltime2, ddum
! --- then I allocate and fill the variables
! Finally I can call pardiso
phase = 11 ! only reordering and symbolic factorization phase
CALL pardiso_64 (PT, maxfct, mnum, mtype, phase, M, VALSA, COLSA, &
ROWSA, idum, nrhs, iparm, msglvl, ddum, ddum, error)
end subroutine
现在,我还向Visual Studio项目配置添加了其他包含目录(即
C:Program Files (x86)IntelComposerXE-2011mklinclude;
C:Program Files (x86)IntelComposerXE-2011mkllibintel64;
C:Program Files (x86)IntelComposerXE-2011mkllibia32)
如果我评论对 pardiso 的调用,一切正常,否则它会停止编译并出现此错误:
错误1 错误 #6285:此泛型子例程调用没有匹配的特定子例程。 [PARDISO_64] ....PardisoFortran\initpardiso.f 144
有什么想法吗?这是顶部 INCLUDE 语句的问题吗?我应该在哪里包含它?
我相信pardiso_64
是一个使用 64 位整数的子例程版本。 您的代码段没有显示您已采取措施确保整数为 64 位的证据。 我想您可能已经使用编译器选项或其他方法来告诉编译器默认为 64 位整数。
您发布的错误消息是调用库泛型过程时虚拟参数与实际参数不匹配时收到的典型错误消息。 假设您的整数只有 32 位,则编译器正在查找但未能找到一个名为 pardiso_64
的例程,该例程采用 32 位整数参数。
我认为该错误与include
语句无关。
我在你的代码中看到一个问题。参数"ddum"是一个标量。它应该是一个维度数组(M,nrhs)。可能会有更多的问题。我需要查看整个代码来提供帮助。
像往常一样,询问英特尔 MKL 相关问题的最佳位置是 MKL 论坛:http://software.intel.com/en-us/forums/intel-math-kernel-library。在那里发布您的问题,并附上您的整个程序。你会更快地得到答案!