When minimal workspace is given in ?hesv_aa, ?sysv_aa, ?hesv_aa_2stage, ?sysv_aa_2stage, now no error is given
Quick return for ?laqr1
LWSVDJ = MAX( 2 * N, 1 )
LWSVDJV = MAX( 2 * N, 1 )
* .. minimal REAL workspace length for CGEQP3, CPOCON, CGESVJ
- LRWQP3 = N
+ LRWQP3 = 2 * N
LRWCON = N
LRWSVDJ = N
IF ( LQUERY ) THEN
END IF
END IF
MINWRK = MAX( 2, MINWRK )
- OPTWRK = MAX( 2, OPTWRK )
+ OPTWRK = MAX( OPTWRK, MINWRK )
IF ( LWORK .LT. MINWRK .AND. (.NOT.LQUERY) ) INFO = - 17
IF ( LRWORK .LT. MINRWRK .AND. (.NOT.LQUERY) ) INFO = - 19
END IF
INFO = -5
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -8
+ ELSE IF( LWORK.LT.MAX( 2*N, 3*N-2 ) .AND. .NOT.LQUERY ) THEN
+ INFO = -10
END IF
*
IF( INFO.EQ.0 ) THEN
LWKOPT_HETRS = INT( WORK(1) )
LWKOPT = MAX( LWKOPT_HETRF, LWKOPT_HETRS )
WORK( 1 ) = LWKOPT
- IF( LWORK.LT.LWKOPT .AND. .NOT.LQUERY ) THEN
- INFO = -10
- END IF
END IF
*
IF( INFO.NE.0 ) THEN
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N, internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*>
*> \param[out] IPIV2
*> \verbatim
-*> IPIV is INTEGER array, dimension (N)
+*> IPIV2 is INTEGER array, dimension (N)
*> On exit, it contains the details of the interchanges, i.e.,
*> the row and column k of T were interchanged with the
*> row and column IPIV(k).
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The size of WORK. LWORK >= N, internally used to select NB
*> such that LWORK >= N*NB.
*>
INFO = -3
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -5
+ ELSE IF( LTB.LT.( 4*N ) .AND. .NOT.TQUERY ) THEN
+ INFO = -7
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -11
+ ELSE IF( LWORK.LT.N .AND. .NOT.WQUERY ) THEN
+ INFO = -13
END IF
*
IF( INFO.EQ.0 ) THEN
CALL CHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, -1, IPIV,
$ IPIV2, WORK, -1, INFO )
LWKOPT = INT( WORK(1) )
- IF( LTB.LT.INT( TB(1) ) .AND. .NOT.TQUERY ) THEN
- INFO = -7
- ELSE IF( LWORK.LT.LWKOPT .AND. .NOT.WQUERY ) THEN
- INFO = -13
- END IF
END IF
*
IF( INFO.NE.0 ) THEN
*
WORK( 1 ) = LWKOPT
*
+ RETURN
+*
* End of CHESV_AA_2STAGE
*
END
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N, internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*>
*> \param[out] IPIV2
*> \verbatim
-*> IPIV is INTEGER array, dimension (N)
+*> IPIV2 is INTEGER array, dimension (N)
*> On exit, it contains the details of the interchanges, i.e.,
*> the row and column k of T were interchanged with the
*> row and column IPIV(k).
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The size of WORK. LWORK >= N, internally used to select NB
*> such that LWORK >= N*NB.
*>
* Factor the band matrix
CALL CGBTRF( N, N, NB, NB, TB, LDTB, IPIV2, INFO )
*
+ RETURN
+*
* End of CHETRF_AA_2STAGE
*
END
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N.
*> \endverbatim
*>
INFO = 10
END IF
IF( INFO.NE.0 )THEN
- CALL XERBLA( 'SSYMV ', INFO )
+ CALL XERBLA( 'CLA_SYAMV', INFO )
RETURN
END IF
*
CABS1( CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )
* ..
* .. Executable Statements ..
+*
+* Quick return if possible
+*
+ IF( N.NE.2 .AND. N.NE.3 ) THEN
+ RETURN
+ END IF
+*
IF( N.EQ.2 ) THEN
S = CABS1( H( 1, 1 )-S2 ) + CABS1( H( 2, 1 ) )
IF( S.EQ.RZERO ) THEN
LWKOPT_SYTRS = INT( WORK(1) )
LWKOPT = MAX( LWKOPT_SYTRF, LWKOPT_SYTRS )
WORK( 1 ) = LWKOPT
- IF( LWORK.LT.LWKOPT .AND. .NOT.LQUERY ) THEN
- INFO = -10
- END IF
END IF
*
IF( INFO.NE.0 ) THEN
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N, internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*>
*> \param[out] IPIV2
*> \verbatim
-*> IPIV is INTEGER array, dimension (N)
+*> IPIV2 is INTEGER array, dimension (N)
*> On exit, it contains the details of the interchanges, i.e.,
*> the row and column k of T were interchanged with the
*> row and column IPIV(k).
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The size of WORK. LWORK >= N, internally used to select NB
*> such that LWORK >= N*NB.
*>
INFO = -3
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -5
+ ELSE IF( LTB.LT.( 4*N ) .AND. .NOT.TQUERY ) THEN
+ INFO = -7
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -11
+ ELSE IF( LWORK.LT.N .AND. .NOT.WQUERY ) THEN
+ INFO = -13
END IF
*
IF( INFO.EQ.0 ) THEN
CALL CSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, -1, IPIV,
$ IPIV2, WORK, -1, INFO )
LWKOPT = INT( WORK(1) )
- IF( LTB.LT.INT( TB(1) ) .AND. .NOT.TQUERY ) THEN
- INFO = -7
- ELSE IF( LWORK.LT.LWKOPT .AND. .NOT.WQUERY ) THEN
- INFO = -13
- END IF
END IF
*
IF( INFO.NE.0 ) THEN
*
WORK( 1 ) = LWKOPT
*
+ RETURN
+*
* End of CSYSV_AA_2STAGE
*
END
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N, internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*>
*> \param[out] IPIV2
*> \verbatim
-*> IPIV is INTEGER array, dimension (N)
+*> IPIV2 is INTEGER array, dimension (N)
*> On exit, it contains the details of the interchanges, i.e.,
*> the row and column k of T were interchanged with the
*> row and column IPIV(k).
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The size of WORK. LWORK >= N, internally used to select NB
*> such that LWORK >= N*NB.
*>
* Factor the band matrix
CALL CGBTRF( N, N, NB, NB, TB, LDTB, IPIV2, INFO )
*
+ RETURN
+*
* End of CSYTRF_AA_2STAGE
*
END
*> LWORK is INTEGER
*> The dimension of the array WORK.
*> WORK is size >= (N+NB+1)*(NB+3)
-*> If LDWORK = -1, then a workspace query is assumed; the routine
+*> If LWORK = -1, then a workspace query is assumed; the routine
*> calculates:
*> - the optimal size of the WORK array, returns
*> this value as the first entry of the WORK array,
-*> - and no error message related to LDWORK is issued by XERBLA.
+*> - and no error message related to LWORK is issued by XERBLA.
*> \endverbatim
*>
*> \param[out] INFO
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
* Get blocksize
- NBMAX = ILAENV( 1, 'CSYTRF', UPLO, N, -1, -1, -1 )
+ NBMAX = ILAENV( 1, 'CSYTRI2', UPLO, N, -1, -1, -1 )
IF ( NBMAX .GE. N ) THEN
MINSIZE = N
ELSE
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N.
*> \endverbatim
*>
* ..
* .. Array Arguments ..
* LOGICAL SELECT( * )
-* REAL RWORK( * )
-* COMPLEX T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
+* REAL RWORK( * )
+* COMPLEX T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
* $ WORK( * )
* ..
*
* ..
* .. Array Arguments ..
LOGICAL SELECT( * )
- REAL RWORK( * )
- COMPLEX T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
+ REAL RWORK( * )
+ COMPLEX T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
$ WORK( * )
* ..
*
* =====================================================================
*
* .. Parameters ..
- REAL ZERO, ONE
+ REAL ZERO, ONE
PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 )
- COMPLEX CZERO, CONE
+ COMPLEX CZERO, CONE
PARAMETER ( CZERO = ( 0.0E+0, 0.0E+0 ),
$ CONE = ( 1.0E+0, 0.0E+0 ) )
INTEGER NBMIN, NBMAX
* .. Local Scalars ..
LOGICAL ALLV, BOTHV, LEFTV, LQUERY, OVER, RIGHTV, SOMEV
INTEGER I, II, IS, J, K, KI, IV, MAXWRK, NB
- REAL OVFL, REMAX, SCALE, SMIN, SMLNUM, ULP, UNFL
- COMPLEX CDUM
+ REAL OVFL, REMAX, SCALE, SMIN, SMLNUM, ULP, UNFL
+ COMPLEX CDUM
* ..
* .. External Functions ..
LOGICAL LSAME
INTEGER ILAENV, ICAMAX
- REAL SLAMCH, SCASUM
+ REAL SLAMCH, SCASUM
EXTERNAL LSAME, ILAENV, ICAMAX, SLAMCH, SCASUM
* ..
* .. External Subroutines ..
INTEGER I, IB, IINFO, K
* ..
* .. External Subroutines ..
- EXTERNAL DGEQRT2, DGELQT3, DGEQRT3, DLARFB, XERBLA
+ EXTERNAL DGELQT3, DLARFB, XERBLA
* ..
* .. Executable Statements ..
*
INFO = 10
END IF
IF( INFO.NE.0 )THEN
- CALL XERBLA( 'DSYMV ', INFO )
+ CALL XERBLA( 'DLA_SYAMV', INFO )
RETURN
END IF
*
INTRINSIC ABS
* ..
* .. Executable Statements ..
+*
+* Quick return if possible
+*
+ IF( N.NE.2 .AND. N.NE.3 ) THEN
+ RETURN
+ END IF
+*
IF( N.EQ.2 ) THEN
S = ABS( H( 1, 1 )-SR2 ) + ABS( SI2 ) + ABS( H( 2, 1 ) )
IF( S.EQ.ZERO ) THEN
LWKOPT_SYTRS = INT( WORK(1) )
LWKOPT = MAX( LWKOPT_SYTRF, LWKOPT_SYTRS )
WORK( 1 ) = LWKOPT
- IF( LWORK.LT.LWKOPT .AND. .NOT.LQUERY ) THEN
- INFO = -10
- END IF
END IF
*
IF( INFO.NE.0 ) THEN
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N, internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*>
*> \param[out] IPIV2
*> \verbatim
-*> IPIV is INTEGER array, dimension (N)
+*> IPIV2 is INTEGER array, dimension (N)
*> On exit, it contains the details of the interchanges, i.e.,
*> the row and column k of T were interchanged with the
*> row and column IPIV(k).
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The size of WORK. LWORK >= N, internally used to select NB
*> such that LWORK >= N*NB.
*>
INFO = -3
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -5
+ ELSE IF( LTB.LT.( 4*N ) .AND. .NOT.TQUERY ) THEN
+ INFO = -7
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -11
+ ELSE IF( LWORK.LT.N .AND. .NOT.WQUERY ) THEN
+ INFO = -13
END IF
*
IF( INFO.EQ.0 ) THEN
CALL DSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, -1, IPIV,
$ IPIV2, WORK, -1, INFO )
LWKOPT = INT( WORK(1) )
- IF( LTB.LT.INT( TB(1) ) .AND. .NOT.TQUERY ) THEN
- INFO = -7
- ELSE IF( LWORK.LT.LWKOPT .AND. .NOT.WQUERY ) THEN
- INFO = -13
- END IF
END IF
*
IF( INFO.NE.0 ) THEN
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N, internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The size of WORK. LWORK >= N, internally used to select NB
*> such that LWORK >= N*NB.
*>
*>
*> \param[out] IPIV2
*> \verbatim
-*> IPIV is INTEGER array, dimension (N)
+*> IPIV2 is INTEGER array, dimension (N)
*> On exit, it contains the details of the interchanges, i.e.,
*> the row and column k of T were interchanged with the
-*> row and column IPIV(k).
+*> row and column IPIV2(k).
*> \endverbatim
*>
*> \param[out] INFO
* Factor the band matrix
CALL DGBTRF( N, N, NB, NB, TB, LDTB, IPIV2, INFO )
*
+ RETURN
+*
* End of DSYTRF_AA_2STAGE
*
END
*> LWORK is INTEGER
*> The dimension of the array WORK.
*> WORK is size >= (N+NB+1)*(NB+3)
-*> If LDWORK = -1, then a workspace query is assumed; the routine
+*> If LWORK = -1, then a workspace query is assumed; the routine
*> calculates:
*> - the optimal size of the WORK array, returns
*> this value as the first entry of the WORK array,
-*> - and no error message related to LDWORK is issued by XERBLA.
+*> - and no error message related to LWORK is issued by XERBLA.
*> \endverbatim
*>
*> \param[out] INFO
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
* Get blocksize
- NBMAX = ILAENV( 1, 'DSYTRF', UPLO, N, -1, -1, -1 )
+ NBMAX = ILAENV( 1, 'DSYTRI2', UPLO, N, -1, -1, -1 )
IF ( NBMAX .GE. N ) THEN
MINSIZE = N
ELSE
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N.
*> \endverbatim
*>
*> The right eigenvector x and the left eigenvector y of T corresponding
*> to an eigenvalue w are defined by:
*>
-*> T*x = w*x, (y**H)*T = w*(y**H)
+*> T*x = w*x, (y**T)*T = w*(y**T)
*>
-*> where y**H denotes the conjugate transpose of y.
+*> where y**T denotes the transpose of the vector y.
*> The eigenvalues are not input to this routine, but are read directly
*> from the diagonal blocks of T.
*>
*>
*> \param[in] NAME
*> \verbatim
-*> NAME is character string
+*> NAME is CHARACTER string
*> Name of the calling subroutine
*> \endverbatim
*>
*> \param[in] OPTS
*> \verbatim
-*> OPTS is character string
+*> OPTS is CHARACTER string
*> This is a concatenation of the string arguments to
*> TTQRE.
*> \endverbatim
INFO = 10
END IF
IF( INFO.NE.0 )THEN
- CALL XERBLA( 'SSYMV ', INFO )
+ CALL XERBLA( 'SLA_SYAMV', INFO )
RETURN
END IF
*
INTRINSIC ABS
* ..
* .. Executable Statements ..
+*
+* Quick return if possible
+*
+ IF( N.NE.2 .AND. N.NE.3 ) THEN
+ RETURN
+ END IF
+*
IF( N.EQ.2 ) THEN
S = ABS( H( 1, 1 )-SR2 ) + ABS( SI2 ) + ABS( H( 2, 1 ) )
IF( S.EQ.ZERO ) THEN
LWKOPT_SYTRS = INT( WORK(1) )
LWKOPT = MAX( LWKOPT_SYTRF, LWKOPT_SYTRS )
WORK( 1 ) = LWKOPT
- IF( LWORK.LT.LWKOPT .AND. .NOT.LQUERY ) THEN
- INFO = -10
- END IF
END IF
*
IF( INFO.NE.0 ) THEN
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N, internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*>
*> \param[out] IPIV2
*> \verbatim
-*> IPIV is INTEGER array, dimension (N)
+*> IPIV2 is INTEGER array, dimension (N)
*> On exit, it contains the details of the interchanges, i.e.,
*> the row and column k of T were interchanged with the
*> row and column IPIV(k).
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The size of WORK. LWORK >= N, internally used to select NB
*> such that LWORK >= N*NB.
*>
INFO = -3
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -5
+ ELSE IF( LTB.LT.( 4*N ) .AND. .NOT.TQUERY ) THEN
+ INFO = -7
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -11
+ ELSE IF( LWORK.LT.N .AND. .NOT.WQUERY ) THEN
+ INFO = -13
END IF
*
IF( INFO.EQ.0 ) THEN
CALL SSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, -1, IPIV,
$ IPIV2, WORK, -1, INFO )
LWKOPT = INT( WORK(1) )
- IF( LTB.LT.INT( TB(1) ) .AND. .NOT.TQUERY ) THEN
- INFO = -7
- ELSE IF( LWORK.LT.LWKOPT .AND. .NOT.WQUERY ) THEN
- INFO = -13
- END IF
END IF
*
IF( INFO.NE.0 ) THEN
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N, internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*>
*> \param[out] IPIV2
*> \verbatim
-*> IPIV is INTEGER array, dimension (N)
+*> IPIV2 is INTEGER array, dimension (N)
*> On exit, it contains the details of the interchanges, i.e.,
*> the row and column k of T were interchanged with the
*> row and column IPIV(k).
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The size of WORK. LWORK >= N, internally used to select NB
*> such that LWORK >= N*NB.
*>
* Factor the band matrix
CALL SGBTRF( N, N, NB, NB, TB, LDTB, IPIV2, INFO )
*
+ RETURN
+*
* End of SSYTRF_AA_2STAGE
*
END
*> LWORK is INTEGER
*> The dimension of the array WORK.
*> WORK is size >= (N+NB+1)*(NB+3)
-*> If LDWORK = -1, then a workspace query is assumed; the routine
+*> If LWORK = -1, then a workspace query is assumed; the routine
*> calculates:
*> - the optimal size of the WORK array, returns
*> this value as the first entry of the WORK array,
-*> - and no error message related to LDWORK is issued by XERBLA.
+*> - and no error message related to LWORK is issued by XERBLA.
*> \endverbatim
*>
*> \param[out] INFO
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N.
*> \endverbatim
*>
* ..
* .. Array Arguments ..
* LOGICAL SELECT( * )
-* REAL T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
+* REAL T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
* $ WORK( * )
* ..
*
*> The right eigenvector x and the left eigenvector y of T corresponding
*> to an eigenvalue w are defined by:
*>
-*> T*x = w*x, (y**H)*T = w*(y**H)
+*> T*x = w*x, (y**T)*T = w*(y**T)
*>
-*> where y**H denotes the conjugate transpose of y.
+*> where y**T denotes the transpose of the vector y.
*> The eigenvalues are not input to this routine, but are read directly
*> from the diagonal blocks of T.
*>
* ..
* .. Array Arguments ..
LOGICAL SELECT( * )
- REAL T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
+ REAL T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
$ WORK( * )
* ..
*
* =====================================================================
*
* .. Parameters ..
- REAL ZERO, ONE
+ REAL ZERO, ONE
PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 )
INTEGER NBMIN, NBMAX
PARAMETER ( NBMIN = 8, NBMAX = 128 )
$ RIGHTV, SOMEV
INTEGER I, IERR, II, IP, IS, J, J1, J2, JNXT, K, KI,
$ IV, MAXWRK, NB, KI2
- REAL BETA, BIGNUM, EMAX, OVFL, REC, REMAX, SCALE,
+ REAL BETA, BIGNUM, EMAX, OVFL, REC, REMAX, SCALE,
$ SMIN, SMLNUM, ULP, UNFL, VCRIT, VMAX, WI, WR,
$ XNORM
* ..
LWSVDJ = MAX( 2 * N, 1 )
LWSVDJV = MAX( 2 * N, 1 )
* .. minimal REAL workspace length for ZGEQP3, ZPOCON, ZGESVJ
- LRWQP3 = N
+ LRWQP3 = 2 * N
LRWCON = N
LRWSVDJ = N
IF ( LQUERY ) THEN
END IF
END IF
MINWRK = MAX( 2, MINWRK )
- OPTWRK = MAX( 2, OPTWRK )
+ OPTWRK = MAX( MINWRK, OPTWRK )
IF ( LWORK .LT. MINWRK .AND. (.NOT.LQUERY) ) INFO = - 17
IF ( LRWORK .LT. MINRWRK .AND. (.NOT.LQUERY) ) INFO = - 19
END IF
INFO = -5
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -8
+ ELSE IF( LWORK.LT.MAX(2*N, 3*N-2) .AND. .NOT.LQUERY ) THEN
+ INFO = -10
END IF
*
IF( INFO.EQ.0 ) THEN
LWKOPT_HETRS = INT( WORK(1) )
LWKOPT = MAX( LWKOPT_HETRF, LWKOPT_HETRS )
WORK( 1 ) = LWKOPT
- IF( LWORK.LT.LWKOPT .AND. .NOT.LQUERY ) THEN
- INFO = -10
- END IF
END IF
*
IF( INFO.NE.0 ) THEN
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N, internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*>
*> \param[out] IPIV2
*> \verbatim
-*> IPIV is INTEGER array, dimension (N)
+*> IPIV2 is INTEGER array, dimension (N)
*> On exit, it contains the details of the interchanges, i.e.,
*> the row and column k of T were interchanged with the
*> row and column IPIV(k).
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The size of WORK. LWORK >= N, internally used to select NB
*> such that LWORK >= N*NB.
*>
INFO = -3
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -5
+ ELSE IF( LTB.LT.( 4*N ) .AND. .NOT.TQUERY ) THEN
+ INFO = -7
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -11
+ ELSE IF( LWORK.LT.N .AND. .NOT.WQUERY ) THEN
+ INFO = -13
END IF
*
IF( INFO.EQ.0 ) THEN
CALL ZHETRF_AA_2STAGE( UPLO, N, A, LDA, TB, -1, IPIV,
$ IPIV2, WORK, -1, INFO )
LWKOPT = INT( WORK(1) )
- IF( LTB.LT.INT( TB(1) ) .AND. .NOT.TQUERY ) THEN
- INFO = -7
- ELSE IF( LWORK.LT.LWKOPT .AND. .NOT.WQUERY ) THEN
- INFO = -13
- END IF
END IF
*
IF( INFO.NE.0 ) THEN
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N, internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*>
*> \param[out] IPIV2
*> \verbatim
-*> IPIV is INTEGER array, dimension (N)
+*> IPIV2 is INTEGER array, dimension (N)
*> On exit, it contains the details of the interchanges, i.e.,
*> the row and column k of T were interchanged with the
*> row and column IPIV(k).
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The size of WORK. LWORK >= N, internally used to select NB
*> such that LWORK >= N*NB.
*>
* Factor the band matrix
CALL ZGBTRF( N, N, NB, NB, TB, LDTB, IPIV2, INFO )
*
+ RETURN
+*
* End of ZHETRF_AA_2STAGE
*
END
*>
*> \param[in] A
*> \verbatim
-*> A is COMPLEX*16array, dimension (LDA,N)
+*> A is COMPLEX*16 array, dimension (LDA,N)
*> Details of factors computed by ZHETRF_AA_2STAGE.
*> \endverbatim
*>
*>
*> \param[out] TB
*> \verbatim
-*> TB is COMPLEX*16array, dimension (LTB)
+*> TB is COMPLEX*16 array, dimension (LTB)
*> Details of factors computed by ZHETRF_AA_2STAGE.
*> \endverbatim
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N.
*> \endverbatim
*>
*>
*> \param[in,out] B
*> \verbatim
-*> B is COMPLEX*16array, dimension (LDB,NRHS)
+*> B is COMPLEX*16 array, dimension (LDB,NRHS)
*> On entry, the right hand side matrix B.
*> On exit, the solution matrix X.
*> \endverbatim
INFO = 10
END IF
IF( INFO.NE.0 )THEN
- CALL XERBLA( 'DSYMV ', INFO )
+ CALL XERBLA( 'ZLA_SYAMV', INFO )
RETURN
END IF
*
CABS1( CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
* ..
* .. Executable Statements ..
+*
+* Quick return if possible
+*
+ IF( N.NE.2 .AND. N.NE.3 ) THEN
+ RETURN
+ END IF
+*
IF( N.EQ.2 ) THEN
S = CABS1( H( 1, 1 )-S2 ) + CABS1( H( 2, 1 ) )
IF( S.EQ.RZERO ) THEN
LWKOPT_SYTRS = INT( WORK(1) )
LWKOPT = MAX( LWKOPT_SYTRF, LWKOPT_SYTRS )
WORK( 1 ) = LWKOPT
- IF( LWORK.LT.LWKOPT .AND. .NOT.LQUERY ) THEN
- INFO = -10
- END IF
END IF
*
IF( INFO.NE.0 ) THEN
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N, internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*>
*> \param[out] IPIV2
*> \verbatim
-*> IPIV is INTEGER array, dimension (N)
+*> IPIV2 is INTEGER array, dimension (N)
*> On exit, it contains the details of the interchanges, i.e.,
*> the row and column k of T were interchanged with the
*> row and column IPIV(k).
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The size of WORK. LWORK >= N, internally used to select NB
*> such that LWORK >= N*NB.
*>
INFO = -3
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -5
+ ELSE IF( LTB.LT.( 4*N ) .AND. .NOT.TQUERY ) THEN
+ INFO = -7
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -11
+ ELSE IF( LWORK.LT.N .AND. .NOT.WQUERY ) THEN
+ INFO = -13
END IF
*
IF( INFO.EQ.0 ) THEN
CALL ZSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, -1, IPIV,
$ IPIV2, WORK, -1, INFO )
LWKOPT = INT( WORK(1) )
- IF( LTB.LT.INT( TB(1) ) .AND. .NOT.TQUERY ) THEN
- INFO = -7
- ELSE IF( LWORK.LT.LWKOPT .AND. .NOT.WQUERY ) THEN
- INFO = -13
- END IF
END IF
*
IF( INFO.NE.0 ) THEN
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N, internally
*> used to select NB such that LTB >= (3*NB+1)*N.
*>
*>
*> \param[out] IPIV2
*> \verbatim
-*> IPIV is INTEGER array, dimension (N)
+*> IPIV2 is INTEGER array, dimension (N)
*> On exit, it contains the details of the interchanges, i.e.,
*> the row and column k of T were interchanged with the
*> row and column IPIV(k).
*>
*> \param[in] LWORK
*> \verbatim
+*> LWORK is INTEGER
*> The size of WORK. LWORK >= N, internally used to select NB
*> such that LWORK >= N*NB.
*>
* Factor the band matrix
CALL ZGBTRF( N, N, NB, NB, TB, LDTB, IPIV2, INFO )
*
+ RETURN
+*
* End of ZSYTRF_AA_2STAGE
*
END
UPPER = LSAME( UPLO, 'U' )
LQUERY = ( LWORK.EQ.-1 )
* Get blocksize
- NBMAX = ILAENV( 1, 'ZSYTRF', UPLO, N, -1, -1, -1 )
+ NBMAX = ILAENV( 1, 'ZSYTRI2', UPLO, N, -1, -1, -1 )
IF ( NBMAX .GE. N ) THEN
MINSIZE = N
ELSE
*>
*> \param[in] LTB
*> \verbatim
+*> LTB is INTEGER
*> The size of the array TB. LTB >= 4*N.
*> \endverbatim
*>