fix a few bugs
This commit is contained in:
+17
-15
@@ -409,8 +409,8 @@
|
||||
|
||||
* rcost = ilaenv( 17,'DLAQZ0',jbcmpz,n,ilo,ihi,lwork )
|
||||
rcost = 10
|
||||
itemp1 = int(nshifts/sqrt( 1+2*nshifts/(dble(rcost)/100*n) ))
|
||||
itemp1 = ((k-1)/4)*4+4
|
||||
itemp1 = int(nsr/sqrt( 1+2*nsr/(dble(rcost)/100*n) ))
|
||||
itemp1 = ((itemp1-1)/4)*4+4
|
||||
nbr = nsr+itemp1
|
||||
|
||||
if( n .lt. nmin ) then
|
||||
@@ -442,7 +442,7 @@
|
||||
info =-19
|
||||
end if
|
||||
if( info.NE.0 ) then
|
||||
call xerbla( 'DLAQZ0',-info )
|
||||
call xerbla( 'DLAQZ0',info )
|
||||
return
|
||||
end if
|
||||
*
|
||||
@@ -462,7 +462,7 @@
|
||||
istop = ihi
|
||||
maxit = 3*(ihi-ilo+1)
|
||||
ld = 0
|
||||
|
||||
|
||||
do iiter = 1,maxit
|
||||
if(iiter .ge. maxit) then
|
||||
info = istop
|
||||
@@ -473,28 +473,30 @@
|
||||
end if
|
||||
|
||||
* Check deflations at the end
|
||||
if (abs(A(istop-1,istop-2)) .le. ulp*(abs(A(istop-1,
|
||||
$ istop-1))+abs(A(istop-2,istop-2)))) then
|
||||
if (abs(A(istop-1,istop-2)) .le. max(smlnum,ulp*(abs(A(istop-1,
|
||||
$ istop-1))+abs(A(istop-2,istop-2))))) then
|
||||
A(istop-1,istop-2) = zero
|
||||
istop = istop-2
|
||||
ld = 0
|
||||
eshift = zero
|
||||
else if (abs(A(istop,istop-1)) .le. ulp*(abs(A(istop,
|
||||
$ istop))+abs(A(istop-1,istop-1)))) then
|
||||
else if (abs(A(istop,istop-1)) .le. max(smlnum,
|
||||
$ ulp*(abs(A(istop,istop))+abs(A(istop-1,istop-1))))) then
|
||||
A(istop,istop-1) = zero
|
||||
istop = istop-1
|
||||
ld = 0
|
||||
eshift = zero
|
||||
end if
|
||||
* Check deflations at the start
|
||||
if (abs(A(istart+2,istart+1)) .le. ulp*(abs(A(istart+1,
|
||||
$ istart+1))+abs(A(istart+2,istart+2)))) then
|
||||
if (abs(A(istart+2,istart+1)) .le. max(smlnum,
|
||||
$ ulp*(abs(A(istart+1,istart+1))+abs(A(istart+2,
|
||||
$ istart+2))))) then
|
||||
A(istart+2,istart+1) = zero
|
||||
istart = istart+2
|
||||
ld = 0
|
||||
eshift = zero
|
||||
else if (abs(A(istart+1,istart)) .le. ulp*(abs(A(istart,
|
||||
$ istart))+abs(A(istart+1,istart+1)))) then
|
||||
else if (abs(A(istart+1,istart)) .le. max(smlnum,
|
||||
$ ulp*(abs(A(istart,istart))+abs(A(istart+1,
|
||||
$ istart+1))))) then
|
||||
A(istart+1,istart) = zero
|
||||
istart = istart+1
|
||||
ld = 0
|
||||
@@ -508,8 +510,8 @@
|
||||
* Check interior deflations
|
||||
istart2 = istart
|
||||
do k = istop,istart+1,-1
|
||||
if (abs(A(k,k-1)) .le. ulp*(abs(A(k,k))+abs(A(k-1,
|
||||
$ k-1)))) then
|
||||
if (abs(A(k,k-1)) .le. max(smlnum,ulp*(abs(A(k,k))+abs(A(k-
|
||||
$ 1,k-1))))) then
|
||||
A(k,k-1) = zero
|
||||
istart2 = k
|
||||
exit
|
||||
@@ -671,7 +673,7 @@
|
||||
|
||||
end do
|
||||
|
||||
80 call dlaqz3(ilschur,ilq,ilz,n,ilo,ihi,A,ldA,B,ldB,Q,ldQ,Z,ldZ,
|
||||
80 call dlaqz3(ilschur,ilq,ilz,n,1,n,A,ldA,B,ldB,Q,ldQ,Z,ldZ,
|
||||
$alphar,alphai,beta,norm_info)
|
||||
|
||||
end subroutine
|
||||
|
||||
+15
-1
@@ -119,7 +119,13 @@
|
||||
parameter(zero=0.0d0,one=1.0d0,half=0.5d0)
|
||||
|
||||
* Local scalars
|
||||
double precision :: w(2)
|
||||
double precision :: w(2),safmin,safmax
|
||||
|
||||
* External Functions
|
||||
double precision,external :: dlamch
|
||||
|
||||
safmin = dlamch('SAFE MINIMUM')
|
||||
safmax = one/safmin
|
||||
|
||||
* Calculate first shifted vector
|
||||
w(1) = beta1*A(1,1)-sr1*B(1,1)
|
||||
@@ -140,4 +146,12 @@
|
||||
* Account for imaginary part
|
||||
v(1) = v(1)+si*si*B(1,1)
|
||||
|
||||
if( abs(v(1)).gt.safmax .or. abs(v(2)) .gt. safmax .or. abs(v(3
|
||||
$ )).gt.safmax .or. isnan(v(1)) .or. isnan(v(2)) .or. isnan(v(
|
||||
$ 3)) ) then
|
||||
v(1) = zero
|
||||
v(2) = zero
|
||||
v(3) = zero
|
||||
end if
|
||||
|
||||
end subroutine
|
||||
|
||||
+8
-8
@@ -324,7 +324,7 @@
|
||||
info =-17
|
||||
end if
|
||||
if( info.NE.0 ) then
|
||||
call xerbla( 'DLAQZ0',-info )
|
||||
call xerbla( 'DLAQZ6',-info )
|
||||
return
|
||||
end if
|
||||
|
||||
@@ -343,22 +343,22 @@
|
||||
jbcmpz(2:2)=wantQ
|
||||
jbcmpz(3:3)=wantZ
|
||||
|
||||
nmin = ilaenv( 12,'DLAQZ0',jbcmpz,n,ilo,ihi,lwork )
|
||||
nmin = ilaenv( 12,'DLAQZ6',jbcmpz,n,ilo,ihi,lwork )
|
||||
|
||||
nwr = ilaenv( 13,'DLAQZ0',jbcmpz,n,ilo,ihi,lwork )
|
||||
nwr = ilaenv( 13,'DLAQZ6',jbcmpz,n,ilo,ihi,lwork )
|
||||
nwr = max( 2,nwr )
|
||||
nwr = min( ihi-ilo+1,( n-1 ) / 3,nwr )
|
||||
|
||||
nibble = ilaenv( 14,'DLAQZ0',jbcmpz,n,ilo,ihi,lwork )
|
||||
nibble = ilaenv( 14,'DLAQZ6',jbcmpz,n,ilo,ihi,lwork )
|
||||
|
||||
nsr = ilaenv( 15,'DLAQZ0',jbcmpz,n,ilo,ihi,lwork )
|
||||
nsr = ilaenv( 15,'DLAQZ6',jbcmpz,n,ilo,ihi,lwork )
|
||||
nsr = min( nsr,( n+6 ) / 9,ihi-ilo )
|
||||
nsr = max( 2,nsr-mod( nsr,2 ) )
|
||||
|
||||
* rcost = ilaenv( 17,'DLAQZ0',jbcmpz,n,ilo,ihi,lwork )
|
||||
rcost = 10
|
||||
itemp1 = int(nshifts/sqrt( 1+2*nshifts/(dble(rcost)/100*n) ))
|
||||
itemp1 = ((k-1)/4)*4+4
|
||||
itemp1 = int(nsr/sqrt( 1+2*nsr/(dble(rcost)/100*n) ))
|
||||
itemp1 = ((itemp1-1)/4)*4+4
|
||||
nbr = nsr+itemp1
|
||||
|
||||
if( n .lt. nmin ) then
|
||||
@@ -390,7 +390,7 @@
|
||||
info =-19
|
||||
end if
|
||||
if( info.NE.0 ) then
|
||||
call xerbla( 'DLAQZ0',-info )
|
||||
call xerbla( 'DLAQZ6',info )
|
||||
return
|
||||
end if
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user