* bug report by Hong Bo Peng Sandgren, on 03-19-2012.
* See link:http://icl.cs.utk.edu/lapack-forum/archives/lapack/msg01257.html[LAPACK Mailing list msg 01257]
I am doing some work with DGGEV. When I check the return msg and the actual code, I found something may be wrong. Here is part of comments in the header of DGGEV.F.
* INFO (output) INTEGER
* = 0: successful exit
* < 0: if INFO = -i, the i-th argument had an illegal value.
* = 1,...,N:
* The QZ iteration failed. No eigenvectors have been
* calculated, but ALPHAR(j), ALPHAI(j), and BETA(j)
* should be correct for j=INFO+1,...,N.
* > N: =N+1: other than QZ iteration failed in DHGEQZ.
* =N+2: error return from DTGEVC.
When INFO = 1...N, there is an error in DHGEQZ (QZ iteration failed). From the code, we can see it jumps to label 110 then set WORK(1) and return.
But in case of we scaled the matrix, we still need to undo scale for the output array ALPHAR, ALPHAI and BETA for those values j=INFO+1,...,N.
In DGEEVX, we can see that it jumps to label 50 in case of DHSEQR failure and then undo scale before return.
END IF
*
* Undo scaling if necessary
+*
+ 70 CONTINUE
*
IF( ILASCL )
$ CALL CLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHA, N, IERR )
IF( ILBSCL )
$ CALL CLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
*
- 70 CONTINUE
WORK( 1 ) = LWKOPT
-*
RETURN
*
* End of CGGEV
END IF
*
* Undo scaling if necessary
+*
+ 90 CONTINUE
*
IF( ILASCL )
$ CALL CLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHA, N, IERR )
IF( ILBSCL )
$ CALL CLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
*
- 90 CONTINUE
WORK( 1 ) = MAXWRK
-*
RETURN
*
* End of CGGEVX
END IF
*
* Undo scaling if necessary
+*
+ 110 CONTINUE
*
IF( ILASCL ) THEN
CALL DLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N, IERR )
IF( ILBSCL ) THEN
CALL DLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
END IF
-*
- 110 CONTINUE
*
WORK( 1 ) = MAXWRK
-*
RETURN
*
* End of DGGEV
END IF
*
* Undo scaling if necessary
+*
+ 130 CONTINUE
*
IF( ILASCL ) THEN
CALL DLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N, IERR )
CALL DLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
END IF
*
- 130 CONTINUE
WORK( 1 ) = MAXWRK
-*
RETURN
*
* End of DGGEVX
END IF
*
* Undo scaling if necessary
+*
+ 110 CONTINUE
*
IF( ILASCL ) THEN
CALL SLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N, IERR )
IF( ILBSCL ) THEN
CALL SLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
END IF
-*
- 110 CONTINUE
*
WORK( 1 ) = MAXWRK
-*
RETURN
*
* End of SGGEV
END IF
*
* Undo scaling if necessary
+*
+ 130 CONTINUE
*
IF( ILASCL ) THEN
CALL SLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N, IERR )
CALL SLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
END IF
*
- 130 CONTINUE
WORK( 1 ) = MAXWRK
-*
RETURN
*
* End of SGGEVX
END IF
*
* Undo scaling if necessary
+*
+ 70 CONTINUE
*
IF( ILASCL )
$ CALL ZLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHA, N, IERR )
IF( ILBSCL )
$ CALL ZLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
*
- 70 CONTINUE
WORK( 1 ) = LWKOPT
-*
RETURN
*
* End of ZGGEV
END IF
*
* Undo scaling if necessary
+*
+ 90 CONTINUE
*
IF( ILASCL )
$ CALL ZLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHA, N, IERR )
IF( ILBSCL )
$ CALL ZLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
*
- 90 CONTINUE
WORK( 1 ) = MAXWRK
-*
RETURN
*
* End of ZGGEVX