Matrix 拉帕克·鲁丁·泽夫的危险行为

Matrix 拉帕克·鲁丁·泽夫的危险行为,matrix,fortran,lapack,eigenvalue,Matrix,Fortran,Lapack,Eigenvalue,在使用lapack例程zheev()时,我偶然发现了一个奇怪的行为。有两个问题我不明白 1) 我的一个全局变量似乎被zheev()覆盖。下面的小程序显示了它: [使用gfortran-o test test.f90-llapack-lblas编译] program test implicit none integer, parameter :: dp = 8 integer, parameter :: dim = 3 integer :: l real(dp), parameter

在使用lapack例程
zheev()
时,我偶然发现了一个奇怪的行为。有两个问题我不明白

1) 我的一个全局变量似乎被
zheev()
覆盖。下面的小程序显示了它:

[使用
gfortran-o test test.f90-llapack-lblas编译
]

program test    
implicit none

integer, parameter :: dp = 8
integer, parameter :: dim = 3

integer :: l

real(dp), parameter :: kmin = -0.03_dp
real(dp), parameter :: kmax = 0.03_dp
integer, parameter  :: steps = 100
real(dp) :: stepD = (kmax - kmin)/real(steps)
complex(dp) :: matrix(dim,dim)=0.

integer :: info
integer :: rwork=3*dim-2, lwork, lwmax=100
real(dp) :: evals(dim) 
complex(dp) :: work(3*dim-2)

lwork=-1
call zheev('N','U',size(matrix,1), matrix, dim, evals, work, lwork, &
            rwork, info) 
lwork = min( lwmax, int( work(1) ))

do l = 0, 3
    write(*,*) stepD
    call zheev('N', 'U', size(matrix,1), matrix, dim, evals, work, &
    lwork, rwork, info) 
    write(*,*) stepD
end do

end program test
输出是

5.9999999999999995E-004
   0.0000000000000000     
   0.0000000000000000     
   0.0000000000000000     
   0.0000000000000000     
   0.0000000000000000     
   0.0000000000000000     
   0.0000000000000000  
这可以通过将步骤D设置为参数来解决。但我不理解这种行为。这变得更加奇怪:

2) 将定义中的
lwork
设置为某个值,如

integer :: rwork=3*dim-2, lwork=10, lwmax=100
(只需更改上面的对应行) 给出以下结果:

   5.9999999999999995E-004
   5.9999991208314896E-004
   5.9999991208314896E-004
   5.9999991208314896E-004
   5.9999991208314896E-004
   5.9999991208314896E-004
   5.9999991208314896E-004
   5.9999991208314896E-004
这怎么会发生?将
lwork
设置为10应该没有效果,因为稍后它会设置为-1。一个重要的概念是:如果一个人

lwork=-1
call zheev('N','U',size(matrix,1), matrix, dim, evals, work, lwork, &
            rwork, info) 
lwork = min( lwmax, int( work(1) ))

代码运行良好。

来自zheev()的文档:


这里我们看到,
RWORK
是一个类型为双精度的数组,但在提供的代码中,
RWORK
是一个标量整数

与以下任何关系:。另请参见关于
kind
的讨论,我用不同的子例程将其与答案联系起来:它仍然归结为具有正确的参数。我很惊讶编译器没有抱怨,难道编译器没有抱怨吗?不,除非在中显式使用和
interface
,否则编译器对接口一无所知您的程序或它是通过一个模块来处理的(但据我所知,它们不是由LaPack提供的,并且也依赖于编译器。您可以自己生成接口,但对于gfortran编译器,我不知道选项,对于英特尔编译器,请参阅选项
-gen\u interfaces-warn interfaces-module
)。
subroutine zheev    (   character   JOBZ,
        character   UPLO,
        integer     N,
        complex*16, dimension( lda, * )     A,
        integer     LDA,
        double precision, dimension( * )    W,
        complex*16, dimension( * )      WORK,
        integer     LWORK,
        double precision, dimension( * )    RWORK,
        integer     INFO 
    )