cgees 子程序

计算科学 拉帕克
2021-12-21 01:03:39

我正在尝试学习使用 lapack 子程序,但我被卡住了。我希望这是正确的论坛......在这个 fortran 程序中,我想作为测试使用 cgees 找到矩阵 ((0,1)(1,0)) 的舒尔形式,但矩阵“m”在应该编写 Shur 表单的调用之后,仅由零组成(其他子程序,如 dgemm 工作,我没有收到错误,所以我认为链接没有问题)。你知道我哪里做错了吗?

..................................................... …………

program example    
implicit none     
integer :: d,sdim,info    
real(kind=8),allocatable ::rwork(:)    
logical, external :: sel    
complex(kind=8), allocatable :: m(:,:),w(:),vs(:,:),work(:)
logical,allocatable ::bwork(:)
d=2    
!    
allocate(m(d,d))    
allocate(w(d))    
allocate(vs(d,d))    
allocate(work(2*d))    
allocate(rwork(d))    
allocate(bwork(d))    
!    
m(1,1)=(0.d0,0.d0)    
m(1,2)=(1.d0,0.d0)    
m(2,1)=(1.d0,0.d0)    
m(2,2)=(0.d0,0.d0)    
!    
print*,'m_before',m    
!    
print*,'w_before',w        
call cgees('V','S',sel,d,m,d,sdim,w,vs,d,work,-1,rwork,bwork,info)    
print*,'m',m    
print*,'w',w    
print*,'vs',vs    
print*,info        
end program example


logical function sel(x)    
  complex(kind=8) ::x    
  if (dimag(x)>1.d0) then    
     sel = .true.       
  else    
     sel = .false.    
  end if    
  return    
end

.........................................................

1个回答

阅读这个答案真正的特征值发现 我明白问题是cgees使用单精度算术而不是像我想象的那样加倍!!!这解决了问题:) ...

一般来说,我的理解是 lapack 子例程的命名是这样的:

  • 以“d”开头的子程序(如 DGEMM、DGETRI、DGEES、...)处理双精度实数;

  • 以“c”开头的子程序(如 CGEMM、CGETRI、CGEES、...)处理复杂的单精度数;

  • 以“z”开头的子程序(如 ZGEMM、ZGETRI、ZGEES...)处理复杂的双精度数;

多谢,