具有特定矩阵的lapack塞默分割错误

我正在尝试使用适当的lapack例程查找实对称三对角矩阵的第一个(最小)k个特征值。 我对Fortran和lapack库都是陌生的,但是(d)stemr 对我来说似乎是个不错的选择,所以我尝试调用它,但不断出现分段错误。

经过一些试验后,我发现问题出在我的输入矩阵上,

  • 对角线= 2 *(1 + 1e-5至1e-3级小变量校正)
  • 对角对角线均等于-1(如果我使用例如0.95,则一切正常)

我将代码缩减为单个M(not)WE程序,如下所示。

所以问题是:

    为什么为什么termer无法使用这样的矩阵,而例如史蒂夫作品?
  1. 为什么会出现细分错误?
program mwe

    implicit none

    integer,parameter :: n = 10
    integer,parameter :: iu = 3
    integer :: k
    double precision :: d(n),e(n)
    double precision :: vals(n),vecs(n,iu)

    integer :: m,ldz,nzc,lwk,liwk,info
    integer,allocatable :: isuppz(:),iwk(:)
    double precision,allocatable :: wk(:)

    do k = 1,n
        d(k) = +2d0 + ((k-5.5d0)*1d-2)**2
        e(k) = -1d0 ! e(n) not really needed
    end do

    ldz = n
    nzc = iu
    allocate(wk(1),iwk(1),isuppz(2*iu))

    ! ifort -mkl gives SIGSEGV at this call  <----------------
    call dstemr( &                              
        'V','I',n,d,e,0d0,1,iu,&
        m,vals,vecs,-1,isuppz,.true.,&
        wk,iwk,info)
    lwk = ceiling(wk(1)); deallocate(wk); allocate(wk(lwk))
    liwk = iwk(1); deallocate(iwk); allocate(iwk(liwk))
    print *,info,liwk ! ok with gfortran

    ! gfortran -llapack gives SIGSEGV at this call  <---------
    call dstemr( &
        'V',info)

end program

通过以下方式调用编译器:

  • gfortran [(GCC)9.2.0]:gfortran -llapack -o o.x mwe.f90
  • ifort [(IFORT)19.0.5.281 20190815]:ifort -mkl -o o.x mwe.f90
ilovegina 回答:具有特定矩阵的lapack塞默分割错误

根据manual,似乎有一个问题表明参数TRYRAC必须是变量(而不是常量),因为它可以被dstemr()覆盖:

  

[in,out] TRYRAC:...退出时为.TRUE。 TRYRAC将设置为.FALSE。如果矩阵    没有将其特征值定义为较高的相对精度。

因此,例如,修改后的代码可能类似于:

logical :: tryrac
...
tryrac = .true.
call dstemr( &                              
    'V','I',n,d,e,0d0,1,iu,&
    m,vals,vecs,ldz,-1,isuppz,tryrac,&  !<--
    wk,iwk,info)
...
tryrac = .true.
call dstemr( &
    'V',nzc,lwk,liwk,info)
本文链接:https://www.f2er.com/3094105.html

大家都在问