代码之家  ›  专栏  ›  技术社区  ›  pawel_winzig

拉帕克·鲁丁·哲耶夫的危险行为[副本]

  •  1
  • pawel_winzig  · 技术社区  · 6 年前

    这个问题已经有了答案:

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

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

    [编译时使用 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  
    

    这可以通过将stepd设置为参数来解决。但我不理解这种行为。更奇怪的是:

    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
    

    怎么会这样?设置 劳斯 到10应该没有效果,因为稍后它被设置为-1。一个重要的概念是:如果移除

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

    代码工作正常。

    1 回复  |  直到 6 年前
        1
  •  3
  •   albert    6 年前

    http://www.netlib.org/lapack/explore-html/df/d9a/group__complex16_h_eeigen_gaf23fb5b3ae38072ef4890ba43d5cfea2.html#gaf23fb5b3ae38072ef4890ba43d5cfea2

    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 
        )   
    

    RWORK rwork